@agent-native/toolkit 0.225.1 → 0.226.0-nightly-20261106182619
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-native.eject.json +1 -0
- package/dist/app/agentkit/react/components.d.ts.map +1 -1
- package/dist/app/agentkit/react/components.js +124 -9
- package/dist/app/agentkit/react/components.js.map +1 -1
- package/dist/app/agentkit/react/context.d.ts +1 -1
- package/dist/app/agentkit/react/core-file-storage.d.ts +21 -0
- package/dist/app/agentkit/react/core-file-storage.d.ts.map +1 -0
- package/dist/app/agentkit/react/core-file-storage.js +3 -0
- package/dist/app/agentkit/react/core-file-storage.js.map +1 -0
- package/dist/app/auth/AuthPage.d.ts.map +1 -1
- package/dist/app/auth/AuthPage.js +89 -10
- package/dist/app/auth/AuthPage.js.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.js +39 -58
- package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
- package/dist/app/chat/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/app/chat/MultiTabAssistantChat.js +3 -1
- package/dist/app/chat/MultiTabAssistantChat.js.map +1 -1
- package/dist/app/chat/agentkit-chat/root.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/root.js +66 -2
- package/dist/app/chat/agentkit-chat/root.js.map +1 -1
- package/dist/app/chat/chat/surface-types.d.ts +1 -0
- package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
- package/dist/app/chat/chat/surface-types.js.map +1 -1
- package/dist/app/chat/composer/runtime-adapters.d.ts.map +1 -1
- package/dist/app/chat/composer/runtime-adapters.js +2 -0
- package/dist/app/chat/composer/runtime-adapters.js.map +1 -1
- package/dist/app/chat/composer/use-agentkit-capabilities.d.ts +3 -1
- package/dist/app/chat/composer/use-agentkit-capabilities.d.ts.map +1 -1
- package/dist/app/chat/composer/use-agentkit-capabilities.js +11 -11
- package/dist/app/chat/composer/use-agentkit-capabilities.js.map +1 -1
- package/dist/app/chat/composer/use-workspace-composer-menu.d.ts +3 -0
- package/dist/app/chat/composer/use-workspace-composer-menu.d.ts.map +1 -0
- package/dist/app/chat/composer/use-workspace-composer-menu.js +80 -0
- package/dist/app/chat/composer/use-workspace-composer-menu.js.map +1 -0
- package/dist/app/chat/index.d.ts +1 -0
- package/dist/app/chat/index.d.ts.map +1 -1
- package/dist/app/chat/index.js +1 -0
- package/dist/app/chat/index.js.map +1 -1
- package/dist/app/chat/prepare-prompt-composer-agent-handoff.d.ts +5 -0
- package/dist/app/chat/prepare-prompt-composer-agent-handoff.d.ts.map +1 -0
- package/dist/app/chat/prepare-prompt-composer-agent-handoff.js +108 -0
- package/dist/app/chat/prepare-prompt-composer-agent-handoff.js.map +1 -0
- package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.js +6 -1
- package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.js +6 -1
- package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
- package/dist/app/i18n/catalogs/en-US.d.ts +6 -1
- package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/en-US.js +6 -1
- package/dist/app/i18n/catalogs/en-US.js.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.js +6 -1
- package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.js +6 -1
- package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.js +6 -1
- package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.js +6 -1
- package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.js +6 -1
- package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.js +6 -1
- package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.js +6 -1
- package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.js +6 -1
- package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
- package/dist/app/resources/McpIntegrationDialog.d.ts +3 -1
- package/dist/app/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/app/resources/McpIntegrationDialog.js +2 -2
- package/dist/app/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/app/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/app/settings/useBuilderStatus.js +119 -40
- package/dist/app/settings/useBuilderStatus.js.map +1 -1
- package/dist/composer/ComposerContextMenu.d.ts +36 -2
- package/dist/composer/ComposerContextMenu.d.ts.map +1 -1
- package/dist/composer/ComposerContextMenu.js +108 -40
- package/dist/composer/ComposerContextMenu.js.map +1 -1
- package/dist/composer/ComposerContextPickerDialog.d.ts.map +1 -1
- package/dist/composer/ComposerContextPickerDialog.js +63 -26
- package/dist/composer/ComposerContextPickerDialog.js.map +1 -1
- package/dist/composer/ComposerPlusMenu.d.ts +5 -3
- package/dist/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/composer/ComposerPlusMenu.js +166 -121
- package/dist/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/composer/MentionItemMedia.d.ts.map +1 -1
- package/dist/composer/MentionItemMedia.js +3 -1
- package/dist/composer/MentionItemMedia.js.map +1 -1
- package/dist/composer/PromptComposer.d.ts +1 -0
- package/dist/composer/PromptComposer.d.ts.map +1 -1
- package/dist/composer/PromptComposer.js +1 -0
- package/dist/composer/PromptComposer.js.map +1 -1
- package/dist/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/composer/TiptapComposer.js +117 -50
- package/dist/composer/TiptapComposer.js.map +1 -1
- package/dist/composer/index.d.ts +1 -0
- package/dist/composer/index.d.ts.map +1 -1
- package/dist/composer/runtime-adapters.d.ts +15 -0
- package/dist/composer/runtime-adapters.d.ts.map +1 -1
- package/dist/composer/runtime-adapters.js.map +1 -1
- package/dist/composer/use-composer-panel-placement.d.ts.map +1 -1
- package/dist/composer/use-composer-panel-placement.js +2 -4
- package/dist/composer/use-composer-panel-placement.js.map +1 -1
- package/dist/composer/use-mention-search.d.ts +7 -0
- package/dist/composer/use-mention-search.d.ts.map +1 -1
- package/dist/composer/use-mention-search.js +86 -19
- package/dist/composer/use-mention-search.js.map +1 -1
- package/dist/composer/useComposerContextPicker.d.ts +5 -1
- package/dist/composer/useComposerContextPicker.d.ts.map +1 -1
- package/dist/composer/useComposerContextPicker.js +18 -4
- package/dist/composer/useComposerContextPicker.js.map +1 -1
- package/package.json +4 -4
- package/src/app/agentkit/react/components.tsx +158 -11
- package/src/app/agentkit/react/composer-context.spec.tsx +180 -0
- package/src/app/agentkit/react/core-file-storage.tsx +14 -0
- package/src/app/auth/AuthPage.interaction.spec.tsx +143 -0
- package/src/app/auth/AuthPage.tsx +159 -13
- package/src/app/chat/AgentKitAssistantChat.spec.tsx +65 -3
- package/src/app/chat/AgentKitAssistantChat.tsx +57 -65
- package/src/app/chat/MultiTabAssistantChat.spec.tsx +21 -0
- package/src/app/chat/MultiTabAssistantChat.tsx +4 -0
- package/src/app/chat/agentkit-chat/root.tsx +91 -8
- package/src/app/chat/chat/surface-types.ts +1 -0
- package/src/app/chat/composer/runtime-adapters.tsx +2 -0
- package/src/app/chat/composer/use-agentkit-capabilities.hardening.spec.tsx +26 -1
- package/src/app/chat/composer/use-agentkit-capabilities.ts +11 -11
- package/src/app/chat/composer/use-agentkit-integration-menu.spec.tsx +2 -4
- package/src/app/chat/composer/use-workspace-composer-menu.spec.tsx +174 -0
- package/src/app/chat/composer/use-workspace-composer-menu.tsx +122 -0
- package/src/app/chat/index.ts +1 -0
- package/src/app/chat/prepare-prompt-composer-agent-handoff.spec.ts +162 -0
- package/src/app/chat/prepare-prompt-composer-agent-handoff.ts +134 -0
- package/src/app/i18n/catalogs/ar-SA.ts +6 -1
- package/src/app/i18n/catalogs/de-DE.ts +6 -1
- package/src/app/i18n/catalogs/en-US.ts +6 -1
- package/src/app/i18n/catalogs/es-ES.ts +6 -1
- package/src/app/i18n/catalogs/fr-FR.ts +6 -1
- package/src/app/i18n/catalogs/hi-IN.ts +6 -1
- package/src/app/i18n/catalogs/ja-JP.ts +6 -1
- package/src/app/i18n/catalogs/ko-KR.ts +6 -1
- package/src/app/i18n/catalogs/pt-BR.ts +6 -1
- package/src/app/i18n/catalogs/zh-CN.ts +6 -1
- package/src/app/i18n/catalogs/zh-TW.ts +6 -1
- package/src/app/resources/McpIntegrationDialog.tsx +5 -0
- package/src/app/settings/useBuilderStatus.spec.tsx +229 -13
- package/src/app/settings/useBuilderStatus.ts +145 -47
- package/src/composer/ComposerContextMenu.spec.tsx +95 -32
- package/src/composer/ComposerContextMenu.tsx +284 -73
- package/src/composer/ComposerContextPicker.spec.tsx +13 -14
- package/src/composer/ComposerContextPickerDialog.spec.tsx +40 -3
- package/src/composer/ComposerContextPickerDialog.tsx +158 -24
- package/src/composer/ComposerPlusMenu.parity.spec.tsx +442 -62
- package/src/composer/ComposerPlusMenu.tsx +322 -237
- package/src/composer/MentionItemMedia.tsx +3 -0
- package/src/composer/PromptComposer.context.spec.tsx +253 -82
- package/src/composer/PromptComposer.tsx +2 -0
- package/src/composer/TiptapComposer.spec.ts +6 -8
- package/src/composer/TiptapComposer.tsx +148 -55
- package/src/composer/index.ts +5 -0
- package/src/composer/runtime-adapters.tsx +18 -0
- package/src/composer/use-composer-panel-placement.ts +2 -4
- package/src/composer/use-mention-search.spec.tsx +99 -1
- package/src/composer/use-mention-search.ts +101 -24
- package/src/composer/useComposerContextPicker.ts +25 -5
|
@@ -565,7 +565,7 @@ export declare function useAgentKitControl(requestedThreadId?: ThreadId): {
|
|
|
565
565
|
fork: (fromMessageId: string) => Promise<AgentThread>;
|
|
566
566
|
updateThread: (patch: Parameters<AgentKitController["updateThread"]>[1]) => Promise<AgentThread>;
|
|
567
567
|
deleteThread: () => Promise<void>;
|
|
568
|
-
uploadFiles: (files: import("@agent-native/agentkit").
|
|
568
|
+
uploadFiles: (files: import("@agent-native/agentkit").AgentUploadFile[], context?: import("@agent-native/agentkit").AgentRequestContext | undefined) => Promise<import("@agent-native/agentkit").FilePart[]>;
|
|
569
569
|
invokeAction: (invocation: import("@agent-native/agentkit").AgentActionInvocation, context?: import("@agent-native/agentkit").AgentRequestContext) => Promise<import("@agent-native/agentkit").AgentActionResult>;
|
|
570
570
|
};
|
|
571
571
|
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ComponentType, type RefObject } from "react";
|
|
2
|
+
type SetupProps = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
anchorRef: RefObject<HTMLElement | null>;
|
|
5
|
+
onOpenChange: (open: boolean) => void;
|
|
6
|
+
onConnected: () => void;
|
|
7
|
+
} & ({
|
|
8
|
+
status: "missing";
|
|
9
|
+
} | {
|
|
10
|
+
status: "unavailable";
|
|
11
|
+
onRetry: () => void;
|
|
12
|
+
});
|
|
13
|
+
export declare const CoreFileStorageSetupContext: import("react").Context<{
|
|
14
|
+
scopeKey: string;
|
|
15
|
+
readStatus: () => Promise<{
|
|
16
|
+
configured: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
Setup: ComponentType<SetupProps>;
|
|
19
|
+
} | null>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=core-file-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-file-storage.d.ts","sourceRoot":"","sources":["../../../../src/app/agentkit/react/core-file-storage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1E,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,GAAG,CAAC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAAC;AAE7E,eAAO,MAAM,2BAA2B;cAC5B,MAAM;gBACJ,MAAM,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;WAC3C,aAAa,CAAC,UAAU,CAAC;SACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-file-storage.js","sourceRoot":"","sources":["../../../../src/app/agentkit/react/core-file-storage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAsC,MAAM,OAAO,CAAC;AAS1E,MAAM,CAAC,MAAM,2BAA2B,GAAG,aAAa,CAI9C,IAAI,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthPage.d.ts","sourceRoot":"","sources":["../../../src/app/auth/AuthPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AuthPage.d.ts","sourceRoot":"","sources":["../../../src/app/auth/AuthPage.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAEV,aAAa,EACb,QAAQ,EACT,MAAM,2CAA2C,CAAC;AAKnD,OAAO,EAEL,yBAAyB,EAG1B,MAAM,2CAA2C,CAAC;AAInD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,QAAQ,GACT,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kDAAkD,CAAC;AAiB1D,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAErC,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAY1E;AA+DD,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,OAAO,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,CAGR;AAmDD,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC,EACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,EAAE,OAAO,GAChB,OAAO,CAOT;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAET;AAkKD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAWV;AAyDD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B,EAAE,MAAM,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAQT;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,4BAA4B,EAAE,MAAM,EACpC,SAAS,SAA8D,GACtE,MAAM,CAQR;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,CAOT;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAYV;AA4FD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,iBAAiB,EAAE,OAAO,GACzB,OAAO,CAET;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAUT;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,qBA0kF5C"}
|
|
@@ -2,6 +2,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { captureAttribution, getAnalyticsAnonymousId, getAnalyticsSessionId, } from "@agent-native/core/client/analytics";
|
|
3
3
|
import { frameworkRoutePrefix } from "@agent-native/core/client/api-path";
|
|
4
4
|
import { identityBootstrapCallbackHref, isAgentNativeDesktop, isBuilderDesktop, normalizeOAuthReturnPath, shouldRetryAuthSessionProbe, } from "@agent-native/core/client/auth/auth-page-helpers";
|
|
5
|
+
import { acceptBuilderSignupAssignment, getBuilderSignupAssignment, } from "@agent-native/core/client/auth/builder-signup";
|
|
5
6
|
import { whenConsentDecided } from "@agent-native/core/client/consent";
|
|
6
7
|
import { openOAuthPopup } from "@agent-native/core/client/oauth-popup";
|
|
7
8
|
import { navigateForSession } from "@agent-native/core/client/use-session";
|
|
@@ -155,8 +156,9 @@ async function requestJson(url, init = {}) {
|
|
|
155
156
|
}
|
|
156
157
|
return { response, data, readable };
|
|
157
158
|
}
|
|
159
|
+
let builderSignupTelemetry = {};
|
|
158
160
|
function trackAuth(app, name, properties = {}, email) {
|
|
159
|
-
if (!isValidEmail(email) || isTestIdentityEmail(email))
|
|
161
|
+
if (email && (!isValidEmail(email) || isTestIdentityEmail(email)))
|
|
160
162
|
return;
|
|
161
163
|
if (isSyntheticTrafficValue(window.__AGENT_NATIVE_SYNTHETIC_TRAFFIC__)) {
|
|
162
164
|
return;
|
|
@@ -169,7 +171,11 @@ function trackAuth(app, name, properties = {}, email) {
|
|
|
169
171
|
const timestamp = new Date().toISOString();
|
|
170
172
|
const endpoint = resolveLaneEndpoint(config.agentNativeAnalyticsEndpoint ??
|
|
171
173
|
"https://analytics.agent-native.com/track", window.location.hostname);
|
|
172
|
-
const legacyProperties = {
|
|
174
|
+
const legacyProperties = {
|
|
175
|
+
app,
|
|
176
|
+
...(app === "design" ? builderSignupTelemetry : {}),
|
|
177
|
+
...properties,
|
|
178
|
+
};
|
|
173
179
|
const events = [{ name, properties: legacyProperties }];
|
|
174
180
|
const canonical = canonicalTrackingEvent(name, legacyProperties);
|
|
175
181
|
if (canonical)
|
|
@@ -432,12 +438,51 @@ export function shouldStartWithLocalDev(pathname, search) {
|
|
|
432
438
|
}
|
|
433
439
|
export function AuthPage(props) {
|
|
434
440
|
const { authMode, googleOnly, initialPrompt, appBasePath, homePath, initialResumeHref, workspaceRuntime, trackingApp, defaultLocale, localeStorageKey, locales, localeMetadata, localeOptions, marketing, marketingLocales, brandMarkSrc, brandMarkLightSrc, githubUrl, appName, showGoogle, organizationSsoEnabled = false, googleViaIdentitySso = false, signupLegalNotice, signupLocalModeNote, docsAuthUrl, identitySsoEnabled = false, identitySsoAuto = false, publicOAuthOrigin, workspaceGatewayReturnOrigin, googleAuthMode, builderPreviewLocalDevEnabled, } = props;
|
|
441
|
+
const [builderSignup, setBuilderSignup] = React.useState(trackingApp === "design" ? null : { status: "disabled" });
|
|
442
|
+
const builderSignupRequest = React.useRef(null);
|
|
443
|
+
React.useEffect(() => {
|
|
444
|
+
if (trackingApp !== "design")
|
|
445
|
+
return;
|
|
446
|
+
builderSignupTelemetry = {};
|
|
447
|
+
let disposed = false;
|
|
448
|
+
builderSignupRequest.current ??= getBuilderSignupAssignment();
|
|
449
|
+
void builderSignupRequest.current.then((assignment) => {
|
|
450
|
+
if (disposed)
|
|
451
|
+
return;
|
|
452
|
+
setBuilderSignup(assignment);
|
|
453
|
+
}, () => {
|
|
454
|
+
if (!disposed) {
|
|
455
|
+
builderSignupTelemetry = {};
|
|
456
|
+
setBuilderSignup({ status: "unavailable" });
|
|
457
|
+
trackAuth(trackingApp, "auth.builder_signup_experiment_unavailable", {
|
|
458
|
+
stage: "assignment",
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
return () => {
|
|
463
|
+
disposed = true;
|
|
464
|
+
};
|
|
465
|
+
}, [trackingApp]);
|
|
435
466
|
const [localePreference, setLocalePreference] = React.useState("system");
|
|
436
467
|
const [locale, setLocale] = React.useState(defaultLocale);
|
|
437
468
|
const [browserLocationReady, setBrowserLocationReady] = React.useState(false);
|
|
438
469
|
React.useEffect(() => setBrowserLocationReady(true), []);
|
|
439
470
|
const [localeMenuOpen, setLocaleMenuOpen] = React.useState(false);
|
|
440
471
|
const [view, setView] = React.useState(props.initialView);
|
|
472
|
+
const builderSignupExposure = React.useRef(null);
|
|
473
|
+
React.useEffect(() => {
|
|
474
|
+
if (builderSignup?.status !== "assigned" ||
|
|
475
|
+
!["signup", "magicLink", "googleOnly"].includes(view) ||
|
|
476
|
+
builderSignupExposure.current === builderSignup.id)
|
|
477
|
+
return;
|
|
478
|
+
builderSignupExposure.current = builderSignup.id;
|
|
479
|
+
builderSignupTelemetry = {
|
|
480
|
+
experiment_id: "design_builder_signup_v1",
|
|
481
|
+
experiment_variant: builderSignup.variant,
|
|
482
|
+
assignment_id: builderSignup.id,
|
|
483
|
+
};
|
|
484
|
+
trackAuth(trackingApp, "auth.builder_signup_experiment_exposed", builderSignupTelemetry);
|
|
485
|
+
}, [builderSignup, trackingApp, view]);
|
|
441
486
|
const [messages, setMessages] = React.useState({});
|
|
442
487
|
const [submitting, setSubmitting] = React.useState(null);
|
|
443
488
|
const [localDevAvailable, setLocalDevAvailable] = React.useState(false);
|
|
@@ -1069,11 +1114,34 @@ export function AuthPage(props) {
|
|
|
1069
1114
|
publicOAuthOrigin,
|
|
1070
1115
|
runtimeAppBasePath,
|
|
1071
1116
|
}), [publicOAuthOrigin, runtimeAppBasePath]);
|
|
1117
|
+
const prepareBuilderSignup = React.useCallback(async (method, email, flowId = createFlowId()) => {
|
|
1118
|
+
if (builderSignup?.status !== "assigned" ||
|
|
1119
|
+
builderSignup.variant !== "automatic" ||
|
|
1120
|
+
view === "login")
|
|
1121
|
+
return undefined;
|
|
1122
|
+
try {
|
|
1123
|
+
await acceptBuilderSignupAssignment(builderSignup.id, flowId, method, email);
|
|
1124
|
+
return flowId;
|
|
1125
|
+
}
|
|
1126
|
+
catch {
|
|
1127
|
+
trackAuth(trackingApp, "auth.builder_signup_experiment_unavailable", { stage: "acceptance" }, email);
|
|
1128
|
+
return undefined;
|
|
1129
|
+
}
|
|
1130
|
+
}, [builderSignup, trackingApp, view]);
|
|
1072
1131
|
const startGoogle = React.useCallback(async () => {
|
|
1073
|
-
if (!showGoogle || googleBusy)
|
|
1132
|
+
if (!showGoogle || googleBusy || !builderSignup)
|
|
1074
1133
|
return;
|
|
1075
1134
|
setGoogleBusy(true);
|
|
1076
1135
|
setNotice("google", null);
|
|
1136
|
+
const flowId = createFlowId();
|
|
1137
|
+
const redirectAfterAcceptance = async (url) => {
|
|
1138
|
+
const attemptId = await prepareBuilderSignup("google", undefined, flowId);
|
|
1139
|
+
const targetUrl = new URL(url, window.location.origin);
|
|
1140
|
+
if (attemptId)
|
|
1141
|
+
targetUrl.searchParams.set("builder_signup_attempt", attemptId);
|
|
1142
|
+
targetUrl.searchParams.set("flow_id", flowId);
|
|
1143
|
+
window.location.replace(targetUrl.toString());
|
|
1144
|
+
};
|
|
1077
1145
|
try {
|
|
1078
1146
|
window.sessionStorage.setItem("__an_signin", "1");
|
|
1079
1147
|
}
|
|
@@ -1088,10 +1156,9 @@ export function AuthPage(props) {
|
|
|
1088
1156
|
currentOrigin: window.location.origin,
|
|
1089
1157
|
})) {
|
|
1090
1158
|
const params = new URLSearchParams({ return: target });
|
|
1091
|
-
|
|
1159
|
+
await redirectAfterAcceptance(`${identityHref}?${params.toString()}`);
|
|
1092
1160
|
return;
|
|
1093
1161
|
}
|
|
1094
|
-
const flowId = createFlowId();
|
|
1095
1162
|
oauthFlowId.current = flowId;
|
|
1096
1163
|
const flow = resolveGoogleFlow();
|
|
1097
1164
|
const nativeDesktop = flow === "redirect" && isAgentNativeDesktop();
|
|
@@ -1112,7 +1179,7 @@ export function AuthPage(props) {
|
|
|
1112
1179
|
return: oauthTarget,
|
|
1113
1180
|
redirect: "1",
|
|
1114
1181
|
});
|
|
1115
|
-
|
|
1182
|
+
await redirectAfterAcceptance(`${authUrl}?${params.toString()}`);
|
|
1116
1183
|
return;
|
|
1117
1184
|
}
|
|
1118
1185
|
const verifier = createVerifier();
|
|
@@ -1143,7 +1210,7 @@ export function AuthPage(props) {
|
|
|
1143
1210
|
return: oauthTarget,
|
|
1144
1211
|
redirect: "1",
|
|
1145
1212
|
});
|
|
1146
|
-
|
|
1213
|
+
await redirectAfterAcceptance(`${authUrl}?${params.toString()}`);
|
|
1147
1214
|
return;
|
|
1148
1215
|
}
|
|
1149
1216
|
try {
|
|
@@ -1166,15 +1233,17 @@ export function AuthPage(props) {
|
|
|
1166
1233
|
return: oauthTarget,
|
|
1167
1234
|
redirect: "1",
|
|
1168
1235
|
});
|
|
1169
|
-
|
|
1236
|
+
await redirectAfterAcceptance(`${authUrl}?${params.toString()}`);
|
|
1170
1237
|
return;
|
|
1171
1238
|
}
|
|
1172
1239
|
}
|
|
1173
1240
|
try {
|
|
1241
|
+
const attemptId = await prepareBuilderSignup("google", undefined, flowId);
|
|
1174
1242
|
const params = new URLSearchParams({
|
|
1175
1243
|
return: oauthTarget,
|
|
1176
1244
|
desktop: "1",
|
|
1177
1245
|
flow_id: flowId,
|
|
1246
|
+
...(attemptId ? { builder_signup_attempt: attemptId } : {}),
|
|
1178
1247
|
});
|
|
1179
1248
|
const { response, data } = await requestJson(`${authUrl}?${params.toString()}`, {
|
|
1180
1249
|
method: "POST",
|
|
@@ -1222,6 +1291,8 @@ export function AuthPage(props) {
|
|
|
1222
1291
|
apiPath,
|
|
1223
1292
|
googleAuthUrlPath,
|
|
1224
1293
|
googleBusy,
|
|
1294
|
+
builderSignup,
|
|
1295
|
+
prepareBuilderSignup,
|
|
1225
1296
|
identityHref,
|
|
1226
1297
|
identityBootstrapHref,
|
|
1227
1298
|
googleViaIdentitySso,
|
|
@@ -1424,11 +1495,13 @@ export function AuthPage(props) {
|
|
|
1424
1495
|
auth_view: view,
|
|
1425
1496
|
}, email);
|
|
1426
1497
|
try {
|
|
1498
|
+
const builderSignupAttemptId = await prepareBuilderSignup("password", email);
|
|
1427
1499
|
const { response, data } = await requestJson(apiPath("/_agent-native/auth/register"), {
|
|
1428
1500
|
method: "POST",
|
|
1429
1501
|
headers: { "Content-Type": "application/json" },
|
|
1430
1502
|
body: JSON.stringify({
|
|
1431
1503
|
email,
|
|
1504
|
+
...(builderSignupAttemptId ? { builderSignupAttemptId } : {}),
|
|
1432
1505
|
password: signupPassword,
|
|
1433
1506
|
callbackURL: identityBootstrapHref(resumeHref()),
|
|
1434
1507
|
}),
|
|
@@ -1483,6 +1556,7 @@ export function AuthPage(props) {
|
|
|
1483
1556
|
signupEmail,
|
|
1484
1557
|
signupPassword,
|
|
1485
1558
|
signupPasswordConfirmation,
|
|
1559
|
+
prepareBuilderSignup,
|
|
1486
1560
|
t,
|
|
1487
1561
|
trackingApp,
|
|
1488
1562
|
view,
|
|
@@ -1633,11 +1707,13 @@ export function AuthPage(props) {
|
|
|
1633
1707
|
}, email);
|
|
1634
1708
|
const desktop = isAgentNativeDesktop();
|
|
1635
1709
|
try {
|
|
1710
|
+
const builderSignupAttemptId = await prepareBuilderSignup("magic-link", email);
|
|
1636
1711
|
const { response, data } = await requestJson(apiPath("/_agent-native/auth/magic-link"), {
|
|
1637
1712
|
method: "POST",
|
|
1638
1713
|
headers: { "Content-Type": "application/json" },
|
|
1639
1714
|
body: JSON.stringify({
|
|
1640
1715
|
email,
|
|
1716
|
+
...(builderSignupAttemptId ? { builderSignupAttemptId } : {}),
|
|
1641
1717
|
callbackURL: desktop
|
|
1642
1718
|
? apiPath("/_agent-native/auth/magic-link/desktop-callback")
|
|
1643
1719
|
: identityBootstrapHref(resumeHref()),
|
|
@@ -1672,6 +1748,7 @@ export function AuthPage(props) {
|
|
|
1672
1748
|
apiPath,
|
|
1673
1749
|
identityBootstrapHref,
|
|
1674
1750
|
magicLinkEmail,
|
|
1751
|
+
prepareBuilderSignup,
|
|
1675
1752
|
resumeHref,
|
|
1676
1753
|
setNotice,
|
|
1677
1754
|
startOAuthExchange,
|
|
@@ -1813,6 +1890,8 @@ export function AuthPage(props) {
|
|
|
1813
1890
|
.filter(Boolean)
|
|
1814
1891
|
.join(" ");
|
|
1815
1892
|
const localModeNote = signupLocalModeNote ? (_jsxs("div", { className: "signup-local-mode-note", id: "signup-local-mode-note", "data-command": signupLocalModeNote.command, children: [_jsx("p", { children: signupLocalModeNote.text }), _jsx("code", { children: signupLocalModeNote.command }), _jsx("button", { type: "button", className: "copy-run-local", id: "copy-signup-local-mode", "data-copy-signup-local-mode": "true", "data-i18n": "copyCommand", onClick: () => void copySignupLocalMode(), children: copiedLocalMode ? t("copied") : t("copyCommand") })] })) : null;
|
|
1893
|
+
const builderLegalNote = builderSignup?.status === "assigned" &&
|
|
1894
|
+
builderSignup.variant === "automatic" ? (_jsxs("p", { className: "legal-note", children: [t("builderSignupDisclosure"), " ", _jsx("a", { href: "https://www.builder.io/legal/terms", target: "_blank", rel: "noopener noreferrer", children: t("legalTerms") }), " ", t("legalConnector"), " ", _jsx("a", { href: "https://www.builder.io/legal/privacy", target: "_blank", rel: "noopener noreferrer", children: t("legalPrivacy") }), t("legalSuffix")] })) : null;
|
|
1816
1895
|
const legalNote = signupLegalNotice ? (_jsxs("p", { className: "legal-note", children: [_jsx("span", { "data-i18n": "legalPrefix", children: signupLegalNotice.prefix ?? t("legalPrefix") }), " ", _jsx("a", { href: signupLegalNotice.termsUrl, target: "_blank", rel: "noreferrer", "data-i18n": signupLegalNotice.termsLabel ? undefined : "legalTerms", children: signupLegalNotice.termsLabel ?? t("legalTerms") }), " ", _jsx("span", { "data-i18n": "legalConnector", children: signupLegalNotice.connector ?? t("legalConnector") }), " ", _jsx("a", { href: signupLegalNotice.privacyUrl, target: "_blank", rel: "noreferrer", "data-i18n": signupLegalNotice.privacyLabel ? undefined : "legalPrivacy", children: signupLegalNotice.privacyLabel ?? t("legalPrivacy") }), _jsx("span", { "data-i18n": "legalSuffix", children: signupLegalNotice.suffix ?? t("legalSuffix") })] })) : null;
|
|
1817
1896
|
const signupForm = (_jsx(AuthForm, { id: "signup-form", className: view === "signup" ? "active" : undefined, onSubmit: handleSignup, fields: [
|
|
1818
1897
|
{
|
|
@@ -1866,7 +1945,7 @@ export function AuthPage(props) {
|
|
|
1866
1945
|
},
|
|
1867
1946
|
], submitLabel: t("createAccount"), submitProps: {
|
|
1868
1947
|
"data-i18n": "createAccount",
|
|
1869
|
-
disabled: submitting === "signup",
|
|
1948
|
+
disabled: submitting === "signup" || !builderSignup,
|
|
1870
1949
|
}, footer: _jsxs(_Fragment, { children: [legalNote, localModeNote] }), messageId: "s-msg", messageClassName: `msg ${messages.signup ? `${messages.signup.kind} show` : ""}`, message: messages.signup?.text }));
|
|
1871
1950
|
const authCard = (_jsxs("div", { className: cardClassName, children: [_jsx("h1", { id: "heading", "data-i18n": usesMarketingWelcome ? "welcomeToApp" : keys.heading, "data-auth-marketing-title": usesMarketingWelcome ? "true" : undefined, children: usesMarketingWelcome
|
|
1872
1951
|
? t("welcomeToApp").replace("{appName}", marketingAppName)
|
|
@@ -1876,7 +1955,7 @@ export function AuthPage(props) {
|
|
|
1876
1955
|
? "localDevHideFullOptions"
|
|
1877
1956
|
: "localDevFullOptions", onClick: () => setFullAuthOptionsVisible((visible) => !visible), children: t(fullAuthOptionsVisible
|
|
1878
1957
|
? "localDevHideFullOptions"
|
|
1879
|
-
: "localDevFullOptions") }), notice("local-dev")] }), _jsxs("div", { id: "full-auth-options", className: "full-auth-options", hidden: !fullAuthOptionsVisible, children: [googleOnly && !showGoogle ? (_jsx("p", { className: "google-error show", id: "google-err", role: "status", "data-i18n": "googleNotConfigured", children: t("googleNotConfigured") })) : null, showGoogle ? (_jsxs("div", { className: "google-signin", id: "google-signin", children: [_jsxs("button", { className: `btn-google ${view === "magicLink" && isValidEmail(magicLinkEmail) ? "magic-link-secondary" : ""}`, id: "google-btn", type: "button", disabled: googleBusy, "aria-busy": googleBusy, onClick: () => void startGoogle(), children: [googleBusy ? (_jsx(IconLoader2, { className: "animate-spin", "aria-hidden": "true" })) : (googleSvg()), _jsx("span", { "data-i18n": "googleButton", children: t("googleButton") })] }), notice("google"), _jsx("p", { className: "google-debug", id: "google-debug" })] })) : null, organizationSsoEnabled && !googleOnly ? (_jsxs("form", { id: "organization-sso-form", className: "sso-signin", onSubmit: handleOrganizationSso, children: [_jsx("label", { htmlFor: "sso-email", "data-i18n": "email", children: t("email") }), _jsx("input", { id: "sso-email", type: "email", autoComplete: "email", placeholder: t("ssoEmailPlaceholder"), required: true, value: ssoEmail, onChange: (event) => setSsoEmail(event.currentTarget.value) }), _jsx("button", { type: "submit", id: "organization-sso-submit", disabled: ssoBusy || !isValidEmail(ssoEmail), "data-i18n": "ssoButton", children: ssoBusy ? t("checking") : t("ssoButton") }), notice("sso")] })) : null, !googleOnly && showGoogle ? (_jsx("div", { className: "divider", id: "auth-divider", "data-i18n": "dividerOr", children: t("dividerOr") })) : null, !googleOnly && authMode === "magic-link" ? (_jsxs("form", { id: "magic-link-form", className: `form ${view === "magicLink" ? "active" : ""}`, onSubmit: handleMagicLink, children: [_jsx("label", { htmlFor: "m-email", "data-i18n": "email", children: t("email") }), _jsx("input", { id: "m-email", type: "email", autoComplete: "email", placeholder: t("emailPlaceholder"), required: true, value: magicLinkEmail, onChange: (event) => setMagicLinkEmail(event.currentTarget.value) }), _jsx("button", { type: "submit", id: "magic-link-submit", className: "magic-link-submit", disabled: magicLinkBusy || !isValidEmail(magicLinkEmail), "data-i18n": "sendMagicLink", children: magicLinkBusy ? t("sending") : t("sendMagicLink") }), notice("magic-link"), _jsx("p", { className: "auth-mode-switch", children: _jsx("button", { type: "button", className: "link-button auth-mode-link", id: "use-password-link", "data-i18n": "usePasswordInstead", onClick: () => setView("login"), children: t("usePasswordInstead") }) }), legalNote] })) : null, authMode === "magic-link" ? (_jsxs("div", { className: `magic-link-success ${view === "magicLinkSent" ? "is-visible" : ""}`, id: "magic-link-success", "aria-live": "polite", hidden: view !== "magicLinkSent", children: [_jsxs("p", { className: "magic-link-success-copy", children: [_jsx("span", { "data-i18n": "magicLinkSentCopy", children: t("magicLinkSentCopy") }), " ", _jsx("strong", { id: "magic-link-success-email", children: magicLinkEmail }), "."] }), _jsx("button", { type: "button", className: "link-button magic-link-back", id: "magic-link-back", "data-i18n": "back", onClick: () => {
|
|
1958
|
+
: "localDevFullOptions") }), notice("local-dev")] }), _jsxs("div", { id: "full-auth-options", className: "full-auth-options", hidden: !fullAuthOptionsVisible, children: [googleOnly && !showGoogle ? (_jsx("p", { className: "google-error show", id: "google-err", role: "status", "data-i18n": "googleNotConfigured", children: t("googleNotConfigured") })) : null, view !== "login" && builderLegalNote, showGoogle ? (_jsxs("div", { className: "google-signin", id: "google-signin", children: [_jsxs("button", { className: `btn-google ${view === "magicLink" && isValidEmail(magicLinkEmail) ? "magic-link-secondary" : ""}`, id: "google-btn", type: "button", disabled: googleBusy || !builderSignup, "aria-busy": googleBusy, onClick: () => void startGoogle(), children: [googleBusy ? (_jsx(IconLoader2, { className: "animate-spin", "aria-hidden": "true" })) : (googleSvg()), _jsx("span", { "data-i18n": "googleButton", children: t("googleButton") })] }), notice("google"), _jsx("p", { className: "google-debug", id: "google-debug" })] })) : null, organizationSsoEnabled && !googleOnly ? (_jsxs("form", { id: "organization-sso-form", className: "sso-signin", onSubmit: handleOrganizationSso, children: [_jsx("label", { htmlFor: "sso-email", "data-i18n": "email", children: t("email") }), _jsx("input", { id: "sso-email", type: "email", autoComplete: "email", placeholder: t("ssoEmailPlaceholder"), required: true, value: ssoEmail, onChange: (event) => setSsoEmail(event.currentTarget.value) }), _jsx("button", { type: "submit", id: "organization-sso-submit", disabled: !builderSignup || ssoBusy || !isValidEmail(ssoEmail), "data-i18n": "ssoButton", children: ssoBusy ? t("checking") : t("ssoButton") }), notice("sso")] })) : null, !googleOnly && showGoogle ? (_jsx("div", { className: "divider", id: "auth-divider", "data-i18n": "dividerOr", children: t("dividerOr") })) : null, !googleOnly && authMode === "magic-link" ? (_jsxs("form", { id: "magic-link-form", className: `form ${view === "magicLink" ? "active" : ""}`, onSubmit: handleMagicLink, children: [_jsx("label", { htmlFor: "m-email", "data-i18n": "email", children: t("email") }), _jsx("input", { id: "m-email", type: "email", autoComplete: "email", placeholder: t("emailPlaceholder"), required: true, value: magicLinkEmail, onChange: (event) => setMagicLinkEmail(event.currentTarget.value) }), _jsx("button", { type: "submit", id: "magic-link-submit", className: "magic-link-submit", disabled: !builderSignup || magicLinkBusy || !isValidEmail(magicLinkEmail), "data-i18n": "sendMagicLink", children: magicLinkBusy ? t("sending") : t("sendMagicLink") }), notice("magic-link"), _jsx("p", { className: "auth-mode-switch", children: _jsx("button", { type: "button", className: "link-button auth-mode-link", id: "use-password-link", "data-i18n": "usePasswordInstead", onClick: () => setView("login"), children: t("usePasswordInstead") }) }), legalNote] })) : null, authMode === "magic-link" ? (_jsxs("div", { className: `magic-link-success ${view === "magicLinkSent" ? "is-visible" : ""}`, id: "magic-link-success", "aria-live": "polite", hidden: view !== "magicLinkSent", children: [_jsxs("p", { className: "magic-link-success-copy", children: [_jsx("span", { "data-i18n": "magicLinkSentCopy", children: t("magicLinkSentCopy") }), " ", _jsx("strong", { id: "magic-link-success-email", children: magicLinkEmail }), "."] }), _jsx("button", { type: "button", className: "link-button magic-link-back", id: "magic-link-back", "data-i18n": "back", onClick: () => {
|
|
1880
1959
|
setMagicLinkEmail("");
|
|
1881
1960
|
setView("magicLink");
|
|
1882
1961
|
}, children: t("back") })] })) : null, !googleOnly ? (_jsxs("div", { className: "tabs", id: "auth-tabs", hidden: view === "magicLink" ||
|