@agent-native/core 0.81.2 → 0.81.3
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/core/CHANGELOG.md +19 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/frame.ts +55 -0
- package/corpus/core/src/mcp/build-server.ts +30 -4
- package/corpus/core/src/mcp/embed-app.ts +33 -18
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +8 -1
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +11 -2
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +89 -16
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +21 -14
- package/corpus/templates/design/app/pages/DesignEditor.tsx +557 -211
- package/corpus/templates/design/changelog/2026-06-30-design-studio-canvas-layers-can-be-copied-pasted-and-reparen.md +6 -0
- package/corpus/templates/design/e2e/global-setup.ts +3 -1
- package/corpus/templates/design/e2e/helpers.ts +4 -1
- package/corpus/templates/design/playwright.config.ts +4 -1
- package/corpus/templates/plan/actions/consume-plan-feedback.ts +1 -9
- package/corpus/templates/plan/actions/convert-visual-plan-to-prototype.ts +1 -1
- package/corpus/templates/plan/actions/create-plan-design.ts +1 -1
- package/corpus/templates/plan/actions/create-prototype-plan.ts +1 -1
- package/corpus/templates/plan/actions/create-ui-plan.ts +1 -1
- package/corpus/templates/plan/actions/create-visual-plan.ts +36 -19
- package/corpus/templates/plan/actions/create-visual-questions.ts +1 -1
- package/corpus/templates/plan/actions/create-visual-recap.ts +1 -1
- package/corpus/templates/plan/actions/delete-plan-comment.ts +1 -9
- package/corpus/templates/plan/actions/delete-visual-plan.ts +1 -9
- package/corpus/templates/plan/actions/get-plan-feedback.ts +1 -9
- package/corpus/templates/plan/actions/get-visual-plan.ts +1 -9
- package/corpus/templates/plan/actions/import-visual-plan-source.ts +1 -1
- package/corpus/templates/plan/actions/list-visual-plans.ts +1 -9
- package/corpus/templates/plan/actions/reply-to-plan-comment.ts +1 -9
- package/corpus/templates/plan/actions/resolve-plan-comment.ts +1 -9
- package/corpus/templates/plan/actions/update-visual-plan.ts +1 -1
- package/corpus/templates/plan/actions/visual-answer.ts +1 -1
- package/corpus/templates/plan/app/components/layout/Layout.tsx +15 -0
- package/corpus/templates/plan/app/entry.client.tsx +10 -0
- package/corpus/templates/plan/app/global.css +28 -0
- package/corpus/templates/plan/shared/plan-content.ts +10 -6
- package/dist/client/frame.d.ts.map +1 -1
- package/dist/client/frame.js +59 -0
- package/dist/client/frame.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +31 -4
- 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 +33 -18
- package/dist/mcp/embed-app.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/package.json +1 -1
package/dist/client/frame.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/client/frame.ts"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"./api-path.js\";\n\n/**\n * Frame Communication (browser)\n *\n * Utilities for communicating with the parent frame via postMessage.\n * Provides typed request/response patterns and message sending.\n */\n\n// ---------------------------------------------------------------------------\n// Low-level parent messaging\n// ---------------------------------------------------------------------------\n\n/**\n * Send a typed message to the parent frame.\n * No-op if running at top level (no parent frame).\n */\nexport function sendToFrame(type: string, data?: any): void {\n if (typeof window === \"undefined\") return;\n const target = window.parent !== window ? window.parent : window;\n const targetOrigin =\n getFramePostMessageTargetOrigin() || window.location.origin;\n target.postMessage({ type, data }, targetOrigin);\n}\n\n/**\n * Listen for a specific message type from the parent frame.\n * Returns a cleanup function.\n */\nexport function onFrameMessage(\n type: string,\n handler: (data: any) => void,\n): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n const listener = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type === type) {\n handler(event.data.data ?? event.data.detail ?? event.data);\n }\n };\n window.addEventListener(\"message\", listener);\n return () => window.removeEventListener(\"message\", listener);\n}\n\n// ---------------------------------------------------------------------------\n// Frame Origin\n// ---------------------------------------------------------------------------\n\nlet _frameOrigin: string | null = null;\n\nfunction normalizeOrigin(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n if (value === \"null\") return \"null\";\n try {\n return new URL(value).origin;\n } catch {\n return null;\n }\n}\n\nexport function getFramePostMessageTargetOrigin(): string | null {\n const origin = getFrameOrigin();\n return origin === \"null\" ? \"*\" : origin;\n}\n\nexport function isTrustedFrameMessage(event: MessageEvent): boolean {\n if (typeof window === \"undefined\") return false;\n\n const ownOrigin = window.location.origin;\n if (event.origin === ownOrigin) return true;\n\n const frameOrigin = getFrameOrigin();\n if (!frameOrigin) return false;\n if (frameOrigin === \"null\") {\n return (\n event.origin === \"null\" &&\n (event.source === window.parent || event.source === window)\n );\n }\n if (event.origin !== frameOrigin) return false;\n\n return event.source === window.parent || event.source === window;\n}\n\n// Listen for frame origin message and cache it.\n// Only accept from the direct parent frame, and only set once.\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"message\", (event: MessageEvent) => {\n const eventOrigin = normalizeOrigin(event.origin);\n const payloadOrigin = normalizeOrigin(event.data?.origin);\n const origin = eventOrigin ?? payloadOrigin;\n if (\n event.data?.type === \"agentNative.frameOrigin\" &&\n origin &&\n (!payloadOrigin || payloadOrigin === origin || origin === \"null\") &&\n !_frameOrigin &&\n event.source === window.parent\n ) {\n _frameOrigin = origin;\n window.parent.postMessage(\n { type: \"agentNative.embeddedAppReady\" },\n getFramePostMessageTargetOrigin() ?? window.location.origin,\n );\n }\n });\n}\n\n/**\n * Get the frame origin (e.g. \"http://localhost:3334\").\n * Returns null if not running inside a frame iframe.\n */\nexport function getFrameOrigin(): string | null {\n return _frameOrigin;\n}\n\n/**\n * Returns true if the app is running inside a frame iframe\n * (local dev frame, Builder.io, or any compatible frame).\n */\nexport function isInFrame(): boolean {\n return _frameOrigin !== null;\n}\n\n/**\n * Get the origin for OAuth callbacks.\n * Always uses the app's own origin (window.location.origin), NOT the frame\n * origin. The redirect URI registered in Google Cloud Console (or any OAuth\n * provider) must match the template app's direct URL, not the dev frame's\n * proxy URL, so this must be consistent regardless of how the app is accessed.\n */\nexport function getCallbackOrigin(): string {\n return typeof window !== \"undefined\" ? window.location.origin : \"\";\n}\n\nfunction envFlag(name: string): boolean {\n const value = runtimeEnvValue(name);\n return value === \"1\" || value === \"true\" || value === true;\n}\n\nfunction runtimeEnvValue(name: string): string | boolean | undefined {\n const importMetaEnv = (\n import.meta as unknown as {\n env?: Record<string, string | boolean | undefined>;\n }\n ).env;\n if (importMetaEnv?.[name] !== undefined) return importMetaEnv[name];\n return typeof process !== \"undefined\"\n ? (process.env as Record<string, string | undefined>)?.[name]\n : undefined;\n}\n\nfunction workspaceOAuthOrigin(): string | null {\n const raw =\n runtimeEnvValue(\"VITE_WORKSPACE_OAUTH_ORIGIN\") ||\n runtimeEnvValue(\"WORKSPACE_OAUTH_ORIGIN\") ||\n runtimeEnvValue(\"VITE_APP_URL\") ||\n runtimeEnvValue(\"APP_URL\") ||\n runtimeEnvValue(\"VITE_BETTER_AUTH_URL\") ||\n runtimeEnvValue(\"BETTER_AUTH_URL\") ||\n runtimeEnvValue(\"VITE_WORKSPACE_GATEWAY_URL\") ||\n runtimeEnvValue(\"WORKSPACE_GATEWAY_URL\");\n if (typeof raw !== \"string\" || !raw) return null;\n try {\n return new URL(raw).origin;\n } catch {\n return null;\n }\n}\n\nfunction shouldUseWorkspaceCallbackRelay(path: string): boolean {\n return (\n envFlag(\"VITE_AGENT_NATIVE_WORKSPACE\") &&\n path.startsWith(\"/_agent-native/\") &&\n (path.endsWith(\"/callback\") || path.includes(\"/callback/\"))\n );\n}\n\n/**\n * Build an OAuth redirect URI for a framework callback route.\n *\n * Workspace deploys use one provider-registered root callback URL and then\n * relay to the app-specific callback based on OAuth state. Standalone apps\n * keep using their mounted app callback path.\n */\nexport function oauthRedirectUri(callbackPath: string): string {\n const normalized = callbackPath.startsWith(\"/\")\n ? callbackPath\n : `/${callbackPath}`;\n const path = shouldUseWorkspaceCallbackRelay(normalized)\n ? normalized\n : agentNativePath(normalized);\n const oauthOrigin = shouldUseWorkspaceCallbackRelay(normalized)\n ? workspaceOAuthOrigin()\n : null;\n const origin = oauthOrigin ?? getCallbackOrigin();\n return `${origin}${path}`;\n}\n\n// ---------------------------------------------------------------------------\n// User Info\n// ---------------------------------------------------------------------------\n\nexport interface UserInfo {\n name?: string;\n email?: string;\n}\n\n/**\n * Request user info (name + email) from the parent frame.\n * Falls back to empty object if frame doesn't respond within timeout.\n */\nexport function requestUserInfo(timeoutMs = 1500): Promise<UserInfo> {\n return new Promise((resolve) => {\n if (typeof window === \"undefined\" || window.parent === window) {\n resolve({});\n return;\n }\n\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n window.removeEventListener(\"message\", handler);\n resolve({});\n }\n }, timeoutMs);\n\n function handler(event: MessageEvent) {\n if (!event.data || event.data.type !== \"agentNative.userInfo\") return;\n if (event.source !== window.parent) return;\n const frameOrigin = getFrameOrigin();\n if (frameOrigin && event.origin !== frameOrigin) return;\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n window.removeEventListener(\"message\", handler);\n const { name, email } = event.data.data ?? {};\n resolve({ name: name || undefined, email: email || undefined });\n }\n\n window.addEventListener(\"message\", handler);\n window.parent.postMessage(\n { type: \"agentNative.getUserInfo\" },\n getFramePostMessageTargetOrigin() ?? window.location.origin,\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Selection Mode (visual editing)\n// ---------------------------------------------------------------------------\n\n/**\n * Enter visual editing selection mode for a specific element.\n */\nexport function enterStyleEditing(selector: string): void {\n sendToFrame(\"agentNative.enterStyleEditing\", { selector });\n}\n\n/**\n * Enter text editing mode for a specific element.\n */\nexport function enterTextEditing(selector: string): void {\n sendToFrame(\"agentNative.enterTextEditing\", { selector });\n}\n\n/**\n * Exit selection mode.\n */\nexport function exitSelectionMode(): void {\n sendToFrame(\"agentNative.exitSelectionMode\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/client/frame.ts"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"./api-path.js\";\n\n/**\n * Frame Communication (browser)\n *\n * Utilities for communicating with the parent frame via postMessage.\n * Provides typed request/response patterns and message sending.\n */\n\n// ---------------------------------------------------------------------------\n// Low-level parent messaging\n// ---------------------------------------------------------------------------\n\n/**\n * Send a typed message to the parent frame.\n * No-op if running at top level (no parent frame).\n */\nexport function sendToFrame(type: string, data?: any): void {\n if (typeof window === \"undefined\") return;\n const target = window.parent !== window ? window.parent : window;\n const targetOrigin =\n getFramePostMessageTargetOrigin() || window.location.origin;\n target.postMessage({ type, data }, targetOrigin);\n}\n\n/**\n * Listen for a specific message type from the parent frame.\n * Returns a cleanup function.\n */\nexport function onFrameMessage(\n type: string,\n handler: (data: any) => void,\n): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n const listener = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type === type) {\n handler(event.data.data ?? event.data.detail ?? event.data);\n }\n };\n window.addEventListener(\"message\", listener);\n return () => window.removeEventListener(\"message\", listener);\n}\n\n// ---------------------------------------------------------------------------\n// Frame Origin\n// ---------------------------------------------------------------------------\n\nlet _frameOrigin: string | null = null;\n\nfunction normalizeOrigin(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n if (value === \"null\") return \"null\";\n try {\n return new URL(value).origin;\n } catch {\n return null;\n }\n}\n\nexport function getFramePostMessageTargetOrigin(): string | null {\n const origin = getFrameOrigin();\n return origin === \"null\" ? \"*\" : origin;\n}\n\nexport function isTrustedFrameMessage(event: MessageEvent): boolean {\n if (typeof window === \"undefined\") return false;\n\n const ownOrigin = window.location.origin;\n if (event.origin === ownOrigin) return true;\n\n const frameOrigin = getFrameOrigin();\n if (!frameOrigin) return false;\n if (frameOrigin === \"null\") {\n return (\n event.origin === \"null\" &&\n (event.source === window.parent || event.source === window)\n );\n }\n if (event.origin !== frameOrigin) return false;\n\n return event.source === window.parent || event.source === window;\n}\n\n// ---------------------------------------------------------------------------\n// Content-height reporting (for MCP App embeds)\n// ---------------------------------------------------------------------------\n//\n// The embed shell renders this app in a cross-origin iframe and can't measure\n// its content, so we post the real content height for the shell to size to.\n// Only shrinks when the document flows to its natural height — embed layouts\n// must not force `100vh`/`h-screen` on the root, or scrollHeight just equals\n// the iframe height.\nlet _contentHeightReportingStarted = false;\nlet _lastReportedContentHeight = 0;\n\nfunction measureContentHeight(): number {\n if (typeof document === \"undefined\") return 0;\n const doc = document.documentElement;\n const body = document.body;\n return Math.ceil(\n Math.max(doc ? doc.scrollHeight : 0, body ? body.scrollHeight : 0),\n );\n}\n\nfunction reportContentHeight(): void {\n if (typeof window === \"undefined\" || window.parent === window) return;\n const height = measureContentHeight();\n if (!height || Math.abs(height - _lastReportedContentHeight) < 2) return;\n _lastReportedContentHeight = height;\n sendToFrame(\"agentNative.contentHeight\", { height });\n}\n\nfunction startContentHeightReporting(): void {\n if (_contentHeightReportingStarted || typeof window === \"undefined\") return;\n if (window.parent === window) return;\n _contentHeightReportingStarted = true;\n let scheduled = false;\n const schedule = () => {\n if (scheduled) return;\n scheduled = true;\n window.requestAnimationFrame(() => {\n scheduled = false;\n reportContentHeight();\n });\n };\n schedule();\n for (const delay of [100, 300, 800, 1500]) window.setTimeout(schedule, delay);\n try {\n const observer = new ResizeObserver(schedule);\n if (document.documentElement) observer.observe(document.documentElement);\n if (document.body) observer.observe(document.body);\n } catch {\n window.addEventListener(\"resize\", schedule, { passive: true });\n }\n window.addEventListener(\"load\", schedule, { passive: true });\n}\n\n// Listen for frame origin message and cache it.\n// Only accept from the direct parent frame, and only set once.\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"message\", (event: MessageEvent) => {\n const eventOrigin = normalizeOrigin(event.origin);\n const payloadOrigin = normalizeOrigin(event.data?.origin);\n const origin = eventOrigin ?? payloadOrigin;\n if (\n event.data?.type === \"agentNative.frameOrigin\" &&\n origin &&\n (!payloadOrigin || payloadOrigin === origin || origin === \"null\") &&\n !_frameOrigin &&\n event.source === window.parent\n ) {\n _frameOrigin = origin;\n window.parent.postMessage(\n { type: \"agentNative.embeddedAppReady\" },\n getFramePostMessageTargetOrigin() ?? window.location.origin,\n );\n startContentHeightReporting();\n }\n });\n}\n\n/**\n * Get the frame origin (e.g. \"http://localhost:3334\").\n * Returns null if not running inside a frame iframe.\n */\nexport function getFrameOrigin(): string | null {\n return _frameOrigin;\n}\n\n/**\n * Returns true if the app is running inside a frame iframe\n * (local dev frame, Builder.io, or any compatible frame).\n */\nexport function isInFrame(): boolean {\n return _frameOrigin !== null;\n}\n\n/**\n * Get the origin for OAuth callbacks.\n * Always uses the app's own origin (window.location.origin), NOT the frame\n * origin. The redirect URI registered in Google Cloud Console (or any OAuth\n * provider) must match the template app's direct URL, not the dev frame's\n * proxy URL, so this must be consistent regardless of how the app is accessed.\n */\nexport function getCallbackOrigin(): string {\n return typeof window !== \"undefined\" ? window.location.origin : \"\";\n}\n\nfunction envFlag(name: string): boolean {\n const value = runtimeEnvValue(name);\n return value === \"1\" || value === \"true\" || value === true;\n}\n\nfunction runtimeEnvValue(name: string): string | boolean | undefined {\n const importMetaEnv = (\n import.meta as unknown as {\n env?: Record<string, string | boolean | undefined>;\n }\n ).env;\n if (importMetaEnv?.[name] !== undefined) return importMetaEnv[name];\n return typeof process !== \"undefined\"\n ? (process.env as Record<string, string | undefined>)?.[name]\n : undefined;\n}\n\nfunction workspaceOAuthOrigin(): string | null {\n const raw =\n runtimeEnvValue(\"VITE_WORKSPACE_OAUTH_ORIGIN\") ||\n runtimeEnvValue(\"WORKSPACE_OAUTH_ORIGIN\") ||\n runtimeEnvValue(\"VITE_APP_URL\") ||\n runtimeEnvValue(\"APP_URL\") ||\n runtimeEnvValue(\"VITE_BETTER_AUTH_URL\") ||\n runtimeEnvValue(\"BETTER_AUTH_URL\") ||\n runtimeEnvValue(\"VITE_WORKSPACE_GATEWAY_URL\") ||\n runtimeEnvValue(\"WORKSPACE_GATEWAY_URL\");\n if (typeof raw !== \"string\" || !raw) return null;\n try {\n return new URL(raw).origin;\n } catch {\n return null;\n }\n}\n\nfunction shouldUseWorkspaceCallbackRelay(path: string): boolean {\n return (\n envFlag(\"VITE_AGENT_NATIVE_WORKSPACE\") &&\n path.startsWith(\"/_agent-native/\") &&\n (path.endsWith(\"/callback\") || path.includes(\"/callback/\"))\n );\n}\n\n/**\n * Build an OAuth redirect URI for a framework callback route.\n *\n * Workspace deploys use one provider-registered root callback URL and then\n * relay to the app-specific callback based on OAuth state. Standalone apps\n * keep using their mounted app callback path.\n */\nexport function oauthRedirectUri(callbackPath: string): string {\n const normalized = callbackPath.startsWith(\"/\")\n ? callbackPath\n : `/${callbackPath}`;\n const path = shouldUseWorkspaceCallbackRelay(normalized)\n ? normalized\n : agentNativePath(normalized);\n const oauthOrigin = shouldUseWorkspaceCallbackRelay(normalized)\n ? workspaceOAuthOrigin()\n : null;\n const origin = oauthOrigin ?? getCallbackOrigin();\n return `${origin}${path}`;\n}\n\n// ---------------------------------------------------------------------------\n// User Info\n// ---------------------------------------------------------------------------\n\nexport interface UserInfo {\n name?: string;\n email?: string;\n}\n\n/**\n * Request user info (name + email) from the parent frame.\n * Falls back to empty object if frame doesn't respond within timeout.\n */\nexport function requestUserInfo(timeoutMs = 1500): Promise<UserInfo> {\n return new Promise((resolve) => {\n if (typeof window === \"undefined\" || window.parent === window) {\n resolve({});\n return;\n }\n\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n window.removeEventListener(\"message\", handler);\n resolve({});\n }\n }, timeoutMs);\n\n function handler(event: MessageEvent) {\n if (!event.data || event.data.type !== \"agentNative.userInfo\") return;\n if (event.source !== window.parent) return;\n const frameOrigin = getFrameOrigin();\n if (frameOrigin && event.origin !== frameOrigin) return;\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n window.removeEventListener(\"message\", handler);\n const { name, email } = event.data.data ?? {};\n resolve({ name: name || undefined, email: email || undefined });\n }\n\n window.addEventListener(\"message\", handler);\n window.parent.postMessage(\n { type: \"agentNative.getUserInfo\" },\n getFramePostMessageTargetOrigin() ?? window.location.origin,\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Selection Mode (visual editing)\n// ---------------------------------------------------------------------------\n\n/**\n * Enter visual editing selection mode for a specific element.\n */\nexport function enterStyleEditing(selector: string): void {\n sendToFrame(\"agentNative.enterStyleEditing\", { selector });\n}\n\n/**\n * Enter text editing mode for a specific element.\n */\nexport function enterTextEditing(selector: string): void {\n sendToFrame(\"agentNative.enterTextEditing\", { selector });\n}\n\n/**\n * Exit selection mode.\n */\nexport function exitSelectionMode(): void {\n sendToFrame(\"agentNative.exitSelectionMode\");\n}\n"]}
|
|
@@ -49,11 +49,11 @@ export declare const postAwareness: import("h3").EventHandlerWithFetch<import("h
|
|
|
49
49
|
error: string;
|
|
50
50
|
states?: undefined;
|
|
51
51
|
} | {
|
|
52
|
+
error?: undefined;
|
|
52
53
|
states: {
|
|
53
54
|
clientId: number;
|
|
54
55
|
state: string;
|
|
55
56
|
}[];
|
|
56
|
-
error?: undefined;
|
|
57
57
|
}>>;
|
|
58
58
|
/**
|
|
59
59
|
* GET /_agent-native/collab/:docId/users
|
|
@@ -64,10 +64,10 @@ export declare const getActiveUsers: import("h3").EventHandlerWithFetch<import("
|
|
|
64
64
|
error: string;
|
|
65
65
|
users?: undefined;
|
|
66
66
|
} | {
|
|
67
|
+
error?: undefined;
|
|
67
68
|
users: {
|
|
68
69
|
clientId: number;
|
|
69
70
|
lastSeen: number;
|
|
70
71
|
}[];
|
|
71
|
-
error?: undefined;
|
|
72
72
|
}>>;
|
|
73
73
|
//# sourceMappingURL=awareness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awareness.d.ts","sourceRoot":"","sources":["../../src/collab/awareness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAUN;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAO1E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAOnE;AAUD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"awareness.d.ts","sourceRoot":"","sources":["../../src/collab/awareness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAUN;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAO1E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAOnE;AAUD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;;;;;;kBAuCa,MAAM;eAAS,MAAM;;GAa1D,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;kBAWM,MAAM;kBAAY,MAAM;;GAMvD,CAAC"}
|
|
@@ -3,18 +3,18 @@ declare const _default: import("../../action.js").ActionDefinition<{
|
|
|
3
3
|
url?: string;
|
|
4
4
|
filename?: string;
|
|
5
5
|
}, {
|
|
6
|
+
id?: undefined;
|
|
6
7
|
error: string;
|
|
7
8
|
configured?: undefined;
|
|
8
9
|
connectPath?: undefined;
|
|
9
10
|
url?: undefined;
|
|
10
|
-
id?: undefined;
|
|
11
11
|
provider?: undefined;
|
|
12
12
|
} | {
|
|
13
|
+
id?: undefined;
|
|
13
14
|
error: string;
|
|
14
15
|
configured: boolean;
|
|
15
16
|
connectPath: string;
|
|
16
17
|
url?: undefined;
|
|
17
|
-
id?: undefined;
|
|
18
18
|
provider?: undefined;
|
|
19
19
|
} | {
|
|
20
20
|
error?: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-server.d.ts","sourceRoot":"","sources":["../../src/mcp/build-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AASH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAgChE,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KAC1B,CAAC,CAAC;IACH,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;kEAGkE;AAClE,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GACtC,OAAO,CAgBT;
|
|
1
|
+
{"version":3,"file":"build-server.d.ts","sourceRoot":"","sources":["../../src/mcp/build-server.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/build-server.js
CHANGED
|
@@ -239,6 +239,21 @@ function purgeEmbedStartUrls(value, depth = 0) {
|
|
|
239
239
|
}
|
|
240
240
|
return value;
|
|
241
241
|
}
|
|
242
|
+
// True when a tool result carries SOME content. An errored/no-plan result comes
|
|
243
|
+
// back empty (`{}` / null) and would render an empty embed box. We gate on "has
|
|
244
|
+
// content", not "has a URL" — valid embeds often carry data but no URL (the
|
|
245
|
+
// shell mints the embed-start itself).
|
|
246
|
+
function mcpResultHasContent(result) {
|
|
247
|
+
if (result == null)
|
|
248
|
+
return false;
|
|
249
|
+
if (typeof result === "string")
|
|
250
|
+
return result.trim().length > 0;
|
|
251
|
+
if (Array.isArray(result))
|
|
252
|
+
return result.length > 0;
|
|
253
|
+
if (typeof result === "object")
|
|
254
|
+
return Object.keys(result).length > 0;
|
|
255
|
+
return Boolean(result);
|
|
256
|
+
}
|
|
242
257
|
function mcpAppEmbedOpenLinkMeta(result, resource, meta) {
|
|
243
258
|
const out = metadataObject(result);
|
|
244
259
|
const embedStartUrl = typeof out.embedStartUrl === "string"
|
|
@@ -494,7 +509,7 @@ function safeUiSegment(value, fallback) {
|
|
|
494
509
|
}
|
|
495
510
|
// ChatGPT and Claude cache MCP App resource HTML by `ui://` URI. Bump this
|
|
496
511
|
// when the shared shell changes in a way that must invalidate host caches.
|
|
497
|
-
const MCP_APP_RESOURCE_SHELL_VERSION = "shell-
|
|
512
|
+
const MCP_APP_RESOURCE_SHELL_VERSION = "shell-v64";
|
|
498
513
|
function legacyDefaultMcpAppUri(config, actionName) {
|
|
499
514
|
const app = safeUiSegment(config.appId ?? config.name, "agent-native");
|
|
500
515
|
const action = safeUiSegment(actionName, "tool");
|
|
@@ -1133,12 +1148,22 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
|
|
|
1133
1148
|
// branch below degrades to the plain deep-link artifacts the tool would
|
|
1134
1149
|
// otherwise return — no `openai/outputTemplate`, no minted embed-start,
|
|
1135
1150
|
// no embed structuredContent — so the host shows a link, not an iframe.
|
|
1136
|
-
const
|
|
1151
|
+
const mcpAppResourceCandidate = requestMeta?.inlineMcpApps
|
|
1137
1152
|
? await resolveMcpAppResourceSafely(config, name, entry, requestMeta)
|
|
1138
1153
|
: null;
|
|
1139
|
-
const rawResultForClient =
|
|
1154
|
+
const rawResultForClient = mcpAppResourceCandidate
|
|
1140
1155
|
? await withServerMintedMcpAppEmbedStart(rawResult, requestMeta)
|
|
1141
1156
|
: rawResult;
|
|
1157
|
+
// Only attach the embed widget for a non-error result that has content.
|
|
1158
|
+
const embedHasContent = mcpResultHasContent(rawResultForClient);
|
|
1159
|
+
const mcpAppResource = mcpAppResourceCandidate && !mcpResultIsError && embedHasContent
|
|
1160
|
+
? mcpAppResourceCandidate
|
|
1161
|
+
: null;
|
|
1162
|
+
// `openai/outputTemplate` is declared at the tool level, so the host
|
|
1163
|
+
// renders a widget for every call regardless of result _meta. The only
|
|
1164
|
+
// per-result signal it honors is `isError` (shows error text, no widget),
|
|
1165
|
+
// so treat an embed tool that produced nothing as an error.
|
|
1166
|
+
const embedProducedNothing = !!mcpAppResourceCandidate && !mcpResultIsError && !embedHasContent;
|
|
1142
1167
|
const { block, _meta } = buildLinkArtifacts(entry, args ?? {}, rawResultForClient, requestMeta);
|
|
1143
1168
|
const responseMeta = {
|
|
1144
1169
|
...(_meta ?? {}),
|
|
@@ -1168,7 +1193,9 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
|
|
|
1168
1193
|
content.push(block);
|
|
1169
1194
|
return {
|
|
1170
1195
|
content,
|
|
1171
|
-
...(mcpResultIsError
|
|
1196
|
+
...(mcpResultIsError || embedProducedNothing
|
|
1197
|
+
? { isError: true }
|
|
1198
|
+
: {}),
|
|
1172
1199
|
...(structuredContent ? { structuredContent } : {}),
|
|
1173
1200
|
...(Object.keys(responseMeta).length > 0
|
|
1174
1201
|
? { _meta: responseMeta }
|