@adminide-stack/yantra-mobile 12.0.142-alpha.0 → 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 (118) 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/devices/bodyComposition.js +116 -0
  4. package/lib/features/devices/bodyComposition.js.map +1 -0
  5. package/lib/features/devices/readings.js.map +1 -1
  6. package/lib/features/devices/session.js +22 -2
  7. package/lib/features/devices/session.js.map +1 -1
  8. package/lib/features/notion/NotionAgentPanel.js +987 -0
  9. package/lib/features/notion/NotionAgentPanel.js.map +1 -0
  10. package/lib/features/notion/NotionAskAiSheet.js +362 -0
  11. package/lib/features/notion/NotionAskAiSheet.js.map +1 -0
  12. package/lib/features/notion/NotionBlockView.js +4 -3
  13. package/lib/features/notion/NotionBlockView.js.map +1 -1
  14. package/lib/features/notion/NotionConnectionsSheet.js +47 -13
  15. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -1
  16. package/lib/features/notion/NotionPageView.js +68 -8
  17. package/lib/features/notion/NotionPageView.js.map +1 -1
  18. package/lib/features/notion/NotionSidebarSections.js +1 -1
  19. package/lib/features/notion/NotionSidebarSections.js.map +1 -1
  20. package/lib/features/notion/NotionWorkspaceView.js +14 -9
  21. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  22. package/lib/features/notion/database/DatabaseCells.js +3 -1
  23. package/lib/features/notion/database/DatabaseCells.js.map +1 -1
  24. package/lib/features/notion/database/DatabaseDateLayouts.js +1 -1
  25. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -1
  26. package/lib/features/notion/database/NotionDatabaseView.js +1 -1
  27. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -1
  28. package/lib/features/notion/notionAgentRunStatus.js +2 -2
  29. package/lib/features/notion/notionAgentRunStatus.js.map +1 -1
  30. package/lib/features/notion/notionAgentRuns.js +57 -0
  31. package/lib/features/notion/notionAgentRuns.js.map +1 -0
  32. package/lib/features/notion/notionAiContext.js +91 -0
  33. package/lib/features/notion/notionAiContext.js.map +1 -0
  34. package/lib/features/notion/notionConnections.js +42 -4
  35. package/lib/features/notion/notionConnections.js.map +1 -1
  36. package/lib/features/notion/notionDocuments.js +61 -1
  37. package/lib/features/notion/notionDocuments.js.map +1 -1
  38. package/lib/features/notion/notionNotesAgent.js +173 -3
  39. package/lib/features/notion/notionNotesAgent.js.map +1 -1
  40. package/lib/features/notion/notionPageKinds.js +1 -1
  41. package/lib/features/webbuilder/WebBuilderExperience.js +229 -97
  42. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  43. package/lib/features/webbuilder/buildFragments.js +33 -7
  44. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  45. package/lib/features/webbuilder/buildJob.js +2 -2
  46. package/lib/features/webbuilder/buildJob.js.map +1 -1
  47. package/lib/features/webbuilder/codeFiles.js +18 -1
  48. package/lib/features/webbuilder/codeFiles.js.map +1 -1
  49. package/lib/features/webbuilder/components/BottomTabs.js.map +1 -1
  50. package/lib/features/webbuilder/components/CodeView.js +134 -56
  51. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  52. package/lib/features/webbuilder/components/Composer.js +2 -2
  53. package/lib/features/webbuilder/components/Composer.js.map +1 -1
  54. package/lib/features/webbuilder/components/PreviewFrame.js +19 -3
  55. package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
  56. package/lib/features/webbuilder/components/PreviewScreen.js +310 -46
  57. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  58. package/lib/features/webbuilder/components/ProjectChat.js +141 -12
  59. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  60. package/lib/features/webbuilder/components/ProjectSheets.js +792 -0
  61. package/lib/features/webbuilder/components/ProjectSheets.js.map +1 -0
  62. package/lib/features/webbuilder/components/ProjectsScreen.js +14 -2
  63. package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
  64. package/lib/features/webbuilder/components/PublishSheet.js +914 -58
  65. package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
  66. package/lib/features/webbuilder/components/TemplateCard.js +9 -6
  67. package/lib/features/webbuilder/components/TemplateCard.js.map +1 -1
  68. package/lib/features/webbuilder/components/TemplatesSheet.js +5 -17
  69. package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -1
  70. package/lib/features/webbuilder/connectorTemplates.js +171 -0
  71. package/lib/features/webbuilder/connectorTemplates.js.map +1 -0
  72. package/lib/features/webbuilder/fileTree.js +163 -0
  73. package/lib/features/webbuilder/fileTree.js.map +1 -0
  74. package/lib/features/webbuilder/followUps.js +67 -0
  75. package/lib/features/webbuilder/followUps.js.map +1 -0
  76. package/lib/features/webbuilder/previewProbe.js +49 -0
  77. package/lib/features/webbuilder/previewProbe.js.map +1 -0
  78. package/lib/features/webbuilder/previewRoutes.js +156 -0
  79. package/lib/features/webbuilder/previewRoutes.js.map +1 -0
  80. package/lib/features/webbuilder/projectTools.js +341 -0
  81. package/lib/features/webbuilder/projectTools.js.map +1 -0
  82. package/lib/features/webbuilder/publishTools.js +475 -0
  83. package/lib/features/webbuilder/publishTools.js.map +1 -0
  84. package/lib/features/webbuilder/sleepNotice.js +13 -0
  85. package/lib/features/webbuilder/sleepNotice.js.map +1 -0
  86. package/lib/features/webbuilder/stepLabels.js +37 -7
  87. package/lib/features/webbuilder/stepLabels.js.map +1 -1
  88. package/lib/features/webbuilder/studioCatalog.js +5 -1
  89. package/lib/features/webbuilder/studioCatalog.js.map +1 -1
  90. package/lib/features/webbuilder/templateCatalog.js +140 -0
  91. package/lib/features/webbuilder/templateCatalog.js.map +1 -0
  92. package/lib/features/webbuilder/webbuilderPrompts.js +31 -5
  93. package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
  94. package/lib/features/webbuilder/workflow.js +8 -4
  95. package/lib/features/webbuilder/workflow.js.map +1 -1
  96. package/lib/screens/Devices/index.js +205 -3
  97. package/lib/screens/Devices/index.js.map +1 -1
  98. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +9 -6
  99. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -1
  100. package/lib/screens/WebBuilderNative/index.js +1 -1
  101. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  102. package/lib/screens/WebBuilderNative/keepAlive.js +53 -3
  103. package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -1
  104. package/lib/screens/WebBuilderNative/unreachableRetry.js +23 -0
  105. package/lib/screens/WebBuilderNative/unreachableRetry.js.map +1 -0
  106. package/lib/screens/WebBuilderNative/useConnectorTemplates.js +37 -0
  107. package/lib/screens/WebBuilderNative/useConnectorTemplates.js.map +1 -0
  108. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +6 -0
  109. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -1
  110. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +302 -40
  111. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  112. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +2 -2
  113. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
  114. package/lib/screens/WebBuilderNative/versionUndo.js +1 -1
  115. package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -1
  116. package/lib/screens/WebBuilderNative/webbuilderTransport.js +147 -77
  117. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
  118. package/package.json +4 -4
@@ -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 {jsxs,jsx,Fragment}from'react/jsx-runtime';import React__default,{useState,useMemo,useCallback,useEffect,useRef}from'react';import {BackHandler,StyleSheet,View,Pressable,ActivityIndicator,ScrollView,Linking,Alert,Animated,Easing,Platform}from'react-native';import {Ionicons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {mobileColors,mobileTokens}from'../../theme/mobileTokens.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import {deviceKind,DEVICE_KINDS}from'../../features/devices/catalog.js';import {useDevices,useDeviceSession,platformWriter,deviceStore}from'../../features/devices/devices.js';import {describeReading}from'../../features/devices/readings.js';import {useHealthSync}from'../../features/health/healthSync.js';var __defProp = Object.defineProperty;
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import React__default,{useState,useMemo,useCallback,useEffect,useRef}from'react';import {BackHandler,StyleSheet,View,Pressable,ActivityIndicator,ScrollView,Linking,Alert,Animated,Easing,Platform}from'react-native';import {Ionicons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {mobileColors,mobileTokens}from'../../theme/mobileTokens.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import {deviceKind,DEVICE_KINDS}from'../../features/devices/catalog.js';import {useDevices,useDeviceSession,platformWriter,deviceStore}from'../../features/devices/devices.js';import {describeReading}from'../../features/devices/readings.js';import {compositionRows}from'../../features/devices/bodyComposition.js';import {useHealthSync}from'../../features/health/healthSync.js';var __defProp = Object.defineProperty;
2
2
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
3
  var __hasOwnProp = Object.prototype.hasOwnProperty;
4
4
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -305,6 +305,53 @@ const styles = StyleSheet.create({
305
305
  fontSize: 14,
306
306
  marginTop: 2
307
307
  },
308
+ measureBox: {
309
+ alignItems: "center",
310
+ paddingVertical: 24,
311
+ gap: 6
312
+ },
313
+ measureRing: {
314
+ position: "absolute",
315
+ top: 24,
316
+ width: 176,
317
+ height: 176,
318
+ borderRadius: 88,
319
+ borderWidth: 2
320
+ },
321
+ measureCore: {
322
+ width: 176,
323
+ height: 176,
324
+ borderRadius: 88,
325
+ alignItems: "center",
326
+ justifyContent: "center",
327
+ marginBottom: 12
328
+ },
329
+ measureWeight: {
330
+ fontSize: 44,
331
+ fontWeight: "700"
332
+ },
333
+ measureUnit: {
334
+ fontSize: 18,
335
+ fontWeight: "600"
336
+ },
337
+ compositionGrid: {
338
+ flexDirection: "row",
339
+ flexWrap: "wrap",
340
+ marginTop: 10,
341
+ rowGap: 10
342
+ },
343
+ compositionItem: {
344
+ width: "33.33%",
345
+ paddingRight: 8
346
+ },
347
+ compositionLabel: {
348
+ fontSize: 12
349
+ },
350
+ compositionValue: {
351
+ fontSize: 15,
352
+ fontWeight: "600",
353
+ marginTop: 1
354
+ },
308
355
  savedLine: {
309
356
  flexDirection: "row",
310
357
  alignItems: "center",
@@ -567,7 +614,15 @@ function ReadingsCard({
567
614
  }], children: whenLabel(r.at, now) }),
568
615
  r.kind === "blood-pressure" && ((_a = r.problems) == null ? void 0 : _a.length) ? /* @__PURE__ */ jsx(Text, { style: [styles.readingNote, {
569
616
  color: colors.warningText
570
- }], children: r.problems.join(" ") }) : null
617
+ }], children: r.problems.join(" ") }) : null,
618
+ r.kind === "body" && r.composition ? /* @__PURE__ */ jsx(View, { style: styles.compositionGrid, children: compositionRows(r.composition, units).map((m) => /* @__PURE__ */ jsxs(View, { style: styles.compositionItem, children: [
619
+ /* @__PURE__ */ jsx(Text, { style: [styles.compositionLabel, {
620
+ color: colors.textMuted
621
+ }], children: m.label }),
622
+ /* @__PURE__ */ jsx(Text, { style: [styles.compositionValue, {
623
+ color: colors.text
624
+ }], children: m.value })
625
+ ] }, m.label)) }) : null
571
626
  ] })
572
627
  ] }, r.id);
573
628
  }) })
@@ -772,10 +827,151 @@ function PickKind({
772
827
  ] }, k.id)) })
773
828
  ] });
774
829
  }
830
+ function formatWeight(kg, units) {
831
+ if (kg === void 0) return "--";
832
+ const v = units === "imperial" ? kg / 0.45359237 : kg;
833
+ return (Math.round(v * 10) / 10).toFixed(1);
834
+ }
835
+ function ScaleMeasuring({
836
+ colors,
837
+ live,
838
+ units
839
+ }) {
840
+ const pulse = useRef(new Animated.Value(0)).current;
841
+ useEffect(() => {
842
+ const loop = Animated.loop(Animated.timing(pulse, {
843
+ toValue: 1,
844
+ duration: 1400,
845
+ easing: Easing.out(Easing.ease),
846
+ useNativeDriver: true
847
+ }));
848
+ loop.start();
849
+ return () => loop.stop();
850
+ }, [pulse]);
851
+ const ringScale = pulse.interpolate({
852
+ inputRange: [0, 1],
853
+ outputRange: [0.9, 1.5]
854
+ });
855
+ const ringOpacity = pulse.interpolate({
856
+ inputRange: [0, 1],
857
+ outputRange: [0.5, 0]
858
+ });
859
+ const unitLabel = units === "imperial" ? "lb" : "kg";
860
+ return /* @__PURE__ */ jsxs(View, { style: styles.measureBox, children: [
861
+ /* @__PURE__ */ jsx(Animated.View, { style: [styles.measureRing, {
862
+ borderColor: colors.primary,
863
+ opacity: ringOpacity,
864
+ transform: [{
865
+ scale: ringScale
866
+ }]
867
+ }], accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants" }),
868
+ /* @__PURE__ */ jsx(View, { style: [styles.measureCore, {
869
+ backgroundColor: colors.primarySoft
870
+ }], children: /* @__PURE__ */ jsxs(Text, { style: [styles.measureWeight, {
871
+ color: colors.text
872
+ }], accessibilityLabel: `${formatWeight(live.weightKg, units)} ${unitLabel}`, children: [
873
+ formatWeight(live.weightKg, units),
874
+ /* @__PURE__ */ jsxs(Text, { style: [styles.measureUnit, {
875
+ color: colors.textMuted
876
+ }], children: [
877
+ " ",
878
+ unitLabel
879
+ ] })
880
+ ] }) }),
881
+ /* @__PURE__ */ jsx(Text, { style: [styles.statusTitle, {
882
+ color: colors.text
883
+ }], children: "Measuring" }),
884
+ /* @__PURE__ */ jsx(Text, { style: [styles.statusBody, {
885
+ color: colors.textMuted
886
+ }], children: "Stand still, barefoot, until it settles." })
887
+ ] });
888
+ }
889
+ function BrandLive({
890
+ kind,
891
+ colors,
892
+ live,
893
+ units
894
+ }) {
895
+ var _a, _b, _c;
896
+ const items = [];
897
+ const round1 = (n) => Math.round(n * 10) / 10;
898
+ if (kind === "kitchen-scale") items.push({
899
+ label: "Weight",
900
+ value: `${Math.round((_a = live.grams) != null ? _a : 0)} g`
901
+ });
902
+ if (kind === "tape") {
903
+ const cm = (_b = live.lengthCm) != null ? _b : 0;
904
+ items.push({
905
+ label: live.bodyPart ? live.bodyPart.replace(/_/g, " ") : "Length",
906
+ value: units === "imperial" ? `${round1(cm / 2.54)} in` : `${round1(cm)} cm`
907
+ });
908
+ }
909
+ if (kind === "jump-rope") {
910
+ items.push({
911
+ label: "Jumps",
912
+ value: String((_c = live.jumps) != null ? _c : 0)
913
+ });
914
+ if (live.elapsedS !== void 0) items.push({
915
+ label: "Time",
916
+ value: clockOf(live.elapsedS)
917
+ });
918
+ }
919
+ if (kind === "treadmill") {
920
+ if (live.speedKmh !== void 0) items.push({
921
+ label: "Speed",
922
+ value: `${round1(live.speedKmh)} km/h`
923
+ });
924
+ if (live.distanceM !== void 0) items.push({
925
+ label: "Distance",
926
+ value: `${round1(live.distanceM / 1e3)} km`
927
+ });
928
+ if (live.kcal !== void 0) items.push({
929
+ label: "Calories",
930
+ value: `${Math.round(live.kcal)} kcal`
931
+ });
932
+ if (live.elapsedS !== void 0) items.push({
933
+ label: "Time",
934
+ value: clockOf(live.elapsedS)
935
+ });
936
+ }
937
+ if (kind === "ring") {
938
+ if (live.bpm !== void 0) items.push({
939
+ label: "Heart rate",
940
+ value: `${live.bpm} bpm`
941
+ });
942
+ if (live.spo2 !== void 0) items.push({
943
+ label: "Blood oxygen",
944
+ value: `${live.spo2}%`
945
+ });
946
+ if (live.skinTempC !== void 0) items.push({
947
+ label: "Skin temp",
948
+ value: `${round1(live.skinTempC)} \xB0C`
949
+ });
950
+ if (live.steps !== void 0) items.push({
951
+ label: "Steps",
952
+ value: String(live.steps)
953
+ });
954
+ }
955
+ if (live.battery !== void 0) items.push({
956
+ label: "Battery",
957
+ value: `${live.battery}%`
958
+ });
959
+ return /* @__PURE__ */ jsx(View, { style: [styles.card, styles.livePanel, {
960
+ backgroundColor: colors.surface
961
+ }], children: /* @__PURE__ */ jsx(View, { style: styles.compositionGrid, children: items.map((m) => /* @__PURE__ */ jsxs(View, { style: styles.compositionItem, children: [
962
+ /* @__PURE__ */ jsx(Text, { style: [styles.compositionLabel, {
963
+ color: colors.textMuted
964
+ }], children: m.label }),
965
+ /* @__PURE__ */ jsx(Text, { style: [styles.compositionValue, {
966
+ color: colors.text
967
+ }], children: m.value })
968
+ ] }, m.label)) }) });
969
+ }
775
970
  function LivePanel({
776
971
  kind,
777
972
  colors,
778
973
  live,
974
+ units,
779
975
  recording,
780
976
  connected,
781
977
  onStart,
@@ -784,6 +980,12 @@ function LivePanel({
784
980
  }) {
785
981
  var _a, _b, _c, _d, _e;
786
982
  const [type, setType] = useState("run");
983
+ if (kind === "scale") {
984
+ return /* @__PURE__ */ jsx(ScaleMeasuring, { colors, live, units });
985
+ }
986
+ if (kind === "kitchen-scale" || kind === "tape" || kind === "jump-rope" || kind === "treadmill" || kind === "ring") {
987
+ return /* @__PURE__ */ jsx(BrandLive, { kind, colors, live, units });
988
+ }
787
989
  const [, tick] = useState(0);
788
990
  useEffect(() => {
789
991
  if (!recording) return void 0;
@@ -943,7 +1145,7 @@ function Measure({
943
1145
  "."
944
1146
  ] })
945
1147
  ] }) : null,
946
- (state.step === "connected" || state.step === "ended") && live ? /* @__PURE__ */ jsx(LivePanel, { kind, colors, live, recording, connected: state.step === "connected", onStart: (type) => session == null ? void 0 : session.startRecording(type), onStop: () => {
1148
+ (state.step === "connected" || state.step === "ended") && live ? /* @__PURE__ */ jsx(LivePanel, { kind, colors, live, units, recording, connected: state.step === "connected", onStart: (type) => session == null ? void 0 : session.startRecording(type), onStop: () => {
947
1149
  void (session == null ? void 0 : session.stopRecording());
948
1150
  }, onSave: () => {
949
1151
  void (session == null ? void 0 : session.saveLive());