@schlessera/brain-ui-react 0.34.0 → 0.34.1

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 (157) hide show
  1. package/README.md +5 -0
  2. package/dist/components/activity/activity-page.d.ts.map +1 -1
  3. package/dist/components/activity/activity-page.js +8 -149
  4. package/dist/components/activity/activity-page.js.map +1 -1
  5. package/dist/components/activity/activity-rollups.d.ts +5 -0
  6. package/dist/components/activity/activity-rollups.d.ts.map +1 -0
  7. package/dist/components/activity/activity-rollups.js +39 -0
  8. package/dist/components/activity/activity-rollups.js.map +1 -0
  9. package/dist/components/activity/activity-run-detail.d.ts +11 -0
  10. package/dist/components/activity/activity-run-detail.d.ts.map +1 -0
  11. package/dist/components/activity/activity-run-detail.js +111 -0
  12. package/dist/components/activity/activity-run-detail.js.map +1 -0
  13. package/dist/components/activity/activity-run-list.d.ts +15 -0
  14. package/dist/components/activity/activity-run-list.d.ts.map +1 -0
  15. package/dist/components/activity/activity-run-list.js +25 -0
  16. package/dist/components/activity/activity-run-list.js.map +1 -0
  17. package/dist/components/chat/brain-markdown-code.d.ts +4 -0
  18. package/dist/components/chat/brain-markdown-code.d.ts.map +1 -0
  19. package/dist/components/chat/brain-markdown-code.js +47 -0
  20. package/dist/components/chat/brain-markdown-code.js.map +1 -0
  21. package/dist/components/chat/brain-markdown-entities.d.ts +14 -0
  22. package/dist/components/chat/brain-markdown-entities.d.ts.map +1 -0
  23. package/dist/components/chat/brain-markdown-entities.js +93 -0
  24. package/dist/components/chat/brain-markdown-entities.js.map +1 -0
  25. package/dist/components/chat/brain-markdown-links.d.ts +36 -0
  26. package/dist/components/chat/brain-markdown-links.d.ts.map +1 -0
  27. package/dist/components/chat/brain-markdown-links.js +176 -0
  28. package/dist/components/chat/brain-markdown-links.js.map +1 -0
  29. package/dist/components/chat/brain-markdown-share.d.ts +15 -0
  30. package/dist/components/chat/brain-markdown-share.d.ts.map +1 -0
  31. package/dist/components/chat/brain-markdown-share.js +40 -0
  32. package/dist/components/chat/brain-markdown-share.js.map +1 -0
  33. package/dist/components/chat/brain-markdown.d.ts +1 -34
  34. package/dist/components/chat/brain-markdown.d.ts.map +1 -1
  35. package/dist/components/chat/brain-markdown.js +9 -402
  36. package/dist/components/chat/brain-markdown.js.map +1 -1
  37. package/dist/components/chat/composer.d.ts.map +1 -1
  38. package/dist/components/chat/composer.js +14 -1
  39. package/dist/components/chat/composer.js.map +1 -1
  40. package/dist/components/chat/use-markdown-highlight.d.ts +12 -0
  41. package/dist/components/chat/use-markdown-highlight.d.ts.map +1 -0
  42. package/dist/components/chat/use-markdown-highlight.js +56 -0
  43. package/dist/components/chat/use-markdown-highlight.js.map +1 -0
  44. package/dist/components/connectivity/connection-gate.d.ts.map +1 -1
  45. package/dist/components/connectivity/connection-gate.js +41 -7
  46. package/dist/components/connectivity/connection-gate.js.map +1 -1
  47. package/dist/components/connectivity/connection-state.d.ts +12 -0
  48. package/dist/components/connectivity/connection-state.d.ts.map +1 -0
  49. package/dist/components/connectivity/connection-state.js +23 -0
  50. package/dist/components/connectivity/connection-state.js.map +1 -0
  51. package/dist/components/graph/graph-canvas-lazy.d.ts +2 -0
  52. package/dist/components/graph/graph-canvas-lazy.d.ts.map +1 -0
  53. package/dist/components/graph/graph-canvas-lazy.js +4 -0
  54. package/dist/components/graph/graph-canvas-lazy.js.map +1 -0
  55. package/dist/components/graph/graph-controls.js +4 -1
  56. package/dist/components/graph/graph-controls.js.map +1 -1
  57. package/dist/components/graph/graph-maintenance.d.ts +8 -0
  58. package/dist/components/graph/graph-maintenance.d.ts.map +1 -0
  59. package/dist/components/graph/graph-maintenance.js +115 -0
  60. package/dist/components/graph/graph-maintenance.js.map +1 -0
  61. package/dist/components/graph/graph-page.d.ts.map +1 -1
  62. package/dist/components/graph/graph-page.js +11 -306
  63. package/dist/components/graph/graph-page.js.map +1 -1
  64. package/dist/components/graph/graph-scene.d.ts +8 -0
  65. package/dist/components/graph/graph-scene.d.ts.map +1 -0
  66. package/dist/components/graph/graph-scene.js +208 -0
  67. package/dist/components/graph/graph-scene.js.map +1 -0
  68. package/dist/components/graph/graph-spinner.d.ts +2 -0
  69. package/dist/components/graph/graph-spinner.d.ts.map +1 -0
  70. package/dist/components/graph/graph-spinner.js +6 -0
  71. package/dist/components/graph/graph-spinner.js.map +1 -0
  72. package/dist/hooks/use-vpn-status.d.ts +5 -0
  73. package/dist/hooks/use-vpn-status.d.ts.map +1 -1
  74. package/dist/hooks/use-vpn-status.js +61 -29
  75. package/dist/hooks/use-vpn-status.js.map +1 -1
  76. package/dist/hooks/use-websocket.d.ts +3 -2
  77. package/dist/hooks/use-websocket.d.ts.map +1 -1
  78. package/dist/hooks/use-websocket.js +61 -252
  79. package/dist/hooks/use-websocket.js.map +1 -1
  80. package/dist/hooks/websocket-handlers/activity.d.ts +5 -0
  81. package/dist/hooks/websocket-handlers/activity.d.ts.map +1 -0
  82. package/dist/hooks/websocket-handlers/activity.js +10 -0
  83. package/dist/hooks/websocket-handlers/activity.js.map +1 -0
  84. package/dist/hooks/websocket-handlers/chat.d.ts +17 -0
  85. package/dist/hooks/websocket-handlers/chat.d.ts.map +1 -0
  86. package/dist/hooks/websocket-handlers/chat.js +175 -0
  87. package/dist/hooks/websocket-handlers/chat.js.map +1 -0
  88. package/dist/hooks/websocket-handlers/connection.d.ts +6 -0
  89. package/dist/hooks/websocket-handlers/connection.d.ts.map +1 -0
  90. package/dist/hooks/websocket-handlers/connection.js +27 -0
  91. package/dist/hooks/websocket-handlers/connection.js.map +1 -0
  92. package/dist/hooks/websocket-handlers/index.d.ts +4 -0
  93. package/dist/hooks/websocket-handlers/index.d.ts.map +1 -0
  94. package/dist/hooks/websocket-handlers/index.js +19 -0
  95. package/dist/hooks/websocket-handlers/index.js.map +1 -0
  96. package/dist/hooks/websocket-handlers/mask.d.ts +4 -0
  97. package/dist/hooks/websocket-handlers/mask.d.ts.map +1 -0
  98. package/dist/hooks/websocket-handlers/mask.js +14 -0
  99. package/dist/hooks/websocket-handlers/mask.js.map +1 -0
  100. package/dist/hooks/websocket-handlers/provider.d.ts +4 -0
  101. package/dist/hooks/websocket-handlers/provider.d.ts.map +1 -0
  102. package/dist/hooks/websocket-handlers/provider.js +31 -0
  103. package/dist/hooks/websocket-handlers/provider.js.map +1 -0
  104. package/dist/hooks/websocket-handlers/types.d.ts +24 -0
  105. package/dist/hooks/websocket-handlers/types.d.ts.map +1 -0
  106. package/dist/hooks/websocket-handlers/types.js +2 -0
  107. package/dist/hooks/websocket-handlers/types.js.map +1 -0
  108. package/dist/stores/activity-store-helpers.d.ts +50 -0
  109. package/dist/stores/activity-store-helpers.d.ts.map +1 -0
  110. package/dist/stores/activity-store-helpers.js +143 -0
  111. package/dist/stores/activity-store-helpers.js.map +1 -0
  112. package/dist/stores/activity-store-types.d.ts +48 -0
  113. package/dist/stores/activity-store-types.d.ts.map +1 -0
  114. package/dist/stores/activity-store-types.js +2 -0
  115. package/dist/stores/activity-store-types.js.map +1 -0
  116. package/dist/stores/activity-store.d.ts +2 -78
  117. package/dist/stores/activity-store.d.ts.map +1 -1
  118. package/dist/stores/activity-store.js +22 -142
  119. package/dist/stores/activity-store.js.map +1 -1
  120. package/dist/stores/connection-store.d.ts +14 -2
  121. package/dist/stores/connection-store.d.ts.map +1 -1
  122. package/dist/stores/connection-store.js +17 -0
  123. package/dist/stores/connection-store.js.map +1 -1
  124. package/dist/styles.css +1 -1
  125. package/package.json +2 -2
  126. package/src/components/activity/activity-page.tsx +6 -477
  127. package/src/components/activity/activity-rollups.tsx +94 -0
  128. package/src/components/activity/activity-run-detail.tsx +301 -0
  129. package/src/components/activity/activity-run-list.tsx +97 -0
  130. package/src/components/chat/brain-markdown-code.tsx +60 -0
  131. package/src/components/chat/brain-markdown-entities.tsx +116 -0
  132. package/src/components/chat/brain-markdown-links.tsx +247 -0
  133. package/src/components/chat/brain-markdown-share.ts +47 -0
  134. package/src/components/chat/brain-markdown.tsx +27 -535
  135. package/src/components/chat/composer.tsx +14 -1
  136. package/src/components/chat/use-markdown-highlight.ts +63 -0
  137. package/src/components/connectivity/connection-gate.tsx +64 -13
  138. package/src/components/connectivity/connection-state.ts +37 -0
  139. package/src/components/graph/graph-canvas-lazy.tsx +4 -0
  140. package/src/components/graph/graph-controls.tsx +4 -1
  141. package/src/components/graph/graph-maintenance.tsx +304 -0
  142. package/src/components/graph/graph-page.tsx +11 -840
  143. package/src/components/graph/graph-scene.tsx +548 -0
  144. package/src/components/graph/graph-spinner.tsx +9 -0
  145. package/src/hooks/use-vpn-status.ts +64 -31
  146. package/src/hooks/use-websocket.ts +70 -273
  147. package/src/hooks/websocket-handlers/activity.ts +13 -0
  148. package/src/hooks/websocket-handlers/chat.ts +210 -0
  149. package/src/hooks/websocket-handlers/connection.ts +30 -0
  150. package/src/hooks/websocket-handlers/index.ts +59 -0
  151. package/src/hooks/websocket-handlers/mask.ts +17 -0
  152. package/src/hooks/websocket-handlers/provider.ts +35 -0
  153. package/src/hooks/websocket-handlers/types.ts +27 -0
  154. package/src/stores/activity-store-helpers.ts +164 -0
  155. package/src/stores/activity-store-types.ts +55 -0
  156. package/src/stores/activity-store.ts +21 -217
  157. package/src/stores/connection-store.ts +33 -2
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useRef } from "react";
3
+ import { CopyButton } from "./copy-button.js";
4
+ import { MermaidBlock } from "./mermaid-block.js";
5
+ /** Concatenate all text descendants of a React node tree. */
6
+ function extractText(node) {
7
+ if (typeof node === "string")
8
+ return node;
9
+ if (typeof node === "number")
10
+ return String(node);
11
+ if (Array.isArray(node))
12
+ return node.map(extractText).join("");
13
+ if (React.isValidElement(node)) {
14
+ return extractText(node.props.children);
15
+ }
16
+ return "";
17
+ }
18
+ /**
19
+ * If a <pre>'s children are a ```mermaid / ```mmd fence, recover the raw
20
+ * diagram source. Text is extracted recursively because rehype-highlight
21
+ * and the linkify pass may have wrapped parts of it in elements.
22
+ */
23
+ function mermaidSourceFrom(children) {
24
+ for (const child of React.Children.toArray(children)) {
25
+ if (!React.isValidElement(child))
26
+ continue;
27
+ const props = child.props;
28
+ if (typeof props.className === "string" && /\blanguage-(?:mermaid|mmd)\b/.test(props.className)) {
29
+ return extractText(props.children).replace(/\n$/, "");
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ export function MarkdownPre({ children, ...props }) {
35
+ const mermaid = mermaidSourceFrom(children);
36
+ if (mermaid !== null)
37
+ return _jsx(MermaidBlock, { source: mermaid });
38
+ return _jsx(CodePre, { ...props, children: children });
39
+ }
40
+ function CodePre({ children, ...props }) {
41
+ const ref = useRef(null);
42
+ return (_jsxs("div", { className: "group relative", children: [_jsx("pre", { ref: ref, className: "overflow-x-auto rounded-lg border border-border bg-surface p-4 font-[family-name:var(--font-mono)] text-[13px] leading-relaxed", ...props, children: children }), _jsx(CopyButton, { getText: () => ref.current?.textContent ?? "" })] }));
43
+ }
44
+ export function MarkdownTable({ children, ...props }) {
45
+ return (_jsx("div", { className: "overflow-x-auto rounded-lg border border-border", children: _jsx("table", { ...props, children: children }) }));
46
+ }
47
+ //# sourceMappingURL=brain-markdown-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-markdown-code.js","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown-code.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,6DAA6D;AAC7D,SAAS,WAAW,CAAC,IAAqB;IACxC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAE,IAAI,CAAC,KAAwC,CAAC,QAAQ,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,QAAyB;IAClD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,SAAS;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAA2D,CAAC;QAChF,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAChG,OAAO,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAyC;IACvF,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAC,YAAY,IAAC,MAAM,EAAE,OAAO,GAAI,CAAC;IAC/D,OAAO,KAAC,OAAO,OAAK,KAAK,YAAG,QAAQ,GAAW,CAAC;AAClD,CAAC;AAED,SAAS,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAyC;IAC5E,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,OAAO,CACL,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAC,gIAAgI,KACtI,KAAK,YAER,QAAQ,GACL,EACN,KAAC,UAAU,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,GAAI,IACzD,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAA2C;IAC3F,OAAO,CACL,cAAK,SAAS,EAAC,iDAAiD,YAC9D,mBAAW,KAAK,YAAG,QAAQ,GAAS,GAChC,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ export declare function renderEntityTags(md: string): string;
3
+ /**
4
+ * Parse entity markers in a text string. Each entity content is run through
5
+ * `innerTransform` so file-path linkification (or any other inline transform)
6
+ * applies inside `<f>...</f>` spans too.
7
+ */
8
+ export declare function renderEntitiesInText(text: string, innerTransform?: (s: string) => React.ReactNode): React.ReactNode[];
9
+ /** Recursively process React children to expand entity markers / file paths in text nodes */
10
+ export declare function processChildText(children: React.ReactNode, opts: {
11
+ entityTags: boolean;
12
+ fileLinks: boolean;
13
+ }): React.ReactNode;
14
+ //# sourceMappingURL=brain-markdown-entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-markdown-entities.d.ts","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown-entities.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAmB1B,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAyBnD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC,SAAoB,GACxD,KAAK,CAAC,SAAS,EAAE,CA0BnB;AAsBD,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAY9H"}
@@ -0,0 +1,93 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { renderBarePathsInText } from "./brain-markdown-links.js";
4
+ const ENTITY_TAGS = {
5
+ co: "entity-co",
6
+ p: "entity-p",
7
+ proj: "entity-proj",
8
+ ev: "entity-ev",
9
+ d: "entity-d",
10
+ st: "entity-st",
11
+ f: "entity-f",
12
+ };
13
+ // Use a unicode marker that won't appear in normal text to wrap entities
14
+ // so they survive markdown parsing without relying on rehypeRaw
15
+ const ENTITY_START = "\u200B\u200B"; // zero-width spaces as delimiter
16
+ const ENTITY_SEP = "\u200B";
17
+ const ENTITY_END = "\u200B\u200B\u200B";
18
+ export function renderEntityTags(md) {
19
+ // Convert entity tags to marker-based format:
20
+ // START tag SEP content END (START/SEP/END are ZWSP runs, see above)
21
+ let result = md.replace(/<(co|p|proj|ev|d|st|f)>([\s\S]*?)<\/\1>/g, (_match, tag, content) => `${ENTITY_START}${tag}${ENTITY_SEP}${content}${ENTITY_END}`);
22
+ // Clean up any orphaned/unmatched entity tags
23
+ result = result.replace(/<\/?(?:co|p|proj|ev|d|st|f)>/g, "");
24
+ // Log and strip any remaining non-standard HTML-like tags the LLM may have output
25
+ result = result.replace(/<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, (match, tag) => {
26
+ const allowed = [
27
+ "span", "strong", "em", "b", "i", "a", "br", "hr", "p",
28
+ "h1", "h2", "h3", "h4", "h5", "h6",
29
+ "ul", "ol", "li", "code", "pre", "blockquote",
30
+ "table", "thead", "tbody", "tr", "th", "td",
31
+ "div", "img", "del", "sup", "sub",
32
+ ];
33
+ if (allowed.includes(tag.toLowerCase()))
34
+ return match;
35
+ console.warn("[entity-tags] Stripping unrecognized tag:", match);
36
+ return "";
37
+ });
38
+ return result;
39
+ }
40
+ /**
41
+ * Parse entity markers in a text string. Each entity content is run through
42
+ * `innerTransform` so file-path linkification (or any other inline transform)
43
+ * applies inside `<f>...</f>` spans too.
44
+ */
45
+ export function renderEntitiesInText(text, innerTransform = (s) => s) {
46
+ const pattern = new RegExp(`${ENTITY_START}(co|p|proj|ev|d|st|f)${ENTITY_SEP}(.*?)${ENTITY_END}`, "g");
47
+ const nodes = [];
48
+ let lastIndex = 0;
49
+ let match;
50
+ let key = 0;
51
+ while ((match = pattern.exec(text)) !== null) {
52
+ if (match.index > lastIndex) {
53
+ nodes.push(innerTransform(text.slice(lastIndex, match.index)));
54
+ }
55
+ const cls = ENTITY_TAGS[match[1]] || "";
56
+ nodes.push(_jsx("span", { className: cls, children: innerTransform(match[2]) }, key++));
57
+ lastIndex = pattern.lastIndex;
58
+ }
59
+ if (lastIndex < text.length) {
60
+ nodes.push(innerTransform(text.slice(lastIndex)));
61
+ }
62
+ return nodes;
63
+ }
64
+ /** Process a text string for entity markers and/or bare file paths. */
65
+ function transformTextString(text, opts) {
66
+ const linkify = opts.fileLinks
67
+ ? (s) => {
68
+ if (!s)
69
+ return s;
70
+ const parts = renderBarePathsInText(s);
71
+ if (parts.length === 1 && typeof parts[0] === "string")
72
+ return parts[0];
73
+ return _jsx(_Fragment, { children: parts });
74
+ }
75
+ : (s) => s;
76
+ if (opts.entityTags && text.includes(ENTITY_START)) {
77
+ return _jsx(_Fragment, { children: renderEntitiesInText(text, opts.fileLinks ? (s) => linkify(s) : undefined) });
78
+ }
79
+ return linkify(text);
80
+ }
81
+ /** Recursively process React children to expand entity markers / file paths in text nodes */
82
+ export function processChildText(children, opts) {
83
+ if (typeof children === "string") {
84
+ return transformTextString(children, opts);
85
+ }
86
+ if (Array.isArray(children)) {
87
+ return children.map((child, i) => typeof child === "string"
88
+ ? _jsx(React.Fragment, { children: transformTextString(child, opts) }, i)
89
+ : child);
90
+ }
91
+ return children;
92
+ }
93
+ //# sourceMappingURL=brain-markdown-entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-markdown-entities.js","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown-entities.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ /**
3
+ * Turn a markdown image source into something the browser can actually load.
4
+ *
5
+ * Anything already absolute — a `data:` URI, an http(s) URL, or a path that is
6
+ * already an API route — passes through. A repo-relative path is rewritten to
7
+ * the files endpoint, which is where brain content is served from.
8
+ */
9
+ export declare function repoImageSrc(src: string): string;
10
+ /** Click target for a repo-relative file reference. Opens the file panel + viewer. */
11
+ export declare function FileLink({ path, children }: {
12
+ path: string;
13
+ children?: React.ReactNode;
14
+ }): React.JSX.Element;
15
+ /** Click target for `[[slug]]` / `[[slug|Label]]`. */
16
+ export declare function WikiLink({ target, label, }: {
17
+ target: string;
18
+ label?: string;
19
+ }): React.JSX.Element;
20
+ /**
21
+ * Click target for a repo-relative directory reference. Opens the file
22
+ * panel, expands the tree down to the directory, and highlights it so
23
+ * the user sees its contents.
24
+ */
25
+ export declare function DirLink({ path, children }: {
26
+ path: string;
27
+ children?: React.ReactNode;
28
+ }): React.JSX.Element;
29
+ export declare function renderBarePathsInText(text: string): React.ReactNode[];
30
+ /**
31
+ * Public helper: turn any raw text blob into React nodes with bare-path
32
+ * tokens replaced by FileLink elements. Use this in non-markdown surfaces
33
+ * (tool outputs, streaming logs, plain user text).
34
+ */
35
+ export declare function linkifyPaths(text: string): React.ReactNode;
36
+ //# sourceMappingURL=brain-markdown-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-markdown-links.d.ts","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown-links.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AACD,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAiBxF;AAsBD,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,KAAK,GACN,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,qBAkCA;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAmBvF;AAyED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CA6BrE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAK1D"}
@@ -0,0 +1,176 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { apiBase } from "../../lib/backend.js";
3
+ import { isInternalRepoDir, isInternalRepoPath, useFileStore, } from "../../stores/file-store.js";
4
+ import { useUIStore } from "../../stores/ui-store.js";
5
+ /**
6
+ * Turn a markdown image source into something the browser can actually load.
7
+ *
8
+ * Anything already absolute — a `data:` URI, an http(s) URL, or a path that is
9
+ * already an API route — passes through. A repo-relative path is rewritten to
10
+ * the files endpoint, which is where brain content is served from.
11
+ */
12
+ export function repoImageSrc(src) {
13
+ const trimmed = src.trim();
14
+ if (!trimmed)
15
+ return src;
16
+ if (/^(data:|blob:|https?:\/\/)/i.test(trimmed))
17
+ return trimmed;
18
+ if (trimmed.startsWith("/api/"))
19
+ return trimmed;
20
+ const rel = trimmed.replace(/^\.\//, "").replace(/^\/+/, "");
21
+ return `${apiBase()}/files/content?path=${encodeURIComponent(rel)}&raw=1`;
22
+ }
23
+ /** Click target for a repo-relative file reference. Opens the file panel + viewer. */
24
+ export function FileLink({ path, children }) {
25
+ const openFile = useFileStore((s) => s.openFile);
26
+ const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
27
+ return (_jsx("a", { href: `#/files/${path}`, onClick: (e) => {
28
+ e.preventDefault();
29
+ setFilePanelOpen(true);
30
+ void openFile(path);
31
+ }, className: "brain-file-link", title: path, children: children ?? path }));
32
+ }
33
+ /**
34
+ * Resolve an obsidian-style `[[target]]` to a repo-relative path using the
35
+ * wikilink map. Targets containing `/` are treated as paths directly; bare
36
+ * slugs are looked up by basename. An `#anchor` suffix is stripped before
37
+ * lookup.
38
+ */
39
+ function resolveWikilinkTarget(raw, slugMap) {
40
+ const hashIdx = raw.indexOf("#");
41
+ const noAnchor = hashIdx >= 0 ? raw.slice(0, hashIdx).trim() : raw.trim();
42
+ if (!noAnchor)
43
+ return null;
44
+ if (noAnchor.includes("/")) {
45
+ if (noAnchor.endsWith("/"))
46
+ return null;
47
+ return /\.[a-z0-9]{1,8}$/i.test(noAnchor) ? noAnchor : `${noAnchor}.md`;
48
+ }
49
+ return slugMap[noAnchor.toLowerCase()] ?? null;
50
+ }
51
+ /** Click target for `[[slug]]` / `[[slug|Label]]`. */
52
+ export function WikiLink({ target, label, }) {
53
+ const slugMap = useFileStore((s) => s.wikilinkMap);
54
+ const loaded = useFileStore((s) => s.wikilinkLoaded);
55
+ const openFile = useFileStore((s) => s.openFile);
56
+ const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
57
+ const resolved = resolveWikilinkTarget(target, slugMap);
58
+ const display = label ?? target;
59
+ if (!resolved) {
60
+ return (_jsx("span", { className: "brain-wiki-link brain-wiki-link--unresolved", title: loaded ? `Unresolved wikilink: ${target}` : "Resolving…", children: display }));
61
+ }
62
+ return (_jsx("a", { href: `#/files/${resolved}`, onClick: (e) => {
63
+ e.preventDefault();
64
+ setFilePanelOpen(true);
65
+ void openFile(resolved);
66
+ }, className: "brain-file-link brain-wiki-link", title: resolved, children: display }));
67
+ }
68
+ /**
69
+ * Click target for a repo-relative directory reference. Opens the file
70
+ * panel, expands the tree down to the directory, and highlights it so
71
+ * the user sees its contents.
72
+ */
73
+ export function DirLink({ path, children }) {
74
+ const openDir = useFileStore((s) => s.openDir);
75
+ const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
76
+ const trimmed = path.replace(/\/+$/, "");
77
+ const display = `${trimmed}/`;
78
+ return (_jsx("a", { href: `#/files/${display}`, onClick: (e) => {
79
+ e.preventDefault();
80
+ setFilePanelOpen(true);
81
+ void openDir(trimmed);
82
+ }, className: "brain-file-link brain-file-link--dir", title: display, children: children ?? display }));
83
+ }
84
+ // Bare-path tokens in prose. Three passes:
85
+ // - files: "notes/projects/foo.md" — ends with .ext
86
+ // - dirs: "notes/projects/post-templates/" — ends with /
87
+ // - wikilinks: "[[slug]]" or "[[slug|Display]]" — obsidian-style
88
+ const BARE_FILE_RE = /\b([a-z][a-z0-9_-]*(?:\/[a-z0-9._-]+)+\.[a-z0-9]{1,8})\b/gi;
89
+ const BARE_DIR_RE = /\b([a-z][a-z0-9_-]*(?:\/[a-z0-9._-]+)+\/)(?=$|[\s,;:!?)\]])/gi;
90
+ const WIKILINK_RE = /\[\[([^\[\]\n|]+?)(?:\|([^\[\]\n]+?))?\]\]/g;
91
+ function scanBarePaths(text) {
92
+ const out = [];
93
+ BARE_FILE_RE.lastIndex = 0;
94
+ let m;
95
+ while ((m = BARE_FILE_RE.exec(text)) !== null) {
96
+ if (isInternalRepoPath(m[1])) {
97
+ out.push({
98
+ start: m.index,
99
+ end: BARE_FILE_RE.lastIndex,
100
+ path: m[1],
101
+ kind: "file",
102
+ });
103
+ }
104
+ }
105
+ BARE_DIR_RE.lastIndex = 0;
106
+ while ((m = BARE_DIR_RE.exec(text)) !== null) {
107
+ if (isInternalRepoDir(m[1])) {
108
+ out.push({
109
+ start: m.index,
110
+ end: BARE_DIR_RE.lastIndex,
111
+ path: m[1],
112
+ kind: "dir",
113
+ });
114
+ }
115
+ }
116
+ WIKILINK_RE.lastIndex = 0;
117
+ while ((m = WIKILINK_RE.exec(text)) !== null) {
118
+ out.push({
119
+ start: m.index,
120
+ end: WIKILINK_RE.lastIndex,
121
+ kind: "wikilink",
122
+ target: m[1].trim(),
123
+ label: m[2]?.trim(),
124
+ });
125
+ }
126
+ out.sort((a, b) => a.start - b.start);
127
+ // Drop overlapping matches — keep the first (earlier) when ranges collide
128
+ const merged = [];
129
+ let cursor = 0;
130
+ for (const cand of out) {
131
+ if (cand.start >= cursor) {
132
+ merged.push(cand);
133
+ cursor = cand.end;
134
+ }
135
+ }
136
+ return merged;
137
+ }
138
+ export function renderBarePathsInText(text) {
139
+ const matches = scanBarePaths(text);
140
+ if (matches.length === 0)
141
+ return [text];
142
+ const nodes = [];
143
+ let last = 0;
144
+ let key = 0;
145
+ for (const m of matches) {
146
+ if (m.start > last)
147
+ nodes.push(text.slice(last, m.start));
148
+ if (m.kind === "file" && m.path) {
149
+ nodes.push(_jsx(FileLink, { path: m.path, children: m.path }, `p${key++}`));
150
+ }
151
+ else if (m.kind === "dir" && m.path) {
152
+ nodes.push(_jsx(DirLink, { path: m.path.replace(/\/+$/, ""), children: m.path }, `p${key++}`));
153
+ }
154
+ else if (m.kind === "wikilink" && m.target) {
155
+ nodes.push(_jsx(WikiLink, { target: m.target, label: m.label }, `p${key++}`));
156
+ }
157
+ last = m.end;
158
+ }
159
+ if (last < text.length)
160
+ nodes.push(text.slice(last));
161
+ return nodes;
162
+ }
163
+ /**
164
+ * Public helper: turn any raw text blob into React nodes with bare-path
165
+ * tokens replaced by FileLink elements. Use this in non-markdown surfaces
166
+ * (tool outputs, streaming logs, plain user text).
167
+ */
168
+ export function linkifyPaths(text) {
169
+ if (!text)
170
+ return text;
171
+ const parts = renderBarePathsInText(text);
172
+ if (parts.length === 1 && typeof parts[0] === "string")
173
+ return parts[0];
174
+ return _jsx(_Fragment, { children: parts });
175
+ }
176
+ //# sourceMappingURL=brain-markdown-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-markdown-links.js","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown-links.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ShareBlockFormat } from "./share-block.js";
2
+ type ShareSegment = {
3
+ kind: "share";
4
+ format: ShareBlockFormat;
5
+ title?: string;
6
+ body: string;
7
+ };
8
+ type TextSegment = {
9
+ kind: "text";
10
+ text: string;
11
+ };
12
+ export type Segment = TextSegment | ShareSegment;
13
+ export declare function splitShareBlocks(input: string): Segment[];
14
+ export {};
15
+ //# sourceMappingURL=brain-markdown-share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-markdown-share.d.ts","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown-share.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9F,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAClD,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,YAAY,CAAC;AAyBjD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAiBzD"}
@@ -0,0 +1,40 @@
1
+ const SHARE_BLOCK_RE = /<share\b([^>]*)>([\s\S]*?)<\/share>/gi;
2
+ const VALID_FORMATS = new Set([
3
+ "image",
4
+ "pdf",
5
+ "text",
6
+ "markdown",
7
+ "richtext",
8
+ ]);
9
+ function parseShareAttrs(raw) {
10
+ const attrs = {};
11
+ const re = /(\w+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g;
12
+ let m;
13
+ while ((m = re.exec(raw)) !== null) {
14
+ attrs[m[1].toLowerCase()] = m[2] ?? m[3] ?? m[4] ?? "";
15
+ }
16
+ const format = (attrs.format ?? "image").toLowerCase();
17
+ return {
18
+ format: VALID_FORMATS.has(format) ? format : "image",
19
+ title: attrs.title,
20
+ };
21
+ }
22
+ export function splitShareBlocks(input) {
23
+ const out = [];
24
+ let last = 0;
25
+ let m;
26
+ SHARE_BLOCK_RE.lastIndex = 0;
27
+ while ((m = SHARE_BLOCK_RE.exec(input)) !== null) {
28
+ if (m.index > last) {
29
+ out.push({ kind: "text", text: input.slice(last, m.index) });
30
+ }
31
+ const { format, title } = parseShareAttrs(m[1] ?? "");
32
+ out.push({ kind: "share", format, title, body: m[2].trim() });
33
+ last = SHARE_BLOCK_RE.lastIndex;
34
+ }
35
+ if (last < input.length) {
36
+ out.push({ kind: "text", text: input.slice(last) });
37
+ }
38
+ return out;
39
+ }
40
+ //# sourceMappingURL=brain-markdown-share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-markdown-share.js","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown-share.ts"],"names":[],"mappings":"AAMA,MAAM,cAAc,GAAG,uCAAuC,CAAC;AAC/D,MAAM,aAAa,GAAkC,IAAI,GAAG,CAAC;IAC3D,OAAO;IACP,KAAK;IACL,MAAM;IACN,UAAU;IACV,UAAU;CACX,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,EAAE,GAAG,gDAAgD,CAAC;IAC5D,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,WAAW,EAAsB,CAAC;IAC3E,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QACpD,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAyB,CAAC;IAC9B,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC;IAClC,CAAC;IACD,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,12 +1,5 @@
1
1
  import React from "react";
2
- /**
3
- * Turn a markdown image source into something the browser can actually load.
4
- *
5
- * Anything already absolute — a `data:` URI, an http(s) URL, or a path that is
6
- * already an API route — passes through. A repo-relative path is rewritten to
7
- * the files endpoint, which is where brain content is served from.
8
- */
9
- export declare function repoImageSrc(src: string): string;
2
+ export { DirLink, FileLink, WikiLink, linkifyPaths, repoImageSrc, } from "./brain-markdown-links.js";
10
3
  interface BrainMarkdownProps {
11
4
  content: string;
12
5
  className?: string;
@@ -19,30 +12,4 @@ interface BrainMarkdownProps {
19
12
  * props are primitives, so the default shallow comparison is exactly right.
20
13
  */
21
14
  export declare const BrainMarkdown: React.MemoExoticComponent<({ content, className, entityTags, fileLinks }: BrainMarkdownProps) => React.JSX.Element>;
22
- /** Click target for a repo-relative file reference. Opens the file panel + viewer. */
23
- export declare function FileLink({ path, children }: {
24
- path: string;
25
- children?: React.ReactNode;
26
- }): React.JSX.Element;
27
- /** Click target for `[[slug]]` / `[[slug|Label]]`. */
28
- export declare function WikiLink({ target, label, }: {
29
- target: string;
30
- label?: string;
31
- }): React.JSX.Element;
32
- /**
33
- * Click target for a repo-relative directory reference. Opens the file
34
- * panel, expands the tree down to the directory, and highlights it so
35
- * the user sees its contents.
36
- */
37
- export declare function DirLink({ path, children }: {
38
- path: string;
39
- children?: React.ReactNode;
40
- }): React.JSX.Element;
41
- /**
42
- * Public helper: turn any raw text blob into React nodes with bare-path
43
- * tokens replaced by FileLink elements. Use this in non-markdown surfaces
44
- * (tool outputs, streaming logs, plain user text).
45
- */
46
- export declare function linkifyPaths(text: string): React.ReactNode;
47
- export {};
48
15
  //# sourceMappingURL=brain-markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain-markdown.d.ts","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown.tsx"],"names":[],"mappings":"AACA,OAAO,KAMN,MAAM,OAAO,CAAC;AA0Df;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AA+FD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAsHD;;;;GAIG;AACH,eAAO,MAAM,aAAa,4EAA8F,kBAAkB,uBA6BxI,CAAC;AAqGH,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAiBxF;AAsBD,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,KAAK,GACN,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,qBAkCA;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAmBvF;AAwGD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAK1D"}
1
+ {"version":3,"file":"brain-markdown.d.ts","sourceRoot":"","sources":["../../../src/components/chat/brain-markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmC,MAAM,OAAO,CAAC;AAyBxD,OAAO,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,2BAA2B,CAAC;AAEnC,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAUD;;;;GAIG;AACH,eAAO,MAAM,aAAa,4EAA8F,kBAAkB,uBA6BxI,CAAC"}