@chai-ui/core 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +10 -5
  2. package/dist/composer-view.d.ts +93 -0
  3. package/dist/composer-view.d.ts.map +1 -0
  4. package/dist/composer-view.js +142 -0
  5. package/dist/composer-view.js.map +1 -0
  6. package/dist/composer.d.ts +188 -0
  7. package/dist/composer.d.ts.map +1 -0
  8. package/dist/composer.js +326 -0
  9. package/dist/composer.js.map +1 -0
  10. package/dist/edit-card.d.ts +53 -0
  11. package/dist/edit-card.d.ts.map +1 -0
  12. package/dist/edit-card.js +119 -0
  13. package/dist/edit-card.js.map +1 -0
  14. package/dist/index.d.ts +7 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +7 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/media-actions.d.ts +19 -0
  19. package/dist/media-actions.d.ts.map +1 -0
  20. package/dist/media-actions.js +57 -0
  21. package/dist/media-actions.js.map +1 -0
  22. package/dist/media-analyzer.d.ts +101 -0
  23. package/dist/media-analyzer.d.ts.map +1 -0
  24. package/dist/media-analyzer.js +215 -0
  25. package/dist/media-analyzer.js.map +1 -0
  26. package/dist/reasoning.d.ts +59 -0
  27. package/dist/reasoning.d.ts.map +1 -0
  28. package/dist/reasoning.js +55 -0
  29. package/dist/reasoning.js.map +1 -0
  30. package/dist/region-edit.d.ts +2 -0
  31. package/dist/region-edit.d.ts.map +1 -1
  32. package/dist/region-edit.js +6 -0
  33. package/dist/region-edit.js.map +1 -1
  34. package/dist/result-format.d.ts +11 -0
  35. package/dist/result-format.d.ts.map +1 -0
  36. package/dist/result-format.js +30 -0
  37. package/dist/result-format.js.map +1 -0
  38. package/dist/unique-id.d.ts +3 -0
  39. package/dist/unique-id.d.ts.map +1 -0
  40. package/dist/unique-id.js +7 -0
  41. package/dist/unique-id.js.map +1 -0
  42. package/package.json +2 -1
  43. package/src/composer-view.ts +222 -0
  44. package/src/composer.ts +525 -0
  45. package/src/edit-card.ts +138 -0
  46. package/src/index.ts +7 -0
  47. package/src/media-actions.ts +55 -0
  48. package/src/media-analyzer.ts +293 -0
  49. package/src/reasoning.ts +90 -0
  50. package/src/region-edit.ts +8 -0
  51. package/src/result-format.ts +34 -0
  52. package/src/unique-id.ts +6 -0
@@ -0,0 +1,326 @@
1
+ /**
2
+ * The Composer's behavior with no framework: turns a submit payload into
3
+ * `Request` → `Run` → `Result` (§6), fanning out across `engine.generate`
4
+ * calls and folding each one back into state as it settles. A small store
5
+ * (`getState` + `subscribe`) that `useComposer` (React) and the Vue
6
+ * composable wrap; the pure transitions live in `run.ts`.
7
+ */
8
+ import { createMockEngine, isAbortError, mockEngine, normalizeGenerationError, } from "./engine.js";
9
+ import { routeModel } from "./model-routing.js";
10
+ import { buildRegionEditPrompt, PRECISE_EDIT_MODELS } from "./region-edit.js";
11
+ import { pickReasoning, reasoningModelFor } from "./reasoning.js";
12
+ import { cancelResult, createRun, deriveGenerationUseCase, failResult, resolveResult, ROUTING_MODEL_ID, startResult, streamResult, } from "./run.js";
13
+ /** A plain text request — what a submit means when no use case is picked, unless the builder sets `defaultUseCase`. */
14
+ export const TEXT_USE_CASE = { kind: "text", label: "Text" };
15
+ /** Editing the attached image, the attach menu's "Edit image". Pair it with `useComposer`'s `editImage` and an `EditCard`. */
16
+ export const EDIT_IMAGE_USE_CASE = { kind: "image", label: "Edit image", edit: true };
17
+ /** A result's `modelId` when nothing was picked: the engine runs its own default model. */
18
+ export const DEFAULT_MODEL_ID = "default";
19
+ const mockTextEngine = createMockEngine({ outputKind: "text" });
20
+ function defaultEnhancePrompt(value, mode) {
21
+ const subject = mode?.includes("video")
22
+ ? "a video-generation"
23
+ : mode === "text-to-text" || mode === "vision"
24
+ ? "an AI assistant"
25
+ : "an image-generation";
26
+ return `Rewrite the following ${subject} prompt to be more detailed and specific, keeping the same intent. Reply with only the rewritten prompt, nothing else.\n\n${value}`;
27
+ }
28
+ function defaultEditPrompt({ prompt, regions, model }) {
29
+ return buildRegionEditPrompt({ prompt, regions, format: model?.regionFormat });
30
+ }
31
+ const imageOnly = (media) => (media?.kind === "image" ? media : null);
32
+ /**
33
+ * `getOptions` is read on every call, so options can change between
34
+ * renders; `getProvided` is the nearest provider's reasoning, if any.
35
+ */
36
+ export function createComposerStore(getOptions, getProvided = () => undefined) {
37
+ let state = {
38
+ runs: [],
39
+ enhancing: false,
40
+ routing: false,
41
+ editRuns: [],
42
+ regions: [],
43
+ activeVersion: 0,
44
+ editSource: imageOnly(getOptions().editImage)?.src ?? null,
45
+ editImageCount: 0,
46
+ };
47
+ const listeners = new Set();
48
+ // Edit state belongs to one image: a read sees another image's state as
49
+ // empty, and the first write after the change actually clears it.
50
+ const forImage = (s, image = imageOnly(getOptions().editImage)) => {
51
+ const src = image?.src ?? null;
52
+ return src === s.editSource
53
+ ? s
54
+ : { ...s, editSource: src, editImageCount: s.editImageCount + 1, editRuns: [], regions: [], activeVersion: 0 };
55
+ };
56
+ const set = (fn) => {
57
+ const current = forImage(state);
58
+ state = { ...current, ...fn(current) };
59
+ for (const l of listeners)
60
+ l();
61
+ };
62
+ let versionsCache = null;
63
+ const versionsOf = (s, image) => {
64
+ if (versionsCache && versionsCache.image === image && versionsCache.editRuns === s.editRuns && versionsCache.count === s.editImageCount) {
65
+ return versionsCache.versions;
66
+ }
67
+ const versions = image
68
+ ? [
69
+ { id: `original-${s.editImageCount}`, src: image.src, status: "done", regions: [] },
70
+ ...s.editRuns.flatMap((run) => run.results.map((r) => ({
71
+ id: r.id,
72
+ src: r.output?.src,
73
+ from: run.request.attachments[0]?.src,
74
+ status: r.status,
75
+ regions: run.request.params.regions ?? [],
76
+ error: r.error?.message,
77
+ }))),
78
+ ]
79
+ : [];
80
+ versionsCache = { image, editRuns: s.editRuns, count: s.editImageCount, versions };
81
+ return versions;
82
+ };
83
+ const reasoning = () => pickReasoning(getOptions(), getProvided());
84
+ // Each submit gets an id, so routing that settles after a newer submit is dropped.
85
+ let submitId = 0;
86
+ // Aborts the current submit's engine calls: on `cancel()`, and when a newer
87
+ // submit replaces it (its results would be dropped anyway).
88
+ let controller = null;
89
+ // Edit placeholders from routing waits, dropped from the history when the
90
+ // next real runs start (including ones a newer submit abandoned).
91
+ let placeholderIds = new Set();
92
+ // One request per selection. An edit runs on the image version showing
93
+ // in the EditCard (the original until an edit lands) and carries its regions.
94
+ function buildRequest(payload, selection) {
95
+ const opts = getOptions();
96
+ const r = reasoning();
97
+ const isText = selection.useCase.kind === "text";
98
+ const isEdit = Boolean(selection.useCase.edit && opts.editImage?.kind === "image");
99
+ const image = imageOnly(opts.editImage);
100
+ const s = forImage(state, image);
101
+ const shown = versionsOf(s, image)[s.activeVersion];
102
+ const editFrom = shown?.status === "done" && shown.src ? shown.src : opts.editImage?.src;
103
+ const attachments = isEdit && editFrom ? [{ src: editFrom, kind: "image" }] : payload.attachments;
104
+ // Nothing picked: text uses the builder's text model when there is
105
+ // one; otherwise the engine runs its own default. Never a silent no-op.
106
+ const fallback = isText ? (opts.textModel ?? (r && reasoningModelFor(r, attachments))) : undefined;
107
+ const params = payload.aspectRatio && !isEdit ? { aspectRatio: payload.aspectRatio } : {};
108
+ if (isEdit)
109
+ params.regions = payload.regions ?? [];
110
+ const request = {
111
+ mode: deriveGenerationUseCase(selection.useCase, attachments),
112
+ prompt: payload.value,
113
+ attachments,
114
+ modelIds: selection.modelIds.length > 0 ? selection.modelIds : [fallback ?? DEFAULT_MODEL_ID],
115
+ params,
116
+ };
117
+ const engine = isText
118
+ ? (opts.textEngine ?? r?.engine ?? mockTextEngine)
119
+ : (opts.engineByKind?.[selection.useCase.kind] ?? opts.engine ?? mockEngine);
120
+ return { request, engine, isEdit };
121
+ }
122
+ function start(payload, signal) {
123
+ const opts = getOptions();
124
+ const newRuns = payload.selections.map((selection) => {
125
+ const { request, engine, isEdit } = buildRequest(payload, selection);
126
+ return { run: createRun(request), engine, isEdit, models: selection.models ?? [] };
127
+ });
128
+ const placeholders = placeholderIds;
129
+ placeholderIds = new Set();
130
+ set((s) => {
131
+ const newEditRuns = newRuns.filter((r) => r.isEdit).map((r) => r.run);
132
+ const kept = s.editRuns.filter((r) => !placeholders.has(r.id));
133
+ const runs = newRuns.map((r) => r.run);
134
+ // Show the first new version, and start the next edit with no regions:
135
+ // these ones now belong to the versions they made.
136
+ if (newEditRuns.length > 0) {
137
+ return {
138
+ runs,
139
+ editRuns: [...kept, ...newEditRuns],
140
+ activeVersion: 1 + kept.reduce((n, r) => n + r.results.length, 0),
141
+ regions: [],
142
+ };
143
+ }
144
+ return placeholders.size > 0 ? { runs, editRuns: kept } : { runs };
145
+ });
146
+ // Results settle independently and out of order — each update only
147
+ // ever touches its own run, and only if that run is still current. A
148
+ // run from an earlier submit is no longer in state (and its calls were
149
+ // aborted), so a late result can't clobber the newer ones.
150
+ const update = (runId, fn) => {
151
+ const apply = (prev) => (prev.some((r) => r.id === runId) ? prev.map((r) => (r.id === runId ? fn(r) : r)) : prev);
152
+ set((s) => ({ runs: apply(s.runs), editRuns: apply(s.editRuns) }));
153
+ };
154
+ for (const { run: newRun, engine, isEdit, models } of newRuns) {
155
+ opts.onRun?.(newRun);
156
+ for (const result of newRun.results) {
157
+ update(newRun.id, (r) => startResult(r, result.id));
158
+ // An edit's prompt depends on the model: one with box support gets
159
+ // boxes, any other gets the regions described in words.
160
+ const regions = newRun.request.params.regions ?? [];
161
+ const model = models.find((m) => m.id === result.modelId) ?? PRECISE_EDIT_MODELS.find((m) => m.id === result.modelId);
162
+ const prompt = isEdit
163
+ ? (opts.editPrompt ?? defaultEditPrompt)({ prompt: newRun.request.prompt, regions, model })
164
+ : newRun.request.prompt;
165
+ void engine
166
+ .generate({
167
+ modelId: result.modelId === DEFAULT_MODEL_ID ? undefined : result.modelId,
168
+ prompt,
169
+ attachments: newRun.request.attachments,
170
+ aspectRatio: newRun.request.params.aspectRatio,
171
+ // Text engines that stream fill `output` in while still "running".
172
+ onText: (text) => update(newRun.id, (r) => streamResult(r, result.id, text)),
173
+ signal,
174
+ })
175
+ .then(({ src, kind, usage, evaluations }) => {
176
+ update(newRun.id, (r) => resolveResult(r, result.id, { src, kind }, usage, evaluations));
177
+ getOptions().onResult?.(newRun, result.id);
178
+ }, (err) => {
179
+ if (isAbortError(err))
180
+ return update(newRun.id, (r) => cancelResult(r, result.id));
181
+ update(newRun.id, (r) => failResult(r, result.id, normalizeGenerationError(err)));
182
+ getOptions().onError?.(newRun, result.id);
183
+ });
184
+ }
185
+ }
186
+ }
187
+ function submit(payload) {
188
+ const id = ++submitId;
189
+ controller?.abort();
190
+ const { signal } = (controller = new AbortController());
191
+ const toRoute = payload.autoSelectModel && payload.selections.some((sel) => sel.models.length > 0);
192
+ if (!toRoute) {
193
+ if (state.routing)
194
+ set(() => ({ routing: false }));
195
+ start(payload, signal);
196
+ return;
197
+ }
198
+ const opts = getOptions();
199
+ const r = reasoning();
200
+ if (!r)
201
+ warnNoReasoningOnce("each request runs on the first listed model");
202
+ // Runs exist from the moment of submit, so a result card shows progress
203
+ // while the reasoning model chooses. Their results read "Choosing model".
204
+ const placeholders = payload.selections.map((sel) => {
205
+ const { request, isEdit } = buildRequest(payload, sel);
206
+ const modelIds = sel.models.length > 0 ? [ROUTING_MODEL_ID] : request.modelIds;
207
+ return { run: createRun({ ...request, modelIds }), isEdit };
208
+ });
209
+ set((s) => {
210
+ const next = { routing: true, runs: placeholders.map((p) => p.run) };
211
+ const editPlaceholders = placeholders.filter((p) => p.isEdit).map((p) => p.run);
212
+ if (editPlaceholders.length > 0) {
213
+ const editRuns = s.editRuns.filter((run) => !placeholderIds.has(run.id));
214
+ for (const run of editPlaceholders)
215
+ placeholderIds.add(run.id);
216
+ next.editRuns = [...editRuns, ...editPlaceholders];
217
+ next.activeVersion = 1 + editRuns.reduce((n, run) => n + run.results.length, 0);
218
+ }
219
+ return next;
220
+ });
221
+ void Promise.all(payload.selections.map((sel) => sel.models.length === 0
222
+ ? Promise.resolve(null)
223
+ : routeModel({
224
+ prompt: payload.value,
225
+ outputKind: sel.useCase.kind,
226
+ attachmentKinds: payload.attachments.map((a) => a.kind),
227
+ attachments: payload.attachments,
228
+ models: sel.models,
229
+ engine: r?.engine,
230
+ model: r && reasoningModelFor(r, payload.attachments),
231
+ routingPrompt: opts.routingPrompt,
232
+ signal,
233
+ }))).then((results) => {
234
+ if (id !== submitId || signal.aborted)
235
+ return;
236
+ set(() => ({ routing: false }));
237
+ const latest = getOptions();
238
+ for (const res of results)
239
+ if (res?.status === "fallback")
240
+ latest.onRoutingFallback?.(res);
241
+ const routedIds = results.flatMap((res) => (res ? [res.modelId] : []));
242
+ if (latest.onModelIdsChange)
243
+ latest.onModelIdsChange(routedIds);
244
+ else if (routedIds[0])
245
+ latest.onModelChange?.(routedIds[0]);
246
+ start({
247
+ ...payload,
248
+ modelId: routedIds[0] ?? payload.modelId,
249
+ selections: payload.selections.map((sel, i) => ({
250
+ ...sel,
251
+ modelIds: results[i] ? [results[i].modelId] : sel.modelIds,
252
+ })),
253
+ }, signal);
254
+ });
255
+ }
256
+ /**
257
+ * Stops the current submit: wire it to Composer's `onAbort`. Its
258
+ * unfinished results turn `"cancelled"` right away, and each engine
259
+ * cancels at the provider where it can (best effort: some providers keep
260
+ * running, and billing, once a request has started).
261
+ */
262
+ function cancel() {
263
+ submitId += 1;
264
+ controller?.abort();
265
+ controller = null;
266
+ const cancelAll = (prev) => prev.map((run) => run.results.reduce((acc, r) => cancelResult(acc, r.id), run));
267
+ set((s) => ({ routing: false, runs: cancelAll(s.runs), editRuns: cancelAll(s.editRuns) }));
268
+ }
269
+ /** Rewrites a prompt with the reasoning model. Only offer it when `reasoning()` is set. */
270
+ async function enhance(value) {
271
+ const r = reasoning();
272
+ if (!r)
273
+ throw new Error("[chai-ui] Enhance needs a reasoning engine and model.");
274
+ set(() => ({ enhancing: true }));
275
+ try {
276
+ const prompt = (getOptions().enhancePrompt ?? defaultEnhancePrompt)(value, state.runs[0]?.request.mode);
277
+ const { src } = await r.engine.generate({ modelId: r.model, prompt, attachments: [] });
278
+ return src;
279
+ }
280
+ finally {
281
+ set(() => ({ enhancing: false }));
282
+ }
283
+ }
284
+ const setActiveVersion = (activeVersion) => set(() => ({ activeVersion }));
285
+ const setRegions = (regions) => set(() => ({ regions }));
286
+ /**
287
+ * The `EditCard` props for a state and the current `editImage`, or `null`
288
+ * without one. Pure, so a binding can call it while rendering with that
289
+ * render's options.
290
+ */
291
+ function edit(s, editImage) {
292
+ const image = imageOnly(editImage);
293
+ if (!image)
294
+ return null;
295
+ const current = forImage(s, image);
296
+ const versions = versionsOf(current, image);
297
+ return {
298
+ versions,
299
+ activeVersion: Math.min(current.activeVersion, versions.length - 1),
300
+ onActiveVersionChange: setActiveVersion,
301
+ regions: current.regions,
302
+ onRegionsChange: setRegions,
303
+ };
304
+ }
305
+ return {
306
+ getState: () => state,
307
+ subscribe(listener) {
308
+ listeners.add(listener);
309
+ return () => void listeners.delete(listener);
310
+ },
311
+ submit,
312
+ cancel,
313
+ enhance,
314
+ edit,
315
+ reasoning,
316
+ };
317
+ }
318
+ const warned = new Set();
319
+ /** One console warning per message per page load: auto-select is on with no reasoning model to route with. */
320
+ export function warnNoReasoningOnce(consequence) {
321
+ if (warned.has(consequence))
322
+ return;
323
+ warned.add(consequence);
324
+ console.warn(`[chai-ui] Auto-select model is on, but there's no reasoning model, so ${consequence}. Wrap your app in <ChaiProvider> to route with one.`);
325
+ }
326
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type EditRegion, type RegionBox } from "./region-edit.js";
2
+ export declare const EDIT_ZOOM_STEPS: number[];
3
+ export type RegionCorner = "nw" | "ne" | "sw" | "se";
4
+ export declare const REGION_CORNERS: RegionCorner[];
5
+ export interface Size {
6
+ width: number;
7
+ height: number;
8
+ }
9
+ export interface Pan {
10
+ x: number;
11
+ y: number;
12
+ }
13
+ /** Keeps a box inside the image and at least the minimum size. */
14
+ export declare function fitBox(box: RegionBox): RegionBox;
15
+ /** A box resized by dragging one corner; the opposite corner stays put. */
16
+ export declare function resizeBox(box: RegionBox, corner: RegionCorner, dx: number, dy: number): RegionBox;
17
+ /** A region's box after a key: arrows move it (Shift resizes, Alt takes bigger steps). `null` for any other key. */
18
+ export declare function regionBoxForKey(box: RegionBox, key: string, { shift, alt }?: {
19
+ shift?: boolean | undefined;
20
+ alt?: boolean | undefined;
21
+ }): RegionBox | null;
22
+ /** Pan limits at a zoom level: the image always covers the viewport. */
23
+ export declare function clampPan(pan: Pan, zoom: number, size: Size): Pan;
24
+ /** The pan that zooms around the middle of the view, so what's centered stays centered. */
25
+ export declare function panForZoom(pan: Pan, zoom: number, next: number, size: Size): Pan;
26
+ /** The pan after an arrow key on the zoomed image, or `null` for any other key. */
27
+ export declare function panForKey(pan: Pan, key: string, zoom: number, size: Size): Pan | null;
28
+ /** The lowest number no current region uses, so freed numbers (and colors) come back first. */
29
+ export declare function freeRegionNumber(regions: EditRegion[]): number;
30
+ /** A new region, centered in the part of the image in view, so it's visible when zoomed in. */
31
+ export declare function newRegion(regions: EditRegion[], zoom: number, pan: Pan, size: Size): EditRegion;
32
+ /**
33
+ * Where the instruction field goes: above its region, or below it when
34
+ * there isn't room above and it clears the controls along the bottom edge.
35
+ */
36
+ export declare function regionPopoverPosition(box: RegionBox, zoom: number, pan: Pan, size: Size, paginated: boolean): {
37
+ left: number;
38
+ top: number;
39
+ above: boolean;
40
+ };
41
+ /**
42
+ * The card's width: from `scale` (of the image's own width), else `width`,
43
+ * else `maxWidth`, then fitted inside `maxWidth` × `maxHeight` keeping the image's shape.
44
+ */
45
+ export declare function editCardWidth(natural: Size | null, { width, scale, maxWidth, maxHeight }: {
46
+ width?: number;
47
+ scale?: number;
48
+ maxWidth: number;
49
+ maxHeight: number;
50
+ }): number;
51
+ /** A region's place on the image, as percentages, and its color. */
52
+ export declare function regionBoxStyle(r: EditRegion): Record<string, string>;
53
+ //# sourceMappingURL=edit-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-card.d.ts","sourceRoot":"","sources":["../src/edit-card.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEhF,eAAO,MAAM,eAAe,UAA0B,CAAC;AAQvD,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACrD,eAAO,MAAM,cAAc,EAAE,YAAY,EAA6B,CAAC;AACvE,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAID,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,CAIhD;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAUjG;AAED,oHAAoH;AACpH,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,KAAa,EAAE,GAAW,EAAE;;;CAAK,GAAG,SAAS,GAAG,IAAI,CAMlH;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,CAKhE;AAED,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,CAKhF;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,CAIrF;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAI9D;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,UAAU,CAM/F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO;;;;EAY3G;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,IAAI,GAAG,IAAI,EACpB,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC7G,MAAM,CAIR;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQpE"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * The EditCard's geometry, the same in every framework binding: region
3
+ * boxes, zoom and pan, where the instruction field goes, and the card's
4
+ * width. Boxes are fractions of the image (0 to 1); pan and sizes are px.
5
+ */
6
+ import { uniqueId } from "./unique-id.js";
7
+ import { regionColor } from "./region-edit.js";
8
+ export const EDIT_ZOOM_STEPS = [1, 1.25, 1.5, 2, 3, 4];
9
+ const MIN_SIZE = 0.03;
10
+ const KEY_STEP = 0.01;
11
+ const KEY_STEP_LARGE = 0.05;
12
+ /** The instruction field's width, and a typical height (title row and a two-line field), for placing it. */
13
+ const POPOVER_WIDTH = 220;
14
+ const POPOVER_HEIGHT = 96;
15
+ export const REGION_CORNERS = ["nw", "ne", "sw", "se"];
16
+ const clamp = (v, min, max) => Math.min(max, Math.max(min, v));
17
+ /** Keeps a box inside the image and at least the minimum size. */
18
+ export function fitBox(box) {
19
+ const width = clamp(box.width, MIN_SIZE, 1);
20
+ const height = clamp(box.height, MIN_SIZE, 1);
21
+ return { x: clamp(box.x, 0, 1 - width), y: clamp(box.y, 0, 1 - height), width, height };
22
+ }
23
+ /** A box resized by dragging one corner; the opposite corner stays put. */
24
+ export function resizeBox(box, corner, dx, dy) {
25
+ let left = box.x;
26
+ let top = box.y;
27
+ let right = box.x + box.width;
28
+ let bottom = box.y + box.height;
29
+ if (corner === "nw" || corner === "sw")
30
+ left = clamp(left + dx, 0, right - MIN_SIZE);
31
+ else
32
+ right = clamp(right + dx, left + MIN_SIZE, 1);
33
+ if (corner === "nw" || corner === "ne")
34
+ top = clamp(top + dy, 0, bottom - MIN_SIZE);
35
+ else
36
+ bottom = clamp(bottom + dy, top + MIN_SIZE, 1);
37
+ return { x: left, y: top, width: right - left, height: bottom - top };
38
+ }
39
+ /** A region's box after a key: arrows move it (Shift resizes, Alt takes bigger steps). `null` for any other key. */
40
+ export function regionBoxForKey(box, key, { shift = false, alt = false } = {}) {
41
+ const step = alt ? KEY_STEP_LARGE : KEY_STEP;
42
+ const delta = { ArrowLeft: [-step, 0], ArrowRight: [step, 0], ArrowUp: [0, -step], ArrowDown: [0, step] }[key];
43
+ if (!delta)
44
+ return null;
45
+ const [dx, dy] = delta;
46
+ return shift ? resizeBox(box, "se", dx, dy) : fitBox({ ...box, x: box.x + dx, y: box.y + dy });
47
+ }
48
+ /** Pan limits at a zoom level: the image always covers the viewport. */
49
+ export function clampPan(pan, zoom, size) {
50
+ return {
51
+ x: clamp(pan.x, size.width - size.width * zoom, 0),
52
+ y: clamp(pan.y, size.height - size.height * zoom, 0),
53
+ };
54
+ }
55
+ /** The pan that zooms around the middle of the view, so what's centered stays centered. */
56
+ export function panForZoom(pan, zoom, next, size) {
57
+ const cx = size.width / 2;
58
+ const cy = size.height / 2;
59
+ const ratio = next / zoom;
60
+ return clampPan({ x: cx - (cx - pan.x) * ratio, y: cy - (cy - pan.y) * ratio }, next, size);
61
+ }
62
+ /** The pan after an arrow key on the zoomed image, or `null` for any other key. */
63
+ export function panForKey(pan, key, zoom, size) {
64
+ const step = 40;
65
+ const delta = { ArrowLeft: [step, 0], ArrowRight: [-step, 0], ArrowUp: [0, step], ArrowDown: [0, -step] }[key];
66
+ return delta ? clampPan({ x: pan.x + delta[0], y: pan.y + delta[1] }, zoom, size) : null;
67
+ }
68
+ /** The lowest number no current region uses, so freed numbers (and colors) come back first. */
69
+ export function freeRegionNumber(regions) {
70
+ let n = 1;
71
+ while (regions.some((r) => r.number === n))
72
+ n += 1;
73
+ return n;
74
+ }
75
+ /** A new region, centered in the part of the image in view, so it's visible when zoomed in. */
76
+ export function newRegion(regions, zoom, pan, size) {
77
+ const view = 1 / zoom;
78
+ const centerX = size.width ? -pan.x / (size.width * zoom) + view / 2 : 0.5;
79
+ const centerY = size.height ? -pan.y / (size.height * zoom) + view / 2 : 0.5;
80
+ const box = fitBox({ x: centerX - (0.3 * view) / 2, y: centerY - (0.2 * view) / 2, width: 0.3 * view, height: 0.2 * view });
81
+ return { id: uniqueId(), number: freeRegionNumber(regions), box, prompt: "" };
82
+ }
83
+ /**
84
+ * Where the instruction field goes: above its region, or below it when
85
+ * there isn't room above and it clears the controls along the bottom edge.
86
+ */
87
+ export function regionPopoverPosition(box, zoom, pan, size, paginated) {
88
+ const left = box.x * size.width * zoom + pan.x;
89
+ const top = box.y * size.height * zoom + pan.y;
90
+ const bottom = (box.y + box.height) * size.height * zoom + pan.y;
91
+ const reserved = paginated ? 100 : 56;
92
+ const fitsBelow = bottom + 8 + POPOVER_HEIGHT <= size.height - reserved;
93
+ const above = top > POPOVER_HEIGHT + 16 || !fitsBelow;
94
+ return {
95
+ left: clamp(left, 8, Math.max(8, size.width - POPOVER_WIDTH - 8)),
96
+ top: above ? Math.max(top - 8, POPOVER_HEIGHT + 8) : bottom + 8,
97
+ above,
98
+ };
99
+ }
100
+ /**
101
+ * The card's width: from `scale` (of the image's own width), else `width`,
102
+ * else `maxWidth`, then fitted inside `maxWidth` × `maxHeight` keeping the image's shape.
103
+ */
104
+ export function editCardWidth(natural, { width, scale, maxWidth, maxHeight }) {
105
+ const base = scale != null && natural ? natural.width * scale : (width ?? maxWidth);
106
+ const heightCap = natural && natural.height > 0 ? (maxHeight * natural.width) / natural.height : Infinity;
107
+ return Math.round(Math.min(base, maxWidth, heightCap));
108
+ }
109
+ /** A region's place on the image, as percentages, and its color. */
110
+ export function regionBoxStyle(r) {
111
+ return {
112
+ left: `${r.box.x * 100}%`,
113
+ top: `${r.box.y * 100}%`,
114
+ width: `${r.box.width * 100}%`,
115
+ height: `${r.box.height * 100}%`,
116
+ "--chai-region-color": regionColor(r.number),
117
+ };
118
+ }
119
+ //# sourceMappingURL=edit-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-card.js","sourceRoot":"","sources":["../src/edit-card.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,4 +8,11 @@ export * from "./model-routing.js";
8
8
  export * from "./region-edit.js";
9
9
  export * from "./suggested-models.js";
10
10
  export * from "./check-suggested-models.js";
11
+ export * from "./reasoning.js";
12
+ export * from "./composer.js";
13
+ export * from "./media-analyzer.js";
14
+ export * from "./media-actions.js";
15
+ export * from "./result-format.js";
16
+ export * from "./composer-view.js";
17
+ export * from "./edit-card.js";
11
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -8,4 +8,11 @@ export * from "./model-routing.js";
8
8
  export * from "./region-edit.js";
9
9
  export * from "./suggested-models.js";
10
10
  export * from "./check-suggested-models.js";
11
+ export * from "./reasoning.js";
12
+ export * from "./composer.js";
13
+ export * from "./media-analyzer.js";
14
+ export * from "./media-actions.js";
15
+ export * from "./result-format.js";
16
+ export * from "./composer-view.js";
17
+ export * from "./edit-card.js";
11
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Download and share for a piece of generated media, shared by the cards in
3
+ * every framework binding.
4
+ *
5
+ * A plain `<a download href={remoteUrl}>` only forces a download for a
6
+ * same-origin or `blob:`/`data:` URL; for a cross-origin CDN URL (what a
7
+ * generated result usually is) browsers ignore `download` and open it
8
+ * instead. Fetching it into a blob first works wherever the source allows
9
+ * cross-origin fetches. When it doesn't, opening the media is the fallback.
10
+ */
11
+ export declare function downloadMedia(src: string, filename: string): Promise<void>;
12
+ /**
13
+ * The native share sheet where there is one, otherwise the media's URL
14
+ * copied to the clipboard. Says which, so the button can confirm a copy.
15
+ */
16
+ export declare function shareMedia(src: string): Promise<"shared" | "copied" | "none">;
17
+ /** A file name for a download: the URL's own extension when it has one, otherwise a guess by kind. */
18
+ export declare function downloadFilename(id: string, kind: string, src: string): string;
19
+ //# sourceMappingURL=media-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-actions.d.ts","sourceRoot":"","sources":["../src/media-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAehF;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,CAgBnF;AAED,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI9E"}