@nodaro/sdk 2.44.0 → 2.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/{chunk-ETX3TLNB.cjs → chunk-22P4X3N5.cjs} +16 -5
  2. package/dist/chunk-22P4X3N5.cjs.map +1 -0
  3. package/dist/{chunk-RETNLKOC.js → chunk-33HT46A3.js} +2 -2
  4. package/dist/{chunk-RETNLKOC.js.map → chunk-33HT46A3.js.map} +1 -1
  5. package/dist/{chunk-IGMWFEFB.js → chunk-5MOJSYHI.js} +2 -2
  6. package/dist/chunk-5MOJSYHI.js.map +1 -0
  7. package/dist/{chunk-DAGJLS7W.js → chunk-5Q4SUZPL.js} +3 -3
  8. package/dist/{chunk-DAGJLS7W.js.map → chunk-5Q4SUZPL.js.map} +1 -1
  9. package/dist/{chunk-55ZX6TE3.cjs → chunk-66M54BUO.cjs} +6 -6
  10. package/dist/chunk-66M54BUO.cjs.map +1 -0
  11. package/dist/chunk-6NTKEXT5.js +3 -0
  12. package/dist/chunk-6NTKEXT5.js.map +1 -0
  13. package/dist/{chunk-FQNCIP6K.js → chunk-7LODCIQK.js} +2 -2
  14. package/dist/chunk-7LODCIQK.js.map +1 -0
  15. package/dist/{chunk-34JMD6ZO.cjs → chunk-7LTVS75S.cjs} +36 -12
  16. package/dist/chunk-7LTVS75S.cjs.map +1 -0
  17. package/dist/{chunk-DQAYIVVS.js → chunk-BQAW4RX2.js} +16 -5
  18. package/dist/chunk-BQAW4RX2.js.map +1 -0
  19. package/dist/{chunk-HKDIIFG2.js → chunk-C3C7IL25.js} +6 -6
  20. package/dist/chunk-C3C7IL25.js.map +1 -0
  21. package/dist/{chunk-QHXLMCBR.cjs → chunk-DIF7A5OH.cjs} +2 -2
  22. package/dist/chunk-DIF7A5OH.cjs.map +1 -0
  23. package/dist/{chunk-PQ7OKM3E.cjs → chunk-FIMBPKIH.cjs} +2 -2
  24. package/dist/chunk-FIMBPKIH.cjs.map +1 -0
  25. package/dist/{chunk-ZWPDWFN2.js → chunk-GW76IRQD.js} +2 -2
  26. package/dist/chunk-GW76IRQD.js.map +1 -0
  27. package/dist/{chunk-YSZM3N7Q.js → chunk-HPXE3NZW.js} +2 -2
  28. package/dist/{chunk-YSZM3N7Q.js.map → chunk-HPXE3NZW.js.map} +1 -1
  29. package/dist/{chunk-OIYMTGYN.cjs → chunk-JOXZ4ZIF.cjs} +2 -2
  30. package/dist/chunk-JOXZ4ZIF.cjs.map +1 -0
  31. package/dist/chunk-KBHDUHKM.js +21 -0
  32. package/dist/chunk-KBHDUHKM.js.map +1 -0
  33. package/dist/{chunk-FHVNTS4E.cjs → chunk-KMNSPC72.cjs} +2 -2
  34. package/dist/{chunk-FHVNTS4E.cjs.map → chunk-KMNSPC72.cjs.map} +1 -1
  35. package/dist/{chunk-ILG5DHQQ.js → chunk-M7VSFZMV.js} +2 -2
  36. package/dist/chunk-M7VSFZMV.js.map +1 -0
  37. package/dist/{chunk-3ZZWCHF5.cjs → chunk-POKNFGGD.cjs} +33 -29
  38. package/dist/chunk-POKNFGGD.cjs.map +1 -0
  39. package/dist/{chunk-6MQ2LTJZ.js → chunk-PQHZUWSL.js} +36 -12
  40. package/dist/chunk-PQHZUWSL.js.map +1 -0
  41. package/dist/{chunk-Z7UZ3FD3.js → chunk-RBX3QTKB.js} +2 -2
  42. package/dist/{chunk-Z7UZ3FD3.js.map → chunk-RBX3QTKB.js.map} +1 -1
  43. package/dist/{chunk-7XOK277W.cjs → chunk-SF2CMKWA.cjs} +2 -2
  44. package/dist/{chunk-7XOK277W.cjs.map → chunk-SF2CMKWA.cjs.map} +1 -1
  45. package/dist/{chunk-2VJOHJUZ.cjs → chunk-TK2CEVSK.cjs} +2 -2
  46. package/dist/chunk-TK2CEVSK.cjs.map +1 -0
  47. package/dist/chunk-UANHMQ3A.cjs +4 -0
  48. package/dist/chunk-UANHMQ3A.cjs.map +1 -0
  49. package/dist/{chunk-EK672FFM.cjs → chunk-UIBYZNDR.cjs} +2 -2
  50. package/dist/chunk-UIBYZNDR.cjs.map +1 -0
  51. package/dist/{chunk-6PI3CI7P.js → chunk-WFAFFAGV.js} +20 -16
  52. package/dist/chunk-WFAFFAGV.js.map +1 -0
  53. package/dist/{chunk-PEMLIAPZ.cjs → chunk-WMT7HEBZ.cjs} +40 -7
  54. package/dist/chunk-WMT7HEBZ.cjs.map +1 -0
  55. package/dist/{chunk-Y6VDCZPB.js → chunk-WS4ZQ4AA.js} +40 -7
  56. package/dist/chunk-WS4ZQ4AA.js.map +1 -0
  57. package/dist/{chunk-VYEGCEZ3.cjs → chunk-WUM6CWTE.cjs} +2 -2
  58. package/dist/{chunk-VYEGCEZ3.cjs.map → chunk-WUM6CWTE.cjs.map} +1 -1
  59. package/dist/{chunk-4UPVE662.js → chunk-XILR6TFO.js} +2 -2
  60. package/dist/chunk-XILR6TFO.js.map +1 -0
  61. package/dist/chunk-XKDVEQVD.cjs +23 -0
  62. package/dist/chunk-XKDVEQVD.cjs.map +1 -0
  63. package/dist/{chunk-MPQQC45L.cjs → chunk-ZJCHIJND.cjs} +3 -3
  64. package/dist/{chunk-MPQQC45L.cjs.map → chunk-ZJCHIJND.cjs.map} +1 -1
  65. package/dist/entries/apps.cjs +2 -2
  66. package/dist/entries/apps.d.cts +1 -1
  67. package/dist/entries/apps.d.ts +1 -1
  68. package/dist/entries/apps.js +1 -1
  69. package/dist/entries/cast-swap.cjs +2 -2
  70. package/dist/entries/cast-swap.d.cts +117 -143
  71. package/dist/entries/cast-swap.d.ts +117 -143
  72. package/dist/entries/cast-swap.js +1 -1
  73. package/dist/entries/characters.d.cts +1 -1
  74. package/dist/entries/characters.d.ts +1 -1
  75. package/dist/entries/client.cjs +21 -20
  76. package/dist/entries/client.d.cts +4 -1
  77. package/dist/entries/client.d.ts +4 -1
  78. package/dist/entries/client.js +16 -15
  79. package/dist/entries/core.cjs +5 -5
  80. package/dist/entries/core.js +1 -1
  81. package/dist/entries/creatures.d.cts +1 -1
  82. package/dist/entries/creatures.d.ts +1 -1
  83. package/dist/entries/credits.cjs +2 -2
  84. package/dist/entries/credits.d.cts +2 -2
  85. package/dist/entries/credits.d.ts +2 -2
  86. package/dist/entries/credits.js +1 -1
  87. package/dist/entries/edit.cjs +6 -6
  88. package/dist/entries/edit.d.cts +1 -1
  89. package/dist/entries/edit.d.ts +1 -1
  90. package/dist/entries/edit.js +1 -1
  91. package/dist/entries/jobs.cjs +2 -2
  92. package/dist/entries/jobs.d.cts +57 -8
  93. package/dist/entries/jobs.d.ts +57 -8
  94. package/dist/entries/jobs.js +1 -1
  95. package/dist/entries/locations.d.cts +1 -1
  96. package/dist/entries/locations.d.ts +1 -1
  97. package/dist/entries/media.cjs +2 -2
  98. package/dist/entries/media.d.cts +14 -3
  99. package/dist/entries/media.d.ts +14 -3
  100. package/dist/entries/media.js +1 -1
  101. package/dist/entries/nodes.cjs +2 -2
  102. package/dist/entries/nodes.d.cts +1 -1
  103. package/dist/entries/nodes.d.ts +1 -1
  104. package/dist/entries/nodes.js +1 -1
  105. package/dist/entries/objects.d.cts +1 -1
  106. package/dist/entries/objects.d.ts +1 -1
  107. package/dist/entries/scene3d.d.cts +2 -2
  108. package/dist/entries/scene3d.d.ts +2 -2
  109. package/dist/entries/sessions.cjs +2 -2
  110. package/dist/entries/sessions.d.cts +58 -8
  111. package/dist/entries/sessions.d.ts +58 -8
  112. package/dist/entries/sessions.js +1 -1
  113. package/dist/entries/templates.cjs +2 -2
  114. package/dist/entries/templates.d.cts +1 -1
  115. package/dist/entries/templates.d.ts +1 -1
  116. package/dist/entries/templates.js +1 -1
  117. package/dist/entries/trash.cjs +13 -0
  118. package/dist/entries/trash.cjs.map +1 -0
  119. package/dist/entries/trash.d.cts +71 -0
  120. package/dist/entries/trash.d.ts +71 -0
  121. package/dist/entries/trash.js +4 -0
  122. package/dist/entries/trash.js.map +1 -0
  123. package/dist/entries/trends.cjs +2 -2
  124. package/dist/entries/trends.d.cts +86 -28
  125. package/dist/entries/trends.d.ts +86 -28
  126. package/dist/entries/trends.js +1 -1
  127. package/dist/entries/tutorials.cjs +2 -2
  128. package/dist/entries/tutorials.d.cts +1 -1
  129. package/dist/entries/tutorials.d.ts +1 -1
  130. package/dist/entries/tutorials.js +1 -1
  131. package/dist/entries/workflows.cjs +2 -2
  132. package/dist/entries/workflows.d.cts +11 -4
  133. package/dist/entries/workflows.d.ts +11 -4
  134. package/dist/entries/workflows.js +1 -1
  135. package/dist/index.cjs +48 -42
  136. package/dist/index.d.cts +6 -5
  137. package/dist/index.d.ts +6 -5
  138. package/dist/index.js +18 -16
  139. package/dist/{nodes-B4ZEqx2V.d.ts → nodes-C9j0PFto.d.ts} +12 -2
  140. package/dist/{nodes-DzBGNOUV.d.cts → nodes-DGIefTze.d.cts} +12 -2
  141. package/package.json +8 -3
  142. package/dist/chunk-2VJOHJUZ.cjs.map +0 -1
  143. package/dist/chunk-34JMD6ZO.cjs.map +0 -1
  144. package/dist/chunk-3ZZWCHF5.cjs.map +0 -1
  145. package/dist/chunk-4UPVE662.js.map +0 -1
  146. package/dist/chunk-55ZX6TE3.cjs.map +0 -1
  147. package/dist/chunk-6MQ2LTJZ.js.map +0 -1
  148. package/dist/chunk-6PI3CI7P.js.map +0 -1
  149. package/dist/chunk-DQAYIVVS.js.map +0 -1
  150. package/dist/chunk-EK672FFM.cjs.map +0 -1
  151. package/dist/chunk-ETX3TLNB.cjs.map +0 -1
  152. package/dist/chunk-FQNCIP6K.js.map +0 -1
  153. package/dist/chunk-HKDIIFG2.js.map +0 -1
  154. package/dist/chunk-IGMWFEFB.js.map +0 -1
  155. package/dist/chunk-ILG5DHQQ.js.map +0 -1
  156. package/dist/chunk-OIYMTGYN.cjs.map +0 -1
  157. package/dist/chunk-PEMLIAPZ.cjs.map +0 -1
  158. package/dist/chunk-PQ7OKM3E.cjs.map +0 -1
  159. package/dist/chunk-QHXLMCBR.cjs.map +0 -1
  160. package/dist/chunk-Y6VDCZPB.js.map +0 -1
  161. package/dist/chunk-ZWPDWFN2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/binary-response.ts","../src/core.ts","../src/auth.ts"],"names":["WORKSPACE_HEADER","throwFromResponse"],"mappings":"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","file":"chunk-MPQQC45L.cjs","sourcesContent":["/** Bound decoded response bytes even when Content-Length is absent or compressed. */\nexport async function readBinaryResponse(response: Response, maxBytes: number): Promise<ArrayBuffer> {\n const advertised = response.headers.get(\"content-length\")\n if (advertised !== null && (!/^\\d+$/.test(advertised) || Number(advertised) > maxBytes)) {\n await response.body?.cancel()\n throw new Error(\"Binary response exceeds its declared size limit\")\n }\n if (!response.body) return new ArrayBuffer(0)\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let length = 0\n try {\n while (true) {\n const next = await reader.read()\n if (next.done) break\n length += next.value.byteLength\n if (length > maxBytes) {\n await reader.cancel()\n throw new Error(\"Binary response exceeds its declared size limit\")\n }\n chunks.push(next.value)\n }\n } finally { reader.releaseLock() }\n const bytes = new Uint8Array(length)\n let offset = 0\n for (const chunk of chunks) { bytes.set(chunk, offset); offset += chunk.byteLength }\n return bytes.buffer\n}\n","/**\n * The client core: configuration, auth, the request transport and the\n * account-identity calls — everything a resource needs, and none of the\n * resources themselves.\n *\n * {@link NodaroClient} (`createClient`) extends it with every resource. An app\n * that uses only a few resources can extend it with just those, so it loads\n * (and its tests depend on) only the resource modules it actually uses:\n *\n * class AppClient extends NodaroClientCore {\n * readonly jobs = new JobsResource(this)\n * readonly nodes = new NodesResource(this) // needs `jobs` on the same client\n * }\n *\n * A resource that calls another one through the client says so in its\n * constructor type (`NodesResource` takes a core that also has `jobs`), so a\n * client missing it fails to compile rather than at run time.\n */\nimport { readBinaryResponse } from \"./binary-response.js\"\nimport { throwFromResponse } from \"./errors.js\"\nimport type { Auth } from \"./auth.js\"\nimport type { DeveloperAppKind, DeveloperAppScope } from \"./resources/developer-apps.js\"\nimport { WORKSPACE_HEADER, type MeOrganizations } from \"@nodaro/shared/organizations\"\n\n/** Replaced at build time by tsup `define` from package.json. The fallback\n * keeps `tsx`/vitest runs of the source working, where no define applies. */\ndeclare const __SDK_VERSION__: string | undefined\nconst SDK_VERSION = typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.0.0-dev\"\n\n/**\n * Identifies the calling package to the backend, which records it as the job's\n * provenance (`jobs.source` / `source_detail`) so an operator can tell a CLI\n * run from an SDK integration from a browser session.\n *\n * Only `sdk/…` and `cli/…` are honoured server-side; anything else is ignored\n * rather than trusted, since this is an unauthenticated header.\n */\nexport const CLIENT_HEADER = \"X-Nodaro-Client\"\n\n/**\n * In a browser the header is redundant AND a liability, so it is not sent.\n *\n * Redundant: the browser already sends `Origin`, which names the actual product\n * (`studio.nodaro.ai`) rather than merely the library it used — and the backend\n * deliberately prefers Origin over this header, so a browser-sent value is\n * discarded on arrival.\n *\n * A liability: `X-Nodaro-Client` is not a CORS-safelisted request header, so a\n * browser sending it requires an exact match in the server's\n * `Access-Control-Allow-Headers`. Any deployment whose backend predates that\n * allowlist entry would fail the PREFLIGHT — breaking every API call from the\n * app, not just its provenance. Self-hosted and lagging deployments make that a\n * real risk, and nothing in a browser app would reveal the cause.\n *\n * An EXPLICIT `clientLabel` is always sent regardless: a caller that names\n * itself has opted in deliberately, and that intent outranks this default.\n */\nconst isBrowser = (): boolean => typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n\nexport interface ClientOptions {\n /** Backend base URL, e.g. \"https://nodaro.example.com\" or empty string for same-origin. */\n baseUrl: string\n /** Auth provider. Use StaticTokenAuth, supabaseAuth, or CallbackAuth. */\n auth: Auth\n /** Optional fetch override (for tests or custom transports). */\n fetch?: typeof fetch\n /** Default request timeout in ms. Default 60s. */\n timeoutMs?: number\n /**\n * Overrides the `X-Nodaro-Client` label. Defaults to `sdk/<version>`.\n *\n * Exists for `@nodaro/cli`, which is a wrapper AROUND this SDK: without an\n * override every CLI invocation would be recorded as an SDK call and the two\n * surfaces could never be told apart.\n */\n clientLabel?: string\n /**\n * The workspace every request acts in — sent as `X-Nodaro-Workspace`.\n *\n * It selects which workspace a LIST reads from and where a CREATE lands.\n * It never authorizes: reading, updating, deleting or running an\n * identified object is decided by that object's own workspace, so a\n * forgotten header cannot hide work and a forged one cannot reach anyone\n * else's. Omit it to work in the caller's personal space.\n *\n * Prefer {@link NodaroClient.withWorkspace} for anything short-lived — one\n * client per workspace, no shared mutable selection to get wrong.\n */\n workspaceId?: string\n}\n\ninterface RequestOptions {\n body?: unknown\n query?: Record<string, string | number | boolean | undefined>\n headers?: Record<string, string>\n signal?: AbortSignal\n}\n\n/**\n * The authenticated user's canonical identity (`GET /v1/me`). A token-\n * introspection primitive: any valid bearer token (first-party Supabase JWT or\n * a developer-app OAuth token) resolves to its owner's identity. Mirrors the\n * `profiles` identity columns server-side — the route is the source of truth.\n */\nexport interface UserIdentity {\n /** Nodaro user id (= the Supabase auth user id). */\n readonly id: string\n readonly email: string\n /** Human-readable display name (from `profiles.full_name`); `null` if unset. */\n readonly displayName: string | null\n /** Avatar URL; `null` if unset. */\n readonly avatarUrl: string | null\n /** Subscription tier (e.g. \"free\", \"pro\"). */\n readonly tier: string\n /**\n * Whether the user holds an admin role. DESCRIPTIVE only — use it to decide\n * whether to render admin surfaces without capability-probing an admin\n * endpoint; every admin API stays enforced server-side regardless.\n */\n readonly isAdmin: boolean\n}\n\n/**\n * An app the user let into their account through OAuth (`GET\n * /v1/me/connected-apps`): a developer app, an AI assistant's MCP connector, or\n * a self-hosted install. One entry per grant still in force.\n */\nexport interface ConnectedApp {\n /** The grant's id — what {@link NodaroClient.revokeConnectedApp} takes. */\n readonly authorizationId: string\n /** The app's name; `null` if it has none. A `dynamic_mcp` client chose its own. */\n readonly name: string | null\n /**\n * How the app came to exist: `user` (a developer app someone registered),\n * `first_party_mcp`, `dynamic_mcp` (an MCP client that registered itself) or\n * `community_instance` (a self-hosted install).\n */\n readonly kind: DeveloperAppKind | (string & {})\n readonly homepageUrl: string | null\n /** The scopes this grant holds. */\n readonly scopes: readonly DeveloperAppScope[]\n /** When the user granted access (ISO 8601). */\n readonly connectedAt: string\n /** The latest use of any token issued under the grant; `null` if never used. */\n readonly lastUsedAt: string | null\n}\n\nexport class NodaroClientCore {\n readonly baseUrl: string\n readonly auth: Auth\n readonly timeoutMs: number\n /** Value sent as `X-Nodaro-Client`; recorded by the backend as job provenance. */\n readonly clientLabel: string\n /** Whether to actually send it — see the note on {@link CLIENT_HEADER}. */\n private readonly sendClientHeader: boolean\n private readonly fetchOverride: typeof fetch | undefined\n\n /**\n * Resolved lazily so consumers can swap `globalThis.fetch` after the\n * client has been constructed (e.g. test mocks). Always rebound to the\n * global object — native fetch throws \"Illegal invocation\" when its\n * `this` is anything else.\n */\n get fetch(): typeof fetch {\n return this.fetchOverride ?? globalThis.fetch.bind(globalThis)\n }\n\n /** The workspace this client acts in; undefined = the personal space. */\n readonly workspaceId: string | undefined\n\n constructor(opts: ClientOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/$/, \"\") // strip trailing slash\n this.auth = opts.auth\n this.fetchOverride = opts.fetch\n this.timeoutMs = opts.timeoutMs ?? 60_000\n this.clientLabel = opts.clientLabel ?? `sdk/${SDK_VERSION}`\n this.workspaceId = opts.workspaceId\n // Explicit label = deliberate opt-in, always sent. The default is suppressed\n // in browsers — see the note on CLIENT_HEADER.\n this.sendClientHeader = opts.clientLabel !== undefined || !isBrowser()\n }\n\n /**\n * The transport: build the request, send it, throw the typed error on a\n * non-2xx via {@link throwFromResponse}, then read the body via `read` — all\n * inside the abort timer, so `timeoutMs` bounds the body download too (a\n * stalled CSV stream aborts, it does not hang forever). Both the JSON path\n * ({@link request}) and the text path ({@link requestText}) go through here.\n */\n private async send<T>(\n method: string,\n path: string,\n options: RequestOptions,\n read: (res: Response) => Promise<T>,\n ): Promise<T> {\n const url = this.buildUrl(path, options.query)\n\n const token = await this.auth.getToken()\n // A `FormData` body is a multipart upload: let the runtime set\n // `Content-Type: multipart/form-data; boundary=…` itself (a manual JSON\n // content-type corrupts the boundary), and send the body as-is rather than\n // JSON-stringifying it. Every other body stays JSON, exactly as before.\n const isFormData =\n typeof FormData !== \"undefined\" && options.body instanceof FormData\n const headers: Record<string, string> = {\n ...(isFormData ? {} : { \"Content-Type\": \"application/json\" }),\n ...(this.sendClientHeader ? { [CLIENT_HEADER]: this.clientLabel } : {}),\n // Before per-request headers: a resource that needs to reach outside\n // this client's workspace says so explicitly and wins.\n ...(this.workspaceId ? { [WORKSPACE_HEADER]: this.workspaceId } : {}),\n ...(options.headers ?? {}),\n }\n if (token) headers[\"Authorization\"] = `Bearer ${token}`\n\n const ac = new AbortController()\n const timeoutId = setTimeout(() => ac.abort(), this.timeoutMs)\n const abort = () => ac.abort(options.signal?.reason)\n options.signal?.addEventListener(\"abort\", abort, { once: true })\n if (options.signal?.aborted) abort()\n\n try {\n ac.signal.throwIfAborted()\n const res = await this.fetch(url, {\n method,\n headers,\n body:\n options.body === undefined\n ? undefined\n : isFormData\n ? (options.body as FormData)\n : JSON.stringify(options.body),\n signal: ac.signal,\n })\n\n if (!res.ok) {\n let errBody: Record<string, unknown> = {}\n try {\n errBody = await res.json() as Record<string, unknown>\n } catch {\n // Empty/non-JSON body — fall through with empty errBody\n }\n throwFromResponse(res.status, errBody)\n }\n\n return await read(res)\n } finally {\n clearTimeout(timeoutId)\n options.signal?.removeEventListener(\"abort\", abort)\n }\n }\n\n /** Authenticated, bounded binary reads through the normal timeout/error transport. */\n async requestBytes(method: string, path: string, options: RequestOptions & { maxBytes: number }): Promise<ArrayBuffer> {\n if (!Number.isSafeInteger(options.maxBytes) || options.maxBytes < 1) throw new Error(\"maxBytes must be a positive integer\")\n return this.send(method, path, options, (response) => readBinaryResponse(response, options.maxBytes))\n }\n\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n return this.send(method, path, options, async (res) =>\n // 204 No Content\n res.status === 204 ? (undefined as T) : ((await res.json()) as T),\n )\n }\n\n /**\n * Like {@link request}, for endpoints that answer text (CSV exports). Errors\n * are still the JSON envelope and throw the same typed errors, and the read is\n * bounded by the same timeout as the request.\n */\n async requestText(method: string, path: string, options: RequestOptions = {}): Promise<string> {\n return this.send(method, path, options, (res) => res.text())\n }\n\n /**\n * `GET /v1/me` → the authenticated user's identity (see {@link UserIdentity}).\n * Unwraps the `{ data }` envelope. Throws `UnauthorizedError` (401) when the\n * token is missing/invalid, and the SDK's other typed errors as usual.\n *\n * On an instance with organizations it also carries what the caller belongs\n * to. THREE states, and collapsing them is wrong in a way users feel: the\n * organization fields ABSENT means this instance has no organizations at\n * all; present and empty means the account belongs to none; and\n * `organizationsUnavailable` means the lookup failed — keep whatever\n * selection you already had rather than concluding the person was removed\n * from everything.\n */\n async me(): Promise<UserIdentity & MeOrganizations> {\n const res = await this.request<{ data: UserIdentity & MeOrganizations }>(\"GET\", \"/v1/me\")\n return res.data\n }\n\n /**\n * `GET /v1/me/connected-apps` → every app with access to the signed-in\n * user's account (see {@link ConnectedApp}), newest grant first.\n *\n * **A signed-in browser session only.** The route answers a Supabase\n * session token (`supabaseAuth(…)`, `createSharedSupabaseClient`, or a\n * `StaticTokenAuth` holding one) and refuses every other credential with\n * `UnauthorizedError` (\"Sign in required\"): an app token or an API key must\n * not list the grants it lives under. Build your \"Connected apps\" settings\n * screen on this; a server-side integration cannot call it.\n */\n async connectedApps(): Promise<ConnectedApp[]> {\n const res = await this.request<{ apps: ConnectedApp[] }>(\"GET\", \"/v1/me/connected-apps\")\n return res.apps\n }\n\n /**\n * `POST /v1/me/connected-apps/:authorizationId/revoke` — ends an app's\n * access: the grant and every token issued under it, at once (the app's next\n * call is a 401). Resolves when done.\n *\n * A signed-in browser session only, like {@link connectedApps}. Throws\n * `NotFoundError` when the grant is not the user's or is already revoked.\n */\n async revokeConnectedApp(authorizationId: string): Promise<void> {\n await this.request(\"POST\", `/v1/me/connected-apps/${encodeURIComponent(authorizationId)}/revoke`)\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n const base = this.baseUrl || (typeof window !== \"undefined\" ? window.location.origin : \"http://placeholder\")\n const url = new URL(path, base)\n // If baseUrl was empty, strip the placeholder origin\n const fullUrl = this.baseUrl ? url.toString() : url.pathname + url.search\n if (query) {\n const u = new URL(this.baseUrl ? fullUrl : fullUrl, base)\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) u.searchParams.set(k, String(v))\n }\n return this.baseUrl ? u.toString() : u.pathname + u.search\n }\n return fullUrl\n }\n}\n","/**\n * Auth provides the token used for `Authorization: Bearer <token>` on each request.\n * Implementations:\n * - StaticTokenAuth — fixed string (server-side, OAuth access token, API token)\n * - CallbackAuth — caller-supplied async function (BYO logic)\n * - supabaseAuth — pulls JWT from a Supabase client live (browser frontends)\n */\nexport interface Auth {\n /** Returns the current Bearer token, or null if not authenticated. */\n getToken(): Promise<string | null>\n}\n\nexport class StaticTokenAuth implements Auth {\n constructor(private token: string) {}\n async getToken() {\n return this.token\n }\n}\n\nexport class CallbackAuth implements Auth {\n constructor(private fn: () => string | null | Promise<string | null>) {}\n async getToken() {\n return this.fn()\n }\n}\n\ninterface SupabaseLikeClient {\n auth: {\n getSession(): Promise<{ data: { session: { access_token: string } | null } }>\n }\n}\n\n/** Pulls a JWT from a Supabase v2 client. Caller supplies their own supabase. */\nexport function supabaseAuth(supabase: SupabaseLikeClient): Auth {\n return {\n async getToken() {\n const { data } = await supabase.auth.getSession()\n return data.session?.access_token ?? null\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/binary-response.ts","../src/core.ts","../src/auth.ts"],"names":["WORKSPACE_HEADER","throwFromResponse"],"mappings":"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","file":"chunk-ZJCHIJND.cjs","sourcesContent":["/** Bound decoded response bytes even when Content-Length is absent or compressed. */\nexport async function readBinaryResponse(response: Response, maxBytes: number): Promise<ArrayBuffer> {\n const advertised = response.headers.get(\"content-length\")\n if (advertised !== null && (!/^\\d+$/.test(advertised) || Number(advertised) > maxBytes)) {\n await response.body?.cancel()\n throw new Error(\"Binary response exceeds its declared size limit\")\n }\n if (!response.body) return new ArrayBuffer(0)\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let length = 0\n try {\n while (true) {\n const next = await reader.read()\n if (next.done) break\n length += next.value.byteLength\n if (length > maxBytes) {\n await reader.cancel()\n throw new Error(\"Binary response exceeds its declared size limit\")\n }\n chunks.push(next.value)\n }\n } finally { reader.releaseLock() }\n const bytes = new Uint8Array(length)\n let offset = 0\n for (const chunk of chunks) { bytes.set(chunk, offset); offset += chunk.byteLength }\n return bytes.buffer\n}\n","/**\n * The client core: configuration, auth, the request transport and the\n * account-identity calls — everything a resource needs, and none of the\n * resources themselves.\n *\n * {@link NodaroClient} (`createClient`) extends it with every resource. An app\n * that uses only a few resources can extend it with just those, so it loads\n * (and its tests depend on) only the resource modules it actually uses:\n *\n * class AppClient extends NodaroClientCore {\n * readonly jobs = new JobsResource(this)\n * readonly nodes = new NodesResource(this) // needs `jobs` on the same client\n * }\n *\n * A resource that calls another one through the client says so in its\n * constructor type (`NodesResource` takes a core that also has `jobs`), so a\n * client missing it fails to compile rather than at run time.\n */\nimport { readBinaryResponse } from \"./binary-response.js\"\nimport { throwFromResponse } from \"./errors.js\"\nimport type { Auth } from \"./auth.js\"\nimport type { DeveloperAppKind, DeveloperAppScope } from \"./resources/developer-apps.js\"\nimport { WORKSPACE_HEADER, type MeOrganizations } from \"@nodaro/shared/organizations\"\n\n/** Replaced at build time by tsup `define` from package.json. The fallback\n * keeps `tsx`/vitest runs of the source working, where no define applies. */\ndeclare const __SDK_VERSION__: string | undefined\nconst SDK_VERSION = typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.0.0-dev\"\n\n/**\n * Identifies the calling package to the backend, which records it as the job's\n * provenance (`jobs.source` / `source_detail`) so an operator can tell a CLI\n * run from an SDK integration from a browser session.\n *\n * Only `sdk/…` and `cli/…` are honoured server-side; anything else is ignored\n * rather than trusted, since this is an unauthenticated header.\n */\nexport const CLIENT_HEADER = \"X-Nodaro-Client\"\n\n/**\n * In a browser the header is redundant AND a liability, so it is not sent.\n *\n * Redundant: the browser already sends `Origin`, which names the actual product\n * (`studio.nodaro.ai`) rather than merely the library it used — and the backend\n * deliberately prefers Origin over this header, so a browser-sent value is\n * discarded on arrival.\n *\n * A liability: `X-Nodaro-Client` is not a CORS-safelisted request header, so a\n * browser sending it requires an exact match in the server's\n * `Access-Control-Allow-Headers`. Any deployment whose backend predates that\n * allowlist entry would fail the PREFLIGHT — breaking every API call from the\n * app, not just its provenance. Self-hosted and lagging deployments make that a\n * real risk, and nothing in a browser app would reveal the cause.\n *\n * An EXPLICIT `clientLabel` is always sent regardless: a caller that names\n * itself has opted in deliberately, and that intent outranks this default.\n */\nconst isBrowser = (): boolean => typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n\nexport interface ClientOptions {\n /** Backend base URL, e.g. \"https://nodaro.example.com\" or empty string for same-origin. */\n baseUrl: string\n /** Auth provider. Use StaticTokenAuth, supabaseAuth, or CallbackAuth. */\n auth: Auth\n /** Optional fetch override (for tests or custom transports). */\n fetch?: typeof fetch\n /** Default request timeout in ms. Default 60s. */\n timeoutMs?: number\n /**\n * Overrides the `X-Nodaro-Client` label. Defaults to `sdk/<version>`.\n *\n * Exists for `@nodaro/cli`, which is a wrapper AROUND this SDK: without an\n * override every CLI invocation would be recorded as an SDK call and the two\n * surfaces could never be told apart.\n */\n clientLabel?: string\n /**\n * The workspace every request acts in — sent as `X-Nodaro-Workspace`.\n *\n * It selects which workspace a LIST reads from and where a CREATE lands.\n * It never authorizes: reading, updating, deleting or running an\n * identified object is decided by that object's own workspace, so a\n * forgotten header cannot hide work and a forged one cannot reach anyone\n * else's. Omit it to work in the caller's personal space.\n *\n * Prefer {@link NodaroClient.withWorkspace} for anything short-lived — one\n * client per workspace, no shared mutable selection to get wrong.\n */\n workspaceId?: string\n}\n\ninterface RequestOptions {\n body?: unknown\n query?: Record<string, string | number | boolean | undefined>\n headers?: Record<string, string>\n signal?: AbortSignal\n}\n\n/**\n * The authenticated user's canonical identity (`GET /v1/me`). A token-\n * introspection primitive: any valid bearer token (first-party Supabase JWT or\n * a developer-app OAuth token) resolves to its owner's identity. Mirrors the\n * `profiles` identity columns server-side — the route is the source of truth.\n */\nexport interface UserIdentity {\n /** Nodaro user id (= the Supabase auth user id). */\n readonly id: string\n readonly email: string\n /** Human-readable display name (from `profiles.full_name`); `null` if unset. */\n readonly displayName: string | null\n /** Avatar URL; `null` if unset. */\n readonly avatarUrl: string | null\n /** Subscription tier (e.g. \"free\", \"pro\"). */\n readonly tier: string\n /**\n * Whether the user holds an admin role. DESCRIPTIVE only — use it to decide\n * whether to render admin surfaces without capability-probing an admin\n * endpoint; every admin API stays enforced server-side regardless.\n */\n readonly isAdmin: boolean\n}\n\n/**\n * An app the user let into their account through OAuth (`GET\n * /v1/me/connected-apps`): a developer app, an AI assistant's MCP connector, or\n * a self-hosted install. One entry per grant still in force.\n */\nexport interface ConnectedApp {\n /** The grant's id — what {@link NodaroClient.revokeConnectedApp} takes. */\n readonly authorizationId: string\n /** The app's name; `null` if it has none. A `dynamic_mcp` client chose its own. */\n readonly name: string | null\n /**\n * How the app came to exist: `user` (a developer app someone registered),\n * `first_party_mcp`, `dynamic_mcp` (an MCP client that registered itself) or\n * `community_instance` (a self-hosted install).\n */\n readonly kind: DeveloperAppKind | (string & {})\n readonly homepageUrl: string | null\n /** The scopes this grant holds. */\n readonly scopes: readonly DeveloperAppScope[]\n /** When the user granted access (ISO 8601). */\n readonly connectedAt: string\n /** The latest use of any token issued under the grant; `null` if never used. */\n readonly lastUsedAt: string | null\n}\n\nexport class NodaroClientCore {\n readonly baseUrl: string\n readonly auth: Auth\n readonly timeoutMs: number\n /** Value sent as `X-Nodaro-Client`; recorded by the backend as job provenance. */\n readonly clientLabel: string\n /** Whether to actually send it — see the note on {@link CLIENT_HEADER}. */\n private readonly sendClientHeader: boolean\n private readonly fetchOverride: typeof fetch | undefined\n\n /**\n * Resolved lazily so consumers can swap `globalThis.fetch` after the\n * client has been constructed (e.g. test mocks). Always rebound to the\n * global object — native fetch throws \"Illegal invocation\" when its\n * `this` is anything else.\n */\n get fetch(): typeof fetch {\n return this.fetchOverride ?? globalThis.fetch.bind(globalThis)\n }\n\n /** The workspace this client acts in; undefined = the personal space. */\n readonly workspaceId: string | undefined\n\n constructor(opts: ClientOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/$/, \"\") // strip trailing slash\n this.auth = opts.auth\n this.fetchOverride = opts.fetch\n this.timeoutMs = opts.timeoutMs ?? 60_000\n this.clientLabel = opts.clientLabel ?? `sdk/${SDK_VERSION}`\n this.workspaceId = opts.workspaceId\n // Explicit label = deliberate opt-in, always sent. The default is suppressed\n // in browsers — see the note on CLIENT_HEADER.\n this.sendClientHeader = opts.clientLabel !== undefined || !isBrowser()\n }\n\n /**\n * The transport: build the request, send it, throw the typed error on a\n * non-2xx via {@link throwFromResponse}, then read the body via `read` — all\n * inside the abort timer, so `timeoutMs` bounds the body download too (a\n * stalled CSV stream aborts, it does not hang forever). Both the JSON path\n * ({@link request}) and the text path ({@link requestText}) go through here.\n */\n private async send<T>(\n method: string,\n path: string,\n options: RequestOptions,\n read: (res: Response) => Promise<T>,\n ): Promise<T> {\n const url = this.buildUrl(path, options.query)\n\n const token = await this.auth.getToken()\n // A `FormData` body is a multipart upload: let the runtime set\n // `Content-Type: multipart/form-data; boundary=…` itself (a manual JSON\n // content-type corrupts the boundary), and send the body as-is rather than\n // JSON-stringifying it. Every other body stays JSON, exactly as before.\n const isFormData =\n typeof FormData !== \"undefined\" && options.body instanceof FormData\n const headers: Record<string, string> = {\n ...(isFormData ? {} : { \"Content-Type\": \"application/json\" }),\n ...(this.sendClientHeader ? { [CLIENT_HEADER]: this.clientLabel } : {}),\n // Before per-request headers: a resource that needs to reach outside\n // this client's workspace says so explicitly and wins.\n ...(this.workspaceId ? { [WORKSPACE_HEADER]: this.workspaceId } : {}),\n ...(options.headers ?? {}),\n }\n if (token) headers[\"Authorization\"] = `Bearer ${token}`\n\n const ac = new AbortController()\n const timeoutId = setTimeout(() => ac.abort(), this.timeoutMs)\n const abort = () => ac.abort(options.signal?.reason)\n options.signal?.addEventListener(\"abort\", abort, { once: true })\n if (options.signal?.aborted) abort()\n\n try {\n ac.signal.throwIfAborted()\n const res = await this.fetch(url, {\n method,\n headers,\n body:\n options.body === undefined\n ? undefined\n : isFormData\n ? (options.body as FormData)\n : JSON.stringify(options.body),\n signal: ac.signal,\n })\n\n if (!res.ok) {\n let errBody: Record<string, unknown> = {}\n try {\n errBody = await res.json() as Record<string, unknown>\n } catch {\n // Empty/non-JSON body — fall through with empty errBody\n }\n throwFromResponse(res.status, errBody)\n }\n\n return await read(res)\n } finally {\n clearTimeout(timeoutId)\n options.signal?.removeEventListener(\"abort\", abort)\n }\n }\n\n /** Authenticated, bounded binary reads through the normal timeout/error transport. */\n async requestBytes(method: string, path: string, options: RequestOptions & { maxBytes: number }): Promise<ArrayBuffer> {\n if (!Number.isSafeInteger(options.maxBytes) || options.maxBytes < 1) throw new Error(\"maxBytes must be a positive integer\")\n return this.send(method, path, options, (response) => readBinaryResponse(response, options.maxBytes))\n }\n\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n return this.send(method, path, options, async (res) =>\n // 204 No Content\n res.status === 204 ? (undefined as T) : ((await res.json()) as T),\n )\n }\n\n /**\n * Like {@link request}, for endpoints that answer text (CSV exports). Errors\n * are still the JSON envelope and throw the same typed errors, and the read is\n * bounded by the same timeout as the request.\n */\n async requestText(method: string, path: string, options: RequestOptions = {}): Promise<string> {\n return this.send(method, path, options, (res) => res.text())\n }\n\n /**\n * `GET /v1/me` → the authenticated user's identity (see {@link UserIdentity}).\n * Unwraps the `{ data }` envelope. Throws `UnauthorizedError` (401) when the\n * token is missing/invalid, and the SDK's other typed errors as usual.\n *\n * On an instance with organizations it also carries what the caller belongs\n * to. THREE states, and collapsing them is wrong in a way users feel: the\n * organization fields ABSENT means this instance has no organizations at\n * all; present and empty means the account belongs to none; and\n * `organizationsUnavailable` means the lookup failed — keep whatever\n * selection you already had rather than concluding the person was removed\n * from everything.\n */\n async me(): Promise<UserIdentity & MeOrganizations> {\n const res = await this.request<{ data: UserIdentity & MeOrganizations }>(\"GET\", \"/v1/me\")\n return res.data\n }\n\n /**\n * `GET /v1/me/connected-apps` → every app with access to the signed-in\n * user's account (see {@link ConnectedApp}), newest grant first.\n *\n * **A signed-in browser session only.** The route answers a Supabase\n * session token (`supabaseAuth(…)`, `createSharedSupabaseClient`, or a\n * `StaticTokenAuth` holding one) and refuses every other credential with\n * `UnauthorizedError` (\"Sign in required\"): an app token or an API key must\n * not list the grants it lives under. Build your \"Connected apps\" settings\n * screen on this; a server-side integration cannot call it.\n */\n async connectedApps(): Promise<ConnectedApp[]> {\n const res = await this.request<{ apps: ConnectedApp[] }>(\"GET\", \"/v1/me/connected-apps\")\n return res.apps\n }\n\n /**\n * `POST /v1/me/connected-apps/:authorizationId/revoke` — ends an app's\n * access: the grant and every token issued under it, at once (the app's next\n * call is a 401). Resolves when done.\n *\n * A signed-in browser session only, like {@link connectedApps}. Throws\n * `NotFoundError` when the grant is not the user's or is already revoked.\n */\n async revokeConnectedApp(authorizationId: string): Promise<void> {\n await this.request(\"POST\", `/v1/me/connected-apps/${encodeURIComponent(authorizationId)}/revoke`)\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n const base = this.baseUrl || (typeof window !== \"undefined\" ? window.location.origin : \"http://placeholder\")\n const url = new URL(path, base)\n // If baseUrl was empty, strip the placeholder origin\n const fullUrl = this.baseUrl ? url.toString() : url.pathname + url.search\n if (query) {\n const u = new URL(this.baseUrl ? fullUrl : fullUrl, base)\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) u.searchParams.set(k, String(v))\n }\n return this.baseUrl ? u.toString() : u.pathname + u.search\n }\n return fullUrl\n }\n}\n","/**\n * Auth provides the token used for `Authorization: Bearer <token>` on each request.\n * Implementations:\n * - StaticTokenAuth — fixed string (server-side, OAuth access token, API token)\n * - CallbackAuth — caller-supplied async function (BYO logic)\n * - supabaseAuth — pulls JWT from a Supabase client live (browser frontends)\n */\nexport interface Auth {\n /** Returns the current Bearer token, or null if not authenticated. */\n getToken(): Promise<string | null>\n}\n\nexport class StaticTokenAuth implements Auth {\n constructor(private token: string) {}\n async getToken() {\n return this.token\n }\n}\n\nexport class CallbackAuth implements Auth {\n constructor(private fn: () => string | null | Promise<string | null>) {}\n async getToken() {\n return this.fn()\n }\n}\n\ninterface SupabaseLikeClient {\n auth: {\n getSession(): Promise<{ data: { session: { access_token: string } | null } }>\n }\n}\n\n/** Pulls a JWT from a Supabase v2 client. Caller supplies their own supabase. */\nexport function supabaseAuth(supabase: SupabaseLikeClient): Auth {\n return {\n async getToken() {\n const { data } = await supabase.auth.getSession()\n return data.session?.access_token ?? null\n },\n }\n}\n"]}
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  require('../chunk-NJVSKUL2.cjs');
4
- var chunkOIYMTGYN_cjs = require('../chunk-OIYMTGYN.cjs');
4
+ var chunkJOXZ4ZIF_cjs = require('../chunk-JOXZ4ZIF.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "AppsResource", {
9
9
  enumerable: true,
10
- get: function () { return chunkOIYMTGYN_cjs.AppsResource; }
10
+ get: function () { return chunkJOXZ4ZIF_cjs.AppsResource; }
11
11
  });
12
12
  //# sourceMappingURL=apps.cjs.map
13
13
  //# sourceMappingURL=apps.cjs.map
@@ -20,7 +20,7 @@ interface PublishedApp {
20
20
  /** The listed price per run; when `perMinuteCredits` is above 0, its fixed part. */
21
21
  estimatedCredits?: number | null;
22
22
  /** The listed price holds a metered LLM call's ESTIMATE (its model's typical
23
- * call, charged its actual usage per token): show it `~N`. Absent for a
23
+ * call, charged its actual usage per token): show it `≈N`. Absent for a
24
24
  * fixed price, and on a deployment running the tier-pricing rollback. */
25
25
  estimatedCreditsIsEstimate?: true;
26
26
  /**
@@ -20,7 +20,7 @@ interface PublishedApp {
20
20
  /** The listed price per run; when `perMinuteCredits` is above 0, its fixed part. */
21
21
  estimatedCredits?: number | null;
22
22
  /** The listed price holds a metered LLM call's ESTIMATE (its model's typical
23
- * call, charged its actual usage per token): show it `~N`. Absent for a
23
+ * call, charged its actual usage per token): show it `≈N`. Absent for a
24
24
  * fixed price, and on a deployment running the tier-pricing rollback. */
25
25
  estimatedCreditsIsEstimate?: true;
26
26
  /**
@@ -1,4 +1,4 @@
1
1
  import '../chunk-3PPSGM5X.js';
2
- export { AppsResource } from '../chunk-FQNCIP6K.js';
2
+ export { AppsResource } from '../chunk-7LODCIQK.js';
3
3
  //# sourceMappingURL=apps.js.map
4
4
  //# sourceMappingURL=apps.js.map
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  require('../chunk-RQSGS7ZK.cjs');
4
- var chunk55ZX6TE3_cjs = require('../chunk-55ZX6TE3.cjs');
4
+ var chunk66M54BUO_cjs = require('../chunk-66M54BUO.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "CastSwapResource", {
9
9
  enumerable: true,
10
- get: function () { return chunk55ZX6TE3_cjs.CastSwapResource; }
10
+ get: function () { return chunk66M54BUO_cjs.CastSwapResource; }
11
11
  });
12
12
  //# sourceMappingURL=cast-swap.cjs.map
13
13
  //# sourceMappingURL=cast-swap.cjs.map
@@ -3,9 +3,10 @@ import '@nodaro/shared/apps';
3
3
  import '@nodaro/shared/organizations';
4
4
 
5
5
  /**
6
- * Cast Swap — replace the people, pets, products and/or the location in a
7
- * short video with your own references, keeping its motion, framing, timing
8
- * and sound (the clip's audio is kept, and the result is the clip's length).
6
+ * Nodaro Motion (the `castSwap` resource; routes `/v1/cast-swap`) — replace
7
+ * the people, pets, products and/or the location in a short video with your
8
+ * own references, keeping its motion, framing, timing and sound (the clip's
9
+ * audio is kept, and the result is the clip's length).
9
10
  *
10
11
  * Before the video, each person, pet and product role's photos are turned
11
12
  * into one clean reference picture by an image model. This costs extra
@@ -14,11 +15,16 @@ import '@nodaro/shared/organizations';
14
15
  * photos if it fails, and is turned off with `prepareReferences: false`.
15
16
  * Locations are not prepared.
16
17
  *
17
- * Engines: a run is made on Seedance 2.5 (`engine` left out, or
18
- * `"seedance-2-5"`) or Kling 4 (`"kling-4"`). Kling 4 renders 720p (its
19
- * default) or 1080p and has no draft; it makes a new take guided by the clip
20
- * and pictures, so its Full Quality is a new take at 1080p rather than the
21
- * same take re-rendered (`CastSwapFullQualityEstimate.kind`).
18
+ * Engines: a run is made on Nodaro Motion Pro (`engine` left out, or
19
+ * `"motion-pro"`) or Nodaro Motion Lite (`"motion-lite"`). Lite renders 720p
20
+ * (its default) or 1080p and has no draft; it makes a new take guided by the
21
+ * clip and pictures, so its Full Quality is a new take at 1080p rather than
22
+ * the same take re-rendered (`CastSwapFullQualityEstimate.kind`).
23
+ *
24
+ * How the clip is prepared for the video model (for one, whether faces are
25
+ * hidden first, and whether a refused clip is retried) is set by Nodaro for
26
+ * each engine; a run cannot change it. `faceMasking` is no longer read
27
+ * (deprecated: accepted and ignored).
22
28
  *
23
29
  * Cloud edition only: `/v1/cast-swap` is served by the cloud plugin and 404s
24
30
  * on self-hosted installs. `run()` answers 202 with a job id; follow it with
@@ -34,40 +40,50 @@ import '@nodaro/shared/organizations';
34
40
  * anything is charged: 400 `validation_error` (the body: no role with images,
35
41
  * no reference and no `prePrompt` or `postPrompt`, more roles of a kind
36
42
  * than allowed, more than 30 images in all, `draft: true` above 480p, a
37
- * `prePrompt` or `postPrompt` over 4,000 characters, a `faceMasking` setting
38
- * out of range); on Kling 4, `draft_unsupported` (`draft: true`),
39
- * `resolution_unsupported` (480p), `output_format_unsupported` (a MOV edit
40
- * output) and `too_many_images` (more than 10 images in the run, across every
41
- * role and fixed reference); `raw_reference_token` (also in a reference's `line`),
43
+ * `prePrompt` or `postPrompt` over 4,000 characters); on Nodaro Motion Lite,
44
+ * `draft_unsupported` (`draft: true`), `resolution_unsupported` (480p),
45
+ * `output_format_unsupported` (a MOV edit output) and `too_many_images` (more
46
+ * than 10 images in the run, across every role and fixed reference);
47
+ * `raw_reference_token` (also in a reference's `line`),
42
48
  * `invalid_role_mention` (also any `{role:N}` in a reference's `line`),
43
49
  * `unsafe_url`, `video_unreadable`, `clip_out_of_range` (4–30 s),
44
50
  * `preview_out_of_range`, `no_roles_in_preview` (a preview with every role
45
51
  * `inPreview: false`, always refused even with a prompt, or with no role kept
46
52
  * in it that has images and no `prePrompt` or `postPrompt`), `prompt_too_long`
47
53
  * (the prompt would build too long: a `{role:N}` reads as the role's name when
48
- * it sends no images; Kling 4's cap is 8,000 characters); 401; 402 `insufficient_credits` (`run()` only); 404
54
+ * it sends no images; Nodaro Motion Lite's cap is 8,000 characters); 401; 402 `insufficient_credits` (`run()` only); 404
49
55
  * (a `sessionId` you may not use, `run()` only); 422 `job_blocked` (`run()`
50
56
  * only); 503 `host_too_old` (both); 503 `estimate_unavailable` (`estimate()`
51
57
  * only).
52
58
  */
53
59
  /**
54
- * The video engine a Cast Swap run is made on. Left out = `"seedance-2-5"`.
60
+ * The engine a Nodaro Motion run is made on, by its public id. Left out =
61
+ * `"motion-pro"`.
55
62
  *
56
- * - `"seedance-2-5"`: 480p (the default, a draft unless `draft: false`), 720p
57
- * or 1080p; Full Quality re-renders a draft's own take at 1080p.
58
- * - `"kling-4"`: 720p (the default) or 1080p, never a draft (`draft: true`
59
- * answers 400 `draft_unsupported`); Full Quality makes a new take at 1080p
60
- * from a completed 720p run's inputs. A preview is still 4 s from
61
- * `previewStart`.
63
+ * - `"motion-pro"` (Nodaro Motion Pro): 480p (the default, a draft unless
64
+ * `draft: false`), 720p or 1080p; Full Quality re-renders a draft's own take
65
+ * at 1080p.
66
+ * - `"motion-lite"` (Nodaro Motion Lite): 720p (the default) or 1080p, never a
67
+ * draft (`draft: true` answers 400 `draft_unsupported`); Full Quality makes a
68
+ * new take at 1080p from a completed 720p run's inputs. A preview is still
69
+ * 4 s from `previewStart`.
70
+ */
71
+ type CastSwapEngine = "motion-pro" | "motion-lite";
72
+ /**
73
+ * The engine ids an older client sent (`"seedance-2-5"` = `"motion-pro"`,
74
+ * `"kling-4"` = `"motion-lite"`). Still accepted in a request; never returned.
75
+ * @deprecated use {@link CastSwapEngine}.
62
76
  */
63
- type CastSwapEngine = "seedance-2-5" | "kling-4";
77
+ type CastSwapEngineLegacyId = "seedance-2-5" | "kling-4";
64
78
  /**
65
- * Where a Kling 4 run cuts the clip to whole seconds (Kling renders whole
66
- * seconds; asked for more than the clip, it would stretch the motion):
79
+ * Where a Nodaro Motion Lite run cuts the clip to whole seconds (Lite renders
80
+ * whole seconds; asked for more than the clip, it would stretch the motion):
67
81
  * - `"cut-end"` (the default): drop the fraction of a second at its end;
68
82
  * - `"cut-start"`: drop it at its start.
69
83
  */
70
- type CastSwapKlingLength = "cut-end" | "cut-start";
84
+ type CastSwapMotionLength = "cut-end" | "cut-start";
85
+ /** @deprecated use {@link CastSwapMotionLength}. */
86
+ type CastSwapKlingLength = CastSwapMotionLength;
71
87
  /** Whether a swapped subject takes this trait from the references (`"new"`) or keeps the video's (`"original"`). */
72
88
  type CastSwapTraitSource = "new" | "original";
73
89
  /**
@@ -150,62 +166,26 @@ interface CastSwapReference {
150
166
  line: string;
151
167
  }
152
168
  /**
153
- * Margins of the frame, each 0–49 %: a face whose centre lies in a margin is
154
- * not masked, so only faces inside the inner rectangle are. A margin left out
155
- * of a zone that is given is 0. (A `zone` left out altogether is 10 % at the
156
- * left and right: see `CastSwapFaceMasking.zone`.)
169
+ * @deprecated Nodaro sets this per engine; a run's `faceMasking` is ignored.
157
170
  */
158
171
  interface CastSwapFaceMaskingZone {
159
- /** % of the frame's width from the left edge. Default 0 in a zone that is given. */
160
172
  leftPct?: number;
161
- /** % of the frame's width from the right edge. Default 0 in a zone that is given. */
162
173
  rightPct?: number;
163
- /** % of the frame's height from the top edge. Default 0. */
164
174
  topPct?: number;
165
- /** % of the frame's height from the bottom edge. Default 0. */
166
175
  bottomPct?: number;
167
176
  }
168
177
  /**
169
- * Face masking: the faces in the source clip are covered before the video
170
- * model sees it, keeping their movement and lip timing while the rest of the
171
- * clip is sent as it is.
172
- *
173
- * - `"off"` (the same as leaving `faceMasking` out): the clip is sent as it is.
174
- * - `"always"`: the faces are masked before the first attempt. Its credits are
175
- * in the quote (`breakdown.masking`, counted in `totalCredits`).
176
- * - `"auto"`: the run starts unmasked; only if the video model refuses the
177
- * source clip is it retried once with the faces masked. Any other failure is
178
- * not retried. The extra credits, charged only when that retry runs, are the
179
- * estimate's `maskingCredits` (not in `totalCredits`).
180
- *
181
- * A completed job's output carries `faceMasking: { applied, reason }`:
182
- * `applied` is whether the video was made from the masked clip, and `reason`
183
- * is `"always"` (masked before the first attempt), `"input_refused"` (`auto`
184
- * retried after the source clip was refused), `"no_faces"` (no face was left
185
- * to mask after the filters: an `always` run continues unmasked; an `auto`
186
- * run fails with the original refusal instead) or `"off"`.
178
+ * @deprecated Nodaro sets how the clip is prepared for the video model, per
179
+ * engine; a run cannot change it. A `faceMasking` sent is accepted and
180
+ * ignored (no error), so older code keeps working unchanged.
187
181
  */
188
182
  interface CastSwapFaceMasking {
189
183
  mode: "off" | "always" | "auto";
190
- /** What covers a masked face: `"blur"` (default) or `"depth"` (a depth-color view of it). */
191
184
  fill?: "blur" | "depth";
192
- /** Mask only faces at least this % of the frame's height, 0–100. Default 15. */
193
185
  minFaceHeightPct?: number;
194
- /**
195
- * Mask only faces at most this % of the frame's height, 0–100. Default 0 (no
196
- * limit). When above 0 it must be at least `minFaceHeightPct` (else 400).
197
- */
198
186
  maxFaceHeightPct?: number;
199
- /**
200
- * Leave out faces near the edges of the frame. Default (left out):
201
- * `{ leftPct: 10, rightPct: 10, topPct: 0, bottomPct: 0 }`, so people at the
202
- * left and right edges are not masked. `null`, or all four margins 0, means
203
- * no margins.
204
- */
205
187
  zone?: CastSwapFaceMaskingZone | null;
206
- /** The blur's strength, 0.1–5 % of the frame's width (`fill: "blur"`). Default 2. */
207
188
  blurStrengthPct?: number;
208
- /** How sure the face finder must be, 0.05–0.95: lower finds more faces. Default 0.5. */
209
189
  threshold?: number;
210
190
  }
211
191
  /** The body of `POST /v1/cast-swap` and `POST /v1/cast-swap/estimate`. */
@@ -248,27 +228,30 @@ interface CastSwapParams {
248
228
  /** Where the preview starts, in seconds. Default 0. */
249
229
  previewStart?: number;
250
230
  /**
251
- * The video engine (see {@link CastSwapEngine}). Default `"seedance-2-5"`.
252
- * The job records it in `input_data.engine`, and a completed job's output
253
- * in its `engine`. A Cast Swap engine older than Kling 4 support ignores
254
- * the field and runs Seedance 2.5: a Kling 4 quote names `engine:
255
- * "kling-4"`, so check the estimate's `engine` before running.
231
+ * The engine (see {@link CastSwapEngine}). Default `"motion-pro"`. The job
232
+ * records it in `input_data.engine`, and a completed job's output in its
233
+ * `engine`. The ids an older client sent ({@link CastSwapEngineLegacyId})
234
+ * are still accepted.
256
235
  */
257
- engine?: CastSwapEngine;
236
+ engine?: CastSwapEngine | CastSwapEngineLegacyId;
258
237
  /**
259
- * Kling 4 only (Seedance 2.5 ignores it): which end of the clip is cut to
260
- * whole seconds (see {@link CastSwapKlingLength}). Default `"cut-end"`.
238
+ * Nodaro Motion Lite only (Pro ignores it): which end of the clip is cut to
239
+ * whole seconds (see {@link CastSwapMotionLength}). Default `"cut-end"`.
261
240
  */
241
+ motionLength?: CastSwapMotionLength;
242
+ /** @deprecated use {@link motionLength} (still accepted). */
262
243
  klingLength?: CastSwapKlingLength;
263
244
  /**
264
- * The output resolution. Seedance 2.5: `"480p"` (default), `"720p"` or
265
- * `"1080p"`. Kling 4: `"720p"` (default) or `"1080p"`; `"480p"` answers 400.
245
+ * The output resolution. Nodaro Motion Pro: `"480p"` (default), `"720p"` or
246
+ * `"1080p"`. Nodaro Motion Lite: `"720p"` (default) or `"1080p"`; `"480p"`
247
+ * answers 400.
266
248
  */
267
249
  resolution?: "480p" | "720p" | "1080p";
268
250
  /**
269
- * Render as a draft (Seedance 2.5 only). Defaults to `true` at 480p and
251
+ * Render as a draft (Nodaro Motion Pro only). Defaults to `true` at 480p and
270
252
  * `false` above it; `true` with `"720p"` or `"1080p"` answers 400 (draft is
271
- * 480p only). Kling 4 has no draft: `true` answers 400 `draft_unsupported`.
253
+ * 480p only). Nodaro Motion Lite has no draft: `true` answers 400
254
+ * `draft_unsupported`.
272
255
  */
273
256
  draft?: boolean;
274
257
  /**
@@ -278,7 +261,11 @@ interface CastSwapParams {
278
261
  * Default `true`.
279
262
  */
280
263
  prepareReferences?: boolean;
281
- /** Mask the faces in the source clip (see {@link CastSwapFaceMasking}). Default: off. */
264
+ /**
265
+ * Ignored: Nodaro sets how the clip is prepared, per engine. Accepted (no
266
+ * error) so older code keeps working.
267
+ * @deprecated leave it out.
268
+ */
282
269
  faceMasking?: CastSwapFaceMasking;
283
270
  /**
284
271
  * `"draft"` means 480p draft.
@@ -293,71 +280,58 @@ interface CastSwapParams {
293
280
  /** What a run would cost, in credits. */
294
281
  interface CastSwapEstimate {
295
282
  /**
296
- * The engine the run would use. Sent by an engine that knows Kling 4 on a
297
- * Kling 4 quote (`"kling-4"`); absent = Seedance 2.5.
283
+ * The engine the run would use, by its public id (absent from an older
284
+ * server = `"motion-pro"`).
298
285
  */
299
286
  engine?: CastSwapEngine;
300
287
  /**
301
- * What is held when the run starts: `breakdown.castSwap +
302
- * breakdown.seedance + breakdown.references` (on Kling 4,
303
- * `breakdown.kling` in place of `breakdown.seedance`), plus
304
- * `breakdown.masking` with face masking `"always"`. The run is charged what it actually costs, which
305
- * is expected to be `expectedCredits`.
288
+ * What is held when the run starts. The run is charged what it actually
289
+ * costs, which is expected to be `expectedCredits`.
306
290
  */
307
291
  totalCredits: number;
308
292
  /**
309
- * The charge the run is expected to come to: `breakdown.castSwap +
310
- * breakdown.seedanceExpected + breakdown.references`, plus
311
- * `breakdown.masking` with face masking `"always"` (the hold, with the video
312
- * model's expected charge in place of its hold). Never above `totalCredits`.
313
- * With `"auto"` the masking is in neither total (see `maskingCredits`).
314
- * `totalCredits` is what is held when the run starts; the run is charged
315
- * what it actually costs.
316
- *
317
- * Absent from an older Cast Swap engine: read `totalCredits` then. On
318
- * Kling 4 it equals `totalCredits` (Kling renders exactly the length asked
319
- * for, so the hold is what it settles at).
293
+ * The charge the run is expected to come to. Never above `totalCredits`
294
+ * (on Nodaro Motion Lite it equals it: Lite renders exactly the length
295
+ * asked for, so the hold is what it settles at). Absent from an older
296
+ * server: read `totalCredits` then.
320
297
  */
321
298
  expectedCredits?: number;
322
299
  /**
323
- * The parts of the quote:
300
+ * The parts of the quote, by name, for display only:
324
301
  * - `castSwap`: the run itself;
325
- * - `seedance`: what the video model it calls holds (the video's length is
326
- * left to the model, so it is held at the model's longest output);
327
- * - `seedanceExpected`: what the video model is expected to be charged (the
328
- * clip in and about as much out), never above `seedance`. It takes
329
- * `seedance`'s place in `expectedCredits`; it is not added to it. Absent
330
- * from an older Cast Swap engine, like `expectedCredits`;
331
- * - `kling`: Kling 4 only, in place of `seedance` and `seedanceExpected`:
332
- * what the Kling take costs (held and charged alike);
333
302
  * - `references`: preparing the reference pictures (0 when
334
303
  * `prepareReferences` is off or there is nothing to prepare);
335
- * - `masking`: masking the faces, present only when `faceMasking` is on.
336
- * With `"always"` it is in both totals; with `"auto"` it equals
337
- * `maskingCredits` and is in neither.
304
+ * - `motion`: what the video holds (on Nodaro Motion Lite, what it costs);
305
+ * - `motionExpected`: what the video is expected to be charged, never above
306
+ * `motion` (Nodaro Motion Pro);
307
+ * - `privacy`: preparing the clip, when the engine's setting does. In both
308
+ * totals when it always runs; outside both when it is the retry
309
+ * (`privacyCredits`).
338
310
  *
339
- * So the parts sum to more than either total: `seedance` and
340
- * `seedanceExpected` are alternatives, and `"auto"` masking is outside both.
311
+ * `motion` and `motionExpected` are alternatives, so the parts sum to more
312
+ * than either total: read `totalCredits` and `expectedCredits`, never the
313
+ * sum. Other parts may appear.
341
314
  */
342
315
  breakdown: {
343
316
  castSwap: number;
344
- seedance?: number;
345
317
  references: number;
346
- seedanceExpected?: number;
347
- kling?: number;
348
- masking?: number;
349
- };
318
+ motion?: number;
319
+ motionExpected?: number;
320
+ privacy?: number;
321
+ } & Record<string, number>;
350
322
  /**
351
- * Face masking `"auto"` only: the extra credits charged if the source clip
352
- * is refused and the run is retried with the faces masked. Not in
353
- * `totalCredits` or `expectedCredits`; `run()` needs credits for both the
354
- * hold and this (else 402).
323
+ * The extra credits charged only if the video model refuses the clip and
324
+ * the run is retried (Nodaro's setting for the engine decides whether it
325
+ * does). Not in `totalCredits` or `expectedCredits`; `run()` needs credits
326
+ * for both the hold and this (else 402).
355
327
  */
328
+ privacyCredits?: number;
329
+ /** @deprecated read {@link privacyCredits} (an older server answered this name). */
356
330
  maskingCredits?: number;
357
331
  /**
358
- * `true` when the video is made at Auto length (every Seedance 2.5 run): the
359
- * final charge is expected to come out lower than `totalCredits`, at about
360
- * `expectedCredits`. `false` on Kling 4.
332
+ * `true` when the video is made at Auto length (every Nodaro Motion Pro
333
+ * run): the final charge is expected to come out lower than `totalCredits`,
334
+ * at about `expectedCredits`. `false` on Nodaro Motion Lite.
361
335
  */
362
336
  settlesLower: boolean;
363
337
  }
@@ -374,36 +348,36 @@ interface CastSwapRunOptions {
374
348
  idempotencyKey?: string;
375
349
  }
376
350
  /**
377
- * What a Full Quality version would be: `"same-take"` re-renders a Seedance
378
- * 2.5 draft's own take at 1080p; `"new-take"` makes a new Kling 4 take at
351
+ * What a Full Quality version would be: `"same-take"` re-renders a Nodaro
352
+ * Motion Pro draft's own take at 1080p; `"new-take"` makes a new Nodaro Motion Lite take at
379
353
  * 1080p from a 720p run's inputs (it will not match the 720p run frame for
380
354
  * frame). The 720p run or draft stays either way.
381
355
  */
382
356
  type CastSwapFullQualityKind = "same-take" | "new-take";
383
357
  /**
384
358
  * What a Full Quality version of a run would cost
385
- * (`POST /v1/cast-swap/:jobId/full-quality/estimate`): a Seedance 2.5 draft,
386
- * or a completed Kling 4 run at 720p.
359
+ * (`POST /v1/cast-swap/:jobId/full-quality/estimate`): a Nodaro Motion Pro
360
+ * draft, or a completed Nodaro Motion Lite run at 720p.
387
361
  */
388
362
  interface CastSwapFullQualityEstimate {
389
363
  /**
390
364
  * Which Full Quality this is ({@link CastSwapFullQualityKind}), so it can
391
- * be worded right. Absent from an older Cast Swap engine: `"same-take"`.
365
+ * be worded right. Absent from an older server: `"same-take"`.
392
366
  */
393
367
  kind?: CastSwapFullQualityKind;
394
- /** The quote in credits: `breakdown.castSwap` + `breakdown.seedanceHd` (same take) or `breakdown.kling` (new take). */
368
+ /** The quote in credits: `breakdown.castSwap` plus the 1080p render (same take) or the new take. */
395
369
  totalCredits: number;
396
370
  /**
397
- * `castSwap`: the Full Quality job's own steps; `seedanceHd` (a same take):
398
- * the 1080p render of the draft's take (0 when an earlier try of this draft
399
- * already finished that render, which is then reused); `kling` (a new take,
400
- * in place of `seedanceHd`): the new Kling 4 take at 1080p.
371
+ * The parts of the quote, by name, for display only: `castSwap` (the Full
372
+ * Quality job's own steps), and `motionHd` (a same take: the 1080p render,
373
+ * 0 when an earlier try of this draft already finished that render, which
374
+ * is then reused) or `motion` (a new take).
401
375
  */
402
376
  breakdown: {
403
377
  castSwap: number;
404
- seedanceHd?: number;
405
- kling?: number;
406
- };
378
+ motionHd?: number;
379
+ motion?: number;
380
+ } & Record<string, number>;
407
381
  /** ISO time until which the run can be finished at Full Quality (7 days after it completed). */
408
382
  availableUntil: string;
409
383
  }
@@ -422,11 +396,11 @@ interface CastSwapFullQualityResult {
422
396
  * The `code` of a Full Quality refusal (`NodaroError.code`), all before
423
397
  * anything is charged:
424
398
  * - `unauthorized` (401): no authenticated user;
425
- * - `not_found` (404): not your job, or not a Cast Swap run; also a
399
+ * - `not_found` (404): not your job, or not a Nodaro Motion run; also a
426
400
  * `sessionId` you may not use;
427
401
  * - `not_completed` (409): the run has not finished;
428
- * - `not_a_draft` (409): the run is neither a Seedance 2.5 draft nor a
429
- * Kling 4 run at 720p (a Kling 4 run at 1080p is already Full Quality);
402
+ * - `not_a_draft` (409): the run is neither a Nodaro Motion Pro draft nor a
403
+ * Nodaro Motion Lite run at 720p (a Lite run at 1080p is already Full Quality);
430
404
  * - `draft_expired` (410): more than 7 days after the draft completed, or
431
405
  * the draft can no longer be finished at Full Quality;
432
406
  * - `full_quality_pending` (409, `details.retryable: true`): not final — an
@@ -450,7 +424,7 @@ declare class CastSwapResource {
450
424
  private client;
451
425
  constructor(client: NodaroClientCore);
452
426
  /**
453
- * Start a Cast Swap run (`POST /v1/cast-swap`, 202 `{ jobId }`). Returns the
427
+ * Start a Nodaro Motion run (`POST /v1/cast-swap`, 202 `{ jobId }`). Returns the
454
428
  * job to follow. With `options.idempotencyKey` (sent as the
455
429
  * `Idempotency-Key` header; 8–200 characters, else 400) a repeat with the
456
430
  * same key within about 10 s answers 200 `{ jobId, deduped: true }`, a later
@@ -465,8 +439,8 @@ declare class CastSwapResource {
465
439
  /**
466
440
  * Quote finishing a run at Full Quality (`POST
467
441
  * /v1/cast-swap/:jobId/full-quality/estimate`); spends nothing. `jobId` is a
468
- * finished Seedance 2.5 DRAFT run, or a finished Kling 4 run at 720p (a Cast
469
- * Swap or trend run); the quote's `kind` says whether it is the same take
442
+ * finished Nodaro Motion Pro DRAFT run, or a finished Nodaro Motion Lite
443
+ * run at 720p (a Nodaro Motion or trend run); the quote's `kind` says whether it is the same take
470
444
  * re-rendered or a new take. The quote
471
445
  * does not look for a Full Quality already running: when one is,
472
446
  * {@link fullQuality} answers it (`existing: true`) and charges nothing.
@@ -476,7 +450,7 @@ declare class CastSwapResource {
476
450
  /**
477
451
  * Finish a run at Full Quality (`POST /v1/cast-swap/:jobId/full-quality`):
478
452
  * at 1080p, with the clip's audio, as a new job linked to the run — a
479
- * Seedance 2.5 draft's own take re-rendered, or a new Kling 4 take from a
453
+ * Nodaro Motion Pro draft's own take re-rendered, or a new Nodaro Motion Lite take from a
480
454
  * 720p run's inputs (the quote's `kind`). SPENDS CREDITS: quote it first with
481
455
  * {@link fullQualityEstimate}. Answers 202 `{ jobId }`, or 200
482
456
  * `{ jobId, existing: true }` when this run's Full Quality is already
@@ -488,4 +462,4 @@ declare class CastSwapResource {
488
462
  fullQuality(jobId: string, params?: CastSwapFullQualityParams): Promise<CastSwapFullQualityResult>;
489
463
  }
490
464
 
491
- export { type CastSwapEngine, type CastSwapEstimate, type CastSwapFaceMasking, type CastSwapFaceMaskingZone, type CastSwapFullQualityEstimate, type CastSwapFullQualityKind, type CastSwapFullQualityParams, type CastSwapFullQualityRefusalCode, type CastSwapFullQualityResult, type CastSwapKlingLength, type CastSwapLocationRole, type CastSwapParams, type CastSwapPersonRole, type CastSwapPetRole, type CastSwapProductRole, type CastSwapReference, CastSwapResource, type CastSwapRole, type CastSwapRolePreviewSettings, type CastSwapRunOptions, type CastSwapTraitSource };
465
+ export { type CastSwapEngine, type CastSwapEngineLegacyId, type CastSwapEstimate, type CastSwapFaceMasking, type CastSwapFaceMaskingZone, type CastSwapFullQualityEstimate, type CastSwapFullQualityKind, type CastSwapFullQualityParams, type CastSwapFullQualityRefusalCode, type CastSwapFullQualityResult, type CastSwapKlingLength, type CastSwapLocationRole, type CastSwapMotionLength, type CastSwapParams, type CastSwapPersonRole, type CastSwapPetRole, type CastSwapProductRole, type CastSwapReference, CastSwapResource, type CastSwapRole, type CastSwapRolePreviewSettings, type CastSwapRunOptions, type CastSwapTraitSource };