@tutti-os/agent-gui 0.0.70 → 0.0.72
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.
- package/README.md +4 -0
- package/dist/{AgentMentionSearchController-Po0KQLcL.d.ts → AgentMentionSearchController-DD_WOred.d.ts} +1 -0
- package/dist/agent-conversation/index.d.ts +3 -3
- package/dist/agent-conversation/index.js +6 -6
- package/dist/agent-message-center/index.d.ts +2 -1
- package/dist/agent-message-center/index.js +12 -10
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentGuiNodeTypes-CmLUy5Jt.d.ts → agentGuiNodeTypes-aJ3AX7u2.d.ts} +40 -19
- package/dist/app/renderer/agentactivity.css +156 -1
- package/dist/{chunk-KTIHLBCN.js → chunk-2I2WRI4F.js} +248 -4
- package/dist/chunk-2I2WRI4F.js.map +1 -0
- package/dist/{chunk-DXENDZEF.js → chunk-3PKRGSMH.js} +2 -2
- package/dist/{chunk-QDWV5VTD.js → chunk-466AWJTS.js} +6 -31
- package/dist/chunk-466AWJTS.js.map +1 -0
- package/dist/{chunk-SG6A35BU.js → chunk-5H6NINJY.js} +2 -2
- package/dist/{chunk-SC3PS7AT.js → chunk-C7K3EFGI.js} +2 -2
- package/dist/{chunk-DGNKXT3Q.js → chunk-G6BVEY7I.js} +69 -3
- package/dist/chunk-G6BVEY7I.js.map +1 -0
- package/dist/{chunk-KS35VKHM.js → chunk-GDFQXJMG.js} +1 -1
- package/dist/chunk-GDFQXJMG.js.map +1 -0
- package/dist/{chunk-WWY6MYMU.js → chunk-IVIXKAEH.js} +19 -9
- package/dist/chunk-IVIXKAEH.js.map +1 -0
- package/dist/{chunk-IZX2YQXY.js → chunk-KWQ4N4IZ.js} +117 -8
- package/dist/chunk-KWQ4N4IZ.js.map +1 -0
- package/dist/{chunk-ISQCYEUJ.js → chunk-OBJRIQPX.js} +411 -62
- package/dist/chunk-OBJRIQPX.js.map +1 -0
- package/dist/{chunk-QJ42HQ24.js → chunk-Q6AWM3RH.js} +4 -4
- package/dist/{chunk-MVPSFOJZ.js → chunk-SVGIWXNK.js} +2 -2
- package/dist/{chunk-Y3C5EHSW.js → chunk-SZF52NMJ.js} +173 -12
- package/dist/chunk-SZF52NMJ.js.map +1 -0
- package/dist/{chunk-FTSEVC6O.js → chunk-XZF4QNT4.js} +2 -2
- package/dist/context-mention-palette/index.d.ts +2 -2
- package/dist/context-mention-palette/index.js +7 -7
- package/dist/i18n/index.d.ts +68 -2
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +106 -103
- package/dist/index.js +2216 -1322
- package/dist/index.js.map +1 -1
- package/dist/queued-prompt-runtime.d.ts +2 -2
- package/dist/{types-DZ79b8Zn.d.ts → types-CrwMqBm1.d.ts} +4 -1
- package/dist/workbench/contribution.d.ts +8 -2
- package/dist/workbench/contribution.js +4 -4
- package/dist/workbench/index.d.ts +1 -1
- package/dist/workbench/index.js +5 -7
- package/dist/workbench/launch.d.ts +1 -1
- package/dist/workbench/providerCatalog.d.ts +1 -1
- package/dist/workbench/sessionTitle.d.ts +1 -1
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workbench/state.d.ts +1 -1
- package/dist/workbench/state.js +1 -2
- package/dist/workbench/types.d.ts +1 -1
- package/dist/workspace-agent-generated-files.js +3 -3
- package/dist/{workspaceLinkActions-Bjy_XfBm.d.ts → workspaceLinkActions-DS9LWqzI.d.ts} +1 -1
- package/package.json +12 -12
- package/dist/chunk-DGNKXT3Q.js.map +0 -1
- package/dist/chunk-ISQCYEUJ.js.map +0 -1
- package/dist/chunk-IZX2YQXY.js.map +0 -1
- package/dist/chunk-KS35VKHM.js.map +0 -1
- package/dist/chunk-KTIHLBCN.js.map +0 -1
- package/dist/chunk-N37A62BK.js +0 -250
- package/dist/chunk-N37A62BK.js.map +0 -1
- package/dist/chunk-NROZAN34.js +0 -173
- package/dist/chunk-NROZAN34.js.map +0 -1
- package/dist/chunk-QDWV5VTD.js.map +0 -1
- package/dist/chunk-WWY6MYMU.js.map +0 -1
- package/dist/chunk-Y3C5EHSW.js.map +0 -1
- /package/dist/{chunk-DXENDZEF.js.map → chunk-3PKRGSMH.js.map} +0 -0
- /package/dist/{chunk-SG6A35BU.js.map → chunk-5H6NINJY.js.map} +0 -0
- /package/dist/{chunk-SC3PS7AT.js.map → chunk-C7K3EFGI.js.map} +0 -0
- /package/dist/{chunk-QJ42HQ24.js.map → chunk-Q6AWM3RH.js.map} +0 -0
- /package/dist/{chunk-MVPSFOJZ.js.map → chunk-SVGIWXNK.js.map} +0 -0
- /package/dist/{chunk-FTSEVC6O.js.map → chunk-XZF4QNT4.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../agent-gui/agentGuiNode/agentRichText/agentFileMentionExtension.ts","../agent-gui/agentGuiNode/agentRichText/AgentMentionNodeView.tsx","../agent-gui/agentGuiNode/agentRichText/agentRichTextCaretAnchor.ts"],"sourcesContent":["import { mergeAttributes, Node, type Editor, type Range } from \"@tiptap/core\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport Suggestion, { exitSuggestion } from \"@tiptap/suggestion\";\nimport { isRichTextTriggerPrefixBoundary } from \"@tutti-os/ui-rich-text/editor\";\nimport {\n createRichTextLinkMarkdown,\n createRichTextMentionMarkdown,\n isRichTextMentionHref,\n parseRichTextMentionHref\n} from \"@tutti-os/ui-rich-text/core\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../../shared/mentionFilePresentation\";\nimport { getAgentCustomMentionKind } from \"../../../shared/agentCustomMentionKinds\";\nimport { translate } from \"../../../i18n/index\";\nimport { AgentMentionNodeView } from \"./AgentMentionNodeView\";\nimport { AGENT_RICH_TEXT_CARET_ANCHOR } from \"./agentRichTextCaretAnchor\";\n\nexport type AgentFileMentionKind = \"file\" | \"directory\" | \"unknown\";\nexport type AgentMentionFileNavigationAction =\n | \"agent-generated-folder\"\n | \"agent-generated-folder-back\";\nexport type AgentMentionScope = \"my_sessions\" | \"collab_sessions\";\nexport type AgentMentionKind =\n | \"file\"\n | \"agent-target\"\n | \"session\"\n | \"workspace-app\"\n | \"workspace-reference\"\n | \"workspace-app-factory\"\n | \"workspace-issue\"\n | \"custom\";\n\nexport type AgentMentionReferenceSource = \"app\" | \"task\";\n\nexport interface AgentMentionFileItem {\n kind: \"file\";\n path: string;\n href: string;\n name: string;\n entryKind: AgentFileMentionKind;\n directoryPath: string;\n score?: number;\n thumbnailUrl?: string | null;\n mentionNavigation?: AgentMentionFileNavigationAction;\n childCount?: number;\n}\n\nexport interface AgentMentionSessionItem {\n kind: \"session\";\n href: string;\n workspaceId: string;\n targetId: string;\n name: string;\n title: string;\n scope: AgentMentionScope;\n initiatorName: string;\n initiatorAvatarUrl?: string;\n agentName: string;\n status?: string;\n inputPreview?: string;\n summaryPreview?: string;\n updatedAtUnixMs?: number;\n}\n\nexport interface AgentMentionWorkspaceIssueItem {\n kind: \"workspace-issue\";\n href: string;\n workspaceId: string;\n targetId: string;\n topicId?: string;\n name: string;\n title: string;\n creatorName?: string;\n status?: string;\n contentPreview?: string;\n updatedAtUnixMs?: number;\n}\n\nexport interface AgentMentionWorkspaceAppItem {\n kind: \"workspace-app\";\n href: string;\n workspaceId: string;\n targetId: string;\n appId: string;\n name: string;\n description?: string;\n iconUrl?: string;\n /** 应用是否能够提供产物文件(reference),决定 @ 面板行末尾是否展示「查看产物」入口。 */\n referencesListSupported?: boolean;\n}\n\nexport interface AgentMentionAgentTargetItem {\n kind: \"agent-target\";\n href: string;\n workspaceId: string;\n targetId: string;\n name: string;\n description?: string;\n agentProviderId?: string;\n iconUrl?: string;\n}\n\nexport interface AgentMentionWorkspaceReferenceItem {\n kind: \"workspace-reference\";\n href: string;\n workspaceId: string;\n /** URI path id:source=app 时为 appId,source=task 时为 topicId。 */\n targetId: string;\n source: AgentMentionReferenceSource;\n /** 子级 id:app 子分组 / issueId。缺省表示整个 app / topic。 */\n groupId?: string;\n name: string;\n iconUrl?: string;\n /** 展示用文件数(来自 picker 节点 childCount);序列化不再展开文件。 */\n fileCount: number;\n}\n\nexport interface AgentMentionWorkspaceAppFactoryItem {\n kind: \"workspace-app-factory\";\n href: string;\n workspaceId: string;\n targetId: string;\n jobId: string;\n name: string;\n action?: string;\n contextPath?: string;\n}\n\n// 宿主注册的自定义 mention(见 shared/agentCustomMentionKinds):href 是完整信息源\n// (round-trip 无损),item 只承载通用展示字段;业务细节由宿主在注册的钩子里从 href 还原。\nexport interface AgentMentionCustomItem {\n kind: \"custom\";\n /** 注册表里的 kind(= mention:// providerId)。 */\n customKind: string;\n href: string;\n workspaceId: string;\n targetId: string;\n /** chip 第一行。 */\n name: string;\n /** chip 第二行(通用双行卡)。 */\n summary?: string;\n}\n\nexport type AgentContextMentionItem =\n | AgentMentionFileItem\n | AgentMentionAgentTargetItem\n | AgentMentionSessionItem\n | AgentMentionWorkspaceAppItem\n | AgentMentionWorkspaceReferenceItem\n | AgentMentionWorkspaceAppFactoryItem\n | AgentMentionWorkspaceIssueItem\n | AgentMentionCustomItem;\n\nexport type AgentFileMentionItem = AgentContextMentionItem;\n\nexport interface AgentMentionSuggestionState {\n editor: Editor;\n range: Range;\n query: string;\n text: string;\n command: (item: AgentContextMentionItem) => void;\n clientRect?: (() => DOMRect | null) | null;\n}\n\nexport type AgentFileMentionSuggestionState = AgentMentionSuggestionState;\n\nexport interface AgentFileMentionExtensionOptions {\n enableSuggestions?: boolean;\n onSuggestionChange?: (state: AgentMentionSuggestionState | null) => void;\n onSuggestionKeyDown?: (event: KeyboardEvent) => boolean;\n removeActionAriaLabel?: string;\n renderAsLink?: boolean;\n shouldSuppressSuggestion?: () => boolean;\n}\n\nexport interface ParsedAgentMentionMarkdown {\n item: AgentContextMentionItem;\n end: number;\n}\n\nexport const agentFileMentionPluginKey = new PluginKey(\n \"agentFileMentionSuggestion\"\n);\n\nexport function exitAgentFileMentionSuggestion(editor: Editor): void {\n exitSuggestion(editor.view, agentFileMentionPluginKey);\n}\n\nexport function createAgentFileMentionExtension(\n options: AgentFileMentionExtensionOptions = {}\n): Node {\n return Node.create({\n name: \"agentFileMention\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: false,\n\n addOptions() {\n return options;\n },\n\n addAttributes() {\n return {\n name: { default: \"\" },\n kind: { default: \"file\" },\n href: { default: \"\" },\n path: { default: \"\" },\n entryKind: { default: \"unknown\" },\n directoryPath: { default: \"\" },\n workspaceId: { default: \"\" },\n targetId: { default: \"\" },\n scope: { default: \"\" },\n title: { default: \"\" },\n initiatorName: { default: \"\" },\n agentName: { default: \"\" },\n status: { default: \"\" },\n inputPreview: { default: \"\" },\n summaryPreview: { default: \"\" },\n creatorName: { default: \"\" },\n topicId: { default: \"\" },\n appId: { default: \"\" },\n agentProviderId: { default: \"\" },\n jobId: { default: \"\" },\n action: { default: \"\" },\n contextPath: { default: \"\" },\n description: { default: \"\" },\n iconUrl: { default: \"\" },\n contentPreview: { default: \"\" },\n thumbnailUrl: { default: \"\" },\n source: { default: \"\" },\n groupId: { default: \"\" },\n fileCount: { default: \"\" },\n customKind: { default: \"\" },\n preview: { default: \"\" }\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-agent-file-mention]\",\n getAttrs: parseAgentMentionHTMLElementAttrs\n },\n {\n tag: \"a[data-agent-file-mention]\",\n getAttrs: parseAgentMentionHTMLElementAttrs\n }\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const item = attrsToMentionItem(HTMLAttributes);\n const fileThumbnailUrl =\n item.kind === \"file\"\n ? resolveAgentMentionFileThumbnailUrl(item)\n : undefined;\n const href = item.href;\n const tagName = options.renderAsLink ? \"a\" : \"span\";\n const visual = mentionVisual(item);\n const sessionVisual =\n item.kind === \"session\" ? sessionMentionVisual(item) : null;\n const sharedAttributes = {\n \"data-agent-file-mention\": \"true\",\n \"data-agent-mention-href\": href,\n \"data-agent-mention-kind\": item.kind,\n \"aria-label\":\n item.kind === \"file\"\n ? visual.primary\n : `${visual.kindLabel} ${visual.primary}`.trim()\n };\n return [\n tagName,\n mergeAttributes(HTMLAttributes, {\n ...sharedAttributes,\n ...(item.kind === \"file\"\n ? {\n \"data-agent-file-entry-kind\": item.entryKind,\n \"data-agent-file-directory-path\": item.directoryPath,\n \"data-agent-file-visual-kind\":\n resolveAgentMentionFileVisualKind(item)\n }\n : {}),\n ...(options.renderAsLink ? { href } : {}),\n ...((item.kind === \"workspace-app\" ||\n item.kind === \"agent-target\" ||\n item.kind === \"workspace-reference\") &&\n item.iconUrl\n ? { \"data-agent-mention-icon-url\": item.iconUrl }\n : {}),\n ...(item.kind === \"workspace-reference\"\n ? { \"data-agent-mention-file-count\": String(item.fileCount) }\n : {}),\n ...(fileThumbnailUrl\n ? { \"data-agent-mention-thumbnail-url\": fileThumbnailUrl }\n : {}),\n class:\n item.kind === \"file\"\n ? \"tsh-agent-object-token tsh-agent-object-token--file\"\n : \"tsh-agent-object-token tsh-agent-object-token--entity\"\n }),\n ...(item.kind === \"file\"\n ? [\n fileThumbnailUrl\n ? [\n \"span\",\n {\n class: \"agent-gui-node__mention-file-thumb\",\n \"data-agent-mention-file-thumb\": \"true\",\n \"aria-hidden\": \"true\"\n },\n [\n \"img\",\n {\n src: fileThumbnailUrl,\n alt: \"\",\n decoding: \"async\",\n loading: \"lazy\",\n draggable: \"false\"\n }\n ]\n ]\n : [\n \"span\",\n {\n class: \"tsh-agent-object-token__icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ],\n [\n \"span\",\n { class: \"tsh-agent-object-token__main\" },\n visual.primary\n ]\n ]\n : item.kind === \"session\"\n ? [\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind\",\n \"aria-hidden\": \"true\"\n },\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind-icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ]\n ],\n [\n \"span\",\n { class: \"tsh-agent-object-token__main\" },\n [\n \"span\",\n { class: \"tsh-agent-object-token__participant\" },\n sessionVisual?.participant ?? \"\"\n ],\n [\n \"span\",\n { class: \"tsh-agent-object-token__summary\" },\n sessionVisual?.summary ? ` ${sessionVisual.summary}` : \"\"\n ]\n ]\n ]\n : [\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind\",\n \"aria-hidden\": \"true\"\n },\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind-icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ]\n ],\n [\n \"span\",\n { class: \"tsh-agent-object-token__main\" },\n visual.primary\n ]\n ])\n ];\n },\n\n renderText({ node }) {\n return formatAgentMentionMarkdown(attrsToMentionItem(node.attrs ?? {}));\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(AgentMentionNodeView);\n },\n\n addProseMirrorPlugins() {\n if (options.enableSuggestions === false) {\n return [];\n }\n return [\n Suggestion<AgentContextMentionItem, AgentContextMentionItem>({\n editor: this.editor,\n pluginKey: agentFileMentionPluginKey,\n char: \"@\",\n allowedPrefixes: [\" \", \"\\n\", \"\\t\"],\n allowSpaces: true,\n items: () => [],\n allow: ({ state, range }) => {\n if (options.shouldSuppressSuggestion?.()) {\n return false;\n }\n if (range.from <= 1) {\n return true;\n }\n const previous = state.doc.textBetween(\n range.from - 1,\n range.from,\n \"\\n\",\n \"\\n\"\n );\n return isRichTextTriggerPrefixBoundary(previous, \"whitespace\");\n },\n command: ({ editor, range, props }) => {\n const prefixCaretAnchor =\n range.from <= 1 ||\n editor.state.doc.textBetween(\n Math.max(1, range.from - 1),\n range.from,\n \"\\n\",\n \"\\n\"\n ) === \"\\n\";\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n ...(prefixCaretAnchor\n ? ([\n {\n type: \"text\",\n text: AGENT_RICH_TEXT_CARET_ANCHOR\n }\n ] as const)\n : []),\n {\n type: this.name,\n attrs: mentionItemToAttrs(props)\n },\n { type: \"text\", text: \" \" }\n ])\n .run();\n },\n render: () => ({\n onStart: (props) => {\n options.onSuggestionChange?.({\n editor: props.editor,\n range: props.range,\n query: props.query,\n text: props.text,\n command: props.command,\n clientRect: props.clientRect\n });\n },\n onUpdate: (props) => {\n options.onSuggestionChange?.({\n editor: props.editor,\n range: props.range,\n query: props.query,\n text: props.text,\n command: props.command,\n clientRect: props.clientRect\n });\n },\n onExit: () => {\n options.onSuggestionChange?.(null);\n },\n onKeyDown: (props) =>\n options.onSuggestionKeyDown?.(props.event) ?? false\n })\n })\n ];\n }\n });\n}\n\nexport function normalizeAgentSessionMentionTitle(value: string): string {\n const trimmed = value.trim();\n const withoutMentionPrefix = trimmed.replace(/^@+/, \"\").trim();\n return withoutMentionPrefix || trimmed;\n}\n\nexport function formatAgentFileMentionMarkdown(\n name: string,\n path: string\n): string {\n return formatAgentMentionMarkdown({\n kind: \"file\",\n href: path,\n path,\n name,\n entryKind: \"unknown\",\n directoryPath: \"\"\n });\n}\n\nexport function formatAgentMentionMarkdown(\n item: AgentContextMentionItem\n): string {\n // 所有 entity(含 workspace-reference)统一序列化成单条 mention 链接。\n // workspace-reference 不再展开成文件路径——agent 拿到 URI 后经 skill+CLI 按需解析。\n if (item.kind === \"file\") {\n const label = item.name.trim().startsWith(\"@\")\n ? item.name\n : `@${item.name}`;\n return createRichTextLinkMarkdown({\n kind: \"file\",\n name: label,\n path: item.href\n });\n }\n if (item.kind === \"workspace-reference\") {\n return createRichTextMentionMarkdown({\n providerId: \"workspace-reference\",\n entityId: item.targetId,\n label: item.name,\n scope: {\n workspaceId: item.workspaceId,\n source: item.source,\n ...(item.groupId?.trim() ? { groupId: item.groupId.trim() } : {}),\n ...(item.fileCount > 0 ? { count: String(item.fileCount) } : {})\n }\n });\n }\n if (item.kind === \"agent-target\") {\n return createRichTextMentionMarkdown({\n providerId: \"agent-target\",\n entityId: item.targetId,\n label: item.name,\n scope: { workspaceId: item.workspaceId }\n });\n }\n const identity = parseRichTextMentionHref(item.href, item.name);\n return identity ? createRichTextMentionMarkdown(identity) : \"\";\n}\n\nfunction parseMentionFileCount(value: unknown): number {\n const parsed =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\"\n ? Number.parseInt(value.trim(), 10)\n : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;\n}\n\nexport function parseAgentMentionMarkdown(\n value: string,\n start = 0\n): ParsedAgentMentionMarkdown | null {\n if (!value.startsWith(\"[\", start)) {\n return null;\n }\n\n let index = start + 1;\n const prefixedMention = value[index] === \"@\";\n if (prefixedMention) {\n index += 1;\n }\n let name = \"\";\n while (index < value.length) {\n const current = value[index];\n if (current === \"\\\\\") {\n const escaped = value[index + 1];\n if (escaped === \"\\\\\" || escaped === \"[\" || escaped === \"]\") {\n name += escaped;\n index += 2;\n continue;\n }\n name += current;\n index += 1;\n continue;\n }\n if (current === \"]\") {\n break;\n }\n name += current;\n index += 1;\n }\n\n if (value[index] !== \"]\" || value[index + 1] !== \"(\") {\n return null;\n }\n\n index += 2;\n let href = \"\";\n while (index < value.length) {\n const current = value[index];\n if (current === \"\\\\\") {\n const escaped = value[index + 1];\n if (escaped === \"\\\\\" || escaped === \")\") {\n href += escaped;\n index += 2;\n continue;\n }\n href += current;\n index += 1;\n continue;\n }\n if (current === \")\") {\n const item = parseMentionItemFromHref({ name, href });\n if (!item) {\n return null;\n }\n if (\n item.kind !== \"file\" &&\n !prefixedMention &&\n !isRichTextMentionHref(href)\n ) {\n return null;\n }\n return {\n item,\n end: index + 1\n };\n }\n href += current;\n index += 1;\n }\n\n return null;\n}\n\nexport function parseMentionItemFromHref(input: {\n name: string;\n href: string;\n}): AgentContextMentionItem | null {\n const href = input.href.trim();\n if (!href) {\n return null;\n }\n const mention = parseRichTextMentionHref(href, input.name);\n if (!mention && !isRichTextMentionHref(href)) {\n return {\n kind: \"file\",\n href,\n path: href,\n name: input.name,\n entryKind: isLocalDirectoryMentionHref(href) ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromPath(href)\n };\n }\n if (!mention) {\n return null;\n }\n\n const resource = mention.providerId.trim().toLowerCase();\n const targetId = mention.entityId.trim();\n const workspaceId = mention.scope?.workspaceId?.trim() ?? \"\";\n const name = mention.label;\n if (resource === \"agent-session\") {\n if (!workspaceId) {\n return null;\n }\n return {\n kind: \"session\",\n href,\n workspaceId,\n targetId,\n name,\n title: name,\n scope: \"collab_sessions\",\n initiatorName: \"\",\n agentName: \"\"\n };\n }\n if (resource === \"workspace-issue\") {\n if (!workspaceId) {\n return null;\n }\n return {\n kind: \"workspace-issue\",\n href,\n workspaceId,\n targetId,\n topicId: mention.scope?.topicId?.trim() || undefined,\n name,\n title: name\n };\n }\n if (resource === \"workspace-app\") {\n if (!workspaceId) {\n return null;\n }\n return {\n kind: \"workspace-app\",\n href,\n workspaceId,\n targetId,\n appId: targetId,\n name\n };\n }\n if (resource === \"agent-target\") {\n if (!workspaceId) {\n return null;\n }\n return {\n kind: \"agent-target\",\n href,\n workspaceId,\n targetId,\n name\n };\n }\n if (resource === \"workspace-reference\") {\n if (!workspaceId) {\n return null;\n }\n const source = mention.scope?.source?.trim();\n if (source !== \"app\" && source !== \"task\") {\n return null;\n }\n return {\n kind: \"workspace-reference\",\n href,\n workspaceId,\n targetId,\n source,\n groupId: mention.scope?.groupId?.trim() || undefined,\n name,\n iconUrl: mention.scope?.icon?.trim() || undefined,\n fileCount: parseMentionFileCount(mention.scope?.count)\n };\n }\n if (resource === \"workspace-app-factory\") {\n return {\n kind: \"workspace-app-factory\",\n href,\n workspaceId,\n targetId,\n jobId: targetId === \"create\" ? \"\" : targetId,\n name:\n name ||\n translate(\"agentHost.agentGui.workspaceAppFactoryMentionFallback\"),\n action: mention.scope?.action?.trim() || undefined,\n contextPath: mention.scope?.contextPath?.trim() || undefined\n };\n }\n const customDefinition = getAgentCustomMentionKind(resource);\n if (customDefinition) {\n const presentation = customDefinition.present(mention, href);\n if (!presentation) {\n return null;\n }\n return {\n kind: \"custom\",\n customKind: resource,\n href,\n workspaceId: presentation.workspaceId?.trim() || workspaceId,\n targetId,\n name: presentation.name.trim() || name,\n summary: presentation.summary?.trim() || undefined\n };\n }\n return null;\n}\n\nfunction isLocalDirectoryMentionHref(href: string): boolean {\n return href.endsWith(\"/\") && !/^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(href);\n}\n\nexport function mentionItemToAttrs(\n item: AgentContextMentionItem\n): Record<string, string> {\n if (item.kind === \"file\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n path: item.path,\n entryKind: item.entryKind,\n directoryPath: item.directoryPath,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl(item) ?? \"\"\n };\n }\n if (item.kind === \"session\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n scope: item.scope,\n title: item.title,\n initiatorName: item.initiatorName,\n agentName: item.agentName,\n status: item.status ?? \"\",\n inputPreview: item.inputPreview ?? \"\",\n summaryPreview: item.summaryPreview ?? \"\"\n };\n }\n if (item.kind === \"workspace-app\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n appId: item.appId,\n description: item.description ?? \"\",\n iconUrl: item.iconUrl ?? \"\"\n };\n }\n if (item.kind === \"agent-target\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n description: item.description ?? \"\",\n agentProviderId: item.agentProviderId ?? \"\",\n iconUrl: item.iconUrl ?? \"\"\n };\n }\n if (item.kind === \"workspace-reference\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n source: item.source,\n groupId: item.groupId ?? \"\",\n iconUrl: item.iconUrl ?? \"\",\n fileCount: String(item.fileCount)\n };\n }\n if (item.kind === \"workspace-app-factory\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n jobId: item.jobId,\n action: item.action ?? \"\",\n contextPath: item.contextPath ?? \"\"\n };\n }\n if (item.kind === \"custom\") {\n return {\n name: item.name,\n kind: item.kind,\n customKind: item.customKind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n preview: item.summary ?? \"\"\n };\n }\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n topicId: item.topicId ?? \"\",\n title: item.title,\n creatorName: item.creatorName ?? \"\",\n status: item.status ?? \"\",\n contentPreview: item.contentPreview ?? \"\"\n };\n}\n\nfunction workspaceMentionAttrs(\n workspaceId: string\n): Pick<AgentMentionSessionItem, \"workspaceId\"> {\n const normalizedWorkspaceId = workspaceId.trim();\n return {\n workspaceId: normalizedWorkspaceId\n };\n}\n\nexport function attrsToMentionItem(\n attrs: Record<string, unknown>\n): AgentContextMentionItem {\n const kind = normalizeMentionKind(attrs.kind);\n const name = typeof attrs.name === \"string\" ? attrs.name : \"\";\n const href =\n typeof attrs.href === \"string\" && attrs.href.trim() ? attrs.href : \"\";\n if (kind === \"session\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const targetId = typeof attrs.targetId === \"string\" ? attrs.targetId : \"\";\n return {\n kind,\n href,\n workspaceId,\n targetId,\n name,\n title:\n typeof attrs.title === \"string\" && attrs.title.trim()\n ? attrs.title\n : name,\n scope:\n attrs.scope === \"my_sessions\" || attrs.scope === \"collab_sessions\"\n ? attrs.scope\n : \"collab_sessions\",\n initiatorName:\n typeof attrs.initiatorName === \"string\" ? attrs.initiatorName : \"\",\n agentName: typeof attrs.agentName === \"string\" ? attrs.agentName : \"\",\n status: typeof attrs.status === \"string\" ? attrs.status : undefined,\n inputPreview:\n typeof attrs.inputPreview === \"string\" ? attrs.inputPreview : undefined,\n summaryPreview:\n typeof attrs.summaryPreview === \"string\"\n ? attrs.summaryPreview\n : undefined\n };\n }\n if (kind === \"custom\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const targetId =\n typeof attrs.targetId === \"string\" ? attrs.targetId.trim() : \"\";\n const customKind =\n typeof attrs.customKind === \"string\" ? attrs.customKind.trim() : \"\";\n const summary =\n typeof attrs.preview === \"string\" && attrs.preview.trim()\n ? attrs.preview.trim()\n : undefined;\n return {\n kind,\n customKind,\n href,\n workspaceId,\n targetId,\n name,\n summary\n };\n }\n if (kind === \"workspace-issue\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const targetId = typeof attrs.targetId === \"string\" ? attrs.targetId : \"\";\n const topicId =\n typeof attrs.topicId === \"string\" && attrs.topicId.trim()\n ? attrs.topicId.trim()\n : undefined;\n return {\n kind,\n href,\n workspaceId,\n targetId,\n topicId,\n name,\n title:\n typeof attrs.title === \"string\" && attrs.title.trim()\n ? attrs.title\n : name,\n creatorName:\n typeof attrs.creatorName === \"string\" ? attrs.creatorName : undefined,\n status: typeof attrs.status === \"string\" ? attrs.status : undefined,\n contentPreview:\n typeof attrs.contentPreview === \"string\"\n ? attrs.contentPreview\n : undefined\n };\n }\n if (kind === \"workspace-app\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const appId =\n typeof attrs.appId === \"string\" && attrs.appId.trim()\n ? attrs.appId.trim()\n : typeof attrs.targetId === \"string\"\n ? attrs.targetId.trim()\n : \"\";\n return {\n kind,\n href,\n workspaceId,\n targetId: appId,\n appId,\n name,\n description:\n typeof attrs.description === \"string\" ? attrs.description : undefined,\n iconUrl:\n typeof attrs.iconUrl === \"string\" && attrs.iconUrl.trim()\n ? attrs.iconUrl.trim()\n : undefined\n };\n }\n if (kind === \"agent-target\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const targetId = typeof attrs.targetId === \"string\" ? attrs.targetId : \"\";\n return {\n kind,\n href,\n workspaceId,\n targetId,\n name,\n description:\n typeof attrs.description === \"string\" ? attrs.description : undefined,\n agentProviderId:\n typeof attrs.agentProviderId === \"string\" &&\n attrs.agentProviderId.trim()\n ? attrs.agentProviderId.trim()\n : undefined,\n iconUrl:\n typeof attrs.iconUrl === \"string\" && attrs.iconUrl.trim()\n ? attrs.iconUrl.trim()\n : undefined\n };\n }\n if (kind === \"workspace-reference\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const targetId =\n typeof attrs.targetId === \"string\" ? attrs.targetId.trim() : \"\";\n const source: AgentMentionReferenceSource =\n attrs.source === \"task\" ? \"task\" : \"app\";\n const groupId =\n typeof attrs.groupId === \"string\" && attrs.groupId.trim()\n ? attrs.groupId.trim()\n : undefined;\n const iconUrl =\n typeof attrs.iconUrl === \"string\" && attrs.iconUrl.trim()\n ? attrs.iconUrl.trim()\n : undefined;\n const fileCount = parseMentionFileCount(attrs.fileCount);\n return {\n kind,\n href,\n workspaceId,\n targetId,\n source,\n groupId,\n name,\n iconUrl,\n fileCount\n };\n }\n if (kind === \"workspace-app-factory\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const jobId =\n typeof attrs.jobId === \"string\" && attrs.jobId.trim()\n ? attrs.jobId.trim()\n : typeof attrs.targetId === \"string\"\n ? attrs.targetId.trim()\n : \"\";\n const action =\n typeof attrs.action === \"string\" && attrs.action.trim()\n ? attrs.action.trim()\n : undefined;\n const contextPath =\n typeof attrs.contextPath === \"string\" && attrs.contextPath.trim()\n ? attrs.contextPath.trim()\n : undefined;\n return {\n kind,\n href,\n workspaceId,\n targetId: jobId,\n jobId,\n name,\n action,\n contextPath\n };\n }\n const path =\n typeof attrs.path === \"string\" && attrs.path.trim()\n ? attrs.path\n : typeof attrs.href === \"string\"\n ? attrs.href\n : \"\";\n return {\n kind: \"file\",\n href: href || path,\n path,\n name,\n entryKind: normalizeEntryKind(attrs.entryKind),\n directoryPath:\n typeof attrs.directoryPath === \"string\" && attrs.directoryPath.trim()\n ? attrs.directoryPath\n : dirnameFromPath(path),\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl({\n entryKind: normalizeEntryKind(attrs.entryKind),\n href: href || path,\n name,\n path,\n thumbnailUrl:\n typeof attrs.thumbnailUrl === \"string\" ? attrs.thumbnailUrl : undefined\n })\n };\n}\n\nfunction workspaceIdFromMentionAttrs(attrs: Record<string, unknown>): string {\n return typeof attrs.workspaceId === \"string\" ? attrs.workspaceId.trim() : \"\";\n}\n\nfunction parseAgentMentionHTMLElementAttrs(\n node: HTMLElement | string\n): Record<string, string> | false {\n if (typeof node === \"string\") {\n return false;\n }\n const href =\n node.getAttribute(\"data-agent-mention-href\") ||\n node.getAttribute(\"data-agent-link-href\") ||\n node.getAttribute(\"href\") ||\n \"\";\n const name =\n node.getAttribute(\"name\") ||\n (node.textContent ?? \"\").replace(/^@+/, \"\").trim();\n const parsedItem = href ? parseMentionItemFromHref({ name, href }) : null;\n const parsedAttrs = parsedItem ? mentionItemToAttrs(parsedItem) : {};\n const iconUrl = node.getAttribute(\"data-agent-mention-icon-url\") || \"\";\n const fileCount = node.getAttribute(\"data-agent-mention-file-count\") || \"\";\n return {\n ...parsedAttrs,\n name,\n kind:\n node.getAttribute(\"data-agent-mention-kind\") ||\n node.getAttribute(\"kind\") ||\n parsedAttrs.kind ||\n \"file\",\n href,\n ...(iconUrl ? { iconUrl } : {}),\n ...(fileCount ? { fileCount } : {})\n };\n}\n\nfunction normalizeMentionKind(value: unknown): AgentMentionKind {\n if (value === \"session\" || value === \"agent-session\") {\n return \"session\";\n }\n if (value === \"workspace-issue\") {\n return \"workspace-issue\";\n }\n if (value === \"workspace-app\") {\n return \"workspace-app\";\n }\n if (value === \"agent-target\") {\n return \"agent-target\";\n }\n if (value === \"workspace-reference\") {\n return \"workspace-reference\";\n }\n if (value === \"workspace-app-factory\") {\n return \"workspace-app-factory\";\n }\n if (value === \"custom\") {\n return \"custom\";\n }\n return \"file\";\n}\n\nfunction normalizeEntryKind(value: unknown): AgentFileMentionKind {\n return value === \"directory\" || value === \"file\" ? value : \"unknown\";\n}\n\nfunction mentionVisual(item: AgentContextMentionItem): {\n kindLabel: string;\n primary: string;\n} {\n if (item.kind === \"file\") {\n return {\n kindLabel: \"File\",\n primary: item.name\n };\n }\n if (item.kind === \"session\") {\n const visual = sessionMentionVisual(item);\n return {\n kindLabel: \"Session\",\n primary: `${visual.participant} ${visual.summary}`.trim()\n };\n }\n if (item.kind === \"workspace-app\") {\n return {\n kindLabel: \"App\",\n primary: item.name\n };\n }\n if (item.kind === \"agent-target\") {\n return {\n kindLabel: \"Agent\",\n primary: item.name\n };\n }\n if (item.kind === \"workspace-app-factory\") {\n return {\n kindLabel: \"App Factory\",\n primary: item.name\n };\n }\n if (item.kind === \"workspace-reference\") {\n return {\n kindLabel: \"Reference\",\n primary: item.name\n };\n }\n if (item.kind === \"custom\") {\n return {\n kindLabel: \"Reference\",\n primary: item.name\n };\n }\n return {\n kindLabel: \"Task\",\n primary: item.name\n };\n}\n\nfunction sessionMentionVisual(\n item: Extract<AgentContextMentionItem, { kind: \"session\" }>\n): {\n participant: string;\n summary: string;\n} {\n const initiatorName = item.initiatorName.trim();\n const agentName = item.agentName.trim();\n const title = normalizeAgentSessionMentionTitle(item.title);\n if (initiatorName && agentName) {\n const dottedTitle = parseDottedSessionMentionText(title);\n return {\n participant: `${initiatorName} & ${agentName}`,\n summary:\n dottedTitle?.summary ||\n (title && title !== item.name.trim()\n ? title\n : item.inputPreview?.trim() || \"\")\n };\n }\n\n const dottedName = parseDottedSessionMentionText(item.name);\n if (dottedName) {\n return {\n participant: dottedName.participant,\n summary: dottedName.summary\n };\n }\n\n return {\n participant: item.name.trim(),\n summary:\n title && title !== item.name.trim()\n ? title\n : item.inputPreview?.trim() || \"\"\n };\n}\n\nfunction parseDottedSessionMentionText(\n value: string\n): { participant: string; summary: string } | null {\n const parts = value\n .split(\"·\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (parts.length < 3) {\n return null;\n }\n return {\n participant: `${parts[0]} & ${parts[1]}`,\n summary: normalizeAgentSessionMentionTitle(parts.slice(2).join(\" \"))\n };\n}\n\nfunction dirnameFromPath(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n if (parts.length <= 1) {\n return path.startsWith(\"/\") ? \"/\" : \"\";\n }\n return `/${parts.slice(0, -1).join(\"/\")}`;\n}\n","import { useEffect, useState, type JSX, type MouseEvent } from \"react\";\nimport { NodeViewWrapper, type NodeViewProps } from \"@tiptap/react\";\nimport {\n MentionPill,\n TruncatingPillLabel\n} from \"@tutti-os/ui-system/components\";\nimport { CloseIcon } from \"@tutti-os/ui-system/icons\";\nimport { useTranslation } from \"../../../i18n/index\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../../shared/mentionFilePresentation\";\nimport { managedAgentRoundedIconUrl } from \"../../../shared/managedAgentIcons\";\nimport { getAgentCustomMentionKind } from \"../../../shared/agentCustomMentionKinds\";\nimport { AGENT_RICH_TEXT_CARET_ANCHOR } from \"./agentRichTextCaretAnchor\";\n\ntype AgentMentionNodeViewKind =\n | \"file\"\n | \"agent-target\"\n | \"session\"\n | \"workspace-app\"\n | \"workspace-reference\"\n | \"workspace-app-factory\"\n | \"workspace-issue\"\n | \"custom\";\n\nfunction parseFileCountAttr(value: unknown): number {\n const parsed =\n typeof value === \"string\" ? Number.parseInt(value.trim(), 10) : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;\n}\n\ninterface AgentMentionNodeViewModel {\n ariaLabel: string;\n /** 宿主注册的自定义 mention kind(kind === \"custom\" 专用)。 */\n customKind?: string;\n directoryPath: string;\n entryKind: string;\n href: string;\n iconUrl?: string;\n kind: AgentMentionNodeViewKind;\n label: string;\n summary?: string;\n thumbnailUrl?: string;\n /** 引用文件数量(workspace-reference 专用)。 */\n fileCount?: number;\n}\n\nfunction attrString(attrs: Record<string, unknown>, key: string): string {\n const value = attrs[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction normalizeKind(value: string): AgentMentionNodeViewKind {\n if (value === \"session\" || value === \"agent-session\") {\n return \"session\";\n }\n if (value === \"workspace-issue\") {\n return \"workspace-issue\";\n }\n if (value === \"workspace-app\") {\n return \"workspace-app\";\n }\n if (value === \"workspace-reference\") {\n return \"workspace-reference\";\n }\n if (value === \"workspace-app-factory\") {\n return \"workspace-app-factory\";\n }\n if (value === \"agent-target\") {\n return \"agent-target\";\n }\n if (value === \"custom\") {\n return \"custom\";\n }\n return \"file\";\n}\n\nfunction normalizeSessionTitle(value: string): string {\n const trimmed = value.trim();\n const withoutMentionPrefix = trimmed.replace(/^@+/, \"\").trim();\n return withoutMentionPrefix || trimmed;\n}\n\nfunction parseDottedSessionText(\n value: string\n): { participant: string; summary: string } | null {\n const parts = value\n .split(\"·\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (parts.length < 3) {\n return null;\n }\n return {\n participant: `${parts[0]} & ${parts[1]}`,\n summary: normalizeSessionTitle(parts.slice(2).join(\" \"))\n };\n}\n\nfunction sessionPresentation(attrs: Record<string, unknown>): {\n label: string;\n summary: string;\n} {\n const name = attrString(attrs, \"name\").trim();\n const initiatorName = attrString(attrs, \"initiatorName\").trim();\n const agentName = attrString(attrs, \"agentName\").trim();\n const title = normalizeSessionTitle(attrString(attrs, \"title\") || name);\n const inputPreview = attrString(attrs, \"inputPreview\").trim();\n\n if (initiatorName && agentName) {\n const dottedTitle = parseDottedSessionText(title);\n return {\n // i18n-check-ignore: Dynamic participant display names.\n label: `${initiatorName} & ${agentName}`,\n summary:\n dottedTitle?.summary || (title && title !== name ? title : inputPreview)\n };\n }\n\n const dottedName = parseDottedSessionText(name);\n if (dottedName) {\n return {\n label: dottedName.participant,\n summary: dottedName.summary\n };\n }\n\n return {\n label: name,\n summary: title && title !== name ? title : inputPreview\n };\n}\n\nfunction dirnameFromPath(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n if (parts.length <= 1) {\n return path.startsWith(\"/\") ? \"/\" : \"\";\n }\n return `/${parts.slice(0, -1).join(\"/\")}`;\n}\n\nfunction mentionViewModel(\n attrs: Record<string, unknown>,\n t: (key: string) => string\n): AgentMentionNodeViewModel {\n const kind = normalizeKind(attrString(attrs, \"kind\"));\n const name = attrString(attrs, \"name\");\n const href = attrString(attrs, \"href\");\n\n if (kind === \"session\") {\n const presentation = sessionPresentation(attrs);\n const primary = `${presentation.label} ${presentation.summary}`.trim();\n return {\n ariaLabel:\n `${t(\"agentHost.agentGui.mentionKindSession\")} ${primary}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href,\n kind,\n label: presentation.label,\n summary: presentation.summary\n };\n }\n\n if (kind === \"workspace-issue\") {\n return {\n ariaLabel: `${t(\"agentHost.agentGui.mentionKindIssue\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href,\n kind,\n label: name\n };\n }\n\n if (kind === \"workspace-app\") {\n return {\n ariaLabel: `${t(\"agentHost.agentGui.mentionKindApp\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href,\n iconUrl: attrString(attrs, \"iconUrl\").trim() || undefined,\n kind,\n label: name\n };\n }\n\n if (kind === \"workspace-reference\") {\n return {\n ariaLabel: `${t(\"agentHost.agentGui.mentionKindApp\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href,\n iconUrl: attrString(attrs, \"iconUrl\").trim() || undefined,\n kind,\n label: name,\n fileCount: parseFileCountAttr(attrs.fileCount)\n };\n }\n\n if (kind === \"workspace-app-factory\") {\n return {\n ariaLabel:\n `${t(\"agentHost.agentGui.mentionKindAppFactory\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href,\n kind,\n label: name\n };\n }\n\n if (kind === \"agent-target\") {\n const agentProviderId = attrString(attrs, \"agentProviderId\").trim();\n return {\n ariaLabel: `${t(\"agentHost.agentGui.mentionKindAgent\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href,\n iconUrl:\n attrString(attrs, \"iconUrl\").trim() ||\n managedAgentRoundedIconUrl(agentProviderId),\n kind,\n label: name\n };\n }\n\n if (kind === \"custom\") {\n return {\n ariaLabel:\n `${t(\"agentHost.agentGui.mentionKindReference\")} ${name}`.trim(),\n customKind: attrString(attrs, \"customKind\").trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href,\n kind,\n label: name,\n summary: attrString(attrs, \"preview\").trim() || undefined\n };\n }\n\n const path = attrString(attrs, \"path\") || href;\n const entryKind = attrString(attrs, \"entryKind\") || \"unknown\";\n return {\n ariaLabel: name,\n directoryPath: attrString(attrs, \"directoryPath\") || dirnameFromPath(path),\n entryKind,\n href: href || path,\n kind,\n label: name,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl({\n entryKind,\n href: href || path,\n name,\n path,\n thumbnailUrl: attrString(attrs, \"thumbnailUrl\")\n })\n };\n}\n\nfunction fileVisualKind(entryKind: string, path: string): string {\n return resolveAgentMentionFileVisualKind({ entryKind, path });\n}\n\nfunction hasPromptContentAfterMentionRemoval(\n doc: NodeViewProps[\"editor\"][\"state\"][\"doc\"]\n): boolean {\n let hasContent = false;\n doc.descendants((node) => {\n if (hasContent) {\n return false;\n }\n if (node.type.name === \"agentFileMention\") {\n hasContent = true;\n return false;\n }\n if (\n node.isText &&\n node.textContent.replaceAll(AGENT_RICH_TEXT_CARET_ANCHOR, \"\").trim()\n .length > 0\n ) {\n hasContent = true;\n return false;\n }\n return true;\n });\n return hasContent;\n}\n\nfunction AgentMentionLegacyFileNodeView({\n deleteNode,\n editor,\n extension,\n node,\n selected\n}: NodeViewProps): JSX.Element {\n const mention = mentionViewModel(node.attrs ?? {}, () => \"\");\n const [isEditable, setIsEditable] = useState(editor.isEditable);\n const extensionOptions = extension.options as {\n removeActionAriaLabel?: string;\n };\n const removeActionAriaLabel =\n typeof extensionOptions.removeActionAriaLabel === \"string\"\n ? extensionOptions.removeActionAriaLabel\n : undefined;\n\n useEffect(() => {\n const syncEditable = () => {\n setIsEditable(editor.isEditable);\n };\n\n syncEditable();\n editor.on(\"transaction\", syncEditable);\n editor.on(\"update\", syncEditable);\n return () => {\n editor.off(\"transaction\", syncEditable);\n editor.off(\"update\", syncEditable);\n };\n }, [editor]);\n\n const handleRemove = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (!editor.isEditable) {\n return;\n }\n deleteNode();\n if (!hasPromptContentAfterMentionRemoval(editor.state.doc)) {\n editor.commands.clearContent();\n }\n };\n\n return (\n <NodeViewWrapper\n as=\"span\"\n aria-label={mention.ariaLabel}\n className={`agent-rich-text-mention-node group tsh-agent-object-token tsh-agent-object-token--file ${\n selected ? \"is-selected\" : \"\"\n }`}\n contentEditable={false}\n data-agent-file-directory-path={mention.directoryPath}\n data-agent-file-entry-kind={mention.entryKind}\n data-agent-file-mention=\"true\"\n {...(mention.thumbnailUrl\n ? {}\n : {\n \"data-agent-file-visual-kind\": fileVisualKind(\n mention.entryKind,\n mention.href || mention.label\n )\n })}\n data-agent-mention-href={mention.href}\n data-agent-mention-kind={mention.kind}\n {...(mention.thumbnailUrl\n ? { \"data-agent-mention-thumbnail-url\": mention.thumbnailUrl }\n : {})}\n >\n {mention.thumbnailUrl ? (\n <span\n className=\"agent-gui-node__mention-file-thumb relative\"\n data-agent-mention-file-thumb=\"true\"\n aria-hidden={isEditable ? undefined : true}\n >\n <img\n src={mention.thumbnailUrl}\n alt=\"\"\n className={`h-full w-full object-cover transition-opacity ${\n isEditable\n ? \"group-hover:opacity-0 group-focus-within:opacity-0\"\n : \"\"\n }`}\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n {isEditable ? (\n <button\n aria-label={removeActionAriaLabel}\n className=\"absolute left-1/2 top-1/2 inline-flex size-5 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-opacity hover:bg-transparency-block hover:text-[var(--text-primary)] focus-visible:opacity-100 group-hover:opacity-100\"\n type=\"button\"\n onMouseDown={handleRemove}\n >\n <CloseIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n ) : (\n <span\n className=\"relative grid size-4 shrink-0 place-items-center\"\n aria-hidden={isEditable ? undefined : true}\n >\n <span\n className={`tsh-agent-object-token__icon transition-opacity ${\n isEditable\n ? \"group-hover:opacity-0 group-focus-within:opacity-0\"\n : \"\"\n }`}\n aria-hidden=\"true\"\n />\n {isEditable ? (\n <button\n aria-label={removeActionAriaLabel}\n className=\"absolute left-1/2 top-1/2 inline-flex size-5 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-opacity hover:bg-transparency-block hover:text-[var(--text-primary)] focus-visible:opacity-100 group-hover:opacity-100\"\n type=\"button\"\n onMouseDown={handleRemove}\n >\n <CloseIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n )}\n <span className=\"tsh-agent-object-token__main\">{mention.label}</span>\n </NodeViewWrapper>\n );\n}\n\nexport function AgentMentionNodeView(props: NodeViewProps): JSX.Element {\n const { deleteNode, editor, extension, node, selected } = props;\n const { t } = useTranslation();\n const mention = mentionViewModel(node.attrs ?? {}, t);\n const [isEditable, setIsEditable] = useState(editor.isEditable);\n const extensionOptions = extension.options as {\n removeActionAriaLabel?: string;\n };\n const removeActionAriaLabel =\n typeof extensionOptions.removeActionAriaLabel === \"string\"\n ? extensionOptions.removeActionAriaLabel\n : undefined;\n\n useEffect(() => {\n const syncEditable = () => {\n setIsEditable(editor.isEditable);\n };\n\n syncEditable();\n editor.on(\"transaction\", syncEditable);\n editor.on(\"update\", syncEditable);\n return () => {\n editor.off(\"transaction\", syncEditable);\n editor.off(\"update\", syncEditable);\n };\n }, [editor]);\n\n const handleRemove = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (!editor.isEditable) {\n return;\n }\n deleteNode();\n if (!hasPromptContentAfterMentionRemoval(editor.state.doc)) {\n editor.commands.clearContent();\n }\n };\n\n if (mention.kind === \"file\") {\n return <AgentMentionLegacyFileNodeView {...props} />;\n }\n\n if (\n mention.kind === \"workspace-app\" ||\n mention.kind === \"workspace-reference\" ||\n mention.kind === \"agent-target\"\n ) {\n return (\n <NodeViewWrapper\n as=\"span\"\n aria-label={mention.ariaLabel}\n className={`agent-rich-text-mention-node inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] align-middle ${\n selected ? \"is-selected\" : \"\"\n }`}\n contentEditable={false}\n data-agent-file-mention=\"true\"\n data-agent-mention-href={mention.href}\n data-agent-mention-icon-url={mention.iconUrl}\n data-agent-mention-kind={mention.kind}\n >\n <span\n className=\"group relative top-0 inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] cursor-pointer items-center gap-1 overflow-hidden rounded-[4px] border border-transparent bg-transparent px-1 py-0 align-middle text-[13px] font-medium leading-6 text-[var(--agent-gui-mention-app-color,var(--tutti-purple))] no-underline transition-colors hover:border-transparent hover:bg-[color-mix(in_srgb,currentColor_12%,transparent)]\"\n data-agent-mention-kind={mention.kind}\n data-slot=\"mention-pill\"\n >\n <span\n aria-hidden={isEditable ? undefined : true}\n className=\"relative grid size-4 shrink-0 place-items-center overflow-hidden rounded-[4px] bg-block\"\n data-agent-mention-app-icon=\"true\"\n data-workspace-app-icon=\"true\"\n >\n {mention.iconUrl ? (\n <img\n src={mention.iconUrl}\n alt=\"\"\n className={`size-full object-cover transition-opacity ${\n isEditable\n ? \"group-hover:opacity-0 group-focus-within:opacity-0\"\n : \"\"\n }`}\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n ) : (\n <span\n className={`tsh-agent-object-token__kind-icon size-4 transition-opacity ${\n isEditable\n ? \"group-hover:opacity-0 group-focus-within:opacity-0\"\n : \"\"\n }`}\n />\n )}\n {isEditable ? (\n <button\n aria-label={removeActionAriaLabel}\n className=\"absolute left-1/2 top-1/2 inline-flex size-5 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-opacity hover:bg-transparency-block hover:text-[var(--text-primary)] focus-visible:opacity-100 group-hover:opacity-100\"\n type=\"button\"\n onMouseDown={handleRemove}\n >\n <CloseIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n <TruncatingPillLabel tooltip={mention.label}>\n {mention.label}\n </TruncatingPillLabel>\n </span>\n </NodeViewWrapper>\n );\n }\n\n if (mention.kind === \"custom\") {\n // 宿主注册的自定义 mention:优先用注册的 renderChip,缺省用通用双行卡\n // (第一行 name,第二行 summary)。点击经编辑器的 link click 委托\n // (data-agent-mention-href)上抛 onLinkAction,由宿主二次解析 href。\n const definition = getAgentCustomMentionKind(mention.customKind ?? \"\");\n const removeAction = isEditable ? (\n <button\n aria-label={removeActionAriaLabel}\n className=\"inline-flex size-4 shrink-0 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-opacity hover:bg-transparency-block hover:text-[var(--text-primary)] focus-visible:opacity-100 group-hover:opacity-100\"\n type=\"button\"\n onMouseDown={handleRemove}\n >\n <CloseIcon className=\"size-3.5\" />\n </button>\n ) : null;\n if (definition?.renderChip) {\n return (\n <NodeViewWrapper\n as=\"span\"\n aria-label={mention.ariaLabel}\n className={`agent-rich-text-mention-node inline-grid max-w-[min(100%,var(--agent-mention-max-width,20rem))] align-middle ${\n selected ? \"is-selected\" : \"\"\n }`}\n contentEditable={false}\n data-agent-file-mention=\"true\"\n data-agent-mention-href={mention.href}\n data-agent-mention-kind={mention.customKind || mention.kind}\n >\n {definition.renderChip({\n href: mention.href,\n name: mention.label,\n summary: mention.summary,\n isEditable,\n removeAction\n })}\n </NodeViewWrapper>\n );\n }\n return (\n <NodeViewWrapper\n as=\"span\"\n aria-label={mention.ariaLabel}\n className={`agent-rich-text-mention-node inline-grid max-w-[min(100%,var(--agent-mention-max-width,20rem))] align-middle ${\n selected ? \"is-selected\" : \"\"\n }`}\n contentEditable={false}\n data-agent-file-mention=\"true\"\n data-agent-mention-href={mention.href}\n data-agent-mention-kind={mention.customKind || mention.kind}\n >\n <span\n className=\"group relative grid max-w-full cursor-pointer gap-0.5 overflow-hidden rounded-[8px] border border-[var(--border-primary,rgba(0,0,0,0.08))] bg-block px-2.5 py-1.5 text-left align-middle\"\n data-slot=\"mention-card\"\n >\n <span className=\"flex min-w-0 items-center gap-1\">\n <span\n aria-hidden=\"true\"\n className=\"tsh-agent-object-token__kind-icon size-3.5 shrink-0\"\n />\n <span className=\"truncate text-[13px] font-medium leading-[130%]\">\n {mention.label}\n </span>\n {removeAction}\n </span>\n {mention.summary ? (\n <span className=\"truncate text-[12px] font-normal leading-[130%] text-[var(--text-tertiary)]\">\n {mention.summary}\n </span>\n ) : null}\n </span>\n </NodeViewWrapper>\n );\n }\n\n return (\n <NodeViewWrapper\n as=\"span\"\n className={`agent-rich-text-mention-node inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] align-middle ${\n selected ? \"is-selected\" : \"\"\n }`}\n contentEditable={false}\n >\n <MentionPill\n aria-label={mention.ariaLabel}\n className=\"top-0 h-6 py-0 align-middle leading-6\"\n data-agent-mention-href={mention.href}\n data-agent-mention-kind={mention.kind}\n kind={mention.kind === \"session\" ? \"session\" : \"issue\"}\n label={mention.label}\n removable={isEditable}\n removeButtonProps={\n isEditable\n ? {\n \"aria-label\": removeActionAriaLabel,\n onMouseDown: handleRemove\n }\n : undefined\n }\n summary={mention.summary}\n />\n </NodeViewWrapper>\n );\n}\n","export const AGENT_RICH_TEXT_CARET_ANCHOR = \"\\u200B\";\n"],"mappings":"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","names":["dirnameFromPath"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../shared/agentCustomMentionKinds.ts","../agentActivityRuntime.tsx","../agentActivityHost.tsx","../host/agentHostApi.ts","../shared/managedAgentIcons.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n// 自定义 mention kind 注册表:让宿主(如 tsh)从外部注册 mention://<kind>/... 链接的\n// 解析与 composer 内 chip 渲染,包内不内置任何具体业务 kind。\n//\n// 管线接点:\n// - 解析:agentFileMentionExtension.parseMentionItemFromHref 命中注册 kind 时产出\n// AgentMentionCustomItem(展示字段由 present() 提取;href 是完整信息源,round-trip 无损)\n// - 渲染:AgentMentionNodeView 对 kind===\"custom\" 调 renderChip(),缺省用包内通用双行卡\n// - 点击:clickable 的 kind 经 resolveWorkspaceMentionLinkAction 上抛\n// open-custom-mention 链接动作(携带原始 href,宿主自行二次解析)\n//\n// 注册时机:宿主渲染进程 bootstrap(早于首个 composer 挂载);模块级单例,重复注册以\n// 后者为准(HMR 友好)。\n\nexport interface AgentCustomMentionIdentity {\n entityId: string;\n label: string;\n scope?: Readonly<Record<string, string>>;\n}\n\nexport interface AgentCustomMentionPresentation {\n /** chip 第一行(缺省用链接 label)。 */\n name: string;\n /** chip 第二行(可选,通用双行卡的次要文案)。 */\n summary?: string;\n /** 所属 workspace(可选;custom kind 的 scope 键由注册方约定)。 */\n workspaceId?: string;\n}\n\nexport interface AgentCustomMentionChipContext {\n href: string;\n name: string;\n summary?: string;\n isEditable: boolean;\n /** 可编辑态的移除按钮,由 NodeView 注入;自定义渲染需自行摆放。 */\n removeAction?: ReactNode;\n}\n\nexport interface AgentCustomMentionKindDefinition {\n /** mention://<kind>/... 的 providerId(URL hostname,小写)。 */\n kind: string;\n /**\n * 从 canonical mention 链接提取展示字段;返回 null 表示链接无效,\n * 退化为普通链接/字面文本。\n */\n present(\n mention: AgentCustomMentionIdentity,\n href: string\n ): AgentCustomMentionPresentation | null;\n /** 自定义 chip 渲染;缺省用包内通用双行卡(name + summary)。 */\n renderChip?(context: AgentCustomMentionChipContext): ReactNode;\n /** 点击是否上抛 open-custom-mention 链接动作;缺省 false(chip 只展示)。 */\n clickable?: boolean;\n}\n\nconst registry = new Map<string, AgentCustomMentionKindDefinition>();\n\n// 包内管线已内置处理的 providerId(agentFileMentionExtension /\n// resolveWorkspaceMentionLinkAction),以及宿主侧沿用的 legacy 短名与内部 kind。\n// 注册表查找在部分链路先于内置分支执行,若放行同名注册会静默劫持内置 mention\n// 的解析——注册发生在宿主 bootstrap,直接抛错 fail-fast。\nconst RESERVED_AGENT_MENTION_PROVIDER_IDS = new Set([\n \"agent-session\",\n \"agent-target\",\n \"custom\",\n \"file\",\n \"issue\",\n \"session\",\n \"task\",\n \"workspace-app\",\n \"workspace-app-factory\",\n \"workspace-issue\",\n \"workspace-reference\"\n]);\n\nexport function registerAgentCustomMentionKind(\n definition: AgentCustomMentionKindDefinition\n): void {\n const kind = definition.kind.trim().toLowerCase();\n if (!kind) {\n throw new Error(\n \"[agent-gui] custom mention kind must be a non-empty provider id\"\n );\n }\n if (RESERVED_AGENT_MENTION_PROVIDER_IDS.has(kind)) {\n throw new Error(\n `[agent-gui] custom mention kind \"${kind}\" collides with a built-in provider id`\n );\n }\n registry.set(kind, definition);\n}\n\nexport function getAgentCustomMentionKind(\n kind: string\n): AgentCustomMentionKindDefinition | undefined {\n return registry.get(kind.trim().toLowerCase());\n}\n\nexport function resetAgentCustomMentionKindsForTests(): void {\n registry.clear();\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useSyncExternalStore,\n type JSX,\n type PropsWithChildren\n} from \"react\";\nimport type {\n AgentActivityCancelSessionInput,\n AgentActivityCancelSessionResult,\n AgentActivityGoalControlInput,\n AgentActivityGoalControlResult,\n AgentActivityCreateSessionInput,\n AgentActivityDeleteSessionInput,\n AgentActivityDeleteSessionResult,\n AgentActivityMessageOrder,\n AgentActivityMessagePage,\n AgentActivitySendInput,\n AgentActivitySendInputResult,\n AgentActivitySession,\n AgentActivitySnapshot,\n AgentActivitySnapshotListener,\n AgentActivitySubmitInteractiveInput\n} from \"@tutti-os/agent-activity-core\";\nimport type {\n AgentHostAgentSessionComposerSettings,\n AgentHostActivateAgentSessionResult,\n AgentHostRuntimeOpenclawGatewayWarmupResult,\n AgentHostUpdateAgentSessionSettingsResult,\n AgentHostUnactivateAgentSessionResult,\n AgentHostAgentSessionState\n} from \"./shared/contracts/dto\";\nimport { WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN } from \"./shared/workspaceAgentActivityTypes\";\n\nexport interface AgentActivityRuntimeListSessionMessagesInput {\n afterVersion?: number;\n beforeVersion?: number;\n cache?: boolean;\n agentSessionId: string;\n limit?: number;\n order?: AgentActivityMessageOrder;\n signal?: AbortSignal;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeListGeneratedFilesInput {\n limit?: number;\n query?: string;\n sessionCwd?: string;\n signal?: AbortSignal;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeListSessionsPageInput {\n limit?: number;\n searchQuery?: string;\n signal?: AbortSignal;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeSessionPageResult {\n hasMore: boolean;\n nextCursor?: string;\n sessions: AgentActivitySession[];\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeListSessionSectionsInput {\n agentTargetId?: string | null;\n limitPerSection?: number;\n signal?: AbortSignal;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeListSessionSectionPageInput {\n agentTargetId?: string | null;\n cursor?: string;\n limit?: number;\n sectionKey: string;\n signal?: AbortSignal;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeUserProject {\n createdAtUnixMs: number;\n id: string;\n label: string;\n lastUsedAtUnixMs?: number;\n path: string;\n sectionKey: string;\n updatedAtUnixMs: number;\n}\n\nexport interface AgentActivityRuntimeSessionSection {\n kind: \"conversations\" | \"project\";\n sectionKey: string;\n userProject?: AgentActivityRuntimeUserProject;\n sessions: AgentActivitySession[];\n hasMore: boolean;\n nextCursor?: string;\n}\n\nexport interface AgentActivityRuntimeSessionSectionsResult {\n sections: AgentActivityRuntimeSessionSection[];\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeGeneratedFile {\n label: string;\n path: string;\n}\n\nexport interface AgentActivityRuntimeGeneratedFileList {\n entries: AgentActivityRuntimeGeneratedFile[];\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeEnsureSessionSynchronizedInput {\n afterVersion?: number;\n agentSessionId: string;\n onError?: (error: unknown) => void;\n workspaceId: string;\n}\n\nexport type AgentActivityRuntimeRetainSessionEventsInput =\n AgentActivityRuntimeEnsureSessionSynchronizedInput;\n\nexport interface AgentActivityRuntimeSetSessionPinnedInput {\n agentSessionId: string;\n pinned: boolean;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeTrackSettingsProjectChangeInput {\n action: \"clear\" | \"create_new\" | \"select_existing\";\n agentSessionId: string;\n provider?: string | null;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeGetSessionControlStateInput {\n agentSessionId: string;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeGetComposerOptionsInput {\n agentTargetId?: string | null;\n cwd?: string | null;\n force?: boolean;\n provider?: string;\n settings?: AgentHostAgentSessionComposerSettings | null;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeUpdateSessionSettingsInput {\n agentSessionId: string;\n settings: AgentHostAgentSessionComposerSettings;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeTrackDraftComposerSettingsChangeInput {\n nextSettings: AgentHostAgentSessionComposerSettings;\n previousSettings: AgentHostAgentSessionComposerSettings;\n provider: string;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeWarmupOpenclawGatewayInput {\n workspaceId?: string | null;\n}\n\nexport interface AgentActivityRuntimeDiagnosticInput {\n details?: Record<string, unknown>;\n event: string;\n level?: \"debug\" | \"info\" | \"warn\" | \"error\";\n source?: string;\n workspaceId?: string | null;\n}\n\ninterface AgentActivityRuntimeActivateSessionInputBase {\n agentSessionId: string;\n cwd?: string;\n initialContent?: AgentActivitySendInput[\"content\"];\n /** 仅展示用首轮文本(bundle 折叠成一个 chip);initialContent 仍带展开后的文件。 */\n initialDisplayPrompt?: string | null;\n metadata?: Record<string, unknown>;\n openclawGatewayReady?: boolean;\n settings?: AgentHostAgentSessionComposerSettings;\n title?: string;\n visible?: boolean;\n workspaceId: string;\n}\n\nexport type AgentActivityRuntimeActivateSessionInput =\n | (AgentActivityRuntimeActivateSessionInputBase & {\n agentTargetId: string;\n mode: \"new\";\n })\n | (AgentActivityRuntimeActivateSessionInputBase & {\n agentTargetId?: string | null;\n mode: \"existing\";\n });\n\nexport interface AgentActivityRuntimeUnactivateSessionInput {\n agentSessionId: string;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeReadSessionAttachmentInput {\n agentSessionId: string;\n attachmentId: string;\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeReadPromptAssetInput {\n agentSessionId?: string | null;\n assetId?: string | null;\n hostPath?: string | null;\n kind?: string | null;\n mimeType: string;\n name?: string | null;\n path?: string | null;\n sha256?: string | null;\n uploadStatus?: string | null;\n uri?: string | null;\n workspaceId: string;\n}\n\nexport type AgentActivityRuntimePromptContentBlock =\n AgentActivitySendInput[\"content\"][number] & {\n assetId?: string;\n hostPath?: string;\n kind?: string;\n path?: string;\n sizeBytes?: number;\n uploadStatus?: string;\n uri?: string;\n };\n\nexport interface AgentActivityRuntimeUploadPromptContentInput {\n content: AgentActivityRuntimePromptContentBlock[];\n workspaceId: string;\n}\n\nexport interface AgentActivityRuntimeUploadPromptContentResult {\n content: AgentActivityRuntimePromptContentBlock[];\n}\n\nexport interface AgentActivityRuntimeSessionAttachment {\n attachmentId: string;\n mimeType: string;\n name?: string;\n data: string;\n}\n\nexport interface AgentActivityRuntimePromptAsset {\n assetId?: string;\n hostPath?: string;\n kind?: string;\n mimeType: string;\n name?: string;\n path: string;\n uploadStatus?: string;\n uri?: string;\n data: string;\n}\n\nexport interface AgentActivityRuntime {\n /**\n * Stable identity of this runtime instance (e.g. a local origin vs a\n * shared/room origin). When present, the conversation-list and session-view\n * stores key their query state, runtime resolution, and subscriptions by this\n * value, so multiple runtimes can coexist for the same workspace without\n * fighting over a single module-global slot. Absent => legacy single-runtime\n * behaviour resolved via the module-global.\n */\n origin?: string;\n /**\n * The session cwd is not resolvable on the local filesystem (e.g. a\n * shared/cloud sandbox not mounted locally), so AgentGUI must not run its\n * local stat-based \"working directory missing\" existence check — it would\n * always false-positive. Absent/false (default) => local, legacy behaviour.\n * Only that one guard is gated; project selection/listing is unaffected.\n */\n projectPathIsRemote?: boolean;\n promptContentUploadSupport?: {\n file?: boolean;\n image?: boolean;\n };\n cancelSession(\n input: AgentActivityCancelSessionInput\n ): Promise<AgentActivityCancelSessionResult>;\n goalControl(\n input: AgentActivityGoalControlInput\n ): Promise<AgentActivityGoalControlResult>;\n createSession(\n input: AgentActivityCreateSessionInput\n ): Promise<AgentActivitySession>;\n deleteSession(\n input: AgentActivityDeleteSessionInput\n ): Promise<AgentActivityDeleteSessionResult>;\n activateSession(\n input: AgentActivityRuntimeActivateSessionInput\n ): Promise<AgentHostActivateAgentSessionResult>;\n getSession(\n workspaceId: string,\n agentSessionId: string\n ): Promise<AgentActivitySession>;\n getComposerOptions(\n input: AgentActivityRuntimeGetComposerOptionsInput\n ): Promise<unknown>;\n updateSessionSettings(\n input: AgentActivityRuntimeUpdateSessionSettingsInput\n ): Promise<AgentHostUpdateAgentSessionSettingsResult>;\n warmupOpenclawGateway?(\n input?: AgentActivityRuntimeWarmupOpenclawGatewayInput\n ): Promise<AgentHostRuntimeOpenclawGatewayWarmupResult>;\n getSessionControlState(\n input: AgentActivityRuntimeGetSessionControlStateInput\n ): Promise<AgentHostAgentSessionState>;\n getSnapshot(workspaceId: string): AgentActivitySnapshot;\n listSessionMessages(\n input: AgentActivityRuntimeListSessionMessagesInput\n ): Promise<AgentActivityMessagePage>;\n listAgentGeneratedFiles?(\n input: AgentActivityRuntimeListGeneratedFilesInput\n ): Promise<AgentActivityRuntimeGeneratedFileList>;\n listSessionsPage?(\n input: AgentActivityRuntimeListSessionsPageInput\n ): Promise<AgentActivityRuntimeSessionPageResult>;\n listSessionSections?(\n input: AgentActivityRuntimeListSessionSectionsInput\n ): Promise<AgentActivityRuntimeSessionSectionsResult>;\n listSessionSectionPage?(\n input: AgentActivityRuntimeListSessionSectionPageInput\n ): Promise<AgentActivityRuntimeSessionSection>;\n load(\n workspaceId: string,\n signal?: AbortSignal\n ): Promise<AgentActivitySnapshot>;\n ensureSessionSynchronized?(\n input: AgentActivityRuntimeEnsureSessionSynchronizedInput\n ): () => void;\n /** @deprecated Use ensureSessionSynchronized. */\n retainSessionEvents(\n input: AgentActivityRuntimeRetainSessionEventsInput\n ): () => void;\n sendInput(\n input: AgentActivitySendInput\n ): Promise<AgentActivitySendInputResult>;\n uploadPromptContent?(\n input: AgentActivityRuntimeUploadPromptContentInput\n ): Promise<AgentActivityRuntimeUploadPromptContentResult>;\n readSessionAttachment?(\n input: AgentActivityRuntimeReadSessionAttachmentInput\n ): Promise<AgentActivityRuntimeSessionAttachment>;\n readPromptAsset?(\n input: AgentActivityRuntimeReadPromptAssetInput\n ): Promise<AgentActivityRuntimePromptAsset>;\n setSessionPinned(\n input: AgentActivityRuntimeSetSessionPinnedInput\n ): Promise<AgentActivitySession>;\n trackSettingsProjectChange?(\n input: AgentActivityRuntimeTrackSettingsProjectChangeInput\n ): Promise<void>;\n trackDraftComposerSettingsChange?(\n input: AgentActivityRuntimeTrackDraftComposerSettingsChangeInput\n ): Promise<void>;\n reportDiagnostic?(\n input: AgentActivityRuntimeDiagnosticInput\n ): Promise<void> | void;\n unactivateSession(\n input: AgentActivityRuntimeUnactivateSessionInput\n ): Promise<AgentHostUnactivateAgentSessionResult>;\n submitInteractive(\n input: AgentActivitySubmitInteractiveInput\n ): Promise<unknown>;\n subscribeSessionEvents(\n workspaceId: string,\n listener: (event: unknown) => void\n ): () => void;\n subscribe(\n workspaceId: string,\n listener: AgentActivitySnapshotListener\n ): () => void;\n}\n\nconst AgentActivityRuntimeContext = createContext<AgentActivityRuntime | null>(\n null\n);\n\nlet currentAgentActivityRuntime: AgentActivityRuntime | null = null;\n\n// Registry of runtimes indexed by their stable `origin`. Non-React module\n// singletons (the conversation-list and session-view stores) resolve the\n// correct runtime for a query's origin from here instead of reading the\n// last-mounted module-global — the single slot two runtimes used to fight over.\nconst runtimesByOrigin = new Map<string, AgentActivityRuntime>();\n\n// A runtime without an explicit origin is the default (local) runtime. It\n// registers under this canonical origin — the same value the conversation-list\n// query and session-view refs fall back to — so the local window resolves to it\n// by origin instead of depending on the last-mounted module-global. A shared/\n// room runtime opts in by setting a distinct `origin`; no host wiring needed for\n// the local case.\nfunction normalizeRuntimeOrigin(origin: string | null | undefined): string {\n return origin?.trim() || WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN;\n}\n\nexport interface AgentActivityRuntimeProviderProps extends PropsWithChildren {\n runtime?: AgentActivityRuntime | null;\n}\n\nexport function AgentActivityRuntimeProvider({\n children,\n runtime\n}: AgentActivityRuntimeProviderProps): JSX.Element {\n currentAgentActivityRuntime = runtime ?? null;\n const origin = normalizeRuntimeOrigin(runtime?.origin);\n // Register during render to close the gap before the effect runs (parity with\n // the module-global write above); the effect owns cleanup on unmount.\n if (origin && runtime) {\n runtimesByOrigin.set(origin, runtime);\n }\n useEffect(() => {\n if (!origin || !runtime) {\n return;\n }\n runtimesByOrigin.set(origin, runtime);\n return () => {\n // Only clear if a newer provider hasn't already re-registered this origin.\n if (runtimesByOrigin.get(origin) === runtime) {\n runtimesByOrigin.delete(origin);\n }\n };\n }, [origin, runtime]);\n return (\n <AgentActivityRuntimeContext.Provider value={runtime ?? null}>\n {children}\n </AgentActivityRuntimeContext.Provider>\n );\n}\n\nexport function useAgentActivityRuntime(): AgentActivityRuntime {\n const runtime =\n useContext(AgentActivityRuntimeContext) ?? getTestAgentActivityRuntime();\n if (!runtime) {\n throw new Error(\n \"AgentActivityRuntimeProvider is missing an AgentActivityRuntime instance.\"\n );\n }\n return runtime;\n}\n\nexport function useOptionalAgentActivityRuntime(): AgentActivityRuntime | null {\n return (\n useContext(AgentActivityRuntimeContext) ?? getTestAgentActivityRuntime()\n );\n}\n\nexport function useAgentActivitySnapshot(\n workspaceId: string\n): AgentActivitySnapshot {\n const runtime = useAgentActivityRuntime();\n const normalizedWorkspaceId = workspaceId.trim();\n return useSyncExternalStore(\n (listener) => runtime.subscribe(normalizedWorkspaceId, listener),\n () => runtime.getSnapshot(normalizedWorkspaceId),\n () => runtime.getSnapshot(normalizedWorkspaceId)\n );\n}\n\nexport function getAgentActivityRuntime(): AgentActivityRuntime {\n const runtime =\n getExplicitWindowTestAgentActivityRuntime() ??\n currentAgentActivityRuntime ??\n getTestAgentActivityRuntime();\n if (!runtime) {\n throw new Error(\n \"AgentActivityRuntimeProvider is missing an AgentActivityRuntime instance.\"\n );\n }\n return runtime;\n}\n\nexport function getOptionalAgentActivityRuntime(): AgentActivityRuntime | null {\n return (\n getExplicitWindowTestAgentActivityRuntime() ??\n currentAgentActivityRuntime ??\n getTestAgentActivityRuntime()\n );\n}\n\n/**\n * Resolve the runtime for a given origin. When the origin is registered (two\n * runtimes coexisting for one workspace), returns that exact instance.\n *\n * Only the default (local) origin falls back to legacy single-runtime\n * resolution. An explicit non-default origin that is not registered returns null\n * rather than cross-routing to a different runtime via the module-global slot —\n * e.g. a shared query must never silently load from the local runtime.\n */\nexport function getAgentActivityRuntimeByOrigin(\n origin: string | null | undefined\n): AgentActivityRuntime | null {\n const normalizedOrigin = normalizeRuntimeOrigin(origin);\n const runtime = runtimesByOrigin.get(normalizedOrigin);\n if (runtime) {\n return runtime;\n }\n if (normalizedOrigin === WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN) {\n return getOptionalAgentActivityRuntime();\n }\n return null;\n}\n\nexport function resetAgentActivityRuntimeForTests(): void {\n if (process.env.NODE_ENV === \"test\") {\n currentAgentActivityRuntime = null;\n runtimesByOrigin.clear();\n }\n}\n\nexport function setAgentActivityRuntimeForTests(\n runtime: AgentActivityRuntime | null\n): void {\n if (process.env.NODE_ENV === \"test\") {\n currentAgentActivityRuntime = runtime;\n }\n}\n\nfunction getTestAgentActivityRuntime(): AgentActivityRuntime | null {\n if (process.env.NODE_ENV !== \"test\") {\n return null;\n }\n if (typeof window === \"undefined\") {\n return null;\n }\n const explicitRuntime = getExplicitWindowTestAgentActivityRuntime();\n if (explicitRuntime) {\n return explicitRuntime;\n }\n if (currentAgentActivityRuntime) {\n return currentAgentActivityRuntime;\n }\n const testRuntime = (\n window as unknown as Window & {\n agentActivityRuntime?: AgentActivityRuntime;\n }\n ).agentActivityRuntime;\n return testRuntime ?? null;\n}\n\nfunction getExplicitWindowTestAgentActivityRuntime(): AgentActivityRuntime | null {\n if (process.env.NODE_ENV !== \"test\" || typeof window === \"undefined\") {\n return null;\n }\n const testDescriptor = Object.getOwnPropertyDescriptor(\n window,\n \"agentActivityRuntime\"\n );\n if (!testDescriptor || !(\"value\" in testDescriptor)) {\n return null;\n }\n return (testDescriptor.value as AgentActivityRuntime | undefined) ?? null;\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n type JSX,\n type PropsWithChildren\n} from \"react\";\nimport {\n toAgentHostRuntimeApi,\n type AgentHostInputApi,\n type AgentHostRuntimeApi\n} from \"./host/agentHostApi\";\nimport {\n AgentActivityRuntimeProvider,\n type AgentActivityRuntime\n} from \"./agentActivityRuntime\";\nimport { WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN } from \"./shared/workspaceAgentActivityTypes\";\n\nconst AgentActivityHostContext = createContext<AgentHostRuntimeApi | null>(\n null\n);\n\nlet currentAgentHostApi: AgentHostRuntimeApi | null = null;\n\n// Host APIs indexed by their runtime origin, mirroring the runtime registry.\n// Read-state persistence resolves the host API by the query's origin so a\n// local window persists to the local host and a shared/cloud window persists to\n// its own cloud host — each backend keyed by (roomId, userId) with no origin\n// needed on the record itself.\nconst hostApiByOrigin = new Map<string, AgentHostRuntimeApi>();\n\nfunction resolveHostOrigin(\n runtime: AgentActivityRuntime | null | undefined\n): string {\n return (\n runtime?.origin?.trim() || WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN\n );\n}\n\nexport interface AgentActivityHostProviderProps extends PropsWithChildren {\n agentActivityRuntime?: AgentActivityRuntime | null;\n agentHostApi?: AgentHostInputApi | null;\n}\n\nexport function AgentActivityHostProvider({\n agentActivityRuntime,\n agentHostApi,\n children\n}: AgentActivityHostProviderProps): JSX.Element {\n const resolvedAgentHostApi = useMemo(\n () => (agentHostApi ? toAgentHostRuntimeApi(agentHostApi) : null),\n [agentHostApi]\n );\n currentAgentHostApi = resolvedAgentHostApi;\n const origin = resolveHostOrigin(agentActivityRuntime);\n // Register during render to close the gap before the effect runs; the effect\n // owns cleanup on unmount.\n if (resolvedAgentHostApi) {\n hostApiByOrigin.set(origin, resolvedAgentHostApi);\n }\n useEffect(() => {\n if (!resolvedAgentHostApi) {\n return;\n }\n hostApiByOrigin.set(origin, resolvedAgentHostApi);\n return () => {\n if (hostApiByOrigin.get(origin) === resolvedAgentHostApi) {\n hostApiByOrigin.delete(origin);\n }\n };\n }, [origin, resolvedAgentHostApi]);\n return (\n <AgentActivityRuntimeProvider runtime={agentActivityRuntime}>\n <AgentActivityHostContext.Provider value={resolvedAgentHostApi}>\n {children}\n </AgentActivityHostContext.Provider>\n </AgentActivityRuntimeProvider>\n );\n}\n\nexport function useAgentHostApi(): AgentHostRuntimeApi {\n const agentHostApi =\n useContext(AgentActivityHostContext) ?? getTestAgentHostApi();\n if (!agentHostApi) {\n throw new Error(\n \"AgentActivityHostProvider is missing an agentHostApi instance.\"\n );\n }\n return agentHostApi;\n}\n\nexport function useOptionalAgentHostApi(): AgentHostRuntimeApi | null {\n return useContext(AgentActivityHostContext) ?? getTestAgentHostApi();\n}\n\nexport function getOptionalAgentHostApi(): AgentHostRuntimeApi | null {\n return (\n getExplicitWindowTestAgentHostApi() ??\n currentAgentHostApi ??\n getTestAgentHostApi()\n );\n}\n\n/**\n * Resolve the host API for a given runtime origin. When the origin is registered\n * (local vs shared/cloud host), returns that exact host API so its persistence\n * (read-state, etc.) targets the matching backend; otherwise falls back to\n * legacy single-host resolution.\n */\nexport function getAgentHostApiByOrigin(\n origin: string | null | undefined\n): AgentHostRuntimeApi | null {\n const normalizedOrigin =\n origin?.trim() || WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN;\n const hostApi = hostApiByOrigin.get(normalizedOrigin);\n if (hostApi) {\n return hostApi;\n }\n // Only the default (local) origin falls back to the legacy single-host slot.\n // An explicit non-default origin that is not registered returns null so its\n // persistence never lands in a different host's store (e.g. shared read-state\n // must not be written to the local backend).\n if (normalizedOrigin === WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN) {\n return getOptionalAgentHostApi();\n }\n return null;\n}\n\nexport function resetAgentHostApiForTests(): void {\n if (process.env.NODE_ENV === \"test\") {\n currentAgentHostApi = null;\n hostApiByOrigin.clear();\n }\n}\n\nexport function setAgentHostApiForTests(\n agentHostApi: AgentHostInputApi | AgentHostRuntimeApi | null\n): void {\n if (process.env.NODE_ENV === \"test\") {\n currentAgentHostApi = agentHostApi\n ? toAgentHostRuntimeApi(agentHostApi)\n : null;\n }\n}\n\nfunction getTestAgentHostApi(): AgentHostRuntimeApi | null {\n if (process.env.NODE_ENV !== \"test\") {\n return null;\n }\n if (typeof window === \"undefined\") {\n return null;\n }\n const explicitAgentHostApi = getExplicitWindowTestAgentHostApi();\n if (explicitAgentHostApi) {\n return explicitAgentHostApi;\n }\n if (currentAgentHostApi) {\n return currentAgentHostApi;\n }\n const testAgentHostApi = (\n window as unknown as Window & {\n agentHostApi?: AgentHostInputApi | AgentHostRuntimeApi;\n }\n ).agentHostApi;\n return testAgentHostApi ? toAgentHostRuntimeApi(testAgentHostApi) : null;\n}\n\nfunction getExplicitWindowTestAgentHostApi(): AgentHostRuntimeApi | null {\n if (process.env.NODE_ENV !== \"test\" || typeof window === \"undefined\") {\n return null;\n }\n const testDescriptor = Object.getOwnPropertyDescriptor(\n window,\n \"agentHostApi\"\n );\n if (!testDescriptor || !(\"value\" in testDescriptor)) {\n return null;\n }\n const testAgentHostApi = testDescriptor.value as\n | AgentHostInputApi\n | AgentHostRuntimeApi\n | undefined;\n return testAgentHostApi ? toAgentHostRuntimeApi(testAgentHostApi) : null;\n}\n","import type {\n AgentHostBatchUserInfoInput,\n AgentHostBatchUserInfoResult,\n AgentHostDeleteWorkspaceAgentSessionInput,\n AgentHostWorkspaceAgentListInput as AgentHostListWorkspaceAgentsInput,\n AgentHostListWorkspaceAgentProbesInput,\n AgentHostWorkspaceAgentSessionMessages,\n AgentHostWorkspaceAgentSessionMessagesInput,\n AgentHostWorkspaceAgentSessionSummary,\n AgentHostWorkspaceAgentSessionSummaryInput,\n AgentHostWorkspaceAgentProbesResult,\n AgentHostWorkspaceAgentSnapshot,\n PersistWriteResult,\n ReadWorkspaceAgentReadStateInput,\n ReadWorkspaceFileResult as AgentHostReadWorkspaceFileResult,\n WorkspaceAgentReadStateSnapshot,\n WriteWorkspaceAgentReadStateInput\n} from \"../shared/contracts/dto\";\nimport type { WorkspaceUserProjectService } from \"@tutti-os/workspace-user-project/contracts\";\n\ntype AgentHostAsyncResult<T = any> = Promise<T>;\ntype AgentHostRecord = Record<string, unknown>;\ntype AgentHostUnsubscribe = () => void;\ntype AgentHostWorkspaceScopedInput<\n T extends {\n workspaceId?: string | null;\n }\n> = Omit<T, \"workspaceId\"> & {\n workspaceId: string;\n};\ntype AgentHostWorkspaceAgentsListInput =\n AgentHostWorkspaceScopedInput<AgentHostListWorkspaceAgentsInput>;\ntype AgentHostWorkspaceAgentSessionMessagesRuntimeInput =\n AgentHostWorkspaceScopedInput<AgentHostWorkspaceAgentSessionMessagesInput>;\ntype AgentHostWorkspaceAgentSessionSummaryRuntimeInput =\n AgentHostWorkspaceScopedInput<AgentHostWorkspaceAgentSessionSummaryInput>;\ntype AgentHostDeleteWorkspaceAgentSessionRuntimeInput =\n AgentHostWorkspaceScopedInput<AgentHostDeleteWorkspaceAgentSessionInput>;\n\nexport type AgentHostClipboardApi = {\n writeImage?: (input: {\n data: string;\n mimeType: \"image/png\";\n }) => AgentHostAsyncResult<void>;\n writeText: (text: string) => AgentHostAsyncResult<void>;\n};\n\nexport type AgentHostDebugApi = {\n logRuntimeDiagnostics: (\n payload: unknown\n ) => AgentHostAsyncResult<void> | void;\n logTerminalDiagnostics?: (\n payload: unknown\n ) => AgentHostAsyncResult<void> | void;\n};\n\nexport type AgentHostFilesystemApi = AgentHostRecord & {\n readFileText: (payload: {\n path?: string;\n uri?: string;\n }) => AgentHostAsyncResult<{\n content: string;\n name?: string;\n path?: string;\n }>;\n};\n\nexport type AgentHostMetaApi = AgentHostRecord & {\n appVersion?: string | null;\n isPackaged?: boolean;\n isTest?: boolean;\n mainPid?: number | null;\n platform?: string;\n workspaceId?: string;\n};\n\nexport type AgentHostEnvironmentApi = AgentHostRecord & {\n getBaseUrl?: () => AgentHostAsyncResult<string>;\n warmupOpenclawGateway?: (input?: unknown) => AgentHostAsyncResult<unknown>;\n};\n\nexport type AgentHostPersistenceApi = AgentHostRecord & {\n readWorkspaceAgentReadState: (\n input: ReadWorkspaceAgentReadStateInput\n ) => AgentHostAsyncResult<WorkspaceAgentReadStateSnapshot>;\n writeWorkspaceAgentReadState: (\n input: WriteWorkspaceAgentReadStateInput\n ) => AgentHostAsyncResult<PersistWriteResult>;\n};\n\nexport type AgentHostToastApi = AgentHostRecord & {\n error: (title: string, description?: string) => void;\n info?: (title: string, description?: string) => void;\n success?: (title: string, description?: string) => void;\n};\n\nexport interface AgentHostSelectedFile {\n name?: string;\n path: string;\n}\n\nexport interface AgentHostSelectFilesInput {\n allowDirectories?: boolean;\n}\n\nexport interface AgentHostApplyWorkspaceGitPatchInput {\n allowBinary?: boolean;\n atomic?: boolean;\n cwd: string;\n diff: string;\n revert?: boolean;\n target?: \"unstaged\" | \"staged\" | \"staged-and-unstaged\";\n}\n\nexport interface AgentHostApplyWorkspaceGitPatchResult {\n status: \"success\" | \"partial-success\" | \"error\";\n appliedPaths: string[];\n skippedPaths: string[];\n conflictedPaths: string[];\n errorCode?: \"not-git-repo\" | string;\n execOutput?: {\n command: string;\n stdout: string;\n stderr: string;\n };\n}\n\nexport interface AgentHostResolveWorkspaceGitPatchSupportInput {\n cwd: string;\n}\n\nexport interface AgentHostResolveWorkspaceGitPatchSupportResult {\n supported: boolean;\n root?: string;\n errorCode?: \"not-git-repo\" | string;\n}\n\nexport type AgentHostWorkspaceApi = AgentHostRecord & {\n applyGitPatch?: (\n input: AgentHostApplyWorkspaceGitPatchInput\n ) => AgentHostAsyncResult<AgentHostApplyWorkspaceGitPatchResult>;\n resolveGitPatchSupport?: (\n input: AgentHostResolveWorkspaceGitPatchSupportInput\n ) => AgentHostAsyncResult<AgentHostResolveWorkspaceGitPatchSupportResult>;\n copyPath?: (input: { path: string }) => AgentHostAsyncResult<void>;\n ensureDirectory: (input: { path: string }) => AgentHostAsyncResult<void>;\n getReferenceForFile?: (file: File) => {\n kind: \"file\" | \"folder\";\n path: string;\n };\n readFile: (input: {\n path: string;\n }) => AgentHostAsyncResult<AgentHostReadWorkspaceFileResult>;\n selectContextEntries?: () => AgentHostAsyncResult<{ entries: unknown[] }>;\n selectDirectory: () => AgentHostAsyncResult<{ path: string } | null>;\n selectFiles: (\n input?: AgentHostSelectFilesInput\n ) => AgentHostAsyncResult<AgentHostSelectedFile[]>;\n writeFileText: (input: {\n content: string;\n path: string;\n }) => AgentHostAsyncResult<unknown>;\n};\n\nexport interface AgentHostInputApi {\n account?: AgentHostAccountApi;\n agentSessions?: AgentHostAgentSessionsApi;\n clipboard: AgentHostClipboardApi;\n debug?: AgentHostDebugApi;\n filesystem: AgentHostFilesystemApi;\n meta?: AgentHostMetaApi;\n onHostEvent?: (listener: (event: any) => void) => AgentHostUnsubscribe;\n persistence?: AgentHostPersistenceApi;\n runtime?: AgentHostEnvironmentApi;\n toast?: AgentHostToastApi;\n userProjects?: AgentHostUserProjectsApi;\n workspace: AgentHostWorkspaceApi;\n workspaceAgentProbes?: AgentHostWorkspaceAgentProbesApi;\n workspaceAgents?: AgentHostWorkspaceAgentsApi;\n}\n\nexport type AgentHostApi = AgentHostInputApi;\n\nexport type AgentHostAccountApi = AgentHostRecord & {\n batchGetUserInfo: (\n input: AgentHostBatchUserInfoInput\n ) => AgentHostAsyncResult<AgentHostBatchUserInfoResult>;\n ensureProfiles?: (input: any) => AgentHostAsyncResult<any>;\n};\n\nexport type AgentHostWorkspaceAgentProbesApi = AgentHostRecord & {\n list: (\n input: AgentHostListWorkspaceAgentProbesInput\n ) => AgentHostAsyncResult<AgentHostWorkspaceAgentProbesResult>;\n};\n\nexport type AgentProviderProbeListInput =\n AgentHostListWorkspaceAgentProbesInput;\nexport type AgentProviderProbeListResult = AgentHostWorkspaceAgentProbesResult;\n\nexport interface AgentHostUserProject {\n id: string;\n path: string;\n label: string;\n createdAtUnixMs?: number;\n updatedAtUnixMs?: number;\n lastUsedAtUnixMs?: number;\n}\n\nexport type AgentHostUserProjectsApi = AgentHostRecord & {\n service?: WorkspaceUserProjectService;\n checkPath?: (input: { path: string }) => AgentHostAsyncResult<{\n exists: boolean;\n isDirectory: boolean;\n path: string;\n }>;\n create?: (input: {\n name: string;\n }) => AgentHostAsyncResult<AgentHostUserProject>;\n getDefaultSelection?: () => AgentHostAsyncResult<{\n path: string | null;\n } | null>;\n list: () => AgentHostAsyncResult<{\n projects: AgentHostUserProject[];\n }>;\n subscribe?: (listener: () => void) => AgentHostUnsubscribe;\n prepareSelection?: (input: {\n projectLocked: boolean;\n selectedPath: string | null;\n }) => AgentHostAsyncResult<{\n isSelectedPathMissing: boolean;\n projects: AgentHostUserProject[];\n selection:\n | {\n kind: \"clear\";\n suppressedPath: string;\n }\n | {\n kind: \"none\";\n }\n | {\n kind: \"select\";\n path: string;\n };\n }>;\n remove?: (input: { path: string }) => AgentHostAsyncResult<void>;\n isNoProjectPath?: (input: { path: string }) => boolean;\n rememberDefaultSelection?: (input: {\n path: string | null;\n }) => AgentHostAsyncResult<void>;\n use: (input: { path: string }) => AgentHostAsyncResult<AgentHostUserProject>;\n};\n\nexport type AgentHostAgentSessionsApi = AgentHostRecord & {\n activate: (input: any) => AgentHostAsyncResult<any>;\n /**\n * @deprecated AgentGUI production writes must use AgentActivityRuntime.cancelSession.\n */\n cancel: (input: any) => AgentHostAsyncResult<any>;\n /**\n * @deprecated AgentGUI production writes must use AgentActivityRuntime.sendInput.\n */\n exec: (input: any) => AgentHostAsyncResult<any>;\n getComposerOptions?: (input: any) => AgentHostAsyncResult<any>;\n getState: (input: any) => AgentHostAsyncResult<any>;\n onEvent?: (listener: (event: any) => void) => AgentHostUnsubscribe;\n /**\n * @deprecated AgentGUI production writes must use AgentActivityRuntime.setSessionPinned.\n */\n pinSession?: (input: any) => AgentHostAsyncResult<any>;\n /**\n * @deprecated AgentGUI production sync must use AgentActivityRuntime.ensureSessionSynchronized.\n */\n releaseEventStream?: (input?: any) => AgentHostAsyncResult;\n /**\n * @deprecated AgentGUI production sync must use AgentActivityRuntime.ensureSessionSynchronized.\n */\n retainEventStream?: (input: any) => AgentHostAsyncResult;\n /**\n * @deprecated AgentGUI production writes must use AgentActivityRuntime.submitInteractive.\n */\n submitInteractive: (input: any) => AgentHostAsyncResult<any>;\n /**\n * @deprecated AgentGUI production UI must derive events from AgentActivityRuntime snapshots.\n */\n trackSettingsProjectChange?: (input: {\n action: \"clear\" | \"create_new\" | \"select_existing\";\n agentSessionId: string;\n provider?: string | null;\n }) => AgentHostAsyncResult<void>;\n subscribeEvents: (\n input: any,\n listener: (event: any) => void\n ) => AgentHostUnsubscribe;\n unactivate: (input: any) => AgentHostAsyncResult<any>;\n updateSettings: (input: any) => AgentHostAsyncResult<any>;\n};\n\n/**\n * @deprecated Legacy host DTO projection. AgentGUI production reads and writes\n * must use AgentActivityRuntime and AgentActivity* models.\n */\nexport type AgentHostWorkspaceAgentsApi = AgentHostRecord & {\n /**\n * @deprecated Use AgentActivityRuntime.deleteSession.\n */\n deleteSession: (\n input: AgentHostDeleteWorkspaceAgentSessionRuntimeInput\n ) => AgentHostAsyncResult<any>;\n /**\n * @deprecated Derive summaries from AgentActivitySnapshot/session messages.\n */\n getSessionSummary: (\n input: AgentHostWorkspaceAgentSessionSummaryRuntimeInput\n ) => AgentHostAsyncResult<AgentHostWorkspaceAgentSessionSummary>;\n /**\n * @deprecated Use AgentActivityRuntime.load/getSnapshot.\n */\n list: (\n input: string | AgentHostWorkspaceAgentsListInput\n ) => AgentHostAsyncResult<AgentHostWorkspaceAgentSnapshot>;\n /**\n * @deprecated Use AgentActivityRuntime.listSessionMessages.\n */\n listSessionMessages: (\n input: AgentHostWorkspaceAgentSessionMessagesRuntimeInput\n ) => AgentHostAsyncResult<AgentHostWorkspaceAgentSessionMessages>;\n};\n\nexport interface AgentHostRuntimeApi {\n account?: AgentHostAccountApi;\n clipboard: AgentHostClipboardApi;\n debug?: AgentHostDebugApi;\n filesystem: AgentHostFilesystemApi;\n meta?: AgentHostMetaApi;\n onHostEvent?: (listener: (event: any) => void) => AgentHostUnsubscribe;\n persistence?: AgentHostPersistenceApi;\n runtime?: AgentHostEnvironmentApi;\n toast?: AgentHostToastApi;\n userProjects?: AgentHostUserProjectsApi;\n workspace: AgentHostWorkspaceApi;\n workspaceAgentProbes?: AgentHostWorkspaceAgentProbesApi;\n}\n\nexport function toAgentHostRuntimeApi(\n hostApi: AgentHostInputApi | AgentHostRuntimeApi\n): AgentHostRuntimeApi {\n return {\n account: hostApi.account,\n clipboard: hostApi.clipboard,\n debug: hostApi.debug,\n filesystem: hostApi.filesystem,\n meta: hostApi.meta,\n onHostEvent: hostApi.onHostEvent,\n persistence: hostApi.persistence,\n runtime: hostApi.runtime,\n toast: hostApi.toast,\n userProjects: hostApi.userProjects,\n workspace: hostApi.workspace,\n workspaceAgentProbes: hostApi.workspaceAgentProbes\n };\n}\n","import { normalizeManagedAgentProvider } from \"./managedAgentProviders\";\nimport {\n claudeRoundedUrl,\n codexRoundedUrl,\n cursorColorfulUrl,\n cursorRoundedUrl,\n geminiRoundedUrl,\n hermesRoundedUrl,\n manageAgentClaudeCodeUrl,\n manageAgentCodexUrl,\n manageAgentGeminiUrl,\n manageAgentHermesUrl,\n manageAgentOpenCodeUrl,\n manageAgentTuttiUrl,\n manageAgentOpenclawUrl,\n providerRailClaudeCodeColorfulUrl,\n providerRailCodexColorfulUrl,\n providerRailHermesColorfulUrl,\n providerRailOpenCodeColorfulUrl,\n providerRailTuttiUrl,\n tuttiDocRoundedUrl,\n opencodeRoundedUrl,\n openclawRoundedUrl\n} from \"../managedAgentIconAssets\";\n\n/** Square avatar art for the managed toolchain agents (used by Manage Agents and Launch home Agents floor). */\nexport const MANAGED_AGENT_ICON_URLS: Record<string, string> = {\n \"claude-code\": manageAgentClaudeCodeUrl,\n codex: manageAgentCodexUrl,\n cursor: cursorRoundedUrl,\n gemini: manageAgentGeminiUrl,\n hermes: manageAgentHermesUrl,\n tutti: manageAgentTuttiUrl,\n openclaw: manageAgentOpenclawUrl,\n opencode: manageAgentOpenCodeUrl\n};\n\n/** Colorful provider rail icons used by AgentGUI's left provider filter. */\nexport const MANAGED_AGENT_PROVIDER_RAIL_ICON_URLS: Record<string, string> = {\n \"claude-code\": providerRailClaudeCodeColorfulUrl,\n codex: providerRailCodexColorfulUrl,\n cursor: cursorColorfulUrl,\n hermes: providerRailHermesColorfulUrl,\n tutti: providerRailTuttiUrl,\n opencode: providerRailOpenCodeColorfulUrl\n};\n\n/** Rounded avatars for Room status / room activity panel only. */\nexport const MANAGED_AGENT_ICON_ROUNDED_URLS: Record<string, string> = {\n \"claude-code\": claudeRoundedUrl,\n codex: codexRoundedUrl,\n cursor: cursorColorfulUrl,\n gemini: geminiRoundedUrl,\n hermes: hermesRoundedUrl,\n tutti: tuttiDocRoundedUrl,\n openclaw: openclawRoundedUrl,\n opencode: opencodeRoundedUrl\n};\n\n/** 与 Manage Agents 列表用的方图区分;房间预览弹幕条等仅用圆图 */\nconst MANAGED_AGENT_ROUNDED_ICON_FALLBACK_URL = tuttiDocRoundedUrl;\n\nexport const MANAGED_AGENT_ICON_FALLBACK_URL = manageAgentTuttiUrl;\n\nexport function managedAgentRoundedIconUrl(\n provider: string | undefined\n): string {\n return (\n MANAGED_AGENT_ICON_ROUNDED_URLS[normalizeManagedAgentProvider(provider)] ??\n MANAGED_AGENT_ROUNDED_ICON_FALLBACK_URL\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,IAAM,WAAW,oBAAI,IAA8C;AAMnE,IAAM,sCAAsC,oBAAI,IAAI;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,+BACd,YACM;AACN,QAAM,OAAO,WAAW,KAAK,KAAK,EAAE,YAAY;AAChD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,oCAAoC,IAAI,IAAI,GAAG;AACjD,UAAM,IAAI;AAAA,MACR,oCAAoC,IAAI;AAAA,IAC1C;AAAA,EACF;AACA,WAAS,IAAI,MAAM,UAAU;AAC/B;AAEO,SAAS,0BACd,MAC8C;AAC9C,SAAO,SAAS,IAAI,KAAK,KAAK,EAAE,YAAY,CAAC;AAC/C;AAEO,SAAS,uCAA6C;AAC3D,WAAS,MAAM;AACjB;;;ACrGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AA+aH;AAlDJ,IAAM,8BAA8B;AAAA,EAClC;AACF;AAEA,IAAI,8BAA2D;AAM/D,IAAM,mBAAmB,oBAAI,IAAkC;AAQ/D,SAAS,uBAAuB,QAA2C;AACzE,SAAO,QAAQ,KAAK,KAAK;AAC3B;AAMO,SAAS,6BAA6B;AAAA,EAC3C;AAAA,EACA;AACF,GAAmD;AACjD,gCAA8B,WAAW;AACzC,QAAM,SAAS,uBAAuB,SAAS,MAAM;AAGrD,MAAI,UAAU,SAAS;AACrB,qBAAiB,IAAI,QAAQ,OAAO;AAAA,EACtC;AACA,YAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,SAAS;AACvB;AAAA,IACF;AACA,qBAAiB,IAAI,QAAQ,OAAO;AACpC,WAAO,MAAM;AAEX,UAAI,iBAAiB,IAAI,MAAM,MAAM,SAAS;AAC5C,yBAAiB,OAAO,MAAM;AAAA,MAChC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AACpB,SACE,oBAAC,4BAA4B,UAA5B,EAAqC,OAAO,WAAW,MACrD,UACH;AAEJ;AAEO,SAAS,0BAAgD;AAC9D,QAAM,UACJ,WAAW,2BAA2B,KAAK,4BAA4B;AACzE,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kCAA+D;AAC7E,SACE,WAAW,2BAA2B,KAAK,4BAA4B;AAE3E;AAEO,SAAS,yBACd,aACuB;AACvB,QAAM,UAAU,wBAAwB;AACxC,QAAM,wBAAwB,YAAY,KAAK;AAC/C,SAAO;AAAA,IACL,CAAC,aAAa,QAAQ,UAAU,uBAAuB,QAAQ;AAAA,IAC/D,MAAM,QAAQ,YAAY,qBAAqB;AAAA,IAC/C,MAAM,QAAQ,YAAY,qBAAqB;AAAA,EACjD;AACF;AAEO,SAAS,0BAAgD;AAC9D,QAAM,UACJ,0CAA0C,KAC1C,+BACA,4BAA4B;AAC9B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kCAA+D;AAC7E,SACE,0CAA0C,KAC1C,+BACA,4BAA4B;AAEhC;AAWO,SAAS,gCACd,QAC6B;AAC7B,QAAM,mBAAmB,uBAAuB,MAAM;AACtD,QAAM,UAAU,iBAAiB,IAAI,gBAAgB;AACrD,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AACA,MAAI,qBAAqB,iDAAiD;AACxE,WAAO,gCAAgC;AAAA,EACzC;AACA,SAAO;AACT;AAEO,SAAS,oCAA0C;AACxD,MAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,kCAA8B;AAC9B,qBAAiB,MAAM;AAAA,EACzB;AACF;AAEO,SAAS,gCACd,SACM;AACN,MAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,kCAA8B;AAAA,EAChC;AACF;AAEA,SAAS,8BAA2D;AAClE,MAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AACA,QAAM,kBAAkB,0CAA0C;AAClE,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AACA,MAAI,6BAA6B;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,cACJ,OAGA;AACF,SAAO,eAAe;AACxB;AAEA,SAAS,4CAAyE;AAChF,MAAI,QAAQ,IAAI,aAAa,UAAU,OAAO,WAAW,aAAa;AACpE,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,OAAO;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,kBAAkB,EAAE,WAAW,iBAAiB;AACnD,WAAO;AAAA,EACT;AACA,SAAQ,eAAe,SAA8C;AACvE;;;ACtjBA;AAAA,EACE,iBAAAA;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,OAGK;;;ACiVA,SAAS,sBACd,SACqB;AACrB,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,IACjB,WAAW,QAAQ;AAAA,IACnB,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,cAAc,QAAQ;AAAA,IACtB,WAAW,QAAQ;AAAA,IACnB,sBAAsB,QAAQ;AAAA,EAChC;AACF;;;AD/RM,gBAAAC,YAAA;AAvDN,IAAM,2BAA2BC;AAAA,EAC/B;AACF;AAEA,IAAI,sBAAkD;AAOtD,IAAM,kBAAkB,oBAAI,IAAiC;AAE7D,SAAS,kBACP,SACQ;AACR,SACE,SAAS,QAAQ,KAAK,KAAK;AAE/B;AAOO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAC9C,QAAM,uBAAuB;AAAA,IAC3B,MAAO,eAAe,sBAAsB,YAAY,IAAI;AAAA,IAC5D,CAAC,YAAY;AAAA,EACf;AACA,wBAAsB;AACtB,QAAM,SAAS,kBAAkB,oBAAoB;AAGrD,MAAI,sBAAsB;AACxB,oBAAgB,IAAI,QAAQ,oBAAoB;AAAA,EAClD;AACA,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,sBAAsB;AACzB;AAAA,IACF;AACA,oBAAgB,IAAI,QAAQ,oBAAoB;AAChD,WAAO,MAAM;AACX,UAAI,gBAAgB,IAAI,MAAM,MAAM,sBAAsB;AACxD,wBAAgB,OAAO,MAAM;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,oBAAoB,CAAC;AACjC,SACE,gBAAAF,KAAC,gCAA6B,SAAS,sBACrC,0BAAAA,KAAC,yBAAyB,UAAzB,EAAkC,OAAO,sBACvC,UACH,GACF;AAEJ;AAEO,SAAS,kBAAuC;AACrD,QAAM,eACJG,YAAW,wBAAwB,KAAK,oBAAoB;AAC9D,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,0BAAsD;AACpE,SAAOA,YAAW,wBAAwB,KAAK,oBAAoB;AACrE;AAEO,SAAS,0BAAsD;AACpE,SACE,kCAAkC,KAClC,uBACA,oBAAoB;AAExB;AAQO,SAAS,wBACd,QAC4B;AAC5B,QAAM,mBACJ,QAAQ,KAAK,KAAK;AACpB,QAAM,UAAU,gBAAgB,IAAI,gBAAgB;AACpD,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAKA,MAAI,qBAAqB,iDAAiD;AACxE,WAAO,wBAAwB;AAAA,EACjC;AACA,SAAO;AACT;AAmBA,SAAS,sBAAkD;AACzD,MAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AACA,QAAM,uBAAuB,kCAAkC;AAC/D,MAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AACA,MAAI,qBAAqB;AACvB,WAAO;AAAA,EACT;AACA,QAAM,mBACJ,OAGA;AACF,SAAO,mBAAmB,sBAAsB,gBAAgB,IAAI;AACtE;AAEA,SAAS,oCAAgE;AACvE,MAAI,QAAQ,IAAI,aAAa,UAAU,OAAO,WAAW,aAAa;AACpE,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,OAAO;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,kBAAkB,EAAE,WAAW,iBAAiB;AACnD,WAAO;AAAA,EACT;AACA,QAAM,mBAAmB,eAAe;AAIxC,SAAO,mBAAmB,sBAAsB,gBAAgB,IAAI;AACtE;;;AE9JO,IAAM,0BAAkD;AAAA,EAC7D,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AACZ;AAGO,IAAM,wCAAgE;AAAA,EAC3E,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AACZ;AAGO,IAAM,kCAA0D;AAAA,EACrE,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AACZ;AAGA,IAAM,0CAA0C;AAEzC,IAAM,kCAAkC;AAExC,SAAS,2BACd,UACQ;AACR,SACE,gCAAgC,8BAA8B,QAAQ,CAAC,KACvE;AAEJ;","names":["createContext","useContext","useEffect","jsx","createContext","useEffect","useContext"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../workbench/state.ts"],"sourcesContent":["import type {\n WorkbenchHostExternalStateLookupInput,\n WorkbenchHostExternalStateSource\n} from \"@tutti-os/workbench-surface\";\nimport {\n agentGuiWorkbenchProviders,\n isAgentGuiWorkbenchProvider,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport { agentGUIProviderTargetRefsEqual } from \"../providerTargets.ts\";\nimport type {\n AgentGuiWorkbenchComposerOverrides,\n AgentGuiWorkbenchComposerOverridesByAgentTargetId,\n AgentGuiWorkbenchComposerOverridesByProvider,\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState,\n AgentGuiWorkbenchWorkspaceState\n} from \"./types.ts\";\nimport type { AgentGUIProviderTargetRef } from \"../types.ts\";\n\ntype AgentGuiWorkbenchStateLookupRequest = Pick<\n WorkbenchHostExternalStateLookupInput,\n \"instanceId\" | \"typeId\"\n> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>;\n\nexport function createDefaultAgentGuiWorkbenchNodeState(\n provider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n return {\n agentTargetId: null,\n composerOverrides: null,\n composerOverridesByAgentTargetId: null,\n composerOverridesByProvider: null,\n conversationCount: null,\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null,\n lastActiveConversationTitle: null,\n provider,\n providerTargetId: null,\n providerTargetRef: null\n };\n}\n\nexport function normalizeAgentGuiWorkbenchState(\n state: unknown\n): AgentGuiWorkbenchState {\n if (!isRecord(state)) {\n return createDefaultAgentGuiWorkbenchState();\n }\n const agentTargetId =\n normalizeOptionalNonEmptyString(state.agentTargetId) ??\n normalizeOptionalNonEmptyString(state.providerTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null,\n ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\n };\n}\n\nexport function projectAgentGuiWorkbenchState(\n state: AgentGuiWorkbenchNodeState\n): AgentGuiWorkbenchState {\n const agentTargetId =\n normalizeOptionalNonEmptyString(state.agentTargetId) ??\n normalizeOptionalNonEmptyString(state.providerTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId: state.lastActiveAgentSessionId ?? null,\n ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\n };\n}\n\nexport function areAgentGuiWorkbenchStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n (left.lastActiveConversationTitle ?? null) ===\n (right.lastActiveConversationTitle ?? null)\n );\n}\n\nexport function normalizeAgentGuiWorkbenchNodeState(\n state: Partial<AgentGuiWorkbenchNodeState> | null | undefined,\n fallbackProvider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n const provider = normalizeAgentGuiWorkbenchProvider(\n state?.provider,\n fallbackProvider\n );\n return {\n ...createDefaultAgentGuiWorkbenchNodeState(provider),\n agentTargetId:\n normalizeOptionalNonEmptyString(state?.agentTargetId) ??\n normalizeOptionalNonEmptyString(state?.providerTargetId),\n composerOverrides: normalizeAgentGuiWorkbenchComposerOverrides(\n state?.composerOverrides\n ),\n composerOverridesByAgentTargetId:\n normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n state?.composerOverridesByAgentTargetId\n ),\n composerOverridesByProvider:\n normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n state?.composerOverridesByProvider\n ),\n conversationCount: normalizeOptionalNonNegativeNumber(\n state?.conversationCount\n ),\n conversationRailCollapsed: state?.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state?.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state?.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null,\n lastActiveConversationTitle:\n typeof state?.lastActiveConversationTitle === \"string\"\n ? state.lastActiveConversationTitle\n : null,\n provider,\n providerTargetId: normalizeOptionalNonEmptyString(state?.providerTargetId),\n providerTargetRef: normalizeAgentGuiProviderTargetRef(\n state?.providerTargetRef,\n provider\n )\n };\n}\n\nexport function areAgentGuiWorkbenchNodeStatesEqual(\n left: AgentGuiWorkbenchNodeState,\n right: AgentGuiWorkbenchNodeState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n composerOverridesEqual(left.composerOverrides, right.composerOverrides) &&\n composerOverridesByAgentTargetIdEqual(\n left.composerOverridesByAgentTargetId,\n right.composerOverridesByAgentTargetId\n ) &&\n composerOverridesByProviderEqual(\n left.composerOverridesByProvider,\n right.composerOverridesByProvider\n ) &&\n left.conversationCount === right.conversationCount &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n left.lastActiveConversationTitle === right.lastActiveConversationTitle &&\n left.provider === right.provider &&\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n (left.providerTargetId ?? null) === (right.providerTargetId ?? null) &&\n agentGUIProviderTargetRefsEqual(\n left.providerTargetRef,\n right.providerTargetRef\n )\n );\n}\n\nexport function agentGuiWorkbenchProviderFromInstanceId(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return \"codex\";\n }\n const [, provider] = normalized.split(\":\", 3);\n return normalizeAgentGuiWorkbenchProvider(provider);\n}\n\n/**\n * Like {@link agentGuiWorkbenchProviderFromInstanceId} but returns `null`\n * instead of defaulting to `\"codex\"` when the provider cannot be determined\n * yet (e.g. a freshly created session whose instanceId does not encode a\n * provider). Callers that render a provider icon use this so they can show a\n * neutral placeholder during that transient window instead of flashing the\n * wrong provider's icon.\n */\nexport function agentGuiWorkbenchProviderFromInstanceIdOrNull(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider | null {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return null;\n }\n const [, provider] = normalized.split(\":\", 3);\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nexport function createAgentGuiWorkbenchNodeStateSource(input: {\n typeId?: string;\n workspaceId: string;\n}): {\n externalStateSource: WorkbenchHostExternalStateSource<\n AgentGuiWorkbenchState | null,\n AgentGuiWorkbenchWorkspaceState\n >;\n readNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest\n ) => AgentGuiWorkbenchState | null;\n writeNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest & {\n state: AgentGuiWorkbenchState;\n }\n ) => void;\n /**\n * Returns the launch instanceId of an open node currently showing the given\n * agent session, or null when none is found. Used to focus an existing\n * conversation instead of launching a duplicate node.\n */\n findInstanceIdByAgentSessionId: (agentSessionId: string) => string | null;\n} {\n const typeId = input.typeId ?? \"agent-gui\";\n const nodeStateByKey = new Map<string, AgentGuiWorkbenchState>();\n // Tracks the launch instanceId behind each state key so a node can be located\n // by the session it is currently showing, even when its key is node-scoped.\n const instanceIdByKey = new Map<string, string>();\n const listeners = new Set<() => void>();\n\n const lookupState = (request: AgentGuiWorkbenchStateLookupRequest) => {\n const nodeState = request.nodeId\n ? nodeStateByKey.get(agentGuiWorkbenchNodeStateKey(request))\n : null;\n const state =\n nodeState ??\n nodeStateByKey.get(agentGuiWorkbenchInstanceStateKey(request));\n return state ? { ...state } : null;\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n externalStateSource: {\n getNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getSnapshotNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getWorkspaceState() {\n return {\n workspaceId: input.workspaceId\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n },\n readNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n findInstanceIdByAgentSessionId(agentSessionId) {\n const target = agentSessionId.trim();\n if (!target) {\n return null;\n }\n for (const [key, state] of nodeStateByKey) {\n if (state.lastActiveAgentSessionId?.trim() === target) {\n return instanceIdByKey.get(key) ?? null;\n }\n }\n return null;\n },\n writeNodeState(request) {\n if (request.typeId !== typeId) {\n return;\n }\n const key = agentGuiWorkbenchNodeStateKey(request);\n instanceIdByKey.set(key, request.instanceId);\n const previous = nodeStateByKey.get(key);\n let clearedInstanceSeed = false;\n if (request.nodeId) {\n const instanceKey = agentGuiWorkbenchInstanceStateKey(request);\n instanceIdByKey.delete(instanceKey);\n clearedInstanceSeed = nodeStateByKey.delete(instanceKey);\n }\n const next = {\n ...normalizeAgentGuiWorkbenchState(request.state)\n };\n nodeStateByKey.set(key, next);\n if (\n !clearedInstanceSeed &&\n previous &&\n areAgentGuiWorkbenchMemoryStatesEqual(previous, next)\n ) {\n return;\n }\n notify();\n }\n };\n}\n\nfunction areAgentGuiWorkbenchMemoryStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return areAgentGuiWorkbenchStatesEqual(left, right);\n}\n\nfunction agentGuiWorkbenchNodeStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\"> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>\n): string {\n return request.nodeId\n ? `node:${request.nodeId}`\n : agentGuiWorkbenchInstanceStateKey(request);\n}\n\nfunction agentGuiWorkbenchInstanceStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\">\n): string {\n return `instance:${request.instanceId}`;\n}\n\nfunction createDefaultAgentGuiWorkbenchState(): AgentGuiWorkbenchState {\n return {\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null\n };\n}\n\nfunction normalizeOptionalNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction normalizeAgentGuiProviderTargetRef(\n value: unknown,\n expectedProvider?: AgentGuiWorkbenchProvider\n): AgentGUIProviderTargetRef | null {\n if (!isRecord(value)) {\n return null;\n }\n const kind = normalizeOptionalNonEmptyString(value.kind);\n const provider = value.provider;\n if (!kind || !isAgentGuiWorkbenchProvider(provider)) {\n return null;\n }\n if (expectedProvider && provider !== expectedProvider) {\n return null;\n }\n return {\n ...value,\n kind,\n provider\n };\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverrides(\n value: unknown\n): AgentGuiWorkbenchComposerOverrides | null {\n if (!isRecord(value)) {\n return null;\n }\n const composerOverrides: AgentGuiWorkbenchComposerOverrides = {};\n if (typeof value.model === \"string\" && value.model.trim()) {\n composerOverrides.model = value.model.trim();\n }\n if (\n typeof value.reasoningEffort === \"string\" &&\n value.reasoningEffort.trim()\n ) {\n composerOverrides.reasoningEffort = value.reasoningEffort.trim();\n }\n if (\n typeof value.permissionModeId === \"string\" &&\n value.permissionModeId.trim()\n ) {\n composerOverrides.permissionModeId = value.permissionModeId.trim();\n }\n if (typeof value.planMode === \"boolean\") {\n composerOverrides.planMode = value.planMode;\n }\n return Object.keys(composerOverrides).length > 0 ? composerOverrides : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByProvider | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByProvider = {};\n for (const provider of agentGuiWorkbenchProviders) {\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(\n value[provider]\n );\n if (overrides) {\n result[provider] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByAgentTargetId | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByAgentTargetId = {};\n for (const [rawAgentTargetId, rawOverrides] of Object.entries(value)) {\n const agentTargetId = normalizeOptionalNonEmptyString(rawAgentTargetId);\n if (!agentTargetId) {\n continue;\n }\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(rawOverrides);\n if (overrides) {\n result[agentTargetId] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeOptionalPositiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.round(value)\n : null;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.round(value)\n : null;\n}\n\nfunction composerOverridesEqual(\n left: AgentGuiWorkbenchComposerOverrides | null | undefined,\n right: AgentGuiWorkbenchComposerOverrides | null | undefined\n): boolean {\n return (\n (left?.model ?? null) === (right?.model ?? null) &&\n (left?.permissionModeId ?? null) === (right?.permissionModeId ?? null) &&\n (left?.planMode ?? null) === (right?.planMode ?? null) &&\n (left?.reasoningEffort ?? null) === (right?.reasoningEffort ?? null)\n );\n}\n\nfunction composerOverridesByProviderEqual(\n left: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined\n): boolean {\n for (const provider of agentGuiWorkbenchProviders) {\n if (!composerOverridesEqual(left?.[provider], right?.[provider])) {\n return false;\n }\n }\n return true;\n}\n\nfunction composerOverridesByAgentTargetIdEqual(\n left: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined\n): boolean {\n const leftKeys = Object.keys(left ?? {}).sort();\n const rightKeys = Object.keys(right ?? {}).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n return leftKeys.every(\n (key, index) =>\n key === rightKeys[index] &&\n composerOverridesEqual(left?.[key], right?.[key])\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":[]}
|