@cellarnode/ui 0.201.1 → 0.202.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/agent/composer.d.ts +6 -1
  2. package/dist/agent/composer.d.ts.map +1 -1
  3. package/dist/agent/composer.js +43 -9
  4. package/dist/agent/composer.js.map +1 -1
  5. package/dist/agent/conversation.d.ts +20 -2
  6. package/dist/agent/conversation.d.ts.map +1 -1
  7. package/dist/agent/conversation.js +37 -5
  8. package/dist/agent/conversation.js.map +1 -1
  9. package/dist/agent/copy.d.ts +7 -0
  10. package/dist/agent/copy.d.ts.map +1 -1
  11. package/dist/agent/copy.js +9 -0
  12. package/dist/agent/copy.js.map +1 -1
  13. package/dist/agent/fixtures.d.ts +34 -0
  14. package/dist/agent/fixtures.d.ts.map +1 -1
  15. package/dist/agent/fixtures.js +77 -0
  16. package/dist/agent/fixtures.js.map +1 -1
  17. package/dist/agent/index.d.ts +18 -1
  18. package/dist/agent/index.d.ts.map +1 -1
  19. package/dist/agent/index.js +18 -1
  20. package/dist/agent/index.js.map +1 -1
  21. package/dist/agent/markdown.d.ts +64 -0
  22. package/dist/agent/markdown.d.ts.map +1 -0
  23. package/dist/agent/markdown.js +220 -0
  24. package/dist/agent/markdown.js.map +1 -0
  25. package/dist/agent/masked-value.d.ts +1 -0
  26. package/dist/agent/masked-value.d.ts.map +1 -1
  27. package/dist/agent/masked-value.js +4 -1
  28. package/dist/agent/masked-value.js.map +1 -1
  29. package/dist/agent/message.d.ts +26 -6
  30. package/dist/agent/message.d.ts.map +1 -1
  31. package/dist/agent/message.js +47 -11
  32. package/dist/agent/message.js.map +1 -1
  33. package/dist/agent/panel-frame.js +1 -1
  34. package/dist/agent/panel-frame.js.map +1 -1
  35. package/dist/agent/role-cards/card-kit.d.ts +111 -0
  36. package/dist/agent/role-cards/card-kit.d.ts.map +1 -0
  37. package/dist/agent/role-cards/card-kit.js +68 -0
  38. package/dist/agent/role-cards/card-kit.js.map +1 -0
  39. package/dist/agent/role-cards/data-table-card.d.ts +80 -0
  40. package/dist/agent/role-cards/data-table-card.d.ts.map +1 -0
  41. package/dist/agent/role-cards/data-table-card.js +214 -0
  42. package/dist/agent/role-cards/data-table-card.js.map +1 -0
  43. package/dist/agent/role-cards/fixtures.d.ts +124 -0
  44. package/dist/agent/role-cards/fixtures.d.ts.map +1 -0
  45. package/dist/agent/role-cards/fixtures.js +401 -0
  46. package/dist/agent/role-cards/fixtures.js.map +1 -0
  47. package/dist/agent/role-cards/host-contract.d.ts +214 -0
  48. package/dist/agent/role-cards/host-contract.d.ts.map +1 -0
  49. package/dist/agent/role-cards/host-contract.js +348 -0
  50. package/dist/agent/role-cards/host-contract.js.map +1 -0
  51. package/dist/agent/role-cards/inspector-drawer.d.ts +42 -0
  52. package/dist/agent/role-cards/inspector-drawer.d.ts.map +1 -0
  53. package/dist/agent/role-cards/inspector-drawer.js +68 -0
  54. package/dist/agent/role-cards/inspector-drawer.js.map +1 -0
  55. package/dist/agent/role-cards/inspector-fixtures.d.ts +84 -0
  56. package/dist/agent/role-cards/inspector-fixtures.d.ts.map +1 -0
  57. package/dist/agent/role-cards/inspector-fixtures.js +162 -0
  58. package/dist/agent/role-cards/inspector-fixtures.js.map +1 -0
  59. package/dist/agent/role-cards/inspector-record.d.ts +109 -0
  60. package/dist/agent/role-cards/inspector-record.d.ts.map +1 -0
  61. package/dist/agent/role-cards/inspector-record.js +346 -0
  62. package/dist/agent/role-cards/inspector-record.js.map +1 -0
  63. package/dist/agent/role-cards/inspector-view.d.ts +137 -0
  64. package/dist/agent/role-cards/inspector-view.d.ts.map +1 -0
  65. package/dist/agent/role-cards/inspector-view.js +261 -0
  66. package/dist/agent/role-cards/inspector-view.js.map +1 -0
  67. package/dist/agent/role-cards/match-card.d.ts +21 -0
  68. package/dist/agent/role-cards/match-card.d.ts.map +1 -0
  69. package/dist/agent/role-cards/match-card.js +30 -0
  70. package/dist/agent/role-cards/match-card.js.map +1 -0
  71. package/dist/agent/role-cards/offer-card.d.ts +27 -0
  72. package/dist/agent/role-cards/offer-card.d.ts.map +1 -0
  73. package/dist/agent/role-cards/offer-card.js +68 -0
  74. package/dist/agent/role-cards/offer-card.js.map +1 -0
  75. package/dist/agent/role-cards/opportunity-card.d.ts +26 -0
  76. package/dist/agent/role-cards/opportunity-card.d.ts.map +1 -0
  77. package/dist/agent/role-cards/opportunity-card.js +50 -0
  78. package/dist/agent/role-cards/opportunity-card.js.map +1 -0
  79. package/dist/agent/role-cards/product-card.d.ts +32 -0
  80. package/dist/agent/role-cards/product-card.d.ts.map +1 -0
  81. package/dist/agent/role-cards/product-card.js +50 -0
  82. package/dist/agent/role-cards/product-card.js.map +1 -0
  83. package/dist/agent/role-cards/proposal-diff.d.ts +38 -0
  84. package/dist/agent/role-cards/proposal-diff.d.ts.map +1 -0
  85. package/dist/agent/role-cards/proposal-diff.js +74 -0
  86. package/dist/agent/role-cards/proposal-diff.js.map +1 -0
  87. package/dist/agent/role-cards/registry.d.ts +43 -0
  88. package/dist/agent/role-cards/registry.d.ts.map +1 -0
  89. package/dist/agent/role-cards/registry.js +46 -0
  90. package/dist/agent/role-cards/registry.js.map +1 -0
  91. package/dist/agent/role-cards/score-meter.d.ts +12 -0
  92. package/dist/agent/role-cards/score-meter.d.ts.map +1 -0
  93. package/dist/agent/role-cards/score-meter.js +17 -0
  94. package/dist/agent/role-cards/score-meter.js.map +1 -0
  95. package/dist/agent/role-cards/surface-links.d.ts +54 -0
  96. package/dist/agent/role-cards/surface-links.d.ts.map +1 -0
  97. package/dist/agent/role-cards/surface-links.js +149 -0
  98. package/dist/agent/role-cards/surface-links.js.map +1 -0
  99. package/dist/agent/role-cards/text-safety.d.ts +24 -0
  100. package/dist/agent/role-cards/text-safety.d.ts.map +1 -0
  101. package/dist/agent/role-cards/text-safety.js +61 -0
  102. package/dist/agent/role-cards/text-safety.js.map +1 -0
  103. package/dist/agent/schema.d.ts +7 -0
  104. package/dist/agent/schema.d.ts.map +1 -1
  105. package/dist/agent/schema.js +25 -2
  106. package/dist/agent/schema.js.map +1 -1
  107. package/dist/agent/states.d.ts +1 -0
  108. package/dist/agent/states.d.ts.map +1 -1
  109. package/dist/agent/states.js +1 -1
  110. package/dist/agent/states.js.map +1 -1
  111. package/dist/agent/thinking.d.ts +13 -4
  112. package/dist/agent/thinking.d.ts.map +1 -1
  113. package/dist/agent/thinking.js +15 -6
  114. package/dist/agent/thinking.js.map +1 -1
  115. package/dist/agent/thread-list.d.ts +33 -2
  116. package/dist/agent/thread-list.d.ts.map +1 -1
  117. package/dist/agent/thread-list.js +158 -8
  118. package/dist/agent/thread-list.js.map +1 -1
  119. package/dist/agent/tool-activity-model.d.ts +136 -0
  120. package/dist/agent/tool-activity-model.d.ts.map +1 -0
  121. package/dist/agent/tool-activity-model.js +288 -0
  122. package/dist/agent/tool-activity-model.js.map +1 -0
  123. package/dist/agent/tool-activity.d.ts +55 -0
  124. package/dist/agent/tool-activity.d.ts.map +1 -0
  125. package/dist/agent/tool-activity.js +159 -0
  126. package/dist/agent/tool-activity.js.map +1 -0
  127. package/dist/agent/tool-call-card.d.ts +9 -1
  128. package/dist/agent/tool-call-card.d.ts.map +1 -1
  129. package/dist/agent/tool-call-card.js +7 -1
  130. package/dist/agent/tool-call-card.js.map +1 -1
  131. package/dist/agent/ui.js +1 -1
  132. package/dist/agent/ui.js.map +1 -1
  133. package/dist/agent/use-motion.d.ts +15 -0
  134. package/dist/agent/use-motion.d.ts.map +1 -0
  135. package/dist/agent/use-motion.js +52 -0
  136. package/dist/agent/use-motion.js.map +1 -0
  137. package/dist/chat/use-stick-to-bottom.d.ts +5 -0
  138. package/dist/chat/use-stick-to-bottom.d.ts.map +1 -1
  139. package/dist/chat/use-stick-to-bottom.js +11 -1
  140. package/dist/chat/use-stick-to-bottom.js.map +1 -1
  141. package/dist/components/sheet.d.ts +3 -1
  142. package/dist/components/sheet.d.ts.map +1 -1
  143. package/dist/components/sheet.js +2 -2
  144. package/dist/components/sheet.js.map +1 -1
  145. package/dist/portfolio-import/import-job-panels.d.ts +6 -0
  146. package/dist/portfolio-import/import-job-panels.d.ts.map +1 -1
  147. package/dist/portfolio-import/import-job-panels.js +11 -4
  148. package/dist/portfolio-import/import-job-panels.js.map +1 -1
  149. package/dist/portfolio-import/job-error-copy.d.ts +62 -0
  150. package/dist/portfolio-import/job-error-copy.d.ts.map +1 -0
  151. package/dist/portfolio-import/job-error-copy.js +78 -0
  152. package/dist/portfolio-import/job-error-copy.js.map +1 -0
  153. package/dist/realtime/organisation-events/schemas.d.ts +2 -2
  154. package/package.json +4 -1
  155. package/src/theme/tokens.css +66 -0
@@ -0,0 +1,261 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useMemo, useRef, useState } from "react";
3
+ import { FileSearch } from "lucide-react";
4
+ import { EmptyState } from "../../components/empty-state.js";
5
+ import { Skeleton } from "../../components/skeleton.js";
6
+ import { cn } from "../../lib/utils.js";
7
+ import { fmt, quoteText, useCopy } from "../copy.js";
8
+ import { MaskedValue } from "../masked-value.js";
9
+ import { AgentError, ERROR_COPY } from "../states.js";
10
+ import { focusRing } from "../ui.js";
11
+ import { AgentCardActions, AgentChip, } from "./card-kit.js";
12
+ import { catalogRecordLabel, offeredActions, readRoleCard, } from "./host-contract.js";
13
+ import { AgentInspectorRecord, buildRecordView, compilePathMatcher, DEFAULT_INSPECTOR_RECORD_COPY, humanizeKey, } from "./inspector-record.js";
14
+ import { AgentProposalDiff } from "./proposal-diff.js";
15
+ import { AgentScoreMeter } from "./score-meter.js";
16
+ import { cleanInline } from "./text-safety.js";
17
+ const DEFAULT_COPY = {
18
+ ...DEFAULT_INSPECTOR_RECORD_COPY,
19
+ description: "Full record details and the actions the agent offered.",
20
+ kinds: {
21
+ product: "Product",
22
+ variant: "Product version",
23
+ offer: "Offer",
24
+ opportunity: "Opportunity",
25
+ match: "Match",
26
+ org: "Organisation",
27
+ user: "User",
28
+ label: "Label",
29
+ brand_profile: "Brand profile",
30
+ lab_report: "Lab report",
31
+ extraction_job: "Extraction job",
32
+ },
33
+ detailsRegion: "Record details",
34
+ loading: "Loading the full record",
35
+ emptyHeadline: "Nothing more to show",
36
+ emptyBody: "The record has no further details.",
37
+ missingHeadline: "Record not available",
38
+ missingBody: "It may have been removed, or you may not have access to it.",
39
+ actionRefused: "This action cannot run from here any more. Ask the agent to try again.",
40
+ matchScore: "Match score",
41
+ declined: "Declined",
42
+ };
43
+ export { DEFAULT_COPY as DEFAULT_INSPECTOR_VIEW_COPY };
44
+ /** The error banner says what failed to load (the record), not what failed in the conversation. */
45
+ const DEFAULT_ERROR_COPY = {
46
+ ...ERROR_COPY,
47
+ genericTitle: "Could not load this record",
48
+ genericBody: "The record did not load. Nothing was changed.",
49
+ unavailableTitle: "Records are unavailable",
50
+ unavailableBody: "The service that holds this record is not responding. Try again in a few minutes.",
51
+ };
52
+ export { DEFAULT_ERROR_COPY as DEFAULT_INSPECTOR_ERROR_COPY };
53
+ /**
54
+ * Text that was written by someone else, by record path, per record kind. It renders as quoted text, never as the app's own words
55
+ * (agent-cards README, "Third-party text"). A path counts when it OR any ancestor is listed, so `counterparty` covers
56
+ * `counterparty.name`; a bare name matches at any depth, a longer path is anchored at the root, and `[]` is any list position.
57
+ * `thirdPartyPaths` EXTENDS these.
58
+ */
59
+ export const DEFAULT_THIRD_PARTY_PATHS = {
60
+ // The first names are the agent-cards card fields; the rest are the V2 record DTOs `fetchRecord` returns
61
+ // (offers, opportunities and matching `public-response-schemas.ts`).
62
+ opportunity: [
63
+ "name",
64
+ "description",
65
+ "requirements",
66
+ "buyer",
67
+ "contact",
68
+ "creatorOrgName",
69
+ "tender.instructions",
70
+ "namedCertifications[].rawName",
71
+ ],
72
+ offer: [
73
+ "counterparty",
74
+ "rounds[].note",
75
+ "contact",
76
+ "opportunity",
77
+ "opportunitySnapshot.name",
78
+ "opportunitySnapshot.buyerName",
79
+ "opportunitySnapshot.description",
80
+ "importerOrgName",
81
+ "message",
82
+ "notes",
83
+ ],
84
+ match: [
85
+ "opportunity",
86
+ "market",
87
+ "buyer",
88
+ "title",
89
+ "creatorOrgName",
90
+ "buyerPreferences",
91
+ "marketNotes",
92
+ ],
93
+ };
94
+ /**
95
+ * `null` for an unknown type, data that fails the schema, a card whose `detail` disagrees with it, or a card with no `detail`
96
+ * pointer: there is nothing to inspect. Everything else is what `readRoleCard` made safe.
97
+ */
98
+ export function readInspectorCard(cardType, data, catalog) {
99
+ const read = readRoleCard(cardType, data, catalog);
100
+ const detail = read?.data.detail;
101
+ if (!read || !detail || !read.subject)
102
+ return null;
103
+ const base = {
104
+ detail,
105
+ subject: read.subject,
106
+ actions: read.data.actions,
107
+ proposal: read.data.proposal,
108
+ };
109
+ switch (read.cardType) {
110
+ case "OfferCard": {
111
+ const p = read.data.product;
112
+ return {
113
+ ...base,
114
+ title: p === undefined || p === null || p === "" ? undefined : p,
115
+ titleKey: "product",
116
+ };
117
+ }
118
+ case "MatchCard":
119
+ return {
120
+ ...base,
121
+ title: read.data.label,
122
+ titleKey: "label",
123
+ score: read.data.score,
124
+ declined: read.data.declined,
125
+ };
126
+ case "ProductCard":
127
+ return { ...base, title: read.data.name, titleKey: "name" };
128
+ case "OpportunityCard":
129
+ return { ...base, title: read.data.name, titleKey: "name" };
130
+ }
131
+ }
132
+ /** The hook the drawer and the view share, so one card is read once per change of its data. */
133
+ export function useInspectorCard(cardType, data, catalog) {
134
+ return useMemo(() => readInspectorCard(cardType, data, catalog), [cardType, data, catalog]);
135
+ }
136
+ const NO_PATHS = [];
137
+ function DefaultHeading({ eyebrow, title, description, aside }) {
138
+ return (_jsxs("div", { className: "flex shrink-0 flex-col gap-1 border-b border-border/60 px-4 py-3", children: [eyebrow && _jsx("p", { className: "text-xs/4 text-muted-foreground", children: eyebrow }), _jsx("h2", { className: "text-base/6 font-semibold text-balance break-words", children: title }), _jsx("p", { className: "sr-only", children: description }), aside] }));
139
+ }
140
+ /**
141
+ * @internal The inspector (CEL-2487): the full record behind a role card's `detail` pointer, the card's typed `actions[]` and its
142
+ * `proposal`, with no dialog parts, so a drawer (`AgentInspectorDrawer`) or the tier-3 canvas can hold it. It owns the content and
143
+ * the host contract; the surface owns the chrome and what a hand-off does to it (`onHandOff`).
144
+ *
145
+ * Pure props in, events out. It never fetches (the host passes `record`) and never runs a tool. Everything that writes goes through
146
+ * the same host contract as the inline card: `AgentCardActions` hands the host a catalog-built confirm plan, never the model's
147
+ * action; `AgentProposalDiff` re-fetches the record and hands over `planProposalApply`'s result. A refused action stays in the view
148
+ * and says so. Renders nothing for a card it cannot inspect (see `readInspectorCard`).
149
+ */
150
+ export function AgentInspectorView({ cardType, data, record, onErrorAction, fieldLabels, fieldLabelsByKind, thirdPartyPaths = NO_PATHS, hiddenPaths = NO_PATHS, formatValue, heading, onHandOff, active = true, copy, className, ...host }) {
151
+ const { errorCopy, actionsCopy, maskedCopy, kinds, ...rest } = copy ?? {};
152
+ const c = useCopy(DEFAULT_COPY, { ...rest, kinds: { ...DEFAULT_COPY.kinds, ...kinds } });
153
+ const card = useInspectorCard(cardType, data, host.catalog);
154
+ const id = useId();
155
+ // Local to the open view: it unmounts with its surface, so a refusal never carries over to the next card.
156
+ const [refusedFor, setRefusedFor] = useState(null);
157
+ // Read when a hand-off fires, not when it is built: an Apply that resolves late must see the surface as it is THEN.
158
+ const activeRef = useRef(active);
159
+ useEffect(() => {
160
+ activeRef.current = active;
161
+ }, [active]);
162
+ /** A host hand-off, run only while the view is active (checked when it fires), followed by `onHandOff`. */
163
+ const gate = (fn, what) => fn &&
164
+ ((...args) => {
165
+ if (!activeRef.current)
166
+ return;
167
+ fn(...args);
168
+ onHandOff?.(what);
169
+ });
170
+ const kind = card?.detail.kind;
171
+ // The record this view is about. Everything below the heading is keyed by it, so switching cards (the host re-points the
172
+ // surface) drops the previous card's in-flight Apply and its refusal instead of carrying them over.
173
+ const cardKey = card ? `${card.detail.kind}:${card.detail.id}` : null;
174
+ const refused = refusedFor === cardKey;
175
+ const isThirdParty = useMemo(() => compilePathMatcher([
176
+ ...((kind && DEFAULT_THIRD_PARTY_PATHS[kind]) || []),
177
+ ...thirdPartyPaths,
178
+ ]), [kind, thirdPartyPaths]);
179
+ const isHidden = useMemo(() => compilePathMatcher(hiddenPaths), [hiddenPaths]);
180
+ const labels = useMemo(() => ({ ...fieldLabels, ...(kind ? fieldLabelsByKind?.[kind] : undefined) }), [fieldLabels, fieldLabelsByKind, kind]);
181
+ // A `ready` state for another record than the open card's `detail` is the host's fetch not catching up: show loading, not that record.
182
+ const forThisCard = !!card &&
183
+ record.status === "ready" &&
184
+ record.for.kind === card.detail.kind &&
185
+ record.for.id === card.detail.id;
186
+ const readyRecord = record.status === "ready" && forThisCard ? record.record : undefined;
187
+ const state = record.status === "ready" && !forThisCard ? "loading" : record.status;
188
+ const view = useMemo(() => buildRecordView(readyRecord, {
189
+ focus: card?.detail.focus,
190
+ labels,
191
+ itemLabel: (n) => fmt(c.item, { n }),
192
+ trail: (parent, child) => fmt(c.trail, { parent, child }),
193
+ notShown: c.notShown,
194
+ hidden: isHidden,
195
+ }), [readyRecord, card?.detail.focus, labels, c.item, c.trail, c.notShown, isHidden]);
196
+ if (!card || !kind)
197
+ return null;
198
+ const kindLabel = Object.hasOwn(c.kinds, kind) ? c.kinds[kind] : humanizeKey(kind);
199
+ // Once the record is in, its own name wins over the card's claim; the kind is the title only when neither has one.
200
+ const rec = readyRecord !== null && typeof readyRecord === "object" && !Array.isArray(readyRecord)
201
+ ? readyRecord
202
+ : undefined;
203
+ const recordKey = rec
204
+ ? ["name", "title", "label"].find((k) => typeof rec[k] === "string")
205
+ : undefined;
206
+ // The host's own label for the record (a catalog `recordLabel`) wins over the record's name, and that wins over the card's claim.
207
+ const hostLabel = rec &&
208
+ catalogRecordLabel(host.catalog, kind, rec, [
209
+ card.proposal?.tool,
210
+ ...(card.actions ?? []).map((a) => a.tool),
211
+ ]);
212
+ const recordTitle = hostLabel ?? (rec && recordKey ? cleanInline(rec[recordKey], 120, true) : undefined);
213
+ const ownTitle = recordTitle ?? card.title;
214
+ // Whose words is the title? A key we read it from decides; a host label does not say, so it is quoted when the kind's name or
215
+ // title is someone else's text.
216
+ const titleIsThirdParty = hostLabel
217
+ ? isThirdParty("name") || isThirdParty("title")
218
+ : isThirdParty(recordTitle && recordKey ? recordKey : card.titleKey);
219
+ const title = ownTitle === undefined
220
+ ? kindLabel
221
+ : typeof ownTitle === "string" && titleIsThirdParty
222
+ ? quoteText(ownTitle, c.quote)
223
+ : ownTitle;
224
+ const parts = {
225
+ eyebrow: ownTitle === undefined ? undefined : kindLabel,
226
+ title: _jsx(MaskedValue, { value: title, copy: maskedCopy }),
227
+ description: c.description,
228
+ aside: card.score !== undefined ? (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(AgentScoreMeter, { score: card.score, label: c.matchScore }), card.declined && _jsx(AgentChip, { tone: "neutral", children: c.declined })] })) : undefined,
229
+ };
230
+ const onAction = host.onAction;
231
+ const hasActions = offeredActions(card.actions, host.catalog, {
232
+ canRunTools: !!onAction,
233
+ allowLink: host.allowLink,
234
+ }).length > 0;
235
+ const missing = state === "ready" &&
236
+ (readyRecord === null || typeof readyRecord !== "object" || Array.isArray(readyRecord));
237
+ return (_jsxs("div", { className: cn("flex min-h-0 flex-1 flex-col", className), children: [heading ? heading(parts) : _jsx(DefaultHeading, { ...parts }), _jsxs("div", { role: "region", "aria-label": c.detailsRegion, "aria-busy": state === "loading",
238
+ // Focusable so a keyboard user can scroll a long record; the ring is inset because the region clips its own outline.
239
+ tabIndex: 0, className: cn("@container flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto overscroll-contain px-4 py-4", focusRing, "focus-visible:-outline-offset-2"), children: [card.proposal && (_jsx(AgentProposalDiff, { proposal: card.proposal, catalog: host.catalog, fetchRecord: host.fetchRecord, expected: card.subject, onApply: gate(host.onApplyProposal, "apply"), onEdit: gate(host.onEditProposal, "edit"), onReject: gate(host.onRejectProposal, "reject"), copy: host.proposalCopy })), state === "loading" && (_jsxs("div", { role: "status", className: "flex flex-col gap-3", children: [_jsx("span", { className: "sr-only", children: c.loading }), _jsx(Skeleton, { className: "h-3 w-24" }), _jsx("div", { className: "grid grid-cols-2 gap-x-4 gap-y-3 @sm:grid-cols-3", children: Array.from({ length: 6 }, (_, i) => (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Skeleton, { className: "h-3 w-16" }), _jsx(Skeleton, { className: "h-4 w-24" })] }, i))) })] })), state === "error" && (_jsx(AgentError, { kind: record.status === "error" ? (record.kind ?? "generic") : "generic", onAction: onErrorAction, copy: { ...DEFAULT_ERROR_COPY, ...errorCopy } })), state === "ready" && (missing || view.isEmpty) && (_jsx(EmptyState, { tone: "neutral", icon: _jsx(FileSearch, { "aria-hidden": true, className: "size-5" }), headline: missing ? c.missingHeadline : c.emptyHeadline, description: missing ? c.missingBody : c.emptyBody, entranceMotion: false })), state === "ready" && !missing && !view.isEmpty && (_jsx(AgentInspectorRecord, { view: view, isThirdParty: isThirdParty, formatValue: formatValue && ((path, value) => formatValue(path, value, kind)), copy: c, maskedCopy: maskedCopy, headingId: (name) => `${id}-${name}` }))] }), refused && (_jsx("p", { role: "alert", className: "shrink-0 px-4 pb-2 text-xs/4 font-medium text-(--tone-danger-fg)", children: c.actionRefused })), _jsx("div", { className: cn("shrink-0 px-4 pb-[max(0.75rem,env(safe-area-inset-bottom))]", !hasActions && "hidden"), onClick: (event) => {
240
+ // A link leaves the view: the surface must not stay open over the page it navigated to.
241
+ if (event.button !== 0 ||
242
+ event.metaKey ||
243
+ event.ctrlKey ||
244
+ event.shiftKey ||
245
+ event.altKey)
246
+ return;
247
+ if (event.target instanceof Element && event.target.closest("a[href]"))
248
+ onHandOff?.("link");
249
+ }, children: _jsx(AgentCardActions, { actions: card.actions, catalog: host.catalog, allowLink: host.allowLink, renderLink: host.renderLink, copy: actionsCopy, onAction: onAction &&
250
+ ((result) => {
251
+ if (!activeRef.current)
252
+ return;
253
+ setRefusedFor(null);
254
+ onAction(result);
255
+ onHandOff?.("action");
256
+ }), onActionRefused: (action, reason) => {
257
+ setRefusedFor(cardKey);
258
+ host.onActionRefused?.(action, reason);
259
+ } }) })] }, cardKey));
260
+ }
261
+ //# sourceMappingURL=inspector-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector-view.js","sourceRoot":"","sources":["../../../src/agent/role-cards/inspector-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { MatchCardData } from "@cellarnode/agent-cards/zod4";
2
+ import { type AgentRoleCardHostProps } from "./card-kit.js";
3
+ export interface AgentMatchCardCopy {
4
+ title: string;
5
+ scoreLabel: string;
6
+ product: string;
7
+ opportunity: string;
8
+ volume: string;
9
+ price: string;
10
+ deadline: string;
11
+ declined: string;
12
+ daysLeft: string;
13
+ buyerCountry: string;
14
+ }
15
+ export interface AgentMatchCardProps extends AgentRoleCardHostProps {
16
+ data: MatchCardData;
17
+ copy?: Partial<AgentMatchCardCopy>;
18
+ }
19
+ /** @internal Read card for one match (CEL-2445): the 0 to 5 score, the product against the opportunity, why it fits. */
20
+ export declare function AgentMatchCard({ data, copy, ...host }: AgentMatchCardProps): import("react/jsx-runtime").JSX.Element | null;
21
+ //# sourceMappingURL=match-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-card.d.ts","sourceRoot":"","sources":["../../../src/agent/role-cards/match-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EAEL,KAAK,sBAAsB,EAM5B,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAcD,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IACjE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACpC;AAED,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,mBAAmB,kDAuE1E"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { fmt, useCopy } from "../copy.js";
3
+ import { AgentCardExtras, AgentCardFrame, AgentCardLink, AgentChip, AgentField, AgentFieldGrid, } from "./card-kit.js";
4
+ import { detailAgrees } from "./host-contract.js";
5
+ import { AgentScoreMeter } from "./score-meter.js";
6
+ import { MaskedValue } from "../masked-value.js";
7
+ const DEFAULT_COPY = {
8
+ title: "Match",
9
+ scoreLabel: "Match score",
10
+ product: "Your product",
11
+ opportunity: "Opportunity",
12
+ volume: "Volume",
13
+ price: "Price",
14
+ deadline: "Deadline",
15
+ declined: "Declined",
16
+ daysLeft: "{n} days left",
17
+ buyerCountry: "{buyer}, {country}",
18
+ };
19
+ /** @internal Read card for one match (CEL-2445): the 0 to 5 score, the product against the opportunity, why it fits. */
20
+ export function AgentMatchCard({ data, copy, ...host }) {
21
+ const { allowLink, renderLink, maskedCopy } = host;
22
+ const c = useCopy(DEFAULT_COPY, copy);
23
+ // A `detail` that names a different record than the card's own matchId is refused, not reconciled.
24
+ if (!detailAgrees("MatchCard", data))
25
+ return null;
26
+ const opp = data.opportunity;
27
+ const days = data.daysRemaining;
28
+ return (_jsxs(AgentCardFrame, { title: _jsx(AgentCardLink, { path: data.link, allowLink: allowLink, renderLink: renderLink, children: data.label ?? c.title }), badge: data.declined ? _jsx(AgentChip, { tone: "neutral", children: c.declined }) : undefined, children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx(AgentScoreMeter, { score: data.score, label: c.scoreLabel }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-2", children: [data.product && (_jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: "text-xs/4 text-muted-foreground", children: c.product }), _jsx("span", { className: "min-w-0 text-sm/5 font-medium break-words", children: _jsx(AgentCardLink, { path: data.product.link, allowLink: allowLink, renderLink: renderLink, children: _jsx(MaskedValue, { value: data.product.name, copy: maskedCopy }) }) })] })), opp && (_jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: "text-xs/4 text-muted-foreground", children: c.opportunity }), _jsx("span", { className: "min-w-0 text-sm/5 font-medium break-words", children: _jsx(AgentCardLink, { path: opp.link, allowLink: allowLink, renderLink: renderLink, children: _jsx(MaskedValue, { value: opp.name, copy: maskedCopy }) }) }), (opp.buyer || opp.country) && (_jsx("span", { className: "text-xs/4 text-muted-foreground", children: opp.buyer && opp.country ? (_jsxs(_Fragment, { children: [_jsx(MaskedValue, { value: opp.buyer, copy: maskedCopy }), `, ${opp.country}`] })) : opp.buyer ? (_jsx(MaskedValue, { value: opp.buyer, copy: maskedCopy })) : (opp.country) }))] }))] })] }), data.explanation && _jsx("p", { className: "text-sm/5 text-pretty", children: data.explanation }), _jsxs(AgentFieldGrid, { children: [_jsx(AgentField, { label: c.volume, value: data.volume, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.price, value: data.price, maskedCopy: maskedCopy }), _jsx(AgentField, { label: c.deadline, value: data.deadline, maskedCopy: maskedCopy })] }), days !== undefined && days !== null && days >= 0 && (_jsx("p", { className: "text-xs/4 text-muted-foreground", children: fmt(c.daysLeft, { n: days }) })), _jsx(AgentCardExtras, { data: data, subject: { kind: "match", id: data.matchId }, host: host })] }));
29
+ }
30
+ //# sourceMappingURL=match-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-card.js","sourceRoot":"","sources":["../../../src/agent/role-cards/match-card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { OfferCardData } from "@cellarnode/agent-cards/zod4";
2
+ import { type AgentRoleCardHostProps } from "./card-kit.js";
3
+ export interface AgentOfferCardCopy {
4
+ title: string;
5
+ product: string;
6
+ opportunity: string;
7
+ counterparty: string;
8
+ price: string;
9
+ volume: string;
10
+ validThrough: string;
11
+ round: string;
12
+ messages: string;
13
+ attachments: string;
14
+ awaitingYou: string;
15
+ awaitingCounterparty: string;
16
+ openOffer: string;
17
+ /** How text written by the other side is set off: `{text}` is the text. */
18
+ quote: string;
19
+ status: Record<OfferCardData["status"], string>;
20
+ }
21
+ export interface AgentOfferCardProps extends AgentRoleCardHostProps {
22
+ data: OfferCardData;
23
+ copy?: Partial<AgentOfferCardCopy>;
24
+ }
25
+ /** @internal Read card for one offer (CEL-2445): status, product, counterparty, terms, who acts next. */
26
+ export declare function AgentOfferCard({ data, copy, ...host }: AgentOfferCardProps): import("react/jsx-runtime").JSX.Element | null;
27
+ //# sourceMappingURL=offer-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer-card.d.ts","sourceRoot":"","sources":["../../../src/agent/role-cards/offer-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAKlE,OAAO,EAEL,KAAK,sBAAsB,EAM5B,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;CACjD;AAyCD,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IACjE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACpC;AASD,yGAAyG;AACzG,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,mBAAmB,kDAuD1E"}
@@ -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"}