@agent-native/core 0.26.2 → 0.26.5

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.
Files changed (71) hide show
  1. package/dist/cli/skills.d.ts.map +1 -1
  2. package/dist/cli/skills.js +4 -1
  3. package/dist/cli/skills.js.map +1 -1
  4. package/dist/client/mcp-app-host.d.ts +1 -0
  5. package/dist/client/mcp-app-host.d.ts.map +1 -1
  6. package/dist/client/mcp-app-host.js +44 -6
  7. package/dist/client/mcp-app-host.js.map +1 -1
  8. package/dist/deploy/build.d.ts +6 -1
  9. package/dist/deploy/build.d.ts.map +1 -1
  10. package/dist/deploy/build.js +92 -10
  11. package/dist/deploy/build.js.map +1 -1
  12. package/dist/deploy/immutable-assets.d.ts +11 -0
  13. package/dist/deploy/immutable-assets.d.ts.map +1 -0
  14. package/dist/deploy/immutable-assets.js +49 -0
  15. package/dist/deploy/immutable-assets.js.map +1 -0
  16. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  17. package/dist/deploy/workspace-deploy.js +37 -1
  18. package/dist/deploy/workspace-deploy.js.map +1 -1
  19. package/dist/mcp/build-server.d.ts.map +1 -1
  20. package/dist/mcp/build-server.js +95 -8
  21. package/dist/mcp/build-server.js.map +1 -1
  22. package/dist/mcp/embed-app.d.ts.map +1 -1
  23. package/dist/mcp/embed-app.js +247 -30
  24. package/dist/mcp/embed-app.js.map +1 -1
  25. package/dist/mcp/server.d.ts +5 -7
  26. package/dist/mcp/server.d.ts.map +1 -1
  27. package/dist/mcp/server.js +16 -12
  28. package/dist/mcp/server.js.map +1 -1
  29. package/dist/server/action-routes.d.ts.map +1 -1
  30. package/dist/server/action-routes.js +23 -7
  31. package/dist/server/action-routes.js.map +1 -1
  32. package/dist/server/auth.d.ts.map +1 -1
  33. package/dist/server/auth.js +69 -38
  34. package/dist/server/auth.js.map +1 -1
  35. package/dist/server/core-routes-plugin.d.ts +12 -1
  36. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  37. package/dist/server/core-routes-plugin.js +48 -44
  38. package/dist/server/core-routes-plugin.js.map +1 -1
  39. package/dist/server/create-server.d.ts.map +1 -1
  40. package/dist/server/create-server.js +3 -1
  41. package/dist/server/create-server.js.map +1 -1
  42. package/dist/server/credential-provider.d.ts +1 -0
  43. package/dist/server/credential-provider.d.ts.map +1 -1
  44. package/dist/server/credential-provider.js +15 -4
  45. package/dist/server/credential-provider.js.map +1 -1
  46. package/dist/server/embed-route.d.ts.map +1 -1
  47. package/dist/server/embed-route.js +28 -2
  48. package/dist/server/embed-route.js.map +1 -1
  49. package/dist/server/embed-session.d.ts.map +1 -1
  50. package/dist/server/embed-session.js +26 -7
  51. package/dist/server/embed-session.js.map +1 -1
  52. package/dist/server/onboarding-html.d.ts.map +1 -1
  53. package/dist/server/onboarding-html.js +52 -5
  54. package/dist/server/onboarding-html.js.map +1 -1
  55. package/dist/server/ssr-handler.d.ts +1 -1
  56. package/dist/server/ssr-handler.d.ts.map +1 -1
  57. package/dist/server/ssr-handler.js +23 -10
  58. package/dist/server/ssr-handler.js.map +1 -1
  59. package/dist/shared/cache-control.d.ts +2 -0
  60. package/dist/shared/cache-control.d.ts.map +1 -0
  61. package/dist/shared/cache-control.js +2 -0
  62. package/dist/shared/cache-control.js.map +1 -0
  63. package/dist/shared/mcp-embed-headers.d.ts +2 -1
  64. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  65. package/dist/shared/mcp-embed-headers.js +3 -1
  66. package/dist/shared/mcp-embed-headers.js.map +1 -1
  67. package/dist/templates/workspace-root/package.json +5 -0
  68. package/docs/content/mcp-protocol.md +0 -1
  69. package/docs/content/template-assets.md +5 -0
  70. package/package.json +2 -2
  71. package/src/templates/workspace-root/package.json +5 -0
@@ -1,11 +1,22 @@
1
1
  import type { H3Event } from "h3";
2
2
  import type { EnvKeyConfig } from "./create-server.js";
3
+ import { type AuthSession } from "./auth.js";
3
4
  /**
4
5
  * The base path prefix for all framework-level routes.
5
6
  * All agent-native core routes live under this namespace to avoid
6
7
  * collisions with template-specific `/api/*` routes.
7
8
  */
8
9
  export declare const FRAMEWORK_ROUTE_PREFIX = "/_agent-native";
10
+ type BuilderAnonymousOwnerResolver = (event: H3Event) => string | null | Promise<string | null>;
11
+ export type BuilderOwnerContext = {
12
+ email: string | undefined;
13
+ session: AuthSession | null;
14
+ anonymous: boolean;
15
+ };
16
+ export declare function resolveBuilderOwnerContextForRequest(event: H3Event, options?: {
17
+ anonymousOwner?: BuilderAnonymousOwnerResolver;
18
+ getSessionForEvent?: (event: H3Event) => Promise<AuthSession | null>;
19
+ }, mode?: "connect" | "callback"): Promise<BuilderOwnerContext>;
9
20
  /**
10
21
  * Resolves the page-level legacy `/tools` → `/extensions` redirect target.
11
22
  *
@@ -58,7 +69,7 @@ export interface CoreRoutesPluginOptions {
58
69
  * pages that let anonymous viewers connect Builder credentials for their
59
70
  * own browser-scoped agent session.
60
71
  */
61
- anonymousOwner?: (event: H3Event) => string | null | Promise<string | null>;
72
+ anonymousOwner?: BuilderAnonymousOwnerResolver;
62
73
  }
63
74
  /**
64
75
  * Creates a Nitro plugin that mounts all standard agent-native framework routes.
@@ -1 +1 @@
1
- {"version":3,"file":"core-routes-plugin.d.ts","sourceRoot":"","sources":["../../src/server/core-routes-plugin.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAsBlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA6FvD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AA2IvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAWf;AAUD,KAAK,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;wCACoC;IACpC,eAAe,CAAC,EAAE,OAAO,iBAAiB,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAChF,qEAAqE;IACrE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,cAAc,CAmzEhB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAyC,CAAC"}
1
+ {"version":3,"file":"core-routes-plugin.d.ts","sourceRoot":"","sources":["../../src/server/core-routes-plugin.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAuBlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA2CvD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAkDzD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AA+IvD,KAAK,6BAA6B,GAAG,CACnC,KAAK,EAAE,OAAO,KACX,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAsB,oCAAoC,CACxD,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,6BAA6B,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACjE,EACN,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAsD9B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAWf;AAUD,KAAK,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;wCACoC;IACpC,eAAe,CAAC,EAAE,OAAO,iBAAiB,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAChF,qEAAqE;IACrE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,6BAA6B,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,cAAc,CAiwEhB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAyC,CAAC"}
@@ -7,7 +7,7 @@ import { createPollEventsHandler } from "./poll-events.js";
7
7
  import { createOpenRouteHandler } from "./open-route.js";
8
8
  import { createEmbedStartRouteHandler } from "./embed-route.js";
9
9
  import { EMBED_TARGET_HEADER } from "../shared/embed-auth.js";
10
- import { isMcpEmbedCorsOrigin, MCP_EMBED_CORS_ALLOW_HEADERS, shouldAllowMcpEmbedCredentials, } from "../shared/mcp-embed-headers.js";
10
+ import { EMBED_TRANSPLANT_HEADER, isMcpEmbedCorsOrigin, MCP_EMBED_CORS_ALLOW_HEADERS, shouldAllowMcpEmbedCredentials, } from "../shared/mcp-embed-headers.js";
11
11
  import { handleMcpConnect } from "../mcp/connect-route.js";
12
12
  import { handleMcpOAuth, handleMcpOAuthAuthorizationServerMetadata, handleMcpOAuthProtectedResourceMetadata, } from "../mcp/oauth-route.js";
13
13
  import { handleIdentitySso } from "./identity-sso.js";
@@ -147,6 +147,50 @@ function clearBuilderConnectOwnerCookie(event) {
147
147
  path: getBuilderConnectOwnerCookiePath(),
148
148
  });
149
149
  }
150
+ function isAgentNativeAnonymousOwner(email) {
151
+ return /^anon-[^@]+@agent-native\.com$/i.test(email ?? "");
152
+ }
153
+ export async function resolveBuilderOwnerContextForRequest(event, options = {}, mode) {
154
+ const searchParams = getRequestURL(event).searchParams;
155
+ const signedOwner = mode === "connect"
156
+ ? verifyBuilderConnectTokenAndGetOwner(searchParams.get(BUILDER_CONNECT_PARAM))
157
+ : mode === "callback"
158
+ ? verifyBuilderCallbackStateAndGetOwner(searchParams.get(BUILDER_STATE_PARAM))
159
+ : null;
160
+ const cookieOwner = mode === "callback" ? readBuilderConnectOwnerCookie(event) : null;
161
+ const session = await (options.getSessionForEvent ?? getSession)(event).catch(() => null);
162
+ if (session?.email) {
163
+ if (signedOwner &&
164
+ (signedOwner === session.email ||
165
+ (isAgentNativeAnonymousOwner(signedOwner) &&
166
+ isAgentNativeAnonymousOwner(session.email)))) {
167
+ // Public docs/app surfaces can mint a new anonymous session inside the
168
+ // popup when cookies do not round-trip. Keep the signed flow owner in
169
+ // that anonymous-only case, but do not override a real user session.
170
+ return {
171
+ email: signedOwner,
172
+ session: signedOwner === session.email ? session : null,
173
+ anonymous: isAgentNativeAnonymousOwner(signedOwner),
174
+ };
175
+ }
176
+ return { email: session.email, session, anonymous: false };
177
+ }
178
+ if (signedOwner) {
179
+ return {
180
+ email: signedOwner,
181
+ session: null,
182
+ anonymous: isAgentNativeAnonymousOwner(signedOwner),
183
+ };
184
+ }
185
+ if (cookieOwner) {
186
+ return { email: cookieOwner, session: null, anonymous: false };
187
+ }
188
+ const anonymousOwner = await options.anonymousOwner?.(event);
189
+ if (anonymousOwner) {
190
+ return { email: anonymousOwner, session: null, anonymous: true };
191
+ }
192
+ return { email: undefined, session: null, anonymous: false };
193
+ }
150
194
  /**
151
195
  * Resolves the page-level legacy `/tools` → `/extensions` redirect target.
152
196
  *
@@ -327,7 +371,9 @@ export function createCoreRoutesPlugin(options = {}) {
327
371
  .map((header) => header.trim());
328
372
  const mcpEmbedCorsRequest = isMcpEmbedCorsOrigin(origin) &&
329
373
  (requestedHeaderNames.includes(EMBED_TARGET_HEADER.toLowerCase()) ||
374
+ requestedHeaderNames.includes(EMBED_TRANSPLANT_HEADER) ||
330
375
  Boolean(readRequestHeader(EMBED_TARGET_HEADER)) ||
376
+ Boolean(readRequestHeader(EMBED_TRANSPLANT_HEADER)) ||
331
377
  Boolean(readRequestHeader("authorization")));
332
378
  // Decide whether this origin is allowed. We never fall back to the
333
379
  // first allowlist entry — that previously echoed `Access-Control-
@@ -424,49 +470,7 @@ export function createCoreRoutesPlugin(options = {}) {
424
470
  })));
425
471
  }
426
472
  mountBrowserSessionRoutes(nitroApp, { routePrefix: P });
427
- const resolveBuilderOwnerContext = async (event, mode) => {
428
- const session = await getSession(event).catch(() => null);
429
- if (session?.email) {
430
- return { email: session.email, session, anonymous: false };
431
- }
432
- const searchParams = getRequestURL(event).searchParams;
433
- if (mode === "connect") {
434
- const ownerFromConnectToken = verifyBuilderConnectTokenAndGetOwner(searchParams.get(BUILDER_CONNECT_PARAM));
435
- if (ownerFromConnectToken) {
436
- return {
437
- email: ownerFromConnectToken,
438
- session: null,
439
- anonymous: false,
440
- };
441
- }
442
- }
443
- if (mode === "callback") {
444
- // Prefer the signed _an_state owner over the legacy
445
- // an_builder_connect_owner cookie. The cookie can be stale on a
446
- // shared browser — user A signed in earlier, user B starts a fresh
447
- // callback with a signed state for B — and using the cookie first
448
- // would mis-attribute B's Builder credentials to A. The signed
449
- // state is per-flow and TTL-bounded, so it's authoritative when
450
- // both are present.
451
- const ownerFromCallbackState = verifyBuilderCallbackStateAndGetOwner(searchParams.get(BUILDER_STATE_PARAM));
452
- if (ownerFromCallbackState) {
453
- return {
454
- email: ownerFromCallbackState,
455
- session: null,
456
- anonymous: false,
457
- };
458
- }
459
- const ownerFromCookie = readBuilderConnectOwnerCookie(event);
460
- if (ownerFromCookie) {
461
- return { email: ownerFromCookie, session: null, anonymous: false };
462
- }
463
- }
464
- const anonymousOwner = await options.anonymousOwner?.(event);
465
- if (anonymousOwner) {
466
- return { email: anonymousOwner, session: null, anonymous: true };
467
- }
468
- return { email: undefined, session: null, anonymous: false };
469
- };
473
+ const resolveBuilderOwnerContext = async (event, mode) => resolveBuilderOwnerContextForRequest(event, { anonymousOwner: options.anonymousOwner }, mode);
470
474
  getH3App(nitroApp).use(`${P}/builder/status`, defineEventHandler(async (event) => {
471
475
  const envStatus = getBuilderBrowserStatusForEvent(event);
472
476
  const ownerContext = await resolveBuilderOwnerContext(event);