@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.
- package/lib/features/attachments/displayUserMessageText.js +2 -2
- package/lib/features/attachments/displayUserMessageText.js.map +1 -1
- package/lib/features/devices/bodyComposition.js +116 -0
- package/lib/features/devices/bodyComposition.js.map +1 -0
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +22 -2
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/notion/NotionAgentPanel.js +987 -0
- package/lib/features/notion/NotionAgentPanel.js.map +1 -0
- package/lib/features/notion/NotionAskAiSheet.js +362 -0
- package/lib/features/notion/NotionAskAiSheet.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +4 -3
- package/lib/features/notion/NotionBlockView.js.map +1 -1
- package/lib/features/notion/NotionConnectionsSheet.js +47 -13
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -1
- package/lib/features/notion/NotionPageView.js +68 -8
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +1 -1
- package/lib/features/notion/NotionSidebarSections.js.map +1 -1
- package/lib/features/notion/NotionWorkspaceView.js +14 -9
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +3 -1
- package/lib/features/notion/database/DatabaseCells.js.map +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -1
- package/lib/features/notion/notionAgentRunStatus.js +2 -2
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -1
- package/lib/features/notion/notionAgentRuns.js +57 -0
- package/lib/features/notion/notionAgentRuns.js.map +1 -0
- package/lib/features/notion/notionAiContext.js +91 -0
- package/lib/features/notion/notionAiContext.js.map +1 -0
- package/lib/features/notion/notionConnections.js +42 -4
- package/lib/features/notion/notionConnections.js.map +1 -1
- package/lib/features/notion/notionDocuments.js +61 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionNotesAgent.js +173 -3
- package/lib/features/notion/notionNotesAgent.js.map +1 -1
- package/lib/features/notion/notionPageKinds.js +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +229 -97
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +33 -7
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/buildJob.js +2 -2
- package/lib/features/webbuilder/buildJob.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +18 -1
- package/lib/features/webbuilder/codeFiles.js.map +1 -1
- package/lib/features/webbuilder/components/BottomTabs.js.map +1 -1
- package/lib/features/webbuilder/components/CodeView.js +134 -56
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/Composer.js +2 -2
- package/lib/features/webbuilder/components/Composer.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewFrame.js +19 -3
- package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +310 -46
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +141 -12
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectSheets.js +792 -0
- package/lib/features/webbuilder/components/ProjectSheets.js.map +1 -0
- package/lib/features/webbuilder/components/ProjectsScreen.js +14 -2
- package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js +914 -58
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
- package/lib/features/webbuilder/components/TemplateCard.js +9 -6
- package/lib/features/webbuilder/components/TemplateCard.js.map +1 -1
- package/lib/features/webbuilder/components/TemplatesSheet.js +5 -17
- package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -1
- package/lib/features/webbuilder/connectorTemplates.js +171 -0
- package/lib/features/webbuilder/connectorTemplates.js.map +1 -0
- package/lib/features/webbuilder/fileTree.js +163 -0
- package/lib/features/webbuilder/fileTree.js.map +1 -0
- package/lib/features/webbuilder/followUps.js +67 -0
- package/lib/features/webbuilder/followUps.js.map +1 -0
- package/lib/features/webbuilder/previewProbe.js +49 -0
- package/lib/features/webbuilder/previewProbe.js.map +1 -0
- package/lib/features/webbuilder/previewRoutes.js +156 -0
- package/lib/features/webbuilder/previewRoutes.js.map +1 -0
- package/lib/features/webbuilder/projectTools.js +341 -0
- package/lib/features/webbuilder/projectTools.js.map +1 -0
- package/lib/features/webbuilder/publishTools.js +475 -0
- package/lib/features/webbuilder/publishTools.js.map +1 -0
- package/lib/features/webbuilder/sleepNotice.js +13 -0
- package/lib/features/webbuilder/sleepNotice.js.map +1 -0
- package/lib/features/webbuilder/stepLabels.js +37 -7
- package/lib/features/webbuilder/stepLabels.js.map +1 -1
- package/lib/features/webbuilder/studioCatalog.js +5 -1
- package/lib/features/webbuilder/studioCatalog.js.map +1 -1
- package/lib/features/webbuilder/templateCatalog.js +140 -0
- package/lib/features/webbuilder/templateCatalog.js.map +1 -0
- package/lib/features/webbuilder/webbuilderPrompts.js +31 -5
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/features/webbuilder/workflow.js +8 -4
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/screens/Devices/index.js +205 -3
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +9 -6
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/keepAlive.js +53 -3
- package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/unreachableRetry.js +23 -0
- package/lib/screens/WebBuilderNative/unreachableRetry.js.map +1 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js +37 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js.map +1 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +6 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +302 -40
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +2 -2
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +147 -77
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versionUndo.js","sources":["../../../src/screens/WebBuilderNative/versionUndo.ts"],"sourcesContent":["/**\n * Instant Undo / Redo (web #443, `history/undo.ts` + `versionActions.ts`): restore\n * the version before the one the files show now, straight through the sandbox\n * (`WEBBUILDER_LIST_VERSIONS` / `WEBBUILDER_RESTORE_VERSION`, via the proxy) instead\n * of an AI turn; Redo restores the version Undo left. The web's git fallback\n * (`WEBBUILDER_RUN_COMMAND`) is not ported: it needs a sandbox key the app never holds.\n */\nimport type { SandboxRun } from './webbuilderTransport';\n\nexport interface WebbuilderVersion {\n sha: string;\n message: string;\n isHead: boolean;\n}\n\nexport interface VersionList {\n versions: WebbuilderVersion[];\n head: string | null;\n dirty: boolean;\n noRepo?: boolean;\n}\n\nconst SHA_RE = /^[0-9a-f]{7,40}$/;\nconst RESTORE_SUBJECT = /^Restore to ([0-9a-f]{7,40}):/i;\nconst SAVED_BEFORE_RESTORE = /^Manual edits: saved before restore/i;\nconst TIMEOUT_MS = 120_000;\n\nfunction normalizeSha(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const v = value.trim().toLowerCase();\n return SHA_RE.test(v) ? v : null;\n}\n\nfunction actionFields(data: unknown): Record<string, unknown> {\n const rec = data && typeof data === 'object' ? (data as Record<string, unknown>) : {};\n const inner = rec.data;\n return inner && typeof inner === 'object' && !Array.isArray(inner) ? (inner as Record<string, unknown>) : rec;\n}\n\n/** `WEBBUILDER_LIST_VERSIONS` `{ versions:[{ sha, message, isHead }], head, dirty, isGitRepo }`, newest first. */\nexport function normalizeListVersionsData(input: unknown): VersionList | null {\n const data = actionFields(input);\n if (data.isGitRepo === false) return { versions: [], head: null, dirty: false, noRepo: true };\n if (!Array.isArray(data.versions)) return null;\n const head = normalizeSha(data.head);\n const versions: WebbuilderVersion[] = [];\n for (const item of data.versions) {\n const r = (item && typeof item === 'object' ? item : {}) as Record<string, unknown>;\n const sha = normalizeSha(r.sha);\n if (sha) {\n versions.push({\n sha,\n message: typeof r.message === 'string' ? r.message.split('\\n')[0].trim() : '',\n isHead: r.isHead === true || (head !== null && sha === head),\n });\n }\n }\n return { versions, head: head ?? versions.find((v) => v.isHead)?.sha ?? null, dirty: data.dirty === true };\n}\n\nfunction headIndex(list: VersionList): number {\n const i = list.versions.findIndex((v) => v.isHead || (list.head !== null && v.sha === list.head));\n if (i >= 0) return i;\n return list.versions.length ? 0 : -1;\n}\n\n/** The version whose files `index` holds: a restore commit stands for the version it restored. */\nfunction contentIndex(versions: WebbuilderVersion[], index: number): number {\n let i = index;\n for (let hops = 0; hops < versions.length; hops += 1) {\n const m = RESTORE_SUBJECT.exec(versions[i].message);\n if (!m) return i;\n const short = m[1].toLowerCase();\n const from = i;\n const next = versions.findIndex((v, j) => j > from && v.sha.startsWith(short));\n if (next < 0) return -1;\n i = next;\n }\n return -1;\n}\n\nexport interface UndoPlan {\n target: WebbuilderVersion;\n /** What Redo brings back; null when it is the uncommitted edits (known only after the restore). */\n redo: WebbuilderVersion | null;\n}\n\n/** Undo goes back one step from what the files show now, so repeated Undo keeps walking back. */\nexport function planUndo(list: VersionList | null | undefined): UndoPlan | null {\n if (!list || list.noRepo) return null;\n const h = headIndex(list);\n if (h < 0) return null;\n const head = list.versions[h];\n // Unsaved edits: going back to HEAD is the undo (the restore saves them as a version first).\n if (list.dirty) return { target: head, redo: null };\n const c = contentIndex(list.versions, h);\n if (c < 0 || c + 1 >= list.versions.length) return null;\n return { target: list.versions[c + 1], redo: list.versions[c] };\n}\n\n/** After the undo landed: the redo version, falling back to the edits the restore auto-saved. */\nexport function redoTarget(plan: UndoPlan, after: VersionList | null | undefined): WebbuilderVersion | null {\n if (plan.redo) return plan.redo;\n if (!after) return null;\n const h = headIndex(after);\n const saved = h >= 0 ? after.versions[h + 1] : undefined;\n return saved && SAVED_BEFORE_RESTORE.test(saved.message) ? saved : null;\n}\n\n/** The plain sentence of a connector error (`\"<sentence> [CODE]\\nLast output:…\"`). */\nfunction plainError(error: unknown, fallback: string): string {\n const first = String(error ?? '')\n .split('\\n')[0]\n .replace(/\\s*\\[[A-Z][A-Z0-9_]*(?:;[^\\]]*)?\\]\\s*$/, '')\n .trim();\n return first && !/^at\\s/.test(first) ? first.slice(0, 240) : fallback;\n}\n\nexport interface UndoOutcome {\n ok: boolean;\n message: string;\n /** Redo restores this. */\n redo?: WebbuilderVersion | null;\n /** Reading the history failed (an agent build can still ask the agent). */\n listFailed?: boolean;\n}\n\nasync function listVersions(run: SandboxRun, sandboxId: string): Promise<VersionList | null> {\n const r = await run('WEBBUILDER_LIST_VERSIONS', { sandbox_id: sandboxId, limit: 50 }, TIMEOUT_MS).catch(() => null);\n return r?.successful ? normalizeListVersionsData(r.data) : null;\n}\n\nasync function restore(run: SandboxRun, sandboxId: string, sha: string): Promise<string | null> {\n const r = await run('WEBBUILDER_RESTORE_VERSION', { sandbox_id: sandboxId, sha }, TIMEOUT_MS).catch(\n (err: unknown) => ({\n successful: false,\n error: err instanceof Error ? err.message : String(err),\n data: undefined as unknown,\n }),\n );\n if (!r.successful) return plainError(r.error, 'Could not restore that version.');\n const data = actionFields(r.data);\n if (data.restored === false) return 'Could not restore that version.';\n if (data.noChange === true) return 'The site already matches that version.';\n return null;\n}\n\n/** Undo the last change on this sandbox. */\nexport async function undoLastChange(run: SandboxRun, sandboxId: string): Promise<UndoOutcome> {\n const list = await listVersions(run, sandboxId);\n if (!list) return { ok: false, listFailed: true, message: \"Couldn't read this site's history.\" };\n const plan = planUndo(list);\n if (!plan) return { ok: false, message: 'There is nothing to undo yet.' };\n const failed = await restore(run, sandboxId, plan.target.sha);\n if (failed) return { ok: false, message: failed };\n const after = plan.redo ? null : await listVersions(run, sandboxId);\n return { ok: true, message: 'Undone', redo: redoTarget(plan, after) };\n}\n\n/** Bring back what Undo left. */\nexport async function redoChange(run: SandboxRun, sandboxId: string, version: WebbuilderVersion): Promise<UndoOutcome> {\n const failed = await restore(run, sandboxId, version.sha);\n return failed ? { ok: false, message: failed } : { ok: true, message: 'Redone' };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"versionUndo.js","sources":["../../../src/screens/WebBuilderNative/versionUndo.ts"],"sourcesContent":["/**\n * Instant Undo / Redo (web #443, `history/undo.ts` + `versionActions.ts`): restore\n * the version before the one the files show now, straight through the sandbox\n * (`WEBBUILDER_LIST_VERSIONS` / `WEBBUILDER_RESTORE_VERSION`, via the proxy) instead\n * of an AI turn; Redo restores the version Undo left. The web's git fallback\n * (`WEBBUILDER_RUN_COMMAND`) is not ported: it needs a sandbox key the app never holds.\n */\nimport type { SandboxRun } from './webbuilderTransport';\n\nexport interface WebbuilderVersion {\n sha: string;\n message: string;\n isHead: boolean;\n}\n\nexport interface VersionList {\n versions: WebbuilderVersion[];\n head: string | null;\n dirty: boolean;\n noRepo?: boolean;\n}\n\nconst SHA_RE = /^[0-9a-f]{7,40}$/;\nconst RESTORE_SUBJECT = /^Restore to ([0-9a-f]{7,40}):/i;\nconst SAVED_BEFORE_RESTORE = /^Manual edits: saved before restore/i;\nconst TIMEOUT_MS = 120_000;\n\nfunction normalizeSha(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const v = value.trim().toLowerCase();\n return SHA_RE.test(v) ? v : null;\n}\n\nfunction actionFields(data: unknown): Record<string, unknown> {\n const rec = data && typeof data === 'object' ? (data as Record<string, unknown>) : {};\n const inner = rec.data;\n return inner && typeof inner === 'object' && !Array.isArray(inner) ? (inner as Record<string, unknown>) : rec;\n}\n\n/** `WEBBUILDER_LIST_VERSIONS` `{ versions:[{ sha, message, isHead }], head, dirty, isGitRepo }`, newest first. */\nexport function normalizeListVersionsData(input: unknown): VersionList | null {\n const data = actionFields(input);\n if (data.isGitRepo === false) return { versions: [], head: null, dirty: false, noRepo: true };\n if (!Array.isArray(data.versions)) return null;\n const head = normalizeSha(data.head);\n const versions: WebbuilderVersion[] = [];\n for (const item of data.versions) {\n const r = (item && typeof item === 'object' ? item : {}) as Record<string, unknown>;\n const sha = normalizeSha(r.sha);\n if (sha) {\n versions.push({\n sha,\n message: typeof r.message === 'string' ? r.message.split('\\n')[0].trim() : '',\n isHead: r.isHead === true || (head !== null && sha === head),\n });\n }\n }\n return { versions, head: head ?? versions.find((v) => v.isHead)?.sha ?? null, dirty: data.dirty === true };\n}\n\nfunction headIndex(list: VersionList): number {\n const i = list.versions.findIndex((v) => v.isHead || (list.head !== null && v.sha === list.head));\n if (i >= 0) return i;\n return list.versions.length ? 0 : -1;\n}\n\n/** The version whose files `index` holds: a restore commit stands for the version it restored. */\nfunction contentIndex(versions: WebbuilderVersion[], index: number): number {\n let i = index;\n for (let hops = 0; hops < versions.length; hops += 1) {\n const m = RESTORE_SUBJECT.exec(versions[i].message);\n if (!m) return i;\n const short = m[1].toLowerCase();\n const from = i;\n const next = versions.findIndex((v, j) => j > from && v.sha.startsWith(short));\n if (next < 0) return -1;\n i = next;\n }\n return -1;\n}\n\nexport interface UndoPlan {\n target: WebbuilderVersion;\n /** What Redo brings back; null when it is the uncommitted edits (known only after the restore). */\n redo: WebbuilderVersion | null;\n}\n\n/** Undo goes back one step from what the files show now, so repeated Undo keeps walking back. */\nexport function planUndo(list: VersionList | null | undefined): UndoPlan | null {\n if (!list || list.noRepo) return null;\n const h = headIndex(list);\n if (h < 0) return null;\n const head = list.versions[h];\n // Unsaved edits: going back to HEAD is the undo (the restore saves them as a version first).\n if (list.dirty) return { target: head, redo: null };\n const c = contentIndex(list.versions, h);\n if (c < 0 || c + 1 >= list.versions.length) return null;\n return { target: list.versions[c + 1], redo: list.versions[c] };\n}\n\n/** After the undo landed: the redo version, falling back to the edits the restore auto-saved. */\nexport function redoTarget(plan: UndoPlan, after: VersionList | null | undefined): WebbuilderVersion | null {\n if (plan.redo) return plan.redo;\n if (!after) return null;\n const h = headIndex(after);\n const saved = h >= 0 ? after.versions[h + 1] : undefined;\n return saved && SAVED_BEFORE_RESTORE.test(saved.message) ? saved : null;\n}\n\n/** The plain sentence of a connector error (`\"<sentence> [CODE]\\nLast output:…\"`). */\nfunction plainError(error: unknown, fallback: string): string {\n const first = String(error ?? '')\n .split('\\n')[0]\n .replace(/\\s*\\[[A-Z][A-Z0-9_]*(?:;[^\\]]*)?\\]\\s*$/, '')\n // Notes the connector writes for the AI are not for people (web #359f5a2a).\n .replace(/[;,]?\\s*the user (?:cannot|can't|can not) fix this\\.?/i, '.')\n .replace(/\\.\\.$/, '.')\n .trim();\n return first && !/^at\\s/.test(first) ? first.slice(0, 240) : fallback;\n}\n\nexport interface UndoOutcome {\n ok: boolean;\n message: string;\n /** Redo restores this. */\n redo?: WebbuilderVersion | null;\n /** Reading the history failed (an agent build can still ask the agent). */\n listFailed?: boolean;\n}\n\nasync function listVersions(run: SandboxRun, sandboxId: string): Promise<VersionList | null> {\n const r = await run('WEBBUILDER_LIST_VERSIONS', { sandbox_id: sandboxId, limit: 50 }, TIMEOUT_MS).catch(() => null);\n return r?.successful ? normalizeListVersionsData(r.data) : null;\n}\n\nasync function restore(run: SandboxRun, sandboxId: string, sha: string): Promise<string | null> {\n const r = await run('WEBBUILDER_RESTORE_VERSION', { sandbox_id: sandboxId, sha }, TIMEOUT_MS).catch(\n (err: unknown) => ({\n successful: false,\n error: err instanceof Error ? err.message : String(err),\n data: undefined as unknown,\n }),\n );\n if (!r.successful) return plainError(r.error, 'Could not restore that version.');\n const data = actionFields(r.data);\n if (data.restored === false) return 'Could not restore that version.';\n if (data.noChange === true) return 'The site already matches that version.';\n return null;\n}\n\n/** Undo the last change on this sandbox. */\nexport async function undoLastChange(run: SandboxRun, sandboxId: string): Promise<UndoOutcome> {\n const list = await listVersions(run, sandboxId);\n if (!list) return { ok: false, listFailed: true, message: \"Couldn't read this site's history.\" };\n const plan = planUndo(list);\n if (!plan) return { ok: false, message: 'There is nothing to undo yet.' };\n const failed = await restore(run, sandboxId, plan.target.sha);\n if (failed) return { ok: false, message: failed };\n const after = plan.redo ? null : await listVersions(run, sandboxId);\n return { ok: true, message: 'Undone', redo: redoTarget(plan, after) };\n}\n\n/** Bring back what Undo left. */\nexport async function redoChange(run: SandboxRun, sandboxId: string, version: WebbuilderVersion): Promise<UndoOutcome> {\n const failed = await restore(run, sandboxId, version.sha);\n return failed ? { ok: false, message: failed } : { ok: true, message: 'Redone' };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {createRemoteUploadMedia,createRemoteConnectorExec}from'../../features/canvas/videoEditor/remoteMediaClient.js';import {WEBBUILDER_CONNECTOR_ID,WEBBUILDER_TRIGGER_WORKFLOW_ACTION}from'../../features/webbuilder/workflow.js';import {publicSandboxDomain}from'../../features/webbuilder/publicSandboxDomain.js';import {sandboxPreviewUrlFor,withPublicSandboxHosts}from'../../features/webbuilder/sandboxPublicHost.js';import {WEBBUILDER_EXTEND_ACTION,KEEPALIVE_EXTEND_MS
|
|
1
|
+
import {createRemoteUploadMedia,createRemoteConnectorExec}from'../../features/canvas/videoEditor/remoteMediaClient.js';import {WEBBUILDER_CONNECTOR_ID,WEBBUILDER_TRIGGER_WORKFLOW_ACTION}from'../../features/webbuilder/workflow.js';import {publicSandboxDomain}from'../../features/webbuilder/publicSandboxDomain.js';import {sandboxPreviewUrlFor,withPublicSandboxHosts}from'../../features/webbuilder/sandboxPublicHost.js';import {WEBBUILDER_EXTEND_ACTION,extendOutcome,savedCopyFrom,isSandboxGoneResult,SANDBOX_GONE_RE,KEEPALIVE_EXTEND_MS}from'./keepAlive.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;
|
|
@@ -103,13 +103,14 @@ async function uploadAttachment(token, indexUrl, file) {
|
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
const PREVIEW_START_WORKDIRS = ["/home/yantra/repo", "/home/user/repo", "/home/yantra", "/home/user"];
|
|
106
|
-
const SANDBOX_GONE_RE = /Sandbox Not Found|Paused sandbox .+ not found|sandbox \S+ not found|sandbox .*wasn'?t found|not found \(404\)|no sandbox found|does not exist|sandbox.*expired|sandbox.*killed|probably not running anymore|not running anymore|cannot be resumed|was (?:killed|deleted|destroyed)/i;
|
|
107
106
|
const LIVE_PREVIEW_RE = /^https?:\/\/\d+-[a-z0-9]+[^\s"']*/i;
|
|
108
107
|
const RESUME_TIMEOUT_MS = 3 * 60 * 1e3;
|
|
109
108
|
const CREATE_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
110
109
|
const SANDBOX_BOUND = /* @__PURE__ */ new Set([
|
|
111
110
|
"WEBBUILDER_EXTEND",
|
|
112
111
|
"WEBBUILDER_CONNECT",
|
|
112
|
+
// A private sandbox answers STATUS only with its key, which the proxy adds.
|
|
113
|
+
"WEBBUILDER_STATUS",
|
|
113
114
|
"WEBBUILDER_START",
|
|
114
115
|
"WEBBUILDER_LIST_VERSIONS",
|
|
115
116
|
"WEBBUILDER_CREATE_SANDBOX",
|
|
@@ -169,6 +170,10 @@ function proxyResult(raw) {
|
|
|
169
170
|
error
|
|
170
171
|
} : {});
|
|
171
172
|
}
|
|
173
|
+
function isNoProjectRefusal(error) {
|
|
174
|
+
return /^Project not found\.?$/i.test(String(error != null ? error : "").trim());
|
|
175
|
+
}
|
|
176
|
+
const directChannels = /* @__PURE__ */ new Set();
|
|
172
177
|
function createSandboxRouter(deps) {
|
|
173
178
|
var _a;
|
|
174
179
|
const channelId = String((_a = deps.channelId) != null ? _a : "").trim();
|
|
@@ -176,24 +181,36 @@ function createSandboxRouter(deps) {
|
|
|
176
181
|
proxyMissing
|
|
177
182
|
} = deps;
|
|
178
183
|
return async (action, rawParams, timeoutMs) => {
|
|
179
|
-
var _a2,
|
|
184
|
+
var _a2, _c;
|
|
180
185
|
const params = withoutKey(rawParams);
|
|
181
186
|
const sandboxId = String((_a2 = params.sandbox_id) != null ? _a2 : "").trim();
|
|
182
187
|
const isCreate = action === "WEBBUILDER_CREATE_SANDBOX";
|
|
183
|
-
const
|
|
184
|
-
|
|
188
|
+
const _b = params, {
|
|
189
|
+
restoreFromBackup: _proxyOnly
|
|
190
|
+
} = _b, directParams = __objRest(_b, [
|
|
191
|
+
"restoreFromBackup"
|
|
192
|
+
]);
|
|
193
|
+
const proxied = deps.proxy && !proxyMissing.current && channelId && !directChannels.has(channelId) && SANDBOX_BOUND.has(action) && (sandboxId || isCreate);
|
|
194
|
+
if (!proxied || !deps.proxy) return deps.direct(action, directParams, timeoutMs);
|
|
185
195
|
const answer = await deps.proxy({
|
|
186
196
|
channelId,
|
|
187
197
|
sandboxId,
|
|
188
198
|
action,
|
|
189
199
|
params
|
|
190
200
|
}, timeoutMs);
|
|
191
|
-
if (!answer.outdated)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
201
|
+
if (!answer.outdated) {
|
|
202
|
+
const result = (_c = answer.result) != null ? _c : {
|
|
203
|
+
successful: false,
|
|
204
|
+
error: "The server sent an empty answer."
|
|
205
|
+
};
|
|
206
|
+
if (!result.successful && isNoProjectRefusal(result.error)) {
|
|
207
|
+
directChannels.add(channelId);
|
|
208
|
+
return deps.direct(action, directParams, timeoutMs);
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
195
212
|
proxyMissing.current = true;
|
|
196
|
-
return deps.direct(action,
|
|
213
|
+
return deps.direct(action, directParams, timeoutMs);
|
|
197
214
|
};
|
|
198
215
|
}
|
|
199
216
|
function directSandboxRun(token, indexUrl) {
|
|
@@ -239,101 +256,154 @@ async function waitForPreview(url, withinMs = 2e4) {
|
|
|
239
256
|
}
|
|
240
257
|
return false;
|
|
241
258
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
259
|
+
const blobOf = (result) => JSON.stringify(result);
|
|
260
|
+
async function runAction(call, action, params, timeoutMs) {
|
|
261
|
+
var _a;
|
|
262
|
+
try {
|
|
263
|
+
const result = await call(action, params, timeoutMs);
|
|
264
|
+
return {
|
|
265
|
+
ok: result.successful !== false,
|
|
266
|
+
gone: isSandboxGoneResult(result) || !result.successful && SANDBOX_GONE_RE.test(blobOf(result)) && !/sandbox is private/i.test(blobOf(result)),
|
|
267
|
+
blob: JSON.stringify(result),
|
|
268
|
+
error: (_a = result.error) != null ? _a : "",
|
|
269
|
+
data: connectorData(result),
|
|
270
|
+
savedCopy: savedCopyFrom(result)
|
|
271
|
+
};
|
|
272
|
+
} catch (err) {
|
|
273
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
274
|
+
const failed = {
|
|
275
|
+
successful: false,
|
|
276
|
+
error: message
|
|
277
|
+
};
|
|
278
|
+
return {
|
|
279
|
+
ok: false,
|
|
280
|
+
gone: isSandboxGoneResult(failed),
|
|
281
|
+
blob: message,
|
|
282
|
+
error: message,
|
|
283
|
+
data: {},
|
|
284
|
+
savedCopy: savedCopyFrom(failed)
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const builderFor = (templateId) => /next/i.test(templateId != null ? templateId : "") ? "next" : "vite";
|
|
289
|
+
async function connectAndStart(call, sandboxId, builder, savedCopyParams = {}) {
|
|
290
|
+
const connected = await runAction(call, "WEBBUILDER_CONNECT", __spreadValues({
|
|
291
|
+
sandbox_id: sandboxId,
|
|
292
|
+
autoResume: true,
|
|
293
|
+
builder
|
|
294
|
+
}, savedCopyParams), RESUME_TIMEOUT_MS);
|
|
295
|
+
if (connected.gone) return {
|
|
296
|
+
outcome: "gone",
|
|
297
|
+
url: null,
|
|
298
|
+
savedCopy: connected.savedCopy
|
|
263
299
|
};
|
|
264
|
-
const
|
|
265
|
-
const
|
|
266
|
-
const
|
|
300
|
+
const seen = livePreviewUrl(connected.data);
|
|
301
|
+
for (const workDir of PREVIEW_START_WORKDIRS) {
|
|
302
|
+
const started = await runAction(call, "WEBBUILDER_START", {
|
|
267
303
|
sandbox_id: sandboxId,
|
|
268
|
-
|
|
304
|
+
workDir,
|
|
269
305
|
builder
|
|
270
|
-
});
|
|
271
|
-
if (
|
|
306
|
+
}, RESUME_TIMEOUT_MS);
|
|
307
|
+
if (started.gone) return {
|
|
272
308
|
outcome: "gone",
|
|
273
|
-
url: null
|
|
309
|
+
url: null,
|
|
310
|
+
savedCopy: started.savedCopy
|
|
274
311
|
};
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
workDir,
|
|
280
|
-
builder
|
|
281
|
-
});
|
|
282
|
-
if (started.gone) return {
|
|
283
|
-
outcome: "gone",
|
|
284
|
-
url: null
|
|
285
|
-
};
|
|
286
|
-
if (started.ok) return {
|
|
287
|
-
outcome: "ok",
|
|
288
|
-
url: livePreviewUrl(started.data) || seen
|
|
289
|
-
};
|
|
290
|
-
if (!/no package\.json/i.test(started.blob)) break;
|
|
291
|
-
}
|
|
292
|
-
return {
|
|
293
|
-
outcome: connected.ok ? "ok" : "failed",
|
|
294
|
-
url: seen
|
|
312
|
+
if (started.ok) return {
|
|
313
|
+
outcome: "ok",
|
|
314
|
+
url: livePreviewUrl(started.data) || seen,
|
|
315
|
+
savedCopy: null
|
|
295
316
|
};
|
|
317
|
+
if (!/no package\.json/i.test(started.blob)) break;
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
outcome: connected.ok ? "ok" : "failed",
|
|
321
|
+
url: seen,
|
|
322
|
+
savedCopy: null
|
|
296
323
|
};
|
|
297
|
-
|
|
324
|
+
}
|
|
325
|
+
const EXTEND_OPEN_TIMEOUT_MS = 3e4;
|
|
326
|
+
const EXTEND_ASKED_TIMEOUT_MS = 9e4;
|
|
327
|
+
async function wakeSandbox(call, target, probe = waitForPreview) {
|
|
328
|
+
var _a, _b;
|
|
329
|
+
const builder = builderFor(target.templateId);
|
|
330
|
+
const savedCopyParams = __spreadValues(__spreadValues({}, String((_a = target.snapshotId) != null ? _a : "").trim() ? {
|
|
331
|
+
snapshotId: String(target.snapshotId).trim()
|
|
332
|
+
} : {}), String((_b = target.backupRepo) != null ? _b : "").trim() ? {
|
|
333
|
+
backupRepo: String(target.backupRepo).trim()
|
|
334
|
+
} : {});
|
|
335
|
+
const extended = await call(WEBBUILDER_EXTEND_ACTION, __spreadValues({
|
|
298
336
|
sandbox_id: target.sandboxId,
|
|
299
337
|
timeoutMs: KEEPALIVE_EXTEND_MS
|
|
300
|
-
},
|
|
338
|
+
}, savedCopyParams), target.asked ? EXTEND_ASKED_TIMEOUT_MS : EXTEND_OPEN_TIMEOUT_MS).catch((err) => ({
|
|
301
339
|
successful: false,
|
|
302
340
|
error: err instanceof Error ? err.message : String(err)
|
|
303
341
|
}));
|
|
304
342
|
const extendState = extendOutcome(extended);
|
|
305
343
|
const domain = publicSandboxDomain();
|
|
306
344
|
const previewUrl = target.previewUrl || sandboxPreviewUrlFor(target.sandboxId, domain);
|
|
307
|
-
if (
|
|
308
|
-
|
|
345
|
+
if (extendState === "resumed" || extendState === "alive") {
|
|
346
|
+
const extendedUrl = livePreviewUrl(connectorData(extended));
|
|
347
|
+
const url = extendedUrl ? withPublicSandboxHosts(extendedUrl, domain) || previewUrl : previewUrl;
|
|
348
|
+
if (await probe(url)) return __spreadValues({
|
|
349
|
+
outcome: "ok"
|
|
350
|
+
}, url !== previewUrl ? {
|
|
351
|
+
previewUrl: url
|
|
352
|
+
} : {});
|
|
353
|
+
}
|
|
354
|
+
if (extendState === "gone") return {
|
|
355
|
+
outcome: "gone",
|
|
356
|
+
savedCopy: savedCopyFrom(extended)
|
|
357
|
+
};
|
|
358
|
+
const woken = await connectAndStart(call, target.sandboxId, builder, savedCopyParams);
|
|
359
|
+
if (woken.outcome === "gone") return {
|
|
360
|
+
outcome: "gone",
|
|
361
|
+
savedCopy: woken.savedCopy
|
|
309
362
|
};
|
|
310
|
-
|
|
311
|
-
outcome:
|
|
312
|
-
} : await wake(target.sandboxId);
|
|
313
|
-
if (first.outcome !== "gone") return {
|
|
314
|
-
outcome: first.outcome
|
|
363
|
+
return {
|
|
364
|
+
outcome: woken.outcome
|
|
315
365
|
};
|
|
316
|
-
|
|
366
|
+
}
|
|
367
|
+
function restoreReasonText(raw) {
|
|
368
|
+
const lines = String(raw || "").split("\n").map((l) => l.replace(/^\s*(?:Error:\s*)?exit status \d+:\s*/i, "").replace(/^\s*Error:\s*/i, "").replace(/\s*\[[A-Z][A-Z0-9_]*(?:;[^\]]*)?\]\s*$/, "").replace(/[;,]?\s*the user (?:cannot|can't|can not) fix this\.?/i, ".").replace(/\.\.$/, ".").replace(/\s+/g, " ").trim()).filter(Boolean);
|
|
369
|
+
const first = lines[0] || "";
|
|
370
|
+
if (!first) return "The saved copy could not be opened.";
|
|
371
|
+
if (/not one of yours and was not shared/i.test(first) || /SNAPSHOT_OWNER_UNKNOWN/.test(String(raw))) {
|
|
372
|
+
return "This saved copy isn't linked to your account yet, so it can't be reopened here.";
|
|
373
|
+
}
|
|
374
|
+
if (/^at\s/.test(first)) return "The saved copy could not be opened.";
|
|
375
|
+
const text = first.length > 220 ? `${first.slice(0, 219)}\u2026` : first;
|
|
376
|
+
return /[.!?…]$/.test(text) ? text : `${text}.`;
|
|
377
|
+
}
|
|
378
|
+
async function restoreFromSavedCopy(call, target) {
|
|
379
|
+
var _a, _b;
|
|
380
|
+
const snapshotId = String((_a = target.snapshotId) != null ? _a : "").trim();
|
|
317
381
|
if (!snapshotId) return {
|
|
318
|
-
outcome: "
|
|
382
|
+
outcome: "failed",
|
|
383
|
+
reason: "This build has no restore point the app can open."
|
|
319
384
|
};
|
|
320
|
-
const
|
|
385
|
+
const builder = builderFor(target.templateId);
|
|
386
|
+
const domain = publicSandboxDomain();
|
|
387
|
+
const created = await runAction(call, "WEBBUILDER_CREATE_SANDBOX", {
|
|
321
388
|
snapshotId,
|
|
389
|
+
sourceSandboxId: target.sandboxId,
|
|
322
390
|
builder,
|
|
323
391
|
waitBridge: false
|
|
324
392
|
}, CREATE_TIMEOUT_MS);
|
|
325
393
|
const createdUrl = livePreviewUrl(created.data);
|
|
326
|
-
const nextId = String(created.data.sandboxId || created.data.sandbox_id || created.data.id || "").trim() || ((
|
|
394
|
+
const nextId = String(created.data.sandboxId || created.data.sandbox_id || created.data.id || "").trim() || ((_b = /^https?:\/\/\d+-([a-z0-9]+)/i.exec(createdUrl != null ? createdUrl : "")) == null ? void 0 : _b[1]) || "";
|
|
327
395
|
if (!created.ok || !nextId) return {
|
|
328
|
-
outcome: "
|
|
396
|
+
outcome: "failed",
|
|
397
|
+
reason: restoreReasonText(created.error || created.blob)
|
|
329
398
|
};
|
|
330
|
-
const
|
|
331
|
-
if (
|
|
332
|
-
outcome: "failed"
|
|
399
|
+
const started = await connectAndStart(call, nextId, builder);
|
|
400
|
+
if (started.outcome !== "ok") return {
|
|
401
|
+
outcome: "failed",
|
|
402
|
+
reason: "The restored copy did not start."
|
|
333
403
|
};
|
|
334
404
|
return {
|
|
335
405
|
outcome: "ok",
|
|
336
406
|
sandboxId: nextId,
|
|
337
|
-
previewUrl: withPublicSandboxHosts(
|
|
407
|
+
previewUrl: withPublicSandboxHosts(started.url || createdUrl || "", domain) || sandboxPreviewUrlFor(nextId, domain)
|
|
338
408
|
};
|
|
339
|
-
}export{DOWNLOAD_LINK_ACTION,OUTDATED_SERVER_RE,PUBLIC_URL_ACTION,STORAGE_CONNECTOR_ID,createSandboxRouter,directSandboxRun,proxyResult,resolveFetchableUrl,
|
|
409
|
+
}export{DOWNLOAD_LINK_ACTION,OUTDATED_SERVER_RE,PUBLIC_URL_ACTION,STORAGE_CONNECTOR_ID,createSandboxRouter,directChannels,directSandboxRun,isNoProjectRefusal,proxyResult,resolveFetchableUrl,restoreFromSavedCopy,restoreReasonText,triggerBuild,uploadAttachment,waitForPreview,wakeSandbox};//# sourceMappingURL=webbuilderTransport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webbuilderTransport.js","sources":["../../../src/screens/WebBuilderNative/webbuilderTransport.ts"],"sourcesContent":["/**\n * The calls the native Web Builder makes the way the web surface makes them: the\n * build workflow trigger on cdecli-agent and turn attachments, both on the app's\n * surface session - the same JWT the web surface holds as its cdecli token.\n */\nimport {\n createRemoteConnectorExec,\n createRemoteUploadMedia,\n} from '../../features/canvas/videoEditor/remoteMediaClient';\nimport { WEBBUILDER_CONNECTOR_ID, WEBBUILDER_TRIGGER_WORKFLOW_ACTION } from '../../features/webbuilder/workflow';\nimport { publicSandboxDomain } from '../../features/webbuilder/publicSandboxDomain';\nimport { sandboxPreviewUrlFor, withPublicSandboxHosts } from '../../features/webbuilder/sandboxPublicHost';\nimport { KEEPALIVE_EXTEND_MS, WEBBUILDER_EXTEND_ACTION, extendOutcome } from './keepAlive';\n\n/** The trigger answers in seconds; the build itself runs on and reports on the chat. */\nconst TRIGGER_TIMEOUT_MS = 90_000;\n\n/** `error` and `auth` (the agent refused the session) are set when `ok` is false. */\nexport interface TriggerOutcome {\n ok: boolean;\n error?: string;\n auth?: boolean;\n}\n\n/** Runs `yantra-webbuilder/WEBBUILDER_TRIGGER_WORKFLOW` with the web's params. */\nexport async function triggerBuild(\n token: string,\n indexUrl: string,\n params: Record<string, unknown>,\n): Promise<TriggerOutcome> {\n try {\n const result = await createRemoteConnectorExec(token, indexUrl)(\n WEBBUILDER_CONNECTOR_ID,\n WEBBUILDER_TRIGGER_WORKFLOW_ACTION,\n params,\n { timeoutMs: TRIGGER_TIMEOUT_MS },\n );\n if (result.successful === false) {\n const error = String(result.error ?? 'The build did not start.');\n return { ok: false, error, auth: /\\b401\\b|unauthori[sz]ed/i.test(error) };\n }\n return { ok: true };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n return { ok: false, error, auth: /\\b401\\b|unauthori[sz]ed/i.test(error) };\n }\n}\n\nexport const STORAGE_CONNECTOR_ID = 'yantra-storage';\nexport const PUBLIC_URL_ACTION = 'YANTRA_STORAGE_GET_PUBLIC_URL';\nexport const DOWNLOAD_LINK_ACTION = 'YANTRA_STORAGE_CREATE_DOWNLOAD_LINK';\n/** SigV4 presigned URLs cap at 7 days. */\nconst DOWNLOAD_LINK_EXPIRES_SEC = 7 * 24 * 60 * 60;\nconst RESOLVE_TIMEOUT_MS = 30_000;\n\nfunction httpsLinkFrom(data: unknown, key: 'publicUrl' | 'downloadUrl'): string | null {\n const rec = (data && typeof data === 'object' ? data : {}) as Record<string, unknown>;\n const inner = (rec.data && typeof rec.data === 'object' ? rec.data : rec) as Record<string, unknown>;\n const url = inner[key];\n return typeof url === 'string' && /^https:\\/\\//i.test(url.trim()) ? url.trim() : null;\n}\n\n/**\n * An uploaded object is private: its CDN link, else a 7-day signed link; null when\n * neither resolves (web `chat/uploadAttachments.resolveFetchableUrl`, #459).\n */\nexport async function resolveFetchableUrl(\n exec: (\n connector: string,\n action: string,\n params: Record<string, unknown>,\n options?: { timeoutMs?: number },\n ) => Promise<Record<string, unknown>>,\n objectUrl: string,\n): Promise<string | null> {\n const attempt = async (action: string, params: Record<string, unknown>, key: 'publicUrl' | 'downloadUrl') => {\n const r = await exec(STORAGE_CONNECTOR_ID, action, params, { timeoutMs: RESOLVE_TIMEOUT_MS }).catch(() => null);\n return r && r.successful !== false ? httpsLinkFrom(r.data, key) : null;\n };\n const cdn = await attempt(PUBLIC_URL_ACTION, { s3KeyOrUrl: objectUrl }, 'publicUrl');\n if (cdn) return cdn;\n return attempt(\n DOWNLOAD_LINK_ACTION,\n { s3KeyOrUrl: objectUrl, expiresIn: DOWNLOAD_LINK_EXPIRES_SEC },\n 'downloadUrl',\n );\n}\n\n/** A photo or file for the turn as a URL the workflow can fetch (the web posts URLs, never base64). */\nexport async function uploadAttachment(\n token: string,\n indexUrl: string,\n file: { url?: string; dataUrl?: string; name: string; mimeType?: string },\n): Promise<{ name: string; url: string; mimeType?: string } | null> {\n if (file.url && /^https?:\\/\\//i.test(file.url)) return { name: file.name, url: file.url, mimeType: file.mimeType };\n const local = file.url || file.dataUrl;\n if (!local) return null;\n try {\n const objectUrl = await createRemoteUploadMedia(token, indexUrl)(local);\n // The object URL answers 403 publicly, so the agent could not fetch it (web #459).\n const url = (await resolveFetchableUrl(createRemoteConnectorExec(token, indexUrl), objectUrl)) ?? objectUrl;\n return { name: file.name, url, mimeType: file.mimeType };\n } catch (err) {\n console.warn('[WebBuilderNative] attachment upload failed:', err);\n return null;\n }\n}\n\n/** The folders a build's project may live in (web `PREVIEW_START_WORKDIRS`). */\nconst PREVIEW_START_WORKDIRS = ['/home/yantra/repo', '/home/user/repo', '/home/yantra', '/home/user'];\n/** The sandbox was reclaimed, not paused (web `SANDBOX_GONE_RE`). */\nconst SANDBOX_GONE_RE =\n /Sandbox Not Found|Paused sandbox .+ not found|sandbox \\S+ not found|sandbox .*wasn'?t found|not found \\(404\\)|no sandbox found|does not exist|sandbox.*expired|sandbox.*killed|probably not running anymore|not running anymore|cannot be resumed|was (?:killed|deleted|destroyed)/i;\nconst LIVE_PREVIEW_RE = /^https?:\\/\\/\\d+-[a-z0-9]+[^\\s\"']*/i;\nconst RESUME_TIMEOUT_MS = 3 * 60 * 1000;\n/** Booting a restore point into a new VM takes longer (web: 10 min for CREATE). */\nconst CREATE_TIMEOUT_MS = 10 * 60 * 1000;\n\nexport type ResumeOutcome = 'ok' | 'gone' | 'failed';\n\n/**\n * What bringing a preview back did; `sandboxId`/`previewUrl` are set when a new sandbox\n * replaced it. The preview is on the platform's sandbox domain when one is set (it is saved).\n */\nexport interface RestoreResult {\n outcome: ResumeOutcome;\n sandboxId?: string;\n previewUrl?: string;\n}\n\n/** One connector call's answer, the same on both paths: `{ successful, data, error }`. */\nexport interface SandboxCallResult {\n successful: boolean;\n data?: unknown;\n error?: string;\n}\n\n/** `outdated`: this server has no proxy field; otherwise `result` is the connector's answer. */\nexport interface SandboxProxyAnswer {\n outdated: boolean;\n result?: SandboxCallResult;\n}\n\n/**\n * The guarded proxy `aiCodeSandboxAction(channelId, sandboxId, action, params)`:\n * the server checks the caller's role and that the sandbox belongs to the\n * channel, then adds the sandbox key from the channel's settings (an agent\n * build's key included). `outdated` = this server has no such field.\n */\nexport type SandboxProxyCall = (\n variables: { channelId: string; sandboxId: string; action: string; params: Record<string, unknown> },\n timeoutMs: number,\n) => Promise<SandboxProxyAnswer>;\n\nexport type SandboxRun = (\n action: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n) => Promise<SandboxCallResult>;\n\n/** Connector actions the proxy allows (web `sandboxProxy.SANDBOX_BOUND`); the rest go direct. */\nconst SANDBOX_BOUND = new Set([\n 'WEBBUILDER_EXTEND',\n 'WEBBUILDER_CONNECT',\n 'WEBBUILDER_START',\n 'WEBBUILDER_LIST_VERSIONS',\n 'WEBBUILDER_CREATE_SANDBOX',\n 'WEBBUILDER_READ_FILE',\n 'WEBBUILDER_WRITE_FILES',\n 'WEBBUILDER_RUN_COMMAND',\n 'WEBBUILDER_SNAPSHOT',\n 'WEBBUILDER_RESTORE_VERSION',\n 'WEBBUILDER_BOOKMARK_VERSION',\n 'WEBBUILDER_UPLOAD_ASSET',\n 'WEBBUILDER_RELOAD_GITHUB',\n 'WEBBUILDER_CLONE',\n // Editor+ on the server; an older server refuses them and callers fall back.\n 'WEBBUILDER_EXPORT_ZIP',\n 'WEBBUILDER_LIST_FILES',\n 'WEBBUILDER_FINISH',\n 'WEBBUILDER_DEPLOY_FLY',\n 'WEBBUILDER_DEPLOY_VERCEL',\n 'WEBBUILDER_DEPLOY_NETLIFY',\n // The server picks the repo and attaches the caller's own GitHub credential.\n 'WEBBUILDER_PUSH_GITHUB',\n 'WEBBUILDER_PULL_GITHUB',\n]);\n\n/** A server without the proxy (web `isOutdatedServerError`). */\nexport const OUTDATED_SERVER_RE =\n /Cannot query field|Unknown argument|Unknown type|is not defined by type|Cannot return null for non-nullable field Query\\.aiCode/i;\n\nfunction withoutKey(rec: Record<string, unknown>): Record<string, unknown> {\n const { sandboxKey: _key, sandbox_key: _key2, ...rest } = rec;\n return rest;\n}\n\n/** The proxy's JSON answer as a connector result, with any key dropped (web `proxyResult`). */\nexport function proxyResult(raw: unknown): SandboxCallResult {\n let value = raw;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n value = null;\n }\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { successful: false, error: 'The server sent an empty answer.' };\n }\n const rec = value as Record<string, unknown>;\n const data =\n rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? withoutKey(rec.data as Record<string, unknown>)\n : rec.data;\n const error = typeof rec.error === 'string' && rec.error ? rec.error : undefined;\n return { successful: rec.successful === true, data, ...(error ? { error } : {}) };\n}\n\n/**\n * Every sandbox call for one site, the web's `createSandboxRouter`: through the\n * proxy when the server has it (the app never holds a sandbox key), else straight\n * to cdecli-agent. A server found without the proxy stays direct for the session.\n */\nexport function createSandboxRouter(deps: {\n channelId: string | null | undefined;\n proxy: SandboxProxyCall | null;\n direct: SandboxRun;\n proxyMissing: { current: boolean };\n}): SandboxRun {\n const channelId = String(deps.channelId ?? '').trim();\n const { proxyMissing } = deps;\n return async (action, rawParams, timeoutMs) => {\n const params = withoutKey(rawParams);\n const sandboxId = String(params.sandbox_id ?? '').trim();\n const isCreate = action === 'WEBBUILDER_CREATE_SANDBOX';\n const proxied =\n deps.proxy && !proxyMissing.current && channelId && SANDBOX_BOUND.has(action) && (sandboxId || isCreate);\n if (!proxied || !deps.proxy) return deps.direct(action, params, timeoutMs);\n const answer = await deps.proxy({ channelId, sandboxId, action, params }, timeoutMs);\n if (!answer.outdated) return answer.result ?? { successful: false, error: 'The server sent an empty answer.' };\n proxyMissing.current = true;\n return deps.direct(action, params, timeoutMs);\n };\n}\n\n/** The direct path: `yantra-webbuilder` on cdecli-agent with the surface session. */\nexport function directSandboxRun(token: string, indexUrl: string): SandboxRun {\n const exec = createRemoteConnectorExec(token, indexUrl);\n return async (action, params, timeoutMs) => {\n const result = await exec(WEBBUILDER_CONNECTOR_ID, action, params, { timeoutMs });\n return {\n successful: result.successful !== false,\n data: result.data,\n ...(typeof result.error === 'string' ? { error: result.error } : {}),\n };\n };\n}\n\n/** The connector's own output (web `connectorData`: the result's `data`, or `data.data`). */\nfunction connectorData(result: unknown): Record<string, unknown> {\n const raw = (result as { data?: unknown } | null)?.data;\n if (!raw || typeof raw !== 'object') return {};\n const rec = raw as Record<string, unknown>;\n return rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? (rec.data as Record<string, unknown>)\n : rec;\n}\n\nfunction livePreviewUrl(data: Record<string, unknown>): string | null {\n for (const value of [data.previewUrl, data.preview_url, data.sandboxUrl, data.sandbox_url, data.url]) {\n const match = typeof value === 'string' ? LIVE_PREVIEW_RE.exec(value.trim()) : null;\n if (match) return match[0];\n }\n return null;\n}\n\n/** The preview's dev server answers (not a 5xx \"Sandbox not found\" / \"Closed Port\" page), within `withinMs`. */\nexport async function waitForPreview(url: string, withinMs = 20_000): Promise<boolean> {\n const until = Date.now() + withinMs;\n while (Date.now() < until) {\n try {\n // eslint-disable-next-line no-await-in-loop -- one probe at a time\n const res = await fetch(url, { method: 'GET' });\n if (res.status < 500) return true;\n } catch {\n // not answering yet\n }\n // eslint-disable-next-line no-await-in-loop\n await new Promise((resolve) => {\n setTimeout(resolve, 2_000);\n });\n }\n return false;\n}\n\n/**\n * Brings a sleeping or expired preview back without the agent, in the web's\n * `ensurePreview` order: resume the sandbox (`WEBBUILDER_CONNECT` with\n * `autoResume`) and start its dev server (`WEBBUILDER_START`) in the folder the\n * project lives in; when E2B reclaimed it, boot the build's restore point into a\n * new sandbox (`WEBBUILDER_CREATE_SANDBOX` from `snapshotId`) and start that.\n * `gone` means it is reclaimed and there is no restore point to boot.\n */\nexport async function restoreSandbox(\n call: SandboxRun,\n target: {\n sandboxId: string;\n snapshotId?: string | null;\n templateId?: string | null;\n /** The build's preview, checked after EXTEND resumes the sandbox. */\n previewUrl?: string | null;\n },\n probe: (url: string) => Promise<boolean> = waitForPreview,\n): Promise<RestoreResult> {\n const run = async (action: string, params: Record<string, unknown>, timeoutMs = RESUME_TIMEOUT_MS) => {\n try {\n const result = await call(action, params, timeoutMs);\n const blob = JSON.stringify(result);\n return {\n ok: result.successful !== false,\n gone: SANDBOX_GONE_RE.test(blob),\n blob,\n data: connectorData(result),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { ok: false, gone: SANDBOX_GONE_RE.test(message), blob: message, data: {} };\n }\n };\n const builder = /next/i.test(target.templateId ?? '') ? 'next' : 'vite';\n /** CONNECT then START across the workdirs; the URL is the one START (or CONNECT) reports. */\n const wake = async (sandboxId: string): Promise<{ outcome: ResumeOutcome; url: string | null }> => {\n const connected = await run('WEBBUILDER_CONNECT', { sandbox_id: sandboxId, autoResume: true, builder });\n if (connected.gone) return { outcome: 'gone', url: null };\n const seen = livePreviewUrl(connected.data);\n for (const workDir of PREVIEW_START_WORKDIRS) {\n // eslint-disable-next-line no-await-in-loop -- one folder at a time, like the web\n const started = await run('WEBBUILDER_START', { sandbox_id: sandboxId, workDir, builder });\n if (started.gone) return { outcome: 'gone', url: null };\n if (started.ok) return { outcome: 'ok', url: livePreviewUrl(started.data) || seen };\n // Only \"no package.json here\" means try the next folder.\n if (!/no package\\.json/i.test(started.blob)) break;\n }\n return { outcome: connected.ok ? 'ok' : 'failed', url: seen };\n };\n\n // EXTEND first (web #438 C2): it resumes a paused sandbox and keeps it up; when the\n // preview then answers, nothing else is needed. \"Gone\" skips straight to the restore point.\n const extended = await call(\n WEBBUILDER_EXTEND_ACTION,\n { sandbox_id: target.sandboxId, timeoutMs: KEEPALIVE_EXTEND_MS },\n 90_000,\n ).catch((err: unknown) => ({ successful: false, error: err instanceof Error ? err.message : String(err) }));\n const extendState = extendOutcome(extended);\n const domain = publicSandboxDomain();\n const previewUrl = target.previewUrl || sandboxPreviewUrlFor(target.sandboxId, domain);\n if ((extendState === 'resumed' || extendState === 'alive') && (await probe(previewUrl))) return { outcome: 'ok' };\n const first = extendState === 'gone' ? { outcome: 'gone' as const } : await wake(target.sandboxId);\n if (first.outcome !== 'gone') return { outcome: first.outcome };\n const snapshotId = (target.snapshotId ?? '').trim();\n if (!snapshotId) return { outcome: 'gone' };\n\n // waitBridge:false - the new id comes back as soon as E2B creates the VM; CONNECT waits for the daemon.\n const created = await run(\n 'WEBBUILDER_CREATE_SANDBOX',\n { snapshotId, builder, waitBridge: false },\n CREATE_TIMEOUT_MS,\n );\n const createdUrl = livePreviewUrl(created.data);\n const nextId =\n String(created.data.sandboxId || created.data.sandbox_id || created.data.id || '').trim() ||\n /^https?:\\/\\/\\d+-([a-z0-9]+)/i.exec(createdUrl ?? '')?.[1] ||\n '';\n if (!created.ok || !nextId) return { outcome: 'gone' };\n const second = await wake(nextId);\n if (second.outcome !== 'ok') return { outcome: 'failed' };\n return {\n outcome: 'ok',\n sandboxId: nextId,\n previewUrl:\n withPublicSandboxHosts(second.url || createdUrl || '', domain) || sandboxPreviewUrlFor(nextId, domain),\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webbuilderTransport.js","sources":["../../../src/screens/WebBuilderNative/webbuilderTransport.ts"],"sourcesContent":["/**\n * The calls the native Web Builder makes the way the web surface makes them: the\n * build workflow trigger on cdecli-agent and turn attachments, both on the app's\n * surface session - the same JWT the web surface holds as its cdecli token.\n */\nimport {\n createRemoteConnectorExec,\n createRemoteUploadMedia,\n} from '../../features/canvas/videoEditor/remoteMediaClient';\nimport { WEBBUILDER_CONNECTOR_ID, WEBBUILDER_TRIGGER_WORKFLOW_ACTION } from '../../features/webbuilder/workflow';\nimport { publicSandboxDomain } from '../../features/webbuilder/publicSandboxDomain';\nimport { sandboxPreviewUrlFor, withPublicSandboxHosts } from '../../features/webbuilder/sandboxPublicHost';\nimport {\n KEEPALIVE_EXTEND_MS,\n SANDBOX_GONE_RE,\n WEBBUILDER_EXTEND_ACTION,\n extendOutcome,\n isSandboxGoneResult,\n savedCopyFrom,\n type SavedCopy,\n} from './keepAlive';\n\n/** The trigger answers in seconds; the build itself runs on and reports on the chat. */\nconst TRIGGER_TIMEOUT_MS = 90_000;\n\n/** `error` and `auth` (the agent refused the session) are set when `ok` is false. */\nexport interface TriggerOutcome {\n ok: boolean;\n error?: string;\n auth?: boolean;\n}\n\n/** Runs `yantra-webbuilder/WEBBUILDER_TRIGGER_WORKFLOW` with the web's params. */\nexport async function triggerBuild(\n token: string,\n indexUrl: string,\n params: Record<string, unknown>,\n): Promise<TriggerOutcome> {\n try {\n const result = await createRemoteConnectorExec(token, indexUrl)(\n WEBBUILDER_CONNECTOR_ID,\n WEBBUILDER_TRIGGER_WORKFLOW_ACTION,\n params,\n { timeoutMs: TRIGGER_TIMEOUT_MS },\n );\n if (result.successful === false) {\n const error = String(result.error ?? 'The build did not start.');\n return { ok: false, error, auth: /\\b401\\b|unauthori[sz]ed/i.test(error) };\n }\n return { ok: true };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n return { ok: false, error, auth: /\\b401\\b|unauthori[sz]ed/i.test(error) };\n }\n}\n\nexport const STORAGE_CONNECTOR_ID = 'yantra-storage';\nexport const PUBLIC_URL_ACTION = 'YANTRA_STORAGE_GET_PUBLIC_URL';\nexport const DOWNLOAD_LINK_ACTION = 'YANTRA_STORAGE_CREATE_DOWNLOAD_LINK';\n/** SigV4 presigned URLs cap at 7 days. */\nconst DOWNLOAD_LINK_EXPIRES_SEC = 7 * 24 * 60 * 60;\nconst RESOLVE_TIMEOUT_MS = 30_000;\n\nfunction httpsLinkFrom(data: unknown, key: 'publicUrl' | 'downloadUrl'): string | null {\n const rec = (data && typeof data === 'object' ? data : {}) as Record<string, unknown>;\n const inner = (rec.data && typeof rec.data === 'object' ? rec.data : rec) as Record<string, unknown>;\n const url = inner[key];\n return typeof url === 'string' && /^https:\\/\\//i.test(url.trim()) ? url.trim() : null;\n}\n\n/**\n * An uploaded object is private: its CDN link, else a 7-day signed link; null when\n * neither resolves (web `chat/uploadAttachments.resolveFetchableUrl`, #459).\n */\nexport async function resolveFetchableUrl(\n exec: (\n connector: string,\n action: string,\n params: Record<string, unknown>,\n options?: { timeoutMs?: number },\n ) => Promise<Record<string, unknown>>,\n objectUrl: string,\n): Promise<string | null> {\n const attempt = async (action: string, params: Record<string, unknown>, key: 'publicUrl' | 'downloadUrl') => {\n const r = await exec(STORAGE_CONNECTOR_ID, action, params, { timeoutMs: RESOLVE_TIMEOUT_MS }).catch(() => null);\n return r && r.successful !== false ? httpsLinkFrom(r.data, key) : null;\n };\n const cdn = await attempt(PUBLIC_URL_ACTION, { s3KeyOrUrl: objectUrl }, 'publicUrl');\n if (cdn) return cdn;\n return attempt(\n DOWNLOAD_LINK_ACTION,\n { s3KeyOrUrl: objectUrl, expiresIn: DOWNLOAD_LINK_EXPIRES_SEC },\n 'downloadUrl',\n );\n}\n\n/** A photo or file for the turn as a URL the workflow can fetch (the web posts URLs, never base64). */\nexport async function uploadAttachment(\n token: string,\n indexUrl: string,\n file: { url?: string; dataUrl?: string; name: string; mimeType?: string },\n): Promise<{ name: string; url: string; mimeType?: string } | null> {\n if (file.url && /^https?:\\/\\//i.test(file.url)) return { name: file.name, url: file.url, mimeType: file.mimeType };\n const local = file.url || file.dataUrl;\n if (!local) return null;\n try {\n const objectUrl = await createRemoteUploadMedia(token, indexUrl)(local);\n // The object URL answers 403 publicly, so the agent could not fetch it (web #459).\n const url = (await resolveFetchableUrl(createRemoteConnectorExec(token, indexUrl), objectUrl)) ?? objectUrl;\n return { name: file.name, url, mimeType: file.mimeType };\n } catch (err) {\n console.warn('[WebBuilderNative] attachment upload failed:', err);\n return null;\n }\n}\n\n/** The folders a build's project may live in (web `PREVIEW_START_WORKDIRS`). */\nconst PREVIEW_START_WORKDIRS = ['/home/yantra/repo', '/home/user/repo', '/home/yantra', '/home/user'];\nconst LIVE_PREVIEW_RE = /^https?:\\/\\/\\d+-[a-z0-9]+[^\\s\"']*/i;\nconst RESUME_TIMEOUT_MS = 3 * 60 * 1000;\n/** Booting a restore point into a new VM takes longer (web: 10 min for CREATE). */\nconst CREATE_TIMEOUT_MS = 10 * 60 * 1000;\n\nexport type ResumeOutcome = 'ok' | 'gone' | 'failed';\n\n/** What waking a preview did: `previewUrl` when EXTEND named another; `savedCopy` when it is gone. */\nexport interface WakeResult {\n outcome: ResumeOutcome;\n previewUrl?: string;\n savedCopy?: SavedCopy | null;\n}\n\n/**\n * What restoring from the saved copy did: the new sandbox and its preview (on the platform's\n * sandbox domain when one is set - it is saved), or why it could not, in one sentence.\n */\nexport type RestoreResult =\n | { outcome: 'ok'; sandboxId: string; previewUrl: string }\n | { outcome: 'failed'; reason: string };\n\n/** One connector call's answer, the same on both paths: `{ successful, data, error }`. */\nexport interface SandboxCallResult {\n successful: boolean;\n data?: unknown;\n error?: string;\n}\n\n/** `outdated`: this server has no proxy field; otherwise `result` is the connector's answer. */\nexport interface SandboxProxyAnswer {\n outdated: boolean;\n result?: SandboxCallResult;\n}\n\n/**\n * The guarded proxy `aiCodeSandboxAction(channelId, sandboxId, action, params)`:\n * the server checks the caller's role and that the sandbox belongs to the\n * channel, then adds the sandbox key from the channel's settings (an agent\n * build's key included). `outdated` = this server has no such field.\n */\nexport type SandboxProxyCall = (\n variables: { channelId: string; sandboxId: string; action: string; params: Record<string, unknown> },\n timeoutMs: number,\n) => Promise<SandboxProxyAnswer>;\n\nexport type SandboxRun = (\n action: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n) => Promise<SandboxCallResult>;\n\n/** Connector actions the proxy allows (web `sandboxProxy.SANDBOX_BOUND`); the rest go direct. */\nconst SANDBOX_BOUND = new Set([\n 'WEBBUILDER_EXTEND',\n 'WEBBUILDER_CONNECT',\n // A private sandbox answers STATUS only with its key, which the proxy adds.\n 'WEBBUILDER_STATUS',\n 'WEBBUILDER_START',\n 'WEBBUILDER_LIST_VERSIONS',\n 'WEBBUILDER_CREATE_SANDBOX',\n 'WEBBUILDER_READ_FILE',\n 'WEBBUILDER_WRITE_FILES',\n 'WEBBUILDER_RUN_COMMAND',\n 'WEBBUILDER_SNAPSHOT',\n 'WEBBUILDER_RESTORE_VERSION',\n 'WEBBUILDER_BOOKMARK_VERSION',\n 'WEBBUILDER_UPLOAD_ASSET',\n 'WEBBUILDER_RELOAD_GITHUB',\n 'WEBBUILDER_CLONE',\n // Editor+ on the server; an older server refuses them and callers fall back.\n 'WEBBUILDER_EXPORT_ZIP',\n 'WEBBUILDER_LIST_FILES',\n 'WEBBUILDER_FINISH',\n 'WEBBUILDER_DEPLOY_FLY',\n 'WEBBUILDER_DEPLOY_VERCEL',\n 'WEBBUILDER_DEPLOY_NETLIFY',\n // The server picks the repo and attaches the caller's own GitHub credential.\n 'WEBBUILDER_PUSH_GITHUB',\n 'WEBBUILDER_PULL_GITHUB',\n]);\n\n/** A server without the proxy (web `isOutdatedServerError`). */\nexport const OUTDATED_SERVER_RE =\n /Cannot query field|Unknown argument|Unknown type|is not defined by type|Cannot return null for non-nullable field Query\\.aiCode/i;\n\nfunction withoutKey(rec: Record<string, unknown>): Record<string, unknown> {\n const { sandboxKey: _key, sandbox_key: _key2, ...rest } = rec;\n return rest;\n}\n\n/** The proxy's JSON answer as a connector result, with any key dropped (web `proxyResult`). */\nexport function proxyResult(raw: unknown): SandboxCallResult {\n let value = raw;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n value = null;\n }\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { successful: false, error: 'The server sent an empty answer.' };\n }\n const rec = value as Record<string, unknown>;\n const data =\n rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? withoutKey(rec.data as Record<string, unknown>)\n : rec.data;\n const error = typeof rec.error === 'string' && rec.error ? rec.error : undefined;\n return { successful: rec.successful === true, data, ...(error ? { error } : {}) };\n}\n\n/** The proxy's answer when the caller has no project on the channel (missing, not a member, no role). */\nexport function isNoProjectRefusal(error: string | null | undefined): boolean {\n return /^Project not found\\.?$/i.test(String(error ?? '').trim());\n}\n\n/**\n * Channels with no server project for this person (an agent-chat build the AI made through\n * the cdecli agent), learnt from the proxy's \"Project not found.\" for the session: their\n * sandbox calls go direct - the connector lets a sandbox's creator act on it and boot their\n * own restore points without a key. Adopting the channel as a project switches it back.\n */\nexport const directChannels = new Set<string>();\n\n/**\n * Every sandbox call for one site, the web's `createSandboxRouter`: through the\n * proxy when the server has it (the app never holds a sandbox key), else straight\n * to cdecli-agent. A server found without the proxy stays direct for the session,\n * and so does a channel the proxy has no project for.\n */\nexport function createSandboxRouter(deps: {\n channelId: string | null | undefined;\n proxy: SandboxProxyCall | null;\n direct: SandboxRun;\n proxyMissing: { current: boolean };\n}): SandboxRun {\n const channelId = String(deps.channelId ?? '').trim();\n const { proxyMissing } = deps;\n return async (action, rawParams, timeoutMs) => {\n const params = withoutKey(rawParams);\n const sandboxId = String(params.sandbox_id ?? '').trim();\n const isCreate = action === 'WEBBUILDER_CREATE_SANDBOX';\n // `restoreFromBackup` is for the project proxy only (its templates-only check); the connector never sees it.\n const { restoreFromBackup: _proxyOnly, ...directParams } = params;\n const proxied =\n deps.proxy &&\n !proxyMissing.current &&\n channelId &&\n !directChannels.has(channelId) &&\n SANDBOX_BOUND.has(action) &&\n (sandboxId || isCreate);\n if (!proxied || !deps.proxy) return deps.direct(action, directParams, timeoutMs);\n const answer = await deps.proxy({ channelId, sandboxId, action, params }, timeoutMs);\n if (!answer.outdated) {\n const result = answer.result ?? { successful: false, error: 'The server sent an empty answer.' };\n // No project to hold the key: the connector lets the sandbox's creator act on it directly.\n if (!result.successful && isNoProjectRefusal(result.error)) {\n directChannels.add(channelId);\n return deps.direct(action, directParams, timeoutMs);\n }\n return result;\n }\n proxyMissing.current = true;\n return deps.direct(action, directParams, timeoutMs);\n };\n}\n\n/** The direct path: `yantra-webbuilder` on cdecli-agent with the surface session. */\nexport function directSandboxRun(token: string, indexUrl: string): SandboxRun {\n const exec = createRemoteConnectorExec(token, indexUrl);\n return async (action, params, timeoutMs) => {\n const result = await exec(WEBBUILDER_CONNECTOR_ID, action, params, { timeoutMs });\n return {\n successful: result.successful !== false,\n data: result.data,\n ...(typeof result.error === 'string' ? { error: result.error } : {}),\n };\n };\n}\n\n/** The connector's own output (web `connectorData`: the result's `data`, or `data.data`). */\nfunction connectorData(result: unknown): Record<string, unknown> {\n const raw = (result as { data?: unknown } | null)?.data;\n if (!raw || typeof raw !== 'object') return {};\n const rec = raw as Record<string, unknown>;\n return rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? (rec.data as Record<string, unknown>)\n : rec;\n}\n\nfunction livePreviewUrl(data: Record<string, unknown>): string | null {\n for (const value of [data.previewUrl, data.preview_url, data.sandboxUrl, data.sandbox_url, data.url]) {\n const match = typeof value === 'string' ? LIVE_PREVIEW_RE.exec(value.trim()) : null;\n if (match) return match[0];\n }\n return null;\n}\n\n/** The preview's dev server answers (not a 5xx \"Sandbox not found\" / \"Closed Port\" page), within `withinMs`. */\nexport async function waitForPreview(url: string, withinMs = 20_000): Promise<boolean> {\n const until = Date.now() + withinMs;\n while (Date.now() < until) {\n try {\n // eslint-disable-next-line no-await-in-loop -- one probe at a time\n const res = await fetch(url, { method: 'GET' });\n if (res.status < 500) return true;\n } catch {\n // not answering yet\n }\n // eslint-disable-next-line no-await-in-loop\n await new Promise((resolve) => {\n setTimeout(resolve, 2_000);\n });\n }\n return false;\n}\n\n/** One connector call, read the same on both paths: ok, gone (typed or worded), the raw text and `data`. */\nconst blobOf = (result: SandboxCallResult) => JSON.stringify(result);\n\nasync function runAction(call: SandboxRun, action: string, params: Record<string, unknown>, timeoutMs: number) {\n try {\n const result = await call(action, params, timeoutMs);\n return {\n ok: result.successful !== false,\n gone:\n isSandboxGoneResult(result) ||\n (!result.successful &&\n SANDBOX_GONE_RE.test(blobOf(result)) &&\n !/sandbox is private/i.test(blobOf(result))),\n blob: JSON.stringify(result),\n error: result.error ?? '',\n data: connectorData(result),\n savedCopy: savedCopyFrom(result),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const failed = { successful: false, error: message };\n return {\n ok: false,\n gone: isSandboxGoneResult(failed),\n blob: message,\n error: message,\n data: {} as Record<string, unknown>,\n savedCopy: savedCopyFrom(failed),\n };\n }\n}\n\nconst builderFor = (templateId?: string | null) => (/next/i.test(templateId ?? '') ? 'next' : 'vite');\n\n/** CONNECT then START across the workdirs; the URL is the one START (or CONNECT) reports. */\nasync function connectAndStart(\n call: SandboxRun,\n sandboxId: string,\n builder: string,\n savedCopyParams: Record<string, unknown> = {},\n): Promise<{ outcome: ResumeOutcome; url: string | null; savedCopy: SavedCopy | null }> {\n const connected = await runAction(\n call,\n 'WEBBUILDER_CONNECT',\n { sandbox_id: sandboxId, autoResume: true, builder, ...savedCopyParams },\n RESUME_TIMEOUT_MS,\n );\n if (connected.gone) return { outcome: 'gone', url: null, savedCopy: connected.savedCopy };\n const seen = livePreviewUrl(connected.data);\n for (const workDir of PREVIEW_START_WORKDIRS) {\n // eslint-disable-next-line no-await-in-loop -- one folder at a time, like the web\n const started = await runAction(\n call,\n 'WEBBUILDER_START',\n { sandbox_id: sandboxId, workDir, builder },\n RESUME_TIMEOUT_MS,\n );\n if (started.gone) return { outcome: 'gone', url: null, savedCopy: started.savedCopy };\n if (started.ok) return { outcome: 'ok', url: livePreviewUrl(started.data) || seen, savedCopy: null };\n // Only \"no package.json here\" means try the next folder.\n if (!/no package\\.json/i.test(started.blob)) break;\n }\n return { outcome: connected.ok ? 'ok' : 'failed', url: seen, savedCopy: null };\n}\n\n/** EXTEND's wait when the person opened the build (a quick answer) and when they asked to wake it. */\nconst EXTEND_OPEN_TIMEOUT_MS = 30_000;\nconst EXTEND_ASKED_TIMEOUT_MS = 90_000;\n\n/**\n * Brings a sleeping preview back without the agent, in the web's `ensurePreview` order:\n * EXTEND (it resumes a paused sandbox), then resume the sandbox (`WEBBUILDER_CONNECT` with\n * `autoResume`) and start its dev server (`WEBBUILDER_START`) in the folder the project lives\n * in. Waking never boots a new sandbox: `gone` means it was reclaimed, and restoring it from\n * its saved copy is the person's call ({@link restoreFromSavedCopy}). The wake calls name the\n * restore point and backup, so a gone answer says where to restore from (`savedCopy`).\n */\nexport async function wakeSandbox(\n call: SandboxRun,\n target: {\n sandboxId: string;\n snapshotId?: string | null;\n backupRepo?: string | null;\n templateId?: string | null;\n /** The build's preview, checked after EXTEND resumes the sandbox. */\n previewUrl?: string | null;\n /** The person asked to wake it (EXTEND may take longer); else it is opening. */\n asked?: boolean;\n },\n probe: (url: string) => Promise<boolean> = waitForPreview,\n): Promise<WakeResult> {\n const builder = builderFor(target.templateId);\n const savedCopyParams = {\n ...(String(target.snapshotId ?? '').trim() ? { snapshotId: String(target.snapshotId).trim() } : {}),\n ...(String(target.backupRepo ?? '').trim() ? { backupRepo: String(target.backupRepo).trim() } : {}),\n };\n const extended = await call(\n WEBBUILDER_EXTEND_ACTION,\n { sandbox_id: target.sandboxId, timeoutMs: KEEPALIVE_EXTEND_MS, ...savedCopyParams },\n target.asked ? EXTEND_ASKED_TIMEOUT_MS : EXTEND_OPEN_TIMEOUT_MS,\n ).catch((err: unknown) => ({ successful: false, error: err instanceof Error ? err.message : String(err) }));\n const extendState = extendOutcome(extended);\n const domain = publicSandboxDomain();\n const previewUrl = target.previewUrl || sandboxPreviewUrlFor(target.sandboxId, domain);\n if (extendState === 'resumed' || extendState === 'alive') {\n // EXTEND may name the preview it resumed.\n const extendedUrl = livePreviewUrl(connectorData(extended));\n const url = extendedUrl ? withPublicSandboxHosts(extendedUrl, domain) || previewUrl : previewUrl;\n if (await probe(url)) return { outcome: 'ok', ...(url !== previewUrl ? { previewUrl: url } : {}) };\n }\n // Gone for good: waking cannot help.\n if (extendState === 'gone') return { outcome: 'gone', savedCopy: savedCopyFrom(extended) };\n const woken = await connectAndStart(call, target.sandboxId, builder, savedCopyParams);\n if (woken.outcome === 'gone') return { outcome: 'gone', savedCopy: woken.savedCopy };\n return { outcome: woken.outcome };\n}\n\n/** A failed restore's reason as one plain sentence: no `[CODE]` tags, CLI wrappers or repeats (web `restoreReasonText`). */\nexport function restoreReasonText(raw: string | null | undefined): string {\n const lines = String(raw || '')\n .split('\\n')\n .map((l) =>\n l\n .replace(/^\\s*(?:Error:\\s*)?exit status \\d+:\\s*/i, '')\n .replace(/^\\s*Error:\\s*/i, '')\n .replace(/\\s*\\[[A-Z][A-Z0-9_]*(?:;[^\\]]*)?\\]\\s*$/, '')\n .replace(/[;,]?\\s*the user (?:cannot|can't|can not) fix this\\.?/i, '.')\n .replace(/\\.\\.$/, '.')\n .replace(/\\s+/g, ' ')\n .trim(),\n )\n .filter(Boolean);\n const first = lines[0] || '';\n if (!first) return 'The saved copy could not be opened.';\n if (/not one of yours and was not shared/i.test(first) || /SNAPSHOT_OWNER_UNKNOWN/.test(String(raw))) {\n return \"This saved copy isn't linked to your account yet, so it can't be reopened here.\";\n }\n if (/^at\\s/.test(first)) return 'The saved copy could not be opened.';\n const text = first.length > 220 ? `${first.slice(0, 219)}…` : first;\n return /[.!?…]$/.test(text) ? text : `${text}.`;\n}\n\n/**\n * Restore from saved copy (web): boot the build's latest restore point (the\n * one the connector named when it found the sandbox gone, else the build's) into a new sandbox\n * (`WEBBUILDER_CREATE_SANDBOX`, naming the sandbox it was saved from so an older restore point\n * can be proven ours) and start it. Without a restore point the agent restores it from its backup.\n */\nexport async function restoreFromSavedCopy(\n call: SandboxRun,\n target: { sandboxId: string; snapshotId?: string | null; templateId?: string | null },\n): Promise<RestoreResult> {\n const snapshotId = String(target.snapshotId ?? '').trim();\n if (!snapshotId) return { outcome: 'failed', reason: 'This build has no restore point the app can open.' };\n const builder = builderFor(target.templateId);\n const domain = publicSandboxDomain();\n // waitBridge:false - the new id comes back as soon as E2B creates the VM; CONNECT waits for the daemon.\n const created = await runAction(\n call,\n 'WEBBUILDER_CREATE_SANDBOX',\n { snapshotId, sourceSandboxId: target.sandboxId, builder, waitBridge: false },\n CREATE_TIMEOUT_MS,\n );\n const createdUrl = livePreviewUrl(created.data);\n const nextId =\n String(created.data.sandboxId || created.data.sandbox_id || created.data.id || '').trim() ||\n /^https?:\\/\\/\\d+-([a-z0-9]+)/i.exec(createdUrl ?? '')?.[1] ||\n '';\n if (!created.ok || !nextId) return { outcome: 'failed', reason: restoreReasonText(created.error || created.blob) };\n const started = await connectAndStart(call, nextId, builder);\n if (started.outcome !== 'ok') return { outcome: 'failed', reason: 'The restored copy did not start.' };\n return {\n outcome: 'ok',\n sandboxId: nextId,\n previewUrl:\n withPublicSandboxHosts(started.url || createdUrl || '', domain) || sandboxPreviewUrlFor(nextId, domain),\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.144",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"uuid": "^9.0.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"common": "12.0.141
|
|
30
|
+
"common": "12.0.141",
|
|
31
31
|
"libphonenumber-js": "^1.13.3"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@messenger-box/platform-mobile": "*",
|
|
46
46
|
"@react-native-async-storage/async-storage": "*",
|
|
47
47
|
"@react-navigation/native": "*",
|
|
48
|
-
"common": "12.0.141
|
|
48
|
+
"common": "12.0.141",
|
|
49
49
|
"expo-background-task": "*",
|
|
50
50
|
"expo-constants": "*",
|
|
51
51
|
"expo-secure-store": "*",
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"typescript": {
|
|
68
68
|
"definition": "lib/index.d.ts"
|
|
69
69
|
},
|
|
70
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "3968ae217321f99f4cc00f268cbb25dc786458ad"
|
|
71
71
|
}
|