@admin-layout/ai-chat-ext-browser 12.2.5-alpha.15 → 12.2.5-alpha.21
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/lib/components/MessageWidgets/MessageMedia.d.ts.map +1 -1
- package/lib/components/MessageWidgets/MessageMedia.js +4 -4
- package/lib/components/MessageWidgets/MessageMedia.js.map +1 -1
- package/lib/components/MessageWidgets/mediaUtils.d.ts.map +1 -1
- package/lib/components/MessageWidgets/mediaUtils.js +3 -10
- package/lib/components/MessageWidgets/mediaUtils.js.map +1 -1
- package/lib/utils/mediaAttachment.d.ts +46 -0
- package/lib/utils/mediaAttachment.d.ts.map +1 -0
- package/lib/utils/mediaAttachment.js +135 -0
- package/lib/utils/mediaAttachment.js.map +1 -0
- package/lib/utils/parseWidgetPost.d.ts.map +1 -1
- package/lib/utils/parseWidgetPost.js +19 -9
- package/lib/utils/parseWidgetPost.js.map +1 -1
- package/package.json +2 -2
- package/lib/utils/parseWidgetPost.spec.d.ts +0 -2
- package/lib/utils/parseWidgetPost.spec.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageMedia.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageMedia.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAc/B,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAaD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,kBAAkB,sBA2IrD,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React,{useState}from'react';import {FiImage}from'@react-icons/all-files/fi/FiImage.js';import {FiVideo}from'@react-icons/all-files/fi/FiVideo.js';import {FiMusic}from'@react-icons/all-files/fi/FiMusic.js';import {FiDownload}from'@react-icons/all-files/fi/FiDownload.js';import {FiExternalLink}from'@react-icons/all-files/fi/FiExternalLink.js';import {FiCopy}from'@react-icons/all-files/fi/FiCopy.js';import {FiCheck}from'@react-icons/all-files/fi/FiCheck.js';import {MediaAsset}from'@admin-layout/connector-widgets-browser';import {deriveMediaItems,MEDIA_KIND_LABEL,formatAttribution,formatDimensions,formatDuration,formatMediaFormat}from'./mediaUtils.js';const KIND_ICON = {
|
|
1
|
+
import React,{useState}from'react';import {FiImage}from'@react-icons/all-files/fi/FiImage.js';import {FiVideo}from'@react-icons/all-files/fi/FiVideo.js';import {FiMusic}from'@react-icons/all-files/fi/FiMusic.js';import {FiDownload}from'@react-icons/all-files/fi/FiDownload.js';import {FiExternalLink}from'@react-icons/all-files/fi/FiExternalLink.js';import {FiCopy}from'@react-icons/all-files/fi/FiCopy.js';import {FiCheck}from'@react-icons/all-files/fi/FiCheck.js';import {MediaAsset}from'@admin-layout/connector-widgets-browser';import {mediaContentsAttachment}from'../../utils/mediaAttachment.js';import {deriveMediaItems,MEDIA_KIND_LABEL,formatAttribution,formatDimensions,formatDuration,formatMediaFormat}from'./mediaUtils.js';const KIND_ICON = {
|
|
2
2
|
image: React.createElement(FiImage, {
|
|
3
3
|
className: "w-3.5 h-3.5"
|
|
4
4
|
}),
|
|
@@ -30,9 +30,9 @@ const MessageMedia = props => {
|
|
|
30
30
|
index,
|
|
31
31
|
onMessageClick
|
|
32
32
|
} = props;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
// `contents.attachment`, or a result the agent wrote straight into `contents` (gated on an
|
|
34
|
+
// http(s) url), with `kind` filled in from `mediaType` / `type` / the file ending.
|
|
35
|
+
const attachment = mediaContentsAttachment(message.propsConfiguration?.contents);
|
|
36
36
|
const [assetMeta, setAssetMeta] = useState({});
|
|
37
37
|
const [copied, setCopied] = useState(false);
|
|
38
38
|
if (!attachment || !attachment.url) return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageMedia.js","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MessageMedia.js","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaUtils.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/mediaUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"mediaUtils.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/mediaUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGxE,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAE1C,uCAAuC;AACvC,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAItD,CAAC;AAeF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,YAAY,yBAAyB,KAAG,SAAS,EAcjF,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,KAAG,MAAM,GAAG,SAM1D,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,SAAS,MAAM,KAAG,MAAM,GAAG,SACtB,CAAC;AAUvD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,MAAM,GAAG,SAMjF,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,GAAI,YAAY,yBAAyB,KAAG,MAAM,GAAG,SAGlF,CAAC"}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import {mediaKindOf,mediaKindFromPath}from'../../utils/mediaAttachment.js';/** Human label for each asset kind. */
|
|
2
2
|
const MEDIA_KIND_LABEL = {
|
|
3
3
|
image: 'Image',
|
|
4
4
|
video: 'Video',
|
|
5
5
|
audio: 'Audio'
|
|
6
6
|
};
|
|
7
|
-
/** Extensions worth recognising when an item names no kind — the rest fall through to image. */
|
|
8
|
-
const VIDEO_EXTENSIONS = ['mp4', 'webm', 'mov', 'm4v', 'mkv'];
|
|
9
|
-
const AUDIO_EXTENSIONS = ['mp3', 'wav', 'ogg', 'm4a', 'aac', 'flac'];
|
|
10
7
|
/**
|
|
11
8
|
* The kind an item renders as. `MediaAsset` picks `<img>` for anything it does not
|
|
12
9
|
* recognise, so an item that names no kind renders a clip or a track as a broken
|
|
@@ -16,12 +13,8 @@ const AUDIO_EXTENSIONS = ['mp3', 'wav', 'ogg', 'm4a', 'aac', 'flac'];
|
|
|
16
13
|
const itemKind = (item, attachment) => {
|
|
17
14
|
if (item.kind) return item.kind;
|
|
18
15
|
if (attachment.kind) return attachment.kind;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const ext = item.url?.split(/[?#]/)[0]?.split('.').pop()?.toLowerCase() ?? '';
|
|
22
|
-
if (VIDEO_EXTENSIONS.includes(ext)) return 'video';
|
|
23
|
-
if (AUDIO_EXTENSIONS.includes(ext)) return 'audio';
|
|
24
|
-
return 'image';
|
|
16
|
+
// Anything unrecognised falls through to image.
|
|
17
|
+
return mediaKindOf(item.mimeType) ?? mediaKindFromPath(item.url) ?? 'image';
|
|
25
18
|
};
|
|
26
19
|
/**
|
|
27
20
|
* Normalise an attachment into a flat list of assets. Agents emit two shapes:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaUtils.js","sources":["../../../src/components/MessageWidgets/mediaUtils.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mediaUtils.js","sources":["../../../src/components/MessageWidgets/mediaUtils.ts"],"sourcesContent":[null],"names":[],"mappings":"2EAKA;AACO,MAAM,gBAAgB,GAA8B;AACvD,EAAA,KAAA,EAAK,OAAE;AACP,EAAA,KAAA,EAAK,OAAE;AACP,EAAA,KAAA,EAAK;;AAGT;;;;;AAKG;AACH,MAAM,QAAQ,GAAG,CAAC,IAAe,EAAE,UAAqC,KAAe;MACnF,IAAI,CAAA,IAAK,EAAI,OAAA,IAAA,CAAA,IAAA;gBAAS,CAAA,IAAK,EAAA,OAAK,UAAA,CAAA,IAAA;;SACX,WAAO,CAAA,IAAU,CAAC,QAAK,CAAA,IAAA,iBAAA,CAAA,IAAA,CAAA,GAAA,CAAA,IAAA,OAAA;;AAE5C;AACJ;AAEA;;;AAGG,EAAA,IAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,KAAA,CAAA,IAAA,UAAA,CAAA,KAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACH,IAAA,OAAO,UAAM,CAAA,KAAA,CAAA,IAAmB,IAAC,KAAA;AAC7B,MAAA,OAAS;UACL,EAAA,QAAO,CAAA,IAAU,EAAC,UAAW;KAChC,CAAA,CAAA;;AACoB,EAAA,IAAA,CAAA,UAAS,CAAC,GAAA,EAAA,OAAA,EAAA;SAC/B,CAAA;AACI,IAAA,IAAA,EAAA,QAAA,CAAA,UAAA,EAAA,UAAA,CAAA;AACI,IAAA,GAAA,EAAA,UAAM,CAAA,GAAA;qBACD,CAAA,KAAU;YACf,EAAA,UAAO,CAAA,QAAW;aAClB,EAAA,UAAU,CAAA;;AAEb;;AAEP,MAAA,cAAA,GAAA,OAAA,IAAA;AAEF,EAAA,IAAA,OAAA,IAAA,IAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,IAAA,OAAA,GAAA,CAAA,EAAA,OAAA,SAAmF;AACnF,EAAA,MAAO,KAAM,GAAA,IAAA,CAAA,KAAA,CAAc,OAAI,CAAA;AAC3B,EAAA,MAAI,OAAO,GAAA,IAAI,CAAI,KAAK,CAAA,KAAM,GAAC,EAAA,CAAA;AAAkC,EAAA,MAAA,IAAA,GAAO,UAAU;SAClF,CAAM,EAAA,OAAQ,CAAA,CAAA,EAAK,KAAK,QAAQ,EAAE,CAAA,QAAA,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA;;AAElC;AACO,MAAA,gBAAkB,GAAC,CAAA,KAAQ,EAAE,MAAC,KAAU,KAAK,IAAI,MAAA,GAAA,CAAA,EAAA,KAAA,CAAA,CAAA,EAAA,MAAA,CAAA,CAAA,GAAA;AAC5D;AAEA,MAAA,cAAA,GAAA;AACA,EAAA,SAAO,EAAM,KAAA;AAGb,EAAA,YAAA,EAAA,KAAA;AACA,EAAA,IAAM;AACF,EAAA,SAAA,EAAS;AACT,CAAA;AACA;AACA;;AAGJ;;;AAGG,EAAA,IAAA,CAAA,GAAA,EAAA,OAAA,SAAA;AACH,EAAA,sBAAa,CAAA,GAAA,CAAA,IAAoB,GAAC,EAAA,WAAmB,EAAA;;AAG7C;AACI,MAAA,iBAAA,GAAA,UAAA,IAAA;AAAE,EAAA,MAAA,KAAA,cAAiB,CAAA,SAAA,EAAA,UAAA,CAAA,KAAA,CAAA,CAAA,MAAA,CAAA,OAAA,CAAA;SAC3B,KAAQ,CAAA,MAAA,GAAA,KAAe,CAAG,IAAC,CAAI,KAAK,CAAA,GAAA,SAAa;AACrD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one reader of a `media` widget's payload, whatever shape the agent wrote it in.
|
|
3
|
+
*
|
|
4
|
+
* `MessageMedia` reads `propsConfiguration.contents.attachment.{kind,url,title}`. The model
|
|
5
|
+
* drifts from that: it puts the result straight in `contents` (or on `propsConfiguration`, or
|
|
6
|
+
* the envelope itself), and names the kind `mediaType` or `type`. Read strictly, the post had no
|
|
7
|
+
* attachment and the card drew nothing. These helpers take each shape to the canonical one, and
|
|
8
|
+
* still refuse a payload with no http(s) `url`, so a stray object never becomes a card.
|
|
9
|
+
*/
|
|
10
|
+
export type MediaKind = 'image' | 'video' | 'audio';
|
|
11
|
+
type Json = Record<string, unknown>;
|
|
12
|
+
export declare function isRecord(value: unknown): value is Json;
|
|
13
|
+
/** An absolute http(s) address. */
|
|
14
|
+
export declare function isHttpUrl(value: unknown): value is string;
|
|
15
|
+
/** `image` / `video` / `audio`, or a mime type of one (`image/jpeg`); anything else is no kind. */
|
|
16
|
+
export declare function mediaKindOf(value: unknown): MediaKind | undefined;
|
|
17
|
+
/** The kind an address's file ending names (query and fragment ignored; relative paths too). */
|
|
18
|
+
export declare function mediaKindFromPath(url: unknown): MediaKind | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* A media result's `kind` and `title`, read from any of the names the agent uses for them:
|
|
21
|
+
* `kind`, `mediaType`, `type` or `mimeType`, else the address's file ending; `title`,
|
|
22
|
+
* `caption` or `alt`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function mediaFields(source: Json): {
|
|
25
|
+
kind?: MediaKind;
|
|
26
|
+
title?: string;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* A media attachment as the card reads it: a top-level `url` (lifted from `items[0]` when only
|
|
30
|
+
* that has one), and `kind` / `title` filled in from whatever names the agent used.
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeMediaAttachment(attachment: Json): Json;
|
|
33
|
+
/**
|
|
34
|
+
* A media envelope's attachment: the canonical `propsConfiguration.contents.attachment` (or a
|
|
35
|
+
* bare `attachment`), else the first of `contents`, `propsConfiguration` or the envelope itself
|
|
36
|
+
* that holds an http(s) `url`. Normalized; null when there is none.
|
|
37
|
+
*/
|
|
38
|
+
export declare function mediaEnvelopeAttachment(envelope: Json): Json | null;
|
|
39
|
+
/**
|
|
40
|
+
* A media post's attachment from its `propsConfiguration.contents`: `contents.attachment`, or
|
|
41
|
+
* `contents` itself when the result was stored there flat with an http(s) `url`. Normalized;
|
|
42
|
+
* null when there is none.
|
|
43
|
+
*/
|
|
44
|
+
export declare function mediaContentsAttachment(contents: unknown): Json | null;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=mediaAttachment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaAttachment.d.ts","sourceRoot":"","sources":["../../src/utils/mediaAttachment.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAmCpC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAEtD;AAED,mCAAmC;AACnC,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAQzD;AAED,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAIjE;AAED,gGAAgG;AAChG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAIrE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ9E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAc/D;AASD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAQnE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAItE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one reader of a `media` widget's payload, whatever shape the agent wrote it in.
|
|
3
|
+
*
|
|
4
|
+
* `MessageMedia` reads `propsConfiguration.contents.attachment.{kind,url,title}`. The model
|
|
5
|
+
* drifts from that: it puts the result straight in `contents` (or on `propsConfiguration`, or
|
|
6
|
+
* the envelope itself), and names the kind `mediaType` or `type`. Read strictly, the post had no
|
|
7
|
+
* attachment and the card drew nothing. These helpers take each shape to the canonical one, and
|
|
8
|
+
* still refuse a payload with no http(s) `url`, so a stray object never becomes a card.
|
|
9
|
+
*/
|
|
10
|
+
const MEDIA_KINDS = new Set(['image', 'video', 'audio']);
|
|
11
|
+
/** File endings that name a kind when the payload names none. */
|
|
12
|
+
const KIND_BY_EXTENSION = {
|
|
13
|
+
png: 'image',
|
|
14
|
+
jpg: 'image',
|
|
15
|
+
jpeg: 'image',
|
|
16
|
+
gif: 'image',
|
|
17
|
+
webp: 'image',
|
|
18
|
+
avif: 'image',
|
|
19
|
+
bmp: 'image',
|
|
20
|
+
svg: 'image',
|
|
21
|
+
heic: 'image',
|
|
22
|
+
heif: 'image',
|
|
23
|
+
mp4: 'video',
|
|
24
|
+
webm: 'video',
|
|
25
|
+
mov: 'video',
|
|
26
|
+
m4v: 'video',
|
|
27
|
+
mkv: 'video',
|
|
28
|
+
ogv: 'video',
|
|
29
|
+
mp3: 'audio',
|
|
30
|
+
wav: 'audio',
|
|
31
|
+
ogg: 'audio',
|
|
32
|
+
oga: 'audio',
|
|
33
|
+
m4a: 'audio',
|
|
34
|
+
aac: 'audio',
|
|
35
|
+
flac: 'audio',
|
|
36
|
+
opus: 'audio'
|
|
37
|
+
};
|
|
38
|
+
/** Keys of an envelope (or its configuration) that are wrapping, not the result. */
|
|
39
|
+
const WRAPPER_KEYS = new Set(['propsComponent', 'propsConfiguration', 'contents', 'attachment']);
|
|
40
|
+
function isRecord(value) {
|
|
41
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
42
|
+
}
|
|
43
|
+
/** An absolute http(s) address. */
|
|
44
|
+
function isHttpUrl(value) {
|
|
45
|
+
if (typeof value !== 'string') return false;
|
|
46
|
+
try {
|
|
47
|
+
const {
|
|
48
|
+
protocol
|
|
49
|
+
} = new URL(value.trim());
|
|
50
|
+
return protocol === 'https:' || protocol === 'http:';
|
|
51
|
+
} catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** `image` / `video` / `audio`, or a mime type of one (`image/jpeg`); anything else is no kind. */
|
|
56
|
+
function mediaKindOf(value) {
|
|
57
|
+
if (typeof value !== 'string') return undefined;
|
|
58
|
+
const [kind] = value.trim().toLowerCase().split('/');
|
|
59
|
+
return MEDIA_KINDS.has(kind) ? kind : undefined;
|
|
60
|
+
}
|
|
61
|
+
/** The kind an address's file ending names (query and fragment ignored; relative paths too). */
|
|
62
|
+
function mediaKindFromPath(url) {
|
|
63
|
+
if (typeof url !== 'string') return undefined;
|
|
64
|
+
const ext = /\.([a-z0-9]+)$/i.exec(url.trim().split(/[?#]/)[0])?.[1]?.toLowerCase();
|
|
65
|
+
return ext ? KIND_BY_EXTENSION[ext] : undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A media result's `kind` and `title`, read from any of the names the agent uses for them:
|
|
69
|
+
* `kind`, `mediaType`, `type` or `mimeType`, else the address's file ending; `title`,
|
|
70
|
+
* `caption` or `alt`.
|
|
71
|
+
*/
|
|
72
|
+
function mediaFields(source) {
|
|
73
|
+
const kind = [source.kind, source.mediaType, source.type, source.mimeType].map(mediaKindOf).find(Boolean) ?? mediaKindFromPath(source.url);
|
|
74
|
+
const title = [source.title, source.caption, source.alt].find(v => typeof v === 'string' && !!v.trim());
|
|
75
|
+
return {
|
|
76
|
+
...(kind ? {
|
|
77
|
+
kind
|
|
78
|
+
} : {}),
|
|
79
|
+
...(title ? {
|
|
80
|
+
title
|
|
81
|
+
} : {})
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* A media attachment as the card reads it: a top-level `url` (lifted from `items[0]` when only
|
|
86
|
+
* that has one), and `kind` / `title` filled in from whatever names the agent used.
|
|
87
|
+
*/
|
|
88
|
+
function normalizeMediaAttachment(attachment) {
|
|
89
|
+
const first = !attachment.url && Array.isArray(attachment.items) ? attachment.items[0] : undefined;
|
|
90
|
+
const lifted = isRecord(first) && first.url ? {
|
|
91
|
+
...attachment,
|
|
92
|
+
url: first.url,
|
|
93
|
+
...(attachment.kind ?? first.kind ? {
|
|
94
|
+
kind: attachment.kind ?? first.kind
|
|
95
|
+
} : {}),
|
|
96
|
+
...(attachment.mimeType ?? first.mimeType ? {
|
|
97
|
+
mimeType: attachment.mimeType ?? first.mimeType
|
|
98
|
+
} : {})
|
|
99
|
+
} : attachment;
|
|
100
|
+
return {
|
|
101
|
+
...lifted,
|
|
102
|
+
...mediaFields(lifted)
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** `candidate` without its wrapping keys, when it holds an http(s) `url`; else null. */
|
|
106
|
+
function flatResult(candidate) {
|
|
107
|
+
if (!isRecord(candidate) || !isHttpUrl(candidate.url)) return null;
|
|
108
|
+
const result = Object.fromEntries(Object.entries(candidate).filter(([key]) => !WRAPPER_KEYS.has(key)));
|
|
109
|
+
return {
|
|
110
|
+
...result,
|
|
111
|
+
url: candidate.url.trim()
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* A media envelope's attachment: the canonical `propsConfiguration.contents.attachment` (or a
|
|
116
|
+
* bare `attachment`), else the first of `contents`, `propsConfiguration` or the envelope itself
|
|
117
|
+
* that holds an http(s) `url`. Normalized; null when there is none.
|
|
118
|
+
*/
|
|
119
|
+
function mediaEnvelopeAttachment(envelope) {
|
|
120
|
+
const config = isRecord(envelope.propsConfiguration) ? envelope.propsConfiguration : undefined;
|
|
121
|
+
const contents = config && isRecord(config.contents) ? config.contents : undefined;
|
|
122
|
+
const canonical = contents?.attachment ?? envelope.attachment;
|
|
123
|
+
const found = isRecord(canonical) ? canonical : flatResult(contents) ?? flatResult(config) ?? flatResult(envelope);
|
|
124
|
+
return found ? normalizeMediaAttachment(found) : null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A media post's attachment from its `propsConfiguration.contents`: `contents.attachment`, or
|
|
128
|
+
* `contents` itself when the result was stored there flat with an http(s) `url`. Normalized;
|
|
129
|
+
* null when there is none.
|
|
130
|
+
*/
|
|
131
|
+
function mediaContentsAttachment(contents) {
|
|
132
|
+
if (!isRecord(contents)) return null;
|
|
133
|
+
const found = isRecord(contents.attachment) ? contents.attachment : flatResult(contents);
|
|
134
|
+
return found ? normalizeMediaAttachment(found) : null;
|
|
135
|
+
}export{isHttpUrl,isRecord,mediaContentsAttachment,mediaEnvelopeAttachment,mediaFields,mediaKindFromPath,mediaKindOf,normalizeMediaAttachment};//# sourceMappingURL=mediaAttachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaAttachment.js","sources":["../../src/utils/mediaAttachment.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseWidgetPost.d.ts","sourceRoot":"","sources":["../../src/utils/parseWidgetPost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"parseWidgetPost.d.ts","sourceRoot":"","sources":["../../src/utils/parseWidgetPost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAuD/B;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,CAoClD"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import {mediaEnvelopeAttachment}from'./mediaAttachment.js';/**
|
|
2
2
|
* Fill names ai-chat-ext registers (see module.ts). A widget block's `propsComponent`
|
|
3
3
|
* must match one of these for the post to be promoted into a typed widget.
|
|
4
4
|
*/
|
|
5
5
|
const KNOWN_FILL_NAMES = new Set(['media', 'travel', 'workflow', 'aiassistant', 'thinking', 'codeblock', 'tooluse', 'service', 'connector', 'shopping', 'movies', 'jobs', 'resume']);
|
|
6
|
-
/**
|
|
7
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Matches a fenced code block, capturing its inner body. Language tag optional: ```json, or
|
|
8
|
+
* ```yantra:widget (the agent's own label, which a letters-only tag split at the colon).
|
|
9
|
+
*/
|
|
10
|
+
const FENCED_BLOCK = /```(?:[a-zA-Z][\w:-]*)?\s*([\s\S]*?)```/g;
|
|
8
11
|
/**
|
|
9
12
|
* Find the first fenced block whose JSON has a string `propsComponent`. Returns the parsed
|
|
10
13
|
* envelope and the exact matched block text (so the caller can strip it from the message).
|
|
@@ -49,16 +52,23 @@ function parseWidgetPost(post) {
|
|
|
49
52
|
block
|
|
50
53
|
} = found;
|
|
51
54
|
if (!KNOWN_FILL_NAMES.has(envelope.propsComponent.toLowerCase())) return post;
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
const type = envelope.propsComponent.toLowerCase();
|
|
56
|
+
let contents = envelope.propsConfiguration?.contents;
|
|
57
|
+
if (type === 'media') {
|
|
58
|
+
// MessageMedia reads `contents.attachment.{kind,url,title}`; the agent also writes the
|
|
59
|
+
// result straight in `contents` (or higher) and names the kind `mediaType`. No http(s)
|
|
60
|
+
// url anywhere: not a widget.
|
|
61
|
+
const attachment = mediaEnvelopeAttachment(envelope);
|
|
62
|
+
if (!attachment) return post;
|
|
63
|
+
contents = {
|
|
64
|
+
...(contents && 'attachment' in contents ? contents : {}),
|
|
65
|
+
attachment
|
|
66
|
+
};
|
|
57
67
|
}
|
|
58
68
|
const strippedMessage = message.replace(block, '').replace(/\n{3,}/g, '\n\n').trim();
|
|
59
69
|
return {
|
|
60
70
|
...post,
|
|
61
|
-
type:
|
|
71
|
+
type: type,
|
|
62
72
|
propsConfiguration: {
|
|
63
73
|
...(post.propsConfiguration ?? {}),
|
|
64
74
|
contents
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseWidgetPost.js","sources":["../../src/utils/parseWidgetPost.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parseWidgetPost.js","sources":["../../src/utils/parseWidgetPost.ts"],"sourcesContent":[null],"names":[],"mappings":"2DAGA;;;AAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,CAAA;;;;;MAK7B,YAAU,GAAA,0CAAA;;;;;SAKV,eAAU,CAAA,OAAA,EAAA;cACF,CAAA,SAAA,GAAA,CAAA;MACR,KAAM;SACN,CAAA,KAAQ,GAAA,YAAA,CAAA,IAAA,CAAA,OAAA,CAAA,MAAA,IAAA,EAAA;AACX,IAAE,IAAA;AAEH,MAAA,MAAA,MAAA,GAAA,IAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,UAAA,QAAA,EAAA,MAAA;AACH,UAAM,KAAA,EAAA,KAAe,CAAA,CAAA;AAQrB,SAAA;;;AAGG;AACH,IAAA;AACI,EAAA;AACA,EAAA,WAAiC;AACjC;AACI;;;AAGQ;;;AAEN;;;;AAIN;AACH,SAAA,eAAA,CAAA,IAAA,EAAA;AAED,EAAA,MAAA,OAAA,GAAA,IAAA,EAAA,OAAA;;;;;;;;;;AAUG,EAAA,MAAA,IAAA,GAAA,QAAA,CAAA,cAAA,CAAA,WAAA,EAAA;AACH,EAAA,IAAM,QAAA,GAAU,QAAA,CAAA,kBAA2B,EAAA,QAAA;AACvC,EAAA,IAAA,IAAM,KAAA,OAAU,EAAI;;;AAEsC;AAE1D,IAAA,MAAM,UAAQ,GAAA,uBAAyB,CAAA,QAAA,CAAA;AACvC,IAAA,IAAI,CAAC,UAAK,EAAA,OAAA,IAAA;AAAE,IAAA,QAAA,GAAO;AAEnB,MAAA,IAAM,QAAE,IAAU,gBAAgB,QAAA,GAAA,QAAA,GAAA,EAAA,CAAA;MAClC;AAAkE,KAAA;;AAGlE,EAAA,MAAI,eAAW,GAAA,OAAS,CAAA,OAAA,CAAA,KAAkB,aAAW,CAAA,SAAA,EAAA,MAAA,CAAA,CAAA,IAAA,EAAA;AACrD,EAAA,OAAI;WACA;QACA,EAAA,IAAA;sBACA,EAAA;AACA,MAAA,IAAA,IAAM,mBAAa,IAAA,EAAA,CAAA;AACnB,MAAA;AAAiB,KAAA;WACjB,EAAA;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@admin-layout/ai-chat-ext-browser",
|
|
3
|
-
"version": "12.2.5-alpha.
|
|
3
|
+
"version": "12.2.5-alpha.21",
|
|
4
4
|
"description": "AI Chat extension for Messenger - supports AI assistant, thinking, code blocks, tool use, and service messages",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"typescript": {
|
|
42
42
|
"definition": "lib/index.d.ts"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "0eeb1dbedbfc7c900051bc32d37800fdc12ab17b"
|
|
45
45
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseWidgetPost.spec.d.ts","sourceRoot":"","sources":["../../src/utils/parseWidgetPost.spec.ts"],"names":[],"mappings":""}
|