@agent-native/core 0.192.0-nightly-20260926081002 → 0.192.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +17 -0
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +27 -3
- package/corpus/templates/analytics/app/components/AnalyticsReviewArtifactPreview.tsx +8 -2
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +14 -10
- package/corpus/templates/analytics/app/root.tsx +2 -4
- package/corpus/templates/analytics/app/routes/_index.tsx +1 -36
- package/corpus/templates/analytics/app/routes/home.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-09-25-human-review-previews-show-same-organization-dashboard-chart.md +6 -0
- package/corpus/templates/analytics/changelog/2026-09-25-human-review-skips-saved-bigquery-queries-in-previews.md +6 -0
- package/corpus/templates/analytics/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +14 -0
- package/corpus/templates/analytics/server/plugins/auth.ts +0 -3
- package/corpus/templates/assets/CHANGELOG.md +16 -0
- package/corpus/templates/assets/app/root.tsx +2 -7
- package/corpus/templates/assets/app/routes/_index.tsx +1 -36
- package/corpus/templates/assets/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/assets/server/plugins/auth.ts +0 -3
- package/corpus/templates/brain/app/root.tsx +2 -13
- package/corpus/templates/brain/app/routes/_index.tsx +1 -35
- package/corpus/templates/brain/app/routes/home.tsx +1 -1
- package/corpus/templates/calendar/CHANGELOG.md +15 -0
- package/corpus/templates/calendar/app/root.tsx +2 -10
- package/corpus/templates/calendar/app/routes/_index.tsx +1 -34
- package/corpus/templates/calendar/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/calendar/server/plugins/auth.ts +0 -3
- package/corpus/templates/chat/AGENTS.md +3 -3
- package/corpus/templates/chat/app/root.tsx +3 -15
- package/corpus/templates/chat/app/routes/_index.tsx +1 -37
- package/corpus/templates/chat/server/plugins/auth.ts +0 -3
- package/corpus/templates/clips/CHANGELOG.md +10 -0
- package/corpus/templates/clips/app/root.tsx +2 -10
- package/corpus/templates/clips/app/routes/_index.tsx +1 -33
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +2 -3
- package/corpus/templates/clips/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/clips/server/plugins/auth.ts +0 -3
- package/corpus/templates/content/app/root.tsx +2 -3
- package/corpus/templates/content/app/routes/_index.tsx +1 -33
- package/corpus/templates/content/server/plugins/auth.ts +0 -3
- package/corpus/templates/crm/app/root.tsx +3 -16
- package/corpus/templates/crm/app/routes/_index.tsx +1 -36
- package/corpus/templates/crm/app/routes/home.tsx +1 -1
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +30 -17
- package/corpus/templates/design/CHANGELOG.md +31 -0
- package/corpus/templates/design/actions/connect-localhost.ts +98 -37
- package/corpus/templates/design/actions/get-design.schema.ts +10 -0
- package/corpus/templates/design/actions/get-design.ts +25 -6
- package/corpus/templates/design/actions/publish-visual-edit-pending.ts +4 -59
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +108 -49
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +63 -21
- package/corpus/templates/design/app/components/design/types.ts +2 -0
- package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +98 -9
- package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-insert-timeout.ts +61 -6
- package/corpus/templates/design/app/pages/design-editor/commands/mode-change.ts +6 -5
- package/corpus/templates/design/app/pages/design-editor/commands/publish-visual-edit-pending.ts +21 -3
- package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +4 -7
- package/corpus/templates/design/app/root.tsx +2 -20
- package/corpus/templates/design/app/routes/_index.tsx +1 -34
- package/corpus/templates/design/changelog/2026-09-25-fix-live-visual-edit-recovery-handoff-and-interaction-workfl.md +6 -0
- package/corpus/templates/design/changelog/2026-09-25-human-review-previews-show-the-actual-design-when-you-have-o.md +6 -0
- package/corpus/templates/design/changelog/2026-09-25-live-screens-recover-safely-from-interrupted-cross-screen-mo.md +6 -0
- package/corpus/templates/design/changelog/2026-09-26-canvas-focus-stays-on-toolbar-controls-when-a-live-preview-f.md +6 -0
- package/corpus/templates/design/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/design/server/plugins/auth.ts +0 -3
- package/corpus/templates/dispatch/app/root.tsx +2 -11
- package/corpus/templates/dispatch/app/routes/_index.tsx +1 -34
- package/corpus/templates/dispatch/server/plugins/setup-dispatch.ts +0 -3
- package/corpus/templates/factory/app/root.tsx +3 -15
- package/corpus/templates/factory/app/routes/_index.tsx +1 -34
- package/corpus/templates/factory/app/routes/home.tsx +1 -1
- package/corpus/templates/forms/AGENTS.md +1 -1
- package/corpus/templates/forms/app/root.tsx +2 -4
- package/corpus/templates/forms/app/routes/_index.tsx +1 -34
- package/corpus/templates/forms/server/plugins/auth.ts +0 -3
- package/corpus/templates/mail/CHANGELOG.md +8 -0
- package/corpus/templates/mail/app/root.tsx +2 -6
- package/corpus/templates/mail/app/routes/_index.tsx +1 -36
- package/corpus/templates/mail/app/routes/home.tsx +1 -1
- package/corpus/templates/mail/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/mail/server/plugins/auth.ts +0 -3
- package/corpus/templates/plan/app/root.tsx +7 -13
- package/corpus/templates/plan/app/routes/_index.tsx +1 -35
- package/corpus/templates/plan/app/routes/home.tsx +1 -1
- package/corpus/templates/plan/server/plugins/auth.ts +0 -3
- package/corpus/templates/slides/CHANGELOG.md +21 -0
- package/corpus/templates/slides/actions/get-deck.ts +49 -12
- package/corpus/templates/slides/app/root.tsx +1 -3
- package/corpus/templates/slides/app/routes/_index.tsx +1 -36
- package/corpus/templates/slides/app/routes/home.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-09-25-human-review-previews-show-same-organization-slides-for-orga.md +6 -0
- package/corpus/templates/slides/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/slides/server/plugins/auth.ts +0 -3
- package/corpus/templates/tasks/AGENTS.md +1 -1
- package/corpus/templates/tasks/README.md +1 -1
- package/corpus/templates/tasks/app/root.tsx +2 -11
- package/corpus/templates/tasks/app/routes/_index.tsx +1 -37
- package/corpus/templates/tasks/app/routes/home.tsx +1 -1
- package/dist/cli/design-connect.d.ts +1 -0
- package/dist/cli/design-connect.js +94 -32
- package/dist/client/auth/AuthPage.d.ts +1 -17
- package/dist/client/auth/AuthPage.js +7 -49
- package/dist/client/observability/OutputPreview.js +8 -2
- package/dist/client/sign-in-landing.d.ts +1 -0
- package/dist/client/sign-in-landing.js +8 -0
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/deploy/workspace-deploy.js +32 -8
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
- package/dist/provider-api/actions/provider-api.d.ts +3 -3
- package/dist/server/auth-marketing.d.ts +0 -7
- package/dist/server/auth-marketing.js +0 -36
- package/dist/server/auth.d.ts +1 -10
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/onboarding-html.d.ts +1 -12
- package/dist/server/onboarding-html.js +4 -817
- package/dist/shared/ssr-auth-redirect.d.ts +3 -3
- package/dist/shared/ssr-auth-redirect.js +4 -4
- package/dist/templates/chat/AGENTS.md +3 -3
- package/dist/templates/chat/app/root.tsx +3 -15
- package/dist/templates/chat/app/routes/_index.tsx +1 -37
- package/dist/templates/chat/server/plugins/auth.ts +0 -3
- package/dist/templates/default/AGENTS.md +2 -4
- package/dist/templates/default/DEVELOPING.md +3 -5
- package/dist/templates/default/app/root.tsx +2 -9
- package/dist/templates/default/app/routes/_index.tsx +8 -15
- package/package.json +5 -4
- package/src/templates/chat/AGENTS.md +3 -3
- package/src/templates/chat/app/root.tsx +3 -15
- package/src/templates/chat/app/routes/_index.tsx +1 -37
- package/src/templates/chat/server/plugins/auth.ts +0 -3
- package/src/templates/default/AGENTS.md +2 -4
- package/src/templates/default/DEVELOPING.md +3 -5
- package/src/templates/default/app/root.tsx +2 -9
- package/src/templates/default/app/routes/_index.tsx +8 -15
- package/dist/server/auth-marketing-locales.d.ts +0 -9
- package/dist/server/auth-marketing-locales.js +0 -1322
- package/dist/templates/chat/public/auth-marketing/chat.webp +0 -0
- package/src/templates/chat/public/auth-marketing/chat.webp +0 -0
|
@@ -70,7 +70,7 @@ async function persistBridgeToken(rootPath, token) {
|
|
|
70
70
|
await fs.chmod(temporaryPath, 0o600);
|
|
71
71
|
await fs.rename(temporaryPath, absolutePath);
|
|
72
72
|
}
|
|
73
|
-
async function resolveBridgeToken(rootPath, configuredToken) {
|
|
73
|
+
async function resolveBridgeToken(rootPath, configuredToken, persist = true) {
|
|
74
74
|
const persistedToken = await readPersistedBridgeToken(rootPath);
|
|
75
75
|
const bridgeToken = configuredToken ||
|
|
76
76
|
process.env["AGENT_NATIVE_BRIDGE_TOKEN"] ||
|
|
@@ -80,10 +80,9 @@ async function resolveBridgeToken(rootPath, configuredToken) {
|
|
|
80
80
|
throw new Error("AGENT_NATIVE_BRIDGE_TOKEN is a localhost connection ID, not a bridge token. " +
|
|
81
81
|
"Start visual-edit with the bridgeToken returned by open-visual-edit, then restart the bridge.");
|
|
82
82
|
}
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
if (configuredToken || !persistedToken) {
|
|
83
|
+
// The daemon path persists only after it proves the running or newly-started
|
|
84
|
+
// bridge accepted this token. A rejected token must not replace recovery data.
|
|
85
|
+
if (persist && (configuredToken || !persistedToken)) {
|
|
87
86
|
await persistBridgeToken(rootPath, bridgeToken);
|
|
88
87
|
}
|
|
89
88
|
return bridgeToken;
|
|
@@ -443,28 +442,39 @@ function isDesignConnectManifest(value) {
|
|
|
443
442
|
}
|
|
444
443
|
async function fetchRunningBridgeManifest(bridgeUrl, previewToken) {
|
|
445
444
|
const manifestUrl = new URL("/manifest.json", bridgeUrl);
|
|
446
|
-
if (previewToken) {
|
|
447
|
-
manifestUrl.searchParams.set("previewToken", previewToken);
|
|
448
|
-
}
|
|
449
445
|
const controller = new AbortController();
|
|
450
446
|
const timeout = setTimeout(() => controller.abort(), 800);
|
|
451
447
|
try {
|
|
452
448
|
const response = await fetch(manifestUrl, {
|
|
453
449
|
method: "GET",
|
|
450
|
+
headers: { "x-design-preview-token": previewToken },
|
|
454
451
|
signal: controller.signal,
|
|
455
452
|
});
|
|
456
453
|
if (!response.ok)
|
|
457
|
-
return null;
|
|
454
|
+
return { manifest: null, status: response.status };
|
|
458
455
|
const body = (await response.json());
|
|
459
|
-
return
|
|
456
|
+
return {
|
|
457
|
+
manifest: isDesignConnectManifest(body) ? body : null,
|
|
458
|
+
status: response.status,
|
|
459
|
+
};
|
|
460
460
|
}
|
|
461
461
|
catch {
|
|
462
|
-
return null;
|
|
462
|
+
return { manifest: null, status: null };
|
|
463
463
|
}
|
|
464
464
|
finally {
|
|
465
465
|
clearTimeout(timeout);
|
|
466
466
|
}
|
|
467
467
|
}
|
|
468
|
+
async function inspectRunningBridge(manifest, bridgeToken) {
|
|
469
|
+
const [manifestResult, runningFingerprint] = await Promise.all([
|
|
470
|
+
fetchRunningBridgeManifest(manifest.bridgeUrl, deriveDesignPreviewToken(bridgeToken)),
|
|
471
|
+
fetchRunningBridgeFingerprint(manifest.bridgeUrl),
|
|
472
|
+
]);
|
|
473
|
+
return {
|
|
474
|
+
...manifestResult,
|
|
475
|
+
fingerprintMatches: runningFingerprint === designConnectAppFingerprint(manifest),
|
|
476
|
+
};
|
|
477
|
+
}
|
|
468
478
|
export function designConnectManifestsTargetSameApp(running, requested) {
|
|
469
479
|
let runningUrl = running.devServerUrl;
|
|
470
480
|
let requestedUrl = requested.devServerUrl;
|
|
@@ -2201,14 +2211,18 @@ export async function startDesignConnectBridge(manifest, seedOrOptions) {
|
|
|
2201
2211
|
? { bridgeToken: seedOrOptions }
|
|
2202
2212
|
: (seedOrOptions ?? {});
|
|
2203
2213
|
const configuredBridgeToken = options.bridgeToken || process.env["AGENT_NATIVE_BRIDGE_TOKEN"];
|
|
2204
|
-
const bridgeToken = await resolveBridgeToken(manifest.rootPath, configuredBridgeToken);
|
|
2205
|
-
const configuredPreviewToken = options.previewToken
|
|
2214
|
+
const bridgeToken = await resolveBridgeToken(manifest.rootPath, configuredBridgeToken, false);
|
|
2215
|
+
const configuredPreviewToken = options.previewToken;
|
|
2206
2216
|
const derivedPreviewToken = deriveDesignPreviewToken(bridgeToken);
|
|
2207
2217
|
if (configuredPreviewToken &&
|
|
2208
2218
|
configuredPreviewToken !== derivedPreviewToken) {
|
|
2209
2219
|
throw new Error("previewToken must match the deterministic token derived from bridgeToken");
|
|
2210
2220
|
}
|
|
2211
|
-
|
|
2221
|
+
if (process.env["AGENT_NATIVE_PREVIEW_TOKEN"] &&
|
|
2222
|
+
process.env["AGENT_NATIVE_PREVIEW_TOKEN"] !== derivedPreviewToken) {
|
|
2223
|
+
console.warn("Ignoring stale AGENT_NATIVE_PREVIEW_TOKEN; the current bridge token determines the preview token.");
|
|
2224
|
+
}
|
|
2225
|
+
const previewToken = derivedPreviewToken;
|
|
2212
2226
|
const configuredOrigins = new Set((options.allowedOrigins ?? []).flatMap((raw) => {
|
|
2213
2227
|
try {
|
|
2214
2228
|
return [new URL(raw).origin];
|
|
@@ -3197,6 +3211,15 @@ export async function startDesignConnectBridge(manifest, seedOrOptions) {
|
|
|
3197
3211
|
resolve();
|
|
3198
3212
|
});
|
|
3199
3213
|
});
|
|
3214
|
+
if (options.persistBridgeToken !== false) {
|
|
3215
|
+
try {
|
|
3216
|
+
await persistBridgeToken(manifest.rootPath, bridgeToken);
|
|
3217
|
+
}
|
|
3218
|
+
catch (error) {
|
|
3219
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
3220
|
+
throw error;
|
|
3221
|
+
}
|
|
3222
|
+
}
|
|
3200
3223
|
return { server, manifest, bridgeToken, previewToken, bridgeInstanceId };
|
|
3201
3224
|
}
|
|
3202
3225
|
/**
|
|
@@ -3319,7 +3342,7 @@ Options:
|
|
|
3319
3342
|
--preview-token <token> Adopt the paired read-only browser preview token.
|
|
3320
3343
|
Optional when --bridge-token is present: compatible
|
|
3321
3344
|
clients derive the same one-way token automatically.
|
|
3322
|
-
(
|
|
3345
|
+
(stale AGENT_NATIVE_PREVIEW_TOKEN values are ignored)
|
|
3323
3346
|
--daemon Start the bridge detached, wait for /health, then exit
|
|
3324
3347
|
--json Print the manifest JSON and exit
|
|
3325
3348
|
--once Prepare/scaffold the manifest and exit
|
|
@@ -3372,20 +3395,33 @@ function resolveCurrentCliInvocation(argv) {
|
|
|
3372
3395
|
args: [...cliPrefix, "design", ...removeDaemonFlag(argv)],
|
|
3373
3396
|
};
|
|
3374
3397
|
}
|
|
3375
|
-
async function startDetachedDesignBridge(argv, manifest,
|
|
3398
|
+
async function startDetachedDesignBridge(argv, manifest, bridgeToken) {
|
|
3376
3399
|
if (await waitForBridgeHealth(manifest.bridgeUrl, 800)) {
|
|
3377
|
-
const
|
|
3378
|
-
|
|
3379
|
-
|
|
3380
|
-
|
|
3381
|
-
|
|
3382
|
-
|
|
3383
|
-
designConnectManifestsTargetSameApp(runningManifest, manifest)) ||
|
|
3384
|
-
fingerprintMatches) {
|
|
3400
|
+
const manifestResult = await inspectRunningBridge(manifest, bridgeToken);
|
|
3401
|
+
const runningManifest = manifestResult.manifest;
|
|
3402
|
+
const { fingerprintMatches } = manifestResult;
|
|
3403
|
+
if (runningManifest &&
|
|
3404
|
+
designConnectManifestsTargetSameApp(runningManifest, manifest)) {
|
|
3405
|
+
await persistBridgeToken(manifest.rootPath, bridgeToken);
|
|
3385
3406
|
console.error(`Design localhost bridge already running at ${manifest.bridgeUrl}`);
|
|
3386
|
-
console.log(JSON.stringify(runningManifest
|
|
3407
|
+
console.log(JSON.stringify(runningManifest, null, 2));
|
|
3387
3408
|
return 0;
|
|
3388
3409
|
}
|
|
3410
|
+
if (fingerprintMatches && !runningManifest) {
|
|
3411
|
+
const errorMessage = manifestResult.status === 401
|
|
3412
|
+
? "A Design localhost bridge for this app is already running, but it rejected the current bridge token (HTTP 401)."
|
|
3413
|
+
: "A Design localhost bridge for this app is already running, but its authenticated manifest could not be verified.";
|
|
3414
|
+
console.error([
|
|
3415
|
+
errorMessage,
|
|
3416
|
+
...(manifestResult.status === 401
|
|
3417
|
+
? [
|
|
3418
|
+
"If the token changed, stop only the bridge process you started, then rerun design connect with the bridgeToken returned by open-visual-edit via --bridge-token (or AGENT_NATIVE_BRIDGE_TOKEN).",
|
|
3419
|
+
]
|
|
3420
|
+
: ["Retry after confirming the bridge is healthy."]),
|
|
3421
|
+
"The existing process was left running.",
|
|
3422
|
+
].join("\n"));
|
|
3423
|
+
return 1;
|
|
3424
|
+
}
|
|
3389
3425
|
console.error([
|
|
3390
3426
|
`Design localhost bridge already running at ${manifest.bridgeUrl} for a different app.`,
|
|
3391
3427
|
runningManifest
|
|
@@ -3406,17 +3442,35 @@ async function startDetachedDesignBridge(argv, manifest, previewToken) {
|
|
|
3406
3442
|
const child = spawn(invocation.command, invocation.args, {
|
|
3407
3443
|
cwd: process.cwd(),
|
|
3408
3444
|
detached: true,
|
|
3409
|
-
env:
|
|
3445
|
+
env: {
|
|
3446
|
+
...process.env,
|
|
3447
|
+
AGENT_NATIVE_BRIDGE_TOKEN: bridgeToken,
|
|
3448
|
+
},
|
|
3410
3449
|
stdio: ["ignore", logFd.fd, logFd.fd],
|
|
3411
3450
|
shell: process.platform === "win32",
|
|
3412
3451
|
});
|
|
3413
3452
|
child.unref();
|
|
3414
3453
|
if (await waitForBridgeHealth(manifest.bridgeUrl)) {
|
|
3454
|
+
const running = await inspectRunningBridge(manifest, bridgeToken);
|
|
3455
|
+
if (running.manifest &&
|
|
3456
|
+
designConnectManifestsTargetSameApp(running.manifest, manifest)) {
|
|
3457
|
+
await persistBridgeToken(manifest.rootPath, bridgeToken);
|
|
3458
|
+
await logFd.close();
|
|
3459
|
+
console.error(`Design localhost bridge running at ${manifest.bridgeUrl}`);
|
|
3460
|
+
console.error(`Bridge log: ${logPath}`);
|
|
3461
|
+
console.log(JSON.stringify(running.manifest, null, 2));
|
|
3462
|
+
return 0;
|
|
3463
|
+
}
|
|
3415
3464
|
await logFd.close();
|
|
3416
|
-
|
|
3417
|
-
console.error(
|
|
3418
|
-
|
|
3419
|
-
|
|
3465
|
+
const authenticationFailed = running.fingerprintMatches && !running.manifest;
|
|
3466
|
+
console.error([
|
|
3467
|
+
authenticationFailed
|
|
3468
|
+
? `A Design localhost bridge for this app became available at ${manifest.bridgeUrl}, but it rejected this invocation's bridge token (HTTP ${running.status ?? "unknown"}).`
|
|
3469
|
+
: `A Design localhost bridge became available at ${manifest.bridgeUrl} for a different app or could not be verified.`,
|
|
3470
|
+
"No bridge token was persisted; the running process was left untouched.",
|
|
3471
|
+
`Bridge log: ${logPath}`,
|
|
3472
|
+
].join("\n"));
|
|
3473
|
+
return 1;
|
|
3420
3474
|
}
|
|
3421
3475
|
const tail = await readDaemonLogTail(logPath);
|
|
3422
3476
|
await logFd.close();
|
|
@@ -3499,11 +3553,19 @@ export async function runDesign(argv) {
|
|
|
3499
3553
|
const manifest = await prepareDesignConnectManifest(parsed);
|
|
3500
3554
|
const seedBridgeToken = parsed.bridgeToken || process.env["AGENT_NATIVE_BRIDGE_TOKEN"] || undefined;
|
|
3501
3555
|
const seedPreviewToken = parsed.previewToken ||
|
|
3502
|
-
process.env["AGENT_NATIVE_PREVIEW_TOKEN"] ||
|
|
3503
3556
|
(seedBridgeToken ? deriveDesignPreviewToken(seedBridgeToken) : undefined);
|
|
3504
3557
|
const appUrl = resolveAppUrl(parsed.appUrl);
|
|
3505
3558
|
if (parsed.daemon) {
|
|
3506
|
-
|
|
3559
|
+
const bridgeToken = await resolveBridgeToken(manifest.rootPath, seedBridgeToken, false);
|
|
3560
|
+
const derivedPreviewToken = deriveDesignPreviewToken(bridgeToken);
|
|
3561
|
+
if (parsed.previewToken && parsed.previewToken !== derivedPreviewToken) {
|
|
3562
|
+
throw new Error("previewToken must match the deterministic token derived from bridgeToken");
|
|
3563
|
+
}
|
|
3564
|
+
if (process.env["AGENT_NATIVE_PREVIEW_TOKEN"] &&
|
|
3565
|
+
process.env["AGENT_NATIVE_PREVIEW_TOKEN"] !== derivedPreviewToken) {
|
|
3566
|
+
console.warn("Ignoring stale AGENT_NATIVE_PREVIEW_TOKEN; the current bridge token determines the preview token.");
|
|
3567
|
+
}
|
|
3568
|
+
return startDetachedDesignBridge(argv, manifest, bridgeToken);
|
|
3507
3569
|
}
|
|
3508
3570
|
if (parsed.json || parsed.once || parsed.dryRun) {
|
|
3509
3571
|
console.log(JSON.stringify(manifest, null, 2));
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
/** @jsxRuntime classic */
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
export type AuthView = "signup" | "login" | "forgot" | "twoFactor" | "verification" | "magicLink" | "magicLinkSent" | "googleOnly";
|
|
4
|
-
export interface AuthMarketingProps {
|
|
5
|
-
appName: string;
|
|
6
|
-
tagline?: string;
|
|
7
|
-
description?: string;
|
|
8
|
-
features?: string[];
|
|
9
|
-
authHeadline?: string;
|
|
10
|
-
authDescription?: string;
|
|
11
|
-
screenshotSrc?: string;
|
|
12
|
-
screenshotWidth?: number;
|
|
13
|
-
screenshotHeight?: number;
|
|
14
|
-
learnMoreUrl?: string;
|
|
15
|
-
}
|
|
16
4
|
export interface AuthLocaleOption {
|
|
17
5
|
value: string;
|
|
18
6
|
label: string;
|
|
@@ -43,11 +31,7 @@ export interface AuthPageProps {
|
|
|
43
31
|
dir?: string;
|
|
44
32
|
}>;
|
|
45
33
|
localeOptions: AuthLocaleOption[];
|
|
46
|
-
|
|
47
|
-
marketingLocales: Record<string, AuthMarketingProps>;
|
|
48
|
-
brandMarkSrc: string;
|
|
49
|
-
brandMarkLightSrc?: string;
|
|
50
|
-
githubUrl: string;
|
|
34
|
+
appName?: string;
|
|
51
35
|
showGoogle: boolean;
|
|
52
36
|
/** Show the organization SSO email-to-provider entry point. */
|
|
53
37
|
organizationSsoEnabled?: boolean;
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/** @jsxRuntime classic */
|
|
2
|
-
import { MarketingHome } from "@agent-native/toolkit/marketing";
|
|
3
2
|
import { AuthForm } from "@agent-native/toolkit/onboarding";
|
|
4
3
|
import * as React from "react";
|
|
5
4
|
import { normalizeLocaleCode } from "../../localization/shared.js";
|
|
6
5
|
import { canonicalTrackingEvent } from "../../shared/analytics-events.js";
|
|
7
|
-
import { getAppStatus } from "../../shared/app-status.js";
|
|
8
6
|
import { AUTH_SIGNUP_INVITE_ONLY_CODE } from "../../shared/auth-copy.js";
|
|
9
7
|
import { toPublicFrameworkPath } from "../../shared/framework-route-prefix.js";
|
|
10
8
|
import { isQaTestEmail } from "../../shared/qa-test-email.js";
|
|
@@ -12,7 +10,6 @@ import { signInJourney, } from "../../shared/sign-in-journey.js";
|
|
|
12
10
|
import { isSyntheticTrafficValue } from "../../shared/test-traffic.js";
|
|
13
11
|
import { frameworkRoutePrefix } from "../api-path.js";
|
|
14
12
|
import { openOAuthPopup } from "../oauth-popup.js";
|
|
15
|
-
import { OceanBackground } from "../ocean/OceanBackground.js";
|
|
16
13
|
const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
17
14
|
const TAB_STORAGE_KEY = "an.onboarding.tab";
|
|
18
15
|
const PENDING_SIGNUP_EMAIL_STORAGE_KEY = "an.onboarding.pendingSignupEmail";
|
|
@@ -483,7 +480,7 @@ export function shouldStartWithLocalDev(pathname, search) {
|
|
|
483
480
|
!path.endsWith("/sign-in"));
|
|
484
481
|
}
|
|
485
482
|
export function AuthPage(props) {
|
|
486
|
-
const { authMode, googleOnly,
|
|
483
|
+
const { authMode, googleOnly, appBasePath, homePath, initialResumeHref, workspaceRuntime, trackingApp, defaultLocale, localeStorageKey, locales, localeMetadata, localeOptions, appName, showGoogle, organizationSsoEnabled = false, googleViaIdentitySso = false, signupLegalNotice, signupLocalModeNote, docsAuthUrl, identitySsoEnabled = false, identitySsoAuto = false, publicOAuthOrigin, workspaceGatewayReturnOrigin, googleAuthMode, builderPreviewLocalDevEnabled, } = props;
|
|
487
484
|
const [localePreference, setLocalePreference] = React.useState("system");
|
|
488
485
|
const [locale, setLocale] = React.useState(defaultLocale);
|
|
489
486
|
const [browserLocationReady, setBrowserLocationReady] = React.useState(false);
|
|
@@ -629,14 +626,14 @@ export function AuthPage(props) {
|
|
|
629
626
|
};
|
|
630
627
|
}, []);
|
|
631
628
|
React.useEffect(() => {
|
|
632
|
-
const nextTitle =
|
|
633
|
-
? `${
|
|
629
|
+
const nextTitle = appName
|
|
630
|
+
? `${appName} — ${t("pageTitleSignIn")}`
|
|
634
631
|
: t("pageTitleWelcome");
|
|
635
632
|
document.title = nextTitle;
|
|
636
633
|
document.documentElement.lang = locale;
|
|
637
634
|
document.documentElement.dir = localeMetadata[locale]?.dir || "ltr";
|
|
638
635
|
document.documentElement.dataset.locale = locale;
|
|
639
|
-
}, [locale, localeMetadata,
|
|
636
|
+
}, [appName, locale, localeMetadata, t]);
|
|
640
637
|
React.useEffect(() => {
|
|
641
638
|
if (googleOnly)
|
|
642
639
|
return;
|
|
@@ -1885,16 +1882,6 @@ export function AuthPage(props) {
|
|
|
1885
1882
|
}
|
|
1886
1883
|
}, [signupLocalModeNote]);
|
|
1887
1884
|
const keys = headingKeys(view);
|
|
1888
|
-
const marketingCopy = marketing
|
|
1889
|
-
? { ...marketing, ...(marketingLocales[locale] ?? {}) }
|
|
1890
|
-
: undefined;
|
|
1891
|
-
const marketingAppName = marketingCopy?.appName.replace(/^Agent-Native\s+/i, "") ?? "";
|
|
1892
|
-
const marketingStatus = getAppStatus(trackingApp || marketingAppName);
|
|
1893
|
-
const usesMarketingWelcome = !!marketingCopy &&
|
|
1894
|
-
(view === "signup" ||
|
|
1895
|
-
view === "login" ||
|
|
1896
|
-
view === "magicLink" ||
|
|
1897
|
-
view === "googleOnly");
|
|
1898
1885
|
const cardClassName = [
|
|
1899
1886
|
"card",
|
|
1900
1887
|
view === "verification" ? "verifying" : "",
|
|
@@ -1972,12 +1959,8 @@ export function AuthPage(props) {
|
|
|
1972
1959
|
legalNote,
|
|
1973
1960
|
localModeNote), messageId: "s-msg", messageClassName: `msg ${messages.signup ? `${messages.signup.kind} show` : ""}`, message: messages.signup?.text }));
|
|
1974
1961
|
const authCard = (React.createElement("div", { className: cardClassName },
|
|
1975
|
-
React.createElement("h1", { id: "heading", "data-i18n":
|
|
1976
|
-
|
|
1977
|
-
: t(keys.heading)),
|
|
1978
|
-
React.createElement("p", { id: "subtitle", className: "subtitle", "data-i18n": usesMarketingWelcome ? undefined : keys.subtitle, "data-auth-marketing-subtitle": usesMarketingWelcome ? "true" : undefined, hidden: usesMarketingWelcome
|
|
1979
|
-
? false
|
|
1980
|
-
: shouldHideAuthSubtitle(view, localDevAvailable) }, usesMarketingWelcome ? t("welcomeSubtitle") : t(keys.subtitle)),
|
|
1962
|
+
React.createElement("h1", { id: "heading", "data-i18n": keys.heading }, t(keys.heading)),
|
|
1963
|
+
React.createElement("p", { id: "subtitle", className: "subtitle", "data-i18n": keys.subtitle, hidden: shouldHideAuthSubtitle(view, localDevAvailable) }, t(keys.subtitle)),
|
|
1981
1964
|
React.createElement("p", { className: `upgrade-note ${upgradeVisible ? "show" : ""}`, id: "upgrade-note", "data-upgrade-copy": t("upgradeCopy"), "data-i18n-data-upgrade-copy": "upgradeCopy" }, upgradeVisible ? t("upgradeCopy") : null),
|
|
1982
1965
|
identitySsoEnabled && !googleOnly ? (React.createElement("div", { className: "identity-sso-entry", id: "identity-sso-entry" },
|
|
1983
1966
|
React.createElement("a", { className: "btn-primary btn-identity-sso", id: "identity-sso-btn", href: identityLoginHref, "aria-describedby": "identity-sso-hint", "data-i18n": "continueWithAgentNative" }, t("continueWithAgentNative")),
|
|
@@ -2131,32 +2114,7 @@ export function AuthPage(props) {
|
|
|
2131
2114
|
localeOptions.map((option) => (React.createElement("button", { type: "button", className: "locale-menu-item", role: "menuitemradio", "aria-checked": localePreference === option.value, "data-locale-value": option.value, key: option.value, onClick: () => selectLocale(option.value) },
|
|
2132
2115
|
React.createElement("span", { className: "locale-menu-check", "aria-hidden": "true" }, "\u2713"),
|
|
2133
2116
|
React.createElement("span", null, option.label)))))));
|
|
2134
|
-
const marketingContent = marketingCopy ? (React.createElement("div", { className: "marketing-content" },
|
|
2135
|
-
React.createElement("h2", { className: "app-name" },
|
|
2136
|
-
React.createElement("picture", null,
|
|
2137
|
-
brandMarkLightSrc ? (React.createElement("source", { media: "(prefers-color-scheme: light)", srcSet: brandMarkLightSrc })) : null,
|
|
2138
|
-
React.createElement("img", { className: "brand-mark", src: brandMarkSrc, alt: "", "aria-hidden": "true" })),
|
|
2139
|
-
React.createElement("span", { className: "app-name-label" }, marketingAppName),
|
|
2140
|
-
React.createElement("span", { className: "app-status-badge" }, marketingStatus)),
|
|
2141
|
-
React.createElement("div", { className: "marketing-copy" },
|
|
2142
|
-
React.createElement("p", { className: "auth-marketing-headline", "data-marketing-field": "headline" }, marketingCopy.authHeadline ?? marketingCopy.tagline),
|
|
2143
|
-
(marketingCopy.authDescription ?? marketingCopy.description) ||
|
|
2144
|
-
marketingCopy.learnMoreUrl ? (React.createElement("p", { className: "auth-marketing-description", "data-marketing-field": "description" },
|
|
2145
|
-
marketingCopy.authDescription ?? marketingCopy.description,
|
|
2146
|
-
marketingCopy.learnMoreUrl ? (React.createElement(React.Fragment, null,
|
|
2147
|
-
" ",
|
|
2148
|
-
React.createElement("a", { className: "auth-marketing-description-link", href: marketingCopy.learnMoreUrl, target: "_blank", rel: "noreferrer" }, t("learnMore")))) : null)) : null,
|
|
2149
|
-
React.createElement("div", { className: "marketing-actions" },
|
|
2150
|
-
React.createElement("a", { className: "oss-badge", href: githubUrl, target: "_blank", rel: "noreferrer" },
|
|
2151
|
-
React.createElement("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", width: 16, height: 16, fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" },
|
|
2152
|
-
React.createElement("path", { d: "M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" })),
|
|
2153
|
-
React.createElement("span", { "data-i18n": "openSource" }, t("openSource"))))))) : null;
|
|
2154
|
-
const marketingSurface = marketingCopy ? (React.createElement(MarketingHome, { appName: marketingAppName, variant: "auth", background: null, auth: authCard, className: "auth-marketing-home" },
|
|
2155
|
-
React.createElement("div", { className: "auth-marketing-visual" },
|
|
2156
|
-
React.createElement("div", { className: "auth-marketing-screenshot-wrap" },
|
|
2157
|
-
React.createElement(OceanBackground, { className: "auth-marketing-screenshot" })),
|
|
2158
|
-
marketingContent))) : (React.createElement("div", { className: "auth-centered" }, authCard));
|
|
2159
2117
|
return (React.createElement(React.Fragment, null,
|
|
2160
2118
|
localePicker,
|
|
2161
|
-
|
|
2119
|
+
React.createElement("div", { className: "auth-centered" }, authCard)));
|
|
2162
2120
|
}
|
|
@@ -59,7 +59,11 @@ function ReviewPreviewFrame({ url, artifactAppId, artifactId, previewLabel, comp
|
|
|
59
59
|
const [safePreview, setSafePreview] = useState();
|
|
60
60
|
const [rejectedPreviewSource, setRejectedPreviewSource] = useState();
|
|
61
61
|
const [selectedSlideId, setSelectedSlideId] = useState(null);
|
|
62
|
-
const designQuery = useActionQuery("get-design", {
|
|
62
|
+
const designQuery = useActionQuery("get-design", {
|
|
63
|
+
id: artifactId ?? "",
|
|
64
|
+
includeFileContent: false,
|
|
65
|
+
reviewPreview: true,
|
|
66
|
+
}, {
|
|
63
67
|
enabled: mounted && artifactAppId === "design" && Boolean(artifactId),
|
|
64
68
|
staleTime: 5 * 60_000,
|
|
65
69
|
});
|
|
@@ -77,13 +81,14 @@ function ReviewPreviewFrame({ url, artifactAppId, artifactId, previewLabel, comp
|
|
|
77
81
|
id: artifactId ?? "",
|
|
78
82
|
fileId: designFileId ?? "",
|
|
79
83
|
includeFileContent: true,
|
|
84
|
+
reviewPreview: true,
|
|
80
85
|
}, {
|
|
81
86
|
enabled: mounted &&
|
|
82
87
|
artifactAppId === "design" &&
|
|
83
88
|
Boolean(artifactId && designFileId),
|
|
84
89
|
staleTime: 5 * 60_000,
|
|
85
90
|
});
|
|
86
|
-
const deckQuery = useActionQuery("get-deck", { id: artifactId ?? "", compact: "true" }, {
|
|
91
|
+
const deckQuery = useActionQuery("get-deck", { id: artifactId ?? "", compact: "true", reviewPreview: true }, {
|
|
87
92
|
enabled: mounted && artifactAppId === "slides" && Boolean(artifactId),
|
|
88
93
|
staleTime: 5 * 60_000,
|
|
89
94
|
});
|
|
@@ -104,6 +109,7 @@ function ReviewPreviewFrame({ url, artifactAppId, artifactId, previewLabel, comp
|
|
|
104
109
|
id: artifactId ?? "",
|
|
105
110
|
slideId: activeSlideId ?? "",
|
|
106
111
|
compact: "false",
|
|
112
|
+
reviewPreview: true,
|
|
107
113
|
}, {
|
|
108
114
|
enabled: mounted && artifactAppId === "slides" && Boolean(activeSlideId),
|
|
109
115
|
staleTime: 5 * 60_000,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function signInLandingLoader(homePath?: string): Response | null;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { redirectDocument } from "react-router";
|
|
2
|
+
import { SIGN_IN_ENTRY_PATH } from "../shared/sign-in-journey.js";
|
|
3
|
+
import { appPath } from "./api-path.js";
|
|
4
|
+
export function signInLandingLoader(homePath) {
|
|
5
|
+
if (homePath === "/")
|
|
6
|
+
return null;
|
|
7
|
+
return redirectDocument(appPath(SIGN_IN_ENTRY_PATH));
|
|
8
|
+
}
|
|
@@ -62,11 +62,11 @@ export declare const postAwareness: import("h3").EventHandlerWithFetch<import("h
|
|
|
62
62
|
error: string;
|
|
63
63
|
states?: undefined;
|
|
64
64
|
} | {
|
|
65
|
+
error?: undefined;
|
|
65
66
|
states: {
|
|
66
67
|
clientId: number;
|
|
67
68
|
state: string;
|
|
68
69
|
}[];
|
|
69
|
-
error?: undefined;
|
|
70
70
|
}>>;
|
|
71
71
|
/**
|
|
72
72
|
* GET /_agent-native/collab/:docId/users
|
|
@@ -77,9 +77,9 @@ export declare const getActiveUsers: import("h3").EventHandlerWithFetch<import("
|
|
|
77
77
|
error: string;
|
|
78
78
|
users?: undefined;
|
|
79
79
|
} | {
|
|
80
|
+
error?: undefined;
|
|
80
81
|
users: {
|
|
81
82
|
clientId: number;
|
|
82
83
|
lastSeen: number;
|
|
83
84
|
}[];
|
|
84
|
-
error?: undefined;
|
|
85
85
|
}>>;
|
|
@@ -67,6 +67,7 @@ const NETLIFY_PUBLIC_ASSET_EXTENSIONS = new Set([
|
|
|
67
67
|
const WORKSPACE_APPS_ENV_KEY = "AGENT_NATIVE_WORKSPACE_APPS_JSON";
|
|
68
68
|
const WORKSPACE_APPS_MANIFEST_DIR = ".agent-native";
|
|
69
69
|
const WORKSPACE_APPS_MANIFEST_FILE = "workspace-apps.json";
|
|
70
|
+
const WORKSPACE_ROOT_GOOGLE_CALLBACK_PATH = "/_agent-native/google/callback";
|
|
70
71
|
const VERCEL_OUTPUT_DIR = ".vercel/output";
|
|
71
72
|
const WORKSPACE_DIRECTORY_ENV_SNIPPET = `
|
|
72
73
|
const directoryOrigin =
|
|
@@ -135,11 +136,11 @@ export async function runWorkspaceDeploy(opts = {}) {
|
|
|
135
136
|
writeWorkspaceDirectoryPage(preset === "vercel" ? path.join(vercelOutputDir, "static") : distDir, workspaceApps);
|
|
136
137
|
}
|
|
137
138
|
if (preset === "netlify") {
|
|
138
|
-
writeNetlifyRedirects(distDir, apps, workspaceRootPage);
|
|
139
|
+
writeNetlifyRedirects(distDir, apps, workspaceApps, workspaceRootPage);
|
|
139
140
|
writeNetlifyHeaders(distDir, apps);
|
|
140
141
|
}
|
|
141
142
|
else {
|
|
142
|
-
writeVercelBuildConfig(vercelOutputDir, apps, workspaceRootPage);
|
|
143
|
+
writeVercelBuildConfig(vercelOutputDir, apps, workspaceApps, workspaceRootPage);
|
|
143
144
|
}
|
|
144
145
|
if (buildOnly) {
|
|
145
146
|
const outputDir = preset === "vercel" ? vercelOutputDir : distDir;
|
|
@@ -292,7 +293,10 @@ function workspaceOAuthDiscoveryRoutes(app) {
|
|
|
292
293
|
},
|
|
293
294
|
];
|
|
294
295
|
}
|
|
295
|
-
function
|
|
296
|
+
function workspaceOAuthCallbackApp(workspaceApps) {
|
|
297
|
+
return (workspaceApps.find((entry) => entry.isDispatch)?.id ?? workspaceApps[0]?.id);
|
|
298
|
+
}
|
|
299
|
+
function writeNetlifyRedirects(distDir, apps, workspaceApps, rootPage) {
|
|
296
300
|
const lines = [
|
|
297
301
|
"# Generated by agent-native deploy --preset netlify",
|
|
298
302
|
"# Static app assets are stored under a safe namespace; dynamic app routes are handled by function route config.",
|
|
@@ -327,8 +331,14 @@ function writeNetlifyRedirects(distDir, apps, rootPage) {
|
|
|
327
331
|
}
|
|
328
332
|
lines.push("/apps/* /dispatch/apps/:splat 302");
|
|
329
333
|
}
|
|
330
|
-
else
|
|
331
|
-
|
|
334
|
+
else {
|
|
335
|
+
const callbackApp = workspaceOAuthCallbackApp(workspaceApps);
|
|
336
|
+
if (callbackApp) {
|
|
337
|
+
lines.push(`${WORKSPACE_ROOT_GOOGLE_CALLBACK_PATH} /.netlify/functions/${callbackApp}-server 200`);
|
|
338
|
+
}
|
|
339
|
+
if (rootPage !== "directory") {
|
|
340
|
+
lines.push(`/ /${apps[0]}/ 302`);
|
|
341
|
+
}
|
|
332
342
|
}
|
|
333
343
|
fs.writeFileSync(path.join(distDir, "_redirects"), lines.join("\n") + "\n");
|
|
334
344
|
}
|
|
@@ -350,7 +360,7 @@ function netlifyHeaderBlock(pathname) {
|
|
|
350
360
|
...Object.entries(IMMUTABLE_ASSET_CACHE_HEADERS).map(([name, value]) => ` ${name}: ${value}`),
|
|
351
361
|
].join("\n");
|
|
352
362
|
}
|
|
353
|
-
function writeVercelBuildConfig(outputDir, apps, rootPage) {
|
|
363
|
+
function writeVercelBuildConfig(outputDir, apps, workspaceApps, rootPage) {
|
|
354
364
|
const routes = [
|
|
355
365
|
...vercelImmutableAssetHeaderRoutes(outputDir, apps),
|
|
356
366
|
{ handle: "filesystem" },
|
|
@@ -379,8 +389,17 @@ function writeVercelBuildConfig(outputDir, apps, rootPage) {
|
|
|
379
389
|
}
|
|
380
390
|
routes.push(vercelRedirect("/apps/(.*)", "/dispatch/apps/$1"));
|
|
381
391
|
}
|
|
382
|
-
else
|
|
383
|
-
|
|
392
|
+
else {
|
|
393
|
+
const callbackApp = workspaceOAuthCallbackApp(workspaceApps);
|
|
394
|
+
if (callbackApp) {
|
|
395
|
+
routes.push({
|
|
396
|
+
src: vercelRouteSrc(WORKSPACE_ROOT_GOOGLE_CALLBACK_PATH),
|
|
397
|
+
dest: `/${callbackApp}-server`,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
if (rootPage !== "directory") {
|
|
401
|
+
routes.push(vercelRedirect("/", `/${apps[0]}/`));
|
|
402
|
+
}
|
|
384
403
|
}
|
|
385
404
|
for (const app of apps) {
|
|
386
405
|
if (app !== "dispatch") {
|
|
@@ -862,6 +881,10 @@ function patchNetlifyFunctionEntry(functionDir, app, workspaceApps, staticDir, w
|
|
|
862
881
|
const basePath = `/${app}`;
|
|
863
882
|
const workspaceAppAudience = workspaceAppAudienceForApp(workspaceApps, app);
|
|
864
883
|
const workspaceAppRouteAccess = workspaceAppRouteAccessForApp(workspaceApps, app);
|
|
884
|
+
const callbackApp = workspaceOAuthCallbackApp(workspaceApps);
|
|
885
|
+
const rootGoogleCallbackPath = app === callbackApp && app !== "dispatch"
|
|
886
|
+
? [WORKSPACE_ROOT_GOOGLE_CALLBACK_PATH]
|
|
887
|
+
: [];
|
|
865
888
|
const pathConfig = app === "dispatch"
|
|
866
889
|
? [
|
|
867
890
|
`${workspaceFrameworkRoutePrefix()}/*`,
|
|
@@ -876,6 +899,7 @@ function patchNetlifyFunctionEntry(functionDir, app, workspaceApps, staticDir, w
|
|
|
876
899
|
path,
|
|
877
900
|
...(descendants ? [`${path}/*`] : []),
|
|
878
901
|
]),
|
|
902
|
+
...rootGoogleCallbackPath,
|
|
879
903
|
];
|
|
880
904
|
const normalizeBasePathHelper = app === "dispatch"
|
|
881
905
|
? ""
|
|
@@ -44,9 +44,9 @@ declare const _default: import("../../action.js").ActionDefinition<{
|
|
|
44
44
|
url: string;
|
|
45
45
|
id: string;
|
|
46
46
|
provider: string;
|
|
47
|
-
error?: undefined;
|
|
48
47
|
configured?: undefined;
|
|
49
48
|
connectPath?: undefined;
|
|
49
|
+
error?: undefined;
|
|
50
50
|
} | {
|
|
51
51
|
url?: undefined;
|
|
52
52
|
id?: undefined;
|
|
@@ -75,10 +75,9 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
|
|
|
75
75
|
user: "user";
|
|
76
76
|
}>>;
|
|
77
77
|
}, z.core.$strip>>, {
|
|
78
|
-
message?: undefined;
|
|
79
78
|
id?: undefined;
|
|
80
|
-
provider?: undefined;
|
|
81
79
|
deleted?: undefined;
|
|
80
|
+
provider?: undefined;
|
|
82
81
|
providers: {
|
|
83
82
|
id: string;
|
|
84
83
|
label: string;
|
|
@@ -92,8 +91,8 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
|
|
|
92
91
|
found?: undefined;
|
|
93
92
|
registered?: undefined;
|
|
94
93
|
label?: undefined;
|
|
95
|
-
} | {
|
|
96
94
|
message?: undefined;
|
|
95
|
+
} | {
|
|
97
96
|
id?: undefined;
|
|
98
97
|
deleted?: undefined;
|
|
99
98
|
count?: undefined;
|
|
@@ -102,18 +101,18 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
|
|
|
102
101
|
provider: import("../custom-registry.js").CustomProviderConfig;
|
|
103
102
|
registered?: undefined;
|
|
104
103
|
label?: undefined;
|
|
105
|
-
} | {
|
|
106
104
|
message?: undefined;
|
|
107
|
-
|
|
105
|
+
} | {
|
|
108
106
|
deleted?: undefined;
|
|
107
|
+
provider?: undefined;
|
|
109
108
|
count?: undefined;
|
|
110
109
|
providers?: undefined;
|
|
111
110
|
found: boolean;
|
|
112
111
|
id: string;
|
|
113
112
|
registered?: undefined;
|
|
114
113
|
label?: undefined;
|
|
115
|
-
} | {
|
|
116
114
|
message?: undefined;
|
|
115
|
+
} | {
|
|
117
116
|
provider?: undefined;
|
|
118
117
|
count?: undefined;
|
|
119
118
|
providers?: undefined;
|
|
@@ -122,9 +121,10 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
|
|
|
122
121
|
id: string;
|
|
123
122
|
registered?: undefined;
|
|
124
123
|
label?: undefined;
|
|
124
|
+
message?: undefined;
|
|
125
125
|
} | {
|
|
126
|
-
provider?: undefined;
|
|
127
126
|
deleted?: undefined;
|
|
127
|
+
provider?: undefined;
|
|
128
128
|
count?: undefined;
|
|
129
129
|
providers?: undefined;
|
|
130
130
|
found?: undefined;
|
|
@@ -311,9 +311,9 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
|
|
|
311
311
|
notes?: string | undefined;
|
|
312
312
|
scope?: "org" | "user" | undefined;
|
|
313
313
|
}, {
|
|
314
|
+
provider?: undefined;
|
|
314
315
|
id?: undefined;
|
|
315
316
|
deleted?: undefined;
|
|
316
|
-
provider?: undefined;
|
|
317
317
|
providers: {
|
|
318
318
|
id: string;
|
|
319
319
|
label: string;
|
|
@@ -339,8 +339,8 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
|
|
|
339
339
|
label?: undefined;
|
|
340
340
|
message?: undefined;
|
|
341
341
|
} | {
|
|
342
|
-
deleted?: undefined;
|
|
343
342
|
provider?: undefined;
|
|
343
|
+
deleted?: undefined;
|
|
344
344
|
providers?: undefined;
|
|
345
345
|
count?: undefined;
|
|
346
346
|
found: boolean;
|
|
@@ -359,8 +359,8 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
|
|
|
359
359
|
label?: undefined;
|
|
360
360
|
message?: undefined;
|
|
361
361
|
} | {
|
|
362
|
-
deleted?: undefined;
|
|
363
362
|
provider?: undefined;
|
|
363
|
+
deleted?: undefined;
|
|
364
364
|
providers?: undefined;
|
|
365
365
|
count?: undefined;
|
|
366
366
|
found?: undefined;
|
|
@@ -5,14 +5,7 @@ export interface AuthMarketingContent {
|
|
|
5
5
|
tagline: string;
|
|
6
6
|
description?: string;
|
|
7
7
|
features?: string[];
|
|
8
|
-
authHeadline?: string;
|
|
9
|
-
authDescription?: string;
|
|
10
|
-
screenshotPath?: string;
|
|
11
|
-
screenshotWidth?: number;
|
|
12
|
-
screenshotHeight?: number;
|
|
13
8
|
learnMoreUrl?: string;
|
|
14
|
-
/** @deprecated Local execution is no longer offered from auth pages. */
|
|
15
|
-
runLocalCommand?: string;
|
|
16
9
|
signupLocalModeNote?: {
|
|
17
10
|
text: string;
|
|
18
11
|
command: string;
|