@tutti-os/agent-gui 0.0.72 → 0.0.74
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 +9 -0
- package/dist/agent-conversation/index.d.ts +2 -2
- package/dist/agent-conversation/index.js +8 -8
- package/dist/agent-message-center/index.js +10 -10
- package/dist/{agentGuiNodeTypes-aJ3AX7u2.d.ts → agentGuiNodeTypes-C0WUHQzu.d.ts} +2 -1
- package/dist/app/renderer/agentactivity.css +6 -9
- package/dist/{chunk-C7K3EFGI.js → chunk-4XIHKCWC.js} +2 -2
- package/dist/{chunk-3PKRGSMH.js → chunk-6EREXANR.js} +4 -12
- package/dist/chunk-6EREXANR.js.map +1 -0
- package/dist/{chunk-ATEZXUHK.js → chunk-BT2DT2P7.js} +1 -1
- package/dist/chunk-BT2DT2P7.js.map +1 -0
- package/dist/{chunk-BHNJN2TR.js → chunk-BTUOROCD.js} +1 -4
- package/dist/chunk-BTUOROCD.js.map +1 -0
- package/dist/{chunk-XZF4QNT4.js → chunk-D2Z2QZVE.js} +2 -2
- package/dist/{chunk-GDFQXJMG.js → chunk-FHWE5SUF.js} +3 -7
- package/dist/chunk-FHWE5SUF.js.map +1 -0
- package/dist/{chunk-UAAXRSW2.js → chunk-FPODKSSV.js} +4 -4
- package/dist/chunk-FPODKSSV.js.map +1 -0
- package/dist/{chunk-IVIXKAEH.js → chunk-GLMDAZSQ.js} +3 -3
- package/dist/{chunk-466AWJTS.js → chunk-KVS7J7BJ.js} +5 -5
- package/dist/{chunk-5H6NINJY.js → chunk-LWFV4PS5.js} +2 -7
- package/dist/chunk-LWFV4PS5.js.map +1 -0
- package/dist/{chunk-KWQ4N4IZ.js → chunk-NO7WDGST.js} +3 -3
- package/dist/{chunk-4US2YHBY.js → chunk-RA3OUR64.js} +1 -3
- package/dist/chunk-RA3OUR64.js.map +1 -0
- package/dist/{chunk-SZF52NMJ.js → chunk-RF7GK4SM.js} +18 -12
- package/dist/chunk-RF7GK4SM.js.map +1 -0
- package/dist/{chunk-4I2VCAMW.js → chunk-SL2QSEIE.js} +1 -8
- package/dist/chunk-SL2QSEIE.js.map +1 -0
- package/dist/{chunk-2I2WRI4F.js → chunk-T5CEU7WH.js} +2 -3
- package/dist/chunk-T5CEU7WH.js.map +1 -0
- package/dist/{chunk-SVGIWXNK.js → chunk-VERGPY42.js} +2 -2
- package/dist/{chunk-G6BVEY7I.js → chunk-W5AJTBA7.js} +1 -15
- package/dist/chunk-W5AJTBA7.js.map +1 -0
- package/dist/{chunk-Q6AWM3RH.js → chunk-Z72JKSAY.js} +4 -4
- package/dist/{chunk-OBJRIQPX.js → chunk-ZSYDFQ4N.js} +38 -25
- package/dist/chunk-ZSYDFQ4N.js.map +1 -0
- package/dist/context-mention-palette/index.js +9 -9
- package/dist/i18n/index.d.ts +0 -14
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +58 -6
- package/dist/index.js +317 -89
- package/dist/index.js.map +1 -1
- package/dist/queued-prompt-runtime.d.ts +2 -2
- package/dist/{types-CrwMqBm1.d.ts → types-DUHHejs2.d.ts} +3 -3
- package/dist/workbench/contribution.d.ts +1 -1
- package/dist/workbench/contribution.js +6 -6
- package/dist/workbench/index.d.ts +1 -1
- package/dist/workbench/index.js +9 -9
- package/dist/workbench/launch.d.ts +1 -1
- package/dist/workbench/launch.js +3 -3
- package/dist/workbench/providerCatalog.d.ts +3 -3
- package/dist/workbench/providerCatalog.js +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 +2 -2
- package/dist/workbench/types.d.ts +2 -2
- package/dist/workbench/types.js +1 -1
- package/dist/workspace-agent-generated-files.js +4 -4
- package/package.json +12 -12
- package/dist/chunk-2I2WRI4F.js.map +0 -1
- package/dist/chunk-3PKRGSMH.js.map +0 -1
- package/dist/chunk-4I2VCAMW.js.map +0 -1
- package/dist/chunk-4US2YHBY.js.map +0 -1
- package/dist/chunk-5H6NINJY.js.map +0 -1
- package/dist/chunk-ATEZXUHK.js.map +0 -1
- package/dist/chunk-BHNJN2TR.js.map +0 -1
- package/dist/chunk-G6BVEY7I.js.map +0 -1
- package/dist/chunk-GDFQXJMG.js.map +0 -1
- package/dist/chunk-OBJRIQPX.js.map +0 -1
- package/dist/chunk-SZF52NMJ.js.map +0 -1
- package/dist/chunk-UAAXRSW2.js.map +0 -1
- /package/dist/{chunk-C7K3EFGI.js.map → chunk-4XIHKCWC.js.map} +0 -0
- /package/dist/{chunk-XZF4QNT4.js.map → chunk-D2Z2QZVE.js.map} +0 -0
- /package/dist/{chunk-IVIXKAEH.js.map → chunk-GLMDAZSQ.js.map} +0 -0
- /package/dist/{chunk-466AWJTS.js.map → chunk-KVS7J7BJ.js.map} +0 -0
- /package/dist/{chunk-KWQ4N4IZ.js.map → chunk-NO7WDGST.js.map} +0 -0
- /package/dist/{chunk-SVGIWXNK.js.map → chunk-VERGPY42.js.map} +0 -0
- /package/dist/{chunk-Q6AWM3RH.js.map → chunk-Z72JKSAY.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
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 AgentActivityRenameSessionInput,\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 AgentActivityRuntimeListPinnedSessionsPageInput {\n agentTargetId?: string | null;\n cursor?: string;\n limit?: number;\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 AgentActivityRuntimeSessionPage {\n sessions: AgentActivitySession[];\n hasMore: boolean;\n nextCursor?: string;\n}\n\nexport interface AgentActivityRuntimeSessionSectionsResult {\n pinned?: AgentActivityRuntimeSessionPage;\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 listPinnedSessionsPage?(\n input: AgentActivityRuntimeListPinnedSessionsPageInput\n ): Promise<AgentActivityRuntimeSessionPage>;\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 renameSession(\n input: AgentActivityRenameSessionInput\n ): Promise<AgentActivitySession>;\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 hermesRoundedUrl,\n manageAgentClaudeCodeUrl,\n manageAgentCodexUrl,\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 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 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":"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","names":["createContext","useContext","useEffect","jsx","createContext","useEffect","useContext"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
agentGuiWorkbenchOpenSessionActivationType,
|
|
3
3
|
agentGuiWorkbenchPrefillPromptActivationType
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BT2DT2P7.js";
|
|
5
5
|
import {
|
|
6
6
|
isAgentGuiWorkbenchProvider,
|
|
7
7
|
normalizeAgentGuiWorkbenchProvider
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BTUOROCD.js";
|
|
9
9
|
|
|
10
10
|
// workbench/launch.ts
|
|
11
11
|
var agentGuiWorkbenchTypeId = "agent-gui";
|
|
@@ -124,7 +124,7 @@ function createAgentGuiWorkbenchLaunchDescriptor(request) {
|
|
|
124
124
|
}),
|
|
125
125
|
openInNewWindow: openInNewWindow2,
|
|
126
126
|
provider,
|
|
127
|
-
reuseDockEntryNode: shouldReuseAgentGuiWorkbenchDockEntryNode({
|
|
127
|
+
reuseDockEntryNode: !openInNewWindow2 && shouldReuseAgentGuiWorkbenchDockEntryNode({
|
|
128
128
|
dockEntryId,
|
|
129
129
|
launchKind: "prefill"
|
|
130
130
|
}),
|
|
@@ -237,4 +237,4 @@ export {
|
|
|
237
237
|
resolveAgentGuiWorkbenchLaunchDockEntryId,
|
|
238
238
|
shouldReuseAgentGuiWorkbenchDockEntryNode
|
|
239
239
|
};
|
|
240
|
-
//# sourceMappingURL=chunk-
|
|
240
|
+
//# sourceMappingURL=chunk-FPODKSSV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../workbench/launch.ts"],"sourcesContent":["import type { WorkbenchHostLaunchRequest } from \"@tutti-os/workbench-surface\";\nimport {\n isAgentGuiWorkbenchProvider,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport {\n agentGuiWorkbenchOpenSessionActivationType,\n agentGuiWorkbenchPrefillPromptActivationType,\n type AgentGuiWorkbenchPrefillPromptPayload,\n type AgentGuiWorkbenchProvider\n} from \"./types.ts\";\n\nexport { agentGuiWorkbenchPrefillPromptActivationType } from \"./types.ts\";\n\ntype AgentGuiWorkbenchLaunchRequestInput = Pick<\n WorkbenchHostLaunchRequest,\n \"payload\" | \"typeId\"\n> & {\n dockEntryId?: string | null;\n};\n\nexport const agentGuiWorkbenchTypeId = \"agent-gui\";\n\nconst agentGuiWorkbenchDockEntryPrefix = \"agent-gui:\";\nconst agentGuiWorkbenchUnifiedDockEntryIdValue = \"agent-gui:unified\";\nlet agentGuiWorkbenchInstanceSequence = 0;\n\nexport type AgentGuiWorkbenchDockIdentity =\n | {\n kind: \"legacyProvider\";\n provider: AgentGuiWorkbenchProvider;\n }\n | {\n kind: \"unifiedAggregate\";\n };\n\nexport function agentGuiWorkbenchDockEntryId(\n provider: AgentGuiWorkbenchProvider\n): string {\n return provider === \"codex\"\n ? agentGuiWorkbenchTypeId\n : `${agentGuiWorkbenchDockEntryPrefix}${provider}`;\n}\n\nexport function agentGuiWorkbenchUnifiedDockEntryId(): string {\n return agentGuiWorkbenchUnifiedDockEntryIdValue;\n}\n\nexport function agentGuiWorkbenchInstanceId(\n provider: AgentGuiWorkbenchProvider\n): string {\n return `${agentGuiWorkbenchDockEntryPrefix}${provider}`;\n}\n\nexport function createAgentGuiWorkbenchInstanceId(input: {\n agentSessionId?: string | null;\n agentTargetId?: string | null;\n provider: AgentGuiWorkbenchProvider;\n}): string {\n const prefix = agentGuiWorkbenchInstanceId(input.provider);\n const agentSessionId = input.agentSessionId?.trim();\n if (agentSessionId) {\n return `${prefix}:session:${encodeAgentGuiWorkbenchInstanceSegment(\n agentSessionId\n )}`;\n }\n const agentTargetId = input.agentTargetId?.trim();\n if (agentTargetId) {\n return `${prefix}:target:${encodeAgentGuiWorkbenchInstanceSegment(\n agentTargetId\n )}`;\n }\n\n agentGuiWorkbenchInstanceSequence += 1;\n return [\n prefix,\n \"panel\",\n `${Date.now().toString(36)}-${agentGuiWorkbenchInstanceSequence.toString(36)}`\n ].join(\":\");\n}\n\nexport function agentGuiWorkbenchProviderFromIdentifier(\n value: string | null | undefined\n): AgentGuiWorkbenchProvider | null {\n const identity = agentGuiWorkbenchDockIdentityFromIdentifier(value);\n return identity?.kind === \"legacyProvider\" ? identity.provider : null;\n}\n\nexport function agentGuiWorkbenchDockIdentityFromIdentifier(\n value: string | null | undefined\n): AgentGuiWorkbenchDockIdentity | null {\n const normalized = value?.trim();\n if (!normalized) {\n return null;\n }\n if (normalized === agentGuiWorkbenchUnifiedDockEntryId()) {\n return { kind: \"unifiedAggregate\" };\n }\n if (normalized === agentGuiWorkbenchTypeId) {\n return { kind: \"legacyProvider\", provider: \"codex\" };\n }\n if (!normalized.startsWith(agentGuiWorkbenchDockEntryPrefix)) {\n return null;\n }\n const provider = normalized\n .slice(agentGuiWorkbenchDockEntryPrefix.length)\n .split(\":\", 1)[0];\n return isAgentGuiWorkbenchProvider(provider)\n ? { kind: \"legacyProvider\", provider }\n : null;\n}\n\nexport function agentGuiWorkbenchProviderFromLaunchRequest(\n request: AgentGuiWorkbenchLaunchRequestInput\n): AgentGuiWorkbenchProvider {\n const payloadProvider =\n request.payload &&\n typeof request.payload === \"object\" &&\n !Array.isArray(request.payload)\n ? (request.payload as { provider?: unknown }).provider\n : null;\n if (isAgentGuiWorkbenchProvider(payloadProvider)) {\n return payloadProvider;\n }\n return (\n agentGuiWorkbenchProviderFromIdentifier(request.dockEntryId) ??\n agentGuiWorkbenchProviderFromIdentifier(request.typeId) ??\n \"codex\"\n );\n}\n\nexport function createAgentGuiWorkbenchSessionLaunchRequest(input: {\n agentTargetId?: string | null;\n agentSessionId?: string;\n openInNewWindow?: boolean;\n provider: unknown;\n}) {\n const provider = normalizeAgentGuiWorkbenchProvider(input.provider);\n return {\n dockEntryId: agentGuiWorkbenchDockEntryId(provider),\n payload: {\n ...(input.agentTargetId?.trim()\n ? { agentTargetId: input.agentTargetId.trim() }\n : {}),\n ...(input.agentSessionId ? { agentSessionId: input.agentSessionId } : {}),\n ...(input.openInNewWindow ? { openInNewWindow: true } : {}),\n provider\n },\n reason: \"host\" as const,\n typeId: agentGuiWorkbenchTypeId\n };\n}\n\nexport function createAgentGuiWorkbenchDraftLaunchRequest(input: {\n agentTargetId?: string | null;\n autoSubmit?: boolean;\n draftPrompt: string;\n openInNewWindow?: boolean;\n provider: unknown;\n userProjectPath?: string | null;\n}) {\n const provider = normalizeAgentGuiWorkbenchProvider(input.provider);\n const userProjectPath = normalizeAgentGuiWorkbenchUserProjectPath(\n input.userProjectPath\n );\n return {\n dockEntryId: agentGuiWorkbenchDockEntryId(provider),\n payload: {\n draftPrompt: input.draftPrompt,\n provider,\n ...(input.agentTargetId?.trim()\n ? { agentTargetId: input.agentTargetId.trim() }\n : {}),\n ...(input.autoSubmit ? { autoSubmit: true } : {}),\n ...(input.openInNewWindow ? { openInNewWindow: true } : {}),\n ...(userProjectPath ? { userProjectPath } : {})\n },\n reason: \"host\" as const,\n typeId: agentGuiWorkbenchTypeId\n };\n}\n\nexport interface AgentGuiWorkbenchLaunchDescriptor {\n activation:\n | {\n payload: {\n agentSessionId: string;\n };\n type: typeof agentGuiWorkbenchOpenSessionActivationType;\n }\n | {\n payload: AgentGuiWorkbenchPrefillPromptPayload;\n type: typeof agentGuiWorkbenchPrefillPromptActivationType;\n }\n | null;\n dockEntryId: string;\n instanceId: string;\n openInNewWindow: boolean;\n provider: AgentGuiWorkbenchProvider;\n reuseDockEntryNode: boolean;\n reuseExistingSessionNode: boolean;\n targetAgentSessionId: string | null;\n}\n\nexport function createAgentGuiWorkbenchLaunchDescriptor(\n request: AgentGuiWorkbenchLaunchRequestInput\n): AgentGuiWorkbenchLaunchDescriptor {\n const provider = agentGuiWorkbenchProviderFromLaunchRequest(request);\n const dockEntryId = resolveAgentGuiWorkbenchLaunchDockEntryId({\n provider,\n requestedDockEntryId: request.dockEntryId\n });\n const prefillPrompt = prefillPromptFromLaunchPayload(request.payload);\n if (prefillPrompt) {\n const openInNewWindow = openInNewWindowFromLaunchPayload(request.payload);\n return {\n activation: {\n payload: prefillPrompt,\n type: agentGuiWorkbenchPrefillPromptActivationType\n },\n dockEntryId,\n instanceId: createAgentGuiWorkbenchInstanceId({\n agentTargetId: openInNewWindow\n ? null\n : agentTargetIdFromLaunchPayload(request.payload),\n provider\n }),\n openInNewWindow,\n provider,\n reuseDockEntryNode:\n !openInNewWindow &&\n shouldReuseAgentGuiWorkbenchDockEntryNode({\n dockEntryId,\n launchKind: \"prefill\"\n }),\n reuseExistingSessionNode: !openInNewWindow,\n targetAgentSessionId: null\n };\n }\n\n const targetAgentSessionId = agentSessionIdFromLaunchPayload(request.payload);\n const openInNewWindow = openInNewWindowFromLaunchPayload(request.payload);\n const instanceId = createAgentGuiWorkbenchInstanceId({\n agentSessionId: null,\n agentTargetId: openInNewWindow\n ? null\n : agentTargetIdFromLaunchPayload(request.payload),\n provider\n });\n\n return {\n activation: targetAgentSessionId\n ? {\n payload: {\n agentSessionId: targetAgentSessionId\n },\n type: agentGuiWorkbenchOpenSessionActivationType\n }\n : null,\n dockEntryId,\n instanceId,\n openInNewWindow,\n provider,\n reuseDockEntryNode: shouldReuseAgentGuiWorkbenchDockEntryNode({\n dockEntryId,\n launchKind: targetAgentSessionId ? \"session\" : \"empty\"\n }),\n reuseExistingSessionNode: !openInNewWindow,\n targetAgentSessionId\n };\n}\n\nexport function resolveAgentGuiWorkbenchLaunchDockEntryId(input: {\n provider: AgentGuiWorkbenchProvider;\n requestedDockEntryId?: string | null;\n}): string {\n const requestedIdentity = agentGuiWorkbenchDockIdentityFromIdentifier(\n input.requestedDockEntryId\n );\n if (requestedIdentity?.kind === \"unifiedAggregate\") {\n return agentGuiWorkbenchUnifiedDockEntryId();\n }\n return agentGuiWorkbenchDockEntryId(input.provider);\n}\n\nexport function shouldReuseAgentGuiWorkbenchDockEntryNode(input: {\n dockEntryId: string;\n launchKind: \"empty\" | \"prefill\" | \"session\";\n}): boolean {\n if (input.launchKind !== \"prefill\") {\n return false;\n }\n return (\n agentGuiWorkbenchDockIdentityFromIdentifier(input.dockEntryId)?.kind !==\n \"unifiedAggregate\"\n );\n}\n\nfunction encodeAgentGuiWorkbenchInstanceSegment(value: string): string {\n return encodeURIComponent(value.trim());\n}\n\nfunction prefillPromptFromLaunchPayload(\n payload: unknown\n): AgentGuiWorkbenchPrefillPromptPayload | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return null;\n }\n const draftPrompt = (payload as { draftPrompt?: unknown }).draftPrompt;\n if (typeof draftPrompt !== \"string\" || !draftPrompt.trim()) {\n return null;\n }\n const autoSubmit = (payload as { autoSubmit?: unknown }).autoSubmit === true;\n const provider = (payload as { provider?: unknown }).provider;\n const agentTargetId = agentTargetIdFromLaunchPayload(payload);\n const userProjectPath = (payload as { userProjectPath?: unknown })\n .userProjectPath;\n const normalizedUserProjectPath =\n typeof userProjectPath === \"string\"\n ? normalizeAgentGuiWorkbenchUserProjectPath(userProjectPath)\n : null;\n return {\n draftPrompt,\n ...(agentTargetId ? { agentTargetId } : {}),\n ...(autoSubmit ? { autoSubmit: true } : {}),\n ...(isAgentGuiWorkbenchProvider(provider) ? { provider } : {}),\n ...(normalizedUserProjectPath\n ? { userProjectPath: normalizedUserProjectPath }\n : {})\n };\n}\n\nfunction normalizeAgentGuiWorkbenchUserProjectPath(\n value: string | null | undefined\n): string | null {\n const normalized = value?.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/, \"\");\n return normalized ? normalized : null;\n}\n\nfunction agentSessionIdFromLaunchPayload(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return null;\n }\n const agentSessionId = (payload as { agentSessionId?: unknown })\n .agentSessionId;\n return typeof agentSessionId === \"string\" && agentSessionId.trim()\n ? agentSessionId.trim()\n : null;\n}\n\nfunction agentTargetIdFromLaunchPayload(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return null;\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n return typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : null;\n}\n\nfunction openInNewWindowFromLaunchPayload(payload: unknown): boolean {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return false;\n }\n return (payload as { openInNewWindow?: unknown }).openInNewWindow === true;\n}\n"],"mappings":"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","names":["openInNewWindow"]}
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
getOptionalAgentHostApi,
|
|
4
4
|
managedAgentRoundedIconUrl,
|
|
5
5
|
useOptionalAgentHostApi
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-FHWE5SUF.js";
|
|
7
7
|
import {
|
|
8
8
|
translate,
|
|
9
9
|
useTranslation
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-4XIHKCWC.js";
|
|
11
11
|
import {
|
|
12
12
|
resolveAgentWorkspaceFileVisualKind
|
|
13
13
|
} from "./chunk-PJP5BUU6.js";
|
|
@@ -3707,4 +3707,4 @@ export {
|
|
|
3707
3707
|
CustomScrollArea,
|
|
3708
3708
|
MessageSquareMoreIcon
|
|
3709
3709
|
};
|
|
3710
|
-
//# sourceMappingURL=chunk-
|
|
3710
|
+
//# sourceMappingURL=chunk-GLMDAZSQ.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
userAvatarPlaceholderUrl,
|
|
3
3
|
workspaceAgentActivityStatusLabel
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VERGPY42.js";
|
|
5
5
|
import {
|
|
6
6
|
normalizeAgentSessionMentionTitle
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NO7WDGST.js";
|
|
8
8
|
import {
|
|
9
9
|
resolveAgentMentionFileThumbnailUrl,
|
|
10
10
|
resolveAgentMentionFileVisualKind
|
|
@@ -12,10 +12,10 @@ import {
|
|
|
12
12
|
import {
|
|
13
13
|
getOptionalAgentHostApi,
|
|
14
14
|
managedAgentRoundedIconUrl
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-FHWE5SUF.js";
|
|
16
16
|
import {
|
|
17
17
|
translate
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-4XIHKCWC.js";
|
|
19
19
|
import {
|
|
20
20
|
AGENT_CONTEXT_MENTION_PROVIDER_IDS
|
|
21
21
|
} from "./chunk-JM24HADP.js";
|
|
@@ -2186,4 +2186,4 @@ export {
|
|
|
2186
2186
|
AgentFileMentionPalette,
|
|
2187
2187
|
AgentContextMentionPalette
|
|
2188
2188
|
};
|
|
2189
|
-
//# sourceMappingURL=chunk-
|
|
2189
|
+
//# sourceMappingURL=chunk-KVS7J7BJ.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
translateInUiLanguage
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-W5AJTBA7.js";
|
|
4
4
|
import {
|
|
5
5
|
normalizeAgentTitleText
|
|
6
6
|
} from "./chunk-GCBDIQDX.js";
|
|
@@ -18,11 +18,9 @@ var SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE = {
|
|
|
18
18
|
};
|
|
19
19
|
var PLAIN_SESSION_AGENT_LABELS = [
|
|
20
20
|
"Claude Code",
|
|
21
|
-
"Gemini CLI",
|
|
22
21
|
"Hermes Agent",
|
|
23
22
|
"OpenClaw",
|
|
24
23
|
"Nexight",
|
|
25
|
-
"Gemini",
|
|
26
24
|
"Hermes",
|
|
27
25
|
"Codex"
|
|
28
26
|
];
|
|
@@ -102,7 +100,6 @@ var AGENT_PROVIDER_LABEL = {
|
|
|
102
100
|
cursor: "Cursor",
|
|
103
101
|
nexight: "Nexight",
|
|
104
102
|
opencode: "OpenCode",
|
|
105
|
-
gemini: "Gemini CLI",
|
|
106
103
|
openclaw: "OpenClaw",
|
|
107
104
|
hermes: "Hermes Agent"
|
|
108
105
|
};
|
|
@@ -126,8 +123,6 @@ function normalizeAgentGUIProviderIdentity(provider) {
|
|
|
126
123
|
case "nexight":
|
|
127
124
|
case "tutti":
|
|
128
125
|
return "nexight";
|
|
129
|
-
case "gemini":
|
|
130
|
-
return "gemini";
|
|
131
126
|
case "hermes":
|
|
132
127
|
return "hermes";
|
|
133
128
|
case "openclaw":
|
|
@@ -327,4 +322,4 @@ export {
|
|
|
327
322
|
resolveAgentGUIProviderDisplayLabel,
|
|
328
323
|
firstAgentGUIUserMessageTitle
|
|
329
324
|
};
|
|
330
|
-
//# sourceMappingURL=chunk-
|
|
325
|
+
//# sourceMappingURL=chunk-LWFV4PS5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/utils/agentSessionMentionText.ts","../contexts/settings/domain/agentSettings.providerMeta.ts","../shared/agentConversationTitleProjection.ts"],"sourcesContent":["import type { UiLanguage } from \"../../contexts/settings/domain/agentSettings\";\nimport { normalizeAgentTitleText } from \"./agentTitleText.ts\";\nimport {\n isRichTextMentionHref,\n parseRichTextMentionHref\n} from \"@tutti-os/ui-rich-text/core\";\n\nconst MARKDOWN_LINK_PATTERN = /\\[((?:\\\\.|[^\\]\\\\])*)\\]\\(([^)\\s]+)\\)/g;\nconst MARKDOWN_LABEL_ESCAPE_PATTERN = /\\\\([\\\\[\\]()])/g;\nconst SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE: Record<UiLanguage, string> = {\n \"zh-CN\": \"@会话 · \",\n en: \"@session · \"\n};\nconst PLAIN_SESSION_AGENT_LABELS = [\n \"Claude Code\",\n \"Hermes Agent\",\n \"OpenClaw\",\n \"Nexight\",\n \"Hermes\",\n \"Codex\"\n] as const;\n\nexport interface FormatAgentSessionMentionTextOptions {\n language?: UiLanguage;\n}\n\nexport function formatAgentSessionMentionText(\n value: string | null | undefined,\n options: FormatAgentSessionMentionTextOptions = {}\n): string {\n const trimmed = value?.trim() ?? \"\";\n if (!trimmed) {\n return \"\";\n }\n const sessionMentionDisplayPrefix = sessionMentionDisplayPrefixForLanguage(\n options.language\n );\n\n const withSessionMentionsNormalized = trimmed.replace(\n MARKDOWN_LINK_PATTERN,\n (fullMatch, rawLabel: string, href: string) => {\n const label = unescapeMarkdownLabel(rawLabel);\n const mention = parseRichTextMentionHref(href, label);\n if (!mention) {\n return isRichTextMentionHref(href) ? label : fullMatch;\n }\n const providerId = mention.providerId.trim().toLowerCase();\n const displayLabel = label || mention.label;\n if (providerId === \"agent-session\") {\n return formatSessionLabel(displayLabel, sessionMentionDisplayPrefix);\n }\n if (providerId === \"workspace-issue\") {\n return formatIssueLabel(displayLabel);\n }\n return displayLabel;\n }\n );\n const normalized = normalizeAgentTitleText(withSessionMentionsNormalized);\n if (isPlainSessionMentionText(normalized, sessionMentionDisplayPrefix)) {\n return formatSessionLabel(normalized, sessionMentionDisplayPrefix);\n }\n return normalized;\n}\n\nfunction isPlainSessionMentionText(\n value: string,\n sessionMentionDisplayPrefix: string\n): boolean {\n const trimmed = value.trim();\n if (\n !trimmed.startsWith(\"@\") ||\n trimmed.startsWith(sessionMentionDisplayPrefix)\n ) {\n return false;\n }\n\n return PLAIN_SESSION_AGENT_LABELS.some((agentLabel) => {\n const ampersandSeparator = ` & ${agentLabel}`;\n const ampersandIndex = trimmed.indexOf(ampersandSeparator);\n if (ampersandIndex > 1) {\n const trailing = trimmed.slice(\n ampersandIndex + ampersandSeparator.length\n );\n if (trailing === \"\" || trailing.startsWith(\" \")) {\n return true;\n }\n }\n\n const dottedSeparator = ` · ${agentLabel} · `;\n return trimmed.indexOf(dottedSeparator) > 1;\n });\n}\n\nfunction sessionMentionDisplayPrefixForLanguage(\n language: UiLanguage | undefined\n): string {\n return SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE[language ?? \"en\"];\n}\n\nfunction formatSessionLabel(\n label: string,\n sessionMentionDisplayPrefix: string\n): string {\n const normalizedLabel = label.trim().replace(/^@+/, \"\").trim();\n return normalizedLabel\n ? `${sessionMentionDisplayPrefix}${normalizedLabel}`\n : label.trim();\n}\n\nfunction formatIssueLabel(label: string): string {\n const normalizedLabel = label.trim().replace(/^@+/, \"\").trim();\n return normalizedLabel ? `@Task · ${normalizedLabel}` : label.trim();\n}\n\nfunction unescapeMarkdownLabel(label: string): string {\n return label.replace(MARKDOWN_LABEL_ESCAPE_PATTERN, \"$1\");\n}\n","import type { AgentProvider } from \"./agentSettings\";\n\nexport const AGENT_PROVIDER_LABEL: Record<AgentProvider, string> = {\n \"claude-code\": \"Claude Code\",\n codex: \"Codex\",\n \"tutti-agent\": \"Tutti Agent\",\n cursor: \"Cursor\",\n nexight: \"Nexight\",\n opencode: \"OpenCode\",\n openclaw: \"OpenClaw\",\n hermes: \"Hermes Agent\"\n};\n\nexport interface AgentProviderCapabilities {\n runtimeObservation: \"jsonl\" | \"provider-api\" | \"none\";\n experimental: boolean;\n}\n\nexport const AGENT_PROVIDER_CAPABILITIES: Record<\n AgentProvider,\n AgentProviderCapabilities\n> = {\n \"claude-code\": {\n runtimeObservation: \"jsonl\",\n experimental: false\n },\n codex: {\n runtimeObservation: \"jsonl\",\n experimental: false\n },\n \"tutti-agent\": {\n runtimeObservation: \"provider-api\",\n experimental: false\n },\n cursor: {\n runtimeObservation: \"jsonl\",\n experimental: false\n },\n nexight: {\n runtimeObservation: \"jsonl\",\n experimental: false\n },\n opencode: {\n runtimeObservation: \"provider-api\",\n experimental: false\n },\n openclaw: {\n runtimeObservation: \"jsonl\",\n experimental: false\n },\n hermes: {\n runtimeObservation: \"jsonl\",\n experimental: false\n }\n};\n","import { AGENT_PROVIDER_LABEL } from \"../contexts/settings/domain/agentSettings.providerMeta.ts\";\nimport type { UiLanguage } from \"../contexts/settings/domain/agentSettings.ts\";\nimport { translateInUiLanguage } from \"../i18n/runtime.ts\";\nimport type { AgentGUIProvider } from \"../types.ts\";\nimport type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentActivityTypes.ts\";\nimport { formatAgentSessionMentionText } from \"./utils/agentSessionMentionText.ts\";\nimport { normalizeAgentTitleText } from \"./utils/agentTitleText.ts\";\n\nexport type AgentGUIResolvedProvider = AgentGUIProvider | \"unknown\";\nexport type AgentGUIConversationTitleFallback = \"generic-agent\" | null;\n\nexport interface AgentGUIConversationPlainTitleOptions {\n fallbackAgentLabel?: string;\n language?: UiLanguage;\n}\n\nexport interface AgentGUIConversationTitleMessage {\n id?: number | string | null;\n messageId?: string | null;\n version?: number | null;\n role?: string | null;\n kind?: string | null;\n payload?: {\n content?: unknown;\n displayPrompt?: unknown;\n text?: unknown;\n } | null;\n occurredAtUnixMs?: number | null;\n completedAtUnixMs?: number | null;\n startedAtUnixMs?: number | null;\n}\n\nexport function normalizeAgentGUIProviderIdentity(\n provider: string | null | undefined\n): AgentGUIResolvedProvider {\n switch (provider?.trim().toLowerCase() ?? \"\") {\n case \"claude-code\":\n case \"claude\":\n case \"claude code\":\n return \"claude-code\";\n case \"codex\":\n return \"codex\";\n case \"tutti-agent\":\n case \"tutti agent\":\n return \"tutti-agent\";\n case \"cursor\":\n case \"cursor-agent\":\n case \"cursor agent\":\n return \"cursor\";\n case \"nexight\":\n case \"tutti\":\n return \"nexight\";\n case \"hermes\":\n return \"hermes\";\n case \"openclaw\":\n return \"openclaw\";\n case \"opencode\":\n case \"open-code\":\n case \"opencode-ai\":\n return \"opencode\";\n default:\n return \"unknown\";\n }\n}\n\nexport function resolveAgentGUIProviderIdentity(input: {\n sessionProvider?: string | null;\n workspaceSessionProvider?: string | null;\n conversationProvider?: string | null;\n timelineItems?: readonly WorkspaceAgentActivityTimelineItem[];\n}): AgentGUIResolvedProvider {\n const candidates = [\n input.sessionProvider,\n input.workspaceSessionProvider,\n input.conversationProvider,\n timelineProviderHint(input.timelineItems ?? [])\n ];\n for (const candidate of candidates) {\n const normalized = normalizeAgentGUIProviderIdentity(candidate);\n if (normalized !== \"unknown\") {\n return normalized;\n }\n }\n return \"unknown\";\n}\n\nexport function resolveAgentGUIConversationTitle(\n title: string | null | undefined,\n provider: AgentGUIResolvedProvider\n): {\n title: string;\n titleFallback: AgentGUIConversationTitleFallback;\n} {\n const normalizedTitle = stripAgentGUITitleTrailingPeriod(\n normalizeAgentTitleText(title)\n );\n if (normalizedTitle) {\n return {\n title: normalizedTitle,\n titleFallback: null\n };\n }\n if (provider === \"unknown\") {\n return {\n title: \"\",\n titleFallback: \"generic-agent\"\n };\n }\n return {\n title: AGENT_PROVIDER_LABEL[provider],\n titleFallback: null\n };\n}\n\nexport function resolveAgentGUIConversationDisplayTitle(\n input: {\n title: string;\n titleFallback?: AgentGUIConversationTitleFallback;\n },\n fallbackAgentLabel: string\n): string {\n if (input.title) {\n return stripAgentGUITitleTrailingPeriod(\n normalizeAgentTitleText(input.title)\n );\n }\n if (input.titleFallback === \"generic-agent\") {\n return stripAgentGUITitleTrailingPeriod(fallbackAgentLabel);\n }\n return \"\";\n}\n\nexport function formatAgentGUIConversationPlainTitle(\n input: {\n title: string;\n titleFallback?: AgentGUIConversationTitleFallback;\n },\n options: AgentGUIConversationPlainTitleOptions = {}\n): string {\n return formatAgentSessionMentionText(\n resolveAgentGUIConversationDisplayTitle(\n input,\n options.fallbackAgentLabel ?? \"Agent\"\n ),\n {\n language: options.language\n }\n );\n}\n\nexport function resolveAgentGUIDockConversationTitle(input: {\n provider: AgentGUIResolvedProvider;\n title: string;\n titleFallback?: AgentGUIConversationTitleFallback;\n}): string | null {\n return resolveAgentGUIExplicitConversationTitle(input);\n}\n\nexport function resolveAgentGUIExplicitConversationTitle(input: {\n provider: AgentGUIResolvedProvider;\n title: string;\n titleFallback?: AgentGUIConversationTitleFallback;\n}): string | null {\n if (input.titleFallback) {\n return null;\n }\n\n const title = stripAgentGUITitleTrailingPeriod(\n normalizeAgentTitleText(input.title)\n );\n if (!title) {\n return null;\n }\n if (isAgentGUIUntitledTaskTitle(title)) {\n return null;\n }\n\n if (\n input.provider !== \"unknown\" &&\n title === AGENT_PROVIDER_LABEL[input.provider]\n ) {\n return null;\n }\n\n return title;\n}\n\nexport function resolveAgentGUIProviderDisplayLabel(\n provider: string | null | undefined,\n fallbackAgentLabel: string\n): string {\n const resolvedProvider = normalizeAgentGUIProviderIdentity(provider);\n if (resolvedProvider === \"unknown\") {\n return fallbackAgentLabel;\n }\n return AGENT_PROVIDER_LABEL[resolvedProvider];\n}\n\nexport function firstAgentGUIUserMessageTitle(\n messages: readonly AgentGUIConversationTitleMessage[]\n): string {\n const userMessage = [...messages]\n .filter(\n (message) =>\n messageRole(message) === \"user\" && messageText(message).length > 0\n )\n .sort(compareMessagesAscending)[0];\n return userMessage ? messageText(userMessage) : \"\";\n}\n\nfunction messageRole(\n message: AgentGUIConversationTitleMessage\n): \"user\" | \"agent\" | null {\n const role = message.role?.trim().toLowerCase();\n if (role === \"user\") {\n return \"user\";\n }\n if (role === \"assistant\" || role === \"agent\") {\n return \"agent\";\n }\n const kind = message.kind?.trim().toLowerCase() ?? \"\";\n if (kind === \"message.user\") {\n return \"user\";\n }\n if (kind === \"message.assistant\" || kind === \"message.agent\") {\n return \"agent\";\n }\n return null;\n}\n\nfunction messageText(message: AgentGUIConversationTitleMessage): string {\n const payload = message.payload;\n const displayPrompt =\n typeof payload?.displayPrompt === \"string\" ? payload.displayPrompt : \"\";\n const text = typeof payload?.text === \"string\" ? payload.text : \"\";\n const content = typeof payload?.content === \"string\" ? payload.content : \"\";\n return normalizeAgentTitleText(displayPrompt || text || content);\n}\n\nfunction compareMessagesAscending(\n left: AgentGUIConversationTitleMessage,\n right: AgentGUIConversationTitleMessage\n): number {\n const leftTime =\n left.occurredAtUnixMs ??\n left.completedAtUnixMs ??\n left.startedAtUnixMs ??\n 0;\n const rightTime =\n right.occurredAtUnixMs ??\n right.completedAtUnixMs ??\n right.startedAtUnixMs ??\n 0;\n const timeDiff = leftTime - rightTime;\n if (timeDiff !== 0) {\n return timeDiff;\n }\n const sequenceDiff =\n messageSequence(left) - messageSequence(right) ||\n (left.messageId ?? \"\").localeCompare(right.messageId ?? \"\");\n return sequenceDiff;\n}\n\nfunction messageSequence(message: AgentGUIConversationTitleMessage): number {\n const numericId =\n typeof message.id === \"number\" && Number.isFinite(message.id)\n ? message.id\n : 0;\n return message.version ?? numericId;\n}\n\nfunction stripAgentGUITitleTrailingPeriod(title: string): string {\n return title\n .trimEnd()\n .replace(/[.。]+$/u, \"\")\n .trimEnd();\n}\n\nfunction isAgentGUIUntitledTaskTitle(title: string): boolean {\n return localizedAgentGUIUntitledTaskLabels().has(compactTitleText(title));\n}\n\nfunction localizedAgentGUIUntitledTaskLabels(): Set<string> {\n return new Set(\n ([\"en\", \"zh-CN\"] as const)\n .map((language) =>\n compactTitleText(\n translateInUiLanguage(\n language,\n \"agentHost.workspaceAgentsUntitledTask\"\n )\n )\n )\n .filter(Boolean)\n );\n}\n\nfunction timelineProviderHint(\n timelineItems: readonly WorkspaceAgentActivityTimelineItem[]\n): string | null {\n for (const item of timelineItems) {\n if (isUserTimelineItem(item)) {\n continue;\n }\n const normalized = normalizeAgentGUIProviderIdentity(item.actorId);\n if (normalized !== \"unknown\") {\n return normalized;\n }\n }\n return null;\n}\n\nfunction isUserTimelineItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n const role = item.role?.trim().toLowerCase();\n if (role === \"user\") {\n return true;\n }\n const actorType = item.actorType.trim().toLowerCase();\n if (actorType === \"user\") {\n return true;\n }\n return item.itemType.trim().toLowerCase() === \"message.user\";\n}\n\nfunction compactTitleText(value: string): string {\n return value.trim().replace(/\\s+/g, \" \");\n}\n"],"mappings":";;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,IAAM,wBAAwB;AAC9B,IAAM,gCAAgC;AACtC,IAAM,6CAAyE;AAAA,EAC7E,SAAS;AAAA,EACT,IAAI;AACN;AACA,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,SAAS,8BACd,OACA,UAAgD,CAAC,GACzC;AACR,QAAM,UAAU,OAAO,KAAK,KAAK;AACjC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,8BAA8B;AAAA,IAClC,QAAQ;AAAA,EACV;AAEA,QAAM,gCAAgC,QAAQ;AAAA,IAC5C;AAAA,IACA,CAAC,WAAW,UAAkB,SAAiB;AAC7C,YAAM,QAAQ,sBAAsB,QAAQ;AAC5C,YAAM,UAAU,yBAAyB,MAAM,KAAK;AACpD,UAAI,CAAC,SAAS;AACZ,eAAO,sBAAsB,IAAI,IAAI,QAAQ;AAAA,MAC/C;AACA,YAAM,aAAa,QAAQ,WAAW,KAAK,EAAE,YAAY;AACzD,YAAM,eAAe,SAAS,QAAQ;AACtC,UAAI,eAAe,iBAAiB;AAClC,eAAO,mBAAmB,cAAc,2BAA2B;AAAA,MACrE;AACA,UAAI,eAAe,mBAAmB;AACpC,eAAO,iBAAiB,YAAY;AAAA,MACtC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,aAAa,wBAAwB,6BAA6B;AACxE,MAAI,0BAA0B,YAAY,2BAA2B,GAAG;AACtE,WAAO,mBAAmB,YAAY,2BAA2B;AAAA,EACnE;AACA,SAAO;AACT;AAEA,SAAS,0BACP,OACA,6BACS;AACT,QAAM,UAAU,MAAM,KAAK;AAC3B,MACE,CAAC,QAAQ,WAAW,GAAG,KACvB,QAAQ,WAAW,2BAA2B,GAC9C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,2BAA2B,KAAK,CAAC,eAAe;AACrD,UAAM,qBAAqB,MAAM,UAAU;AAC3C,UAAM,iBAAiB,QAAQ,QAAQ,kBAAkB;AACzD,QAAI,iBAAiB,GAAG;AACtB,YAAM,WAAW,QAAQ;AAAA,QACvB,iBAAiB,mBAAmB;AAAA,MACtC;AACA,UAAI,aAAa,MAAM,SAAS,WAAW,GAAG,GAAG;AAC/C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,kBAAkB,SAAM,UAAU;AACxC,WAAO,QAAQ,QAAQ,eAAe,IAAI;AAAA,EAC5C,CAAC;AACH;AAEA,SAAS,uCACP,UACQ;AACR,SAAO,2CAA2C,YAAY,IAAI;AACpE;AAEA,SAAS,mBACP,OACA,6BACQ;AACR,QAAM,kBAAkB,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC7D,SAAO,kBACH,GAAG,2BAA2B,GAAG,eAAe,KAChD,MAAM,KAAK;AACjB;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,kBAAkB,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC7D,SAAO,kBAAkB,cAAW,eAAe,KAAK,MAAM,KAAK;AACrE;AAEA,SAAS,sBAAsB,OAAuB;AACpD,SAAO,MAAM,QAAQ,+BAA+B,IAAI;AAC1D;;;AClHO,IAAM,uBAAsD;AAAA,EACjE,eAAe;AAAA,EACf,OAAO;AAAA,EACP,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AACV;;;ACqBO,SAAS,kCACd,UAC0B;AAC1B,UAAQ,UAAU,KAAK,EAAE,YAAY,KAAK,IAAI;AAAA,IAC5C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,gCAAgC,OAKnB;AAC3B,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,qBAAqB,MAAM,iBAAiB,CAAC,CAAC;AAAA,EAChD;AACA,aAAW,aAAa,YAAY;AAClC,UAAM,aAAa,kCAAkC,SAAS;AAC9D,QAAI,eAAe,WAAW;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iCACd,OACA,UAIA;AACA,QAAM,kBAAkB;AAAA,IACtB,wBAAwB,KAAK;AAAA,EAC/B;AACA,MAAI,iBAAiB;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,eAAe;AAAA,IACjB;AAAA,EACF;AACA,MAAI,aAAa,WAAW;AAC1B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,eAAe;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO,qBAAqB,QAAQ;AAAA,IACpC,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,wCACd,OAIA,oBACQ;AACR,MAAI,MAAM,OAAO;AACf,WAAO;AAAA,MACL,wBAAwB,MAAM,KAAK;AAAA,IACrC;AAAA,EACF;AACA,MAAI,MAAM,kBAAkB,iBAAiB;AAC3C,WAAO,iCAAiC,kBAAkB;AAAA,EAC5D;AACA,SAAO;AACT;AAEO,SAAS,qCACd,OAIA,UAAiD,CAAC,GAC1C;AACR,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,QAAQ,sBAAsB;AAAA,IAChC;AAAA,IACA;AAAA,MACE,UAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;AAEO,SAAS,qCAAqC,OAInC;AAChB,SAAO,yCAAyC,KAAK;AACvD;AAEO,SAAS,yCAAyC,OAIvC;AAChB,MAAI,MAAM,eAAe;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ,wBAAwB,MAAM,KAAK;AAAA,EACrC;AACA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,4BAA4B,KAAK,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MACE,MAAM,aAAa,aACnB,UAAU,qBAAqB,MAAM,QAAQ,GAC7C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,oCACd,UACA,oBACQ;AACR,QAAM,mBAAmB,kCAAkC,QAAQ;AACnE,MAAI,qBAAqB,WAAW;AAClC,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,gBAAgB;AAC9C;AAEO,SAAS,8BACd,UACQ;AACR,QAAM,cAAc,CAAC,GAAG,QAAQ,EAC7B;AAAA,IACC,CAAC,YACC,YAAY,OAAO,MAAM,UAAU,YAAY,OAAO,EAAE,SAAS;AAAA,EACrE,EACC,KAAK,wBAAwB,EAAE,CAAC;AACnC,SAAO,cAAc,YAAY,WAAW,IAAI;AAClD;AAEA,SAAS,YACP,SACyB;AACzB,QAAM,OAAO,QAAQ,MAAM,KAAK,EAAE,YAAY;AAC9C,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,eAAe,SAAS,SAAS;AAC5C,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,MAAM,KAAK,EAAE,YAAY,KAAK;AACnD,MAAI,SAAS,gBAAgB;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,uBAAuB,SAAS,iBAAiB;AAC5D,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,SAAmD;AACtE,QAAM,UAAU,QAAQ;AACxB,QAAM,gBACJ,OAAO,SAAS,kBAAkB,WAAW,QAAQ,gBAAgB;AACvE,QAAM,OAAO,OAAO,SAAS,SAAS,WAAW,QAAQ,OAAO;AAChE,QAAM,UAAU,OAAO,SAAS,YAAY,WAAW,QAAQ,UAAU;AACzE,SAAO,wBAAwB,iBAAiB,QAAQ,OAAO;AACjE;AAEA,SAAS,yBACP,MACA,OACQ;AACR,QAAM,WACJ,KAAK,oBACL,KAAK,qBACL,KAAK,mBACL;AACF,QAAM,YACJ,MAAM,oBACN,MAAM,qBACN,MAAM,mBACN;AACF,QAAM,WAAW,WAAW;AAC5B,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AACA,QAAM,eACJ,gBAAgB,IAAI,IAAI,gBAAgB,KAAK,MAC5C,KAAK,aAAa,IAAI,cAAc,MAAM,aAAa,EAAE;AAC5D,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAmD;AAC1E,QAAM,YACJ,OAAO,QAAQ,OAAO,YAAY,OAAO,SAAS,QAAQ,EAAE,IACxD,QAAQ,KACR;AACN,SAAO,QAAQ,WAAW;AAC5B;AAEA,SAAS,iCAAiC,OAAuB;AAC/D,SAAO,MACJ,QAAQ,EACR,QAAQ,WAAW,EAAE,EACrB,QAAQ;AACb;AAEA,SAAS,4BAA4B,OAAwB;AAC3D,SAAO,oCAAoC,EAAE,IAAI,iBAAiB,KAAK,CAAC;AAC1E;AAEA,SAAS,sCAAmD;AAC1D,SAAO,IAAI;AAAA,IACR,CAAC,MAAM,OAAO,EACZ;AAAA,MAAI,CAAC,aACJ;AAAA,QACE;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,EACC,OAAO,OAAO;AAAA,EACnB;AACF;AAEA,SAAS,qBACP,eACe;AACf,aAAW,QAAQ,eAAe;AAChC,QAAI,mBAAmB,IAAI,GAAG;AAC5B;AAAA,IACF;AACA,UAAM,aAAa,kCAAkC,KAAK,OAAO;AACjE,QAAI,eAAe,WAAW;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAmD;AAC7E,QAAM,OAAO,KAAK,MAAM,KAAK,EAAE,YAAY;AAC3C,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,UAAU,KAAK,EAAE,YAAY;AACpD,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,SAAS,KAAK,EAAE,YAAY,MAAM;AAChD;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG;AACzC;","names":[]}
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
getAgentCustomMentionKind,
|
|
7
7
|
managedAgentRoundedIconUrl
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-FHWE5SUF.js";
|
|
9
9
|
import {
|
|
10
10
|
translate,
|
|
11
11
|
useTranslation
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-4XIHKCWC.js";
|
|
13
13
|
|
|
14
14
|
// agent-gui/agentGuiNode/agentRichText/agentFileMentionExtension.ts
|
|
15
15
|
import { mergeAttributes, Node } from "@tiptap/core";
|
|
@@ -1546,4 +1546,4 @@ export {
|
|
|
1546
1546
|
mentionItemToAttrs,
|
|
1547
1547
|
attrsToMentionItem
|
|
1548
1548
|
};
|
|
1549
|
-
//# sourceMappingURL=chunk-
|
|
1549
|
+
//# sourceMappingURL=chunk-NO7WDGST.js.map
|
|
@@ -6,8 +6,6 @@ function workspaceAgentProviderLabel(provider) {
|
|
|
6
6
|
return "Codex";
|
|
7
7
|
case "claude-code":
|
|
8
8
|
return "Claude Code";
|
|
9
|
-
case "gemini":
|
|
10
|
-
return "Gemini";
|
|
11
9
|
case "openclaw":
|
|
12
10
|
return "OpenClaw";
|
|
13
11
|
case "opencode":
|
|
@@ -192,4 +190,4 @@ export {
|
|
|
192
190
|
selectWorkspaceAgentActivityOverlayMessages,
|
|
193
191
|
mergeWorkspaceAgentActivityDurableAndOverlayMessages
|
|
194
192
|
};
|
|
195
|
-
//# sourceMappingURL=chunk-
|
|
193
|
+
//# sourceMappingURL=chunk-RA3OUR64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/workspaceAgentProviderLabel.ts","../shared/workspaceAgentActivityTypes.ts"],"sourcesContent":["export function workspaceAgentProviderLabel(provider: string): string {\n const normalized = provider.trim().toLowerCase();\n switch (normalized) {\n case \"codex\":\n return \"Codex\";\n case \"claude-code\":\n return \"Claude Code\";\n case \"openclaw\":\n return \"OpenClaw\";\n case \"opencode\":\n return \"OpenCode\";\n case \"hermes\":\n return \"Hermes\";\n case \"nexight\":\n return \"Nexight\";\n case \"unknown\":\n return \"Unknown\";\n default:\n return titleCase(provider);\n }\n}\n\nfunction titleCase(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n","import {\n mergeAgentActivityMessages,\n AgentActivityMessage,\n AgentActivityMessageSemantics,\n AgentActivityPresence,\n AgentActivitySession,\n AgentActivitySnapshot,\n AgentActivitySubmitAvailability,\n AgentActivityTurnLifecycle\n} from \"@tutti-os/agent-activity-core\";\n\nexport type WorkspaceAgentActivityProvider = \"codex\" | \"claude-code\" | string;\n\nexport interface WorkspaceAgentActivityComposerSettings {\n model?: string | null;\n reasoningEffort?: string | null;\n speed?: string | null;\n planMode?: boolean;\n browserUse?: boolean;\n computerUse?: boolean;\n permissionModeId?: string | null;\n}\n\nexport const WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN =\n \"WORKSPACE_AGENT_SESSION_ORIGIN_RUNTIME\";\n\nexport type WorkspaceAgentActivitySessionOrigin =\n | typeof WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN\n | string;\n\nexport function isWorkspaceAgentActivityRuntimeSessionOrigin(\n sessionOrigin: string | null | undefined\n): boolean {\n const normalized = sessionOrigin?.trim() ?? \"\";\n // Core-native AgentActivitySession does not carry the legacy host origin DTO.\n return (\n normalized === \"\" ||\n normalized === WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN\n );\n}\n\nexport function createWorkspaceAgentActivityUserMessageIdFromClientSubmitId(\n clientSubmitId: string\n): string | null {\n const normalized = clientSubmitId.trim();\n return normalized ? `client-submit:user:${normalized}` : null;\n}\n\nexport type WorkspaceAgentActivitySyncStatus =\n | \"pending\"\n | \"synced\"\n | \"failed\"\n | string;\n\nexport interface WorkspaceAgentActivitySyncState {\n workspaceId?: string;\n agentSessionId?: string;\n status: WorkspaceAgentActivitySyncStatus;\n pendingTimelineItemCount?: number;\n pendingStatePatchCount?: number;\n attemptCount?: number;\n failedReportCount?: number;\n lastError?: string;\n lastAttemptAtUnixMs?: number;\n lastSyncedAtUnixMs?: number;\n updatedAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityPresence extends Omit<\n AgentActivityPresence,\n \"id\" | \"provider\" | \"status\"\n> {\n id: string | number;\n provider: WorkspaceAgentActivityProvider;\n status: string;\n userId?: string | null;\n}\n\nexport interface WorkspaceAgentActivitySession extends Omit<\n AgentActivitySession,\n | \"provider\"\n | \"providerSessionId\"\n | \"pinnedAtUnixMs\"\n | \"status\"\n | \"title\"\n | \"workspaceId\"\n> {\n id?: number;\n workspaceId?: string;\n presenceId?: string | number;\n userId?: string;\n provider?: WorkspaceAgentActivityProvider;\n providerSessionId?: string | null;\n resumable?: boolean;\n sessionOrigin?: WorkspaceAgentActivitySessionOrigin;\n lifecycleStatus?: string;\n turnPhase?: string;\n endedAtUnixMs?: number;\n effectiveStatus?: string;\n status?: string;\n turnLifecycle?: AgentActivityTurnLifecycle | null;\n submitAvailability?: AgentActivitySubmitAvailability | null;\n title?: string;\n pinnedAtUnixMs?: number | null;\n syncState?: WorkspaceAgentActivitySyncState;\n}\n\nexport interface WorkspaceAgentActivityFileChange {\n path: string;\n change?: \"added\" | \"modified\" | \"deleted\" | \"moved\" | string;\n tools?: string[];\n}\n\nexport interface WorkspaceAgentActivityFileChanges {\n coverage?: string;\n files?: WorkspaceAgentActivityFileChange[];\n}\n\nexport interface WorkspaceAgentActivityTimelineItem {\n id: number;\n workspaceId?: string;\n agentSessionId: string;\n seq?: number;\n turnId?: string;\n eventSource?: string;\n eventId: string;\n actorType: string;\n actorId: string;\n itemType: \"message\" | \"call\" | \"event\" | \"error\" | \"lifecycle\" | string;\n role?: string;\n callType?: \"tool\" | \"skill\" | \"subagent\" | \"approval\" | \"workflow\" | string;\n callId?: string;\n name?: string;\n status?: string | null;\n content?: string;\n payload?: Record<string, unknown> & {\n content?: unknown;\n text?: unknown;\n fileChanges?: WorkspaceAgentActivityFileChanges;\n };\n occurredAtUnixMs?: number;\n createdAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityMessage extends Omit<\n AgentActivityMessage,\n \"id\" | \"status\"\n> {\n id?: number;\n status?: string | null;\n semantics?: AgentActivityMessageSemantics;\n}\n\nexport interface WorkspaceAgentActivitySnapshot extends Omit<\n AgentActivitySnapshot,\n \"sessions\" | \"presences\" | \"sessionMessagesById\" | \"workspaceId\"\n> {\n workspaceId?: string;\n presences: WorkspaceAgentActivityPresence[];\n sessions: WorkspaceAgentActivitySession[];\n sessionMessagesById?: Record<string, WorkspaceAgentActivityMessage[]>;\n}\n\nexport interface WorkspaceAgentActivityTurnStatePatch {\n turnId: string;\n phase?: string;\n outcome?: string;\n fileChanges?: Record<string, unknown>;\n startedAtUnixMs?: number;\n completedAtUnixMs?: number;\n activeTurnId?: string | null;\n settling?: boolean;\n completedCommand?: {\n kind: string;\n status: string;\n } | null;\n submitAvailability?: AgentActivitySubmitAvailability;\n}\n\nexport interface WorkspaceAgentActivityEntityStatePatch {\n callId: string;\n turnId?: string;\n callType?: string;\n name?: string;\n status?: string;\n input?: Record<string, unknown>;\n output?: Record<string, unknown>;\n error?: Record<string, unknown>;\n startedAtUnixMs?: number;\n completedAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityStatePatch {\n workspaceId?: string;\n agentSessionId: string;\n provider?: string;\n providerSessionId?: string;\n model?: string;\n permissionModeId?: string;\n settings?: WorkspaceAgentActivityComposerSettings;\n runtimeContext?: Record<string, unknown>;\n pendingInteractive?: AgentActivitySession[\"pendingInteractive\"];\n cwd?: string;\n title?: string;\n lifecycleStatus?: string;\n currentPhase?: string;\n lastError?: string;\n occurredAtUnixMs?: number;\n submitAvailability?: AgentActivitySubmitAvailability;\n turn?: WorkspaceAgentActivityTurnStatePatch;\n entities?: WorkspaceAgentActivityEntityStatePatch[];\n}\n\nexport interface WorkspaceAgentActivitySessionSummaryItem {\n id?: number;\n turnId?: string;\n actorType?: string;\n actorId?: string;\n itemType?: string;\n role?: string;\n content?: string;\n title?: string;\n status?: string;\n callType?: string;\n name?: string;\n payload?: Record<string, unknown>;\n occurredAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivitySessionSummaryTurn {\n turnId: string;\n userItems?: WorkspaceAgentActivitySessionSummaryItem[];\n agentItems?: WorkspaceAgentActivitySessionSummaryItem[];\n}\n\nexport interface WorkspaceAgentActivitySessionExecutionStatus {\n currentOrFinalStatus?: string;\n updatedAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivitySessionSummary {\n agentSessionId: string;\n latestUserRequirement?: string;\n initialUserRequirement?: string;\n latestTurn?: WorkspaceAgentActivitySessionSummaryTurn;\n recentAgentReplies?: string[];\n recentTurns?: WorkspaceAgentActivitySessionSummaryTurn[];\n currentOrFinalStatus?: string;\n executionStatus?: WorkspaceAgentActivitySessionExecutionStatus;\n}\n\nexport function isWorkspaceAgentActivityOptimisticMessage(\n message: WorkspaceAgentActivityMessage\n): boolean {\n return message.payload?.__agentGuiOptimisticPrompt === true;\n}\n\nexport function selectWorkspaceAgentActivityOverlayMessages(input: {\n durableMessages?: readonly WorkspaceAgentActivityMessage[] | null;\n localMessages?: readonly WorkspaceAgentActivityMessage[] | null;\n}): WorkspaceAgentActivityMessage[] {\n const durableMessages = input.durableMessages ?? [];\n const localMessages = input.localMessages ?? [];\n if (localMessages.length === 0) {\n return [];\n }\n const durableIdentities = new Set(\n durableMessages\n .map(workspaceAgentActivityMessageIdentity)\n .filter((identity): identity is string => identity !== null)\n );\n const durableClientSubmitIds = new Set(\n durableMessages\n .map(workspaceAgentActivityClientSubmitId)\n .filter(\n (clientSubmitId): clientSubmitId is string => clientSubmitId !== null\n )\n );\n const durableUserPromptSignatures = new Set(\n durableMessages\n .map(workspaceAgentActivityUserPromptSignature)\n .filter((signature): signature is string => signature !== null)\n );\n return localMessages.filter((message) => {\n const identity = workspaceAgentActivityMessageIdentity(message);\n if (identity !== null && durableIdentities.has(identity)) {\n return false;\n }\n if (isWorkspaceAgentActivityOptimisticMessage(message)) {\n const clientSubmitId = workspaceAgentActivityClientSubmitId(message);\n if (\n clientSubmitId !== null &&\n durableClientSubmitIds.has(clientSubmitId)\n ) {\n return false;\n }\n if (clientSubmitId !== null) {\n return true;\n }\n const signature = workspaceAgentActivityUserPromptSignature(message);\n return signature === null || !durableUserPromptSignatures.has(signature);\n }\n return true;\n });\n}\n\nexport function mergeWorkspaceAgentActivityDurableAndOverlayMessages(input: {\n durableMessages?: readonly WorkspaceAgentActivityMessage[] | null;\n localMessages?: readonly WorkspaceAgentActivityMessage[] | null;\n}): WorkspaceAgentActivityMessage[] {\n const durableMessages = input.durableMessages ?? [];\n const overlayMessages = selectWorkspaceAgentActivityOverlayMessages(input);\n if (overlayMessages.length === 0) {\n return [...durableMessages];\n }\n // Optimistic echoes carry version 0 (outside the durable version domain),\n // so they cannot participate in a version sort. Durable-domain overlay rows\n // merge by version as usual; surviving echoes append after all durable\n // rows, ordered among themselves by when the user submitted.\n const overlayDurableMessages = overlayMessages.filter(\n (message) => !isWorkspaceAgentActivityOptimisticMessage(message)\n );\n const optimisticMessages = overlayMessages\n .filter(isWorkspaceAgentActivityOptimisticMessage)\n .slice()\n .sort(\n (left, right) =>\n left.occurredAtUnixMs - right.occurredAtUnixMs ||\n left.messageId.localeCompare(right.messageId)\n );\n const merged =\n overlayDurableMessages.length === 0\n ? [...durableMessages]\n : mergeAgentActivityMessages(durableMessages, overlayDurableMessages);\n return optimisticMessages.length === 0\n ? merged\n : [...merged, ...optimisticMessages];\n}\n\nfunction workspaceAgentActivityMessageIdentity(\n message: WorkspaceAgentActivityMessage\n): string | null {\n const messageId = message.messageId?.trim() ?? \"\";\n if (messageId) {\n return `message:${messageId}`;\n }\n if (typeof message.version === \"number\" && Number.isFinite(message.version)) {\n return `version:${message.version}`;\n }\n return null;\n}\n\nfunction workspaceAgentActivityClientSubmitId(\n message: WorkspaceAgentActivityMessage\n): string | null {\n const clientSubmitId = message.payload?.clientSubmitId;\n return typeof clientSubmitId === \"string\" && clientSubmitId.trim()\n ? `${message.agentSessionId}\\u0000${clientSubmitId.trim()}`\n : null;\n}\n\nfunction workspaceAgentActivityUserPromptSignature(\n message: WorkspaceAgentActivityMessage\n): string | null {\n if (message.role !== \"user\") {\n return null;\n }\n const text = workspaceAgentActivityPayloadText(message.payload).trim();\n const content = workspaceAgentActivityPayloadContentSignature(\n message.payload\n );\n if (!text && content === null) {\n return null;\n }\n return [message.agentSessionId, text, content ?? \"\"].join(\"\\u0000\");\n}\n\nfunction workspaceAgentActivityPayloadText(\n payload: Record<string, unknown> | undefined\n): string {\n const text = payload?.text;\n return typeof text === \"string\" ? text : \"\";\n}\n\nfunction workspaceAgentActivityPayloadContentSignature(\n payload: Record<string, unknown> | undefined\n): string | null {\n if (!payload || !Object.prototype.hasOwnProperty.call(payload, \"content\")) {\n return null;\n }\n const content = payload.content;\n if (!Array.isArray(content)) {\n return null;\n }\n const parts: string[] = [];\n for (const block of content) {\n const signature = workspaceAgentActivityPromptBlockSignature(block);\n if (signature === null) {\n return null;\n }\n parts.push(signature);\n }\n return parts.join(\"\\u0001\");\n}\n\nfunction workspaceAgentActivityPromptBlockSignature(\n block: unknown\n): string | null {\n if (!block || typeof block !== \"object\") {\n return null;\n }\n const record = block as Record<string, unknown>;\n const type = workspaceAgentActivityStringField(record, \"type\");\n if (!type) {\n return null;\n }\n const fields = [\n \"text\",\n \"mimeType\",\n \"data\",\n \"url\",\n \"attachmentId\",\n \"name\",\n \"path\",\n \"uri\",\n \"hostPath\",\n \"uploadStatus\",\n \"assetId\",\n \"kind\"\n ];\n const parts = [`type=${type}`];\n for (const field of fields) {\n const value = workspaceAgentActivityStringField(record, field);\n if (value) {\n parts.push(`${field}=${value}`);\n }\n }\n const sizeBytes = record.sizeBytes;\n if (typeof sizeBytes === \"number\" && Number.isFinite(sizeBytes)) {\n parts.push(`sizeBytes=${sizeBytes}`);\n }\n return parts.join(\"\\u0002\");\n}\n\nfunction workspaceAgentActivityStringField(\n record: Record<string, unknown>,\n field: string\n): string {\n const value = record[field];\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n"],"mappings":"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","names":[]}
|
|
@@ -5,25 +5,24 @@ import {
|
|
|
5
5
|
normalizeAgentGUIProviderTargets,
|
|
6
6
|
normalizeAgentGuiWorkbenchNodeState,
|
|
7
7
|
normalizeAgentGuiWorkbenchState
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-T5CEU7WH.js";
|
|
9
9
|
import {
|
|
10
10
|
agentGuiWorkbenchDockIdentityFromIdentifier,
|
|
11
11
|
agentGuiWorkbenchProviderFromIdentifier,
|
|
12
12
|
agentGuiWorkbenchTypeId,
|
|
13
13
|
agentGuiWorkbenchUnifiedDockEntryId,
|
|
14
14
|
createAgentGuiWorkbenchLaunchDescriptor
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-FPODKSSV.js";
|
|
16
16
|
import {
|
|
17
17
|
agentGuiWorkbenchDefaultDockProviders,
|
|
18
18
|
isAgentGuiWorkbenchProvider,
|
|
19
19
|
resolveAgentGuiWorkbenchProviderLabel
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-BTUOROCD.js";
|
|
21
21
|
import {
|
|
22
22
|
claudeRoundedUrl,
|
|
23
23
|
codexRoundedUrl,
|
|
24
24
|
cursorColorfulUrl,
|
|
25
25
|
cursorRoundedUrl,
|
|
26
|
-
geminiRoundedUrl,
|
|
27
26
|
hermesRoundedUrl,
|
|
28
27
|
manageAgentClaudeCodeUrl,
|
|
29
28
|
manageAgentTuttiUrl,
|
|
@@ -31,7 +30,7 @@ import {
|
|
|
31
30
|
openclawRoundedUrl,
|
|
32
31
|
opencodeRoundedUrl,
|
|
33
32
|
tuttiAgentRoundedUrl
|
|
34
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-SL2QSEIE.js";
|
|
35
34
|
|
|
36
35
|
// workbench/contribution.ts
|
|
37
36
|
import { createElement as createElement2 } from "react";
|
|
@@ -125,7 +124,6 @@ var agentGuiDockIconUrls = {
|
|
|
125
124
|
"claude-code": manageAgentClaudeCodeUrl,
|
|
126
125
|
codex: codexRoundedUrl,
|
|
127
126
|
cursor: cursorRoundedUrl,
|
|
128
|
-
gemini: geminiRoundedUrl,
|
|
129
127
|
hermes: hermesRoundedUrl,
|
|
130
128
|
nexight: manageAgentTuttiUrl,
|
|
131
129
|
openclaw: openclawRoundedUrl,
|
|
@@ -834,6 +832,7 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
834
832
|
instanceId,
|
|
835
833
|
state: {
|
|
836
834
|
...normalizeAgentGuiWorkbenchState(previousState),
|
|
835
|
+
lastActiveAgentSessionId: null,
|
|
837
836
|
...providerTarget.agentTargetId ? { agentTargetId: providerTarget.agentTargetId } : {},
|
|
838
837
|
...providerTarget.providerTargetId ? { agentTargetId: providerTarget.providerTargetId } : {}
|
|
839
838
|
},
|
|
@@ -939,9 +938,16 @@ function createAgentGuiWorkbenchDockEntry(input) {
|
|
|
939
938
|
label: input.label,
|
|
940
939
|
launchBehavior: "enabled",
|
|
941
940
|
launchPayload: input.launchPayload ?? { provider: input.provider },
|
|
942
|
-
matchNode: (node) =>
|
|
943
|
-
|
|
944
|
-
|
|
941
|
+
matchNode: (node) => {
|
|
942
|
+
if (node.data.typeId !== agentGuiWorkbenchTypeId) {
|
|
943
|
+
return false;
|
|
944
|
+
}
|
|
945
|
+
const provider = resolveAgentGuiWorkbenchProviderFromNodeIdentityOrNull(node);
|
|
946
|
+
if (!provider) {
|
|
947
|
+
return false;
|
|
948
|
+
}
|
|
949
|
+
return input.aggregateProviders ? input.aggregateProviders.includes(provider) : provider === input.provider;
|
|
950
|
+
},
|
|
945
951
|
order: input.order,
|
|
946
952
|
providePopupItemPreview: (item) => input.renderPreview ? createAgentGuiWorkbenchPreviewContent({
|
|
947
953
|
item,
|
|
@@ -1010,8 +1016,8 @@ function createAgentGuiWorkbenchUnifiedDockIcon(input) {
|
|
|
1010
1016
|
})
|
|
1011
1017
|
);
|
|
1012
1018
|
}
|
|
1013
|
-
function
|
|
1014
|
-
return agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ?? agentGuiWorkbenchProviderFromIdentifier(node.data.dockEntryId) ?? providerFromState(node.data.snapshotNodeState) ?? providerFromState(node.data.runtimeNodeState)
|
|
1019
|
+
function resolveAgentGuiWorkbenchProviderFromNodeIdentityOrNull(node) {
|
|
1020
|
+
return agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ?? agentGuiWorkbenchProviderFromIdentifier(node.data.dockEntryId) ?? providerFromState(node.data.snapshotNodeState) ?? providerFromState(node.data.runtimeNodeState);
|
|
1015
1021
|
}
|
|
1016
1022
|
function providerFromState(state) {
|
|
1017
1023
|
if (!state || typeof state !== "object") {
|
|
@@ -1207,4 +1213,4 @@ export {
|
|
|
1207
1213
|
resolveAgentGuiWorkbenchDefaultLaunchFrame,
|
|
1208
1214
|
resolveAgentGuiWorkbenchContributionCopy
|
|
1209
1215
|
};
|
|
1210
|
-
//# sourceMappingURL=chunk-
|
|
1216
|
+
//# sourceMappingURL=chunk-RF7GK4SM.js.map
|