@agent-native/dispatch 0.40.4 → 0.40.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 (66) hide show
  1. package/CHANGELOG.md +20 -7
  2. package/dist/actions/provider-api-register.d.ts +8 -8
  3. package/dist/components/app-open-actions.d.ts +1 -1
  4. package/dist/components/app-open-actions.d.ts.map +1 -1
  5. package/dist/components/app-open-actions.js +1 -1
  6. package/dist/components/app-open-actions.js.map +1 -1
  7. package/dist/components/app-row-settings.js +1 -1
  8. package/dist/components/app-row-settings.js.map +1 -1
  9. package/dist/components/chat-home-apps.js +1 -1
  10. package/dist/components/chat-home-apps.js.map +1 -1
  11. package/dist/components/deferred-chat-components.d.ts +31 -0
  12. package/dist/components/deferred-chat-components.d.ts.map +1 -0
  13. package/dist/components/deferred-chat-components.js +28 -0
  14. package/dist/components/deferred-chat-components.js.map +1 -0
  15. package/dist/components/layout/Header.js +1 -1
  16. package/dist/components/layout/Header.js.map +1 -1
  17. package/dist/components/layout/Layout.d.ts +2 -1
  18. package/dist/components/layout/Layout.d.ts.map +1 -1
  19. package/dist/components/layout/Layout.js +3 -3
  20. package/dist/components/layout/Layout.js.map +1 -1
  21. package/dist/components/workspace-app-card.js +1 -1
  22. package/dist/components/workspace-app-card.js.map +1 -1
  23. package/dist/components/workspace-app-host.d.ts +1 -1
  24. package/dist/components/workspace-app-host.d.ts.map +1 -1
  25. package/dist/components/workspace-app-host.js +3 -2
  26. package/dist/components/workspace-app-host.js.map +1 -1
  27. package/dist/lib/workspace-apps.js +1 -1
  28. package/dist/lib/workspace-apps.js.map +1 -1
  29. package/dist/routes/pages/browser-chat.js +1 -1
  30. package/dist/routes/pages/browser-chat.js.map +1 -1
  31. package/dist/routes/pages/chat.js +2 -2
  32. package/dist/routes/pages/chat.js.map +1 -1
  33. package/dist/server/lib/private-icon-assets.d.ts +7 -0
  34. package/dist/server/lib/private-icon-assets.d.ts.map +1 -0
  35. package/dist/server/lib/private-icon-assets.js +176 -0
  36. package/dist/server/lib/private-icon-assets.js.map +1 -0
  37. package/dist/server/plugins/auth.d.ts.map +1 -1
  38. package/dist/server/plugins/auth.js +6 -1
  39. package/dist/server/plugins/auth.js.map +1 -1
  40. package/dist/server/plugins/core-routes.d.ts.map +1 -1
  41. package/dist/server/plugins/core-routes.js +2 -0
  42. package/dist/server/plugins/core-routes.js.map +1 -1
  43. package/package.json +3 -3
  44. package/src/components/app-open-actions.tsx +1 -1
  45. package/src/components/app-row-settings.tsx +1 -1
  46. package/src/components/chat-home-apps.tsx +1 -1
  47. package/src/components/deferred-chat-components.tsx +96 -0
  48. package/src/components/layout/Header.tsx +1 -1
  49. package/src/components/layout/Layout.app-chat.spec.ts +7 -0
  50. package/src/components/layout/Layout.spec.tsx +6 -3
  51. package/src/components/layout/Layout.tsx +23 -21
  52. package/src/components/workspace-app-card.tsx +1 -1
  53. package/src/components/workspace-app-chat-rail.spec.tsx +5 -2
  54. package/src/components/workspace-app-host.spec.tsx +5 -9
  55. package/src/components/workspace-app-host.tsx +4 -6
  56. package/src/lib/workspace-apps.ts +1 -1
  57. package/src/routes/pages/browser-chat.spec.tsx +1 -1
  58. package/src/routes/pages/browser-chat.tsx +1 -1
  59. package/src/routes/pages/chat.spec.tsx +4 -1
  60. package/src/routes/pages/chat.tsx +2 -2
  61. package/src/server/lib/private-icon-assets.spec.ts +498 -0
  62. package/src/server/lib/private-icon-assets.ts +244 -0
  63. package/src/server/plugins/auth.spec.ts +1 -1
  64. package/src/server/plugins/auth.ts +6 -1
  65. package/src/server/plugins/core-routes.private-icons.spec.ts +36 -0
  66. package/src/server/plugins/core-routes.ts +5 -0
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-apps.js","sourceRoot":"","sources":["../../src/lib/workspace-apps.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getClientSurface,\n isInBuilderFrame,\n} from \"@agent-native/core/client/host\";\nimport {\n normalizeWorkspaceAppHomePath,\n resolveEnvironmentTargets,\n withBuilderUtmTrackingParams,\n} from \"@agent-native/core/shared\";\nimport { CHAT_FIRST_DEFAULT_APP_IDS } from \"@agent-native/toolkit/app/chat/chat-first\";\n\nimport {\n CANONICAL_WORKSPACE_SSO_APP_ORIGINS,\n isWorkspaceSsoAppUrl,\n} from \"../shared/workspace-sso\";\n\nexport interface WorkspaceAppSummary {\n id: string;\n name: string;\n description?: string;\n defaultDescriptionKey?: string;\n path: string;\n homePath?: string;\n url?: string | null;\n isDispatch?: boolean;\n audience?: \"internal\" | \"public\";\n visibility?: \"private\" | \"org\";\n publicPaths?: string[];\n protectedPaths?: string[];\n status?: \"ready\" | \"pending\";\n statusLabel?: string;\n builderUrl?: string | null;\n branchName?: string | null;\n createdAt?: string | null;\n createdBy?: string | null;\n owner?: string | null;\n teams?: string[];\n agentCardUrl?: string | null;\n agentCardReachable?: boolean;\n a2aEndpointUrl?: string | null;\n agentName?: string | null;\n agentSkillsCount?: number | null;\n archived?: boolean;\n workspaceSso?: boolean;\n source?: WorkspaceAppSource;\n}\n\nexport type WorkspaceAppSource = \"workspace\" | \"builtin\" | \"connected\";\n\n/** Maps list-connected-agents' `source` onto the sidebar grouping. */\nexport function workspaceAppSourceFromConnected(\n source: string | undefined,\n): WorkspaceAppSource {\n if (source === \"builtin\") return \"builtin\";\n if (source === \"custom\") return \"connected\";\n return \"workspace\";\n}\n\ninterface WorkspaceAppHrefSource {\n path?: string | null;\n url?: string | null;\n workspaceSso?: boolean;\n}\n\nexport function isDispatchWorkspaceAppId(appId: string): boolean {\n return appId.trim().toLowerCase() === \"dispatch\";\n}\n\nfunction clientRuntimeEnvironment(): \"production\" | \"development\" {\n const importMetaEnv = (\n import.meta as unknown as {\n env?: Record<string, string | boolean | undefined>;\n }\n ).env;\n const processEnv = (\n globalThis as typeof globalThis & {\n process?: { env?: Record<string, string | boolean | undefined> };\n }\n ).process?.env;\n const env = { ...processEnv, ...importMetaEnv };\n if (\n env.PROD === true ||\n env.MODE === \"production\" ||\n env.NODE_ENV === \"production\"\n ) {\n return \"production\";\n }\n if (\n env.DEV === true ||\n env.MODE === \"development\" ||\n env.MODE === \"test\" ||\n env.NODE_ENV === \"development\" ||\n env.NODE_ENV === \"test\"\n ) {\n return \"development\";\n }\n return \"production\";\n}\n\nfunction clientEnvironmentLane(): \"production\" | \"beta\" {\n if (typeof window === \"undefined\") return \"production\";\n const hostname = window.location.hostname\n .trim()\n .toLowerCase()\n .replace(/\\.$/, \"\");\n const targets = resolveEnvironmentTargets(hostname);\n return targets?.betaHost === hostname ? \"beta\" : \"production\";\n}\n\nexport function isWorkspaceSsoApp(\n app: WorkspaceAppHrefSource & { id: string },\n): boolean {\n const rawUrl = app.url?.trim();\n if (!rawUrl) return false;\n try {\n const url = new URL(rawUrl);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return false;\n if (app.workspaceSso === true) return true;\n return isWorkspaceSsoAppUrl(\n { id: app.id, url: rawUrl },\n {\n nodeEnv: clientRuntimeEnvironment(),\n environmentLane: clientEnvironmentLane(),\n },\n );\n // coercion-ok: malformed app metadata is not eligible for workspace SSO.\n } catch {\n return false;\n }\n}\n\nfunction isCanonicalWorkspaceSsoOrigin(rawUrl: string): boolean {\n try {\n const origin = new URL(rawUrl).origin;\n return Object.values(CANONICAL_WORKSPACE_SSO_APP_ORIGINS).some(\n (canonicalOrigin) => canonicalOrigin === origin,\n );\n } catch {\n // coercion-ok: malformed app metadata is not a canonical first-party app.\n return false;\n }\n}\n\nexport function isPathMountedWorkspaceApp(\n app: WorkspaceAppHrefSource,\n): boolean {\n const rawUrl = app.url?.trim();\n if (rawUrl) {\n try {\n const pathname = new URL(rawUrl).pathname.replace(/\\/+$/, \"\") || \"/\";\n return pathname !== \"/\" || !isCanonicalWorkspaceSsoOrigin(rawUrl);\n // coercion-ok: invalid absolute URLs use the mounted path fallback.\n } catch {\n // Fall through to the mounted path for relative manifest values.\n }\n }\n const path = app.path?.trim().replace(/\\/+$/, \"\") || \"/\";\n return path !== \"/\";\n}\n\nexport function isDefaultWorkspaceAppHiddenId(appId: string): boolean {\n const normalized = appId.trim().toLowerCase();\n return normalized === \"chat\" || isDispatchWorkspaceAppId(normalized);\n}\n\nexport function isWorkspaceAppVisibleInDefaultLaunchers(\n app: Pick<WorkspaceAppSummary, \"id\" | \"isDispatch\">,\n): boolean {\n return !app.isDispatch && !isDefaultWorkspaceAppHiddenId(app.id);\n}\n\nconst DEFAULT_WORKSPACE_APP_DESCRIPTIONS: Record<\n string,\n { text: string; key: string }\n> = {\n calendar: {\n text: \"Agent-Native Google Calendar — manage events, sync, and public booking\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionCalendar\",\n },\n clips: {\n text: \"Screen recording, meeting notes, and voice dictation — all with AI\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionClips\",\n },\n content: {\n text: \"Open-source Obsidian for MDX — edit local docs with agent assistance\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionContent\",\n },\n design: {\n text: \"Agent-Native design tool — create and edit visual designs with agent assistance\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionDesign\",\n },\n mail: {\n text: \"Agent-Native Superhuman — email client with keyboard shortcuts and AI triage\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionMail\",\n },\n};\n\nfunction defaultWorkspaceAppUrl(rawUrl: string): string {\n if (typeof window === \"undefined\") return rawUrl;\n\n const hostname = window.location.hostname\n .trim()\n .toLowerCase()\n .replace(/\\.$/, \"\");\n const requestTargets = resolveEnvironmentTargets(hostname);\n if (!requestTargets || requestTargets.betaHost !== hostname) return rawUrl;\n\n try {\n const url = new URL(rawUrl);\n const appTargets = resolveEnvironmentTargets(url.hostname);\n if (!appTargets) return rawUrl;\n url.protocol = \"https:\";\n url.hostname = appTargets.betaHost;\n url.port = \"\";\n return url.toString();\n } catch {\n // coercion-ok: malformed default metadata remains an absent navigation target.\n return rawUrl;\n }\n}\n\nexport function workspaceAppRoute(appId: string): string {\n return `/apps/${encodeURIComponent(appId)}`;\n}\n\nfunction normalizeWorkspaceAppRoutePath(rawPath: string): URL | null {\n if (\n typeof rawPath !== \"string\" ||\n !rawPath.startsWith(\"/\") ||\n rawPath.startsWith(\"//\") ||\n /[\\u0000-\\u001f\\u007f]/.test(rawPath)\n ) {\n return null;\n }\n\n try {\n return new URL(rawPath, \"https://agent-native.invalid\");\n } catch {\n // coercion-ok: malformed child routes are ignored by the host.\n return null;\n }\n}\n\nfunction normalizedWorkspaceAppMountPath(rawPath: string): string {\n const pathname = rawPath.split(/[?#]/, 1)[0] ?? rawPath;\n const normalized = `/${pathname.replace(/^[/\\\\]+/, \"\")}`;\n return normalized.replace(/\\/+$/, \"\") || \"/\";\n}\n\nfunction workspaceAppMountPath(\n app: Pick<WorkspaceAppSummary, \"path\" | \"url\">,\n): string {\n const rawUrl = app.url?.trim();\n if (rawUrl) {\n try {\n const parsed = new URL(rawUrl);\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n return normalizedWorkspaceAppMountPath(parsed.pathname);\n }\n // coercion-ok: invalid URL falls back to app path.\n } catch {\n // Fall through to the mounted path when optional URL metadata is invalid.\n }\n }\n return normalizedWorkspaceAppMountPath(app.path?.trim() || \"/\");\n}\n\nexport function workspaceAppRouteForChildPath(\n app: Pick<WorkspaceAppSummary, \"id\" | \"path\" | \"url\">,\n childPath: string,\n): string | null {\n const parsed = normalizeWorkspaceAppRoutePath(childPath);\n if (!parsed) return null;\n\n const mountPath = workspaceAppMountPath(app);\n const relativePathname =\n mountPath !== \"/\" &&\n (parsed.pathname === mountPath ||\n parsed.pathname.startsWith(`${mountPath}/`))\n ? parsed.pathname.slice(mountPath.length) || \"/\"\n : parsed.pathname;\n const routePath = workspaceAppRoute(app.id);\n const suffix = relativePathname === \"/\" ? \"\" : relativePathname;\n return `${routePath}${suffix}${parsed.search}${parsed.hash}`;\n}\n\nexport function workspaceAppInitialPathFromSplat(\n routeSplat: string | undefined,\n search: string,\n hash: string,\n): string | undefined {\n const pathname = routeSplat?.trim()\n ? `/${routeSplat.trim().replace(/^[/\\\\]+/, \"\")}`\n : \"/\";\n const parsed = normalizeWorkspaceAppRoutePath(`${pathname}${search}${hash}`);\n if (!parsed) return undefined;\n const path = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return path === \"/\" ? undefined : path;\n}\n\nexport function workspaceAppIdFromRoute(pathname: string): string | null {\n const match = pathname.match(/^\\/apps\\/([^/]+)(?:\\/|$)/);\n if (!match) return null;\n try {\n const appId = decodeURIComponent(match[1]).trim();\n return appId || null;\n } catch {\n // coercion-ok: malformed app routes are inactive, not app ids.\n return null;\n }\n}\n\nexport function workspaceAppHref(app: WorkspaceAppSummary): string | null {\n if (app.status === \"pending\") {\n return app.builderUrl\n ? withBuilderUtmTrackingParams(app.builderUrl, {\n campaign: \"product\",\n content: \"dispatch_branch\",\n })\n : null;\n }\n const base = app.path || app.url || null;\n if (!base || app.isDispatch) return base;\n return workspaceAppDirectHref(app, workspaceAppTargetPath(app));\n}\n\nexport function workspaceAppTargetPath(app: {\n homePath?: string | null;\n url?: string | null;\n}): string {\n if (typeof app.homePath === \"string\") {\n return normalizeWorkspaceAppHomePath(app.homePath);\n }\n\n const rawUrl = app.url?.trim();\n if (rawUrl) {\n try {\n const url = new URL(rawUrl);\n if (\n (url.protocol === \"http:\" || url.protocol === \"https:\") &&\n url.pathname !== \"/\"\n ) {\n return \"/\";\n }\n } catch {\n // coercion-ok: invalid app URLs use the default app home path.\n }\n }\n\n return normalizeWorkspaceAppHomePath(undefined);\n}\n\nexport function workspaceAppDirectLaunchHref(app: {\n path?: string | null;\n url?: string | null;\n homePath?: string | null;\n}): string | null {\n if (app.path?.trim()) return null;\n return workspaceAppDirectHref(app, workspaceAppTargetPath(app));\n}\n\nexport function workspaceAppEmbedTarget(\n app: Pick<WorkspaceAppSummary, \"path\" | \"url\">,\n): { path?: string; url?: string } {\n const url = app.url?.trim();\n if (url) return { url };\n\n const path = app.path.trim();\n return path.startsWith(\"/\") ? { path } : path ? { url: path } : {};\n}\n\nexport function workspaceAppDirectHref(\n app: WorkspaceAppHrefSource,\n targetPath: string,\n): string | null {\n const target = targetPath.trim();\n if (!target || !target.startsWith(\"/\") || target.startsWith(\"//\")) {\n return null;\n }\n\n let targetUrl: URL;\n try {\n targetUrl = new URL(target, \"https://agent-native.invalid\");\n } catch {\n // coercion-ok: invalid relative target input has no safe href.\n return null;\n }\n const targetPathname = targetUrl.pathname || \"/\";\n\n let absoluteBase: URL | null = null;\n const rawUrl = app.url?.trim();\n if (rawUrl) {\n try {\n const parsedBase = new URL(rawUrl);\n if (parsedBase.protocol === \"http:\" || parsedBase.protocol === \"https:\") {\n absoluteBase = parsedBase;\n }\n // coercion-ok: invalid app URLs use the mounted path fallback below.\n } catch {\n absoluteBase = null;\n }\n }\n\n const mountedPath = app.path?.trim();\n const basePath = absoluteBase\n ? absoluteBase.pathname\n : mountedPath\n ? `/${mountedPath.replace(/^[/\\\\]+/, \"\").split(/[?#]/, 1)[0]}`\n : null;\n if (!basePath) return null;\n\n const normalizedBasePath = basePath.replace(/\\/+$/, \"\") || \"/\";\n const targetIsMountedPath =\n normalizedBasePath !== \"/\" &&\n (targetPathname === normalizedBasePath ||\n targetPathname.startsWith(`${normalizedBasePath}/`));\n const resolvedPath = targetIsMountedPath\n ? targetPathname\n : normalizedBasePath === \"/\"\n ? targetPathname\n : targetPathname === \"/\"\n ? normalizedBasePath\n : `${normalizedBasePath}/${targetPathname.replace(/^\\/+/, \"\")}`;\n\n if (absoluteBase) {\n absoluteBase.pathname = resolvedPath;\n if (target.includes(\"?\")) absoluteBase.search = targetUrl.search;\n if (target.includes(\"#\")) absoluteBase.hash = targetUrl.hash;\n return absoluteBase.toString();\n }\n\n return `${resolvedPath}${targetUrl.search}${targetUrl.hash}`;\n}\n\nexport function isPendingBuilderHref(app: WorkspaceAppSummary): boolean {\n return app.status === \"pending\" && !!app.builderUrl;\n}\n\nexport function shouldOpenWorkspaceAppInTopWindow(): boolean {\n if (typeof window === \"undefined\") return false;\n return isInBuilderFrame() || getClientSurface() !== \"web\";\n}\n\nexport function navigateToWorkspaceApp(href: string): boolean {\n if (typeof window === \"undefined\") return false;\n\n try {\n const targetUrl = new URL(href, window.location.href);\n if (targetUrl.protocol !== \"http:\" && targetUrl.protocol !== \"https:\") {\n return false;\n }\n const targetWindow =\n shouldOpenWorkspaceAppInTopWindow() && window.top ? window.top : window;\n targetWindow.location.href = targetUrl.href;\n return true;\n } catch {\n // coercion-ok: a blocked top-window assignment is an expected fallback signal.\n return false;\n }\n}\n\n/**\n * Mounted workspace apps plus the chat-first default built-ins that are part\n * of this workspace. `enabledBuiltinAppIds` must come from the server\n * (list-connected-agents entries with source \"builtin\"), which already applies\n * the builder's `agent-native.builtinAgents` config. While it is unknown, no\n * default is added. `extraApps` are appended only when no entry has that id.\n */\nexport function mergeChatFirstWorkspaceApps(\n apps: readonly WorkspaceAppSummary[] | undefined,\n enabledBuiltinAppIds: readonly string[] | undefined,\n extraApps: readonly {\n id: string;\n name: string;\n description?: string | null;\n url?: string | null;\n source?: WorkspaceAppSource;\n }[] = [],\n): WorkspaceAppSummary[] {\n const enabledBuiltins = new Set(\n (enabledBuiltinAppIds ?? []).map((id) => id.trim().toLowerCase()),\n );\n const merged = new Map<string, WorkspaceAppSummary>();\n for (const id of CHAT_FIRST_DEFAULT_APP_IDS) {\n if (!enabledBuiltins.has(id)) continue;\n const fallback = DEFAULT_WORKSPACE_APP_DESCRIPTIONS[id];\n merged.set(id, {\n id,\n name: id.charAt(0).toUpperCase() + id.slice(1),\n description: fallback?.text,\n defaultDescriptionKey: fallback?.key,\n path: \"/\",\n url: defaultWorkspaceAppUrl(CANONICAL_WORKSPACE_SSO_APP_ORIGINS[id]),\n status: \"ready\",\n source: \"builtin\",\n });\n }\n for (const app of apps ?? []) {\n const id = app.id.trim().toLowerCase();\n const fallback = DEFAULT_WORKSPACE_APP_DESCRIPTIONS[id];\n merged.set(id, {\n ...app,\n id,\n source: app.source ?? \"workspace\",\n description: app.description ?? fallback?.text,\n defaultDescriptionKey:\n app.description === undefined ||\n app.description === null ||\n app.description === fallback?.text\n ? fallback?.key\n : undefined,\n });\n }\n\n const existingIds = new Set(\n [...merged.values()].map((app) => app.id.trim().toLowerCase()),\n );\n for (const app of extraApps) {\n const id = app.id.trim().toLowerCase();\n if (!id || existingIds.has(id)) continue;\n existingIds.add(id);\n merged.set(id, {\n id,\n name: app.name.trim() || id,\n description: app.description ?? undefined,\n path: \"\",\n url: app.url?.trim() || null,\n status: \"ready\",\n source: app.source ?? \"connected\",\n });\n }\n\n return [...merged.values()];\n}\n"]}
1
+ {"version":3,"file":"workspace-apps.js","sourceRoot":"","sources":["../../src/lib/workspace-apps.ts"],"names":[],"mappings":"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","sourcesContent":["import { CHAT_FIRST_DEFAULT_APP_IDS } from \"@agent-native/core/client/chat-first-state\";\nimport {\n getClientSurface,\n isInBuilderFrame,\n} from \"@agent-native/core/client/host\";\nimport {\n normalizeWorkspaceAppHomePath,\n resolveEnvironmentTargets,\n withBuilderUtmTrackingParams,\n} from \"@agent-native/core/shared\";\n\nimport {\n CANONICAL_WORKSPACE_SSO_APP_ORIGINS,\n isWorkspaceSsoAppUrl,\n} from \"../shared/workspace-sso\";\n\nexport interface WorkspaceAppSummary {\n id: string;\n name: string;\n description?: string;\n defaultDescriptionKey?: string;\n path: string;\n homePath?: string;\n url?: string | null;\n isDispatch?: boolean;\n audience?: \"internal\" | \"public\";\n visibility?: \"private\" | \"org\";\n publicPaths?: string[];\n protectedPaths?: string[];\n status?: \"ready\" | \"pending\";\n statusLabel?: string;\n builderUrl?: string | null;\n branchName?: string | null;\n createdAt?: string | null;\n createdBy?: string | null;\n owner?: string | null;\n teams?: string[];\n agentCardUrl?: string | null;\n agentCardReachable?: boolean;\n a2aEndpointUrl?: string | null;\n agentName?: string | null;\n agentSkillsCount?: number | null;\n archived?: boolean;\n workspaceSso?: boolean;\n source?: WorkspaceAppSource;\n}\n\nexport type WorkspaceAppSource = \"workspace\" | \"builtin\" | \"connected\";\n\n/** Maps list-connected-agents' `source` onto the sidebar grouping. */\nexport function workspaceAppSourceFromConnected(\n source: string | undefined,\n): WorkspaceAppSource {\n if (source === \"builtin\") return \"builtin\";\n if (source === \"custom\") return \"connected\";\n return \"workspace\";\n}\n\ninterface WorkspaceAppHrefSource {\n path?: string | null;\n url?: string | null;\n workspaceSso?: boolean;\n}\n\nexport function isDispatchWorkspaceAppId(appId: string): boolean {\n return appId.trim().toLowerCase() === \"dispatch\";\n}\n\nfunction clientRuntimeEnvironment(): \"production\" | \"development\" {\n const importMetaEnv = (\n import.meta as unknown as {\n env?: Record<string, string | boolean | undefined>;\n }\n ).env;\n const processEnv = (\n globalThis as typeof globalThis & {\n process?: { env?: Record<string, string | boolean | undefined> };\n }\n ).process?.env;\n const env = { ...processEnv, ...importMetaEnv };\n if (\n env.PROD === true ||\n env.MODE === \"production\" ||\n env.NODE_ENV === \"production\"\n ) {\n return \"production\";\n }\n if (\n env.DEV === true ||\n env.MODE === \"development\" ||\n env.MODE === \"test\" ||\n env.NODE_ENV === \"development\" ||\n env.NODE_ENV === \"test\"\n ) {\n return \"development\";\n }\n return \"production\";\n}\n\nfunction clientEnvironmentLane(): \"production\" | \"beta\" {\n if (typeof window === \"undefined\") return \"production\";\n const hostname = window.location.hostname\n .trim()\n .toLowerCase()\n .replace(/\\.$/, \"\");\n const targets = resolveEnvironmentTargets(hostname);\n return targets?.betaHost === hostname ? \"beta\" : \"production\";\n}\n\nexport function isWorkspaceSsoApp(\n app: WorkspaceAppHrefSource & { id: string },\n): boolean {\n const rawUrl = app.url?.trim();\n if (!rawUrl) return false;\n try {\n const url = new URL(rawUrl);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return false;\n if (app.workspaceSso === true) return true;\n return isWorkspaceSsoAppUrl(\n { id: app.id, url: rawUrl },\n {\n nodeEnv: clientRuntimeEnvironment(),\n environmentLane: clientEnvironmentLane(),\n },\n );\n // coercion-ok: malformed app metadata is not eligible for workspace SSO.\n } catch {\n return false;\n }\n}\n\nfunction isCanonicalWorkspaceSsoOrigin(rawUrl: string): boolean {\n try {\n const origin = new URL(rawUrl).origin;\n return Object.values(CANONICAL_WORKSPACE_SSO_APP_ORIGINS).some(\n (canonicalOrigin) => canonicalOrigin === origin,\n );\n } catch {\n // coercion-ok: malformed app metadata is not a canonical first-party app.\n return false;\n }\n}\n\nexport function isPathMountedWorkspaceApp(\n app: WorkspaceAppHrefSource,\n): boolean {\n const rawUrl = app.url?.trim();\n if (rawUrl) {\n try {\n const pathname = new URL(rawUrl).pathname.replace(/\\/+$/, \"\") || \"/\";\n return pathname !== \"/\" || !isCanonicalWorkspaceSsoOrigin(rawUrl);\n // coercion-ok: invalid absolute URLs use the mounted path fallback.\n } catch {\n // Fall through to the mounted path for relative manifest values.\n }\n }\n const path = app.path?.trim().replace(/\\/+$/, \"\") || \"/\";\n return path !== \"/\";\n}\n\nexport function isDefaultWorkspaceAppHiddenId(appId: string): boolean {\n const normalized = appId.trim().toLowerCase();\n return normalized === \"chat\" || isDispatchWorkspaceAppId(normalized);\n}\n\nexport function isWorkspaceAppVisibleInDefaultLaunchers(\n app: Pick<WorkspaceAppSummary, \"id\" | \"isDispatch\">,\n): boolean {\n return !app.isDispatch && !isDefaultWorkspaceAppHiddenId(app.id);\n}\n\nconst DEFAULT_WORKSPACE_APP_DESCRIPTIONS: Record<\n string,\n { text: string; key: string }\n> = {\n calendar: {\n text: \"Agent-Native Google Calendar — manage events, sync, and public booking\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionCalendar\",\n },\n clips: {\n text: \"Screen recording, meeting notes, and voice dictation — all with AI\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionClips\",\n },\n content: {\n text: \"Open-source Obsidian for MDX — edit local docs with agent assistance\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionContent\",\n },\n design: {\n text: \"Agent-Native design tool — create and edit visual designs with agent assistance\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionDesign\",\n },\n mail: {\n text: \"Agent-Native Superhuman — email client with keyboard shortcuts and AI triage\",\n key: \"dispatch.pages.chatFirstDefaultDescriptionMail\",\n },\n};\n\nfunction defaultWorkspaceAppUrl(rawUrl: string): string {\n if (typeof window === \"undefined\") return rawUrl;\n\n const hostname = window.location.hostname\n .trim()\n .toLowerCase()\n .replace(/\\.$/, \"\");\n const requestTargets = resolveEnvironmentTargets(hostname);\n if (!requestTargets || requestTargets.betaHost !== hostname) return rawUrl;\n\n try {\n const url = new URL(rawUrl);\n const appTargets = resolveEnvironmentTargets(url.hostname);\n if (!appTargets) return rawUrl;\n url.protocol = \"https:\";\n url.hostname = appTargets.betaHost;\n url.port = \"\";\n return url.toString();\n } catch {\n // coercion-ok: malformed default metadata remains an absent navigation target.\n return rawUrl;\n }\n}\n\nexport function workspaceAppRoute(appId: string): string {\n return `/apps/${encodeURIComponent(appId)}`;\n}\n\nfunction normalizeWorkspaceAppRoutePath(rawPath: string): URL | null {\n if (\n typeof rawPath !== \"string\" ||\n !rawPath.startsWith(\"/\") ||\n rawPath.startsWith(\"//\") ||\n /[\\u0000-\\u001f\\u007f]/.test(rawPath)\n ) {\n return null;\n }\n\n try {\n return new URL(rawPath, \"https://agent-native.invalid\");\n } catch {\n // coercion-ok: malformed child routes are ignored by the host.\n return null;\n }\n}\n\nfunction normalizedWorkspaceAppMountPath(rawPath: string): string {\n const pathname = rawPath.split(/[?#]/, 1)[0] ?? rawPath;\n const normalized = `/${pathname.replace(/^[/\\\\]+/, \"\")}`;\n return normalized.replace(/\\/+$/, \"\") || \"/\";\n}\n\nfunction workspaceAppMountPath(\n app: Pick<WorkspaceAppSummary, \"path\" | \"url\">,\n): string {\n const rawUrl = app.url?.trim();\n if (rawUrl) {\n try {\n const parsed = new URL(rawUrl);\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n return normalizedWorkspaceAppMountPath(parsed.pathname);\n }\n // coercion-ok: invalid URL falls back to app path.\n } catch {\n // Fall through to the mounted path when optional URL metadata is invalid.\n }\n }\n return normalizedWorkspaceAppMountPath(app.path?.trim() || \"/\");\n}\n\nexport function workspaceAppRouteForChildPath(\n app: Pick<WorkspaceAppSummary, \"id\" | \"path\" | \"url\">,\n childPath: string,\n): string | null {\n const parsed = normalizeWorkspaceAppRoutePath(childPath);\n if (!parsed) return null;\n\n const mountPath = workspaceAppMountPath(app);\n const relativePathname =\n mountPath !== \"/\" &&\n (parsed.pathname === mountPath ||\n parsed.pathname.startsWith(`${mountPath}/`))\n ? parsed.pathname.slice(mountPath.length) || \"/\"\n : parsed.pathname;\n const routePath = workspaceAppRoute(app.id);\n const suffix = relativePathname === \"/\" ? \"\" : relativePathname;\n return `${routePath}${suffix}${parsed.search}${parsed.hash}`;\n}\n\nexport function workspaceAppInitialPathFromSplat(\n routeSplat: string | undefined,\n search: string,\n hash: string,\n): string | undefined {\n const pathname = routeSplat?.trim()\n ? `/${routeSplat.trim().replace(/^[/\\\\]+/, \"\")}`\n : \"/\";\n const parsed = normalizeWorkspaceAppRoutePath(`${pathname}${search}${hash}`);\n if (!parsed) return undefined;\n const path = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return path === \"/\" ? undefined : path;\n}\n\nexport function workspaceAppIdFromRoute(pathname: string): string | null {\n const match = pathname.match(/^\\/apps\\/([^/]+)(?:\\/|$)/);\n if (!match) return null;\n try {\n const appId = decodeURIComponent(match[1]).trim();\n return appId || null;\n } catch {\n // coercion-ok: malformed app routes are inactive, not app ids.\n return null;\n }\n}\n\nexport function workspaceAppHref(app: WorkspaceAppSummary): string | null {\n if (app.status === \"pending\") {\n return app.builderUrl\n ? withBuilderUtmTrackingParams(app.builderUrl, {\n campaign: \"product\",\n content: \"dispatch_branch\",\n })\n : null;\n }\n const base = app.path || app.url || null;\n if (!base || app.isDispatch) return base;\n return workspaceAppDirectHref(app, workspaceAppTargetPath(app));\n}\n\nexport function workspaceAppTargetPath(app: {\n homePath?: string | null;\n url?: string | null;\n}): string {\n if (typeof app.homePath === \"string\") {\n return normalizeWorkspaceAppHomePath(app.homePath);\n }\n\n const rawUrl = app.url?.trim();\n if (rawUrl) {\n try {\n const url = new URL(rawUrl);\n if (\n (url.protocol === \"http:\" || url.protocol === \"https:\") &&\n url.pathname !== \"/\"\n ) {\n return \"/\";\n }\n } catch {\n // coercion-ok: invalid app URLs use the default app home path.\n }\n }\n\n return normalizeWorkspaceAppHomePath(undefined);\n}\n\nexport function workspaceAppDirectLaunchHref(app: {\n path?: string | null;\n url?: string | null;\n homePath?: string | null;\n}): string | null {\n if (app.path?.trim()) return null;\n return workspaceAppDirectHref(app, workspaceAppTargetPath(app));\n}\n\nexport function workspaceAppEmbedTarget(\n app: Pick<WorkspaceAppSummary, \"path\" | \"url\">,\n): { path?: string; url?: string } {\n const url = app.url?.trim();\n if (url) return { url };\n\n const path = app.path.trim();\n return path.startsWith(\"/\") ? { path } : path ? { url: path } : {};\n}\n\nexport function workspaceAppDirectHref(\n app: WorkspaceAppHrefSource,\n targetPath: string,\n): string | null {\n const target = targetPath.trim();\n if (!target || !target.startsWith(\"/\") || target.startsWith(\"//\")) {\n return null;\n }\n\n let targetUrl: URL;\n try {\n targetUrl = new URL(target, \"https://agent-native.invalid\");\n } catch {\n // coercion-ok: invalid relative target input has no safe href.\n return null;\n }\n const targetPathname = targetUrl.pathname || \"/\";\n\n let absoluteBase: URL | null = null;\n const rawUrl = app.url?.trim();\n if (rawUrl) {\n try {\n const parsedBase = new URL(rawUrl);\n if (parsedBase.protocol === \"http:\" || parsedBase.protocol === \"https:\") {\n absoluteBase = parsedBase;\n }\n // coercion-ok: invalid app URLs use the mounted path fallback below.\n } catch {\n absoluteBase = null;\n }\n }\n\n const mountedPath = app.path?.trim();\n const basePath = absoluteBase\n ? absoluteBase.pathname\n : mountedPath\n ? `/${mountedPath.replace(/^[/\\\\]+/, \"\").split(/[?#]/, 1)[0]}`\n : null;\n if (!basePath) return null;\n\n const normalizedBasePath = basePath.replace(/\\/+$/, \"\") || \"/\";\n const targetIsMountedPath =\n normalizedBasePath !== \"/\" &&\n (targetPathname === normalizedBasePath ||\n targetPathname.startsWith(`${normalizedBasePath}/`));\n const resolvedPath = targetIsMountedPath\n ? targetPathname\n : normalizedBasePath === \"/\"\n ? targetPathname\n : targetPathname === \"/\"\n ? normalizedBasePath\n : `${normalizedBasePath}/${targetPathname.replace(/^\\/+/, \"\")}`;\n\n if (absoluteBase) {\n absoluteBase.pathname = resolvedPath;\n if (target.includes(\"?\")) absoluteBase.search = targetUrl.search;\n if (target.includes(\"#\")) absoluteBase.hash = targetUrl.hash;\n return absoluteBase.toString();\n }\n\n return `${resolvedPath}${targetUrl.search}${targetUrl.hash}`;\n}\n\nexport function isPendingBuilderHref(app: WorkspaceAppSummary): boolean {\n return app.status === \"pending\" && !!app.builderUrl;\n}\n\nexport function shouldOpenWorkspaceAppInTopWindow(): boolean {\n if (typeof window === \"undefined\") return false;\n return isInBuilderFrame() || getClientSurface() !== \"web\";\n}\n\nexport function navigateToWorkspaceApp(href: string): boolean {\n if (typeof window === \"undefined\") return false;\n\n try {\n const targetUrl = new URL(href, window.location.href);\n if (targetUrl.protocol !== \"http:\" && targetUrl.protocol !== \"https:\") {\n return false;\n }\n const targetWindow =\n shouldOpenWorkspaceAppInTopWindow() && window.top ? window.top : window;\n targetWindow.location.href = targetUrl.href;\n return true;\n } catch {\n // coercion-ok: a blocked top-window assignment is an expected fallback signal.\n return false;\n }\n}\n\n/**\n * Mounted workspace apps plus the chat-first default built-ins that are part\n * of this workspace. `enabledBuiltinAppIds` must come from the server\n * (list-connected-agents entries with source \"builtin\"), which already applies\n * the builder's `agent-native.builtinAgents` config. While it is unknown, no\n * default is added. `extraApps` are appended only when no entry has that id.\n */\nexport function mergeChatFirstWorkspaceApps(\n apps: readonly WorkspaceAppSummary[] | undefined,\n enabledBuiltinAppIds: readonly string[] | undefined,\n extraApps: readonly {\n id: string;\n name: string;\n description?: string | null;\n url?: string | null;\n source?: WorkspaceAppSource;\n }[] = [],\n): WorkspaceAppSummary[] {\n const enabledBuiltins = new Set(\n (enabledBuiltinAppIds ?? []).map((id) => id.trim().toLowerCase()),\n );\n const merged = new Map<string, WorkspaceAppSummary>();\n for (const id of CHAT_FIRST_DEFAULT_APP_IDS) {\n if (!enabledBuiltins.has(id)) continue;\n const fallback = DEFAULT_WORKSPACE_APP_DESCRIPTIONS[id];\n merged.set(id, {\n id,\n name: id.charAt(0).toUpperCase() + id.slice(1),\n description: fallback?.text,\n defaultDescriptionKey: fallback?.key,\n path: \"/\",\n url: defaultWorkspaceAppUrl(CANONICAL_WORKSPACE_SSO_APP_ORIGINS[id]),\n status: \"ready\",\n source: \"builtin\",\n });\n }\n for (const app of apps ?? []) {\n const id = app.id.trim().toLowerCase();\n const fallback = DEFAULT_WORKSPACE_APP_DESCRIPTIONS[id];\n merged.set(id, {\n ...app,\n id,\n source: app.source ?? \"workspace\",\n description: app.description ?? fallback?.text,\n defaultDescriptionKey:\n app.description === undefined ||\n app.description === null ||\n app.description === fallback?.text\n ? fallback?.key\n : undefined,\n });\n }\n\n const existingIds = new Set(\n [...merged.values()].map((app) => app.id.trim().toLowerCase()),\n );\n for (const app of extraApps) {\n const id = app.id.trim().toLowerCase();\n if (!id || existingIds.has(id)) continue;\n existingIds.add(id);\n merged.set(id, {\n id,\n name: app.name.trim() || id,\n description: app.description ?? undefined,\n path: \"\",\n url: app.url?.trim() || null,\n status: \"ready\",\n source: app.source ?? \"connected\",\n });\n }\n\n return [...merged.values()];\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { isEmbedAuthActive } from "@agent-native/core/client/host";
3
3
  import { useT } from "@agent-native/core/client/i18n";
4
- import { AgentChatSurface } from "@agent-native/toolkit/app/chat";
4
+ import { AgentChatSurface } from "@agent-native/toolkit/app/chat/AgentPanel";
5
5
  import { useEffect, useState } from "react";
6
6
  import { useSearchParams } from "react-router";
7
7
  import { installBrowserChatBridge } from "../../lib/browser-chat-bridge.js";
@@ -1 +1 @@
1
- {"version":3,"file":"browser-chat.js","sourceRoot":"","sources":["../../../src/routes/pages/browser-chat.tsx"],"names":[],"mappings":"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","sourcesContent":["import { isEmbedAuthActive } from \"@agent-native/core/client/host\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { AgentChatSurface } from \"@agent-native/toolkit/app/chat\";\nimport { useEffect, useState } from \"react\";\nimport { useSearchParams } from \"react-router\";\n\nimport { installBrowserChatBridge } from \"../../lib/browser-chat-bridge.js\";\nimport {\n BROWSER_CHAT_NONCE_QUERY_PARAM,\n BROWSER_CHAT_PARENT_ORIGIN_QUERY_PARAM,\n browserChatExtensionOriginSchema,\n browserChatNonceSchema,\n type BrowserChatMessageV1,\n} from \"../../lib/browser-chat-protocol.js\";\n\nexport function meta() {\n return [{ title: \"Dispatch\" }];\n}\n\nexport default function BrowserChatRoute() {\n const t = useT();\n const [searchParams] = useSearchParams();\n const nonce = browserChatNonceSchema.safeParse(\n searchParams.get(BROWSER_CHAT_NONCE_QUERY_PARAM),\n );\n const parentOrigin = browserChatExtensionOriginSchema.safeParse(\n searchParams.get(BROWSER_CHAT_PARENT_ORIGIN_QUERY_PARAM),\n );\n const embedSessionActive = isEmbedAuthActive();\n const [attachedPage, setAttachedPage] = useState<string | null>(null);\n\n useEffect(() => {\n if (!nonce.success || !parentOrigin.success || !embedSessionActive) return;\n return installBrowserChatBridge({\n nonce: nonce.data,\n parentOrigin: parentOrigin.data,\n onAccepted: (message: BrowserChatMessageV1) =>\n setAttachedPage(message.context.page.title),\n });\n }, [\n nonce.data,\n nonce.success,\n parentOrigin.data,\n parentOrigin.success,\n embedSessionActive,\n ]);\n\n if (!nonce.success || !parentOrigin.success || !embedSessionActive) {\n return (\n <main className=\"grid min-h-screen place-items-center bg-background p-6 text-center\">\n <div className=\"max-w-sm\">\n <h1 className=\"text-base font-medium text-foreground\">\n {t(\"dispatch.pages.browserChatUnavailableTitle\")}\n </h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {t(\"dispatch.pages.browserChatUnavailableDescription\")}\n </p>\n </div>\n </main>\n );\n }\n\n return (\n <main className=\"flex h-screen min-h-0 flex-col bg-background\">\n <div className=\"min-h-0 flex-1\">\n <AgentChatSurface\n mode=\"panel\"\n className=\"h-full\"\n defaultMode=\"chat\"\n storageKey=\"dispatch\"\n showHeader={false}\n showTabBar={false}\n dynamicSuggestions={false}\n suggestions={[]}\n emptyStateDisplay=\"hidden\"\n centerComposerWhenEmpty={false}\n composerPlaceholder={\n attachedPage\n ? t(\"dispatch.pages.browserChatAttachedPlaceholder\", {\n page: attachedPage,\n })\n : t(\"dispatch.pages.browserChatPlaceholder\")\n }\n />\n </div>\n </main>\n );\n}\n"]}
1
+ {"version":3,"file":"browser-chat.js","sourceRoot":"","sources":["../../../src/routes/pages/browser-chat.tsx"],"names":[],"mappings":"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","sourcesContent":["import { isEmbedAuthActive } from \"@agent-native/core/client/host\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { AgentChatSurface } from \"@agent-native/toolkit/app/chat/AgentPanel\";\nimport { useEffect, useState } from \"react\";\nimport { useSearchParams } from \"react-router\";\n\nimport { installBrowserChatBridge } from \"../../lib/browser-chat-bridge.js\";\nimport {\n BROWSER_CHAT_NONCE_QUERY_PARAM,\n BROWSER_CHAT_PARENT_ORIGIN_QUERY_PARAM,\n browserChatExtensionOriginSchema,\n browserChatNonceSchema,\n type BrowserChatMessageV1,\n} from \"../../lib/browser-chat-protocol.js\";\n\nexport function meta() {\n return [{ title: \"Dispatch\" }];\n}\n\nexport default function BrowserChatRoute() {\n const t = useT();\n const [searchParams] = useSearchParams();\n const nonce = browserChatNonceSchema.safeParse(\n searchParams.get(BROWSER_CHAT_NONCE_QUERY_PARAM),\n );\n const parentOrigin = browserChatExtensionOriginSchema.safeParse(\n searchParams.get(BROWSER_CHAT_PARENT_ORIGIN_QUERY_PARAM),\n );\n const embedSessionActive = isEmbedAuthActive();\n const [attachedPage, setAttachedPage] = useState<string | null>(null);\n\n useEffect(() => {\n if (!nonce.success || !parentOrigin.success || !embedSessionActive) return;\n return installBrowserChatBridge({\n nonce: nonce.data,\n parentOrigin: parentOrigin.data,\n onAccepted: (message: BrowserChatMessageV1) =>\n setAttachedPage(message.context.page.title),\n });\n }, [\n nonce.data,\n nonce.success,\n parentOrigin.data,\n parentOrigin.success,\n embedSessionActive,\n ]);\n\n if (!nonce.success || !parentOrigin.success || !embedSessionActive) {\n return (\n <main className=\"grid min-h-screen place-items-center bg-background p-6 text-center\">\n <div className=\"max-w-sm\">\n <h1 className=\"text-base font-medium text-foreground\">\n {t(\"dispatch.pages.browserChatUnavailableTitle\")}\n </h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {t(\"dispatch.pages.browserChatUnavailableDescription\")}\n </p>\n </div>\n </main>\n );\n }\n\n return (\n <main className=\"flex h-screen min-h-0 flex-col bg-background\">\n <div className=\"min-h-0 flex-1\">\n <AgentChatSurface\n mode=\"panel\"\n className=\"h-full\"\n defaultMode=\"chat\"\n storageKey=\"dispatch\"\n showHeader={false}\n showTabBar={false}\n dynamicSuggestions={false}\n suggestions={[]}\n emptyStateDisplay=\"hidden\"\n centerComposerWhenEmpty={false}\n composerPlaceholder={\n attachedPage\n ? t(\"dispatch.pages.browserChatAttachedPlaceholder\", {\n page: attachedPage,\n })\n : t(\"dispatch.pages.browserChatPlaceholder\")\n }\n />\n </div>\n </main>\n );\n}\n"]}
@@ -3,7 +3,7 @@ import { insertAgentComposerReference, markAgentChatHomeHandoff, readChatFirstMo
3
3
  import { appBasePath, appPath } from "@agent-native/core/client/api-path";
4
4
  import { useActionQuery } from "@agent-native/core/client/hooks";
5
5
  import { useT } from "@agent-native/core/client/i18n";
6
- import { AgentChatHome, } from "@agent-native/toolkit/app/chat";
6
+ import { AgentChatHome, } from "@agent-native/toolkit/app/chat/AgentChatHome";
7
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
8
  import { useLocation, useNavigate } from "react-router";
9
9
  import { ActionQueryError } from "../../components/action-query-error.js";
@@ -173,7 +173,7 @@ export default function ChatRoute() {
173
173
  if (agentPath && !agent) {
174
174
  return (_jsx("div", { className: "flex h-full min-h-0 items-center justify-center bg-background px-4 text-sm text-muted-foreground", children: "This agent is no longer available." }));
175
175
  }
176
- return (_jsx("div", { className: "flex h-full min-h-0 flex-col bg-background", children: _jsx(AgentChatHome, { className: "flex-1 min-h-0", contentClassName: "max-w-none", surfaceClassName: "dispatch-chat-panel px-4 sm:px-6", chatViewTransition: true, defaultMode: "chat", storageKey: agent ? `dispatch-agent-${agent.id}` : "dispatch", scope: agentScope, threadUrlSync: threadUrlSync, showHeader: false, showTabBar: false, dynamicSuggestions: false, suppressInlineOpenApp: suppressInlineOpenApp, suggestions: agent || routeThreadId || activePrompt?.message
176
+ return (_jsx("div", { className: "flex h-full min-h-0 flex-col bg-background", children: _jsx(AgentChatHome, { className: "flex-1 min-h-0", contentClassName: "max-w-none", surfaceClassName: "dispatch-chat-panel", chatViewTransition: true, defaultMode: "chat", storageKey: agent ? `dispatch-agent-${agent.id}` : "dispatch", scope: agentScope, threadUrlSync: threadUrlSync, showHeader: false, showTabBar: false, dynamicSuggestions: false, suppressInlineOpenApp: suppressInlineOpenApp, suggestions: agent || routeThreadId || activePrompt?.message
177
177
  ? []
178
178
  : [
179
179
  t("dispatch.pages.suggestionWorkspaceHealth"),
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/routes/pages/chat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n insertAgentComposerReference,\n markAgentChatHomeHandoff,\n readChatFirstMode,\n} from \"@agent-native/core/client/agent-chat\";\nimport { appBasePath, appPath } from \"@agent-native/core/client/api-path\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n AgentChatHome,\n type AgentChatHomeProps,\n} from \"@agent-native/toolkit/app/chat\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocation, useNavigate } from \"react-router\";\n\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchChatHomeApps } from \"../../components/chat-home-apps\";\nimport { useDispatchExtensions } from \"../../components/layout/Layout\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport { submitOverviewPrompt } from \"../../lib/overview-chat\";\n\ninterface WorkspaceAgentResource {\n id: string;\n name: string;\n description: string | null;\n path: string;\n content: string;\n scope: \"all\" | \"selected\";\n updatedAt: number;\n}\n\nfunction chatThreadPath(threadId: string | null, agentPath?: string): string {\n const path = threadId ? `/chat/${encodeURIComponent(threadId)}` : \"/chat\";\n return agentPath ? `${path}?agent=${encodeURIComponent(agentPath)}` : path;\n}\n\nfunction stripBasePath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = stripBasePath(pathname).match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nfunction dispatchNavTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\ninterface DispatchThreadUrlSync {\n routeThreadId: string | null;\n getPath: (threadId: string | null) => string;\n navigate: (path: string, options?: { replace?: boolean }) => void;\n}\n\ninterface DispatchChatLocationState {\n dispatchPrompt?: {\n id?: string | number;\n message?: string;\n selectedModel?: string | null;\n selectedEngine?: string | null;\n selectedEffort?: AgentChatHomeProps[\"selectedEffort\"];\n };\n dispatchThread?: {\n id?: string | number;\n threadId?: string;\n };\n}\n\nexport function meta() {\n return [{ title: \"Chat — Dispatch\" }];\n}\n\nexport default function ChatRoute() {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const routeThreadId = threadIdFromPath(location.pathname);\n const agentPath = new URLSearchParams(location.search).get(\"agent\");\n const agentsQuery = useActionQuery<WorkspaceAgentResource[]>(\n \"list-workspace-resources\",\n { kind: \"agent\" },\n { enabled: Boolean(agentPath), staleTime: 30_000 },\n );\n const agent = useMemo(\n () =>\n agentPath\n ? (agentsQuery.data ?? []).find((resource) => {\n const profileId = resource.path\n .replace(/^agents\\//, \"\")\n .replace(/\\.md$/, \"\");\n return (\n resource.path === agentPath ||\n resource.id === agentPath ||\n profileId === agentPath\n );\n })\n : undefined,\n [agentPath, agentsQuery.data],\n );\n const agentScope = useMemo(\n () =>\n agent\n ? {\n type: \"agent\",\n id: agent.id,\n label: agent.name,\n contextKey: `dispatch-agent:${agent.id}`,\n }\n : null,\n [agent],\n );\n const handledStateIds = useRef(new Set<string>());\n const extensions = useDispatchExtensions();\n const suppressInlineOpenApp =\n extensions?.chatFirst === true ||\n readChatFirstMode() ||\n new URLSearchParams(location.search).get(\"chatFirst\") === \"1\";\n\n const navigateThreadUrl = useCallback(\n (path: string, options?: { replace?: boolean }) =>\n navigate(dispatchNavTarget(path), options),\n [navigate],\n );\n const threadUrlSync = useMemo<DispatchThreadUrlSync>(\n () => ({\n routeThreadId: routeThreadId ?? null,\n getPath: (threadId) => chatThreadPath(threadId, agentPath ?? undefined),\n navigate: navigateThreadUrl,\n }),\n [agentPath, routeThreadId, navigateThreadUrl],\n );\n const state = location.state as DispatchChatLocationState | null;\n const prompt = state?.dispatchPrompt;\n const thread = state?.dispatchThread;\n const [pendingOverviewPrompt, setPendingOverviewPrompt] = useState<\n DispatchChatLocationState[\"dispatchPrompt\"] | null\n >(null);\n const activePrompt = prompt?.message ? prompt : pendingOverviewPrompt;\n\n useEffect(() => {\n if (routeThreadId) setPendingOverviewPrompt(null);\n }, [routeThreadId]);\n\n useEffect(() => {\n const message = prompt?.message?.trim();\n const threadId = thread?.threadId?.trim();\n if (!message && !threadId) return;\n\n const stateId = String(\n prompt?.id ?? thread?.id ?? `${message ?? \"\"}:${threadId ?? \"\"}`,\n );\n if (handledStateIds.current.has(stateId)) return;\n handledStateIds.current.add(stateId);\n\n const timer = window.setTimeout(() => {\n if (threadId) {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId },\n }),\n );\n }\n if (message) {\n setPendingOverviewPrompt(prompt ?? null);\n submitOverviewPrompt(message, prompt?.selectedModel, {\n openSidebar: false,\n selectedEngine: prompt?.selectedEngine,\n selectedEffort: prompt?.selectedEffort,\n });\n }\n void navigate(`${location.pathname}${location.search}${location.hash}`, {\n replace: true,\n state: null,\n });\n }, 0);\n\n return () => window.clearTimeout(timer);\n }, [\n location.hash,\n location.pathname,\n location.search,\n navigate,\n prompt?.id,\n prompt?.message,\n prompt?.selectedModel,\n prompt?.selectedEngine,\n prompt?.selectedEffort,\n thread?.id,\n thread?.threadId,\n ]);\n\n useEffect(() => {\n function handleChatRunning(event: Event) {\n const detail = (event as CustomEvent).detail;\n if (detail?.isRunning === true) markAgentChatHomeHandoff(\"dispatch\");\n }\n\n window.addEventListener(\"agentNative.chatRunning\", handleChatRunning);\n return () =>\n window.removeEventListener(\"agentNative.chatRunning\", handleChatRunning);\n }, []);\n\n useEffect(() => {\n if (!agent) return;\n const timer = window.setTimeout(() => {\n insertAgentComposerReference(\n {\n label: agent.name,\n icon: \"agent\",\n source: \"agent:custom\",\n refType: \"custom-agent\",\n refId: agent.id,\n refPath: agent.path,\n slotKey: \"dispatch-agent\",\n slotLabel: \"Agent\",\n },\n { openSidebar: false },\n );\n }, 0);\n return () => window.clearTimeout(timer);\n }, [agent?.id, agent?.name, agent?.path]);\n\n if (agentPath && agentsQuery.isLoading) {\n return (\n <div className=\"flex h-full min-h-0 flex-col gap-4 bg-background px-4 py-6 sm:px-6\">\n <Skeleton className=\"mx-auto h-6 w-48\" />\n <Skeleton className=\"mx-auto h-12 w-full max-w-2xl\" />\n </div>\n );\n }\n\n if (agentPath && agentsQuery.isError) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center bg-background px-4\">\n <ActionQueryError\n error={agentsQuery.error}\n onRetry={() => void agentsQuery.refetch()}\n />\n </div>\n );\n }\n\n if (agentPath && !agent) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center bg-background px-4 text-sm text-muted-foreground\">\n This agent is no longer available.\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\">\n <AgentChatHome\n key={agent ? `agent-${agent.id}` : \"dispatch\"}\n className=\"flex-1 min-h-0\"\n contentClassName=\"max-w-none\"\n surfaceClassName=\"dispatch-chat-panel px-4 sm:px-6\"\n chatViewTransition\n defaultMode=\"chat\"\n storageKey={agent ? `dispatch-agent-${agent.id}` : \"dispatch\"}\n scope={agentScope}\n threadUrlSync={threadUrlSync}\n showHeader={false}\n showTabBar={false}\n dynamicSuggestions={false}\n suppressInlineOpenApp={suppressInlineOpenApp}\n suggestions={\n agent || routeThreadId || activePrompt?.message\n ? []\n : [\n t(\"dispatch.pages.suggestionWorkspaceHealth\"),\n t(\"dispatch.pages.suggestionOnboardingApp\"),\n t(\"dispatch.pages.suggestionAnalyticsAgents\"),\n ]\n }\n emptyStateText={t(\"dispatch.pages.chatAcrossAppsDescription\", {\n defaultValue:\n \"Route work, inspect status, or create something new from one place.\",\n })}\n centerComposerWhenEmpty={!activePrompt?.message && !routeThreadId}\n composerLayoutVariant={\n activePrompt?.message || routeThreadId ? \"default\" : \"hero\"\n }\n composerPlaceholder={\n agent\n ? `Ask ${agent.name}...`\n : t(\"dispatch.pages.chatPromptPlaceholder\", {\n defaultValue: \"Tell Dispatch what you’d like to make happen…\",\n })\n }\n homeIntroSlot={\n agent ? (\n <div className=\"dispatch-chat-intro\">\n <h1>{agent.name}</h1>\n {agent.description ? <p>{agent.description}</p> : null}\n </div>\n ) : !activePrompt?.message && !routeThreadId ? (\n <div className=\"dispatch-chat-intro\">\n <h1>\n {t(\"dispatch.pages.chatHomeTitle\", {\n defaultValue: \"What should we do today?\",\n })}\n </h1>\n </div>\n ) : null\n }\n afterComposerSlot={\n !agent && !prompt?.message && !threadUrlSync.routeThreadId ? (\n <DispatchChatHomeApps />\n ) : null\n }\n />\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/routes/pages/chat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n insertAgentComposerReference,\n markAgentChatHomeHandoff,\n readChatFirstMode,\n} from \"@agent-native/core/client/agent-chat\";\nimport { appBasePath, appPath } from \"@agent-native/core/client/api-path\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n AgentChatHome,\n type AgentChatHomeProps,\n} from \"@agent-native/toolkit/app/chat/AgentChatHome\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocation, useNavigate } from \"react-router\";\n\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchChatHomeApps } from \"../../components/chat-home-apps\";\nimport { useDispatchExtensions } from \"../../components/layout/Layout\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport { submitOverviewPrompt } from \"../../lib/overview-chat\";\n\ninterface WorkspaceAgentResource {\n id: string;\n name: string;\n description: string | null;\n path: string;\n content: string;\n scope: \"all\" | \"selected\";\n updatedAt: number;\n}\n\nfunction chatThreadPath(threadId: string | null, agentPath?: string): string {\n const path = threadId ? `/chat/${encodeURIComponent(threadId)}` : \"/chat\";\n return agentPath ? `${path}?agent=${encodeURIComponent(agentPath)}` : path;\n}\n\nfunction stripBasePath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = stripBasePath(pathname).match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nfunction dispatchNavTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\ninterface DispatchThreadUrlSync {\n routeThreadId: string | null;\n getPath: (threadId: string | null) => string;\n navigate: (path: string, options?: { replace?: boolean }) => void;\n}\n\ninterface DispatchChatLocationState {\n dispatchPrompt?: {\n id?: string | number;\n message?: string;\n selectedModel?: string | null;\n selectedEngine?: string | null;\n selectedEffort?: AgentChatHomeProps[\"selectedEffort\"];\n };\n dispatchThread?: {\n id?: string | number;\n threadId?: string;\n };\n}\n\nexport function meta() {\n return [{ title: \"Chat — Dispatch\" }];\n}\n\nexport default function ChatRoute() {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const routeThreadId = threadIdFromPath(location.pathname);\n const agentPath = new URLSearchParams(location.search).get(\"agent\");\n const agentsQuery = useActionQuery<WorkspaceAgentResource[]>(\n \"list-workspace-resources\",\n { kind: \"agent\" },\n { enabled: Boolean(agentPath), staleTime: 30_000 },\n );\n const agent = useMemo(\n () =>\n agentPath\n ? (agentsQuery.data ?? []).find((resource) => {\n const profileId = resource.path\n .replace(/^agents\\//, \"\")\n .replace(/\\.md$/, \"\");\n return (\n resource.path === agentPath ||\n resource.id === agentPath ||\n profileId === agentPath\n );\n })\n : undefined,\n [agentPath, agentsQuery.data],\n );\n const agentScope = useMemo(\n () =>\n agent\n ? {\n type: \"agent\",\n id: agent.id,\n label: agent.name,\n contextKey: `dispatch-agent:${agent.id}`,\n }\n : null,\n [agent],\n );\n const handledStateIds = useRef(new Set<string>());\n const extensions = useDispatchExtensions();\n const suppressInlineOpenApp =\n extensions?.chatFirst === true ||\n readChatFirstMode() ||\n new URLSearchParams(location.search).get(\"chatFirst\") === \"1\";\n\n const navigateThreadUrl = useCallback(\n (path: string, options?: { replace?: boolean }) =>\n navigate(dispatchNavTarget(path), options),\n [navigate],\n );\n const threadUrlSync = useMemo<DispatchThreadUrlSync>(\n () => ({\n routeThreadId: routeThreadId ?? null,\n getPath: (threadId) => chatThreadPath(threadId, agentPath ?? undefined),\n navigate: navigateThreadUrl,\n }),\n [agentPath, routeThreadId, navigateThreadUrl],\n );\n const state = location.state as DispatchChatLocationState | null;\n const prompt = state?.dispatchPrompt;\n const thread = state?.dispatchThread;\n const [pendingOverviewPrompt, setPendingOverviewPrompt] = useState<\n DispatchChatLocationState[\"dispatchPrompt\"] | null\n >(null);\n const activePrompt = prompt?.message ? prompt : pendingOverviewPrompt;\n\n useEffect(() => {\n if (routeThreadId) setPendingOverviewPrompt(null);\n }, [routeThreadId]);\n\n useEffect(() => {\n const message = prompt?.message?.trim();\n const threadId = thread?.threadId?.trim();\n if (!message && !threadId) return;\n\n const stateId = String(\n prompt?.id ?? thread?.id ?? `${message ?? \"\"}:${threadId ?? \"\"}`,\n );\n if (handledStateIds.current.has(stateId)) return;\n handledStateIds.current.add(stateId);\n\n const timer = window.setTimeout(() => {\n if (threadId) {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId },\n }),\n );\n }\n if (message) {\n setPendingOverviewPrompt(prompt ?? null);\n submitOverviewPrompt(message, prompt?.selectedModel, {\n openSidebar: false,\n selectedEngine: prompt?.selectedEngine,\n selectedEffort: prompt?.selectedEffort,\n });\n }\n void navigate(`${location.pathname}${location.search}${location.hash}`, {\n replace: true,\n state: null,\n });\n }, 0);\n\n return () => window.clearTimeout(timer);\n }, [\n location.hash,\n location.pathname,\n location.search,\n navigate,\n prompt?.id,\n prompt?.message,\n prompt?.selectedModel,\n prompt?.selectedEngine,\n prompt?.selectedEffort,\n thread?.id,\n thread?.threadId,\n ]);\n\n useEffect(() => {\n function handleChatRunning(event: Event) {\n const detail = (event as CustomEvent).detail;\n if (detail?.isRunning === true) markAgentChatHomeHandoff(\"dispatch\");\n }\n\n window.addEventListener(\"agentNative.chatRunning\", handleChatRunning);\n return () =>\n window.removeEventListener(\"agentNative.chatRunning\", handleChatRunning);\n }, []);\n\n useEffect(() => {\n if (!agent) return;\n const timer = window.setTimeout(() => {\n insertAgentComposerReference(\n {\n label: agent.name,\n icon: \"agent\",\n source: \"agent:custom\",\n refType: \"custom-agent\",\n refId: agent.id,\n refPath: agent.path,\n slotKey: \"dispatch-agent\",\n slotLabel: \"Agent\",\n },\n { openSidebar: false },\n );\n }, 0);\n return () => window.clearTimeout(timer);\n }, [agent?.id, agent?.name, agent?.path]);\n\n if (agentPath && agentsQuery.isLoading) {\n return (\n <div className=\"flex h-full min-h-0 flex-col gap-4 bg-background px-4 py-6 sm:px-6\">\n <Skeleton className=\"mx-auto h-6 w-48\" />\n <Skeleton className=\"mx-auto h-12 w-full max-w-2xl\" />\n </div>\n );\n }\n\n if (agentPath && agentsQuery.isError) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center bg-background px-4\">\n <ActionQueryError\n error={agentsQuery.error}\n onRetry={() => void agentsQuery.refetch()}\n />\n </div>\n );\n }\n\n if (agentPath && !agent) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center bg-background px-4 text-sm text-muted-foreground\">\n This agent is no longer available.\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\">\n <AgentChatHome\n key={agent ? `agent-${agent.id}` : \"dispatch\"}\n className=\"flex-1 min-h-0\"\n contentClassName=\"max-w-none\"\n surfaceClassName=\"dispatch-chat-panel\"\n chatViewTransition\n defaultMode=\"chat\"\n storageKey={agent ? `dispatch-agent-${agent.id}` : \"dispatch\"}\n scope={agentScope}\n threadUrlSync={threadUrlSync}\n showHeader={false}\n showTabBar={false}\n dynamicSuggestions={false}\n suppressInlineOpenApp={suppressInlineOpenApp}\n suggestions={\n agent || routeThreadId || activePrompt?.message\n ? []\n : [\n t(\"dispatch.pages.suggestionWorkspaceHealth\"),\n t(\"dispatch.pages.suggestionOnboardingApp\"),\n t(\"dispatch.pages.suggestionAnalyticsAgents\"),\n ]\n }\n emptyStateText={t(\"dispatch.pages.chatAcrossAppsDescription\", {\n defaultValue:\n \"Route work, inspect status, or create something new from one place.\",\n })}\n centerComposerWhenEmpty={!activePrompt?.message && !routeThreadId}\n composerLayoutVariant={\n activePrompt?.message || routeThreadId ? \"default\" : \"hero\"\n }\n composerPlaceholder={\n agent\n ? `Ask ${agent.name}...`\n : t(\"dispatch.pages.chatPromptPlaceholder\", {\n defaultValue: \"Tell Dispatch what you’d like to make happen…\",\n })\n }\n homeIntroSlot={\n agent ? (\n <div className=\"dispatch-chat-intro\">\n <h1>{agent.name}</h1>\n {agent.description ? <p>{agent.description}</p> : null}\n </div>\n ) : !activePrompt?.message && !routeThreadId ? (\n <div className=\"dispatch-chat-intro\">\n <h1>\n {t(\"dispatch.pages.chatHomeTitle\", {\n defaultValue: \"What should we do today?\",\n })}\n </h1>\n </div>\n ) : null\n }\n afterComposerSlot={\n !agent && !prompt?.message && !threadUrlSync.routeThreadId ? (\n <DispatchChatHomeApps />\n ) : null\n }\n />\n </div>\n );\n}\n"]}
@@ -0,0 +1,7 @@
1
+ interface PrivateIconEvent {
2
+ url: URL;
3
+ req: Request;
4
+ }
5
+ export declare function createPrivateIconAssetsHandler(): (event: PrivateIconEvent) => Promise<Response>;
6
+ export {};
7
+ //# sourceMappingURL=private-icon-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-icon-assets.d.ts","sourceRoot":"","sources":["../../../src/server/lib/private-icon-assets.ts"],"names":[],"mappings":"AA4BA,UAAU,gBAAgB;IACxB,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,OAAO,CAAC;CACd;AA2ED,wBAAgB,8BAA8B,YACvB,gBAAgB,KAAG,OAAO,CAAC,QAAQ,CAAC,CAwI1D"}
@@ -0,0 +1,176 @@
1
+ import { verifyA2AToken } from "@agent-native/core/a2a";
2
+ import { getIconAsset, IconUploadBodyError, readIconUploadFormData, readIconAssetForAuthorizedReference, listIconAssets, putIconAsset, } from "@agent-native/core/icon-assets";
3
+ import { isOrgMember, resolveOrgByDomain } from "@agent-native/core/org";
4
+ import { getSession, runWithRequestContext } from "@agent-native/core/server";
5
+ const MAX_ICON_BYTES = 5 * 1024 * 1024;
6
+ const ICON_ID = /^[A-Za-z0-9_-]{8,128}$/;
7
+ const ICON_PATH = /^\/([A-Za-z0-9_-]{8,128})\/?$/;
8
+ const PRIVATE_HEADERS = {
9
+ "cache-control": "private, no-store",
10
+ "x-content-type-options": "nosniff",
11
+ "referrer-policy": "no-referrer",
12
+ };
13
+ function errorResponse(status, message) {
14
+ return Response.json({ error: message }, { status, headers: PRIVATE_HEADERS });
15
+ }
16
+ async function peerIdentity(event, scope) {
17
+ const authorization = event.req.headers.get("authorization");
18
+ const match = /^Bearer ([^\s]+)$/.exec(authorization ?? "");
19
+ if (!match)
20
+ return null;
21
+ const verified = await verifyA2AToken(match[1], event, {
22
+ routePrefix: "private-icon",
23
+ globalSecretOnly: true,
24
+ includeClaims: true,
25
+ });
26
+ const claims = verified.claims;
27
+ if (!verified.email?.trim() ||
28
+ !claims ||
29
+ claims.scope !== scope ||
30
+ !claims.aud ||
31
+ !claims.iss) {
32
+ return null;
33
+ }
34
+ const claimedOrgId = typeof claims.org_id === "string" ? claims.org_id.trim() : "";
35
+ const domain = verified.orgDomain?.trim().toLowerCase();
36
+ const mapped = domain ? await resolveOrgByDomain(domain) : null;
37
+ if (domain && !mapped)
38
+ return null;
39
+ if (mapped && claimedOrgId && mapped.orgId !== claimedOrgId)
40
+ return null;
41
+ const orgId = mapped?.orgId ?? claimedOrgId;
42
+ if (!orgId)
43
+ return null;
44
+ // `asset_id` is a capability fence on service reads. Content checks an
45
+ // accessible resource reference before signing this exact ID.
46
+ const assetId = typeof claims.asset_id === "string" ? claims.asset_id.trim() : undefined;
47
+ if (scope === "private-icon:read" && (!assetId || !ICON_ID.test(assetId))) {
48
+ return null;
49
+ }
50
+ return { email: verified.email.trim().toLowerCase(), orgId, assetId };
51
+ }
52
+ async function ownerIdentity(event, scope) {
53
+ if (event.req.headers.has("authorization")) {
54
+ const peer = await peerIdentity(event, scope);
55
+ if (!peer || !(await isOrgMember(peer.orgId, peer.email)))
56
+ return null;
57
+ return { email: peer.email, orgId: peer.orgId };
58
+ }
59
+ if (scope === "private-icon:verify-owner")
60
+ return null;
61
+ const session = await getSession(event);
62
+ if (!session?.email)
63
+ return null;
64
+ if (session.orgId && !(await isOrgMember(session.orgId, session.email))) {
65
+ return null;
66
+ }
67
+ return { email: session.email.trim().toLowerCase(), orgId: session.orgId };
68
+ }
69
+ export function createPrivateIconAssetsHandler() {
70
+ return async (event) => {
71
+ const method = event.req.method.toUpperCase();
72
+ const path = new URL(event.req.url).pathname.replace(/^\/_agent-native\/private-icons(?=\/|$)/, "") || "/";
73
+ const idMatch = ICON_PATH.exec(path);
74
+ if (path !== "/" && !idMatch) {
75
+ return errorResponse(404, "Icon not found");
76
+ }
77
+ if (path === "/" && method === "POST") {
78
+ const owner = await ownerIdentity(event, "private-icon:upload");
79
+ if (!owner)
80
+ return errorResponse(401, "Unauthorized");
81
+ const length = Number(event.req.headers.get("content-length"));
82
+ if (!Number.isSafeInteger(length) || length <= 0) {
83
+ return errorResponse(411, "Content length required");
84
+ }
85
+ if (!event.req.headers
86
+ .get("content-type")
87
+ ?.startsWith("multipart/form-data;")) {
88
+ return errorResponse(415, "Multipart icon upload required");
89
+ }
90
+ let files;
91
+ try {
92
+ files = (await readIconUploadFormData(event.req)).getAll("file");
93
+ }
94
+ catch (error) {
95
+ if (error instanceof IconUploadBodyError)
96
+ return errorResponse(error.statusCode, error.message);
97
+ throw error;
98
+ }
99
+ const file = files.length === 1 ? files[0] : undefined;
100
+ if (!file || typeof file === "string") {
101
+ return errorResponse(400, "A valid icon file is required");
102
+ }
103
+ const data = new Uint8Array(await file.arrayBuffer());
104
+ if (data.byteLength === 0 || data.byteLength > MAX_ICON_BYTES) {
105
+ return errorResponse(413, "Icon too large");
106
+ }
107
+ if (!["image/png", "image/jpeg", "image/webp", "image/svg+xml"].includes(file.type)) {
108
+ return errorResponse(415, "Unsupported icon type");
109
+ }
110
+ const asset = await runWithRequestContext({ userEmail: owner.email, orgId: owner.orgId }, () => putIconAsset({
111
+ data,
112
+ mimeType: file.type ?? "",
113
+ filename: file.name,
114
+ ownerEmail: owner.email,
115
+ orgId: owner.orgId,
116
+ }));
117
+ return Response.json({
118
+ id: asset.id,
119
+ filename: asset.filename,
120
+ mimeType: asset.mimeType,
121
+ size: asset.size,
122
+ contentType: asset.mimeType,
123
+ byteLength: asset.size,
124
+ }, { status: 201, headers: PRIVATE_HEADERS });
125
+ }
126
+ if (path === "/" && method === "GET") {
127
+ const owner = await ownerIdentity(event, "private-icon:list");
128
+ if (!owner)
129
+ return errorResponse(401, "Unauthorized");
130
+ const assets = await runWithRequestContext({ userEmail: owner.email, orgId: owner.orgId }, () => listIconAssets({
131
+ ownerEmail: owner.email,
132
+ orgId: owner.orgId,
133
+ limit: 100,
134
+ }));
135
+ return Response.json({
136
+ assets: assets.map(({ id, filename, mimeType, size, createdAt }) => ({
137
+ id,
138
+ filename,
139
+ mimeType,
140
+ size,
141
+ createdAt,
142
+ })),
143
+ }, { headers: PRIVATE_HEADERS });
144
+ }
145
+ const id = idMatch?.[1];
146
+ if (id && method === "HEAD") {
147
+ const owner = await ownerIdentity(event, "private-icon:verify-owner");
148
+ if (!owner)
149
+ return errorResponse(401, "Unauthorized");
150
+ const asset = await runWithRequestContext({ userEmail: owner.email, orgId: owner.orgId }, () => getIconAsset(id, { ownerEmail: owner.email, orgId: owner.orgId }));
151
+ if (!asset)
152
+ return errorResponse(404, "Icon not found");
153
+ return new Response(null, { status: 200, headers: PRIVATE_HEADERS });
154
+ }
155
+ if (id && method === "GET") {
156
+ const peer = await peerIdentity(event, "private-icon:read");
157
+ if (!peer)
158
+ return errorResponse(401, "Unauthorized");
159
+ if (peer.assetId !== id) {
160
+ return errorResponse(403, "Icon access denied");
161
+ }
162
+ const icon = await runWithRequestContext({ userEmail: peer.email, orgId: peer.orgId }, () => readIconAssetForAuthorizedReference(id, { orgId: peer.orgId }));
163
+ if (!icon)
164
+ return errorResponse(404, "Icon not found");
165
+ const headers = new Headers(PRIVATE_HEADERS);
166
+ headers.set("content-type", icon.mimeType);
167
+ headers.set("content-length", String(icon.data.byteLength));
168
+ if (icon.mimeType === "image/svg+xml") {
169
+ headers.set("content-security-policy", "sandbox; default-src 'none'; style-src 'unsafe-inline'; img-src data:");
170
+ }
171
+ return new Response(Buffer.from(icon.data), { headers });
172
+ }
173
+ return errorResponse(405, "Method not allowed");
174
+ };
175
+ }
176
+ //# sourceMappingURL=private-icon-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-icon-assets.js","sourceRoot":"","sources":["../../../src/server/lib/private-icon-assets.ts"],"names":[],"mappings":"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","sourcesContent":["import { verifyA2AToken } from \"@agent-native/core/a2a\";\nimport {\n getIconAsset,\n IconUploadBodyError,\n readIconUploadFormData,\n readIconAssetForAuthorizedReference,\n listIconAssets,\n putIconAsset,\n} from \"@agent-native/core/icon-assets\";\nimport { isOrgMember, resolveOrgByDomain } from \"@agent-native/core/org\";\nimport { getSession, runWithRequestContext } from \"@agent-native/core/server\";\n\nconst MAX_ICON_BYTES = 5 * 1024 * 1024;\nconst ICON_ID = /^[A-Za-z0-9_-]{8,128}$/;\nconst ICON_PATH = /^\\/([A-Za-z0-9_-]{8,128})\\/?$/;\n\ntype IconScope =\n | \"private-icon:upload\"\n | \"private-icon:list\"\n | \"private-icon:verify-owner\"\n | \"private-icon:read\";\n\ntype PeerIdentity = {\n email: string;\n orgId: string;\n assetId?: string;\n};\n\ninterface PrivateIconEvent {\n url: URL;\n req: Request;\n}\n\nconst PRIVATE_HEADERS = {\n \"cache-control\": \"private, no-store\",\n \"x-content-type-options\": \"nosniff\",\n \"referrer-policy\": \"no-referrer\",\n};\n\nfunction errorResponse(status: number, message: string): Response {\n return Response.json(\n { error: message },\n { status, headers: PRIVATE_HEADERS },\n );\n}\n\nasync function peerIdentity(\n event: PrivateIconEvent,\n scope: IconScope,\n): Promise<PeerIdentity | null> {\n const authorization = event.req.headers.get(\"authorization\");\n const match = /^Bearer ([^\\s]+)$/.exec(authorization ?? \"\");\n if (!match) return null;\n const verified = await verifyA2AToken(match[1]!, event as never, {\n routePrefix: \"private-icon\",\n globalSecretOnly: true,\n includeClaims: true,\n });\n const claims = verified.claims;\n if (\n !verified.email?.trim() ||\n !claims ||\n claims.scope !== scope ||\n !claims.aud ||\n !claims.iss\n ) {\n return null;\n }\n\n const claimedOrgId =\n typeof claims.org_id === \"string\" ? claims.org_id.trim() : \"\";\n const domain = verified.orgDomain?.trim().toLowerCase();\n const mapped = domain ? await resolveOrgByDomain(domain) : null;\n if (domain && !mapped) return null;\n if (mapped && claimedOrgId && mapped.orgId !== claimedOrgId) return null;\n const orgId = mapped?.orgId ?? claimedOrgId;\n if (!orgId) return null;\n\n // `asset_id` is a capability fence on service reads. Content checks an\n // accessible resource reference before signing this exact ID.\n const assetId =\n typeof claims.asset_id === \"string\" ? claims.asset_id.trim() : undefined;\n if (scope === \"private-icon:read\" && (!assetId || !ICON_ID.test(assetId))) {\n return null;\n }\n return { email: verified.email.trim().toLowerCase(), orgId, assetId };\n}\n\nasync function ownerIdentity(\n event: PrivateIconEvent,\n scope: IconScope,\n): Promise<{ email: string; orgId?: string } | null> {\n if (event.req.headers.has(\"authorization\")) {\n const peer = await peerIdentity(event, scope);\n if (!peer || !(await isOrgMember(peer.orgId, peer.email))) return null;\n return { email: peer.email, orgId: peer.orgId };\n }\n if (scope === \"private-icon:verify-owner\") return null;\n const session = await getSession(event as never);\n if (!session?.email) return null;\n if (session.orgId && !(await isOrgMember(session.orgId, session.email))) {\n return null;\n }\n return { email: session.email.trim().toLowerCase(), orgId: session.orgId };\n}\n\nexport function createPrivateIconAssetsHandler() {\n return async (event: PrivateIconEvent): Promise<Response> => {\n const method = event.req.method.toUpperCase();\n const path =\n new URL(event.req.url).pathname.replace(\n /^\\/_agent-native\\/private-icons(?=\\/|$)/,\n \"\",\n ) || \"/\";\n const idMatch = ICON_PATH.exec(path);\n if (path !== \"/\" && !idMatch) {\n return errorResponse(404, \"Icon not found\");\n }\n\n if (path === \"/\" && method === \"POST\") {\n const owner = await ownerIdentity(event, \"private-icon:upload\");\n if (!owner) return errorResponse(401, \"Unauthorized\");\n const length = Number(event.req.headers.get(\"content-length\"));\n if (!Number.isSafeInteger(length) || length <= 0) {\n return errorResponse(411, \"Content length required\");\n }\n if (\n !event.req.headers\n .get(\"content-type\")\n ?.startsWith(\"multipart/form-data;\")\n ) {\n return errorResponse(415, \"Multipart icon upload required\");\n }\n let files: FormDataEntryValue[];\n try {\n files = (await readIconUploadFormData(event.req)).getAll(\"file\");\n } catch (error) {\n if (error instanceof IconUploadBodyError)\n return errorResponse(error.statusCode, error.message);\n throw error;\n }\n const file = files.length === 1 ? files[0] : undefined;\n if (!file || typeof file === \"string\") {\n return errorResponse(400, \"A valid icon file is required\");\n }\n const data = new Uint8Array(await file.arrayBuffer());\n if (data.byteLength === 0 || data.byteLength > MAX_ICON_BYTES) {\n return errorResponse(413, \"Icon too large\");\n }\n if (\n ![\"image/png\", \"image/jpeg\", \"image/webp\", \"image/svg+xml\"].includes(\n file.type,\n )\n ) {\n return errorResponse(415, \"Unsupported icon type\");\n }\n const asset = await runWithRequestContext(\n { userEmail: owner.email, orgId: owner.orgId },\n () =>\n putIconAsset({\n data,\n mimeType: file.type ?? \"\",\n filename: file.name,\n ownerEmail: owner.email,\n orgId: owner.orgId,\n }),\n );\n return Response.json(\n {\n id: asset.id,\n filename: asset.filename,\n mimeType: asset.mimeType,\n size: asset.size,\n contentType: asset.mimeType,\n byteLength: asset.size,\n },\n { status: 201, headers: PRIVATE_HEADERS },\n );\n }\n\n if (path === \"/\" && method === \"GET\") {\n const owner = await ownerIdentity(event, \"private-icon:list\");\n if (!owner) return errorResponse(401, \"Unauthorized\");\n const assets = await runWithRequestContext(\n { userEmail: owner.email, orgId: owner.orgId },\n () =>\n listIconAssets({\n ownerEmail: owner.email,\n orgId: owner.orgId,\n limit: 100,\n }),\n );\n return Response.json(\n {\n assets: assets.map(({ id, filename, mimeType, size, createdAt }) => ({\n id,\n filename,\n mimeType,\n size,\n createdAt,\n })),\n },\n { headers: PRIVATE_HEADERS },\n );\n }\n\n const id = idMatch?.[1];\n if (id && method === \"HEAD\") {\n const owner = await ownerIdentity(event, \"private-icon:verify-owner\");\n if (!owner) return errorResponse(401, \"Unauthorized\");\n const asset = await runWithRequestContext(\n { userEmail: owner.email, orgId: owner.orgId },\n () => getIconAsset(id, { ownerEmail: owner.email, orgId: owner.orgId }),\n );\n if (!asset) return errorResponse(404, \"Icon not found\");\n return new Response(null, { status: 200, headers: PRIVATE_HEADERS });\n }\n\n if (id && method === \"GET\") {\n const peer = await peerIdentity(event, \"private-icon:read\");\n if (!peer) return errorResponse(401, \"Unauthorized\");\n if (peer.assetId !== id) {\n return errorResponse(403, \"Icon access denied\");\n }\n const icon = await runWithRequestContext(\n { userEmail: peer.email, orgId: peer.orgId },\n () => readIconAssetForAuthorizedReference(id, { orgId: peer.orgId }),\n );\n if (!icon) return errorResponse(404, \"Icon not found\");\n const headers = new Headers(PRIVATE_HEADERS);\n headers.set(\"content-type\", icon.mimeType);\n headers.set(\"content-length\", String(icon.data.byteLength));\n if (icon.mimeType === \"image/svg+xml\") {\n headers.set(\n \"content-security-policy\",\n \"sandbox; default-src 'none'; style-src 'unsafe-inline'; img-src data:\",\n );\n }\n return new Response(Buffer.from(icon.data), { headers });\n }\n\n return errorResponse(405, \"Method not allowed\");\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/plugins/auth.ts"],"names":[],"mappings":"AAeA,QAAA,MAAM,kBAAkB,aAAoB,GAAG,kBAa9C,CAAC;eAEa,kBAAkB"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/plugins/auth.ts"],"names":[],"mappings":"AAeA,QAAA,MAAM,kBAAkB,aAAoB,GAAG,kBAkB9C,CAAC;eAEa,kBAAkB"}
@@ -19,7 +19,12 @@ const dispatchAuthPlugin = async (nitroApp) => {
19
19
  googleOnly,
20
20
  marketing: marketing,
21
21
  workspaceAppPublicPaths: ["/"],
22
- publicPaths: authConfig.publicPaths,
22
+ // This route authenticates its own audience-bound service bearer before any
23
+ // asset lookup; the session guard cannot authenticate peer services.
24
+ publicPaths: [
25
+ ...(authConfig.publicPaths ?? []),
26
+ "/_agent-native/private-icons",
27
+ ],
23
28
  });
24
29
  return plugin(nitroApp);
25
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/plugins/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,UAAU;IACnB,OAAO,EACL,sGAAsG;IACxG,QAAQ,EAAE;QACR,4DAA4D;QAC5D,6DAA6D;QAC7D,oDAAoD;KACrD;CACO,CAAC;AAEX,MAAM,kBAAkB,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE;IACjD,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS;QACpC,CAAC,CAAC,EAAE,GAAG,iBAAiB,EAAE,GAAG,UAAU,CAAC,SAAS,EAAE;QACnD,CAAC,CAAC,iBAAiB,CAAC;IACtB,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC9B,UAAU;QACV,SAAS,EAAE,SAAgB;QAC3B,uBAAuB,EAAE,CAAC,GAAG,CAAC;QAC9B,WAAW,EAAE,UAAU,CAAC,WAAW;KACpC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import { createAuthPlugin } from \"@agent-native/core/server\";\n\nimport { getDispatchConfig } from \"../index.js\";\n\nconst DEFAULT_MARKETING = {\n appName: \"Dispatch\",\n tagline:\n \"Your AI agent manages secrets, orchestrates other agents, and routes messages across your workspace.\",\n features: [\n \"Centralized vault for secrets with granular per-app grants\",\n \"Cross-agent orchestration and delegation to specialist apps\",\n \"Slack and Telegram routing with approval workflows\",\n ],\n} as const;\n\nconst dispatchAuthPlugin = async (nitroApp: any) => {\n const { auth: authConfig = {} } = getDispatchConfig();\n const googleOnly = authConfig.googleOnly ?? false;\n const marketing = authConfig.marketing\n ? { ...DEFAULT_MARKETING, ...authConfig.marketing }\n : DEFAULT_MARKETING;\n const plugin = createAuthPlugin({\n googleOnly,\n marketing: marketing as any,\n workspaceAppPublicPaths: [\"/\"],\n publicPaths: authConfig.publicPaths,\n });\n return plugin(nitroApp);\n};\n\nexport default dispatchAuthPlugin;\n"]}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/plugins/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,UAAU;IACnB,OAAO,EACL,sGAAsG;IACxG,QAAQ,EAAE;QACR,4DAA4D;QAC5D,6DAA6D;QAC7D,oDAAoD;KACrD;CACO,CAAC;AAEX,MAAM,kBAAkB,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE;IACjD,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS;QACpC,CAAC,CAAC,EAAE,GAAG,iBAAiB,EAAE,GAAG,UAAU,CAAC,SAAS,EAAE;QACnD,CAAC,CAAC,iBAAiB,CAAC;IACtB,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC9B,UAAU;QACV,SAAS,EAAE,SAAgB;QAC3B,uBAAuB,EAAE,CAAC,GAAG,CAAC;QAC9B,4EAA4E;QAC5E,qEAAqE;QACrE,WAAW,EAAE;YACX,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;YACjC,8BAA8B;SAC/B;KACF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import { createAuthPlugin } from \"@agent-native/core/server\";\n\nimport { getDispatchConfig } from \"../index.js\";\n\nconst DEFAULT_MARKETING = {\n appName: \"Dispatch\",\n tagline:\n \"Your AI agent manages secrets, orchestrates other agents, and routes messages across your workspace.\",\n features: [\n \"Centralized vault for secrets with granular per-app grants\",\n \"Cross-agent orchestration and delegation to specialist apps\",\n \"Slack and Telegram routing with approval workflows\",\n ],\n} as const;\n\nconst dispatchAuthPlugin = async (nitroApp: any) => {\n const { auth: authConfig = {} } = getDispatchConfig();\n const googleOnly = authConfig.googleOnly ?? false;\n const marketing = authConfig.marketing\n ? { ...DEFAULT_MARKETING, ...authConfig.marketing }\n : DEFAULT_MARKETING;\n const plugin = createAuthPlugin({\n googleOnly,\n marketing: marketing as any,\n workspaceAppPublicPaths: [\"/\"],\n // This route authenticates its own audience-bound service bearer before any\n // asset lookup; the session guard cannot authenticate peer services.\n publicPaths: [\n ...(authConfig.publicPaths ?? []),\n \"/_agent-native/private-icons\",\n ],\n });\n return plugin(nitroApp);\n};\n\nexport default dispatchAuthPlugin;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"core-routes.d.ts","sourceRoot":"","sources":["../../../src/server/plugins/core-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAgBnC,QAAA,MAAM,wBAAwB,EAAE,cAO/B,CAAC;eAEa,wBAAwB"}
1
+ {"version":3,"file":"core-routes.d.ts","sourceRoot":"","sources":["../../../src/server/plugins/core-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAiBnC,QAAA,MAAM,wBAAwB,EAAE,cAW/B,CAAC;eAEa,wBAAwB"}
@@ -2,6 +2,7 @@ import { createCoreRoutesPlugin, getH3App, } from "@agent-native/core/server";
2
2
  import { WORKSPACE_APP_CHAT_PROXY_PREFIX } from "../../shared/workspace-app-chat.js";
3
3
  import { envKeys } from "../lib/env-config.js";
4
4
  import { registerDispatchOnboardingSteps } from "../lib/onboarding-steps.js";
5
+ import { createPrivateIconAssetsHandler } from "../lib/private-icon-assets.js";
5
6
  import { createWorkspaceAppChatProxyHandler } from "../lib/workspace-app-chat-proxy.js";
6
7
  // Register before the core plugin so "create your first app" (order 5) appears
7
8
  // above the auto-generated Slack/Telegram steps (order 60). Idempotent.
@@ -13,6 +14,7 @@ const corePlugin = createCoreRoutesPlugin({
13
14
  const dispatchCoreRoutesPlugin = (nitroApp) => {
14
15
  const coreInit = corePlugin(nitroApp);
15
16
  getH3App(nitroApp).use(WORKSPACE_APP_CHAT_PROXY_PREFIX, createWorkspaceAppChatProxyHandler());
17
+ getH3App(nitroApp).use("/_agent-native/private-icons", createPrivateIconAssetsHandler());
16
18
  return coreInit;
17
19
  };
18
20
  export default dispatchCoreRoutesPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"core-routes.js","sourceRoot":"","sources":["../../../src/server/plugins/core-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,QAAQ,GAET,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,kCAAkC,EAAE,MAAM,oCAAoC,CAAC;AAExF,+EAA+E;AAC/E,wEAAwE;AACxE,+BAA+B,EAAE,CAAC;AAElC,MAAM,UAAU,GAAG,sBAAsB,CAAC;IACxC,4BAA4B,EAAE,UAAU;IACxC,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAmB,CAAC,QAAQ,EAAE,EAAE;IAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CACpB,+BAA+B,EAC/B,kCAAkC,EAAE,CACrC,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,eAAe,wBAAwB,CAAC","sourcesContent":["import {\n createCoreRoutesPlugin,\n getH3App,\n type NitroPluginDef,\n} from \"@agent-native/core/server\";\n\nimport { WORKSPACE_APP_CHAT_PROXY_PREFIX } from \"../../shared/workspace-app-chat.js\";\nimport { envKeys } from \"../lib/env-config.js\";\nimport { registerDispatchOnboardingSteps } from \"../lib/onboarding-steps.js\";\nimport { createWorkspaceAppChatProxyHandler } from \"../lib/workspace-app-chat-proxy.js\";\n\n// Register before the core plugin so \"create your first app\" (order 5) appears\n// above the auto-generated Slack/Telegram steps (order 60). Idempotent.\nregisterDispatchOnboardingSteps();\n\nconst corePlugin = createCoreRoutesPlugin({\n googleOAuthManagedConnection: \"required\",\n envKeys,\n});\n\nconst dispatchCoreRoutesPlugin: NitroPluginDef = (nitroApp) => {\n const coreInit = corePlugin(nitroApp);\n getH3App(nitroApp).use(\n WORKSPACE_APP_CHAT_PROXY_PREFIX,\n createWorkspaceAppChatProxyHandler(),\n );\n return coreInit;\n};\n\nexport default dispatchCoreRoutesPlugin;\n"]}
1
+ {"version":3,"file":"core-routes.js","sourceRoot":"","sources":["../../../src/server/plugins/core-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,QAAQ,GAET,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,oCAAoC,CAAC;AAExF,+EAA+E;AAC/E,wEAAwE;AACxE,+BAA+B,EAAE,CAAC;AAElC,MAAM,UAAU,GAAG,sBAAsB,CAAC;IACxC,4BAA4B,EAAE,UAAU;IACxC,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAmB,CAAC,QAAQ,EAAE,EAAE;IAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CACpB,+BAA+B,EAC/B,kCAAkC,EAAE,CACrC,CAAC;IACF,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CACpB,8BAA8B,EAC9B,8BAA8B,EAAE,CACjC,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,eAAe,wBAAwB,CAAC","sourcesContent":["import {\n createCoreRoutesPlugin,\n getH3App,\n type NitroPluginDef,\n} from \"@agent-native/core/server\";\n\nimport { WORKSPACE_APP_CHAT_PROXY_PREFIX } from \"../../shared/workspace-app-chat.js\";\nimport { envKeys } from \"../lib/env-config.js\";\nimport { registerDispatchOnboardingSteps } from \"../lib/onboarding-steps.js\";\nimport { createPrivateIconAssetsHandler } from \"../lib/private-icon-assets.js\";\nimport { createWorkspaceAppChatProxyHandler } from \"../lib/workspace-app-chat-proxy.js\";\n\n// Register before the core plugin so \"create your first app\" (order 5) appears\n// above the auto-generated Slack/Telegram steps (order 60). Idempotent.\nregisterDispatchOnboardingSteps();\n\nconst corePlugin = createCoreRoutesPlugin({\n googleOAuthManagedConnection: \"required\",\n envKeys,\n});\n\nconst dispatchCoreRoutesPlugin: NitroPluginDef = (nitroApp) => {\n const coreInit = corePlugin(nitroApp);\n getH3App(nitroApp).use(\n WORKSPACE_APP_CHAT_PROXY_PREFIX,\n createWorkspaceAppChatProxyHandler(),\n );\n getH3App(nitroApp).use(\n \"/_agent-native/private-icons\",\n createPrivateIconAssetsHandler(),\n );\n return coreInit;\n};\n\nexport default dispatchCoreRoutesPlugin;\n"]}