@adminide-stack/yantra-mobile 12.0.120-alpha.1 → 12.0.120

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.
@@ -0,0 +1,92 @@
1
+ import {titleFromPrompt,cleanPrompt,stripAgentNote}from'./buildFragments.js';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;
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));
20
+ const WEBBUILDER_JOB_SURFACE = "webbuilder";
21
+ const WEBBUILDER_JOB_BUDGET_MS = 30 * 60 * 1e3;
22
+ const WEBBUILDER_JOB_GRACE_MS = 10 * 60 * 1e3;
23
+ const BRIEF_MAX = 280;
24
+ function briefFrom(ask) {
25
+ const text = cleanPrompt(stripAgentNote(ask));
26
+ return text.length > BRIEF_MAX ? `${text.slice(0, BRIEF_MAX - 1).trimEnd()}\u2026` : text;
27
+ }
28
+ function webBuilderPageUrl(webOrigin, channelId) {
29
+ const origin = (webOrigin || "").trim().replace(/\/+$/, "");
30
+ if (!/^https?:\/\/[^/]+$/i.test(origin)) return void 0;
31
+ return `${origin}/c/${encodeURIComponent(channelId)}/webbuilder`;
32
+ }
33
+ function webBuilderJobRecord(start) {
34
+ const brief = briefFrom(start.ask);
35
+ const name = start.siteTitle || titleFromPrompt(brief) || "New site";
36
+ const pageUrl = webBuilderPageUrl(start.webOrigin, start.channelId);
37
+ return __spreadProps(__spreadValues({
38
+ // One job per turn; the server keys it on `<surface>:<id>`, so a retry records nothing new.
39
+ id: `${start.channelId}:${start.startedAt}`,
40
+ surface: WEBBUILDER_JOB_SURFACE,
41
+ lane: start.lane === "agent" ? "channel-turn" : "workflow",
42
+ title: start.mode === "edit" ? `Update ${name}` : name,
43
+ brief,
44
+ state: "running",
45
+ createdAt: start.startedAt,
46
+ startedAt: start.startedAt,
47
+ deadlineAt: start.startedAt + WEBBUILDER_JOB_BUDGET_MS + WEBBUILDER_JOB_GRACE_MS,
48
+ progress: start.mode === "edit" ? "Updating your app" : "Starting your build"
49
+ }, pageUrl ? {
50
+ pageUrl
51
+ } : {}), {
52
+ handle: __spreadValues({
53
+ channelId: start.channelId
54
+ }, start.projectId ? {
55
+ projectId: start.projectId
56
+ } : {})
57
+ });
58
+ }
59
+ function webBuilderJobFinish(outcome) {
60
+ var _a, _b, _c, _d;
61
+ if (!outcome.ok) {
62
+ return {
63
+ state: "failed",
64
+ endedAt: outcome.endedAt,
65
+ progress: null,
66
+ error: outcome.error
67
+ };
68
+ }
69
+ const cover = (_a = outcome.build) == null ? void 0 : _a.coverUrl;
70
+ const results = cover && /^https?:\/\//i.test(cover) ? [{
71
+ url: cover,
72
+ kind: "image",
73
+ title: ((_b = outcome.build) == null ? void 0 : _b.title) || "Site"
74
+ }] : [];
75
+ const site = ((_c = outcome.build) == null ? void 0 : _c.liveUrl) || ((_d = outcome.build) == null ? void 0 : _d.previewUrl);
76
+ return __spreadValues(__spreadValues({
77
+ state: "succeeded",
78
+ endedAt: outcome.endedAt,
79
+ progress: null
80
+ }, results.length ? {
81
+ results
82
+ } : {}), site && /^https?:\/\//i.test(site) ? {
83
+ resultUrl: site
84
+ } : {});
85
+ }
86
+ function surfaceJobRef(record) {
87
+ if (!(record == null ? void 0 : record.id) || !record.reportToken) return null;
88
+ return {
89
+ task_id: record.id,
90
+ report_token: record.reportToken
91
+ };
92
+ }export{WEBBUILDER_JOB_BUDGET_MS,WEBBUILDER_JOB_GRACE_MS,WEBBUILDER_JOB_SURFACE,surfaceJobRef,webBuilderJobFinish,webBuilderJobRecord,webBuilderPageUrl};//# sourceMappingURL=buildJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildJob.js","sources":["../../../src/features/webbuilder/buildJob.ts"],"sourcesContent":["/**\n * A Web Builder turn (a new site, a remix or an edit) is a long-running job:\n * it is recorded as a server-owned surface job so it shows in the phone's Tasks\n * sheet and the web chat's Tasks panel while it runs, and after the app closes.\n *\n * Contract: adminIde project-mgmt `recordSurfaceJob(job)` / `updateSurfaceJob(id,\n * patch)` (surface-job-rules.ts); read back by common CENTRAL_TASKS_MODEL. The\n * agent settles a job whose ref rode on its chat turn (`job {task_id,\n * report_token}`); the app settles it too when it sees the turn end, and the\n * server's deadline sweep ends one nobody reported on.\n *\n * Pure (no React, no fetch): the host hook records and settles.\n */\nimport { cleanPrompt, stripAgentNote, titleFromPrompt } from './buildFragments';\nimport type { WebBuilderBuild } from './types';\n\n/** The slug every Web Builder job is recorded under. */\nexport const WEBBUILDER_JOB_SURFACE = 'webbuilder';\n/** A build or an edit finishes well inside this. */\nexport const WEBBUILDER_JOB_BUDGET_MS = 30 * 60 * 1000;\n/** Slack past the budget before a running job reads as stopped (surface-kit's grace). */\nexport const WEBBUILDER_JOB_GRACE_MS = 10 * 60 * 1000;\n/** The brief is a line under the title, not the whole ask. */\nconst BRIEF_MAX = 280;\n\n/** The ref a chat turn carries so the agent reports the job's verdict itself. */\nexport interface SurfaceJobRef {\n task_id: string;\n report_token: string;\n}\n\nexport type WebBuilderJobMode = 'new' | 'remix' | 'edit';\n\nexport interface WebBuilderJobStart {\n channelId: string;\n projectId?: string | null;\n /** The person's words for this turn, as sent (notes and prefixes are stripped). */\n ask: string;\n /** The site's name when it has one (an edit); else it is named from the ask. */\n siteTitle?: string | null;\n mode: WebBuilderJobMode;\n /** Who runs it: the agent chat, or the build workflow. */\n lane: 'agent' | 'workflow';\n startedAt: number;\n /** The web app's origin; the job opens this site's Web Builder there. */\n webOrigin?: string | null;\n}\n\nfunction briefFrom(ask: string): string {\n const text = cleanPrompt(stripAgentNote(ask));\n return text.length > BRIEF_MAX ? `${text.slice(0, BRIEF_MAX - 1).trimEnd()}…` : text;\n}\n\n/** `<origin>/c/<channelId>/webbuilder`, the web's Web Builder rail for this chat; http(s) only. */\nexport function webBuilderPageUrl(webOrigin: string | null | undefined, channelId: string): string | undefined {\n const origin = (webOrigin || '').trim().replace(/\\/+$/, '');\n if (!/^https?:\\/\\/[^/]+$/i.test(origin)) return undefined;\n return `${origin}/c/${encodeURIComponent(channelId)}/webbuilder`;\n}\n\n/** The `recordSurfaceJob` input for a turn that is starting. */\nexport function webBuilderJobRecord(start: WebBuilderJobStart): Record<string, unknown> {\n const brief = briefFrom(start.ask);\n const name = start.siteTitle || titleFromPrompt(brief) || 'New site';\n const pageUrl = webBuilderPageUrl(start.webOrigin, start.channelId);\n return {\n // One job per turn; the server keys it on `<surface>:<id>`, so a retry records nothing new.\n id: `${start.channelId}:${start.startedAt}`,\n surface: WEBBUILDER_JOB_SURFACE,\n lane: start.lane === 'agent' ? 'channel-turn' : 'workflow',\n title: start.mode === 'edit' ? `Update ${name}` : name,\n brief,\n state: 'running',\n createdAt: start.startedAt,\n startedAt: start.startedAt,\n deadlineAt: start.startedAt + WEBBUILDER_JOB_BUDGET_MS + WEBBUILDER_JOB_GRACE_MS,\n progress: start.mode === 'edit' ? 'Updating your app' : 'Starting your build',\n ...(pageUrl ? { pageUrl } : {}),\n handle: { channelId: start.channelId, ...(start.projectId ? { projectId: start.projectId } : {}) },\n };\n}\n\nexport type WebBuilderJobOutcome =\n | {\n ok: true;\n endedAt: number;\n build?: Pick<WebBuilderBuild, 'previewUrl' | 'liveUrl' | 'coverUrl' | 'title'> | null;\n }\n | { ok: false; endedAt: number; error: string };\n\n/** The `updateSurfaceJob` patch that ends a turn's job. */\nexport function webBuilderJobFinish(outcome: WebBuilderJobOutcome): Record<string, unknown> {\n if (!outcome.ok) {\n return { state: 'failed', endedAt: outcome.endedAt, progress: null, error: outcome.error };\n }\n const cover = outcome.build?.coverUrl;\n const results =\n cover && /^https?:\\/\\//i.test(cover)\n ? [{ url: cover, kind: 'image', title: outcome.build?.title || 'Site' }]\n : [];\n const site = outcome.build?.liveUrl || outcome.build?.previewUrl;\n return {\n state: 'succeeded',\n endedAt: outcome.endedAt,\n progress: null,\n ...(results.length ? { results } : {}),\n ...(site && /^https?:\\/\\//i.test(site) ? { resultUrl: site } : {}),\n };\n}\n\n/** The job's ref for a chat turn, when the server gave it a report token. */\nexport function surfaceJobRef(\n record: { id?: string | null; reportToken?: string | null } | null | undefined,\n): SurfaceJobRef | null {\n if (!record?.id || !record.reportToken) return null;\n return { task_id: record.id, report_token: record.reportToken };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAiBO,MAAM,sBAAyB,GAAA;AAEzB,MAAA,wBAAA,GAA2B,KAAK,EAAK,GAAA;AAErC,MAAA,uBAAA,GAA0B,KAAK,EAAK,GAAA;AAEjD,MAAM,SAAY,GAAA,GAAA;AAsBlB,SAAS,UAAU,GAAqB,EAAA;AACtC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,cAAe,CAAA,GAAG,CAAC,CAAA;AAC5C,EAAA,OAAO,IAAK,CAAA,MAAA,GAAS,SAAY,GAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,CAAG,EAAA,SAAA,GAAY,CAAC,CAAA,CAAE,OAAQ,EAAC,CAAM,MAAA,CAAA,GAAA,IAAA;AAClF;AAGgB,SAAA,iBAAA,CAAkB,WAAsC,SAAuC,EAAA;AAC7G,EAAA,MAAM,UAAU,SAAa,IAAA,EAAA,EAAI,MAAO,CAAA,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC1D,EAAA,IAAI,CAAC,qBAAA,CAAsB,IAAK,CAAA,MAAM,GAAU,OAAA,MAAA;AAChD,EAAA,OAAO,CAAG,EAAA,MAAM,CAAM,GAAA,EAAA,kBAAA,CAAmB,SAAS,CAAC,CAAA,WAAA,CAAA;AACrD;AAGO,SAAS,oBAAoB,KAAoD,EAAA;AACtF,EAAM,MAAA,KAAA,GAAQ,SAAU,CAAA,KAAA,CAAM,GAAG,CAAA;AACjC,EAAA,MAAM,IAAO,GAAA,KAAA,CAAM,SAAa,IAAA,eAAA,CAAgB,KAAK,CAAK,IAAA,UAAA;AAC1D,EAAA,MAAM,OAAU,GAAA,iBAAA,CAAkB,KAAM,CAAA,SAAA,EAAW,MAAM,SAAS,CAAA;AAClE,EAAO,OAAA,aAAA,CAAA,cAAA,CAAA;AAAA;AAAA,IAEL,IAAI,CAAG,EAAA,KAAA,CAAM,SAAS,CAAA,CAAA,EAAI,MAAM,SAAS,CAAA,CAAA;AAAA,IACzC,OAAS,EAAA,sBAAA;AAAA,IACT,IAAM,EAAA,KAAA,CAAM,IAAS,KAAA,OAAA,GAAU,cAAiB,GAAA,UAAA;AAAA,IAChD,OAAO,KAAM,CAAA,IAAA,KAAS,MAAS,GAAA,CAAA,OAAA,EAAU,IAAI,CAAK,CAAA,GAAA,IAAA;AAAA,IAClD,KAAA;AAAA,IACA,KAAO,EAAA,SAAA;AAAA,IACP,WAAW,KAAM,CAAA,SAAA;AAAA,IACjB,WAAW,KAAM,CAAA,SAAA;AAAA,IACjB,UAAA,EAAY,KAAM,CAAA,SAAA,GAAY,wBAA2B,GAAA,uBAAA;AAAA,IACzD,QAAU,EAAA,KAAA,CAAM,IAAS,KAAA,MAAA,GAAS,mBAAsB,GAAA;AAAA,GAAA,EACpD,OAAU,GAAA;AAAA,IACZ;AAAA,GACF,GAAI,EAdC,CAAA,EAAA;AAAA,IAeL,MAAQ,EAAA,cAAA,CAAA;AAAA,MACN,WAAW,KAAM,CAAA;AAAA,KAAA,EACb,MAAM,SAAY,GAAA;AAAA,MACpB,WAAW,KAAM,CAAA;AAAA,QACf,EAAC;AAAA,GAET,CAAA;AACF;AAYO,SAAS,oBAAoB,OAAwD,EAAA;AAhG5F,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiGE,EAAI,IAAA,CAAC,QAAQ,EAAI,EAAA;AACf,IAAO,OAAA;AAAA,MACL,KAAO,EAAA,QAAA;AAAA,MACP,SAAS,OAAQ,CAAA,OAAA;AAAA,MACjB,QAAU,EAAA,IAAA;AAAA,MACV,OAAO,OAAQ,CAAA;AAAA,KACjB;AAAA;AAEF,EAAM,MAAA,KAAA,GAAA,CAAQ,EAAQ,GAAA,OAAA,CAAA,KAAA,KAAR,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,QAAA;AAC7B,EAAA,MAAM,UAAU,KAAS,IAAA,eAAA,CAAgB,IAAK,CAAA,KAAK,IAAI,CAAC;AAAA,IACtD,GAAK,EAAA,KAAA;AAAA,IACL,IAAM,EAAA,OAAA;AAAA,IACN,KAAO,EAAA,CAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,KAAR,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,KAAS,KAAA;AAAA,GAChC,IAAI,EAAC;AACN,EAAA,MAAM,SAAO,EAAQ,GAAA,OAAA,CAAA,KAAA,KAAR,mBAAe,OAAW,MAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,UAAR,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,UAAA,CAAA;AACtD,EAAO,OAAA,cAAA,CAAA,cAAA,CAAA;AAAA,IACL,KAAO,EAAA,WAAA;AAAA,IACP,SAAS,OAAQ,CAAA,OAAA;AAAA,IACjB,QAAU,EAAA;AAAA,GAAA,EACN,QAAQ,MAAS,GAAA;AAAA,IACnB;AAAA,MACE,EAAC,CAAA,EACD,QAAQ,eAAgB,CAAA,IAAA,CAAK,IAAI,CAAI,GAAA;AAAA,IACvC,SAAW,EAAA;AAAA,MACT,EAAC,CAAA;AAET;AAGO,SAAS,cAAc,MAGc,EAAA;AAC1C,EAAA,IAAI,EAAC,MAAQ,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAA,EAAA,CAAA,IAAM,CAAC,MAAA,CAAO,aAAoB,OAAA,IAAA;AAC/C,EAAO,OAAA;AAAA,IACL,SAAS,MAAO,CAAA,EAAA;AAAA,IAChB,cAAc,MAAO,CAAA;AAAA,GACvB;AACF"}
@@ -51,6 +51,12 @@ function isDisabled(info) {
51
51
  if (info.enable === false || info.enable === "false") return true;
52
52
  return false;
53
53
  }
54
+ function isCardPack(info) {
55
+ const {
56
+ forms
57
+ } = info;
58
+ return Boolean(forms) && typeof forms === "object" && Object.keys(forms).length > 0;
59
+ }
54
60
  const FALLBACK_TEMPLATES = [{
55
61
  id: "assetwise",
56
62
  title: "Assetwise",
@@ -100,7 +106,7 @@ function pickMetadata(info, templateTarget) {
100
106
  function findWorkflowModel(map) {
101
107
  var _a;
102
108
  const ranked = [];
103
- const eligible = Object.entries(map).filter(([, info]) => info && typeof info === "object" && !isDisabled(info) && Boolean(str(info.formId)) && Boolean(str(info.formExtensionId)));
109
+ const eligible = Object.entries(map).filter(([, info]) => info && typeof info === "object" && !isDisabled(info) && !isCardPack(info) && Boolean(str(info.formId)) && Boolean(str(info.formExtensionId)));
104
110
  for (const [key, info] of eligible) {
105
111
  const pt = str(info.projectType).toLowerCase();
106
112
  const tn = str(info.templateName).toLowerCase();
@@ -255,9 +261,10 @@ function mapYantraFormCards(uiMap, workflowModel) {
255
261
  category: str(form.category) || void 0,
256
262
  templateName: stack,
257
263
  formTemplateId: formTemplateId || void 0,
258
- formExtensionId: workflowExtId || str(group.formExtensionId) || void 0,
259
- formId: workflowFormId || str(group.formId) || void 0,
260
- formFunctionId: workflowFnId || str(group.formFunctionId) || void 0,
264
+ // Only the workflow model runs builds; the pack's own ids name its gallery.
265
+ formExtensionId: workflowExtId || void 0,
266
+ formId: workflowFormId || void 0,
267
+ formFunctionId: workflowFnId || void 0,
261
268
  domain: workflowDomain || void 0,
262
269
  apiKey: workflowApiKey || void 0,
263
270
  metadata,
@@ -298,30 +305,19 @@ function workflowDefaultsFromSettings(uiLayoutSettings, appSettings, stack = DEF
298
305
  const uiMap = extractFlatMap(uiLayoutSettings, true);
299
306
  const appMap = extractFlatMap(appSettings, false);
300
307
  const workflowModel = resolveWorkflowModel(uiMap, appMap);
301
- const normalized = normalizeStackTemplate([stack]);
302
- if (workflowModel) {
303
- const formExtensionId = str(workflowModel.formExtensionId) || void 0;
304
- if (formExtensionId) {
305
- return {
306
- id: WORKFLOW_DEFAULTS_ID,
307
- title: "Code Assistant",
308
- templateName: normalized,
309
- formExtensionId,
310
- formId: str(workflowModel.formId) || void 0,
311
- formFunctionId: str(workflowModel.formFunctionId) || void 0,
312
- domain: str(workflowModel.formExtensionE2BDomain) || void 0,
313
- apiKey: str(workflowModel.formExtensionModelConfigAPIKey) || str(workflowModel.apiKey) || void 0,
314
- metadata: pickMetadata(workflowModel, TEMPLATE_TARGET)
315
- };
316
- }
317
- }
318
- const card = mapYantraFormCards(uiMap, workflowModel).find((c) => c.formExtensionId);
319
- if (!(card == null ? void 0 : card.formExtensionId)) return null;
320
- return __spreadProps(__spreadValues({}, card), {
308
+ const formExtensionId = workflowModel ? str(workflowModel.formExtensionId) : "";
309
+ if (!workflowModel || !formExtensionId) return null;
310
+ return {
321
311
  id: WORKFLOW_DEFAULTS_ID,
322
312
  title: "Code Assistant",
323
- templateName: normalized || card.templateName
324
- });
313
+ templateName: normalizeStackTemplate([stack]),
314
+ formExtensionId,
315
+ formId: str(workflowModel.formId) || void 0,
316
+ formFunctionId: str(workflowModel.formFunctionId) || void 0,
317
+ domain: str(workflowModel.formExtensionE2BDomain) || void 0,
318
+ apiKey: str(workflowModel.formExtensionModelConfigAPIKey) || str(workflowModel.apiKey) || void 0,
319
+ metadata: pickMetadata(workflowModel, TEMPLATE_TARGET)
320
+ };
325
321
  }
326
322
  function buildWorkflowPayloadFromTemplate(template, extras) {
327
323
  const rawName = (template == null ? void 0 : template.templateName) || (extras == null ? void 0 : extras.defaultTemplate) || DEFAULT_STACK_TEMPLATE;
@@ -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.\n */\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 /** Inngest target; 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/** 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/** The marketplace entry that is the workflow model: `projectType: codeassistant` first, github-model next. */\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 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` Inngest target. */\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 formExtensionId: workflowExtId || str(group.formExtensionId) || undefined,\n formId: workflowFormId || str(group.formId) || undefined,\n formFunctionId: workflowFnId || str(group.formFunctionId) || 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 * else the first card whose pack carries a formExtensionId. Null when the org\n * has neither, which means builds are not configured.\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 normalized = normalizeStackTemplate([stack]);\n\n if (workflowModel) {\n const formExtensionId = str(workflowModel.formExtensionId) || undefined;\n if (formExtensionId) {\n return {\n id: WORKFLOW_DEFAULTS_ID,\n title: 'Code Assistant',\n templateName: normalized,\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 // Remix packs often carry formExtensionId on the group even when the\n // dedicated `projectType: codeassistant` row is missing.\n const card = mapYantraFormCards(uiMap, workflowModel).find((c) => c.formExtensionId);\n if (!card?.formExtensionId) return null;\n return {\n ...card,\n id: WORKFLOW_DEFAULTS_ID,\n title: 'Code Assistant',\n templateName: normalized || card.templateName,\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 Inngest 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/** E2B preview hosts are `3000-<sandboxId>.<domain>`; 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 const sandboxUrl = isEditTurn ? (opts.edit?.sandboxUrl?.trim() || '').split('?')[0] || null : 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 the Inngest workflow, which\n * stalls when its worker does not pick the run up.\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.\n */\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 /** Inngest target; 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` Inngest target. */\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 Inngest 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/** E2B preview hosts are `3000-<sandboxId>.<domain>`; 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 const sandboxUrl = isEditTurn ? (opts.edit?.sandboxUrl?.trim() || '').split('?')[0] || null : 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 the Inngest workflow, which\n * stalls when its worker does not pick the run up.\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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"}
@@ -278,7 +278,7 @@ function useCdecliChannel(isConnected, accountId, channelId, callbacks, model, s
278
278
  cbRef.current.onError(err.message || "CDeCLI subscription error");
279
279
  }
280
280
  });
281
- const sendMessage = useCallback(async (text, chatId = "messenger", media = []) => {
281
+ const sendMessage = useCallback(async (text, chatId = "messenger", media = [], turnOptions = {}) => {
282
282
  var _a;
283
283
  if (!isConnected) return false;
284
284
  pendingRef.current = {
@@ -315,13 +315,15 @@ function useCdecliChannel(isConnected, accountId, channelId, callbacks, model, s
315
315
  text
316
316
  }, media.length > 0 ? {
317
317
  media
318
- } : {}), model || skill || timezone ? {
319
- metadata: __spreadValues(__spreadValues(__spreadValues({}, model && {
318
+ } : {}), model || skill || timezone || turnOptions.job ? {
319
+ metadata: __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, model && {
320
320
  model
321
321
  }), skill && {
322
322
  skill
323
323
  }), timezone && {
324
324
  timezone
325
+ }), turnOptions.job && {
326
+ job: turnOptions.job
325
327
  })
326
328
  } : {})
327
329
  }