diff --git a/.ai/rules/coding-style.mdc b/.ai/rules/coding-style.mdc index a8cea4c0..abc1fe6a 100644 --- a/.ai/rules/coding-style.mdc +++ b/.ai/rules/coding-style.mdc @@ -12,6 +12,13 @@ Coding style: - Favor using real paths (`../lib/schemas.ts`) over aliases (`@/app/lib/schemas`). - Favor `for (const comment of comments) {` over `comments.forEach((comment) => {` - Favor named exports over default exports, with the exception of Next.js pages +- Avoid namespace `*` imports unless the API is intentionally consumed as a namespace. Prefer named + imports so usage is explicit and bundlers can optimize. +- Avoid broad file-level lint suppressions. Prefer the narrowest scoped suppression on the exact + line, with a reason when the exception is not obvious. +- Preserve existing dependency import paths and module-system interop unless the change is required + and explained. Do not rewrite package imports to `node_modules/...`, switch ESM/CJS shapes, or add + duplicate export styles just to satisfy local tooling. - Do not wrap each function body and function call in `try`/`catch` blocks. It pollutes the code. Assume we will always have an e.g. `main().catch((err) => { console.error(err); process.exit(1) })` to catch us. I repeat: Avoid @@ -28,8 +35,22 @@ Coding style: - Use Prettier with 100 char line width, single quotes for JS/TS, semi: false - Use descriptive names: PascalCase for components/types, camelCase for variables/methods/schemas - Alphabetize imports, group by source type (built-in/external/internal) +- Preserve existing sorted lists and config ordering unless intentionally changing the order. - Favor US English over UK English, so `summarizeError` over `summarise Error` - Favor `.replaceAll('a', 'b)` over `.replace(/a/g, 'b')` or `.replace(new RegExp('a', 'g'), 'b')` when the only need for regeses was replacing all strings. That's usually both easier to read and more performant. - Use typographic characters: ellipsis (`…`) instead of `...`, curly quotes (`'` `"`) instead of straight quotes in user-facing text +- Generated text files should end with a trailing newline. Do not trim serializer output when the + serializer intentionally emits POSIX-style text. +- Comments should explain why code exists or why an exception is needed, not narrate what the next + line already says. +- Do not put TODOs, internal implementation notes, or future-work placeholders in user-facing text + or schema descriptions. Put those in code comments, issues, or docs for maintainers instead. - Put API keys and secrets in `.env` files, not hardcoded in components +- Do not return raw errors, stack traces, third-party responses, payment objects, database errors, or + credential data to clients. Show sanitized user-facing messages and log only redacted diagnostic + details server-side. +- When wrapping or rethrowing an error, preserve the original value with `new Error(message, { + cause: error })` when possible instead of stringifying it away. +- Remove temporary debug logging/instrumentation before merge. Keep new logs only when they are + intentional, useful in production, and do not expose sensitive data. - Check for existing hooks before creating new ones (e.g., `useUppy()` for Uppy functionality) diff --git a/.ai/rules/general.mdc b/.ai/rules/general.mdc index bb5f8659..e137d828 100644 --- a/.ai/rules/general.mdc +++ b/.ai/rules/general.mdc @@ -11,5 +11,7 @@ General: - Avoid blocking the conversation with terminal commands. For example: A) most of my git commands run through pagers, so pipe their output to `cat` to avoid blocking the terminal. B) You can use `tail` for logs, but be smart and use `-n` instead of `-f`, or the conversation will block - Use the `gh` tool to interact with GitHub (search/view an Issue, create a PR). +- When using `fetch()` directly, check `response.ok` before parsing the body, and surface non-2xx + responses as errors with enough context for debugging. - Treat `AGENTS.md` and `CLAUDE.md` as generated artifacts (single source of truth is `.ai/rules/`), managed by `~/code/content/_scripts/alphalib-sync.ts`; never edit those files directly. If you'd like to make a modification, do it here in `.ai/rules/` and the script will ensure proper preservation and syncing. If you need a rule specific to this repo, add it to `.ai/rules/repo.mdc`. - All new files are to be in TypeScript. Even if someone suggests: make this new foo3 feature, model it after `foo1.js`, create: `foo3.ts`. Chances are, a `foo2.ts` already exist that you can take a look at also for inspiration. diff --git a/.ai/rules/typescript.mdc b/.ai/rules/typescript.mdc index 40561500..961cb9c3 100644 --- a/.ai/rules/typescript.mdc +++ b/.ai/rules/typescript.mdc @@ -3,20 +3,76 @@ description: globs: alwaysApply: true --- + For Typescript: - Favor `contentGapItemSchema = z.object()` over `ContentGapItemSchema = z.object()` - Favor `from './PosterboyCommand.ts'` over `from './PosterboyCommand'` - Favor `return ideas.filter(isPresent)` over `ideas.filter((idea): idea is Idea => idea !== null)` - Favor using `.tsx` over `.jsx` file extensions. -- Use Node v24's native typestripping vs `tsx` or `ts-node`. These days you do not even need to pass `--experimental-strip-types`, `node app.ts` will just work. -- Favor `satisfies` over `as`, consider `as` a sin +- Use Node v24's native typestripping vs `tsx` or `ts-node`. These days you do not even need to pass + `--experimental-strip-types`, `node app.ts` will just work. +- In ESM TypeScript, use `import.meta.dirname` / `import.meta.filename` or `URL` objects instead of + rebuilding `__dirname` with `fileURLToPath(import.meta.url)` unless compatibility requires it. +- Use `satisfies` when you need literal preservation or structural conformance while keeping the + expression's inferred type. If the variable should simply have a declared type, use a type + annotation instead. +- Avoid redundant type annotations inside expressions when TypeScript already infers the exact type, + especially callback parameters. Keep explicit return types and public boundary annotations. +- Avoid `as`, consider it a sin. If a cast is unavoidable, keep it as narrow as possible and explain + the upstream type mismatch or runtime invariant. +- For DOM queries and browser APIs, prefer runtime narrowing such as + `element instanceof HTMLAnchorElement` over type casts. Decide explicitly whether a missing element + should throw, return early, or no-op. +- Browser/client code must not use Node-only globals or APIs such as `Buffer`. Use browser platform + APIs such as `btoa`, `TextEncoder`, `Blob`, or `URL`, or isolate the logic in server-only code. +- When browser APIs are missing TypeScript declarations, augment the global interface in + `_types/global.ts` (or the relevant shared global types file) and narrow with checks such as + `typeof navigator.setAppBadge === 'function'` instead of casting `navigator` locally. +- Prefer typed DOM properties such as `element.inert = true` and `element.tabIndex = -1` when the + platform exposes them. Use `setAttribute()` only when you intentionally need raw attribute + semantics. - Favor `unknown` over `any`, consider `any` a sin +- Avoid `as unknown as ...` and `biome-ignore lint/suspicious/noExplicitAny`. If an upstream library + type forces either, isolate it in a tiny adapter/helper with a comment naming the bad upstream + type. +- Every `@ts-expect-error` must be narrow and include a short explanation of the upstream type gap or + invariant that makes it safe. - Favor validating data with Zod over using `any` or custom type guards -- For local TypeScript files, import with the `.ts` / `.tsx` extension (not `.js`, not extensionless). - Note: we do not currently enable the TS 5.7 `rewriteRelativeImportExtensions` compiler option, - because it errors on non-relative imports that include `.ts`/`.tsx` (for example via `paths` - aliases like `@/…`). If/when we enable it, we will need to adjust those imports first. +- Extract duplicated Zod object shapes, regexes, and descriptions into reusable schema fragments + when they describe the same domain concept. Keep property-level concerns such as `.optional()` and + `.default()` at the property site unless absence is intrinsic to the reusable fragment. +- Boolean Zod properties should usually use explicit defaults instead of `.optional()` when omission + has normal default behavior. Only leave a boolean optional when `undefined` is semantically + different from `false`. +- Prefer `z.union([...])` over chained `.or()` for multi-branch unions, and prefer `z.enum()` or + literal unions over clever regexes when the accepted values are finite and autocomplete matters. +- Do not duplicate supported values in user-facing schema descriptions when schema metadata such as + enums or suggested values can carry that information. +- In TypeScript files, use TypeScript syntax instead of JSDoc type annotations. In JavaScript files, + prefer JSDoc `@import` / `@param` forms over noisy inline `import('...')` annotations, and make + sure `@type` annotates the expression it is meant to type. +- Avoid hand-written `.d.ts` files when the declaration can come from TypeScript source or + generation. If a declaration file is unavoidable, do not rely on `skipLibCheck` to hide duplicate + or invalid exports. +- Avoid `Reflect.get` for normal object property reads. After narrowing to a record, use + `record[key]` or a small typed reader helper. Only keep `Reflect.get` for exotic receivers such as + proxies or framework objects where its semantics are intentionally required, and document why. +- Prefer `Number.isFinite()` / `Number.isNaN()` over global `isFinite()` / `isNaN()` so numeric + checks do not silently coerce non-numbers. +- `isRecord` style guards must reject arrays: + `typeof value === 'object' && value !== null && !Array.isArray(value)`. Prefer importing a shared + guard when one already exists in the relevant shared layer. +- Type-only refactors must preserve runtime behavior. If the behavior intentionally changes, call it + out in the PR and cover the changed behavior with tests. +- Use ECMAScript `#private` fields for private state. Do not rely on underscore names or TypeScript + `private` to imply runtime privacy. +- Prefer Zod defaults/preprocessing for schema-backed default values instead of duplicating default + objects in runtime code. +- For local TypeScript files, import with the `.ts` / `.tsx` extension (not `.js`, not + extensionless). Note: we do not currently enable the TS 5.7 `rewriteRelativeImportExtensions` + compiler option, because it errors on non-relative imports that include `.ts`/`.tsx` (for example + via `paths` aliases like `@/…`). If/when we enable it, we will need to adjust those imports first. - Favor defining props as an interface over inline - Favor explicit return types over inferring them as it makes typescript a lot faster in the editor on our scale diff --git a/.ai/skills/gh-pr-to-green/SKILL.md b/.ai/skills/gh-pr-to-green/SKILL.md index 43bf0250..d6b03f1b 100644 --- a/.ai/skills/gh-pr-to-green/SKILL.md +++ b/.ai/skills/gh-pr-to-green/SKILL.md @@ -11,20 +11,31 @@ description: ## Workflow -- Get context from PR with `gh`, make sure if have all comments -- Write them as a markdown todolist in `repodocs/prompts/${YYYY}-${MM}-${DD}-${sluggedSemanticTopic}.md` and commit it. If the `repodocs/prompts/` dir does not exist, use the `docs/prompts/` dir. +- Get context from PR with `gh`; make sure all review comments, threads, CI failures, and PR + description updates are included. +- Write them as a markdown todolist in + `repodocs/prompts/${YYYY}-${MM}-${DD}-${sluggedSemanticTopic}.md` and commit it. If the + `repodocs/prompts/` dir does not exist, use the `docs/prompts/` dir. - Merge the latest main into our branch and resolve any conflict carefully. - Determine which review items are correct. -- Keep working until all items are checked off, either by fixing the issue, or explaining why not in the markdown list as well as comments in code where applicable/sensible -- commit and push +- Keep working until all items are checked off, either by fixing the issue, or explaining why not in + the markdown list as well as comments in code where applicable/sensible. +- Commit and push. - Invoke `council-review` -- Run the repo-required checks (often `yarn check`) -- Fix any issue that you deem related and worth fixing -- commit and push +- If the PR has UI/UX impact, invoke `claude-usertest` instead of duplicating browser-test + instructions here. Treat its output as reviewer input, reconcile findings yourself, and fold valid + fixes back into this PR-to-green loop. +- Run the repo-required checks (often `yarn check`). +- Fix any issue that you deem related and worth fixing. +- Commit and push. - Monitor CI until green: - Prefer `gh run watch` (works everywhere with `gh`). - If `gh-run-watch.ts` exists in the repo, it's fine to use that too. -- Fix any issue that you deem related and worth fixing -- Rinse and repeat until CI is green, or there are only 100% unrelated issues remaining +- Fix any issue that you deem related and worth fixing. +- Rinse and repeat until CI is green, or there are only 100% unrelated issues remaining. -Report back with a list of all changes made, and offer a link to the PR for inspection and merge. Offer to squash merge with `--admin` if the human thinks a last manual review is not needed. +This skill is PR orchestration only. Do not add inline UX/browser/user-test instructions here; use +dedicated validation skills for those workflows. + +Report back with a list of all changes made, and offer a link to the PR for inspection and merge. +Offer to squash merge with `--admin` if the human thinks a last manual review is not needed. diff --git a/.yarnrc.yml b/.yarnrc.yml index a8c427f4..480ad2fd 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,9 +1,9 @@ nodeLinker: node-modules +npmMinimalAgeGate: 2880 + packageExtensions: "@oxc-resolver/binding-wasm32-wasi@*": dependencies: - "@emnapi/core": "1.10.0" - "@emnapi/runtime": "1.10.0" - -npmMinimalAgeGate: 2880 + "@emnapi/core": 1.10.0 + "@emnapi/runtime": 1.10.0 diff --git a/AGENTS.md b/AGENTS.md index d808226b..6bd6f453 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,6 +9,13 @@ Coding style: - Favor using real paths (`../lib/schemas.ts`) over aliases (`@/app/lib/schemas`). - Favor `for (const comment of comments) {` over `comments.forEach((comment) => {` - Favor named exports over default exports, with the exception of Next.js pages +- Avoid namespace `*` imports unless the API is intentionally consumed as a namespace. Prefer named + imports so usage is explicit and bundlers can optimize. +- Avoid broad file-level lint suppressions. Prefer the narrowest scoped suppression on the exact + line, with a reason when the exception is not obvious. +- Preserve existing dependency import paths and module-system interop unless the change is required + and explained. Do not rewrite package imports to `node_modules/...`, switch ESM/CJS shapes, or add + duplicate export styles just to satisfy local tooling. - Do not wrap each function body and function call in `try`/`catch` blocks. It pollutes the code. Assume we will always have an e.g. `main().catch((err) => { console.error(err); process.exit(1) })` to catch us. I repeat: Avoid @@ -25,10 +32,24 @@ Coding style: - Use Prettier with 100 char line width, single quotes for JS/TS, semi: false - Use descriptive names: PascalCase for components/types, camelCase for variables/methods/schemas - Alphabetize imports, group by source type (built-in/external/internal) +- Preserve existing sorted lists and config ordering unless intentionally changing the order. - Favor US English over UK English, so `summarizeError` over `summarise Error` - Favor `.replaceAll('a', 'b)` over `.replace(/a/g, 'b')` or `.replace(new RegExp('a', 'g'), 'b')` when the only need for regeses was replacing all strings. That's usually both easier to read and more performant. - Use typographic characters: ellipsis (`…`) instead of `...`, curly quotes (`'` `"`) instead of straight quotes in user-facing text +- Generated text files should end with a trailing newline. Do not trim serializer output when the + serializer intentionally emits POSIX-style text. +- Comments should explain why code exists or why an exception is needed, not narrate what the next + line already says. +- Do not put TODOs, internal implementation notes, or future-work placeholders in user-facing text + or schema descriptions. Put those in code comments, issues, or docs for maintainers instead. - Put API keys and secrets in `.env` files, not hardcoded in components +- Do not return raw errors, stack traces, third-party responses, payment objects, database errors, or + credential data to clients. Show sanitized user-facing messages and log only redacted diagnostic + details server-side. +- When wrapping or rethrowing an error, preserve the original value with `new Error(message, { + cause: error })` when possible instead of stringifying it away. +- Remove temporary debug logging/instrumentation before merge. Keep new logs only when they are + intentional, useful in production, and do not expose sensitive data. - Check for existing hooks before creating new ones (e.g., `useUppy()` for Uppy functionality) ## general @@ -41,6 +62,8 @@ General: - Avoid blocking the conversation with terminal commands. For example: A) most of my git commands run through pagers, so pipe their output to `cat` to avoid blocking the terminal. B) You can use `tail` for logs, but be smart and use `-n` instead of `-f`, or the conversation will block - Use the `gh` tool to interact with GitHub (search/view an Issue, create a PR). +- When using `fetch()` directly, check `response.ok` before parsing the body, and surface non-2xx + responses as errors with enough context for debugging. - Treat `AGENTS.md` and `CLAUDE.md` as generated artifacts (single source of truth is `.ai/rules/`), managed by `~/code/content/_scripts/alphalib-sync.ts`; never edit those files directly. If you'd like to make a modification, do it here in `.ai/rules/` and the script will ensure proper preservation and syncing. If you need a rule specific to this repo, add it to `.ai/rules/repo.mdc`. - All new files are to be in TypeScript. Even if someone suggests: make this new foo3 feature, model it after `foo1.js`, create: `foo3.ts`. Chances are, a `foo2.ts` already exist that you can take a look at also for inspiration. @@ -61,14 +84,69 @@ For Typescript: - Favor `from './PosterboyCommand.ts'` over `from './PosterboyCommand'` - Favor `return ideas.filter(isPresent)` over `ideas.filter((idea): idea is Idea => idea !== null)` - Favor using `.tsx` over `.jsx` file extensions. -- Use Node v24's native typestripping vs `tsx` or `ts-node`. These days you do not even need to pass `--experimental-strip-types`, `node app.ts` will just work. -- Favor `satisfies` over `as`, consider `as` a sin +- Use Node v24's native typestripping vs `tsx` or `ts-node`. These days you do not even need to pass + `--experimental-strip-types`, `node app.ts` will just work. +- In ESM TypeScript, use `import.meta.dirname` / `import.meta.filename` or `URL` objects instead of + rebuilding `__dirname` with `fileURLToPath(import.meta.url)` unless compatibility requires it. +- Use `satisfies` when you need literal preservation or structural conformance while keeping the + expression's inferred type. If the variable should simply have a declared type, use a type + annotation instead. +- Avoid redundant type annotations inside expressions when TypeScript already infers the exact type, + especially callback parameters. Keep explicit return types and public boundary annotations. +- Avoid `as`, consider it a sin. If a cast is unavoidable, keep it as narrow as possible and explain + the upstream type mismatch or runtime invariant. +- For DOM queries and browser APIs, prefer runtime narrowing such as + `element instanceof HTMLAnchorElement` over type casts. Decide explicitly whether a missing element + should throw, return early, or no-op. +- Browser/client code must not use Node-only globals or APIs such as `Buffer`. Use browser platform + APIs such as `btoa`, `TextEncoder`, `Blob`, or `URL`, or isolate the logic in server-only code. +- When browser APIs are missing TypeScript declarations, augment the global interface in + `_types/global.ts` (or the relevant shared global types file) and narrow with checks such as + `typeof navigator.setAppBadge === 'function'` instead of casting `navigator` locally. +- Prefer typed DOM properties such as `element.inert = true` and `element.tabIndex = -1` when the + platform exposes them. Use `setAttribute()` only when you intentionally need raw attribute + semantics. - Favor `unknown` over `any`, consider `any` a sin +- Avoid `as unknown as ...` and `biome-ignore lint/suspicious/noExplicitAny`. If an upstream library + type forces either, isolate it in a tiny adapter/helper with a comment naming the bad upstream + type. +- Every `@ts-expect-error` must be narrow and include a short explanation of the upstream type gap or + invariant that makes it safe. - Favor validating data with Zod over using `any` or custom type guards -- For local TypeScript files, import with the `.ts` / `.tsx` extension (not `.js`, not extensionless). - Note: we do not currently enable the TS 5.7 `rewriteRelativeImportExtensions` compiler option, - because it errors on non-relative imports that include `.ts`/`.tsx` (for example via `paths` - aliases like `@/…`). If/when we enable it, we will need to adjust those imports first. +- Extract duplicated Zod object shapes, regexes, and descriptions into reusable schema fragments + when they describe the same domain concept. Keep property-level concerns such as `.optional()` and + `.default()` at the property site unless absence is intrinsic to the reusable fragment. +- Boolean Zod properties should usually use explicit defaults instead of `.optional()` when omission + has normal default behavior. Only leave a boolean optional when `undefined` is semantically + different from `false`. +- Prefer `z.union([...])` over chained `.or()` for multi-branch unions, and prefer `z.enum()` or + literal unions over clever regexes when the accepted values are finite and autocomplete matters. +- Do not duplicate supported values in user-facing schema descriptions when schema metadata such as + enums or suggested values can carry that information. +- In TypeScript files, use TypeScript syntax instead of JSDoc type annotations. In JavaScript files, + prefer JSDoc `@import` / `@param` forms over noisy inline `import('...')` annotations, and make + sure `@type` annotates the expression it is meant to type. +- Avoid hand-written `.d.ts` files when the declaration can come from TypeScript source or + generation. If a declaration file is unavoidable, do not rely on `skipLibCheck` to hide duplicate + or invalid exports. +- Avoid `Reflect.get` for normal object property reads. After narrowing to a record, use + `record[key]` or a small typed reader helper. Only keep `Reflect.get` for exotic receivers such as + proxies or framework objects where its semantics are intentionally required, and document why. +- Prefer `Number.isFinite()` / `Number.isNaN()` over global `isFinite()` / `isNaN()` so numeric + checks do not silently coerce non-numbers. +- `isRecord` style guards must reject arrays: + `typeof value === 'object' && value !== null && !Array.isArray(value)`. Prefer importing a shared + guard when one already exists in the relevant shared layer. +- Type-only refactors must preserve runtime behavior. If the behavior intentionally changes, call it + out in the PR and cover the changed behavior with tests. +- Use ECMAScript `#private` fields for private state. Do not rely on underscore names or TypeScript + `private` to imply runtime privacy. +- Prefer Zod defaults/preprocessing for schema-backed default values instead of duplicating default + objects in runtime code. +- For local TypeScript files, import with the `.ts` / `.tsx` extension (not `.js`, not + extensionless). Note: we do not currently enable the TS 5.7 `rewriteRelativeImportExtensions` + compiler option, because it errors on non-relative imports that include `.ts`/`.tsx` (for example + via `paths` aliases like `@/…`). If/when we enable it, we will need to adjust those imports first. - Favor defining props as an interface over inline - Favor explicit return types over inferring them as it makes typescript a lot faster in the editor on our scale diff --git a/CLAUDE.md b/CLAUDE.md index d808226b..6bd6f453 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,6 +9,13 @@ Coding style: - Favor using real paths (`../lib/schemas.ts`) over aliases (`@/app/lib/schemas`). - Favor `for (const comment of comments) {` over `comments.forEach((comment) => {` - Favor named exports over default exports, with the exception of Next.js pages +- Avoid namespace `*` imports unless the API is intentionally consumed as a namespace. Prefer named + imports so usage is explicit and bundlers can optimize. +- Avoid broad file-level lint suppressions. Prefer the narrowest scoped suppression on the exact + line, with a reason when the exception is not obvious. +- Preserve existing dependency import paths and module-system interop unless the change is required + and explained. Do not rewrite package imports to `node_modules/...`, switch ESM/CJS shapes, or add + duplicate export styles just to satisfy local tooling. - Do not wrap each function body and function call in `try`/`catch` blocks. It pollutes the code. Assume we will always have an e.g. `main().catch((err) => { console.error(err); process.exit(1) })` to catch us. I repeat: Avoid @@ -25,10 +32,24 @@ Coding style: - Use Prettier with 100 char line width, single quotes for JS/TS, semi: false - Use descriptive names: PascalCase for components/types, camelCase for variables/methods/schemas - Alphabetize imports, group by source type (built-in/external/internal) +- Preserve existing sorted lists and config ordering unless intentionally changing the order. - Favor US English over UK English, so `summarizeError` over `summarise Error` - Favor `.replaceAll('a', 'b)` over `.replace(/a/g, 'b')` or `.replace(new RegExp('a', 'g'), 'b')` when the only need for regeses was replacing all strings. That's usually both easier to read and more performant. - Use typographic characters: ellipsis (`…`) instead of `...`, curly quotes (`'` `"`) instead of straight quotes in user-facing text +- Generated text files should end with a trailing newline. Do not trim serializer output when the + serializer intentionally emits POSIX-style text. +- Comments should explain why code exists or why an exception is needed, not narrate what the next + line already says. +- Do not put TODOs, internal implementation notes, or future-work placeholders in user-facing text + or schema descriptions. Put those in code comments, issues, or docs for maintainers instead. - Put API keys and secrets in `.env` files, not hardcoded in components +- Do not return raw errors, stack traces, third-party responses, payment objects, database errors, or + credential data to clients. Show sanitized user-facing messages and log only redacted diagnostic + details server-side. +- When wrapping or rethrowing an error, preserve the original value with `new Error(message, { + cause: error })` when possible instead of stringifying it away. +- Remove temporary debug logging/instrumentation before merge. Keep new logs only when they are + intentional, useful in production, and do not expose sensitive data. - Check for existing hooks before creating new ones (e.g., `useUppy()` for Uppy functionality) ## general @@ -41,6 +62,8 @@ General: - Avoid blocking the conversation with terminal commands. For example: A) most of my git commands run through pagers, so pipe their output to `cat` to avoid blocking the terminal. B) You can use `tail` for logs, but be smart and use `-n` instead of `-f`, or the conversation will block - Use the `gh` tool to interact with GitHub (search/view an Issue, create a PR). +- When using `fetch()` directly, check `response.ok` before parsing the body, and surface non-2xx + responses as errors with enough context for debugging. - Treat `AGENTS.md` and `CLAUDE.md` as generated artifacts (single source of truth is `.ai/rules/`), managed by `~/code/content/_scripts/alphalib-sync.ts`; never edit those files directly. If you'd like to make a modification, do it here in `.ai/rules/` and the script will ensure proper preservation and syncing. If you need a rule specific to this repo, add it to `.ai/rules/repo.mdc`. - All new files are to be in TypeScript. Even if someone suggests: make this new foo3 feature, model it after `foo1.js`, create: `foo3.ts`. Chances are, a `foo2.ts` already exist that you can take a look at also for inspiration. @@ -61,14 +84,69 @@ For Typescript: - Favor `from './PosterboyCommand.ts'` over `from './PosterboyCommand'` - Favor `return ideas.filter(isPresent)` over `ideas.filter((idea): idea is Idea => idea !== null)` - Favor using `.tsx` over `.jsx` file extensions. -- Use Node v24's native typestripping vs `tsx` or `ts-node`. These days you do not even need to pass `--experimental-strip-types`, `node app.ts` will just work. -- Favor `satisfies` over `as`, consider `as` a sin +- Use Node v24's native typestripping vs `tsx` or `ts-node`. These days you do not even need to pass + `--experimental-strip-types`, `node app.ts` will just work. +- In ESM TypeScript, use `import.meta.dirname` / `import.meta.filename` or `URL` objects instead of + rebuilding `__dirname` with `fileURLToPath(import.meta.url)` unless compatibility requires it. +- Use `satisfies` when you need literal preservation or structural conformance while keeping the + expression's inferred type. If the variable should simply have a declared type, use a type + annotation instead. +- Avoid redundant type annotations inside expressions when TypeScript already infers the exact type, + especially callback parameters. Keep explicit return types and public boundary annotations. +- Avoid `as`, consider it a sin. If a cast is unavoidable, keep it as narrow as possible and explain + the upstream type mismatch or runtime invariant. +- For DOM queries and browser APIs, prefer runtime narrowing such as + `element instanceof HTMLAnchorElement` over type casts. Decide explicitly whether a missing element + should throw, return early, or no-op. +- Browser/client code must not use Node-only globals or APIs such as `Buffer`. Use browser platform + APIs such as `btoa`, `TextEncoder`, `Blob`, or `URL`, or isolate the logic in server-only code. +- When browser APIs are missing TypeScript declarations, augment the global interface in + `_types/global.ts` (or the relevant shared global types file) and narrow with checks such as + `typeof navigator.setAppBadge === 'function'` instead of casting `navigator` locally. +- Prefer typed DOM properties such as `element.inert = true` and `element.tabIndex = -1` when the + platform exposes them. Use `setAttribute()` only when you intentionally need raw attribute + semantics. - Favor `unknown` over `any`, consider `any` a sin +- Avoid `as unknown as ...` and `biome-ignore lint/suspicious/noExplicitAny`. If an upstream library + type forces either, isolate it in a tiny adapter/helper with a comment naming the bad upstream + type. +- Every `@ts-expect-error` must be narrow and include a short explanation of the upstream type gap or + invariant that makes it safe. - Favor validating data with Zod over using `any` or custom type guards -- For local TypeScript files, import with the `.ts` / `.tsx` extension (not `.js`, not extensionless). - Note: we do not currently enable the TS 5.7 `rewriteRelativeImportExtensions` compiler option, - because it errors on non-relative imports that include `.ts`/`.tsx` (for example via `paths` - aliases like `@/…`). If/when we enable it, we will need to adjust those imports first. +- Extract duplicated Zod object shapes, regexes, and descriptions into reusable schema fragments + when they describe the same domain concept. Keep property-level concerns such as `.optional()` and + `.default()` at the property site unless absence is intrinsic to the reusable fragment. +- Boolean Zod properties should usually use explicit defaults instead of `.optional()` when omission + has normal default behavior. Only leave a boolean optional when `undefined` is semantically + different from `false`. +- Prefer `z.union([...])` over chained `.or()` for multi-branch unions, and prefer `z.enum()` or + literal unions over clever regexes when the accepted values are finite and autocomplete matters. +- Do not duplicate supported values in user-facing schema descriptions when schema metadata such as + enums or suggested values can carry that information. +- In TypeScript files, use TypeScript syntax instead of JSDoc type annotations. In JavaScript files, + prefer JSDoc `@import` / `@param` forms over noisy inline `import('...')` annotations, and make + sure `@type` annotates the expression it is meant to type. +- Avoid hand-written `.d.ts` files when the declaration can come from TypeScript source or + generation. If a declaration file is unavoidable, do not rely on `skipLibCheck` to hide duplicate + or invalid exports. +- Avoid `Reflect.get` for normal object property reads. After narrowing to a record, use + `record[key]` or a small typed reader helper. Only keep `Reflect.get` for exotic receivers such as + proxies or framework objects where its semantics are intentionally required, and document why. +- Prefer `Number.isFinite()` / `Number.isNaN()` over global `isFinite()` / `isNaN()` so numeric + checks do not silently coerce non-numbers. +- `isRecord` style guards must reject arrays: + `typeof value === 'object' && value !== null && !Array.isArray(value)`. Prefer importing a shared + guard when one already exists in the relevant shared layer. +- Type-only refactors must preserve runtime behavior. If the behavior intentionally changes, call it + out in the PR and cover the changed behavior with tests. +- Use ECMAScript `#private` fields for private state. Do not rely on underscore names or TypeScript + `private` to imply runtime privacy. +- Prefer Zod defaults/preprocessing for schema-backed default values instead of duplicating default + objects in runtime code. +- For local TypeScript files, import with the `.ts` / `.tsx` extension (not `.js`, not + extensionless). Note: we do not currently enable the TS 5.7 `rewriteRelativeImportExtensions` + compiler option, because it errors on non-relative imports that include `.ts`/`.tsx` (for example + via `paths` aliases like `@/…`). If/when we enable it, we will need to adjust those imports first. - Favor defining props as an interface over inline - Favor explicit return types over inferring them as it makes typescript a lot faster in the editor on our scale diff --git a/docs/fingerprint/transloadit-baseline.json b/docs/fingerprint/transloadit-baseline.json index e7bab499..7e5b34c3 100644 --- a/docs/fingerprint/transloadit-baseline.json +++ b/docs/fingerprint/transloadit-baseline.json @@ -1,13 +1,13 @@ { "packageDir": "packages/transloadit", "tarball": { - "filename": "transloadit-4.8.1.tgz", - "sizeBytes": 973719, - "sha256": "89e3878a12927fa3b189da7115390578ec8f8694e5151605f002afc6471a0ec3" + "filename": "transloadit-4.10.2.tgz", + "sizeBytes": 996494, + "sha256": "3efbc4f6d47037cd52eff1d7f9860b3ed7e5ea6e8e5dafb462540bc63dd1da36" }, "packageJson": { "name": "transloadit", - "version": "4.8.1", + "version": "4.10.2", "main": "./dist/Transloadit.js", "exports": { ".": "./dist/Transloadit.js", @@ -28,13 +28,13 @@ }, { "path": "dist/alphalib/types/robots/_instructions-primitives.js", - "sizeBytes": 62635, - "sha256": "af657b45b7780d27f3c534766a578ea65234b89be27362ed2b32f7bd412e6fb2" + "sizeBytes": 64568, + "sha256": "495b289f4a5092a647fcd0c2eefd94e7fb09de9c1d6c464fa3548ce6dd7dd8c3" }, { "path": "dist/alphalib/types/robots/ai-chat.js", - "sizeBytes": 11121, - "sha256": "a64a31fc2309520b53c88bd7a93fa1da618f0f04e6d50767d402cb73d6723256" + "sizeBytes": 11324, + "sha256": "b33d3c204e48eed679e5095f727be0965af1c54ca9ec57d73ff00b31ad45b56c" }, { "path": "dist/ApiError.js", @@ -48,8 +48,8 @@ }, { "path": "dist/cli/commands/assemblies.js", - "sizeBytes": 53557, - "sha256": "733b23ad1c8c65a9be218fdb0458d7b90da4ada9304198ab0935cf5f4b71f4ae" + "sizeBytes": 54203, + "sha256": "e4f182058afcc14718e3825ba0b0910af281b3a8bf9b70b95b74d22ae7f20260" }, { "path": "dist/alphalib/types/assembliesGet.js", @@ -68,8 +68,8 @@ }, { "path": "dist/alphalib/types/robots/assembly-savejson.js", - "sizeBytes": 1037, - "sha256": "49f70524abe766cc88fa25b457de851d9ee2ab70c2d7e325890b655944f035dd" + "sizeBytes": 1427, + "sha256": "f09bce89ca3361e7e6dc1587c9fa85cb17e648e34e86da96fe3c5fdd4a61c61c" }, { "path": "dist/cli/docs/assemblyLintingExamples.js", @@ -88,8 +88,8 @@ }, { "path": "dist/alphalib/types/assemblyStatus.js", - "sizeBytes": 32083, - "sha256": "1882472bab298064f4f591beb1cb79ac85b7459792f749e5427d18dc74081573" + "sizeBytes": 37511, + "sha256": "2cfdb540cea8cbaa38f226235754dfcac3499faff27d2b33cc96b17d55b881c4" }, { "path": "dist/alphalib/types/assemblyUrls.js", @@ -263,8 +263,8 @@ }, { "path": "dist/alphalib/types/robots/document-thumbs.js", - "sizeBytes": 10320, - "sha256": "61e7ac5bfc7aa084772a49587b58c1e12da9f1b4ba4ef8502f42ba154fee4fbe" + "sizeBytes": 11716, + "sha256": "5e5bc1ed0c7ec362cf0b4a3e1e8a1fec301f51497a6a0c82018f582b1ee61267" }, { "path": "dist/alphalib/types/robots/dropbox-import.js", @@ -286,6 +286,11 @@ "sizeBytes": 1431, "sha256": "1066bcc2369c0c784d05428a1bb22b670b9be6241ddb8e1b69606c9ba3ed3266" }, + { + "path": "dist/alphalib/errors.js", + "sizeBytes": 898, + "sha256": "7931c670d51b2bfafd9b5569d426a671b6a22c6f1d7b850e0ed064c9ace43035" + }, { "path": "dist/alphalib/types/robots/file-compress.js", "sizeBytes": 6486, @@ -298,8 +303,8 @@ }, { "path": "dist/alphalib/types/robots/file-filter.js", - "sizeBytes": 7525, - "sha256": "df963195577a7100849a0ca2bf58cf140773fb2572638cedf06a5e5c5b8fb169" + "sizeBytes": 7926, + "sha256": "22fa538a9516d6d0a510f647dfa2c21c9c345c9b2c3b03777cdbc28d2176fc37" }, { "path": "dist/alphalib/types/robots/file-hash.js", @@ -333,8 +338,8 @@ }, { "path": "dist/alphalib/types/robots/file-watermark.js", - "sizeBytes": 1516, - "sha256": "550740f659e76083143dcd817bfbda7f24fba8078b954ba22581fcaf1c3cc679" + "sizeBytes": 1916, + "sha256": "11a3f951fa77b9bd382e5da3ee94d69f571c82a97fa7902f8a801f69a8a2cfb3" }, { "path": "dist/cli/fileProcessingOptions.js", @@ -378,8 +383,8 @@ }, { "path": "dist/alphalib/types/robots/http-import.js", - "sizeBytes": 5721, - "sha256": "e1c22321e77fdf475b05662a9da70e5904a93c02a375f1001c134bb201423f31" + "sizeBytes": 6030, + "sha256": "ebac993c85def6964d1966e7ab9ccee3558bfac99a7044fdc0d60fcedeaab093" }, { "path": "dist/alphalib/types/robots/image-bgremove.js", @@ -408,13 +413,13 @@ }, { "path": "dist/alphalib/types/robots/image-generate.js", - "sizeBytes": 5141, - "sha256": "04fbc9d9a688b42a2d5f53586e41e2d08da3a8f7197640cde51e8f28015aeeab" + "sizeBytes": 5305, + "sha256": "caf59f043d36fe37493c3c1dbd33bc7ea9b2ccd5dacb028ebe94a6ae91bb4066" }, { "path": "dist/alphalib/types/robots/image-merge.js", - "sizeBytes": 3675, - "sha256": "4c9b21e6054c0e7e75db798af9eef867dd37b973046987d3d18a0abd8d95a75f" + "sizeBytes": 6270, + "sha256": "800457bb83294eef0835d7d13b1299b2b15f75a7db538bf723b119caf45edb3d" }, { "path": "dist/alphalib/types/robots/image-ocr.js", @@ -423,13 +428,13 @@ }, { "path": "dist/alphalib/types/robots/image-optimize.js", - "sizeBytes": 5048, - "sha256": "a163c1bea9e1e259e1bfa0296a7cf6b882e515341369ce452c9affb37802e8d4" + "sizeBytes": 5134, + "sha256": "59aa8602e993737ac403fde343c4ef3386daf490fa99227ba8f8ecb705d93d1c" }, { "path": "dist/alphalib/types/robots/image-resize.js", - "sizeBytes": 29244, - "sha256": "5e94b3c34f4713ae25f21b6a8d13a31668997f860dc6d5327b2c853846fcba04" + "sizeBytes": 29267, + "sha256": "d00e333cd4e114a2a2f4a4b50c8cea161d10544b1fd559000bbdb4a5146bf84d" }, { "path": "dist/alphalib/types/robots/image-upscale.js", @@ -443,8 +448,8 @@ }, { "path": "dist/cli/semanticIntents/imageGenerate.js", - "sizeBytes": 7255, - "sha256": "4e1d76b9a04007144493bded2dfc5ba6e8e8908b793c5fe425fc523fc0d4992f" + "sizeBytes": 7574, + "sha256": "62bf4d77d72bfee22ddd10d9557d0b07279a632aafb9197494e2a274fb129377" }, { "path": "dist/InconsistentResponseError.js", @@ -463,8 +468,8 @@ }, { "path": "dist/inputFiles.js", - "sizeBytes": 14263, - "sha256": "a7b721275494cf4abc2d86ef85fd080a94e9a6d35d58e219d43f72d568a87c0d" + "sizeBytes": 14439, + "sha256": "5293fc9d9cc524ea2bcffdcb5c5da5d6a0a3cb645c962cadb0cc77f3f2def342" }, { "path": "dist/cli/intentCommands.js", @@ -473,8 +478,8 @@ }, { "path": "dist/cli/intentCommandSpecs.js", - "sizeBytes": 6901, - "sha256": "0cdacaa914ee8b41e411a73cbdd69aadc74ec46876a814f01630a0caf3cdaf24" + "sizeBytes": 7540, + "sha256": "e523166b08caff7ff88ac96857ad0419346d714ee693e52a67c54e4c7fb69b6e" }, { "path": "dist/cli/intentFields.js", @@ -523,8 +528,8 @@ }, { "path": "dist/alphalib/types/robots/meta-read.js", - "sizeBytes": 1318, - "sha256": "fe1b0a048e010d337d90c35ad85d706181af050e056fdac76d28894e666b54a6" + "sizeBytes": 1795, + "sha256": "34392f717432dde77f8b28aa2040e5b526ac73bd2202093c9bbf8c4fc6000174" }, { "path": "dist/alphalib/types/robots/meta-write.js", @@ -553,8 +558,8 @@ }, { "path": "dist/alphalib/object.js", - "sizeBytes": 576, - "sha256": "6e88ab419c42d9a08bab16d8ada0a60021b768c066bd6a425ce8df14e32b1d4a" + "sizeBytes": 1591, + "sha256": "b4511257e13a03ebc2784b26bf7d8df1c927668872f920367326ec48ec6eedb2" }, { "path": "dist/cli/OutputCtl.js", @@ -578,8 +583,8 @@ }, { "path": "dist/alphalib/types/robots/progress-simulate.js", - "sizeBytes": 1337, - "sha256": "410294f549dcf8787d138b13a80b7dbb01fc82d06f60ea14b7d92fde44172774" + "sizeBytes": 1738, + "sha256": "34876400849381b9e202ad7dc95b1b76eec65b8e82b4185abe43f48942ebdc8a" }, { "path": "dist/cli/resultFiles.js", @@ -673,8 +678,8 @@ }, { "path": "dist/alphalib/types/template.js", - "sizeBytes": 12209, - "sha256": "61bd56d90e4745d867b84cba90ed8e69c56185ddf49c3f33a87a48f0cfe6b307" + "sizeBytes": 12458, + "sha256": "423cae592ea535f971cf1dd24c6fd7fdbf7f22d8e38a18da0cea12acdb369306" }, { "path": "dist/alphalib/types/templateCredential.js", @@ -713,8 +718,8 @@ }, { "path": "dist/alphalib/types/robots/tlcdn-deliver.js", - "sizeBytes": 2184, - "sha256": "4187c800e62603c3afc29e3e1d2961f43c349be755b77aabf76708e4de26e480" + "sizeBytes": 2561, + "sha256": "27e01611c2e4ee951c0cb03aed2053a2ebcd2341ce72a9fe616fbb5260bcb2f9" }, { "path": "dist/Transloadit.js", @@ -833,13 +838,13 @@ }, { "path": "package.json", - "sizeBytes": 2855, - "sha256": "f240a71dcb8d62de5e2bdb582c6ccbbf939bec6e312c0b9e15cd15e6690ad05d" + "sizeBytes": 2705, + "sha256": "d22e6f3c08ee6f80556e8d9cc77def4987919f0c2817106b5debe4934a254dec" }, { "path": "dist/alphalib/types/robots/_index.d.ts.map", - "sizeBytes": 14125, - "sha256": "fbffe9e5514d357d2fd3b4eb734b9f12cfd8edaa27fce364706e288b8f67b3be" + "sizeBytes": 14180, + "sha256": "0e9078b1014cf84b14c762d6314bc3c29d89cab81fb72cdeac73de730ed283cf" }, { "path": "dist/alphalib/types/robots/_index.js.map", @@ -848,23 +853,23 @@ }, { "path": "dist/alphalib/types/robots/_instructions-primitives.d.ts.map", - "sizeBytes": 10718, - "sha256": "0e927e764916071ccd1bf1806e804b565bf226b6f1fe9efbff490a2465326f60" + "sizeBytes": 10757, + "sha256": "c2b8f36167f9b7d73e53e085e91b34ca4e55e9b6cfed855007c4cc146bd334ed" }, { "path": "dist/alphalib/types/robots/_instructions-primitives.js.map", - "sizeBytes": 37009, - "sha256": "573d8a9dcd769a5c3ae96432e66206b6238fd887b54fc388dd3794e89d51dc1c" + "sizeBytes": 38315, + "sha256": "958ba9da217070be8b9c29a536b1f670623ec95a9effe2dc72cd9284bc5438bb" }, { "path": "dist/alphalib/types/robots/ai-chat.d.ts.map", - "sizeBytes": 3289, - "sha256": "95c81e7d376783090ccb8b0f7e447059a3ae9eeca0973153caf6e415df0fbd36" + "sizeBytes": 3301, + "sha256": "f24177638d2ff3aa03ccab6ce64d407d3718e77612cd6eaa93308f272de122f3" }, { "path": "dist/alphalib/types/robots/ai-chat.js.map", - "sizeBytes": 8279, - "sha256": "4d832671ea8f017654cc851f210a8dec9eb214c16f42848798df9541b8f4f378" + "sizeBytes": 8414, + "sha256": "efbab4c38d2c63d348c9f1690d792b9b543897306533c5bd6e4fd55713abe9af" }, { "path": "dist/ApiError.d.ts.map", @@ -889,12 +894,12 @@ { "path": "dist/cli/commands/assemblies.d.ts.map", "sizeBytes": 3983, - "sha256": "a4b8d3a3c9c3758a06c982b0654cffac60ce26a3fb3156466ba7128027d0db96" + "sha256": "18f89e227084717cb76aee8eb74120c9e6c4a760d239bc9f605846e9f41c8dcb" }, { "path": "dist/cli/commands/assemblies.js.map", - "sizeBytes": 48725, - "sha256": "8d1c836fe4e8af2f0fff3e0d750ad763c56ef1c4cd2f6140a4f4a7e13560225f" + "sizeBytes": 49250, + "sha256": "ecdf0b3b93e8e05d578200018bd910c262d0cff9d6b3164d3cabefb779353db6" }, { "path": "dist/alphalib/types/assembliesGet.d.ts.map", @@ -928,13 +933,13 @@ }, { "path": "dist/alphalib/types/robots/assembly-savejson.d.ts.map", - "sizeBytes": 574, - "sha256": "9a0f2b7648574c7e5a5223a3d9889ac39c5ceef637f488c28eb9d51b772eeef6" + "sizeBytes": 580, + "sha256": "7a0ddf380bf9e82554dc1a2d344829cbd68b183875002809b5728b1066b99584" }, { "path": "dist/alphalib/types/robots/assembly-savejson.js.map", - "sizeBytes": 810, - "sha256": "56230eb7eedfbc7bdfbcf21f037106e999059c2296d4a289e8a865b72f2835b1" + "sizeBytes": 1128, + "sha256": "0859a70f8e368e8afbe11a6e708c23e4fcaa2ed7d53f06d8a4610a0bbdfed82c" }, { "path": "dist/cli/docs/assemblyLintingExamples.d.ts.map", @@ -968,13 +973,13 @@ }, { "path": "dist/alphalib/types/assemblyStatus.d.ts.map", - "sizeBytes": 78997, - "sha256": "6a84d02fd305e44d87efe58e4c3eb0c3876f94be559a27725f9f6edf3424bcf2" + "sizeBytes": 79015, + "sha256": "a198fddba54eea8685fda07bbd65970d990bf5f054b2ad2d36a401f852bf4032" }, { "path": "dist/alphalib/types/assemblyStatus.js.map", - "sizeBytes": 34017, - "sha256": "cd3f2ed93ce3e70f5b13d03a452fe3d2ac466dfc01bb02466d2cace15f2996e2" + "sizeBytes": 36264, + "sha256": "cd1e503f88ae58f2723a2098b1def9dbef709ecf58700760135585e2f63bed75" }, { "path": "dist/alphalib/types/assemblyUrls.d.ts.map", @@ -988,8 +993,8 @@ }, { "path": "dist/alphalib/types/robots/audio-artwork.d.ts.map", - "sizeBytes": 3653, - "sha256": "96ab9dbbaca77c4fe8f05c678bdd34737f11ac4519907957dffa07bb36653f1f" + "sizeBytes": 3665, + "sha256": "d217e6a25df58da35da5415c7a865b107b3fb749ade992cceace89f39916baa0" }, { "path": "dist/alphalib/types/robots/audio-artwork.js.map", @@ -998,8 +1003,8 @@ }, { "path": "dist/alphalib/types/robots/audio-concat.d.ts.map", - "sizeBytes": 3700, - "sha256": "9e5f5b8a5ce2c21600d36a01352fe2d2c3001462d98aa56bbc5cbae39f9b65c1" + "sizeBytes": 3712, + "sha256": "48866cca91926f7f1385d9bcbc01e0109b30ab00ec08331e9ee81792b6fb7417" }, { "path": "dist/alphalib/types/robots/audio-concat.js.map", @@ -1008,8 +1013,8 @@ }, { "path": "dist/alphalib/types/robots/audio-encode.d.ts.map", - "sizeBytes": 3648, - "sha256": "8a4dc7f484c42a69dea46d2e962deb288dd8c080dcdeb354902112d33243dcd5" + "sizeBytes": 3660, + "sha256": "05d1f92844e03e994bb994f8ab0aaa5c50a8f740d6f3be1acc0fc8ad9e06fd38" }, { "path": "dist/alphalib/types/robots/audio-encode.js.map", @@ -1018,8 +1023,8 @@ }, { "path": "dist/alphalib/types/robots/audio-loop.d.ts.map", - "sizeBytes": 3658, - "sha256": "8ce256caaf2a584190c4709cd032908bb30ce11937d5e4b1ca5b916c67c6720d" + "sizeBytes": 3670, + "sha256": "3f1f64f77992ad09872f4a6f2e9433c3d0a377cbd909c8d3b932cc9eac4d534f" }, { "path": "dist/alphalib/types/robots/audio-loop.js.map", @@ -1028,8 +1033,8 @@ }, { "path": "dist/alphalib/types/robots/audio-merge.d.ts.map", - "sizeBytes": 3713, - "sha256": "b0ccfaf9b9697632b0e98d0120b88d1f087faa3dc2dde8062ab61558e50c916b" + "sizeBytes": 3725, + "sha256": "099fcf4c0275e8c0178021124f3f4ad4d892d44f09213d4a203b7014d2d7f6f0" }, { "path": "dist/alphalib/types/robots/audio-merge.js.map", @@ -1038,8 +1043,8 @@ }, { "path": "dist/alphalib/types/robots/audio-split.d.ts.map", - "sizeBytes": 3719, - "sha256": "d5ad9b702907a71e4b7629a80c03a61d2ccb1c76f8223bfd63956469cc88fde6" + "sizeBytes": 3731, + "sha256": "361c52efe42bed5d26da45bebb17300783d6250fb259e4bb96cf5bbb9f49b325" }, { "path": "dist/alphalib/types/robots/audio-split.js.map", @@ -1048,8 +1053,8 @@ }, { "path": "dist/alphalib/types/robots/audio-waveform.d.ts.map", - "sizeBytes": 4237, - "sha256": "6e2c035378a67cfe35c6881f6b8c31b5e4debb84ba13db8395e92962f34fe263" + "sizeBytes": 4249, + "sha256": "0f202c11afc0c77a8f2e132146a216e7c700cec7d1166d0a16ead3b56d7ad34c" }, { "path": "dist/alphalib/types/robots/audio-waveform.js.map", @@ -1068,8 +1073,8 @@ }, { "path": "dist/alphalib/types/robots/azure-import.d.ts.map", - "sizeBytes": 994, - "sha256": "0fb9b65d6e25e92f44987359888e9227b27ccdc48107d1fa11e27d1cd61860c9" + "sizeBytes": 1006, + "sha256": "d7b17eb3cde3f92f70e6e82b23d8fd2e557de33603f2c72efcc0fa76c802326f" }, { "path": "dist/alphalib/types/robots/azure-import.js.map", @@ -1078,8 +1083,8 @@ }, { "path": "dist/alphalib/types/robots/azure-store.d.ts.map", - "sizeBytes": 1344, - "sha256": "b98aec3833f29088cd542c5691c1eb0b706c464868a7cc4e8331b7917414d9c7" + "sizeBytes": 1356, + "sha256": "db2319585d634fa1ab06b653bec89edf281730701a97fb41d2d746a75e911aaf" }, { "path": "dist/alphalib/types/robots/azure-store.js.map", @@ -1088,8 +1093,8 @@ }, { "path": "dist/alphalib/types/robots/backblaze-import.d.ts.map", - "sizeBytes": 1003, - "sha256": "a34aa374da25301ebbef81a3152a1b95986321ad906976143695c9d153e28a05" + "sizeBytes": 1015, + "sha256": "47a2396c309323ef3da73c08c4ff39ee9e9ea9aff498a0fcb5984344fb09dfbd" }, { "path": "dist/alphalib/types/robots/backblaze-import.js.map", @@ -1098,8 +1103,8 @@ }, { "path": "dist/alphalib/types/robots/backblaze-store.d.ts.map", - "sizeBytes": 1268, - "sha256": "b6eb60701f74ef1c706ebba681394de36acc9daa94d515e1e7a67670fd51023e" + "sizeBytes": 1280, + "sha256": "e65e594d5eaa98388bf1778e335adbc457c23562a796db86dd4b0f8c66a10559" }, { "path": "dist/alphalib/types/robots/backblaze-store.js.map", @@ -1148,8 +1153,8 @@ }, { "path": "dist/alphalib/types/robots/box-import.d.ts.map", - "sizeBytes": 928, - "sha256": "705365397613966e3dd60b1ad402c3431b5ff3cae7174b70ea9f4fab1193b958" + "sizeBytes": 940, + "sha256": "a4dfc1dd8c3b269c600b5dd41abb109d3071270a7ce9579f0f40e0f918517621" }, { "path": "dist/alphalib/types/robots/box-import.js.map", @@ -1158,8 +1163,8 @@ }, { "path": "dist/alphalib/types/robots/box-store.d.ts.map", - "sizeBytes": 1301, - "sha256": "f892aae7d5249ffe386ae29aaa3702e793efc5f348c0342a27ca2976e8112c18" + "sizeBytes": 1313, + "sha256": "8f74a74188307bbb3df20df64a7779b2385c33ec649e1f7e020b476d4dd45b4c" }, { "path": "dist/alphalib/types/robots/box-store.js.map", @@ -1188,8 +1193,8 @@ }, { "path": "dist/alphalib/types/robots/cloudfiles-import.d.ts.map", - "sizeBytes": 1029, - "sha256": "95aa1e2ba17afc0582dc1f6918a515aeb1b17a5380919595b38cd6a4c042ffb3" + "sizeBytes": 1041, + "sha256": "c5d254f5cab32ec61ff194289713466a8f8acae73d96895b7a8a5fbac4c0d783" }, { "path": "dist/alphalib/types/robots/cloudfiles-import.js.map", @@ -1198,8 +1203,8 @@ }, { "path": "dist/alphalib/types/robots/cloudfiles-store.d.ts.map", - "sizeBytes": 1282, - "sha256": "e65b4230ab87f454dfc98dd1b8f67ebd99f573b3c1251e9d9cca969e77dfc346" + "sizeBytes": 1294, + "sha256": "54c08752a8e9d85f33cba91198e2c7886101a7ab8bba5ee2c29c0e6142273a24" }, { "path": "dist/alphalib/types/robots/cloudfiles-store.js.map", @@ -1208,8 +1213,8 @@ }, { "path": "dist/alphalib/types/robots/cloudflare-import.d.ts.map", - "sizeBytes": 1029, - "sha256": "41e5e21989c8fcf20866ecade7d7c3d2c2105b7021a773ec607241de54fbfffb" + "sizeBytes": 1041, + "sha256": "c048f87115df65ffcd07aac341ce8e7f186d77c76778beab3c7f304447b86d6b" }, { "path": "dist/alphalib/types/robots/cloudflare-import.js.map", @@ -1218,8 +1223,8 @@ }, { "path": "dist/alphalib/types/robots/cloudflare-store.d.ts.map", - "sizeBytes": 1307, - "sha256": "4d48b565d432589a248cc26ee6e0bc9d55c017caa58a3ef6cbe500ff5f24089e" + "sizeBytes": 1319, + "sha256": "dacfaa2b8bddfc0cdbc1bb38b8b37ca3ae0fea4e58f4d7bad833b7d9fb3eab4d" }, { "path": "dist/alphalib/types/robots/cloudflare-store.js.map", @@ -1228,8 +1233,8 @@ }, { "path": "dist/alphalib/types/robots/digitalocean-import.d.ts.map", - "sizeBytes": 1033, - "sha256": "2afeacc03aad258e41fe299bf7f844938f5e97f322f807b3555554efc38269c8" + "sizeBytes": 1045, + "sha256": "91318bc59e15d9dd8ab0bfe85c1e202d299e452962fdce55a59629eaf180c555" }, { "path": "dist/alphalib/types/robots/digitalocean-import.js.map", @@ -1238,8 +1243,8 @@ }, { "path": "dist/alphalib/types/robots/digitalocean-store.d.ts.map", - "sizeBytes": 1323, - "sha256": "e1dc4f9dfc8e4a242d9aae20dea76f89cdd615a30d05bfe94a9ba3dd198ce1c7" + "sizeBytes": 1335, + "sha256": "e632439059665acc4a104e9ebe192851411682a7d04a413f2ffa8ea9bfa1067d" }, { "path": "dist/alphalib/types/robots/digitalocean-store.js.map", @@ -1258,8 +1263,8 @@ }, { "path": "dist/alphalib/types/robots/document-autorotate.d.ts.map", - "sizeBytes": 1203, - "sha256": "32b014cc58c024e1a1fecb5725eb9bb452de82aa58ee1ce3153facb672bbbc26" + "sizeBytes": 1215, + "sha256": "5ed7260668c7ad38f7903c0c41403b51000db9e19e0153115ebd7cbce6312c1d" }, { "path": "dist/alphalib/types/robots/document-autorotate.js.map", @@ -1268,8 +1273,8 @@ }, { "path": "dist/alphalib/types/robots/document-convert.d.ts.map", - "sizeBytes": 1306, - "sha256": "8f6a144e4daadfc4c19663881a66e37c83321b46d0005781754a7f5c7172570f" + "sizeBytes": 1318, + "sha256": "deceea5a4f7e093a0f8231dc7ba39c97cb9c42bf07ccbfb8ca3c309307607b62" }, { "path": "dist/alphalib/types/robots/document-convert.js.map", @@ -1278,8 +1283,8 @@ }, { "path": "dist/alphalib/types/robots/document-merge.d.ts.map", - "sizeBytes": 1217, - "sha256": "b74c373ea5b76fb89eb212011d2258a53b96db26965b1f52b12a107f69c7b1b2" + "sizeBytes": 1229, + "sha256": "6ddee16266be8a1c4d6eeedd9c84eea21a67ec1dd85e6c3a96473a0b13188909" }, { "path": "dist/alphalib/types/robots/document-merge.js.map", @@ -1288,8 +1293,8 @@ }, { "path": "dist/alphalib/types/robots/document-ocr.d.ts.map", - "sizeBytes": 1225, - "sha256": "c6f2a86537889a5fc0f9c90f472eb29894cd37e1e1227bc06dbe1230beeb16ce" + "sizeBytes": 1237, + "sha256": "b77fa44667c38cdb54803d656c8fa809ce3dafa87a91e235f1f4fa0ad34b8383" }, { "path": "dist/alphalib/types/robots/document-ocr.js.map", @@ -1298,8 +1303,8 @@ }, { "path": "dist/alphalib/types/robots/document-optimize.d.ts.map", - "sizeBytes": 1284, - "sha256": "5b0e6bf542a115f61caf36ff1ca5c83141691b7db7019e4cfe9b920ff24a0ae7" + "sizeBytes": 1296, + "sha256": "582924285d180b1fb22f1c86830c6ab488f9e654a998e52dd8d3099d5c150bce" }, { "path": "dist/alphalib/types/robots/document-optimize.js.map", @@ -1308,8 +1313,8 @@ }, { "path": "dist/alphalib/types/robots/document-split.d.ts.map", - "sizeBytes": 1204, - "sha256": "7a3838d126801329bc4c6934488608237a218e724ee3c3d16afbf03748ce0179" + "sizeBytes": 1216, + "sha256": "7f6a65ab38c63c876e926ed45d8eb8b790c7127e1ce0aed13f43ec4d156c1f03" }, { "path": "dist/alphalib/types/robots/document-split.js.map", @@ -1318,18 +1323,18 @@ }, { "path": "dist/alphalib/types/robots/document-thumbs.d.ts.map", - "sizeBytes": 1395, - "sha256": "0c6dc97d9f1099703bb78a570d241ea72fe25c14a872ef6396d025e463e32a8c" + "sizeBytes": 1413, + "sha256": "246c6c87707dbdbea0d68916ed112e449c2928c1073a83cda368bc01df458eb6" }, { "path": "dist/alphalib/types/robots/document-thumbs.js.map", - "sizeBytes": 3929, - "sha256": "2702b9f705f710a887882289441c84f7e7a1ad17d2a919c8c34980760251daf2" + "sizeBytes": 4105, + "sha256": "74cc37ecf1d356cbf1f75b820e5d70f6451c8ab09a9def2fd4280f9aef6d71ac" }, { "path": "dist/alphalib/types/robots/dropbox-import.d.ts.map", - "sizeBytes": 931, - "sha256": "023f847bd8067dcdd02eb07b93efb6af6ea3aefbce42595762b2e08f772144dd" + "sizeBytes": 943, + "sha256": "ee98be2a9b1678af7b77fc6a6af388799b3acf329f855fb41632da52ea510486" }, { "path": "dist/alphalib/types/robots/dropbox-import.js.map", @@ -1338,8 +1343,8 @@ }, { "path": "dist/alphalib/types/robots/dropbox-store.d.ts.map", - "sizeBytes": 1304, - "sha256": "1517a60ab2a3104aa1d0e8f58220611db0fe8f80691ea0974ed8c311d03d2609" + "sizeBytes": 1316, + "sha256": "37e7ff1784b932950c1d6f80beb50b55ce3ce82c7b45024bc487dcf51eecc9d3" }, { "path": "dist/alphalib/types/robots/dropbox-store.js.map", @@ -1348,8 +1353,8 @@ }, { "path": "dist/alphalib/types/robots/edgly-deliver.d.ts.map", - "sizeBytes": 885, - "sha256": "f108af2aa239d62fa865abbd1e4887bf2c87e90478f739e5cb8c8e68447c820c" + "sizeBytes": 897, + "sha256": "cc5c3d9a677e57244f5e8d0b57d929f0e9a374a31c5dc1fd8047f73c4d68d417" }, { "path": "dist/alphalib/types/robots/edgly-deliver.js.map", @@ -1366,10 +1371,20 @@ "sizeBytes": 1452, "sha256": "3e92164cbbc5518aad63241470f63338057435b549d6f55233301e8b5ae1b721" }, + { + "path": "dist/alphalib/errors.d.ts.map", + "sizeBytes": 546, + "sha256": "f502efb4891b3b629b0bda90441ab80e09553f1c03924a455849e23641763377" + }, + { + "path": "dist/alphalib/errors.js.map", + "sizeBytes": 1172, + "sha256": "3283c17adf472676800bae0c3bc50adfbc01a429b1d2ca7d06b798ebf063403b" + }, { "path": "dist/alphalib/types/robots/file-compress.d.ts.map", - "sizeBytes": 1275, - "sha256": "b68d0648d4581a7c0e775e50eaf1e9d32bb54fd384f610a1c2c743153012dbdd" + "sizeBytes": 1287, + "sha256": "771fd3909339c080717fc57fe0f17b46c6f44e757a561f8c09195edaf923d111" }, { "path": "dist/alphalib/types/robots/file-compress.js.map", @@ -1378,8 +1393,8 @@ }, { "path": "dist/alphalib/types/robots/file-decompress.d.ts.map", - "sizeBytes": 1218, - "sha256": "0bcb3d75bcf1452c3f60287bbcd673ff7e63fbfaeb233adddb3d28eebe900bbf" + "sizeBytes": 1230, + "sha256": "278e5795a58d8a93be861192cc75d401627d44d8bf5537ab6ee5e15fe268b919" }, { "path": "dist/alphalib/types/robots/file-decompress.js.map", @@ -1388,18 +1403,18 @@ }, { "path": "dist/alphalib/types/robots/file-filter.d.ts.map", - "sizeBytes": 1247, - "sha256": "72e89562c717fbf77adee47b1151cb59068e17516804c950c3fa0e83ce8661d1" + "sizeBytes": 1259, + "sha256": "c811c72962c61c8c2fff9f6fed91a70257fffb84348abc6f90aac4cf6a10b663" }, { "path": "dist/alphalib/types/robots/file-filter.js.map", - "sizeBytes": 2083, - "sha256": "998e06067392834671c52830ca04274ae91945e24e376ceb2e6c1afd735ff0dd" + "sizeBytes": 2087, + "sha256": "0eabdb736238463114462979cee568c856abe4e4ab5b5df4781496380b5ca810" }, { "path": "dist/alphalib/types/robots/file-hash.d.ts.map", - "sizeBytes": 1218, - "sha256": "088e55486e2ddd57c0a0e0edcca8a81bce3bf75322b08063cb39cbb7a12b44b0" + "sizeBytes": 1230, + "sha256": "5f372d51ba9521be9dd7090a6fd00bf8c679df9aeca27a48699b6622631f4b13" }, { "path": "dist/alphalib/types/robots/file-hash.js.map", @@ -1408,8 +1423,8 @@ }, { "path": "dist/alphalib/types/robots/file-preview.d.ts.map", - "sizeBytes": 1719, - "sha256": "cec16e81bc1cb927b44c3bebb6303518ec76741bd416e27bdd2fb5de4258d077" + "sizeBytes": 1731, + "sha256": "49dd6835eb7406497669de1708c76f46bd1be3345b4d74ec53d416cd532a72f3" }, { "path": "dist/alphalib/types/robots/file-preview.js.map", @@ -1418,8 +1433,8 @@ }, { "path": "dist/alphalib/types/robots/file-read.d.ts.map", - "sizeBytes": 1181, - "sha256": "14300be58aeee0ba311ad4c81ce2331b3edbd918e8b5ac8e9cd73e7bcca28753" + "sizeBytes": 1193, + "sha256": "a279ce01af512da457816733cfdf029adc793a3c796f4b992d864d52ea63a5cb" }, { "path": "dist/alphalib/types/robots/file-read.js.map", @@ -1428,8 +1443,8 @@ }, { "path": "dist/alphalib/types/robots/file-serve.d.ts.map", - "sizeBytes": 1278, - "sha256": "ecfde3a2a853705f1f54cf65fbba10ea5b58a6513f8b8a3b28b0b6d858ca9d4e" + "sizeBytes": 1290, + "sha256": "a69e72301db25f95564baadb9c2b8cccb7851d255abf4b982fbb19004892b334" }, { "path": "dist/alphalib/types/robots/file-serve.js.map", @@ -1438,8 +1453,8 @@ }, { "path": "dist/alphalib/types/robots/file-verify.d.ts.map", - "sizeBytes": 1223, - "sha256": "758f71c149399f10641b73d27ca7d0a12a226d5316191842d15fdcc9fa15e136" + "sizeBytes": 1235, + "sha256": "fafc4fdaf97ffb8165dff872a9dabdcef01e90de765b62602e5e72ccd84385fd" }, { "path": "dist/alphalib/types/robots/file-verify.js.map", @@ -1448,8 +1463,8 @@ }, { "path": "dist/alphalib/types/robots/file-virusscan.d.ts.map", - "sizeBytes": 1223, - "sha256": "d0bd3d028079d77df69a512fbbc1159cab065e02f34a9aa059a02651df234ac6" + "sizeBytes": 1235, + "sha256": "b36adf999bfddb097378c27aae032abef44d6a52609599f0783074088de1b45f" }, { "path": "dist/alphalib/types/robots/file-virusscan.js.map", @@ -1458,13 +1473,13 @@ }, { "path": "dist/alphalib/types/robots/file-watermark.d.ts.map", - "sizeBytes": 1204, - "sha256": "4f13a3ec8e3d1a4a1009851910a99422b08f7b2f1c38d969bc3f195c6f164e33" + "sizeBytes": 1216, + "sha256": "42da0a7594e6e4b55a844e9cdace3b20b329a457ac1992fcc19f30d15c4f837f" }, { "path": "dist/alphalib/types/robots/file-watermark.js.map", - "sizeBytes": 1170, - "sha256": "89f5a57f06133fa08711cb9e7c493b8af40061435f7a655925049a72046849a9" + "sizeBytes": 1488, + "sha256": "3493b76663857e6bbdacedd69b0b1e1d8e6b2001949b189f68b206cdded64ecd" }, { "path": "dist/cli/fileProcessingOptions.d.ts.map", @@ -1478,8 +1493,8 @@ }, { "path": "dist/alphalib/types/robots/ftp-import.d.ts.map", - "sizeBytes": 976, - "sha256": "84422a7e5c4d1fb93ebe3efe172b0a793e5aa964a1347498342493f7469e458f" + "sizeBytes": 988, + "sha256": "9f3f5031bc54c4ca10e1b2e7221fc7997e8fb8683b6e50ace6c2f278e810edb1" }, { "path": "dist/alphalib/types/robots/ftp-import.js.map", @@ -1488,8 +1503,8 @@ }, { "path": "dist/alphalib/types/robots/ftp-store.d.ts.map", - "sizeBytes": 1310, - "sha256": "71dabc9697666b857e1f7f42fe76a0c2653b53fde865762a6790183f23c49d9c" + "sizeBytes": 1322, + "sha256": "7db6b873933db76d4d519ba0fcd1e477a5aa2a6bf9e30a0b6e0bb36c5d690c5a" }, { "path": "dist/alphalib/types/robots/ftp-store.js.map", @@ -1508,8 +1523,8 @@ }, { "path": "dist/alphalib/types/robots/google-import.d.ts.map", - "sizeBytes": 960, - "sha256": "4e92c62bc90566e0960fab9d70a47a297e97cc2c692b6e641f5cfb4260cbb74b" + "sizeBytes": 972, + "sha256": "c7b820b3b0bb161891a7a8e7028bed3486d2541b1d423390eff76a5c31da5c2a" }, { "path": "dist/alphalib/types/robots/google-import.js.map", @@ -1518,8 +1533,8 @@ }, { "path": "dist/alphalib/types/robots/google-store.d.ts.map", - "sizeBytes": 1260, - "sha256": "c8d8363f3813f6f3e22317767614d2911904b9df93fc8a3dd2ebccb8170b4096" + "sizeBytes": 1272, + "sha256": "83a65a4c87ecd14c233512de3f11f09b9fd1756c94c291bdf460b2a7c87df548" }, { "path": "dist/alphalib/types/robots/google-store.js.map", @@ -1538,8 +1553,8 @@ }, { "path": "dist/alphalib/types/robots/html-convert.d.ts.map", - "sizeBytes": 1315, - "sha256": "cfdc54b044368660e54572f62e08bc4e275cb6df358b38cf3669d8709c98d5e8" + "sizeBytes": 1327, + "sha256": "047ef9289211e739acf6c7cc9b8d23fab0f09af77771cc3a5fbeb94d1037a1ee" }, { "path": "dist/alphalib/types/robots/html-convert.js.map", @@ -1548,18 +1563,18 @@ }, { "path": "dist/alphalib/types/robots/http-import.d.ts.map", - "sizeBytes": 998, - "sha256": "3ceb6c77d60effd4bb3ade0719307fa79c3c6e4f3fd6e77afe48be0d995e287e" + "sizeBytes": 1190, + "sha256": "878f3efa8cb2676605fb2bd8f3862b72da5b1e377384ec35f339f789b51848eb" }, { "path": "dist/alphalib/types/robots/http-import.js.map", - "sizeBytes": 2870, - "sha256": "4db30d85cdac500d66c56b5802d162fc25234a3b81ffd721362efbb5ec80082f" + "sizeBytes": 2914, + "sha256": "02af3ed26d3f65a0d0e3bf5eb49ce2160fd4bb755b183c0e1f048c7f2b74f097" }, { "path": "dist/alphalib/types/robots/image-bgremove.d.ts.map", - "sizeBytes": 1241, - "sha256": "12270087727213a351c48b4079f9377a95812c7ab223b606f0c30997b0afd014" + "sizeBytes": 1253, + "sha256": "64103a01cc9d94b69f397670986b87915793b1b9cb15710214a332f850e1da6b" }, { "path": "dist/alphalib/types/robots/image-bgremove.js.map", @@ -1568,8 +1583,8 @@ }, { "path": "dist/alphalib/types/robots/image-copyrightdetect.d.ts.map", - "sizeBytes": 1268, - "sha256": "ed185fbd673a01cb3173e2a6d6633ad729b65308d5d968c6eb4b188ed33888ec" + "sizeBytes": 1280, + "sha256": "28ade25a1fd93385a5f9c4c0228e49fbd3f0c7a276d0110ec7746962cf3d0736" }, { "path": "dist/alphalib/types/robots/image-copyrightdetect.js.map", @@ -1578,8 +1593,8 @@ }, { "path": "dist/alphalib/types/robots/image-describe.d.ts.map", - "sizeBytes": 1241, - "sha256": "8bdcf7bf17a15e7d5cb2c70a0f8e81cc87baf09df7cadb29269eca873e9c88b9" + "sizeBytes": 1253, + "sha256": "7f2ccf1506ac95f75584a6a11e3f12934889ea21a8893cd54d7841d82c6713b3" }, { "path": "dist/alphalib/types/robots/image-describe.js.map", @@ -1588,8 +1603,8 @@ }, { "path": "dist/alphalib/types/robots/image-enhance.d.ts.map", - "sizeBytes": 1289, - "sha256": "2ba47c077436b408e293a0ecbcd6de5597234d53b54013697b3b13d35e747044" + "sizeBytes": 1301, + "sha256": "927721645df7da6743f53ab454d453f1715f8e4ebc606338371cdc1cc5172449" }, { "path": "dist/alphalib/types/robots/image-enhance.js.map", @@ -1598,8 +1613,8 @@ }, { "path": "dist/alphalib/types/robots/image-facedetect.d.ts.map", - "sizeBytes": 1270, - "sha256": "5450cd677f777b7b764e6ec8a36bd6a381ae2079e192fbdec46a3ddd6048f46c" + "sizeBytes": 1282, + "sha256": "f2d4d3b1f3cef8ae0de1742fa2a184b93643e0685d6958889d3023ad1c8660eb" }, { "path": "dist/alphalib/types/robots/image-facedetect.js.map", @@ -1608,28 +1623,28 @@ }, { "path": "dist/alphalib/types/robots/image-generate.d.ts.map", - "sizeBytes": 1309, - "sha256": "b98d5a799c399560ab72e22e880f08cc22ff555cd0d38e56556b331dfdc55f51" + "sizeBytes": 1321, + "sha256": "b0c9b1cc6f6b88496ce02e626c0fbf3a92992cc33d5c2ee14c1a938713e71f5a" }, { "path": "dist/alphalib/types/robots/image-generate.js.map", "sizeBytes": 2703, - "sha256": "24a3ab1a748847dfbaa812ff2c6ef1843b0d29827bf65de2286dde469a030d5d" + "sha256": "8343c9774369a0634647157b9edf43c410aaba88341223edf00255f7bfddf4fc" }, { "path": "dist/alphalib/types/robots/image-merge.d.ts.map", - "sizeBytes": 1259, - "sha256": "8f5d296310ad8829ef6f6a34a16c994983094091f0fb428c0c31ecad1ab568cc" + "sizeBytes": 1343, + "sha256": "dc762217f83ea43cd7fa56eca7eff2ba9ae76d3b49e00a4596f07af8be10dbb6" }, { "path": "dist/alphalib/types/robots/image-merge.js.map", - "sizeBytes": 2057, - "sha256": "574e54b576755c2190ca95e5b68ca2fe025fe54df28f976f14ee36313700d098" + "sizeBytes": 2820, + "sha256": "eaa61396da46a3e91af1fea9afd9695c3415d147464fa89805b9f228ac855cc0" }, { "path": "dist/alphalib/types/robots/image-ocr.d.ts.map", - "sizeBytes": 1218, - "sha256": "f56e7f584e8acf4346be5d165c02961000aa47f4f0d629e87b17cf5e7705a816" + "sizeBytes": 1230, + "sha256": "dc9f565ddf72815255351918360b083cd966044590da4a7cece039e3b9cc1dd8" }, { "path": "dist/alphalib/types/robots/image-ocr.js.map", @@ -1638,8 +1653,8 @@ }, { "path": "dist/alphalib/types/robots/image-optimize.d.ts.map", - "sizeBytes": 1253, - "sha256": "0162c2aec642e8e164840a202497760630a1ad37234c0e4cd1fa19f9aaba1d04" + "sizeBytes": 1265, + "sha256": "e699b0172b867eb8f4e7f77b41c5f4a46a69b6499744a6671ca9356b0cd7196f" }, { "path": "dist/alphalib/types/robots/image-optimize.js.map", @@ -1648,8 +1663,8 @@ }, { "path": "dist/alphalib/types/robots/image-resize.d.ts.map", - "sizeBytes": 2587, - "sha256": "2a15f390b7a6ac980fc80976e1e904713025d2d8d357dbd34bfef5e8986e51b2" + "sizeBytes": 2599, + "sha256": "7796f62391cc7efe5f850a113ca67cca86e57494a6084df6ba8eade30038e879" }, { "path": "dist/alphalib/types/robots/image-resize.js.map", @@ -1658,8 +1673,8 @@ }, { "path": "dist/alphalib/types/robots/image-upscale.d.ts.map", - "sizeBytes": 1233, - "sha256": "ad53f8b43f00a484970fb34bbbcbd81c4f42148be742c2e422b670978f5445fe" + "sizeBytes": 1245, + "sha256": "ab99a940a1ddd73cdf554aff2d056210270c8b1d9f57b069b5f5f242ecc7f2cc" }, { "path": "dist/alphalib/types/robots/image-upscale.js.map", @@ -1679,12 +1694,12 @@ { "path": "dist/cli/semanticIntents/imageGenerate.d.ts.map", "sizeBytes": 518, - "sha256": "91a096a484d82451806ae3ae1a95ccbb082ab42bd8abdd7eb65ee8df40af932b" + "sha256": "f4e007bc23ec8d016e4261386f0a3e153f4a070dd4e3c3596d0079ebfdf45ddb" }, { "path": "dist/cli/semanticIntents/imageGenerate.js.map", - "sizeBytes": 5579, - "sha256": "da3b1444b9e326ef7104c8731a5ccb6e38604550e5fdfba3847b964acfc7ae59" + "sizeBytes": 5617, + "sha256": "68f81ae21633b0fb6dc260d6f331a82772fb53c987fd3fee665a1e641ad680fd" }, { "path": "dist/InconsistentResponseError.d.ts.map", @@ -1718,13 +1733,13 @@ }, { "path": "dist/inputFiles.d.ts.map", - "sizeBytes": 1772, - "sha256": "78a0f3fa2436ceef34d0b5c6a6a19f2d9dd66d255db7d93b552fc2e0575e496c" + "sizeBytes": 2424, + "sha256": "836e4330ebe0b14d25615db43da0d12aff663cb5e5cf0fc623d312b36684c107" }, { "path": "dist/inputFiles.js.map", - "sizeBytes": 14889, - "sha256": "376dc151d3746dbe074a72af20f6ded163ae237f3097fa125f1a1e4ba67c91f4" + "sizeBytes": 15027, + "sha256": "7ca597b3ebe266ba96decc9b6e4cda8253aedc868c7188cbde0276133b5afa85" }, { "path": "dist/cli/intentCommands.d.ts.map", @@ -1739,12 +1754,12 @@ { "path": "dist/cli/intentCommandSpecs.d.ts.map", "sizeBytes": 1276, - "sha256": "6524c4b2f3a6782bf15085941df6c6889cf94b79028efb06c4fdd3958c1bd7b3" + "sha256": "b8b38c35687f493bca13f444e7460966ff21cfd57aaabc47e66ca8ec86f37a35" }, { "path": "dist/cli/intentCommandSpecs.js.map", - "sizeBytes": 5221, - "sha256": "3a9c072b217efb11d110c754ae0cbc6feec8ac6c3938829c521feda61c2d7329" + "sizeBytes": 5614, + "sha256": "f5d492364fc53875f40dd26f90ae1032fc40a896972a2beb94cf677e957f49d4" }, { "path": "dist/cli/intentFields.d.ts.map", @@ -1818,8 +1833,8 @@ }, { "path": "dist/alphalib/types/robots/mega-import.d.ts.map", - "sizeBytes": 1026, - "sha256": "6b1c02de7d1fe05b737e79ce0b70d94a34e2180789becd17255aa87408fbfb9c" + "sizeBytes": 1038, + "sha256": "54a4b59742cec0200c74739c1b6b4ff08bd6113faadf20055bdf932675b8cf43" }, { "path": "dist/alphalib/types/robots/mega-import.js.map", @@ -1828,8 +1843,8 @@ }, { "path": "dist/alphalib/types/robots/mega-store.d.ts.map", - "sizeBytes": 1305, - "sha256": "2e7072ebb50d1758dbafcb4b70db49c2a718b8ce22b870bf097152574b680f90" + "sizeBytes": 1317, + "sha256": "03e739eca36cd683e9cd27a876914c6125b7798cce524144ef26dd3b036006ae" }, { "path": "dist/alphalib/types/robots/mega-store.js.map", @@ -1838,18 +1853,18 @@ }, { "path": "dist/alphalib/types/robots/meta-read.d.ts.map", - "sizeBytes": 734, - "sha256": "a773ba60928386e8f641b466f7cbb7cc339f6eecaf0dcd1d91612f180c4297b6" + "sizeBytes": 746, + "sha256": "8f4cf895a684226552774f7577bf660ee968e77dfad50c57d6a9e6a3cef6cbf1" }, { "path": "dist/alphalib/types/robots/meta-read.js.map", - "sizeBytes": 1051, - "sha256": "0d17a41619f56e0236b7a36926fc9ba0564cc0b2f2053a2c5e022f94472620cf" + "sizeBytes": 1380, + "sha256": "4aff9df1310a4f4b3dd88f4d4221631fbfa566cf63b8364d621727e1e4b9a8c7" }, { "path": "dist/alphalib/types/robots/meta-write.d.ts.map", - "sizeBytes": 3621, - "sha256": "6bf9b66b9fa080e4736cd78ce1337dcaedb748bb86868dfd1c11168713a770ad" + "sizeBytes": 3633, + "sha256": "b04f3c3623eec0d5c903169fca0961eb44c3267b3af99fb5107870c0f900b357" }, { "path": "dist/alphalib/types/robots/meta-write.js.map", @@ -1858,8 +1873,8 @@ }, { "path": "dist/alphalib/types/robots/minio-import.d.ts.map", - "sizeBytes": 1018, - "sha256": "8202282af17b9d94f30908d4474f23ec13b7826dc8c47ac64b32dd6e1a1c5552" + "sizeBytes": 1030, + "sha256": "eb5ef4cb9f8d189669bfdc2968cda8581372e5b457b4b0f247aa494a98731bf4" }, { "path": "dist/alphalib/types/robots/minio-import.js.map", @@ -1868,8 +1883,8 @@ }, { "path": "dist/alphalib/types/robots/minio-store.d.ts.map", - "sizeBytes": 1296, - "sha256": "279930973458ade4387de0f3cdc49a1a4dce154f614e9d0170db1b16b62de134" + "sizeBytes": 1308, + "sha256": "315c45ef1f66a3508fcacdc54b5dffd175339a73050a1cc46188b86ee79dad5c" }, { "path": "dist/alphalib/types/robots/minio-store.js.map", @@ -1898,13 +1913,13 @@ }, { "path": "dist/alphalib/object.d.ts.map", - "sizeBytes": 537, - "sha256": "7d8028b3f84fef25f3b8ec3cd6f05b0daf7f0460eac1ef85a4f47110e03ce745" + "sizeBytes": 1120, + "sha256": "ea6d5ac1a108ab3c7f2ee5d5d618a72f0f4d76543546a1d57ff8569a4714f1c6" }, { "path": "dist/alphalib/object.js.map", - "sizeBytes": 425, - "sha256": "2e57b39c4c8d9fc486d330024dc24b33a217d8d0e2b69a3d325d208407a2a7db" + "sizeBytes": 1542, + "sha256": "f11a20fbf9a7f1e3e5dc1c2e1accb43ef0522b3648ffb136e99a51bb5342f822" }, { "path": "dist/cli/OutputCtl.d.ts.map", @@ -1948,13 +1963,13 @@ }, { "path": "dist/alphalib/types/robots/progress-simulate.d.ts.map", - "sizeBytes": 751, - "sha256": "2a42a05e815a2a748f3f9f3b7b60c670e2e2fc5d5992c2f1148ca3ba93c593cc" + "sizeBytes": 757, + "sha256": "0e1b9e5b50ddc4ceda5b36a03c800b737420672f26c684feae62cd6ddd90a7c8" }, { "path": "dist/alphalib/types/robots/progress-simulate.js.map", - "sizeBytes": 1071, - "sha256": "7d07c6ee5b0cc80b8379be580b50914b7902df5376281fbbf76373d547641fc2" + "sizeBytes": 1388, + "sha256": "ebbb95c8e072d6c1658493a7293951404794de229b1d193533cf9e40cd5e79b5" }, { "path": "dist/cli/resultFiles.d.ts.map", @@ -1988,8 +2003,8 @@ }, { "path": "dist/alphalib/types/robots/s3-import.d.ts.map", - "sizeBytes": 1023, - "sha256": "c624e6774c4025e20a25f2e5ce9f83b2cd703044d5a679fafeb7556d4ae34755" + "sizeBytes": 1035, + "sha256": "c531ed98fb380548f294445b1ae9d3c1c42de70b9ccadb98e3a5b406d4049d93" }, { "path": "dist/alphalib/types/robots/s3-import.js.map", @@ -1998,8 +2013,8 @@ }, { "path": "dist/alphalib/types/robots/s3-store.d.ts.map", - "sizeBytes": 1437, - "sha256": "f616c9749672121eac311fb6dada69492911074a8751c7365bb6214c864f16c6" + "sizeBytes": 1449, + "sha256": "7f9954f5f81eceb2dd88d6a28ea254848f5f2d06b84a4fa68f4d72aa1972db19" }, { "path": "dist/alphalib/types/robots/s3-store.js.map", @@ -2008,8 +2023,8 @@ }, { "path": "dist/alphalib/types/robots/script-run.d.ts.map", - "sizeBytes": 1202, - "sha256": "da22050f41770eeb13a66daf4067881d11f7466fe8b2af7cb6bf9bfd40a3bc75" + "sizeBytes": 1214, + "sha256": "97533cad2537589e11c737e0495e2c553ff5cc595936ef0a83e6aeefd3202007" }, { "path": "dist/alphalib/types/robots/script-run.js.map", @@ -2018,8 +2033,8 @@ }, { "path": "dist/alphalib/types/robots/sftp-import.d.ts.map", - "sizeBytes": 973, - "sha256": "0c374bdd0970e97fc130562ba95a19a67c5685e8ac315c8e29e46b35d835d38b" + "sizeBytes": 985, + "sha256": "702db991fc0002a1c7a0025e84e18c51001deb924c8c191f0405eaa4127bb0b6" }, { "path": "dist/alphalib/types/robots/sftp-import.js.map", @@ -2028,8 +2043,8 @@ }, { "path": "dist/alphalib/types/robots/sftp-store.d.ts.map", - "sizeBytes": 1299, - "sha256": "f7b40a31bc73164b724cf0a5efea6150663ab4e016d33bb6502b44df776ce329" + "sizeBytes": 1311, + "sha256": "d37eaecf4de599747c01bcfcd6b5025118a5801d5bf9a7c09377d8eca65ed058" }, { "path": "dist/alphalib/types/robots/sftp-store.js.map", @@ -2048,8 +2063,8 @@ }, { "path": "dist/alphalib/types/robots/speech-transcribe.d.ts.map", - "sizeBytes": 1260, - "sha256": "aed4a8badb80aa5f65702ff85cea295e4c80d9645636c2f27698a95389e32c06" + "sizeBytes": 1272, + "sha256": "b6ffbfe1b1baafeaea4dd0cae921f6bcd21397f387967623dc06604d627867bc" }, { "path": "dist/alphalib/types/robots/speech-transcribe.js.map", @@ -2088,8 +2103,8 @@ }, { "path": "dist/alphalib/types/robots/supabase-import.d.ts.map", - "sizeBytes": 1036, - "sha256": "4addddcd151e25540a54b600d4d10aa27079e8b569ee827a4facf01407c6e57f" + "sizeBytes": 1048, + "sha256": "35412356bcf26d44d27636e1beacbce61f0a58ca5106a92e3abbba5793c3a773" }, { "path": "dist/alphalib/types/robots/supabase-import.js.map", @@ -2098,8 +2113,8 @@ }, { "path": "dist/alphalib/types/robots/supabase-store.d.ts.map", - "sizeBytes": 1302, - "sha256": "59310329d9a4a7f55bd356e902cac5574d28bf5fe679b3f93a22977db634d076" + "sizeBytes": 1314, + "sha256": "a80e7825c0ae313524c7f5765c3d641cfffd1b79f5ec7eee3ac3d06a62b19d36" }, { "path": "dist/alphalib/types/robots/supabase-store.js.map", @@ -2108,8 +2123,8 @@ }, { "path": "dist/alphalib/types/robots/swift-import.d.ts.map", - "sizeBytes": 1030, - "sha256": "fc4ac5cd60ad0f2d887a4044feff398c36f71ba88d594bd1084bb9bf58e23e30" + "sizeBytes": 1042, + "sha256": "5c2615cb8d7faed501fcdbd05004b2e13dec81e7aea06956e978b3b9c3cf44c2" }, { "path": "dist/alphalib/types/robots/swift-import.js.map", @@ -2118,8 +2133,8 @@ }, { "path": "dist/alphalib/types/robots/swift-store.d.ts.map", - "sizeBytes": 1308, - "sha256": "3f1e71b0c327c7b18ffbfc1a97dbb69471f75f609210fec4a43516f1bc15a5a4" + "sizeBytes": 1320, + "sha256": "5564f96622fba9e413278e8d759432116cf98c97a1a1477c871c416f88a44fd8" }, { "path": "dist/alphalib/types/robots/swift-store.js.map", @@ -2178,8 +2193,8 @@ }, { "path": "dist/alphalib/types/robots/text-speak.d.ts.map", - "sizeBytes": 1244, - "sha256": "b39c287359d37c683d7d9f77635740078bbe1f0a6c3667b47f20d592c31e0c07" + "sizeBytes": 1256, + "sha256": "f62a5dae50f277102bdfae36f7de61fe696fba8b70785e81cb6a00cd3963ff2e" }, { "path": "dist/alphalib/types/robots/text-speak.js.map", @@ -2188,8 +2203,8 @@ }, { "path": "dist/alphalib/types/robots/text-translate.d.ts.map", - "sizeBytes": 1230, - "sha256": "eaf3666a55cc88c0a34b028e022fba15ae28a124090fb1fc6b3762b483ea463e" + "sizeBytes": 1242, + "sha256": "3fc8f4db2359021b4d8abb201f4422f79c143cbb1aada1b11715cf5ea9a69336" }, { "path": "dist/alphalib/types/robots/text-translate.js.map", @@ -2198,8 +2213,8 @@ }, { "path": "dist/alphalib/types/robots/tigris-import.d.ts.map", - "sizeBytes": 1030, - "sha256": "28aa19728bb9291c8a5967893d8ae8e27e925adf3dc8b40308f20ed3fc089aae" + "sizeBytes": 1042, + "sha256": "dc5baf31fcb134d422f8a0694b49e1dbf62d688839b79650c41fcf61a53619a4" }, { "path": "dist/alphalib/types/robots/tigris-import.js.map", @@ -2208,8 +2223,8 @@ }, { "path": "dist/alphalib/types/robots/tigris-store.d.ts.map", - "sizeBytes": 1308, - "sha256": "76f8946ccb9ab454d3c437c0047231d5eb9cd72968f90cfa7358749cc7904333" + "sizeBytes": 1320, + "sha256": "36f9ac0b3abd4574337ebac97f96b60754af7d5b0a25522efd366bf7ea0384a5" }, { "path": "dist/alphalib/types/robots/tigris-store.js.map", @@ -2218,13 +2233,13 @@ }, { "path": "dist/alphalib/types/robots/tlcdn-deliver.d.ts.map", - "sizeBytes": 885, - "sha256": "54e153108678c78744eefaffccd63d5bc6a1e347f00d90f0859723ba43c4b5e5" + "sizeBytes": 909, + "sha256": "649398765750dc78d14a835f1827c12459b89f934d83c98ef62ca4af54311cba" }, { "path": "dist/alphalib/types/robots/tlcdn-deliver.js.map", - "sizeBytes": 1451, - "sha256": "c5ec163a8dd0b610d1e2ce2cdd4d3f32888cd35f00649ad5d888dd752aba2bd6" + "sizeBytes": 1570, + "sha256": "71b77c6123ab00978b53dd95f900d5801837f7f03078ee430db84cfe6ca70b66" }, { "path": "dist/Transloadit.d.ts.map", @@ -2248,8 +2263,8 @@ }, { "path": "dist/alphalib/types/robots/tus-store.d.ts.map", - "sizeBytes": 1254, - "sha256": "1388df77cd36d91c7565226f3ed98d87d00d841e731389562fa5eb54f12bcb11" + "sizeBytes": 1266, + "sha256": "a34e9bb060e1c879203dcbbf39d9f7b2a41b7fe367c465f94282c50b6024ef92" }, { "path": "dist/alphalib/types/robots/tus-store.js.map", @@ -2278,8 +2293,8 @@ }, { "path": "dist/alphalib/types/robots/upload-handle.d.ts.map", - "sizeBytes": 885, - "sha256": "7d2a103c4133ce8ea42f27ae70505e5999f242846acae166120f2f10c0605d71" + "sizeBytes": 897, + "sha256": "b50c77f621c9b82728a4dea5f88763160745dc29e606ba6efa42cf853fd96796" }, { "path": "dist/alphalib/types/robots/upload-handle.js.map", @@ -2298,8 +2313,8 @@ }, { "path": "dist/alphalib/types/robots/video-adaptive.d.ts.map", - "sizeBytes": 3727, - "sha256": "a82886ef12e8eb531ab36acbb033a9351f54bfe9f117e67ab0f38768aac609e8" + "sizeBytes": 3739, + "sha256": "07521561e843586f395a79d12e1bc652cb139f9ac649563b8311809113382205" }, { "path": "dist/alphalib/types/robots/video-adaptive.js.map", @@ -2308,8 +2323,8 @@ }, { "path": "dist/alphalib/types/robots/video-artwork.d.ts.map", - "sizeBytes": 3641, - "sha256": "8a36d89f1955c08488472caa8c4b589da83e3c589a0ca0fc436e985bb0240c1a" + "sizeBytes": 3653, + "sha256": "7864e81f96fb395acd0711e08b703e50eebc804bf550ab4b5629b9c3a678bf0a" }, { "path": "dist/alphalib/types/robots/video-artwork.js.map", @@ -2318,8 +2333,8 @@ }, { "path": "dist/alphalib/types/robots/video-concat.d.ts.map", - "sizeBytes": 3711, - "sha256": "ff72d27cc7b997bdecbdbd13b46e54511b44c39b0ff8497c9a1117421223879b" + "sizeBytes": 3723, + "sha256": "db242c4813933d2fb56ac1f9ce4cd04e83ada45699809ed6ec2ab5c62bcdb3ad" }, { "path": "dist/alphalib/types/robots/video-concat.js.map", @@ -2328,8 +2343,8 @@ }, { "path": "dist/alphalib/types/robots/video-encode.d.ts.map", - "sizeBytes": 4064, - "sha256": "c7aa05e28239e7f7e8840a830adb4803144d4fbb1472e19b98a2f2cd26999774" + "sizeBytes": 4076, + "sha256": "fe20f167961b1210443bb3483568527820da19aded55d8a658a843bf81603ae8" }, { "path": "dist/alphalib/types/robots/video-encode.js.map", @@ -2338,8 +2353,8 @@ }, { "path": "dist/alphalib/types/robots/video-generate.d.ts.map", - "sizeBytes": 1382, - "sha256": "fc9c5985291992be374ba3a635219b0c115165385b8ec794215ffa03045e44d8" + "sizeBytes": 1394, + "sha256": "ce742268f742062c4897ff61c192ce76e8d705d070b7fcda66b4de4dce87746b" }, { "path": "dist/alphalib/types/robots/video-generate.js.map", @@ -2348,8 +2363,8 @@ }, { "path": "dist/alphalib/types/robots/video-merge.d.ts.map", - "sizeBytes": 3793, - "sha256": "475b5917f9941634e123620fe3b7e1046018a8f99a25316ab0cdf64fbba95c7b" + "sizeBytes": 3805, + "sha256": "e03eb00bece73472eb416b70ab66f7daac26ae4956fd64dec755a787ce0f2be9" }, { "path": "dist/alphalib/types/robots/video-merge.js.map", @@ -2358,8 +2373,8 @@ }, { "path": "dist/alphalib/types/robots/video-ondemand.d.ts.map", - "sizeBytes": 5342, - "sha256": "ca0d9940b6da97d986278736df5e31101277ea919fea745a2289a64860d311e6" + "sizeBytes": 5354, + "sha256": "f81d9f1afdd971cc49b65dff6cb48a67a35874e96b8ce1a223da42138cf14b2b" }, { "path": "dist/alphalib/types/robots/video-ondemand.js.map", @@ -2368,8 +2383,8 @@ }, { "path": "dist/alphalib/types/robots/video-split.d.ts.map", - "sizeBytes": 3722, - "sha256": "d52013db4fe48703f796b499d3566be9b924a71c99219f7d3ff4faaf8fb50db7" + "sizeBytes": 3734, + "sha256": "15c8eff9643549059d7cabe83ec07de07d96fb8a38cf050fc0c74b1766f5e35d" }, { "path": "dist/alphalib/types/robots/video-split.js.map", @@ -2378,8 +2393,8 @@ }, { "path": "dist/alphalib/types/robots/video-subtitle.d.ts.map", - "sizeBytes": 3811, - "sha256": "45c73734509a03858ba2c8005141aacc59b048ec54cefd44f296c84511276af9" + "sizeBytes": 3823, + "sha256": "38e22ad6f044bb015125b5e1a76f5a14b459403d9009d618537e87197f2f7c41" }, { "path": "dist/alphalib/types/robots/video-subtitle.js.map", @@ -2388,8 +2403,8 @@ }, { "path": "dist/alphalib/types/robots/video-thumbs.d.ts.map", - "sizeBytes": 3722, - "sha256": "bdd323bd7df53ad490e05fc4079f021085118fe28aa77f6e51da33e2b4cc92fb" + "sizeBytes": 3734, + "sha256": "53da2ddf87dff74b99c5d687a58f9eb12825de1c0f601f56f5f95403322c8126" }, { "path": "dist/alphalib/types/robots/video-thumbs.js.map", @@ -2398,8 +2413,8 @@ }, { "path": "dist/alphalib/types/robots/vimeo-import.d.ts.map", - "sizeBytes": 972, - "sha256": "fb329b161fb99e3697538425e78c88da97e5ba0989b7c7d27faf320decfb400e" + "sizeBytes": 984, + "sha256": "49939ae69d631daae1764c2674bbba85615bb09472ef38ec3e2b66ae1b0c039b" }, { "path": "dist/alphalib/types/robots/vimeo-import.js.map", @@ -2408,8 +2423,8 @@ }, { "path": "dist/alphalib/types/robots/vimeo-store.d.ts.map", - "sizeBytes": 1302, - "sha256": "15f25db4b0fe604ba308115a3a38b12cf206f1050b6e7811e6edd7db3a20fe88" + "sizeBytes": 1314, + "sha256": "a28bba033656b9fbc857b3e08bd1cc6a9f78a7e7446298c7c17bd476d14e8536" }, { "path": "dist/alphalib/types/robots/vimeo-store.js.map", @@ -2418,8 +2433,8 @@ }, { "path": "dist/alphalib/types/robots/wasabi-import.d.ts.map", - "sizeBytes": 1030, - "sha256": "0e2da15b814fe4ba135bda9edfd3af21965485beb48afd9e3c915daa9d37814f" + "sizeBytes": 1042, + "sha256": "46e66d2fbb7d174e794969d4560ec0df5eea7799d3fb595541707e1e0141dba9" }, { "path": "dist/alphalib/types/robots/wasabi-import.js.map", @@ -2428,8 +2443,8 @@ }, { "path": "dist/alphalib/types/robots/wasabi-store.d.ts.map", - "sizeBytes": 1310, - "sha256": "9c73bb5a7be16401574df816a7b6c3e5cfa5f5c1004f7220daeea56238280268" + "sizeBytes": 1322, + "sha256": "7316915e408f621b48b9fee4544bfc21e9ea7fa643ebb3a46ff101beffb4561e" }, { "path": "dist/alphalib/types/robots/wasabi-store.js.map", @@ -2438,8 +2453,8 @@ }, { "path": "dist/alphalib/types/robots/youtube-store.d.ts.map", - "sizeBytes": 1263, - "sha256": "d0fe4707e0b56934913905f2d3b18e0d506ad962f063509ba44e797982a54519" + "sizeBytes": 1275, + "sha256": "ab9621385fed7532ec8135a0c88acf89c1a5d138212716c7b4d961237835c974" }, { "path": "dist/alphalib/types/robots/youtube-store.js.map", @@ -2458,38 +2473,38 @@ }, { "path": "README.md", - "sizeBytes": 86355, - "sha256": "8cdcd27dc7b7f4c305f1153cbebd1194373c16ea3f4c7820f33f6a905930ad54" + "sizeBytes": 90434, + "sha256": "81406d82a25452ffd7f52016615271dbd66e52698968e4342b6c080f5cb984ea" }, { "path": "dist/alphalib/types/robots/_index.d.ts", - "sizeBytes": 488739, - "sha256": "c6dbf660791ba23ddf84e08e6fac2117ba743f14c681932a20d8c037aee2394e" + "sizeBytes": 488780, + "sha256": "721b1a99fe756ea01da60f14e4321370afca5d678e953c757af97529b830ee94" }, { "path": "src/alphalib/types/robots/_index.ts", - "sizeBytes": 59444, - "sha256": "e6228d857beded1710960ed26e77091e72b3605a3ae0906154acfeda581a454e" + "sizeBytes": 59480, + "sha256": "bb66b64650e8b101669f98792e808eed4f092a0c6abede5578a7871fe07b00b0" }, { "path": "dist/alphalib/types/robots/_instructions-primitives.d.ts", - "sizeBytes": 209499, - "sha256": "0ea74f3ad39d0ebca2a54f2436af894bb8adf69e27369bb63339acfcd235cba2" + "sizeBytes": 210275, + "sha256": "236f1247a3139ed224801b0ec8ba47b8a04cf31236749ff344f23a53f1283862" }, { "path": "src/alphalib/types/robots/_instructions-primitives.ts", - "sizeBytes": 66769, - "sha256": "e25f65ee21518c57c26d497b2a555c69ff5ca6f5bf27223e5389b26a342a30a7" + "sizeBytes": 68656, + "sha256": "b46a38654f4aff6ddb1bdd9a3ac467ebd6e1cb75f21906cbfea8bbbb3b1ee8c3" }, { "path": "dist/alphalib/types/robots/ai-chat.d.ts", - "sizeBytes": 93841, - "sha256": "f5783ce7865caa00156ffb374b07c1ca679311d7f3e759e5f877652269e329ae" + "sizeBytes": 95738, + "sha256": "12ce59e753cac019ccd6fff4326a07c155c332c22d43b40b27bb0a7da26012b9" }, { "path": "src/alphalib/types/robots/ai-chat.ts", - "sizeBytes": 12013, - "sha256": "3e8445de90a6ccc59bab7ee0405df71a57443956bc8a05b0767d85e3c75b759a" + "sizeBytes": 12227, + "sha256": "5033e61531c4d61ee12b97a63dffa1feff2cd5ebd87f8d9ded86db0e2f7a5150" }, { "path": "dist/ApiError.d.ts", @@ -2518,13 +2533,13 @@ }, { "path": "src/cli/commands/assemblies.ts", - "sizeBytes": 55554, - "sha256": "cbafba38543a1cc993d9d29b8ac26a3fc221a04662fae3e358d5ee2f7b0b6a43" + "sizeBytes": 56243, + "sha256": "651725bb0f83b98adceb0490a775c59b324e76333894b25ba3ccf69a93aeb2a2" }, { "path": "dist/alphalib/types/assembliesGet.d.ts", "sizeBytes": 2369, - "sha256": "f793c28a1769069e8dc5e3199b6f1b16045da928e2db4f4088ff06c9befefa5b" + "sha256": "3da59cefadebff2a7e7b1d292c4ed1ecca83dd8b547377acb4cc8acaf3a221a7" }, { "path": "src/alphalib/types/assembliesGet.ts", @@ -2553,13 +2568,13 @@ }, { "path": "dist/alphalib/types/robots/assembly-savejson.d.ts", - "sizeBytes": 3053, - "sha256": "8c30087c4cebb948e6373c79e83e5df104c2dc7b669e862f5ffc2ffd2b07c2ed" + "sizeBytes": 3969, + "sha256": "48483ebf47cc41f27c08504ee6efaa830dd23f04f5fd9d27778ab75e66b60a6d" }, { "path": "src/alphalib/types/robots/assembly-savejson.ts", - "sizeBytes": 1395, - "sha256": "8b0bc4257072f7633a6c1cf71cfebb60030f42cfafc3e3e08e8a745787839596" + "sizeBytes": 1755, + "sha256": "dcb780aba69f73f0dc85980ec59e6d1cea39e729195b8da0fd70def6175b9121" }, { "path": "dist/cli/docs/assemblyLintingExamples.d.ts", @@ -2574,7 +2589,7 @@ { "path": "dist/alphalib/types/assemblyReplay.d.ts", "sizeBytes": 2370, - "sha256": "1db1c402a3c75b1696a629fecfe8be0eb664880ceefc35e168d955e7f92786d3" + "sha256": "d9d1bf83ab50d5cf67a39326956d7391b6198c437a77dfdfe3a9390f112e4334" }, { "path": "src/alphalib/types/assemblyReplay.ts", @@ -2584,7 +2599,7 @@ { "path": "dist/alphalib/types/assemblyReplayNotification.d.ts", "sizeBytes": 1932, - "sha256": "d61d36b37324b24ae937423c3b4fa899092aa7f97e0f2face45f354cfcdf9e79" + "sha256": "41fdd43166c10328fe6a3d2b89e4e394c496f3ff0bcb27b65e84efd11c05307e" }, { "path": "src/alphalib/types/assemblyReplayNotification.ts", @@ -2593,13 +2608,13 @@ }, { "path": "dist/alphalib/types/assemblyStatus.d.ts", - "sizeBytes": 4491846, - "sha256": "cbb0b5b37d7623b10c6f64c9cd487ba7af433f635ab8d1442dd36d52c46432dc" + "sizeBytes": 4539846, + "sha256": "5f8dd2b63d3cd7ab3ee7cc5bb3590d67bef6fa876976f4690d335a542a50d374" }, { "path": "src/alphalib/types/assemblyStatus.ts", - "sizeBytes": 33762, - "sha256": "cc287b4802af12cd3eb55aa0df018240fd30b23786d2ac3a427e6df28d08bd63" + "sizeBytes": 38878, + "sha256": "a71821d8fa66a996ac039661bcb566c8bcec5912b5798be0851974b64071dcfb" }, { "path": "dist/alphalib/types/assemblyUrls.d.ts", @@ -2613,8 +2628,8 @@ }, { "path": "dist/alphalib/types/robots/audio-artwork.d.ts", - "sizeBytes": 167655, - "sha256": "56670af4f3daa10c5d495be972649563a4b912828c1e9988b2b7d8119493af88" + "sizeBytes": 169487, + "sha256": "87ddbd6c0c6b5ab2e9e5dcbb7483b91ca045a77fd7e0b79cbcd955f3bc20565c" }, { "path": "src/alphalib/types/robots/audio-artwork.ts", @@ -2623,8 +2638,8 @@ }, { "path": "dist/alphalib/types/robots/audio-concat.d.ts", - "sizeBytes": 169966, - "sha256": "9c4150072f77917ca68e63e7862e0c9fee3e7d9df890d54b78f5a734079937e7" + "sizeBytes": 171798, + "sha256": "b695af75159d9eb445be51716a9e4ef574b9e4e1eef77633227e6cd7292df878" }, { "path": "src/alphalib/types/robots/audio-concat.ts", @@ -2633,8 +2648,8 @@ }, { "path": "dist/alphalib/types/robots/audio-encode.d.ts", - "sizeBytes": 167466, - "sha256": "922043005e80121472fc0ff17a50c49ec9fa4173130e1563adab679cd279fa0f" + "sizeBytes": 169298, + "sha256": "1e61e49052c5cc07e25116548b8fead97246c32857ad7d995e554dfd300a1483" }, { "path": "src/alphalib/types/robots/audio-encode.ts", @@ -2643,8 +2658,8 @@ }, { "path": "dist/alphalib/types/robots/audio-loop.d.ts", - "sizeBytes": 167878, - "sha256": "751a9f62bae4eeb980ac67ed6646fb9522e1328abc3d40bc913309a5c8fc1420" + "sizeBytes": 169710, + "sha256": "f18c201d79257d601db5bc6fdd7d13f5618b5654cc6ce9c556f478e4ccd9ea42" }, { "path": "src/alphalib/types/robots/audio-loop.ts", @@ -2653,8 +2668,8 @@ }, { "path": "dist/alphalib/types/robots/audio-merge.d.ts", - "sizeBytes": 170479, - "sha256": "7ff8b6a67c07fd16d9c2323da40deb65d7f193cdeb277182adef3b4a8a661ff7" + "sizeBytes": 172311, + "sha256": "a410557813e28339da59feca79fc44ba81117989d014b32203460b0b0840c282" }, { "path": "src/alphalib/types/robots/audio-merge.ts", @@ -2663,8 +2678,8 @@ }, { "path": "dist/alphalib/types/robots/audio-split.d.ts", - "sizeBytes": 169761, - "sha256": "7eb44269a5b29cb998db7aa4e3faa14362dd11d09f0fa93655ac5c242767d3cb" + "sizeBytes": 171593, + "sha256": "d12cfe34b0c63283e13e5ab664f81e051119aa82b62f5e4f320d3278042045e9" }, { "path": "src/alphalib/types/robots/audio-split.ts", @@ -2673,8 +2688,8 @@ }, { "path": "dist/alphalib/types/robots/audio-waveform.d.ts", - "sizeBytes": 173936, - "sha256": "68d895b87f1f306e26fb6fc4951148b22f6caa67811798780d025f46777e0c7b" + "sizeBytes": 175768, + "sha256": "aad23f6e56c3be998d43b9529800ef1e80dae05a1b20077d35826ef8ff15425e" }, { "path": "src/alphalib/types/robots/audio-waveform.ts", @@ -2693,8 +2708,8 @@ }, { "path": "dist/alphalib/types/robots/azure-import.d.ts", - "sizeBytes": 11036, - "sha256": "fb0980e7bd0fcca08b195cc79b5f168e874a25673c97f9340ad89449d2a9c25b" + "sizeBytes": 12868, + "sha256": "6b99a936c3f032a324a348860dc95c1807ed1c6d58002279fa786336d8aa7638" }, { "path": "src/alphalib/types/robots/azure-import.ts", @@ -2703,8 +2718,8 @@ }, { "path": "dist/alphalib/types/robots/azure-store.d.ts", - "sizeBytes": 23317, - "sha256": "7bd4f1c2d33efe2a62e8dc2efd851f61785960145c1954058eeb8882daf7177f" + "sizeBytes": 25149, + "sha256": "07bd967166bd2360862eec112b3e9bd7f7a0ad01404db071769347340c5d1cd2" }, { "path": "src/alphalib/types/robots/azure-store.ts", @@ -2713,8 +2728,8 @@ }, { "path": "dist/alphalib/types/robots/backblaze-import.d.ts", - "sizeBytes": 11200, - "sha256": "656737162a0c93544d22a8a6d5c640892644a5363ef91fcdaa26d7e9f5fe2664" + "sizeBytes": 13032, + "sha256": "f1f58a91004f748f9abf5612dc4aeaf2ea73edd2ca7aed4d85f091cea960ab8d" }, { "path": "src/alphalib/types/robots/backblaze-import.ts", @@ -2723,8 +2738,8 @@ }, { "path": "dist/alphalib/types/robots/backblaze-store.d.ts", - "sizeBytes": 19655, - "sha256": "728cd867f57b1ff2a919ef4f226e2a0ca9513813f92165a6d25bb51735cc22d9" + "sizeBytes": 21487, + "sha256": "afcbbf3dbdbf16ad08f43be4969fb8a1857ee5f1e6025bbf0369dbb05c8f8e17" }, { "path": "src/alphalib/types/robots/backblaze-store.ts", @@ -2754,7 +2769,7 @@ { "path": "dist/alphalib/types/bill.d.ts", "sizeBytes": 1597, - "sha256": "3c6abe444091b82dcaa62fb74d56ed5967d48b888c0ee3cb44b5ba451889d507" + "sha256": "7a165efcb393577a82714a543115d837cd37df67dc69911d5962d192aba50307" }, { "path": "src/alphalib/types/bill.ts", @@ -2773,8 +2788,8 @@ }, { "path": "dist/alphalib/types/robots/box-import.d.ts", - "sizeBytes": 8684, - "sha256": "b478ba5e19e78d691e50a10542b03dc114c90b21148a80e2a972ba213de8e31b" + "sizeBytes": 10516, + "sha256": "37f919849f791bd3e9b15ce53dd9cd8fa9194165ef98b7fca2d2ac5a04ac450c" }, { "path": "src/alphalib/types/robots/box-import.ts", @@ -2783,8 +2798,8 @@ }, { "path": "dist/alphalib/types/robots/box-store.d.ts", - "sizeBytes": 18783, - "sha256": "b3bba8aad2eead5953e7bc8149c43b87f59fc94df145dbb323acf18958d71e53" + "sizeBytes": 20615, + "sha256": "f02fccd96037921317ca146fb4cea6d27e2ff4f7944f522c301f80ff0721e38f" }, { "path": "src/alphalib/types/robots/box-store.ts", @@ -2794,7 +2809,7 @@ { "path": "dist/alphalib/types/builtinTemplates.d.ts", "sizeBytes": 2371, - "sha256": "482bcbd513deb62fe3c512bc81c853ee828d982fcd5d527478778cd0cffc9d6a" + "sha256": "7ab47c9229b09a9fafad20009b9d54a33cb06d16bb0dd33fb62faa8a471d187d" }, { "path": "src/alphalib/types/builtinTemplates.ts", @@ -2813,8 +2828,8 @@ }, { "path": "dist/alphalib/types/robots/cloudfiles-import.d.ts", - "sizeBytes": 12289, - "sha256": "420c6b08193c73d5acb5b533160f437847cac7707dbfb0d19772bcd3e1a6d56f" + "sizeBytes": 14121, + "sha256": "e039d586738fda7cd2a2078d44433bcaed0aa2d5383e13735a9c4b5dc9076b5e" }, { "path": "src/alphalib/types/robots/cloudfiles-import.ts", @@ -2823,8 +2838,8 @@ }, { "path": "dist/alphalib/types/robots/cloudfiles-store.d.ts", - "sizeBytes": 20090, - "sha256": "7e427617b89defb34f177c39ed4cfc57e9546e81569054be66c3a3fdcc1d004e" + "sizeBytes": 21922, + "sha256": "4ac76564852884d7c6883ec032be75099bf2ad78158debea6241a99c4def6fbf" }, { "path": "src/alphalib/types/robots/cloudfiles-store.ts", @@ -2833,8 +2848,8 @@ }, { "path": "dist/alphalib/types/robots/cloudflare-import.d.ts", - "sizeBytes": 12177, - "sha256": "6b349b174338e3814f7afe52af2e53271f0357845dea3fb33ee2ba663f545302" + "sizeBytes": 14009, + "sha256": "0749f5ebc962ba1124f710c8016c37ab885f038307547c3b512e8a5d8c6bcd93" }, { "path": "src/alphalib/types/robots/cloudflare-import.ts", @@ -2843,8 +2858,8 @@ }, { "path": "dist/alphalib/types/robots/cloudflare-store.d.ts", - "sizeBytes": 21058, - "sha256": "06a0b0724e064c0f8cc75210d7630e3147b5a086a7f82eaff618701e772fe934" + "sizeBytes": 22890, + "sha256": "7988d1a22313f57aa034c8f7b82e2fc441477a86b6c264ac80eef3880143ef02" }, { "path": "src/alphalib/types/robots/cloudflare-store.ts", @@ -2853,8 +2868,8 @@ }, { "path": "dist/alphalib/types/robots/digitalocean-import.d.ts", - "sizeBytes": 12247, - "sha256": "1e2ea0768661803a5f478255a60e075031eacc6755f198d24e3e19579b471ab2" + "sizeBytes": 14079, + "sha256": "ad0317a42c44948f8107aadb6ce55dbd38c9ce7b78fa9cf7b4561da3c23e19bb" }, { "path": "src/alphalib/types/robots/digitalocean-import.ts", @@ -2863,8 +2878,8 @@ }, { "path": "dist/alphalib/types/robots/digitalocean-store.d.ts", - "sizeBytes": 21638, - "sha256": "86c25da875cdf43b1adebe42e50b0125df3fb570950d7818a94908c942efd785" + "sizeBytes": 23470, + "sha256": "6abfc403ec1ff8122c98c1592648ef747a504f42fb937e2a3041ce6c21a16ab4" }, { "path": "src/alphalib/types/robots/digitalocean-store.ts", @@ -2883,8 +2898,8 @@ }, { "path": "dist/alphalib/types/robots/document-autorotate.d.ts", - "sizeBytes": 16993, - "sha256": "ee70d548c8ca611c2cc14f313bf245c3134cf3dcf04750aac29d05a5ad0975ba" + "sizeBytes": 18825, + "sha256": "cc4ae696e3f14751b63794a55feaf16d63a060ba24205ef4a539d20d3454a9f3" }, { "path": "src/alphalib/types/robots/document-autorotate.ts", @@ -2893,8 +2908,8 @@ }, { "path": "dist/alphalib/types/robots/document-convert.d.ts", - "sizeBytes": 24690, - "sha256": "ea6c43dee48c793f1991b583ae5ec93e3b481aafe9225eb53bc64e2b982f57b7" + "sizeBytes": 26522, + "sha256": "9aec0e7bcfaf5f15e57af548aee72b1b733f956edf538d7c4031e8157dd5af66" }, { "path": "src/alphalib/types/robots/document-convert.ts", @@ -2903,8 +2918,8 @@ }, { "path": "dist/alphalib/types/robots/document-merge.d.ts", - "sizeBytes": 18042, - "sha256": "7f60c8960caade2fae1a9478c4075c120eb4858dec888e5060a95756c4e4ac5d" + "sizeBytes": 19874, + "sha256": "f58f755c4958f0f0a54d2660761735203077904d09d7f518071517103bed988e" }, { "path": "src/alphalib/types/robots/document-merge.ts", @@ -2913,8 +2928,8 @@ }, { "path": "dist/alphalib/types/robots/document-ocr.d.ts", - "sizeBytes": 18676, - "sha256": "de5e1f257cf9c796390a18365d2883cb9e43b1465d2259fd967d3d3370217908" + "sizeBytes": 20508, + "sha256": "b1c604d7e73e28ab38b626d033f862655ab552d876cc8a09724359361529b84c" }, { "path": "src/alphalib/types/robots/document-ocr.ts", @@ -2923,8 +2938,8 @@ }, { "path": "dist/alphalib/types/robots/document-optimize.d.ts", - "sizeBytes": 21185, - "sha256": "a7f9b7a8e9d2b5861d63b937006e4b826ca21a3408221903e6639b2f0c7fa3ec" + "sizeBytes": 23017, + "sha256": "a0ed437a1707c7624758ff019f9e0f781e83021e3c2eb37ae80686aa9187cadf" }, { "path": "src/alphalib/types/robots/document-optimize.ts", @@ -2933,8 +2948,8 @@ }, { "path": "dist/alphalib/types/robots/document-split.d.ts", - "sizeBytes": 17616, - "sha256": "99431a94cba0901a94742e7bcad58745a74f388ad3a0a42a944afe69065bd543" + "sizeBytes": 19448, + "sha256": "5ecfd24041c5d1c5124aaffc083331c09493c91f241dfeb61eed630845a6e89b" }, { "path": "src/alphalib/types/robots/document-split.ts", @@ -2943,18 +2958,18 @@ }, { "path": "dist/alphalib/types/robots/document-thumbs.d.ts", - "sizeBytes": 28913, - "sha256": "5b017fde5dfa50cd46580a73714a2238c657708fc19afb5ed5f903b690eef66c" + "sizeBytes": 31307, + "sha256": "1b7a92e8393adfd30b5682befe40a9e36c32e002a44f6d42c9fbd65b7671c9d0" }, { "path": "src/alphalib/types/robots/document-thumbs.ts", - "sizeBytes": 10984, - "sha256": "37176a5717d8506d720ab3ae382f2ce69dca0162ab51a444973934399cc4aafc" + "sizeBytes": 12374, + "sha256": "285cbe61b547bfa151fb17b0e4a1e7e02daba1b44109c2f1416187c590d77248" }, { "path": "dist/alphalib/types/robots/dropbox-import.d.ts", - "sizeBytes": 8522, - "sha256": "24118bc0f2c3a8daa16eec2d2d9bfe74e4a39776fa7936316161bc446c9af408" + "sizeBytes": 10354, + "sha256": "e671f5450bccb7d7b5059ffaf49db49985fb27c747a7d66db80a85a054550176" }, { "path": "src/alphalib/types/robots/dropbox-import.ts", @@ -2963,8 +2978,8 @@ }, { "path": "dist/alphalib/types/robots/dropbox-store.d.ts", - "sizeBytes": 18629, - "sha256": "56fbd6ad497fc0e28d1956afecfad9aa77dfecdd7bef23d29595c3224171dd97" + "sizeBytes": 20461, + "sha256": "f91f46a2e616db698c3f48014169093d7b6c1f849adc430becbb8115209eccce" }, { "path": "src/alphalib/types/robots/dropbox-store.ts", @@ -2973,8 +2988,8 @@ }, { "path": "dist/alphalib/types/robots/edgly-deliver.d.ts", - "sizeBytes": 6141, - "sha256": "153eb50b9d1ee94be2e1ec67179e70a1568ff0b1eac63ef8cc5ba66325b9b867" + "sizeBytes": 7973, + "sha256": "64096c760659b0897d6e301538b8b53626129fb606fd7f2fb5448cbb591af8e9" }, { "path": "src/alphalib/types/robots/edgly-deliver.ts", @@ -2991,10 +3006,20 @@ "sizeBytes": 1646, "sha256": "adce7911d379aa83abead36dc209293110fe475b691092ea7ec63d704c40f7df" }, + { + "path": "dist/alphalib/errors.d.ts", + "sizeBytes": 539, + "sha256": "e1a1691fb9cb02053a64390595ccd140755b8e545ec18c9566533086058345e5" + }, + { + "path": "src/alphalib/errors.ts", + "sizeBytes": 1006, + "sha256": "46920c26a023ad4645a185481416e1e29ee8b95e2b764da5727febf9b788e849" + }, { "path": "dist/alphalib/types/robots/file-compress.d.ts", - "sizeBytes": 20535, - "sha256": "f60cde1f6c20dfda5c5c48207de571ae4fae5f156c58e9ba86a1ebe8f893aa81" + "sizeBytes": 22367, + "sha256": "a9424ac6577e128874ae95f5adba19cbe98f37c596cc5a5ce40723c51601a60b" }, { "path": "src/alphalib/types/robots/file-compress.ts", @@ -3003,8 +3028,8 @@ }, { "path": "dist/alphalib/types/robots/file-decompress.d.ts", - "sizeBytes": 17889, - "sha256": "a089c2f694176cf36a6899a2ca046234476bf6f43011eba26f0190ff9933c95b" + "sizeBytes": 19721, + "sha256": "458b51c27127d1da750c0a2b36f626f8b7a1341cb7cf672a704a233c7c2f892b" }, { "path": "src/alphalib/types/robots/file-decompress.ts", @@ -3013,18 +3038,18 @@ }, { "path": "dist/alphalib/types/robots/file-filter.d.ts", - "sizeBytes": 30301, - "sha256": "477f0767ef827af10ab26e016e308bff23f2989e868f2c815f4f23cd94b3313f" + "sizeBytes": 32133, + "sha256": "13aa2833f9569d90731fb3e42bf8501c0d7343b51112212c378fc4588df2eceb" }, { "path": "src/alphalib/types/robots/file-filter.ts", - "sizeBytes": 8248, - "sha256": "2c9b6a940a58be2211efbcb38128be2afd80cb133c325f3ff4e497002cb91e79" + "sizeBytes": 8649, + "sha256": "85ec88ab27a5d2b704064aa2f264e553b0821826b745ff263518a8d6d812d9c3" }, { "path": "dist/alphalib/types/robots/file-hash.d.ts", - "sizeBytes": 18849, - "sha256": "6de2a7a4843e76b49954f5ac3ae4bd2fcff7f1bee16e56478ddbfa962d52de37" + "sizeBytes": 20681, + "sha256": "1afe173e6b8ac9889cffbc7ce12999d80e7a733f6511056bce98edcd2543ffaa" }, { "path": "src/alphalib/types/robots/file-hash.ts", @@ -3033,8 +3058,8 @@ }, { "path": "dist/alphalib/types/robots/file-preview.d.ts", - "sizeBytes": 37836, - "sha256": "54d85b0f7daa158c5b34882730a4f8ce69cd5dcbac1d2094e2e384e1773ac18d" + "sizeBytes": 39668, + "sha256": "9939a062e77e09d252265177b59fc9f9ae84731a89ae9f164175ca6d23815b75" }, { "path": "src/alphalib/types/robots/file-preview.ts", @@ -3043,8 +3068,8 @@ }, { "path": "dist/alphalib/types/robots/file-read.d.ts", - "sizeBytes": 16703, - "sha256": "08e84ba786ec43b289048db242e2833844918e550f5fd2033d9426993ce44fad" + "sizeBytes": 18535, + "sha256": "449fb0f60098e73cc7b5c43b83f90f71c1ab5ba22ce999acd3680aa948a4ffc7" }, { "path": "src/alphalib/types/robots/file-read.ts", @@ -3053,8 +3078,8 @@ }, { "path": "dist/alphalib/types/robots/file-serve.d.ts", - "sizeBytes": 18050, - "sha256": "7566a6d5e4d16a385487d28a6548d4911e19a8df5204f01c3b41ec0f3ccb16f9" + "sizeBytes": 19882, + "sha256": "c3da19cd8238c6ee9b0c2a19ce0e45d8c128e2c0b2b4f1231d648214f84ccf90" }, { "path": "src/alphalib/types/robots/file-serve.ts", @@ -3063,8 +3088,8 @@ }, { "path": "dist/alphalib/types/robots/file-verify.d.ts", - "sizeBytes": 18195, - "sha256": "c18447877b8a83c219f662f4e744dc0ab16745404ada77cb6d8260493f9bab32" + "sizeBytes": 20027, + "sha256": "b39bbf134060ad845d18bc2873a1f96a99fc1d6291c0b1fc49dfd2bc96a4a58e" }, { "path": "src/alphalib/types/robots/file-verify.ts", @@ -3073,8 +3098,8 @@ }, { "path": "dist/alphalib/types/robots/file-virusscan.d.ts", - "sizeBytes": 18207, - "sha256": "b9cd21c5b31f1921db32af8e84d20c8ca1901ad308cf4b55171e77f87bc8c9de" + "sizeBytes": 20039, + "sha256": "1553bd5268b1d25787a0ae6e928acbca60bf91ca4ff44a9492b0d0aa1f084dfc" }, { "path": "src/alphalib/types/robots/file-virusscan.ts", @@ -3083,13 +3108,13 @@ }, { "path": "dist/alphalib/types/robots/file-watermark.d.ts", - "sizeBytes": 17410, - "sha256": "d13deaf037252d9d9f27e7b880329665ef6146b637720bd7cdc0de46cb217630" + "sizeBytes": 19242, + "sha256": "7cd54e11a02dd984570e2e3de7a51581e0b337b09c88f2cf8f7a767e07ef33e3" }, { "path": "src/alphalib/types/robots/file-watermark.ts", - "sizeBytes": 2306, - "sha256": "ba40c5c60108513118236da9e131809dd7a67a54175f1e2cde6c9192613a5b7d" + "sizeBytes": 2676, + "sha256": "35541a2306bc7e58583863a2a47fbebf246d5c42764963d14626f0d36cedfd1a" }, { "path": "dist/cli/fileProcessingOptions.d.ts", @@ -3103,8 +3128,8 @@ }, { "path": "dist/alphalib/types/robots/ftp-import.d.ts", - "sizeBytes": 10382, - "sha256": "02b494b7a354fed368245635c8c79033c22dc41f04d3adc1b25ea82d5860bd89" + "sizeBytes": 12214, + "sha256": "2887645ae91fb8c74147d6bc8f549b978d17e89cfd59365e869ccd411ce7a904" }, { "path": "src/alphalib/types/robots/ftp-import.ts", @@ -3113,8 +3138,8 @@ }, { "path": "dist/alphalib/types/robots/ftp-store.d.ts", - "sizeBytes": 21536, - "sha256": "7674a4dbc884b65a376ccffff7de07967ec32a384237d34fcc46d6a75e32f3d6" + "sizeBytes": 23368, + "sha256": "4ba3ed37e390dc07579de2b1f5ad470d66d93aa618ba512b6cf2d09fdd955718" }, { "path": "src/alphalib/types/robots/ftp-store.ts", @@ -3133,8 +3158,8 @@ }, { "path": "dist/alphalib/types/robots/google-import.d.ts", - "sizeBytes": 9781, - "sha256": "d7cba012863f00d62bfca4b1adb997305747f3edd291ade13cc7d982dfd7bc86" + "sizeBytes": 11613, + "sha256": "34345351f33c504cfa83205579b7d5f9896b44596e592b1b449a46c0f21831b2" }, { "path": "src/alphalib/types/robots/google-import.ts", @@ -3143,8 +3168,8 @@ }, { "path": "dist/alphalib/types/robots/google-store.d.ts", - "sizeBytes": 20168, - "sha256": "69e46d09a51354b678b390873d4039369450e77ec0a047c77e2ebca527e6328a" + "sizeBytes": 22000, + "sha256": "615f48d17ff1ab275110393a53619c66671cc83f94d600dd39edff8ba7ed05bc" }, { "path": "src/alphalib/types/robots/google-store.ts", @@ -3163,8 +3188,8 @@ }, { "path": "dist/alphalib/types/robots/html-convert.d.ts", - "sizeBytes": 22952, - "sha256": "66b4c1ed3f87bd77f402b970f86fcd4869ceab173534a222d029e0ca38e74555" + "sizeBytes": 24784, + "sha256": "213a86c37bc329bbe70e57a90aeb5bf74783ac704fb984c82fe24eac9ae38dbe" }, { "path": "src/alphalib/types/robots/html-convert.ts", @@ -3173,18 +3198,18 @@ }, { "path": "dist/alphalib/types/robots/http-import.d.ts", - "sizeBytes": 12754, - "sha256": "07454a99e30a4a8d0c167c657b7f94fe0699ca2515f342cd3dacf94aa4dc8122" + "sizeBytes": 21314, + "sha256": "93569d0615596505fc13f43ab095b8c71734c58b271d4cd05bb5da1fd8382e57" }, { "path": "src/alphalib/types/robots/http-import.ts", - "sizeBytes": 6430, - "sha256": "7294032b6d2bd5dfe3e5bcd1b897fa1d3d6bfcde1e325a5e00b9d31dd8aa16f1" + "sizeBytes": 6735, + "sha256": "f2ad672b5d5b88267105037cdc41828a703f54cd6f61b4bdc62edafd5392b565" }, { "path": "dist/alphalib/types/robots/image-bgremove.d.ts", - "sizeBytes": 19266, - "sha256": "820b164e3e955d5114316a38c412e9461c61fffe1490fe9bdf708de77b9abae1" + "sizeBytes": 21098, + "sha256": "9bb30a2535d1bc91a95cd4445df57c8fded060a562a485f2ccba8bb1ec1880dd" }, { "path": "src/alphalib/types/robots/image-bgremove.ts", @@ -3193,8 +3218,8 @@ }, { "path": "dist/alphalib/types/robots/image-copyrightdetect.d.ts", - "sizeBytes": 20697, - "sha256": "941a4b0745a14c6c4fcc17f47baf0c5d744a17f99d8b19522e9bb991bfcfe472" + "sizeBytes": 22529, + "sha256": "c82581a9ef33b34c0d299ec9aa131842378aad05ba5bc32d471adc93be9cb34c" }, { "path": "src/alphalib/types/robots/image-copyrightdetect.ts", @@ -3203,8 +3228,8 @@ }, { "path": "dist/alphalib/types/robots/image-describe.d.ts", - "sizeBytes": 19548, - "sha256": "31cb9b81d026344d2587b754dacb5fb2cc6a16cc3c4a8e6be0ee3b85064c9a23" + "sizeBytes": 21380, + "sha256": "07f69710a754dade610792b7644e0d70d8113a6ea928aad4d1d9a2c50bc7518d" }, { "path": "src/alphalib/types/robots/image-describe.ts", @@ -3213,8 +3238,8 @@ }, { "path": "dist/alphalib/types/robots/image-enhance.d.ts", - "sizeBytes": 22587, - "sha256": "97dc9d27330d7b7b704f190629d825a614b20a4727cb4ab46556793809770ddc" + "sizeBytes": 24419, + "sha256": "9dcb60d8f081534aa6f915bad2cfc06def2e780f7a13d51b9aa5eac32a7aa329" }, { "path": "src/alphalib/types/robots/image-enhance.ts", @@ -3223,8 +3248,8 @@ }, { "path": "dist/alphalib/types/robots/image-facedetect.d.ts", - "sizeBytes": 20924, - "sha256": "87b70b6ec7fc69cb54df4473756f28b9dfc08891f2edbcc2e9343c19fe304259" + "sizeBytes": 22756, + "sha256": "b32cd1f7487d9458addec37a9579012bfdbe668fc8371c0aae831a2cc47a3853" }, { "path": "src/alphalib/types/robots/image-facedetect.ts", @@ -3233,28 +3258,28 @@ }, { "path": "dist/alphalib/types/robots/image-generate.d.ts", - "sizeBytes": 21761, - "sha256": "8fe7e864a56fa1191ae05b455d4d7ff499aad7aa66b66c89ad67c5b7e1b2b845" + "sizeBytes": 23593, + "sha256": "3803f9adc56f4f0b2a8689e390ec0da49c944bcd3c831c4e3c7d40032b4743fe" }, { "path": "src/alphalib/types/robots/image-generate.ts", - "sizeBytes": 5886, - "sha256": "3920399991eea548c983563940889de6daf320dc6d26457d2e8915d5fff8c713" + "sizeBytes": 6084, + "sha256": "0a2920c8e3ef4d2794d853d9aaabcd314c7685532dd39f0670f8852cc42074ca" }, { "path": "dist/alphalib/types/robots/image-merge.d.ts", - "sizeBytes": 19863, - "sha256": "76a0d613f367593a932776806eb49b504daf1437075e33302f15b643fb079085" + "sizeBytes": 25631, + "sha256": "6fb1f1fb146ab1a6281ea1627424386569a6b724aeafac89a676b40dca1ac75a" }, { "path": "src/alphalib/types/robots/image-merge.ts", - "sizeBytes": 4364, - "sha256": "cebc4d57261aa35cf4f9acd71cbe5b8f9abe0e1e6f0bd144d07393ec3b1380b8" + "sizeBytes": 6895, + "sha256": "5575d6c35831b1dcc60b366d94b52d43a269a093f0a6ed1a721f94a95dbfb77f" }, { "path": "dist/alphalib/types/robots/image-ocr.d.ts", - "sizeBytes": 18589, - "sha256": "c7875da64b1b3d96c8febb34de10cba91c8b3a75bf4de71e4347a837ded157e7" + "sizeBytes": 20421, + "sha256": "8027b4ac866871df17c99bbb7e2f6c817e99bc24300a6abb9f7cb11eb5bea5e1" }, { "path": "src/alphalib/types/robots/image-ocr.ts", @@ -3263,28 +3288,28 @@ }, { "path": "dist/alphalib/types/robots/image-optimize.d.ts", - "sizeBytes": 19822, - "sha256": "98ae14c64a15703b12f6b2c8b96bfc7f6c4b07f7504da3b2675b9d62fbbe035d" + "sizeBytes": 21654, + "sha256": "d9806bbf2a6b4df88e7cde73060ec58a47b53acf147df427097b78b8709e2e01" }, { "path": "src/alphalib/types/robots/image-optimize.ts", - "sizeBytes": 5800, - "sha256": "dd81e33cdf9e4b95ad62c227e668e6146461b8ea57362fa909d20cb310e3fe35" + "sizeBytes": 5886, + "sha256": "0f78693a8b46ce1b452db4c99d72d536463defd36e1361e1172fb4796a272e6c" }, { "path": "dist/alphalib/types/robots/image-resize.d.ts", - "sizeBytes": 91037, - "sha256": "096f01b505327eec88b92b7dd16543223a5baa81723c33b2b58d83c1c6b2ee34" + "sizeBytes": 92869, + "sha256": "90c817311b6b16699013b309f3105d69eb44e1382db9e414418c2ac271312bee" }, { "path": "src/alphalib/types/robots/image-resize.ts", - "sizeBytes": 29607, - "sha256": "c74bb7b364edad585bc7abb996d72954b8aa5dc4f55765b4455c13a560625273" + "sizeBytes": 29630, + "sha256": "d6dab0bb298699299bc50d8ee806a04a812ab28629c7c5ece3192af20fdb11af" }, { "path": "dist/alphalib/types/robots/image-upscale.d.ts", - "sizeBytes": 19349, - "sha256": "0fe30927eb56ddd1a63bf13440ccd0131ba972603f5847f8ef705a832b10cf8b" + "sizeBytes": 21181, + "sha256": "f9052c98ee962ad2dd164b00fcf380b1f8b2899f48b60f396713553b57e900f5" }, { "path": "src/alphalib/types/robots/image-upscale.ts", @@ -3303,13 +3328,13 @@ }, { "path": "dist/cli/semanticIntents/imageGenerate.d.ts", - "sizeBytes": 4150, - "sha256": "c17e7f8d0a72a74053ee6a9cca106f85099470e090cac05dd55fd8b152e14a07" + "sizeBytes": 4235, + "sha256": "4a1a701d1e7f8eb2693ef9dee570eb30fb42419e7bc60ef41ffcd25155ec3a06" }, { "path": "src/cli/semanticIntents/imageGenerate.ts", - "sizeBytes": 7302, - "sha256": "658f3c55a614fe4d6ea1005dae693315f7628fa7cae4bb67a58bb39524de45b6" + "sizeBytes": 7601, + "sha256": "b708ce2af186aa91d64e6a28cee7117c63ce69a0952799bfdd848a0fb2234514" }, { "path": "dist/InconsistentResponseError.d.ts", @@ -3343,13 +3368,13 @@ }, { "path": "dist/inputFiles.d.ts", - "sizeBytes": 1626, - "sha256": "d0bdfc4f2deca766146132c17e39c9457237d06db69ee13cffcd672c9ccc64c3" + "sizeBytes": 2215, + "sha256": "df507b3da0a42c17a86177e729867d40ff6aa6314ae23552de90d57c56a8071c" }, { "path": "src/inputFiles.ts", - "sizeBytes": 16515, - "sha256": "d9a6e9672639c307af6d2081dcbc2afa69789bf94b86a7336a63a0a5091c9f05" + "sizeBytes": 17629, + "sha256": "d8fdb91cab8d42e82204349cbe8e4b589a3742517f701ef2d4fd64222d606752" }, { "path": "dist/cli/intentCommands.d.ts", @@ -3368,8 +3393,8 @@ }, { "path": "src/cli/intentCommandSpecs.ts", - "sizeBytes": 7733, - "sha256": "127b076b7f715be5dd0345054d49c7af54f97c1d6a90396fad667897e6fb5cff" + "sizeBytes": 8334, + "sha256": "9f14baa51cd2e8ab117d41d65a202644f54ee8a6cd7a92d1525977e11ad7a9d8" }, { "path": "dist/cli/intentFields.d.ts", @@ -3448,8 +3473,8 @@ }, { "path": "dist/alphalib/types/robots/mega-import.d.ts", - "sizeBytes": 12529, - "sha256": "4930434f476d584df05e352556f9df86d68e47d5074f31108ff2948d1b2d72b2" + "sizeBytes": 14361, + "sha256": "6a6b51330fcc4c0a4fef3038f4cffbe9d58cb40b18b163a989e96734f61fdf10" }, { "path": "src/alphalib/types/robots/mega-import.ts", @@ -3458,8 +3483,8 @@ }, { "path": "dist/alphalib/types/robots/mega-store.d.ts", - "sizeBytes": 21486, - "sha256": "c1f00104746c4a93af35b76902110f0c7d9730db2d7e44c8ca7e9d0beea90f79" + "sizeBytes": 23318, + "sha256": "1b367059a601c15ec13fc12a5b38e54d765d6c82989268ce10e3e9a265411b0f" }, { "path": "src/alphalib/types/robots/mega-store.ts", @@ -3468,18 +3493,18 @@ }, { "path": "dist/alphalib/types/robots/meta-read.d.ts", - "sizeBytes": 5750, - "sha256": "f96e77de20bbda56606331d247cd9f08e73c86bbc3734c1f2d650d7ba397edc3" + "sizeBytes": 7582, + "sha256": "859189d5eb44a3b5e09f0ebad141927a346c32a2b2f5b49990200b048ebd4a0a" }, { "path": "src/alphalib/types/robots/meta-read.ts", - "sizeBytes": 1791, - "sha256": "20a6237243a84f2f9d4d2b0418fd6354f09491d6f625210f824709a3e3e10f60" + "sizeBytes": 2236, + "sha256": "c516d71394e468346982f8de85f0653cea0ae692fb317f841f1b63bfe861b10b" }, { "path": "dist/alphalib/types/robots/meta-write.d.ts", - "sizeBytes": 154336, - "sha256": "6dbc3ba00bebfbae0453baed961ad5f22c95a6a917d2dafcd208a45a21481aa0" + "sizeBytes": 156168, + "sha256": "420694fc8623d6440ffcec6a39faef09840cc8eb6691386c815d77c921c37617" }, { "path": "src/alphalib/types/robots/meta-write.ts", @@ -3488,8 +3513,8 @@ }, { "path": "dist/alphalib/types/robots/minio-import.d.ts", - "sizeBytes": 12032, - "sha256": "56f5ad945624b293847bec369f49c57e4679b37884e4931b1dee102ab52e0636" + "sizeBytes": 13864, + "sha256": "a0d17b366af49e529745fd9c65f5d1a9d96c0b89d1ba1bb37b4a910ffb46bf39" }, { "path": "src/alphalib/types/robots/minio-import.ts", @@ -3498,8 +3523,8 @@ }, { "path": "dist/alphalib/types/robots/minio-store.d.ts", - "sizeBytes": 21007, - "sha256": "4381c1c9a5447d4809742d37d11a3ae213e8875a60cad6d918fcf771a5814a8c" + "sizeBytes": 22839, + "sha256": "7f94facbe07b8b1e5e415be8a433541e7317cf51b0f1eb2d8205fdf0b468b61a" }, { "path": "src/alphalib/types/robots/minio-store.ts", @@ -3528,13 +3553,13 @@ }, { "path": "dist/alphalib/object.d.ts", - "sizeBytes": 659, - "sha256": "5ee6423134a34984106862b4724399938c8268d4bcb92168cd1f831ea568b44a" + "sizeBytes": 1332, + "sha256": "0bd0ba486c35839a16c0ef5c90fffa33d62f79848ae15313780e4b3647a31ca0" }, { "path": "src/alphalib/object.ts", - "sizeBytes": 727, - "sha256": "b9e1d6a7321ea441f86ec69124432185d3ce759007552bd6533ca0e696b0bf85" + "sizeBytes": 2020, + "sha256": "b0e2a3894c67e2554b1a661c3e7f833fc1fac22636873eb9607741e8ffed1b89" }, { "path": "dist/cli/OutputCtl.d.ts", @@ -3578,13 +3603,13 @@ }, { "path": "dist/alphalib/types/robots/progress-simulate.d.ts", - "sizeBytes": 9245, - "sha256": "12e4ab3ccd73da1e7e7a45463a4eddf2b3091e04adf318d7737c0a56e915ad01" + "sizeBytes": 10161, + "sha256": "c2fcd3fdd029187d9f489bda019843ea213d47c1eb029c0d986f004e04758c71" }, { "path": "src/alphalib/types/robots/progress-simulate.ts", - "sizeBytes": 1653, - "sha256": "6f896381c728dbfc35128a4c5683b9616b478f962f5d2968a4137519a5181cee" + "sizeBytes": 2024, + "sha256": "c4150d84ffa72f29dcbbebd973b6b7090e1417dcb9315bd5bc770d61d3aab9a3" }, { "path": "dist/cli/resultFiles.d.ts", @@ -3618,8 +3643,8 @@ }, { "path": "dist/alphalib/types/robots/s3-import.d.ts", - "sizeBytes": 13045, - "sha256": "32ffbd902a5c6c730f53014f642d371798fc110764c75d2ec5ab0a1cda02eb63" + "sizeBytes": 14877, + "sha256": "1d9e74e10344ed512a32aaeea9a3782fef4f5f5fee7fc8a62107e028e3015b62" }, { "path": "src/alphalib/types/robots/s3-import.ts", @@ -3628,8 +3653,8 @@ }, { "path": "dist/alphalib/types/robots/s3-store.d.ts", - "sizeBytes": 24603, - "sha256": "b2b926fdf8ed60165b5339f98dbbad4c5cb7e82a0d33c92a2e96a6ef87257f19" + "sizeBytes": 26435, + "sha256": "50277f02012113341f7227b826e4c1cad70f7b05d7be5ae23ddfe155021f0408" }, { "path": "src/alphalib/types/robots/s3-store.ts", @@ -3638,8 +3663,8 @@ }, { "path": "dist/alphalib/types/robots/script-run.d.ts", - "sizeBytes": 17234, - "sha256": "63547b6645117601d1de851b79bada4301a9b0f62a4bca1cf3e89632754786d0" + "sizeBytes": 19066, + "sha256": "b56d61f5b2b10aa89158cb1680535873fcadddcfeac1008072da5be062107164" }, { "path": "src/alphalib/types/robots/script-run.ts", @@ -3648,8 +3673,8 @@ }, { "path": "dist/alphalib/types/robots/sftp-import.d.ts", - "sizeBytes": 9785, - "sha256": "a7fd349a62c27f52b20dfe99ed009e6b1fc7b6eaad15b51761e7eaa6f78ca3ed" + "sizeBytes": 11617, + "sha256": "592473821798952a1f434bb7c256d501af564ad865a76e86ccf413a48d387800" }, { "path": "src/alphalib/types/robots/sftp-import.ts", @@ -3658,8 +3683,8 @@ }, { "path": "dist/alphalib/types/robots/sftp-store.d.ts", - "sizeBytes": 20864, - "sha256": "f1c8e65870880f7afca120b6dfb9bad0c8d1289953bc33221ff19035e2f3a291" + "sizeBytes": 22696, + "sha256": "1e0ef3840d7d2b19aa1cae3440b8dfdf1c91eed51b2dcb0c51df9f830223ed1d" }, { "path": "src/alphalib/types/robots/sftp-store.ts", @@ -3669,7 +3694,7 @@ { "path": "dist/alphalib/types/skillFrontmatter.d.ts", "sizeBytes": 1052, - "sha256": "71e161a6adb25ae24dde3d097aa341225ad850e1d09cce367a1b52a7be4b051a" + "sha256": "52bda5d0e74f4605b4c96f399dce039cb8ad6ccae883e855ec1642c229dec43f" }, { "path": "src/alphalib/types/skillFrontmatter.ts", @@ -3678,8 +3703,8 @@ }, { "path": "dist/alphalib/types/robots/speech-transcribe.d.ts", - "sizeBytes": 19949, - "sha256": "ace8aa2b1d2f366893cb34bee4a0413bf117ff4302ffa2dde911cea802779bd5" + "sizeBytes": 21781, + "sha256": "3a43edeba9fd9910c4450103c2eefc0c4bf3ff7e689b25e7e1f9eb3ff6c45cb6" }, { "path": "src/alphalib/types/robots/speech-transcribe.ts", @@ -3718,8 +3743,8 @@ }, { "path": "dist/alphalib/types/robots/supabase-import.d.ts", - "sizeBytes": 12627, - "sha256": "90adca5e04dcfa03b5b36bac2754cc117599d1b35b15641296a7f67077e7c5b6" + "sizeBytes": 14459, + "sha256": "350c23c166e235f6bd3c7518fdfeb7f69f881d83b08f0319b7c2b16447803e86" }, { "path": "src/alphalib/types/robots/supabase-import.ts", @@ -3728,8 +3753,8 @@ }, { "path": "dist/alphalib/types/robots/supabase-store.d.ts", - "sizeBytes": 21036, - "sha256": "053600e9ef6680faef2101ae027846ca8fa758e09a1e81be61be32a4add5c303" + "sizeBytes": 22868, + "sha256": "495e4f47e79e64a4617cc7531a10e236d6dbdbeb5cb6ba3f373de7c805ac7288" }, { "path": "src/alphalib/types/robots/supabase-store.ts", @@ -3738,8 +3763,8 @@ }, { "path": "dist/alphalib/types/robots/swift-import.d.ts", - "sizeBytes": 12540, - "sha256": "ac69f5083e4b43aa681f4b4a6250927a99180c35fb8b582d2f9bc92182f843fd" + "sizeBytes": 14372, + "sha256": "3bb6e93bb564b609f21c3f907542a4e58c39a8e8743c2af0a82b3237e4dc4a04" }, { "path": "src/alphalib/types/robots/swift-import.ts", @@ -3748,8 +3773,8 @@ }, { "path": "dist/alphalib/types/robots/swift-store.d.ts", - "sizeBytes": 21515, - "sha256": "54fe47c918a5738080d1e602663fbf800c2545defb8bb0cacb48c3ee6657f2a4" + "sizeBytes": 23347, + "sha256": "679080a66ed0506a55d38dc6979caabf2d1f6b8eb72541ea2664606b26a26bfe" }, { "path": "src/alphalib/types/robots/swift-store.ts", @@ -3769,17 +3794,17 @@ { "path": "dist/alphalib/types/template.d.ts", "sizeBytes": 23254, - "sha256": "24a9cd678db6f123e868188afcfaaf953272fc0e073683f64fe74cb6423ff378" + "sha256": "a759b8169d71abed161244618f3881c6662c382757771db34b414b8fac515199" }, { "path": "src/alphalib/types/template.ts", - "sizeBytes": 13672, - "sha256": "7c39c20ea9580fcd39bb2fbe51cde74ab8faf68f31a5344a0090cd9a776c731b" + "sizeBytes": 13921, + "sha256": "cda54480c94cd7c6e27c35002c0d61769870f5d8f4b12b2f23a10f0115ce7a2b" }, { "path": "dist/alphalib/types/templateCredential.d.ts", "sizeBytes": 4066, - "sha256": "c39e9015c16d0e1defa6e0ac2eb96b5ee0874ff32c0f899edf15c7bb5dc83d57" + "sha256": "e4c4973efbbf323be526e2407d7ca349c735a3580008dea7f520e1be0d7f05be" }, { "path": "src/alphalib/types/templateCredential.ts", @@ -3808,8 +3833,8 @@ }, { "path": "dist/alphalib/types/robots/text-speak.d.ts", - "sizeBytes": 19946, - "sha256": "0360f009914c68cec3f2dbfb143047650c3a9fde1e2f5b31f17462cdf44f5c96" + "sizeBytes": 21778, + "sha256": "86bf4d585dc551399251d0d2f0283543619c8ab325e08e6ffff34259b7214c7a" }, { "path": "src/alphalib/types/robots/text-speak.ts", @@ -3818,8 +3843,8 @@ }, { "path": "dist/alphalib/types/robots/text-translate.d.ts", - "sizeBytes": 30846, - "sha256": "061b8a82ec26534d96598aebd5814921c0776dab9611c68650e538ec4b9f5388" + "sizeBytes": 32678, + "sha256": "92509a4e358ffd2e36677f0cd9df47ea4e55a1b585a511233b5bc460e4722d20" }, { "path": "src/alphalib/types/robots/text-translate.ts", @@ -3828,8 +3853,8 @@ }, { "path": "dist/alphalib/types/robots/tigris-import.d.ts", - "sizeBytes": 12557, - "sha256": "367ac7fd0910a21d0c91f368125cfbc2ac41b311011a602f0e1196ccbc1c6256" + "sizeBytes": 14389, + "sha256": "d70454bd2b86d8327c3ac25c00273477a95783ef899cf739c0eac8f121a3e601" }, { "path": "src/alphalib/types/robots/tigris-import.ts", @@ -3838,8 +3863,8 @@ }, { "path": "dist/alphalib/types/robots/tigris-store.d.ts", - "sizeBytes": 21532, - "sha256": "8c86efd7e6562ff020749b2863272de41dfd2af637a5ae281a3e9d628f6e8460" + "sizeBytes": 23364, + "sha256": "df5681228f206d43682a9fbc858e24a09103e5551cc38771f2ef3c6e74335bc7" }, { "path": "src/alphalib/types/robots/tigris-store.ts", @@ -3848,13 +3873,13 @@ }, { "path": "dist/alphalib/types/robots/tlcdn-deliver.d.ts", - "sizeBytes": 6141, - "sha256": "2d55583c45f4821e987b2c6c91508a9c5432520dcd184e96f4c744772eac673d" + "sizeBytes": 8707, + "sha256": "9388277d5f3108839405ce26525d1f97c1a2f798e5a7e374ffd91cf5c74ad4c5" }, { "path": "src/alphalib/types/robots/tlcdn-deliver.ts", - "sizeBytes": 2944, - "sha256": "e51424bfe51bba22401733bc898cb72d86daf61d5cda0550f8ab46cceee03ecc" + "sizeBytes": 3328, + "sha256": "8635d2edcaafc76bc865cae54728302a59dfb50f12830d3fa00a5bcc65c3d161" }, { "path": "dist/Transloadit.d.ts", @@ -3878,8 +3903,8 @@ }, { "path": "dist/alphalib/types/robots/tus-store.d.ts", - "sizeBytes": 19747, - "sha256": "57fc17b9635c1a9c52c8a18c961f45a21ab43668c5e5912a9c7bdbb60464d2a4" + "sizeBytes": 21579, + "sha256": "8a2a1116d980ebe397086fd62b24894a1f673a3890f74b5fd4d02bea719d1a1a" }, { "path": "src/alphalib/types/robots/tus-store.ts", @@ -3899,7 +3924,7 @@ { "path": "dist/cli/types.d.ts", "sizeBytes": 2503, - "sha256": "c62e78eb76dea08fc842b9557143dee71f4b68aaa1171249497f60279844ef31" + "sha256": "c85603f6468664a0e2af65edd2d0cb736266b354830c0dec99fcb8aec6fcb484" }, { "path": "src/cli/types.ts", @@ -3908,8 +3933,8 @@ }, { "path": "dist/alphalib/types/robots/upload-handle.d.ts", - "sizeBytes": 6141, - "sha256": "f92f0f4fb223e34c6d71bc585ab29c15c6a3a101208e2653c992b23ff43cf54f" + "sizeBytes": 7973, + "sha256": "4813b6a4d4185fbec306139cab6e8e571fa557a64b099e565b9c727c86d2eadb" }, { "path": "src/alphalib/types/robots/upload-handle.ts", @@ -3928,8 +3953,8 @@ }, { "path": "dist/alphalib/types/robots/video-adaptive.d.ts", - "sizeBytes": 214472, - "sha256": "11bcd352bd1302b56be42c51f555cfffdb7f79bd1920e1f50fae8858e6a62b59" + "sizeBytes": 216304, + "sha256": "e4a3653ae510769bef849662a2de9c1d25137e66ca63594d581f69113ea766d5" }, { "path": "src/alphalib/types/robots/video-adaptive.ts", @@ -3938,8 +3963,8 @@ }, { "path": "dist/alphalib/types/robots/video-artwork.d.ts", - "sizeBytes": 166945, - "sha256": "95dfcdc66c58644ad568fe163f15bc17832e92b11f1789d42f7ed3b1b7474cf2" + "sizeBytes": 168777, + "sha256": "42f75f68b0fd264814a0e30db531f7ef6387e41ec7dae8cd7c27dd8eb62f9f2b" }, { "path": "src/alphalib/types/robots/video-artwork.ts", @@ -3948,8 +3973,8 @@ }, { "path": "dist/alphalib/types/robots/video-concat.d.ts", - "sizeBytes": 214192, - "sha256": "84f2deafbd2432a6578b8c1f6bd701235fa381a7292a0208d73ccf7d2fc3b730" + "sizeBytes": 216024, + "sha256": "d0370045b3597bde35943872dfd5f157f79b7e9a6a28e4b1464e3eb7cd39847a" }, { "path": "src/alphalib/types/robots/video-concat.ts", @@ -3958,8 +3983,8 @@ }, { "path": "dist/alphalib/types/robots/video-encode.d.ts", - "sizeBytes": 233784, - "sha256": "4e8287533efdd130afd6848f6f66653a4d4366778849894827ab4b066af49205" + "sizeBytes": 235616, + "sha256": "0799667ac697983ce43ba9f75926bafb82e361e8b38dc34ca51433840324fb57" }, { "path": "src/alphalib/types/robots/video-encode.ts", @@ -3968,8 +3993,8 @@ }, { "path": "dist/alphalib/types/robots/video-generate.d.ts", - "sizeBytes": 24823, - "sha256": "16f683806de4be65726834f9201ab6c7ddac84be5906e7fe81016028f80e646d" + "sizeBytes": 26655, + "sha256": "62d6aa1925a164e099e4acecefa5c325a445894e12667ca95643165d1c3f11d7" }, { "path": "src/alphalib/types/robots/video-generate.ts", @@ -3978,8 +4003,8 @@ }, { "path": "dist/alphalib/types/robots/video-merge.d.ts", - "sizeBytes": 218117, - "sha256": "30b160644f1b62ede7ac74e98f6382fbdab4fad5931788f7728692fc73e52e3a" + "sizeBytes": 219949, + "sha256": "35c66fec907e7a5443a22be3c50e06d86ce369668875a88a44e4af5c8a8149a1" }, { "path": "src/alphalib/types/robots/video-merge.ts", @@ -3988,8 +4013,8 @@ }, { "path": "dist/alphalib/types/robots/video-ondemand.d.ts", - "sizeBytes": 328276, - "sha256": "da59f54bbb515fbd9ef9cb1a19aa97561c1acd356acf9b1318383f9583ed0545" + "sizeBytes": 330108, + "sha256": "355db44e6e57b66d1a1801ba78db9b0be4b37b4bf11091e47c48c14fc1b27cc9" }, { "path": "src/alphalib/types/robots/video-ondemand.ts", @@ -3998,8 +4023,8 @@ }, { "path": "dist/alphalib/types/robots/video-split.d.ts", - "sizeBytes": 213341, - "sha256": "48e5533d95c707630342daa71292c23c9aa5ed9eb30aa0e7caa5dbf9eff3189e" + "sizeBytes": 215173, + "sha256": "a5a60ef5a365b4165cfb0860cc458f533894fd5453ba2cbce115ee3aaab8ce07" }, { "path": "src/alphalib/types/robots/video-split.ts", @@ -4008,8 +4033,8 @@ }, { "path": "dist/alphalib/types/robots/video-subtitle.d.ts", - "sizeBytes": 219140, - "sha256": "3449c44535c363a19d4ccb0bc42836fb2a2b40653860b650f582d80df7666a0b" + "sizeBytes": 220972, + "sha256": "fba5085dfcebf507ce07d5aa1649628f372ab626f02dfb4f56185df13734eec4" }, { "path": "src/alphalib/types/robots/video-subtitle.ts", @@ -4018,8 +4043,8 @@ }, { "path": "dist/alphalib/types/robots/video-thumbs.d.ts", - "sizeBytes": 159836, - "sha256": "76099f2d09bc70305d94cdbd22ff6b1d7f0510aba2e41e235ccfebe9f7f121f5" + "sizeBytes": 161668, + "sha256": "13e1fa3ed667eb9741f43faea7379a9c850929f878f87858bcc615893fce6e51" }, { "path": "src/alphalib/types/robots/video-thumbs.ts", @@ -4028,8 +4053,8 @@ }, { "path": "dist/alphalib/types/robots/vimeo-import.d.ts", - "sizeBytes": 10628, - "sha256": "089b905be5be295f891a9c0d253c9e9b0693ecc0c2964bc96fe5569f6b586d09" + "sizeBytes": 12460, + "sha256": "3ad8ead696ff2e1d95d90fbff1a08faa6530a7894537b5bdeb7a1ba00b46c982" }, { "path": "src/alphalib/types/robots/vimeo-import.ts", @@ -4038,8 +4063,8 @@ }, { "path": "dist/alphalib/types/robots/vimeo-store.d.ts", - "sizeBytes": 21633, - "sha256": "fe95dc638c7b3df4e7d926ce93636da1e8d59b3e6fa0f5a3c09cc032d5237786" + "sizeBytes": 23465, + "sha256": "6f98d845d6c5f77b6c889a5fd4e9627d9be88451b38d6ec24aa7feb379d2094f" }, { "path": "src/alphalib/types/robots/vimeo-store.ts", @@ -4048,8 +4073,8 @@ }, { "path": "dist/alphalib/types/robots/wasabi-import.d.ts", - "sizeBytes": 12587, - "sha256": "d4066c0bbc2667dd25945e6fc8a14a845cce2cc5c00f05ea8c393081fb5c1689" + "sizeBytes": 14419, + "sha256": "0fefe0925d0b1efb59354c0b90fce0f5120370b28840ee3789baffaa64f1d107" }, { "path": "src/alphalib/types/robots/wasabi-import.ts", @@ -4058,8 +4083,8 @@ }, { "path": "dist/alphalib/types/robots/wasabi-store.d.ts", - "sizeBytes": 21544, - "sha256": "f93747dc3012a7d553398f2da21f8e3945cbc082bbe7cba42aadbf5ec41b6aa2" + "sizeBytes": 23376, + "sha256": "ccf50e9964ca89c49ee7366e276b84c6bc3cf4f52b32322a765eaf53e313d13a" }, { "path": "src/alphalib/types/robots/wasabi-store.ts", @@ -4068,8 +4093,8 @@ }, { "path": "dist/alphalib/types/robots/youtube-store.d.ts", - "sizeBytes": 21333, - "sha256": "738f8455435c681022c8a7a6e703ecb6d1a53c338ea5c7678d04e634485d2f44" + "sizeBytes": 23165, + "sha256": "ad03e3411a10aac5ac79cba824cb25fe129dadb0445db628a917c8da60bf7fca" }, { "path": "src/alphalib/types/robots/youtube-store.ts", diff --git a/docs/fingerprint/transloadit-baseline.package.json b/docs/fingerprint/transloadit-baseline.package.json index 65dc0409..836e4c05 100644 --- a/docs/fingerprint/transloadit-baseline.package.json +++ b/docs/fingerprint/transloadit-baseline.package.json @@ -1,6 +1,6 @@ { "name": "transloadit", - "version": "4.8.1", + "version": "4.10.2", "description": "Node.js SDK for Transloadit", "homepage": "https://github.com/transloadit/node-sdk/tree/main/packages/node", "bugs": { @@ -32,35 +32,31 @@ "node": ">= 20" }, "dependencies": { - "@aws-sdk/client-s3": "^3.891.0", - "@aws-sdk/s3-request-presigner": "^3.891.0", "@transloadit/sev-logger": "^0.1.9", "@transloadit/utils": "^4.3.0", "cacheable-lookup": "^7.0.0", "clipanion": "^4.0.0-rc.4", "debug": "^4.4.3", - "dotenv": "^17.2.3", - "form-data": "^4.0.4", - "got": "14.4.9", - "into-stream": "^9.0.0", + "dotenv": "^17.4.2", + "form-data": "^4.0.5", + "got": "14.6.6", + "into-stream": "^9.1.0", "is-stream": "^4.0.1", "json-to-ast": "^2.1.0", - "lodash-es": "^4.17.21", + "lodash-es": "^4.18.1", "node-watch": "^0.7.4", - "p-map": "^7.0.3", - "p-queue": "^9.0.1", + "p-map": "^7.0.4", + "p-queue": "^9.2.0", "recursive-readdir": "^2.2.3", "tus-js-client": "^4.3.1", "typanion": "^3.14.0", - "type-fest": "^4.41.0", + "type-fest": "^5.6.0", "zod": "3.25.76" }, "devDependencies": { - "@types/debug": "^4.1.12", - "@types/minimist": "^1.2.5", - "@types/node": "^24.10.3", - "@types/recursive-readdir": "^2.2.4", - "minimatch": "^10.1.1" + "@types/debug": "^4.1.13", + "@types/node": "^25.6.0", + "@types/recursive-readdir": "^2.2.4" }, "repository": { "type": "git", diff --git a/packages/node/src/alphalib/errors.ts b/packages/node/src/alphalib/errors.ts new file mode 100644 index 00000000..427ec0ff --- /dev/null +++ b/packages/node/src/alphalib/errors.ts @@ -0,0 +1,34 @@ +import { getRecordProperty, isRecord } from './object.ts' + +export function normalizeError(err: unknown): Error { + if (err instanceof Error) { + return err + } + + return new Error(`Was thrown a non-error: ${String(err)}`, { cause: err }) +} + +export function getErrorMessage(err: unknown): string { + return err instanceof Error ? err.message : String(err) +} + +export function getErrorCode(err: unknown): unknown { + return isRecord(err) && 'code' in err ? err.code : undefined +} + +export function getErrorCodeOrValue(err: unknown): unknown { + return isRecord(err) && 'code' in err ? err.code : err +} + +export function getNodeErrorCode(err: unknown): string | undefined { + const code = getErrorCode(err) + return typeof code === 'string' ? code : undefined +} + +export function isErrnoException(err: unknown): err is NodeJS.ErrnoException { + return isRecord(err) && 'code' in err +} + +export function getErrorProperty(err: unknown, property: PropertyKey): unknown { + return getRecordProperty(err, property) +} diff --git a/packages/node/src/alphalib/object.ts b/packages/node/src/alphalib/object.ts index d5c6e8a8..dc2fd4c1 100644 --- a/packages/node/src/alphalib/object.ts +++ b/packages/node/src/alphalib/object.ts @@ -1,10 +1,50 @@ import type { Entries } from 'type-fest' +export type UnknownRecord = Record + /** * See https://github.com/microsoft/TypeScript/pull/12253#issuecomment-263132208 for * some background on why this exists and why this isn't in TypeScript by default. */ +export function isRecord(value: unknown): value is UnknownRecord { + return typeof value === 'object' && value !== null && !Array.isArray(value) +} + +export function isObjectLike(value: unknown): value is UnknownRecord { + return (typeof value === 'object' && value !== null) || typeof value === 'function' +} + +export function isPlainRecord(value: unknown): value is UnknownRecord { + return isRecord(value) +} + +export function isStringRecord(value: unknown): value is Record { + if (!isRecord(value)) { + return false + } + + return Object.values(value).every((entry) => typeof entry === 'string') +} + +export function getRecordProperty(value: unknown, property: PropertyKey): unknown { + if (!isRecord(value)) { + return undefined + } + + return value[property] +} + +export function getStringProperty(value: unknown, property: PropertyKey): string | undefined { + const propertyValue = getRecordProperty(value, property) + return typeof propertyValue === 'string' ? propertyValue : undefined +} + +export function getNumberProperty(value: unknown, property: PropertyKey): number | undefined { + const propertyValue = getRecordProperty(value, property) + return typeof propertyValue === 'number' ? propertyValue : undefined +} + /** * Returns properly typed entries of an object */ diff --git a/packages/node/src/alphalib/types/assemblyStatus.ts b/packages/node/src/alphalib/types/assemblyStatus.ts index 35c7059c..f0433637 100644 --- a/packages/node/src/alphalib/types/assemblyStatus.ts +++ b/packages/node/src/alphalib/types/assemblyStatus.ts @@ -20,6 +20,7 @@ export const assemblyStatusOkCodeSchema = z.enum([ export const assemblyStatusErrCodeSchema = z.enum([ 'ADMIN_PERMISSIONS_REQUIRED', + 'AI_CHAT_VALIDATION', 'ASSEMBLY_ACCOUNT_MISMATCH', 'ASSEMBLY_CANNOT_BE_REPLAYED', 'ASSEMBLY_COULD_NOT_BE_CREATED', @@ -37,92 +38,173 @@ export const assemblyStatusErrCodeSchema = z.enum([ 'ASSEMBLY_JOB_ENQUEUE_ERROR', 'ASSEMBLY_LIST_ERROR', 'ASSEMBLY_MEMORY_LIMIT_EXCEEDED', - 'ASSEMBLY_NO_CHARGEABLE_STEP', - 'ASSEMBLY_NO_STEPS', + 'ASSEMBLY_NOTIFICATIONS_LIST_ERROR', + 'ASSEMBLY_NOTIFICATION_LIST_ERROR', + 'ASSEMBLY_NOTIFICATION_NOT_PERSISTED', + 'ASSEMBLY_NOTIFICATION_NOT_REPLAYED', 'ASSEMBLY_NOT_CAPABLE', 'ASSEMBLY_NOT_FINISHED', 'ASSEMBLY_NOT_FOUND', 'ASSEMBLY_NOT_REPLAYED', - 'ASSEMBLY_NOTIFICATION_LIST_ERROR', - 'ASSEMBLY_NOTIFICATION_NOT_PERSISTED', - 'ASSEMBLY_NOTIFICATION_NOT_REPLAYED', - 'ASSEMBLY_NOTIFICATIONS_LIST_ERROR', + 'ASSEMBLY_NO_CHARGEABLE_STEP', 'ASSEMBLY_NO_NOTIFY_URL', + 'ASSEMBLY_NO_STEPS', 'ASSEMBLY_PLAN_FILE_SIZE_LIMIT_EXCEEDED', 'ASSEMBLY_ROBOT_MISSING', 'ASSEMBLY_SATURATED', 'ASSEMBLY_STATS_ERROR', 'ASSEMBLY_STATS_INVALID_TIME', 'ASSEMBLY_STATS_MISSING_REGION', - 'PRIORITY_JOB_SLOT_STATS_ERROR', - 'PRIORITY_JOB_SLOT_STATS_INVALID_AGGREGATION', - 'PRIORITY_JOB_SLOT_STATS_INVALID_TIME', - 'PRIORITY_JOB_SLOT_STATS_MISSING_REGION', 'ASSEMBLY_STATUS_FETCHING_RATE_LIMIT_REACHED', 'ASSEMBLY_STATUS_NOT_FOUND', 'ASSEMBLY_STATUS_PARSE_ERROR', + 'ASSEMBLY_STEP_INVALID', 'ASSEMBLY_STEP_INVALID_ROBOT', 'ASSEMBLY_STEP_INVALID_USE', - 'ASSEMBLY_STEP_INVALID', 'ASSEMBLY_STEP_NO_ROBOT', 'ASSEMBLY_STEP_UNKNOWN_ROBOT', 'ASSEMBLY_STEP_UNKNOWN_USE', - 'AI_CHAT_VALIDATION', 'ASSEMBLY_URL_TRANSFORM_MISSING', + 'AUDIO_ARTWORK_VALIDATION', + 'AUDIO_CONCAT_INVALID_INPUT', + 'AUDIO_CONCAT_VALIDATION', + 'AUDIO_ENCODE_VALIDATION', + 'AUDIO_LOOP_VALIDATION', + 'AUDIO_MERGE_VALIDATION', + 'AUDIO_SPLIT_NO_OUTPUT', + 'AUDIO_SPLIT_VALIDATION', + 'AUDIO_WAVEFORM_VALIDATION', 'AUTH_EXPIRED', - 'AUTH_KEY_SCOPES_NOT_FOUND', 'AUTH_KEYS_NOT_FOUND', + 'AUTH_KEY_SCOPES_NOT_FOUND', 'AUTH_SECRET_NOT_RETRIEVED', - 'AUDIO_WAVEFORM_VALIDATION', + 'AZURE_IMPORT_ACCESS_DENIED', + 'AZURE_IMPORT_FAILURE', + 'AZURE_IMPORT_NOT_FOUND', + 'AZURE_IMPORT_VALIDATION', 'AZURE_STORE_ACCESS_DENIED', - 'BEARER_TOKEN_AUTH_KEY_MISMATCH', - 'BEARER_TOKEN_EXPIRED', - 'BEARER_TOKEN_INVALID', + 'AZURE_STORE_VALIDATION', 'BACKBLAZE_IMPORT_ACCESS_DENIED', + 'BACKBLAZE_IMPORT_FAILURE', 'BACKBLAZE_IMPORT_NOT_FOUND', + 'BACKBLAZE_IMPORT_VALIDATION', 'BACKBLAZE_STORE_ACCESS_DENIED', 'BACKBLAZE_STORE_FAILURE', + 'BACKBLAZE_STORE_VALIDATION', 'BAD_PRICING', + 'BEARER_TOKEN_AUTH_KEY_MISMATCH', + 'BEARER_TOKEN_EXPIRED', + 'BEARER_TOKEN_INVALID', 'BILL_LIMIT_EXCEEDED', + 'BOX_IMPORT_ACCESS_DENIED', + 'BOX_IMPORT_FAILURE', + 'BOX_IMPORT_NOT_FOUND', + 'BOX_IMPORT_VALIDATION', + 'BOX_STORE_COULD_NOT_PARSE_URL', + 'BOX_STORE_VALIDATION', 'CANNOT_ACCEPT_NEW_ASSEMBLIES', 'CANNOT_FETCH_ACTIVE_ASSEMBLIES', 'CDN_REQUIRED', 'CLOUDFILES_IMPORT_ACCESS_DENIED', + 'CLOUDFILES_IMPORT_FAILURE', 'CLOUDFILES_IMPORT_NOT_FOUND', + 'CLOUDFILES_IMPORT_VALIDATION', 'CLOUDFILES_STORE_ACCESS_DENIED', 'CLOUDFILES_STORE_ERROR', + 'CLOUDFILES_STORE_VALIDATION', + 'CLOUDFLARE_IMPORT_ACCESS_DENIED', + 'CLOUDFLARE_IMPORT_FAILURE', + 'CLOUDFLARE_IMPORT_NOT_FOUND', 'CLOUDFLARE_IMPORT_VALIDATION', + 'CLOUDFLARE_STORE_URL_VERIFICATION_FAILURE', + 'CLOUDFLARE_STORE_VALIDATION', + 'CLOUD_AI_IMAGE_VALIDATION', + 'DIGITALOCEAN_IMPORT_ACCESS_DENIED', + 'DIGITALOCEAN_IMPORT_FAILURE', + 'DIGITALOCEAN_IMPORT_NOT_FOUND', + 'DIGITALOCEAN_IMPORT_VALIDATION', 'DIGITALOCEAN_STORE_ACCESS_DENIED', - 'DO_NOT_REUSE_ASSEMBLY_IDS', + 'DIGITALOCEAN_STORE_VALIDATION', + 'DOCUMENT_AUTOROTATE_VALIDATION', 'DOCUMENT_CONVERT_UNSUPPORTED_CONVERSION', + 'DOCUMENT_CONVERT_VALIDATION', + 'DOCUMENT_MERGE_UNSUPPORTED_CONVERSION', + 'DOCUMENT_MERGE_VALIDATION', + 'DOCUMENT_OCR_VALIDATION', 'DOCUMENT_OPTIMIZE_UNSUPPORTED_INPUT', 'DOCUMENT_OPTIMIZE_VALIDATION', 'DOCUMENT_SPLIT_VALIDATION', + 'DOCUMENT_THUMBS_INVALID_INPUT', 'DOCUMENT_THUMBS_VALIDATION', + 'DO_NOT_REUSE_ASSEMBLY_IDS', + 'DROPBOX_IMPORT_ACCESS_DENIED', + 'DROPBOX_IMPORT_FAILURE', + 'DROPBOX_IMPORT_NOT_FOUND', + 'DROPBOX_IMPORT_VALIDATION', + 'DROPBOX_STORE_COULD_NOT_PARSE_URL', + 'DROPBOX_STORE_VALIDATION', + 'FILE_COMPRESS_INVALID_INPUT', + 'FILE_COMPRESS_VALIDATION', + 'FILE_DECOMPRESS_INVALID_INPUT', + 'FILE_DECOMPRESS_PASSWORD_INCORRECT', + 'FILE_DECOMPRESS_PASSWORD_REQUIRED', + 'FILE_DECOMPRESS_VALIDATION', 'FILE_DOWNLOAD_ERROR', 'FILE_FILTER_DECLINED_FILE', 'FILE_FILTER_INVALID_OPERATOR', 'FILE_FILTER_VALIDATION', + 'FILE_HASH_VALIDATION', 'FILE_META_DATA_ERROR', 'FILE_PREVIEW_VALIDATION', 'FILE_READ_VALIDATION_ERROR', 'FILE_SERVE_NO_RESULT', + 'FILE_SERVE_VALIDATION', 'FILE_VERIFY_INVALID_FILE', + 'FILE_VERIFY_VALIDATION', 'FILE_VIRUSSCAN_DECLINED_FILE', + 'FILE_VIRUSSCAN_INVALID_INPUT', + 'FILE_VIRUSSCAN_VALIDATION', + 'FILE_WATERMARK_VALIDATION', + 'FTP_IMPORT_ACCESS_DENIED', + 'FTP_IMPORT_FAILURE', + 'FTP_IMPORT_NOT_FOUND', + 'FTP_IMPORT_VALIDATION', + 'FTP_STORE_VALIDATION', 'GET_ACCOUNT_DB_ERROR', 'GET_ACCOUNT_UNKNOWN_AUTH_KEY', + 'GOOGLE_IMPORT_ACCESS_DENIED', + 'GOOGLE_IMPORT_FAILURE', + 'GOOGLE_IMPORT_NOT_FOUND', 'GOOGLE_IMPORT_VALIDATION', + 'GOOGLE_STORE_INVALID_INPUT', 'GOOGLE_STORE_VALIDATION', 'HTML_CONVERT_VALIDATION', 'HTTP_IMPORT_ACCESS_DENIED', 'HTTP_IMPORT_FAILURE', 'HTTP_IMPORT_NOT_FOUND', 'HTTP_IMPORT_VALIDATION', + 'IMAGE_BGREMOVE_VALIDATION', + 'IMAGE_COPYRIGHT_DETECT_DECLINED_FILE', + 'IMAGE_COPYRIGHT_DETECT_VALIDATION', 'IMAGE_DESCRIBE_VALIDATION', 'IMAGE_ENHANCE_NO_INPUT_FILE', 'IMAGE_ENHANCE_VALIDATION', + 'IMAGE_FACEDETECT_VALIDATION', + 'IMAGE_GENERATE_VALIDATION', + 'IMAGE_MERGE_FAILURE', + 'IMAGE_MERGE_VALIDATION', + 'IMAGE_OCR_VALIDATION', + 'IMAGE_OPTIMIZE_VALIDATION', 'IMAGE_RESIZE_ERROR', + 'IMAGE_RESIZE_INVALID_BLUR_REGION', + 'IMAGE_RESIZE_INVALID_TEXT_OBJECT_VALUE', + 'IMAGE_RESIZE_INVALID_TEXT_VALUE', + 'IMAGE_RESIZE_INVALID_WATERMARK_OFFSET', + 'IMAGE_RESIZE_INVALID_WATERMARK_POSITION', + 'IMAGE_RESIZE_NO_CLUT_FILE', + 'IMAGE_RESIZE_NO_INPUT_FILE', 'IMAGE_RESIZE_VALIDATION', + 'IMAGE_UPSCALE_VALIDATION', 'IMPORT_FILE_ERROR', 'INCOMPLETE_PRICING', 'INSUFFICIENT_AUTH_SCOPE', @@ -136,15 +218,26 @@ export const assemblyStatusErrCodeSchema = z.enum([ 'INVALID_AUTH_REFERER_PARAMETER', 'INVALID_FILE_META_DATA', 'INVALID_FORM_DATA', - 'INVALID_URL_ENCODING', 'INVALID_INPUT_ERROR', 'INVALID_PARAMS_FIELD', 'INVALID_SIGNATURE', 'INVALID_STEP_NAME', 'INVALID_TEMPLATE_FIELD', 'INVALID_UPLOAD_HANDLE_STEP_NAME', + 'INVALID_URL_ENCODING', 'MAX_NUMBER_OF_FILES_EXCEEDED', 'MAX_SIZE_EXCEEDED', + 'MEGA_IMPORT_ACCESS_DENIED', + 'MEGA_IMPORT_FAILURE', + 'MEGA_IMPORT_NOT_FOUND', + 'MEGA_IMPORT_VALIDATION', + 'MEGA_STORE_VALIDATION', + 'META_WRITE_VALIDATION', + 'MINIO_IMPORT_ACCESS_DENIED', + 'MINIO_IMPORT_FAILURE', + 'MINIO_IMPORT_NOT_FOUND', + 'MINIO_IMPORT_VALIDATION', + 'MINIO_STORE_VALIDATION', 'NO_AUTH_EXPIRES_PARAMETER', 'NO_AUTH_KEY_PARAMETER', 'NO_AUTH_PARAMETER', @@ -160,37 +253,100 @@ export const assemblyStatusErrCodeSchema = z.enum([ 'PLAN_LIMIT_EXCEEDED', 'POSSIBLY_MALICIOUS_FILE_FOUND', 'PRIORITY_JOB_SLOTS_NOT_FOUND', + 'PRIORITY_JOB_SLOT_STATS_ERROR', + 'PRIORITY_JOB_SLOT_STATS_INVALID_AGGREGATION', + 'PRIORITY_JOB_SLOT_STATS_INVALID_TIME', + 'PRIORITY_JOB_SLOT_STATS_MISSING_REGION', + 'PROGRESS_SIMULATE_VALIDATION', 'RATE_LIMIT_REACHED', 'REFERER_MISMATCH', 'REQUEST_PREMATURE_CLOSED', 'ROBOT_VALIDATION_BASE_ERROR', 'S3_ACCESS_DENIED', 'S3_IMPORT_ACCESS_DENIED', + 'S3_IMPORT_FAILURE', + 'S3_IMPORT_NOT_FOUND', 'S3_IMPORT_VALIDATION', 'S3_NOT_FOUND', 'S3_STORE_ACCESS_DENIED', + 'S3_STORE_FAILURE', + 'S3_STORE_URL_VERIFICATION_FAILURE', 'S3_STORE_VALIDATION', + 'SCRIPT_RUN_VALIDATION', 'SERVER_403', 'SERVER_404', 'SERVER_500', + 'SFTP_IMPORT_ACCESS_DENIED', + 'SFTP_IMPORT_FAILURE', + 'SFTP_IMPORT_NOT_FOUND', + 'SFTP_IMPORT_VALIDATION', + 'SFTP_STORE_VALIDATION', 'SIGNATURE_REUSE_DETECTED', + 'SLOT_COUNTS_ERROR', 'SLOT_COUNT_ERROR', 'SLOT_COUNT_MISSING_PARAMS', - 'SLOT_COUNTS_ERROR', + 'SPEECH_TRANSCRIBE_VALIDATION', + 'SUPABASE_IMPORT_ACCESS_DENIED', + 'SUPABASE_IMPORT_FAILURE', + 'SUPABASE_IMPORT_NOT_FOUND', + 'SUPABASE_IMPORT_VALIDATION', + 'SUPABASE_STORE_VALIDATION', + 'SWIFT_IMPORT_ACCESS_DENIED', + 'SWIFT_IMPORT_FAILURE', + 'SWIFT_IMPORT_NOT_FOUND', + 'SWIFT_IMPORT_VALIDATION', + 'SWIFT_STORE_VALIDATION', 'TEMPLATE_CREDENTIALS_INJECTION_ERROR', 'TEMPLATE_DB_ERROR', 'TEMPLATE_DENIES_STEPS_OVERRIDE', 'TEMPLATE_INVALID_JSON', 'TEMPLATE_NOT_FOUND', + 'TEXT_SPEAK_VALIDATION', + 'TEXT_TRANSLATE_VALIDATION', + 'TIGRIS_IMPORT_ACCESS_DENIED', + 'TIGRIS_IMPORT_FAILURE', + 'TIGRIS_IMPORT_NOT_FOUND', + 'TIGRIS_IMPORT_VALIDATION', + 'TIGRIS_STORE_VALIDATION', 'TMP_FILE_DOWNLOAD_ERROR', + 'TOKEN_INVALID_CREDENTIALS', + 'TUS_STORE_VALIDATION', 'USER_COMMAND_ERROR', 'VERIFIED_EMAIL_REQUIRED', + 'VIDEO_ADAPTIVE_VALIDATION', + 'VIDEO_ARTWORK_VALIDATION', 'VIDEO_CONCAT_INVALID_INPUT', 'VIDEO_CONCAT_NO_OUTPUT', 'VIDEO_CONCAT_VALIDATION', + 'VIDEO_ENCODE_INVALID_VIDEO_CODEC', + 'VIDEO_ENCODE_INVALID_WATERMARK_POSITION', 'VIDEO_ENCODE_VALIDATION', + 'VIDEO_GENERATE_VALIDATION', + 'VIDEO_MERGE_NO_IMAGE_FOUND', + 'VIDEO_MERGE_VALIDATION', + 'VIDEO_ONDEMAND_NOT_FOUND', + 'VIDEO_ONDEMAND_VALIDATION', + 'VIDEO_SPLIT_NO_OUTPUT', + 'VIDEO_SPLIT_VALIDATION', + 'VIDEO_SUBTITLE_VALIDATION', + 'VIDEO_THUMBS_INVALID_COUNT_VALUE', + 'VIDEO_THUMBS_INVALID_INPUT', + 'VIDEO_THUMBS_VALIDATION', + 'VIMEO_IMPORT_ACCESS_DENIED', 'VIMEO_IMPORT_FAILURE', + 'VIMEO_IMPORT_NOT_FOUND', + 'VIMEO_IMPORT_VALIDATION', + 'VIMEO_STORE_ACCESS_DENIED', + 'VIMEO_STORE_PROBLEM_SENDING_FILE', + 'VIMEO_STORE_VALIDATION', + 'WASABI_IMPORT_ACCESS_DENIED', + 'WASABI_IMPORT_FAILURE', + 'WASABI_IMPORT_NOT_FOUND', + 'WASABI_IMPORT_VALIDATION', + 'WASABI_STORE_VALIDATION', 'WORKER_JOB_ERROR', + 'YOUTUBE_STORE_PROBLEM_SENDING_FILE', + 'YOUTUBE_STORE_VALIDATION', ]) const assemblyStatusMetaSchema = z @@ -428,7 +584,7 @@ export const assemblyStatusUploadSchema = z type: z.string().nullable(), field: z.string().nullable(), md5hash: z.string().nullable(), - original_id: z.union([z.string(), z.array(z.string())]), + original_id: z.union([z.string(), z.array(z.string().nullable())]), original_basename: z.string(), original_name: z.string(), original_path: z.string(), @@ -463,7 +619,7 @@ export const assemblyStatusResultSchema = z basename: z.string().nullable().optional(), field: z.string().nullable().optional(), md5hash: z.string().nullable().optional(), - original_id: z.union([z.string(), z.array(z.string())]).optional(), + original_id: z.union([z.string(), z.array(z.string().nullable())]).optional(), original_basename: z.string().nullable().optional(), original_path: z.string().nullable().optional(), original_md5hash: z.string().nullable().optional(), @@ -913,13 +1069,16 @@ export const assemblyIndexItemSchema = z instance: assemblyStatusBaseSchema.shape.instance.unwrap().optional(), notify_url: assemblyStatusBaseSchema.shape.notify_url.optional(), redirect_url: z.string().nullable().optional(), - files: z.string().nullable(), // JSON stringified, specific to list item, CAN BE NULL + files: z.string().nullable().optional(), // JSON stringified list metadata; replay rows omit it warning_count: z.number().optional(), execution_duration: assemblyStatusBaseSchema.shape.execution_duration.optional(), execution_start: assemblyStatusBaseSchema.shape.execution_start.optional(), region: assemblyStatusBaseSchema.shape.region.optional(), num_input_files: assemblyStatusBaseSchema.shape.num_input_files.optional(), bytes_usage: assemblyStatusBaseSchema.shape.bytes_usage.optional(), + bytes_expected: assemblyStatusBaseSchema.shape.bytes_expected.optional(), + bytes_received: assemblyStatusBaseSchema.shape.bytes_received.optional(), + upload_duration: assemblyStatusBaseSchema.shape.upload_duration.optional(), ok: assemblyStatusOkCodeSchema.nullable().optional(), error: assemblyStatusErrCodeSchema.nullable().optional(), created: z.string(), diff --git a/packages/node/src/alphalib/types/robots/_index.ts b/packages/node/src/alphalib/types/robots/_index.ts index a93fd6e2..809ae2a4 100644 --- a/packages/node/src/alphalib/types/robots/_index.ts +++ b/packages/node/src/alphalib/types/robots/_index.ts @@ -1,6 +1,6 @@ import { z } from 'zod' -type RobotSchemaOption = z.ZodObject +type RobotSchemaOption = z.ZodObject<{ robot: z.ZodTypeAny } & z.ZodRawShape> type RobotSchemaOptions = [RobotSchemaOption, ...RobotSchemaOption[]] import { meta as aiChatMeta, diff --git a/packages/node/src/alphalib/types/robots/_instructions-primitives.ts b/packages/node/src/alphalib/types/robots/_instructions-primitives.ts index 78713099..b811bdec 100644 --- a/packages/node/src/alphalib/types/robots/_instructions-primitives.ts +++ b/packages/node/src/alphalib/types/robots/_instructions-primitives.ts @@ -300,6 +300,38 @@ type InterpolatableSchema = Schema extends z.ZodStr ? z.ZodUnion<[z.ZodString, ...InterpolatableTuple]> : Schema +function isZodTypeAny(schema: unknown): schema is z.ZodTypeAny { + return schema instanceof z.ZodType +} + +function toFirstPartySchema(schema: unknown): z.ZodFirstPartySchemaTypes { + if (!isZodTypeAny(schema)) { + throw new Error('Expected a Zod schema') + } + return schema as z.ZodFirstPartySchemaTypes +} + +function toInterpolatableSchema( + schema: z.ZodTypeAny, +): InterpolatableSchema { + return schema as InterpolatableSchema +} + +function toInterpolatableRobot>( + schema: z.ZodTypeAny, +): InterpolatableRobot { + return schema as InterpolatableRobot +} + +function toInterpolatableUnionOptions(options: z.ZodTypeAny[]): z.ZodUnionOptions { + if (options.length === 0) { + throw new Error('Union options must not be empty') + } + + const [head, ...tail] = options + return [head, ...tail] +} + export function interpolateRecursive( schema: Schema, ): InterpolatableSchema { @@ -307,12 +339,14 @@ export function interpolateRecursive( switch (def.typeName) { case z.ZodFirstPartyTypeKind.ZodBoolean: - return z.union([ - interpolationSchemaFull, - z - .union([schema, booleanStringSchema]) - .transform((value) => value === true || value === false), - ]) as InterpolatableSchema + return toInterpolatableSchema( + z.union([ + interpolationSchemaFull, + z + .union([schema, booleanStringSchema]) + .transform((value) => value === true || value === false), + ]), + ) case z.ZodFirstPartyTypeKind.ZodArray: { let replacement = z.array(interpolateRecursive(def.type), def) @@ -328,88 +362,93 @@ export function interpolateRecursive( replacement = replacement.min(def.minLength.value, def.minLength.message) } - return z.union([interpolationSchemaFull, replacement]) as InterpolatableSchema + return toInterpolatableSchema(z.union([interpolationSchemaFull, replacement])) } case z.ZodFirstPartyTypeKind.ZodDefault: { - const replacement = ( - interpolateRecursive(def.innerType) as InterpolatableSchema + const replacement = toInterpolatableSchema( + interpolateRecursive(def.innerType), ).default(def.defaultValue()) - return ( - def.description ? replacement.describe(def.description) : replacement - ) as InterpolatableSchema + return toInterpolatableSchema( + def.description ? replacement.describe(def.description) : replacement, + ) } case z.ZodFirstPartyTypeKind.ZodEffects: case z.ZodFirstPartyTypeKind.ZodEnum: case z.ZodFirstPartyTypeKind.ZodLiteral: - return z.union([interpolationSchemaFull, schema], def) as InterpolatableSchema + return toInterpolatableSchema(z.union([interpolationSchemaFull, schema], def)) case z.ZodFirstPartyTypeKind.ZodNumber: - return z.union( - [ - z - .string() - .regex(/^\d+(\.\d+)?$/) - .transform((value) => Number(value)), - interpolationSchemaFull, - schema, - ], - def, - ) as InterpolatableSchema + return toInterpolatableSchema( + z.union( + [ + z + .string() + .regex(/^\d+(\.\d+)?$/) + .transform((value) => Number(value)), + interpolationSchemaFull, + schema, + ], + def, + ), + ) case z.ZodFirstPartyTypeKind.ZodNullable: - return interpolateRecursive(def.innerType) - .nullable() - .describe(def.description) as InterpolatableSchema + return toInterpolatableSchema( + interpolateRecursive(def.innerType).nullable().describe(def.description), + ) case z.ZodFirstPartyTypeKind.ZodObject: { const replacement = z.object( Object.fromEntries( Object.entries(def.shape()).map(([key, nested]) => [ key, - interpolateRecursive(nested as z.ZodFirstPartySchemaTypes), + interpolateRecursive(toFirstPartySchema(nested)), ]), ), def, ) - return z.union([ - interpolationSchemaFull, - def.unknownKeys === 'strict' - ? replacement.strict() - : def.unknownKeys === 'passthrough' - ? replacement.passthrough() - : replacement, - ]) as InterpolatableSchema + return toInterpolatableSchema( + z.union([ + interpolationSchemaFull, + def.unknownKeys === 'strict' + ? replacement.strict() + : def.unknownKeys === 'passthrough' + ? replacement.passthrough() + : replacement, + ]), + ) } case z.ZodFirstPartyTypeKind.ZodOptional: - return z.optional(interpolateRecursive(def.innerType), def) as InterpolatableSchema + return toInterpolatableSchema(z.optional(interpolateRecursive(def.innerType), def)) case z.ZodFirstPartyTypeKind.ZodRecord: - return z.record( - def.keyType, - interpolateRecursive(def.valueType), - def, - ) as InterpolatableSchema + return toInterpolatableSchema(z.record(def.keyType, interpolateRecursive(def.valueType), def)) case z.ZodFirstPartyTypeKind.ZodString: - return z.union([interpolationSchemaPartial, schema], def) as InterpolatableSchema + return toInterpolatableSchema(z.union([interpolationSchemaPartial, schema], def)) case z.ZodFirstPartyTypeKind.ZodTuple: { const tuple = z.tuple(def.items.map(interpolateRecursive), def) - return z.union([ - interpolationSchemaFull, - def.rest ? tuple.rest(def.rest) : tuple, - ]) as InterpolatableSchema + return toInterpolatableSchema( + z.union([interpolationSchemaFull, def.rest ? tuple.rest(def.rest) : tuple]), + ) } case z.ZodFirstPartyTypeKind.ZodUnion: - return z.union( - [interpolationSchemaFull, ...(def.options.map(interpolateRecursive) as z.ZodUnionOptions)], - def, - ) as InterpolatableSchema + return toInterpolatableSchema( + z.union( + [ + interpolationSchemaFull, + ...toInterpolatableUnionOptions(def.options.map(interpolateRecursive)), + ], + def, + ), + ) default: - return schema as InterpolatableSchema + return toInterpolatableSchema(schema) } } /** * The robot keys specified in this array can’t be interpolated. */ -const uninterpolatableKeys = ['robot', 'use'] as const +const uninterpolatableKeys = ['interpolate', 'robot', 'use'] as const +const uninterpolatableKeySet = new Set(uninterpolatableKeys) type InterpolatableRobot> = Schema extends z.ZodObject @@ -428,27 +467,45 @@ export function interpolateRobot>( schema: Schema, ): InterpolatableRobot { const def = schema._def - return z - .object( - Object.fromEntries( - Object.entries(def.shape()).map(([key, nested]) => [ - key, - (uninterpolatableKeys as readonly string[]).includes(key) - ? nested - : interpolateRecursive(nested as z.ZodFirstPartySchemaTypes), - ]), - ), - def, - ) - .strict() as InterpolatableRobot + return toInterpolatableRobot( + z + .object( + Object.fromEntries( + Object.entries(def.shape()).map(([key, nested]) => [ + key, + uninterpolatableKeySet.has(key) + ? nested + : interpolateRecursive(toFirstPartySchema(nested)), + ]), + ), + def, + ) + .strict(), + ) } +const robotInterpolateBooleanSchema = z + .union([z.boolean(), booleanStringSchema]) + .transform((value) => value === true || value === 'true') + +export const robotInterpolateSchema = z + .union([robotInterpolateBooleanSchema, z.record(robotInterpolateBooleanSchema)]) + .describe(` +Controls whether Assembly Variables are interpolated for individual instruction fields. + +By default, most Robot instruction fields interpolate Assembly Variables. Set this to \`false\` to treat every instruction field as literal text, or set an individual field path to \`false\` to treat only that field as literal text. For Robot-specific fields that are literal by default, set this to \`true\` or set that field path to \`true\` to opt back into interpolation. + +Use field names such as \`path\`, or dotted paths such as \`ffmpeg.vf\` for nested objects. +`) + /** * Fields that are shared by all Transloadit robots. */ export type RobotBase = z.infer export const robotBase = z .object({ + interpolate: robotInterpolateSchema.optional(), + output_meta: z .union([z.record(z.boolean()), z.boolean(), z.array(z.string())]) .optional() @@ -805,7 +862,7 @@ A parameter object to be passed to FFmpeg. If a preset is used, the options spec ffmpeg_stack: z // Any semver in range is allowed and normalized. The enum is used for editor completions. .union([z.enum(['v5', 'v6', 'v7']), z.string().regex(/^v?[567](\.\d+)?(\.\d+)?$/)]) - .default('v5.0.0') + .default('v6.0.0') .describe(` Selects the FFmpeg stack version to use for encoding. These versions reflect real FFmpeg versions. We currently recommend to use "v6.0.0". `), diff --git a/packages/node/src/alphalib/types/robots/ai-chat.ts b/packages/node/src/alphalib/types/robots/ai-chat.ts index c52ba3d2..f13002ba 100644 --- a/packages/node/src/alphalib/types/robots/ai-chat.ts +++ b/packages/node/src/alphalib/types/robots/ai-chat.ts @@ -214,7 +214,9 @@ export const robotAiChatInstructionsSchema = robotBase system_message: z .string() .optional() - .describe('Set the system/developer prompt, if the model allows it'), + .describe( + 'Set the system/developer prompt, if the model allows it. If this prompt contains literal documentation or code examples with `${...}` syntax, set `interpolate.system_message` to `false`.', + ), reasoning_effort: z .enum(['xhigh', 'high', 'medium', 'low']) .optional() diff --git a/packages/node/src/alphalib/types/robots/assembly-savejson.ts b/packages/node/src/alphalib/types/robots/assembly-savejson.ts index 6a4cfde1..2e6733ee 100644 --- a/packages/node/src/alphalib/types/robots/assembly-savejson.ts +++ b/packages/node/src/alphalib/types/robots/assembly-savejson.ts @@ -2,9 +2,10 @@ import { z } from 'zod' import type { RobotMetaInput } from './_instructions-primitives.ts' import { interpolateRobot, robotBase } from './_instructions-primitives.ts' -// @ts-expect-error - AssemblySavejsonRobot is not ready yet @TODO please supply missing keys export const meta: RobotMetaInput = { - name: 'AssemblySavejsonRobot', + bytescount: 0, + discount_factor: 0, + discount_pct: 100, example_code: { steps: { save_json: { @@ -13,6 +14,19 @@ export const meta: RobotMetaInput = { }, }, example_code_description: 'Save Assembly result data as JSON:', + minimum_charge: 0, + output_factor: 1, + override_lvl1: 'File Exporting', + purpose_sentence: 'exports Assembly status data as JSON', + purpose_verb: 'export', + purpose_word: 'Assembly status', + purpose_words: 'Export Assembly status JSON', + service_slug: 'file-exporting', + slot_count: 5, + title: 'Export Assembly status JSON', + typical_file_size_mb: 0.1, + typical_file_type: 'file', + name: 'AssemblySavejsonRobot', priceFactor: 0, queueSlotCount: 5, isAllowedForUrlTransform: true, diff --git a/packages/node/src/alphalib/types/robots/document-thumbs.ts b/packages/node/src/alphalib/types/robots/document-thumbs.ts index 78107a45..94344c0e 100644 --- a/packages/node/src/alphalib/types/robots/document-thumbs.ts +++ b/packages/node/src/alphalib/types/robots/document-thumbs.ts @@ -102,6 +102,20 @@ If you specify the value \`"gif"\`, then an animated gif cycling through all pag If your output format is \`"gif"\` then this parameter sets the number of 100th seconds to pass before the next frame is shown in the animation. Set this to \`100\` for example to allow 1 second to pass between the frames of the animated gif. If your output format is not \`"gif"\`, then this parameter does not have any effect. +`), + stack: z + .enum(['ghostscript', 'vips', 'pdfium']) + .optional() + .describe(` +Selects the PDF rendering stack. Defaults to Ghostscript. + +Use \`"pdfium"\` for page-specific or single-page high-DPI PDF rasterization when Ghostscript is too slow or exhausts scratch space, for example with high-resolution CAD, blueprint, or layered real-estate PDFs. This stack uses PDFium via the Python \`pypdfium2\` bindings and Pillow for final image encoding. + +Use \`"vips"\` only when you explicitly want libvips PDF loading. It is lower-overhead, but PDFium was faster in high-DPI floorplan tests while producing comparable output quality. + +The \`"pdfium"\` stack currently supports JPG/PNG output, \`resize_strategy: "fit"\`, a specific \`page\` or single-page PDFs, opaque hexadecimal backgrounds, \`antialiasing\`, and \`pdf_use_cropbox\`. + +The \`"vips"\` stack currently supports JPG/PNG output, \`resize_strategy: "fit"\`, a specific \`page\` or single-page PDFs, and hexadecimal or transparent backgrounds. `), width: z .number() @@ -206,10 +220,10 @@ export const robotDocumentThumbsInstructionsWithHiddenFieldsSchema = .union([z.literal('debug'), robotDocumentThumbsInstructionsSchema.shape.result]) .optional(), stack: z - .string() + .enum(['ghostscript', 'vips', 'pdfium', 'imagemagick']) .optional() .describe(` -The image processing stack to use. Defaults to the robot's preferred stack (ImageMagick). +Selects the PDF rendering stack. Use \`"ghostscript"\` for the default renderer, \`"pdfium"\` for high-end CAD, blueprint, floorplan, or other complex high-DPI PDFs where Ghostscript is too slow or exhausts scratch space, and \`"vips"\` only when libvips PDF loading is explicitly needed. The \`"imagemagick"\` value is kept for internal/backwards-compatible use and should not be used in new public templates. `), // Override to support lowercase for BC: alpha: z diff --git a/packages/node/src/alphalib/types/robots/file-filter.ts b/packages/node/src/alphalib/types/robots/file-filter.ts index dcfbef43..6a7ee283 100644 --- a/packages/node/src/alphalib/types/robots/file-filter.ts +++ b/packages/node/src/alphalib/types/robots/file-filter.ts @@ -59,6 +59,10 @@ The Robot has two modes of operation: - Constructing conditions out of arrays with 3 members each. For example, \`["\${file.size}", "<=", "720"]\` - Writing conditions in JavaScript. For example, \`\${file.size <= 720}\`. See also [Dynamic Evaluation](/docs/topics/dynamic-evaluation/). +If you want a \`/file/filter\` Step to pass every input file through unchanged, leave \`accepts\` and +\`declines\` unset, or set them to \`null\`. Do not use \`"accepts": "true"\` for this: plain strings +are treated as JavaScript expressions only when they use the \`\${...}\` form, such as \`"\${true}"\`. + Passing JavaScript allows you to implement logic as complex as you wish, however it’s slower than combining arrays of conditions, and will be charged for per invocation via [🤖/script/run](/docs/robots/script-run/). ### Conditions as arrays @@ -109,7 +113,7 @@ As indicated, we charge for this via [🤖/script/run](/docs/robots/script-run/) accepts: filterCondition .describe( ` -Files that match at least one requirement will be accepted, or declined otherwise. If the value is \`null\`, all files will be accepted. If the array is empty, no files will be accepted. Examples: +Files that match at least one requirement will be accepted, or declined otherwise. If the value is \`null\`, all files will be accepted. If the array is empty, no files will be accepted. Omit this parameter or set it to \`null\` when you want the Step to pass every file through. Examples: \`[["\${file.mime}", "==", "image/gif"]]\` \`[["\${file.size}", "<", "5kb"]]\` diff --git a/packages/node/src/alphalib/types/robots/file-watermark.ts b/packages/node/src/alphalib/types/robots/file-watermark.ts index ce2a9adb..8dddb1d8 100644 --- a/packages/node/src/alphalib/types/robots/file-watermark.ts +++ b/packages/node/src/alphalib/types/robots/file-watermark.ts @@ -3,9 +3,10 @@ import { z } from 'zod' import type { RobotMetaInput } from './_instructions-primitives.ts' import { interpolateRobot, robotBase, robotUse } from './_instructions-primitives.ts' -// @ts-expect-error - FileWatermarkRobot is not ready yet @TODO please supply missing keys export const meta: RobotMetaInput = { - name: 'FileWatermarkRobot', + bytescount: 4, + discount_factor: 0.25, + discount_pct: 75, example_code: { steps: { watermarked: { @@ -16,6 +17,19 @@ export const meta: RobotMetaInput = { }, }, example_code_description: 'Apply randomized watermarking to uploaded files:', + minimum_charge: 0, + output_factor: 1, + override_lvl1: 'Image Manipulation', + purpose_sentence: 'applies randomized watermarks to uploaded media', + purpose_verb: 'write', + purpose_word: 'watermark files', + purpose_words: 'Watermark files', + service_slug: 'image-manipulation', + slot_count: 20, + title: 'Apply watermarks to files', + typical_file_size_mb: 1.2, + typical_file_type: 'file', + name: 'FileWatermarkRobot', priceFactor: 4, queueSlotCount: 20, isAllowedForUrlTransform: true, diff --git a/packages/node/src/alphalib/types/robots/http-import.ts b/packages/node/src/alphalib/types/robots/http-import.ts index 928f994d..93c7a273 100644 --- a/packages/node/src/alphalib/types/robots/http-import.ts +++ b/packages/node/src/alphalib/types/robots/http-import.ts @@ -6,6 +6,7 @@ import { return_file_stubs, robotBase, robotImport, + robotUseWithHiddenFields, } from './_instructions-primitives.ts' export const meta: RobotMetaInput = { @@ -85,6 +86,10 @@ Headers can be specified as: - An array of strings in the format "Header-Name: value" - An array of objects with header names as keys and values as values - A JSON string that will be parsed into an object + +The same \`headers\` value is sent with every URL in this \`/http/import\` Step. If \`url\` is an +array, \`headers\` is not matched to the URLs by array index. Use separate \`/http/import\` Steps +when different URLs need different headers. `), import_on_errors: z .array(z.string()) @@ -123,8 +128,9 @@ Allows you to specify one or more byte ranges to import from the file. The serve }) .strict() -export const robotHttpImportInstructionsWithHiddenFieldsSchema = - robotHttpImportInstructionsSchema.extend({ +export const robotHttpImportInstructionsWithHiddenFieldsSchema = robotHttpImportInstructionsSchema + .merge(robotUseWithHiddenFields) + .extend({ force_original_id: z.string().optional(), force_name: z .union([z.string(), z.record(z.string())]) diff --git a/packages/node/src/alphalib/types/robots/image-optimize.ts b/packages/node/src/alphalib/types/robots/image-optimize.ts index 787cbbd0..b81419e5 100644 --- a/packages/node/src/alphalib/types/robots/image-optimize.ts +++ b/packages/node/src/alphalib/types/robots/image-optimize.ts @@ -54,7 +54,7 @@ This Robot enables you to lower your storage and bandwidth costs, and It works well together with [🤖/image/resize](/docs/robots/image-resize/) to bring the full power of resized and optimized images to your website or app. > [!Note] -> This Robot accepts all image types and will just pass on unsupported image types unoptimized. Hence, there is no need to set up [🤖/file/filter](/docs/robots/file-filter/) workflows for this. +> This Robot accepts all image types and will just pass on unsupported image types unoptimized, including JPEG XL (\`.jxl\`) images when no smaller optimized result can be produced. Hence, there is no need to set up [🤖/file/filter](/docs/robots/file-filter/) workflows for this. > [!Note] > PNG optimization uses only lossless (optipng) compressors by default. To also enable lossy compression (pngquant), set \`lossy: true\`. When enabled, both lossy and lossless compressors compete and the smallest result wins, which may cause color shifts in some images. diff --git a/packages/node/src/alphalib/types/robots/image-resize.ts b/packages/node/src/alphalib/types/robots/image-resize.ts index f153433f..74c3fc70 100644 --- a/packages/node/src/alphalib/types/robots/image-resize.ts +++ b/packages/node/src/alphalib/types/robots/image-resize.ts @@ -162,7 +162,7 @@ export const robotImageResizeInstructionsSchema = robotBase .describe(` The output format for the modified image. -Some of the most important available formats are \`"jpg"\`, \`"png"\`, \`"gif"\`, and \`"tiff"\`. For a complete lists of all formats that we can write to please check [our supported image formats list](/docs/supported-formats/image-formats/). +Some of the most important available formats are \`"jpg"\`, \`"png"\`, \`"gif"\`, \`"tiff"\`, and \`"jxl"\` for JPEG XL. For a complete list of all formats that we can write to, please check [our supported image formats list](/docs/supported-formats/image-formats/). If \`null\` (default), then the input image's format will be used as the output format. diff --git a/packages/node/src/alphalib/types/robots/meta-read.ts b/packages/node/src/alphalib/types/robots/meta-read.ts index 06545ecc..8a7525cc 100644 --- a/packages/node/src/alphalib/types/robots/meta-read.ts +++ b/packages/node/src/alphalib/types/robots/meta-read.ts @@ -2,9 +2,11 @@ import { z } from 'zod' import type { RobotMetaInput } from './_instructions-primitives.ts' import { interpolateRobot, robotBase } from './_instructions-primitives.ts' -// @ts-expect-error - MetaReadRobot is not ready yet @TODO please supply missing keys export const meta: RobotMetaInput = { - name: 'MetaReadRobot', + // api2 tracks /meta/read as a special 1% metadata fee while keeping runtime priceFactor at 0. + bytescount: 100, + discount_factor: 0.01, + discount_pct: 99, example_code: { steps: { metadata: { @@ -13,6 +15,19 @@ export const meta: RobotMetaInput = { }, }, example_code_description: 'Read metadata from uploaded files:', + minimum_charge: 0, + output_factor: 1, + override_lvl1: 'Media Cataloging', + purpose_sentence: 'reads metadata from uploaded files', + purpose_verb: 'read', + purpose_word: 'metadata', + purpose_words: 'Read file metadata', + service_slug: 'media-cataloging', + slot_count: 15, + title: 'Read file metadata', + typical_file_size_mb: 1.2, + typical_file_type: 'file', + name: 'MetaReadRobot', priceFactor: 0, queueSlotCount: 15, isAllowedForUrlTransform: true, diff --git a/packages/node/src/alphalib/types/robots/progress-simulate.ts b/packages/node/src/alphalib/types/robots/progress-simulate.ts index 3a5fa54f..fa855df8 100644 --- a/packages/node/src/alphalib/types/robots/progress-simulate.ts +++ b/packages/node/src/alphalib/types/robots/progress-simulate.ts @@ -3,9 +3,10 @@ import { z } from 'zod' import type { RobotMetaInput } from './_instructions-primitives.ts' import { interpolateRobot, robotBase, robotUse } from './_instructions-primitives.ts' -// @ts-expect-error - ProgressSimulateRobot is not ready yet @TODO please supply missing keys export const meta: RobotMetaInput = { - name: 'ProgressSimulateRobot', + bytescount: 1, + discount_factor: 1, + discount_pct: 0, example_code: { steps: { simulate: { @@ -19,6 +20,19 @@ export const meta: RobotMetaInput = { }, }, example_code_description: 'Simulate Step progress and output generation for testing:', + minimum_charge: 0, + output_factor: 1, + override_lvl1: 'Code Evaluation', + purpose_sentence: 'simulates Step progress and output generation for tests', + purpose_verb: 'run', + purpose_word: 'progress simulation', + purpose_words: 'Simulate Step progress', + service_slug: 'code-evaluation', + slot_count: 20, + title: 'Simulate Step progress', + typical_file_size_mb: 1.2, + typical_file_type: 'file', + name: 'ProgressSimulateRobot', priceFactor: 1, queueSlotCount: 20, isAllowedForUrlTransform: false, diff --git a/packages/node/src/alphalib/types/robots/tlcdn-deliver.ts b/packages/node/src/alphalib/types/robots/tlcdn-deliver.ts index 489d82fb..28314cb2 100644 --- a/packages/node/src/alphalib/types/robots/tlcdn-deliver.ts +++ b/packages/node/src/alphalib/types/robots/tlcdn-deliver.ts @@ -3,9 +3,9 @@ import type { RobotMetaInput } from './_instructions-primitives.ts' import { interpolateRobot, robotBase } from './_instructions-primitives.ts' export const meta: RobotMetaInput = { - bytescount: 20, - discount_factor: 0.05, - discount_pct: 95, + bytescount: 25, + discount_factor: 0.04, + discount_pct: 96, example_code: { steps: { deliver: { @@ -27,7 +27,8 @@ export const meta: RobotMetaInput = { typical_file_size_mb: 1.2, typical_file_type: 'file', name: 'TlcdnDeliverRobot', - priceFactor: 20, + // Baseline factor for non-HIPAA delivery; HIPAA delivery uses a 20% lower factor. + priceFactor: 25, queueSlotCount: 0, minimumCharge: 102400, downloadInputFiles: false, @@ -42,8 +43,15 @@ export const meta: RobotMetaInput = { export const robotTlcdnDeliverInstructionsSchema = robotBase .extend({ robot: z.literal('/tlcdn/deliver').describe(` -When you want Transloadit to tranform files on the fly, this Robot can cache and deliver the results close to your end-user, saving on latency and encoding volume. The use of this Robot is implicit when you use the tlcdn.com domain. +When you want Transloadit to transform files on the fly, this Robot can cache and deliver the results close to your end-user, saving on latency and encoding volume. The use of this Robot is implicit when you use the tlcdn.com domain. `), + enable_hipaa_compliance: z + .boolean() + .optional() + .default(false) + .describe( + 'When enabled, use the HIPAA-compliant Smart CDN pricing profile for this delivery step (20% lower price factor). When disabled, the non-HIPAA baseline price factor applies.', + ), }) .strict() diff --git a/packages/node/src/alphalib/types/template.ts b/packages/node/src/alphalib/types/template.ts index 90f14b1b..9b466f19 100644 --- a/packages/node/src/alphalib/types/template.ts +++ b/packages/node/src/alphalib/types/template.ts @@ -137,12 +137,12 @@ The \`referer\` property is a regular expression to match against the HTTP refer Uploads without a referer will always pass (as they are turned off for some browsers) making this useful in just a handful of use cases. For details about regular expressions, see [Mozilla's RegExp documentation](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/RegExp). The \`max_size\` property can be used to set a maximum size that an upload can have in bytes, such as \`1048576\` (1 MB). Specify this to prevent users from uploading excessively large files. - -This can be set as part of the Assembly request or as part of the Template. - The file size is checked as soon as the upload is started and if it exceeds the maximum size, the entire upload process is canceled and the Assembly will error out, even if it contains files that do not exceed the \`max_size\` limitation. - If you want to just ignore the files that exceed a certain size, but process all others, then please use [🤖/file/filter](https://transloadit.com/docs/robots/file-filter/). + +The \`max_number_of_files\` property can be used to set a maximum number of files that an upload can have, such as \`100\`. Specify this to prevent users from uploading excessively many files, both via file uploads and via import Robots. + +These properties can be set as part of the Assembly request or as part of the Template. `) const assemblyInstructionsSharedShape = { diff --git a/packages/zod/scripts/sync-v4.ts b/packages/zod/scripts/sync-v4.ts index d85e9955..fa2569ad 100644 --- a/packages/zod/scripts/sync-v4.ts +++ b/packages/zod/scripts/sync-v4.ts @@ -321,7 +321,17 @@ const patchInterpolatableRobot = (contents: string): string => { ' ),\n' + ' )\n' + ' .strict() as InterpolatableRobot\n' + - '}\n\n' + '}\n\n' + + 'const robotInterpolateBooleanSchema = z\n' + + ' .union([z.boolean(), booleanStringSchema])\n' + + " .transform((value) => value === true || value === 'true')\n\n" + + 'export const robotInterpolateSchema = z\n' + + ' .union([robotInterpolateBooleanSchema, z.record(z.string(), robotInterpolateBooleanSchema)])\n' + + ' .describe(`\n' + + 'Controls whether Assembly Variables are interpolated for individual instruction fields.\n\n' + + 'By default, most Robot instruction fields interpolate Assembly Variables. Set this to \\`false\\` to treat every instruction field as literal text, or set an individual field path to \\`false\\` to treat only that field as literal text. For Robot-specific fields that are literal by default, set this to \\`true\\` or set that field path to \\`true\\` to opt back into interpolation.\n\n' + + 'Use field names such as \\`path\\`, or dotted paths such as \\`ffmpeg.vf\\` for nested objects.\n' + + '`)\n\n' return `${contents.slice(0, start)}${replacement}${contents.slice(end)}` }