@overmux/pi 0.0.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 (70) hide show
  1. package/README.md +118 -0
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.js +40 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config-2jNv4tol.d.ts +34 -0
  6. package/dist/config-2jNv4tol.d.ts.map +1 -0
  7. package/dist/config.d.ts +2 -0
  8. package/dist/config.js +47 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/extension.d.ts +19 -0
  11. package/dist/extension.d.ts.map +1 -0
  12. package/dist/extension.js +265 -0
  13. package/dist/extension.js.map +1 -0
  14. package/dist/index.d.ts +10 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +16 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/jsonl-tail.d.ts +13 -0
  19. package/dist/jsonl-tail.d.ts.map +1 -0
  20. package/dist/jsonl-tail.js +83 -0
  21. package/dist/jsonl-tail.js.map +1 -0
  22. package/dist/live-events-ClhFOMGW.js +497 -0
  23. package/dist/live-events-ClhFOMGW.js.map +1 -0
  24. package/dist/live-events-DAmf6RRx.d.ts +107 -0
  25. package/dist/live-events-DAmf6RRx.d.ts.map +1 -0
  26. package/dist/live-events.d.ts +2 -0
  27. package/dist/live-events.js +2 -0
  28. package/dist/notification-DzOd9cRc.d.ts +20 -0
  29. package/dist/notification-DzOd9cRc.d.ts.map +1 -0
  30. package/dist/notification.d.ts +2 -0
  31. package/dist/notification.js +54 -0
  32. package/dist/notification.js.map +1 -0
  33. package/dist/plugin.d.ts +90 -0
  34. package/dist/plugin.d.ts.map +1 -0
  35. package/dist/plugin.js +213 -0
  36. package/dist/plugin.js.map +1 -0
  37. package/dist/projection.d.ts +101 -0
  38. package/dist/projection.d.ts.map +1 -0
  39. package/dist/projection.js +550 -0
  40. package/dist/projection.js.map +1 -0
  41. package/dist/protocol-CsrnSPOv.d.ts +115 -0
  42. package/dist/protocol-CsrnSPOv.d.ts.map +1 -0
  43. package/dist/protocol.d.ts +2 -0
  44. package/dist/protocol.js +365 -0
  45. package/dist/protocol.js.map +1 -0
  46. package/dist/react.d.ts +139 -0
  47. package/dist/react.d.ts.map +1 -0
  48. package/dist/react.js +796 -0
  49. package/dist/react.js.map +1 -0
  50. package/dist/server.d.ts +5 -0
  51. package/dist/server.js +4 -0
  52. package/dist/session-status-CZLTo8Km.d.ts +71 -0
  53. package/dist/session-status-CZLTo8Km.d.ts.map +1 -0
  54. package/dist/styles.css +619 -0
  55. package/docs/index.md +10 -0
  56. package/package.json +115 -0
  57. package/src/cli.ts +59 -0
  58. package/src/config.ts +87 -0
  59. package/src/extension.ts +486 -0
  60. package/src/index.ts +14 -0
  61. package/src/jsonl-tail.ts +110 -0
  62. package/src/live-events.ts +578 -0
  63. package/src/notification.ts +109 -0
  64. package/src/plugin.ts +369 -0
  65. package/src/projection.ts +995 -0
  66. package/src/protocol.ts +805 -0
  67. package/src/react.tsx +1293 -0
  68. package/src/server.ts +15 -0
  69. package/src/session-status.ts +379 -0
  70. package/src/styles.css +619 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","names":[],"sources":["../src/react.tsx"],"sourcesContent":["import \"./styles.css\";\n\nimport { PierrePatchDiff } from \"@overmux/git/react\";\nimport { ChevronRight, Send, Square } from \"lucide-react\";\nimport {\n type CSSProperties,\n type FormEvent,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\n\ntype OvermuxStyle = CSSProperties &\n Record<`--${string}`, string | number | undefined>;\n\ntype PiContentBlock = {\n arguments?: unknown;\n data?: string;\n id?: string;\n mimeType?: string;\n name?: string;\n text?: string;\n thinking?: string;\n tool?: PiToolProjection;\n type: string;\n};\n\ntype PiToolResultProjection = {\n content: PiContentBlock[];\n details?: unknown;\n isError: boolean;\n toolCallId: string;\n toolName: string;\n};\n\ntype PiToolProjection = {\n result?: PiToolResultProjection;\n status: \"error\" | \"pending\" | \"success\";\n};\n\ntype PiConversationEntry = {\n content: PiContentBlock[];\n errorMessage?: string;\n id: string;\n role: \"assistant\" | \"toolResult\" | \"user\";\n source: \"canonical\" | \"live\";\n status: \"complete\" | \"error\" | \"pending\";\n toolName?: string;\n};\n\ntype PiSessionMetadata = {\n contextUsage?: {\n tokens: number;\n contextWindow: number;\n percent: number;\n };\n model?: {\n provider: string;\n id: string;\n name: string;\n };\n modelOptions?: { provider: string; id: string; name: string }[];\n thinkingLevel: string;\n};\n\ntype PiConversationSnapshot = {\n agentAvailable: boolean;\n entries: PiConversationEntry[];\n sessionMetadata?: PiSessionMetadata;\n status: \"busy\" | \"degraded\" | \"idle\" | \"offline\";\n};\n\ntype PiConversationStream = {\n error?: Error;\n status: \"closed\" | \"open\" | \"opening\";\n subscribe: (\n listener: (snapshot: PiConversationSnapshot) => void,\n ) => () => void;\n};\n\ntype PiConversationSendRequest = {\n deliverAs: \"followUp\" | \"steer\";\n message: string;\n};\n\ntype PiConversationSendResult = {\n delivery?: \"followUp\" | \"immediate\" | \"steer\";\n requestId?: string;\n};\n\ntype PiConversationSend = (\n request: PiConversationSendRequest,\n) => Promise<PiConversationSendResult | void>;\ntype PiConversationStop = () => Promise<void>;\ntype PiConversationSetModel = (model: {\n provider: string;\n id: string;\n}) => Promise<void>;\ntype PiConversationSetThinkingLevel = (\n level: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\",\n) => Promise<void>;\n\ntype PiConversationClassNames = Partial<{\n composer: string;\n content: string;\n entry: string;\n root: string;\n scroller: string;\n status: string;\n}>;\n\ntype PiConversationBlockRender = (input: {\n block: PiContentBlock;\n entry: PiConversationEntry;\n index: number;\n}) => ReactNode | undefined;\n\nexport type ToolStatus = \"error\" | \"pending\" | \"success\";\n\nexport type ToolRendererResult = {\n content: { data?: string; text?: string; thinking?: string }[];\n details?: unknown;\n isError: boolean;\n};\n\nexport type ToolRendererInput = {\n arguments?: unknown;\n result?: ToolRendererResult;\n status: ToolStatus;\n toolName: string;\n};\n\nexport type ToolRenderer = (input: ToolRendererInput) => ReactNode;\n\nexport type ToolRendererRegistry = Record<string, ToolRenderer>;\n\nexport type PiConversationProps = {\n autoFocus?: boolean;\n className?: string;\n classNames?: PiConversationClassNames;\n conversation: PiConversationStream;\n emptyState?: ReactNode;\n renderBlock?: PiConversationBlockRender;\n renderers?: ToolRendererRegistry;\n sendMessage: PiConversationSend;\n setModel?: PiConversationSetModel;\n setThinkingLevel?: PiConversationSetThinkingLevel;\n stop?: PiConversationStop;\n style?: OvermuxStyle;\n};\n\nconst contextWindowOverrides = new Map([\n [\"openai-codex/gpt-5.6-luna\", 372_000],\n [\"openai-codex/gpt-5.6-sol\", 372_000],\n [\"openai-codex/gpt-5.6-terra\", 372_000],\n]);\n\nconst formatTokenCount = (tokens: number) =>\n tokens < 1000 ? `${tokens}` : `${(tokens / 1000).toFixed(1)}k`;\n\nconst contextUsageLabel = ({ contextUsage, model }: PiSessionMetadata) => {\n if (!contextUsage) {\n return undefined;\n }\n const contextWindow =\n contextWindowOverrides.get(`${model?.provider}/${model?.id}`) ??\n contextUsage.contextWindow;\n return `ctx ${formatTokenCount(contextUsage.tokens)}/${formatTokenCount(contextWindow)} ${((contextUsage.tokens / contextWindow) * 100).toFixed(1)}%`;\n};\n\nconst thinkingLevels = [\n \"off\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n];\n\nconst PiConversationMetadata = ({\n busy,\n metadata,\n setModel,\n setThinkingLevel,\n}: {\n busy: boolean;\n metadata: PiSessionMetadata;\n setModel?: PiConversationSetModel;\n setThinkingLevel?: PiConversationSetThinkingLevel;\n}) => {\n const [changing, setChanging] = useState(false);\n const [error, setError] = useState(\"\");\n const update = async (action: () => Promise<void>) => {\n setChanging(true);\n try {\n await action();\n setError(\"\");\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setChanging(false);\n }\n };\n const disabled = busy || changing;\n const currentModel = metadata.model;\n return (\n <div className=\"om-pi-conversation-metadata om-pi-muted\">\n {currentModel && metadata.modelOptions?.length && setModel ? (\n <select\n aria-label=\"Pi model\"\n className=\"om-pi-metadata-select\"\n disabled={disabled}\n onChange={(event) =>\n void update(() => setModel(JSON.parse(event.target.value)))\n }\n value={JSON.stringify({\n provider: currentModel.provider,\n id: currentModel.id,\n })}\n >\n {metadata.modelOptions.map((model) => (\n <option\n key={`${model.provider}\\0${model.id}`}\n value={JSON.stringify({ provider: model.provider, id: model.id })}\n >\n {model.id}\n </option>\n ))}\n </select>\n ) : (\n <span>{currentModel?.id ?? \"no-model\"}</span>\n )}\n <span aria-hidden=\"true\"> · </span>\n {setThinkingLevel ? (\n <select\n aria-label=\"Pi thinking level\"\n className=\"om-pi-metadata-select\"\n disabled={disabled}\n onChange={(event) =>\n void update(() =>\n setThinkingLevel(\n event.target\n .value as Parameters<PiConversationSetThinkingLevel>[0],\n ),\n )\n }\n value={metadata.thinkingLevel}\n >\n {thinkingLevels.map((level) => (\n <option key={level} value={level}>\n {level}\n </option>\n ))}\n </select>\n ) : (\n <span>{metadata.thinkingLevel}</span>\n )}\n {contextUsageLabel(metadata) ? (\n <>\n <span aria-hidden=\"true\"> · </span>\n <span>{contextUsageLabel(metadata)}</span>\n </>\n ) : null}\n {error ? (\n <span className=\"om-pi-metadata-error\" role=\"alert\">\n {error}\n </span>\n ) : null}\n </div>\n );\n};\n\nconst languageLoaders = {\n bash: () => import(\"@shikijs/langs/bash\"),\n css: () => import(\"@shikijs/langs/css\"),\n diff: () => import(\"@shikijs/langs/diff\"),\n html: () => import(\"@shikijs/langs/html\"),\n javascript: () => import(\"@shikijs/langs/javascript\"),\n json: () => import(\"@shikijs/langs/json\"),\n markdown: () => import(\"@shikijs/langs/markdown\"),\n nix: () => import(\"@shikijs/langs/nix\"),\n typescript: () => import(\"@shikijs/langs/typescript\"),\n tsx: () => import(\"@shikijs/langs/tsx\"),\n yaml: () => import(\"@shikijs/langs/yaml\"),\n};\n\ntype CodeLanguage = keyof typeof languageLoaders;\n\nconst languageAliases: Record<string, CodeLanguage> = {\n js: \"javascript\",\n md: \"markdown\",\n sh: \"bash\",\n shell: \"bash\",\n ts: \"typescript\",\n yml: \"yaml\",\n};\n\ntype HighlightedLine = { color?: string; content: string }[];\n\ntype Highlighter = {\n codeToTokens: (\n code: string,\n options: { lang: string; theme: string },\n ) => {\n tokens: HighlightedLine[];\n };\n};\n\nconst maxHighlightedCodeEntries = 64;\n\nlet highlighterPromise: Promise<Highlighter> | undefined;\nconst highlightedCode = new Map<string, Promise<HighlightedLine[]>>();\n\nconst loadHighlighter = () => {\n if (!highlighterPromise) {\n highlighterPromise = Promise.all([\n import(\"shiki/core\"),\n import(\"shiki/engine/javascript\"),\n import(\"@shikijs/themes/tokyo-night\"),\n ]).then(async ([core, engine, theme]) =>\n core.createHighlighterCore({\n engine: engine.createJavaScriptRegexEngine(),\n langs: await Promise.all(\n Object.values(languageLoaders).map(async (loadLanguage) =>\n loadLanguage(),\n ),\n ),\n themes: [theme.default],\n }),\n );\n }\n return highlighterPromise;\n};\n\nvoid loadHighlighter();\n\nconst highlighted = (code: string, language: string) => {\n const key = `${language}\\u0000${code}`;\n const cached = highlightedCode.get(key);\n if (cached) {\n return cached;\n }\n const next = loadHighlighter().then(\n (highlighter) =>\n highlighter.codeToTokens(code, { lang: language, theme: \"tokyo-night\" })\n .tokens,\n );\n highlightedCode.set(key, next);\n if (highlightedCode.size > maxHighlightedCodeEntries) {\n const oldest = highlightedCode.keys().next().value;\n if (oldest) {\n highlightedCode.delete(oldest);\n }\n }\n return next;\n};\n\nconst textOf = (block: PiContentBlock) =>\n block.text ??\n block.thinking ??\n (typeof block.data === \"string\" ? block.data : \"\");\n\nconst formatted = (value: unknown) => {\n if (typeof value === \"string\") {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n try {\n return JSON.stringify(value, null, 2) ?? \"\";\n } catch {\n return String(value);\n }\n};\n\nconst codeLanguage = (className?: string): CodeLanguage | undefined => {\n const match = /language-([^\\s]+)/.exec(className ?? \"\");\n const language = match?.[1]?.toLowerCase();\n if (!language) {\n return undefined;\n }\n const normalized = languageAliases[language] ?? language;\n return Object.hasOwn(languageLoaders, normalized)\n ? (normalized as CodeLanguage)\n : undefined;\n};\n\nconst FencedCode = ({\n children,\n className,\n node: _node,\n ...props\n}: Components[\"code\"] extends infer Component\n ? Component extends (props: infer Props) => unknown\n ? Props\n : never\n : never) => {\n const code = String(children).replace(/\\n$/, \"\");\n const language = codeLanguage(className);\n const highlightKey = language ? `${language}\\u0000${code}` : undefined;\n const [highlightedState, setHighlightedState] = useState<{\n key: string;\n lines: HighlightedLine[];\n }>();\n const lines =\n highlightedState && highlightedState.key === highlightKey\n ? highlightedState.lines\n : undefined;\n\n useEffect(() => {\n if (!language || !highlightKey) {\n return;\n }\n let active = true;\n void highlighted(code, language).then((value) => {\n if (active) {\n setHighlightedState({ key: highlightKey, lines: value });\n }\n });\n return () => {\n active = false;\n };\n }, [code, highlightKey, language]);\n\n if (!language || !lines) {\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n }\n return (\n <code className=\"om-pi-code-highlighted\" {...props}>\n {lines.map((line, index) => (\n <span className=\"om-pi-code-line\" key={index}>\n {line.map((token, tokenIndex) => (\n <span key={tokenIndex} style={{ color: token.color }}>\n {token.content}\n </span>\n ))}\n {index < lines.length - 1 ? \"\\n\" : null}\n </span>\n ))}\n </code>\n );\n};\n\nconst markdownComponents: Components = { code: FencedCode };\n\nconst MarkdownPart = ({\n block,\n subdued = false,\n}: {\n block: PiContentBlock;\n subdued?: boolean;\n}) => (\n <div\n className={[\"om-pi-markdown\", subdued && \"om-pi-muted\"]\n .filter(Boolean)\n .join(\" \")}\n >\n <ReactMarkdown components={markdownComponents}>\n {textOf(block)}\n </ReactMarkdown>\n </div>\n);\n\nconst preview = (value: string, maxLength = 120) =>\n value.length > maxLength ? `${value.slice(0, maxLength - 1)}…` : value;\n\nconst bounded = (value: string, maxLines = 200, maxLength = 20_000) => {\n const lines = value.split(\"\\n\").slice(0, maxLines).join(\"\\n\");\n return lines.length > maxLength ? `${lines.slice(0, maxLength - 1)}…` : lines;\n};\n\nconst detailsRecord = (details: unknown) =>\n typeof details === \"object\" && details !== null\n ? (details as Record<string, unknown>)\n : undefined;\n\nconst resultText = (result: ToolRendererResult | undefined) =>\n result?.content\n .map((block) => block.text ?? block.thinking ?? block.data ?? \"\")\n .filter(Boolean)\n .join(\"\\n\") ?? \"\";\n\nconst truncationSummary = (details: unknown) => {\n const truncation = detailsRecord(details)?.truncation;\n const record = detailsRecord(truncation);\n if (!record?.truncated) {\n return undefined;\n }\n const totalLines =\n typeof record.totalLines === \"number\" ? record.totalLines : undefined;\n const outputLines =\n typeof record.outputLines === \"number\" ? record.outputLines : undefined;\n return totalLines && outputLines\n ? `${totalLines - outputLines} lines omitted`\n : \"Output truncated\";\n};\n\nconst ToolDisclosure = ({\n children,\n collapsible = true,\n indicator,\n label,\n status,\n}: {\n children?: ReactNode;\n collapsible?: boolean;\n indicator?: ReactNode;\n label: ReactNode;\n status: ToolStatus;\n}) => {\n const [open, setOpen] = useState(status !== \"success\");\n const explicit = useRef(false);\n useEffect(() => {\n if (!explicit.current) {\n setOpen(status !== \"success\");\n }\n }, [status]);\n const header = (\n <>\n <span\n className={`om-pi-tool-status${indicator ? \" om-pi-tool-status-label\" : \"\"}`}\n aria-label={`Tool ${status}`}\n >\n {indicator ??\n (status === \"success\" ? \"✓\" : status === \"error\" ? \"×\" : \"●\")}\n </span>\n {label}\n </>\n );\n if (!collapsible) {\n return (\n <div className=\"om-pi-tool-details\" data-om-tool-status={status}>\n <div className=\"om-pi-tool-summary\">{header}</div>\n {children ? <div className=\"om-pi-tool-body\">{children}</div> : null}\n </div>\n );\n }\n return (\n <details\n className=\"om-pi-tool-details\"\n data-om-tool-status={status}\n onToggle={(event) => setOpen(event.currentTarget.open)}\n open={open}\n >\n <summary\n onClick={() => {\n explicit.current = true;\n }}\n >\n {header}\n </summary>\n {children ? <div className=\"om-pi-tool-body\">{children}</div> : null}\n </details>\n );\n};\n\nconst ThinkingPart = ({\n block,\n status,\n}: {\n block: PiContentBlock;\n status: PiConversationEntry[\"status\"];\n}) => {\n const thinking = textOf(block);\n const [open, setOpen] = useState(status === \"pending\");\n const explicit = useRef(false);\n useEffect(() => {\n if (!explicit.current) {\n setOpen(status === \"pending\");\n }\n }, [status]);\n return (\n <details\n className=\"om-pi-thinking\"\n onToggle={(event) => setOpen(event.currentTarget.open)}\n open={open}\n >\n <summary\n onClick={() => {\n explicit.current = true;\n }}\n >\n {status === \"pending\" && thinking ? preview(thinking) : \"Thinking…\"}\n </summary>\n <div className=\"om-pi-content-block\">\n <MarkdownPart block={block} subdued />\n </div>\n </details>\n );\n};\n\nconst ImagePart = ({ block }: { block: PiContentBlock }) => (\n <p className=\"om-pi-muted\">Image attachment {block.mimeType ?? \"\"}</p>\n);\n\nconst toolStatus = (tool: PiToolProjection): ToolStatus =>\n tool.result?.isError ? \"error\" : tool.result ? \"success\" : tool.status;\n\nconst argumentsRecord = (arguments_: unknown) =>\n typeof arguments_ === \"object\" && arguments_ !== null\n ? (arguments_ as Record<string, unknown>)\n : undefined;\n\nconst stringArgument = (arguments_: unknown, name: string) => {\n const value = argumentsRecord(arguments_)?.[name];\n return typeof value === \"string\" ? value : undefined;\n};\n\nconst numberArgument = (arguments_: unknown, name: string) => {\n const value = argumentsRecord(arguments_)?.[name];\n return typeof value === \"number\" ? value : undefined;\n};\n\nconst Output = ({ result }: { result?: ToolRendererResult }) => {\n const content = resultText(result);\n if (!content && !result?.isError) {\n return null;\n }\n return (\n <pre className={result?.isError ? \"om-pi-tool-error\" : \"om-pi-tool-output\"}>\n {bounded(content || formatted(result?.details))}\n </pre>\n );\n};\n\nconst toolFrame = (\n { result, status }: ToolRendererInput,\n label: ReactNode,\n children?: ReactNode,\n) => (\n <ToolDisclosure label={label} status={status}>\n {children}\n <Output result={result} />\n </ToolDisclosure>\n);\n\nconst ToolSection = ({\n children,\n defaultOpen,\n label,\n status,\n}: {\n children?: ReactNode;\n defaultOpen?: boolean;\n label: ReactNode;\n status: ToolStatus;\n}) => {\n const shouldOpen = defaultOpen ?? status !== \"success\";\n const [open, setOpen] = useState(shouldOpen);\n const explicit = useRef(false);\n useEffect(() => {\n if (!explicit.current) {\n setOpen(shouldOpen);\n }\n }, [shouldOpen]);\n return (\n <details\n className=\"om-pi-tool-section\"\n data-om-tool-status={status}\n onToggle={(event) => setOpen(event.currentTarget.open)}\n open={open}\n >\n <summary\n onClick={() => {\n explicit.current = true;\n }}\n >\n <ChevronRight aria-hidden=\"true\" />\n <span>{label}</span>\n </summary>\n {children ? <div className=\"om-pi-tool-body\">{children}</div> : null}\n </details>\n );\n};\n\nconst BashToolRenderer: ToolRenderer = (input) => {\n const command = stringArgument(input.arguments, \"command\");\n const truncation = truncationSummary(input.result?.details);\n return (\n <div className=\"om-pi-tool-details\" data-om-tool-status={input.status}>\n <div className=\"om-pi-tool-kind\">\n <span\n className=\"om-pi-tool-status om-pi-tool-status-label\"\n aria-label={`Tool ${input.status}`}\n >\n bash\n </span>\n </div>\n <pre className=\"om-pi-tool-command\">\n <code>$ {command ?? \"bash\"}</code>\n </pre>\n <ToolSection label=\"Logs\" status={input.status}>\n {truncation ? <p className=\"om-pi-tool-field\">{truncation}</p> : null}\n <Output result={input.result} />\n </ToolSection>\n </div>\n );\n};\n\nconst BashProcessToolRenderer: ToolRenderer = (input) => {\n const action = stringArgument(input.arguments, \"action\") ?? \"bash_process\";\n const pgid =\n numberArgument(input.arguments, \"pgid\") ??\n stringArgument(input.arguments, \"pgid\");\n return toolFrame(input, `${action}${pgid === undefined ? \"\" : ` · ${pgid}`}`);\n};\n\nconst languageForPath = (path: string | undefined) => {\n const extension = path?.split(\".\").at(-1)?.toLowerCase();\n return extension ? (languageAliases[extension] ?? extension) : \"\";\n};\n\nconst ReadToolRenderer: ToolRenderer = (input) => {\n const path = stringArgument(input.arguments, \"path\");\n const offset = numberArgument(input.arguments, \"offset\") ?? 1;\n const limit = numberArgument(input.arguments, \"limit\");\n const range =\n limit === undefined ? `:${offset}` : `:${offset}-${offset + limit - 1}`;\n const content = resultText(input.result);\n const language = languageForPath(path);\n return (\n <ToolDisclosure\n indicator=\"read\"\n label={`${path ?? \"read\"}${range}`}\n status={input.status}\n >\n {input.result?.isError ? <Output result={input.result} /> : null}\n {content && !input.result?.isError ? (\n <MarkdownPart\n block={{\n text: `\\`\\`\\`${language}\\n${bounded(content)}\\n\\`\\`\\``,\n type: \"text\",\n }}\n subdued\n />\n ) : null}\n </ToolDisclosure>\n );\n};\n\ntype EditResultDetails = { diff: string; patch?: string };\n\nconst editResultDetails = (details: unknown): EditResultDetails | undefined => {\n const record = detailsRecord(details);\n return typeof record?.diff === \"string\"\n ? {\n diff: record.diff,\n patch: typeof record.patch === \"string\" ? record.patch : undefined,\n }\n : undefined;\n};\n\nconst EditToolRenderer: ToolRenderer = (input) => {\n const details = editResultDetails(input.result?.details);\n const diff = details?.diff;\n const path = stringArgument(input.arguments, \"path\") ?? \"edit\";\n const label = <code className=\"om-pi-tool-path\">{path}</code>;\n return (\n <ToolDisclosure\n collapsible={false}\n indicator=\"edit\"\n label={label}\n status={input.status}\n >\n {diff ? (\n <div className=\"om-pi-tool-diff\">\n {details?.patch ? (\n <PierrePatchDiff\n options={{ hunkSeparators: \"simple\" }}\n patch={details.patch}\n />\n ) : (\n <pre>{bounded(diff)}</pre>\n )}\n </div>\n ) : null}\n {input.result?.isError ? (\n <ToolSection defaultOpen={false} label=\"Error\" status={input.status}>\n <Output result={input.result} />\n </ToolSection>\n ) : null}\n </ToolDisclosure>\n );\n};\n\nconst newFilePatch = (path: string, content: string) => {\n const safePath = path.replace(/[\\r\\n]/g, \"_\");\n const displayed = bounded(content);\n const hasTrailingNewline = displayed.endsWith(\"\\n\");\n const lines = displayed ? displayed.split(\"\\n\") : [];\n const additions = hasTrailingNewline ? lines.slice(0, -1) : lines;\n const hunk = additions.length\n ? `@@ -0,0 +1,${additions.length} @@\\n${additions.map((line) => `+${line}`).join(\"\\n\")}${hasTrailingNewline ? \"\\n\" : \"\"}`\n : \"\";\n return `diff --git a/${safePath} b/${safePath}\\nnew file mode 100644\\n--- /dev/null\\n+++ b/${safePath}\\n${hunk}`;\n};\n\nconst WriteToolRenderer: ToolRenderer = (input) => {\n const path = stringArgument(input.arguments, \"path\") ?? \"write\";\n const content = stringArgument(input.arguments, \"content\");\n const label = <code className=\"om-pi-tool-path\">{path}</code>;\n return (\n <ToolDisclosure\n collapsible={false}\n indicator=\"write\"\n label={label}\n status={input.status}\n >\n {content === undefined ? null : (\n <div\n className=\"om-pi-tool-diff\"\n data-patch={newFilePatch(path, content)}\n >\n <PierrePatchDiff\n options={{ hunkSeparators: \"simple\" }}\n patch={newFilePatch(path, content)}\n />\n </div>\n )}\n {input.result?.isError ? (\n <ToolSection defaultOpen={false} label=\"Error\" status={input.status}>\n <Output result={input.result} />\n </ToolSection>\n ) : null}\n </ToolDisclosure>\n );\n};\n\nconst GenericToolRenderer: ToolRenderer = (input) =>\n toolFrame(\n input,\n input.toolName,\n input.arguments === undefined ? null : (\n <pre className=\"om-pi-tool-input\">{formatted(input.arguments)}</pre>\n ),\n );\n\nexport const defaultToolRenderers: ToolRendererRegistry = {\n bash: BashToolRenderer,\n bash_process: BashProcessToolRenderer,\n edit: EditToolRenderer,\n read: ReadToolRenderer,\n write: WriteToolRenderer,\n};\n\nconst ToolPart = ({\n block,\n entry,\n renderers,\n}: {\n block: PiContentBlock;\n entry: PiConversationEntry;\n renderers: ToolRendererRegistry;\n}) => {\n const knownToolName = block.name ?? entry.toolName;\n const tool = block.tool ?? { status: \"pending\" as const };\n if (!knownToolName && tool.status === \"pending\") {\n return (\n <p className=\"om-pi-muted\" role=\"status\">\n Running tool…\n </p>\n );\n }\n const toolName = knownToolName ?? \"Tool call\";\n const Renderer = renderers[toolName] ?? GenericToolRenderer;\n return (\n <Renderer\n arguments={block.arguments}\n result={tool.result}\n status={toolStatus(tool)}\n toolName={toolName}\n />\n );\n};\n\nconst MessagePart = ({\n block,\n entry,\n renderers,\n}: {\n block: PiContentBlock;\n entry: PiConversationEntry;\n renderers: ToolRendererRegistry;\n}) => {\n if (block.type === \"thinking\") {\n return <ThinkingPart block={block} status={entry.status} />;\n }\n if (block.type === \"toolCall\") {\n return <ToolPart block={block} entry={entry} renderers={renderers} />;\n }\n if (block.type === \"image\") {\n return <ImagePart block={block} />;\n }\n return <MarkdownPart block={block} />;\n};\n\nconst roleName = (entry: PiConversationEntry) => {\n if (entry.role === \"toolResult\") {\n return entry.toolName ? `${entry.toolName} result` : \"Tool result\";\n }\n return entry.role === \"user\" ? \"You\" : \"Pi\";\n};\n\nconst PiConversationMessage = ({\n className,\n entry,\n renderBlock,\n renderers,\n}: {\n className?: string;\n entry: PiConversationEntry;\n renderBlock?: PiConversationBlockRender;\n renderers: ToolRendererRegistry;\n}) => (\n <article\n aria-label={`${roleName(entry)} message`}\n className={[\"om-pi-conversation-entry\", className]\n .filter(Boolean)\n .join(\" \")}\n data-om-role={entry.role}\n data-om-source={entry.source}\n data-om-status={entry.status}\n >\n {entry.role === \"user\" || entry.status !== \"complete\" ? (\n <header className=\"om-pi-muted\">\n {entry.role === \"user\" ? <span>You</span> : null}\n {entry.status === \"pending\" ? (\n <span role=\"status\">Streaming…</span>\n ) : null}\n {entry.status === \"error\" ? (\n <span className=\"om-pi-tool-error\">Error</span>\n ) : null}\n </header>\n ) : null}\n <div className=\"om-pi-content-block\">\n {entry.content.map((block, index) => (\n <div key={`${block.type}:${block.id ?? index}`}>\n {renderBlock?.({ block, entry, index }) ?? (\n <MessagePart block={block} entry={entry} renderers={renderers} />\n )}\n </div>\n ))}\n {!entry.content.length && entry.status === \"pending\" ? (\n <p className=\"om-pi-muted\" role=\"status\">\n Waiting for output…\n </p>\n ) : null}\n </div>\n {entry.errorMessage ? (\n <p className=\"om-pi-conversation-error\" role=\"alert\">\n {entry.errorMessage}\n </p>\n ) : null}\n </article>\n);\n\nconst statusLabel = (status: \"busy\" | \"degraded\" | \"idle\" | \"offline\") => {\n if (status === \"busy\") {\n return \"Pi is working\";\n }\n if (status === \"degraded\") {\n return \"Pi updates are degraded\";\n }\n if (status === \"idle\") {\n return \"Pi is ready\";\n }\n return \"Pi is offline\";\n};\n\nexport type PiMessageComposerProps = {\n autoFocus?: boolean;\n available: boolean;\n busy?: boolean;\n className?: string;\n sendMessage: PiConversationSend;\n stop?: PiConversationStop;\n style?: OvermuxStyle;\n};\n\nexport const PiMessageComposer = ({\n autoFocus = false,\n available,\n busy = false,\n className,\n sendMessage,\n stop,\n style,\n}: PiMessageComposerProps) => {\n const messageId = useId();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [draft, setDraft] = useState(\"\");\n const [error, setError] = useState(\"\");\n const [focused, setFocused] = useState(false);\n const [sending, setSending] = useState<\"followUp\" | \"steer\">();\n const [stopping, setStopping] = useState(false);\n const actionsVisible = focused || Boolean(draft);\n useLayoutEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) {\n return;\n }\n textarea.style.height = \"auto\";\n textarea.style.height = `${Math.min(textarea.scrollHeight, 192)}px`;\n }, [draft]);\n useLayoutEffect(() => {\n if (autoFocus && available) {\n textareaRef.current?.focus();\n }\n }, [autoFocus, available]);\n const submit = async (deliverAs: \"followUp\" | \"steer\") => {\n const message = draft.trim();\n if (!message || !available || sending || stopping) {\n return;\n }\n setSending(deliverAs);\n try {\n await sendMessage({ deliverAs, message });\n setDraft(\"\");\n setError(\"\");\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setSending(undefined);\n }\n };\n const abort = async () => {\n if (!available || !busy || !stop || sending || stopping) {\n return;\n }\n setStopping(true);\n try {\n await stop();\n setError(\"\");\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setStopping(false);\n }\n };\n const onSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void submit(\"steer\");\n };\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key !== \"Enter\" || (!event.metaKey && !event.ctrlKey)) {\n return;\n }\n event.preventDefault();\n void submit(busy && event.shiftKey ? \"followUp\" : \"steer\");\n };\n return (\n <form\n className={[\"om-pi-composer\", className].filter(Boolean).join(\" \")}\n data-om-pi-composer\n onSubmit={onSubmit}\n style={style}\n >\n <div className=\"om-pi-composer-box\">\n <label className=\"om-pi-visually-hidden\" htmlFor={messageId}>\n Message Pi\n </label>\n <textarea\n className={[\n \"om-pi-composer-textarea\",\n busy && !actionsVisible\n ? \"om-pi-composer-textarea-with-stop\"\n : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n disabled={!available || Boolean(sending) || stopping}\n id={messageId}\n onBlur={() => setFocused(false)}\n onChange={(event) => setDraft(event.target.value)}\n onFocus={() => setFocused(true)}\n onKeyDown={onKeyDown}\n placeholder={available ? \"Message Pi…\" : \"Pi is offline\"}\n ref={textareaRef}\n rows={1}\n value={draft}\n />\n {busy && !actionsVisible ? (\n <button\n aria-label={stopping ? \"Stopping Pi\" : \"Stop Pi\"}\n className=\"om-pi-composer-stop om-pi-composer-stop-inline\"\n disabled={!available || !stop || Boolean(sending) || stopping}\n onClick={() => void abort()}\n title=\"Stop Pi\"\n type=\"button\"\n >\n <Square aria-hidden=\"true\" />\n </button>\n ) : null}\n <div className=\"om-pi-composer-actions\">\n <span className=\"om-pi-muted\">Ctrl/⌘ Enter · Shift queues</span>\n {busy ? (\n <>\n {actionsVisible ? (\n <button\n aria-label={stopping ? \"Stopping Pi\" : \"Stop Pi\"}\n className=\"om-pi-composer-stop\"\n disabled={!available || !stop || Boolean(sending) || stopping}\n onClick={() => void abort()}\n title=\"Stop Pi\"\n type=\"button\"\n >\n <Square aria-hidden=\"true\" />\n </button>\n ) : null}\n <button\n aria-label=\"Follow up after the current turn\"\n className=\"om-pi-composer-follow-up\"\n disabled={\n !available || !draft.trim() || Boolean(sending) || stopping\n }\n onClick={() => void submit(\"followUp\")}\n type=\"button\"\n >\n {sending === \"followUp\" ? \"Queueing…\" : \"Follow up\"}\n </button>\n </>\n ) : null}\n <button\n className=\"om-pi-composer-send\"\n disabled={\n !available || !draft.trim() || Boolean(sending) || stopping\n }\n type=\"submit\"\n >\n <Send aria-hidden=\"true\" />\n {sending === \"steer\" ? \"Sending…\" : \"Send\"}\n </button>\n </div>\n </div>\n {error ? (\n <p className=\"om-pi-conversation-error\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </form>\n );\n};\n\nexport const PiConversation = ({\n autoFocus = false,\n conversation,\n className,\n classNames = {},\n emptyState,\n renderBlock,\n renderers,\n sendMessage,\n setModel,\n setThinkingLevel,\n stop,\n style,\n}: PiConversationProps) => {\n const [snapshot, setSnapshot] = useState<PiConversationSnapshot>();\n useLayoutEffect(() => conversation.subscribe(setSnapshot), [conversation]);\n const error = conversation.error?.message;\n const status = snapshot?.status ?? \"offline\";\n const scrollerRef = useRef<HTMLDivElement>(null);\n const followingRef = useRef(true);\n const [following, setFollowing] = useState(true);\n const toolRenderers = { ...defaultToolRenderers, ...renderers };\n const scrollToLatest = useCallback(() => {\n const scroller = scrollerRef.current;\n if (!scroller) {\n return;\n }\n followingRef.current = true;\n setFollowing(true);\n scroller.scrollTop = scroller.scrollHeight;\n }, []);\n const updateFollowing = useCallback(() => {\n const scroller = scrollerRef.current;\n if (!scroller) {\n return;\n }\n const next =\n scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight < 48;\n followingRef.current = next;\n setFollowing(next);\n }, []);\n useLayoutEffect(() => {\n if (followingRef.current) {\n scrollToLatest();\n }\n }, [scrollToLatest, snapshot]);\n return (\n <section\n aria-label=\"Pi conversation\"\n className={[\"om-pi-conversation\", className, classNames.root]\n .filter(Boolean)\n .join(\" \")}\n data-om-agent-status={status}\n data-om-pi-conversation\n style={style}\n >\n <header\n className={[\"om-pi-conversation-status\", classNames.status]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"om-pi-conversation-status-row\">\n <strong>Pi conversation</strong>\n <span aria-live=\"polite\" className=\"om-pi-muted\" role=\"status\">\n {!snapshot && !error ? \"Connecting to Pi…\" : statusLabel(status)}\n </span>\n </div>\n </header>\n {error ? (\n <p className=\"om-pi-conversation-error\" role=\"alert\">\n {error}\n </p>\n ) : null}\n <div\n className={[\"om-pi-conversation-scroller\", classNames.scroller]\n .filter(Boolean)\n .join(\" \")}\n onScroll={updateFollowing}\n ref={scrollerRef}\n tabIndex={0}\n >\n <div\n className={[\"om-pi-conversation-content\", classNames.content]\n .filter(Boolean)\n .join(\" \")}\n >\n {snapshot?.entries.map((entry) => (\n <PiConversationMessage\n className={[\"om-pi-conversation-entry\", classNames.entry]\n .filter(Boolean)\n .join(\" \")}\n entry={entry}\n key={entry.id}\n renderBlock={renderBlock}\n renderers={toolRenderers}\n />\n ))}\n {snapshot && !snapshot.entries.length\n ? (emptyState ?? (\n <p className=\"om-pi-muted\">No conversation yet.</p>\n ))\n : null}\n {!snapshot && error ? (\n <p className=\"om-pi-muted\">\n Conversation unavailable while Pi is offline.\n </p>\n ) : null}\n </div>\n </div>\n {!following ? (\n <button\n className=\"om-pi-conversation-jump\"\n onClick={scrollToLatest}\n type=\"button\"\n >\n Jump to latest\n </button>\n ) : null}\n <PiMessageComposer\n autoFocus={autoFocus}\n available={snapshot?.agentAvailable === true}\n busy={status === \"busy\"}\n className={classNames.composer}\n sendMessage={sendMessage}\n stop={stop}\n />\n {snapshot?.sessionMetadata ? (\n <PiConversationMetadata\n busy={status === \"busy\"}\n metadata={snapshot.sessionMetadata}\n setModel={setModel}\n setThinkingLevel={setThinkingLevel}\n />\n ) : null}\n </section>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { S as UserMessageResponse, r as AbortResponse } from "./protocol-CsrnSPOv.js";
2
+ import { a as createPiSessionStatusSource, c as listPiSessionStatuses, d as piSessionStatusSchema, i as PiSessionStatusWriter, l as parsePiSessionStatus, n as PiSessionStatusSource, o as createPiSessionStatusWriter, r as PiSessionStatusUpdate, s as isLocalPidAlive, t as PiSessionStatus, u as piSessionStatusPath } from "./session-status-CZLTo8Km.js";
3
+ import { PiAgentConversationService, PiAgentSession, PiContentBlock, PiConversationEntry, PiConversationSnapshot, PiMessageSender, PiSessionMetadata, PiToolProjection, PiToolResultProjection, createPiAgentConversationService, piContentBlockSchema, piConversationSnapshotSchema, piSessionMetadataSchema, piToolProjectionSchema, piToolResultProjectionSchema, probePiAgent, sendPiAgentMessage } from "./projection.js";
4
+ import { PiAgents, PiSessionSource, definePiAgents, piConversationStream, piOperationHandlers, piSessionsResource } from "./plugin.js";
5
+ export { type AbortResponse, PiAgentConversationService, PiAgentSession, PiAgents, PiContentBlock, PiConversationEntry, PiConversationSnapshot, PiMessageSender, PiSessionMetadata, PiSessionSource, type PiSessionStatus, type PiSessionStatusSource, type PiSessionStatusUpdate, type PiSessionStatusWriter, PiToolProjection, PiToolResultProjection, type UserMessageResponse, createPiAgentConversationService, createPiSessionStatusSource, createPiSessionStatusWriter, definePiAgents, isLocalPidAlive, listPiSessionStatuses, parsePiSessionStatus, piContentBlockSchema, piConversationSnapshotSchema, piConversationStream, piOperationHandlers, piSessionMetadataSchema, piSessionStatusPath, piSessionStatusSchema, piSessionsResource, piToolProjectionSchema, piToolResultProjectionSchema, probePiAgent, sendPiAgentMessage };
package/dist/server.js ADDED
@@ -0,0 +1,4 @@
1
+ import { c as createPiSessionStatusSource, d as listPiSessionStatuses, f as parsePiSessionStatus, l as createPiSessionStatusWriter, m as piSessionStatusSchema, p as piSessionStatusPath, u as isLocalPidAlive } from "./live-events-ClhFOMGW.js";
2
+ import { createPiAgentConversationService, piContentBlockSchema, piConversationSnapshotSchema, piSessionMetadataSchema, piToolProjectionSchema, piToolResultProjectionSchema, probePiAgent, sendPiAgentMessage } from "./projection.js";
3
+ import { definePiAgents, piConversationStream, piOperationHandlers, piSessionsResource } from "./plugin.js";
4
+ export { createPiAgentConversationService, createPiSessionStatusSource, createPiSessionStatusWriter, definePiAgents, isLocalPidAlive, listPiSessionStatuses, parsePiSessionStatus, piContentBlockSchema, piConversationSnapshotSchema, piConversationStream, piOperationHandlers, piSessionMetadataSchema, piSessionStatusPath, piSessionStatusSchema, piSessionsResource, piToolProjectionSchema, piToolResultProjectionSchema, probePiAgent, sendPiAgentMessage };
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ //#region src/session-status.d.ts
3
+ declare const piSessionStatusSchema: z.ZodObject<{
4
+ version: z.ZodLiteral<1>;
5
+ sessionId: z.ZodString;
6
+ sessionFile: z.ZodString;
7
+ streamId: z.ZodString;
8
+ processInstanceId: z.ZodString;
9
+ pid: z.ZodNumber;
10
+ hostname: z.ZodString;
11
+ tmuxPane: z.ZodOptional<z.ZodString>;
12
+ startedAt: z.ZodNumber;
13
+ updatedAt: z.ZodNumber;
14
+ state: z.ZodEnum<{
15
+ idle: "idle";
16
+ busy: "busy";
17
+ stopped: "stopped";
18
+ }>;
19
+ model: z.ZodOptional<z.ZodObject<{
20
+ provider: z.ZodString;
21
+ id: z.ZodString;
22
+ name: z.ZodString;
23
+ }, z.core.$strict>>;
24
+ thinkingLevel: z.ZodString;
25
+ modelOptions: z.ZodOptional<z.ZodArray<z.ZodObject<{
26
+ provider: z.ZodString;
27
+ id: z.ZodString;
28
+ name: z.ZodString;
29
+ }, z.core.$strict>>>;
30
+ contextUsage: z.ZodOptional<z.ZodObject<{
31
+ tokens: z.ZodNumber;
32
+ contextWindow: z.ZodNumber;
33
+ percent: z.ZodNumber;
34
+ }, z.core.$strict>>;
35
+ }, z.core.$strict>;
36
+ type PiSessionStatus = z.infer<typeof piSessionStatusSchema>;
37
+ type PiSessionStatusUpdate = Partial<Pick<PiSessionStatus, "contextUsage" | "model" | "modelOptions" | "state" | "thinkingLevel">>;
38
+ type PiSessionStatusWriter = {
39
+ filePath: string;
40
+ streamId: string;
41
+ update: (update: PiSessionStatusUpdate) => Promise<void>;
42
+ close: () => Promise<void>;
43
+ };
44
+ type PiSessionStatusSource = {
45
+ list: () => Promise<readonly PiSessionStatus[]>;
46
+ subscribe: (invalidate: () => void, options: {
47
+ signal: AbortSignal;
48
+ }) => () => void;
49
+ };
50
+ declare const piSessionStatusPath: (rootDir: string, sessionId: string, streamId: string) => string;
51
+ declare const parsePiSessionStatus: (value: unknown) => PiSessionStatus | undefined;
52
+ declare const createPiSessionStatusWriter: ({ rootDir, status, onError }: {
53
+ rootDir: string;
54
+ status: Omit<PiSessionStatus, "updatedAt" | "version">;
55
+ onError?: (error: unknown) => void;
56
+ }) => PiSessionStatusWriter;
57
+ declare const isLocalPidAlive: (pid: number) => boolean;
58
+ declare const listPiSessionStatuses: ({ rootDir, hostname, pidAlive }: {
59
+ rootDir: string;
60
+ hostname?: string;
61
+ pidAlive?: (pid: number) => boolean;
62
+ }) => Promise<PiSessionStatus[]>;
63
+ declare const createPiSessionStatusSource: ({ rootDir, pollIntervalMs, hostname, pidAlive }: {
64
+ rootDir: string;
65
+ pollIntervalMs?: number;
66
+ hostname?: string;
67
+ pidAlive?: (pid: number) => boolean;
68
+ }) => PiSessionStatusSource;
69
+ //#endregion
70
+ export { createPiSessionStatusSource as a, listPiSessionStatuses as c, piSessionStatusSchema as d, PiSessionStatusWriter as i, parsePiSessionStatus as l, PiSessionStatusSource as n, createPiSessionStatusWriter as o, PiSessionStatusUpdate as r, isLocalPidAlive as s, PiSessionStatus as t, piSessionStatusPath as u };
71
+ //# sourceMappingURL=session-status-CZLTo8Km.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-status-CZLTo8Km.d.ts","names":[],"sources":["../src/session-status.ts"],"mappings":";;cAea,uBAAqB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CvB,EAAA,KAAA;KAEC,kBAAkB,EAAE,aAAa;KACjC,wBAAwB,QAClC,KACE;KAIQ;EACV;EACA;EACA,SAAS,QAAQ,0BAA0B;EAC3C,aAAa;;KAEH;EACV,YAAY,iBAAiB;EAC7B,YACE,wBACA;IAAW,QAAQ;;;cAsBV,sBACX,iBACA,mBACA;cAQW,uBACX,mBACC;cAqDU,gCAA+B,SAAA,QAAA;EAK1C;EACA,QAAQ,KAAK;EACb,WAAW;MACT;cA2ES,kBAAmB;cASnB,0BAA+B,SAAA,UAAA;EAK1C;EACA;EACA,YAAY;MACV,QAAQ;cAoDC,gCAA+B,SAAA,gBAAA,UAAA;EAM1C;EACA;EACA;EACA,YAAY;MACV"}