diff --git a/.changeset/add-agent-action-approval.md b/.changeset/add-agent-action-approval.md new file mode 100644 index 00000000000..46cac5fa158 --- /dev/null +++ b/.changeset/add-agent-action-approval.md @@ -0,0 +1,12 @@ +--- +'@clerk/shared': minor +'@clerk/clerk-js': minor +'@clerk/ui': minor +'@clerk/react': minor +'@clerk/react-router': minor +'@clerk/nextjs': minor +'@clerk/tanstack-react-start': minor +'@clerk/localizations': patch +--- + +Add an experimental `AgentActionApproval` component with an interactive mock approval flow. diff --git a/packages/clerk-js/sandbox/app.ts b/packages/clerk-js/sandbox/app.ts index 11bdbbe370a..a42be21cfed 100644 --- a/packages/clerk-js/sandbox/app.ts +++ b/packages/clerk-js/sandbox/app.ts @@ -35,6 +35,7 @@ const AVAILABLE_COMPONENTS = [ 'apiKeys', 'configureSSO', 'oauthConsent', + 'agentActionApproval', 'oauthDeviceVerification', 'taskChooseOrganization', 'taskResetPassword', @@ -155,6 +156,7 @@ const componentControls: Record = { apiKeys: buildComponentControls('apiKeys'), configureSSO: buildComponentControls('configureSSO'), oauthConsent: buildComponentControls('oauthConsent'), + agentActionApproval: buildComponentControls('agentActionApproval'), oauthDeviceVerification: buildComponentControls('oauthDeviceVerification'), taskChooseOrganization: buildComponentControls('taskChooseOrganization'), taskResetPassword: buildComponentControls('taskResetPassword'), @@ -427,6 +429,10 @@ void (async () => { '/pricing-table': { mount: 'mountPricingTable', component: 'pricingTable' }, '/api-keys': { mount: 'mountAPIKeys', component: 'apiKeys' }, '/configure-sso': { mount: '__internal_mountConfigureSSO', component: 'configureSSO' }, + '/agent-action-approval': { + mount: '__experimental_mountAgentActionApproval', + component: 'agentActionApproval', + }, '/oauth-device-verification': { mount: '__internal_mountOAuthDeviceVerification', component: 'oauthDeviceVerification', diff --git a/packages/clerk-js/sandbox/scenarios/agent-action-approval.ts b/packages/clerk-js/sandbox/scenarios/agent-action-approval.ts new file mode 100644 index 00000000000..cfe7b2b9079 --- /dev/null +++ b/packages/clerk-js/sandbox/scenarios/agent-action-approval.ts @@ -0,0 +1,26 @@ +import { + clerkHandlers, + EnvironmentService, + type MockScenario, + SessionService, + setClerkState, + UserService, +} from '@clerk/msw'; + +export function AgentActionApproval(): MockScenario { + const user = UserService.create(); + const session = SessionService.create(user); + + setClerkState({ + environment: EnvironmentService.MULTI_SESSION, + session, + user, + }); + + return { + description: 'Interactive agent-action approval prototype', + handlers: clerkHandlers, + initialState: { session, user }, + name: 'agent-action-approval', + }; +} diff --git a/packages/clerk-js/sandbox/scenarios/index.ts b/packages/clerk-js/sandbox/scenarios/index.ts index d06dcc56b80..4acb9497f0b 100644 --- a/packages/clerk-js/sandbox/scenarios/index.ts +++ b/packages/clerk-js/sandbox/scenarios/index.ts @@ -5,3 +5,4 @@ export { OrgProfileSeatLimit } from './org-profile-seat-limit'; export { PricingTableSBB } from './pricing-table-sbb'; export { AnnualOnlyPlans } from './annual-only-plans'; export { XProviderEnabled } from './x-provider-enabled'; +export { AgentActionApproval } from './agent-action-approval'; diff --git a/packages/clerk-js/sandbox/template.html b/packages/clerk-js/sandbox/template.html index e7c5d8d344e..a132a4b2fd1 100644 --- a/packages/clerk-js/sandbox/template.html +++ b/packages/clerk-js/sandbox/template.html @@ -259,6 +259,11 @@ label="OAuth Consent" component="" > + ui.ensureMounted()).then(controls => controls.unmountComponent({ node })); }; + public __experimental_mountAgentActionApproval = (node: HTMLDivElement, props?: AgentActionApprovalProps) => { + this.assertComponentsReady(this.#clerkUI); + const component = 'AgentActionApproval'; + void this.#clerkUI + .then(ui => ui.ensureMounted({ preloadHint: component })) + .then(controls => + controls.mountComponent({ + name: component, + appearanceKey: '__experimental_agentActionApproval', + node, + props, + }), + ); + }; + + public __experimental_unmountAgentActionApproval = (node: HTMLDivElement) => { + void this.#clerkUI?.then(ui => ui.ensureMounted()).then(controls => controls.unmountComponent({ node })); + }; + /** * @deprecated Use mountOAuthConsent instead. */ diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index 6c6b0d40347..9c1d705d10f 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const arSA: LocalizationResource = { locale: 'ar-SA', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index ea0b5488a6a..fcc02ac7865 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const beBY: LocalizationResource = { locale: 'be-BY', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index 286e93c319a..0917b5c10b1 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const bgBG: LocalizationResource = { locale: 'bg-BG', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts index d5f8ab3a08c..29e8f7655de 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const bnIN: LocalizationResource = { locale: 'bn-IN', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'নতুন কী যোগ করুন', action__search: 'কী অনুসন্ধান করুন', diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts index e830eb1d243..745e666a31a 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const caES: LocalizationResource = { locale: 'ca-ES', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index 162b5b42b1c..24b1dc39ff4 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const csCZ: LocalizationResource = { locale: 'cs-CZ', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Přidat nový klíč', action__search: 'Vyhledat klíče', diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index 347842755bd..0f86f6d3c84 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const daDK: LocalizationResource = { locale: 'da-DK', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index 9b28854e244..d5f8eb3008d 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const deDE: LocalizationResource = { locale: 'de-DE', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Neuen API-Key hinzufügen', action__search: 'Suche', diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index 2e7f03b6c9c..276d391c26a 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const elGR: LocalizationResource = { locale: 'el-GR', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Προσθήκη', action__search: 'Αναζήτηση', diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts index 34a7803870b..2ed064dc4ea 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const enGB: LocalizationResource = { locale: 'en-GB', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index f13d1f147e6..c67313e71d8 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -2,6 +2,28 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const enUS: LocalizationResource = { locale: 'en-US', + agentActionApproval: { + action__approve: 'Approve', + action__deny: 'Deny', + commentLabel: 'Comment', + commentOptional: 'Optional', + commentPlaceholder: 'Add any additional context for your response', + copyParameter: 'Copy {{parameter}}', + detailsLabel: 'Action details', + expiresIn: 'Approval window closes in {{remaining}}', + parameterCopied: '{{parameter}} copied', + requestedAt: 'Requested {{relativeTime}}', + terminal: { + approvedSubtitle: 'You can close this window, return to your agent, and continue with your request.', + approvedTitle: 'Action approved', + deniedSubtitle: 'No action was taken. You can close this window and return to your agent.', + deniedTitle: 'Action denied', + expiredSubtitle: + 'The approval window closed. No action was taken. You can close this window and return to your agent.', + expiredTitle: 'Approval window closed', + }, + title: 'Approve agent action', + }, apiKeys: { action__add: 'Add new key', action__search: 'Search keys', diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts index 7d8c5c42db2..70a9c3cdb3a 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const esCR: LocalizationResource = { locale: 'es-CR', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index bf430d147bd..4d49edc9c10 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const esES: LocalizationResource = { locale: 'es-ES', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index 4dd7048c823..5d9e9710643 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const esMX: LocalizationResource = { locale: 'es-MX', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts index ef7e529367a..abd589065b1 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const esUY: LocalizationResource = { locale: 'es-UY', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index a3260652238..66e4f8a7de2 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const faIR: LocalizationResource = { locale: 'fa-IR', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'افزودن کلید جدید', action__search: 'جستجوی کلیدها', diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index dacd9caf9a4..bb9cb7f0626 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const fiFI: LocalizationResource = { locale: 'fi-FI', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Lisää uusi avain', action__search: 'Etsi avaimia', diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index adfc9d705cd..db30cac5f7f 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const frFR: LocalizationResource = { locale: 'fr-FR', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Ajouter une nouvelle clé', action__search: 'Rechercher des clés', diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index 0211707a632..97eefdbb40d 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const heIL: LocalizationResource = { locale: 'he-IL', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts index 9ea6d8a4a77..fc8d01c22a4 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const hiIN: LocalizationResource = { locale: 'hi-IN', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'नई कुंजी जोड़ें', action__search: 'कुंजियाँ खोजें', diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index f8d00284c0a..bc80fca0706 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const hrHR: LocalizationResource = { locale: 'hr-HR', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Dodaj novi ključ', action__search: 'Pretraži ključeve', diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 140e54e8f3a..89d4cfac424 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const huHU: LocalizationResource = { locale: 'hu-HU', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Új kulcs hozzáadása', action__search: 'Kulcsok keresése', diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts index 09248a313a2..efdfe186942 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const idID: LocalizationResource = { locale: 'id-ID', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index 8ad2ae89b97..74402c27b44 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const isIS: LocalizationResource = { locale: 'is-IS', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Bæta við lykli', action__search: 'Leita að lyklum', diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index 891ba86b378..1fbffdb1e0b 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const itIT: LocalizationResource = { locale: 'it-IT', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Aggiungi nuova chiave', action__search: 'Cerca chiavi', diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index 9d78ce771bb..ad90364a677 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const jaJP: LocalizationResource = { locale: 'ja-JP', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: '新しいキーを追加', action__search: 'キーを検索', diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts index 064db249686..e74b4bf2f75 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const kkKZ: LocalizationResource = { locale: 'kk-KZ', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index 452f58cc752..2b59c187923 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const koKR: LocalizationResource = { locale: 'ko-KR', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: '새 키 만들기', action__search: '키 검색', diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index 84d85a3e9f3..25fcda5e079 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const mnMN: LocalizationResource = { locale: 'mn-MN', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts index 29f1ce8c1e2..80d232daee1 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const msMY: LocalizationResource = { locale: 'ms-MY', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Tambah kunci baharu', action__search: 'Cari kunci', diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index c0a5c0d67e4..9579853a8bd 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const nbNO: LocalizationResource = { locale: 'nb-NO', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Legg til ny nøkkel', action__search: 'Søk i nøkler', diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts index b8b5079e655..7ca2c9f4f9c 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const nlBE: LocalizationResource = { locale: 'nl-BE', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index 65224e71070..6e0fde0caad 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const nlNL: LocalizationResource = { locale: 'nl-NL', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index 66e0b09ae66..f044a9e0c87 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const plPL: LocalizationResource = { locale: 'pl-PL', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index ba9e289f124..9c23cacd512 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const ptBR: LocalizationResource = { locale: 'pt-BR', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Adicionar nova chave', action__search: 'Pesquisar chaves', diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index b703bfa28c4..e2e49622100 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const ptPT: LocalizationResource = { locale: 'pt-PT', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Adicionar nova chave', action__search: 'Pesquisar chaves', diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index 9120f132875..d4488e9ad19 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const roRO: LocalizationResource = { locale: 'ro-RO', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Adaugă cheie nouă', action__search: 'Caută chei', diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index 1eb4abd7cd7..bc9259d6e94 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const ruRU: LocalizationResource = { locale: 'ru-RU', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index c7127dafac3..595d4e4e8b6 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const skSK: LocalizationResource = { locale: 'sk-SK', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index af61b012500..30e4d98d858 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const srRS: LocalizationResource = { locale: 'sr-RS', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index dcd5d346b13..5506c08b85d 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const svSE: LocalizationResource = { locale: 'sv-SE', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts index 9c81cbae11a..4ece61cec76 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const taIN: LocalizationResource = { locale: 'ta-IN', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'புதிய விசையைச் சேர்', action__search: 'விசைகளைத் தேடு', diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts index c73672423bb..b563a8cb9a4 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const teIN: LocalizationResource = { locale: 'te-IN', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'కొత్త కీని జోడించు', action__search: 'కీలను శోధించు', diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index a545cb21f31..5b34cc1f427 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const thTH: LocalizationResource = { locale: 'th-TH', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'เพิ่มคีย์ใหม่', action__search: 'ค้นหาคีย์', diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 5b4762ab1fc..6fce427a725 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const trTR: LocalizationResource = { locale: 'tr-TR', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index c88bba8dfa7..156687cdbae 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const ukUA: LocalizationResource = { locale: 'uk-UA', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index 159fb9731c7..20b8701f591 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const viVN: LocalizationResource = { locale: 'vi-VN', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: 'Thêm khoá mới', action__search: 'Tìm kiếm khoá', diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 3b0f93e0b0b..6c351d08357 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const zhCN: LocalizationResource = { locale: 'zh-CN', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: undefined, action__search: undefined, diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index 992cc87adab..f9a365da948 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -14,6 +14,27 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const zhTW: LocalizationResource = { locale: 'zh-TW', + agentActionApproval: { + action__approve: undefined, + action__deny: undefined, + commentLabel: undefined, + commentOptional: undefined, + commentPlaceholder: undefined, + copyParameter: undefined, + detailsLabel: undefined, + expiresIn: undefined, + parameterCopied: undefined, + requestedAt: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + deniedSubtitle: undefined, + deniedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + }, + title: undefined, + }, apiKeys: { action__add: '新增金鑰', action__search: '搜尋金鑰', diff --git a/packages/nextjs/src/client-boundary/uiComponents.tsx b/packages/nextjs/src/client-boundary/uiComponents.tsx index 82e719046d6..7daf47fa3bb 100644 --- a/packages/nextjs/src/client-boundary/uiComponents.tsx +++ b/packages/nextjs/src/client-boundary/uiComponents.tsx @@ -12,6 +12,7 @@ import React from 'react'; import { useEnforceCorrectRoutingProps } from './hooks/useEnforceRoutingProps'; export { + AgentActionApproval, APIKeys, CreateOrganization, GoogleOneTap, diff --git a/packages/nextjs/src/index.ts b/packages/nextjs/src/index.ts index a90a2a975c6..6ba4dadfd54 100644 --- a/packages/nextjs/src/index.ts +++ b/packages/nextjs/src/index.ts @@ -22,6 +22,7 @@ export { * If you do, app router will break. */ export { + AgentActionApproval, APIKeys, CreateOrganization, GoogleOneTap, diff --git a/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap index b186435cbc7..7238c382c8c 100644 --- a/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap @@ -17,6 +17,7 @@ exports[`legacy public exports > should not change unexpectedly 1`] = ` exports[`root public exports > should not change unexpectedly 1`] = ` [ "APIKeys", + "AgentActionApproval", "AuthenticateWithRedirectCallback", "ClerkDegraded", "ClerkFailed", diff --git a/packages/react/src/components/index.ts b/packages/react/src/components/index.ts index c241edfb954..75524ce2290 100644 --- a/packages/react/src/components/index.ts +++ b/packages/react/src/components/index.ts @@ -1,4 +1,5 @@ export { + AgentActionApproval, APIKeys, CreateOrganization, GoogleOneTap, diff --git a/packages/react/src/components/uiComponents.tsx b/packages/react/src/components/uiComponents.tsx index 0a101c93f6b..1a43ea9fc33 100644 --- a/packages/react/src/components/uiComponents.tsx +++ b/packages/react/src/components/uiComponents.tsx @@ -1,5 +1,6 @@ import type { __internal_OAuthConsentProps, + AgentActionApprovalProps, APIKeysProps, CreateOrganizationProps, GoogleOneTapProps, @@ -676,6 +677,39 @@ export const OAuthConsent = withClerk( { component: 'OAuthConsent', renderWhileLoading: true }, ); +/** + * Renders an approval flow for an action requested by an agent. + * + * @experimental This component is experimental and may change in future releases. + */ +export const AgentActionApproval = withClerk( + ({ clerk, component, fallback, ...props }: WithClerkProp) => { + const mountingStatus = useWaitForComponentMount(component); + const shouldShowFallback = mountingStatus === 'rendering' || !clerk.loaded; + + const rendererRootProps = { + ...(shouldShowFallback && fallback && { style: { display: 'none' } }), + }; + + return ( + <> + {shouldShowFallback && fallback} + {clerk.loaded && ( + + )} + + ); + }, + { component: 'AgentActionApproval', renderWhileLoading: true }, +); + /** * Renders the OAuth device verification flow for a signed-in user to authorize a device or app. * diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index 790e1ac099b..45d96281c9b 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -13,6 +13,7 @@ import type { __internal_SubscriptionDetailsProps, __internal_UserVerificationModalProps, __internal_UserVerificationProps, + AgentActionApprovalProps, APIKeysNamespace, APIKeysProps, AuthenticateWithBaseParams, @@ -167,6 +168,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { private premountAPIKeysNodes = new Map(); private premountConfigureSSONodes = new Map(); private premountOAuthConsentNodes = new Map(); + private premountAgentActionApprovalNodes = new Map(); private premountOAuthDeviceVerificationNodes = new Map(); private premountTaskChooseOrganizationNodes = new Map(); private premountTaskResetPasswordNodes = new Map(); @@ -805,6 +807,10 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { clerkjs.__internal_mountOAuthConsent(node, props); }); + this.premountAgentActionApprovalNodes.forEach((props, node) => { + clerkjs.__experimental_mountAgentActionApproval(node, props); + }); + if (typeof clerkjs.__internal_mountOAuthDeviceVerification === 'function') { this.premountOAuthDeviceVerificationNodes.forEach((props, node) => { clerkjs.__internal_mountOAuthDeviceVerification(node, props); @@ -1411,6 +1417,22 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { this.__internal_unmountOAuthConsent(node); }; + __experimental_mountAgentActionApproval = (node: HTMLDivElement, props?: AgentActionApprovalProps) => { + if (this.clerkjs && this.loaded) { + this.clerkjs.__experimental_mountAgentActionApproval(node, props); + } else { + this.premountAgentActionApprovalNodes.set(node, props); + } + }; + + __experimental_unmountAgentActionApproval = (node: HTMLDivElement) => { + if (this.clerkjs && this.loaded) { + this.clerkjs.__experimental_unmountAgentActionApproval(node); + } else { + this.premountAgentActionApprovalNodes.delete(node); + } + }; + __internal_mountOAuthDeviceVerification = (node: HTMLDivElement, props?: OAuthDeviceVerificationProps) => { if (this.clerkjs && this.loaded) { if (typeof this.clerkjs.__internal_mountOAuthDeviceVerification === 'function') { diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index bf5325b7e62..ad18023b809 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -833,6 +833,23 @@ export interface Clerk { */ __internal_unmountOAuthConsent: (targetNode: HTMLDivElement) => void; + /** + * Mounts the experimental agent action approval component. + * + * @param targetNode - Target node to mount the component into. + * @param props - Agent action approval configuration. + * @experimental + */ + __experimental_mountAgentActionApproval: (targetNode: HTMLDivElement, props?: AgentActionApprovalProps) => void; + + /** + * Unmounts the experimental agent action approval component. + * + * @param targetNode - Target node to unmount the component from. + * @experimental + */ + __experimental_unmountAgentActionApproval: (targetNode: HTMLDivElement) => void; + /** * Mounts a OAuth consent component at the target element. * @@ -2787,6 +2804,20 @@ export type OAuthConsentProps = { onDeny?: () => void; }; +/** + * Properties for the experimental agent action approval component. + * + * @interface + * + * @experimental + */ +export type AgentActionApprovalProps = { + /** + * Customization options to fully match the Clerk components to your own brand. These options serve as overrides and will be merged with the global `appearance` configuration (if one is provided). + */ + appearance?: ClerkAppearanceTheme; +}; + export type OAuthDeviceVerificationProps = { /** * Customization options to fully match the Clerk component to your own brand. diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index f1f6e9dd7bf..67c2bfd6927 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -1374,6 +1374,27 @@ export type __internal_LocalizationResource = { subtitle: LocalizationValue<'applicationName'>; }; }; + agentActionApproval: { + title: LocalizationValue; + requestedAt: LocalizationValue<'relativeTime'>; + commentLabel: LocalizationValue; + commentOptional: LocalizationValue; + commentPlaceholder: LocalizationValue; + detailsLabel: LocalizationValue; + copyParameter: LocalizationValue<'parameter'>; + parameterCopied: LocalizationValue<'parameter'>; + expiresIn: LocalizationValue<'remaining'>; + action__approve: LocalizationValue; + action__deny: LocalizationValue; + terminal: { + approvedTitle: LocalizationValue; + approvedSubtitle: LocalizationValue; + deniedTitle: LocalizationValue; + deniedSubtitle: LocalizationValue; + expiredTitle: LocalizationValue; + expiredSubtitle: LocalizationValue; + }; + }; oauthDeviceVerification: { start: { title: LocalizationValue; diff --git a/packages/tanstack-react-start/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/tanstack-react-start/src/__tests__/__snapshots__/exports.test.ts.snap index bc8dc12e555..6ad5fdef6c4 100644 --- a/packages/tanstack-react-start/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/tanstack-react-start/src/__tests__/__snapshots__/exports.test.ts.snap @@ -23,6 +23,7 @@ exports[`legacy public exports > should not change unexpectedly 1`] = ` exports[`root public exports > should not change unexpectedly 1`] = ` [ "APIKeys", + "AgentActionApproval", "AuthenticateWithRedirectCallback", "ClerkDegraded", "ClerkFailed", diff --git a/packages/ui/src/components/AgentActionApproval/ActionDetails.tsx b/packages/ui/src/components/AgentActionApproval/ActionDetails.tsx new file mode 100644 index 00000000000..b65b2deadec --- /dev/null +++ b/packages/ui/src/components/AgentActionApproval/ActionDetails.tsx @@ -0,0 +1,139 @@ +import type { ComponentType } from 'react'; + +import { Box, Dd, Dl, Dt, Flex, Icon, localizationKeys, Text, useLocalizations } from '@/ui/customizables'; +import { IconButton } from '@/ui/elements/IconButton'; +import { useClipboard } from '@/ui/hooks'; +import { Checkmark, Copy } from '@/ui/icons'; +import { animations } from '@/ui/styledSystem'; + +export type ActionDetail = { + key: string; + label: string; + value: string; + secondaryValue?: string; + icon?: ComponentType; + copyable?: boolean; +}; + +export function ActionDetails({ details }: { details: ActionDetail[] }) { + const { t } = useLocalizations(); + + if (details.length === 0) { + return null; + } + + return ( +
({ + borderWidth: theme.borderWidths.$normal, + borderStyle: theme.borderStyles.$solid, + borderColor: theme.colors.$borderAlpha150, + borderRadius: theme.radii.$md, + overflow: 'hidden', + })} + > + {details.map(detail => ( + + ))} +
+ ); +} + +function ActionDetailRow({ detail }: { detail: ActionDetail }) { + const { t } = useLocalizations(); + const { onCopy, hasCopied } = useClipboard(detail.value); + + return ( + ({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: theme.space.$4, + paddingInline: theme.space.$3, + paddingBlock: theme.space.$3x5, + '&:not(:first-child)': { + borderBlockStartWidth: theme.borderWidths.$normal, + borderBlockStartStyle: theme.borderStyles.$solid, + borderBlockStartColor: theme.colors.$borderAlpha100, + }, + })} + > +
+ {detail.label} +
+
+ + {detail.icon ? ( + + ) : null} + + {detail.value} + + {detail.secondaryValue ? ( + + {detail.secondaryValue} + + ) : null} + {detail.copyable ? ( + ({ + color: hasCopied ? theme.colors.$success500 : 'inherit', + animation: hasCopied + ? `${animations.fadeIn} ${theme.transitionDuration.$fast} ${theme.transitionTiming.$common}` + : undefined, + '@media (prefers-reduced-motion: reduce)': { + animation: 'none', + }, + })} + /> + } + onClick={() => onCopy()} + sx={theme => ({ + width: theme.sizes.$6, + height: theme.sizes.$6, + padding: 0, + borderRadius: theme.radii.$sm, + flexShrink: 0, + })} + /> + ) : null} + +
+
+ ); +} diff --git a/packages/ui/src/components/AgentActionApproval/AgentActionApproval.tsx b/packages/ui/src/components/AgentActionApproval/AgentActionApproval.tsx new file mode 100644 index 00000000000..7f771399f57 --- /dev/null +++ b/packages/ui/src/components/AgentActionApproval/AgentActionApproval.tsx @@ -0,0 +1,157 @@ +import { useMemo, useState } from 'react'; + +import { Button, Col, Flex, Flow, FormLabel, Grid, localizationKeys, Text, useLocalizations } from '@/ui/customizables'; +import { Card } from '@/ui/elements/Card'; +import { withCardStateProvider } from '@/ui/elements/contexts'; +import { Header } from '@/ui/elements/Header'; +import { CreditCard, ShieldCheck } from '@/ui/icons'; +import { Textarea } from '@/ui/primitives'; + +import { ActionDetails } from './ActionDetails'; +import { AgentActionIcon } from './AgentActionIcon'; +import { TerminalCard, type TerminalStatus } from './TerminalCard'; +import { formatRemainingTime, useCountdown } from './useCountdown'; + +const mockAction = { + description: 'Refund the most recent charge after the customer reported a duplicate payment.', + parameters: [ + { key: 'refund_amount', label: 'Refund amount', value: '$400.00' }, + { key: 'customer_id', label: 'Refund to', value: 'Cameron Walker' }, + { key: 'payment_method', label: 'Payment method', value: 'Visa', secondaryValue: '⋯ 4242', icon: CreditCard }, + { key: 'payment_intent_id', label: 'Payment intent', value: 'pi_3QkL8mF7bXn4p9V2c6a', copyable: true }, + ], +}; + +function ApprovalScreen() { + const { locale, t } = useLocalizations(); + const [comment, setComment] = useState(''); + const [decision, setDecision] = useState(null); + const timestamps = useMemo( + () => ({ + createdAt: Date.now() - 3 * 60 * 1_000, + expiresAt: Date.now() + 15 * 60 * 1_000, + }), + [], + ); + const { remaining, isExpired } = useCountdown(timestamps.expiresAt, decision !== null); + + if (decision) { + return ; + } + + if (isExpired) { + return ; + } + + return ( + + + + + + + + + + + {mockAction.description} + + + + + + + +