@pixerate/editor 0.134.0 → 0.136.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation-editor/index.cjs +58 -55
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +8 -5
- package/dist/animation-editor/index.d.ts +8 -5
- package/dist/animation-editor/index.js +5 -2
- package/dist/animation-editor/index.js.map +1 -1
- package/dist/{bezier-J8i4uqSH.d.cts → bezier-CdccFsF8.d.cts} +1 -1
- package/dist/{bezier-lNEOp0Jx.d.ts → bezier-DG9qNZQV.d.ts} +1 -1
- package/dist/canvas/index.d.cts +10 -7
- package/dist/canvas/index.d.ts +10 -7
- package/dist/{chunk-Z2H7KECK.cjs → chunk-2R3UW57U.cjs} +13 -2
- package/dist/chunk-2R3UW57U.cjs.map +1 -0
- package/dist/{chunk-ESIWZMMK.js → chunk-6QQR4LKE.js} +2 -2
- package/dist/chunk-A3BVTI3G.js +150 -0
- package/dist/chunk-A3BVTI3G.js.map +1 -0
- package/dist/{chunk-T6TV6HY6.cjs → chunk-B2CUCM7Y.cjs} +36 -36
- package/dist/{chunk-T6TV6HY6.cjs.map → chunk-B2CUCM7Y.cjs.map} +1 -1
- package/dist/chunk-ECCXGELC.cjs +727 -0
- package/dist/chunk-ECCXGELC.cjs.map +1 -0
- package/dist/{chunk-OXSV64JX.js → chunk-G6IKY6PL.js} +4 -4
- package/dist/chunk-I52DRGGJ.js +727 -0
- package/dist/chunk-I52DRGGJ.js.map +1 -0
- package/dist/{chunk-6CTZAGZ2.js → chunk-ILYFOJUN.js} +56 -1
- package/dist/chunk-ILYFOJUN.js.map +1 -0
- package/dist/{chunk-YAFS2QFZ.cjs → chunk-JLGNZMUV.cjs} +82 -82
- package/dist/{chunk-YAFS2QFZ.cjs.map → chunk-JLGNZMUV.cjs.map} +1 -1
- package/dist/{chunk-7RJ6P7MI.js → chunk-KZXLZCQ7.js} +2 -2
- package/dist/{chunk-HHTCDFZC.js → chunk-MAHQC3SK.js} +13 -2
- package/dist/chunk-MAHQC3SK.js.map +1 -0
- package/dist/{chunk-FWEO3HSL.js → chunk-PQQF5KOW.js} +8 -8
- package/dist/chunk-Q6OUXEK3.cjs +150 -0
- package/dist/chunk-Q6OUXEK3.cjs.map +1 -0
- package/dist/{chunk-P3RQ5UJE.cjs → chunk-UTQKC66X.cjs} +4 -4
- package/dist/{chunk-P3RQ5UJE.cjs.map → chunk-UTQKC66X.cjs.map} +1 -1
- package/dist/{chunk-J3B45HTA.cjs → chunk-XB25WOC2.cjs} +6 -6
- package/dist/{chunk-J3B45HTA.cjs.map → chunk-XB25WOC2.cjs.map} +1 -1
- package/dist/{chunk-NVTHUPJ6.cjs → chunk-YT3JL7YM.cjs} +71 -16
- package/dist/chunk-YT3JL7YM.cjs.map +1 -0
- package/dist/effects/index.d.cts +7 -4
- package/dist/effects/index.d.ts +7 -4
- package/dist/{export-BGdT02aL.d.cts → export-BOheWw2R.d.cts} +13 -5
- package/dist/{export-Dng22YB8.d.ts → export-ByKKIA2S.d.ts} +13 -5
- package/dist/{export-KzubBKo7.d.cts → export-CEYeRQXH.d.cts} +1 -1
- package/dist/{export-DMeG6E06.d.ts → export-Ds7zgGD8.d.ts} +1 -1
- package/dist/extensions/index.cjs +3 -3
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/generation/index.cjs +150 -945
- package/dist/generation/index.cjs.map +1 -1
- package/dist/generation/index.d.cts +3 -423
- package/dist/generation/index.d.ts +3 -423
- package/dist/generation/index.js +59 -854
- package/dist/generation/index.js.map +1 -1
- package/dist/grammar/index.cjs +3 -3
- package/dist/grammar/index.cjs.map +1 -1
- package/dist/grammar/index.js +2 -2
- package/dist/{helpers-Coa4e2j_.d.ts → helpers--ns3W2D7.d.ts} +7 -1
- package/dist/{helpers-DHl28yLO.d.cts → helpers-BVkU4oUi.d.cts} +7 -1
- package/dist/image-editor/index.cjs +742 -647
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +29 -11
- package/dist/image-editor/index.d.ts +29 -11
- package/dist/image-editor/index.js +107 -12
- package/dist/image-editor/index.js.map +1 -1
- package/dist/index.cjs +28 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +36 -36
- package/dist/{opentype-Dfcx6wFx.d.ts → opentype-DfoVYgmG.d.ts} +1 -1
- package/dist/{opentype-BWR7Qv8W.d.cts → opentype-yi-Kz4ND.d.cts} +1 -1
- package/dist/paint/index.cjs +10 -2
- package/dist/paint/index.cjs.map +1 -1
- package/dist/paint/index.d.cts +2 -2
- package/dist/paint/index.d.ts +2 -2
- package/dist/paint/index.js +9 -1
- package/dist/paint-editor/index.cjs +10 -7
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +10 -7
- package/dist/paint-editor/index.d.ts +10 -7
- package/dist/paint-editor/index.js +5 -2
- package/dist/paint-editor/index.js.map +1 -1
- package/dist/{pathfinder-D8KQ6blQ.d.cts → pathfinder-7JkMwYvC.d.cts} +1 -1
- package/dist/{pathfinder-Celbi3e6.d.ts → pathfinder-GM3UWdBZ.d.ts} +1 -1
- package/dist/{pool-BfuxBKTd.d.cts → pool-04qp8iW4.d.cts} +1 -1
- package/dist/{pool-8JZGWHvR.d.ts → pool-CkTxlLMC.d.ts} +1 -1
- package/dist/provenance-DmlcgdzT.d.cts +426 -0
- package/dist/provenance-uh5r2TQ8.d.ts +426 -0
- package/dist/{rand-BaqEOs1Y.d.ts → rand-BszBST4s.d.ts} +31 -1
- package/dist/{rand-DdpFzCo6.d.cts → rand-DOH_aMvm.d.cts} +31 -1
- package/dist/{svg-pwXWq6s2.d.cts → svg-BDDKvWWY.d.cts} +2 -2
- package/dist/{svg-CxxqG3_W.d.ts → svg-rV6_HPmn.d.ts} +2 -2
- package/dist/{tools-3EBjR91b.d.cts → tools-BAjSbTdY.d.cts} +1 -1
- package/dist/{tools-y1M6O3UT.d.ts → tools-DPYerqeR.d.ts} +1 -1
- package/dist/vector/index.cjs +2684 -1860
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +313 -71
- package/dist/vector/index.d.ts +313 -71
- package/dist/vector/index.js +4700 -3876
- package/dist/vector/index.js.map +1 -1
- package/dist/video-editor/index.d.cts +7 -4
- package/dist/video-editor/index.d.ts +7 -4
- package/dist/{warp-Ceqdz7kj.d.cts → warp-DQh9R7Ie.d.cts} +1 -1
- package/dist/{warp-C1gwu2G_.d.ts → warp-XVL6SpSh.d.ts} +1 -1
- package/package.json +1 -1
- package/skills/pixerate-image-editor/SKILL.md +4 -4
- package/skills/pixerate-vector/SKILL.md +20 -1
- package/dist/chunk-6CTZAGZ2.js.map +0 -1
- package/dist/chunk-HHTCDFZC.js.map +0 -1
- package/dist/chunk-NVTHUPJ6.cjs.map +0 -1
- package/dist/chunk-Z2H7KECK.cjs.map +0 -1
- /package/dist/{chunk-ESIWZMMK.js.map → chunk-6QQR4LKE.js.map} +0 -0
- /package/dist/{chunk-OXSV64JX.js.map → chunk-G6IKY6PL.js.map} +0 -0
- /package/dist/{chunk-7RJ6P7MI.js.map → chunk-KZXLZCQ7.js.map} +0 -0
- /package/dist/{chunk-FWEO3HSL.js.map → chunk-PQQF5KOW.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-ECCXGELC.cjs","../src/generation/capabilities.ts","../src/generation/plan.ts","../src/generation/hash.ts"],"names":[],"mappings":"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AAA;AACD,QAAA;AACD,MAAA;AACD,IAAA;AACI,IAAA;AACC,IAAA;AACN,EAAA;AAEY,EAAA;AACX,IAAA;AACA,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AAAyE,MAAA;AAExE,QAAA;AACA,QAAA;AACD,MAAA;AACD,IAAA;AAEI,IAAA;AACH,MAAA;AACD,IAAA;AACA,IAAA;AAGA,IAAA;AACI,IAAA;AACH,MAAA;AACD,IAAA;AACA,IAAA;AACA,IAAA;AAIK,IAAA;AACL,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AACC,QAAA;AACA,QAAA;AACD,MAAA;AACA,MAAA;AACD,IAAA;AAEK,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACN,EAAA;AACD;AAYgB;AAKT,EAAA;AACA,EAAA;AACN,EAAA;AACO,EAAA;AACF,IAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AACD;AF5DS;AACA;AG3oBO;AACX,EAAA;AACA,EAAA;AACH,IAAA;AAIA,IAAA;AACD,EAAA;AACO,EAAA;AACR;AAEM;AAQU;AACX,EAAA;AACA,EAAA;AACJ,EAAA;AACC,IAAA;AACI,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACC,IAAA;AACN,EAAA;AAEK,EAAA;AACD,EAAA;AACC,EAAA;AACA,EAAA;AACD,EAAA;AACC,EAAA;AACC,EAAA;AACC,EAAA;AACR;AAGgB;AACR,EAAA;AACR;AAEM;AAOU;AACT,EAAA;AACN,EAAA;AACM,IAAA;AACN,EAAA;AACO,EAAA;AACR;AHwnBS;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-ECCXGELC.cjs","sourcesContent":[null,"/**\n * Declarative descriptions of generative models (what a model accepts) and of\n * the requests sent to them. Everything here is plain data so capabilities can\n * come from a server, be merged with local presentation overlays, and be\n * turned into JSON Schema for agents.\n */\n\nexport type GenerationMediaKind = 'image' | 'video' | 'audio' | 'text';\n\n/** The reference roles this library knows by name (labels, aliases, schema order). */\nexport type BuiltinReferenceRole =\n\t| 'start_frame'\n\t| 'end_frame'\n\t| 'style_ref'\n\t| 'character_ref'\n\t| 'background_ref'\n\t| 'mask'\n\t| 'image_ref'\n\t| 'video_ref'\n\t| 'audio_ref';\n\n/**\n * What a reference input (an asset) is used for. The built-in roles are\n * listed in {@link REFERENCE_ROLES}; models may declare any other role name\n * (e.g. `subject`, `pose`) in `references.roles`, which makes it valid for\n * that model. Role names match {@link REFERENCE_ROLE_NAME_REGEX}.\n */\nexport type ReferenceRole = BuiltinReferenceRole | (string & {});\n\n/** Valid role names: a letter, then letters, digits, `_` or `-`, not ending in `_` or `-`. */\nexport const REFERENCE_ROLE_NAME_REGEX = /^[A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$/;\n\n/** True for a string usable as a role name. */\nexport function isReferenceRoleName(value: unknown): value is ReferenceRole {\n\treturn typeof value === 'string' && value.length <= 64 && REFERENCE_ROLE_NAME_REGEX.test(value);\n}\n\n/** Every built-in reference role, in a stable display order. */\nexport const REFERENCE_ROLES: readonly BuiltinReferenceRole[] = [\n\t'start_frame',\n\t'end_frame',\n\t'style_ref',\n\t'character_ref',\n\t'background_ref',\n\t'mask',\n\t'image_ref',\n\t'video_ref',\n\t'audio_ref'\n];\n\n/** Human-readable default labels for reference roles. */\nexport const REFERENCE_ROLE_LABELS: Readonly<Record<BuiltinReferenceRole, string>> = {\n\tstart_frame: 'Start frame',\n\tend_frame: 'End frame',\n\tstyle_ref: 'Style reference',\n\tcharacter_ref: 'Character reference',\n\tbackground_ref: 'Background reference',\n\tmask: 'Mask',\n\timage_ref: 'Image reference',\n\tvideo_ref: 'Video reference',\n\taudio_ref: 'Audio reference'\n};\n\n/**\n * Friendly role names accepted wherever a role is written by hand (asset\n * mentions such as `@fox:style`, agent calls). A model that declares the\n * alias itself (e.g. its own `style` role) keeps it; otherwise the alias maps\n * to the built-in role. Keys are lower case.\n */\nexport const REFERENCE_ROLE_ALIASES: Readonly<Record<string, BuiltinReferenceRole>> = {\n\treference: 'image_ref',\n\timage: 'image_ref',\n\tstyle: 'style_ref',\n\tcharacter: 'character_ref',\n\tbackground: 'background_ref',\n\t'start-frame': 'start_frame',\n\t'first-frame': 'start_frame',\n\tfirst_frame: 'start_frame',\n\t'end-frame': 'end_frame',\n\t'last-frame': 'end_frame',\n\tlast_frame: 'end_frame',\n\t'style-ref': 'style_ref',\n\t'character-ref': 'character_ref',\n\t'background-ref': 'background_ref',\n\t'image-ref': 'image_ref',\n\t'video-ref': 'video_ref',\n\t'audio-ref': 'audio_ref',\n\tvideo: 'video_ref',\n\taudio: 'audio_ref'\n};\n\nconst isBuiltinRole = (role: string): role is BuiltinReferenceRole =>\n\t(REFERENCE_ROLES as readonly string[]).includes(role);\n\n/** Display label of a role: the model's label, the built-in label, or the name made readable. */\nexport function referenceRoleLabel(role: ReferenceRole, caps?: ModelCapabilities): string {\n\tconst declared = caps?.references?.roles[role]?.label;\n\tif (declared) return declared;\n\tif (isBuiltinRole(role)) return REFERENCE_ROLE_LABELS[role];\n\tconst words = String(role).replace(/[_-]+/g, ' ').trim();\n\treturn words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Canonical role for a hand-written name: the name itself when the model\n * declares it (or, without a model, when it is built in), else its alias\n * ({@link REFERENCE_ROLE_ALIASES}, case-insensitive), else the trimmed name.\n */\nexport function normalizeReferenceRole(role: string, caps?: ModelCapabilities): ReferenceRole {\n\tconst name = String(role).trim();\n\tif (caps ? !!caps.references?.roles[name] : isBuiltinRole(name)) return name;\n\tconst lower = name.toLowerCase();\n\tif (caps?.references?.roles[lower]) return lower;\n\tif (!caps && isBuiltinRole(lower)) return lower;\n\treturn REFERENCE_ROLE_ALIASES[lower] ?? (isBuiltinRole(lower) ? lower : name);\n}\n\n/**\n * Whether `mediaType` (a MIME type such as `image/png`, or a media kind such\n * as `image`) matches one of `accepts` (`image`, `image/*`, `image/png`).\n * An empty or missing `accepts` accepts everything; an unknown media type\n * only matches a missing `accepts`.\n */\nexport function mediaTypeMatches(mediaType: string | undefined, accepts: readonly string[] | undefined): boolean {\n\tif (!accepts || accepts.length === 0) return true;\n\tif (!mediaType) return false;\n\tconst type = mediaType.split(';')[0].trim().toLowerCase();\n\tconst kind = type.split('/')[0];\n\treturn accepts.some((entry) => {\n\t\tconst pattern = entry.trim().toLowerCase();\n\t\tif (pattern === '*' || pattern === '*/*' || pattern === type) return true;\n\t\tif (!pattern.includes('/')) return pattern === kind;\n\t\tif (pattern.endsWith('/*')) return pattern.slice(0, -2) === kind;\n\t\treturn false;\n\t});\n}\n\n/** A choice from a fixed list. `options` order matters (low → high where it applies). */\nexport interface EnumCapability<T extends string | number = string> {\n\toptions: readonly T[];\n\tdefault?: T;\n\t/** Display labels by option value. */\n\tlabels?: Readonly<Record<string, string>>;\n}\n\nexport interface TextFieldCapability {\n\tmaxLength?: number;\n}\n\nexport interface PromptCapability extends TextFieldCapability {\n\t/**\n\t * Count the resolved prompt (templates expanded, variables substituted)\n\t * against `maxLength` rather than the raw template text. Default `true`.\n\t * Pass the resolved text to the planner as `resolvedPrompt`.\n\t */\n\tcountResolved?: boolean;\n\t/** The prompt must be non-empty. */\n\trequired?: boolean;\n}\n\nexport interface CountCapability {\n\t/** Largest number of outputs per request. */\n\tmax: number;\n\t/** Predefined choices; when given, requests snap to one of them. */\n\toptions?: readonly number[];\n\tdefault?: number;\n}\n\nexport interface DurationCapability {\n\t/** Seconds. */\n\tmin?: number;\n\tmax?: number;\n\t/** Predefined choices; when given, requests snap to one of them. */\n\toptions?: readonly number[];\n\tdefault?: number;\n\tstep?: number;\n}\n\nexport interface SeedCapability {\n\tmin?: number;\n\tmax?: number;\n}\n\nexport interface ReferenceRoleCapability {\n\t/** Most references of this role. */\n\tmax: number;\n\t/** Fewest references of this role (e.g. an image-to-video model needs a `start_frame`). */\n\tmin?: number;\n\tlabel?: string;\n\tdescription?: string;\n\t/**\n\t * Media accepted for this role: kinds (`image`), wildcards (`image/*`) or\n\t * MIME types (`image/png`). Absent: anything. References whose\n\t * `mediaType` does not match are dropped or rejected by the planner.\n\t */\n\taccepts?: readonly string[];\n}\n\nexport interface ReferenceCapability {\n\t/** Supported roles and their per-role limits. Roles not listed are unsupported. */\n\troles: Partial<Readonly<Record<ReferenceRole, ReferenceRoleCapability>>>;\n\t/** Most references across all roles. */\n\tmaxTotal?: number;\n}\n\nexport interface NumberParamSpec {\n\ttype: 'number' | 'integer';\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tdefault?: number;\n\tlabel?: string;\n\tdescription?: string;\n}\n\nexport interface EnumParamSpec {\n\ttype: 'enum';\n\toptions: readonly (string | number)[];\n\tdefault?: string | number;\n\tlabel?: string;\n\tdescription?: string;\n}\n\nexport interface BooleanParamSpec {\n\ttype: 'boolean';\n\tdefault?: boolean;\n\tlabel?: string;\n\tdescription?: string;\n}\n\n/** A model-specific parameter (`guidance`, `motion_strength`, `style`, …). */\nexport type ExtraParamSpec = NumberParamSpec | EnumParamSpec | BooleanParamSpec;\n\n/** Rough timing used for progress estimates (`expectedDurationFor`). */\nexport interface TimingCapability {\n\t/** Fixed cost of one request in ms. */\n\tbaseMs: number;\n\t/** Extra ms per output beyond the first. */\n\tperItemMs?: number;\n\t/** Extra ms per second of requested duration (video/audio). */\n\tperSecondMs?: number;\n\t/** Extra ms per megapixel of the requested resolution. */\n\tperMegapixelMs?: number;\n}\n\n/** Presentation-only fields; overlays may set these (see `mergeCapabilities`). */\nexport interface CapabilityPresentation {\n\tname?: string;\n\tdescription?: string;\n\tbadges?: readonly string[];\n\ticon?: string;\n\tgroup?: string;\n}\n\n/** Everything a generative model accepts. Absent sections mean \"unsupported\". */\nexport interface ModelCapabilities extends CapabilityPresentation {\n\tid: string;\n\tmedia: GenerationMediaKind;\n\tprompt?: PromptCapability;\n\t/** Negative prompt support (`true` or limits). */\n\tnegativePrompt?: boolean | TextFieldCapability;\n\t/** System prompt support (`true` or limits). */\n\tsystemPrompt?: boolean | TextFieldCapability;\n\t/** E.g. `['1:1', '16:9', '9:16']`. */\n\taspectRatios?: EnumCapability<string>;\n\t/** E.g. `['512x512', '1024x1024']`, `['720p', '1080p']` or `['1k', '2k', '4k']`, low → high. */\n\tresolutions?: EnumCapability<string>;\n\t/** Ordered low → high, e.g. `['draft', 'standard', 'high']`. */\n\tquality?: EnumCapability<string>;\n\tcount?: CountCapability;\n\tduration?: DurationCapability;\n\tseed?: boolean | SeedCapability;\n\treferences?: ReferenceCapability;\n\t/** Accepts a source to edit (`mode: 'edit'`). */\n\tediting?: boolean;\n\t/** Accepts a source plus a `mask` reference (`mode: 'inpaint'`). */\n\tinpainting?: boolean;\n\tparams?: Readonly<Record<string, ExtraParamSpec>>;\n\ttiming?: TimingCapability;\n}\n\nexport interface GenerationReference {\n\t/** Asset id (opaque to this library). */\n\tid: string;\n\trole: ReferenceRole;\n\turl?: string;\n\t/** MIME type or media kind, checked against the role's `accepts`. */\n\tmediaType?: string;\n\t/** Content hash of the asset when it was referenced (used by generation records). */\n\tcontentHash?: string;\n}\n\nexport type GenerationMode = 'generate' | 'edit' | 'inpaint';\n\nexport type GenerationParamValue = string | number | boolean;\n\n/** A request for one model. Every field is optional; the planner fills and fixes. */\nexport interface GenerationRequest {\n\tmodel?: string;\n\tprompt?: string;\n\tnegativePrompt?: string;\n\tsystemPrompt?: string;\n\taspectRatio?: string;\n\tresolution?: string;\n\tquality?: string;\n\tcount?: number;\n\t/** Seconds. */\n\tduration?: number;\n\tseed?: number;\n\tmode?: GenerationMode;\n\treferences?: GenerationReference[];\n\tparams?: Record<string, GenerationParamValue>;\n}\n\n/** Fields of {@link GenerationRequest} the planner knows about, in planning order. */\nexport const GENERATION_REQUEST_FIELDS = [\n\t'model',\n\t'prompt',\n\t'negativePrompt',\n\t'systemPrompt',\n\t'aspectRatio',\n\t'resolution',\n\t'quality',\n\t'count',\n\t'duration',\n\t'seed',\n\t'mode',\n\t'references',\n\t'params'\n] as const;\n\n/** Text field limits normalized from `boolean | TextFieldCapability`. */\nexport function textFieldCapability(value: boolean | TextFieldCapability | undefined): TextFieldCapability | null {\n\tif (!value) return null;\n\treturn value === true ? {} : value;\n}\n\n/** Seed limits normalized from `boolean | SeedCapability`. */\nexport function seedCapability(value: boolean | SeedCapability | undefined): SeedCapability | null {\n\tif (!value) return null;\n\treturn value === true ? {} : value;\n}\n\n/**\n * Supported reference roles of a model: built-in roles in\n * {@link REFERENCE_ROLES} order, then custom roles in declaration order.\n */\nexport function supportedReferenceRoles(caps: ModelCapabilities): ReferenceRole[] {\n\tconst roles = caps.references?.roles ?? {};\n\tconst builtin: ReferenceRole[] = REFERENCE_ROLES.filter((role) => (roles[role]?.max ?? 0) > 0);\n\tconst custom = Object.keys(roles).filter(\n\t\t(role) => !isBuiltinRole(role) && isReferenceRoleName(role) && (roles[role]?.max ?? 0) > 0\n\t);\n\treturn [...builtin, ...custom];\n}\n\n/** Supported generation modes of a model. */\nexport function supportedModes(caps: ModelCapabilities): GenerationMode[] {\n\tconst modes: GenerationMode[] = ['generate'];\n\tif (caps.editing) modes.push('edit');\n\tif (caps.inpainting) modes.push('inpaint');\n\treturn modes;\n}\n\nconst PRESENTATION_KEYS = ['name', 'description', 'badges', 'icon', 'group'] as const;\n\n/** A partial model entry used to decorate (or add) models locally. */\nexport type CapabilityOverlay = Partial<ModelCapabilities> & { id: string };\n\n/**\n * Merges server-reported capabilities with a local overlay. For models the\n * server knows, every capability value comes from `remote`; the overlay only\n * contributes presentation fields (`name`, `description`, `badges`, `icon`,\n * `group`), filling in or replacing the remote ones. Overlay entries for\n * models the server does not report are appended when they are complete\n * (have a `media` kind). Remote order is kept; overlay-only models follow in\n * overlay order.\n */\nexport function mergeCapabilities(\n\tremote: readonly ModelCapabilities[],\n\toverlay: readonly CapabilityOverlay[] = []\n): ModelCapabilities[] {\n\tconst overlayById = new Map(overlay.map((entry) => [entry.id, entry]));\n\tconst remoteIds = new Set(remote.map((model) => model.id));\n\tconst merged = remote.map((model) => {\n\t\tconst extra = overlayById.get(model.id);\n\t\tif (!extra) return { ...model };\n\t\tconst next: ModelCapabilities = { ...model };\n\t\tfor (const key of PRESENTATION_KEYS) {\n\t\t\tif (extra[key] !== undefined) (next as any)[key] = extra[key];\n\t\t}\n\t\treturn next;\n\t});\n\tfor (const entry of overlay) {\n\t\tif (remoteIds.has(entry.id) || !entry.media) continue;\n\t\tremoteIds.add(entry.id);\n\t\tmerged.push({ ...(entry as ModelCapabilities) });\n\t}\n\treturn merged;\n}\n","import {\n\tGENERATION_REQUEST_FIELDS,\n\tREFERENCE_ROLES,\n\tisReferenceRoleName,\n\tmediaTypeMatches,\n\tnormalizeReferenceRole,\n\tseedCapability,\n\tsupportedReferenceRoles,\n\tsupportedModes,\n\ttextFieldCapability,\n\ttype EnumCapability,\n\ttype ExtraParamSpec,\n\ttype GenerationParamValue,\n\ttype GenerationReference,\n\ttype GenerationRequest,\n\ttype ModelCapabilities,\n\ttype ReferenceRole,\n\ttype ReferenceRoleCapability\n} from './capabilities.js';\n\n/**\n * How the planner treats values the model does not support:\n *\n * - `error`: nothing is changed; every mismatch is an error.\n * - `nearest`: snap to the closest supported value (ties go to the higher\n * value), clamp ranges, truncate lists, drop unsupported fields and\n * unsupported references.\n * - `downgrade`: like `nearest`, but ties go to the lower value.\n * - `upgrade`: like `nearest`, but never drops references the model cannot\n * use (that would lose intent), so those are errors.\n *\n * \"Lower\" means a narrower aspect ratio, fewer pixels, an earlier quality\n * option, a smaller number.\n */\nexport type PlanStrategy = 'error' | 'upgrade' | 'downgrade' | 'nearest';\n\nexport type PlanAdjustmentKind = 'snapped' | 'clamped' | 'truncated' | 'dropped' | 'defaulted';\n\nexport interface PlanAdjustment {\n\t/** Request path, e.g. `aspectRatio`, `params.guidance`, `references.style_ref`. */\n\tfield: string;\n\tfrom: unknown;\n\tto: unknown;\n\treason: string;\n\tkind: PlanAdjustmentKind;\n}\n\nexport interface PlanError {\n\tfield: string;\n\tvalue: unknown;\n\tmessage: string;\n}\n\nexport interface GenerationPlan {\n\t/** `true` when there are no errors and `request` can be sent. */\n\tok: boolean;\n\t/** The adjusted request (always a copy; the input is never mutated). */\n\trequest: GenerationRequest;\n\tadjustments: PlanAdjustment[];\n\terrors: PlanError[];\n\t/** Model the plan was made for. */\n\tmodel: string;\n\tstrategy: PlanStrategy;\n}\n\nexport interface PlanOptions {\n\t/** Default `nearest`. */\n\tstrategy?: PlanStrategy;\n\t/**\n\t * The prompt with templates and variables resolved. Measured against\n\t * `prompt.maxLength` when the model counts resolved text (the default).\n\t */\n\tresolvedPrompt?: string;\n\t/** Fill missing fields that have a capability `default` (reported as `defaulted`). */\n\tfillDefaults?: boolean;\n\t/** Override whether references with unsupported roles may be dropped (default: `nearest` and `downgrade` only). */\n\tdropUnsupportedReferences?: boolean;\n\t/**\n\t * Assets mentioned in the prompt (e.g. from `extractMentions(text, { details: true, roles: true })`\n\t * joined with your asset library). They are appended to `request.references`\n\t * and validated per role like any other reference. A mention without a role\n\t * gets `defaultMentionRole`, or the first role of the model that accepts its\n\t * media type (reported as `defaulted`).\n\t */\n\tmentions?: readonly PlanAssetMention[];\n\t/** Role for mentions that have none (see `mentions`). */\n\tdefaultMentionRole?: ReferenceRole;\n}\n\n/** An asset mention handed to the planner (see {@link PlanOptions.mentions}). */\nexport interface PlanAssetMention {\n\t/** Asset id. */\n\tid: string;\n\trole?: ReferenceRole | null;\n\tmediaType?: string;\n\tcontentHash?: string;\n\turl?: string;\n\t/** The mention text, used in messages (default: the id). */\n\tlabel?: string;\n}\n\nconst EPSILON = 1e-9;\n\n/** Numeric rank of an aspect ratio such as `16:9` (log of width / height). */\nexport function aspectRatioRank(value: string): number | undefined {\n\tconst match = /^\\s*(\\d+(?:\\.\\d+)?)\\s*[:x/×]\\s*(\\d+(?:\\.\\d+)?)\\s*$/i.exec(String(value));\n\tif (!match) return undefined;\n\tconst w = Number(match[1]);\n\tconst h = Number(match[2]);\n\tif (!(w > 0) || !(h > 0)) return undefined;\n\treturn Math.log(w / h);\n}\n\n/**\n * Numeric rank of a resolution: `1024x768` (pixels), `720p` (16:9 pixels at\n * that height) or `2k` (square of that many kibi-pixels). Log scale.\n */\nexport function resolutionRank(value: string): number | undefined {\n\tconst text = String(value).trim().toLowerCase();\n\tlet pixels: number | undefined;\n\tlet match = /^(\\d+(?:\\.\\d+)?)\\s*[x×*]\\s*(\\d+(?:\\.\\d+)?)$/.exec(text);\n\tif (match) pixels = Number(match[1]) * Number(match[2]);\n\telse if ((match = /^(\\d+(?:\\.\\d+)?)p$/.exec(text))) pixels = (Number(match[1]) ** 2 * 16) / 9;\n\telse if ((match = /^(\\d+(?:\\.\\d+)?)k$/.exec(text))) pixels = (Number(match[1]) * 1024) ** 2;\n\treturn pixels && pixels > 0 ? Math.log(pixels) : undefined;\n}\n\n/** Megapixels of a resolution string, when it can be parsed. */\nexport function resolutionMegapixels(value: string): number | undefined {\n\tconst rank = resolutionRank(value);\n\treturn rank === undefined ? undefined : Math.exp(rank) / 1_000_000;\n}\n\n/** Common quality names, low → high. Used to compare values missing from a model's options. */\nexport const QUALITY_LADDER: Readonly<Record<string, number>> = {\n\tdraft: 0,\n\tpreview: 0,\n\tlow: 1,\n\tfast: 1,\n\tturbo: 1,\n\tstandard: 2,\n\tnormal: 2,\n\tmedium: 2,\n\tbalanced: 2,\n\thigh: 3,\n\thd: 3,\n\tquality: 3,\n\tultra: 4,\n\tmax: 5,\n\tbest: 5\n};\n\nexport function qualityRank(value: string): number | undefined {\n\treturn QUALITY_LADDER[String(value).trim().toLowerCase()];\n}\n\nconst numberRank = (value: unknown) => (typeof value === 'number' && Number.isFinite(value) ? value : undefined);\n\n/**\n * Picks the option closest to `value` by `rank`. Ties go to the lower or\n * higher rank. Returns `undefined` when `value` or no option can be ranked.\n */\nexport function snapToOption<T>(\n\tvalue: unknown,\n\toptions: readonly T[],\n\trank: (value: any) => number | undefined,\n\ttie: 'lower' | 'higher'\n): T | undefined {\n\tconst target = rank(value);\n\tif (target === undefined) return undefined;\n\tlet best: { option: T; distance: number; rank: number } | undefined;\n\tfor (const option of options) {\n\t\tconst r = rank(option);\n\t\tif (r === undefined) continue;\n\t\tconst distance = Math.abs(r - target);\n\t\tif (\n\t\t\t!best ||\n\t\t\tdistance < best.distance - EPSILON ||\n\t\t\t(Math.abs(distance - best.distance) <= EPSILON && (tie === 'lower' ? r < best.rank : r > best.rank))\n\t\t) {\n\t\t\tbest = { option, distance, rank: r };\n\t\t}\n\t}\n\treturn best?.option;\n}\n\n/** Truncates to `max` UTF-16 units without splitting a surrogate pair. */\nfunction truncateText(text: string, max: number): string {\n\tif (text.length <= max) return text;\n\tlet end = max;\n\tconst code = text.charCodeAt(end - 1);\n\tif (end > 0 && code >= 0xd800 && code <= 0xdbff) end -= 1;\n\treturn text.slice(0, end);\n}\n\nfunction cloneRequest(request: GenerationRequest): GenerationRequest {\n\tconst copy: GenerationRequest = { ...request };\n\tif (request.references) copy.references = request.references.map((ref) => ({ ...ref }));\n\tif (request.params) copy.params = { ...request.params };\n\treturn copy;\n}\n\nconst describe = (value: unknown) => (typeof value === 'string' ? `\"${value}\"` : JSON.stringify(value));\nconst list = (options: readonly unknown[]) => options.map(describe).join(', ');\n\nclass Planner {\n\treadonly adjustments: PlanAdjustment[] = [];\n\treadonly errors: PlanError[] = [];\n\treadonly tie: 'lower' | 'higher';\n\treadonly strict: boolean;\n\n\tconstructor(\n\t\treadonly caps: ModelCapabilities,\n\t\treadonly request: GenerationRequest,\n\t\treadonly options: PlanOptions,\n\t\treadonly strategy: PlanStrategy\n\t) {\n\t\tthis.tie = strategy === 'downgrade' ? 'lower' : 'higher';\n\t\tthis.strict = strategy === 'error';\n\t}\n\n\tadjust(field: string, from: unknown, to: unknown, kind: PlanAdjustmentKind, reason: string) {\n\t\tthis.adjustments.push({ field, from, to, kind, reason });\n\t}\n\n\terror(field: string, value: unknown, message: string) {\n\t\tthis.errors.push({ field, value, message });\n\t}\n\n\t/** Removes an unsupported field (or reports it under `error`). */\n\tunsupported(field: keyof GenerationRequest, message: string) {\n\t\tconst value = this.request[field];\n\t\tif (this.strict) {\n\t\t\tthis.error(field, value, message);\n\t\t\treturn;\n\t\t}\n\t\tdelete this.request[field];\n\t\tthis.adjust(field, value, undefined, 'dropped', message);\n\t}\n\n\tdefaulted(field: string, value: unknown, set: () => void) {\n\t\tif (!this.options.fillDefaults || value === undefined) return;\n\t\tset();\n\t\tthis.adjust(field, undefined, value, 'defaulted', 'Filled with the model default.');\n\t}\n\n\tplanText(field: 'prompt' | 'negativePrompt' | 'systemPrompt', maxLength: number | undefined, measured?: string) {\n\t\tconst value = this.request[field];\n\t\tif (value === undefined || maxLength === undefined) return;\n\t\tif (typeof value !== 'string') {\n\t\t\tthis.error(field, value, `Expected text.`);\n\t\t\treturn;\n\t\t}\n\t\tconst text = measured ?? value;\n\t\tif (text.length <= maxLength) return;\n\t\tif (this.strict || measured !== undefined) {\n\t\t\tthis.error(\n\t\t\t\tfield,\n\t\t\t\ttext.length,\n\t\t\t\t`${measured !== undefined ? 'Resolved text' : 'Text'} is ${text.length} characters; the model accepts at most ${maxLength}.`\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst next = truncateText(value, maxLength);\n\t\tthis.request[field] = next;\n\t\tthis.adjust(field, value.length, next.length, 'truncated', `Truncated to the model's ${maxLength}-character limit.`);\n\t}\n\n\tplanEnum(\n\t\tfield: 'aspectRatio' | 'resolution' | 'quality',\n\t\tcap: EnumCapability<string> | undefined,\n\t\trank: (value: string) => number | undefined,\n\t\tlabel: string\n\t) {\n\t\tconst value = this.request[field];\n\t\tif (value === undefined) {\n\t\t\tif (cap) this.defaulted(field, cap.default, () => (this.request[field] = cap.default));\n\t\t\treturn;\n\t\t}\n\t\tif (!cap || cap.options.length === 0) {\n\t\t\tthis.unsupported(field, `The model does not take a ${label}.`);\n\t\t\treturn;\n\t\t}\n\t\tif (cap.options.includes(value)) return;\n\t\tif (this.strict) {\n\t\t\tthis.error(field, value, `${describe(value)} is not a supported ${label}; supported: ${list(cap.options)}.`);\n\t\t\treturn;\n\t\t}\n\t\tconst snapped = snapToOption(value, cap.options, rank, this.tie);\n\t\tconst next = snapped ?? cap.default ?? cap.options[0];\n\t\tthis.request[field] = next;\n\t\tthis.adjust(\n\t\t\tfield,\n\t\t\tvalue,\n\t\t\tnext,\n\t\t\t'snapped',\n\t\t\tsnapped !== undefined\n\t\t\t\t? `${describe(value)} is not supported; using the nearest ${label}.`\n\t\t\t\t: `${describe(value)} is not supported; using ${cap.default !== undefined ? 'the default' : 'the first option'}.`\n\t\t);\n\t}\n\n\t/** Clamps/rounds/snaps a number. Returns the next value or `undefined` after an error. */\n\tplanNumber(\n\t\tfield: string,\n\t\tvalue: unknown,\n\t\tspec: { min?: number; max?: number; step?: number; integer?: boolean; options?: readonly number[] },\n\t\tlabel: string\n\t): { value: number; changed: boolean } | undefined {\n\t\tif (typeof value !== 'number' || !Number.isFinite(value)) {\n\t\t\tthis.error(field, value, `Expected a number for ${label}.`);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst options = spec.options?.filter(\n\t\t\t(o) => (spec.min === undefined || o >= spec.min) && (spec.max === undefined || o <= spec.max)\n\t\t);\n\t\tif (options && options.length > 0) {\n\t\t\tif (options.includes(value)) return { value, changed: false };\n\t\t\tif (this.strict) {\n\t\t\t\tthis.error(field, value, `${value} is not a supported ${label}; supported: ${list(options)}.`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst next = snapToOption(value, options, numberRank, this.tie)!;\n\t\t\tthis.adjust(field, value, next, 'snapped', `${value} is not supported; using the nearest ${label}.`);\n\t\t\treturn { value: next, changed: true };\n\t\t}\n\t\tlet next = value;\n\t\tif (spec.step !== undefined && spec.step > 0) {\n\t\t\tconst base = spec.min ?? 0;\n\t\t\tconst steps = (next - base) / spec.step;\n\t\t\tconst rounded = Math.abs(steps - Math.trunc(steps) - 0.5) < EPSILON\n\t\t\t\t? this.tie === 'lower' ? Math.floor(steps) : Math.ceil(steps)\n\t\t\t\t: Math.round(steps);\n\t\t\tnext = Number((base + rounded * spec.step).toPrecision(12));\n\t\t}\n\t\tif (spec.integer && !Number.isInteger(next)) {\n\t\t\tconst frac = next - Math.floor(next);\n\t\t\tnext = Math.abs(frac - 0.5) < EPSILON ? (this.tie === 'lower' ? Math.floor(next) : Math.ceil(next)) : Math.round(next);\n\t\t}\n\t\tlet kind: PlanAdjustmentKind = 'snapped';\n\t\tif (spec.min !== undefined && next < spec.min) {\n\t\t\tnext = spec.min;\n\t\t\tkind = 'clamped';\n\t\t}\n\t\tif (spec.max !== undefined && next > spec.max) {\n\t\t\tnext = spec.max;\n\t\t\tkind = 'clamped';\n\t\t}\n\t\tif (next === value) return { value, changed: false };\n\t\tconst range = `${spec.min ?? '-∞'}–${spec.max ?? '∞'}`;\n\t\tif (this.strict) {\n\t\t\tthis.error(\n\t\t\t\tfield,\n\t\t\t\tvalue,\n\t\t\t\tkind === 'clamped' ? `${label} must be within ${range}.` : `${value} is not a valid ${label} (try ${next}).`\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tthis.adjust(\n\t\t\tfield,\n\t\t\tvalue,\n\t\t\tnext,\n\t\t\tkind,\n\t\t\tkind === 'clamped' ? `Clamped to the supported range ${range}.` : `Rounded to a supported ${label}.`\n\t\t);\n\t\treturn { value: next, changed: true };\n\t}\n\n\tplanCount() {\n\t\tconst value = this.request.count;\n\t\tconst cap = this.caps.count;\n\t\tif (value === undefined) {\n\t\t\tif (cap) this.defaulted('count', cap.default, () => (this.request.count = cap.default));\n\t\t\treturn;\n\t\t}\n\t\tif (!cap) {\n\t\t\tif (value === 1) return;\n\t\t\tthis.unsupported('count', 'The model produces one output per request.');\n\t\t\treturn;\n\t\t}\n\t\tconst result = this.planNumber('count', value, { min: 1, max: cap.max, integer: true, options: cap.options }, 'output count');\n\t\tif (result) this.request.count = result.value;\n\t}\n\n\tplanDuration() {\n\t\tconst value = this.request.duration;\n\t\tconst cap = this.caps.duration;\n\t\tif (value === undefined) {\n\t\t\tif (cap) this.defaulted('duration', cap.default, () => (this.request.duration = cap.default));\n\t\t\treturn;\n\t\t}\n\t\tif (!cap) {\n\t\t\tthis.unsupported('duration', 'The model does not take a duration.');\n\t\t\treturn;\n\t\t}\n\t\tconst result = this.planNumber('duration', value, cap, 'duration');\n\t\tif (result) this.request.duration = result.value;\n\t}\n\n\tplanSeed() {\n\t\tconst value = this.request.seed;\n\t\tif (value === undefined) return;\n\t\tconst cap = seedCapability(this.caps.seed);\n\t\tif (!cap) {\n\t\t\tthis.unsupported('seed', 'The model does not take a seed.');\n\t\t\treturn;\n\t\t}\n\t\tconst result = this.planNumber('seed', value, { ...cap, integer: true }, 'seed');\n\t\tif (result) this.request.seed = result.value;\n\t}\n\n\tplanMode() {\n\t\tconst mode = this.request.mode;\n\t\tif (mode === undefined) return;\n\t\tconst modes = supportedModes(this.caps);\n\t\tif (!modes.includes(mode)) {\n\t\t\tthis.error('mode', mode, `The model does not support ${describe(mode)}; supported: ${list(modes)}.`);\n\t\t}\n\t}\n\n\troleCapability(role: ReferenceRole): ReferenceRoleCapability | undefined {\n\t\tconst cap = this.caps.references?.roles[role];\n\t\tif (cap && cap.max > 0) return cap;\n\t\tif (role === 'mask' && this.caps.inpainting) return { max: 1 };\n\t\treturn undefined;\n\t}\n\n\t/** Turns `options.mentions` into references (appended after the request's own). */\n\taddMentions() {\n\t\tconst mentions = this.options.mentions;\n\t\tif (!mentions?.length) return;\n\t\tconst refs = [...(this.request.references ?? [])];\n\t\tfor (const mention of mentions) {\n\t\t\tif (!mention || typeof mention.id !== 'string' || mention.id === '') continue;\n\t\t\tlet role = mention.role ?? undefined;\n\t\t\tif (!role) {\n\t\t\t\trole = this.options.defaultMentionRole ?? this.inferRole(mention.mediaType);\n\t\t\t\tthis.adjust(\n\t\t\t\t\t`references.${role}`,\n\t\t\t\t\tundefined,\n\t\t\t\t\trole,\n\t\t\t\t\t'defaulted',\n\t\t\t\t\t`@${mention.label ?? mention.id} has no role; using ${role}.`\n\t\t\t\t);\n\t\t\t}\n\t\t\trefs.push({\n\t\t\t\tid: mention.id,\n\t\t\t\trole,\n\t\t\t\t...(mention.url !== undefined ? { url: mention.url } : {}),\n\t\t\t\t...(mention.mediaType !== undefined ? { mediaType: mention.mediaType } : {}),\n\t\t\t\t...(mention.contentHash !== undefined ? { contentHash: mention.contentHash } : {})\n\t\t\t});\n\t\t}\n\t\tthis.request.references = refs;\n\t}\n\n\t/** First role of the model (other than `mask`) whose `accepts` matches `mediaType`. */\n\tinferRole(mediaType: string | undefined): ReferenceRole {\n\t\tfor (const role of supportedReferenceRoles(this.caps)) {\n\t\t\tif (role === 'mask') continue;\n\t\t\tconst cap = this.roleCapability(role);\n\t\t\tif (cap && (mediaType === undefined || mediaTypeMatches(mediaType, cap.accepts))) return role;\n\t\t}\n\t\treturn 'image_ref';\n\t}\n\n\tplanReferences() {\n\t\tconst refs = this.request.references;\n\t\tconst allowDrop =\n\t\t\t!this.strict &&\n\t\t\t(this.options.dropUnsupportedReferences ?? (this.strategy === 'nearest' || this.strategy === 'downgrade'));\n\t\tconst byRole = new Map<ReferenceRole, GenerationReference[]>();\n\t\tconst kept: GenerationReference[] = [];\n\t\tconst unsupported = new Map<string, number>();\n\t\tfor (const [index, original] of (refs ?? []).entries()) {\n\t\t\tlet ref = original;\n\t\t\tif (!ref || typeof ref.id !== 'string' || ref.id === '' || !isReferenceRoleName(ref.role)) {\n\t\t\t\tthis.error(`references.${index}`, ref, 'Each reference needs an `id` and a valid `role`.');\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!this.roleCapability(ref.role)) {\n\t\t\t\tconst alias = normalizeReferenceRole(ref.role, this.caps);\n\t\t\t\tif (alias !== ref.role && this.roleCapability(alias)) {\n\t\t\t\t\tif (this.strict) {\n\t\t\t\t\t\tthis.error(`references.${ref.role}`, ref.role, `The model calls this role ${describe(alias)}.`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthis.adjust(\n\t\t\t\t\t\t`references.${ref.role}`,\n\t\t\t\t\t\tref.role,\n\t\t\t\t\t\talias,\n\t\t\t\t\t\t'snapped',\n\t\t\t\t\t\t`Using the model's ${alias} role for ${describe(ref.role)}.`\n\t\t\t\t\t);\n\t\t\t\t\tref = { ...ref, role: alias };\n\t\t\t\t} else {\n\t\t\t\t\tunsupported.set(ref.role, (unsupported.get(ref.role) ?? 0) + 1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst cap = this.roleCapability(ref.role)!;\n\t\t\tif (ref.mediaType !== undefined && !mediaTypeMatches(ref.mediaType, cap.accepts)) {\n\t\t\t\tconst message = `${describe(ref.id)} is ${describe(ref.mediaType)}; ${ref.role} accepts ${list(cap.accepts ?? [])}.`;\n\t\t\t\tif (allowDrop) this.adjust(`references.${ref.role}`, ref.id, undefined, 'dropped', message);\n\t\t\t\telse this.error(`references.${ref.role}`, ref.id, message);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst group = byRole.get(ref.role) ?? [];\n\t\t\tif (group.some((other) => other.id === ref.id)) {\n\t\t\t\tthis.adjust(`references.${ref.role}`, ref.id, undefined, 'dropped', `Duplicate reference \"${ref.id}\" removed.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tgroup.push(ref);\n\t\t\tbyRole.set(ref.role, group);\n\t\t\tkept.push(ref);\n\t\t}\n\n\t\tfor (const [role, count] of unsupported) {\n\t\t\tconst message =\n\t\t\t\tthis.caps.media === 'text' || !this.caps.references\n\t\t\t\t\t? `The ${this.caps.media} model \"${this.caps.id}\" does not accept reference inputs (${role}).`\n\t\t\t\t\t: `The model does not accept ${role} references.`;\n\t\t\tif (allowDrop) this.adjust(`references.${role}`, count, 0, 'dropped', message);\n\t\t\telse this.error(`references.${role}`, count, message);\n\t\t}\n\n\t\t// Per-role limits (built-in roles first, then the model's own roles).\n\t\tconst removed = new Set<GenerationReference>();\n\t\tconst custom = supportedReferenceRoles(this.caps).filter(\n\t\t\t(role) => !(REFERENCE_ROLES as readonly string[]).includes(role)\n\t\t);\n\t\tfor (const role of [...REFERENCE_ROLES, ...custom]) {\n\t\t\tconst cap = this.roleCapability(role);\n\t\t\tconst group = byRole.get(role) ?? [];\n\t\t\tif (!cap) continue;\n\t\t\tif (group.length > cap.max) {\n\t\t\t\tif (this.strict) {\n\t\t\t\t\tthis.error(`references.${role}`, group.length, `At most ${cap.max} ${role} reference(s) are supported.`);\n\t\t\t\t} else {\n\t\t\t\t\tgroup.slice(cap.max).forEach((ref) => removed.add(ref));\n\t\t\t\t\tthis.adjust(\n\t\t\t\t\t\t`references.${role}`,\n\t\t\t\t\t\tgroup.length,\n\t\t\t\t\t\tcap.max,\n\t\t\t\t\t\t'truncated',\n\t\t\t\t\t\t`Kept the first ${cap.max} ${role} reference(s); the model accepts no more.`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (cap.min !== undefined && group.length < cap.min) {\n\t\t\t\tthis.error(`references.${role}`, group.length, `At least ${cap.min} ${role} reference(s) are required.`);\n\t\t\t}\n\t\t}\n\t\tlet next = kept.filter((ref) => !removed.has(ref));\n\n\t\t// Total limit.\n\t\tconst maxTotal = this.caps.references?.maxTotal;\n\t\tif (maxTotal !== undefined && next.length > maxTotal) {\n\t\t\tif (this.strict) {\n\t\t\t\tthis.error('references', next.length, `At most ${maxTotal} references are supported in total.`);\n\t\t\t} else {\n\t\t\t\tthis.adjust(\n\t\t\t\t\t'references',\n\t\t\t\t\tnext.length,\n\t\t\t\t\tmaxTotal,\n\t\t\t\t\t'truncated',\n\t\t\t\t\t`Kept the first ${maxTotal} references; the model accepts no more in total.`\n\t\t\t\t);\n\t\t\t\tnext = next.slice(0, maxTotal);\n\t\t\t}\n\t\t}\n\n\t\tif (this.request.mode === 'inpaint' && !next.some((ref) => ref.role === 'mask')) {\n\t\t\tthis.error('references.mask', 0, 'Inpainting needs a `mask` reference.');\n\t\t}\n\n\t\tif (refs === undefined) return;\n\t\tif (!this.strict) {\n\t\t\tif (next.length > 0) this.request.references = next;\n\t\t\telse delete this.request.references;\n\t\t}\n\t}\n\n\tplanParam(name: string, spec: ExtraParamSpec | undefined, value: GenerationParamValue): GenerationParamValue | undefined {\n\t\tconst field = `params.${name}`;\n\t\tif (!spec) {\n\t\t\tif (this.strict) this.error(field, value, `Unknown parameter \"${name}\".`);\n\t\t\telse this.adjust(field, value, undefined, 'dropped', `The model has no \"${name}\" parameter.`);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst label = spec.label ?? name;\n\t\tif (spec.type === 'boolean') {\n\t\t\tif (typeof value !== 'boolean') this.error(field, value, `Expected true or false for ${label}.`);\n\t\t\treturn value;\n\t\t}\n\t\tif (spec.type === 'enum') {\n\t\t\tif (spec.options.includes(value as string | number)) return value;\n\t\t\tif (this.strict) {\n\t\t\t\tthis.error(field, value, `${describe(value)} is not a supported ${label}; supported: ${list(spec.options)}.`);\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tconst numeric = spec.options.every((o) => typeof o === 'number');\n\t\t\tconst snapped = numeric ? snapToOption(value, spec.options, numberRank, this.tie) : undefined;\n\t\t\tconst next = snapped ?? spec.default ?? spec.options[0];\n\t\t\tthis.adjust(\n\t\t\t\tfield,\n\t\t\t\tvalue,\n\t\t\t\tnext,\n\t\t\t\t'snapped',\n\t\t\t\tsnapped !== undefined ? `Using the nearest supported ${label}.` : `${describe(value)} is not supported; using ${spec.default !== undefined ? 'the default' : 'the first option'}.`\n\t\t\t);\n\t\t\treturn next;\n\t\t}\n\t\tconst result = this.planNumber(field, value, { ...spec, integer: spec.type === 'integer' }, label);\n\t\treturn result ? result.value : value;\n\t}\n\n\tplanParams() {\n\t\tconst params = this.request.params;\n\t\tconst specs = this.caps.params ?? {};\n\t\tconst next: Record<string, GenerationParamValue> = {};\n\t\tfor (const [name, value] of Object.entries(params ?? {})) {\n\t\t\tif (value === undefined) continue;\n\t\t\tconst planned = this.planParam(name, specs[name], value);\n\t\t\tif (planned !== undefined) next[name] = planned;\n\t\t\telse if (this.strict) next[name] = value;\n\t\t}\n\t\tif (this.options.fillDefaults) {\n\t\t\tfor (const [name, spec] of Object.entries(specs)) {\n\t\t\t\tif (next[name] === undefined && spec.default !== undefined) {\n\t\t\t\t\tnext[name] = spec.default;\n\t\t\t\t\tthis.adjust(`params.${name}`, undefined, spec.default, 'defaulted', 'Filled with the model default.');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(next).length > 0) this.request.params = next;\n\t\telse delete this.request.params;\n\t}\n\n\trun(): void {\n\t\tconst { caps, request } = this;\n\t\tfor (const key of Object.keys(request)) {\n\t\t\tif ((GENERATION_REQUEST_FIELDS as readonly string[]).includes(key)) continue;\n\t\t\tconst value = (request as any)[key];\n\t\t\tif (this.strict) this.error(key, value, `Unknown request field \"${key}\".`);\n\t\t\telse {\n\t\t\t\tdelete (request as any)[key];\n\t\t\t\tthis.adjust(key, value, undefined, 'dropped', `Unknown request field \"${key}\".`);\n\t\t\t}\n\t\t}\n\n\t\tif (request.model !== undefined && request.model !== caps.id) {\n\t\t\tthis.error('model', request.model, `The request targets \"${request.model}\" but the plan is for \"${caps.id}\".`);\n\t\t}\n\t\trequest.model = caps.id;\n\n\t\t// Text fields.\n\t\tconst promptCap = caps.prompt ?? {};\n\t\tif (promptCap.required && !(request.prompt ?? '').trim()) {\n\t\t\tthis.error('prompt', request.prompt, 'A prompt is required.');\n\t\t}\n\t\tconst countResolved = promptCap.countResolved ?? true;\n\t\tconst measured =\n\t\t\tcountResolved && this.options.resolvedPrompt !== undefined && this.options.resolvedPrompt !== request.prompt\n\t\t\t\t? this.options.resolvedPrompt\n\t\t\t\t: undefined;\n\t\tthis.planText('prompt', promptCap.maxLength, measured);\n\t\tfor (const field of ['negativePrompt', 'systemPrompt'] as const) {\n\t\t\tif (request[field] === undefined) continue;\n\t\t\tconst cap = textFieldCapability(caps[field]);\n\t\t\tif (!cap) {\n\t\t\t\tthis.unsupported(field, `The model does not take a ${field === 'negativePrompt' ? 'negative' : 'system'} prompt.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.planText(field, cap.maxLength);\n\t\t}\n\n\t\tthis.planEnum('aspectRatio', caps.aspectRatios, aspectRatioRank, 'aspect ratio');\n\t\tthis.planEnum('resolution', caps.resolutions, resolutionRank, 'resolution');\n\t\tthis.planEnum('quality', caps.quality, qualityRank, 'quality');\n\t\tthis.planCount();\n\t\tthis.planDuration();\n\t\tthis.planSeed();\n\t\tthis.planMode();\n\t\tthis.addMentions();\n\t\tthis.planReferences();\n\t\tthis.planParams();\n\t}\n}\n\n/**\n * Plans `request` against a model's capabilities before sending it: snaps\n * enum values (aspect ratio, resolution, quality, count/duration choices) to\n * the nearest supported option, clamps ranges, truncates text and reference\n * lists over their limits, drops unsupported fields, and reports every change\n * in `adjustments` and every unfixable problem in `errors`.\n *\n * Pure and deterministic: the input is not mutated and the same input always\n * gives the same plan.\n */\nexport function planGenerationRequest(\n\trequest: GenerationRequest,\n\tcaps: ModelCapabilities,\n\toptions: PlanOptions = {}\n): GenerationPlan {\n\tconst strategy = options.strategy ?? 'nearest';\n\tconst planner = new Planner(caps, cloneRequest(request ?? {}), options, strategy);\n\tplanner.run();\n\treturn {\n\t\tok: planner.errors.length === 0,\n\t\trequest: planner.request,\n\t\tadjustments: planner.adjustments,\n\t\terrors: planner.errors,\n\t\tmodel: caps.id,\n\t\tstrategy\n\t};\n}\n","import type { ModelCapabilities } from './capabilities.js';\n\n/**\n * Stable JSON: object keys sorted, `undefined` members left out, so equal\n * values always give the same string regardless of key order.\n */\nexport function stableStringify(value: unknown): string {\n\tif (Array.isArray(value)) return `[${value.map((item) => (item === undefined ? 'null' : stableStringify(item))).join(',')}]`;\n\tif (value && typeof value === 'object') {\n\t\tconst entries = Object.keys(value as object)\n\t\t\t.filter((key) => (value as any)[key] !== undefined)\n\t\t\t.sort()\n\t\t\t.map((key) => `${JSON.stringify(key)}:${stableStringify((value as any)[key])}`);\n\t\treturn `{${entries.join(',')}}`;\n\t}\n\treturn JSON.stringify(value) ?? 'null';\n}\n\nconst FNV_PRIME = 0x01000193;\n\n/**\n * A short, stable, synchronous content hash (two independent 32-bit FNV-1a\n * lanes over the UTF-16 code units, 16 hex digits, prefixed with `h1-`).\n * It detects changes; it is not cryptographic, so do not use it to\n * authenticate content.\n */\nexport function hashText(text: string): string {\n\tlet a = 0x811c9dc5;\n\tlet b = 0x2f0e1d5b;\n\tfor (let i = 0; i < text.length; i++) {\n\t\tconst unit = text.charCodeAt(i);\n\t\ta = Math.imul(a ^ (unit & 0xff), FNV_PRIME);\n\t\ta = Math.imul(a ^ (unit >>> 8), FNV_PRIME);\n\t\tb = Math.imul(b ^ (unit >>> 8), FNV_PRIME);\n\t\tb = Math.imul(b ^ (unit & 0xff), FNV_PRIME);\n\t\tb ^= b >>> 15;\n\t}\n\t// Final avalanche so short inputs still spread over all digits.\n\ta ^= a >>> 16;\n\ta = Math.imul(a, 0x85ebca6b);\n\ta ^= a >>> 13;\n\tb ^= b >>> 16;\n\tb = Math.imul(b, 0xc2b2ae35);\n\tb ^= b >>> 13;\n\tconst hex = (n: number) => (n >>> 0).toString(16).padStart(8, '0');\n\treturn `h1-${hex(a)}${hex(b)}`;\n}\n\n/** {@link hashText} of the {@link stableStringify} form of `value`. */\nexport function hashValue(value: unknown): string {\n\treturn hashText(stableStringify(value));\n}\n\nconst PRESENTATION_ONLY = new Set(['name', 'description', 'badges', 'icon', 'group', 'timing']);\n\n/**\n * Hash of what a model accepts. Presentation fields (`name`, `description`,\n * `badges`, `icon`, `group`) and `timing` are left out, so renaming a model or\n * changing its progress estimate is not reported as a capability change.\n */\nexport function hashCapabilities(caps: ModelCapabilities): string {\n\tconst relevant: Record<string, unknown> = {};\n\tfor (const key of Object.keys(caps)) {\n\t\tif (!PRESENTATION_ONLY.has(key)) relevant[key] = (caps as any)[key];\n\t}\n\treturn hashValue(relevant);\n}\n"]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseCsv
|
|
3
|
+
} from "./chunk-664LQYFJ.js";
|
|
1
4
|
import {
|
|
2
5
|
getPromptDiagnostics,
|
|
3
6
|
getTemplateBody,
|
|
@@ -13,9 +16,6 @@ import {
|
|
|
13
16
|
parseConditionExpression,
|
|
14
17
|
parseVariableBody
|
|
15
18
|
} from "./chunk-P6ODPZ4W.js";
|
|
16
|
-
import {
|
|
17
|
-
parseCsv
|
|
18
|
-
} from "./chunk-664LQYFJ.js";
|
|
19
19
|
|
|
20
20
|
// src/grammar/resolver.ts
|
|
21
21
|
function resolveTemplates(text, templates = [], options) {
|
|
@@ -686,4 +686,4 @@ export {
|
|
|
686
686
|
mergeRecords,
|
|
687
687
|
serializeMergeOutputs
|
|
688
688
|
};
|
|
689
|
-
//# sourceMappingURL=chunk-
|
|
689
|
+
//# sourceMappingURL=chunk-G6IKY6PL.js.map
|