@crystaldesign/diva-backoffice 26.5.0-beta.23 → 26.5.0-beta.25
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/build/esm/index.js +4174 -1556
- package/build/types/backoffice/src/config/promptTesterOptions.d.ts +6 -4
- package/build/types/backoffice/src/config/promptTesterOptions.d.ts.map +1 -1
- package/build/types/backoffice/src/layout/Detail.d.ts.map +1 -1
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ApiKeyEmptyState.d.ts +5 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ApiKeyEmptyState.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ApiKeyModal.d.ts +11 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ApiKeyModal.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ChatComposer.d.ts +20 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ChatComposer.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ChatThread.d.ts +19 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ChatThread.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ConversationSidebar.d.ts +15 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ConversationSidebar.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/MessageImage.d.ts +12 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/MessageImage.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/apiKey.d.ts +25 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/apiKey.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/gemini.d.ts +81 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/gemini.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/index.d.ts.map +1 -1
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/pricing.d.ts +14 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/pricing.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/conversationsRepo.d.ts +29 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/conversationsRepo.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/db.d.ts +47 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/db.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/imagesRepo.d.ts +22 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/imagesRepo.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/index.d.ts +7 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/index.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/messagesRepo.d.ts +51 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/messagesRepo.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/objectUrlCache.d.ts +5 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/objectUrlCache.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/referencesRepo.d.ts +17 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/referencesRepo.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/types.d.ts +20 -19
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/types.d.ts.map +1 -1
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/useAiChat.d.ts +39 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/useAiChat.d.ts.map +1 -0
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/utils.d.ts +3 -10
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/utils.d.ts.map +1 -1
- package/package.json +10 -9
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/GalleryThumbStrip.d.ts +0 -10
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/GalleryThumbStrip.d.ts.map +0 -1
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/MainGallery.d.ts +0 -12
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/MainGallery.d.ts.map +0 -1
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/TesterControls.d.ts +0 -27
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/TesterControls.d.ts.map +0 -1
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/galleryStorage.d.ts +0 -19
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/galleryStorage.d.ts.map +0 -1
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/referenceImageCache.d.ts +0 -13
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/referenceImageCache.d.ts.map +0 -1
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/useAiPromptImageTester.d.ts +0 -34
- package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/useAiPromptImageTester.d.ts.map +0 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
declare const promptAndAiTesterOptions: {
|
|
2
2
|
aiImageTester: {
|
|
3
|
-
defaultEngine: string;
|
|
4
|
-
engines: string[];
|
|
5
3
|
defaultModel: string;
|
|
6
|
-
modelWithResolutionSelect: string;
|
|
7
|
-
defaultResolution: string;
|
|
8
4
|
models: string[];
|
|
5
|
+
/**
|
|
6
|
+
* Pixel-resolution options consumed by other parts of the app (prompt table filters via
|
|
7
|
+
* {@link ConfigurationStore}). The AI tester now uses Gemini's native `aspectRatio` +
|
|
8
|
+
* `imageSize` knobs instead of these strings, so the array stays for backward-compat
|
|
9
|
+
* but is not read by `AiPromptImageTester`.
|
|
10
|
+
*/
|
|
9
11
|
resolutionOptions: {
|
|
10
12
|
label: string;
|
|
11
13
|
apiValue: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptTesterOptions.d.ts","sourceRoot":"","sources":["../../../../../src/config/promptTesterOptions.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,wBAAwB
|
|
1
|
+
{"version":3,"file":"promptTesterOptions.d.ts","sourceRoot":"","sources":["../../../../../src/config/promptTesterOptions.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,wBAAwB;;;;QAQ1B;;;;;WAKG;;;;;;;CA4BN,CAAC;AAEF,eAAe,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Detail.d.ts","sourceRoot":"","sources":["../../../../../src/layout/Detail.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAkBxE,iBAAS,MAAM,CAAC,EAAE,KAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"Detail.d.ts","sourceRoot":"","sources":["../../../../../src/layout/Detail.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAkBxE,iBAAS,MAAM,CAAC,EAAE,KAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,qBA6O3H;AAED,QAAA,MAAM,kBAAkB;;CAAmB,CAAC;AAC5C,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeyEmptyState.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/ApiKeyEmptyState.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,EAAE,MAAM,IAAI,CAAA;CAAE,qBAkB9E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface Props {
|
|
3
|
+
open: boolean;
|
|
4
|
+
initialKey: string;
|
|
5
|
+
onSave: (key: string) => void;
|
|
6
|
+
onClear: () => void;
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function ApiKeyModal({ open, initialKey, onSave, onClear, onClose }: Props): React.JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ApiKeyModal.d.ts.map
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ApiKeyModal.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeyModal.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/ApiKeyModal.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,qBAqDhF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ConversationSettings, ReferenceImageRecord } from './storage';
|
|
3
|
+
interface Props {
|
|
4
|
+
settings: ConversationSettings;
|
|
5
|
+
onSettingsChange: (patch: Partial<ConversationSettings>) => void;
|
|
6
|
+
refs: ReferenceImageRecord[];
|
|
7
|
+
refUrls: Record<string, string>;
|
|
8
|
+
selectedRefIds: string[];
|
|
9
|
+
toggleRefSelection: (id: string) => void;
|
|
10
|
+
clearRefSelection: () => void;
|
|
11
|
+
onReferenceUpload: (file: File) => boolean;
|
|
12
|
+
onRemoveReference: (id: string) => void;
|
|
13
|
+
pending: boolean;
|
|
14
|
+
onSend: (text: string) => void;
|
|
15
|
+
hasApiKey: boolean;
|
|
16
|
+
onRequestApiKey: () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function ChatComposer({ settings, onSettingsChange, refs, refUrls, selectedRefIds, toggleRefSelection, clearRefSelection, onReferenceUpload, onRemoveReference, pending, onSend, hasApiKey, onRequestApiKey, }: Props): React.JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=ChatComposer.d.ts.map
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ChatComposer.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/ChatComposer.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAoC,MAAM,OAAO,CAAC;AAmBzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE5E,UAAU,KAAK;IACb,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACjE,IAAI,EAAE,oBAAoB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IAC3C,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,gBAAgB,EAChB,IAAI,EACJ,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,EACP,MAAM,EACN,SAAS,EACT,eAAe,GAChB,EAAE,KAAK,qBAmLP"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ChatMessageView } from './types';
|
|
3
|
+
interface Props {
|
|
4
|
+
messages: ChatMessageView[];
|
|
5
|
+
onAbort: (messageId: string) => void;
|
|
6
|
+
onRetry: (messageId: string) => void;
|
|
7
|
+
onDelete: (messageId: string) => void;
|
|
8
|
+
onOpenFullscreen: (initialReadyImageIndex: number) => void;
|
|
9
|
+
hasApiKey: boolean;
|
|
10
|
+
onOpenApiKey: () => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Chat-style timeline. User and assistant turns are rendered as bubbles with their attached
|
|
14
|
+
* images. The fullscreen viewer index is computed by counting all `ready` model images that
|
|
15
|
+
* appear in the thread before the clicked one.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ChatThread({ messages, onAbort, onRetry, onDelete, onOpenFullscreen, hasApiKey, onOpenApiKey }: Props): React.JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=ChatThread.d.ts.map
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ChatThread.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatThread.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/ChatThread.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAyBjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,UAAU,KAAK;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gBAAgB,EAAE,CAAC,sBAAsB,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,qBA8IpH"}
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/ConversationSidebar.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ConversationRecord } from './types';
|
|
3
|
+
interface Props {
|
|
4
|
+
conversations: ConversationRecord[];
|
|
5
|
+
activeId: string | null;
|
|
6
|
+
onSelect: (id: string) => void;
|
|
7
|
+
onNew: () => void;
|
|
8
|
+
onRename: (id: string, title: string) => void;
|
|
9
|
+
onDelete: (id: string) => void;
|
|
10
|
+
hasApiKey: boolean;
|
|
11
|
+
onOpenApiKey: () => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function ConversationSidebar({ conversations, activeId, onSelect, onNew, onRename, onDelete, hasApiKey, onOpenApiKey }: Props): React.JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=ConversationSidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationSidebar.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/ConversationSidebar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAsB3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAoBlD,UAAU,KAAK;IACb,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,qBA4MnI"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Renders a single image inside a message bubble. The URL is already an object URL produced
|
|
4
|
+
* by the message-view layer, so this is a thin wrapper that adds lazy loading and click
|
|
5
|
+
* affordance for opening the fullscreen viewer.
|
|
6
|
+
*/
|
|
7
|
+
export declare function MessageImage({ src, alt, onClick, }: {
|
|
8
|
+
src: string;
|
|
9
|
+
alt?: string;
|
|
10
|
+
onClick?: () => void;
|
|
11
|
+
}): React.JSX.Element;
|
|
12
|
+
//# sourceMappingURL=MessageImage.d.ts.map
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/MessageImage.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageImage.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/MessageImage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,GAAG,EACH,OAAO,GACR,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,qBAYA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini API key persistence (localStorage) plus a small React hook so all
|
|
3
|
+
* components in the AI tester observe the same value and stay in sync across
|
|
4
|
+
* tabs (via the `storage` event).
|
|
5
|
+
*
|
|
6
|
+
* The key is global to the browser profile, not per-organization, since this
|
|
7
|
+
* tool now talks directly to Google's API and bypasses the diva backend.
|
|
8
|
+
*/
|
|
9
|
+
import { GoogleGenAI } from '@google/genai';
|
|
10
|
+
export declare function loadApiKey(): string;
|
|
11
|
+
export declare function saveApiKey(key: string): void;
|
|
12
|
+
export declare function clearApiKey(): void;
|
|
13
|
+
/**
|
|
14
|
+
* React hook that returns the current API key and re-renders when it changes
|
|
15
|
+
* (in this tab via `setApiKey`, or in another tab via the `storage` event).
|
|
16
|
+
*/
|
|
17
|
+
export declare function useApiKey(): {
|
|
18
|
+
apiKey: string;
|
|
19
|
+
hasKey: boolean;
|
|
20
|
+
setApiKey: (next: string) => void;
|
|
21
|
+
clear: () => void;
|
|
22
|
+
};
|
|
23
|
+
/** Build a fresh `GoogleGenAI` client for an API key. Cheap; clients are stateless. */
|
|
24
|
+
export declare function createGeminiClient(apiKey: string): GoogleGenAI;
|
|
25
|
+
//# sourceMappingURL=apiKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiKey.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/apiKey.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK5C,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAM5C;AAED,wBAAgB,WAAW,IAAI,IAAI,CAMlC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CA0BA;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAE9D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin layer over `@google/genai` that turns the AI tester's persisted records
|
|
3
|
+
* into Gemini wire types and runs `models.generateContent`.
|
|
4
|
+
*
|
|
5
|
+
* Multi-turn history is built directly on the client; no backend involved.
|
|
6
|
+
* `thoughtSignature` is round-tripped per Part so models that support
|
|
7
|
+
* "thinking" can resume their internal state across turns.
|
|
8
|
+
*/
|
|
9
|
+
import type { Content, GoogleGenAI, Part } from '@google/genai';
|
|
10
|
+
import type { ChatMessageRecord } from './storage';
|
|
11
|
+
/** Per-record blob payload pre-resolved by the caller, keyed by `imageId`. */
|
|
12
|
+
export type ImagePartBytes = {
|
|
13
|
+
mimeType: string;
|
|
14
|
+
base64: string;
|
|
15
|
+
};
|
|
16
|
+
/** Aspect ratios supported by Gemini image-capable models (per Google docs). */
|
|
17
|
+
export declare const ASPECT_RATIOS_FULL: readonly ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"];
|
|
18
|
+
/** Subset accepted by `gemini-3-pro-image-preview` (no 4:5/5:4 per docs). */
|
|
19
|
+
export declare const ASPECT_RATIOS_COMMON: readonly ["1:1", "2:3", "3:2", "3:4", "4:3", "9:16", "16:9", "21:9"];
|
|
20
|
+
/** All four image sizes — only `gemini-3.1-flash-image-preview` supports `512`. */
|
|
21
|
+
export declare const IMAGE_SIZES_FULL: readonly ["512", "1K", "2K", "4K"];
|
|
22
|
+
/** Sizes for models that don't support `512`. */
|
|
23
|
+
export declare const IMAGE_SIZES_COMMON: readonly ["1K", "2K", "4K"];
|
|
24
|
+
export declare const DEFAULT_ASPECT_RATIO = "1:1";
|
|
25
|
+
export declare const DEFAULT_IMAGE_SIZE = "1K";
|
|
26
|
+
/** Map a model id to the aspect-ratio + image-size options the UI should expose. */
|
|
27
|
+
export declare function optionsForModel(model: string): {
|
|
28
|
+
aspectRatios: readonly string[];
|
|
29
|
+
imageSizes: readonly string[];
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Resolve image bytes for an array of `imageId`s into the `inlineData` shape Gemini expects.
|
|
33
|
+
* Missing IndexedDB rows are skipped silently.
|
|
34
|
+
*/
|
|
35
|
+
export declare function imageIdsToParts(imageIds: string[]): Promise<Part[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Convert persisted user/model records into the `Content[]` the SDK accepts.
|
|
38
|
+
*
|
|
39
|
+
* - User turn: `text` part (if any) followed by attached reference images.
|
|
40
|
+
* - Model turn: the text the model returned (if any, carrying its thought signature)
|
|
41
|
+
* followed by every generated image part (each with its own signature). Both the
|
|
42
|
+
* text and the images are essential for follow-up prompts like "make it bigger";
|
|
43
|
+
* without the model's own narration the model loses awareness of what it did.
|
|
44
|
+
*
|
|
45
|
+
* The current pending model record (no images yet) is skipped — this builds
|
|
46
|
+
* only completed history, the caller appends the new user prompt separately.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildContents(records: ChatMessageRecord[], currentText: string, currentRefImageIds: string[]): Promise<Content[]>;
|
|
49
|
+
export interface GenerateImageOptions {
|
|
50
|
+
ai: GoogleGenAI;
|
|
51
|
+
model: string;
|
|
52
|
+
contents: Content[];
|
|
53
|
+
aspectRatio?: string;
|
|
54
|
+
imageSize?: string;
|
|
55
|
+
/** Gemini sampling temperature (omit for SDK default ~1). */
|
|
56
|
+
temperature?: number;
|
|
57
|
+
signal?: AbortSignal;
|
|
58
|
+
}
|
|
59
|
+
export interface GeneratedImage {
|
|
60
|
+
/** `image/png`, `image/jpeg`, ... */
|
|
61
|
+
mimeType: string;
|
|
62
|
+
/** Base64-encoded image bytes (no `data:` prefix). */
|
|
63
|
+
base64: string;
|
|
64
|
+
/** Optional opaque token for resuming model "thinking" on subsequent turns. */
|
|
65
|
+
thoughtSignature?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface GenerateImageResult {
|
|
68
|
+
images: GeneratedImage[];
|
|
69
|
+
/** Concatenated visible text the model returned alongside the image(s). */
|
|
70
|
+
text?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Signature attached to a non-image part (visible text or pure `thought`). Replayed
|
|
73
|
+
* on the model's text part in subsequent turns so thinking models can resume state.
|
|
74
|
+
*/
|
|
75
|
+
thoughtSignature?: string;
|
|
76
|
+
}
|
|
77
|
+
/** Call `models.generateContent` and pluck the inline image parts from the response. */
|
|
78
|
+
export declare function generateImage(opts: GenerateImageOptions): Promise<GenerateImageResult>;
|
|
79
|
+
/** Convert a `GeneratedImage` into a `Blob` ready for IndexedDB. */
|
|
80
|
+
export declare function generatedImageToBlob(g: GeneratedImage): Blob;
|
|
81
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/gemini.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,OAAO,EAA2B,WAAW,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEzF,OAAO,KAAK,EAAE,iBAAiB,EAAmC,MAAM,WAAW,CAAC;AAGpF,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,oFAWrB,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,sEAAuE,CAAC;AAEzG,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,oCAAqC,CAAC;AACnE,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,6BAA8B,CAAC;AAE9D,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAC1C,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG;IAC9C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAQA;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAQzE;AAUD;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,EAAE,EAC5B,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,OAAO,EAAE,CAAC,CAqBpB;AAaD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,WAAW,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wFAAwF;AACxF,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsC5F;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAK5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/index.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAQtD,QAAA,MAAM,mBAAmB,cAAuB,SAAS;;CA4FvD,CAAC;AAEH,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** USD cost of a single generated output image for the given model + size. */
|
|
2
|
+
export declare function priceForOutputImage(model: string, imageSize: string | undefined): number;
|
|
3
|
+
/** `$0.067`, `$1.234`, `$12.34` — 3 decimals for cents-precision under $1, 2 above. */
|
|
4
|
+
export declare function formatUsd(n: number): string;
|
|
5
|
+
export declare function loadTotalSpend(): number;
|
|
6
|
+
/** Increment the persisted total by `delta` USD. No-op for non-positive values. */
|
|
7
|
+
export declare function addToTotalSpend(delta: number): number;
|
|
8
|
+
export declare function clearTotalSpend(): void;
|
|
9
|
+
/** React hook that subscribes to total-spend changes (same tab and cross-tab). */
|
|
10
|
+
export declare function useTotalSpend(): {
|
|
11
|
+
totalUsd: number;
|
|
12
|
+
clear: () => void;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/pricing.ts"],"names":[],"mappings":"AAsCA,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKxF;AAED,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3C;AAMD,wBAAgB,cAAc,IAAI,MAAM,CAQvC;AAYD,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,kFAAkF;AAClF,wBAAgB,aAAa,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAevE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ConversationSettings {
|
|
2
|
+
model: string;
|
|
3
|
+
/** Gemini `imageConfig.aspectRatio`, e.g. `"1:1"`, `"16:9"`. */
|
|
4
|
+
aspectRatio: string;
|
|
5
|
+
/** Gemini `imageConfig.imageSize`, e.g. `"1K"`, `"2K"`, `"4K"` (and `"512"` on 3.1 Flash). */
|
|
6
|
+
imageSize: string;
|
|
7
|
+
/** Gemini sampling temperature; `undefined` means SDK default. */
|
|
8
|
+
temperature?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ConversationRecord {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
createdAt: number;
|
|
14
|
+
updatedAt: number;
|
|
15
|
+
settings: ConversationSettings;
|
|
16
|
+
}
|
|
17
|
+
export interface NewConversationInput {
|
|
18
|
+
title?: string;
|
|
19
|
+
settings: ConversationSettings;
|
|
20
|
+
id?: string;
|
|
21
|
+
createdAt?: number;
|
|
22
|
+
updatedAt?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function createConversation(input: NewConversationInput): Promise<ConversationRecord>;
|
|
25
|
+
export declare function getConversation(id: string, fallbackModel: string): Promise<ConversationRecord | undefined>;
|
|
26
|
+
export declare function listConversations(fallbackModel: string): Promise<ConversationRecord[]>;
|
|
27
|
+
export declare function updateConversation(id: string, patch: Partial<Omit<ConversationRecord, 'id' | 'createdAt'>>): Promise<ConversationRecord | undefined>;
|
|
28
|
+
export declare function deleteConversation(id: string): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=conversationsRepo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversationsRepo.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/storage/conversationsRepo.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwBD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAWjG;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAKhH;AAED,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAK5F;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAC3D,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAczC;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IndexedDB wrapper for the AI prompt / image tester.
|
|
3
|
+
*
|
|
4
|
+
* Schema (db `diva-backoffice-ai-tester`, version 1):
|
|
5
|
+
* - `images` keyPath `id` Blob payload + mime
|
|
6
|
+
* - `conversations` keyPath `id` chat metadata + per-conversation settings
|
|
7
|
+
* - `messages` keyPath `id` index `byConversationTs` on `[conversationId, ts]`
|
|
8
|
+
* - `referenceImages` keyPath `id` index `byCreatedAt` on `createdAt`
|
|
9
|
+
*
|
|
10
|
+
* Image blobs are kept in their own store and referenced by id from messages /
|
|
11
|
+
* referenceImages so the same blob can be reused without duplication and so a
|
|
12
|
+
* single transaction can clean up dependents.
|
|
13
|
+
*/
|
|
14
|
+
export declare const DB_NAME = "diva-backoffice-ai-tester";
|
|
15
|
+
export declare const DB_VERSION = 1;
|
|
16
|
+
export declare const STORE_IMAGES = "images";
|
|
17
|
+
export declare const STORE_CONVERSATIONS = "conversations";
|
|
18
|
+
export declare const STORE_MESSAGES = "messages";
|
|
19
|
+
export declare const STORE_REFERENCE_IMAGES = "referenceImages";
|
|
20
|
+
export declare const INDEX_MESSAGES_BY_CONVERSATION_TS = "byConversationTs";
|
|
21
|
+
export declare const INDEX_REFERENCES_BY_CREATED_AT = "byCreatedAt";
|
|
22
|
+
/** Lazily open (and upgrade) the database. The same promise is shared across calls. */
|
|
23
|
+
export declare function openDb(): Promise<IDBDatabase>;
|
|
24
|
+
/** Convert IndexedDB request to a promise. */
|
|
25
|
+
export declare function reqAsPromise<T>(req: IDBRequest<T>): Promise<T>;
|
|
26
|
+
/** Resolve when the transaction completes; reject on abort/error. */
|
|
27
|
+
export declare function txDone(tx: IDBTransaction): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Run `work` inside a transaction across one or more stores. The work callback
|
|
30
|
+
* receives the transaction and returns a value; the promise resolves with that
|
|
31
|
+
* value once the transaction completes successfully.
|
|
32
|
+
*/
|
|
33
|
+
export declare function withTx<T>(storeNames: string | string[], mode: IDBTransactionMode, work: (tx: IDBTransaction) => Promise<T> | T): Promise<T>;
|
|
34
|
+
/** Generate a stable, opaque id for new records. */
|
|
35
|
+
export declare function newId(prefix: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Ask the browser once to mark our storage as persistent (so it isn't evicted
|
|
38
|
+
* under disk pressure). Resolves with the granted state. Safe to call from
|
|
39
|
+
* anywhere; subsequent calls share the same promise.
|
|
40
|
+
*/
|
|
41
|
+
export declare function ensurePersistentStorage(): Promise<boolean>;
|
|
42
|
+
/** Best-effort current quota usage. Returns null if the API isn't available. */
|
|
43
|
+
export declare function getStorageEstimate(): Promise<{
|
|
44
|
+
usage: number;
|
|
45
|
+
quota: number;
|
|
46
|
+
} | null>;
|
|
47
|
+
//# sourceMappingURL=db.d.ts.map
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/storage/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,OAAO,8BAA8B,CAAC;AACnD,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,sBAAsB,oBAAoB,CAAC;AAExD,eAAO,MAAM,iCAAiC,qBAAqB,CAAC;AACpE,eAAO,MAAM,8BAA8B,gBAAgB,CAAC;AAI5D,uFAAuF;AACvF,wBAAgB,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,CA0B7C;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAK9D;AAED,qEAAqE;AACrE,wBAAgB,MAAM,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxD;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,EAC7B,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAC3C,OAAO,CAAC,CAAC,CAAC,CAMZ;AAED,oDAAoD;AACpD,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK5C;AAID;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAkB1D;AAED,gFAAgF;AAChF,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAW3F"}
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/imagesRepo.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ImageRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
blob: Blob;
|
|
4
|
+
mime: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
/** Opaque base64 Gemini "thinking" token; replayed in subsequent turns when set. */
|
|
7
|
+
thoughtSignature?: string;
|
|
8
|
+
/**
|
|
9
|
+
* USD billed for generating this output image, captured at generation time so the
|
|
10
|
+
* cost shown in the UI never drifts when Google updates its pricing. Absent for
|
|
11
|
+
* uploaded reference images (which aren't billed by us) and for older records.
|
|
12
|
+
*/
|
|
13
|
+
costUsd?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function putImageBlob(blob: Blob, mime?: string, thoughtSignature?: string, costUsd?: number): Promise<string>;
|
|
16
|
+
export declare function getImage(id: string): Promise<ImageRecord | undefined>;
|
|
17
|
+
export declare function deleteImages(ids: string[]): Promise<void>;
|
|
18
|
+
/** Convert a `data:` URL into a Blob, used by reference uploads. */
|
|
19
|
+
export declare function dataUrlToBlob(dataUrl: string): Blob;
|
|
20
|
+
/** Convert a Blob into a `data:` URL (used to feed inline image bytes to Gemini). */
|
|
21
|
+
export declare function blobToDataUrl(blob: Blob): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=imagesRepo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imagesRepo.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/storage/imagesRepo.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAI3E;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/D;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAanD;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUzD"}
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/storage/index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export type ModelMessageStatus = 'pending' | 'ready' | 'error';
|
|
2
|
+
export interface UserMessageRecord {
|
|
3
|
+
kind: 'user';
|
|
4
|
+
id: string;
|
|
5
|
+
conversationId: string;
|
|
6
|
+
ts: number;
|
|
7
|
+
text: string;
|
|
8
|
+
/** Ids in the `images` store for any reference images attached to this turn. */
|
|
9
|
+
uploadedImageIds: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface ModelMessageRecord {
|
|
12
|
+
kind: 'model';
|
|
13
|
+
id: string;
|
|
14
|
+
conversationId: string;
|
|
15
|
+
ts: number;
|
|
16
|
+
status: ModelMessageStatus;
|
|
17
|
+
/** Correlates the in-flight HTTP request to the persisted row. */
|
|
18
|
+
requestId: string;
|
|
19
|
+
/** Generated image ids in the `images` store (one or more per generation). */
|
|
20
|
+
imageIds: string[];
|
|
21
|
+
/** Prompt that was sent for this generation; mirrors the preceding user message. */
|
|
22
|
+
promptText: string;
|
|
23
|
+
/**
|
|
24
|
+
* Text the model returned alongside the generated image(s), if any. Replayed in
|
|
25
|
+
* subsequent turns so the model retains awareness of what it previously said.
|
|
26
|
+
*/
|
|
27
|
+
responseText?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Opaque base64 "thinking" signature attached to the model's text/thought part.
|
|
30
|
+
* Replayed in subsequent turns so thinking models can resume their internal state.
|
|
31
|
+
* (Per-image signatures live on each `ImageRecord.thoughtSignature` instead.)
|
|
32
|
+
*/
|
|
33
|
+
responseThoughtSignature?: string;
|
|
34
|
+
resolutionCaption: string;
|
|
35
|
+
temperatureCaption: string;
|
|
36
|
+
errorMessage?: string;
|
|
37
|
+
}
|
|
38
|
+
export type ChatMessageRecord = UserMessageRecord | ModelMessageRecord;
|
|
39
|
+
export declare function listMessages(conversationId: string): Promise<ChatMessageRecord[]>;
|
|
40
|
+
export declare function putUserMessage(input: Omit<UserMessageRecord, 'kind' | 'id' | 'ts'> & {
|
|
41
|
+
id?: string;
|
|
42
|
+
ts?: number;
|
|
43
|
+
}): Promise<UserMessageRecord>;
|
|
44
|
+
export declare function putModelMessage(input: Omit<ModelMessageRecord, 'kind' | 'id' | 'ts'> & {
|
|
45
|
+
id?: string;
|
|
46
|
+
ts?: number;
|
|
47
|
+
}): Promise<ModelMessageRecord>;
|
|
48
|
+
export declare function patchModelMessage(id: string, patch: Partial<Omit<ModelMessageRecord, 'kind' | 'id' | 'conversationId' | 'ts'>>): Promise<ModelMessageRecord | undefined>;
|
|
49
|
+
export declare function deleteMessage(id: string): Promise<void>;
|
|
50
|
+
export declare function deleteAllMessagesForConversation(conversationId: string): Promise<void>;
|
|
51
|
+
//# sourceMappingURL=messagesRepo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messagesRepo.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/storage/messagesRepo.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAEvE,wBAAsB,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAMvF;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWpJ;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACnF,OAAO,CAAC,kBAAkB,CAAC,CAkB7B;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAAC,GAChF,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAYzC;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7D;AAED,wBAAsB,gCAAgC,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5F"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function setObjectUrlCacheCapacity(n: number): void;
|
|
2
|
+
export declare function getObjectUrl(imageId: string): Promise<string | null>;
|
|
3
|
+
export declare function revokeObjectUrl(imageId: string): void;
|
|
4
|
+
export declare function clearObjectUrlCache(): void;
|
|
5
|
+
//# sourceMappingURL=objectUrlCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectUrlCache.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/storage/objectUrlCache.ts"],"names":[],"mappings":"AAsBA,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAGzD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBpE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKrD;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ReferenceImageRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
imageId: string;
|
|
4
|
+
fileName?: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
}
|
|
7
|
+
/** Upper bound for the recent-references picker; mirrors the previous localStorage cap. */
|
|
8
|
+
export declare const MAX_REFERENCE_RECORDS = 5;
|
|
9
|
+
export declare function listReferences(): Promise<ReferenceImageRecord[]>;
|
|
10
|
+
export declare function addReference(input: {
|
|
11
|
+
imageId: string;
|
|
12
|
+
fileName?: string;
|
|
13
|
+
createdAt?: number;
|
|
14
|
+
id?: string;
|
|
15
|
+
}): Promise<ReferenceImageRecord>;
|
|
16
|
+
export declare function deleteReference(id: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=referencesRepo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referencesRepo.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/storage/referencesRepo.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2FAA2F;AAC3F,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,wBAAsB,cAAc,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAMtE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAUhJ;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D"}
|
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
import type { ConversationRecord, ConversationSettings } from './storage';
|
|
2
|
+
import type { ChatMessageRecord, ModelMessageRecord, UserMessageRecord } from './storage';
|
|
3
|
+
export type { ConversationRecord, ConversationSettings, ChatMessageRecord, ModelMessageRecord, UserMessageRecord };
|
|
4
|
+
/**
|
|
5
|
+
* View model for the fullscreen viewer. The chat thread converts ready model messages into
|
|
6
|
+
* one slide per generated image.
|
|
7
|
+
*/
|
|
8
|
+
export interface GalleryFullscreenSlide {
|
|
2
9
|
imageUrl: string;
|
|
3
10
|
promptText: string;
|
|
4
11
|
startedAt: number;
|
|
5
12
|
createdAt: number;
|
|
6
13
|
resolutionCaption: string;
|
|
7
|
-
/** Label for temperature used for this generation (Gemini only; empty for OpenAI). */
|
|
8
14
|
temperatureCaption: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
startedAt: number;
|
|
22
|
-
createdAt: number;
|
|
23
|
-
resolutionCaption: string;
|
|
24
|
-
temperatureCaption: string;
|
|
25
|
-
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* UI-side message representation. Adds resolved object URLs for any image ids so React
|
|
18
|
+
* components can render without async resolution per render.
|
|
19
|
+
*/
|
|
20
|
+
export type ChatMessageView = (UserMessageRecord & {
|
|
21
|
+
uploadedImageUrls: string[];
|
|
22
|
+
}) | (ModelMessageRecord & {
|
|
23
|
+
imageUrls: string[];
|
|
24
|
+
/** USD billed per generated image, parallel to `imageUrls`; `0` if unknown. */
|
|
25
|
+
imageCostsUsd: number[];
|
|
26
|
+
});
|
|
26
27
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE1F,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;AAEnH;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,CAAC,iBAAiB,GAAG;IAAE,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GACrD,CAAC,kBAAkB,GAAG;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,+EAA+E;IAC/E,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Fullscreen } from '@crystaldesign/diva-core';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { type ConversationRecord, type ConversationSettings, type ReferenceImageRecord } from './storage';
|
|
4
|
+
import type { ChatMessageView } from './types';
|
|
5
|
+
/** Runaway-protection floor on history depth. Normal iterative use never reaches it. */
|
|
6
|
+
export declare const MAX_HISTORY_TURNS = 50;
|
|
7
|
+
export declare function useAiChat(openFullscreen: (opts: Fullscreen) => void): {
|
|
8
|
+
bootstrapped: boolean;
|
|
9
|
+
conversations: ConversationRecord[];
|
|
10
|
+
activeConversation: ConversationRecord | null;
|
|
11
|
+
activeConversationId: string | null;
|
|
12
|
+
setActiveConversationId: React.Dispatch<React.SetStateAction<string | null>>;
|
|
13
|
+
newConversation: () => Promise<void>;
|
|
14
|
+
renameConversation: (id: string, title: string) => Promise<void>;
|
|
15
|
+
deleteConversation: (id: string) => Promise<void>;
|
|
16
|
+
updateActiveSettings: (patch: Partial<ConversationSettings>) => Promise<void>;
|
|
17
|
+
messages: ChatMessageView[];
|
|
18
|
+
sendMessage: (text: string) => Promise<void>;
|
|
19
|
+
abortMessage: (modelMessageId: string) => void;
|
|
20
|
+
retryMessage: (modelMessageId: string) => Promise<void>;
|
|
21
|
+
deleteMessage: (modelMessageId: string) => Promise<void>;
|
|
22
|
+
openImageFullscreen: (initialReadyIndex: number) => void;
|
|
23
|
+
refs: ReferenceImageRecord[];
|
|
24
|
+
refUrls: Record<string, string>;
|
|
25
|
+
selectedRefIds: string[];
|
|
26
|
+
toggleRefSelection: (id: string) => void;
|
|
27
|
+
clearRefSelection: () => void;
|
|
28
|
+
selectAllRefs: () => void;
|
|
29
|
+
onReferenceUpload: (file: File) => false;
|
|
30
|
+
removeReference: (id: string) => Promise<void>;
|
|
31
|
+
apiKey: string;
|
|
32
|
+
hasKey: boolean;
|
|
33
|
+
setApiKey: (next: string) => void;
|
|
34
|
+
clearApiKey: () => void;
|
|
35
|
+
apiKeyModalOpen: boolean;
|
|
36
|
+
openApiKeyModal: () => void;
|
|
37
|
+
closeApiKeyModal: () => void;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=useAiChat.d.ts.map
|
package/build/types/backoffice/src/layout/Toolbar/Tools/AiPromptImageTester/useAiChat.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAiChat.d.ts","sourceRoot":"","sources":["../../../../../../../../src/layout/Toolbar/Tools/AiPromptImageTester/useAiChat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,KAA4D,MAAM,OAAO,CAAC;AAajF,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAoB1B,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,eAAe,EAA0B,MAAM,SAAS,CAAC;AAKvE,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAepC,wBAAgB,SAAS,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI;;;;;;;6BAoGhB,MAAM,SAAS,MAAM;6BAO1D,MAAM;kCAkBH,OAAO,CAAC,oBAAoB,CAAC;;wBAkD9B,MAAM;mCA+G6B,MAAM;mCAM/B,MAAM;oCASN,MAAM;6CAaT,MAAM;;;;6BA/JgB,MAAM;;;8BApBL,IAAI;0BA2BF,MAAM;;;;;;;;EAkNtD"}
|