@tutti-os/agent-gui 0.0.132 → 0.0.134

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 (96) hide show
  1. package/README.md +21 -4
  2. package/dist/{AgentRichTextReadonly-PEKCMRPE.js → AgentRichTextReadonly-HCKTNAYO.js} +7 -6
  3. package/dist/agent-conversation/index.d.ts +4 -6
  4. package/dist/agent-conversation/index.js +10 -10
  5. package/dist/agent-env/index.d.ts +10 -27
  6. package/dist/agent-env/index.js +14 -290
  7. package/dist/agent-env/index.js.map +1 -1
  8. package/dist/agent-gui.d.ts +1118 -20
  9. package/dist/agent-gui.js +18 -18
  10. package/dist/agent-message-center/index.d.ts +42 -7
  11. package/dist/agent-message-center/index.js +7 -7
  12. package/dist/{agentConversationVM-BD0-gg6C.d.ts → agentConversationVM-DWEy7jzx.d.ts} +41 -2
  13. package/dist/{agentFileMentionContracts-CWAeuL7S.d.ts → agentFileMentionContracts-B0yQizXB.d.ts} +5 -0
  14. package/dist/{agentGuiNodeTypes-5TL1hyCN.d.ts → agentGuiNodeTypes-DV7KvZRe.d.ts} +10 -26
  15. package/dist/agents.d.ts +1 -1
  16. package/dist/agents.js +1 -1
  17. package/dist/app/renderer/agentactivity.css +7 -0
  18. package/dist/app/renderer/assets/icons/@-lined.svg +1 -8
  19. package/dist/{chunk-PQJXWXTS.js → chunk-25VMCMAQ.js} +4 -4
  20. package/dist/{chunk-T2NICA5D.js → chunk-5WOCGIXJ.js} +7 -1
  21. package/dist/chunk-5WOCGIXJ.js.map +1 -0
  22. package/dist/chunk-DLCZJKCA.js +1 -0
  23. package/dist/chunk-DLCZJKCA.js.map +1 -0
  24. package/dist/{chunk-QQRTUHCH.js → chunk-EU7DCT4F.js} +2 -2
  25. package/dist/chunk-FM42UN2J.js +462 -0
  26. package/dist/chunk-FM42UN2J.js.map +1 -0
  27. package/dist/{chunk-SZOTLVH6.js → chunk-GIYGO2PB.js} +2 -2
  28. package/dist/{chunk-GCQYN7BR.js → chunk-IN3HXYOO.js} +4 -4
  29. package/dist/{chunk-YWHGCKMT.js → chunk-IYZ4GOSN.js} +10 -10
  30. package/dist/chunk-IYZ4GOSN.js.map +1 -0
  31. package/dist/{chunk-JZS4SWFJ.js → chunk-JI5KND3K.js} +60 -56
  32. package/dist/chunk-JI5KND3K.js.map +1 -0
  33. package/dist/{chunk-J4TTEMRW.js → chunk-KWGMK4IZ.js} +4 -4
  34. package/dist/{chunk-NE6H7S5Z.js → chunk-OFJNIQWR.js} +2 -2
  35. package/dist/{chunk-NE6H7S5Z.js.map → chunk-OFJNIQWR.js.map} +1 -1
  36. package/dist/{chunk-UARZZJJB.js → chunk-OI6BYC7P.js} +4 -4
  37. package/dist/{chunk-OBWM2RFE.js → chunk-QPEO4OQS.js} +308 -8
  38. package/dist/chunk-QPEO4OQS.js.map +1 -0
  39. package/dist/{chunk-XNE2ROCP.js → chunk-UA75CGAG.js} +3 -3
  40. package/dist/{chunk-PVTAFUDS.js → chunk-VGS7S7YT.js} +2 -2
  41. package/dist/{chunk-OQR3HXPF.js → chunk-VUNVGEQG.js} +7 -1
  42. package/dist/chunk-VUNVGEQG.js.map +1 -0
  43. package/dist/{chunk-G75CPIVV.js → chunk-Y5HD6XHP.js} +1040 -797
  44. package/dist/chunk-Y5HD6XHP.js.map +1 -0
  45. package/dist/{chunk-KPMQGPYU.js → chunk-ZVYUTXQJ.js} +1 -1
  46. package/dist/chunk-ZVYUTXQJ.js.map +1 -0
  47. package/dist/context-mention-palette/index.d.ts +1 -1
  48. package/dist/context-mention-palette/index.js +8 -7
  49. package/dist/{contribution-yc4CGJmy.d.ts → contribution-CDdwTppn.d.ts} +54 -1
  50. package/dist/custom-mention.d.ts +4 -2
  51. package/dist/custom-mention.js +1 -0
  52. package/dist/i18n/index.d.ts +17 -6
  53. package/dist/i18n/index.js +2 -2
  54. package/dist/index.d.ts +8026 -33
  55. package/dist/index.js +21 -21
  56. package/dist/index.js.map +1 -1
  57. package/dist/mention-search.d.ts +1 -1
  58. package/dist/mention-search.js +6 -5
  59. package/dist/runtime-Dwf44VKc.d.ts +7 -0
  60. package/dist/{types-BicfRVrV.d.ts → types-ee3zJ6Cc.d.ts} +6 -5
  61. package/dist/workbench/browser-element-context/index.d.ts +37 -0
  62. package/dist/workbench/browser-element-context/index.js +750 -0
  63. package/dist/workbench/browser-element-context/index.js.map +1 -0
  64. package/dist/workbench/contribution.d.ts +1 -2
  65. package/dist/workbench/contribution.js +4 -4
  66. package/dist/workbench/index.d.ts +1 -2
  67. package/dist/workbench/index.js +4 -4
  68. package/dist/workbench/sessionTitle.js +2 -2
  69. package/dist/workbench/tool-sidebar/index.d.ts +189 -0
  70. package/dist/workbench/tool-sidebar/index.js +1492 -0
  71. package/dist/workbench/tool-sidebar/index.js.map +1 -0
  72. package/dist/workspace-agent-generated-files.d.ts +12 -1
  73. package/package.json +28 -13
  74. package/dist/AgentGUI-DxypmD7b.d.ts +0 -1080
  75. package/dist/agentPlanPromptDispatch-C7cCMjve.d.ts +0 -37
  76. package/dist/chunk-G75CPIVV.js.map +0 -1
  77. package/dist/chunk-JZS4SWFJ.js.map +0 -1
  78. package/dist/chunk-KPMQGPYU.js.map +0 -1
  79. package/dist/chunk-OBWM2RFE.js.map +0 -1
  80. package/dist/chunk-OQR3HXPF.js.map +0 -1
  81. package/dist/chunk-T2NICA5D.js.map +0 -1
  82. package/dist/chunk-VMQNG2KI.js +0 -178
  83. package/dist/chunk-VMQNG2KI.js.map +0 -1
  84. package/dist/chunk-YWHGCKMT.js.map +0 -1
  85. package/dist/pastedTextKinds-D-XuInaS.d.ts +0 -4
  86. package/dist/runtime-BBNdWgDU.d.ts +0 -10
  87. package/dist/workspaceAgentActivityListTypes-DZfS_HgG.d.ts +0 -48
  88. /package/dist/{AgentRichTextReadonly-PEKCMRPE.js.map → AgentRichTextReadonly-HCKTNAYO.js.map} +0 -0
  89. /package/dist/{chunk-PQJXWXTS.js.map → chunk-25VMCMAQ.js.map} +0 -0
  90. /package/dist/{chunk-QQRTUHCH.js.map → chunk-EU7DCT4F.js.map} +0 -0
  91. /package/dist/{chunk-SZOTLVH6.js.map → chunk-GIYGO2PB.js.map} +0 -0
  92. /package/dist/{chunk-GCQYN7BR.js.map → chunk-IN3HXYOO.js.map} +0 -0
  93. /package/dist/{chunk-J4TTEMRW.js.map → chunk-KWGMK4IZ.js.map} +0 -0
  94. /package/dist/{chunk-UARZZJJB.js.map → chunk-OI6BYC7P.js.map} +0 -0
  95. /package/dist/{chunk-XNE2ROCP.js.map → chunk-UA75CGAG.js.map} +0 -0
  96. /package/dist/{chunk-PVTAFUDS.js.map → chunk-VGS7S7YT.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../workbench/browser-element-context/BrowserElementContextAction.tsx","../../../workbench/browser-element-context/browserElementSnapshot.ts","../../../workbench/browser-element-context/browserElementSelectorScript.ts","../../../workbench/browser-element-context/browserElementWebview.ts","../../../workbench/browser-element-context/browserElementMention.ts","../../../workbench/browser-element-context/browserElementContextSelectionController.ts","../../../workbench/browser-element-context/registerBrowserElementMention.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n Button,\n InspectIcon,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport { useActiveBrowserNodeWebview } from \"@tutti-os/browser-node/react\";\nimport { useEngineSelector } from \"../../shared/engine/useEngineSelector.ts\";\nimport { BrowserElementContextSelectionController } from \"./browserElementContextSelectionController.ts\";\n\nexport interface BrowserElementContextCopy {\n cancel: string;\n failed: string;\n select: string;\n}\n\nexport function BrowserElementContextAction({\n copy,\n onAppendMention,\n onError,\n workspaceId\n}: {\n copy: BrowserElementContextCopy;\n onAppendMention: (mention: string) => void;\n onError: (message: string) => void;\n workspaceId: string;\n}): ReactNode {\n const activeWebview = useActiveBrowserNodeWebview();\n const [controller] = useState(\n () =>\n new BrowserElementContextSelectionController({\n failedCopy: copy.failed,\n onAppendMention,\n onError,\n workspaceId\n })\n );\n controller.configure({\n failedCopy: copy.failed,\n onAppendMention,\n onError,\n workspaceId\n });\n const state = useEngineSelector(controller, (snapshot) => snapshot.state);\n const bindAction = useCallback(\n (node: HTMLButtonElement | null) =>\n controller.bindAction(node, activeWebview),\n [activeWebview, controller]\n );\n const label = state === \"selecting\" ? copy.cancel : copy.select;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={label}\n aria-pressed={state === \"selecting\"}\n className={cn(\n \"nodrag shrink-0 rounded-md\",\n state === \"selecting\" &&\n \"bg-[var(--transparency-block)] text-[var(--text-primary)]\"\n )}\n size=\"icon-sm\"\n ref={bindAction}\n type=\"button\"\n variant=\"chrome\"\n onClick={() => controller.toggle(activeWebview)}\n >\n <InspectIcon className=\"size-[15px]\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n","export const browserElementSnapshotFormat = \"tutti.browser-element.v1\";\nexport const browserElementSnapshotMaxHtmlChars = 32_000;\nexport const browserElementSnapshotMaxTextChars = 4_000;\n\nexport interface BrowserElementSnapshot {\n format: typeof browserElementSnapshotFormat;\n capturedAt: string;\n page: {\n title: string;\n url: string;\n };\n element: {\n ariaLabel: string | null;\n attributes: Record<string, string>;\n bounds: { height: number; width: number; x: number; y: number };\n classes: string[];\n domPath: string;\n html: string;\n htmlTruncated: boolean;\n id: string | null;\n role: string | null;\n selector: string;\n styles: Record<string, string>;\n tagName: string;\n text: string;\n textTruncated: boolean;\n };\n ancestors: Array<{\n id: string | null;\n role: string | null;\n selector: string;\n tagName: string;\n }>;\n viewport: {\n devicePixelRatio: number;\n height: number;\n scrollX: number;\n scrollY: number;\n width: number;\n };\n}\n\nexport type BrowserElementSelectionResult =\n | { status: \"cancelled\" }\n | { snapshot: BrowserElementSnapshot; status: \"selected\" };\n\nexport function normalizeBrowserElementSelectionResult(\n value: unknown\n): BrowserElementSelectionResult | null {\n if (!isRecord(value)) return null;\n if (value.status === \"cancelled\") return { status: \"cancelled\" };\n if (value.status !== \"selected\" || !isRecord(value.snapshot)) return null;\n const snapshot = value.snapshot;\n const page = isRecord(snapshot.page) ? snapshot.page : {};\n const element = isRecord(snapshot.element) ? snapshot.element : {};\n const bounds = isRecord(element.bounds) ? element.bounds : {};\n const viewport = isRecord(snapshot.viewport) ? snapshot.viewport : {};\n const normalized: BrowserElementSnapshot = {\n format: browserElementSnapshotFormat,\n capturedAt:\n boundedString(snapshot.capturedAt, 64) || new Date().toISOString(),\n page: {\n title: boundedString(page.title, 500),\n url: sanitizeSnapshotUrl(boundedString(page.url, 4_000))\n },\n element: {\n ariaLabel: nullableBoundedString(element.ariaLabel, 1_000),\n attributes: boundedStringRecord(element.attributes, 40, 200, 2_000),\n bounds: {\n height: finiteNumber(bounds.height),\n width: finiteNumber(bounds.width),\n x: finiteNumber(bounds.x),\n y: finiteNumber(bounds.y)\n },\n classes: boundedStringArray(element.classes, 24, 200),\n domPath:\n boundedString(element.domPath, 4_000) ||\n boundedString(element.selector, 2_000),\n html: boundedString(element.html, browserElementSnapshotMaxHtmlChars),\n htmlTruncated:\n element.htmlTruncated === true ||\n (typeof element.html === \"string\" &&\n element.html.length > browserElementSnapshotMaxHtmlChars),\n id: nullableBoundedString(element.id, 500),\n role: nullableBoundedString(element.role, 200),\n selector: boundedString(element.selector, 2_000),\n styles: boundedStringRecord(element.styles, 32, 100, 500),\n tagName: boundedString(element.tagName, 100).toLowerCase(),\n text: boundedString(element.text, browserElementSnapshotMaxTextChars),\n textTruncated:\n element.textTruncated === true ||\n (typeof element.text === \"string\" &&\n element.text.length > browserElementSnapshotMaxTextChars)\n },\n ancestors: Array.isArray(snapshot.ancestors)\n ? snapshot.ancestors.slice(0, 8).flatMap((item) =>\n isRecord(item)\n ? [\n {\n id: nullableBoundedString(item.id, 500),\n role: nullableBoundedString(item.role, 200),\n selector: boundedString(item.selector, 2_000),\n tagName: boundedString(item.tagName, 100).toLowerCase()\n }\n ]\n : []\n )\n : [],\n viewport: {\n devicePixelRatio: finiteNumber(viewport.devicePixelRatio, 1),\n height: finiteNumber(viewport.height),\n scrollX: finiteNumber(viewport.scrollX),\n scrollY: finiteNumber(viewport.scrollY),\n width: finiteNumber(viewport.width)\n }\n };\n if (!normalized.element.tagName || !normalized.element.domPath) return null;\n return { snapshot: normalized, status: \"selected\" };\n}\n\nexport function serializeBrowserElementSnapshot(\n snapshot: BrowserElementSnapshot\n): string {\n const { bounds } = snapshot.element;\n return [\n `DOM Path: ${snapshot.element.domPath}`,\n `Position: top=${formatPixel(bounds.y)}, left=${formatPixel(bounds.x)}, width=${formatPixel(bounds.width)}, height=${formatPixel(bounds.height)}`,\n `HTML Element: ${compactHtmlFragment(snapshot.element.html)}`\n ].join(\"\\n\");\n}\n\nfunction formatPixel(value: number): string {\n const rounded = Math.round(value * 100) / 100;\n return `${Object.is(rounded, -0) ? 0 : rounded}px`;\n}\n\nfunction compactHtmlFragment(value: string): string {\n return value\n .replace(/\\r?\\n/gu, \" \")\n .replace(/\\s{2,}/gu, \" \")\n .trim();\n}\n\nfunction sanitizeSnapshotUrl(value: string): string {\n try {\n const url = new URL(value);\n url.username = \"\";\n url.password = \"\";\n url.hash = \"\";\n for (const key of [...url.searchParams.keys()]) {\n if (\n /(?:token|auth|password|secret|session|cookie|key|signature)/iu.test(\n key\n )\n ) {\n url.searchParams.set(key, \"[redacted]\");\n }\n }\n return url.toString();\n } catch {\n return boundedString(value, 4_000);\n }\n}\n\nfunction boundedString(value: unknown, maxChars: number): string {\n return typeof value === \"string\" ? value.slice(0, maxChars) : \"\";\n}\n\nfunction nullableBoundedString(\n value: unknown,\n maxChars: number\n): string | null {\n const normalized = boundedString(value, maxChars).trim();\n return normalized || null;\n}\n\nfunction boundedStringArray(\n value: unknown,\n maxItems: number,\n maxChars: number\n): string[] {\n return Array.isArray(value)\n ? value\n .slice(0, maxItems)\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.slice(0, maxChars))\n : [];\n}\n\nfunction boundedStringRecord(\n value: unknown,\n maxItems: number,\n maxKeyChars: number,\n maxValueChars: number\n): Record<string, string> {\n if (!isRecord(value)) return {};\n return Object.fromEntries(\n Object.entries(value)\n .slice(0, maxItems)\n .flatMap(([key, item]) =>\n typeof item === \"string\"\n ? [[key.slice(0, maxKeyChars), item.slice(0, maxValueChars)]]\n : []\n )\n );\n}\n\nfunction finiteNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","function runTuttiBrowserElementSelector(): Promise<unknown> {\n type SelectorGlobal = typeof globalThis & {\n __tuttiBrowserElementSelector?: { cancel(): void };\n };\n const selectorGlobal = globalThis as SelectorGlobal;\n selectorGlobal.__tuttiBrowserElementSelector?.cancel();\n\n return new Promise((resolve) => {\n const overlay = document.createElement(\"div\");\n overlay.setAttribute(\"data-tutti-browser-element-highlight\", \"true\");\n Object.assign(overlay.style, {\n background: \"rgba(86, 156, 214, 0.12)\",\n border: \"2px solid rgb(86, 156, 214)\",\n borderRadius: \"3px\",\n boxSizing: \"border-box\",\n display: \"none\",\n left: \"0\",\n pointerEvents: \"none\",\n position: \"fixed\",\n top: \"0\",\n zIndex: \"2147483647\"\n });\n document.documentElement.append(overlay);\n const previousCursor = document.documentElement.style.cursor;\n document.documentElement.style.cursor = \"crosshair\";\n\n const finish = (value: unknown): void => {\n document.removeEventListener(\"mousemove\", handleMouseMove, true);\n document.removeEventListener(\"click\", handleClick, true);\n document.removeEventListener(\"keydown\", handleKeyDown, true);\n document.documentElement.style.cursor = previousCursor;\n overlay.remove();\n delete selectorGlobal.__tuttiBrowserElementSelector;\n resolve(value);\n };\n const cancel = (): void => finish({ status: \"cancelled\" });\n selectorGlobal.__tuttiBrowserElementSelector = { cancel };\n\n function handleMouseMove(event: MouseEvent): void {\n const target = event.target;\n if (!(target instanceof Element) || target === overlay) return;\n const rect = target.getBoundingClientRect();\n Object.assign(overlay.style, {\n display: \"block\",\n height: `${Math.max(0, rect.height)}px`,\n transform: `translate(${rect.left}px, ${rect.top}px)`,\n width: `${Math.max(0, rect.width)}px`\n });\n }\n\n function handleClick(event: MouseEvent): void {\n const target = event.target;\n if (!(target instanceof Element) || target === overlay) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n finish({ snapshot: captureSnapshot(target), status: \"selected\" });\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopImmediatePropagation();\n cancel();\n }\n\n function captureSnapshot(target: Element): Record<string, unknown> {\n const rect = target.getBoundingClientRect();\n const rawText = isFormControl(target)\n ? \"\"\n : (target.textContent ?? \"\").replace(/\\s+/gu, \" \").trim();\n const clone = target.cloneNode(true) as Element;\n clone\n .querySelectorAll(\"script,style,noscript,template\")\n .forEach((item) => item.remove());\n sanitizeElement(clone);\n clone.querySelectorAll(\"*\").forEach(sanitizeElement);\n const rawHtml = clone.outerHTML;\n const computed = getComputedStyle(target);\n const styleNames = [\n \"display\",\n \"position\",\n \"color\",\n \"background-color\",\n \"font-family\",\n \"font-size\",\n \"font-weight\",\n \"line-height\",\n \"margin\",\n \"padding\",\n \"border\",\n \"border-radius\",\n \"width\",\n \"height\",\n \"flex\",\n \"grid-template-columns\",\n \"align-items\",\n \"justify-content\",\n \"overflow\",\n \"opacity\",\n \"visibility\"\n ];\n return {\n format: \"tutti.browser-element.v1\",\n capturedAt: new Date().toISOString(),\n page: {\n title: document.title,\n url: sanitizeUrl(location.href)\n },\n element: {\n ariaLabel: target.getAttribute(\"aria-label\"),\n attributes: readAttributes(target),\n bounds: {\n height: rect.height,\n width: rect.width,\n x: rect.x,\n y: rect.y\n },\n classes: [...target.classList].slice(0, 24),\n domPath: domPathFor(target),\n html: rawHtml.slice(0, 32_000),\n htmlTruncated: rawHtml.length > 32_000,\n id: target.id || null,\n role: target.getAttribute(\"role\"),\n selector: selectorFor(target),\n styles: Object.fromEntries(\n styleNames.map((name) => [name, computed.getPropertyValue(name)])\n ),\n tagName: target.tagName.toLowerCase(),\n text: rawText.slice(0, 4_000),\n textTruncated: rawText.length > 4_000\n },\n ancestors: readAncestors(target),\n viewport: {\n devicePixelRatio: globalThis.devicePixelRatio,\n height: globalThis.innerHeight,\n scrollX: globalThis.scrollX,\n scrollY: globalThis.scrollY,\n width: globalThis.innerWidth\n }\n };\n }\n\n function sanitizeElement(element: Element): void {\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLOptionElement\n ) {\n element.removeAttribute(\"value\");\n if (\"value\" in element) element.value = \"\";\n if (element instanceof HTMLTextAreaElement) element.textContent = \"\";\n }\n for (const attribute of [...element.attributes]) {\n const name = attribute.name.toLowerCase();\n if (\n name.startsWith(\"on\") ||\n name === \"nonce\" ||\n name === \"integrity\" ||\n name === \"srcdoc\" ||\n /(?:token|auth|password|secret|session|cookie|api[-_]?key)/iu.test(\n name\n )\n ) {\n element.setAttribute(attribute.name, \"[redacted]\");\n continue;\n }\n if (name === \"href\" || name === \"src\" || name === \"action\") {\n element.setAttribute(attribute.name, sanitizeUrl(attribute.value));\n }\n }\n }\n\n function isFormControl(element: Element): boolean {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n );\n }\n\n function readAttributes(element: Element): Record<string, string> {\n const result: Record<string, string> = {};\n for (const attribute of [...element.attributes].slice(0, 40)) {\n const name = attribute.name.toLowerCase();\n if (name.startsWith(\"on\") || name === \"value\" || name === \"srcdoc\") {\n continue;\n }\n result[attribute.name] =\n /(?:token|auth|password|secret|session|cookie|api[-_]?key)/iu.test(\n name\n )\n ? \"[redacted]\"\n : name === \"href\" || name === \"src\" || name === \"action\"\n ? sanitizeUrl(attribute.value)\n : attribute.value.slice(0, 2_000);\n }\n return result;\n }\n\n function sanitizeUrl(value: string): string {\n try {\n const url = new URL(value, location.href);\n url.username = \"\";\n url.password = \"\";\n url.hash = \"\";\n for (const key of [...url.searchParams.keys()]) {\n if (\n /(?:token|auth|password|secret|session|cookie|key|signature)/iu.test(\n key\n )\n ) {\n url.searchParams.set(key, \"[redacted]\");\n }\n }\n return url.toString();\n } catch {\n return value.slice(0, 4_000);\n }\n }\n\n function selectorFor(element: Element): string {\n if (element.id) return `#${escapeCss(element.id)}`;\n const segments: string[] = [];\n let current: Element | null = element;\n while (current && segments.length < 8) {\n let segment = current.tagName.toLowerCase();\n const parentElement: Element | null = current.parentElement;\n if (parentElement) {\n const currentTagName = current.tagName;\n const siblings = [...parentElement.children].filter(\n (item) => item.tagName === currentTagName\n );\n if (siblings.length > 1) {\n segment += `:nth-of-type(${siblings.indexOf(current) + 1})`;\n }\n }\n segments.unshift(segment);\n current = parentElement;\n }\n return segments.join(\" > \");\n }\n\n function domPathFor(element: Element): string {\n const appRoot = document.querySelector(\"#app\");\n const root =\n appRoot?.contains(element) === true\n ? appRoot\n : (document.body ?? document.documentElement);\n const segments: string[] = [];\n let current: Element | null = element;\n while (current) {\n segments.unshift(domPathSegment(current, current === root));\n if (current === root) break;\n current = current.parentElement;\n }\n return segments.join(\" > \").slice(0, 4_000);\n }\n\n function domPathSegment(element: Element, isRoot: boolean): string {\n if (isRoot && element.id === \"app\") return \"#app\";\n const tagName = element.tagName.toLowerCase();\n const classNames = [...element.classList]\n .filter(Boolean)\n .slice(0, 6)\n .map((name) => `.${name}`)\n .join(\"\");\n if (classNames) return `${tagName}${classNames}`;\n if (element.id) return `${tagName}#${element.id}`;\n return tagName;\n }\n\n function escapeCss(value: string): string {\n return globalThis.CSS?.escape\n ? globalThis.CSS.escape(value)\n : value.replace(/[^a-zA-Z0-9_-]/gu, (character) => `\\\\${character}`);\n }\n\n function readAncestors(element: Element): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n let current = element.parentElement;\n while (current && result.length < 8) {\n result.push({\n id: current.id || null,\n role: current.getAttribute(\"role\"),\n selector: selectorFor(current),\n tagName: current.tagName.toLowerCase()\n });\n current = current.parentElement;\n }\n return result;\n }\n\n document.addEventListener(\"mousemove\", handleMouseMove, true);\n document.addEventListener(\"click\", handleClick, true);\n document.addEventListener(\"keydown\", handleKeyDown, true);\n });\n}\n\nexport const browserElementSelectorScript = `(${runTuttiBrowserElementSelector.toString()})()`;\nexport const cancelBrowserElementSelectorScript =\n \"globalThis.__tuttiBrowserElementSelector?.cancel();\";\n","import type { BrowserNodeWebviewTag } from \"@tutti-os/browser-node/react\";\n\nexport const browserElementWebviewReadyTimeoutMs = 2_000;\n\nexport function isBrowserElementWebviewReady(\n webview: BrowserNodeWebviewTag\n): boolean {\n if (!webview.isConnected) return false;\n try {\n const webContentsId = webview.getWebContentsId?.();\n return typeof webContentsId === \"number\" && Number.isFinite(webContentsId);\n } catch {\n return false;\n }\n}\n\nexport async function waitForBrowserElementWebviewReady(\n webview: BrowserNodeWebviewTag,\n timeoutMs = browserElementWebviewReadyTimeoutMs\n): Promise<boolean> {\n if (isBrowserElementWebviewReady(webview)) return true;\n if (!webview.isConnected) return false;\n\n return new Promise((resolve) => {\n let settled = false;\n let timeoutSignal: AbortSignal | null = null;\n const finish = (ready: boolean): void => {\n if (settled) return;\n settled = true;\n timeoutSignal?.removeEventListener(\"abort\", handleTimeout);\n webview.removeEventListener(\"dom-ready\", handleDomReady);\n resolve(ready);\n };\n const handleDomReady = (): void => {\n finish(isBrowserElementWebviewReady(webview));\n };\n timeoutSignal = AbortSignal.timeout(timeoutMs);\n const handleTimeout = (): void => finish(false);\n timeoutSignal.addEventListener(\"abort\", handleTimeout, { once: true });\n webview.addEventListener(\"dom-ready\", handleDomReady, { once: true });\n\n // Covers a dom-ready event emitted between the initial check and listener\n // registration without adding a second BrowserNode lifecycle owner.\n if (isBrowserElementWebviewReady(webview)) finish(true);\n });\n}\n\nexport async function executeBrowserElementWebviewScript<T>(\n webview: BrowserNodeWebviewTag,\n script: string,\n userGesture = false\n): Promise<T> {\n if (!webview.executeJavaScript) {\n throw new Error(\"Browser webview JavaScript execution is unavailable\");\n }\n if (!(await waitForBrowserElementWebviewReady(webview))) {\n throw new Error(\"Browser webview is not ready\");\n }\n return webview.executeJavaScript<T>(script, userGesture);\n}\n\nexport async function cancelBrowserElementWebviewSelection(\n webview: BrowserNodeWebviewTag | null,\n script: string,\n onError?: (error: unknown) => void\n): Promise<void> {\n if (!webview?.executeJavaScript || !webview.isConnected) return;\n try {\n await webview.executeJavaScript(script);\n } catch (error) {\n // Cancellation is best-effort because navigation and unmount detach the\n // guest before React cleanup runs.\n if (onError) {\n onError(error);\n } else {\n console.warn(\n \"[agent-gui] browser element selection cleanup failed\",\n error\n );\n }\n }\n}\n","import { createRichTextMentionMarkdown } from \"@tutti-os/ui-rich-text/core\";\n\nexport const browserElementMentionKind = \"browser-element\";\n\nexport interface BrowserElementMentionReference {\n context: string;\n id: string;\n tagName: string;\n workspaceId: string;\n}\n\nexport interface BrowserElementMentionIdentity {\n label: string;\n scope?: Readonly<Record<string, string>>;\n}\n\nexport interface BrowserElementMentionPresentation {\n name: string;\n workspaceId?: string;\n}\n\nexport function createBrowserElementMentionMarkdown(\n reference: BrowserElementMentionReference\n): string {\n const tagName = normalizeBrowserElementTagName(reference.tagName);\n const context = reference.context.trim();\n const workspaceId = reference.workspaceId.trim();\n if (!tagName || !context || !workspaceId) {\n return \"\";\n }\n return createRichTextMentionMarkdown({\n providerId: browserElementMentionKind,\n entityId: reference.id,\n label: tagName,\n scope: { context, tag: tagName, workspaceId }\n });\n}\n\nexport function browserElementMentionLabel(tagName: string): string {\n const normalized = normalizeBrowserElementTagName(tagName);\n return normalized ? `<${normalized}>` : \"\";\n}\n\nexport function presentBrowserElementMention(\n mention: BrowserElementMentionIdentity\n): BrowserElementMentionPresentation | null {\n const label = browserElementMentionLabel(\n mention.scope?.tag?.trim() || mention.label\n );\n if (!label) {\n return null;\n }\n const workspaceId = mention.scope?.workspaceId?.trim() ?? \"\";\n return {\n name: label,\n ...(workspaceId ? { workspaceId } : {})\n };\n}\n\nfunction normalizeBrowserElementTagName(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9:-]/gu, \"\")\n .slice(0, 100);\n}\n","import type { BrowserNodeWebviewTag } from \"@tutti-os/browser-node/react\";\nimport {\n normalizeBrowserElementSelectionResult,\n serializeBrowserElementSnapshot\n} from \"./browserElementSnapshot.ts\";\nimport {\n browserElementSelectorScript,\n cancelBrowserElementSelectorScript\n} from \"./browserElementSelectorScript.ts\";\nimport {\n cancelBrowserElementWebviewSelection,\n executeBrowserElementWebviewScript\n} from \"./browserElementWebview.ts\";\nimport { createBrowserElementMentionMarkdown } from \"./browserElementMention.ts\";\n\nexport interface BrowserElementSelectionControllerInput {\n failedCopy: string;\n onAppendMention: (mention: string) => void;\n onError: (message: string) => void;\n workspaceId: string;\n}\n\nexport interface BrowserElementSelectionSnapshot {\n state: \"idle\" | \"selecting\";\n}\n\ninterface BrowserElementSelectionSession {\n attempt: number;\n navigationPending: boolean;\n webview: BrowserNodeWebviewTag | null;\n}\n\nexport class BrowserElementContextSelectionController {\n private activeWebview: BrowserNodeWebviewTag | null = null;\n private detachFrame: number | null = null;\n private input: BrowserElementSelectionControllerInput;\n private readonly listeners = new Set<\n (snapshot: BrowserElementSelectionSnapshot) => void\n >();\n private session: BrowserElementSelectionSession | null = null;\n private snapshot: BrowserElementSelectionSnapshot = { state: \"idle\" };\n private subscribedWebview: BrowserNodeWebviewTag | null = null;\n\n constructor(input: BrowserElementSelectionControllerInput) {\n this.input = input;\n }\n\n readonly getSnapshot = (): BrowserElementSelectionSnapshot => this.snapshot;\n\n readonly subscribe = (\n listener: (snapshot: BrowserElementSelectionSnapshot) => void\n ): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n configure(input: BrowserElementSelectionControllerInput): void {\n this.input = input;\n }\n\n bindAction(\n node: HTMLButtonElement | null,\n activeWebview: BrowserNodeWebviewTag | null\n ): void {\n if (node) {\n if (this.detachFrame !== null) {\n cancelAnimationFrame(this.detachFrame);\n this.detachFrame = null;\n }\n this.moveToActiveWebview(activeWebview);\n return;\n }\n if (this.detachFrame !== null) cancelAnimationFrame(this.detachFrame);\n this.detachFrame = requestAnimationFrame(() => {\n this.detachFrame = null;\n this.dispose();\n });\n }\n\n toggle(activeWebview: BrowserNodeWebviewTag | null): void {\n if (this.session) {\n this.endSelection(this.session);\n return;\n }\n if (!activeWebview?.executeJavaScript) {\n this.input.onError(this.input.failedCopy);\n return;\n }\n const session: BrowserElementSelectionSession = {\n attempt: 0,\n navigationPending: false,\n webview: null\n };\n this.session = session;\n this.setState(\"selecting\");\n this.moveToActiveWebview(activeWebview);\n }\n\n private readonly handleStartLoading = (): void => {\n if (this.session) this.session.navigationPending = true;\n };\n\n private readonly handleDomReady = (): void => {\n const session = this.session;\n const webview = this.activeWebview;\n if (!session || !webview) return;\n session.navigationPending = false;\n void this.moveSelectionToWebview(session, webview, true);\n };\n\n private moveToActiveWebview(webview: BrowserNodeWebviewTag | null): void {\n this.activeWebview = webview;\n const session = this.session;\n if (!session) return;\n if (!webview) {\n const previousWebview = session.webview;\n session.webview = null;\n session.attempt += 1;\n this.unsubscribeFromWebview();\n void cancelBrowserElementWebviewSelection(\n previousWebview,\n cancelBrowserElementSelectorScript\n );\n return;\n }\n this.subscribeToWebview(webview);\n void this.moveSelectionToWebview(session, webview);\n }\n\n private subscribeToWebview(webview: BrowserNodeWebviewTag): void {\n if (this.subscribedWebview === webview) return;\n this.unsubscribeFromWebview();\n this.subscribedWebview = webview;\n webview.addEventListener(\"did-start-loading\", this.handleStartLoading);\n webview.addEventListener(\"dom-ready\", this.handleDomReady);\n }\n\n private unsubscribeFromWebview(): void {\n this.subscribedWebview?.removeEventListener(\n \"did-start-loading\",\n this.handleStartLoading\n );\n this.subscribedWebview?.removeEventListener(\n \"dom-ready\",\n this.handleDomReady\n );\n this.subscribedWebview = null;\n }\n\n private async moveSelectionToWebview(\n session: BrowserElementSelectionSession,\n webview: BrowserNodeWebviewTag,\n force = false\n ): Promise<void> {\n if (this.session !== session) return;\n if (!force && session.webview === webview && session.attempt > 0) return;\n const previousWebview = session.webview;\n session.webview = webview;\n session.navigationPending = false;\n const attempt = ++session.attempt;\n await cancelBrowserElementWebviewSelection(\n previousWebview && (force || previousWebview !== webview)\n ? previousWebview\n : null,\n cancelBrowserElementSelectorScript\n );\n if (!this.isCurrentSelectionAttempt(session, attempt)) return;\n void this.runSelectionAttempt(session, webview, attempt);\n }\n\n private async runSelectionAttempt(\n session: BrowserElementSelectionSession,\n webview: BrowserNodeWebviewTag,\n attempt: number\n ): Promise<void> {\n try {\n const rawResult = await executeBrowserElementWebviewScript(\n webview,\n browserElementSelectorScript,\n true\n );\n if (!this.isCurrentSelectionAttempt(session, attempt)) return;\n const result = normalizeBrowserElementSelectionResult(rawResult);\n if (!result || result.status === \"cancelled\") {\n this.endSelection(session);\n return;\n }\n const content = serializeBrowserElementSnapshot(result.snapshot);\n const mention = createBrowserElementMentionMarkdown({\n context: content,\n id: createBrowserElementReferenceId(),\n tagName: result.snapshot.element.tagName,\n workspaceId: this.input.workspaceId\n });\n if (!mention)\n throw new Error(\"Browser element mention could not be created\");\n this.input.onAppendMention(mention);\n this.endSelection(session);\n } catch {\n if (!this.isCurrentSelectionAttempt(session, attempt)) return;\n // A guest navigation destroys the injected Promise. Keep the selection\n // session alive until the new document emits dom-ready.\n if (session.navigationPending) return;\n this.input.onError(this.input.failedCopy);\n this.endSelection(session);\n }\n }\n\n private isCurrentSelectionAttempt(\n session: BrowserElementSelectionSession,\n attempt: number\n ): boolean {\n return this.session === session && session.attempt === attempt;\n }\n\n private endSelection(session: BrowserElementSelectionSession): void {\n if (this.session !== session) return;\n this.session = null;\n session.attempt += 1;\n const webview = session.webview;\n session.webview = null;\n this.unsubscribeFromWebview();\n void cancelBrowserElementWebviewSelection(\n webview,\n cancelBrowserElementSelectorScript\n );\n this.setState(\"idle\");\n }\n\n private setState(state: BrowserElementSelectionSnapshot[\"state\"]): void {\n if (this.snapshot.state === state) return;\n this.snapshot = { state };\n for (const listener of this.listeners) listener(this.snapshot);\n }\n\n private dispose(): void {\n const session = this.session;\n if (session) this.endSelection(session);\n this.unsubscribeFromWebview();\n this.activeWebview = null;\n }\n}\n\nfunction createBrowserElementReferenceId(): string {\n return `browser-element:${\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now()}-${Math.random().toString(36).slice(2)}`\n }`;\n}\n","import { Badge } from \"@tutti-os/ui-system\";\nimport { InspectIcon } from \"@tutti-os/ui-system/icons\";\nimport { registerAgentCustomMentionKind } from \"../../custom-mention\";\nimport {\n browserElementMentionKind,\n presentBrowserElementMention\n} from \"./browserElementMention\";\n\n/** Registers browser DOM references before the first AgentGUI surface mounts. */\nexport function registerBrowserElementMention(): void {\n registerAgentCustomMentionKind({\n kind: browserElementMentionKind,\n materializePromptText: (mention) => {\n const context = mention.scope?.context?.trim();\n return context ? `\\n${context}\\n` : null;\n },\n present: presentBrowserElementMention,\n renderChip: ({ name }) => (\n <Badge\n className=\"h-5 max-w-full gap-1.5 rounded-[6px] px-2 py-0 font-[var(--font-mono)] text-[13px] font-semibold leading-5\"\n data-agent-browser-element-chip=\"true\"\n variant=\"accent\"\n >\n <InspectIcon aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{name}</span>\n </Badge>\n )\n });\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,aAAa,gBAAgB;AAEtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mCAAmC;;;ACVrC,IAAM,+BAA+B;AACrC,IAAM,qCAAqC;AAC3C,IAAM,qCAAqC;AA4C3C,SAAS,uCACd,OACsC;AACtC,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MAAI,MAAM,WAAW,YAAa,QAAO,EAAE,QAAQ,YAAY;AAC/D,MAAI,MAAM,WAAW,cAAc,CAAC,SAAS,MAAM,QAAQ,EAAG,QAAO;AACrE,QAAM,WAAW,MAAM;AACvB,QAAM,OAAO,SAAS,SAAS,IAAI,IAAI,SAAS,OAAO,CAAC;AACxD,QAAM,UAAU,SAAS,SAAS,OAAO,IAAI,SAAS,UAAU,CAAC;AACjE,QAAM,SAAS,SAAS,QAAQ,MAAM,IAAI,QAAQ,SAAS,CAAC;AAC5D,QAAM,WAAW,SAAS,SAAS,QAAQ,IAAI,SAAS,WAAW,CAAC;AACpE,QAAM,aAAqC;AAAA,IACzC,QAAQ;AAAA,IACR,YACE,cAAc,SAAS,YAAY,EAAE,MAAK,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnE,MAAM;AAAA,MACJ,OAAO,cAAc,KAAK,OAAO,GAAG;AAAA,MACpC,KAAK,oBAAoB,cAAc,KAAK,KAAK,GAAK,CAAC;AAAA,IACzD;AAAA,IACA,SAAS;AAAA,MACP,WAAW,sBAAsB,QAAQ,WAAW,GAAK;AAAA,MACzD,YAAY,oBAAoB,QAAQ,YAAY,IAAI,KAAK,GAAK;AAAA,MAClE,QAAQ;AAAA,QACN,QAAQ,aAAa,OAAO,MAAM;AAAA,QAClC,OAAO,aAAa,OAAO,KAAK;AAAA,QAChC,GAAG,aAAa,OAAO,CAAC;AAAA,QACxB,GAAG,aAAa,OAAO,CAAC;AAAA,MAC1B;AAAA,MACA,SAAS,mBAAmB,QAAQ,SAAS,IAAI,GAAG;AAAA,MACpD,SACE,cAAc,QAAQ,SAAS,GAAK,KACpC,cAAc,QAAQ,UAAU,GAAK;AAAA,MACvC,MAAM,cAAc,QAAQ,MAAM,kCAAkC;AAAA,MACpE,eACE,QAAQ,kBAAkB,QACzB,OAAO,QAAQ,SAAS,YACvB,QAAQ,KAAK,SAAS;AAAA,MAC1B,IAAI,sBAAsB,QAAQ,IAAI,GAAG;AAAA,MACzC,MAAM,sBAAsB,QAAQ,MAAM,GAAG;AAAA,MAC7C,UAAU,cAAc,QAAQ,UAAU,GAAK;AAAA,MAC/C,QAAQ,oBAAoB,QAAQ,QAAQ,IAAI,KAAK,GAAG;AAAA,MACxD,SAAS,cAAc,QAAQ,SAAS,GAAG,EAAE,YAAY;AAAA,MACzD,MAAM,cAAc,QAAQ,MAAM,kCAAkC;AAAA,MACpE,eACE,QAAQ,kBAAkB,QACzB,OAAO,QAAQ,SAAS,YACvB,QAAQ,KAAK,SAAS;AAAA,IAC5B;AAAA,IACA,WAAW,MAAM,QAAQ,SAAS,SAAS,IACvC,SAAS,UAAU,MAAM,GAAG,CAAC,EAAE;AAAA,MAAQ,CAAC,SACtC,SAAS,IAAI,IACT;AAAA,QACE;AAAA,UACE,IAAI,sBAAsB,KAAK,IAAI,GAAG;AAAA,UACtC,MAAM,sBAAsB,KAAK,MAAM,GAAG;AAAA,UAC1C,UAAU,cAAc,KAAK,UAAU,GAAK;AAAA,UAC5C,SAAS,cAAc,KAAK,SAAS,GAAG,EAAE,YAAY;AAAA,QACxD;AAAA,MACF,IACA,CAAC;AAAA,IACP,IACA,CAAC;AAAA,IACL,UAAU;AAAA,MACR,kBAAkB,aAAa,SAAS,kBAAkB,CAAC;AAAA,MAC3D,QAAQ,aAAa,SAAS,MAAM;AAAA,MACpC,SAAS,aAAa,SAAS,OAAO;AAAA,MACtC,SAAS,aAAa,SAAS,OAAO;AAAA,MACtC,OAAO,aAAa,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACA,MAAI,CAAC,WAAW,QAAQ,WAAW,CAAC,WAAW,QAAQ,QAAS,QAAO;AACvE,SAAO,EAAE,UAAU,YAAY,QAAQ,WAAW;AACpD;AAEO,SAAS,gCACd,UACQ;AACR,QAAM,EAAE,OAAO,IAAI,SAAS;AAC5B,SAAO;AAAA,IACL,aAAa,SAAS,QAAQ,OAAO;AAAA,IACrC,iBAAiB,YAAY,OAAO,CAAC,CAAC,UAAU,YAAY,OAAO,CAAC,CAAC,WAAW,YAAY,OAAO,KAAK,CAAC,YAAY,YAAY,OAAO,MAAM,CAAC;AAAA,IAC/I,iBAAiB,oBAAoB,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC7D,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,YAAY,OAAuB;AAC1C,QAAM,UAAU,KAAK,MAAM,QAAQ,GAAG,IAAI;AAC1C,SAAO,GAAG,OAAO,GAAG,SAAS,EAAE,IAAI,IAAI,OAAO;AAChD;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MACJ,QAAQ,WAAW,GAAG,EACtB,QAAQ,YAAY,GAAG,EACvB,KAAK;AACV;AAEA,SAAS,oBAAoB,OAAuB;AAClD,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,QAAI,WAAW;AACf,QAAI,WAAW;AACf,QAAI,OAAO;AACX,eAAW,OAAO,CAAC,GAAG,IAAI,aAAa,KAAK,CAAC,GAAG;AAC9C,UACE,gEAAgE;AAAA,QAC9D;AAAA,MACF,GACA;AACA,YAAI,aAAa,IAAI,KAAK,YAAY;AAAA,MACxC;AAAA,IACF;AACA,WAAO,IAAI,SAAS;AAAA,EACtB,QAAQ;AACN,WAAO,cAAc,OAAO,GAAK;AAAA,EACnC;AACF;AAEA,SAAS,cAAc,OAAgB,UAA0B;AAC/D,SAAO,OAAO,UAAU,WAAW,MAAM,MAAM,GAAG,QAAQ,IAAI;AAChE;AAEA,SAAS,sBACP,OACA,UACe;AACf,QAAM,aAAa,cAAc,OAAO,QAAQ,EAAE,KAAK;AACvD,SAAO,cAAc;AACvB;AAEA,SAAS,mBACP,OACA,UACA,UACU;AACV,SAAO,MAAM,QAAQ,KAAK,IACtB,MACG,MAAM,GAAG,QAAQ,EACjB,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,EACzD,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,QAAQ,CAAC,IACxC,CAAC;AACP;AAEA,SAAS,oBACP,OACA,UACA,aACA,eACwB;AACxB,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO,CAAC;AAC9B,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EACjB,MAAM,GAAG,QAAQ,EACjB;AAAA,MAAQ,CAAC,CAAC,KAAK,IAAI,MAClB,OAAO,SAAS,WACZ,CAAC,CAAC,IAAI,MAAM,GAAG,WAAW,GAAG,KAAK,MAAM,GAAG,aAAa,CAAC,CAAC,IAC1D,CAAC;AAAA,IACP;AAAA,EACJ;AACF;AAEA,SAAS,aAAa,OAAgB,WAAW,GAAW;AAC1D,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACrNA,SAAS,iCAAmD;AAI1D,QAAM,iBAAiB;AACvB,iBAAe,+BAA+B,OAAO;AAErD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,aAAa,wCAAwC,MAAM;AACnE,WAAO,OAAO,QAAQ,OAAO;AAAA,MAC3B,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,WAAW;AAAA,MACX,SAAS;AAAA,MACT,MAAM;AAAA,MACN,eAAe;AAAA,MACf,UAAU;AAAA,MACV,KAAK;AAAA,MACL,QAAQ;AAAA,IACV,CAAC;AACD,aAAS,gBAAgB,OAAO,OAAO;AACvC,UAAM,iBAAiB,SAAS,gBAAgB,MAAM;AACtD,aAAS,gBAAgB,MAAM,SAAS;AAExC,UAAM,SAAS,CAAC,UAAyB;AACvC,eAAS,oBAAoB,aAAa,iBAAiB,IAAI;AAC/D,eAAS,oBAAoB,SAAS,aAAa,IAAI;AACvD,eAAS,oBAAoB,WAAW,eAAe,IAAI;AAC3D,eAAS,gBAAgB,MAAM,SAAS;AACxC,cAAQ,OAAO;AACf,aAAO,eAAe;AACtB,cAAQ,KAAK;AAAA,IACf;AACA,UAAM,SAAS,MAAY,OAAO,EAAE,QAAQ,YAAY,CAAC;AACzD,mBAAe,gCAAgC,EAAE,OAAO;AAExD,aAAS,gBAAgB,OAAyB;AAChD,YAAM,SAAS,MAAM;AACrB,UAAI,EAAE,kBAAkB,YAAY,WAAW,QAAS;AACxD,YAAM,OAAO,OAAO,sBAAsB;AAC1C,aAAO,OAAO,QAAQ,OAAO;AAAA,QAC3B,SAAS;AAAA,QACT,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC;AAAA,QACnC,WAAW,aAAa,KAAK,IAAI,OAAO,KAAK,GAAG;AAAA,QAChD,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,MACnC,CAAC;AAAA,IACH;AAEA,aAAS,YAAY,OAAyB;AAC5C,YAAM,SAAS,MAAM;AACrB,UAAI,EAAE,kBAAkB,YAAY,WAAW,QAAS;AACxD,YAAM,eAAe;AACrB,YAAM,yBAAyB;AAC/B,aAAO,EAAE,UAAU,gBAAgB,MAAM,GAAG,QAAQ,WAAW,CAAC;AAAA,IAClE;AAEA,aAAS,cAAc,OAA4B;AACjD,UAAI,MAAM,QAAQ,SAAU;AAC5B,YAAM,eAAe;AACrB,YAAM,yBAAyB;AAC/B,aAAO;AAAA,IACT;AAEA,aAAS,gBAAgB,QAA0C;AACjE,YAAM,OAAO,OAAO,sBAAsB;AAC1C,YAAM,UAAU,cAAc,MAAM,IAChC,MACC,OAAO,eAAe,IAAI,QAAQ,SAAS,GAAG,EAAE,KAAK;AAC1D,YAAM,QAAQ,OAAO,UAAU,IAAI;AACnC,YACG,iBAAiB,gCAAgC,EACjD,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAClC,sBAAgB,KAAK;AACrB,YAAM,iBAAiB,GAAG,EAAE,QAAQ,eAAe;AACnD,YAAM,UAAU,MAAM;AACtB,YAAM,WAAW,iBAAiB,MAAM;AACxC,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC,MAAM;AAAA,UACJ,OAAO,SAAS;AAAA,UAChB,KAAK,YAAY,SAAS,IAAI;AAAA,QAChC;AAAA,QACA,SAAS;AAAA,UACP,WAAW,OAAO,aAAa,YAAY;AAAA,UAC3C,YAAY,eAAe,MAAM;AAAA,UACjC,QAAQ;AAAA,YACN,QAAQ,KAAK;AAAA,YACb,OAAO,KAAK;AAAA,YACZ,GAAG,KAAK;AAAA,YACR,GAAG,KAAK;AAAA,UACV;AAAA,UACA,SAAS,CAAC,GAAG,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE;AAAA,UAC1C,SAAS,WAAW,MAAM;AAAA,UAC1B,MAAM,QAAQ,MAAM,GAAG,IAAM;AAAA,UAC7B,eAAe,QAAQ,SAAS;AAAA,UAChC,IAAI,OAAO,MAAM;AAAA,UACjB,MAAM,OAAO,aAAa,MAAM;AAAA,UAChC,UAAU,YAAY,MAAM;AAAA,UAC5B,QAAQ,OAAO;AAAA,YACb,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,SAAS,iBAAiB,IAAI,CAAC,CAAC;AAAA,UAClE;AAAA,UACA,SAAS,OAAO,QAAQ,YAAY;AAAA,UACpC,MAAM,QAAQ,MAAM,GAAG,GAAK;AAAA,UAC5B,eAAe,QAAQ,SAAS;AAAA,QAClC;AAAA,QACA,WAAW,cAAc,MAAM;AAAA,QAC/B,UAAU;AAAA,UACR,kBAAkB,WAAW;AAAA,UAC7B,QAAQ,WAAW;AAAA,UACnB,SAAS,WAAW;AAAA,UACpB,SAAS,WAAW;AAAA,UACpB,OAAO,WAAW;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,gBAAgB,SAAwB;AAC/C,UACE,mBAAmB,oBACnB,mBAAmB,uBACnB,mBAAmB,qBACnB,mBAAmB,mBACnB;AACA,gBAAQ,gBAAgB,OAAO;AAC/B,YAAI,WAAW,QAAS,SAAQ,QAAQ;AACxC,YAAI,mBAAmB,oBAAqB,SAAQ,cAAc;AAAA,MACpE;AACA,iBAAW,aAAa,CAAC,GAAG,QAAQ,UAAU,GAAG;AAC/C,cAAM,OAAO,UAAU,KAAK,YAAY;AACxC,YACE,KAAK,WAAW,IAAI,KACpB,SAAS,WACT,SAAS,eACT,SAAS,YACT,8DAA8D;AAAA,UAC5D;AAAA,QACF,GACA;AACA,kBAAQ,aAAa,UAAU,MAAM,YAAY;AACjD;AAAA,QACF;AACA,YAAI,SAAS,UAAU,SAAS,SAAS,SAAS,UAAU;AAC1D,kBAAQ,aAAa,UAAU,MAAM,YAAY,UAAU,KAAK,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAEA,aAAS,cAAc,SAA2B;AAChD,aACE,mBAAmB,oBACnB,mBAAmB,uBACnB,mBAAmB;AAAA,IAEvB;AAEA,aAAS,eAAe,SAA0C;AAChE,YAAM,SAAiC,CAAC;AACxC,iBAAW,aAAa,CAAC,GAAG,QAAQ,UAAU,EAAE,MAAM,GAAG,EAAE,GAAG;AAC5D,cAAM,OAAO,UAAU,KAAK,YAAY;AACxC,YAAI,KAAK,WAAW,IAAI,KAAK,SAAS,WAAW,SAAS,UAAU;AAClE;AAAA,QACF;AACA,eAAO,UAAU,IAAI,IACnB,8DAA8D;AAAA,UAC5D;AAAA,QACF,IACI,eACA,SAAS,UAAU,SAAS,SAAS,SAAS,WAC5C,YAAY,UAAU,KAAK,IAC3B,UAAU,MAAM,MAAM,GAAG,GAAK;AAAA,MACxC;AACA,aAAO;AAAA,IACT;AAEA,aAAS,YAAY,OAAuB;AAC1C,UAAI;AACF,cAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,YAAI,WAAW;AACf,YAAI,WAAW;AACf,YAAI,OAAO;AACX,mBAAW,OAAO,CAAC,GAAG,IAAI,aAAa,KAAK,CAAC,GAAG;AAC9C,cACE,gEAAgE;AAAA,YAC9D;AAAA,UACF,GACA;AACA,gBAAI,aAAa,IAAI,KAAK,YAAY;AAAA,UACxC;AAAA,QACF;AACA,eAAO,IAAI,SAAS;AAAA,MACtB,QAAQ;AACN,eAAO,MAAM,MAAM,GAAG,GAAK;AAAA,MAC7B;AAAA,IACF;AAEA,aAAS,YAAY,SAA0B;AAC7C,UAAI,QAAQ,GAAI,QAAO,IAAI,UAAU,QAAQ,EAAE,CAAC;AAChD,YAAM,WAAqB,CAAC;AAC5B,UAAI,UAA0B;AAC9B,aAAO,WAAW,SAAS,SAAS,GAAG;AACrC,YAAI,UAAU,QAAQ,QAAQ,YAAY;AAC1C,cAAM,gBAAgC,QAAQ;AAC9C,YAAI,eAAe;AACjB,gBAAM,iBAAiB,QAAQ;AAC/B,gBAAM,WAAW,CAAC,GAAG,cAAc,QAAQ,EAAE;AAAA,YAC3C,CAAC,SAAS,KAAK,YAAY;AAAA,UAC7B;AACA,cAAI,SAAS,SAAS,GAAG;AACvB,uBAAW,gBAAgB,SAAS,QAAQ,OAAO,IAAI,CAAC;AAAA,UAC1D;AAAA,QACF;AACA,iBAAS,QAAQ,OAAO;AACxB,kBAAU;AAAA,MACZ;AACA,aAAO,SAAS,KAAK,KAAK;AAAA,IAC5B;AAEA,aAAS,WAAW,SAA0B;AAC5C,YAAM,UAAU,SAAS,cAAc,MAAM;AAC7C,YAAM,OACJ,SAAS,SAAS,OAAO,MAAM,OAC3B,UACC,SAAS,QAAQ,SAAS;AACjC,YAAM,WAAqB,CAAC;AAC5B,UAAI,UAA0B;AAC9B,aAAO,SAAS;AACd,iBAAS,QAAQ,eAAe,SAAS,YAAY,IAAI,CAAC;AAC1D,YAAI,YAAY,KAAM;AACtB,kBAAU,QAAQ;AAAA,MACpB;AACA,aAAO,SAAS,KAAK,KAAK,EAAE,MAAM,GAAG,GAAK;AAAA,IAC5C;AAEA,aAAS,eAAe,SAAkB,QAAyB;AACjE,UAAI,UAAU,QAAQ,OAAO,MAAO,QAAO;AAC3C,YAAM,UAAU,QAAQ,QAAQ,YAAY;AAC5C,YAAM,aAAa,CAAC,GAAG,QAAQ,SAAS,EACrC,OAAO,OAAO,EACd,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,EACxB,KAAK,EAAE;AACV,UAAI,WAAY,QAAO,GAAG,OAAO,GAAG,UAAU;AAC9C,UAAI,QAAQ,GAAI,QAAO,GAAG,OAAO,IAAI,QAAQ,EAAE;AAC/C,aAAO;AAAA,IACT;AAEA,aAAS,UAAU,OAAuB;AACxC,aAAO,WAAW,KAAK,SACnB,WAAW,IAAI,OAAO,KAAK,IAC3B,MAAM,QAAQ,oBAAoB,CAAC,cAAc,KAAK,SAAS,EAAE;AAAA,IACvE;AAEA,aAAS,cAAc,SAAkD;AACvE,YAAM,SAAyC,CAAC;AAChD,UAAI,UAAU,QAAQ;AACtB,aAAO,WAAW,OAAO,SAAS,GAAG;AACnC,eAAO,KAAK;AAAA,UACV,IAAI,QAAQ,MAAM;AAAA,UAClB,MAAM,QAAQ,aAAa,MAAM;AAAA,UACjC,UAAU,YAAY,OAAO;AAAA,UAC7B,SAAS,QAAQ,QAAQ,YAAY;AAAA,QACvC,CAAC;AACD,kBAAU,QAAQ;AAAA,MACpB;AACA,aAAO;AAAA,IACT;AAEA,aAAS,iBAAiB,aAAa,iBAAiB,IAAI;AAC5D,aAAS,iBAAiB,SAAS,aAAa,IAAI;AACpD,aAAS,iBAAiB,WAAW,eAAe,IAAI;AAAA,EAC1D,CAAC;AACH;AAEO,IAAM,+BAA+B,IAAI,+BAA+B,SAAS,CAAC;AAClF,IAAM,qCACX;;;AC3SK,IAAM,sCAAsC;AAE5C,SAAS,6BACd,SACS;AACT,MAAI,CAAC,QAAQ,YAAa,QAAO;AACjC,MAAI;AACF,UAAM,gBAAgB,QAAQ,mBAAmB;AACjD,WAAO,OAAO,kBAAkB,YAAY,OAAO,SAAS,aAAa;AAAA,EAC3E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kCACpB,SACA,YAAY,qCACM;AAClB,MAAI,6BAA6B,OAAO,EAAG,QAAO;AAClD,MAAI,CAAC,QAAQ,YAAa,QAAO;AAEjC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,UAAU;AACd,QAAI,gBAAoC;AACxC,UAAM,SAAS,CAAC,UAAyB;AACvC,UAAI,QAAS;AACb,gBAAU;AACV,qBAAe,oBAAoB,SAAS,aAAa;AACzD,cAAQ,oBAAoB,aAAa,cAAc;AACvD,cAAQ,KAAK;AAAA,IACf;AACA,UAAM,iBAAiB,MAAY;AACjC,aAAO,6BAA6B,OAAO,CAAC;AAAA,IAC9C;AACA,oBAAgB,YAAY,QAAQ,SAAS;AAC7C,UAAM,gBAAgB,MAAY,OAAO,KAAK;AAC9C,kBAAc,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AACrE,YAAQ,iBAAiB,aAAa,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAIpE,QAAI,6BAA6B,OAAO,EAAG,QAAO,IAAI;AAAA,EACxD,CAAC;AACH;AAEA,eAAsB,mCACpB,SACA,QACA,cAAc,OACF;AACZ,MAAI,CAAC,QAAQ,mBAAmB;AAC9B,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,MAAI,CAAE,MAAM,kCAAkC,OAAO,GAAI;AACvD,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACA,SAAO,QAAQ,kBAAqB,QAAQ,WAAW;AACzD;AAEA,eAAsB,qCACpB,SACA,QACA,SACe;AACf,MAAI,CAAC,SAAS,qBAAqB,CAAC,QAAQ,YAAa;AACzD,MAAI;AACF,UAAM,QAAQ,kBAAkB,MAAM;AAAA,EACxC,SAAS,OAAO;AAGd,QAAI,SAAS;AACX,cAAQ,KAAK;AAAA,IACf,OAAO;AACL,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACjFA,SAAS,qCAAqC;AAEvC,IAAM,4BAA4B;AAmBlC,SAAS,oCACd,WACQ;AACR,QAAM,UAAU,+BAA+B,UAAU,OAAO;AAChE,QAAM,UAAU,UAAU,QAAQ,KAAK;AACvC,QAAM,cAAc,UAAU,YAAY,KAAK;AAC/C,MAAI,CAAC,WAAW,CAAC,WAAW,CAAC,aAAa;AACxC,WAAO;AAAA,EACT;AACA,SAAO,8BAA8B;AAAA,IACnC,YAAY;AAAA,IACZ,UAAU,UAAU;AAAA,IACpB,OAAO;AAAA,IACP,OAAO,EAAE,SAAS,KAAK,SAAS,YAAY;AAAA,EAC9C,CAAC;AACH;AAEO,SAAS,2BAA2B,SAAyB;AAClE,QAAM,aAAa,+BAA+B,OAAO;AACzD,SAAO,aAAa,IAAI,UAAU,MAAM;AAC1C;AAEO,SAAS,6BACd,SAC0C;AAC1C,QAAM,QAAQ;AAAA,IACZ,QAAQ,OAAO,KAAK,KAAK,KAAK,QAAQ;AAAA,EACxC;AACA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,cAAc,QAAQ,OAAO,aAAa,KAAK,KAAK;AAC1D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,EACvC;AACF;AAEA,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,MACJ,KAAK,EACL,YAAY,EACZ,QAAQ,iBAAiB,EAAE,EAC3B,MAAM,GAAG,GAAG;AACjB;;;ACjCO,IAAM,2CAAN,MAA+C;AAAA,EAC5C,gBAA8C;AAAA,EAC9C,cAA6B;AAAA,EAC7B;AAAA,EACS,YAAY,oBAAI,IAE/B;AAAA,EACM,UAAiD;AAAA,EACjD,WAA4C,EAAE,OAAO,OAAO;AAAA,EAC5D,oBAAkD;AAAA,EAE1D,YAAY,OAA+C;AACzD,SAAK,QAAQ;AAAA,EACf;AAAA,EAES,cAAc,MAAuC,KAAK;AAAA,EAE1D,YAAY,CACnB,aACiB;AACjB,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEA,UAAU,OAAqD;AAC7D,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,WACE,MACA,eACM;AACN,QAAI,MAAM;AACR,UAAI,KAAK,gBAAgB,MAAM;AAC7B,6BAAqB,KAAK,WAAW;AACrC,aAAK,cAAc;AAAA,MACrB;AACA,WAAK,oBAAoB,aAAa;AACtC;AAAA,IACF;AACA,QAAI,KAAK,gBAAgB,KAAM,sBAAqB,KAAK,WAAW;AACpE,SAAK,cAAc,sBAAsB,MAAM;AAC7C,WAAK,cAAc;AACnB,WAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,eAAmD;AACxD,QAAI,KAAK,SAAS;AAChB,WAAK,aAAa,KAAK,OAAO;AAC9B;AAAA,IACF;AACA,QAAI,CAAC,eAAe,mBAAmB;AACrC,WAAK,MAAM,QAAQ,KAAK,MAAM,UAAU;AACxC;AAAA,IACF;AACA,UAAM,UAA0C;AAAA,MAC9C,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AACA,SAAK,UAAU;AACf,SAAK,SAAS,WAAW;AACzB,SAAK,oBAAoB,aAAa;AAAA,EACxC;AAAA,EAEiB,qBAAqB,MAAY;AAChD,QAAI,KAAK,QAAS,MAAK,QAAQ,oBAAoB;AAAA,EACrD;AAAA,EAEiB,iBAAiB,MAAY;AAC5C,UAAM,UAAU,KAAK;AACrB,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,WAAW,CAAC,QAAS;AAC1B,YAAQ,oBAAoB;AAC5B,SAAK,KAAK,uBAAuB,SAAS,SAAS,IAAI;AAAA,EACzD;AAAA,EAEQ,oBAAoB,SAA6C;AACvE,SAAK,gBAAgB;AACrB,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,QAAS;AACd,QAAI,CAAC,SAAS;AACZ,YAAM,kBAAkB,QAAQ;AAChC,cAAQ,UAAU;AAClB,cAAQ,WAAW;AACnB,WAAK,uBAAuB;AAC5B,WAAK;AAAA,QACH;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AACA,SAAK,mBAAmB,OAAO;AAC/B,SAAK,KAAK,uBAAuB,SAAS,OAAO;AAAA,EACnD;AAAA,EAEQ,mBAAmB,SAAsC;AAC/D,QAAI,KAAK,sBAAsB,QAAS;AACxC,SAAK,uBAAuB;AAC5B,SAAK,oBAAoB;AACzB,YAAQ,iBAAiB,qBAAqB,KAAK,kBAAkB;AACrE,YAAQ,iBAAiB,aAAa,KAAK,cAAc;AAAA,EAC3D;AAAA,EAEQ,yBAA+B;AACrC,SAAK,mBAAmB;AAAA,MACtB;AAAA,MACA,KAAK;AAAA,IACP;AACA,SAAK,mBAAmB;AAAA,MACtB;AAAA,MACA,KAAK;AAAA,IACP;AACA,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,MAAc,uBACZ,SACA,SACA,QAAQ,OACO;AACf,QAAI,KAAK,YAAY,QAAS;AAC9B,QAAI,CAAC,SAAS,QAAQ,YAAY,WAAW,QAAQ,UAAU,EAAG;AAClE,UAAM,kBAAkB,QAAQ;AAChC,YAAQ,UAAU;AAClB,YAAQ,oBAAoB;AAC5B,UAAM,UAAU,EAAE,QAAQ;AAC1B,UAAM;AAAA,MACJ,oBAAoB,SAAS,oBAAoB,WAC7C,kBACA;AAAA,MACJ;AAAA,IACF;AACA,QAAI,CAAC,KAAK,0BAA0B,SAAS,OAAO,EAAG;AACvD,SAAK,KAAK,oBAAoB,SAAS,SAAS,OAAO;AAAA,EACzD;AAAA,EAEA,MAAc,oBACZ,SACA,SACA,SACe;AACf,QAAI;AACF,YAAM,YAAY,MAAM;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,KAAK,0BAA0B,SAAS,OAAO,EAAG;AACvD,YAAM,SAAS,uCAAuC,SAAS;AAC/D,UAAI,CAAC,UAAU,OAAO,WAAW,aAAa;AAC5C,aAAK,aAAa,OAAO;AACzB;AAAA,MACF;AACA,YAAM,UAAU,gCAAgC,OAAO,QAAQ;AAC/D,YAAM,UAAU,oCAAoC;AAAA,QAClD,SAAS;AAAA,QACT,IAAI,gCAAgC;AAAA,QACpC,SAAS,OAAO,SAAS,QAAQ;AAAA,QACjC,aAAa,KAAK,MAAM;AAAA,MAC1B,CAAC;AACD,UAAI,CAAC;AACH,cAAM,IAAI,MAAM,8CAA8C;AAChE,WAAK,MAAM,gBAAgB,OAAO;AAClC,WAAK,aAAa,OAAO;AAAA,IAC3B,QAAQ;AACN,UAAI,CAAC,KAAK,0BAA0B,SAAS,OAAO,EAAG;AAGvD,UAAI,QAAQ,kBAAmB;AAC/B,WAAK,MAAM,QAAQ,KAAK,MAAM,UAAU;AACxC,WAAK,aAAa,OAAO;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,0BACN,SACA,SACS;AACT,WAAO,KAAK,YAAY,WAAW,QAAQ,YAAY;AAAA,EACzD;AAAA,EAEQ,aAAa,SAA+C;AAClE,QAAI,KAAK,YAAY,QAAS;AAC9B,SAAK,UAAU;AACf,YAAQ,WAAW;AACnB,UAAM,UAAU,QAAQ;AACxB,YAAQ,UAAU;AAClB,SAAK,uBAAuB;AAC5B,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AACA,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEQ,SAAS,OAAuD;AACtE,QAAI,KAAK,SAAS,UAAU,MAAO;AACnC,SAAK,WAAW,EAAE,MAAM;AACxB,eAAW,YAAY,KAAK,UAAW,UAAS,KAAK,QAAQ;AAAA,EAC/D;AAAA,EAEQ,UAAgB;AACtB,UAAM,UAAU,KAAK;AACrB,QAAI,QAAS,MAAK,aAAa,OAAO;AACtC,SAAK,uBAAuB;AAC5B,SAAK,gBAAgB;AAAA,EACvB;AACF;AAEA,SAAS,kCAA0C;AACjD,SAAO,mBACL,WAAW,QAAQ,aAAa,KAChC,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EACtD;AACF;;;ALjMI,SAgBM,KAhBN;AAnCG,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKc;AACZ,QAAM,gBAAgB,4BAA4B;AAClD,QAAM,CAAC,UAAU,IAAI;AAAA,IACnB,MACE,IAAI,yCAAyC;AAAA,MAC3C,YAAY,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACL;AACA,aAAW,UAAU;AAAA,IACnB,YAAY,KAAK;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,kBAAkB,YAAY,CAAC,aAAa,SAAS,KAAK;AACxE,QAAM,aAAa;AAAA,IACjB,CAAC,SACC,WAAW,WAAW,MAAM,aAAa;AAAA,IAC3C,CAAC,eAAe,UAAU;AAAA,EAC5B;AACA,QAAM,QAAQ,UAAU,cAAc,KAAK,SAAS,KAAK;AACzD,SACE,qBAAC,WACC;AAAA,wBAAC,kBAAe,SAAO,MACrB;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,gBAAc,UAAU;AAAA,QACxB,WAAW;AAAA,UACT;AAAA,UACA,UAAU,eACR;AAAA,QACJ;AAAA,QACA,MAAK;AAAA,QACL,KAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS,MAAM,WAAW,OAAO,aAAa;AAAA,QAE9C,8BAAC,eAAY,WAAU,eAAc;AAAA;AAAA,IACvC,GACF;AAAA,IACA,oBAAC,kBAAe,MAAK,UAAU,iBAAM;AAAA,KACvC;AAEJ;;;AM7EA,SAAS,aAAa;AACtB,SAAS,eAAAA,oBAAmB;AAiBtB,SAKE,OAAAC,MALF,QAAAC,aAAA;AATC,SAAS,gCAAsC;AACpD,iCAA+B;AAAA,IAC7B,MAAM;AAAA,IACN,uBAAuB,CAAC,YAAY;AAClC,YAAM,UAAU,QAAQ,OAAO,SAAS,KAAK;AAC7C,aAAO,UAAU;AAAA,EAAK,OAAO;AAAA,IAAO;AAAA,IACtC;AAAA,IACA,SAAS;AAAA,IACT,YAAY,CAAC,EAAE,KAAK,MAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,mCAAgC;AAAA,QAChC,SAAQ;AAAA,QAER;AAAA,0BAAAD,KAACE,cAAA,EAAY,eAAY,QAAO,WAAU,qBAAoB;AAAA,UAC9D,gBAAAF,KAAC,UAAK,WAAU,YAAY,gBAAK;AAAA;AAAA;AAAA,IACnC;AAAA,EAEJ,CAAC;AACH;","names":["InspectIcon","jsx","jsxs","InspectIcon"]}
@@ -1,6 +1,5 @@
1
1
  import 'react';
2
2
  import '@tutti-os/agent-activity-core';
3
3
  import '@tutti-os/workbench-surface';
4
- export { A as AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT, a as AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT, b as AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT, c as AgentGuiWorkbenchContributionCopy, d as AgentGuiWorkbenchContributionCopyOverrides, e as AgentGuiWorkbenchConversationIdentity, f as AgentGuiWorkbenchConversationRailToggleDetail, g as AgentGuiWorkbenchNewConversationDetail, h as AgentGuiWorkbenchProviderAvailability, i as AgentGuiWorkbenchRenderBodyHelpers, B as BuildAgentGuiDockEntriesInput, C as CreateAgentGuiWorkbenchContributionInput, j as agentGuiWorkbenchCompactVisibleAreaRatio, l as agentGuiWorkbenchDefaultCopy, m as agentGuiWorkbenchDefaultNodeFrame, n as agentGuiWorkbenchDefaultUsableHeightRatio, o as agentGuiWorkbenchDefaultUsableWidthRatio, p as agentGuiWorkbenchNewWindowCascadeOffset, q as agentGuiWorkbenchProviderRailWidthPx, r as buildAgentGuiDockEntries, s as createAgentGuiWorkbenchContribution, t as resolveAgentGuiUnifiedDockLaunchPayload, u as resolveAgentGuiWorkbenchContributionCopy, w as resolveAgentGuiWorkbenchDefaultLaunchFrame } from '../contribution-yc4CGJmy.js';
4
+ export { A as AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT, a as AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT, b as AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT, c as AgentGuiWorkbenchContributionCopy, d as AgentGuiWorkbenchContributionCopyOverrides, e as AgentGuiWorkbenchConversationIdentity, f as AgentGuiWorkbenchConversationRailToggleDetail, g as AgentGuiWorkbenchNewConversationDetail, h as AgentGuiWorkbenchProviderAvailability, i as AgentGuiWorkbenchRenderBodyHelpers, B as BuildAgentGuiDockEntriesInput, C as CreateAgentGuiWorkbenchContributionInput, j as agentGuiWorkbenchCompactVisibleAreaRatio, l as agentGuiWorkbenchDefaultCopy, m as agentGuiWorkbenchDefaultNodeFrame, n as agentGuiWorkbenchDefaultUsableHeightRatio, o as agentGuiWorkbenchDefaultUsableWidthRatio, p as agentGuiWorkbenchNewWindowCascadeOffset, q as agentGuiWorkbenchProviderRailWidthPx, r as buildAgentGuiDockEntries, s as createAgentGuiWorkbenchContribution, t as resolveAgentGuiUnifiedDockLaunchPayload, u as resolveAgentGuiWorkbenchContributionCopy, w as resolveAgentGuiWorkbenchDefaultLaunchFrame } from '../contribution-CDdwTppn.js';
5
5
  import './types.js';
6
- import '../types-BicfRVrV.js';
@@ -14,17 +14,17 @@ import {
14
14
  resolveAgentGuiUnifiedDockLaunchPayload,
15
15
  resolveAgentGuiWorkbenchContributionCopy,
16
16
  resolveAgentGuiWorkbenchDefaultLaunchFrame
17
- } from "../chunk-GCQYN7BR.js";
17
+ } from "../chunk-IN3HXYOO.js";
18
18
  import "../chunk-TUWQV2MC.js";
19
19
  import "../chunk-MHOYBRCY.js";
20
- import "../chunk-PVTAFUDS.js";
20
+ import "../chunk-VGS7S7YT.js";
21
21
  import "../chunk-5HIF53K5.js";
22
22
  import "../chunk-R2ZADXRB.js";
23
- import "../chunk-T2NICA5D.js";
23
+ import "../chunk-5WOCGIXJ.js";
24
24
  import "../chunk-DXT4W2SU.js";
25
25
  import "../chunk-2RQM7PJN.js";
26
26
  import "../chunk-7KVZPJ3O.js";
27
- import "../chunk-OQR3HXPF.js";
27
+ import "../chunk-VUNVGEQG.js";
28
28
  import "../chunk-MIJXEELH.js";
29
29
  import "../chunk-6CUELYIF.js";
30
30
  import "../chunk-QMMWKQOT.js";
@@ -1,4 +1,4 @@
1
- export { A as AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT, a as AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT, c as AgentGuiWorkbenchContributionCopy, d as AgentGuiWorkbenchContributionCopyOverrides, e as AgentGuiWorkbenchConversationIdentity, f as AgentGuiWorkbenchConversationRailToggleDetail, g as AgentGuiWorkbenchNewConversationDetail, h as AgentGuiWorkbenchProviderAvailability, i as AgentGuiWorkbenchRenderBodyHelpers, B as BuildAgentGuiDockEntriesInput, C as CreateAgentGuiWorkbenchContributionInput, k as agentGuiWorkbenchConversationIdentitiesEqual, l as agentGuiWorkbenchDefaultCopy, m as agentGuiWorkbenchDefaultNodeFrame, r as buildAgentGuiDockEntries, s as createAgentGuiWorkbenchContribution, t as resolveAgentGuiUnifiedDockLaunchPayload, u as resolveAgentGuiWorkbenchContributionCopy, v as resolveAgentGuiWorkbenchConversationIdentity } from '../contribution-yc4CGJmy.js';
1
+ export { A as AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT, a as AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT, c as AgentGuiWorkbenchContributionCopy, d as AgentGuiWorkbenchContributionCopyOverrides, e as AgentGuiWorkbenchConversationIdentity, f as AgentGuiWorkbenchConversationRailToggleDetail, g as AgentGuiWorkbenchNewConversationDetail, h as AgentGuiWorkbenchProviderAvailability, i as AgentGuiWorkbenchRenderBodyHelpers, B as BuildAgentGuiDockEntriesInput, C as CreateAgentGuiWorkbenchContributionInput, k as agentGuiWorkbenchConversationIdentitiesEqual, l as agentGuiWorkbenchDefaultCopy, m as agentGuiWorkbenchDefaultNodeFrame, r as buildAgentGuiDockEntries, s as createAgentGuiWorkbenchContribution, t as resolveAgentGuiUnifiedDockLaunchPayload, u as resolveAgentGuiWorkbenchContributionCopy, v as resolveAgentGuiWorkbenchConversationIdentity } from '../contribution-CDdwTppn.js';
2
2
  export { agentGuiWorkbenchComingSoonProviders, agentGuiWorkbenchDefaultDockProviders, agentGuiWorkbenchDockSuppressedProviders, agentGuiWorkbenchProviderLabels, agentGuiWorkbenchProviders, isAgentGuiWorkbenchComingSoonProvider, isAgentGuiWorkbenchDefaultDockProvider, isAgentGuiWorkbenchDockSuppressedProvider, isAgentGuiWorkbenchProvider, normalizeAgentGuiWorkbenchProvider, resolveAgentGuiWorkbenchProviderLabel } from './providerCatalog.js';
3
3
  export { AgentGuiWorkbenchLaunchDescriptor, AgentGuiWorkbenchReusePolicy, agentGuiWorkbenchDockEntryId, agentGuiWorkbenchDockIdentityFromIdentifier, agentGuiWorkbenchProviderFromLaunchRequest, agentGuiWorkbenchTypeId, agentGuiWorkbenchUnifiedDockEntryId, createAgentGuiWorkbenchDraftLaunchRequest, createAgentGuiWorkbenchInstanceId, createAgentGuiWorkbenchLaunchDescriptor, createAgentGuiWorkbenchSessionLaunchRequest, resolveAgentGuiWorkbenchLaunchDockEntryId } from './launch.js';
4
4
  export { areAgentGuiWorkbenchNodeStatesEqual, areAgentGuiWorkbenchStatesEqual, createAgentGuiWorkbenchNodeStateSource, createDefaultAgentGuiWorkbenchNodeState, normalizeAgentGuiWorkbenchNodeState, normalizeAgentGuiWorkbenchState, projectAgentGuiWorkbenchState } from './state.js';
@@ -7,7 +7,6 @@ import { WorkbenchDisplayMode, WorkbenchHostNodeHeaderWindowActions } from '@tut
7
7
  export { AgentGuiWorkbenchSessionTitleResult, ResolveAgentGuiWorkbenchHeaderTitleInput, ResolveAgentGuiWorkbenchSessionTitleInput, resolveAgentGuiWorkbenchHeaderTitle, resolveAgentGuiWorkbenchSessionTitle } from './sessionTitle.js';
8
8
  export { AgentGuiWorkbenchComposerOverrides, AgentGuiWorkbenchNodeState, AgentGuiWorkbenchPrefillPromptPayload, AgentGuiWorkbenchProvider, AgentGuiWorkbenchState, AgentGuiWorkbenchWorkspaceState, agentGuiWorkbenchOpenSessionActivationType, agentGuiWorkbenchPrefillPromptActivationType } from './types.js';
9
9
  import '@tutti-os/agent-activity-core';
10
- import '../types-BicfRVrV.js';
11
10
 
12
11
  interface AgentGuiWorkbenchHeaderCopy {
13
12
  collapseConversationRail: string;
@@ -10,7 +10,7 @@ import {
10
10
  resolveAgentGuiUnifiedDockLaunchPayload,
11
11
  resolveAgentGuiWorkbenchContributionCopy,
12
12
  resolveAgentGuiWorkbenchConversationIdentity
13
- } from "../chunk-GCQYN7BR.js";
13
+ } from "../chunk-IN3HXYOO.js";
14
14
  import {
15
15
  agentGuiWorkbenchDockEntryId,
16
16
  agentGuiWorkbenchDockIdentityFromIdentifier,
@@ -30,7 +30,7 @@ import {
30
30
  import {
31
31
  resolveAgentGuiWorkbenchHeaderTitle,
32
32
  resolveAgentGuiWorkbenchSessionTitle
33
- } from "../chunk-PVTAFUDS.js";
33
+ } from "../chunk-VGS7S7YT.js";
34
34
  import {
35
35
  areAgentGuiWorkbenchNodeStatesEqual,
36
36
  areAgentGuiWorkbenchStatesEqual,
@@ -53,11 +53,11 @@ import {
53
53
  normalizeAgentGuiWorkbenchProvider,
54
54
  resolveAgentGuiWorkbenchProviderLabel
55
55
  } from "../chunk-R2ZADXRB.js";
56
- import "../chunk-T2NICA5D.js";
56
+ import "../chunk-5WOCGIXJ.js";
57
57
  import "../chunk-DXT4W2SU.js";
58
58
  import "../chunk-2RQM7PJN.js";
59
59
  import "../chunk-7KVZPJ3O.js";
60
- import "../chunk-OQR3HXPF.js";
60
+ import "../chunk-VUNVGEQG.js";
61
61
  import "../chunk-MIJXEELH.js";
62
62
  import "../chunk-6CUELYIF.js";
63
63
  import "../chunk-QMMWKQOT.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  resolveAgentGuiWorkbenchHeaderTitle,
3
3
  resolveAgentGuiWorkbenchSessionTitle
4
- } from "../chunk-PVTAFUDS.js";
5
- import "../chunk-OQR3HXPF.js";
4
+ } from "../chunk-VGS7S7YT.js";
5
+ import "../chunk-VUNVGEQG.js";
6
6
  import "../chunk-MIJXEELH.js";
7
7
  import "../chunk-6CUELYIF.js";
8
8
  export {
@@ -0,0 +1,189 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { BrowserNodeHostApi, BrowserNodeSessionMode, BrowserNodeFeature } from '@tutti-os/browser-node';
4
+ import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
5
+ import { IconProps } from '@tutti-os/ui-system';
6
+
7
+ declare const agentToolPanelIds: readonly ["files", "terminal", "browser", "tasks", "apps", "messages"];
8
+ type AgentToolPanelId = (typeof agentToolPanelIds)[number];
9
+ interface AgentToolPanelDefinition {
10
+ id: AgentToolPanelId;
11
+ label: string;
12
+ }
13
+ interface AgentToolTab {
14
+ id: string;
15
+ panel: AgentToolPanelId;
16
+ resourceId?: string;
17
+ }
18
+ declare function isAgentToolPanelId(value: string): value is AgentToolPanelId;
19
+ declare function filterAgentToolPanels(panels: readonly {
20
+ id: string;
21
+ label: string;
22
+ }[]): AgentToolPanelDefinition[];
23
+ declare const agentToolEmptySidebarWidth: number;
24
+ declare const agentToolMainMinWidth = 280;
25
+ declare const agentToolPanelDefaultWidthById: Record<AgentToolPanelId, number>;
26
+ declare const agentToolPanelMinWidthById: Record<AgentToolPanelId, number>;
27
+ declare const agentToolPanelMaxWidthById: Record<AgentToolPanelId, number>;
28
+ interface AgentToolSidebarState {
29
+ activePanel: AgentToolPanelId | null;
30
+ activeTabId: string | null;
31
+ mountedTabs: AgentToolTab[];
32
+ }
33
+ type AgentToolSidebarAction = {
34
+ panel: AgentToolPanelId;
35
+ resourceId?: string;
36
+ tabId: string;
37
+ type: "open-panel" | "add-panel";
38
+ } | {
39
+ tabId: string;
40
+ type: "activate-tab" | "close-tab";
41
+ } | {
42
+ type: "close";
43
+ };
44
+ declare function createAgentToolSidebarState(initial?: Partial<AgentToolSidebarState>): AgentToolSidebarState;
45
+ declare function reduceAgentToolSidebarState(state: AgentToolSidebarState, action: AgentToolSidebarAction): AgentToolSidebarState;
46
+ declare function resolveAgentToolPanelExpansionReset(input: {
47
+ expandedPanel: AgentToolPanelId | null;
48
+ nextPanel: AgentToolPanelId | null;
49
+ widthBeforeExpansion?: number;
50
+ }): {
51
+ panel: AgentToolPanelId;
52
+ width: number;
53
+ } | null;
54
+ declare function resolveAgentToolPanelExpansionTransfer(input: {
55
+ expandedPanel: AgentToolPanelId | null;
56
+ nextPanel: AgentToolPanelId | null;
57
+ nextPanelWidth: number;
58
+ widthBeforeExpansion?: number;
59
+ }): {
60
+ expandedPanel: AgentToolPanelId;
61
+ nextPanelWidthBeforeExpansion: number;
62
+ previousPanel: AgentToolPanelId;
63
+ previousPanelWidth: number;
64
+ } | null;
65
+ declare function resolveAgentToolPanelMaxWidth(panel: AgentToolPanelId, viewportWidth: number, allowFullWidth?: boolean, mainContentMinWidth?: number): number;
66
+ declare function clampAgentToolPanelWidth(input: {
67
+ allowFullWidth?: boolean;
68
+ mainContentMinWidth?: number;
69
+ panel: AgentToolPanelId;
70
+ viewportWidth: number;
71
+ width: number;
72
+ }): number;
73
+ declare function resolveAgentToolSidebarWidth(input: {
74
+ allowFullWidth?: boolean;
75
+ baselineViewportWidth: number;
76
+ mainContentMinWidth?: number;
77
+ panel: AgentToolPanelId;
78
+ preferredWidth: number;
79
+ viewportWidth: number;
80
+ }): number;
81
+ declare function resolveAgentToolSidebarLayoutWidth(input: {
82
+ baselineContainerWidth: number;
83
+ panelWidth: number;
84
+ containerWidth: number;
85
+ }): number;
86
+ declare function resolveAgentToolPanelPreferredWidth(input: {
87
+ isExpanded: boolean;
88
+ manuallyResizedWidth?: number | null;
89
+ panelWidth: number;
90
+ }): number;
91
+ declare function shouldResizeAgentToolContainer(input: {
92
+ currentWidth: number;
93
+ lastResize?: {
94
+ actualWidth: number;
95
+ requestedWidth: number;
96
+ } | null;
97
+ requestedWidth: number;
98
+ }): boolean;
99
+ declare function formatAgentToolReminderCount(value: number | null | undefined): string | null;
100
+
101
+ declare const agentToolBrowserDefaultUrl = "https://www.google.com/";
102
+ interface AgentToolBrowserPanelProps {
103
+ browserApi: BrowserNodeHostApi;
104
+ defaultUrl?: string;
105
+ hidden: boolean;
106
+ i18n: I18nRuntime<string>;
107
+ loadingFallback?: ReactNode;
108
+ navigationActions?: ReactNode;
109
+ nodeIdPrefix?: string;
110
+ profileId?: string | null;
111
+ sessionMode?: BrowserNodeSessionMode;
112
+ sessionPartition?: string | null;
113
+ }
114
+ declare function AgentToolBrowserPanel({ browserApi, defaultUrl, hidden, i18n, loadingFallback, navigationActions, nodeIdPrefix, profileId, sessionMode, sessionPartition }: AgentToolBrowserPanelProps): ReactNode;
115
+ declare function createAgentToolBrowserFeature(input: {
116
+ browserApi: BrowserNodeHostApi;
117
+ i18n: I18nRuntime<string>;
118
+ nodeId: string;
119
+ }): BrowserNodeFeature;
120
+
121
+ interface AgentToolSidebarCopy {
122
+ close: string;
123
+ closeRightPanel: string;
124
+ expand: string;
125
+ newTab: string;
126
+ openRightPanel: string;
127
+ resizeSidebar: string;
128
+ shrink: string;
129
+ tool: string;
130
+ }
131
+ type AgentToolSidebarReminderCounts = Partial<Record<AgentToolPanelId, number>>;
132
+ declare function AgentToolPanelIcon({ panel, ...iconProps }: IconProps & {
133
+ panel: AgentToolPanelId;
134
+ }): ReactNode;
135
+ declare function AgentToolSidebarToolbar({ activePanel, copy, isExpanded, isOpen, panels, quickActionPanels, reminders, onAddPanel, onOpenPanel, onToggleExpansion, onToggleSidebar }: {
136
+ activePanel: AgentToolPanelId | null;
137
+ copy: AgentToolSidebarCopy;
138
+ isExpanded: boolean;
139
+ isOpen: boolean;
140
+ panels: readonly AgentToolPanelDefinition[];
141
+ quickActionPanels?: readonly AgentToolPanelId[];
142
+ reminders?: AgentToolSidebarReminderCounts;
143
+ onAddPanel: (panel: AgentToolPanelId) => void;
144
+ onOpenPanel: (panel: AgentToolPanelId) => void;
145
+ onToggleExpansion: () => void;
146
+ onToggleSidebar: () => void;
147
+ }): ReactNode;
148
+
149
+ interface AgentToolSidebarHandle {
150
+ addPanel(panel: AgentToolPanelId, resourceId?: string): string | null;
151
+ close(): void;
152
+ closeTab(tabId: string): void;
153
+ openPanel(panel: AgentToolPanelId, resourceId?: string): string | null;
154
+ }
155
+ interface AgentToolSidebarProps {
156
+ children: ReactNode;
157
+ containerWidth: number;
158
+ copy: AgentToolSidebarCopy;
159
+ headerPlacement?: "inline" | "external" | "panel";
160
+ mainContentMinWidthPx?: number;
161
+ panels: readonly AgentToolPanelDefinition[];
162
+ quickActionPanels?: readonly AgentToolPanelId[];
163
+ reminders?: AgentToolSidebarReminderCounts;
164
+ renderHeader: (toolActions: ReactNode) => ReactNode;
165
+ renderLoading?: (tab: AgentToolTab) => ReactNode;
166
+ renderPanel: (input: {
167
+ active: boolean;
168
+ closeSidebar: () => void;
169
+ tab: AgentToolTab;
170
+ }) => ReactNode;
171
+ renderTabIcon?: (tab: AgentToolTab) => ReactNode;
172
+ resolveTabLabel?: (tab: AgentToolTab, defaultLabel: string) => string;
173
+ resizeContainerContentWidth(width: number, animate?: boolean): Promise<{
174
+ width: number;
175
+ }>;
176
+ onPanelOpen?: (panel: AgentToolPanelId, resourceId?: string) => void;
177
+ onLayoutWidthChange?: (width: number) => void;
178
+ onActivePanelChange?: (panel: AgentToolPanelId | null) => void;
179
+ onTabsChange?: (tabs: readonly AgentToolTab[]) => void;
180
+ onTabClose?: (tab: AgentToolTab) => void;
181
+ }
182
+ declare const AgentToolSidebar: react.ForwardRefExoticComponent<AgentToolSidebarProps & react.RefAttributes<AgentToolSidebarHandle>>;
183
+
184
+ declare function AgentToolSidebarPicker({ panels, onSelect }: {
185
+ panels: readonly AgentToolPanelDefinition[];
186
+ onSelect: (panel: AgentToolPanelId) => void;
187
+ }): ReactNode;
188
+
189
+ export { AgentToolBrowserPanel, type AgentToolBrowserPanelProps, type AgentToolPanelDefinition, AgentToolPanelIcon, type AgentToolPanelId, AgentToolSidebar, type AgentToolSidebarAction, type AgentToolSidebarCopy, type AgentToolSidebarHandle, AgentToolSidebarPicker, type AgentToolSidebarProps, type AgentToolSidebarReminderCounts, type AgentToolSidebarState, AgentToolSidebarToolbar, type AgentToolTab, agentToolBrowserDefaultUrl, agentToolEmptySidebarWidth, agentToolMainMinWidth, agentToolPanelDefaultWidthById, agentToolPanelIds, agentToolPanelMaxWidthById, agentToolPanelMinWidthById, clampAgentToolPanelWidth, createAgentToolBrowserFeature, createAgentToolSidebarState, filterAgentToolPanels, formatAgentToolReminderCount, isAgentToolPanelId, reduceAgentToolSidebarState, resolveAgentToolPanelExpansionReset, resolveAgentToolPanelExpansionTransfer, resolveAgentToolPanelMaxWidth, resolveAgentToolPanelPreferredWidth, resolveAgentToolSidebarLayoutWidth, resolveAgentToolSidebarWidth, shouldResizeAgentToolContainer };