@cellarnode/ui 0.201.1 → 0.203.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/composer.d.ts +6 -1
- package/dist/agent/composer.d.ts.map +1 -1
- package/dist/agent/composer.js +43 -9
- package/dist/agent/composer.js.map +1 -1
- package/dist/agent/conversation.d.ts +20 -2
- package/dist/agent/conversation.d.ts.map +1 -1
- package/dist/agent/conversation.js +39 -5
- package/dist/agent/conversation.js.map +1 -1
- package/dist/agent/copy.d.ts +7 -0
- package/dist/agent/copy.d.ts.map +1 -1
- package/dist/agent/copy.js +9 -0
- package/dist/agent/copy.js.map +1 -1
- package/dist/agent/fixtures.d.ts +34 -0
- package/dist/agent/fixtures.d.ts.map +1 -1
- package/dist/agent/fixtures.js +83 -0
- package/dist/agent/fixtures.js.map +1 -1
- package/dist/agent/index.d.ts +18 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +18 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/markdown.d.ts +64 -0
- package/dist/agent/markdown.d.ts.map +1 -0
- package/dist/agent/markdown.js +338 -0
- package/dist/agent/markdown.js.map +1 -0
- package/dist/agent/masked-value.d.ts +1 -0
- package/dist/agent/masked-value.d.ts.map +1 -1
- package/dist/agent/masked-value.js +4 -1
- package/dist/agent/masked-value.js.map +1 -1
- package/dist/agent/message.d.ts +26 -6
- package/dist/agent/message.d.ts.map +1 -1
- package/dist/agent/message.js +47 -11
- package/dist/agent/message.js.map +1 -1
- package/dist/agent/panel-frame.js +1 -1
- package/dist/agent/panel-frame.js.map +1 -1
- package/dist/agent/role-cards/card-kit.d.ts +111 -0
- package/dist/agent/role-cards/card-kit.d.ts.map +1 -0
- package/dist/agent/role-cards/card-kit.js +68 -0
- package/dist/agent/role-cards/card-kit.js.map +1 -0
- package/dist/agent/role-cards/data-table-card.d.ts +80 -0
- package/dist/agent/role-cards/data-table-card.d.ts.map +1 -0
- package/dist/agent/role-cards/data-table-card.js +214 -0
- package/dist/agent/role-cards/data-table-card.js.map +1 -0
- package/dist/agent/role-cards/fixtures.d.ts +124 -0
- package/dist/agent/role-cards/fixtures.d.ts.map +1 -0
- package/dist/agent/role-cards/fixtures.js +401 -0
- package/dist/agent/role-cards/fixtures.js.map +1 -0
- package/dist/agent/role-cards/host-contract.d.ts +214 -0
- package/dist/agent/role-cards/host-contract.d.ts.map +1 -0
- package/dist/agent/role-cards/host-contract.js +348 -0
- package/dist/agent/role-cards/host-contract.js.map +1 -0
- package/dist/agent/role-cards/inspector-drawer.d.ts +42 -0
- package/dist/agent/role-cards/inspector-drawer.d.ts.map +1 -0
- package/dist/agent/role-cards/inspector-drawer.js +68 -0
- package/dist/agent/role-cards/inspector-drawer.js.map +1 -0
- package/dist/agent/role-cards/inspector-fixtures.d.ts +84 -0
- package/dist/agent/role-cards/inspector-fixtures.d.ts.map +1 -0
- package/dist/agent/role-cards/inspector-fixtures.js +162 -0
- package/dist/agent/role-cards/inspector-fixtures.js.map +1 -0
- package/dist/agent/role-cards/inspector-record.d.ts +109 -0
- package/dist/agent/role-cards/inspector-record.d.ts.map +1 -0
- package/dist/agent/role-cards/inspector-record.js +346 -0
- package/dist/agent/role-cards/inspector-record.js.map +1 -0
- package/dist/agent/role-cards/inspector-view.d.ts +137 -0
- package/dist/agent/role-cards/inspector-view.d.ts.map +1 -0
- package/dist/agent/role-cards/inspector-view.js +261 -0
- package/dist/agent/role-cards/inspector-view.js.map +1 -0
- package/dist/agent/role-cards/match-card.d.ts +21 -0
- package/dist/agent/role-cards/match-card.d.ts.map +1 -0
- package/dist/agent/role-cards/match-card.js +30 -0
- package/dist/agent/role-cards/match-card.js.map +1 -0
- package/dist/agent/role-cards/offer-card.d.ts +27 -0
- package/dist/agent/role-cards/offer-card.d.ts.map +1 -0
- package/dist/agent/role-cards/offer-card.js +68 -0
- package/dist/agent/role-cards/offer-card.js.map +1 -0
- package/dist/agent/role-cards/opportunity-card.d.ts +26 -0
- package/dist/agent/role-cards/opportunity-card.d.ts.map +1 -0
- package/dist/agent/role-cards/opportunity-card.js +50 -0
- package/dist/agent/role-cards/opportunity-card.js.map +1 -0
- package/dist/agent/role-cards/product-card.d.ts +32 -0
- package/dist/agent/role-cards/product-card.d.ts.map +1 -0
- package/dist/agent/role-cards/product-card.js +50 -0
- package/dist/agent/role-cards/product-card.js.map +1 -0
- package/dist/agent/role-cards/proposal-diff.d.ts +38 -0
- package/dist/agent/role-cards/proposal-diff.d.ts.map +1 -0
- package/dist/agent/role-cards/proposal-diff.js +74 -0
- package/dist/agent/role-cards/proposal-diff.js.map +1 -0
- package/dist/agent/role-cards/registry.d.ts +43 -0
- package/dist/agent/role-cards/registry.d.ts.map +1 -0
- package/dist/agent/role-cards/registry.js +46 -0
- package/dist/agent/role-cards/registry.js.map +1 -0
- package/dist/agent/role-cards/score-meter.d.ts +12 -0
- package/dist/agent/role-cards/score-meter.d.ts.map +1 -0
- package/dist/agent/role-cards/score-meter.js +17 -0
- package/dist/agent/role-cards/score-meter.js.map +1 -0
- package/dist/agent/role-cards/surface-links.d.ts +54 -0
- package/dist/agent/role-cards/surface-links.d.ts.map +1 -0
- package/dist/agent/role-cards/surface-links.js +149 -0
- package/dist/agent/role-cards/surface-links.js.map +1 -0
- package/dist/agent/role-cards/text-safety.d.ts +27 -0
- package/dist/agent/role-cards/text-safety.d.ts.map +1 -0
- package/dist/agent/role-cards/text-safety.js +77 -0
- package/dist/agent/role-cards/text-safety.js.map +1 -0
- package/dist/agent/schema.d.ts +10 -0
- package/dist/agent/schema.d.ts.map +1 -1
- package/dist/agent/schema.js +31 -3
- package/dist/agent/schema.js.map +1 -1
- package/dist/agent/states.d.ts +1 -0
- package/dist/agent/states.d.ts.map +1 -1
- package/dist/agent/states.js +1 -1
- package/dist/agent/states.js.map +1 -1
- package/dist/agent/thinking.d.ts +13 -4
- package/dist/agent/thinking.d.ts.map +1 -1
- package/dist/agent/thinking.js +15 -6
- package/dist/agent/thinking.js.map +1 -1
- package/dist/agent/thread-list.d.ts +45 -2
- package/dist/agent/thread-list.d.ts.map +1 -1
- package/dist/agent/thread-list.js +175 -8
- package/dist/agent/thread-list.js.map +1 -1
- package/dist/agent/thread-title.d.ts +46 -0
- package/dist/agent/thread-title.d.ts.map +1 -0
- package/dist/agent/thread-title.js +99 -0
- package/dist/agent/thread-title.js.map +1 -0
- package/dist/agent/tool-activity-model.d.ts +136 -0
- package/dist/agent/tool-activity-model.d.ts.map +1 -0
- package/dist/agent/tool-activity-model.js +288 -0
- package/dist/agent/tool-activity-model.js.map +1 -0
- package/dist/agent/tool-activity.d.ts +61 -0
- package/dist/agent/tool-activity.d.ts.map +1 -0
- package/dist/agent/tool-activity.js +199 -0
- package/dist/agent/tool-activity.js.map +1 -0
- package/dist/agent/tool-call-card.d.ts +11 -1
- package/dist/agent/tool-call-card.d.ts.map +1 -1
- package/dist/agent/tool-call-card.js +19 -4
- package/dist/agent/tool-call-card.js.map +1 -1
- package/dist/agent/ui.js +1 -1
- package/dist/agent/ui.js.map +1 -1
- package/dist/agent/use-motion.d.ts +15 -0
- package/dist/agent/use-motion.d.ts.map +1 -0
- package/dist/agent/use-motion.js +52 -0
- package/dist/agent/use-motion.js.map +1 -0
- package/dist/chat/use-stick-to-bottom.d.ts +5 -0
- package/dist/chat/use-stick-to-bottom.d.ts.map +1 -1
- package/dist/chat/use-stick-to-bottom.js +11 -1
- package/dist/chat/use-stick-to-bottom.js.map +1 -1
- package/dist/components/sheet.d.ts +3 -1
- package/dist/components/sheet.d.ts.map +1 -1
- package/dist/components/sheet.js +2 -2
- package/dist/components/sheet.js.map +1 -1
- package/dist/portfolio-import/import-job-panels.d.ts +6 -0
- package/dist/portfolio-import/import-job-panels.d.ts.map +1 -1
- package/dist/portfolio-import/import-job-panels.js +11 -4
- package/dist/portfolio-import/import-job-panels.js.map +1 -1
- package/dist/portfolio-import/job-error-copy.d.ts +62 -0
- package/dist/portfolio-import/job-error-copy.d.ts.map +1 -0
- package/dist/portfolio-import/job-error-copy.js +78 -0
- package/dist/portfolio-import/job-error-copy.js.map +1 -0
- package/dist/realtime/organisation-events/schemas.d.ts +2 -2
- package/package.json +4 -1
- package/src/theme/tokens.css +66 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { DEFAULT_QUOTE, fmt, quoteText, useCopy } from "../copy.js";
|
|
3
|
+
import { MaskedValue } from "../masked-value.js";
|
|
4
|
+
import { detailAgrees } from "./host-contract.js";
|
|
5
|
+
import { AgentCardExtras, AgentCardFrame, AgentCardLink, AgentChip, AgentField, AgentFieldGrid, } from "./card-kit.js";
|
|
6
|
+
const DEFAULT_COPY = {
|
|
7
|
+
title: "Offer",
|
|
8
|
+
product: "Product",
|
|
9
|
+
opportunity: "For opportunity",
|
|
10
|
+
counterparty: "Counterparty",
|
|
11
|
+
price: "Price",
|
|
12
|
+
volume: "Volume",
|
|
13
|
+
validThrough: "Valid through",
|
|
14
|
+
round: "Round {n}",
|
|
15
|
+
messages: "{n} messages",
|
|
16
|
+
attachments: "{n} attachments",
|
|
17
|
+
awaitingYou: "Waiting for you",
|
|
18
|
+
awaitingCounterparty: "Waiting for the other side",
|
|
19
|
+
openOffer: "Open offer",
|
|
20
|
+
quote: DEFAULT_QUOTE,
|
|
21
|
+
status: {
|
|
22
|
+
draft: "Draft",
|
|
23
|
+
submitted: "Submitted",
|
|
24
|
+
sent: "Sent",
|
|
25
|
+
in_negotiation: "In negotiation",
|
|
26
|
+
awaiting_counterparty_acceptance: "Awaiting acceptance",
|
|
27
|
+
accepted: "Accepted",
|
|
28
|
+
rejected: "Rejected",
|
|
29
|
+
discarded: "Discarded",
|
|
30
|
+
archived: "Archived",
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const STATUS_TONE = {
|
|
34
|
+
draft: "neutral",
|
|
35
|
+
submitted: "info",
|
|
36
|
+
sent: "info",
|
|
37
|
+
in_negotiation: "brand",
|
|
38
|
+
awaiting_counterparty_acceptance: "warning",
|
|
39
|
+
accepted: "success",
|
|
40
|
+
rejected: "danger",
|
|
41
|
+
discarded: "neutral",
|
|
42
|
+
archived: "neutral",
|
|
43
|
+
};
|
|
44
|
+
const priceText = (d) => {
|
|
45
|
+
const plain = (v) => typeof v === "string" || typeof v === "number" ? String(v) : undefined;
|
|
46
|
+
const parts = [plain(d.price), plain(d.currency), plain(d.priceType)].filter(Boolean);
|
|
47
|
+
return parts.length ? parts.join(" ") : undefined;
|
|
48
|
+
};
|
|
49
|
+
/** @internal Read card for one offer (CEL-2445): status, product, counterparty, terms, who acts next. */
|
|
50
|
+
export function AgentOfferCard({ data, copy, ...host }) {
|
|
51
|
+
const { allowLink, renderLink, maskedCopy } = host;
|
|
52
|
+
const c = useCopy(DEFAULT_COPY, copy);
|
|
53
|
+
const price = priceText(data);
|
|
54
|
+
// A `detail` that names a different record than the card's own offerId is a steered or broken card: refuse it, do not pick one.
|
|
55
|
+
if (!detailAgrees("OfferCard", data))
|
|
56
|
+
return null;
|
|
57
|
+
// The product is the card's headline (many offer cards can sit in one chat); "Offer" is the eyebrow.
|
|
58
|
+
const hasProduct = data.product !== undefined && data.product !== null && data.product !== "";
|
|
59
|
+
const meta = [
|
|
60
|
+
data.round !== undefined ? fmt(c.round, { n: data.round }) : null,
|
|
61
|
+
data.counts?.messages !== undefined ? fmt(c.messages, { n: data.counts.messages }) : null,
|
|
62
|
+
data.counts?.attachments !== undefined
|
|
63
|
+
? fmt(c.attachments, { n: data.counts.attachments })
|
|
64
|
+
: null,
|
|
65
|
+
].filter(Boolean);
|
|
66
|
+
return (_jsxs(AgentCardFrame, { eyebrow: hasProduct ? c.title : undefined, title: _jsx(AgentCardLink, { path: data.link, allowLink: allowLink, renderLink: renderLink, children: hasProduct ? _jsx(MaskedValue, { value: data.product, copy: maskedCopy }) : c.title }), badge: _jsx(AgentChip, { tone: STATUS_TONE[data.status], children: c.status[data.status] }), children: [_jsxs(AgentFieldGrid, { children: [_jsx(AgentField, { label: c.opportunity, value: quoteText(data.opportunity, c.quote), wide: true, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.counterparty, value: quoteText(data.counterparty, c.quote), maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.price, value: price, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.volume, value: data.volume, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.validThrough, value: data.validThrough, maskedCopy: maskedCopy })] }), (data.awaiting === "you" || data.awaiting === "counterparty" || meta.length > 0) && (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [data.awaiting === "you" && _jsx(AgentChip, { tone: "warning", children: c.awaitingYou }), data.awaiting === "counterparty" && (_jsx(AgentChip, { tone: "neutral", children: c.awaitingCounterparty })), meta.length > 0 && (_jsx("span", { className: "text-xs/4 text-muted-foreground", children: meta.join(" / ") }))] })), _jsx(AgentCardExtras, { data: data, subject: { kind: "offer", id: data.offerId }, host: host })] }));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=offer-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offer-card.js","sourceRoot":"","sources":["../../../src/agent/role-cards/offer-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { OpportunityCardData } from "@cellarnode/agent-cards/zod4";
|
|
2
|
+
import { type AgentRoleCardHostProps } from "./card-kit.js";
|
|
3
|
+
export interface AgentOpportunityCardCopy {
|
|
4
|
+
buyer: string;
|
|
5
|
+
market: string;
|
|
6
|
+
country: string;
|
|
7
|
+
category: string;
|
|
8
|
+
volume: string;
|
|
9
|
+
priceRange: string;
|
|
10
|
+
deadline: string;
|
|
11
|
+
requirements: string;
|
|
12
|
+
open: string;
|
|
13
|
+
closed: string;
|
|
14
|
+
expired: string;
|
|
15
|
+
daysLeft: string;
|
|
16
|
+
dayLeft: string;
|
|
17
|
+
daysOver: string;
|
|
18
|
+
today: string;
|
|
19
|
+
}
|
|
20
|
+
export interface AgentOpportunityCardProps extends AgentRoleCardHostProps {
|
|
21
|
+
data: OpportunityCardData;
|
|
22
|
+
copy?: Partial<AgentOpportunityCardCopy>;
|
|
23
|
+
}
|
|
24
|
+
/** @internal Read card for one opportunity (CEL-2445): buyer, market, requirements, deadline, status. */
|
|
25
|
+
export declare function AgentOpportunityCard({ data, copy, ...host }: AgentOpportunityCardProps): import("react/jsx-runtime").JSX.Element | null;
|
|
26
|
+
//# sourceMappingURL=opportunity-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opportunity-card.d.ts","sourceRoot":"","sources":["../../../src/agent/role-cards/opportunity-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAKxE,OAAO,EAGL,KAAK,sBAAsB,EAM5B,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAyBD,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;IACvE,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC1C;AAED,yGAAyG;AACzG,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,yBAAyB,kDAiEtF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { fmt, useCopy } from "../copy.js";
|
|
3
|
+
import { MaskedValue } from "../masked-value.js";
|
|
4
|
+
import { detailAgrees } from "./host-contract.js";
|
|
5
|
+
import { AgentCardExtras, subjectOf, AgentCardFrame, AgentCardLink, AgentChip, AgentField, AgentFieldGrid, } from "./card-kit.js";
|
|
6
|
+
const DEFAULT_COPY = {
|
|
7
|
+
buyer: "Buyer",
|
|
8
|
+
market: "Market",
|
|
9
|
+
country: "Country",
|
|
10
|
+
category: "Category",
|
|
11
|
+
volume: "Volume",
|
|
12
|
+
priceRange: "Price range",
|
|
13
|
+
deadline: "Deadline",
|
|
14
|
+
requirements: "Requirements",
|
|
15
|
+
open: "Open",
|
|
16
|
+
closed: "Closed",
|
|
17
|
+
expired: "Expired",
|
|
18
|
+
daysLeft: "{n} days left",
|
|
19
|
+
dayLeft: "1 day left",
|
|
20
|
+
daysOver: "{n} days past deadline",
|
|
21
|
+
today: "Due today",
|
|
22
|
+
};
|
|
23
|
+
const STATUS_TONE = {
|
|
24
|
+
open: "success",
|
|
25
|
+
closed: "neutral",
|
|
26
|
+
expired: "danger",
|
|
27
|
+
};
|
|
28
|
+
/** @internal Read card for one opportunity (CEL-2445): buyer, market, requirements, deadline, status. */
|
|
29
|
+
export function AgentOpportunityCard({ data, copy, ...host }) {
|
|
30
|
+
const { allowLink, renderLink, maskedCopy } = host;
|
|
31
|
+
const c = useCopy(DEFAULT_COPY, copy);
|
|
32
|
+
// A `detail` that names anything but an opportunity is a steered or broken card: refuse it, do not render it.
|
|
33
|
+
if (!detailAgrees("OpportunityCard", data))
|
|
34
|
+
return null;
|
|
35
|
+
const category = [data.category, data.subtype].filter(Boolean).join(" / ") || undefined;
|
|
36
|
+
const days = data.daysRemaining;
|
|
37
|
+
const countdown = days === undefined || days === null
|
|
38
|
+
? undefined
|
|
39
|
+
: days > 1
|
|
40
|
+
? fmt(c.daysLeft, { n: days })
|
|
41
|
+
: days === 1
|
|
42
|
+
? c.dayLeft
|
|
43
|
+
: days === 0
|
|
44
|
+
? c.today
|
|
45
|
+
: fmt(c.daysOver, { n: Math.abs(days) });
|
|
46
|
+
return (_jsxs(AgentCardFrame, { title: _jsx(AgentCardLink, { path: data.link, allowLink: allowLink, renderLink: renderLink, children: _jsx(MaskedValue, { value: data.name, copy: maskedCopy }) }), badge: data.status ? (_jsx(AgentChip, { tone: STATUS_TONE[data.status], children: c[data.status] })) : undefined, children: [_jsxs(AgentFieldGrid, { children: [_jsx(AgentField, { label: c.buyer, value: data.buyer, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.market, value: data.market, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.country, value: data.country, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.category, value: category, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.volume, value: data.volume, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.priceRange, value: data.priceRange, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.deadline, value: data.deadline, maskedCopy: maskedCopy })] }), countdown && (_jsx("p", { className: days !== undefined && days !== null && days < 0
|
|
47
|
+
? "text-xs/4 font-medium text-[var(--tone-danger-fg)]"
|
|
48
|
+
: "text-xs/4 text-muted-foreground", children: countdown })), data.requirements && data.requirements.length > 0 && (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("p", { className: "text-xs/4 text-muted-foreground", children: c.requirements }), _jsx("ul", { className: "flex flex-wrap gap-2", children: data.requirements.map((r) => (_jsx("li", { children: _jsx(AgentChip, { children: r }) }, r))) })] })), _jsx(AgentCardExtras, { data: data, subject: subjectOf(data.detail), host: host })] }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=opportunity-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opportunity-card.js","sourceRoot":"","sources":["../../../src/agent/role-cards/opportunity-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ProductCardData } from "@cellarnode/agent-cards/zod4";
|
|
2
|
+
import { type AgentRoleCardHostProps } from "./card-kit.js";
|
|
3
|
+
export interface AgentProductCardCopy {
|
|
4
|
+
producer: string;
|
|
5
|
+
category: string;
|
|
6
|
+
vintage: string;
|
|
7
|
+
abv: string;
|
|
8
|
+
volume: string;
|
|
9
|
+
packaging: string;
|
|
10
|
+
variants: string;
|
|
11
|
+
matches: string;
|
|
12
|
+
organic: string;
|
|
13
|
+
fairtrade: string;
|
|
14
|
+
sustainable: string;
|
|
15
|
+
pendingReview: string;
|
|
16
|
+
approved: string;
|
|
17
|
+
readiness: string;
|
|
18
|
+
readyToApprove: string;
|
|
19
|
+
blockers: string;
|
|
20
|
+
recommendations: string;
|
|
21
|
+
acknowledgements: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AgentProductCardProps extends AgentRoleCardHostProps {
|
|
24
|
+
data: ProductCardData;
|
|
25
|
+
copy?: Partial<AgentProductCardCopy>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @internal Read card for one product (CEL-2445). Pairs with `AgentReadinessChecklist`: this card only summarises the
|
|
29
|
+
* readiness counts; the checklist is where gaps are fixed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function AgentProductCard({ data, copy, ...host }: AgentProductCardProps): import("react/jsx-runtime").JSX.Element | null;
|
|
32
|
+
//# sourceMappingURL=product-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-card.d.ts","sourceRoot":"","sources":["../../../src/agent/role-cards/product-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAIpE,OAAO,EAGL,KAAK,sBAAsB,EAM5B,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAsBD,MAAM,WAAW,qBAAsB,SAAQ,sBAAsB;IACnE,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,qBAAqB,kDA6E9E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { fmt, useCopy } from "../copy.js";
|
|
3
|
+
import { MaskedValue } from "../masked-value.js";
|
|
4
|
+
import { detailAgrees } from "./host-contract.js";
|
|
5
|
+
import { AgentCardExtras, subjectOf, AgentCardFrame, AgentCardLink, AgentChip, AgentField, AgentFieldGrid, } from "./card-kit.js";
|
|
6
|
+
const DEFAULT_COPY = {
|
|
7
|
+
producer: "Producer",
|
|
8
|
+
category: "Category",
|
|
9
|
+
vintage: "Vintage",
|
|
10
|
+
abv: "ABV",
|
|
11
|
+
volume: "Volume",
|
|
12
|
+
packaging: "Packaging",
|
|
13
|
+
variants: "Versions",
|
|
14
|
+
matches: "Matches",
|
|
15
|
+
organic: "Organic",
|
|
16
|
+
fairtrade: "Fairtrade",
|
|
17
|
+
sustainable: "Sustainable",
|
|
18
|
+
pendingReview: "Pending review",
|
|
19
|
+
approved: "Approved",
|
|
20
|
+
readiness: "{percent}% ready to match",
|
|
21
|
+
readyToApprove: "Ready to approve",
|
|
22
|
+
blockers: "{n} required",
|
|
23
|
+
recommendations: "{n} recommended",
|
|
24
|
+
acknowledgements: "{n} to confirm",
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* @internal Read card for one product (CEL-2445). Pairs with `AgentReadinessChecklist`: this card only summarises the
|
|
28
|
+
* readiness counts; the checklist is where gaps are fixed.
|
|
29
|
+
*/
|
|
30
|
+
export function AgentProductCard({ data, copy, ...host }) {
|
|
31
|
+
const { allowLink, renderLink, maskedCopy } = host;
|
|
32
|
+
const c = useCopy(DEFAULT_COPY, copy);
|
|
33
|
+
// A `detail` that names neither a product nor a variant is a steered or broken card: refuse it, do not render it.
|
|
34
|
+
if (!detailAgrees("ProductCard", data))
|
|
35
|
+
return null;
|
|
36
|
+
const category = [data.category, data.subtype].filter(Boolean).join(" / ") || undefined;
|
|
37
|
+
const r = data.readiness;
|
|
38
|
+
const gaps = r
|
|
39
|
+
? [
|
|
40
|
+
r.blockers ? fmt(c.blockers, { n: r.blockers }) : null,
|
|
41
|
+
r.acknowledgements ? fmt(c.acknowledgements, { n: r.acknowledgements }) : null,
|
|
42
|
+
r.recommendations ? fmt(c.recommendations, { n: r.recommendations }) : null,
|
|
43
|
+
].filter(Boolean)
|
|
44
|
+
: [];
|
|
45
|
+
const certs = (data.certifications ?? []).map((k) => c[k]);
|
|
46
|
+
return (_jsxs(AgentCardFrame, { title: _jsx(AgentCardLink, { path: data.link, allowLink: allowLink, renderLink: renderLink, children: _jsx(MaskedValue, { value: data.name, copy: maskedCopy }) }), badge: data.validation ? (_jsx(AgentChip, { tone: data.validation === "approved" ? "success" : "warning", children: data.validation === "approved" ? c.approved : c.pendingReview })) : undefined, children: [_jsxs(AgentFieldGrid, { children: [_jsx(AgentField, { label: c.producer, value: data.producer, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.category, value: category, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.vintage, value: data.vintage ?? undefined, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.abv, value: data.abv, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.volume, value: data.volume, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.packaging, value: data.packaging, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.variants, value: data.variantCount, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.matches, value: data.matchCount, maskedCopy: maskedCopy })] }), certs.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2", children: certs.map((label) => (_jsx(AgentChip, { tone: "success", children: label }, label))) })), r && (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5 text-xs/4", children: [_jsx("span", { className: "font-medium", children: r.canApprove
|
|
47
|
+
? c.readyToApprove
|
|
48
|
+
: fmt(c.readiness, { percent: Math.round(r.percent) }) }), gaps.length > 0 && _jsx("span", { className: "text-muted-foreground", children: gaps.join(" / ") })] }), _jsx("div", { role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(r.percent), "aria-label": fmt(c.readiness, { percent: Math.round(r.percent) }), className: "h-1.5 overflow-hidden rounded-full bg-muted", children: _jsx("div", { className: "h-full rounded-full bg-primary", style: { width: `${Math.min(Math.max(r.percent, 0), 100)}%` } }) })] })), _jsx(AgentCardExtras, { data: data, subject: subjectOf(data.detail), host: host })] }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=product-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-card.js","sourceRoot":"","sources":["../../../src/agent/role-cards/product-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { CardDetail, CardProposal } from "@cellarnode/agent-cards/zod4";
|
|
2
|
+
import { type AgentToolCatalog, type ApplyProposalFailure, type DetailKind, type ProposalApplyPlan } from "./host-contract.js";
|
|
3
|
+
export interface AgentProposalDiffCopy {
|
|
4
|
+
title: string;
|
|
5
|
+
field: string;
|
|
6
|
+
/** The model's claimed current value. The server's value is only shown after Apply fetched it. */
|
|
7
|
+
before: string;
|
|
8
|
+
after: string;
|
|
9
|
+
empty: string;
|
|
10
|
+
apply: string;
|
|
11
|
+
applying: string;
|
|
12
|
+
edit: string;
|
|
13
|
+
reject: string;
|
|
14
|
+
tierNote: string;
|
|
15
|
+
refused: Record<ApplyProposalFailure, string>;
|
|
16
|
+
}
|
|
17
|
+
export declare const DEFAULT_COPY: AgentProposalDiffCopy;
|
|
18
|
+
export interface AgentProposalDiffProps {
|
|
19
|
+
proposal: CardProposal;
|
|
20
|
+
/** Apply is offered only with a catalog, a record fetch AND the subject of the card (`expected`). Otherwise the diff is read-only. */
|
|
21
|
+
catalog?: AgentToolCatalog;
|
|
22
|
+
fetchRecord?: (kind: DetailKind, id: string) => Promise<unknown>;
|
|
23
|
+
expected?: Pick<CardDetail, "kind" | "id">;
|
|
24
|
+
/** Called ONLY with the `planProposalApply` result (server truth against `after`, a catalog-built confirm plan); never with the raw proposal. */
|
|
25
|
+
onApply?: (result: ProposalApplyPlan) => void;
|
|
26
|
+
/** Called when Apply was refused (stale record, other subject, bad args...). The reason is also shown inline. */
|
|
27
|
+
onApplyRefused?: (reason: ApplyProposalFailure) => void;
|
|
28
|
+
onEdit?: (proposal: CardProposal) => void;
|
|
29
|
+
onReject?: (proposal: CardProposal) => void;
|
|
30
|
+
copy?: Partial<AgentProposalDiffCopy>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* @internal An agent-proposed edit as before/after rows with Apply, Edit before applying and Reject. Text only: values are never
|
|
34
|
+
* interpreted as markup. The "before" column is what the MODEL claims; Apply re-fetches the record and refuses a proposal the
|
|
35
|
+
* server no longer agrees with.
|
|
36
|
+
*/
|
|
37
|
+
export declare function AgentProposalDiff({ proposal, catalog, fetchRecord, expected, onApply, onApplyRefused, onEdit, onReject, copy, }: AgentProposalDiffProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=proposal-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-diff.d.ts","sourceRoot":"","sources":["../../../src/agent/role-cards/proposal-diff.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG7E,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kGAAkG;IAClG,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;CAC/C;AACD,eAAO,MAAM,YAAY,EAAE,qBAyB1B,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,YAAY,CAAC;IACvB,sIAAsI;IACtI,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,QAAQ,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,iJAAiJ;IACjJ,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,iHAAiH;IACjH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACxD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACvC;AAKD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,OAAO,EACP,WAAW,EACX,QAAQ,EACR,OAAO,EACP,cAAc,EACd,MAAM,EACN,QAAQ,EACR,IAAI,GACL,EAAE,sBAAsB,2CA+GxB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { fmt, useCopy } from "../copy.js";
|
|
4
|
+
import { agentButton } from "../ui.js";
|
|
5
|
+
import { planProposalApply, } from "./host-contract.js";
|
|
6
|
+
export const DEFAULT_COPY = {
|
|
7
|
+
title: "Proposed change",
|
|
8
|
+
field: "Field",
|
|
9
|
+
before: "Proposed from",
|
|
10
|
+
after: "Proposed",
|
|
11
|
+
empty: "(empty)",
|
|
12
|
+
apply: "Apply",
|
|
13
|
+
applying: "Checking the current record",
|
|
14
|
+
edit: "Edit before applying",
|
|
15
|
+
reject: "Reject",
|
|
16
|
+
tierNote: "Applying asks you to confirm ({tier}).",
|
|
17
|
+
refused: {
|
|
18
|
+
unknown_tool: "This change cannot be applied from here.",
|
|
19
|
+
tier_mismatch: "This change cannot be applied from here.",
|
|
20
|
+
no_target_arg: "This change cannot be applied from here.",
|
|
21
|
+
no_target_kind: "This change cannot be applied from here.",
|
|
22
|
+
kind_mismatch: "This change is for a different kind of record.",
|
|
23
|
+
subject_mismatch: "This change is for a different record than this card.",
|
|
24
|
+
target_override: "This change cannot be applied from here.",
|
|
25
|
+
record_unavailable: "Could not load the current record. Try again.",
|
|
26
|
+
unknown_path: "This change names a field the record does not have.",
|
|
27
|
+
stale: "The record changed since the agent looked. Ask it to propose again.",
|
|
28
|
+
nothing_to_apply: "The record already has these values.",
|
|
29
|
+
invalid_args: "These values are not accepted. Edit them and try again.",
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
const show = (v, empty) => v === null || v === "" ? empty : String(v);
|
|
33
|
+
/**
|
|
34
|
+
* @internal An agent-proposed edit as before/after rows with Apply, Edit before applying and Reject. Text only: values are never
|
|
35
|
+
* interpreted as markup. The "before" column is what the MODEL claims; Apply re-fetches the record and refuses a proposal the
|
|
36
|
+
* server no longer agrees with.
|
|
37
|
+
*/
|
|
38
|
+
export function AgentProposalDiff({ proposal, catalog, fetchRecord, expected, onApply, onApplyRefused, onEdit, onReject, copy, }) {
|
|
39
|
+
const c = useCopy(DEFAULT_COPY, {
|
|
40
|
+
...copy,
|
|
41
|
+
refused: { ...DEFAULT_COPY.refused, ...copy?.refused },
|
|
42
|
+
});
|
|
43
|
+
const [busy, setBusy] = useState(false);
|
|
44
|
+
const [refusal, setRefusal] = useState(null);
|
|
45
|
+
const mountedRef = useRef(true);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
mountedRef.current = true;
|
|
48
|
+
return () => {
|
|
49
|
+
mountedRef.current = false;
|
|
50
|
+
};
|
|
51
|
+
}, []);
|
|
52
|
+
const canApply = !!(onApply && catalog && fetchRecord && expected);
|
|
53
|
+
const interactive = canApply || onEdit || onReject;
|
|
54
|
+
async function apply() {
|
|
55
|
+
if (!catalog || !fetchRecord || !expected || !onApply || busy)
|
|
56
|
+
return;
|
|
57
|
+
setBusy(true);
|
|
58
|
+
setRefusal(null);
|
|
59
|
+
const result = await planProposalApply(proposal, catalog, fetchRecord, expected);
|
|
60
|
+
if (!mountedRef.current)
|
|
61
|
+
return;
|
|
62
|
+
setBusy(false);
|
|
63
|
+
if (result.ok)
|
|
64
|
+
onApply(result);
|
|
65
|
+
else {
|
|
66
|
+
setRefusal(result.reason);
|
|
67
|
+
onApplyRefused?.(result.reason);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return (_jsxs("div", { className: "flex flex-col gap-2 rounded-xl bg-muted/50 p-3", "aria-busy": busy, children: [_jsx("p", { className: "text-xs/4 font-medium text-muted-foreground", children: c.title }), _jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full min-w-64 text-left text-sm/5", children: [_jsx("thead", { className: "text-xs/4 text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { scope: "col", className: "py-1 pr-3 font-medium", children: c.field }), _jsx("th", { scope: "col", className: "py-1 pr-3 font-medium", children: c.before }), _jsx("th", { scope: "col", className: "py-1 font-medium", children: c.after })] }) }), _jsx("tbody", { children: proposal.changes.map((ch) => (_jsxs("tr", { className: "border-t border-border/60 align-top", children: [_jsx("th", { scope: "row", className: "py-1.5 pr-3 font-mono text-xs/5 font-normal break-all", children: ch.path }), _jsx("td", { className: ch.before === null || ch.before === ""
|
|
71
|
+
? "py-1.5 pr-3 text-muted-foreground"
|
|
72
|
+
: "py-1.5 pr-3 text-muted-foreground line-through decoration-muted-foreground/60", children: show(ch.before, c.empty) }), _jsx("td", { className: "py-1.5 font-medium", children: show(ch.after, c.empty) })] }, ch.path))) })] }) }), proposal.tier !== "reversible" && (_jsx("p", { className: "text-xs/4 text-muted-foreground", children: fmt(c.tierNote, { tier: proposal.tier }) })), refusal && (_jsx("p", { role: "alert", className: "text-xs/4 font-medium text-[var(--tone-danger-fg)]", children: c.refused[refusal] })), busy && (_jsx("p", { role: "status", className: "text-xs/4 text-muted-foreground", children: c.applying })), interactive && (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [canApply && (_jsx("button", { type: "button", disabled: busy, className: proposal.tier === "reversible" ? agentButton.primary : agentButton.danger, onClick: apply, children: c.apply })), onEdit && (_jsx("button", { type: "button", className: agentButton.quiet, onClick: () => onEdit(proposal), children: c.edit })), onReject && (_jsx("button", { type: "button", className: agentButton.ghost, onClick: () => onReject(proposal), children: c.reject }))] }))] }));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=proposal-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-diff.js","sourceRoot":"","sources":["../../../src/agent/role-cards/proposal-diff.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type AgentDataTableCardCopy, type AgentDataTableCardProps } from "./data-table-card.js";
|
|
3
|
+
import { type AgentMatchCardCopy } from "./match-card.js";
|
|
4
|
+
import { type AgentOfferCardCopy } from "./offer-card.js";
|
|
5
|
+
import { type AgentOpportunityCardCopy } from "./opportunity-card.js";
|
|
6
|
+
import { type AgentProductCardCopy } from "./product-card.js";
|
|
7
|
+
import type { AgentRoleCardHostProps } from "./card-kit.js";
|
|
8
|
+
import { ROLE_AGENT_CARD_TYPES, type RoleAgentCardType } from "./host-contract.js";
|
|
9
|
+
export { ROLE_AGENT_CARD_TYPES, type RoleAgentCardType };
|
|
10
|
+
/** The host's own words for every string of each card, by card. Anything left out keeps the English default. */
|
|
11
|
+
export interface RoleAgentCardCopy {
|
|
12
|
+
offer?: Partial<AgentOfferCardCopy>;
|
|
13
|
+
product?: Partial<AgentProductCardCopy>;
|
|
14
|
+
opportunity?: Partial<AgentOpportunityCardCopy>;
|
|
15
|
+
match?: Partial<AgentMatchCardCopy>;
|
|
16
|
+
dataTable?: Partial<AgentDataTableCardCopy>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The host's link rules, tool catalog, record fetch and callbacks. Without a catalog every tool action and every proposal is dropped; with one, an unknown tool or a tier that differs from the catalog's is dropped too.
|
|
20
|
+
* `allowLink` decides every link a card carries, a table's included (`createSurfaceAllowLink` builds the one for a role host).
|
|
21
|
+
* `maskedCopy` (from the host props) is the mask pill's strings on every card.
|
|
22
|
+
*/
|
|
23
|
+
export interface RenderRoleAgentCardOptions extends AgentRoleCardHostProps {
|
|
24
|
+
/** The card's strings in the host's language, per card type. */
|
|
25
|
+
copy?: RoleAgentCardCopy;
|
|
26
|
+
/** `DataTable` only: more column keys whose text someone else wrote, quoted like third-party text. */
|
|
27
|
+
thirdPartyColumns?: AgentDataTableCardProps["thirdPartyColumns"];
|
|
28
|
+
/** `DataTable` only: the host's own label for a column, by key. */
|
|
29
|
+
columnLabels?: AgentDataTableCardProps["columnLabels"];
|
|
30
|
+
/** `DataTable` only: the host's display text for a cell (a date, a currency), or `undefined` for the default. */
|
|
31
|
+
formatCell?: AgentDataTableCardProps["formatCell"];
|
|
32
|
+
/** `DataTable` only: a BCP 47 tag for the numbers in cells. */
|
|
33
|
+
locale?: AgentDataTableCardProps["locale"];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @internal `cardType` (chosen by the agent) → renderer. The agent selects a card and fills it; it never authors layout.
|
|
37
|
+
* Data is read through `readRoleCard` first: an unknown type, data that fails the `@cellarnode/agent-cards` schema (bad link,
|
|
38
|
+
* out-of-range score, unknown status) or a card whose `detail` disagrees with it renders NOTHING. A card is an enhancement; the
|
|
39
|
+
* text answer stands alone. The data a card draws is always what `readRoleCard` made safe: it is set last, so nothing in
|
|
40
|
+
* `options` can replace it.
|
|
41
|
+
*/
|
|
42
|
+
export declare function renderRoleAgentCard(cardType: string, data: unknown, options?: RenderRoleAgentCardOptions): ReactNode;
|
|
43
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agent/role-cards/registry.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAwB,KAAK,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAoB,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAgB,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE9F,OAAO,EAAE,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,CAAC;AAEzD,gHAAgH;AAChH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC7C;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,gEAAgE;IAChE,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,sGAAsG;IACtG,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;IACjE,mEAAmE;IACnE,YAAY,CAAC,EAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACvD,iHAAiH;IACjH,UAAU,CAAC,EAAE,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACnD,+DAA+D;IAC/D,MAAM,CAAC,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;CAC5C;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,0BAA+B,GACvC,SAAS,CA4BX"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
2
|
+
import { AgentDataTableCard, } from "./data-table-card.js";
|
|
3
|
+
import { AgentMatchCard } from "./match-card.js";
|
|
4
|
+
import { AgentOfferCard } from "./offer-card.js";
|
|
5
|
+
import { AgentOpportunityCard } from "./opportunity-card.js";
|
|
6
|
+
import { AgentProductCard } from "./product-card.js";
|
|
7
|
+
import { readRoleCard, ROLE_AGENT_CARD_TYPES } from "./host-contract.js";
|
|
8
|
+
export { ROLE_AGENT_CARD_TYPES };
|
|
9
|
+
/**
|
|
10
|
+
* @internal `cardType` (chosen by the agent) → renderer. The agent selects a card and fills it; it never authors layout.
|
|
11
|
+
* Data is read through `readRoleCard` first: an unknown type, data that fails the `@cellarnode/agent-cards` schema (bad link,
|
|
12
|
+
* out-of-range score, unknown status) or a card whose `detail` disagrees with it renders NOTHING. A card is an enhancement; the
|
|
13
|
+
* text answer stands alone. The data a card draws is always what `readRoleCard` made safe: it is set last, so nothing in
|
|
14
|
+
* `options` can replace it.
|
|
15
|
+
*/
|
|
16
|
+
export function renderRoleAgentCard(cardType, data, options = {}) {
|
|
17
|
+
const card = readRoleCard(cardType, data, options.catalog);
|
|
18
|
+
if (!card)
|
|
19
|
+
return null;
|
|
20
|
+
const { copy, thirdPartyColumns, columnLabels, formatCell, locale, ...host } = options;
|
|
21
|
+
switch (card.cardType) {
|
|
22
|
+
case "OfferCard":
|
|
23
|
+
return createElement(AgentOfferCard, { ...host, copy: copy?.offer, data: card.data });
|
|
24
|
+
case "ProductCard":
|
|
25
|
+
return createElement(AgentProductCard, { ...host, copy: copy?.product, data: card.data });
|
|
26
|
+
case "OpportunityCard":
|
|
27
|
+
return createElement(AgentOpportunityCard, {
|
|
28
|
+
...host,
|
|
29
|
+
copy: copy?.opportunity,
|
|
30
|
+
data: card.data,
|
|
31
|
+
});
|
|
32
|
+
case "MatchCard":
|
|
33
|
+
return createElement(AgentMatchCard, { ...host, copy: copy?.match, data: card.data });
|
|
34
|
+
case "DataTable":
|
|
35
|
+
return createElement(AgentDataTableCard, {
|
|
36
|
+
...host,
|
|
37
|
+
copy: copy?.dataTable,
|
|
38
|
+
thirdPartyColumns,
|
|
39
|
+
columnLabels,
|
|
40
|
+
formatCell,
|
|
41
|
+
locale,
|
|
42
|
+
data: card.data,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agent/role-cards/registry.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,OAAO,CAAC;AACtD,OAAO,EACL,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAA2B,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,cAAc,EAA2B,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAiC,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAA6B,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAA0B,MAAM,iBAAiB,CAAC;AAE9F,OAAO,EAAE,qBAAqB,EAA0B,CAAC;AA6BzD;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,IAAa,EACb,UAAsC,EAAE;IAExC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACvF,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,WAAW;YACd,OAAO,aAAa,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxF,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC,gBAAgB,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5F,KAAK,iBAAiB;YACpB,OAAO,aAAa,CAAC,oBAAoB,EAAE;gBACzC,GAAG,IAAI;gBACP,IAAI,EAAE,IAAI,EAAE,WAAW;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;QACL,KAAK,WAAW;YACd,OAAO,aAAa,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxF,KAAK,WAAW;YACd,OAAO,aAAa,CAAC,kBAAkB,EAAE;gBACvC,GAAG,IAAI;gBACP,IAAI,EAAE,IAAI,EAAE,SAAS;gBACrB,iBAAiB;gBACjB,YAAY;gBACZ,UAAU;gBACV,MAAM;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal A 0 to 5 fit score as a ring. The number is always shown as text (colour is never the only signal) and the
|
|
3
|
+
* ring has no animation, so there is nothing to reduce for `prefers-reduced-motion`.
|
|
4
|
+
*/
|
|
5
|
+
export declare function AgentScoreMeter({ score, max, label, className, }: {
|
|
6
|
+
score: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
/** Accessible name, e.g. "Match score". */
|
|
9
|
+
label: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=score-meter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-meter.d.ts","sourceRoot":"","sources":["../../../src/agent/role-cards/score-meter.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,GAAO,EACP,KAAK,EACL,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAqCA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* @internal A 0 to 5 fit score as a ring. The number is always shown as text (colour is never the only signal) and the
|
|
5
|
+
* ring has no animation, so there is nothing to reduce for `prefers-reduced-motion`.
|
|
6
|
+
*/
|
|
7
|
+
export function AgentScoreMeter({ score, max = 5, label, className, }) {
|
|
8
|
+
const clamped = Math.min(Math.max(score, 0), max);
|
|
9
|
+
const r = 15.9155; // circumference 100
|
|
10
|
+
const tone = clamped >= 4
|
|
11
|
+
? "text-[var(--tone-success-fg)]"
|
|
12
|
+
: clamped >= 2.5
|
|
13
|
+
? "text-[var(--tone-warning-fg)]"
|
|
14
|
+
: "text-[var(--tone-danger-fg)]";
|
|
15
|
+
return (_jsxs("div", { role: "img", "aria-label": `${label}: ${clamped.toFixed(1)} / ${max}`, className: cn("relative inline-flex size-14 shrink-0 items-center justify-center", tone, className), children: [_jsxs("svg", { viewBox: "0 0 36 36", className: "absolute inset-0 size-full -rotate-90", "aria-hidden": true, children: [_jsx("circle", { cx: "18", cy: "18", r: r, fill: "none", strokeWidth: "3", className: "stroke-muted" }), _jsx("circle", { cx: "18", cy: "18", r: r, fill: "none", strokeWidth: "3", strokeLinecap: "round", stroke: "currentColor", strokeDasharray: `${(clamped / max) * 100} 100` })] }), _jsx("span", { "aria-hidden": true, className: "text-sm/5 font-semibold tabular-nums text-foreground", children: clamped.toFixed(1) })] }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=score-meter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-meter.js","sourceRoot":"","sources":["../../../src/agent/role-cards/score-meter.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,EACL,GAAG,GAAG,CAAC,EACP,KAAK,EACL,SAAS,GAOV;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,oBAAoB;IACvC,MAAM,IAAI,GACR,OAAO,IAAI,CAAC;QACV,CAAC,CAAC,+BAA+B;QACjC,CAAC,CAAC,OAAO,IAAI,GAAG;YACd,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,8BAA8B,CAAC;IACvC,OAAO,CACL,eACE,IAAI,EAAC,KAAK,gBACE,GAAG,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,EACtD,SAAS,EAAE,EAAE,CACX,mEAAmE,EACnE,IAAI,EACJ,SAAS,CACV,aAED,eAAK,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,uCAAuC,kCACxE,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAC,MAAM,EAAC,WAAW,EAAC,GAAG,EAAC,SAAS,EAAC,cAAc,GAAG,EACrF,iBACE,EAAE,EAAC,IAAI,EACP,EAAE,EAAC,IAAI,EACP,CAAC,EAAE,CAAC,EACJ,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,MAAM,EAAC,cAAc,EACrB,eAAe,EAAE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,MAAM,GAC/C,IACE,EACN,oCAAkB,SAAS,EAAC,sDAAsD,YAC/E,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GACd,IACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal The link rule of each role host (CEL-2488): which INTERNAL paths a card may link to on that app.
|
|
3
|
+
*
|
|
4
|
+
* A card's `link`, a table's `link` and an action's `href` are paths the agent chose. The schema only proves they are internal
|
|
5
|
+
* (one leading slash, no scheme); whether a path is a route of THIS app is the host's call, made through `allowLink`
|
|
6
|
+
* (`AgentCardLinkProps`). A path means nothing without its app: `/portfolio/...` is a producer route, whereas the e-label app keeps
|
|
7
|
+
* its producer area under `/app/*`, so a card that links across apps must render as plain text, not as a dead or wrong link.
|
|
8
|
+
* The routes listed here are the ones the cellarnode-mcp link tools put on a card (`get_offer_file_link`, `get_org_document_link`,
|
|
9
|
+
* `get_attachment_link`, `list_producer_documents`, `get_producer_showcase`: `agents/src/role-result-cards.ts`), per surface.
|
|
10
|
+
* `src/core/app-links.ts` in that repo knows more routes (`/messenger`, `/imports/<id>`, `/labels/<id>`, `/lab-reports`) that no
|
|
11
|
+
* card carries yet. A host passes the result as its `allowLink`, and `extraPrefixes` adds the routes it owns beyond these
|
|
12
|
+
* (`/opportunities`, `/matches`, `/messenger`).
|
|
13
|
+
*
|
|
14
|
+
* Every path is checked the same way BEFORE it is matched against a route, and fails closed:
|
|
15
|
+
* - it satisfies the card contract's own link rule (`LINK_PATTERN`, at most `LINK_MAX_LENGTH`);
|
|
16
|
+
* - it has no query (`?`): no agent link carries one, and a query is where an open redirect (`?next=...`) hides;
|
|
17
|
+
* - it has no empty segment (`//`, a trailing slash) and no `.` or `..` segment, raw or percent-encoded, which a browser would
|
|
18
|
+
* resolve out of the route that was matched (`/offers/../admin`);
|
|
19
|
+
* - no segment decodes to anything but printable ASCII (so no control character, no space, no bidi or zero-width character that
|
|
20
|
+
* arrived as `%E2%80%AE`), nothing holding `/`, `\`, `#` or `?`, and no segment is still encoded after one round of decoding
|
|
21
|
+
* (`%252e%252e`).
|
|
22
|
+
*/
|
|
23
|
+
/** The three apps that draw role-agent cards. */
|
|
24
|
+
export type AgentHostSurface = "producer" | "importer" | "elabel";
|
|
25
|
+
/**
|
|
26
|
+
* `allowLink` for a host surface: true only for a clean internal path that is one of the routes the agents emit for that app, or
|
|
27
|
+
* sits at or below one of `extraPrefixes` (the host's own routes, e.g. `["/opportunities", "/matches"]`). A prefix matches on a
|
|
28
|
+
* whole segment: `/app` accepts `/app/portfolio` and not `/application`.
|
|
29
|
+
*
|
|
30
|
+
* Throws on an extra prefix that is not a clean path with at least one segment: that is a host bug, and a prefix like `/` would
|
|
31
|
+
* quietly allow every link.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createSurfaceAllowLink(surface: AgentHostSurface, extraPrefixes?: readonly string[]): (path: string) => boolean;
|
|
34
|
+
/**
|
|
35
|
+
* What a card's deep link points at: the name of the link, in the host's language, comes from this. `product` and `productGallery`
|
|
36
|
+
* are one product (version) of a portfolio and its gallery; `labels` and `imports` are e-label pages; `elabelHome` is the e-label
|
|
37
|
+
* app's own start page and `elabel` any other page of it.
|
|
38
|
+
*/
|
|
39
|
+
export type AgentLinkKind = "offer" | "producer" | "organisation" | "portfolio" | "product" | "productGallery" | "labels" | "imports" | "elabelHome" | "elabel";
|
|
40
|
+
/**
|
|
41
|
+
* The kind of page a clean internal path opens, or `undefined` for a path that is not clean or not one of the routes the agents
|
|
42
|
+
* emit (a route the host added through `extraPrefixes`). Reads only the path, so it names a link the same way on every surface.
|
|
43
|
+
* Under `/app` (the e-label app) the page is named by the segment after it: `/app/portfolio/...` is a portfolio page, `/app/labels/...`
|
|
44
|
+
* a label, `/app/imports/...` an import, `/app` itself the app's home, and anything else just "a page of the e-label app".
|
|
45
|
+
*/
|
|
46
|
+
export declare function agentLinkKind(path: string): AgentLinkKind | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Per surface, the `DataTable` column keys whose text someone else wrote, as the cellarnode-mcp agents name them: the key says who
|
|
49
|
+
* wrote the column. `counterpartyFile` is the other side's offer file, `producerFile` and `producerBeverage` are a producer's public
|
|
50
|
+
* documents and beverages as an importer sees them; `file` is the caller's own document or attachment and is not listed. Pass the
|
|
51
|
+
* result as `thirdPartyColumns` (`DEFAULT_THIRD_PARTY_COLUMNS` already quotes these keys on every surface). An unknown surface gets none.
|
|
52
|
+
*/
|
|
53
|
+
export declare function surfaceThirdPartyColumns(surface: AgentHostSurface): readonly string[];
|
|
54
|
+
//# sourceMappingURL=surface-links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-links.d.ts","sourceRoot":"","sources":["../../../src/agent/role-cards/surface-links.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AA0ElE;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EACzB,aAAa,GAAE,SAAS,MAAM,EAAO,GACpC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAY3B;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,UAAU,GACV,cAAc,GACd,WAAW,GACX,SAAS,GACT,gBAAgB,GAChB,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,QAAQ,CAAC;AAQb;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CA8BrE;AAQD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,MAAM,EAAE,CAIrF"}
|