@agent-native/dispatch 0.2.8 → 0.2.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"app-creation-store.js","sourceRoot":"","sources":["../../../src/server/lib/app-creation-store.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getSetting, putSetting } from \"@agent-native/core/settings\";\nimport {\n getBuilderBranchProjectId,\n getRequestContext,\n isIntegrationCallerRequest,\n resolveBuilderBranchProjectId,\n resolveBuilderCredentials,\n runBuilderAgent,\n} from \"@agent-native/core/server\";\nimport { getDbExec } from \"@agent-native/core/db\";\nimport { assertValidWorkspaceAppId } from \"@agent-native/core/shared\";\nimport {\n currentOrgId,\n currentOwnerEmail,\n recordAudit,\n resolveLinkedOwner,\n} from \"./dispatch-store.js\";\nimport { identityKeyForIncoming } from \"./dispatch-integrations.js\";\nimport { createRequest, listSecrets } from \"./vault-store.js\";\n\nconst SETTINGS_KEY = \"dispatch-app-creation-settings\";\nconst WORKSPACE_APPS_ENV_KEY = \"AGENT_NATIVE_WORKSPACE_APPS_JSON\";\nconst WORKSPACE_APPS_MANIFEST_FILE = \"workspace-apps.json\";\nconst MAX_PENDING_APPS = 50;\nconst AGENT_CARD_PATH = \"/.well-known/agent-card.json\";\nconst AGENT_CARD_FETCH_TIMEOUT_MS = 1_500;\n\nexport interface WorkspaceAppSummary {\n id: string;\n name: string;\n description: string;\n path: string;\n url: string | null;\n isDispatch: boolean;\n status?: \"ready\" | \"pending\";\n statusLabel?: string;\n builderUrl?: string | null;\n branchName?: string | null;\n createdAt?: string | null;\n agentCardUrl?: string | null;\n agentCardReachable?: boolean;\n a2aEndpointUrl?: string | null;\n agentName?: string | null;\n agentSkillsCount?: number | null;\n}\n\nexport interface ListWorkspaceAppsOptions {\n includeAgentCards?: boolean;\n}\n\nexport interface AppCreationSettings {\n builderProjectId: string | null;\n builderProjectIdSource: \"env\" | \"dispatch\" | \"default\" | \"unset\";\n envBuilderProjectId: string | null;\n savedBuilderProjectId: string | null;\n builderBranchingEnabled: boolean;\n}\n\nexport interface WorkspaceInfo {\n /** Slug from the workspace root package.json `name` (e.g. \"on-call-todo-manager\"). */\n name: string | null;\n /** Title-cased version for display (e.g. \"On Call Todo Manager\"). */\n displayName: string | null;\n /** Absolute path to the workspace root, if detected. */\n rootPath: string | null;\n /** Number of apps currently scaffolded under apps/. */\n appCount: number;\n}\n\ninterface PendingWorkspaceApp {\n id: string;\n name: string;\n description: string;\n path: string;\n builderUrl: string | null;\n branchName: string | null;\n projectId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction readJson(file: string): any {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction findWorkspaceRoot(startDir = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n for (let i = 0; i < 20; i++) {\n const pkg = readJson(path.join(dir, \"package.json\"));\n if (typeof pkg?.[\"agent-native\"]?.workspaceCore === \"string\") {\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\nfunction titleCase(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction scopedSettingsKey(): string {\n const orgId = currentOrgId();\n if (orgId) return `${SETTINGS_KEY}:org:${orgId}`;\n return `${SETTINGS_KEY}:user:${currentOwnerEmail()}`;\n}\n\nasync function readSettingsRecord(): Promise<Record<string, any>> {\n const raw = await getSetting(scopedSettingsKey()).catch(() => null);\n return raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, any>)\n : {};\n}\n\nfunction workspaceAppUrl(appPath: string): string | null {\n const base =\n process.env.WORKSPACE_GATEWAY_URL ||\n process.env.APP_URL ||\n process.env.URL ||\n process.env.DEPLOY_URL ||\n process.env.BETTER_AUTH_URL ||\n null;\n if (!base) return null;\n try {\n return new URL(appPath, `${base.replace(/\\/$/, \"\")}/`).toString();\n } catch {\n return null;\n }\n}\n\nfunction workspaceAppLink(\n appPath: string,\n explicitUrl?: unknown,\n): string | null {\n const urlValue = typeof explicitUrl === \"string\" ? explicitUrl.trim() : \"\";\n if (!urlValue) return workspaceAppUrl(appPath);\n if (urlValue.startsWith(\"/\")) return workspaceAppUrl(urlValue) ?? urlValue;\n try {\n return new URL(urlValue).toString();\n } catch {\n return urlValue;\n }\n}\n\nfunction parseWorkspaceAppsManifest(parsed: any): WorkspaceAppSummary[] | null {\n const rawApps = Array.isArray(parsed?.apps)\n ? parsed.apps\n : Array.isArray(parsed)\n ? parsed\n : null;\n if (!rawApps) return null;\n\n const apps = rawApps\n .map((entry): WorkspaceAppSummary | null => {\n if (!entry || typeof entry !== \"object\") return null;\n const id = typeof entry.id === \"string\" ? entry.id.trim() : \"\";\n const pathValue = typeof entry.path === \"string\" ? entry.path.trim() : \"\";\n if (!id || !pathValue.startsWith(\"/\")) return null;\n return {\n id,\n name:\n typeof entry.name === \"string\" && entry.name.trim()\n ? entry.name.trim()\n : titleCase(id),\n description:\n typeof entry.description === \"string\" ? entry.description : \"\",\n path: pathValue,\n url: workspaceAppLink(pathValue, entry.url),\n isDispatch:\n typeof entry.isDispatch === \"boolean\"\n ? entry.isDispatch\n : id === \"dispatch\",\n status: \"ready\",\n } satisfies WorkspaceAppSummary;\n })\n .filter((app): app is WorkspaceAppSummary => !!app)\n .sort(sortWorkspaceApps);\n\n return apps.length ? apps : null;\n}\n\nfunction sortWorkspaceApps(a: WorkspaceAppSummary, b: WorkspaceAppSummary) {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n if (a.status === \"pending\" && b.status !== \"pending\") return 1;\n if (a.status !== \"pending\" && b.status === \"pending\") return -1;\n return a.name.localeCompare(b.name);\n}\n\nfunction parsePendingWorkspaceApps(value: unknown): PendingWorkspaceApp[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((entry) => {\n if (!entry || typeof entry !== \"object\") return null;\n const record = entry as Record<string, unknown>;\n const id = typeof record.id === \"string\" ? record.id.trim() : \"\";\n const pathValue =\n typeof record.path === \"string\" ? record.path.trim() : \"\";\n if (!id || !pathValue.startsWith(\"/\")) return null;\n const now = new Date().toISOString();\n return {\n id,\n name:\n typeof record.name === \"string\" && record.name.trim()\n ? record.name.trim()\n : titleCase(id),\n description:\n typeof record.description === \"string\"\n ? record.description\n : \"Builder is creating this app. The workspace path becomes live after the branch is merged and deployed.\",\n path: pathValue,\n builderUrl:\n typeof record.builderUrl === \"string\" && record.builderUrl.trim()\n ? record.builderUrl.trim()\n : null,\n branchName:\n typeof record.branchName === \"string\" && record.branchName.trim()\n ? record.branchName.trim()\n : null,\n projectId:\n typeof record.projectId === \"string\" && record.projectId.trim()\n ? record.projectId.trim()\n : null,\n createdAt:\n typeof record.createdAt === \"string\" && record.createdAt.trim()\n ? record.createdAt.trim()\n : now,\n updatedAt:\n typeof record.updatedAt === \"string\" && record.updatedAt.trim()\n ? record.updatedAt.trim()\n : now,\n } satisfies PendingWorkspaceApp;\n })\n .filter((app): app is PendingWorkspaceApp => !!app)\n .slice(0, MAX_PENDING_APPS);\n}\n\nasync function listPendingWorkspaceApps(): Promise<PendingWorkspaceApp[]> {\n const raw = await readSettingsRecord();\n return parsePendingWorkspaceApps(raw.pendingApps);\n}\n\nfunction pendingAppToSummary(app: PendingWorkspaceApp): WorkspaceAppSummary {\n return {\n id: app.id,\n name: app.name,\n description: app.description,\n path: app.path,\n url: app.builderUrl,\n isDispatch: false,\n status: \"pending\",\n statusLabel: \"Building in Builder\",\n builderUrl: app.builderUrl,\n branchName: app.branchName,\n createdAt: app.createdAt,\n };\n}\n\nasync function appendPendingWorkspaceApps(\n apps: WorkspaceAppSummary[],\n): Promise<WorkspaceAppSummary[]> {\n const readyIds = new Set(apps.map((app) => app.id));\n const pendingApps = (await listPendingWorkspaceApps())\n .filter((app) => !readyIds.has(app.id))\n .map(pendingAppToSummary);\n return [...apps, ...pendingApps].sort(sortWorkspaceApps);\n}\n\nfunction agentCardUrlForApp(appUrl: string | null): string | null {\n if (!appUrl) return null;\n const trimmed = appUrl.replace(/\\/+$/, \"\");\n if (!trimmed) return null;\n try {\n return new URL(`${trimmed}${AGENT_CARD_PATH}`).toString();\n } catch {\n return `${trimmed}${AGENT_CARD_PATH}`;\n }\n}\n\nfunction stringField(\n record: Record<string, unknown>,\n key: string,\n): string | null {\n const value = record[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction numberOfSkills(card: Record<string, unknown>): number | null {\n return Array.isArray(card.skills) ? card.skills.length : null;\n}\n\nasync function fetchAgentCardMetadata(\n app: WorkspaceAppSummary,\n): Promise<\n Pick<\n WorkspaceAppSummary,\n | \"agentCardUrl\"\n | \"agentCardReachable\"\n | \"a2aEndpointUrl\"\n | \"agentName\"\n | \"agentSkillsCount\"\n >\n> {\n const agentCardUrl = agentCardUrlForApp(app.url);\n if (!agentCardUrl) {\n return {\n agentCardUrl: null,\n agentCardReachable: false,\n a2aEndpointUrl: null,\n agentName: null,\n agentSkillsCount: null,\n };\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n AGENT_CARD_FETCH_TIMEOUT_MS,\n );\n\n try {\n const response = await fetch(agentCardUrl, {\n headers: { accept: \"application/json\" },\n signal: controller.signal,\n });\n if (!response.ok) {\n return {\n agentCardUrl,\n agentCardReachable: false,\n a2aEndpointUrl: null,\n agentName: null,\n agentSkillsCount: null,\n };\n }\n\n const parsed = await response.json().catch(() => null);\n const card =\n parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n if (!card) {\n return {\n agentCardUrl,\n agentCardReachable: false,\n a2aEndpointUrl: null,\n agentName: null,\n agentSkillsCount: null,\n };\n }\n\n return {\n agentCardUrl,\n agentCardReachable: true,\n a2aEndpointUrl:\n stringField(card, \"url\") ?? stringField(card, \"endpointUrl\"),\n agentName: stringField(card, \"name\"),\n agentSkillsCount: numberOfSkills(card),\n };\n } catch {\n return {\n agentCardUrl,\n agentCardReachable: false,\n a2aEndpointUrl: null,\n agentName: null,\n agentSkillsCount: null,\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function maybeIncludeAgentCards(\n apps: WorkspaceAppSummary[],\n options: ListWorkspaceAppsOptions,\n): Promise<WorkspaceAppSummary[]> {\n if (!options.includeAgentCards) return apps;\n return Promise.all(\n apps.map(async (app) => {\n if (app.status === \"pending\") return app;\n const metadata = await fetchAgentCardMetadata(app);\n return { ...app, ...metadata };\n }),\n );\n}\n\nasync function recordPendingWorkspaceApp(input: {\n appId: string;\n projectId: string | null;\n branchName?: string | null;\n builderUrl?: string | null;\n}) {\n const now = new Date().toISOString();\n const raw = await readSettingsRecord();\n const pendingApps = parsePendingWorkspaceApps(raw.pendingApps);\n const existing = pendingApps.find((app) => app.id === input.appId);\n const next: PendingWorkspaceApp = {\n id: input.appId,\n name: titleCase(input.appId),\n description:\n \"Builder is creating this app. The workspace path becomes live after the branch is merged and deployed.\",\n path: `/${input.appId}`,\n builderUrl: input.builderUrl?.trim() || null,\n branchName: input.branchName?.trim() || null,\n projectId: input.projectId,\n createdAt: existing?.createdAt || now,\n updatedAt: now,\n };\n\n await putSetting(scopedSettingsKey(), {\n ...raw,\n pendingApps: [\n next,\n ...pendingApps.filter((app) => app.id !== input.appId),\n ].slice(0, MAX_PENDING_APPS),\n });\n\n await recordAudit({\n action: \"workspace-app.pending\",\n targetType: \"workspace-app\",\n targetId: input.appId,\n summary: \"Started Builder branch for workspace app creation\",\n metadata: {\n builderBranchUrlConfigured: !!next.builderUrl,\n branchName: next.branchName,\n projectIdConfigured: !!next.projectId,\n },\n });\n}\n\nfunction readWorkspaceAppsFromEnv(): WorkspaceAppSummary[] | null {\n const raw = process.env[WORKSPACE_APPS_ENV_KEY];\n if (!raw) return null;\n try {\n return parseWorkspaceAppsManifest(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n\nfunction workspaceAppsManifestCandidates(): string[] {\n const candidates: string[] = [];\n try {\n candidates.push(\n path.join(process.cwd(), \".agent-native\", WORKSPACE_APPS_MANIFEST_FILE),\n path.join(process.cwd(), WORKSPACE_APPS_MANIFEST_FILE),\n );\n } catch {\n // Some edge runtimes do not expose process.cwd().\n }\n try {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n candidates.push(\n path.join(moduleDir, \".agent-native\", WORKSPACE_APPS_MANIFEST_FILE),\n path.join(moduleDir, WORKSPACE_APPS_MANIFEST_FILE),\n );\n } catch {\n // Some edge runtimes expose non-file module URLs. The env manifest still\n // works there, so skip file-relative candidates.\n }\n return candidates;\n}\n\nfunction readWorkspaceAppsFromManifestFile(): WorkspaceAppSummary[] | null {\n for (const file of workspaceAppsManifestCandidates()) {\n if (!fs.existsSync(file)) continue;\n const apps = parseWorkspaceAppsManifest(readJson(file));\n if (apps) return apps;\n }\n return null;\n}\n\nexport function getEnvBuilderProjectId(): string | null {\n return (\n process.env.DISPATCH_BUILDER_PROJECT_ID ||\n process.env.BUILDER_BRANCH_PROJECT_ID ||\n process.env.BUILDER_PROJECT_ID ||\n null\n );\n}\n\n/**\n * Read the workspace's identity from the workspace root's package.json. Used to\n * surface \"Workspace: <name>\" in the Dispatch UI so first-time users can see\n * the container their apps live inside (rather than only seeing app names like\n * \"starter\" / \"dispatch\" with no parent context).\n */\nexport function getWorkspaceInfo(): WorkspaceInfo {\n const rootPath = findWorkspaceRoot();\n if (!rootPath) {\n return { name: null, displayName: null, rootPath: null, appCount: 0 };\n }\n const pkg = readJson(path.join(rootPath, \"package.json\"));\n const rawName = typeof pkg?.name === \"string\" ? pkg.name.trim() : \"\";\n // Strip a leading \"@scope/\" if the workspace root happens to be scoped.\n const name = rawName.replace(/^@[^/]+\\//, \"\") || null;\n // Honor an explicit `displayName` in the workspace package.json before\n // falling back to a title-cased version of the slug. Users naming a\n // workspace \"On-Call Todo Manager\" via `displayName` should see that\n // exact label rather than `On Call Todo Manager`.\n const rawDisplay =\n typeof pkg?.displayName === \"string\" ? pkg.displayName.trim() : \"\";\n const displayName = rawDisplay || (name ? titleCase(name) : null);\n let appCount = 0;\n const appsDir = path.join(rootPath, \"apps\");\n if (fs.existsSync(appsDir)) {\n try {\n appCount = fs\n .readdirSync(appsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory()).length;\n } catch {\n appCount = 0;\n }\n }\n return {\n name,\n displayName,\n rootPath,\n appCount,\n };\n}\n\nexport async function listWorkspaceApps(\n options: ListWorkspaceAppsOptions = {},\n): Promise<WorkspaceAppSummary[]> {\n const manifestApps =\n readWorkspaceAppsFromEnv() ?? readWorkspaceAppsFromManifestFile();\n if (manifestApps) {\n return maybeIncludeAgentCards(\n await appendPendingWorkspaceApps(manifestApps),\n options,\n );\n }\n\n const workspaceRoot = findWorkspaceRoot();\n if (!workspaceRoot) {\n return maybeIncludeAgentCards(\n await appendPendingWorkspaceApps([\n {\n id: \"dispatch\",\n name: \"Dispatch\",\n description: \"Workspace control plane\",\n path: \"/dispatch\",\n url: workspaceAppUrl(\"/dispatch\"),\n isDispatch: true,\n status: \"ready\",\n },\n ]),\n options,\n );\n }\n\n const appsDir = path.join(workspaceRoot, \"apps\");\n if (!fs.existsSync(appsDir)) {\n return maybeIncludeAgentCards(\n await appendPendingWorkspaceApps([]),\n options,\n );\n }\n\n const apps = fs\n .readdirSync(appsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry): WorkspaceAppSummary | null => {\n const appDir = path.join(appsDir, entry.name);\n const pkg = readJson(path.join(appDir, \"package.json\"));\n if (!pkg) return null;\n return {\n id: entry.name,\n name: pkg.displayName || titleCase(entry.name),\n description: pkg.description || \"\",\n path: `/${entry.name}`,\n url: workspaceAppUrl(`/${entry.name}`),\n isDispatch: entry.name === \"dispatch\",\n status: \"ready\",\n } satisfies WorkspaceAppSummary;\n })\n .filter((app): app is WorkspaceAppSummary => !!app)\n .sort(sortWorkspaceApps);\n return maybeIncludeAgentCards(\n await appendPendingWorkspaceApps(apps),\n options,\n );\n}\n\nexport async function getAppCreationSettings(): Promise<AppCreationSettings> {\n const envBuilderProjectId = getEnvBuilderProjectId();\n const resolvedBuilderProjectId = await resolveBuilderBranchProjectId();\n const raw = await readSettingsRecord();\n const savedBuilderProjectId =\n typeof raw?.builderProjectId === \"string\" && raw.builderProjectId.trim()\n ? raw.builderProjectId.trim()\n : null;\n const builderProjectId = envBuilderProjectId || savedBuilderProjectId;\n const enableBuilder =\n process.env.ENABLE_BUILDER === \"true\" || process.env.ENABLE_BUILDER === \"1\";\n const effectiveBuilderProjectId =\n builderProjectId ||\n resolvedBuilderProjectId ||\n (enableBuilder ? getBuilderBranchProjectId() : null);\n\n return {\n builderProjectId: effectiveBuilderProjectId,\n builderProjectIdSource: envBuilderProjectId\n ? \"env\"\n : savedBuilderProjectId\n ? \"dispatch\"\n : effectiveBuilderProjectId\n ? \"default\"\n : \"unset\",\n envBuilderProjectId,\n savedBuilderProjectId,\n builderBranchingEnabled: !!effectiveBuilderProjectId,\n };\n}\n\nexport async function setAppCreationSettings(input: {\n builderProjectId?: string | null;\n}): Promise<AppCreationSettings> {\n await assertCanManageAppCreationSettings();\n const builderProjectId = input.builderProjectId?.trim() || null;\n const raw = await readSettingsRecord();\n await putSetting(scopedSettingsKey(), { ...raw, builderProjectId });\n await recordAudit({\n action: \"settings.updated\",\n targetType: \"dispatch-app-creation-settings\",\n targetId: SETTINGS_KEY,\n summary: builderProjectId\n ? \"Updated default Builder project for app creation\"\n : \"Cleared default Builder project for app creation\",\n metadata: { builderProjectIdConfigured: !!builderProjectId },\n });\n return getAppCreationSettings();\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/^[^a-z]+/, \"\")\n .slice(0, 64);\n}\n\nfunction isLocalAppCreationRuntime(): boolean {\n if (process.env.NODE_ENV === \"production\") return false;\n if (\n process.env.NETLIFY ||\n process.env.VERCEL ||\n process.env.CF_PAGES ||\n process.env.DEPLOY_URL ||\n process.env.URL ||\n process.env.RENDER ||\n process.env.FLY_APP_NAME\n ) {\n return false;\n }\n return true;\n}\n\nfunction isSyntheticIntegrationOwner(ownerEmail: string): boolean {\n return (\n ownerEmail.startsWith(\"integration@\") ||\n ownerEmail.endsWith(\"@integration.local\")\n );\n}\n\nasync function requestOwnerRole(): Promise<string | null> {\n const orgId = currentOrgId();\n const ownerEmail = currentOwnerEmail();\n if (!orgId) return null;\n try {\n const { rows } = await getDbExec().execute({\n sql: `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n args: [orgId, ownerEmail.toLowerCase()],\n });\n const role = (rows[0] as any)?.role;\n return typeof role === \"string\" ? role : null;\n } catch {\n return null;\n }\n}\n\nasync function assertCanManageAppCreationSettings(): Promise<void> {\n const orgId = currentOrgId();\n if (!orgId) return;\n const role = await requestOwnerRole();\n if (role !== \"owner\" && role !== \"admin\") {\n throw new Error(\n \"Only organization owners and admins can update app creation settings.\",\n );\n }\n}\n\nasync function isCurrentIntegrationExplicitlyLinked(): Promise<boolean> {\n const incoming = getRequestContext()?.integration?.incoming;\n if (!incoming) return true;\n const externalUserId = identityKeyForIncoming(incoming);\n const linkedOwner = await resolveLinkedOwner(\n incoming.platform,\n externalUserId,\n {\n allowAnyOrgFallback: true,\n },\n ).catch(() => null);\n return linkedOwner === currentOwnerEmail();\n}\n\nasync function defaultOwnerAppCreationAllowed(): Promise<boolean> {\n const defaultOwner = process.env.DISPATCH_DEFAULT_OWNER_EMAIL?.trim();\n if (!defaultOwner || defaultOwner !== currentOwnerEmail()) return false;\n if (await isCurrentIntegrationExplicitlyLinked()) return true;\n return (\n process.env.DISPATCH_ALLOW_DEFAULT_OWNER_APP_CREATION === \"true\" ||\n process.env.DISPATCH_ALLOW_DEFAULT_OWNER_APP_CREATION === \"1\" ||\n process.env.ENABLE_BUILDER === \"true\" ||\n process.env.ENABLE_BUILDER === \"1\"\n );\n}\n\nfunction normalizeBuilderRunString(value: unknown, fieldName: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Builder app creation returned a blank ${fieldName}`);\n }\n const trimmed = value.trim();\n if (/[\u0000-\u001f]/.test(trimmed)) {\n throw new Error(`Builder app creation returned a malformed ${fieldName}`);\n }\n return trimmed;\n}\n\nfunction normalizeBuilderRunUrl(value: unknown): string {\n const urlString = normalizeBuilderRunString(value, \"url\");\n let parsed: URL;\n try {\n parsed = new URL(urlString);\n } catch {\n throw new Error(\"Builder app creation returned a malformed url\");\n }\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n throw new Error(\"Builder app creation returned a malformed url\");\n }\n if (\n parsed.hostname !== \"builder.io\" &&\n !parsed.hostname.endsWith(\".builder.io\")\n ) {\n throw new Error(\"Builder app creation returned a non-Builder url\");\n }\n return parsed.toString();\n}\n\nfunction normalizeBuilderRunResult(result: unknown): {\n branchName: string;\n url: string;\n status: string;\n} {\n const record =\n result && typeof result === \"object\" && !Array.isArray(result)\n ? (result as Record<string, unknown>)\n : {};\n return {\n branchName: normalizeBuilderRunString(record.branchName, \"branchName\"),\n url: normalizeBuilderRunUrl(record.url),\n status:\n typeof record.status === \"string\" && record.status.trim()\n ? record.status.trim()\n : \"processing\",\n };\n}\n\nasync function remoteAppCreationAuthorization(): Promise<\n { ok: true } | { ok: false; message: string }\n> {\n const ownerEmail = currentOwnerEmail();\n const isIntegrationCaller = isIntegrationCallerRequest();\n const defaultOwner = process.env.DISPATCH_DEFAULT_OWNER_EMAIL?.trim();\n if (isIntegrationCaller && defaultOwner && defaultOwner === ownerEmail) {\n if (await defaultOwnerAppCreationAllowed()) return { ok: true };\n return {\n ok: false,\n message:\n \"Messaging-triggered app creation is using the deployment default Dispatch owner. \" +\n \"Link the messaging identity to a Dispatch user with /link, start the app from Dispatch while signed in, or explicitly set ENABLE_BUILDER=true for this deployment.\",\n };\n }\n if (!isSyntheticIntegrationOwner(ownerEmail)) return { ok: true };\n\n const source = isIntegrationCaller\n ? \"Messaging-triggered\"\n : \"Synthetic integration\";\n return {\n ok: false,\n message:\n `${source} app creation needs a trusted Dispatch owner before Builder can start a branch. ` +\n \"Link the messaging identity to a Dispatch user with /link, start the app from Dispatch while signed in, or explicitly set ENABLE_BUILDER=true for this deployment.\",\n };\n}\n\nfunction buildWorkspaceAppPrompt(input: {\n prompt: string;\n appId?: string | null;\n template?: string | null;\n selectedKeys?: string[];\n}): { appId: string; prompt: string } {\n const appId =\n slugify(input.appId || \"\") ||\n slugify(\n input.prompt.replace(/\\b(build|create|make|an?|the|app|tool)\\b/gi, \" \"),\n ) ||\n \"new-app\";\n const selectedKeys = input.selectedKeys || [];\n return {\n appId,\n prompt: [\n \"Create a new agent-native app in this workspace.\",\n \"\",\n `App name: ${appId}`,\n `Template to start from: ${input.template || \"starter\"}`,\n `User prompt: ${input.prompt.trim()}`,\n selectedKeys.length\n ? `Dispatch vault keys selected for this app: ${selectedKeys.join(\", \")}`\n : \"Dispatch vault keys selected for this app: none\",\n \"\",\n `Use the workspace app layout: create it under apps/${appId}, mount it at /${appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,\n selectedKeys.length\n ? `Dispatch will create pending vault requests for the selected keys for appId \"${appId}\" after this app creation request is accepted. Do not grant or sync vault keys directly from the app-creation branch.`\n : \"Do not grant or request any Dispatch vault keys unless the user asks later.\",\n \"\",\n \"Agent-native rules (these are the framework's contract — not optional):\",\n `- Persist ALL data in SQL via Drizzle. Add tables to apps/${appId}/server/db/schema.ts and migrations to apps/${appId}/server/plugins/db.ts. NEVER use localStorage, sessionStorage, IndexedDB, or in-memory state for anything the user expects to persist — agent and UI must read the same source of truth.`,\n `- Define every create/read/update/delete as an action in apps/${appId}/actions/ using defineAction. The agent calls these as tools and the frontend calls them at /_agent-native/actions/<name> via useActionQuery / useActionMutation. Don't add /api/* routes for CRUD.`,\n \"- Build the UI from shadcn/ui components in app/components/ui/ (Button, Input, Dialog, Popover, Card, etc.) and Tailwind utilities. Don't author bespoke CSS classes in global.css unless you genuinely need a primitive that shadcn doesn't ship.\",\n \"- Use Tabler Icons (@tabler/icons-react) for every icon. Never use emojis as icons.\",\n `- Expose what the user is looking at via application_state (navigation.view, selection, etc.) so the agent has live context. Mirror the patterns in templates/mail or templates/slides.`,\n \"- Optimistic UI for every mutation: update the React Query cache immediately, navigate immediately, run the mutation in the background, roll back on error. Don't await a server round-trip before re-rendering.\",\n \"\",\n \"Branch readiness requirements before handing off:\",\n \"- The CLI auto-fills package.json name and displayName from the app id; only edit the description / scripts / dependencies if the app actually needs more than the template provides.\",\n \"- Do not add or update workspace-apps.json or .agent-native/workspace-apps.json unless the app needs an explicit external URL override; the root deploy generates the workspace app registry from apps/* and deploy metadata.\",\n \"- Update pnpm-lock.yaml when adding or changing dependencies so Netlify can install the branch reliably.\",\n \"- Update the app manifest/package/deploy metadata needed by the existing workspace deployment model; do not leave the branch relying only on uncommitted local state.\",\n \"- Verify the app's agent card/A2A metadata is ready so Dispatch can discover and delegate to the app after deployment.\",\n \"- Include a final verification note covering the registry entry, manifest/deploy metadata, and agent-card readiness.\",\n `When it is ready, start or update the workspace dev server and navigate the user to /${appId}.`,\n ].join(\"\\n\"),\n };\n}\n\nasync function requestSelectedVaultKeys(input: {\n appId: string;\n selectedKeys: string[];\n}) {\n if (input.selectedKeys.length === 0) return;\n await Promise.allSettled(\n input.selectedKeys.map((credentialKey) =>\n Promise.resolve().then(() =>\n createRequest({\n appId: input.appId,\n credentialKey,\n reason: `Requested during workspace app creation for ${input.appId}.`,\n }),\n ),\n ),\n );\n}\n\nexport async function startWorkspaceAppCreation(input: {\n prompt: string;\n appId?: string | null;\n template?: string | null;\n secretIds?: string[];\n}) {\n const initial = buildWorkspaceAppPrompt({\n prompt: input.prompt,\n appId: input.appId,\n template: input.template,\n });\n assertValidWorkspaceAppId(initial.appId);\n const isLocal = isLocalAppCreationRuntime();\n\n if (!isLocal) {\n const authorization = await remoteAppCreationAuthorization();\n if (authorization.ok === false) {\n return {\n mode: \"builder-unavailable\",\n appId: initial.appId,\n message: authorization.message,\n };\n }\n }\n\n const selectedKeys = input.secretIds?.length\n ? (await listSecrets())\n .filter((secret) => input.secretIds?.includes(secret.id))\n .map((secret) => secret.credentialKey)\n : [];\n const built = buildWorkspaceAppPrompt({\n prompt: input.prompt,\n appId: input.appId,\n template: input.template,\n selectedKeys,\n });\n const prompt = built.prompt;\n\n if (isLocal) {\n await requestSelectedVaultKeys({\n appId: built.appId,\n selectedKeys,\n });\n return {\n mode: \"local-agent\",\n appId: built.appId,\n prompt,\n message:\n \"Use the local code agent to create this app in the workspace, then open it from /dispatch/apps.\",\n };\n }\n\n const settings = await getAppCreationSettings();\n\n if (!settings.builderProjectId) {\n return {\n mode: \"coming-soon\",\n appId: built.appId,\n message:\n \"Builder app creation is coming soon here. Set a default Builder project in Dispatch or provide BUILDER_BRANCH_PROJECT_ID to enable branch creation.\",\n };\n }\n\n let result: {\n branchName: string;\n url: string;\n status: string;\n };\n try {\n const builderCreds = await resolveBuilderCredentials().catch(() => null);\n const builderUserId = builderCreds?.userId || undefined;\n result = normalizeBuilderRunResult(\n await runBuilderAgent({\n prompt,\n projectId: settings.builderProjectId,\n ...(builderUserId\n ? { userId: builderUserId }\n : { userEmail: currentOwnerEmail() }),\n }),\n );\n } catch (err) {\n const detail =\n err instanceof Error && err.message\n ? err.message\n : \"Builder could not start the app branch\";\n return {\n mode: \"builder-unavailable\",\n appId: built.appId,\n projectId: settings.builderProjectId,\n message:\n `Builder app creation is configured for project ${settings.builderProjectId}, ` +\n `but it could not start yet: ${detail}. Connect Builder for this user, ` +\n `link the messaging identity to that user, or configure deployment-managed Builder credentials for this workspace.`,\n };\n }\n\n await recordPendingWorkspaceApp({\n appId: built.appId,\n projectId: settings.builderProjectId,\n branchName: result.branchName,\n builderUrl: result.url,\n });\n\n await requestSelectedVaultKeys({\n appId: built.appId,\n selectedKeys,\n });\n\n return {\n mode: \"builder\",\n appId: built.appId,\n path: `/${built.appId}`,\n projectId: settings.builderProjectId,\n branchName: result.branchName,\n url: result.url,\n workspaceUrl: workspaceAppUrl(`/${built.appId}`),\n status: result.status,\n message:\n `Builder started a branch for /${built.appId}. Use the Builder branch URL to track creation now. ` +\n `The workspace path will be live after that branch is merged and the workspace deploy finishes, so it may 404 until then.`,\n };\n}\n"]}
1
+ {"version":3,"file":"app-creation-store.js","sourceRoot":"","sources":["../../../src/server/lib/app-creation-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,6BAA6B,EAC7B,yBAAyB,EACzB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,YAAY,GAAG,gCAAgC,CAAC;AACtD,MAAM,sBAAsB,GAAG,kCAAkC,CAAC;AAClE,MAAM,4BAA4B,GAAG,qBAAqB,CAAC;AAC3D,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,eAAe,GAAG,8BAA8B,CAAC;AACvD,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAwD1C,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;IACjD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;QACrD,IAAI,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,aAAa,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,IAAI,KAAK;QAAE,OAAO,GAAG,YAAY,QAAQ,KAAK,EAAE,CAAC;IACjD,OAAO,GAAG,YAAY,SAAS,iBAAiB,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1D,CAAC,CAAE,GAA2B;QAC9B,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,IAAI,GACR,OAAO,CAAC,GAAG,CAAC,qBAAqB;QACjC,OAAO,CAAC,GAAG,CAAC,OAAO;QACnB,OAAO,CAAC,GAAG,CAAC,GAAG;QACf,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,IAAI,CAAC;IACP,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAe,EACf,WAAqB;IAErB,MAAM,QAAQ,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,IAAI,CAAC,QAAQ;QAAE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;IAC3E,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAW;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;QACzC,CAAC,CAAC,MAAM,CAAC,IAAI;QACb,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACrB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,KAAK,EAA8B,EAAE;QACzC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,OAAO;YACL,EAAE;YACF,IAAI,EACF,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;gBACjD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;gBACnB,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YACnB,WAAW,EACT,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YAChE,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC;YAC3C,UAAU,EACR,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS;gBACnC,CAAC,CAAC,KAAK,CAAC,UAAU;gBAClB,CAAC,CAAC,EAAE,KAAK,UAAU;YACvB,MAAM,EAAE,OAAO;SACc,CAAC;IAClC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAG,EAA8B,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SAClD,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAsB,EAAE,CAAsB;IACvE,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,EAAE,GAAG,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,SAAS,GACb,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO;YACL,EAAE;YACF,IAAI,EACF,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;gBACnD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;gBACpB,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YACnB,WAAW,EACT,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;gBACpC,CAAC,CAAC,MAAM,CAAC,WAAW;gBACpB,CAAC,CAAC,wGAAwG;YAC9G,IAAI,EAAE,SAAS;YACf,UAAU,EACR,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;gBAC/D,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;gBAC1B,CAAC,CAAC,IAAI;YACV,UAAU,EACR,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;gBAC/D,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;gBAC1B,CAAC,CAAC,IAAI;YACV,SAAS,EACP,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;gBAC7D,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;gBACzB,CAAC,CAAC,IAAI;YACV,SAAS,EACP,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;gBAC7D,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;gBACzB,CAAC,CAAC,GAAG;YACT,SAAS,EACP,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;gBAC7D,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;gBACzB,CAAC,CAAC,GAAG;SACoB,CAAC;IAClC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAG,EAA8B,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SAClD,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,wBAAwB;IACrC,MAAM,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACvC,OAAO,yBAAyB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAwB;IACnD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,GAAG,EAAE,GAAG,CAAC,UAAU;QACnB,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,qBAAqB;QAClC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAA2B;IAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,CAAC,MAAM,wBAAwB,EAAE,CAAC;SACnD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SACtC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAqB;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,OAAO,GAAG,eAAe,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,OAAO,GAAG,eAAe,EAAE,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,MAA+B,EAC/B,GAAW;IAEX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAED,SAAS,cAAc,CAAC,IAA6B;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,GAAwB;IAWxB,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,kBAAkB,EAAE,KAAK;YACzB,cAAc,EAAE,IAAI;YACpB,SAAS,EAAE,IAAI;YACf,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,2BAA2B,CAC5B,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACzC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO;gBACL,YAAY;gBACZ,kBAAkB,EAAE,KAAK;gBACzB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,IAAI;gBACf,gBAAgB,EAAE,IAAI;aACvB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,IAAI,GACR,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5D,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,YAAY;gBACZ,kBAAkB,EAAE,KAAK;gBACzB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,IAAI;gBACf,gBAAgB,EAAE,IAAI;aACvB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,YAAY;YACZ,kBAAkB,EAAE,IAAI;YACxB,cAAc,EACZ,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;YAC9D,SAAS,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;YACpC,gBAAgB,EAAE,cAAc,CAAC,IAAI,CAAC;SACvC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,YAAY;YACZ,kBAAkB,EAAE,KAAK;YACzB,cAAc,EAAE,IAAI;YACpB,SAAS,EAAE,IAAI;YACf,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,IAA2B,EAC3B,OAAiC;IAEjC,IAAI,CAAC,OAAO,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IACjC,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,KAKxC;IACC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,yBAAyB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,IAAI,GAAwB;QAChC,EAAE,EAAE,KAAK,CAAC,KAAK;QACf,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,WAAW,EACT,wGAAwG;QAC1G,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;QACvB,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,IAAI;QAC5C,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,IAAI;QAC5C,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;QACrC,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,MAAM,UAAU,CAAC,iBAAiB,EAAE,EAAE;QACpC,GAAG,GAAG;QACN,WAAW,EAAE;YACX,IAAI;YACJ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC;SACvD,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC;KAC7B,CAAC,CAAC;IAEH,MAAM,WAAW,CAAC;QAChB,MAAM,EAAE,uBAAuB;QAC/B,UAAU,EAAE,eAAe;QAC3B,QAAQ,EAAE,KAAK,CAAC,KAAK;QACrB,OAAO,EAAE,mDAAmD;QAC5D,QAAQ,EAAE;YACR,0BAA0B,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;YAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;SACtC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,4BAA4B,CAAC,EACvE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,4BAA4B,CAAC,CACvD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,4BAA4B,CAAC,EACnE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,CACnD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,iDAAiD;IACnD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,iCAAiC;IACxC,KAAK,MAAM,IAAI,IAAI,+BAA+B,EAAE,EAAE,CAAC;QACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACnC,MAAM,IAAI,GAAG,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,+BAA+B,CACtC,aAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,IAAI,GAAG,EAAE;SACZ,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,KAAK,EAA8B,EAAE;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YAC9C,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;YAClC,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE;YACtB,GAAG,EAAE,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACtC,UAAU,EAAE,KAAK,CAAC,IAAI,KAAK,UAAU;YACrC,MAAM,EAAE,OAAO;SACc,CAAC;IAClC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAG,EAA8B,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SAClD,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACvC,OAAO,CAAC,GAAG,CAAC,yBAAyB;QACrC,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,IAAI,CACL,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,GAAG,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,wEAAwE;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;IACtD,uEAAuE;IACvE,oEAAoE;IACpE,qEAAqE;IACrE,kDAAkD;IAClD,MAAM,UAAU,GACd,OAAO,GAAG,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,WAAW,GAAG,UAAU,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,QAAQ,GAAG,EAAE;iBACV,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;iBAC7C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI;QACJ,WAAW;QACX,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAoC,EAAE;IAEtC,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAC1C,MAAM,mBAAmB,GACvB,aAAa,IAAI,yBAAyB,EAAE;QAC1C,CAAC,CAAC,+BAA+B,CAAC,aAAa,CAAC;QAChD,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,sBAAsB,CAC3B,MAAM,0BAA0B,CAAC,mBAAmB,CAAC,EACrD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAChB,wBAAwB,EAAE,IAAI,iCAAiC,EAAE,CAAC;IACpE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,sBAAsB,CAC3B,MAAM,0BAA0B,CAAC,YAAY,CAAC,EAC9C,OAAO,CACR,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,sBAAsB,CAC3B,MAAM,0BAA0B,CAAC;YAC/B;gBACE,EAAE,EAAE,UAAU;gBACd,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,yBAAyB;gBACtC,IAAI,EAAE,WAAW;gBACjB,GAAG,EAAE,eAAe,CAAC,WAAW,CAAC;gBACjC,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,OAAO;aAChB;SACF,CAAC,EACF,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,+BAA+B,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClE,OAAO,sBAAsB,CAC3B,MAAM,0BAA0B,CAAC,IAAI,CAAC,EACtC,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,CAAC;IACrD,MAAM,wBAAwB,GAAG,MAAM,6BAA6B,EAAE,CAAC;IACvE,MAAM,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACvC,MAAM,qBAAqB,GACzB,OAAO,GAAG,EAAE,gBAAgB,KAAK,QAAQ,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE;QACtE,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAC7B,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,gBAAgB,GAAG,mBAAmB,IAAI,qBAAqB,CAAC;IACtE,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC;IAC9E,MAAM,yBAAyB,GAC7B,gBAAgB;QAChB,wBAAwB;QACxB,CAAC,aAAa,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEvD,OAAO;QACL,gBAAgB,EAAE,yBAAyB;QAC3C,sBAAsB,EAAE,mBAAmB;YACzC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,qBAAqB;gBACrB,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,yBAAyB;oBACzB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,OAAO;QACf,mBAAmB;QACnB,qBAAqB;QACrB,uBAAuB,EAAE,CAAC,CAAC,yBAAyB;KACrD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAE5C;IACC,MAAM,kCAAkC,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAChE,MAAM,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACvC,MAAM,UAAU,CAAC,iBAAiB,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACpE,MAAM,WAAW,CAAC;QAChB,MAAM,EAAE,kBAAkB;QAC1B,UAAU,EAAE,gCAAgC;QAC5C,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,gBAAgB;YACvB,CAAC,CAAC,kDAAkD;YACpD,CAAC,CAAC,kDAAkD;QACtD,QAAQ,EAAE,EAAE,0BAA0B,EAAE,CAAC,CAAC,gBAAgB,EAAE;KAC7D,CAAC,CAAC;IACH,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,yBAAyB;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IACxD,IACE,OAAO,CAAC,GAAG,CAAC,OAAO;QACnB,OAAO,CAAC,GAAG,CAAC,MAAM;QAClB,OAAO,CAAC,GAAG,CAAC,QAAQ;QACpB,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,GAAG;QACf,OAAO,CAAC,GAAG,CAAC,MAAM;QAClB,OAAO,CAAC,GAAG,CAAC,YAAY,EACxB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,2BAA2B,CAAC,UAAkB;IACrD,OAAO,CACL,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC;QACrC,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;YACzC,GAAG,EAAE,4EAA4E;YACjF,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;SACxC,CAAC,CAAC;QACH,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAS,EAAE,IAAI,CAAC;QACpC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kCAAkC;IAC/C,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oCAAoC;IACjD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC;IAC5D,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,cAAc,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAC1C,QAAQ,CAAC,QAAQ,EACjB,cAAc,EACd;QACE,mBAAmB,EAAE,IAAI;KAC1B,CACF,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,WAAW,KAAK,iBAAiB,EAAE,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,8BAA8B;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,CAAC;IACtE,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,iBAAiB,EAAE;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,MAAM,oCAAoC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,yCAAyC,KAAK,MAAM;QAChE,OAAO,CAAC,GAAG,CAAC,yCAAyC,KAAK,GAAG;QAC7D,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;QACrC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAc,EAAE,SAAiB;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,6CAA6C,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,MAAM,SAAS,GAAG,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1D,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IACE,MAAM,CAAC,QAAQ,KAAK,YAAY;QAChC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EACxC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAe;IAKhD,MAAM,MAAM,GACV,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAE,MAAkC;QACrC,CAAC,CAAC,EAAE,CAAC;IACT,OAAO;QACL,UAAU,EAAE,yBAAyB,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC;QACtE,GAAG,EAAE,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC;QACvC,MAAM,EACJ,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YACvD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YACtB,CAAC,CAAC,YAAY;KACnB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,8BAA8B;IAG3C,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,mBAAmB,GAAG,0BAA0B,EAAE,CAAC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,CAAC;IACtE,IAAI,mBAAmB,IAAI,YAAY,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QACvE,IAAI,MAAM,8BAA8B,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAChE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EACL,mFAAmF;gBACnF,oKAAoK;SACvK,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAElE,MAAM,MAAM,GAAG,mBAAmB;QAChC,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,uBAAuB,CAAC;IAC5B,OAAO;QACL,EAAE,EAAE,KAAK;QACT,OAAO,EACL,GAAG,MAAM,kFAAkF;YAC3F,oKAAoK;KACvK,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,KAKhC;IACC,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,4CAA4C,EAAE,GAAG,CAAC,CACxE;QACD,SAAS,CAAC;IACZ,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IAC9C,OAAO;QACL,KAAK;QACL,MAAM,EAAE;YACN,kDAAkD;YAClD,EAAE;YACF,aAAa,KAAK,EAAE;YACpB,2BAA2B,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE;YACxD,gBAAgB,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;YACrC,YAAY,CAAC,MAAM;gBACjB,CAAC,CAAC,8CAA8C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACzE,CAAC,CAAC,iDAAiD;YACrD,EAAE;YACF,sDAAsD,KAAK,kBAAkB,KAAK,4IAA4I;YAC9N,YAAY,CAAC,MAAM;gBACjB,CAAC,CAAC,gFAAgF,KAAK,uHAAuH;gBAC9M,CAAC,CAAC,6EAA6E;YACjF,EAAE;YACF,yEAAyE;YACzE,6DAA6D,KAAK,+CAA+C,KAAK,0LAA0L;YAChT,iEAAiE,KAAK,qMAAqM;YAC3Q,oPAAoP;YACpP,qFAAqF;YACrF,yLAAyL;YACzL,kNAAkN;YAClN,EAAE;YACF,mDAAmD;YACnD,uLAAuL;YACvL,+NAA+N;YAC/N,0GAA0G;YAC1G,uKAAuK;YACvK,wHAAwH;YACxH,sHAAsH;YACtH,wFAAwF,KAAK,GAAG;SACjG,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,KAGvC;IACC,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC5C,MAAM,OAAO,CAAC,UAAU,CACtB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CACvC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAC1B,aAAa,CAAC;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,aAAa;QACb,MAAM,EAAE,+CAA+C,KAAK,CAAC,KAAK,GAAG;KACtE,CAAC,CACH,CACF,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,KAK/C;IACC,MAAM,OAAO,GAAG,uBAAuB,CAAC;QACtC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;IACH,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,yBAAyB,EAAE,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,aAAa,GAAG,MAAM,8BAA8B,EAAE,CAAC;QAC7D,IAAI,aAAa,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC/B,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,aAAa,CAAC,OAAO;aAC/B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,EAAE,MAAM;QAC1C,CAAC,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC;aAClB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;aACxD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GAAG,uBAAuB,CAAC;QACpC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY;KACb,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,wBAAwB,CAAC;YAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY;SACb,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM;YACN,OAAO,EACL,iGAAiG;SACpG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAEhD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EACL,qJAAqJ;SACxJ,CAAC;IACJ,CAAC;IAED,IAAI,MAIH,CAAC;IACF,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,yBAAyB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACzE,MAAM,aAAa,GAAG,YAAY,EAAE,MAAM,IAAI,SAAS,CAAC;QACxD,MAAM,GAAG,yBAAyB,CAChC,MAAM,eAAe,CAAC;YACpB,MAAM;YACN,SAAS,EAAE,QAAQ,CAAC,gBAAgB;YACpC,GAAG,CAAC,aAAa;gBACf,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE;gBAC3B,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC;SACxC,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GACV,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO;YACjC,CAAC,CAAC,GAAG,CAAC,OAAO;YACb,CAAC,CAAC,wCAAwC,CAAC;QAC/C,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,QAAQ,CAAC,gBAAgB;YACpC,OAAO,EACL,kDAAkD,QAAQ,CAAC,gBAAgB,IAAI;gBAC/E,+BAA+B,MAAM,mCAAmC;gBACxE,mHAAmH;SACtH,CAAC;IACJ,CAAC;IAED,MAAM,yBAAyB,CAAC;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,QAAQ,CAAC,gBAAgB;QACpC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,GAAG;KACvB,CAAC,CAAC;IAEH,MAAM,wBAAwB,CAAC;QAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,YAAY;KACb,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;QACvB,SAAS,EAAE,QAAQ,CAAC,gBAAgB;QACpC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,YAAY,EAAE,eAAe,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EACL,iCAAiC,KAAK,CAAC,KAAK,sDAAsD;YAClG,0HAA0H;KAC7H,CAAC;AACJ,CAAC","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getSetting, putSetting } from \"@agent-native/core/settings\";\nimport {\n getBuilderBranchProjectId,\n getRequestContext,\n isIntegrationCallerRequest,\n resolveBuilderBranchProjectId,\n resolveBuilderCredentials,\n runBuilderAgent,\n} from \"@agent-native/core/server\";\nimport { getDbExec } from \"@agent-native/core/db\";\nimport { assertValidWorkspaceAppId } from \"@agent-native/core/shared\";\nimport {\n currentOrgId,\n currentOwnerEmail,\n recordAudit,\n resolveLinkedOwner,\n} from \"./dispatch-store.js\";\nimport { identityKeyForIncoming } from \"./dispatch-integrations.js\";\nimport { createRequest, listSecrets } from \"./vault-store.js\";\n\nconst SETTINGS_KEY = \"dispatch-app-creation-settings\";\nconst WORKSPACE_APPS_ENV_KEY = \"AGENT_NATIVE_WORKSPACE_APPS_JSON\";\nconst WORKSPACE_APPS_MANIFEST_FILE = \"workspace-apps.json\";\nconst MAX_PENDING_APPS = 50;\nconst AGENT_CARD_PATH = \"/.well-known/agent-card.json\";\nconst AGENT_CARD_FETCH_TIMEOUT_MS = 1_500;\n\nexport interface WorkspaceAppSummary {\n id: string;\n name: string;\n description: string;\n path: string;\n url: string | null;\n isDispatch: boolean;\n status?: \"ready\" | \"pending\";\n statusLabel?: string;\n builderUrl?: string | null;\n branchName?: string | null;\n createdAt?: string | null;\n agentCardUrl?: string | null;\n agentCardReachable?: boolean;\n a2aEndpointUrl?: string | null;\n agentName?: string | null;\n agentSkillsCount?: number | null;\n}\n\nexport interface ListWorkspaceAppsOptions {\n includeAgentCards?: boolean;\n}\n\nexport interface AppCreationSettings {\n builderProjectId: string | null;\n builderProjectIdSource: \"env\" | \"dispatch\" | \"default\" | \"unset\";\n envBuilderProjectId: string | null;\n savedBuilderProjectId: string | null;\n builderBranchingEnabled: boolean;\n}\n\nexport interface WorkspaceInfo {\n /** Slug from the workspace root package.json `name` (e.g. \"on-call-todo-manager\"). */\n name: string | null;\n /** Title-cased version for display (e.g. \"On Call Todo Manager\"). */\n displayName: string | null;\n /** Absolute path to the workspace root, if detected. */\n rootPath: string | null;\n /** Number of apps currently scaffolded under apps/. */\n appCount: number;\n}\n\ninterface PendingWorkspaceApp {\n id: string;\n name: string;\n description: string;\n path: string;\n builderUrl: string | null;\n branchName: string | null;\n projectId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction readJson(file: string): any {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction findWorkspaceRoot(startDir = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n for (let i = 0; i < 20; i++) {\n const pkg = readJson(path.join(dir, \"package.json\"));\n if (typeof pkg?.[\"agent-native\"]?.workspaceCore === \"string\") {\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\nfunction titleCase(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction scopedSettingsKey(): string {\n const orgId = currentOrgId();\n if (orgId) return `${SETTINGS_KEY}:org:${orgId}`;\n return `${SETTINGS_KEY}:user:${currentOwnerEmail()}`;\n}\n\nasync function readSettingsRecord(): Promise<Record<string, any>> {\n const raw = await getSetting(scopedSettingsKey()).catch(() => null);\n return raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, any>)\n : {};\n}\n\nfunction workspaceAppUrl(appPath: string): string | null {\n const base =\n process.env.WORKSPACE_GATEWAY_URL ||\n process.env.APP_URL ||\n process.env.URL ||\n process.env.DEPLOY_URL ||\n process.env.BETTER_AUTH_URL ||\n null;\n if (!base) return null;\n try {\n return new URL(appPath, `${base.replace(/\\/$/, \"\")}/`).toString();\n } catch {\n return null;\n }\n}\n\nfunction workspaceAppLink(\n appPath: string,\n explicitUrl?: unknown,\n): string | null {\n const urlValue = typeof explicitUrl === \"string\" ? explicitUrl.trim() : \"\";\n if (!urlValue) return workspaceAppUrl(appPath);\n if (urlValue.startsWith(\"/\")) return workspaceAppUrl(urlValue) ?? urlValue;\n try {\n return new URL(urlValue).toString();\n } catch {\n return urlValue;\n }\n}\n\nfunction parseWorkspaceAppsManifest(parsed: any): WorkspaceAppSummary[] | null {\n const rawApps = Array.isArray(parsed?.apps)\n ? parsed.apps\n : Array.isArray(parsed)\n ? parsed\n : null;\n if (!rawApps) return null;\n\n const apps = rawApps\n .map((entry): WorkspaceAppSummary | null => {\n if (!entry || typeof entry !== \"object\") return null;\n const id = typeof entry.id === \"string\" ? entry.id.trim() : \"\";\n const pathValue = typeof entry.path === \"string\" ? entry.path.trim() : \"\";\n if (!id || !pathValue.startsWith(\"/\")) return null;\n return {\n id,\n name:\n typeof entry.name === \"string\" && entry.name.trim()\n ? entry.name.trim()\n : titleCase(id),\n description:\n typeof entry.description === \"string\" ? entry.description : \"\",\n path: pathValue,\n url: workspaceAppLink(pathValue, entry.url),\n isDispatch:\n typeof entry.isDispatch === \"boolean\"\n ? entry.isDispatch\n : id === \"dispatch\",\n status: \"ready\",\n } satisfies WorkspaceAppSummary;\n })\n .filter((app): app is WorkspaceAppSummary => !!app)\n .sort(sortWorkspaceApps);\n\n return apps.length ? apps : null;\n}\n\nfunction sortWorkspaceApps(a: WorkspaceAppSummary, b: WorkspaceAppSummary) {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n if (a.status === \"pending\" && b.status !== \"pending\") return 1;\n if (a.status !== \"pending\" && b.status === \"pending\") return -1;\n return a.name.localeCompare(b.name);\n}\n\nfunction parsePendingWorkspaceApps(value: unknown): PendingWorkspaceApp[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((entry) => {\n if (!entry || typeof entry !== \"object\") return null;\n const record = entry as Record<string, unknown>;\n const id = typeof record.id === \"string\" ? record.id.trim() : \"\";\n const pathValue =\n typeof record.path === \"string\" ? record.path.trim() : \"\";\n if (!id || !pathValue.startsWith(\"/\")) return null;\n const now = new Date().toISOString();\n return {\n id,\n name:\n typeof record.name === \"string\" && record.name.trim()\n ? record.name.trim()\n : titleCase(id),\n description:\n typeof record.description === \"string\"\n ? record.description\n : \"Builder is creating this app. The workspace path becomes live after the branch is merged and deployed.\",\n path: pathValue,\n builderUrl:\n typeof record.builderUrl === \"string\" && record.builderUrl.trim()\n ? record.builderUrl.trim()\n : null,\n branchName:\n typeof record.branchName === \"string\" && record.branchName.trim()\n ? record.branchName.trim()\n : null,\n projectId:\n typeof record.projectId === \"string\" && record.projectId.trim()\n ? record.projectId.trim()\n : null,\n createdAt:\n typeof record.createdAt === \"string\" && record.createdAt.trim()\n ? record.createdAt.trim()\n : now,\n updatedAt:\n typeof record.updatedAt === \"string\" && record.updatedAt.trim()\n ? record.updatedAt.trim()\n : now,\n } satisfies PendingWorkspaceApp;\n })\n .filter((app): app is PendingWorkspaceApp => !!app)\n .slice(0, MAX_PENDING_APPS);\n}\n\nasync function listPendingWorkspaceApps(): Promise<PendingWorkspaceApp[]> {\n const raw = await readSettingsRecord();\n return parsePendingWorkspaceApps(raw.pendingApps);\n}\n\nfunction pendingAppToSummary(app: PendingWorkspaceApp): WorkspaceAppSummary {\n return {\n id: app.id,\n name: app.name,\n description: app.description,\n path: app.path,\n url: app.builderUrl,\n isDispatch: false,\n status: \"pending\",\n statusLabel: \"Building in Builder\",\n builderUrl: app.builderUrl,\n branchName: app.branchName,\n createdAt: app.createdAt,\n };\n}\n\nasync function appendPendingWorkspaceApps(\n apps: WorkspaceAppSummary[],\n): Promise<WorkspaceAppSummary[]> {\n const readyIds = new Set(apps.map((app) => app.id));\n const pendingApps = (await listPendingWorkspaceApps())\n .filter((app) => !readyIds.has(app.id))\n .map(pendingAppToSummary);\n return [...apps, ...pendingApps].sort(sortWorkspaceApps);\n}\n\nfunction agentCardUrlForApp(appUrl: string | null): string | null {\n if (!appUrl) return null;\n const trimmed = appUrl.replace(/\\/+$/, \"\");\n if (!trimmed) return null;\n try {\n return new URL(`${trimmed}${AGENT_CARD_PATH}`).toString();\n } catch {\n return `${trimmed}${AGENT_CARD_PATH}`;\n }\n}\n\nfunction stringField(\n record: Record<string, unknown>,\n key: string,\n): string | null {\n const value = record[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction numberOfSkills(card: Record<string, unknown>): number | null {\n return Array.isArray(card.skills) ? card.skills.length : null;\n}\n\nasync function fetchAgentCardMetadata(\n app: WorkspaceAppSummary,\n): Promise<\n Pick<\n WorkspaceAppSummary,\n | \"agentCardUrl\"\n | \"agentCardReachable\"\n | \"a2aEndpointUrl\"\n | \"agentName\"\n | \"agentSkillsCount\"\n >\n> {\n const agentCardUrl = agentCardUrlForApp(app.url);\n if (!agentCardUrl) {\n return {\n agentCardUrl: null,\n agentCardReachable: false,\n a2aEndpointUrl: null,\n agentName: null,\n agentSkillsCount: null,\n };\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n AGENT_CARD_FETCH_TIMEOUT_MS,\n );\n\n try {\n const response = await fetch(agentCardUrl, {\n headers: { accept: \"application/json\" },\n signal: controller.signal,\n });\n if (!response.ok) {\n return {\n agentCardUrl,\n agentCardReachable: false,\n a2aEndpointUrl: null,\n agentName: null,\n agentSkillsCount: null,\n };\n }\n\n const parsed = await response.json().catch(() => null);\n const card =\n parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n if (!card) {\n return {\n agentCardUrl,\n agentCardReachable: false,\n a2aEndpointUrl: null,\n agentName: null,\n agentSkillsCount: null,\n };\n }\n\n return {\n agentCardUrl,\n agentCardReachable: true,\n a2aEndpointUrl:\n stringField(card, \"url\") ?? stringField(card, \"endpointUrl\"),\n agentName: stringField(card, \"name\"),\n agentSkillsCount: numberOfSkills(card),\n };\n } catch {\n return {\n agentCardUrl,\n agentCardReachable: false,\n a2aEndpointUrl: null,\n agentName: null,\n agentSkillsCount: null,\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function maybeIncludeAgentCards(\n apps: WorkspaceAppSummary[],\n options: ListWorkspaceAppsOptions,\n): Promise<WorkspaceAppSummary[]> {\n if (!options.includeAgentCards) return apps;\n return Promise.all(\n apps.map(async (app) => {\n if (app.status === \"pending\") return app;\n const metadata = await fetchAgentCardMetadata(app);\n return { ...app, ...metadata };\n }),\n );\n}\n\nasync function recordPendingWorkspaceApp(input: {\n appId: string;\n projectId: string | null;\n branchName?: string | null;\n builderUrl?: string | null;\n}) {\n const now = new Date().toISOString();\n const raw = await readSettingsRecord();\n const pendingApps = parsePendingWorkspaceApps(raw.pendingApps);\n const existing = pendingApps.find((app) => app.id === input.appId);\n const next: PendingWorkspaceApp = {\n id: input.appId,\n name: titleCase(input.appId),\n description:\n \"Builder is creating this app. The workspace path becomes live after the branch is merged and deployed.\",\n path: `/${input.appId}`,\n builderUrl: input.builderUrl?.trim() || null,\n branchName: input.branchName?.trim() || null,\n projectId: input.projectId,\n createdAt: existing?.createdAt || now,\n updatedAt: now,\n };\n\n await putSetting(scopedSettingsKey(), {\n ...raw,\n pendingApps: [\n next,\n ...pendingApps.filter((app) => app.id !== input.appId),\n ].slice(0, MAX_PENDING_APPS),\n });\n\n await recordAudit({\n action: \"workspace-app.pending\",\n targetType: \"workspace-app\",\n targetId: input.appId,\n summary: \"Started Builder branch for workspace app creation\",\n metadata: {\n builderBranchUrlConfigured: !!next.builderUrl,\n branchName: next.branchName,\n projectIdConfigured: !!next.projectId,\n },\n });\n}\n\nfunction readWorkspaceAppsFromEnv(): WorkspaceAppSummary[] | null {\n const raw = process.env[WORKSPACE_APPS_ENV_KEY];\n if (!raw) return null;\n try {\n return parseWorkspaceAppsManifest(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n\nfunction workspaceAppsManifestCandidates(): string[] {\n const candidates: string[] = [];\n try {\n candidates.push(\n path.join(process.cwd(), \".agent-native\", WORKSPACE_APPS_MANIFEST_FILE),\n path.join(process.cwd(), WORKSPACE_APPS_MANIFEST_FILE),\n );\n } catch {\n // Some edge runtimes do not expose process.cwd().\n }\n try {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n candidates.push(\n path.join(moduleDir, \".agent-native\", WORKSPACE_APPS_MANIFEST_FILE),\n path.join(moduleDir, WORKSPACE_APPS_MANIFEST_FILE),\n );\n } catch {\n // Some edge runtimes expose non-file module URLs. The env manifest still\n // works there, so skip file-relative candidates.\n }\n return candidates;\n}\n\nfunction readWorkspaceAppsFromManifestFile(): WorkspaceAppSummary[] | null {\n for (const file of workspaceAppsManifestCandidates()) {\n if (!fs.existsSync(file)) continue;\n const apps = parseWorkspaceAppsManifest(readJson(file));\n if (apps) return apps;\n }\n return null;\n}\n\nfunction readWorkspaceAppsFromFilesystem(\n workspaceRoot: string,\n): WorkspaceAppSummary[] | null {\n const appsDir = path.join(workspaceRoot, \"apps\");\n if (!fs.existsSync(appsDir)) return null;\n\n const apps = fs\n .readdirSync(appsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry): WorkspaceAppSummary | null => {\n const appDir = path.join(appsDir, entry.name);\n const pkg = readJson(path.join(appDir, \"package.json\"));\n if (!pkg) return null;\n return {\n id: entry.name,\n name: pkg.displayName || titleCase(entry.name),\n description: pkg.description || \"\",\n path: `/${entry.name}`,\n url: workspaceAppUrl(`/${entry.name}`),\n isDispatch: entry.name === \"dispatch\",\n status: \"ready\",\n } satisfies WorkspaceAppSummary;\n })\n .filter((app): app is WorkspaceAppSummary => !!app)\n .sort(sortWorkspaceApps);\n\n return apps.length ? apps : null;\n}\n\nexport function getEnvBuilderProjectId(): string | null {\n return (\n process.env.DISPATCH_BUILDER_PROJECT_ID ||\n process.env.BUILDER_BRANCH_PROJECT_ID ||\n process.env.BUILDER_PROJECT_ID ||\n null\n );\n}\n\n/**\n * Read the workspace's identity from the workspace root's package.json. Used to\n * surface \"Workspace: <name>\" in the Dispatch UI so first-time users can see\n * the container their apps live inside (rather than only seeing app names like\n * \"starter\" / \"dispatch\" with no parent context).\n */\nexport function getWorkspaceInfo(): WorkspaceInfo {\n const rootPath = findWorkspaceRoot();\n if (!rootPath) {\n return { name: null, displayName: null, rootPath: null, appCount: 0 };\n }\n const pkg = readJson(path.join(rootPath, \"package.json\"));\n const rawName = typeof pkg?.name === \"string\" ? pkg.name.trim() : \"\";\n // Strip a leading \"@scope/\" if the workspace root happens to be scoped.\n const name = rawName.replace(/^@[^/]+\\//, \"\") || null;\n // Honor an explicit `displayName` in the workspace package.json before\n // falling back to a title-cased version of the slug. Users naming a\n // workspace \"On-Call Todo Manager\" via `displayName` should see that\n // exact label rather than `On Call Todo Manager`.\n const rawDisplay =\n typeof pkg?.displayName === \"string\" ? pkg.displayName.trim() : \"\";\n const displayName = rawDisplay || (name ? titleCase(name) : null);\n let appCount = 0;\n const appsDir = path.join(rootPath, \"apps\");\n if (fs.existsSync(appsDir)) {\n try {\n appCount = fs\n .readdirSync(appsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory()).length;\n } catch {\n appCount = 0;\n }\n }\n return {\n name,\n displayName,\n rootPath,\n appCount,\n };\n}\n\nexport async function listWorkspaceApps(\n options: ListWorkspaceAppsOptions = {},\n): Promise<WorkspaceAppSummary[]> {\n const workspaceRoot = findWorkspaceRoot();\n const localFilesystemApps =\n workspaceRoot && isLocalAppCreationRuntime()\n ? readWorkspaceAppsFromFilesystem(workspaceRoot)\n : null;\n if (localFilesystemApps) {\n return maybeIncludeAgentCards(\n await appendPendingWorkspaceApps(localFilesystemApps),\n options,\n );\n }\n\n const manifestApps =\n readWorkspaceAppsFromEnv() ?? readWorkspaceAppsFromManifestFile();\n if (manifestApps) {\n return maybeIncludeAgentCards(\n await appendPendingWorkspaceApps(manifestApps),\n options,\n );\n }\n\n if (!workspaceRoot) {\n return maybeIncludeAgentCards(\n await appendPendingWorkspaceApps([\n {\n id: \"dispatch\",\n name: \"Dispatch\",\n description: \"Workspace control plane\",\n path: \"/dispatch\",\n url: workspaceAppUrl(\"/dispatch\"),\n isDispatch: true,\n status: \"ready\",\n },\n ]),\n options,\n );\n }\n\n const apps = readWorkspaceAppsFromFilesystem(workspaceRoot) ?? [];\n return maybeIncludeAgentCards(\n await appendPendingWorkspaceApps(apps),\n options,\n );\n}\n\nexport async function getAppCreationSettings(): Promise<AppCreationSettings> {\n const envBuilderProjectId = getEnvBuilderProjectId();\n const resolvedBuilderProjectId = await resolveBuilderBranchProjectId();\n const raw = await readSettingsRecord();\n const savedBuilderProjectId =\n typeof raw?.builderProjectId === \"string\" && raw.builderProjectId.trim()\n ? raw.builderProjectId.trim()\n : null;\n const builderProjectId = envBuilderProjectId || savedBuilderProjectId;\n const enableBuilder =\n process.env.ENABLE_BUILDER === \"true\" || process.env.ENABLE_BUILDER === \"1\";\n const effectiveBuilderProjectId =\n builderProjectId ||\n resolvedBuilderProjectId ||\n (enableBuilder ? getBuilderBranchProjectId() : null);\n\n return {\n builderProjectId: effectiveBuilderProjectId,\n builderProjectIdSource: envBuilderProjectId\n ? \"env\"\n : savedBuilderProjectId\n ? \"dispatch\"\n : effectiveBuilderProjectId\n ? \"default\"\n : \"unset\",\n envBuilderProjectId,\n savedBuilderProjectId,\n builderBranchingEnabled: !!effectiveBuilderProjectId,\n };\n}\n\nexport async function setAppCreationSettings(input: {\n builderProjectId?: string | null;\n}): Promise<AppCreationSettings> {\n await assertCanManageAppCreationSettings();\n const builderProjectId = input.builderProjectId?.trim() || null;\n const raw = await readSettingsRecord();\n await putSetting(scopedSettingsKey(), { ...raw, builderProjectId });\n await recordAudit({\n action: \"settings.updated\",\n targetType: \"dispatch-app-creation-settings\",\n targetId: SETTINGS_KEY,\n summary: builderProjectId\n ? \"Updated default Builder project for app creation\"\n : \"Cleared default Builder project for app creation\",\n metadata: { builderProjectIdConfigured: !!builderProjectId },\n });\n return getAppCreationSettings();\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/^[^a-z]+/, \"\")\n .slice(0, 64);\n}\n\nfunction isLocalAppCreationRuntime(): boolean {\n if (process.env.NODE_ENV === \"production\") return false;\n if (\n process.env.NETLIFY ||\n process.env.VERCEL ||\n process.env.CF_PAGES ||\n process.env.DEPLOY_URL ||\n process.env.URL ||\n process.env.RENDER ||\n process.env.FLY_APP_NAME\n ) {\n return false;\n }\n return true;\n}\n\nfunction isSyntheticIntegrationOwner(ownerEmail: string): boolean {\n return (\n ownerEmail.startsWith(\"integration@\") ||\n ownerEmail.endsWith(\"@integration.local\")\n );\n}\n\nasync function requestOwnerRole(): Promise<string | null> {\n const orgId = currentOrgId();\n const ownerEmail = currentOwnerEmail();\n if (!orgId) return null;\n try {\n const { rows } = await getDbExec().execute({\n sql: `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n args: [orgId, ownerEmail.toLowerCase()],\n });\n const role = (rows[0] as any)?.role;\n return typeof role === \"string\" ? role : null;\n } catch {\n return null;\n }\n}\n\nasync function assertCanManageAppCreationSettings(): Promise<void> {\n const orgId = currentOrgId();\n if (!orgId) return;\n const role = await requestOwnerRole();\n if (role !== \"owner\" && role !== \"admin\") {\n throw new Error(\n \"Only organization owners and admins can update app creation settings.\",\n );\n }\n}\n\nasync function isCurrentIntegrationExplicitlyLinked(): Promise<boolean> {\n const incoming = getRequestContext()?.integration?.incoming;\n if (!incoming) return true;\n const externalUserId = identityKeyForIncoming(incoming);\n const linkedOwner = await resolveLinkedOwner(\n incoming.platform,\n externalUserId,\n {\n allowAnyOrgFallback: true,\n },\n ).catch(() => null);\n return linkedOwner === currentOwnerEmail();\n}\n\nasync function defaultOwnerAppCreationAllowed(): Promise<boolean> {\n const defaultOwner = process.env.DISPATCH_DEFAULT_OWNER_EMAIL?.trim();\n if (!defaultOwner || defaultOwner !== currentOwnerEmail()) return false;\n if (await isCurrentIntegrationExplicitlyLinked()) return true;\n return (\n process.env.DISPATCH_ALLOW_DEFAULT_OWNER_APP_CREATION === \"true\" ||\n process.env.DISPATCH_ALLOW_DEFAULT_OWNER_APP_CREATION === \"1\" ||\n process.env.ENABLE_BUILDER === \"true\" ||\n process.env.ENABLE_BUILDER === \"1\"\n );\n}\n\nfunction normalizeBuilderRunString(value: unknown, fieldName: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Builder app creation returned a blank ${fieldName}`);\n }\n const trimmed = value.trim();\n if (/[\u0000-\u001f]/.test(trimmed)) {\n throw new Error(`Builder app creation returned a malformed ${fieldName}`);\n }\n return trimmed;\n}\n\nfunction normalizeBuilderRunUrl(value: unknown): string {\n const urlString = normalizeBuilderRunString(value, \"url\");\n let parsed: URL;\n try {\n parsed = new URL(urlString);\n } catch {\n throw new Error(\"Builder app creation returned a malformed url\");\n }\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n throw new Error(\"Builder app creation returned a malformed url\");\n }\n if (\n parsed.hostname !== \"builder.io\" &&\n !parsed.hostname.endsWith(\".builder.io\")\n ) {\n throw new Error(\"Builder app creation returned a non-Builder url\");\n }\n return parsed.toString();\n}\n\nfunction normalizeBuilderRunResult(result: unknown): {\n branchName: string;\n url: string;\n status: string;\n} {\n const record =\n result && typeof result === \"object\" && !Array.isArray(result)\n ? (result as Record<string, unknown>)\n : {};\n return {\n branchName: normalizeBuilderRunString(record.branchName, \"branchName\"),\n url: normalizeBuilderRunUrl(record.url),\n status:\n typeof record.status === \"string\" && record.status.trim()\n ? record.status.trim()\n : \"processing\",\n };\n}\n\nasync function remoteAppCreationAuthorization(): Promise<\n { ok: true } | { ok: false; message: string }\n> {\n const ownerEmail = currentOwnerEmail();\n const isIntegrationCaller = isIntegrationCallerRequest();\n const defaultOwner = process.env.DISPATCH_DEFAULT_OWNER_EMAIL?.trim();\n if (isIntegrationCaller && defaultOwner && defaultOwner === ownerEmail) {\n if (await defaultOwnerAppCreationAllowed()) return { ok: true };\n return {\n ok: false,\n message:\n \"Messaging-triggered app creation is using the deployment default Dispatch owner. \" +\n \"Link the messaging identity to a Dispatch user with /link, start the app from Dispatch while signed in, or explicitly set ENABLE_BUILDER=true for this deployment.\",\n };\n }\n if (!isSyntheticIntegrationOwner(ownerEmail)) return { ok: true };\n\n const source = isIntegrationCaller\n ? \"Messaging-triggered\"\n : \"Synthetic integration\";\n return {\n ok: false,\n message:\n `${source} app creation needs a trusted Dispatch owner before Builder can start a branch. ` +\n \"Link the messaging identity to a Dispatch user with /link, start the app from Dispatch while signed in, or explicitly set ENABLE_BUILDER=true for this deployment.\",\n };\n}\n\nfunction buildWorkspaceAppPrompt(input: {\n prompt: string;\n appId?: string | null;\n template?: string | null;\n selectedKeys?: string[];\n}): { appId: string; prompt: string } {\n const appId =\n slugify(input.appId || \"\") ||\n slugify(\n input.prompt.replace(/\\b(build|create|make|an?|the|app|tool)\\b/gi, \" \"),\n ) ||\n \"new-app\";\n const selectedKeys = input.selectedKeys || [];\n return {\n appId,\n prompt: [\n \"Create a new agent-native app in this workspace.\",\n \"\",\n `App name: ${appId}`,\n `Template to start from: ${input.template || \"starter\"}`,\n `User prompt: ${input.prompt.trim()}`,\n selectedKeys.length\n ? `Dispatch vault keys selected for this app: ${selectedKeys.join(\", \")}`\n : \"Dispatch vault keys selected for this app: none\",\n \"\",\n `Use the workspace app layout: create it under apps/${appId}, mount it at /${appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,\n selectedKeys.length\n ? `Dispatch will create pending vault requests for the selected keys for appId \"${appId}\" after this app creation request is accepted. Do not grant or sync vault keys directly from the app-creation branch.`\n : \"Do not grant or request any Dispatch vault keys unless the user asks later.\",\n \"\",\n \"Agent-native rules (these are the framework's contract — not optional):\",\n `- Persist ALL data in SQL via Drizzle. Add tables to apps/${appId}/server/db/schema.ts and migrations to apps/${appId}/server/plugins/db.ts. NEVER use localStorage, sessionStorage, IndexedDB, or in-memory state for anything the user expects to persist — agent and UI must read the same source of truth.`,\n `- Define every create/read/update/delete as an action in apps/${appId}/actions/ using defineAction. The agent calls these as tools and the frontend calls them at /_agent-native/actions/<name> via useActionQuery / useActionMutation. Don't add /api/* routes for CRUD.`,\n \"- Build the UI from shadcn/ui components in app/components/ui/ (Button, Input, Dialog, Popover, Card, etc.) and Tailwind utilities. Don't author bespoke CSS classes in global.css unless you genuinely need a primitive that shadcn doesn't ship.\",\n \"- Use Tabler Icons (@tabler/icons-react) for every icon. Never use emojis as icons.\",\n `- Expose what the user is looking at via application_state (navigation.view, selection, etc.) so the agent has live context. Mirror the patterns in templates/mail or templates/slides.`,\n \"- Optimistic UI for every mutation: update the React Query cache immediately, navigate immediately, run the mutation in the background, roll back on error. Don't await a server round-trip before re-rendering.\",\n \"\",\n \"Branch readiness requirements before handing off:\",\n \"- The CLI auto-fills package.json name and displayName from the app id; only edit the description / scripts / dependencies if the app actually needs more than the template provides.\",\n \"- Do not add or update workspace-apps.json or .agent-native/workspace-apps.json unless the app needs an explicit external URL override; the root deploy generates the workspace app registry from apps/* and deploy metadata.\",\n \"- Update pnpm-lock.yaml when adding or changing dependencies so Netlify can install the branch reliably.\",\n \"- Update the app manifest/package/deploy metadata needed by the existing workspace deployment model; do not leave the branch relying only on uncommitted local state.\",\n \"- Verify the app's agent card/A2A metadata is ready so Dispatch can discover and delegate to the app after deployment.\",\n \"- Include a final verification note covering the registry entry, manifest/deploy metadata, and agent-card readiness.\",\n `When it is ready, start or update the workspace dev server and navigate the user to /${appId}.`,\n ].join(\"\\n\"),\n };\n}\n\nasync function requestSelectedVaultKeys(input: {\n appId: string;\n selectedKeys: string[];\n}) {\n if (input.selectedKeys.length === 0) return;\n await Promise.allSettled(\n input.selectedKeys.map((credentialKey) =>\n Promise.resolve().then(() =>\n createRequest({\n appId: input.appId,\n credentialKey,\n reason: `Requested during workspace app creation for ${input.appId}.`,\n }),\n ),\n ),\n );\n}\n\nexport async function startWorkspaceAppCreation(input: {\n prompt: string;\n appId?: string | null;\n template?: string | null;\n secretIds?: string[];\n}) {\n const initial = buildWorkspaceAppPrompt({\n prompt: input.prompt,\n appId: input.appId,\n template: input.template,\n });\n assertValidWorkspaceAppId(initial.appId);\n const isLocal = isLocalAppCreationRuntime();\n\n if (!isLocal) {\n const authorization = await remoteAppCreationAuthorization();\n if (authorization.ok === false) {\n return {\n mode: \"builder-unavailable\",\n appId: initial.appId,\n message: authorization.message,\n };\n }\n }\n\n const selectedKeys = input.secretIds?.length\n ? (await listSecrets())\n .filter((secret) => input.secretIds?.includes(secret.id))\n .map((secret) => secret.credentialKey)\n : [];\n const built = buildWorkspaceAppPrompt({\n prompt: input.prompt,\n appId: input.appId,\n template: input.template,\n selectedKeys,\n });\n const prompt = built.prompt;\n\n if (isLocal) {\n await requestSelectedVaultKeys({\n appId: built.appId,\n selectedKeys,\n });\n return {\n mode: \"local-agent\",\n appId: built.appId,\n prompt,\n message:\n \"Use the local code agent to create this app in the workspace, then open it from /dispatch/apps.\",\n };\n }\n\n const settings = await getAppCreationSettings();\n\n if (!settings.builderProjectId) {\n return {\n mode: \"coming-soon\",\n appId: built.appId,\n message:\n \"Builder app creation is coming soon here. Set a default Builder project in Dispatch or provide BUILDER_BRANCH_PROJECT_ID to enable branch creation.\",\n };\n }\n\n let result: {\n branchName: string;\n url: string;\n status: string;\n };\n try {\n const builderCreds = await resolveBuilderCredentials().catch(() => null);\n const builderUserId = builderCreds?.userId || undefined;\n result = normalizeBuilderRunResult(\n await runBuilderAgent({\n prompt,\n projectId: settings.builderProjectId,\n ...(builderUserId\n ? { userId: builderUserId }\n : { userEmail: currentOwnerEmail() }),\n }),\n );\n } catch (err) {\n const detail =\n err instanceof Error && err.message\n ? err.message\n : \"Builder could not start the app branch\";\n return {\n mode: \"builder-unavailable\",\n appId: built.appId,\n projectId: settings.builderProjectId,\n message:\n `Builder app creation is configured for project ${settings.builderProjectId}, ` +\n `but it could not start yet: ${detail}. Connect Builder for this user, ` +\n `link the messaging identity to that user, or configure deployment-managed Builder credentials for this workspace.`,\n };\n }\n\n await recordPendingWorkspaceApp({\n appId: built.appId,\n projectId: settings.builderProjectId,\n branchName: result.branchName,\n builderUrl: result.url,\n });\n\n await requestSelectedVaultKeys({\n appId: built.appId,\n selectedKeys,\n });\n\n return {\n mode: \"builder\",\n appId: built.appId,\n path: `/${built.appId}`,\n projectId: settings.builderProjectId,\n branchName: result.branchName,\n url: result.url,\n workspaceUrl: workspaceAppUrl(`/${built.appId}`),\n status: result.status,\n message:\n `Builder started a branch for /${built.appId}. Use the Builder branch URL to track creation now. ` +\n `The workspace path will be live after that branch is merged and the workspace deploy finishes, so it may 404 until then.`,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-chat.d.ts","sourceRoot":"","sources":["../../../src/server/plugins/agent-chat.ts"],"names":[],"mappings":";AAIA,wBA+BG"}
1
+ {"version":3,"file":"agent-chat.d.ts","sourceRoot":"","sources":["../../../src/server/plugins/agent-chat.ts"],"names":[],"mappings":";AAIA,wBAgCG"}
@@ -27,6 +27,7 @@ Use the standard workspace primitives:
27
27
  - Use recurring jobs for scheduled behavior.
28
28
  - Use custom agent profiles in agents/*.md for local spawned work and remote-agents/*.json for remote A2A apps.
29
29
  - When answering whether workspace apps expose agent cards or A2A endpoints, call list-workspace-apps with includeAgentCards=true. If you have not requested that probe, absence of agent-card fields means unchecked, not unavailable.
30
+ - When creating a new workspace app, create a separate app under apps/<app-id> with apps/<app-id>/package.json, mount it at /<app-id>, use relative /<app-id> links, never hardcode localhost or dev ports, use shadcn/ui with @tabler/icons-react rather than lucide-react, and ensure the React Router client entry preserves APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath(). There is no separate workspace app registry to edit.
30
31
 
31
32
  When a user asks for something like a digest, reminder, routing rule, or saved behavior:
32
33
  - First decide whether it should be a resource, a recurring job, a destination, or a delegated task.
@@ -1 +1 @@
1
- {"version":3,"file":"agent-chat.js","sourceRoot":"","sources":["../../../src/server/plugins/agent-chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,eAAe,qBAAqB,CAAC;IACnC,KAAK,EAAE,UAAU;IACjB,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IACD,2EAA2E;IAC3E,2EAA2E;IAC3E,wEAAwE;IACxE,OAAO,EAAE,eAAe;IACxB,YAAY,EAAE;;;;;;;;;;;;;;;;;4EAiB4D;CAC3E,CAAC,CAAC","sourcesContent":["import { createAgentChatPlugin } from \"@agent-native/core/server\";\nimport { getOrgContext } from \"@agent-native/core/org\";\nimport { dispatchActions } from \"../../actions/index.js\";\n\nexport default createAgentChatPlugin({\n appId: \"dispatch\",\n // Without this, AGENT_ORG_ID is never set on agent action calls and every\n // row written through the frontend (vault secrets, destinations, workspace\n // resources) lands with org_id=NULL — breaking data isolation across orgs.\n resolveOrgId: async (event) => {\n const ctx = await getOrgContext(event);\n return ctx.orgId;\n },\n // Read actions directly from the package's own action map rather than from\n // a build-time-generated `.generated/actions-registry.ts` (the latter is a\n // template-only construct that the Vite plugin emits next to actions/).\n actions: dispatchActions,\n systemPrompt: `You are the central dispatch for this workspace.\n\nDefault posture:\n- Treat Slack and Telegram as shared entrypoints into the workspace.\n- Heavily delegate domain work to specialized agents through A2A when another app owns the job.\n- Keep durable memory and operating instructions in resources rather than ephemeral chat.\n- Prefer replying in the current external thread unless the user explicitly asks you to send to a saved destination.\n\nUse the standard workspace primitives:\n- Read and update resources like AGENTS.md, LEARNINGS.md, jobs/*.md, agents/*.md, and remote-agents/*.json when appropriate.\n- Use recurring jobs for scheduled behavior.\n- Use custom agent profiles in agents/*.md for local spawned work and remote-agents/*.json for remote A2A apps.\n- When answering whether workspace apps expose agent cards or A2A endpoints, call list-workspace-apps with includeAgentCards=true. If you have not requested that probe, absence of agent-card fields means unchecked, not unavailable.\n\nWhen a user asks for something like a digest, reminder, routing rule, or saved behavior:\n- First decide whether it should be a resource, a recurring job, a destination, or a delegated task.\n- Keep responses concise and operational.\n- Avoid inventing integrations or destinations that are not configured yet.`,\n});\n"]}
1
+ {"version":3,"file":"agent-chat.js","sourceRoot":"","sources":["../../../src/server/plugins/agent-chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,eAAe,qBAAqB,CAAC;IACnC,KAAK,EAAE,UAAU;IACjB,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IACD,2EAA2E;IAC3E,2EAA2E;IAC3E,wEAAwE;IACxE,OAAO,EAAE,eAAe;IACxB,YAAY,EAAE;;;;;;;;;;;;;;;;;;4EAkB4D;CAC3E,CAAC,CAAC","sourcesContent":["import { createAgentChatPlugin } from \"@agent-native/core/server\";\nimport { getOrgContext } from \"@agent-native/core/org\";\nimport { dispatchActions } from \"../../actions/index.js\";\n\nexport default createAgentChatPlugin({\n appId: \"dispatch\",\n // Without this, AGENT_ORG_ID is never set on agent action calls and every\n // row written through the frontend (vault secrets, destinations, workspace\n // resources) lands with org_id=NULL — breaking data isolation across orgs.\n resolveOrgId: async (event) => {\n const ctx = await getOrgContext(event);\n return ctx.orgId;\n },\n // Read actions directly from the package's own action map rather than from\n // a build-time-generated `.generated/actions-registry.ts` (the latter is a\n // template-only construct that the Vite plugin emits next to actions/).\n actions: dispatchActions,\n systemPrompt: `You are the central dispatch for this workspace.\n\nDefault posture:\n- Treat Slack and Telegram as shared entrypoints into the workspace.\n- Heavily delegate domain work to specialized agents through A2A when another app owns the job.\n- Keep durable memory and operating instructions in resources rather than ephemeral chat.\n- Prefer replying in the current external thread unless the user explicitly asks you to send to a saved destination.\n\nUse the standard workspace primitives:\n- Read and update resources like AGENTS.md, LEARNINGS.md, jobs/*.md, agents/*.md, and remote-agents/*.json when appropriate.\n- Use recurring jobs for scheduled behavior.\n- Use custom agent profiles in agents/*.md for local spawned work and remote-agents/*.json for remote A2A apps.\n- When answering whether workspace apps expose agent cards or A2A endpoints, call list-workspace-apps with includeAgentCards=true. If you have not requested that probe, absence of agent-card fields means unchecked, not unavailable.\n- When creating a new workspace app, create a separate app under apps/<app-id> with apps/<app-id>/package.json, mount it at /<app-id>, use relative /<app-id> links, never hardcode localhost or dev ports, use shadcn/ui with @tabler/icons-react rather than lucide-react, and ensure the React Router client entry preserves APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath(). There is no separate workspace app registry to edit.\n\nWhen a user asks for something like a digest, reminder, routing rule, or saved behavior:\n- First decide whether it should be a resource, a recurring job, a destination, or a delegated task.\n- Keep responses concise and operational.\n- Avoid inventing integrations or destinations that are not configured yet.`,\n});\n"]}
@@ -6,18 +6,18 @@ const DISPATCH_INTEGRATION_SYSTEM_PROMPT = `You are the central dispatch for thi
6
6
 
7
7
  Default posture:
8
8
  - Treat Slack, Telegram, and email as shared entrypoints into the workspace.
9
- - Heavily delegate domain work to specialized agents through A2A (call-agent) when another app owns the job. Apps you can delegate to include slides (decks/presentations), analytics (data/dashboards), content (docs/articles), videos (Remotion compositions), forms (form builder), clips (screen recordings), and design (visual designs).
9
+ - Heavily delegate domain work to specialized agents through A2A (call-agent) when another app owns the job. Apps you can delegate to include slides (decks/presentations), analytics (data/dashboards), content (docs/articles), videos (Remotion compositions), forms (form builder), clips (screen recordings), design (visual designs), and images (brand image libraries and generated raster imagery).
10
10
  - Use list-connected-agents to see what agents are available before assuming a request must be handled locally.
11
11
  - When asked whether workspace apps expose agent cards or A2A endpoints, call list-workspace-apps with includeAgentCards=true. Without that probe, missing agent-card fields mean unchecked, not unavailable.
12
12
  - Keep durable memory and operating instructions in resources rather than ephemeral chat.
13
13
  - Reply in the originating thread unless the user explicitly asks you to send to a saved destination.
14
14
 
15
15
  When a user asks for something:
16
- - If it belongs to analytics, content, slides, videos, etc., delegate via call-agent — do not re-implement the domain logic in dispatch.
16
+ - If it belongs to analytics, content, slides, videos, images, etc., delegate via call-agent — do not re-implement the domain logic in dispatch.
17
17
  - After call-agent returns an answer, RELAY IT DIRECTLY to the user with at most a one-line preface — do not rephrase, summarize, or add commentary. The downstream agent already crafted the answer; your job is delivery, not editing. This minimizes round-trips and keeps the user-visible reply fast.
18
18
  - Exception: if the downstream agent reports a missing model/provider credential, do not name exact env vars, Vault keys, tokens, or secrets. Say the target app needs an LLM connection and recommend connecting Builder/managed LLM for that app; keep bring-your-own provider keys as a secondary option only if the user asks.
19
19
  - If the user asks to create, build, make, scaffold, or generate an "agent" from Dispatch chat or by tagging @agent-native in Slack, email, or Telegram, first classify the ask. If it is a simple Dispatch-native behavior like a reminder, digest, monitor, routing rule, saved instruction, or recurring workflow, create or update the recurring job/resource/destination in Dispatch. If it is a robust unique product or teammate that needs its own UI, data model, actions, integrations, or domain workflow, treat it as a new workspace app and call start-workspace-app-creation.
20
- - If the user explicitly asks for a new app or workspace app, call start-workspace-app-creation with their prompt. Do not satisfy a new-app request by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app. If the request is too vague to classify, ask one concise follow-up. If the action returns mode "builder", reply with the Builder branch URL; Builder is responsible for creating the separate workspace app under apps/<app-id>, mounting it at /<app-id>, and making it appear in the workspace apps list. If it returns mode "local-agent", tell the user it is ready for the local code agent and include the returned app path/prompt summary. If it returns mode "coming-soon" or "builder-unavailable", explain the missing Builder setup and ask them to connect/configure Builder.
20
+ - If the user explicitly asks for a new app or workspace app, call start-workspace-app-creation with their prompt. Do not satisfy a new-app request by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app. If the request is too vague to classify, ask one concise follow-up. If the action returns mode "builder", reply with the Builder branch URL; Builder is responsible for creating the separate workspace app under apps/<app-id>, mounting it at /<app-id>, ensuring apps/<app-id>/package.json exists so Dispatch discovers it, using relative /<app-id> links instead of hardcoded localhost/dev ports, and preserving APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath() in the React Router client entry. There is no separate workspace app registry to edit. If it returns mode "local-agent", tell the user it is ready for the local code agent and include the returned app path/prompt summary. If it returns mode "coming-soon" or "builder-unavailable", explain the missing Builder setup and ask them to connect/configure Builder.
21
21
  - For digests, reminders, or saved behavior, prefer recurring jobs, resources, or destinations over chat replies.
22
22
  - Keep responses concise and operational — messaging platforms have character limits.
23
23
  - Use markdown sparingly (bold and lists are fine, avoid complex formatting).
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../../src/server/plugins/integrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,kCAAkC,GAAG;;;;;;;;;;;;;;;;;;;4FAmBiD,CAAC;AAE7F;;;;GAIG;AACH,MAAM,0BAA0B,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE;IACzD,MAAM,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,YAAY,CAAC,YAAY,CAAC;IACjD,MAAM,YAAY,GAChB,OAAO,cAAc,KAAK,QAAQ;QAChC,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,OAAO,cAAc,KAAK,UAAU;YACpC,CAAC,CAAC,cAAc,CAAC,kCAAkC,CAAC;YACpD,CAAC,CAAC,kCAAkC,CAAC;IAE3C,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACtC,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,eAAe;QACxB,YAAY,EAAE,oBAAoB;QAClC,aAAa,EAAE,qBAAqB;QACpC,YAAY;QACZ,wDAAwD;QACxD,yEAAyE;QACzE,+DAA+D;QAC/D,6EAA6E;KAC9E,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,eAAe,0BAA0B,CAAC","sourcesContent":["import { createIntegrationsPlugin } from \"@agent-native/core/server\";\nimport {\n beforeDispatchProcess,\n resolveDispatchOwner,\n} from \"../lib/dispatch-integrations.js\";\nimport { getDispatchConfig } from \"../index.js\";\nimport { dispatchActions } from \"../../actions/index.js\";\n\nconst DISPATCH_INTEGRATION_SYSTEM_PROMPT = `You are the central dispatch for this workspace, responding via a messaging platform integration (Slack, Telegram, email, etc.).\n\nDefault posture:\n- Treat Slack, Telegram, and email as shared entrypoints into the workspace.\n- Heavily delegate domain work to specialized agents through A2A (call-agent) when another app owns the job. Apps you can delegate to include slides (decks/presentations), analytics (data/dashboards), content (docs/articles), videos (Remotion compositions), forms (form builder), clips (screen recordings), and design (visual designs).\n- Use list-connected-agents to see what agents are available before assuming a request must be handled locally.\n- When asked whether workspace apps expose agent cards or A2A endpoints, call list-workspace-apps with includeAgentCards=true. Without that probe, missing agent-card fields mean unchecked, not unavailable.\n- Keep durable memory and operating instructions in resources rather than ephemeral chat.\n- Reply in the originating thread unless the user explicitly asks you to send to a saved destination.\n\nWhen a user asks for something:\n- If it belongs to analytics, content, slides, videos, etc., delegate via call-agent — do not re-implement the domain logic in dispatch.\n- After call-agent returns an answer, RELAY IT DIRECTLY to the user with at most a one-line preface — do not rephrase, summarize, or add commentary. The downstream agent already crafted the answer; your job is delivery, not editing. This minimizes round-trips and keeps the user-visible reply fast.\n- Exception: if the downstream agent reports a missing model/provider credential, do not name exact env vars, Vault keys, tokens, or secrets. Say the target app needs an LLM connection and recommend connecting Builder/managed LLM for that app; keep bring-your-own provider keys as a secondary option only if the user asks.\n- If the user asks to create, build, make, scaffold, or generate an \"agent\" from Dispatch chat or by tagging @agent-native in Slack, email, or Telegram, first classify the ask. If it is a simple Dispatch-native behavior like a reminder, digest, monitor, routing rule, saved instruction, or recurring workflow, create or update the recurring job/resource/destination in Dispatch. If it is a robust unique product or teammate that needs its own UI, data model, actions, integrations, or domain workflow, treat it as a new workspace app and call start-workspace-app-creation.\n- If the user explicitly asks for a new app or workspace app, call start-workspace-app-creation with their prompt. Do not satisfy a new-app request by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app. If the request is too vague to classify, ask one concise follow-up. If the action returns mode \"builder\", reply with the Builder branch URL; Builder is responsible for creating the separate workspace app under apps/<app-id>, mounting it at /<app-id>, and making it appear in the workspace apps list. If it returns mode \"local-agent\", tell the user it is ready for the local code agent and include the returned app path/prompt summary. If it returns mode \"coming-soon\" or \"builder-unavailable\", explain the missing Builder setup and ask them to connect/configure Builder.\n- For digests, reminders, or saved behavior, prefer recurring jobs, resources, or destinations over chat replies.\n- Keep responses concise and operational — messaging platforms have character limits.\n- Use markdown sparingly (bold and lists are fine, avoid complex formatting).\n- If a task requires many steps, summarize what you did rather than streaming every detail.`;\n\n/**\n * Defer plugin construction until the Nitro plugin actually fires so the\n * config-aware system prompt resolves AFTER `setupDispatch(config)` has\n * stamped the active config (plugin module load order is not guaranteed).\n */\nconst dispatchIntegrationsPlugin = async (nitroApp: any) => {\n const { integrations = {} } = getDispatchConfig();\n const promptOverride = integrations.systemPrompt;\n const systemPrompt =\n typeof promptOverride === \"string\"\n ? promptOverride\n : typeof promptOverride === \"function\"\n ? promptOverride(DISPATCH_INTEGRATION_SYSTEM_PROMPT)\n : DISPATCH_INTEGRATION_SYSTEM_PROMPT;\n\n const plugin = createIntegrationsPlugin({\n appId: \"dispatch\",\n actions: dispatchActions,\n resolveOwner: resolveDispatchOwner,\n beforeProcess: beforeDispatchProcess,\n systemPrompt,\n // Inherit the framework default (claude-sonnet-4-6 from\n // packages/core/src/integrations/plugin.ts). Haiku was tried for latency\n // but hallucinated URLs/IDs after delegated call-agent results\n // (e.g. inventing `https://slides.workspace.com/deck/builder-io-deck-2024`).\n });\n\n return plugin(nitroApp);\n};\n\nexport default dispatchIntegrationsPlugin;\n"]}
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../../src/server/plugins/integrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,kCAAkC,GAAG;;;;;;;;;;;;;;;;;;;4FAmBiD,CAAC;AAE7F;;;;GAIG;AACH,MAAM,0BAA0B,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE;IACzD,MAAM,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,YAAY,CAAC,YAAY,CAAC;IACjD,MAAM,YAAY,GAChB,OAAO,cAAc,KAAK,QAAQ;QAChC,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,OAAO,cAAc,KAAK,UAAU;YACpC,CAAC,CAAC,cAAc,CAAC,kCAAkC,CAAC;YACpD,CAAC,CAAC,kCAAkC,CAAC;IAE3C,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACtC,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,eAAe;QACxB,YAAY,EAAE,oBAAoB;QAClC,aAAa,EAAE,qBAAqB;QACpC,YAAY;QACZ,wDAAwD;QACxD,yEAAyE;QACzE,+DAA+D;QAC/D,6EAA6E;KAC9E,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,eAAe,0BAA0B,CAAC","sourcesContent":["import { createIntegrationsPlugin } from \"@agent-native/core/server\";\nimport {\n beforeDispatchProcess,\n resolveDispatchOwner,\n} from \"../lib/dispatch-integrations.js\";\nimport { getDispatchConfig } from \"../index.js\";\nimport { dispatchActions } from \"../../actions/index.js\";\n\nconst DISPATCH_INTEGRATION_SYSTEM_PROMPT = `You are the central dispatch for this workspace, responding via a messaging platform integration (Slack, Telegram, email, etc.).\n\nDefault posture:\n- Treat Slack, Telegram, and email as shared entrypoints into the workspace.\n- Heavily delegate domain work to specialized agents through A2A (call-agent) when another app owns the job. Apps you can delegate to include slides (decks/presentations), analytics (data/dashboards), content (docs/articles), videos (Remotion compositions), forms (form builder), clips (screen recordings), design (visual designs), and images (brand image libraries and generated raster imagery).\n- Use list-connected-agents to see what agents are available before assuming a request must be handled locally.\n- When asked whether workspace apps expose agent cards or A2A endpoints, call list-workspace-apps with includeAgentCards=true. Without that probe, missing agent-card fields mean unchecked, not unavailable.\n- Keep durable memory and operating instructions in resources rather than ephemeral chat.\n- Reply in the originating thread unless the user explicitly asks you to send to a saved destination.\n\nWhen a user asks for something:\n- If it belongs to analytics, content, slides, videos, images, etc., delegate via call-agent — do not re-implement the domain logic in dispatch.\n- After call-agent returns an answer, RELAY IT DIRECTLY to the user with at most a one-line preface — do not rephrase, summarize, or add commentary. The downstream agent already crafted the answer; your job is delivery, not editing. This minimizes round-trips and keeps the user-visible reply fast.\n- Exception: if the downstream agent reports a missing model/provider credential, do not name exact env vars, Vault keys, tokens, or secrets. Say the target app needs an LLM connection and recommend connecting Builder/managed LLM for that app; keep bring-your-own provider keys as a secondary option only if the user asks.\n- If the user asks to create, build, make, scaffold, or generate an \"agent\" from Dispatch chat or by tagging @agent-native in Slack, email, or Telegram, first classify the ask. If it is a simple Dispatch-native behavior like a reminder, digest, monitor, routing rule, saved instruction, or recurring workflow, create or update the recurring job/resource/destination in Dispatch. If it is a robust unique product or teammate that needs its own UI, data model, actions, integrations, or domain workflow, treat it as a new workspace app and call start-workspace-app-creation.\n- If the user explicitly asks for a new app or workspace app, call start-workspace-app-creation with their prompt. Do not satisfy a new-app request by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app. If the request is too vague to classify, ask one concise follow-up. If the action returns mode \"builder\", reply with the Builder branch URL; Builder is responsible for creating the separate workspace app under apps/<app-id>, mounting it at /<app-id>, ensuring apps/<app-id>/package.json exists so Dispatch discovers it, using relative /<app-id> links instead of hardcoded localhost/dev ports, and preserving APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath() in the React Router client entry. There is no separate workspace app registry to edit. If it returns mode \"local-agent\", tell the user it is ready for the local code agent and include the returned app path/prompt summary. If it returns mode \"coming-soon\" or \"builder-unavailable\", explain the missing Builder setup and ask them to connect/configure Builder.\n- For digests, reminders, or saved behavior, prefer recurring jobs, resources, or destinations over chat replies.\n- Keep responses concise and operational — messaging platforms have character limits.\n- Use markdown sparingly (bold and lists are fine, avoid complex formatting).\n- If a task requires many steps, summarize what you did rather than streaming every detail.`;\n\n/**\n * Defer plugin construction until the Nitro plugin actually fires so the\n * config-aware system prompt resolves AFTER `setupDispatch(config)` has\n * stamped the active config (plugin module load order is not guaranteed).\n */\nconst dispatchIntegrationsPlugin = async (nitroApp: any) => {\n const { integrations = {} } = getDispatchConfig();\n const promptOverride = integrations.systemPrompt;\n const systemPrompt =\n typeof promptOverride === \"string\"\n ? promptOverride\n : typeof promptOverride === \"function\"\n ? promptOverride(DISPATCH_INTEGRATION_SYSTEM_PROMPT)\n : DISPATCH_INTEGRATION_SYSTEM_PROMPT;\n\n const plugin = createIntegrationsPlugin({\n appId: \"dispatch\",\n actions: dispatchActions,\n resolveOwner: resolveDispatchOwner,\n beforeProcess: beforeDispatchProcess,\n systemPrompt,\n // Inherit the framework default (claude-sonnet-4-6 from\n // packages/core/src/integrations/plugin.ts). Haiku was tried for latency\n // but hallucinated URLs/IDs after delegated call-agent results\n // (e.g. inventing `https://slides.workspace.com/deck/builder-io-deck-2024`).\n });\n\n return plugin(nitroApp);\n};\n\nexport default dispatchIntegrationsPlugin;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/dispatch",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "type": "module",
5
5
  "description": "Dispatch — workspace control plane for agent-native apps. Vault, integrations, destinations, scheduled jobs, and cross-app delegation, shipped as a single drop-in package.",
6
6
  "license": "MIT",
@@ -97,7 +97,7 @@
97
97
  "typescript": "^6.0.3",
98
98
  "vite": "8.0.3",
99
99
  "vitest": "^4.1.5",
100
- "@agent-native/core": "0.12.7"
100
+ "@agent-native/core": "0.12.11"
101
101
  },
102
102
  "scripts": {
103
103
  "build": "tsc && tsc-alias --resolve-full-paths",
@@ -81,14 +81,18 @@ function buildAppCreationPrompt(input: {
81
81
  ``,
82
82
  `Pick a starter template that fits the user's prompt — analytics, calendar, content, design, dispatch, forms, mail, slides, clips, or starter when none of the others fit.`,
83
83
  `Use the workspace app layout: create it under apps/${input.appId}, mount it at /${input.appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,
84
+ `Use relative workspace links like /${input.appId}. Do not hardcode localhost, 127.0.0.1, 8080, 8100, or any dev port; the active workspace gateway/browser origin owns the port.`,
85
+ `Use the framework/template UI stack: shadcn/ui components and @tabler/icons-react. Do not add lucide-react or another icon library for standard UI.`,
86
+ `If the user's prompt mentions sibling apps like Mail, Calendar, Dispatch, or other templates, treat them as existing workspace neighbors or integrations. Do not scaffold those sibling apps inside apps/${input.appId} unless the user explicitly asks to create them too.`,
84
87
  `Do not satisfy this by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app.`,
85
88
  keyList
86
89
  ? `After the app exists, grant the selected Dispatch vault keys to appId "${input.appId}" and sync them once the app server is available. Treat these as requested grants, not active grants before creation succeeds.`
87
90
  : `Do not grant any Dispatch vault keys unless the user asks later.`,
88
91
  ``,
89
92
  `App readiness requirements before handing off:`,
90
- `- Update the workspace app registry metadata for "${input.appId}" so Dispatch lists the app at /${input.appId} after merge/deploy.`,
93
+ `- Ensure apps/${input.appId}/package.json exists; Dispatch discovers workspace apps from apps/<app-id>/package.json, not a separate app registry.`,
91
94
  `- Update the app manifest/package/deploy metadata needed by the existing workspace deployment model.`,
95
+ `- Ensure the React Router client entry preserves APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath() so /${input.appId} hydrates correctly.`,
92
96
  `- Verify the app's agent card/A2A metadata is ready so Dispatch can discover and delegate to the app after deployment.`,
93
97
  `When it is ready, start or update the workspace dev server and navigate the user to /${input.appId}.`,
94
98
  ].join("\n");
@@ -6,8 +6,8 @@ import {
6
6
  appPath,
7
7
  useActionQuery,
8
8
  } from "@agent-native/core/client";
9
- import { InvitationBanner } from "@agent-native/core/client/org";
10
- import { ToolsSidebarSection } from "@agent-native/core/client/tools";
9
+ import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
10
+ import { InvitationBanner, OrgSwitcher } from "@agent-native/core/client/org";
11
11
  import {
12
12
  IconArrowUpRight,
13
13
  IconApps,
@@ -294,25 +294,39 @@ export function NavContent({
294
294
  </div>
295
295
  </div>
296
296
 
297
- <nav className="flex-1 overflow-y-auto px-2 py-3">
298
- <ul className="space-y-0.5">{primaryNavItems.map(renderNavItem)}</ul>
299
- <details className="group mt-4" open={operationsOpen}>
300
- <summary className="flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium uppercase text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden">
301
- <span>Operations</span>
302
- <IconChevronDown
303
- size={14}
304
- className="transition-transform group-open:rotate-180"
305
- />
306
- </summary>
307
- <ul className="mt-1 space-y-0.5">
308
- {operationsNavItems.map(renderNavItem)}
309
- </ul>
310
- </details>
311
- </nav>
297
+ <div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
298
+ <nav className="px-2 py-3">
299
+ <ul className="space-y-0.5">{primaryNavItems.map(renderNavItem)}</ul>
300
+ </nav>
301
+
302
+ <div className="mt-auto shrink-0">
303
+ <div className="border-t px-2 py-2">
304
+ <details className="group" open={operationsOpen}>
305
+ <summary className="flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium uppercase text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden">
306
+ <span>Operations</span>
307
+ <IconChevronDown
308
+ size={14}
309
+ className="transition-transform group-open:rotate-180"
310
+ />
311
+ </summary>
312
+ <ul className="mt-1 space-y-0.5">
313
+ {operationsNavItems.map(renderNavItem)}
314
+ </ul>
315
+ </details>
316
+ </div>
317
+
318
+ <div className="border-t px-2 py-1">
319
+ <ExtensionsSidebarSection />
320
+ </div>
312
321
 
313
- <div className="border-t px-2 py-2">
314
- <ToolsSidebarSection />
315
- <FeedbackButton />
322
+ <div className="border-t px-3 py-2">
323
+ <OrgSwitcher />
324
+ </div>
325
+
326
+ <div className="border-t px-3 py-2">
327
+ <FeedbackButton />
328
+ </div>
329
+ </div>
316
330
  </div>
317
331
  </>
318
332
  );
@@ -24,7 +24,7 @@ interface WorkspaceAppSummary {
24
24
 
25
25
  function workspaceAppHref(app: WorkspaceAppSummary): string | null {
26
26
  if (app.status === "pending") return app.builderUrl || null;
27
- return app.url || app.path || null;
27
+ return app.path || app.url || null;
28
28
  }
29
29
 
30
30
  export function meta() {
@@ -26,7 +26,7 @@ interface WorkspaceAppSummary {
26
26
 
27
27
  function workspaceAppHref(app: WorkspaceAppSummary): string | null {
28
28
  if (app.status === "pending") return app.builderUrl || null;
29
- return app.url || app.path || null;
29
+ return app.path || app.url || null;
30
30
  }
31
31
 
32
32
  function isPendingBuilderHref(app: WorkspaceAppSummary): boolean {
@@ -82,7 +82,7 @@ interface WorkspaceAppSummary {
82
82
 
83
83
  function workspaceAppHref(app: WorkspaceAppSummary): string | null {
84
84
  if (app.status === "pending") return app.builderUrl || null;
85
- return app.url || app.path || null;
85
+ return app.path || app.url || null;
86
86
  }
87
87
 
88
88
  function isPendingBuilderHref(app: WorkspaceAppSummary): boolean {