@agent-native/core 0.26.3 → 0.26.6
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/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +4 -1
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/mcp-app-host.d.ts +1 -0
- package/dist/client/mcp-app-host.d.ts.map +1 -1
- package/dist/client/mcp-app-host.js +44 -6
- package/dist/client/mcp-app-host.js.map +1 -1
- package/dist/client/resources/ResourceTree.js +1 -1
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/use-resources.d.ts.map +1 -1
- package/dist/client/resources/use-resources.js +1 -4
- package/dist/client/resources/use-resources.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +2 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +21 -5
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.spec.js +53 -1
- package/dist/client/settings/useBuilderStatus.spec.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +44 -7
- package/dist/deploy/build.js.map +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +95 -8
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/embed-app.d.ts.map +1 -1
- package/dist/mcp/embed-app.js +247 -30
- package/dist/mcp/embed-app.js.map +1 -1
- package/dist/mcp/server.d.ts +5 -7
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +16 -12
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp-client/builtin-capabilities.d.ts +2 -0
- package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -1
- package/dist/mcp-client/builtin-capabilities.js +20 -0
- package/dist/mcp-client/builtin-capabilities.js.map +1 -1
- package/dist/mcp-client/index.d.ts +1 -1
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +1 -1
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/mcp-client/routes.d.ts.map +1 -1
- package/dist/mcp-client/routes.js +41 -29
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +4 -3
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/secrets/storage.d.ts.map +1 -1
- package/dist/secrets/storage.js +4 -1
- package/dist/secrets/storage.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +23 -7
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +10 -5
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +69 -38
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +12 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +48 -44
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +3 -1
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/credential-provider.d.ts +6 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +23 -4
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/embed-route.d.ts.map +1 -1
- package/dist/server/embed-route.js +28 -2
- package/dist/server/embed-route.js.map +1 -1
- package/dist/server/embed-session.d.ts.map +1 -1
- package/dist/server/embed-session.js +26 -7
- package/dist/server/embed-session.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +52 -5
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/ssr-handler.d.ts +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +23 -10
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/shared/cache-control.d.ts +2 -0
- package/dist/shared/cache-control.d.ts.map +1 -0
- package/dist/shared/cache-control.js +2 -0
- package/dist/shared/cache-control.js.map +1 -0
- package/dist/shared/mcp-embed-headers.d.ts +2 -1
- package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
- package/dist/shared/mcp-embed-headers.js +3 -1
- package/dist/shared/mcp-embed-headers.js.map +1 -1
- package/dist/templates/workspace-root/package.json +5 -0
- package/docs/content/mcp-clients.md +16 -4
- package/docs/content/mcp-protocol.md +0 -1
- package/docs/content/template-assets.md +5 -0
- package/package.json +2 -2
- 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?:
|
|
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;
|
|
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);
|