@adminide-stack/yantra-mobile 12.0.142 → 12.0.144

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/lib/features/attachments/displayUserMessageText.js +2 -2
  2. package/lib/features/attachments/displayUserMessageText.js.map +1 -1
  3. package/lib/features/notion/NotionAgentPanel.js +987 -0
  4. package/lib/features/notion/NotionAgentPanel.js.map +1 -0
  5. package/lib/features/notion/NotionAskAiSheet.js +362 -0
  6. package/lib/features/notion/NotionAskAiSheet.js.map +1 -0
  7. package/lib/features/notion/NotionBlockView.js +4 -3
  8. package/lib/features/notion/NotionBlockView.js.map +1 -1
  9. package/lib/features/notion/NotionConnectionsSheet.js +47 -13
  10. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -1
  11. package/lib/features/notion/NotionPageView.js +68 -8
  12. package/lib/features/notion/NotionPageView.js.map +1 -1
  13. package/lib/features/notion/NotionSidebarSections.js +1 -1
  14. package/lib/features/notion/NotionSidebarSections.js.map +1 -1
  15. package/lib/features/notion/NotionWorkspaceView.js +14 -9
  16. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  17. package/lib/features/notion/database/DatabaseCells.js +3 -1
  18. package/lib/features/notion/database/DatabaseCells.js.map +1 -1
  19. package/lib/features/notion/database/DatabaseDateLayouts.js +1 -1
  20. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -1
  21. package/lib/features/notion/database/NotionDatabaseView.js +1 -1
  22. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -1
  23. package/lib/features/notion/notionAgentRunStatus.js +2 -2
  24. package/lib/features/notion/notionAgentRunStatus.js.map +1 -1
  25. package/lib/features/notion/notionAgentRuns.js +57 -0
  26. package/lib/features/notion/notionAgentRuns.js.map +1 -0
  27. package/lib/features/notion/notionAiContext.js +91 -0
  28. package/lib/features/notion/notionAiContext.js.map +1 -0
  29. package/lib/features/notion/notionConnections.js +42 -4
  30. package/lib/features/notion/notionConnections.js.map +1 -1
  31. package/lib/features/notion/notionDocuments.js +61 -1
  32. package/lib/features/notion/notionDocuments.js.map +1 -1
  33. package/lib/features/notion/notionNotesAgent.js +173 -3
  34. package/lib/features/notion/notionNotesAgent.js.map +1 -1
  35. package/lib/features/notion/notionPageKinds.js +1 -1
  36. package/lib/features/webbuilder/WebBuilderExperience.js +229 -97
  37. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  38. package/lib/features/webbuilder/buildFragments.js +33 -7
  39. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  40. package/lib/features/webbuilder/buildJob.js +2 -2
  41. package/lib/features/webbuilder/buildJob.js.map +1 -1
  42. package/lib/features/webbuilder/codeFiles.js +18 -1
  43. package/lib/features/webbuilder/codeFiles.js.map +1 -1
  44. package/lib/features/webbuilder/components/BottomTabs.js.map +1 -1
  45. package/lib/features/webbuilder/components/CodeView.js +134 -56
  46. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  47. package/lib/features/webbuilder/components/Composer.js +2 -2
  48. package/lib/features/webbuilder/components/Composer.js.map +1 -1
  49. package/lib/features/webbuilder/components/PreviewFrame.js +19 -3
  50. package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
  51. package/lib/features/webbuilder/components/PreviewScreen.js +310 -46
  52. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  53. package/lib/features/webbuilder/components/ProjectChat.js +141 -12
  54. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  55. package/lib/features/webbuilder/components/ProjectSheets.js +792 -0
  56. package/lib/features/webbuilder/components/ProjectSheets.js.map +1 -0
  57. package/lib/features/webbuilder/components/ProjectsScreen.js +14 -2
  58. package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
  59. package/lib/features/webbuilder/components/PublishSheet.js +914 -58
  60. package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
  61. package/lib/features/webbuilder/components/TemplateCard.js +9 -6
  62. package/lib/features/webbuilder/components/TemplateCard.js.map +1 -1
  63. package/lib/features/webbuilder/components/TemplatesSheet.js +5 -17
  64. package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -1
  65. package/lib/features/webbuilder/connectorTemplates.js +171 -0
  66. package/lib/features/webbuilder/connectorTemplates.js.map +1 -0
  67. package/lib/features/webbuilder/fileTree.js +163 -0
  68. package/lib/features/webbuilder/fileTree.js.map +1 -0
  69. package/lib/features/webbuilder/followUps.js +67 -0
  70. package/lib/features/webbuilder/followUps.js.map +1 -0
  71. package/lib/features/webbuilder/previewProbe.js +49 -0
  72. package/lib/features/webbuilder/previewProbe.js.map +1 -0
  73. package/lib/features/webbuilder/previewRoutes.js +156 -0
  74. package/lib/features/webbuilder/previewRoutes.js.map +1 -0
  75. package/lib/features/webbuilder/projectTools.js +341 -0
  76. package/lib/features/webbuilder/projectTools.js.map +1 -0
  77. package/lib/features/webbuilder/publishTools.js +475 -0
  78. package/lib/features/webbuilder/publishTools.js.map +1 -0
  79. package/lib/features/webbuilder/sleepNotice.js +13 -0
  80. package/lib/features/webbuilder/sleepNotice.js.map +1 -0
  81. package/lib/features/webbuilder/stepLabels.js +37 -7
  82. package/lib/features/webbuilder/stepLabels.js.map +1 -1
  83. package/lib/features/webbuilder/studioCatalog.js +5 -1
  84. package/lib/features/webbuilder/studioCatalog.js.map +1 -1
  85. package/lib/features/webbuilder/templateCatalog.js +140 -0
  86. package/lib/features/webbuilder/templateCatalog.js.map +1 -0
  87. package/lib/features/webbuilder/webbuilderPrompts.js +31 -5
  88. package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
  89. package/lib/features/webbuilder/workflow.js +8 -4
  90. package/lib/features/webbuilder/workflow.js.map +1 -1
  91. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +9 -6
  92. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -1
  93. package/lib/screens/WebBuilderNative/index.js +1 -1
  94. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  95. package/lib/screens/WebBuilderNative/keepAlive.js +53 -3
  96. package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -1
  97. package/lib/screens/WebBuilderNative/unreachableRetry.js +23 -0
  98. package/lib/screens/WebBuilderNative/unreachableRetry.js.map +1 -0
  99. package/lib/screens/WebBuilderNative/useConnectorTemplates.js +37 -0
  100. package/lib/screens/WebBuilderNative/useConnectorTemplates.js.map +1 -0
  101. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +6 -0
  102. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -1
  103. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +302 -40
  104. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  105. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +2 -2
  106. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
  107. package/lib/screens/WebBuilderNative/versionUndo.js +1 -1
  108. package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -1
  109. package/lib/screens/WebBuilderNative/webbuilderTransport.js +147 -77
  110. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
  111. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sources":["../../../src/features/webbuilder/workflow.ts"],"sourcesContent":["/**\n * Builds the payload that starts a Web Builder build.\n *\n * Native twin of the web surface's build trigger (aicode-stack\n * `surfaces/webbuilder/src/standalone/listCodeAssistantTemplates.ts` and the\n * send path of `realServices.tsx`). A build is started by running the\n * `yantra-webbuilder` connector's `WEBBUILDER_TRIGGER_WORKFLOW` action with a\n * `createChannelInput` (the AI Assistant channel + the user's post) and an\n * `extensionInput` (which form extension the backend dispatches to). Both are\n * derived from two org settings payloads:\n *\n * - `marketplace.templates.codeAssistant` (schema `uiLayout`): the starter /\n * remix template cards, plus the `projectType: codeassistant` workflow model\n * that carries formExtensionId / formId / E2B template ids;\n * - `appSettings.settings.aieditor` (schema `configuration`): per-org extras\n * merged under the workflow model.\n *\n * Pure (no React, no fetch, no `common`): it is bundled into the federated\n * Web Builder remote, so the host fetches the settings and hands them here.\n * Behavior is kept identical to the web so a build started from the phone\n * reaches the same pipeline with the same fields. The one value read from\n * config is the platform's sandbox domain, which an edit's preview is saved on.\n */\nimport { publicSandboxDomain } from './publicSandboxDomain';\nimport { withPublicSandboxHosts } from './sandboxPublicHost';\n\n/** Same settings namespace the web Code Assistant cards load (schema `uiLayout`). */\nexport const CODE_ASSISTANT_TEMPLATE_CONFIG_KEY = 'marketplace.templates.codeAssistant';\nexport const CODE_ASSISTANT_TEMPLATE_SCHEMA_ID = 'uiLayout';\n/** Per-org AI editor app settings, merged under the workflow model (schema `configuration`). */\nexport const APP_SETTINGS_AIEDITOR_KEY = 'appSettings.settings.aieditor';\nexport const APP_SETTINGS_AIEDITOR_SCHEMA_ID = 'configuration';\n\n/** E2B stack used when nothing names one. */\nexport const DEFAULT_STACK_TEMPLATE = 'vite-react';\n/** The web picker's default model (`src/standalone/models.ts`). */\nexport const DEFAULT_MODEL_ID = 'yantra-router/medium';\n\nexport const WEBBUILDER_CONNECTOR_ID = 'yantra-webbuilder';\nexport const WEBBUILDER_TRIGGER_WORKFLOW_ACTION = 'WEBBUILDER_TRIGGER_WORKFLOW';\n\n/** Id of the synthetic defaults row, never sent as a picked `templateId`. */\nconst WORKFLOW_DEFAULTS_ID = 'codeassistant-workflow-defaults';\n\n/** E2B fields the workflow model puts on `modelConfig.metadata` + `extensionInput.metadata`. */\nexport interface WebBuilderTemplateMetadata {\n formExtensionE2BAPIKey?: string;\n formExtensionE2BClaudeTemplateId?: string;\n formExtensionE2BDomain?: string;\n formExtensionE2BTemplateId?: string;\n formExtensionE2BViteReactTemplateId?: string;\n formExtensionE2BVueTemplateId?: string;\n /** Build workflow route; the Web Builder always uses `github-model`. */\n templateTarget?: string;\n}\n\n/** One starter / remix card (the web `WebBuilderTemplateOption`). */\nexport interface WebBuilderTemplate {\n /** Picker id: the form's `formTemplateId`, else its form key. */\n id: string;\n title: string;\n description?: string;\n cover?: string;\n category?: string;\n /** E2B stack (`vite-react` | `nextjs` | `vue`), sent as `modelConfig.template`. */\n templateName?: string;\n formTemplateId?: string;\n /** Workflow model form extension; without it the backend has nothing to dispatch. */\n formExtensionId?: string;\n formId?: string;\n formFunctionId?: string;\n /** E2B sandbox domain. */\n domain?: string;\n apiKey?: string;\n metadata?: WebBuilderTemplateMetadata;\n /** Seed prompt for the composer when the card is picked. */\n chatPrompt?: string;\n previewUrl?: string;\n deployUrl?: string;\n /** E2B snapshot a remix boots from. */\n snapshotId?: string;\n usesSupabase?: boolean;\n skill?: string;\n}\n\ntype TemplateInfo = Record<string, unknown>;\n\nfunction str(v: unknown): string {\n if (typeof v === 'string') return v.trim();\n return v == null ? '' : String(v).trim();\n}\n\nfunction boolTrue(v: unknown): boolean {\n return v === true || v === 'true' || v === 1 || v === '1';\n}\n\nfunction humanizeFormKey(formKey: string): string {\n return formKey\n .replace(/[-_]+/g, ' ')\n .trim()\n .split(/\\s+/)\n .map((word) => (word ? word[0].toUpperCase() + word.slice(1) : word))\n .join(' ');\n}\n\nfunction isDisabled(info: TemplateInfo): boolean {\n if (info.enabled === false || info.enabled === 'false') return true;\n if (info.enable === false || info.enable === 'false') return true;\n return false;\n}\n\n/**\n * A template gallery: an entry that lists `forms` cards. Its formExtensionId /\n * formId name the extension that contributed the cards (e.g. the WebBuilder\n * Templates `webbuilder` pack), which has no build functions - the backend\n * accepts the run, executes 0 functions and the build never starts. Only an\n * entry without cards can be the build workflow.\n */\nfunction isCardPack(info: TemplateInfo): boolean {\n const { forms } = info;\n return Boolean(forms) && typeof forms === 'object' && Object.keys(forms as object).length > 0;\n}\n\n/** Offline fallback: the Yantra starters (not vite/next/vue stack rows). */\nexport const FALLBACK_TEMPLATES: WebBuilderTemplate[] = [\n {\n id: 'assetwise',\n title: 'Assetwise',\n description: 'Yantra starter template',\n templateName: 'vite-react',\n formTemplateId: 'assetwise',\n },\n {\n id: 'arch-studio-v2-by-yantra',\n title: 'Arch Studio V2',\n description: 'Arch Studio v2 template by Yantra',\n templateName: 'vite-react',\n formTemplateId: 'arch-studio-v2-by-yantra',\n },\n {\n id: 'pinpost',\n title: 'Pinpost',\n description: 'Yantra starter template',\n templateName: 'vite-react',\n formTemplateId: 'pinpost',\n },\n {\n id: 'triage-by-yantra',\n title: 'Triage by Yantra',\n description: 'Yantra starter template',\n templateName: 'vite-react',\n formTemplateId: 'triage-by-yantra',\n },\n];\n\n/**\n * Normalize `pageSettings.settings` into the flat template map keyed by\n * template slug. The loader may hand back the full tree, the codeAssistant\n * subtree, or either wrapped as `{ settings: … }`.\n */\nfunction extractFlatMap(settings: unknown, preferCodeAssistant = false): Record<string, TemplateInfo> {\n if (!settings || typeof settings !== 'object') return {};\n const root = settings as Record<string, unknown>;\n\n const candidates: unknown[] = preferCodeAssistant\n ? [\n (root as { marketplace?: { templates?: { codeAssistant?: unknown } } }).marketplace?.templates\n ?.codeAssistant,\n (root as { templates?: { codeAssistant?: unknown } }).templates?.codeAssistant,\n (root as { codeAssistant?: unknown }).codeAssistant,\n (root as { settings?: unknown }).settings,\n root,\n ]\n : [(root as { settings?: unknown }).settings, root];\n\n const hit = candidates.find(\n (c) => c && typeof c === 'object' && !Array.isArray(c) && Object.keys(c as object).length > 0,\n );\n return (hit as Record<string, TemplateInfo> | undefined) ?? {};\n}\n\nfunction pickMetadata(info: TemplateInfo, templateTarget?: string): WebBuilderTemplateMetadata {\n return {\n // The E2B API key is only for local preview/deploy; buildWorkflowPayloadFromTemplate never forwards it.\n formExtensionE2BAPIKey: str(info.formExtensionE2BAPIKey) || undefined,\n formExtensionE2BClaudeTemplateId: str(info.formExtensionE2BClaudeTemplateId) || undefined,\n formExtensionE2BDomain: str(info.formExtensionE2BDomain) || undefined,\n formExtensionE2BTemplateId: str(info.formExtensionE2BTemplateId) || undefined,\n formExtensionE2BViteReactTemplateId: str(info.formExtensionE2BViteReactTemplateId) || undefined,\n formExtensionE2BVueTemplateId: str(info.formExtensionE2BVueTemplateId) || undefined,\n ...(templateTarget ? { templateTarget } : {}),\n };\n}\n\n/**\n * The marketplace entry that is the workflow model: `projectType: codeassistant`\n * first, github-model next. Never a card pack (see {@link isCardPack}).\n */\nfunction findWorkflowModel(map: Record<string, TemplateInfo>): { key: string; settings: TemplateInfo } | null {\n const ranked: Array<{ key: string; settings: TemplateInfo; rank: number }> = [];\n const eligible = Object.entries(map).filter(\n ([, info]) =>\n info &&\n typeof info === 'object' &&\n !isDisabled(info) &&\n !isCardPack(info) &&\n Boolean(str(info.formId)) &&\n Boolean(str(info.formExtensionId)),\n );\n for (const [key, info] of eligible) {\n const pt = str(info.projectType).toLowerCase();\n const tn = str(info.templateName).toLowerCase();\n const k = key.toLowerCase();\n let rank = 2;\n if (pt === 'codeassistant') rank = 0;\n else if (\n pt === 'github-model' ||\n tn === 'github-model' ||\n k.includes('github-model') ||\n k.includes('aieditor-form-code-extractor')\n ) {\n rank = 1;\n }\n ranked.push({ key, settings: info, rank });\n }\n ranked.sort((a, b) => a.rank - b.rank);\n return ranked[0] ?? null;\n}\n\nfunction resolveWorkflowModel(\n uiMap: Record<string, TemplateInfo>,\n appMap: Record<string, TemplateInfo>,\n): TemplateInfo | null {\n const found = findWorkflowModel(uiMap);\n if (!found) return null;\n const templateName = str(found.settings.templateName) || found.key;\n const appExtras = appMap[found.key] ?? appMap[templateName];\n // App settings first, marketplace form ids last so formId/extensionId always win.\n if (appExtras && typeof appExtras === 'object') {\n return { ...appExtras, ...found.settings };\n }\n return found.settings;\n}\n\n/** Marketplace ids that are routing markers, never an E2B stack. */\nconst NON_STACK_MARKERS = new Set([\n 'github-model',\n 'codeassistant',\n 'multi',\n 'aieditor-code-extractor',\n 'aieditor-form-code-extractor',\n]);\n\n/**\n * One marker -> stack id, or null when it is not a stack signal. `multi` packs\n * list both `vite` and `nextjs` in keywords, so they never pick a stack here.\n */\nfunction matchStackMarker(raw: string): string | null {\n const v = raw.toLowerCase().trim();\n if (!v || NON_STACK_MARKERS.has(v)) return null;\n\n if (\n v === 'nextjs' ||\n v === 'next' ||\n v === 'nextjs-base' ||\n v.includes('nextjs-base') ||\n v.startsWith('nextjs-') ||\n v.startsWith('next-js')\n ) {\n return 'nextjs';\n }\n\n if (v === 'vue' || v.startsWith('vue-') || v.includes('vue-')) return 'vue';\n\n if (\n v === 'vite-react' ||\n v === 'vitereact' ||\n v === 'react-base' ||\n v === 'vite-base' ||\n v === 'remix' ||\n v === 'vite' ||\n v.startsWith('vite') ||\n v.includes('react-base') ||\n v.includes('react-visual-base') ||\n v === 'react'\n ) {\n return 'vite-react';\n }\n\n return null;\n}\n\n/** Marketplace markers -> E2B stack (`vite-react` | `nextjs` | `vue`); vite-react when none match. */\nexport function normalizeStackTemplate(markers: string[]): string {\n for (const m of markers) {\n const hit = matchStackMarker(m);\n if (hit) return hit;\n }\n return DEFAULT_STACK_TEMPLATE;\n}\n\nfunction pushMarker(out: string[], value: unknown): void {\n const v = str(value).toLowerCase();\n if (!v || NON_STACK_MARKERS.has(v)) return;\n out.push(v);\n}\n\nfunction collectKeywordMarkers(source: TemplateInfo): string[] {\n const out: string[] = [];\n for (const listKey of ['keywords', 'tags'] as const) {\n const raw = source[listKey];\n if (Array.isArray(raw)) {\n for (const item of raw) pushMarker(out, item);\n } else if (raw && typeof raw === 'object') {\n for (const item of Object.values(raw as Record<string, unknown>)) pushMarker(out, item);\n } else if (typeof raw === 'string') {\n for (const part of raw.split(',')) pushMarker(out, part);\n }\n }\n return out;\n}\n\n/**\n * E2B stack for one form card: form-owned signals first; a `multi` pack is\n * vite-react (its parent keywords list both vite and nextjs, nextjs must not\n * win); then the pack key / parent fields / parent keywords.\n */\nfunction resolveCardStack(form: TemplateInfo, parent: TemplateInfo, formKey: string, templateKey?: string): string {\n const formOwned: string[] = [formKey];\n for (const key of ['templateName', 'projectType', 'modelTemplate'] as const) {\n pushMarker(formOwned, form[key]);\n }\n formOwned.push(...collectKeywordMarkers(form));\n\n for (const m of formOwned) {\n const hit = matchStackMarker(m);\n if (hit) return hit;\n }\n\n const projectType = (str(form.projectType) || str(parent.projectType)).toLowerCase();\n if (projectType === 'multi') {\n return DEFAULT_STACK_TEMPLATE;\n }\n\n const rest: string[] = [];\n if (templateKey) pushMarker(rest, templateKey);\n for (const key of ['templateName', 'projectType', 'modelTemplate'] as const) {\n pushMarker(rest, parent[key]);\n }\n rest.push(...collectKeywordMarkers(parent));\n return normalizeStackTemplate(rest);\n}\n\n/** The Web Builder always routes through the unified `github-model` build workflow route. */\nconst TEMPLATE_TARGET = 'github-model';\n\nfunction formHasOwnPreviewableUrl(form: TemplateInfo): boolean {\n return Boolean(str(form.previewUrl) || str(form.deployUrl) || str(form.figmaUrl));\n}\n\n/** Marketplace `projectType` values for blank visual-editor base starters. */\nconst BASE_PROJECT_TYPES = new Set(['react-base', 'nextjs-base']);\n\n/** Base starters (react-base / nextjs-base) are listed without a preview URL; remix cards need one. */\nfunction isBaseTemplateForm(form: TemplateInfo, formKey: string, group: TemplateInfo): boolean {\n const formPt = str(form.projectType).toLowerCase();\n if (BASE_PROJECT_TYPES.has(formPt)) return true;\n\n const key = formKey.toLowerCase();\n const title = str(form.title).toLowerCase();\n if (key.includes('nextjs-base') || key.includes('react-visual-base') || key.includes('react-base')) {\n return true;\n }\n if (\n title.includes('visual base') ||\n title.includes('base visual') ||\n /\\b(react|next\\s*js?)\\b.*\\bbase\\b/.test(title) ||\n /\\bbase\\b.*\\b(react|next\\s*js?)\\b/.test(title)\n ) {\n return true;\n }\n\n // A base-tagged parent only lifts forms that look like base starters, so\n // incomplete sibling cards sharing the parent stay hidden.\n const groupPt = str(group.projectType).toLowerCase();\n if (BASE_PROJECT_TYPES.has(groupPt) && (key.includes('base') || title.includes('base'))) {\n return true;\n }\n return false;\n}\n\n/** Thumbnail for a base template with no cover or deploy screenshot. */\nconst BASE_TEMPLATE_DEFAULT_COVER = `data:image/svg+xml,${encodeURIComponent(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"400\" height=\"225\" viewBox=\"0 0 400 225\">` +\n `<defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">` +\n `<stop offset=\"0%\" stop-color=\"#e2e8f0\"/><stop offset=\"100%\" stop-color=\"#f1f5f9\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"400\" height=\"225\" fill=\"url(#g)\"/>` +\n `<rect x=\"48\" y=\"48\" width=\"304\" height=\"129\" rx=\"12\" fill=\"#fff\" stroke=\"#cbd5e1\" stroke-width=\"2\"/>` +\n `<rect x=\"72\" y=\"72\" width=\"120\" height=\"10\" rx=\"5\" fill=\"#94a3b8\"/>` +\n `<rect x=\"72\" y=\"96\" width=\"200\" height=\"8\" rx=\"4\" fill=\"#cbd5e1\"/>` +\n `<rect x=\"72\" y=\"116\" width=\"160\" height=\"8\" rx=\"4\" fill=\"#cbd5e1\"/>` +\n `<rect x=\"72\" y=\"144\" width=\"72\" height=\"20\" rx=\"6\" fill=\"#64748b\"/>` +\n `</svg>`,\n)}`;\n\ntype RankedCard = WebBuilderTemplate & { hasOwnTitle?: boolean };\n\nfunction cardRichnessScore(card: RankedCard): number {\n return (card.hasOwnTitle ? 2 : 0) + (card.description ? 1 : 0) + (card.cover ? 1 : 0);\n}\n\nfunction previewUrlDedupeKey(card: WebBuilderTemplate): string {\n const urlKey = `${card.deployUrl ?? ''}|${card.previewUrl ?? ''}|`;\n // Base templates often share empty URLs; keep them distinct by id.\n if (urlKey === '||') return `id:${card.id}`;\n return urlKey;\n}\n\n/**\n * Every previewable `.forms.*` card under the codeAssistant settings, carrying\n * the workflow model's connector ids. Deduped by preview/deploy URL (richest\n * card wins) and sorted by title, as the web picker shows them.\n */\nfunction mapYantraFormCards(\n uiMap: Record<string, TemplateInfo>,\n workflowModel: TemplateInfo | null,\n): WebBuilderTemplate[] {\n const workflowFormId = workflowModel ? str(workflowModel.formId) : '';\n const workflowExtId = workflowModel ? str(workflowModel.formExtensionId) : '';\n const workflowFnId = workflowModel ? str(workflowModel.formFunctionId) : '';\n const workflowDomain = workflowModel ? str(workflowModel.formExtensionE2BDomain) : '';\n const workflowApiKey = workflowModel\n ? str(workflowModel.formExtensionModelConfigAPIKey) || str(workflowModel.apiKey)\n : '';\n\n const raw: RankedCard[] = [];\n // The workflow-model entry itself has no cards to show.\n const groups = Object.entries(uiMap).filter(\n ([, group]) =>\n group &&\n typeof group === 'object' &&\n !isDisabled(group) &&\n str(group.projectType).toLowerCase() !== 'codeassistant' &&\n group.forms &&\n typeof group.forms === 'object',\n );\n\n for (const [templateKey, group] of groups) {\n const forms = Object.entries(group.forms as Record<string, unknown>).filter(\n (entry): entry is [string, TemplateInfo] =>\n Boolean(entry[1]) && typeof entry[1] === 'object' && !isDisabled(entry[1] as TemplateInfo),\n );\n for (const [formKey, form] of forms) {\n const isBaseTemplate = isBaseTemplateForm(form, formKey, group);\n // Remix cards need a preview/deploy URL; base templates do not.\n if (formHasOwnPreviewableUrl(form) || isBaseTemplate) {\n const ownTitle = str(form.title);\n const title = ownTitle || humanizeFormKey(formKey) || 'Untitled';\n const formTemplateId = str(form.formTemplateId);\n const id = formTemplateId || formKey;\n const previewUrl = str(form.previewUrl) || str(group.previewUrl) || undefined;\n const deployUrl = str(form.deployUrl) || str(group.deployUrl) || undefined;\n const cover =\n str(form.coverImageUrl) ||\n str(form.previewImageUrl) ||\n str(group.coverImageUrl) ||\n (isBaseTemplate && !deployUrl ? BASE_TEMPLATE_DEFAULT_COVER : undefined);\n const snapshotId =\n str(form.snapshotId) || str(form.sourceSnapshotId) || str(group.snapshotId) || undefined;\n const usesSupabase = boolTrue(form.usesSupabase) || boolTrue(group.usesSupabase);\n const stack = resolveCardStack(form, group, formKey, templateKey);\n const metadata = pickMetadata(workflowModel || {}, TEMPLATE_TARGET);\n\n raw.push({\n id,\n title,\n description: str(form.description) || 'Yantra starter template',\n cover,\n category: str(form.category) || undefined,\n templateName: stack,\n formTemplateId: formTemplateId || undefined,\n // Only the workflow model runs builds; the pack's own ids name its gallery.\n formExtensionId: workflowExtId || undefined,\n formId: workflowFormId || undefined,\n formFunctionId: workflowFnId || undefined,\n domain: workflowDomain || undefined,\n apiKey: workflowApiKey || undefined,\n metadata,\n chatPrompt: str(form.chatPrompt) || undefined,\n previewUrl,\n deployUrl,\n snapshotId,\n usesSupabase,\n skill: str(form.skill) || str(group.skill) || undefined,\n hasOwnTitle: Boolean(ownTitle),\n });\n }\n }\n }\n\n const bestByUrl = new Map<string, RankedCard>();\n for (const card of raw) {\n const key = previewUrlDedupeKey(card);\n const existing = bestByUrl.get(key);\n if (!existing || cardRichnessScore(card) > cardRichnessScore(existing)) {\n bestByUrl.set(key, card);\n }\n }\n\n return [...bestByUrl.values()]\n .map(({ hasOwnTitle: _h, ...card }) => card)\n .sort((a, b) => a.title.localeCompare(b.title));\n}\n\n/** Template cards from the two settings payloads (web `listCodeAssistantTemplatesViaGraphql`, minus the fetch). */\nexport function templatesFromSettings(uiLayoutSettings: unknown, appSettings: unknown): WebBuilderTemplate[] {\n const uiMap = extractFlatMap(uiLayoutSettings, true);\n const appMap = extractFlatMap(appSettings, false);\n return mapYantraFormCards(uiMap, resolveWorkflowModel(uiMap, appMap));\n}\n\n/**\n * The connector ids a build uses when no card is picked (web\n * `loadCodeAssistantWorkflowDefaults`, minus the fetch): the workflow model.\n * Null when the org has none, which means the build workflow is not set up and\n * the host builds through the agent chat instead. A card pack's own\n * formExtensionId is never a fallback (see {@link isCardPack}).\n */\nexport function workflowDefaultsFromSettings(\n uiLayoutSettings: unknown,\n appSettings: unknown,\n stack: string = DEFAULT_STACK_TEMPLATE,\n): WebBuilderTemplate | null {\n const uiMap = extractFlatMap(uiLayoutSettings, true);\n const appMap = extractFlatMap(appSettings, false);\n const workflowModel = resolveWorkflowModel(uiMap, appMap);\n const formExtensionId = workflowModel ? str(workflowModel.formExtensionId) : '';\n if (!workflowModel || !formExtensionId) return null;\n return {\n id: WORKFLOW_DEFAULTS_ID,\n title: 'Code Assistant',\n templateName: normalizeStackTemplate([stack]),\n formExtensionId,\n formId: str(workflowModel.formId) || undefined,\n formFunctionId: str(workflowModel.formFunctionId) || undefined,\n domain: str(workflowModel.formExtensionE2BDomain) || undefined,\n apiKey: str(workflowModel.formExtensionModelConfigAPIKey) || str(workflowModel.apiKey) || undefined,\n metadata: pickMetadata(workflowModel, TEMPLATE_TARGET),\n };\n}\n\n/**\n * `modelConfig` + `extensionInput` for a template (web\n * `buildWorkflowPayloadFromTemplate`, unchanged). Form ids come from the\n * workflow model, the stack from the card; templateTarget is always\n * `github-model`. The E2B API key and GitHub credentials are never forwarded:\n * the agent's vault owns those.\n */\nexport function buildWorkflowPayloadFromTemplate(\n template: WebBuilderTemplate | undefined,\n extras?: {\n modelId?: string;\n systemId?: string;\n skill?: string;\n skillActionId?: string;\n editProjectId?: string;\n defaultTemplate?: string;\n },\n): {\n modelConfig: Record<string, unknown>;\n extensionInput: Record<string, unknown>;\n templateName: string;\n} {\n const rawName = template?.templateName || extras?.defaultTemplate || DEFAULT_STACK_TEMPLATE;\n const templateName = normalizeStackTemplate([rawName]) || DEFAULT_STACK_TEMPLATE;\n const m = template?.metadata || {};\n const templateTarget = TEMPLATE_TARGET;\n\n const metadata: Record<string, string> = {\n ...(m.formExtensionE2BClaudeTemplateId\n ? { formExtensionE2BClaudeTemplateId: m.formExtensionE2BClaudeTemplateId }\n : {}),\n ...(m.formExtensionE2BDomain ? { formExtensionE2BDomain: m.formExtensionE2BDomain } : {}),\n ...(m.formExtensionE2BTemplateId ? { formExtensionE2BTemplateId: m.formExtensionE2BTemplateId } : {}),\n ...(m.formExtensionE2BViteReactTemplateId\n ? { formExtensionE2BViteReactTemplateId: m.formExtensionE2BViteReactTemplateId }\n : {}),\n ...(m.formExtensionE2BVueTemplateId ? { formExtensionE2BVueTemplateId: m.formExtensionE2BVueTemplateId } : {}),\n templateTarget,\n };\n // The turn's toolbox skill wins over the template/pack skill.\n const skill = extras?.skill || template?.skill;\n if (skill) metadata.skill = skill;\n if (extras?.skillActionId) metadata.skillActionId = extras.skillActionId;\n if (template?.formTemplateId) metadata.formTemplateId = template.formTemplateId;\n\n // `template` is the stack; `templateTarget` is the workflow route and never goes in `template`.\n const modelConfig: Record<string, unknown> = {\n template: templateName,\n templateTarget,\n domain: template?.domain || 'e2b.dev',\n ...(template?.apiKey ? { apiKey: template.apiKey } : {}),\n metadata,\n };\n if (extras?.modelId) {\n modelConfig.model = extras.modelId;\n // `yantra-router/medium` -> provider `yantra-router`.\n const slash = extras.modelId.indexOf('/');\n if (slash > 0) modelConfig.provider = extras.modelId.slice(0, slash);\n }\n if (extras?.systemId) {\n modelConfig.system = extras.systemId;\n modelConfig.designSystem = extras.systemId;\n modelConfig.systemId = extras.systemId;\n }\n if (skill) {\n modelConfig.skill = skill;\n modelConfig.skillId = skill;\n }\n if (extras?.skillActionId) modelConfig.skillActionId = extras.skillActionId;\n if (extras?.editProjectId) modelConfig.editProjectId = extras.editProjectId;\n\n const extensionInput: Record<string, unknown> = {\n ...(template?.formExtensionId ? { extensionId: template.formExtensionId } : {}),\n stepName: 'extractCodeFromExtension',\n formId: template?.formId || 'form-builder-proxy',\n functionId: template?.formFunctionId || 'create-channel-function',\n metadata,\n source: 'final-submission',\n };\n\n return { modelConfig, extensionInput, templateName };\n}\n\n/** A Mongo-style 24-hex id (8 hex seconds + 16 random hex), as the web mints channel/project ids. */\nexport function newObjectId(): string {\n const ts = Math.floor(Date.now() / 1000)\n .toString(16)\n .padStart(8, '0');\n let rand = '';\n for (let i = 0; i < 16; i++) rand += Math.floor(Math.random() * 16).toString(16);\n return ts + rand;\n}\n\nfunction decodeBase64(b64: string): string {\n if (typeof atob === 'function') return atob(b64);\n // jest/node without atob.\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n const { Buffer } = require('buffer') as { Buffer: { from(s: string, e: string): { toString(e: string): string } } };\n return Buffer.from(b64, 'base64').toString('binary');\n}\n\n/**\n * The token's `tenant` (or `tid`) claim, unverified. The connector runs the\n * trigger against this tenant. Unlike the web this also accepts base64url\n * segments (`-`/`_`, no padding), which the web's bare `atob` would reject.\n */\nexport function tenantIdFromToken(token: string | null | undefined): string | undefined {\n if (!token) return undefined;\n try {\n const seg = (token.split('.')[1] || '').replace(/-/g, '+').replace(/_/g, '/');\n const padded = seg + '='.repeat((4 - (seg.length % 4)) % 4);\n const payload = JSON.parse(decodeBase64(padded)) as { tenant?: string; tid?: string };\n return payload.tenant || payload.tid;\n } catch {\n return undefined;\n }\n}\n\n/** Stack names and the defaults row are not a picked catalog card (web `explicitTemplateId`). */\nconst NON_PICK_TEMPLATE_IDS = new Set([WORKFLOW_DEFAULTS_ID, 'bundled', 'vite-react', 'nextjs', 'vue', '']);\n\nfunction explicitTemplateId(template: { id?: string | null } | null | undefined): string | undefined {\n const id = String(template?.id ?? '').trim();\n if (NON_PICK_TEMPLATE_IDS.has(id)) return undefined;\n return id;\n}\n\nconst LOCAL_HOST_RE = /^https?:\\/\\/(localhost|127\\.0\\.0\\.1)([:/]|$)/i;\n\n/** Preview hosts are `3000-<sandboxId>.<domain>` (e2b's or the platform's); recover the id when only the URL is known. */\nfunction sandboxIdFromUrl(url: string | null | undefined): string | null {\n return url?.match(/^https?:\\/\\/3000-([^.]+)\\./)?.[1] || null;\n}\n\nexport type WebBuilderTurnMode = 'new' | 'remix' | 'edit';\n\nexport interface WebBuilderTriggerOptions {\n channelId: string;\n projectId: string;\n /** The user's prompt, posted as the turn's content. */\n text: string;\n /** The card the user picked; any picked card makes this a fresh remix build. */\n template?: WebBuilderTemplate;\n /** From {@link workflowDefaultsFromSettings}; supplies the connector ids a card lacks. */\n defaults: WebBuilderTemplate | null;\n mode: WebBuilderTurnMode;\n /** The build being edited (mode `edit`). */\n edit?: { sandboxId?: string | null; sandboxUrl?: string | null; title?: string | null };\n /** Stack of the build being edited, when known (web `lastSandbox.templateId`). */\n stackHint?: string;\n modelId?: string;\n /** Look-alike site, already normalized to https by the caller. */\n referenceUrl?: string;\n /** Uploaded files (https URLs, never base64). */\n attachments?: Array<{ name: string; url: string; mimeType?: string }>;\n /** Backend the app reads builds from; forwarded so the connector writes to the same one. */\n graphqlUrl?: string;\n token?: string;\n /** The agent runs on this machine, so a localhost graphqlUrl is reachable from it. */\n agentLocal?: boolean;\n}\n\n/**\n * The `WEBBUILDER_TRIGGER_WORKFLOW` params for one turn, mirroring the web send\n * path: the picked card is merged over the workflow defaults (the card's stack\n * and metadata win, the defaults fill missing connector ids), and the fragment\n * says how the sandbox boots:\n * - picked card with a snapshot -> `remix` from that snapshot;\n * - edit -> `edit`, reconnecting the existing sandbox (no snapshot);\n * - otherwise a blank boot of the stack template.\n *\n * Returns `not-configured` when no form extension id is known: the backend\n * would accept the channel but have nothing to dispatch, and the build would\n * hang until timeout, so the caller fails fast instead.\n *\n * Omitted from the web turn (not wired on native yet): referenceArtifact\n * (`mode: 'reference'` + prompt rewrite), design system / skill / skillActionId,\n * canvas hand edits, project knowledge, integrations, aiInApp, design\n * direction, GitHub sync, database, app secrets, plan, follow-up answers, the\n * VITE_WEBBUILDER_EXTENSION_ID dev fallback, and the 401 re-mint retry.\n */\nexport function buildTriggerParams(\n opts: WebBuilderTriggerOptions,\n): { ok: true; params: Record<string, unknown> } | { ok: false; reason: 'not-configured' } {\n const { channelId, projectId, defaults } = opts;\n // A picked card always means a fresh remix build on the web; it never rides on an edit.\n const pickedTemplate = opts.mode === 'edit' ? undefined : opts.template;\n const isNewFromTemplate = Boolean(pickedTemplate);\n const isEditTurn =\n !isNewFromTemplate && opts.mode === 'edit' && Boolean(opts.edit?.sandboxId || opts.edit?.sandboxUrl);\n\n const stackHint =\n pickedTemplate?.templateName || (isEditTurn ? opts.stackHint : undefined) || DEFAULT_STACK_TEMPLATE;\n\n let templateForPayload: WebBuilderTemplate | undefined;\n if (pickedTemplate) {\n templateForPayload = {\n ...pickedTemplate,\n formExtensionId: pickedTemplate.formExtensionId || defaults?.formExtensionId,\n formId: pickedTemplate.formId || defaults?.formId,\n formFunctionId: pickedTemplate.formFunctionId || defaults?.formFunctionId,\n domain: pickedTemplate.domain || defaults?.domain,\n apiKey: pickedTemplate.apiKey || defaults?.apiKey,\n metadata: { ...(defaults?.metadata || {}), ...(pickedTemplate.metadata || {}) },\n // The card's stack wins; never inherit the workflow model's (often nextjs).\n templateName: pickedTemplate.templateName || stackHint,\n };\n } else if (defaults) {\n templateForPayload = { ...defaults, templateName: stackHint || defaults.templateName };\n }\n\n const resolvedModelId = opts.modelId || DEFAULT_MODEL_ID;\n const { modelConfig, extensionInput, templateName } = buildWorkflowPayloadFromTemplate(templateForPayload, {\n modelId: resolvedModelId,\n defaultTemplate: stackHint,\n });\n if (!extensionInput.extensionId) return { ok: false, reason: 'not-configured' };\n\n const templateSnapshotId = pickedTemplate?.snapshotId?.trim() || '';\n const sandboxId = isEditTurn ? opts.edit?.sandboxId || sandboxIdFromUrl(opts.edit?.sandboxUrl) || null : null;\n // Saved on the turn's post: on the platform's sandbox domain when one is set.\n const sandboxUrl = isEditTurn\n ? withPublicSandboxHosts((opts.edit?.sandboxUrl?.trim() || '').split('?')[0], publicSandboxDomain()) || null\n : null;\n\n const remixFragment: Record<string, unknown> = {};\n if (pickedTemplate?.deployUrl) remixFragment.deployUrl = pickedTemplate.deployUrl;\n if (isNewFromTemplate && templateSnapshotId) {\n remixFragment.remix = true;\n remixFragment.mode = 'remix';\n remixFragment.snapshotId = templateSnapshotId;\n remixFragment.usesSupabase = pickedTemplate?.usesSupabase === true;\n } else if (isEditTurn && (sandboxId || sandboxUrl)) {\n // Server reconnect path: remix + sandboxId, no snapshotId.\n remixFragment.remix = true;\n remixFragment.mode = 'edit';\n if (sandboxId) remixFragment.sandboxId = sandboxId;\n if (sandboxUrl) remixFragment.sandboxUrl = sandboxUrl;\n if (opts.edit?.title) remixFragment.title = opts.edit.title;\n remixFragment.projectId = projectId;\n }\n\n const pickedTemplateId = explicitTemplateId(pickedTemplate);\n const referenceUrl = opts.referenceUrl?.trim();\n const attachments = opts.attachments?.filter((a) => a && a.url) ?? [];\n\n const createChannelInput = {\n channelId,\n title: 'AI Assistant',\n description: 'AI Assistant',\n displayName: 'AI Assistant',\n topic: 'AI Assistant',\n projectId,\n type: 'AIASSISTANT',\n postData: {\n type: 'AIASSISTANT',\n content: opts.text,\n props: {\n template: templateName,\n templateTarget: TEMPLATE_TARGET,\n projectId,\n role: 'USER',\n fragment: remixFragment,\n ...(sandboxId ? { sandboxId } : {}),\n ...(sandboxUrl ? { sandboxUrl } : {}),\n model: resolvedModelId,\n ...(attachments.length ? { attachments } : {}),\n // Only a card the user picked, never the defaults row or a stack name.\n ...(pickedTemplateId ? { templateId: pickedTemplateId } : {}),\n ...(referenceUrl ? { referenceUrl } : {}),\n },\n },\n additionalProperties: { modelConfig },\n };\n\n // Pin the connector to the same backend the app reads builds from. A\n // localhost URL rides along only when the agent is local too: a hosted\n // agent cannot reach a developer's machine.\n const authParams =\n opts.graphqlUrl && (opts.agentLocal || !LOCAL_HOST_RE.test(opts.graphqlUrl))\n ? { graphqlUrl: opts.graphqlUrl, accessToken: opts.token, tenantId: tenantIdFromToken(opts.token) }\n : {};\n\n return { ok: true, params: { createChannelInput, extensionInput, ...authParams } };\n}\n\n/**\n * The agent-only note a template pick sends with the person's words - the web's\n * `templateRemixForChat` (#384): template picks build through the agent chat\n * (webbuilder-design-pro \"Remix a template\"), not `WEBBUILDER_TRIGGER_WORKFLOW`, which\n * stalls when the workflow never posts back to the chat.\n */\nexport function templateRemixNote(template: Pick<WebBuilderTemplate, 'title' | 'snapshotId'>): string {\n const snapshot = template.snapshotId?.trim();\n const boot = snapshot\n ? `Boot it with WEBBUILDER_CREATE_SANDBOX {\"snapshotId\":\"${snapshot}\",\"builder\":\"vite\",\"timeoutMs\":3600000,\"private\":true}.`\n : `Find it with WEBBUILDER_LIST_TEMPLATES and boot it with that card's start.params.`;\n return [\n `[Template] The user picked the Yantra template \"${template.title}\" to start from - remix it (Remix a template).`,\n boot,\n 'They already chose this template: do not ask how to start. Ask only what you still need, then build and give the live preview link.',\n ].join(' ');\n}\n\n/** The skill the web Agent chat runs on (`chat/agentSkill.ts`): the whole website journey. */\nexport const WEBBUILDER_CHAT_SKILL = 'yantra-skills/webbuilder-design-pro';\n"],"names":["Buffer"],"mappings":"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"}
1
+ {"version":3,"file":"workflow.js","sources":["../../../src/features/webbuilder/workflow.ts"],"sourcesContent":["/**\n * Builds the payload that starts a Web Builder build.\n *\n * Native twin of the web surface's build trigger (aicode-stack\n * `surfaces/webbuilder/src/standalone/listCodeAssistantTemplates.ts` and the\n * send path of `realServices.tsx`). A build is started by running the\n * `yantra-webbuilder` connector's `WEBBUILDER_TRIGGER_WORKFLOW` action with a\n * `createChannelInput` (the AI Assistant channel + the user's post) and an\n * `extensionInput` (which form extension the backend dispatches to). Both are\n * derived from two org settings payloads:\n *\n * - `marketplace.templates.codeAssistant` (schema `uiLayout`): the starter /\n * remix template cards, plus the `projectType: codeassistant` workflow model\n * that carries formExtensionId / formId / E2B template ids;\n * - `appSettings.settings.aieditor` (schema `configuration`): per-org extras\n * merged under the workflow model.\n *\n * Pure (no React, no fetch, no `common`): it is bundled into the federated\n * Web Builder remote, so the host fetches the settings and hands them here.\n * Behavior is kept identical to the web so a build started from the phone\n * reaches the same pipeline with the same fields. The one value read from\n * config is the platform's sandbox domain, which an edit's preview is saved on.\n */\nimport { publicSandboxDomain } from './publicSandboxDomain';\nimport { withPublicSandboxHosts } from './sandboxPublicHost';\n\n/** Same settings namespace the web Code Assistant cards load (schema `uiLayout`). */\nexport const CODE_ASSISTANT_TEMPLATE_CONFIG_KEY = 'marketplace.templates.codeAssistant';\nexport const CODE_ASSISTANT_TEMPLATE_SCHEMA_ID = 'uiLayout';\n/** Per-org AI editor app settings, merged under the workflow model (schema `configuration`). */\nexport const APP_SETTINGS_AIEDITOR_KEY = 'appSettings.settings.aieditor';\nexport const APP_SETTINGS_AIEDITOR_SCHEMA_ID = 'configuration';\n\n/** E2B stack used when nothing names one. */\nexport const DEFAULT_STACK_TEMPLATE = 'vite-react';\n/** The web picker's default model (`src/standalone/models.ts`). */\nexport const DEFAULT_MODEL_ID = 'yantra-router/medium';\n\nexport const WEBBUILDER_CONNECTOR_ID = 'yantra-webbuilder';\nexport const WEBBUILDER_TRIGGER_WORKFLOW_ACTION = 'WEBBUILDER_TRIGGER_WORKFLOW';\n\n/** Id of the synthetic defaults row, never sent as a picked `templateId`. */\nconst WORKFLOW_DEFAULTS_ID = 'codeassistant-workflow-defaults';\n\n/** E2B fields the workflow model puts on `modelConfig.metadata` + `extensionInput.metadata`. */\nexport interface WebBuilderTemplateMetadata {\n formExtensionE2BAPIKey?: string;\n formExtensionE2BClaudeTemplateId?: string;\n formExtensionE2BDomain?: string;\n formExtensionE2BTemplateId?: string;\n formExtensionE2BViteReactTemplateId?: string;\n formExtensionE2BVueTemplateId?: string;\n /** Build workflow route; the Web Builder always uses `github-model`. */\n templateTarget?: string;\n}\n\n/** One starter / remix card (the web `WebBuilderTemplateOption`). */\nexport interface WebBuilderTemplate {\n /** Picker id: the form's `formTemplateId`, else its form key. */\n id: string;\n title: string;\n description?: string;\n cover?: string;\n category?: string;\n /** E2B stack (`vite-react` | `nextjs` | `vue`), sent as `modelConfig.template`. */\n templateName?: string;\n formTemplateId?: string;\n /** Workflow model form extension; without it the backend has nothing to dispatch. */\n formExtensionId?: string;\n formId?: string;\n formFunctionId?: string;\n /** E2B sandbox domain. */\n domain?: string;\n apiKey?: string;\n metadata?: WebBuilderTemplateMetadata;\n /** Seed prompt for the composer when the card is picked. */\n chatPrompt?: string;\n previewUrl?: string;\n deployUrl?: string;\n /** E2B snapshot a remix boots from. */\n snapshotId?: string;\n usesSupabase?: boolean;\n skill?: string;\n /** The catalog's tags (searched like the name). */\n tags?: string[];\n /** The catalog's display name, when it has one (\"Arch Studio\" for `arch-studio-v2`). */\n displayName?: string;\n}\n\ntype TemplateInfo = Record<string, unknown>;\n\nfunction str(v: unknown): string {\n if (typeof v === 'string') return v.trim();\n return v == null ? '' : String(v).trim();\n}\n\nfunction boolTrue(v: unknown): boolean {\n return v === true || v === 'true' || v === 1 || v === '1';\n}\n\nfunction humanizeFormKey(formKey: string): string {\n return formKey\n .replace(/[-_]+/g, ' ')\n .trim()\n .split(/\\s+/)\n .map((word) => (word ? word[0].toUpperCase() + word.slice(1) : word))\n .join(' ');\n}\n\nfunction isDisabled(info: TemplateInfo): boolean {\n if (info.enabled === false || info.enabled === 'false') return true;\n if (info.enable === false || info.enable === 'false') return true;\n return false;\n}\n\n/**\n * A template gallery: an entry that lists `forms` cards. Its formExtensionId /\n * formId name the extension that contributed the cards (e.g. the WebBuilder\n * Templates `webbuilder` pack), which has no build functions - the backend\n * accepts the run, executes 0 functions and the build never starts. Only an\n * entry without cards can be the build workflow.\n */\nfunction isCardPack(info: TemplateInfo): boolean {\n const { forms } = info;\n return Boolean(forms) && typeof forms === 'object' && Object.keys(forms as object).length > 0;\n}\n\n/** Offline fallback: the Yantra starters (not vite/next/vue stack rows). */\nexport const FALLBACK_TEMPLATES: WebBuilderTemplate[] = [\n {\n id: 'assetwise',\n title: 'Assetwise',\n description: 'Track company equipment: who has it, where it is and when it is due back',\n category: 'Internal Tools',\n templateName: 'vite-react',\n formTemplateId: 'assetwise',\n },\n {\n id: 'arch-studio-v2-by-yantra',\n title: 'Arch Studio V2',\n description: 'A calm, minimal site for an architecture and design studio',\n category: 'Portfolio',\n templateName: 'vite-react',\n formTemplateId: 'arch-studio-v2-by-yantra',\n },\n {\n id: 'pinpost',\n title: 'Pinpost',\n description: 'A shared pin board for teams, with comments and reactions',\n category: 'SaaS',\n templateName: 'vite-react',\n formTemplateId: 'pinpost',\n },\n {\n id: 'triage-by-yantra',\n title: 'Triage by Yantra',\n description: 'Report, sort and fix bugs with your team',\n category: 'Developer Tools',\n templateName: 'vite-react',\n formTemplateId: 'triage-by-yantra',\n },\n];\n\n/**\n * Normalize `pageSettings.settings` into the flat template map keyed by\n * template slug. The loader may hand back the full tree, the codeAssistant\n * subtree, or either wrapped as `{ settings: … }`.\n */\nfunction extractFlatMap(settings: unknown, preferCodeAssistant = false): Record<string, TemplateInfo> {\n if (!settings || typeof settings !== 'object') return {};\n const root = settings as Record<string, unknown>;\n\n const candidates: unknown[] = preferCodeAssistant\n ? [\n (root as { marketplace?: { templates?: { codeAssistant?: unknown } } }).marketplace?.templates\n ?.codeAssistant,\n (root as { templates?: { codeAssistant?: unknown } }).templates?.codeAssistant,\n (root as { codeAssistant?: unknown }).codeAssistant,\n (root as { settings?: unknown }).settings,\n root,\n ]\n : [(root as { settings?: unknown }).settings, root];\n\n const hit = candidates.find(\n (c) => c && typeof c === 'object' && !Array.isArray(c) && Object.keys(c as object).length > 0,\n );\n return (hit as Record<string, TemplateInfo> | undefined) ?? {};\n}\n\nfunction pickMetadata(info: TemplateInfo, templateTarget?: string): WebBuilderTemplateMetadata {\n return {\n // The E2B API key is only for local preview/deploy; buildWorkflowPayloadFromTemplate never forwards it.\n formExtensionE2BAPIKey: str(info.formExtensionE2BAPIKey) || undefined,\n formExtensionE2BClaudeTemplateId: str(info.formExtensionE2BClaudeTemplateId) || undefined,\n formExtensionE2BDomain: str(info.formExtensionE2BDomain) || undefined,\n formExtensionE2BTemplateId: str(info.formExtensionE2BTemplateId) || undefined,\n formExtensionE2BViteReactTemplateId: str(info.formExtensionE2BViteReactTemplateId) || undefined,\n formExtensionE2BVueTemplateId: str(info.formExtensionE2BVueTemplateId) || undefined,\n ...(templateTarget ? { templateTarget } : {}),\n };\n}\n\n/**\n * The marketplace entry that is the workflow model: `projectType: codeassistant`\n * first, github-model next. Never a card pack (see {@link isCardPack}).\n */\nfunction findWorkflowModel(map: Record<string, TemplateInfo>): { key: string; settings: TemplateInfo } | null {\n const ranked: Array<{ key: string; settings: TemplateInfo; rank: number }> = [];\n const eligible = Object.entries(map).filter(\n ([, info]) =>\n info &&\n typeof info === 'object' &&\n !isDisabled(info) &&\n !isCardPack(info) &&\n Boolean(str(info.formId)) &&\n Boolean(str(info.formExtensionId)),\n );\n for (const [key, info] of eligible) {\n const pt = str(info.projectType).toLowerCase();\n const tn = str(info.templateName).toLowerCase();\n const k = key.toLowerCase();\n let rank = 2;\n if (pt === 'codeassistant') rank = 0;\n else if (\n pt === 'github-model' ||\n tn === 'github-model' ||\n k.includes('github-model') ||\n k.includes('aieditor-form-code-extractor')\n ) {\n rank = 1;\n }\n ranked.push({ key, settings: info, rank });\n }\n ranked.sort((a, b) => a.rank - b.rank);\n return ranked[0] ?? null;\n}\n\nfunction resolveWorkflowModel(\n uiMap: Record<string, TemplateInfo>,\n appMap: Record<string, TemplateInfo>,\n): TemplateInfo | null {\n const found = findWorkflowModel(uiMap);\n if (!found) return null;\n const templateName = str(found.settings.templateName) || found.key;\n const appExtras = appMap[found.key] ?? appMap[templateName];\n // App settings first, marketplace form ids last so formId/extensionId always win.\n if (appExtras && typeof appExtras === 'object') {\n return { ...appExtras, ...found.settings };\n }\n return found.settings;\n}\n\n/** Marketplace ids that are routing markers, never an E2B stack. */\nconst NON_STACK_MARKERS = new Set([\n 'github-model',\n 'codeassistant',\n 'multi',\n 'aieditor-code-extractor',\n 'aieditor-form-code-extractor',\n]);\n\n/**\n * One marker -> stack id, or null when it is not a stack signal. `multi` packs\n * list both `vite` and `nextjs` in keywords, so they never pick a stack here.\n */\nfunction matchStackMarker(raw: string): string | null {\n const v = raw.toLowerCase().trim();\n if (!v || NON_STACK_MARKERS.has(v)) return null;\n\n if (\n v === 'nextjs' ||\n v === 'next' ||\n v === 'nextjs-base' ||\n v.includes('nextjs-base') ||\n v.startsWith('nextjs-') ||\n v.startsWith('next-js')\n ) {\n return 'nextjs';\n }\n\n if (v === 'vue' || v.startsWith('vue-') || v.includes('vue-')) return 'vue';\n\n if (\n v === 'vite-react' ||\n v === 'vitereact' ||\n v === 'react-base' ||\n v === 'vite-base' ||\n v === 'remix' ||\n v === 'vite' ||\n v.startsWith('vite') ||\n v.includes('react-base') ||\n v.includes('react-visual-base') ||\n v === 'react'\n ) {\n return 'vite-react';\n }\n\n return null;\n}\n\n/** Marketplace markers -> E2B stack (`vite-react` | `nextjs` | `vue`); vite-react when none match. */\nexport function normalizeStackTemplate(markers: string[]): string {\n for (const m of markers) {\n const hit = matchStackMarker(m);\n if (hit) return hit;\n }\n return DEFAULT_STACK_TEMPLATE;\n}\n\nfunction pushMarker(out: string[], value: unknown): void {\n const v = str(value).toLowerCase();\n if (!v || NON_STACK_MARKERS.has(v)) return;\n out.push(v);\n}\n\nfunction collectKeywordMarkers(source: TemplateInfo): string[] {\n const out: string[] = [];\n for (const listKey of ['keywords', 'tags'] as const) {\n const raw = source[listKey];\n if (Array.isArray(raw)) {\n for (const item of raw) pushMarker(out, item);\n } else if (raw && typeof raw === 'object') {\n for (const item of Object.values(raw as Record<string, unknown>)) pushMarker(out, item);\n } else if (typeof raw === 'string') {\n for (const part of raw.split(',')) pushMarker(out, part);\n }\n }\n return out;\n}\n\n/**\n * E2B stack for one form card: form-owned signals first; a `multi` pack is\n * vite-react (its parent keywords list both vite and nextjs, nextjs must not\n * win); then the pack key / parent fields / parent keywords.\n */\nfunction resolveCardStack(form: TemplateInfo, parent: TemplateInfo, formKey: string, templateKey?: string): string {\n const formOwned: string[] = [formKey];\n for (const key of ['templateName', 'projectType', 'modelTemplate'] as const) {\n pushMarker(formOwned, form[key]);\n }\n formOwned.push(...collectKeywordMarkers(form));\n\n for (const m of formOwned) {\n const hit = matchStackMarker(m);\n if (hit) return hit;\n }\n\n const projectType = (str(form.projectType) || str(parent.projectType)).toLowerCase();\n if (projectType === 'multi') {\n return DEFAULT_STACK_TEMPLATE;\n }\n\n const rest: string[] = [];\n if (templateKey) pushMarker(rest, templateKey);\n for (const key of ['templateName', 'projectType', 'modelTemplate'] as const) {\n pushMarker(rest, parent[key]);\n }\n rest.push(...collectKeywordMarkers(parent));\n return normalizeStackTemplate(rest);\n}\n\n/** The Web Builder always routes through the unified `github-model` build workflow route. */\nconst TEMPLATE_TARGET = 'github-model';\n\nfunction formHasOwnPreviewableUrl(form: TemplateInfo): boolean {\n return Boolean(str(form.previewUrl) || str(form.deployUrl) || str(form.figmaUrl));\n}\n\n/** Marketplace `projectType` values for blank visual-editor base starters. */\nconst BASE_PROJECT_TYPES = new Set(['react-base', 'nextjs-base']);\n\n/** Base starters (react-base / nextjs-base) are listed without a preview URL; remix cards need one. */\nfunction isBaseTemplateForm(form: TemplateInfo, formKey: string, group: TemplateInfo): boolean {\n const formPt = str(form.projectType).toLowerCase();\n if (BASE_PROJECT_TYPES.has(formPt)) return true;\n\n const key = formKey.toLowerCase();\n const title = str(form.title).toLowerCase();\n if (key.includes('nextjs-base') || key.includes('react-visual-base') || key.includes('react-base')) {\n return true;\n }\n if (\n title.includes('visual base') ||\n title.includes('base visual') ||\n /\\b(react|next\\s*js?)\\b.*\\bbase\\b/.test(title) ||\n /\\bbase\\b.*\\b(react|next\\s*js?)\\b/.test(title)\n ) {\n return true;\n }\n\n // A base-tagged parent only lifts forms that look like base starters, so\n // incomplete sibling cards sharing the parent stay hidden.\n const groupPt = str(group.projectType).toLowerCase();\n if (BASE_PROJECT_TYPES.has(groupPt) && (key.includes('base') || title.includes('base'))) {\n return true;\n }\n return false;\n}\n\n/** Thumbnail for a base template with no cover or deploy screenshot. */\nconst BASE_TEMPLATE_DEFAULT_COVER = `data:image/svg+xml,${encodeURIComponent(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"400\" height=\"225\" viewBox=\"0 0 400 225\">` +\n `<defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">` +\n `<stop offset=\"0%\" stop-color=\"#e2e8f0\"/><stop offset=\"100%\" stop-color=\"#f1f5f9\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"400\" height=\"225\" fill=\"url(#g)\"/>` +\n `<rect x=\"48\" y=\"48\" width=\"304\" height=\"129\" rx=\"12\" fill=\"#fff\" stroke=\"#cbd5e1\" stroke-width=\"2\"/>` +\n `<rect x=\"72\" y=\"72\" width=\"120\" height=\"10\" rx=\"5\" fill=\"#94a3b8\"/>` +\n `<rect x=\"72\" y=\"96\" width=\"200\" height=\"8\" rx=\"4\" fill=\"#cbd5e1\"/>` +\n `<rect x=\"72\" y=\"116\" width=\"160\" height=\"8\" rx=\"4\" fill=\"#cbd5e1\"/>` +\n `<rect x=\"72\" y=\"144\" width=\"72\" height=\"20\" rx=\"6\" fill=\"#64748b\"/>` +\n `</svg>`,\n)}`;\n\ntype RankedCard = WebBuilderTemplate & { hasOwnTitle?: boolean };\n\nfunction cardRichnessScore(card: RankedCard): number {\n return (card.hasOwnTitle ? 2 : 0) + (card.description ? 1 : 0) + (card.cover ? 1 : 0);\n}\n\nfunction previewUrlDedupeKey(card: WebBuilderTemplate): string {\n const urlKey = `${card.deployUrl ?? ''}|${card.previewUrl ?? ''}|`;\n // Base templates often share empty URLs; keep them distinct by id.\n if (urlKey === '||') return `id:${card.id}`;\n return urlKey;\n}\n\n/**\n * Every previewable `.forms.*` card under the codeAssistant settings, carrying\n * the workflow model's connector ids. Deduped by preview/deploy URL (richest\n * card wins) and sorted by title, as the web picker shows them.\n */\nfunction mapYantraFormCards(\n uiMap: Record<string, TemplateInfo>,\n workflowModel: TemplateInfo | null,\n): WebBuilderTemplate[] {\n const workflowFormId = workflowModel ? str(workflowModel.formId) : '';\n const workflowExtId = workflowModel ? str(workflowModel.formExtensionId) : '';\n const workflowFnId = workflowModel ? str(workflowModel.formFunctionId) : '';\n const workflowDomain = workflowModel ? str(workflowModel.formExtensionE2BDomain) : '';\n const workflowApiKey = workflowModel\n ? str(workflowModel.formExtensionModelConfigAPIKey) || str(workflowModel.apiKey)\n : '';\n\n const raw: RankedCard[] = [];\n // The workflow-model entry itself has no cards to show.\n const groups = Object.entries(uiMap).filter(\n ([, group]) =>\n group &&\n typeof group === 'object' &&\n !isDisabled(group) &&\n str(group.projectType).toLowerCase() !== 'codeassistant' &&\n group.forms &&\n typeof group.forms === 'object',\n );\n\n for (const [templateKey, group] of groups) {\n const forms = Object.entries(group.forms as Record<string, unknown>).filter(\n (entry): entry is [string, TemplateInfo] =>\n Boolean(entry[1]) && typeof entry[1] === 'object' && !isDisabled(entry[1] as TemplateInfo),\n );\n for (const [formKey, form] of forms) {\n const isBaseTemplate = isBaseTemplateForm(form, formKey, group);\n // Remix cards need a preview/deploy URL; base templates do not.\n if (formHasOwnPreviewableUrl(form) || isBaseTemplate) {\n const ownTitle = str(form.title);\n const title = ownTitle || humanizeFormKey(formKey) || 'Untitled';\n const formTemplateId = str(form.formTemplateId);\n const id = formTemplateId || formKey;\n const previewUrl = str(form.previewUrl) || str(group.previewUrl) || undefined;\n const deployUrl = str(form.deployUrl) || str(group.deployUrl) || undefined;\n const cover =\n str(form.coverImageUrl) ||\n str(form.previewImageUrl) ||\n str(group.coverImageUrl) ||\n (isBaseTemplate && !deployUrl ? BASE_TEMPLATE_DEFAULT_COVER : undefined);\n const snapshotId =\n str(form.snapshotId) || str(form.sourceSnapshotId) || str(group.snapshotId) || undefined;\n const usesSupabase = boolTrue(form.usesSupabase) || boolTrue(group.usesSupabase);\n const stack = resolveCardStack(form, group, formKey, templateKey);\n const metadata = pickMetadata(workflowModel || {}, TEMPLATE_TARGET);\n\n raw.push({\n id,\n title,\n description: str(form.description) || 'Yantra starter template',\n cover,\n category: str(form.category) || undefined,\n templateName: stack,\n formTemplateId: formTemplateId || undefined,\n // Only the workflow model runs builds; the pack's own ids name its gallery.\n formExtensionId: workflowExtId || undefined,\n formId: workflowFormId || undefined,\n formFunctionId: workflowFnId || undefined,\n domain: workflowDomain || undefined,\n apiKey: workflowApiKey || undefined,\n metadata,\n chatPrompt: str(form.chatPrompt) || undefined,\n previewUrl,\n deployUrl,\n snapshotId,\n usesSupabase,\n skill: str(form.skill) || str(group.skill) || undefined,\n hasOwnTitle: Boolean(ownTitle),\n });\n }\n }\n }\n\n const bestByUrl = new Map<string, RankedCard>();\n for (const card of raw) {\n const key = previewUrlDedupeKey(card);\n const existing = bestByUrl.get(key);\n if (!existing || cardRichnessScore(card) > cardRichnessScore(existing)) {\n bestByUrl.set(key, card);\n }\n }\n\n return [...bestByUrl.values()]\n .map(({ hasOwnTitle: _h, ...card }) => card)\n .sort((a, b) => a.title.localeCompare(b.title));\n}\n\n/** Template cards from the two settings payloads (web `listCodeAssistantTemplatesViaGraphql`, minus the fetch). */\nexport function templatesFromSettings(uiLayoutSettings: unknown, appSettings: unknown): WebBuilderTemplate[] {\n const uiMap = extractFlatMap(uiLayoutSettings, true);\n const appMap = extractFlatMap(appSettings, false);\n return mapYantraFormCards(uiMap, resolveWorkflowModel(uiMap, appMap));\n}\n\n/**\n * The connector ids a build uses when no card is picked (web\n * `loadCodeAssistantWorkflowDefaults`, minus the fetch): the workflow model.\n * Null when the org has none, which means the build workflow is not set up and\n * the host builds through the agent chat instead. A card pack's own\n * formExtensionId is never a fallback (see {@link isCardPack}).\n */\nexport function workflowDefaultsFromSettings(\n uiLayoutSettings: unknown,\n appSettings: unknown,\n stack: string = DEFAULT_STACK_TEMPLATE,\n): WebBuilderTemplate | null {\n const uiMap = extractFlatMap(uiLayoutSettings, true);\n const appMap = extractFlatMap(appSettings, false);\n const workflowModel = resolveWorkflowModel(uiMap, appMap);\n const formExtensionId = workflowModel ? str(workflowModel.formExtensionId) : '';\n if (!workflowModel || !formExtensionId) return null;\n return {\n id: WORKFLOW_DEFAULTS_ID,\n title: 'Code Assistant',\n templateName: normalizeStackTemplate([stack]),\n formExtensionId,\n formId: str(workflowModel.formId) || undefined,\n formFunctionId: str(workflowModel.formFunctionId) || undefined,\n domain: str(workflowModel.formExtensionE2BDomain) || undefined,\n apiKey: str(workflowModel.formExtensionModelConfigAPIKey) || str(workflowModel.apiKey) || undefined,\n metadata: pickMetadata(workflowModel, TEMPLATE_TARGET),\n };\n}\n\n/**\n * `modelConfig` + `extensionInput` for a template (web\n * `buildWorkflowPayloadFromTemplate`, unchanged). Form ids come from the\n * workflow model, the stack from the card; templateTarget is always\n * `github-model`. The E2B API key and GitHub credentials are never forwarded:\n * the agent's vault owns those.\n */\nexport function buildWorkflowPayloadFromTemplate(\n template: WebBuilderTemplate | undefined,\n extras?: {\n modelId?: string;\n systemId?: string;\n skill?: string;\n skillActionId?: string;\n editProjectId?: string;\n defaultTemplate?: string;\n },\n): {\n modelConfig: Record<string, unknown>;\n extensionInput: Record<string, unknown>;\n templateName: string;\n} {\n const rawName = template?.templateName || extras?.defaultTemplate || DEFAULT_STACK_TEMPLATE;\n const templateName = normalizeStackTemplate([rawName]) || DEFAULT_STACK_TEMPLATE;\n const m = template?.metadata || {};\n const templateTarget = TEMPLATE_TARGET;\n\n const metadata: Record<string, string> = {\n ...(m.formExtensionE2BClaudeTemplateId\n ? { formExtensionE2BClaudeTemplateId: m.formExtensionE2BClaudeTemplateId }\n : {}),\n ...(m.formExtensionE2BDomain ? { formExtensionE2BDomain: m.formExtensionE2BDomain } : {}),\n ...(m.formExtensionE2BTemplateId ? { formExtensionE2BTemplateId: m.formExtensionE2BTemplateId } : {}),\n ...(m.formExtensionE2BViteReactTemplateId\n ? { formExtensionE2BViteReactTemplateId: m.formExtensionE2BViteReactTemplateId }\n : {}),\n ...(m.formExtensionE2BVueTemplateId ? { formExtensionE2BVueTemplateId: m.formExtensionE2BVueTemplateId } : {}),\n templateTarget,\n };\n // The turn's toolbox skill wins over the template/pack skill.\n const skill = extras?.skill || template?.skill;\n if (skill) metadata.skill = skill;\n if (extras?.skillActionId) metadata.skillActionId = extras.skillActionId;\n if (template?.formTemplateId) metadata.formTemplateId = template.formTemplateId;\n\n // `template` is the stack; `templateTarget` is the workflow route and never goes in `template`.\n const modelConfig: Record<string, unknown> = {\n template: templateName,\n templateTarget,\n domain: template?.domain || 'e2b.dev',\n ...(template?.apiKey ? { apiKey: template.apiKey } : {}),\n metadata,\n };\n if (extras?.modelId) {\n modelConfig.model = extras.modelId;\n // `yantra-router/medium` -> provider `yantra-router`.\n const slash = extras.modelId.indexOf('/');\n if (slash > 0) modelConfig.provider = extras.modelId.slice(0, slash);\n }\n if (extras?.systemId) {\n modelConfig.system = extras.systemId;\n modelConfig.designSystem = extras.systemId;\n modelConfig.systemId = extras.systemId;\n }\n if (skill) {\n modelConfig.skill = skill;\n modelConfig.skillId = skill;\n }\n if (extras?.skillActionId) modelConfig.skillActionId = extras.skillActionId;\n if (extras?.editProjectId) modelConfig.editProjectId = extras.editProjectId;\n\n const extensionInput: Record<string, unknown> = {\n ...(template?.formExtensionId ? { extensionId: template.formExtensionId } : {}),\n stepName: 'extractCodeFromExtension',\n formId: template?.formId || 'form-builder-proxy',\n functionId: template?.formFunctionId || 'create-channel-function',\n metadata,\n source: 'final-submission',\n };\n\n return { modelConfig, extensionInput, templateName };\n}\n\n/** A Mongo-style 24-hex id (8 hex seconds + 16 random hex), as the web mints channel/project ids. */\nexport function newObjectId(): string {\n const ts = Math.floor(Date.now() / 1000)\n .toString(16)\n .padStart(8, '0');\n let rand = '';\n for (let i = 0; i < 16; i++) rand += Math.floor(Math.random() * 16).toString(16);\n return ts + rand;\n}\n\nfunction decodeBase64(b64: string): string {\n if (typeof atob === 'function') return atob(b64);\n // jest/node without atob.\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n const { Buffer } = require('buffer') as { Buffer: { from(s: string, e: string): { toString(e: string): string } } };\n return Buffer.from(b64, 'base64').toString('binary');\n}\n\n/**\n * The token's `tenant` (or `tid`) claim, unverified. The connector runs the\n * trigger against this tenant. Unlike the web this also accepts base64url\n * segments (`-`/`_`, no padding), which the web's bare `atob` would reject.\n */\nexport function tenantIdFromToken(token: string | null | undefined): string | undefined {\n if (!token) return undefined;\n try {\n const seg = (token.split('.')[1] || '').replace(/-/g, '+').replace(/_/g, '/');\n const padded = seg + '='.repeat((4 - (seg.length % 4)) % 4);\n const payload = JSON.parse(decodeBase64(padded)) as { tenant?: string; tid?: string };\n return payload.tenant || payload.tid;\n } catch {\n return undefined;\n }\n}\n\n/** Stack names and the defaults row are not a picked catalog card (web `explicitTemplateId`). */\nconst NON_PICK_TEMPLATE_IDS = new Set([WORKFLOW_DEFAULTS_ID, 'bundled', 'vite-react', 'nextjs', 'vue', '']);\n\nfunction explicitTemplateId(template: { id?: string | null } | null | undefined): string | undefined {\n const id = String(template?.id ?? '').trim();\n if (NON_PICK_TEMPLATE_IDS.has(id)) return undefined;\n return id;\n}\n\nconst LOCAL_HOST_RE = /^https?:\\/\\/(localhost|127\\.0\\.0\\.1)([:/]|$)/i;\n\n/** Preview hosts are `3000-<sandboxId>.<domain>` (e2b's or the platform's); recover the id when only the URL is known. */\nfunction sandboxIdFromUrl(url: string | null | undefined): string | null {\n return url?.match(/^https?:\\/\\/3000-([^.]+)\\./)?.[1] || null;\n}\n\nexport type WebBuilderTurnMode = 'new' | 'remix' | 'edit';\n\nexport interface WebBuilderTriggerOptions {\n channelId: string;\n projectId: string;\n /** The user's prompt, posted as the turn's content. */\n text: string;\n /** The card the user picked; any picked card makes this a fresh remix build. */\n template?: WebBuilderTemplate;\n /** From {@link workflowDefaultsFromSettings}; supplies the connector ids a card lacks. */\n defaults: WebBuilderTemplate | null;\n mode: WebBuilderTurnMode;\n /** The build being edited (mode `edit`). */\n edit?: { sandboxId?: string | null; sandboxUrl?: string | null; title?: string | null };\n /** Stack of the build being edited, when known (web `lastSandbox.templateId`). */\n stackHint?: string;\n modelId?: string;\n /** Look-alike site, already normalized to https by the caller. */\n referenceUrl?: string;\n /** Uploaded files (https URLs, never base64). */\n attachments?: Array<{ name: string; url: string; mimeType?: string }>;\n /** Backend the app reads builds from; forwarded so the connector writes to the same one. */\n graphqlUrl?: string;\n token?: string;\n /** The agent runs on this machine, so a localhost graphqlUrl is reachable from it. */\n agentLocal?: boolean;\n}\n\n/**\n * The `WEBBUILDER_TRIGGER_WORKFLOW` params for one turn, mirroring the web send\n * path: the picked card is merged over the workflow defaults (the card's stack\n * and metadata win, the defaults fill missing connector ids), and the fragment\n * says how the sandbox boots:\n * - picked card with a snapshot -> `remix` from that snapshot;\n * - edit -> `edit`, reconnecting the existing sandbox (no snapshot);\n * - otherwise a blank boot of the stack template.\n *\n * Returns `not-configured` when no form extension id is known: the backend\n * would accept the channel but have nothing to dispatch, and the build would\n * hang until timeout, so the caller fails fast instead.\n *\n * Omitted from the web turn (not wired on native yet): referenceArtifact\n * (`mode: 'reference'` + prompt rewrite), design system / skill / skillActionId,\n * canvas hand edits, project knowledge, integrations, aiInApp, design\n * direction, GitHub sync, database, app secrets, plan, follow-up answers, the\n * VITE_WEBBUILDER_EXTENSION_ID dev fallback, and the 401 re-mint retry.\n */\nexport function buildTriggerParams(\n opts: WebBuilderTriggerOptions,\n): { ok: true; params: Record<string, unknown> } | { ok: false; reason: 'not-configured' } {\n const { channelId, projectId, defaults } = opts;\n // A picked card always means a fresh remix build on the web; it never rides on an edit.\n const pickedTemplate = opts.mode === 'edit' ? undefined : opts.template;\n const isNewFromTemplate = Boolean(pickedTemplate);\n const isEditTurn =\n !isNewFromTemplate && opts.mode === 'edit' && Boolean(opts.edit?.sandboxId || opts.edit?.sandboxUrl);\n\n const stackHint =\n pickedTemplate?.templateName || (isEditTurn ? opts.stackHint : undefined) || DEFAULT_STACK_TEMPLATE;\n\n let templateForPayload: WebBuilderTemplate | undefined;\n if (pickedTemplate) {\n templateForPayload = {\n ...pickedTemplate,\n formExtensionId: pickedTemplate.formExtensionId || defaults?.formExtensionId,\n formId: pickedTemplate.formId || defaults?.formId,\n formFunctionId: pickedTemplate.formFunctionId || defaults?.formFunctionId,\n domain: pickedTemplate.domain || defaults?.domain,\n apiKey: pickedTemplate.apiKey || defaults?.apiKey,\n metadata: { ...(defaults?.metadata || {}), ...(pickedTemplate.metadata || {}) },\n // The card's stack wins; never inherit the workflow model's (often nextjs).\n templateName: pickedTemplate.templateName || stackHint,\n };\n } else if (defaults) {\n templateForPayload = { ...defaults, templateName: stackHint || defaults.templateName };\n }\n\n const resolvedModelId = opts.modelId || DEFAULT_MODEL_ID;\n const { modelConfig, extensionInput, templateName } = buildWorkflowPayloadFromTemplate(templateForPayload, {\n modelId: resolvedModelId,\n defaultTemplate: stackHint,\n });\n if (!extensionInput.extensionId) return { ok: false, reason: 'not-configured' };\n\n const templateSnapshotId = pickedTemplate?.snapshotId?.trim() || '';\n const sandboxId = isEditTurn ? opts.edit?.sandboxId || sandboxIdFromUrl(opts.edit?.sandboxUrl) || null : null;\n // Saved on the turn's post: on the platform's sandbox domain when one is set.\n const sandboxUrl = isEditTurn\n ? withPublicSandboxHosts((opts.edit?.sandboxUrl?.trim() || '').split('?')[0], publicSandboxDomain()) || null\n : null;\n\n const remixFragment: Record<string, unknown> = {};\n if (pickedTemplate?.deployUrl) remixFragment.deployUrl = pickedTemplate.deployUrl;\n if (isNewFromTemplate && templateSnapshotId) {\n remixFragment.remix = true;\n remixFragment.mode = 'remix';\n remixFragment.snapshotId = templateSnapshotId;\n remixFragment.usesSupabase = pickedTemplate?.usesSupabase === true;\n } else if (isEditTurn && (sandboxId || sandboxUrl)) {\n // Server reconnect path: remix + sandboxId, no snapshotId.\n remixFragment.remix = true;\n remixFragment.mode = 'edit';\n if (sandboxId) remixFragment.sandboxId = sandboxId;\n if (sandboxUrl) remixFragment.sandboxUrl = sandboxUrl;\n if (opts.edit?.title) remixFragment.title = opts.edit.title;\n remixFragment.projectId = projectId;\n }\n\n const pickedTemplateId = explicitTemplateId(pickedTemplate);\n const referenceUrl = opts.referenceUrl?.trim();\n const attachments = opts.attachments?.filter((a) => a && a.url) ?? [];\n\n const createChannelInput = {\n channelId,\n title: 'AI Assistant',\n description: 'AI Assistant',\n displayName: 'AI Assistant',\n topic: 'AI Assistant',\n projectId,\n type: 'AIASSISTANT',\n postData: {\n type: 'AIASSISTANT',\n content: opts.text,\n props: {\n template: templateName,\n templateTarget: TEMPLATE_TARGET,\n projectId,\n role: 'USER',\n fragment: remixFragment,\n ...(sandboxId ? { sandboxId } : {}),\n ...(sandboxUrl ? { sandboxUrl } : {}),\n model: resolvedModelId,\n ...(attachments.length ? { attachments } : {}),\n // Only a card the user picked, never the defaults row or a stack name.\n ...(pickedTemplateId ? { templateId: pickedTemplateId } : {}),\n ...(referenceUrl ? { referenceUrl } : {}),\n },\n },\n additionalProperties: { modelConfig },\n };\n\n // Pin the connector to the same backend the app reads builds from. A\n // localhost URL rides along only when the agent is local too: a hosted\n // agent cannot reach a developer's machine.\n const authParams =\n opts.graphqlUrl && (opts.agentLocal || !LOCAL_HOST_RE.test(opts.graphqlUrl))\n ? { graphqlUrl: opts.graphqlUrl, accessToken: opts.token, tenantId: tenantIdFromToken(opts.token) }\n : {};\n\n return { ok: true, params: { createChannelInput, extensionInput, ...authParams } };\n}\n\n/**\n * The agent-only note a template pick sends with the person's words - the web's\n * `templateRemixForChat` (#384): template picks build through the agent chat\n * (webbuilder-design-pro \"Remix a template\"), not `WEBBUILDER_TRIGGER_WORKFLOW`, which\n * stalls when the workflow never posts back to the chat.\n */\nexport function templateRemixNote(template: Pick<WebBuilderTemplate, 'title' | 'snapshotId'>): string {\n const snapshot = template.snapshotId?.trim();\n const boot = snapshot\n ? `Boot it with WEBBUILDER_CREATE_SANDBOX {\"snapshotId\":\"${snapshot}\",\"builder\":\"vite\",\"timeoutMs\":3600000,\"private\":true}.`\n : `Find it with WEBBUILDER_LIST_TEMPLATES and boot it with that card's start.params.`;\n return [\n `[Template] The user picked the Yantra template \"${template.title}\" to start from - remix it (Remix a template).`,\n boot,\n 'They already chose this template: do not ask how to start. Ask only what you still need, then build and give the live preview link.',\n ].join(' ');\n}\n\n/** The skill the web Agent chat runs on (`chat/agentSkill.ts`): the whole website journey. */\nexport const WEBBUILDER_CHAT_SKILL = 'yantra-skills/webbuilder-design-pro';\n"],"names":["Buffer"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {searchDocs,buildSearchCommand,parseSearchOutput,codeEditSummary,isSavedCodeRead,openModeFor,parseListFilesResult,parseListFilesOutput,isSandboxUnavailableError,decideSave,buildListFilesCommand,READ_FILE_MAX_BYTES}from'../../features/webbuilder/codeFiles.js';var __defProp = Object.defineProperty;
1
+ import {UNREACHABLE_RETRY_DELAYS_MS,retryUnreachable,plainAgentError}from'./unreachableRetry.js';import {searchDocs,buildSearchCommand,parseSearchOutput,codeEditSummary,isSavedCodeRead,openModeFor,parseListFilesResult,parseListFilesOutput,isSandboxUnavailableError,decideSave,buildListFilesCommand,READ_FILE_MAX_BYTES}from'../../features/webbuilder/codeFiles.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -33,12 +33,15 @@ function stdoutOf(d) {
33
33
  }
34
34
  return "";
35
35
  }
36
- function createCodeWorkspace(call, onHandEdit) {
36
+ function createCodeWorkspace(call, onHandEdit, retryDelaysMs = UNREACHABLE_RETRY_DELAYS_MS) {
37
37
  const run = (action, params, timeoutMs) => call(action, params, timeoutMs).catch((err) => ({
38
38
  successful: false,
39
39
  data: void 0,
40
40
  error: err instanceof Error ? err.message : String(err)
41
+ })).then((r) => r.successful ? r : __spreadProps(__spreadValues({}, r), {
42
+ error: plainAgentError(r.error)
41
43
  }));
44
+ const list = (params) => retryUnreachable(() => run("WEBBUILDER_LIST_FILES", params, LIST_TIMEOUT_MS), retryDelaysMs);
42
45
  const listSaved = async (target) => {
43
46
  if (!target.savedSource) {
44
47
  return {
@@ -47,11 +50,11 @@ function createCodeWorkspace(call, onHandEdit) {
47
50
  error: "The site is asleep, so its files can't be read. Wake it to see them."
48
51
  };
49
52
  }
50
- const r = await run("WEBBUILDER_LIST_FILES", __spreadProps(__spreadValues({}, target.sandboxId ? {
53
+ const r = await list(__spreadProps(__spreadValues({}, target.sandboxId ? {
51
54
  sandbox_id: target.sandboxId
52
55
  } : {}), {
53
56
  fromRepo: target.savedSource
54
- }), LIST_TIMEOUT_MS);
57
+ }));
55
58
  const tree = r.successful ? parseListFilesResult(dataOf(r)) : null;
56
59
  return tree ? {
57
60
  ok: true,
@@ -64,11 +67,11 @@ function createCodeWorkspace(call, onHandEdit) {
64
67
  };
65
68
  const listFiles = async (target) => {
66
69
  if (!target.sandboxId) return listSaved(target);
67
- const listed = await run("WEBBUILDER_LIST_FILES", __spreadValues({
70
+ const listed = await list(__spreadValues({
68
71
  sandbox_id: target.sandboxId
69
72
  }, target.savedSource ? {
70
73
  fromRepo: target.savedSource
71
- } : {}), LIST_TIMEOUT_MS);
74
+ } : {}));
72
75
  const listedData = dataOf(listed);
73
76
  const listedTree = listed.successful ? parseListFilesResult(listedData) : null;
74
77
  if (listedTree) {
@@ -1 +1 @@
1
- {"version":3,"file":"codeWorkspaceApi.js","sources":["../../../src/screens/WebBuilderNative/codeWorkspaceApi.ts"],"sourcesContent":["/**\n * The Code view's sandbox calls (web `code/codeWorkspaceMachine` IO), over the site's\n * sandbox router (the guarded proxy, so the app never holds a sandbox key):\n *\n * - list: `WEBBUILDER_RUN_COMMAND` with the tree listing; when the sandbox is gone,\n * `WEBBUILDER_LIST_FILES` from the backup repo (read-only \"saved code\");\n * - read: `WEBBUILDER_READ_FILE` (live reads carry `fromRepo` too, so a gone sandbox\n * answers from the backup, which is then never saved against);\n * - save: read again, `decideSave`, then `WEBBUILDER_WRITE_FILES`; a file changed on\n * disk since it was opened comes back as a conflict (Overwrite or Reload);\n * - search: a capped `git grep`, else the files already open.\n * No React: the host hook binds it to the open site.\n */\nimport {\n READ_FILE_MAX_BYTES,\n buildListFilesCommand,\n buildSearchCommand,\n codeEditSummary,\n decideSave,\n isSandboxUnavailableError,\n isSavedCodeRead,\n openModeFor,\n parseListFilesOutput,\n parseListFilesResult,\n parseSearchOutput,\n searchDocs,\n type ContentSearchResult,\n type FileTree,\n type FromRepo,\n type OpenMode,\n} from '../../features/webbuilder/codeFiles';\nimport type { SandboxRun } from './webbuilderTransport';\n\nconst LIST_TIMEOUT_MS = 90_000;\nconst FILE_TIMEOUT_MS = 60_000;\n\n/** The connector's own output (its `data`, or `data.data`). */\nfunction dataOf(result: { data?: unknown } | null | undefined): Record<string, unknown> {\n const raw = result?.data;\n if (!raw || typeof raw !== 'object') return {};\n const rec = raw as Record<string, unknown>;\n return rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? (rec.data as Record<string, unknown>)\n : rec;\n}\n\n/** A command's printed output, wherever this connector version put it. */\nfunction stdoutOf(d: Record<string, unknown>): string {\n const nested = [d, d.data, d.result, d.output].filter(\n (v): v is Record<string, unknown> => Boolean(v) && typeof v === 'object',\n );\n for (const rec of nested) {\n if (typeof rec.stdout === 'string') return rec.stdout;\n if (typeof rec.output === 'string') return rec.output;\n }\n return '';\n}\n\nexport interface CodeTarget {\n sandboxId: string | null;\n /** The backup repo to read when the sandbox is gone; null when none is known. */\n savedSource: FromRepo | null;\n}\n\nexport interface TreeResult {\n ok: boolean;\n tree?: FileTree;\n /** Read from the backup repo: the whole view is read-only. */\n saved?: boolean;\n /** The sandbox is asleep or gone and there is no saved code: waking it brings the files. */\n asleep?: boolean;\n error?: string;\n}\n\nexport interface ReadResult {\n ok: boolean;\n content?: string;\n mode?: OpenMode;\n saved?: boolean;\n error?: string;\n}\n\nexport interface SaveResult {\n ok: boolean;\n /** The file changed on disk since it was opened: this is what is there now. */\n conflict?: boolean;\n disk?: string;\n /** Nothing to write (no change, or the disk already holds the draft). */\n unchanged?: boolean;\n summary?: string;\n error?: string;\n}\n\nexport function createCodeWorkspace(call: SandboxRun, onHandEdit: (edit: { file: string; summary: string }) => void) {\n const run = (action: string, params: Record<string, unknown>, timeoutMs: number) =>\n call(action, params, timeoutMs).catch((err: unknown) => ({\n successful: false,\n data: undefined as unknown,\n error: err instanceof Error ? err.message : String(err),\n }));\n\n const listSaved = async (target: CodeTarget): Promise<TreeResult> => {\n if (!target.savedSource) {\n return {\n ok: false,\n asleep: true,\n error: \"The site is asleep, so its files can't be read. Wake it to see them.\",\n };\n }\n const r = await run(\n 'WEBBUILDER_LIST_FILES',\n { ...(target.sandboxId ? { sandbox_id: target.sandboxId } : {}), fromRepo: target.savedSource },\n LIST_TIMEOUT_MS,\n );\n const tree = r.successful ? parseListFilesResult(dataOf(r)) : null;\n return tree\n ? { ok: true, tree, saved: true }\n : { ok: false, error: \"Couldn't load the saved code. Wake the site to see its files.\" };\n };\n\n const listFiles = async (target: CodeTarget): Promise<TreeResult> => {\n if (!target.sandboxId) return listSaved(target);\n // The project proxy's own listing: from the live sandbox, or - carrying `fromRepo` -\n // from the backup repo when the sandbox is gone (`source: 'repo'`, read-only).\n const listed = await run(\n 'WEBBUILDER_LIST_FILES',\n { sandbox_id: target.sandboxId, ...(target.savedSource ? { fromRepo: target.savedSource } : {}) },\n LIST_TIMEOUT_MS,\n );\n const listedData = dataOf(listed);\n const listedTree = listed.successful ? parseListFilesResult(listedData) : null;\n if (listedTree) {\n const fromRepo = listedData.source === 'repo' || isSavedCodeRead(listedData);\n return { ok: true, tree: listedTree, saved: fromRepo };\n }\n // An older connector without LIST_FILES on a live sandbox: the shell listing.\n const r = await run(\n 'WEBBUILDER_RUN_COMMAND',\n { sandbox_id: target.sandboxId, command: buildListFilesCommand() },\n LIST_TIMEOUT_MS,\n );\n const d = dataOf(r);\n const tree = r.successful ? parseListFilesOutput(stdoutOf(d), { truncated: d.truncated === true }) : null;\n if (tree) return { ok: true, tree, saved: false };\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[WebBuilderNative] code list', {\n sandboxId: target.sandboxId,\n listFiles: { error: listed.error, data: listedData },\n runCommand: { error: r.error, data: d },\n });\n }\n // Only a failed call's own error says the sandbox is gone (web `loadFileTree`); the\n // command's output is not read for it (its numbers and logs matched \"502\" / \"timed out\").\n if (!r.successful && (isSandboxUnavailableError(r.error) || isSandboxUnavailableError(listed.error))) {\n return listSaved(target);\n }\n if (r.successful) {\n const stderr = typeof d.stderr === 'string' ? d.stderr.trim().split('\\n')[0] : '';\n return { ok: false, error: `Couldn't read the file list${stderr ? `: ${stderr.slice(0, 160)}` : '.'}` };\n }\n return { ok: false, error: r.error || 'Could not list the project files.' };\n };\n\n const readFile = async (target: CodeTarget, path: string, saved: boolean): Promise<ReadResult> => {\n const params = {\n ...(target.sandboxId ? { sandbox_id: target.sandboxId } : {}),\n path,\n maxBytes: READ_FILE_MAX_BYTES,\n ...(target.savedSource ? { fromRepo: target.savedSource } : {}),\n };\n const r = await run('WEBBUILDER_READ_FILE', params, FILE_TIMEOUT_MS);\n if (!r.successful) return { ok: false, error: r.error || 'Could not read the file.' };\n const d = dataOf(r);\n const fromBackup = saved || isSavedCodeRead(d);\n return {\n ok: true,\n content: typeof d.content === 'string' ? d.content : undefined,\n mode: openModeFor(path, d),\n saved: fromBackup,\n };\n };\n\n /** Save `draft` over `base` (what was opened); `force` overwrites a file changed meanwhile. */\n const saveFile = async (\n target: CodeTarget,\n path: string,\n base: string,\n draft: string,\n force = false,\n ): Promise<SaveResult> => {\n if (!target.sandboxId) return { ok: false, error: 'Wake the site to save changes.' };\n if (!force) {\n const now = await readFile(target, path, false);\n if (now.ok && now.saved) return { ok: false, error: 'The site is asleep. Wake it to save changes.' };\n const disk = now.ok ? (now.content ?? null) : null;\n const decision = decideSave(base, disk, draft);\n if (decision === 'unchanged') return { ok: true, unchanged: true };\n if (decision === 'conflict') return { ok: false, conflict: true, disk: disk ?? '' };\n }\n const r = await run(\n 'WEBBUILDER_WRITE_FILES',\n { sandbox_id: target.sandboxId, files: [{ path, content: draft }] },\n FILE_TIMEOUT_MS,\n );\n if (!r.successful) return { ok: false, error: r.error || 'Could not save the file.' };\n const summary = codeEditSummary(base, draft);\n onHandEdit({ file: path, summary });\n return { ok: true, summary };\n };\n\n /** Project-wide search on a live sandbox, else the files already open (`openDocs`). */\n const search = async (\n target: CodeTarget,\n query: string,\n live: boolean,\n openDocs: Record<string, string>,\n ): Promise<{ result: ContentSearchResult; source: 'project' | 'open-files' }> => {\n const inMemory = () => ({ result: searchDocs(openDocs, query), source: 'open-files' as const });\n if (!live || !target.sandboxId) return inMemory();\n let command: string;\n try {\n command = buildSearchCommand(query);\n } catch {\n return inMemory();\n }\n const r = await run('WEBBUILDER_RUN_COMMAND', { sandbox_id: target.sandboxId, command }, LIST_TIMEOUT_MS);\n const d = dataOf(r);\n const parsed = r.successful\n ? parseSearchOutput(stdoutOf(d), query, {\n truncated: d.truncated === true,\n })\n : null;\n return parsed ? { result: parsed, source: 'project' } : inMemory();\n };\n\n return { listFiles, readFile, saveFile, search };\n}\n\nexport type CodeWorkspace = ReturnType<typeof createCodeWorkspace>;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codeWorkspaceApi.js","sources":["../../../src/screens/WebBuilderNative/codeWorkspaceApi.ts"],"sourcesContent":["/**\n * The Code view's sandbox calls (web `code/codeWorkspaceMachine` IO), over the site's\n * sandbox router (the guarded proxy, so the app never holds a sandbox key):\n *\n * - list: `WEBBUILDER_RUN_COMMAND` with the tree listing; when the sandbox is gone,\n * `WEBBUILDER_LIST_FILES` from the backup repo (read-only \"saved code\");\n * - read: `WEBBUILDER_READ_FILE` (live reads carry `fromRepo` too, so a gone sandbox\n * answers from the backup, which is then never saved against);\n * - save: read again, `decideSave`, then `WEBBUILDER_WRITE_FILES`; a file changed on\n * disk since it was opened comes back as a conflict (Overwrite or Reload);\n * - search: a capped `git grep`, else the files already open.\n * No React: the host hook binds it to the open site.\n */\nimport { plainAgentError, retryUnreachable, UNREACHABLE_RETRY_DELAYS_MS } from './unreachableRetry';\nimport {\n READ_FILE_MAX_BYTES,\n buildListFilesCommand,\n buildSearchCommand,\n codeEditSummary,\n decideSave,\n isSandboxUnavailableError,\n isSavedCodeRead,\n openModeFor,\n parseListFilesOutput,\n parseListFilesResult,\n parseSearchOutput,\n searchDocs,\n type ContentSearchResult,\n type FileTree,\n type FromRepo,\n type OpenMode,\n} from '../../features/webbuilder/codeFiles';\nimport type { SandboxRun } from './webbuilderTransport';\n\nconst LIST_TIMEOUT_MS = 90_000;\nconst FILE_TIMEOUT_MS = 60_000;\n\n/** The connector's own output (its `data`, or `data.data`). */\nfunction dataOf(result: { data?: unknown } | null | undefined): Record<string, unknown> {\n const raw = result?.data;\n if (!raw || typeof raw !== 'object') return {};\n const rec = raw as Record<string, unknown>;\n return rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? (rec.data as Record<string, unknown>)\n : rec;\n}\n\n/** A command's printed output, wherever this connector version put it. */\nfunction stdoutOf(d: Record<string, unknown>): string {\n const nested = [d, d.data, d.result, d.output].filter(\n (v): v is Record<string, unknown> => Boolean(v) && typeof v === 'object',\n );\n for (const rec of nested) {\n if (typeof rec.stdout === 'string') return rec.stdout;\n if (typeof rec.output === 'string') return rec.output;\n }\n return '';\n}\n\nexport interface CodeTarget {\n sandboxId: string | null;\n /** The backup repo to read when the sandbox is gone; null when none is known. */\n savedSource: FromRepo | null;\n}\n\nexport interface TreeResult {\n ok: boolean;\n tree?: FileTree;\n /** Read from the backup repo: the whole view is read-only. */\n saved?: boolean;\n /** The sandbox is asleep or gone and there is no saved code: waking it brings the files. */\n asleep?: boolean;\n error?: string;\n}\n\nexport interface ReadResult {\n ok: boolean;\n content?: string;\n mode?: OpenMode;\n saved?: boolean;\n error?: string;\n}\n\nexport interface SaveResult {\n ok: boolean;\n /** The file changed on disk since it was opened: this is what is there now. */\n conflict?: boolean;\n disk?: string;\n /** Nothing to write (no change, or the disk already holds the draft). */\n unchanged?: boolean;\n summary?: string;\n error?: string;\n}\n\nexport function createCodeWorkspace(\n call: SandboxRun,\n onHandEdit: (edit: { file: string; summary: string }) => void,\n /** Waits before re-sending a listing that never reached the agent (tests pass `[]`). */\n retryDelaysMs: readonly number[] = UNREACHABLE_RETRY_DELAYS_MS,\n) {\n const run = (action: string, params: Record<string, unknown>, timeoutMs: number) =>\n call(action, params, timeoutMs)\n .catch((err: unknown) => ({\n successful: false,\n data: undefined as unknown,\n error: err instanceof Error ? err.message : String(err),\n }))\n .then((r) => (r.successful ? r : { ...r, error: plainAgentError(r.error) }));\n // The first read on a fresh build can find the agent restarting: sent again shortly (web #920f0bba).\n const list = (params: Record<string, unknown>) =>\n retryUnreachable(() => run('WEBBUILDER_LIST_FILES', params, LIST_TIMEOUT_MS), retryDelaysMs);\n\n const listSaved = async (target: CodeTarget): Promise<TreeResult> => {\n if (!target.savedSource) {\n return {\n ok: false,\n asleep: true,\n error: \"The site is asleep, so its files can't be read. Wake it to see them.\",\n };\n }\n const r = await list({\n ...(target.sandboxId ? { sandbox_id: target.sandboxId } : {}),\n fromRepo: target.savedSource,\n });\n const tree = r.successful ? parseListFilesResult(dataOf(r)) : null;\n return tree\n ? { ok: true, tree, saved: true }\n : { ok: false, error: \"Couldn't load the saved code. Wake the site to see its files.\" };\n };\n\n const listFiles = async (target: CodeTarget): Promise<TreeResult> => {\n if (!target.sandboxId) return listSaved(target);\n // The project proxy's own listing: from the live sandbox, or - carrying `fromRepo` -\n // from the backup repo when the sandbox is gone (`source: 'repo'`, read-only).\n const listed = await list({\n sandbox_id: target.sandboxId,\n ...(target.savedSource ? { fromRepo: target.savedSource } : {}),\n });\n const listedData = dataOf(listed);\n const listedTree = listed.successful ? parseListFilesResult(listedData) : null;\n if (listedTree) {\n const fromRepo = listedData.source === 'repo' || isSavedCodeRead(listedData);\n return { ok: true, tree: listedTree, saved: fromRepo };\n }\n // An older connector without LIST_FILES on a live sandbox: the shell listing.\n const r = await run(\n 'WEBBUILDER_RUN_COMMAND',\n { sandbox_id: target.sandboxId, command: buildListFilesCommand() },\n LIST_TIMEOUT_MS,\n );\n const d = dataOf(r);\n const tree = r.successful ? parseListFilesOutput(stdoutOf(d), { truncated: d.truncated === true }) : null;\n if (tree) return { ok: true, tree, saved: false };\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[WebBuilderNative] code list', {\n sandboxId: target.sandboxId,\n listFiles: { error: listed.error, data: listedData },\n runCommand: { error: r.error, data: d },\n });\n }\n // Only a failed call's own error says the sandbox is gone (web `loadFileTree`); the\n // command's output is not read for it (its numbers and logs matched \"502\" / \"timed out\").\n if (!r.successful && (isSandboxUnavailableError(r.error) || isSandboxUnavailableError(listed.error))) {\n return listSaved(target);\n }\n if (r.successful) {\n const stderr = typeof d.stderr === 'string' ? d.stderr.trim().split('\\n')[0] : '';\n return { ok: false, error: `Couldn't read the file list${stderr ? `: ${stderr.slice(0, 160)}` : '.'}` };\n }\n return { ok: false, error: r.error || 'Could not list the project files.' };\n };\n\n const readFile = async (target: CodeTarget, path: string, saved: boolean): Promise<ReadResult> => {\n const params = {\n ...(target.sandboxId ? { sandbox_id: target.sandboxId } : {}),\n path,\n maxBytes: READ_FILE_MAX_BYTES,\n ...(target.savedSource ? { fromRepo: target.savedSource } : {}),\n };\n const r = await run('WEBBUILDER_READ_FILE', params, FILE_TIMEOUT_MS);\n if (!r.successful) return { ok: false, error: r.error || 'Could not read the file.' };\n const d = dataOf(r);\n const fromBackup = saved || isSavedCodeRead(d);\n return {\n ok: true,\n content: typeof d.content === 'string' ? d.content : undefined,\n mode: openModeFor(path, d),\n saved: fromBackup,\n };\n };\n\n /** Save `draft` over `base` (what was opened); `force` overwrites a file changed meanwhile. */\n const saveFile = async (\n target: CodeTarget,\n path: string,\n base: string,\n draft: string,\n force = false,\n ): Promise<SaveResult> => {\n if (!target.sandboxId) return { ok: false, error: 'Wake the site to save changes.' };\n if (!force) {\n const now = await readFile(target, path, false);\n if (now.ok && now.saved) return { ok: false, error: 'The site is asleep. Wake it to save changes.' };\n const disk = now.ok ? (now.content ?? null) : null;\n const decision = decideSave(base, disk, draft);\n if (decision === 'unchanged') return { ok: true, unchanged: true };\n if (decision === 'conflict') return { ok: false, conflict: true, disk: disk ?? '' };\n }\n const r = await run(\n 'WEBBUILDER_WRITE_FILES',\n { sandbox_id: target.sandboxId, files: [{ path, content: draft }] },\n FILE_TIMEOUT_MS,\n );\n if (!r.successful) return { ok: false, error: r.error || 'Could not save the file.' };\n const summary = codeEditSummary(base, draft);\n onHandEdit({ file: path, summary });\n return { ok: true, summary };\n };\n\n /** Project-wide search on a live sandbox, else the files already open (`openDocs`). */\n const search = async (\n target: CodeTarget,\n query: string,\n live: boolean,\n openDocs: Record<string, string>,\n ): Promise<{ result: ContentSearchResult; source: 'project' | 'open-files' }> => {\n const inMemory = () => ({ result: searchDocs(openDocs, query), source: 'open-files' as const });\n if (!live || !target.sandboxId) return inMemory();\n let command: string;\n try {\n command = buildSearchCommand(query);\n } catch {\n return inMemory();\n }\n const r = await run('WEBBUILDER_RUN_COMMAND', { sandbox_id: target.sandboxId, command }, LIST_TIMEOUT_MS);\n const d = dataOf(r);\n const parsed = r.successful\n ? parseSearchOutput(stdoutOf(d), query, {\n truncated: d.truncated === true,\n })\n : null;\n return parsed ? { result: parsed, source: 'project' } : inMemory();\n };\n\n return { listFiles, readFile, saveFile, search };\n}\n\nexport type CodeWorkspace = ReturnType<typeof createCodeWorkspace>;\n"],"names":[],"mappings":"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"}
@@ -73,7 +73,7 @@ function WebBuilderNativeScreen() {
73
73
  /* @__PURE__ */ jsx(Text, { style: [styles.detail, isDark && styles.textMuted], children: "This build does not carry the federation host runtime." })
74
74
  ] }) });
75
75
  }
76
- return /* @__PURE__ */ jsx(SafeAreaView, { style: [styles.fill, isDark && styles.fillDark], edges: ["left", "right"], children: /* @__PURE__ */ jsx(Experience, { isDark, onExit, projects: host.projects, projectsLoading: host.projectsLoading, projectsError: host.projectsError, onRefreshProjects: host.refreshProjects, projectsHasMore: host.projectsHasMore, onLoadMoreProjects: host.loadMoreProjects, templates: host.templates, templatesLoading: host.templatesLoading, templatesError: host.templatesError, onReloadTemplates: host.reloadTemplates, startBlocked: host.startBlocked, startNotice: host.startNotice, activeChannelId: host.activeChannelId, onOpenProject: host.openProject, onCloseProject: host.closeProject, onStartProject: host.startProject, builds: host.builds, buildsLoading: host.buildsLoading, building: host.building, publishing: host.publishing, hostChat: host.hostChat, onPublish: host.publish, onResumePreview: host.resumePreview, onUndo: host.undo, onRedo: host.redo, onDownloadCode: host.downloadCode, code: host.code, onOpenCodezen, initialAgentSeed: seed }) });
76
+ return /* @__PURE__ */ jsx(SafeAreaView, { style: [styles.fill, isDark && styles.fillDark], edges: ["left", "right"], children: /* @__PURE__ */ jsx(Experience, { isDark, onExit, projects: host.projects, projectsLoading: host.projectsLoading, projectsError: host.projectsError, onRefreshProjects: host.refreshProjects, projectsHasMore: host.projectsHasMore, onLoadMoreProjects: host.loadMoreProjects, templates: host.templates, templatesLoading: host.templatesLoading, templatesError: host.templatesError, onReloadTemplates: host.reloadTemplates, startBlocked: host.startBlocked, startNotice: host.startNotice, activeChannelId: host.activeChannelId, onOpenProject: host.openProject, onCloseProject: host.closeProject, onStartProject: host.startProject, builds: host.builds, buildsLoading: host.buildsLoading, building: host.building, publishing: host.publishing, hostChat: host.hostChat, onPublish: host.publish, onResumePreview: host.resumePreview, onRestorePreview: host.restorePreview, goneSandboxIds: host.goneSandboxIds, onUndo: host.undo, onRedo: host.redo, onDownloadCode: host.downloadCode, publishTools: host.publishTools, projectTools: host.projectTools, code: host.code, onOpenCodezen, initialAgentSeed: seed }) });
77
77
  }
78
78
  const styles = StyleSheet.create({
79
79
  fill: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/screens/WebBuilderNative/index.tsx"],"sourcesContent":["/**\n * Native Web Builder screen - host route for the federated web builder experience.\n *\n * Same delivery contract as Expenses / Movies / Study: the App registers the\n * federated component; this screen reads the registry and hands over what\n * needs the app's data stack - the builds, the templates, the build workflow\n * (the web surface's connector lane), the publish mutation - plus\n * navigation for leaving. A brain-routed hand-off arrives as\n * `initialAgentQuery` and starts a new site with it; a task in the Tasks sheet\n * arrives as `openChannelId` and opens that site. Web Builder draws its own\n * header, so the stack header stays hidden.\n *\n * Not to be confused with `screens/WebBuilder`: that is the shared WebView\n * surface shell (historical name), which still opens the web Web Builder.\n */\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport {\n useNavigation,\n useRoute,\n type NavigationProp,\n type ParamListBase,\n type RouteProp,\n} from '@react-navigation/native';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { getNativeWebBuilderExperience } from '../../features/webbuilder/nativeWebBuilderRegistry';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { useWebBuilderHost } from './useWebBuilderHost';\nimport { config } from '../../config/env-config';\nimport { MOBILE_APP_CATALOG } from '../../features/apps/mobileAppCatalog';\nimport { resolveSurfaceUrl } from '../../features/apps/resolveSurfaceUrl';\nimport { CODEZEN_DEV_URL } from '../../features/webbuilder/codezenHandoff';\n\n/** What the launcher and the chat hand-offs may pass. */\ntype WebBuilderRouteParams = {\n orgName?: string | null;\n initialAgentQuery?: string;\n /** Photos or files the ask was typed with; they go to the agent with it. */\n initialAgentAttachments?: MessageAttachment[];\n /** A site to open (its chat), e.g. from its build's task in the Tasks sheet. */\n openChannelId?: string;\n hideNavigationHeader?: boolean;\n};\n\nexport default function WebBuilderNativeScreen() {\n // The in-app light/dark choice (the drawer's Appearance), not only the device setting.\n const { isDark } = useAppTheme();\n const navigation = useNavigation<NavigationProp<ParamListBase>>();\n const route = useRoute<RouteProp<Record<string, WebBuilderRouteParams | undefined>, string>>();\n const routeOrg = typeof route.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const Experience = getNativeWebBuilderExperience();\n const host = useWebBuilderHost(routeOrg || undefined);\n\n useLayoutEffect(() => {\n if (!route.params?.hideNavigationHeader) navigation.setParams({ hideNavigationHeader: true });\n }, [navigation, route.params?.hideNavigationHeader]);\n\n const seed = useMemo(() => {\n const query = typeof route.params?.initialAgentQuery === 'string' ? route.params.initialAgentQuery.trim() : '';\n const files = Array.isArray(route.params?.initialAgentAttachments)\n ? route.params.initialAgentAttachments\n : undefined;\n if (!query && !files?.length) return null;\n return { text: query, files };\n }, [route.params?.initialAgentQuery, route.params?.initialAgentAttachments]);\n\n // Opened once per hand-off: the param is cleared, so the same task can open it again later.\n const openChannelId = typeof route.params?.openChannelId === 'string' ? route.params.openChannelId.trim() : '';\n const { openProject } = host;\n useEffect(() => {\n if (!openChannelId) return;\n openProject(openChannelId);\n navigation.setParams({ openChannelId: undefined });\n }, [openChannelId, openProject, navigation]);\n\n const onExit = useCallback(() => {\n if (navigation.canGoBack?.()) navigation.goBack();\n else navigation.navigate('MainStack.Layout.Home');\n }, [navigation]);\n\n // \"Demo video\" (web 0.5.0): the Codezen surface, in the app's surface shell, with the handoff fragment.\n const onOpenCodezen = useCallback(\n (fragment: string) => {\n const tile = MOBILE_APP_CATALOG.find((app) => app.key === 'codezen');\n const base = (tile && resolveSurfaceUrl(tile, config)) || CODEZEN_DEV_URL;\n navigation.navigate('MainStack.WebBuilder', {\n url: `${base.split('#')[0]}#${fragment}`,\n appTitle: tile?.label ?? 'Codezen',\n ...(routeOrg ? { orgName: routeOrg } : {}),\n });\n },\n [navigation, routeOrg],\n );\n\n if (!Experience) {\n return (\n <SafeAreaView style={[styles.fill, isDark && styles.fillDark]}>\n <View style={styles.center}>\n <Text style={[styles.title, isDark && styles.textLight]}>Native web builder unavailable</Text>\n <Text style={[styles.detail, isDark && styles.textMuted]}>\n This build does not carry the federation host runtime.\n </Text>\n </View>\n </SafeAreaView>\n );\n }\n\n return (\n <SafeAreaView style={[styles.fill, isDark && styles.fillDark]} edges={['left', 'right']}>\n <Experience\n isDark={isDark}\n onExit={onExit}\n projects={host.projects}\n projectsLoading={host.projectsLoading}\n projectsError={host.projectsError}\n onRefreshProjects={host.refreshProjects}\n projectsHasMore={host.projectsHasMore}\n onLoadMoreProjects={host.loadMoreProjects}\n templates={host.templates}\n templatesLoading={host.templatesLoading}\n templatesError={host.templatesError}\n onReloadTemplates={host.reloadTemplates}\n startBlocked={host.startBlocked}\n startNotice={host.startNotice}\n activeChannelId={host.activeChannelId}\n onOpenProject={host.openProject}\n onCloseProject={host.closeProject}\n onStartProject={host.startProject}\n builds={host.builds}\n buildsLoading={host.buildsLoading}\n building={host.building}\n publishing={host.publishing}\n hostChat={host.hostChat}\n onPublish={host.publish}\n onResumePreview={host.resumePreview}\n onUndo={host.undo}\n onRedo={host.redo}\n onDownloadCode={host.downloadCode}\n code={host.code}\n onOpenCodezen={onOpenCodezen}\n initialAgentSeed={seed}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, backgroundColor: '#f5f6f8' },\n fillDark: { backgroundColor: '#0c0e14' },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: 24 },\n title: { fontSize: 15, fontWeight: '600', color: '#111827', marginBottom: 6 },\n detail: { fontSize: 13, color: '#5d6575', textAlign: 'center' },\n textLight: { color: '#eceff6' },\n textMuted: { color: '#9ca4b6' },\n});\n"],"names":["_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/screens/WebBuilderNative/index.tsx"],"sourcesContent":["/**\n * Native Web Builder screen - host route for the federated web builder experience.\n *\n * Same delivery contract as Expenses / Movies / Study: the App registers the\n * federated component; this screen reads the registry and hands over what\n * needs the app's data stack - the builds, the templates, the build workflow\n * (the web surface's connector lane), the publish mutation - plus\n * navigation for leaving. A brain-routed hand-off arrives as\n * `initialAgentQuery` and starts a new site with it; a task in the Tasks sheet\n * arrives as `openChannelId` and opens that site. Web Builder draws its own\n * header, so the stack header stays hidden.\n *\n * Not to be confused with `screens/WebBuilder`: that is the shared WebView\n * surface shell (historical name), which still opens the web Web Builder.\n */\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport {\n useNavigation,\n useRoute,\n type NavigationProp,\n type ParamListBase,\n type RouteProp,\n} from '@react-navigation/native';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { getNativeWebBuilderExperience } from '../../features/webbuilder/nativeWebBuilderRegistry';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { useWebBuilderHost } from './useWebBuilderHost';\nimport { config } from '../../config/env-config';\nimport { MOBILE_APP_CATALOG } from '../../features/apps/mobileAppCatalog';\nimport { resolveSurfaceUrl } from '../../features/apps/resolveSurfaceUrl';\nimport { CODEZEN_DEV_URL } from '../../features/webbuilder/codezenHandoff';\n\n/** What the launcher and the chat hand-offs may pass. */\ntype WebBuilderRouteParams = {\n orgName?: string | null;\n initialAgentQuery?: string;\n /** Photos or files the ask was typed with; they go to the agent with it. */\n initialAgentAttachments?: MessageAttachment[];\n /** A site to open (its chat), e.g. from its build's task in the Tasks sheet. */\n openChannelId?: string;\n hideNavigationHeader?: boolean;\n};\n\nexport default function WebBuilderNativeScreen() {\n // The in-app light/dark choice (the drawer's Appearance), not only the device setting.\n const { isDark } = useAppTheme();\n const navigation = useNavigation<NavigationProp<ParamListBase>>();\n const route = useRoute<RouteProp<Record<string, WebBuilderRouteParams | undefined>, string>>();\n const routeOrg = typeof route.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const Experience = getNativeWebBuilderExperience();\n const host = useWebBuilderHost(routeOrg || undefined);\n\n useLayoutEffect(() => {\n if (!route.params?.hideNavigationHeader) navigation.setParams({ hideNavigationHeader: true });\n }, [navigation, route.params?.hideNavigationHeader]);\n\n const seed = useMemo(() => {\n const query = typeof route.params?.initialAgentQuery === 'string' ? route.params.initialAgentQuery.trim() : '';\n const files = Array.isArray(route.params?.initialAgentAttachments)\n ? route.params.initialAgentAttachments\n : undefined;\n if (!query && !files?.length) return null;\n return { text: query, files };\n }, [route.params?.initialAgentQuery, route.params?.initialAgentAttachments]);\n\n // Opened once per hand-off: the param is cleared, so the same task can open it again later.\n const openChannelId = typeof route.params?.openChannelId === 'string' ? route.params.openChannelId.trim() : '';\n const { openProject } = host;\n useEffect(() => {\n if (!openChannelId) return;\n openProject(openChannelId);\n navigation.setParams({ openChannelId: undefined });\n }, [openChannelId, openProject, navigation]);\n\n const onExit = useCallback(() => {\n if (navigation.canGoBack?.()) navigation.goBack();\n else navigation.navigate('MainStack.Layout.Home');\n }, [navigation]);\n\n // \"Demo video\" (web 0.5.0): the Codezen surface, in the app's surface shell, with the handoff fragment.\n const onOpenCodezen = useCallback(\n (fragment: string) => {\n const tile = MOBILE_APP_CATALOG.find((app) => app.key === 'codezen');\n const base = (tile && resolveSurfaceUrl(tile, config)) || CODEZEN_DEV_URL;\n navigation.navigate('MainStack.WebBuilder', {\n url: `${base.split('#')[0]}#${fragment}`,\n appTitle: tile?.label ?? 'Codezen',\n ...(routeOrg ? { orgName: routeOrg } : {}),\n });\n },\n [navigation, routeOrg],\n );\n\n if (!Experience) {\n return (\n <SafeAreaView style={[styles.fill, isDark && styles.fillDark]}>\n <View style={styles.center}>\n <Text style={[styles.title, isDark && styles.textLight]}>Native web builder unavailable</Text>\n <Text style={[styles.detail, isDark && styles.textMuted]}>\n This build does not carry the federation host runtime.\n </Text>\n </View>\n </SafeAreaView>\n );\n }\n\n return (\n <SafeAreaView style={[styles.fill, isDark && styles.fillDark]} edges={['left', 'right']}>\n <Experience\n isDark={isDark}\n onExit={onExit}\n projects={host.projects}\n projectsLoading={host.projectsLoading}\n projectsError={host.projectsError}\n onRefreshProjects={host.refreshProjects}\n projectsHasMore={host.projectsHasMore}\n onLoadMoreProjects={host.loadMoreProjects}\n templates={host.templates}\n templatesLoading={host.templatesLoading}\n templatesError={host.templatesError}\n onReloadTemplates={host.reloadTemplates}\n startBlocked={host.startBlocked}\n startNotice={host.startNotice}\n activeChannelId={host.activeChannelId}\n onOpenProject={host.openProject}\n onCloseProject={host.closeProject}\n onStartProject={host.startProject}\n builds={host.builds}\n buildsLoading={host.buildsLoading}\n building={host.building}\n publishing={host.publishing}\n hostChat={host.hostChat}\n onPublish={host.publish}\n onResumePreview={host.resumePreview}\n onRestorePreview={host.restorePreview}\n goneSandboxIds={host.goneSandboxIds}\n onUndo={host.undo}\n onRedo={host.redo}\n onDownloadCode={host.downloadCode}\n publishTools={host.publishTools}\n projectTools={host.projectTools}\n code={host.code}\n onOpenCodezen={onOpenCodezen}\n initialAgentSeed={seed}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, backgroundColor: '#f5f6f8' },\n fillDark: { backgroundColor: '#0c0e14' },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: 24 },\n title: { fontSize: 15, fontWeight: '600', color: '#111827', marginBottom: 6 },\n detail: { fontSize: 13, color: '#5d6575', textAlign: 'center' },\n textLight: { color: '#eceff6' },\n textMuted: { color: '#9ca4b6' },\n});\n"],"names":["_a","_b"],"mappings":"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"}
@@ -1,5 +1,22 @@
1
1
  var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
2
7
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
3
20
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
21
  const KEEPALIVE_INTERVAL_MS = 10 * 6e4;
5
22
  const KEEPALIVE_IDLE_MS = 15 * 6e4;
@@ -16,14 +33,47 @@ function keepAliveDecision(i) {
16
33
  function isUnsupportedActionError(message) {
17
34
  return /unknown (webbuilder |sandbox )?action|unsupported action|not (a )?(known|supported) action|no such action|not mocked|action .*not allowed|invalid action/i.test(String(message || ""));
18
35
  }
19
- const GONE_RE = /sandbox not found|not found \(404\)|no sandbox found|does not exist|sandbox.*expired|sandbox.*killed|not running anymore|cannot be resumed|was (?:killed|deleted|destroyed)/i;
36
+ const SANDBOX_GONE_RE = /\bSANDBOX_GONE\b|Sandbox Not Found|Paused sandbox .+ not found|sandbox \S+ not found|sandbox .*wasn'?t found|not found \(404\)|no sandbox found|does not exist|sandbox.*expired|sandbox.*killed|probably not running anymore|not running anymore|cannot be resumed|was (?:killed|deleted|destroyed)/i;
37
+ const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : {};
38
+ function answerData(r) {
39
+ const d = rec(r.data);
40
+ return Object.keys(rec(d.data)).length ? __spreadValues(__spreadValues({}, d), rec(d.data)) : d;
41
+ }
42
+ function isSandboxGoneResult(r) {
43
+ var _a, _b, _c, _d;
44
+ if (r.successful) return false;
45
+ const d = answerData(r);
46
+ const code = String((_d = (_c = (_b = (_a = d.errorCode) != null ? _a : d.code) != null ? _b : d.error_code) != null ? _c : rec(r).errorCode) != null ? _d : "").toUpperCase();
47
+ if (code === "FORBIDDEN" || /\bFORBIDDEN\b|sandbox is private/i.test(r.error || "")) return false;
48
+ return code === "SANDBOX_NOT_FOUND" || code === "SANDBOX_GONE" || d.gone === true || d.sandboxState === "gone" || SANDBOX_GONE_RE.test(r.error || "");
49
+ }
50
+ function savedCopyFrom(r) {
51
+ var _a, _b, _c, _d;
52
+ if (!isSandboxGoneResult(r)) return null;
53
+ const restore = rec(answerData(r).restore);
54
+ const str = (v) => typeof v === "string" && v.trim() ? v.trim() : void 0;
55
+ const text = r.error || "";
56
+ const snapshotId = (_b = str(restore.snapshotId)) != null ? _b : (_a = /\bsnapshot(?:Id)?\b[\s:=]+[`"']?([A-Za-z0-9][\w.:-]{3,199})/i.exec(text)) == null ? void 0 : _a[1];
57
+ const backupRepo = (_d = str(restore.backupRepo)) != null ? _d : (_c = /\b(?:backupRepo|backup repo|repo)\b[\s:=]+[`"']?([\w.-]+(?:\/[\w.-]+)?)/i.exec(text)) == null ? void 0 : _c[1];
58
+ let backupExists = backupRepo ? void 0 : false;
59
+ if (typeof restore.backupExists === "boolean") backupExists = restore.backupExists;
60
+ return __spreadValues(__spreadValues(__spreadValues({}, snapshotId ? {
61
+ snapshotId: snapshotId.replace(/[.,;)]+$/, "")
62
+ } : {}), backupRepo ? {
63
+ backupRepo: backupRepo.replace(/[.,;)]+$/, "")
64
+ } : {}), backupExists !== void 0 ? {
65
+ backupExists
66
+ } : {});
67
+ }
20
68
  function extendOutcome(r) {
21
69
  if (r.successful) {
22
70
  const d = r.data && typeof r.data === "object" ? r.data : {};
23
71
  return d.resumed === true ? "resumed" : "alive";
24
72
  }
25
73
  if (isUnsupportedActionError(r.error)) return "unsupported";
26
- if (GONE_RE.test(r.error || "")) return "gone";
74
+ if (isSandboxGoneResult(__spreadProps(__spreadValues({}, r), {
75
+ successful: false
76
+ }))) return "gone";
27
77
  return "failed";
28
78
  }
29
79
  class KeepAliveScheduler {
@@ -109,4 +159,4 @@ class KeepAliveScheduler {
109
159
  this.failures.delete(sandboxId);
110
160
  this.lastPingAt.delete(sandboxId);
111
161
  }
112
- }export{KEEPALIVE_EXTEND_MS,KEEPALIVE_IDLE_MS,KEEPALIVE_INTERVAL_MS,KEEPALIVE_MAX_FAILURES,KEEPALIVE_TICK_MS,KeepAliveScheduler,WEBBUILDER_EXTEND_ACTION,extendOutcome,isUnsupportedActionError,keepAliveDecision};//# sourceMappingURL=keepAlive.js.map
162
+ }export{KEEPALIVE_EXTEND_MS,KEEPALIVE_IDLE_MS,KEEPALIVE_INTERVAL_MS,KEEPALIVE_MAX_FAILURES,KEEPALIVE_TICK_MS,KeepAliveScheduler,SANDBOX_GONE_RE,WEBBUILDER_EXTEND_ACTION,extendOutcome,isSandboxGoneResult,isUnsupportedActionError,keepAliveDecision,savedCopyFrom};//# sourceMappingURL=keepAlive.js.map