@cellarnode/ui 0.201.0 → 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 (158) 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/chat-composer.d.ts.map +1 -1
  138. package/dist/chat/chat-composer.js +1 -1
  139. package/dist/chat/chat-composer.js.map +1 -1
  140. package/dist/chat/use-stick-to-bottom.d.ts +5 -0
  141. package/dist/chat/use-stick-to-bottom.d.ts.map +1 -1
  142. package/dist/chat/use-stick-to-bottom.js +11 -1
  143. package/dist/chat/use-stick-to-bottom.js.map +1 -1
  144. package/dist/components/sheet.d.ts +3 -1
  145. package/dist/components/sheet.d.ts.map +1 -1
  146. package/dist/components/sheet.js +2 -2
  147. package/dist/components/sheet.js.map +1 -1
  148. package/dist/portfolio-import/import-job-panels.d.ts +6 -0
  149. package/dist/portfolio-import/import-job-panels.d.ts.map +1 -1
  150. package/dist/portfolio-import/import-job-panels.js +11 -4
  151. package/dist/portfolio-import/import-job-panels.js.map +1 -1
  152. package/dist/portfolio-import/job-error-copy.d.ts +62 -0
  153. package/dist/portfolio-import/job-error-copy.d.ts.map +1 -0
  154. package/dist/portfolio-import/job-error-copy.js +78 -0
  155. package/dist/portfolio-import/job-error-copy.js.map +1 -0
  156. package/dist/realtime/organisation-events/schemas.d.ts +2 -2
  157. package/package.json +4 -1
  158. package/src/theme/tokens.css +66 -0
@@ -13,12 +13,29 @@ export { AgentThinking } from "./thinking.js";
13
13
  export { AgentEmptyState, AgentError, } from "./states.js";
14
14
  export { AgentConfirmCard, DEFAULT_CONFIRM_CARD_COPY, } from "./confirm-card.js";
15
15
  export { AgentApprovalLedger, } from "./approval-ledger.js";
16
+ export { AgentToolActivity, } from "./tool-activity.js";
17
+ export { DEFAULT_ACRONYMS, DEFAULT_TOOL_PREFIXES, DEFAULT_TOOL_VERBS, MAX_PREVIEW_CHARS, createToolNamer, formatToolResult, humanizeCardType, humanizeToolName, planMessageParts, unwrapResultEnvelope, } from "./tool-activity-model.js";
18
+ export { AgentMarkdown, classifyHref, resolveLink, } from "./markdown.js";
19
+ /** @deprecated Superseded by `AgentToolActivity`; `AgentMessage` no longer renders it. */
16
20
  export { AgentToolCallCard, } from "./tool-call-card.js";
17
21
  export { AgentActivityLedger, } from "./activity-ledger.js";
18
22
  export { AgentComposer } from "./composer.js";
19
23
  export { AgentMessage } from "./message.js";
20
24
  export { AgentConversation, } from "./conversation.js";
21
25
  export { AgentPanelFrame, } from "./panel-frame.js";
22
- export { AgentThreadList, } from "./thread-list.js";
26
+ export { AgentThreadList, deriveThreadTitle, threadDisplayTitle, THREAD_TITLE_MAX, } from "./thread-list.js";
23
27
  export { AgentReadinessChecklist, } from "./readiness-checklist.js";
28
+ export { AgentCardActions, AgentCardFrame, AgentCardLink, AgentChip, AgentField, AgentFieldGrid, AgentCardExtras, } from "./role-cards/card-kit.js";
29
+ export { AgentScoreMeter } from "./role-cards/score-meter.js";
30
+ export { AgentProposalDiff, } from "./role-cards/proposal-diff.js";
31
+ export { AgentOfferCard, } from "./role-cards/offer-card.js";
32
+ export { AgentProductCard, } from "./role-cards/product-card.js";
33
+ export { AgentOpportunityCard, } from "./role-cards/opportunity-card.js";
34
+ export { AgentMatchCard, } from "./role-cards/match-card.js";
35
+ export { AgentDataTableCard, DEFAULT_THIRD_PARTY_COLUMNS, MAX_AGENT_TABLE_ROWS, } from "./role-cards/data-table-card.js";
36
+ export { agentLinkKind, createSurfaceAllowLink, surfaceThirdPartyColumns, } from "./role-cards/surface-links.js";
37
+ export { AgentInspectorDrawer, } from "./role-cards/inspector-drawer.js";
38
+ export { AgentInspectorView, DEFAULT_THIRD_PARTY_PATHS, } from "./role-cards/inspector-view.js";
39
+ export { renderRoleAgentCard, ROLE_AGENT_CARD_TYPES, } from "./role-cards/registry.js";
40
+ export { buildConfirm, planProposalApply, actionsForDisplay, lookupPath, readPath, resolveCardActions, subjectOf, } from "./role-cards/host-contract.js";
24
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,cAAc,GAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAA+C,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAmD,MAAM,YAAY,CAAC;AAC5F,OAAO,EACL,eAAe,EACf,UAAU,GAMX,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,gBAAgB,EAChB,yBAAyB,GAG1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,GAGlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAmD,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAiD,MAAM,WAAW,CAAC;AACxF,OAAO,EACL,iBAAiB,GAGlB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,eAAe,GAGhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,GAGhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,GAKxB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,cAAc,GAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAA+C,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAmD,MAAM,YAAY,CAAC;AAC5F,OAAO,EACL,eAAe,EACf,UAAU,GAMX,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,gBAAgB,EAChB,yBAAyB,GAG1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,GAGlB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GAcrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,GAKZ,MAAM,YAAY,CAAC;AACpB,0FAA0F;AAC1F,OAAO,EACL,iBAAiB,GAGlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAmD,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAiD,MAAM,WAAW,CAAC;AACxF,OAAO,EACL,iBAAiB,GAGlB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,eAAe,GAGhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GAGjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,GAKxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,SAAS,EACT,UAAU,EACV,cAAc,EAKd,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EACL,iBAAiB,GAGlB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,cAAc,GAGf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,GAGjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,oBAAoB,GAGrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,cAAc,GAGf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,oBAAoB,GAGrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,wBAAwB,GAGzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,GAIrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,yBAAyB,GAO1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GAItB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,SAAS,GAcV,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,64 @@
1
+ export interface AgentMarkdownCopy {
2
+ /** Read after the text of a link that leaves the app, with its own brackets: "(opens in a new tab)". */
3
+ opensInNewTab: string;
4
+ /** Shown after the text of an external link, so the destination is visible: `{host}` ("example.com"). */
5
+ externalHost: string;
6
+ taskDone: string;
7
+ taskOpen: string;
8
+ }
9
+ export type AgentLinkClass = {
10
+ kind: "external";
11
+ href: string;
12
+ } | {
13
+ kind: "internal";
14
+ href: string;
15
+ } | {
16
+ kind: "blocked";
17
+ };
18
+ /**
19
+ * What the host says about a link: an internal path, an external site, or neither. It can only NARROW what the lib already
20
+ * allows (`http(s)` URLs and internal `/paths`): answering "internal" or "external" for anything else, or for the wrong kind,
21
+ * changes nothing. A host that links to its own routes only answers "blocked" for everything else, including every external URL.
22
+ */
23
+ export type AgentLinkPolicy = (href: string) => "internal" | "external" | "blocked";
24
+ /**
25
+ * @internal The default link policy, and the floor under every host policy. The agent's text is untrusted (a customer can write
26
+ * text the agent repeats), so a link is live only for `http(s):` or an internal `/path`; everything else (`mailto:`,
27
+ * `javascript:`, `data:`, `//host`, `/\host`, `#frag`, a bare relative path, a URL with control characters) is blocked and
28
+ * renders as plain text.
29
+ */
30
+ export declare function classifyHref(raw: string | undefined | null): AgentLinkClass;
31
+ /** The lib's floor, then the host's policy (which can only block more). Applied at render, to every link form. */
32
+ export declare function resolveLink(raw: string | undefined | null, policy?: AgentLinkPolicy): AgentLinkClass;
33
+ export interface AgentMarkdownProps {
34
+ text: string;
35
+ /** The text is still arriving: a caret marks the end of the last block. */
36
+ streaming?: boolean;
37
+ /**
38
+ * Called for a click on an internal `/path` link (no modifier key). Pass the router's navigate so the SPA does not
39
+ * reload; without it the link is a plain anchor.
40
+ */
41
+ onNavigate?: (path: string) => void;
42
+ /**
43
+ * Which links are live. Default: `http(s)` URLs (external) and internal `/paths`. A host that only has its own routes
44
+ * answers "blocked" for everything else, external URLs included. Enforced when a link is drawn, for every form of link
45
+ * (inline, reference, autolink, `www.`, `<...>`).
46
+ */
47
+ linkPolicy?: AgentLinkPolicy;
48
+ copy?: Partial<AgentMarkdownCopy>;
49
+ className?: string;
50
+ }
51
+ /**
52
+ * @internal The assistant's text as markdown. No raw HTML (it is skipped, never rendered), images are never loaded (an image
53
+ * URL is a tracking and data-egress channel; the alt text shows instead), footnotes are plain text, links are limited by
54
+ * `linkPolicy` over the `classifyHref` floor, and an external link opens in a new tab with `rel="noopener noreferrer"`, an icon,
55
+ * and its host written out when the link text does not already say it.
56
+ *
57
+ * Partial markdown (an unclosed `**` or a code fence while streaming) is rendered as it is: an unclosed fence is a code block
58
+ * until it closes, an unclosed `**` shows its asterisks until the closing pair arrives.
59
+ *
60
+ * The rendered elements are stable across prop changes: a new `copy`, `onNavigate` or `linkPolicy` re-renders them in place
61
+ * and does not remount them, so a focused link keeps focus and a running animation is not restarted.
62
+ */
63
+ export declare const AgentMarkdown: import("react").NamedExoticComponent<AgentMarkdownProps>;
64
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/agent/markdown.tsx"],"names":[],"mappings":"AAiBA,MAAM,WAAW,iBAAiB;IAChC,wGAAwG;IACxG,aAAa,EAAE,MAAM,CAAC;IACtB,yGAAyG;IACzG,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAOpF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,cAAc,CAsB3E;AAED,kHAAkH;AAClH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC9B,MAAM,CAAC,EAAE,eAAe,GACvB,cAAc,CAYhB;AA4MD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,0DAkCxB,CAAC"}
@@ -0,0 +1,220 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, isValidElement, memo, useContext, useMemo, } from "react";
3
+ import ReactMarkdown from "react-markdown";
4
+ import remarkGfm from "remark-gfm";
5
+ import { ExternalLink } from "lucide-react";
6
+ import { cn } from "../lib/utils.js";
7
+ import { fmt, useCopy } from "./copy.js";
8
+ import { focusRing } from "./ui.js";
9
+ const DEFAULT_COPY = {
10
+ opensInNewTab: "(opens in a new tab)",
11
+ externalHost: "({host})",
12
+ taskDone: "Done",
13
+ taskOpen: "Not done",
14
+ };
15
+ const INTERNAL_BASE = "https://internal.invalid";
16
+ /** A tab, newline or other control character inside a URL is how `java\tscript:` gets past a naive check. */
17
+ const hasControlChars = (s) => Array.from(s).some((ch) => ch.charCodeAt(0) < 0x20 || ch.charCodeAt(0) === 0x7f);
18
+ /**
19
+ * @internal The default link policy, and the floor under every host policy. The agent's text is untrusted (a customer can write
20
+ * text the agent repeats), so a link is live only for `http(s):` or an internal `/path`; everything else (`mailto:`,
21
+ * `javascript:`, `data:`, `//host`, `/\host`, `#frag`, a bare relative path, a URL with control characters) is blocked and
22
+ * renders as plain text.
23
+ */
24
+ export function classifyHref(raw) {
25
+ if (typeof raw !== "string")
26
+ return { kind: "blocked" };
27
+ const href = raw.trim();
28
+ if (href === "" || hasControlChars(href))
29
+ return { kind: "blocked" };
30
+ if (href.startsWith("/")) {
31
+ if (href.startsWith("//"))
32
+ return { kind: "blocked" };
33
+ try {
34
+ // A backslash is a slash to the browser: `/\evil.example` would leave the app.
35
+ const u = new URL(href, INTERNAL_BASE);
36
+ return u.origin === INTERNAL_BASE ? { kind: "internal", href } : { kind: "blocked" };
37
+ }
38
+ catch {
39
+ return { kind: "blocked" };
40
+ }
41
+ }
42
+ try {
43
+ const u = new URL(href);
44
+ if (u.protocol === "http:" || u.protocol === "https:")
45
+ return { kind: "external", href: u.href };
46
+ }
47
+ catch {
48
+ /* not an absolute URL */
49
+ }
50
+ return { kind: "blocked" };
51
+ }
52
+ /** The lib's floor, then the host's policy (which can only block more). Applied at render, to every link form. */
53
+ export function resolveLink(raw, policy) {
54
+ const base = classifyHref(raw);
55
+ if (base.kind === "blocked")
56
+ return base;
57
+ if (policy) {
58
+ // A policy that throws is a policy that did not say yes: the link is plain text, the render goes on.
59
+ try {
60
+ if (policy(base.href) === "blocked")
61
+ return { kind: "blocked" };
62
+ }
63
+ catch {
64
+ return { kind: "blocked" };
65
+ }
66
+ }
67
+ return base;
68
+ }
69
+ const MarkdownContext = createContext({ c: DEFAULT_COPY });
70
+ const REMARK_PLUGINS = [remarkGfm];
71
+ /** Props react-markdown passes that are not DOM attributes. */
72
+ function dom(props) {
73
+ return Object.fromEntries(Object.entries(props).filter(([k]) => k !== "node"));
74
+ }
75
+ const textOf = (node) => {
76
+ if (typeof node === "string" || typeof node === "number")
77
+ return String(node);
78
+ if (Array.isArray(node))
79
+ return node.map(textOf).join("");
80
+ if (isValidElement(node))
81
+ return textOf(node.props.children);
82
+ return "";
83
+ };
84
+ /** Whether a link's content holds an image. An image is never loaded, so its alt text is the only thing the link can show. */
85
+ const hasImage = (node) => {
86
+ if (Array.isArray(node))
87
+ return node.some(hasImage);
88
+ if (!isValidElement(node))
89
+ return false;
90
+ return node.type === MarkdownImage || hasImage(node.props.children);
91
+ };
92
+ /**
93
+ * Whether a link's own text already tells the reader where it goes: it IS the link's host (or an address on it: the host
94
+ * followed by a path, port, query or fragment), `www.` and a scheme ignored. Anything else, a look-alike, a substring of the
95
+ * host, an address on ANOTHER host, empty text, or an image, does not, so the real host is written out beside it.
96
+ *
97
+ * Text that starts with the host can still mean another one: in `evil.example:@paypal.com` or `evil.example:443@paypal.com/x`
98
+ * the leading `host:` is a username and the address is on `paypal.com`. So text with an `@` never states a host, and the text
99
+ * must also parse as an address whose host is the link's (no credentials, no other host after the prefix).
100
+ */
101
+ function textStatesHost(text, hostname) {
102
+ const host = hostname.toLowerCase().replace(/^www\./, "");
103
+ const t = text
104
+ .trim()
105
+ .toLowerCase()
106
+ .replace(/^https?:\/\//, "")
107
+ .replace(/^www\./, "");
108
+ if (t === "" || t.includes("@"))
109
+ return false;
110
+ if (t !== host && !["/", ":", "?", "#"].some((sep) => t.startsWith(host + sep)))
111
+ return false;
112
+ // The prefix matched as written (so a non-ASCII look-alike of an xn-- host still does not): now read it as a browser would.
113
+ try {
114
+ return new URL(`https://${t}`).hostname.replace(/^www\./, "") === host;
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ const inlineCode = "rounded-md bg-muted px-1 py-0.5 font-mono text-xs break-words text-foreground";
121
+ /** Every heading is an `h3` to assistive tech (the panel's own title is the `h2`, so a message can never skip a level); size carries the visual level. */
122
+ const heading = {
123
+ 1: "mt-1 text-base/6 font-semibold text-foreground",
124
+ 2: "mt-1 text-sm/6 font-semibold text-foreground",
125
+ 3: "mt-1 text-sm/6 font-medium text-foreground",
126
+ 4: "mt-1 text-sm/6 font-medium text-muted-foreground",
127
+ };
128
+ const linkClass = cn("rounded-sm font-medium text-foreground underline decoration-muted-foreground decoration-1 underline-offset-4 wrap-anywhere transition-colors duration-[var(--duration-micro)] hover:decoration-foreground motion-reduce:transition-none", focusRing);
129
+ /** Links read the host's policy and copy from context, so they are ONE component type for the life of the page. */
130
+ function MarkdownLink(props) {
131
+ const { href, children } = props;
132
+ const { c, onNavigate, policy } = useContext(MarkdownContext);
133
+ // Footnote back-links point at an anchor that does not exist here.
134
+ if ("data-footnote-backref" in props)
135
+ return null;
136
+ const link = resolveLink(href, policy);
137
+ if (link.kind === "blocked")
138
+ return _jsx("span", { children: children });
139
+ if (link.kind === "internal") {
140
+ const onClick = onNavigate
141
+ ? (e) => {
142
+ if (e.defaultPrevented || e.button !== 0)
143
+ return;
144
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
145
+ return;
146
+ e.preventDefault();
147
+ onNavigate(link.href);
148
+ }
149
+ : undefined;
150
+ return (_jsx("a", { href: link.href, onClick: onClick, className: linkClass, children: children }));
151
+ }
152
+ // External: the destination is visible unless the link's own text already says it, so "Docs" cannot hide where it goes.
153
+ const url = new URL(link.href);
154
+ const host = url.host.replace(/^www\./, "");
155
+ const showHost = hasImage(children) || !textStatesHost(textOf(children), url.hostname);
156
+ return (_jsxs("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", title: link.href, className: linkClass, children: [children, showHost && _jsxs("span", { className: "text-muted-foreground", children: [" ", fmt(c.externalHost, { host })] }), _jsx(ExternalLink, { "aria-hidden": true, className: "mx-0.5 inline-block size-3 align-[-0.125em] text-muted-foreground" }), _jsxs("span", { className: "sr-only", children: [" ", c.opensInNewTab] })] }));
157
+ }
158
+ /** Never loads the image: its alt text is shown instead. A named function (not inline) so a link can tell it holds one. */
159
+ function MarkdownImage({ alt }) {
160
+ return alt ? _jsx("span", { className: "text-muted-foreground", children: alt }) : null;
161
+ }
162
+ function MarkdownCheckbox(props) {
163
+ const { c } = useContext(MarkdownContext);
164
+ if (props.type !== "checkbox")
165
+ return null;
166
+ return (_jsx("input", { type: "checkbox", checked: Boolean(props.checked), readOnly: true, disabled: true, "aria-label": props.checked ? c.taskDone : c.taskOpen, className: "mr-1.5 size-3.5 translate-y-0.5 accent-primary" }));
167
+ }
168
+ /**
169
+ * One object for the life of the module. react-markdown treats a new component TYPE as a new element and remounts every node it
170
+ * renders, so these never close over props: what changes (copy, `onNavigate`, the link policy) arrives by context.
171
+ */
172
+ const COMPONENTS = {
173
+ h1: (p) => _jsx("h3", { ...dom(p), className: heading[1] }),
174
+ h2: (p) => (p.id === "footnote-label" ? null : _jsx("h3", { ...dom(p), className: heading[2] })),
175
+ h3: (p) => _jsx("h3", { ...dom(p), className: heading[3] }),
176
+ h4: (p) => _jsx("h3", { ...dom(p), className: heading[4] }),
177
+ h5: (p) => _jsx("h3", { ...dom(p), className: heading[4] }),
178
+ h6: (p) => _jsx("h3", { ...dom(p), className: heading[4] }),
179
+ p: (p) => _jsx("p", { ...dom(p), className: "text-sm/6 break-words text-foreground" }),
180
+ strong: (p) => _jsx("strong", { ...dom(p), className: "font-semibold" }),
181
+ em: (p) => _jsx("em", { ...dom(p), className: "italic" }),
182
+ del: (p) => _jsx("del", { ...dom(p), className: "text-muted-foreground line-through" }),
183
+ ul: (p) => (_jsx("ul", { ...dom(p), className: "ml-5 list-disc text-sm/6 text-foreground marker:text-muted-foreground [&>li+li]:mt-1 [&_ol]:mt-1 [&_ul]:mt-1" })),
184
+ ol: (p) => (_jsx("ol", { ...dom(p), className: "ml-5 list-decimal text-sm/6 text-foreground marker:text-muted-foreground [&>li+li]:mt-1 [&_ol]:mt-1 [&_ul]:mt-1" })),
185
+ li: (p) => _jsx("li", { ...dom(p), className: "pl-0.5 break-words" }),
186
+ input: (p) => _jsx(MarkdownCheckbox, { ...dom(p) }),
187
+ blockquote: (p) => (_jsx("blockquote", { ...dom(p), className: "flex flex-col gap-2 rounded-lg bg-muted/60 px-3 py-2 text-muted-foreground [&_p]:text-muted-foreground" })),
188
+ hr: () => _jsx("hr", { className: "my-1 border-t border-border/60" }),
189
+ code: (p) => _jsx("code", { ...dom(p), className: inlineCode }),
190
+ pre: (p) => (_jsx("pre", { ...dom(p), tabIndex: 0, className: cn("overflow-x-auto rounded-xl bg-muted p-3 font-mono text-xs/5 text-foreground", "[&>code]:bg-transparent [&>code]:p-0 [&>code]:break-normal", focusRing) })),
191
+ table: (p) => (_jsx("div", { tabIndex: 0, className: cn("overflow-x-auto rounded-xl ring-1 ring-border/60", focusRing), children: _jsx("table", { ...dom(p), className: "w-full min-w-max border-collapse text-xs/5" }) })),
192
+ thead: (p) => _jsx("thead", { ...dom(p), className: "bg-muted/60" }),
193
+ th: (p) => (_jsx("th", { ...dom(p), className: "px-3 py-2 text-left font-medium whitespace-nowrap text-muted-foreground" })),
194
+ td: (p) => (_jsx("td", { ...dom(p), className: "border-t border-border/60 px-3 py-2 align-top text-foreground" })),
195
+ // An image would be fetched by the browser: never load one the model (or a customer) named.
196
+ img: MarkdownImage,
197
+ a: (p) => _jsx(MarkdownLink, { ...dom(p) }),
198
+ };
199
+ /**
200
+ * @internal The assistant's text as markdown. No raw HTML (it is skipped, never rendered), images are never loaded (an image
201
+ * URL is a tracking and data-egress channel; the alt text shows instead), footnotes are plain text, links are limited by
202
+ * `linkPolicy` over the `classifyHref` floor, and an external link opens in a new tab with `rel="noopener noreferrer"`, an icon,
203
+ * and its host written out when the link text does not already say it.
204
+ *
205
+ * Partial markdown (an unclosed `**` or a code fence while streaming) is rendered as it is: an unclosed fence is a code block
206
+ * until it closes, an unclosed `**` shows its asterisks until the closing pair arrives.
207
+ *
208
+ * The rendered elements are stable across prop changes: a new `copy`, `onNavigate` or `linkPolicy` re-renders them in place
209
+ * and does not remount them, so a focused link keeps focus and a running animation is not restarted.
210
+ */
211
+ export const AgentMarkdown = memo(function AgentMarkdown({ text, streaming, onNavigate, linkPolicy, copy, className, }) {
212
+ const c = useCopy(DEFAULT_COPY, copy);
213
+ const ctx = useMemo(() => ({ c, onNavigate, policy: linkPolicy }), [c, onNavigate, linkPolicy]);
214
+ return (_jsx(MarkdownContext.Provider, { value: ctx, children: _jsx("div", { "data-streaming": streaming ? "true" : undefined, className: cn("agent-md flex min-w-0 flex-col gap-2.5", className), children: _jsx(ReactMarkdown, { remarkPlugins: REMARK_PLUGINS, skipHtml: true, components: COMPONENTS,
215
+ // GFM footnotes become a `section` and `sup` we do not want; their text stays, as plain text.
216
+ disallowedElements: ["section", "sup"], unwrapDisallowed: true,
217
+ // Defence in depth: a blocked URL never reaches a component as an href.
218
+ urlTransform: (url) => (resolveLink(url, linkPolicy).kind === "blocked" ? "" : url), children: text }) }) }));
219
+ });
220
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/agent/markdown.tsx"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export interface MaskedValueCopy {
3
3
  ariaLabel: string;
4
4
  tooltip: string;
5
5
  }
6
+ export declare const DEFAULT_COPY: MaskedValueCopy;
6
7
  export interface MaskedValueProps {
7
8
  /** `{ masked: true, display }` from the BFF. Raw text is never treated as a mask. */
8
9
  value: CellValue;
@@ -1 +1 @@
1
- {"version":3,"file":"masked-value.d.ts","sourceRoot":"","sources":["../../src/agent/masked-value.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CA4B9E"}
1
+ {"version":3,"file":"masked-value.d.ts","sourceRoot":"","sources":["../../src/agent/masked-value.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,eAAO,MAAM,YAAY,EAAE,eAG1B,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CA4B9E"}
@@ -3,7 +3,10 @@ import { EyeOff } from "lucide-react";
3
3
  import { cn } from "../lib/utils.js";
4
4
  import { useCopy } from "./copy.js";
5
5
  import { isMasked } from "./schema.js";
6
- const DEFAULT_COPY = { ariaLabel: "masked value", tooltip: "Hidden for privacy" };
6
+ export const DEFAULT_COPY = {
7
+ ariaLabel: "masked value",
8
+ tooltip: "Hidden for privacy",
9
+ };
7
10
  /**
8
11
  * @internal Renders a BFF-masked value so an admin can never mistake a mask for
9
12
  * data: dashed outline, mask icon, accessible name and a title tooltip. A plain
@@ -1 +1 @@
1
- {"version":3,"file":"masked-value.js","sourceRoot":"","sources":["../../src/agent/masked-value.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAMpD,MAAM,YAAY,GAAoB,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAWnG;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAoB;IAC7E,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CACL,eAAM,SAAS,EAAE,SAAS,YACvB,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAChC,YAAG,SAAS,EAAC,uBAAuB,YAAE,KAAK,IAAI,GAAG,GAAK,CACxD,CAAC,CAAC,CAAC,CACF,MAAM,CAAC,KAAK,CAAC,CACd,GACI,CACR,CAAC;IACJ,CAAC;IACD,OAAO,CACL,gBACE,IAAI,EAAC,KAAK,gBACE,GAAG,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE,EAC9C,KAAK,EAAE,CAAC,CAAC,OAAO,iBACJ,MAAM,EAClB,SAAS,EAAE,EAAE,CACX,+IAA+I,EAC/I,SAAS,CACV,aAED,KAAC,MAAM,yBAAa,SAAS,EAAC,iBAAiB,GAAG,EAClD,8CAAmB,KAAK,CAAC,OAAO,GAAQ,IACnC,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"masked-value.js","sourceRoot":"","sources":["../../src/agent/masked-value.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAMpD,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,SAAS,EAAE,cAAc;IACzB,OAAO,EAAE,oBAAoB;CAC9B,CAAC;AAWF;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAoB;IAC7E,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CACL,eAAM,SAAS,EAAE,SAAS,YACvB,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAChC,YAAG,SAAS,EAAC,uBAAuB,YAAE,KAAK,IAAI,GAAG,GAAK,CACxD,CAAC,CAAC,CAAC,CACF,MAAM,CAAC,KAAK,CAAC,CACd,GACI,CACR,CAAC;IACJ,CAAC;IACD,OAAO,CACL,gBACE,IAAI,EAAC,KAAK,gBACE,GAAG,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE,EAC9C,KAAK,EAAE,CAAC,CAAC,OAAO,iBACJ,MAAM,EAClB,SAAS,EAAE,EAAE,CACX,+IAA+I,EAC/I,SAAS,CACV,aAED,KAAC,MAAM,yBAAa,SAAS,EAAC,iBAAiB,GAAG,EAClD,8CAAmB,KAAK,CAAC,OAAO,GAAQ,IACnC,CACR,CAAC;AACJ,CAAC"}
@@ -1,4 +1,7 @@
1
- import type { ReactNode } from "react";
1
+ import { type ReactNode } from "react";
2
+ import { type AgentLinkPolicy, type AgentMarkdownCopy } from "./markdown.js";
3
+ import { type AgentToolActivityCopy } from "./tool-activity.js";
4
+ import { type AgentToolNaming, type CardCoversCall } from "./tool-activity-model.js";
2
5
  import type { AgentApproval, AgentMessageData } from "./schema.js";
3
6
  export interface AgentMessageCopy {
4
7
  userLabel: string;
@@ -8,25 +11,42 @@ export interface AgentMessageCopy {
8
11
  retry: string;
9
12
  copy: string;
10
13
  copied: string;
14
+ /** @deprecated A thought is a step in the activity trail now: its wording is `activityCopy.thought`. Unused. */
11
15
  thinking: string;
12
16
  }
13
- export interface AgentMessageProps {
17
+ export interface AgentMessageProps extends AgentToolNaming {
14
18
  message: AgentMessageData;
15
19
  /** Effective status per approval (the conversation supersedes stale pending ones). */
16
20
  approvalStatus?: ReadonlyMap<string, AgentApproval["status"]>;
17
21
  onApproval?: (approvalId: string, decision: "approve" | "reject", typed?: string, attestations?: Record<string, boolean>) => void;
18
22
  onRetry?: (messageId: string) => void;
19
23
  onRetryTool?: (callId: string) => void;
20
- /** Renders `card` parts (host-owned domain cards). */
24
+ /** Renders `card` parts (host-owned domain cards). A card that renders nothing leaves no gap. */
21
25
  renderCard?: (cardType: string, data: unknown) => ReactNode;
26
+ /**
27
+ * Whether a domain card shows a tool call's data, so its step is marked "shown below". There is no default: a step is
28
+ * marked only when a card part names its call (`forCallId`) or this says so, and only for a card that rendered something.
29
+ */
30
+ cardCoversCall?: CardCoversCall;
31
+ /** A click on an internal `/path` link in the assistant's text (the router's navigate); without it links are plain anchors. */
32
+ onNavigate?: (path: string) => void;
33
+ /** Which links in the assistant's text are live. Default: `http(s)` URLs and internal `/paths`; see `AgentLinkPolicy`. */
34
+ linkPolicy?: AgentLinkPolicy;
35
+ /** BCP 47 tag for the numbers in the activity trail ("Took 0,6s"). Default: plain "0.6". A malformed tag falls back to it. */
36
+ locale?: string;
37
+ activityCopy?: Partial<AgentToolActivityCopy>;
38
+ markdownCopy?: Partial<AgentMarkdownCopy>;
39
+ /** The message arrived while the conversation was open: it fades and slides in once. Parts added later fade in on their own. */
40
+ entering?: boolean;
22
41
  /** Clock override (ms since epoch) for approval expiry; stories and tests pin it. */
23
42
  nowMs?: number;
24
43
  copy?: Partial<AgentMessageCopy>;
25
44
  className?: string;
26
45
  }
27
46
  /**
28
- * @internal One message. Assistant messages are append-only (text keeps a stable
29
- * DOM so assistive tech does not re-read), user messages are a right-aligned bubble.
47
+ * @internal One message. Assistant messages are append-only (text keeps a stable DOM so assistive tech does not
48
+ * re-read) and render as markdown; user messages are plain text in a right-aligned bubble. A run of tool calls is one
49
+ * activity row, never a card per call; approvals and domain cards stay in place, prominent.
30
50
  */
31
- export declare function AgentMessage({ message, approvalStatus, onApproval, onRetry, onRetryTool, renderCard, nowMs, copy, className, }: AgentMessageProps): import("react/jsx-runtime").JSX.Element;
51
+ export declare function AgentMessage({ message, approvalStatus, onApproval, onRetry, onRetryTool, renderCard, toolLabels, formatToolLabel, cardLabels, toolWording, cardCoversCall, onNavigate, linkPolicy, locale, activityCopy, markdownCopy, entering, nowMs, copy, className, }: AgentMessageProps): import("react/jsx-runtime").JSX.Element;
32
52
  //# sourceMappingURL=message.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/agent/message.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGhE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,sFAAsF;IACtF,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,GAAG,QAAQ,EAC9B,KAAK,CAAC,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACnC,IAAI,CAAC;IACV,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,sDAAsD;IACtD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC;IAC5D,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,cAAc,EACd,UAAU,EACV,OAAO,EACP,WAAW,EACX,UAAU,EACV,KAAK,EACL,IAAI,EACJ,SAAS,GACV,EAAE,iBAAiB,2CAuEnB"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/agent/message.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAM1D,OAAO,EAAiB,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAqB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAoB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGhE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,gHAAgH;IAChH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,sFAAsF;IACtF,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,GAAG,QAAQ,EAC9B,KAAK,CAAC,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACnC,IAAI,CAAC;IACV,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iGAAiG;IACjG,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC;IAC5D;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,+HAA+H;IAC/H,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,0HAA0H;IAC1H,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,8HAA8H;IAC9H,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1C,gIAAgI;IAChI,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,cAAc,EACd,UAAU,EACV,OAAO,EACP,WAAW,EACX,UAAU,EACV,UAAU,EACV,eAAe,EACf,UAAU,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,UAAU,EACV,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,SAAS,GACV,EAAE,iBAAiB,2CAiInB"}
@@ -1,10 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from "react";
2
3
  import { RotateCw } from "lucide-react";
3
4
  import { CopyButton } from "../components/copy-button.js";
4
5
  import { cn } from "../lib/utils.js";
5
6
  import { useCopy } from "./copy.js";
6
7
  import { AgentConfirmCard } from "./confirm-card.js";
7
- import { AgentToolCallCard } from "./tool-call-card.js";
8
+ import { AgentMarkdown } from "./markdown.js";
9
+ import { AgentToolActivity } from "./tool-activity.js";
10
+ import { planMessageParts } from "./tool-activity-model.js";
8
11
  import { agentButton } from "./ui.js";
9
12
  const DEFAULT_COPY = {
10
13
  userLabel: "You",
@@ -18,29 +21,62 @@ const DEFAULT_COPY = {
18
21
  };
19
22
  const partKey = (part, i) => `${part.type}:${i}`;
20
23
  /**
21
- * @internal One message. Assistant messages are append-only (text keeps a stable
22
- * DOM so assistive tech does not re-read), user messages are a right-aligned bubble.
24
+ * @internal One message. Assistant messages are append-only (text keeps a stable DOM so assistive tech does not
25
+ * re-read) and render as markdown; user messages are plain text in a right-aligned bubble. A run of tool calls is one
26
+ * activity row, never a card per call; approvals and domain cards stay in place, prominent.
23
27
  */
24
- export function AgentMessage({ message, approvalStatus, onApproval, onRetry, onRetryTool, renderCard, nowMs, copy, className, }) {
28
+ export function AgentMessage({ message, approvalStatus, onApproval, onRetry, onRetryTool, renderCard, toolLabels, formatToolLabel, cardLabels, toolWording, cardCoversCall, onNavigate, linkPolicy, locale, activityCopy, markdownCopy, entering, nowMs, copy, className, }) {
25
29
  const c = useCopy(DEFAULT_COPY, copy);
26
30
  const user = message.role === "user";
27
31
  const text = message.parts.flatMap((p) => (p.type === "text" ? [p.text] : [])).join("\n\n");
28
- return (_jsxs("article", { "aria-label": user ? c.userLabel : c.assistantLabel, "data-role": message.role, className: cn("flex flex-col gap-2", user ? "items-end" : "items-stretch", className), children: [message.parts.map((part, i) => {
32
+ // The host's cards are drawn once, here: whether a card drew anything decides whether its step is marked "shown below".
33
+ const cards = useMemo(() => message.parts.map((p) => (p.type === "card" ? renderCard?.(p.cardType, p.data) : undefined)), [message.parts, renderCard]);
34
+ const items = useMemo(() => {
35
+ const renderedCards = new Set();
36
+ cards.forEach((node, i) => {
37
+ if (node !== null && node !== undefined && node !== false)
38
+ renderedCards.add(i);
39
+ });
40
+ return planMessageParts(message.parts, {
41
+ covers: cardCoversCall,
42
+ streaming: message.streaming,
43
+ renderedCards,
44
+ cardLabels,
45
+ toolWording,
46
+ });
47
+ }, [message.parts, message.streaming, cards, cardCoversCall, cardLabels, toolWording]);
48
+ // One entrance per element: parts that were here when the message mounted ride the message's own entrance; only a
49
+ // part that arrives afterwards fades in by itself.
50
+ const [mountedParts] = useState(message.parts.length);
51
+ const lastIndex = message.parts.length - 1;
52
+ return (_jsxs("article", { "aria-label": user ? c.userLabel : c.assistantLabel, "data-role": message.role, className: cn("flex flex-col gap-2", user ? "items-end" : "items-stretch", entering && "agent-enter", className), children: [items.map((item) => {
53
+ if (item.kind === "activity") {
54
+ return (_jsx(AgentToolActivity, { steps: item.steps, toolLabels: toolLabels, formatToolLabel: formatToolLabel, cardLabels: cardLabels, toolWording: toolWording, onRetry: onRetryTool, locale: locale, copy: activityCopy, className: item.startIndex >= mountedParts ? "agent-fade-in" : undefined }, item.key));
55
+ }
56
+ const { part, index: i } = item;
29
57
  const key = partKey(part, i);
58
+ const later = i >= mountedParts;
30
59
  switch (part.type) {
31
60
  case "text":
32
- return (_jsx("p", { className: cn("whitespace-pre-wrap text-sm/6 text-foreground", user &&
33
- "max-w-5/6 rounded-2xl rounded-br-sm bg-primary px-3.5 py-2 text-primary-foreground"), children: part.text }, key));
61
+ if (user)
62
+ return (_jsx("p", { className: "max-w-5/6 rounded-2xl rounded-br-sm bg-primary px-3.5 py-2 text-sm/6 whitespace-pre-wrap text-primary-foreground", children: part.text }, key));
63
+ if (part.text.trim() === "")
64
+ return null;
65
+ return (_jsx(AgentMarkdown, { text: part.text, streaming: Boolean(message.streaming) && i === lastIndex, onNavigate: onNavigate, linkPolicy: linkPolicy, copy: markdownCopy, className: later ? "agent-fade-in" : undefined }, key));
34
66
  case "thinking":
35
- return (_jsxs("p", { className: "text-xs/5 text-muted-foreground", children: [_jsxs("span", { className: "sr-only", children: [c.thinking, ": "] }), part.summary] }, key));
67
+ return null; // a thought is a step in the activity trail
36
68
  case "toolCall":
37
- return _jsx(AgentToolCallCard, { call: part.call, onRetry: onRetryTool }, part.call.id);
69
+ return null;
38
70
  case "approval": {
39
71
  const status = approvalStatus?.get(part.approval.approvalId) ?? part.approval.status;
40
72
  return (_jsx(AgentConfirmCard, { approval: { ...part.approval, status }, nowMs: nowMs, onDecision: (d, typed, attestations) => onApproval?.(part.approval.approvalId, d, typed, attestations) }, part.approval.approvalId));
41
73
  }
42
- case "card":
43
- return _jsx("div", { children: renderCard?.(part.cardType, part.data) }, key);
74
+ case "card": {
75
+ const card = cards[i];
76
+ if (card === null || card === undefined || card === false)
77
+ return null;
78
+ return (_jsx("div", { className: later ? "agent-fade-in" : undefined, children: card }, key));
79
+ }
44
80
  }
45
81
  }), !user && message.stopped && _jsx("p", { className: "text-xs/4 text-muted-foreground", children: c.stopped }), !user && message.failed && (_jsxs("div", { className: "flex items-center gap-2 text-xs/5 text-[var(--tone-danger-fg)]", children: [_jsx("span", { children: c.failed }), onRetry && (_jsxs("button", { type: "button", className: agentButton.ghost, onClick: () => onRetry(message.id), children: [_jsx(RotateCw, { "aria-hidden": true, className: "size-3.5" }), c.retry] }))] })), !user && !message.streaming && text && (_jsx("div", { className: "self-start", children: _jsx(CopyButton, { value: text, label: c.copy, copiedLabel: c.copied }) }))] }));
46
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/agent/message.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/agent/message.tsx"],"names":[],"mappings":"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"}
@@ -12,6 +12,6 @@ const DEFAULT_COPY = {
12
12
  /** @internal Panel frame. Sizes with container queries, so it behaves the same at 440 px in a drawer and full width on a page. */
13
13
  export function AgentPanelFrame({ mode = "docked", pageContextChip, unavailable, onClose, headerActions, children, copy, className, }) {
14
14
  const c = useCopy(DEFAULT_COPY, copy);
15
- return (_jsxs("section", { "aria-label": c.title, "data-mode": mode, className: cn("@container flex h-full min-h-0 flex-col bg-background", mode === "docked" ? "w-full max-w-110 border-l border-border/60" : "w-full", className), children: [_jsxs("header", { className: "flex items-center gap-2 border-b border-border/60 px-4 py-2.5", children: [_jsx("h2", { className: "text-sm/5 font-semibold text-foreground", children: c.title }), pageContextChip && (_jsxs("span", { className: "min-w-0 truncate rounded-full bg-muted px-2 py-0.5 text-xs/4 text-muted-foreground", title: pageContextChip, children: [_jsxs("span", { className: "sr-only", children: [c.pageContext, ": "] }), pageContextChip] })), _jsxs("div", { className: "ml-auto flex items-center gap-1", children: [headerActions, onClose && (_jsx("button", { type: "button", "aria-label": c.close, onClick: onClose, className: cn("inline-flex size-8 items-center justify-center rounded-lg text-muted-foreground hover:bg-muted hover:text-foreground", focusRing), children: _jsx(PanelRightClose, { "aria-hidden": true, className: "size-4" }) }))] })] }), unavailable ? _jsx(AgentError, { kind: "unavailable", className: "m-4" }) : children] }));
15
+ return (_jsxs("section", { "aria-label": c.title, "data-mode": mode, className: cn("@container flex h-full min-h-0 flex-col bg-background", mode === "docked" ? "w-full max-w-110 border-l border-border/60" : "w-full", className), children: [_jsxs("header", { className: "flex min-h-14 items-center gap-2 border-b border-border/60 px-4 py-3", children: [_jsx("h2", { className: "text-sm/5 font-semibold text-foreground", children: c.title }), pageContextChip && (_jsxs("span", { className: "min-w-0 truncate rounded-full bg-muted px-2 py-0.5 text-xs/4 text-muted-foreground", title: pageContextChip, children: [_jsxs("span", { className: "sr-only", children: [c.pageContext, ": "] }), pageContextChip] })), _jsxs("div", { className: "ml-auto flex items-center gap-1", children: [headerActions, onClose && (_jsx("button", { type: "button", "aria-label": c.close, onClick: onClose, className: cn("inline-flex size-8 items-center justify-center rounded-lg text-muted-foreground hover:bg-muted hover:text-foreground", focusRing), children: _jsx(PanelRightClose, { "aria-hidden": true, className: "size-4" }) }))] })] }), unavailable ? _jsx(AgentError, { kind: "unavailable", className: "m-4" }) : children] }));
16
16
  }
17
17
  //# sourceMappingURL=panel-frame.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"panel-frame.js","sourceRoot":"","sources":["../../src/agent/panel-frame.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAOjC,MAAM,YAAY,GAAwB;IACxC,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,cAAc;CAC5B,CAAC;AAiBF,kIAAkI;AAClI,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,GAAG,QAAQ,EACf,eAAe,EACf,WAAW,EACX,OAAO,EACP,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,SAAS,GACY;IACrB,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,CACL,iCACc,CAAC,CAAC,KAAK,eACR,IAAI,EACf,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,QAAQ,EAC3E,SAAS,CACV,aAED,kBAAQ,SAAS,EAAC,+DAA+D,aAC/E,aAAI,SAAS,EAAC,yCAAyC,YAAE,CAAC,CAAC,KAAK,GAAM,EACrE,eAAe,IAAI,CAClB,gBACE,SAAS,EAAC,oFAAoF,EAC9F,KAAK,EAAE,eAAe,aAEtB,gBAAM,SAAS,EAAC,SAAS,aAAE,CAAC,CAAC,WAAW,UAAU,EACjD,eAAe,IACX,CACR,EACD,eAAK,SAAS,EAAC,iCAAiC,aAC7C,aAAa,EACb,OAAO,IAAI,CACV,iBACE,IAAI,EAAC,QAAQ,gBACD,CAAC,CAAC,KAAK,EACnB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,sHAAsH,EACtH,SAAS,CACV,YAED,KAAC,eAAe,yBAAa,SAAS,EAAC,QAAQ,GAAG,GAC3C,CACV,IACG,IACC,EACR,WAAW,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,IAAI,EAAC,aAAa,EAAC,SAAS,EAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,IACnE,CACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"panel-frame.js","sourceRoot":"","sources":["../../src/agent/panel-frame.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAOjC,MAAM,YAAY,GAAwB;IACxC,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,cAAc;CAC5B,CAAC;AAiBF,kIAAkI;AAClI,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,GAAG,QAAQ,EACf,eAAe,EACf,WAAW,EACX,OAAO,EACP,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,SAAS,GACY;IACrB,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,CACL,iCACc,CAAC,CAAC,KAAK,eACR,IAAI,EACf,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,QAAQ,EAC3E,SAAS,CACV,aAED,kBAAQ,SAAS,EAAC,sEAAsE,aACtF,aAAI,SAAS,EAAC,yCAAyC,YAAE,CAAC,CAAC,KAAK,GAAM,EACrE,eAAe,IAAI,CAClB,gBACE,SAAS,EAAC,oFAAoF,EAC9F,KAAK,EAAE,eAAe,aAEtB,gBAAM,SAAS,EAAC,SAAS,aAAE,CAAC,CAAC,WAAW,UAAU,EACjD,eAAe,IACX,CACR,EACD,eAAK,SAAS,EAAC,iCAAiC,aAC7C,aAAa,EACb,OAAO,IAAI,CACV,iBACE,IAAI,EAAC,QAAQ,gBACD,CAAC,CAAC,KAAK,EACnB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,sHAAsH,EACtH,SAAS,CACV,YAED,KAAC,eAAe,yBAAa,SAAS,EAAC,QAAQ,GAAG,GAC3C,CACV,IACG,IACC,EACR,WAAW,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,IAAI,EAAC,aAAa,EAAC,SAAS,EAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,IACnE,CACX,CAAC;AACJ,CAAC"}