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 682f9b2f53e..ee92b730951 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', 'taskChooseOrganization', 'taskResetPassword', 'taskSetupMFA', @@ -154,6 +155,7 @@ const componentControls: Record = { apiKeys: buildComponentControls('apiKeys'), configureSSO: buildComponentControls('configureSSO'), oauthConsent: buildComponentControls('oauthConsent'), + agentActionApproval: buildComponentControls('agentActionApproval'), taskChooseOrganization: buildComponentControls('taskChooseOrganization'), taskResetPassword: buildComponentControls('taskResetPassword'), taskSetupMFA: buildComponentControls('taskSetupMFA'), @@ -425,6 +427,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', + }, '/task-choose-organization': { mount: 'mountTaskChooseOrganization', component: 'taskChooseOrganization', 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 f59c231dceb..1b78c1bfe59 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 1a0e9542bce..ba2635a5e16 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const arSA: LocalizationResource = { locale: 'ar-SA', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 87edd1c7956..85551199637 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const beBY: LocalizationResource = { locale: 'be-BY', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 d7c80b74640..1d8de48e5a0 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const bgBG: LocalizationResource = { locale: 'bg-BG', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 cdf78289cad..d68363849a9 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const bnIN: LocalizationResource = { locale: 'bn-IN', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 d761a145fb1..145f4e78fbf 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const caES: LocalizationResource = { locale: 'ca-ES', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 3c3b8dc5443..d1d10ccf5d8 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const csCZ: LocalizationResource = { locale: 'cs-CZ', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 92936019d80..339e64077e4 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const daDK: LocalizationResource = { locale: 'da-DK', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 07f932898cf..c801b039991 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const deDE: LocalizationResource = { locale: 'de-DE', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 02c1d49ec2e..79a9eb1ee30 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const elGR: LocalizationResource = { locale: 'el-GR', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 33071fdb142..cc53d8c61cd 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const enGB: LocalizationResource = { locale: 'en-GB', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 aa0385251de..0f97fd83e93 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -2,6 +2,25 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const enUS: LocalizationResource = { locale: 'en-US', + agentActionApproval: { + action__approve: 'Approve', + action__reject: 'Reject', + commentLabel: 'Comment (optional)', + commentPlaceholder: 'Add context for the requesting application', + expiresIn: 'Approval window closes in {{remaining}}', + requestedBy: 'Requested by {{agent}} · {{createdAt}}', + subtitle: 'Review the details before allowing this action to continue.', + terminal: { + approvedSubtitle: 'You can close this window, return to your agent, and retry the request.', + approvedTitle: 'Agent is now authorized to continue', + expiredSubtitle: + 'The approval window closed. No action was taken. You can close this window and return to your agent.', + expiredTitle: 'Approval window closed', + rejectedSubtitle: 'No action was taken. You can close this window and return to your agent.', + rejectedTitle: 'Action rejected', + }, + 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 baeb439a0ac..94375f5ca58 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const esCR: LocalizationResource = { locale: 'es-CR', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 e4ecf17e7ee..93889a7892f 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const esES: LocalizationResource = { locale: 'es-ES', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 09d0fc1e04e..9f62f1ca3ac 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const esMX: LocalizationResource = { locale: 'es-MX', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 6a799bdf3c5..a9006555302 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const esUY: LocalizationResource = { locale: 'es-UY', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 86beba5c4c9..c31d86db63e 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const faIR: LocalizationResource = { locale: 'fa-IR', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 b1a1b5094d2..24c981818c6 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const fiFI: LocalizationResource = { locale: 'fi-FI', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 583b57611f8..43ef95cd38d 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const frFR: LocalizationResource = { locale: 'fr-FR', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 ae7a88af420..9e867cd03bc 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const heIL: LocalizationResource = { locale: 'he-IL', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 9d04a365a23..858fa80ecd1 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const hiIN: LocalizationResource = { locale: 'hi-IN', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 34b0d179df7..aa80937a791 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const hrHR: LocalizationResource = { locale: 'hr-HR', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 56540481844..7dee4e0a2f8 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const huHU: LocalizationResource = { locale: 'hu-HU', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 a66d1a4b145..3e8b1696ea0 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const idID: LocalizationResource = { locale: 'id-ID', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 1fc6b0994ea..7c6cb93c251 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const isIS: LocalizationResource = { locale: 'is-IS', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 4c20d26e3c1..b06a85beb43 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const itIT: LocalizationResource = { locale: 'it-IT', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 81068f420aa..c5d4e084f32 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const jaJP: LocalizationResource = { locale: 'ja-JP', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 ba47ffd33de..2af04450f27 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const kkKZ: LocalizationResource = { locale: 'kk-KZ', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 6fc94c87f5f..ec96359c820 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const koKR: LocalizationResource = { locale: 'ko-KR', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 ad8fcf996f1..3aefe945b29 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const mnMN: LocalizationResource = { locale: 'mn-MN', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 092c1db2245..0eb119cfc86 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const msMY: LocalizationResource = { locale: 'ms-MY', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 475ca454fd7..b59fdbe22ed 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const nbNO: LocalizationResource = { locale: 'nb-NO', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 1f2f19eacea..0907a8ef7ea 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const nlBE: LocalizationResource = { locale: 'nl-BE', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 00c4e01265b..ade0aa15ca8 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const nlNL: LocalizationResource = { locale: 'nl-NL', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 9a0741b215a..ea863247109 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const plPL: LocalizationResource = { locale: 'pl-PL', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 9ae09c0eabd..19c9b366c7f 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const ptBR: LocalizationResource = { locale: 'pt-BR', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 8e370687ade..c2a335b9a26 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const ptPT: LocalizationResource = { locale: 'pt-PT', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 f8cccc3e9f8..21db17e5a74 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const roRO: LocalizationResource = { locale: 'ro-RO', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 32b4035047c..3a98ec544ae 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const ruRU: LocalizationResource = { locale: 'ru-RU', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 dc36b79e866..679960ae450 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const skSK: LocalizationResource = { locale: 'sk-SK', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 157efee229b..0163bf610fd 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const srRS: LocalizationResource = { locale: 'sr-RS', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 747357f7ef7..67812d6339f 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const svSE: LocalizationResource = { locale: 'sv-SE', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 58024742b32..8d013882058 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const taIN: LocalizationResource = { locale: 'ta-IN', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 1dcefe67386..f47408ebe0a 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const teIN: LocalizationResource = { locale: 'te-IN', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 e67007a7c1e..3b7ba40591a 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const thTH: LocalizationResource = { locale: 'th-TH', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 b95612c1e19..fcb28c4589e 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const trTR: LocalizationResource = { locale: 'tr-TR', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 3f982bc72b8..a94732e3012 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const ukUA: LocalizationResource = { locale: 'uk-UA', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 d848ef3838f..9b4dd2974fa 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const viVN: LocalizationResource = { locale: 'vi-VN', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 dfbf68c8f6b..0aa9e30b56f 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const zhCN: LocalizationResource = { locale: 'zh-CN', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 6ca3ead8138..7bfc3a87386 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -14,6 +14,24 @@ import type { LocalizationResource } from '@clerk/shared/types'; export const zhTW: LocalizationResource = { locale: 'zh-TW', + agentActionApproval: { + action__approve: undefined, + action__reject: undefined, + commentLabel: undefined, + commentPlaceholder: undefined, + expiresIn: undefined, + requestedBy: undefined, + subtitle: undefined, + terminal: { + approvedSubtitle: undefined, + approvedTitle: undefined, + expiredSubtitle: undefined, + expiredTitle: undefined, + rejectedSubtitle: undefined, + rejectedTitle: 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 1c2982bd933..fe0be4e3394 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 f8321ccb4ba..5161eb2b610 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 fb0e0ea41c9..d58589f29b1 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 8baf38bf307..19bf14eb68f 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 b8ab9bdddbb..7e3c05db0e4 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, @@ -672,6 +673,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 }, +); + export const UserAvatar = withClerk( ({ clerk, component, fallback, ...props }: WithClerkProp) => { const mountingStatus = useWaitForComponentMount(component); diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index c4c160c35cf..4125b5fb294 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, @@ -166,6 +167,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { private premountAPIKeysNodes = new Map(); private premountConfigureSSONodes = new Map(); private premountOAuthConsentNodes = new Map(); + private premountAgentActionApprovalNodes = new Map(); private premountTaskChooseOrganizationNodes = new Map(); private premountTaskResetPasswordNodes = new Map(); private premountTaskSetupMFANodes = new Map(); @@ -803,6 +805,10 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { clerkjs.__internal_mountOAuthConsent(node, props); }); + this.premountAgentActionApprovalNodes.forEach((props, node) => { + clerkjs.__experimental_mountAgentActionApproval(node, props); + }); + this.premountTaskChooseOrganizationNodes.forEach((props, node) => { clerkjs.mountTaskChooseOrganization(node, props); }); @@ -1403,6 +1409,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); + } + }; + mountTaskChooseOrganization = (node: HTMLDivElement, props?: TaskChooseOrganizationProps): void => { if (this.clerkjs && this.loaded) { this.clerkjs.mountTaskChooseOrganization(node, props); diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 0f57591517d..98bf10494c9 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. * @@ -2770,6 +2787,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; +}; + /** @deprecated Use OAuthConsentProps instead. */ export type __internal_OAuthConsentProps = OAuthConsentProps; diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index 26b9452fc15..43a5e2c1ba0 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -1374,6 +1374,24 @@ export type __internal_LocalizationResource = { subtitle: LocalizationValue<'applicationName'>; }; }; + agentActionApproval: { + title: LocalizationValue; + subtitle: LocalizationValue; + requestedBy: LocalizationValue<'agent' | 'createdAt'>; + commentLabel: LocalizationValue; + commentPlaceholder: LocalizationValue; + expiresIn: LocalizationValue<'remaining'>; + action__approve: LocalizationValue; + action__reject: LocalizationValue; + terminal: { + approvedTitle: LocalizationValue; + approvedSubtitle: LocalizationValue; + rejectedTitle: LocalizationValue; + rejectedSubtitle: LocalizationValue; + expiredTitle: LocalizationValue; + expiredSubtitle: LocalizationValue; + }; + }; unstable__errors: UnstableErrors; dates: { previous6Days: LocalizationValue<'date'>; 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 ee11ac03e0f..c206204c604 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/AgentActionApproval.tsx b/packages/ui/src/components/AgentActionApproval/AgentActionApproval.tsx new file mode 100644 index 00000000000..4025246cf24 --- /dev/null +++ b/packages/ui/src/components/AgentActionApproval/AgentActionApproval.tsx @@ -0,0 +1,163 @@ +import { useMemo, useState } from 'react'; + +import { + Button, + Col, + Flow, + FormLabel, + Grid, + Heading, + localizationKeys, + Text, + useLocalizations, +} from '@/ui/customizables'; +import { Card } from '@/ui/elements/Card'; +import { withCardStateProvider } from '@/ui/elements/contexts'; +import { Divider } from '@/ui/elements/Divider'; +import { Header } from '@/ui/elements/Header'; +import { LineItems } from '@/ui/elements/LineItems'; +import { Textarea } from '@/ui/primitives'; + +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.', + operation: 'Create a refund', + parameters: [ + { key: 'refund_amount', label: 'Refund amount', value: '$250.00' }, + { key: 'customer_id', label: 'Customer', value: 'cus_agent_demo' }, + { key: 'payment_intent_id', label: 'Payment intent', value: 'pi_agent_demo' }, + { key: 'payment_method', label: 'Payment method', value: 'Visa ending in 4242' }, + ], + requestedBy: 'Codex', +}; + +function ApprovalScreen() { + const { t } = useLocalizations(); + const [comment, setComment] = useState(''); + const [decision, setDecision] = useState(null); + const timestamps = useMemo( + () => ({ + createdAt: Date.now() - 2 * 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.operation} + + ({ fontSize: theme.fontSizes.$sm })} + localizationKey={localizationKeys('agentActionApproval.requestedBy', { + agent: mockAction.requestedBy, + createdAt: formatTimestamp(timestamps.createdAt), + })} + /> + + {mockAction.description} + + + {mockAction.parameters.map(parameter => ( + + + + + ))} + + + + +