@tutti-os/agent-gui 0.0.95 → 0.0.96
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 +38 -6
- package/dist/{AgentGUI-CwBLYtv-.d.ts → AgentGUI-DWdvUV4x.d.ts} +64 -18
- package/dist/agent-conversation/index.d.ts +3 -2
- package/dist/agent-conversation/index.js +10 -9
- package/dist/agent-conversation/index.js.map +1 -1
- package/dist/agent-env/index.js +1 -1
- package/dist/agent-gui.d.ts +5 -5
- package/dist/agent-gui.js +26 -26
- package/dist/agent-message-center/index.d.ts +14 -3
- package/dist/agent-message-center/index.js +182 -47
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentFileMentionContracts-Czvz6YMI.d.ts → agentFileMentionContracts-58IjMU-u.d.ts} +1 -0
- package/dist/{agentGuiNodeTypes-DppADPHW.d.ts → agentGuiNodeTypes-B9X4aWfv.d.ts} +30 -18
- package/dist/agents.d.ts +1 -1
- package/dist/agents.js +1 -1
- package/dist/app/renderer/agentactivity.css +150 -3
- package/dist/{chunk-C5FV4UGI.js → chunk-2HJEOO7W.js} +14 -6
- package/dist/chunk-2HJEOO7W.js.map +1 -0
- package/dist/{chunk-BFNJKTDV.js → chunk-3XXBDYAI.js} +11 -16
- package/dist/chunk-3XXBDYAI.js.map +1 -0
- package/dist/{chunk-YE25HN6T.js → chunk-3Y3F7CS5.js} +17 -25
- package/dist/chunk-3Y3F7CS5.js.map +1 -0
- package/dist/{chunk-CRO2MV2Y.js → chunk-4PQPJ5OY.js} +21 -116
- package/dist/chunk-4PQPJ5OY.js.map +1 -0
- package/dist/{chunk-R2EWECUP.js → chunk-7BXWPI4F.js} +17 -2
- package/dist/{chunk-R2EWECUP.js.map → chunk-7BXWPI4F.js.map} +1 -1
- package/dist/{chunk-LQVXBT65.js → chunk-AGT7MUTV.js} +9 -9
- package/dist/{chunk-LQVXBT65.js.map → chunk-AGT7MUTV.js.map} +1 -1
- package/dist/{chunk-O6W72SEP.js → chunk-C35SNDVZ.js} +4 -1
- package/dist/chunk-C35SNDVZ.js.map +1 -0
- package/dist/{chunk-BIHBXWK5.js → chunk-E4HQUTM3.js} +2 -2
- package/dist/{chunk-NX3CZJXW.js → chunk-H5F3QSCF.js} +2 -2
- package/dist/{chunk-WEDMAVX2.js → chunk-IYEXLOUE.js} +3 -6
- package/dist/chunk-IYEXLOUE.js.map +1 -0
- package/dist/{chunk-3R2D4E57.js → chunk-JKIZA7EJ.js} +933 -844
- package/dist/chunk-JKIZA7EJ.js.map +1 -0
- package/dist/{chunk-UQJPV6HP.js → chunk-L3GMMGRS.js} +8 -6
- package/dist/chunk-L3GMMGRS.js.map +1 -0
- package/dist/{chunk-KAL4XZMA.js → chunk-MASXZENX.js} +1 -1
- package/dist/chunk-MASXZENX.js.map +1 -0
- package/dist/{chunk-7PFDA2HQ.js → chunk-O3Q5SIJH.js} +3 -3
- package/dist/{chunk-NITOD7WF.js → chunk-QVBF5BN5.js} +2 -2
- package/dist/{chunk-7RDD3EWP.js → chunk-RE4AXS27.js} +24 -15
- package/dist/chunk-RE4AXS27.js.map +1 -0
- package/dist/{chunk-NJAZ7LQM.js → chunk-TVIGLNNI.js} +3 -3
- package/dist/{chunk-VF22EG3F.js → chunk-UHBCM6RO.js} +1 -1
- package/dist/chunk-UHBCM6RO.js.map +1 -0
- package/dist/{chunk-AOS2VWU6.js → chunk-W6WAGPMD.js} +33 -3
- package/dist/chunk-W6WAGPMD.js.map +1 -0
- package/dist/{chunk-RY6GIO3K.js → chunk-WKSFPJHZ.js} +5010 -3656
- package/dist/chunk-WKSFPJHZ.js.map +1 -0
- package/dist/{chunk-JX2SIXNL.js → chunk-WMNS4MAQ.js} +8 -7
- package/dist/{chunk-JX2SIXNL.js.map → chunk-WMNS4MAQ.js.map} +1 -1
- package/dist/{chunk-XMO45GKA.js → chunk-XPFHJMZP.js} +14 -4
- package/dist/chunk-XPFHJMZP.js.map +1 -0
- package/dist/chunk-YMXYBG7U.js +12 -0
- package/dist/chunk-YMXYBG7U.js.map +1 -0
- package/dist/context-mention-palette/index.d.ts +1 -1
- package/dist/context-mention-palette/index.js +14 -14
- package/dist/custom-mention.d.ts +2 -4
- package/dist/dock-icons.d.ts +2 -4
- package/dist/i18n/index.d.ts +30 -0
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +14 -12
- package/dist/index.js +34 -30
- package/dist/index.js.map +1 -1
- package/dist/mention-search.d.ts +1 -1
- package/dist/mention-search.js +11 -11
- package/dist/pastedTextKinds-D-XuInaS.d.ts +4 -0
- package/dist/startup-shell.d.ts +8 -0
- package/dist/startup-shell.js +184 -0
- package/dist/startup-shell.js.map +1 -0
- package/dist/{types-DX2bxgB8.d.ts → types-CnT8rNUI.d.ts} +16 -5
- package/dist/workbench/contribution.d.ts +3 -2
- package/dist/workbench/contribution.js +6 -6
- package/dist/workbench/index.d.ts +4 -4
- package/dist/workbench/index.js +14 -16
- package/dist/workbench/launch.d.ts +2 -2
- package/dist/workbench/launch.js +3 -3
- package/dist/workbench/providerCatalog.d.ts +2 -2
- package/dist/workbench/providerCatalog.js +1 -1
- package/dist/workbench/sessionTitle.d.ts +8 -12
- package/dist/workbench/sessionTitle.js +5 -7
- package/dist/workbench/state.js +2 -2
- package/dist/workbench/types.d.ts +2 -1
- package/dist/workbench/types.js +1 -1
- package/dist/workspace-agent-generated-files.js +6 -6
- package/package.json +19 -12
- package/dist/chunk-3R2D4E57.js.map +0 -1
- package/dist/chunk-7J4K6WKB.js +0 -66
- package/dist/chunk-7J4K6WKB.js.map +0 -1
- package/dist/chunk-7RDD3EWP.js.map +0 -1
- package/dist/chunk-AOS2VWU6.js.map +0 -1
- package/dist/chunk-BFNJKTDV.js.map +0 -1
- package/dist/chunk-C5FV4UGI.js.map +0 -1
- package/dist/chunk-CRO2MV2Y.js.map +0 -1
- package/dist/chunk-KAL4XZMA.js.map +0 -1
- package/dist/chunk-O6W72SEP.js.map +0 -1
- package/dist/chunk-RY6GIO3K.js.map +0 -1
- package/dist/chunk-UQJPV6HP.js.map +0 -1
- package/dist/chunk-VF22EG3F.js.map +0 -1
- package/dist/chunk-WEDMAVX2.js.map +0 -1
- package/dist/chunk-XMO45GKA.js.map +0 -1
- package/dist/chunk-YE25HN6T.js.map +0 -1
- package/dist/uiSettings-BQS9r2eo.d.ts +0 -6
- /package/dist/{chunk-BIHBXWK5.js.map → chunk-E4HQUTM3.js.map} +0 -0
- /package/dist/{chunk-NX3CZJXW.js.map → chunk-H5F3QSCF.js.map} +0 -0
- /package/dist/{chunk-7PFDA2HQ.js.map → chunk-O3Q5SIJH.js.map} +0 -0
- /package/dist/{chunk-NITOD7WF.js.map → chunk-QVBF5BN5.js.map} +0 -0
- /package/dist/{chunk-NJAZ7LQM.js.map → chunk-TVIGLNNI.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../shared/agentEnv/agentEnvPanelStore.ts","../shared/agentEnv/agentErrorPresentation.ts"],"sourcesContent":["import { useSnapshot } from \"valtio\";\nimport { proxy } from \"valtio/vanilla\";\n\n/**\n * Section the Agent Env panel (the片6 Setup Wizard / config panel) should scroll\n * to / emphasise when opened via a deep-link. The error card (片5) maps a domain\n * error code to one of these so the user lands on the relevant remediation.\n */\nexport type AgentEnvPanelFocus =\n | \"detect\"\n | \"install\"\n | \"repair\"\n | \"upgrade\"\n | \"auth\"\n | \"network\"\n | \"registry\";\n\nexport interface AgentEnvPanelRequest {\n open: boolean;\n provider: string | null;\n focus: AgentEnvPanelFocus | null;\n /**\n * Bumped on every openAgentEnvPanel() call. The host panel watches this to\n * re-run detection even when it is already open (e.g. a second deep-link).\n */\n requestSequence: number;\n}\n\nexport interface OpenAgentEnvPanelInput {\n provider?: string | null;\n focus?: AgentEnvPanelFocus | null;\n}\n\nconst agentEnvPanelStore = proxy<AgentEnvPanelRequest>({\n open: false,\n provider: null,\n focus: null,\n requestSequence: 0\n});\n\n/**\n * Open the agent environment panel. Safe to call from anywhere in the agent-gui\n * tree (rail footer entry, error-card deep-link). The host renders the actual\n * panel and reacts to this singleton store.\n */\nexport function openAgentEnvPanel(input?: OpenAgentEnvPanelInput): void {\n agentEnvPanelStore.open = true;\n agentEnvPanelStore.provider = input?.provider ?? null;\n agentEnvPanelStore.focus = input?.focus ?? null;\n agentEnvPanelStore.requestSequence += 1;\n}\n\nexport function closeAgentEnvPanel(): void {\n agentEnvPanelStore.open = false;\n}\n\n/** Imperative read, mainly for tests. Components should use the hook. */\nexport function getAgentEnvPanelStore(): AgentEnvPanelRequest {\n return agentEnvPanelStore;\n}\n\n/** Reactive snapshot of the panel request for the host renderer. */\nexport function useAgentEnvPanelRequest(): AgentEnvPanelRequest {\n return useSnapshot(agentEnvPanelStore);\n}\n","import type { AgentEnvPanelFocus } from \"./agentEnvPanelStore\";\n\n/**\n * Run-failure codes actually emitted by the daemon runtime classifier\n * (packages/agent/daemon/runtime/visible_error.go `visibleFailureCode`). These\n * are the codes the conversation error card really receives — unlike the\n * aspirational `CODEX_*` codes, which the run pipeline never produces.\n *\n * Keep this union aligned with the Go switch in `visibleFailureCode`.\n */\nexport type AgentRunErrorCode =\n | \"auth_required\"\n | \"cli_not_found\"\n | \"cli_version_unsupported\"\n | \"network_error\"\n | \"runtime_unavailable\"\n | \"request_timed_out\"\n | \"provider_config_timeout\"\n | \"provider_stream_disconnected\"\n | \"provider_concurrency_limit\"\n | \"insufficient_credits\"\n | \"quota_or_rate_limit\"\n | \"process_exited\"\n | \"provider_error\"\n | \"unknown\";\n\nexport interface AgentErrorPresentation {\n /**\n * i18n key for the one human sentence shown in the card, or null to let the\n * caller fall back to its phase-aware generic title.\n */\n messageKey: string | null;\n /**\n * Env-panel section the remediation button deep-links to, or null when the\n * failure is transient/server-side and the wizard cannot fix it — in which\n * case no call-to-action is shown (showing one would misrepresent reality).\n */\n focus: AgentEnvPanelFocus | null;\n /** i18n key for the remediation button. */\n actionKey: string | null;\n /** External remediation destination, when the action is account-level. */\n externalUrl?: string | null;\n}\n\nconst NO_CTA = { focus: null, actionKey: null } as const;\n\n// The escape hatch for hard failures whose cause is ambiguous from the message\n// alone (a non-zero exit, an unclassified provider error): send the user into\n// the wizard to self-detect, but keep the generic message.\nconst SELF_DETECT = {\n messageKey: null,\n focus: \"detect\" as const,\n actionKey: \"agentHost.agentGui.visibleErrorActionDetect\"\n};\n\nconst PRESENTATIONS: Record<AgentRunErrorCode, AgentErrorPresentation> = {\n // Environment problems the wizard can detect or repair → route to its step.\n auth_required: {\n messageKey: \"agentHost.agentGui.visibleErrorAuthRequired\",\n focus: \"auth\",\n actionKey: \"agentHost.agentGui.visibleErrorActionRelogin\"\n },\n cli_not_found: {\n messageKey: \"agentHost.agentGui.visibleErrorCliNotFound\",\n focus: \"install\",\n actionKey: \"agentHost.agentGui.visibleErrorActionInstall\"\n },\n cli_version_unsupported: {\n messageKey: \"agentHost.agentGui.visibleErrorVersionUnsupported\",\n focus: \"upgrade\",\n actionKey: \"agentHost.agentGui.visibleErrorActionUpgrade\"\n },\n network_error: {\n messageKey: \"agentHost.agentGui.visibleErrorNetwork\",\n focus: \"network\",\n actionKey: \"agentHost.agentGui.visibleErrorActionCheckNetwork\"\n },\n runtime_unavailable: {\n messageKey: \"agentHost.agentGui.visibleErrorRuntimeUnavailable\",\n focus: \"detect\",\n actionKey: \"agentHost.agentGui.visibleErrorActionDetect\"\n },\n // Transient / server-side failures: accurate copy, but no wizard CTA — it\n // cannot fix a rate limit or a dropped stream.\n request_timed_out: {\n messageKey: \"agentHost.agentGui.visibleErrorRequestTimedOut\",\n ...NO_CTA\n },\n provider_config_timeout: {\n messageKey: \"agentHost.agentGui.visibleErrorConfigTimeout\",\n ...NO_CTA\n },\n provider_stream_disconnected: {\n messageKey: \"agentHost.agentGui.visibleErrorStreamDisconnected\",\n ...NO_CTA\n },\n provider_concurrency_limit: {\n messageKey: \"agentHost.agentGui.visibleErrorConcurrencyLimit\",\n ...NO_CTA\n },\n insufficient_credits: {\n messageKey: \"agentHost.agentGui.visibleErrorInsufficientCredits\",\n focus: null,\n actionKey: \"agentHost.agentGui.visibleErrorActionViewPlans\",\n externalUrl: \"https://tutti.sh/profile/plan\"\n },\n quota_or_rate_limit: {\n messageKey: \"agentHost.agentGui.visibleErrorQuotaOrRateLimit\",\n ...NO_CTA\n },\n // Ambiguous hard failures → generic message + self-detect escape hatch.\n process_exited: SELF_DETECT,\n provider_error: SELF_DETECT,\n unknown: SELF_DETECT\n};\n\n/**\n * Resolves the card presentation for a run-failure code. Returns null for codes\n * outside the known vocabulary so the caller renders its plain generic card with\n * no call-to-action.\n */\nexport function resolveAgentErrorPresentation(\n code: string | null | undefined\n): AgentErrorPresentation | null {\n if (!code) {\n return null;\n }\n return PRESENTATIONS[code as AgentRunErrorCode] ?? null;\n}\n\nconst FAILED_MESSAGE_CODE_MARKERS: ReadonlyArray<\n readonly [AgentRunErrorCode, readonly string[]]\n> = [\n [\n \"auth_required\",\n [\n \"authentication_failed\",\n \"invalid authentication credentials\",\n \"401 invalid authentication\",\n \"unauthorized\",\n \"not logged in\",\n \"please run /login\",\n \"invalid api key\"\n ]\n ],\n [\n \"cli_version_unsupported\",\n [\"requires a newer version\", \"version is too old\", \"unsupported version\"]\n ],\n [\n \"cli_not_found\",\n [\n \"no such file or directory\",\n \"command not found\",\n \"enoent\",\n \"executable file not found\"\n ]\n ],\n [\n \"network_error\",\n [\"enotfound\", \"econnrefused\", \"econnreset\", \"getaddrinfo\", \"socket hang up\"]\n ]\n];\n\n/**\n * Some providers (notably Claude Code) report an environment failure — e.g. a\n * dropped login (401) — as a plain failed assistant message rather than a\n * structured visibleError, so it never gets the remediation card. This recovers\n * the env-fixable code from that message's text so the caller can still route the\n * user to the wizard. Returns null when the text isn't a recognized env failure\n * (so transient/unknown failures stay plain).\n */\nexport function classifyFailedAgentMessage(\n body: string | null | undefined\n): AgentRunErrorCode | null {\n if (!body) {\n return null;\n }\n const lower = body.toLowerCase();\n for (const [code, markers] of FAILED_MESSAGE_CODE_MARKERS) {\n if (markers.some((marker) => lower.includes(marker))) {\n return code;\n }\n }\n return null;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../shared/agentEnv/agentEnvPanelStore.ts","../shared/agentEnv/agentErrorPresentation.ts"],"sourcesContent":["import { useSnapshot } from \"valtio\";\nimport { proxy } from \"valtio/vanilla\";\n\n/**\n * Section the Agent Env panel (the片6 Setup Wizard / config panel) should scroll\n * to / emphasise when opened via a deep-link. The error card (片5) maps a domain\n * error code to one of these so the user lands on the relevant remediation.\n */\nexport type AgentEnvPanelFocus =\n | \"detect\"\n | \"install\"\n | \"repair\"\n | \"upgrade\"\n | \"auth\"\n | \"network\"\n | \"registry\";\n\nexport interface AgentEnvPanelRequest {\n open: boolean;\n provider: string | null;\n focus: AgentEnvPanelFocus | null;\n /**\n * Bumped on every openAgentEnvPanel() call. The host panel watches this to\n * re-run detection even when it is already open (e.g. a second deep-link).\n */\n requestSequence: number;\n}\n\nexport interface OpenAgentEnvPanelInput {\n provider?: string | null;\n focus?: AgentEnvPanelFocus | null;\n}\n\nconst agentEnvPanelStore = proxy<AgentEnvPanelRequest>({\n open: false,\n provider: null,\n focus: null,\n requestSequence: 0\n});\n\n/**\n * Open the agent environment panel. Safe to call from anywhere in the agent-gui\n * tree (rail footer entry, error-card deep-link). The host renders the actual\n * panel and reacts to this singleton store.\n */\nexport function openAgentEnvPanel(input?: OpenAgentEnvPanelInput): void {\n agentEnvPanelStore.open = true;\n agentEnvPanelStore.provider = input?.provider ?? null;\n agentEnvPanelStore.focus = input?.focus ?? null;\n agentEnvPanelStore.requestSequence += 1;\n}\n\nexport function closeAgentEnvPanel(): void {\n agentEnvPanelStore.open = false;\n}\n\n/** Imperative read, mainly for tests. Components should use the hook. */\nexport function getAgentEnvPanelStore(): AgentEnvPanelRequest {\n return agentEnvPanelStore;\n}\n\n/** Reactive snapshot of the panel request for the host renderer. */\nexport function useAgentEnvPanelRequest(): AgentEnvPanelRequest {\n return useSnapshot(agentEnvPanelStore);\n}\n","import type { AgentEnvPanelFocus } from \"./agentEnvPanelStore\";\n\n/**\n * Run-failure codes actually emitted by the daemon runtime classifier\n * (packages/agent/daemon/runtime/visible_error.go `visibleFailureCode`). These\n * are the codes the conversation error card really receives — unlike the\n * aspirational `CODEX_*` codes, which the run pipeline never produces.\n *\n * Keep this union aligned with the Go switch in `visibleFailureCode`.\n */\nexport type AgentRunErrorCode =\n | \"auth_required\"\n | \"cli_not_found\"\n | \"cli_version_unsupported\"\n | \"network_error\"\n | \"runtime_unavailable\"\n | \"request_timed_out\"\n | \"provider_config_timeout\"\n | \"provider_stream_disconnected\"\n | \"provider_concurrency_limit\"\n | \"insufficient_credits\"\n | \"quota_or_rate_limit\"\n | \"process_exited\"\n | \"provider_error\"\n | \"unknown\";\n\nexport interface AgentErrorPresentation {\n /**\n * i18n key for the one human sentence shown in the card, or null to let the\n * caller fall back to its phase-aware generic title.\n */\n messageKey: string | null;\n /**\n * Env-panel section the remediation button deep-links to, or null when the\n * failure is transient/server-side and the wizard cannot fix it — in which\n * case no call-to-action is shown (showing one would misrepresent reality).\n */\n focus: AgentEnvPanelFocus | null;\n /** i18n key for the remediation button. */\n actionKey: string | null;\n /** External remediation destination, when the action is account-level. */\n externalUrl?: string | null;\n}\n\nconst NO_CTA = { focus: null, actionKey: null } as const;\n\n// The escape hatch for hard failures whose cause is ambiguous from the message\n// alone (a non-zero exit, an unclassified provider error): send the user into\n// the wizard to self-detect, but keep the generic message.\nconst SELF_DETECT = {\n messageKey: null,\n focus: \"detect\" as const,\n actionKey: \"agentHost.agentGui.visibleErrorActionDetect\"\n};\n\nconst PRESENTATIONS: Record<AgentRunErrorCode, AgentErrorPresentation> = {\n // Environment problems the wizard can detect or repair → route to its step.\n auth_required: {\n messageKey: \"agentHost.agentGui.visibleErrorAuthRequired\",\n focus: \"auth\",\n actionKey: \"agentHost.agentGui.visibleErrorActionRelogin\"\n },\n cli_not_found: {\n messageKey: \"agentHost.agentGui.visibleErrorCliNotFound\",\n focus: \"install\",\n actionKey: \"agentHost.agentGui.visibleErrorActionInstall\"\n },\n cli_version_unsupported: {\n messageKey: \"agentHost.agentGui.visibleErrorVersionUnsupported\",\n focus: \"upgrade\",\n actionKey: \"agentHost.agentGui.visibleErrorActionUpgrade\"\n },\n network_error: {\n messageKey: \"agentHost.agentGui.visibleErrorNetwork\",\n focus: \"network\",\n actionKey: \"agentHost.agentGui.visibleErrorActionCheckNetwork\"\n },\n runtime_unavailable: {\n messageKey: \"agentHost.agentGui.visibleErrorRuntimeUnavailable\",\n focus: \"detect\",\n actionKey: \"agentHost.agentGui.visibleErrorActionDetect\"\n },\n // Transient / server-side failures: accurate copy, but no wizard CTA — it\n // cannot fix a rate limit or a dropped stream.\n request_timed_out: {\n messageKey: \"agentHost.agentGui.visibleErrorRequestTimedOut\",\n ...NO_CTA\n },\n provider_config_timeout: {\n messageKey: \"agentHost.agentGui.visibleErrorConfigTimeout\",\n ...NO_CTA\n },\n provider_stream_disconnected: {\n messageKey: \"agentHost.agentGui.visibleErrorStreamDisconnected\",\n ...NO_CTA\n },\n provider_concurrency_limit: {\n messageKey: \"agentHost.agentGui.visibleErrorConcurrencyLimit\",\n ...NO_CTA\n },\n insufficient_credits: {\n messageKey: \"agentHost.agentGui.visibleErrorInsufficientCredits\",\n focus: null,\n actionKey: \"agentHost.agentGui.visibleErrorActionViewPlans\",\n externalUrl: \"https://tutti.sh/profile/plan\"\n },\n quota_or_rate_limit: {\n messageKey: \"agentHost.agentGui.visibleErrorQuotaOrRateLimit\",\n ...NO_CTA\n },\n // Ambiguous hard failures → generic message + self-detect escape hatch.\n process_exited: SELF_DETECT,\n provider_error: SELF_DETECT,\n unknown: SELF_DETECT\n};\n\n/**\n * Resolves the card presentation for a run-failure code. Returns null for codes\n * outside the known vocabulary so the caller renders its plain generic card with\n * no call-to-action.\n */\nexport function resolveAgentErrorPresentation(\n code: string | null | undefined\n): AgentErrorPresentation | null {\n if (!code) {\n return null;\n }\n return PRESENTATIONS[code as AgentRunErrorCode] ?? null;\n}\n\nconst FAILED_MESSAGE_CODE_MARKERS: ReadonlyArray<\n readonly [AgentRunErrorCode, readonly string[]]\n> = [\n [\n \"auth_required\",\n [\n \"authentication_failed\",\n \"invalid authentication credentials\",\n \"401 invalid authentication\",\n \"unauthorized\",\n \"not logged in\",\n \"please run /login\",\n \"invalid api key\"\n ]\n ],\n [\n \"cli_version_unsupported\",\n [\"requires a newer version\", \"version is too old\", \"unsupported version\"]\n ],\n [\n \"cli_not_found\",\n [\n \"no such file or directory\",\n \"command not found\",\n \"enoent\",\n \"executable file not found\"\n ]\n ],\n [\n \"network_error\",\n [\"enotfound\", \"econnrefused\", \"econnreset\", \"getaddrinfo\", \"socket hang up\"]\n ],\n [\n \"quota_or_rate_limit\",\n [\"upgrade your plan to continue\", \"add a payment method to continue\"]\n ]\n];\n\n/**\n * Some providers (notably Claude Code) report an environment failure — e.g. a\n * dropped login (401) — as a plain failed assistant message rather than a\n * structured visibleError, so it never gets the remediation card. This recovers\n * the env-fixable code from that message's text so the caller can still route the\n * user to the wizard. Returns null when the text isn't a recognized env failure\n * (so transient/unknown failures stay plain).\n */\nexport function classifyFailedAgentMessage(\n body: string | null | undefined\n): AgentRunErrorCode | null {\n if (!body) {\n return null;\n }\n const lower = body.toLowerCase();\n for (const [code, markers] of FAILED_MESSAGE_CODE_MARKERS) {\n if (markers.some((marker) => lower.includes(marker))) {\n return code;\n }\n }\n return null;\n}\n\n/** True when detail text is a provider plan/payment gate (not a generic quota). */\nexport function isProviderPlanLimitMessage(\n detail: string | null | undefined\n): boolean {\n const normalized = detail?.trim().toLowerCase() ?? \"\";\n if (!normalized) {\n return false;\n }\n const markers =\n FAILED_MESSAGE_CODE_MARKERS.find(\n ([code]) => code === \"quota_or_rate_limit\"\n )?.[1] ?? [];\n return markers.some((marker) => normalized.includes(marker));\n}\n"],"mappings":";AAAA,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AAgCtB,IAAM,qBAAqB,MAA4B;AAAA,EACrD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,iBAAiB;AACnB,CAAC;AAOM,SAAS,kBAAkB,OAAsC;AACtE,qBAAmB,OAAO;AAC1B,qBAAmB,WAAW,OAAO,YAAY;AACjD,qBAAmB,QAAQ,OAAO,SAAS;AAC3C,qBAAmB,mBAAmB;AACxC;AAEO,SAAS,qBAA2B;AACzC,qBAAmB,OAAO;AAC5B;AAGO,SAAS,wBAA8C;AAC5D,SAAO;AACT;AAGO,SAAS,0BAAgD;AAC9D,SAAO,YAAY,kBAAkB;AACvC;;;ACpBA,IAAM,SAAS,EAAE,OAAO,MAAM,WAAW,KAAK;AAK9C,IAAM,cAAc;AAAA,EAClB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AACb;AAEA,IAAM,gBAAmE;AAAA;AAAA,EAEvE,eAAe;AAAA,IACb,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA,eAAe;AAAA,IACb,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA,yBAAyB;AAAA,IACvB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA,eAAe;AAAA,IACb,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA,qBAAqB;AAAA,IACnB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA;AAAA;AAAA,EAGA,mBAAmB;AAAA,IACjB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL;AAAA,EACA,yBAAyB;AAAA,IACvB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL;AAAA,EACA,8BAA8B;AAAA,IAC5B,YAAY;AAAA,IACZ,GAAG;AAAA,EACL;AAAA,EACA,4BAA4B;AAAA,IAC1B,YAAY;AAAA,IACZ,GAAG;AAAA,EACL;AAAA,EACA,sBAAsB;AAAA,IACpB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA,qBAAqB;AAAA,IACnB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL;AAAA;AAAA,EAEA,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,SAAS;AACX;AAOO,SAAS,8BACd,MAC+B;AAC/B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,SAAO,cAAc,IAAyB,KAAK;AACrD;AAEA,IAAM,8BAEF;AAAA,EACF;AAAA,IACE;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA,CAAC,4BAA4B,sBAAsB,qBAAqB;AAAA,EAC1E;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA,CAAC,aAAa,gBAAgB,cAAc,eAAe,gBAAgB;AAAA,EAC7E;AAAA,EACA;AAAA,IACE;AAAA,IACA,CAAC,iCAAiC,kCAAkC;AAAA,EACtE;AACF;AAUO,SAAS,2BACd,MAC0B;AAC1B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,YAAY;AAC/B,aAAW,CAAC,MAAM,OAAO,KAAK,6BAA6B;AACzD,QAAI,QAAQ,KAAK,CAAC,WAAW,MAAM,SAAS,MAAM,CAAC,GAAG;AACpD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,2BACd,QACS;AACT,QAAM,aAAa,QAAQ,KAAK,EAAE,YAAY,KAAK;AACnD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,QAAM,UACJ,4BAA4B;AAAA,IAC1B,CAAC,CAAC,IAAI,MAAM,SAAS;AAAA,EACvB,IAAI,CAAC,KAAK,CAAC;AACb,SAAO,QAAQ,KAAK,CAAC,WAAW,WAAW,SAAS,MAAM,CAAC;AAC7D;","names":[]}
|
|
@@ -5,21 +5,21 @@ import {
|
|
|
5
5
|
agentMentionFilterLabel,
|
|
6
6
|
agentMentionGroupLabel,
|
|
7
7
|
mentionGroupExpandCount
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import {
|
|
10
|
-
userAvatarPlaceholderUrl,
|
|
11
|
-
workspaceAgentActivityStatusLabel
|
|
12
|
-
} from "./chunk-NITOD7WF.js";
|
|
8
|
+
} from "./chunk-WMNS4MAQ.js";
|
|
13
9
|
import {
|
|
14
10
|
resolveAgentMentionFileThumbnailUrl,
|
|
15
11
|
resolveAgentMentionFileVisualKind
|
|
16
12
|
} from "./chunk-LUGELG5V.js";
|
|
13
|
+
import {
|
|
14
|
+
userAvatarPlaceholderUrl,
|
|
15
|
+
workspaceAgentActivityStatusLabel
|
|
16
|
+
} from "./chunk-QVBF5BN5.js";
|
|
17
17
|
import {
|
|
18
18
|
managedAgentRoundedIconUrl
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-MASXZENX.js";
|
|
20
20
|
import {
|
|
21
21
|
translate
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-E4HQUTM3.js";
|
|
23
23
|
|
|
24
24
|
// agent-gui/agentGuiNode/AgentFileMentionPalette.tsx
|
|
25
25
|
import {
|
|
@@ -320,7 +320,7 @@ function agentMentionItemToRowItem(item) {
|
|
|
320
320
|
summary: item.title,
|
|
321
321
|
userAvatarUrl: isMySession ? null : item.initiatorAvatarUrl ?? null,
|
|
322
322
|
userAvatarPlaceholderUrl,
|
|
323
|
-
agentIconUrl: managedAgentRoundedIconUrl(
|
|
323
|
+
agentIconUrl: item.agentIconUrl?.trim() || managedAgentRoundedIconUrl(
|
|
324
324
|
mentionSessionAgentProvider(item) ?? item.agentName
|
|
325
325
|
),
|
|
326
326
|
showUserAvatar: !isMySession,
|
|
@@ -488,4 +488,4 @@ export {
|
|
|
488
488
|
AgentFileMentionPalette,
|
|
489
489
|
AgentContextMentionPalette
|
|
490
490
|
};
|
|
491
|
-
//# sourceMappingURL=chunk-
|
|
491
|
+
//# sourceMappingURL=chunk-AGT7MUTV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../agent-gui/agentGuiNode/AgentFileMentionPalette.tsx","../shared/roomIssueStatusLabel.ts"],"sourcesContent":["import {\n normalizeAgentActivityDisplayStatus,\n type AgentActivityDisplayStatus\n} from \"@tutti-os/agent-activity-core\";\nimport {\n MentionPaletteFromState,\n flattenMentionPaletteEntries,\n renderMentionRow,\n type MentionPaletteEntry,\n type MentionPaletteState,\n type MentionPaletteTheme,\n type MentionRowClassNames,\n type MentionRowItem,\n type MentionRowStatusTag,\n type MentionRowStatusTone\n} from \"@tutti-os/ui-rich-text/at-panel\";\nimport { resolveIssueManagerStatusPresentation } from \"@tutti-os/workspace-issue-manager/ui\";\nimport { userAvatarPlaceholderUrl } from \"../../shared/userAvatarPlaceholder\";\nimport { translate } from \"../../i18n/index\";\nimport { managedAgentRoundedIconUrl } from \"../../shared/managedAgentIcons\";\nimport { workspaceAgentActivityStatusLabel } from \"../../shared/workspaceAgentActivityStatusLabel\";\nimport { roomIssueStatusLabel } from \"../../shared/roomIssueStatusLabel\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../shared/mentionFilePresentation\";\nimport {\n agentMentionEmptyGroupLabel,\n agentMentionFilterLabel,\n agentMentionGroupLabel\n} from \"./AgentMentionLabels\";\nimport {\n AGENT_MENTION_FILTER_TAB_ORDER,\n mentionGroupExpandCount\n} from \"./agentMentionSearchHelpers\";\nimport {\n type AgentMentionGroup,\n type AgentMentionBrowseCategory,\n type AgentMentionFilterId,\n type AgentMentionGroupId,\n type AgentMentionSearchState\n} from \"./AgentMentionSearchController\";\nimport { agentGeneratedMentionItemKey } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\n\nexport interface AgentMentionPaletteEntry {\n key: string;\n type: \"category\" | \"item\" | \"expand\";\n categoryId?: AgentMentionBrowseCategory[\"id\"];\n groupId?: AgentMentionGroupId;\n item?: AgentContextMentionItem;\n}\n\nexport interface AgentFileMentionPaletteProps {\n state: AgentMentionSearchState;\n highlightedKey: string | null;\n label: string;\n loadingLabel: string;\n emptyLabel: string;\n errorLabel: string;\n tabHintLabel: string;\n maxHeightPx: number;\n shouldCenterHighlightedItem?: boolean;\n onHighlightChange: (key: string) => void;\n onSelectItem: (entry: AgentContextMentionItem) => void;\n onSelectCategory: (categoryId: AgentMentionBrowseCategory[\"id\"]) => void;\n onSelectFilter: (filter: AgentMentionFilterId) => void;\n onExpandGroup: (groupId: AgentMentionGroupId) => void;\n onNavigateHierarchy?: (delta: 1 | -1) => void;\n onNavigateIntoItem?: (item: AgentContextMentionItem) => void;\n /**\n * 可选:点击 issue / app 行末尾的「查看产物」入口时回调(打开引用 picker 并定位)。\n * 仅 workspace-issue / workspace-app 行渲染该入口。\n */\n onOpenReferences?: (item: AgentContextMentionItem) => void;\n}\n\nconst AGENT_MENTION_PALETTE_THEME: MentionPaletteTheme = {\n classNames: {\n palette: \"agent-gui-node__mention-palette\",\n header: \"agent-gui-node__mention-palette-header\",\n footer: \"agent-gui-node__mention-palette-footer\",\n tabs: \"agent-gui-node__mention-palette-tabs\",\n scrollRegion: \"agent-gui-node__mention-palette-scroll-region\",\n scrollbar:\n \"workspace-agents-status-panel__scrollbar agent-gui-node__mention-palette-scrollbar\",\n scrollbarThumb: \"workspace-agents-status-panel__scrollbar-thumb\",\n hint: \"agent-gui-node__mention-palette-hint\",\n hintItem: \"agent-gui-node__mention-palette-hint-item\",\n hintButton: \"agent-gui-node__mention-palette-hint-button\",\n hintSeparator: \"agent-gui-node__mention-palette-hint-separator\",\n shortcut: \"agent-gui-node__mention-palette-shortcut\",\n shortcutArrow: \"agent-gui-node__mention-palette-shortcut--arrow\",\n shortcutButton: \"agent-gui-node__mention-palette-shortcut-button\",\n shortcutGroup: \"agent-gui-node__mention-palette-shortcut-group\"\n },\n testIds: {\n emptyState: \"agent-gui-mention-palette-empty-state\",\n hint: \"agent-gui-mention-palette-hint\",\n scrollbar: \"agent-gui-mention-palette-scrollbar\",\n loadingSpinner: \"agent-mention-loading-spinner\"\n },\n groupDividerAttribute: \"data-agent-mention-group-divider\"\n};\n\n/**\n * The agent composer's existing structural row class names. Passing these to\n * {@link renderMentionRow} keeps the rendered DOM byte-identical to the\n * pre-refactor markup (the agent stylesheet `agentactivity.css` owns these\n * rules and the agent spec greps them), while the shared component defaults to\n * package-owned `rich-text-at-mention-*` names for other surfaces.\n */\nconst AGENT_MENTION_ROW_CLASS_NAMES: MentionRowClassNames = {\n fileIcon: \"agent-gui-node__mention-file-icon\",\n fileThumb: \"agent-gui-node__mention-file-thumb\",\n kindIcon: \"tsh-agent-object-token__kind-icon\",\n avatarImgUserPlaceholder:\n \"workspace-agents-status-panel__avatar-img--user-placeholder\"\n};\n\n/**\n * Stable per-item key suffix. The shared shell composes the full entry key as\n * `${group.id}:${agentMentionItemKey(item)}`, matching the agent's historical\n * `${group.id}:${item.kind}:${...}` format so highlight keys stay compatible.\n */\nexport function agentMentionItemKey(item: AgentContextMentionItem): string {\n return `${item.kind}:${\n item.kind === \"file\" ? agentGeneratedMentionItemKey(item) : item.targetId\n }`;\n}\n\nexport function flattenAgentMentionPaletteEntries(\n state: AgentMentionSearchState\n): AgentMentionPaletteEntry[] {\n return flattenMentionPaletteEntries(state, (item) =>\n agentMentionItemKey(item)\n ).map((entry: MentionPaletteEntry): AgentMentionPaletteEntry => {\n if (entry.type === \"item\") {\n const item =\n entry.groupId !== undefined && entry.itemIndex !== undefined\n ? state.groups.find((group) => group.id === entry.groupId)?.items[\n entry.itemIndex\n ]\n : undefined;\n return {\n key: entry.key,\n type: \"item\",\n groupId: entry.groupId as AgentMentionGroupId | undefined,\n item\n };\n }\n return {\n key: entry.key,\n type: entry.type,\n categoryId: entry.categoryId as AgentMentionFilterId | undefined,\n groupId: entry.groupId as AgentMentionGroupId | undefined\n };\n });\n}\n\nexport function groupStartKeys(state: AgentMentionSearchState): string[] {\n if (state.mode === \"browse\") {\n return state.categories.map((category) => `category:${category.id}`);\n }\n return state.groups\n .map((group) => {\n const firstItem = group.items[0];\n if (firstItem) {\n return `${group.id}:${agentMentionItemKey(firstItem)}`;\n }\n if (group.hasMore) {\n return `expand:${group.id}`;\n }\n return null;\n })\n .filter((key): key is string => key !== null);\n}\n\nexport function AgentFileMentionPalette({\n state,\n highlightedKey,\n label,\n loadingLabel,\n emptyLabel,\n errorLabel,\n tabHintLabel,\n maxHeightPx,\n shouldCenterHighlightedItem = false,\n onHighlightChange,\n onSelectItem,\n onSelectCategory,\n onSelectFilter,\n onExpandGroup,\n onNavigateHierarchy,\n onNavigateIntoItem,\n onOpenReferences\n}: AgentFileMentionPaletteProps): React.JSX.Element {\n \"use memo\";\n const openReferencesLabel = translate(\n \"agentHost.agentGui.mentionOpenReferences\"\n );\n const navigateIntoLabel = translate(\n \"agentHost.agentGui.fileMentionEnterFolder\"\n );\n const filter = state.filter as AgentMentionFilterId;\n const highlightedBrowseCategory = highlightedKey?.startsWith(\"category:\")\n ? highlightedKey.slice(\"category:\".length)\n : null;\n const showBrowseHint = shouldShowBrowseSearchHint({\n browseFilter: filter,\n groups: state.groups,\n highlightedBrowseCategory,\n mode: state.mode\n });\n\n // Browse mode carries its own category list (with labels); results mode tabs\n // are the fixed agent filter order. The shared shell renders a single tab\n // source, so resolve the right one here.\n const categories =\n state.mode === \"browse\"\n ? state.categories\n : AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n\n // When the agent wants the single keyboard browse hint we hand the shell an\n // empty group list so it renders its (keyboard-icon) empty state with our\n // computed hint copy. Otherwise we map the real groups, decorating each with\n // the agent-specific label / empty / expand / spacing chrome.\n const shellState: MentionPaletteState<AgentContextMentionItem> =\n showBrowseHint\n ? { ...state, categories, groups: [] }\n : {\n ...state,\n categories,\n groups: state.groups.map((group, index) =>\n decorateMentionGroup(\n group,\n index,\n state.groups,\n filter,\n state.query\n )\n )\n };\n\n const emptyLabelForShell = showBrowseHint\n ? browseHintForFilter(filter)\n : resolveMentionPaletteEmptyLabel({\n emptyLabel,\n filter,\n mode: state.mode,\n query: state.query\n });\n\n return (\n <MentionPaletteFromState<AgentContextMentionItem>\n state={shellState}\n highlightedKey={highlightedKey}\n getItemKey={agentMentionItemKey}\n renderItem={(item, { group }) =>\n renderMentionRow(agentMentionItemToRowItem(item), {\n classNames: AGENT_MENTION_ROW_CLASS_NAMES,\n dataAttributeMode: \"agent\",\n ...(onNavigateIntoItem && canNavigateIntoMentionItem(item, group)\n ? {\n onNavigateInto: () => onNavigateIntoItem(item),\n navigateIntoLabel\n }\n : {}),\n ...(onOpenReferences && isReferenceableMentionItem(item)\n ? {\n onOpenReferences: () => onOpenReferences(item),\n openReferencesLabel\n }\n : {})\n })\n }\n labels={{\n loading: loadingLabel,\n empty: emptyLabelForShell,\n error: errorLabel,\n tabHint: tabHintLabel,\n listbox: label\n }}\n hintLabels={{\n cycleFilter: translate(\"agentHost.agentGui.fileMentionSwitchCategory\"),\n moveSelection: translate(\n \"agentHost.agentGui.fileMentionSwitchSelection\"\n ),\n navigateHierarchy: translate(\n \"agentHost.agentGui.fileMentionNavigateHierarchy\"\n )\n }}\n maxHeightPx={maxHeightPx}\n scrollHighlightedIntoViewCentered={shouldCenterHighlightedItem}\n theme={AGENT_MENTION_PALETTE_THEME}\n callbacks={{\n onHighlightChange,\n onActiveCategoryIdChange: (categoryId) => {\n onSelectCategory(categoryId as AgentMentionBrowseCategory[\"id\"]);\n onSelectFilter(categoryId as AgentMentionFilterId);\n },\n onExpandGroup: (groupId) =>\n onExpandGroup(groupId as AgentMentionGroupId),\n onSelectItem\n }}\n onNavigateHierarchy={onNavigateHierarchy}\n />\n );\n}\n\nexport const AgentContextMentionPalette = AgentFileMentionPalette;\nexport type AgentContextMentionPaletteProps = AgentFileMentionPaletteProps;\n\n/**\n * Map a controller group onto the shared shell group, layering in the\n * agent-specific chrome the generic shell intentionally omits: translated\n * group / empty / expand labels, file-search chrome suppression, and the extra\n * top margin between the \"my sessions\" and \"collab sessions\" groups.\n */\nfunction decorateMentionGroup(\n group: AgentMentionGroup,\n index: number,\n groups: ReadonlyArray<AgentMentionGroup>,\n filter: AgentMentionFilterId,\n query: string\n): AgentMentionGroup {\n const groupId = group.id as AgentMentionGroupId;\n const suppressChrome = shouldSuppressFileSearchGroupChrome(filter, query);\n const followsMySessions =\n groupId === \"collab_sessions\" &&\n (groups[index - 1]?.id as AgentMentionGroupId) === \"my_sessions\";\n const showLabel = shouldRenderMentionGroupLabel({\n filter,\n groupCount: groups.length,\n groupId,\n query\n });\n return {\n ...group,\n label: showLabel ? agentMentionGroupLabel(groupId) : undefined,\n emptyLabel: suppressChrome\n ? undefined\n : agentMentionEmptyGroupLabel(groupId, query),\n expandLabel: group.hasMore\n ? translate(\"agentHost.agentGui.contextPickerExpandMore\", {\n count: mentionGroupExpandCount(group, filter)\n })\n : undefined,\n sectionClassName: followsMySessions ? \"mt-2\" : undefined,\n hideTopDivider: suppressChrome\n };\n}\n\nfunction shouldSuppressFileSearchGroupChrome(\n filter: AgentMentionFilterId,\n query: string\n): boolean {\n return filter === \"file\" && query.trim().length > 0;\n}\n\nfunction resolveMentionPaletteEmptyLabel(input: {\n emptyLabel: string;\n filter: AgentMentionFilterId;\n mode: AgentMentionSearchState[\"mode\"];\n query: string;\n}): string {\n if (\n input.mode === \"results\" &&\n input.filter === \"file\" &&\n input.query.trim().length > 0\n ) {\n return translate(\"agentHost.agentGui.mentionNoMatchingFiles\");\n }\n if (input.filter === \"session\") {\n return agentMentionEmptyGroupLabel(\"my_sessions\", input.query);\n }\n if (input.filter === \"app\") {\n return agentMentionEmptyGroupLabel(\"apps\", input.query);\n }\n if (input.filter === \"agent\") {\n return agentMentionEmptyGroupLabel(\"agents\", input.query);\n }\n if (input.filter === \"issue\") {\n return agentMentionEmptyGroupLabel(\"issues\", input.query);\n }\n return input.emptyLabel;\n}\n\nfunction shouldRenderMentionGroupLabel(input: {\n filter: AgentMentionFilterId;\n groupCount: number;\n groupId: AgentMentionGroupId;\n query: string;\n}): boolean {\n if (shouldSuppressFileSearchGroupChrome(input.filter, input.query)) {\n return false;\n }\n if (input.groupCount !== 1) {\n return true;\n }\n return (\n agentMentionGroupLabel(input.groupId) !==\n agentMentionFilterLabel(input.filter)\n );\n}\n\n/**\n * Resolve an agent mention item into the shared, display-ready\n * {@link MentionRowItem} view-model the generic {@link renderMentionRow}\n * consumes. All agent-specific bits — i18n via {@link translate}, the user\n * avatar placeholder asset, the managed-agent rounded icon, and the activity /\n * issue status labels — are resolved here so the shared renderer stays pure.\n */\nfunction agentMentionItemToRowItem(\n item: AgentContextMentionItem\n): MentionRowItem {\n if (item.kind === \"file\") {\n const visualKind = resolveAgentMentionFileVisualKind({\n entryKind: item.entryKind,\n href: item.href,\n mentionNavigation: item.mentionNavigation,\n name: item.name,\n path: item.path\n });\n const childCountLabel =\n item.mentionNavigation === \"agent-generated-folder\" &&\n typeof item.childCount === \"number\" &&\n item.childCount > 0\n ? translate(\"agentHost.agentGui.mentionAgentGeneratedFolderFileCount\", {\n count: item.childCount\n })\n : null;\n return {\n kind: \"file\",\n name: item.name,\n visualKind,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl(item) ?? null,\n childCountLabel,\n entryKind: item.entryKind,\n mentionNavigation: item.mentionNavigation\n };\n }\n\n if (item.kind === \"session\") {\n const isMySession = item.scope === \"my_sessions\";\n return {\n kind: \"session\",\n participant: isMySession\n ? item.agentName\n : `${item.initiatorName} & ${item.agentName}`,\n summary: item.title,\n userAvatarUrl: isMySession ? null : (item.initiatorAvatarUrl ?? null),\n userAvatarPlaceholderUrl,\n agentIconUrl: managedAgentRoundedIconUrl(\n mentionSessionAgentProvider(item) ?? item.agentName\n ),\n showUserAvatar: !isMySession,\n statusTag: agentSessionStatusTag(item.status)\n };\n }\n\n if (item.kind === \"workspace-app\") {\n return {\n kind: \"app\",\n name: item.name,\n description: item.description ?? null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"agent-target\") {\n return {\n kind: \"app\",\n name: item.name,\n description: item.description ?? null,\n iconUrl: item.iconUrl ?? managedAgentRoundedIconUrl(item.agentProviderId),\n statusTag: agentTargetAvailableStatusTag()\n };\n }\n\n if (item.kind === \"workspace-reference\") {\n return {\n kind: \"app\",\n name: item.name,\n description: null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"workspace-app-factory\") {\n return {\n kind: \"app-factory\",\n name: item.name\n };\n }\n\n if (item.kind === \"custom\") {\n // 自定义 mention 只经 draftPrompt prefill 进入 composer,不出现在 @ 面板候选;\n // 兜底按通用条目展示(label 即注册方给的 name)。\n return {\n kind: \"issue\",\n title: item.name,\n creatorName: null,\n statusTag: null\n };\n }\n\n return {\n kind: \"issue\",\n title: item.title,\n creatorName: item.creatorName ?? null,\n statusTag: agentIssueStatusTag(item.status)\n };\n}\n\n/**\n * 仅 workspace-issue 行,以及声明了能够提供产物文件(reference)的 workspace-app 行,\n * 才在行末尾展示「查看产物」入口。应用是否能提供产物文件由其 manifest 的\n * references 能力决定(`referencesListSupported`),而非硬编码应用名单。\n */\nfunction isReferenceableMentionItem(item: AgentContextMentionItem): boolean {\n if (item.kind === \"workspace-issue\") {\n return true;\n }\n if (item.kind === \"workspace-app\") {\n return item.referencesListSupported === true;\n }\n return false;\n}\n\nfunction canNavigateIntoMentionItem(\n item: AgentContextMentionItem,\n group: AgentMentionGroup\n): boolean {\n return (\n group.id === \"agent_generated_files\" &&\n item.kind === \"file\" &&\n item.mentionNavigation === \"agent-generated-folder\"\n );\n}\n\nfunction mentionSessionAgentProvider(\n item: Extract<AgentContextMentionItem, { kind: \"session\" }>\n): string | null {\n const queryStart = item.href.indexOf(\"?\");\n if (queryStart < 0) {\n return null;\n }\n return new URLSearchParams(item.href.slice(queryStart + 1)).get(\"provider\");\n}\n\nfunction agentSessionStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n const activityStatus = normalizeAgentActivityDisplayStatus(status);\n return {\n label: workspaceAgentActivityStatusLabel(activityStatus),\n tone: mentionStatusTone(activityStatus),\n pulse: activityStatus === \"working\" || activityStatus === \"waiting\",\n variant: \"activity\",\n dataStatus: activityStatus\n };\n}\n\n/**\n * Agent targets are only surfaced when the provider is ready/available, so the\n * `@` row always shows a green \"Available\" badge at its trailing edge.\n */\nfunction agentTargetAvailableStatusTag(): MentionRowStatusTag {\n return {\n label: translate(\"agentHost.agentGui.mentionAgentTargetAvailable\"),\n tone: \"green\",\n variant: \"activity\",\n dataStatus: \"available\"\n };\n}\n\nfunction agentIssueStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n const presentation = resolveIssueManagerStatusPresentation(status);\n return {\n label: roomIssueStatusLabel(status),\n tone: presentation.mentionTone,\n variant: \"issue\",\n dataStatus: presentation.dataStatus\n };\n}\n\nfunction mentionStatusTone(\n status: AgentActivityDisplayStatus\n): MentionRowStatusTone {\n if (status === \"working\") {\n return \"blue\";\n }\n if (status === \"waiting\" || status === \"canceled\") {\n return \"amber\";\n }\n if (status === \"completed\" || status === \"idle\") {\n return \"green\";\n }\n if (status === \"failed\") {\n return \"red\";\n }\n return \"neutral\";\n}\n\nfunction browseHintForFilter(filter: AgentMentionFilterId): string {\n switch (filter) {\n case \"agent\":\n return translate(\"agentHost.agentGui.contextPickerBrowseAgentHint\");\n case \"app\":\n return translate(\"agentHost.agentGui.contextPickerBrowseAppHint\");\n case \"file\":\n return translate(\"agentHost.agentGui.contextPickerBrowseFileHint\");\n case \"session\":\n return translate(\"agentHost.agentGui.contextPickerBrowseSessionHint\");\n case \"issue\":\n return translate(\"agentHost.agentGui.contextPickerBrowseIssueHint\");\n }\n}\n\nfunction hasInteractiveGroupEntries(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n return groups.some((group) => group.items.length > 0 || group.hasMore);\n}\n\nfunction isFileBrowseGroupsOnlyEmpty(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n const fileGroups = groups.filter(\n (group) =>\n group.id === \"opened_files\" || group.id === \"agent_generated_files\"\n );\n if (fileGroups.length === 0) {\n return false;\n }\n return fileGroups.every(\n (group) => group.items.length === 0 && !group.hasMore\n );\n}\n\nfunction shouldShowBrowseSearchHint(input: {\n browseFilter: AgentMentionFilterId;\n groups: ReadonlyArray<AgentMentionGroup>;\n highlightedBrowseCategory: string | null;\n mode: AgentMentionSearchState[\"mode\"];\n}): boolean {\n if (input.mode !== \"browse\" || hasInteractiveGroupEntries(input.groups)) {\n return false;\n }\n if (input.groups.length === 0) {\n return true;\n }\n if (\n input.highlightedBrowseCategory !== null &&\n input.highlightedBrowseCategory !== input.browseFilter\n ) {\n return true;\n }\n return (\n input.browseFilter === \"file\" && isFileBrowseGroupsOnlyEmpty(input.groups)\n );\n}\n","import { translate, type TranslateFn } from \"../i18n/index\";\n\nexport function roomIssueStatusLabel(status: string, t?: TranslateFn): string {\n const translateFn = t ?? translate;\n switch (status) {\n case \"not_started\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusNotStarted\");\n case \"running\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusRunning\");\n case \"in_progress\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusInProgress\");\n case \"pending_acceptance\":\n return translateFn(\n \"agentHost.roomIssueNode.issueStatusPendingAcceptance\"\n );\n case \"completed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCompleted\");\n case \"failed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusFailed\");\n case \"canceled\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCanceled\");\n default:\n return (\n status || translateFn(\"agentHost.roomIssueNode.issueStatusUnknown\")\n );\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../agent-gui/agentGuiNode/AgentFileMentionPalette.tsx","../shared/roomIssueStatusLabel.ts"],"sourcesContent":["import {\n normalizeAgentActivityDisplayStatus,\n type AgentActivityDisplayStatus\n} from \"@tutti-os/agent-activity-core\";\nimport {\n MentionPaletteFromState,\n flattenMentionPaletteEntries,\n renderMentionRow,\n type MentionPaletteEntry,\n type MentionPaletteState,\n type MentionPaletteTheme,\n type MentionRowClassNames,\n type MentionRowItem,\n type MentionRowStatusTag,\n type MentionRowStatusTone\n} from \"@tutti-os/ui-rich-text/at-panel\";\nimport { resolveIssueManagerStatusPresentation } from \"@tutti-os/workspace-issue-manager/ui\";\nimport { userAvatarPlaceholderUrl } from \"../../shared/userAvatarPlaceholder\";\nimport { translate } from \"../../i18n/index\";\nimport { managedAgentRoundedIconUrl } from \"../../shared/managedAgentIcons\";\nimport { workspaceAgentActivityStatusLabel } from \"../../shared/workspaceAgentActivityStatusLabel\";\nimport { roomIssueStatusLabel } from \"../../shared/roomIssueStatusLabel\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../shared/mentionFilePresentation\";\nimport {\n agentMentionEmptyGroupLabel,\n agentMentionFilterLabel,\n agentMentionGroupLabel\n} from \"./AgentMentionLabels\";\nimport {\n AGENT_MENTION_FILTER_TAB_ORDER,\n mentionGroupExpandCount\n} from \"./agentMentionSearchHelpers\";\nimport {\n type AgentMentionGroup,\n type AgentMentionBrowseCategory,\n type AgentMentionFilterId,\n type AgentMentionGroupId,\n type AgentMentionSearchState\n} from \"./AgentMentionSearchController\";\nimport { agentGeneratedMentionItemKey } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\n\nexport interface AgentMentionPaletteEntry {\n key: string;\n type: \"category\" | \"item\" | \"expand\";\n categoryId?: AgentMentionBrowseCategory[\"id\"];\n groupId?: AgentMentionGroupId;\n item?: AgentContextMentionItem;\n}\n\nexport interface AgentFileMentionPaletteProps {\n state: AgentMentionSearchState;\n highlightedKey: string | null;\n label: string;\n loadingLabel: string;\n emptyLabel: string;\n errorLabel: string;\n tabHintLabel: string;\n maxHeightPx: number;\n shouldCenterHighlightedItem?: boolean;\n onHighlightChange: (key: string) => void;\n onSelectItem: (entry: AgentContextMentionItem) => void;\n onSelectCategory: (categoryId: AgentMentionBrowseCategory[\"id\"]) => void;\n onSelectFilter: (filter: AgentMentionFilterId) => void;\n onExpandGroup: (groupId: AgentMentionGroupId) => void;\n onNavigateHierarchy?: (delta: 1 | -1) => void;\n onNavigateIntoItem?: (item: AgentContextMentionItem) => void;\n /**\n * 可选:点击 issue / app 行末尾的「查看产物」入口时回调(打开引用 picker 并定位)。\n * 仅 workspace-issue / workspace-app 行渲染该入口。\n */\n onOpenReferences?: (item: AgentContextMentionItem) => void;\n}\n\nconst AGENT_MENTION_PALETTE_THEME: MentionPaletteTheme = {\n classNames: {\n palette: \"agent-gui-node__mention-palette\",\n header: \"agent-gui-node__mention-palette-header\",\n footer: \"agent-gui-node__mention-palette-footer\",\n tabs: \"agent-gui-node__mention-palette-tabs\",\n scrollRegion: \"agent-gui-node__mention-palette-scroll-region\",\n scrollbar:\n \"workspace-agents-status-panel__scrollbar agent-gui-node__mention-palette-scrollbar\",\n scrollbarThumb: \"workspace-agents-status-panel__scrollbar-thumb\",\n hint: \"agent-gui-node__mention-palette-hint\",\n hintItem: \"agent-gui-node__mention-palette-hint-item\",\n hintButton: \"agent-gui-node__mention-palette-hint-button\",\n hintSeparator: \"agent-gui-node__mention-palette-hint-separator\",\n shortcut: \"agent-gui-node__mention-palette-shortcut\",\n shortcutArrow: \"agent-gui-node__mention-palette-shortcut--arrow\",\n shortcutButton: \"agent-gui-node__mention-palette-shortcut-button\",\n shortcutGroup: \"agent-gui-node__mention-palette-shortcut-group\"\n },\n testIds: {\n emptyState: \"agent-gui-mention-palette-empty-state\",\n hint: \"agent-gui-mention-palette-hint\",\n scrollbar: \"agent-gui-mention-palette-scrollbar\",\n loadingSpinner: \"agent-mention-loading-spinner\"\n },\n groupDividerAttribute: \"data-agent-mention-group-divider\"\n};\n\n/**\n * The agent composer's existing structural row class names. Passing these to\n * {@link renderMentionRow} keeps the rendered DOM byte-identical to the\n * pre-refactor markup (the agent stylesheet `agentactivity.css` owns these\n * rules and the agent spec greps them), while the shared component defaults to\n * package-owned `rich-text-at-mention-*` names for other surfaces.\n */\nconst AGENT_MENTION_ROW_CLASS_NAMES: MentionRowClassNames = {\n fileIcon: \"agent-gui-node__mention-file-icon\",\n fileThumb: \"agent-gui-node__mention-file-thumb\",\n kindIcon: \"tsh-agent-object-token__kind-icon\",\n avatarImgUserPlaceholder:\n \"workspace-agents-status-panel__avatar-img--user-placeholder\"\n};\n\n/**\n * Stable per-item key suffix. The shared shell composes the full entry key as\n * `${group.id}:${agentMentionItemKey(item)}`, matching the agent's historical\n * `${group.id}:${item.kind}:${...}` format so highlight keys stay compatible.\n */\nexport function agentMentionItemKey(item: AgentContextMentionItem): string {\n return `${item.kind}:${\n item.kind === \"file\" ? agentGeneratedMentionItemKey(item) : item.targetId\n }`;\n}\n\nexport function flattenAgentMentionPaletteEntries(\n state: AgentMentionSearchState\n): AgentMentionPaletteEntry[] {\n return flattenMentionPaletteEntries(state, (item) =>\n agentMentionItemKey(item)\n ).map((entry: MentionPaletteEntry): AgentMentionPaletteEntry => {\n if (entry.type === \"item\") {\n const item =\n entry.groupId !== undefined && entry.itemIndex !== undefined\n ? state.groups.find((group) => group.id === entry.groupId)?.items[\n entry.itemIndex\n ]\n : undefined;\n return {\n key: entry.key,\n type: \"item\",\n groupId: entry.groupId as AgentMentionGroupId | undefined,\n item\n };\n }\n return {\n key: entry.key,\n type: entry.type,\n categoryId: entry.categoryId as AgentMentionFilterId | undefined,\n groupId: entry.groupId as AgentMentionGroupId | undefined\n };\n });\n}\n\nexport function groupStartKeys(state: AgentMentionSearchState): string[] {\n if (state.mode === \"browse\") {\n return state.categories.map((category) => `category:${category.id}`);\n }\n return state.groups\n .map((group) => {\n const firstItem = group.items[0];\n if (firstItem) {\n return `${group.id}:${agentMentionItemKey(firstItem)}`;\n }\n if (group.hasMore) {\n return `expand:${group.id}`;\n }\n return null;\n })\n .filter((key): key is string => key !== null);\n}\n\nexport function AgentFileMentionPalette({\n state,\n highlightedKey,\n label,\n loadingLabel,\n emptyLabel,\n errorLabel,\n tabHintLabel,\n maxHeightPx,\n shouldCenterHighlightedItem = false,\n onHighlightChange,\n onSelectItem,\n onSelectCategory,\n onSelectFilter,\n onExpandGroup,\n onNavigateHierarchy,\n onNavigateIntoItem,\n onOpenReferences\n}: AgentFileMentionPaletteProps): React.JSX.Element {\n \"use memo\";\n const openReferencesLabel = translate(\n \"agentHost.agentGui.mentionOpenReferences\"\n );\n const navigateIntoLabel = translate(\n \"agentHost.agentGui.fileMentionEnterFolder\"\n );\n const filter = state.filter as AgentMentionFilterId;\n const highlightedBrowseCategory = highlightedKey?.startsWith(\"category:\")\n ? highlightedKey.slice(\"category:\".length)\n : null;\n const showBrowseHint = shouldShowBrowseSearchHint({\n browseFilter: filter,\n groups: state.groups,\n highlightedBrowseCategory,\n mode: state.mode\n });\n\n // Browse mode carries its own category list (with labels); results mode tabs\n // are the fixed agent filter order. The shared shell renders a single tab\n // source, so resolve the right one here.\n const categories =\n state.mode === \"browse\"\n ? state.categories\n : AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n\n // When the agent wants the single keyboard browse hint we hand the shell an\n // empty group list so it renders its (keyboard-icon) empty state with our\n // computed hint copy. Otherwise we map the real groups, decorating each with\n // the agent-specific label / empty / expand / spacing chrome.\n const shellState: MentionPaletteState<AgentContextMentionItem> =\n showBrowseHint\n ? { ...state, categories, groups: [] }\n : {\n ...state,\n categories,\n groups: state.groups.map((group, index) =>\n decorateMentionGroup(\n group,\n index,\n state.groups,\n filter,\n state.query\n )\n )\n };\n\n const emptyLabelForShell = showBrowseHint\n ? browseHintForFilter(filter)\n : resolveMentionPaletteEmptyLabel({\n emptyLabel,\n filter,\n mode: state.mode,\n query: state.query\n });\n\n return (\n <MentionPaletteFromState<AgentContextMentionItem>\n state={shellState}\n highlightedKey={highlightedKey}\n getItemKey={agentMentionItemKey}\n renderItem={(item, { group }) =>\n renderMentionRow(agentMentionItemToRowItem(item), {\n classNames: AGENT_MENTION_ROW_CLASS_NAMES,\n dataAttributeMode: \"agent\",\n ...(onNavigateIntoItem && canNavigateIntoMentionItem(item, group)\n ? {\n onNavigateInto: () => onNavigateIntoItem(item),\n navigateIntoLabel\n }\n : {}),\n ...(onOpenReferences && isReferenceableMentionItem(item)\n ? {\n onOpenReferences: () => onOpenReferences(item),\n openReferencesLabel\n }\n : {})\n })\n }\n labels={{\n loading: loadingLabel,\n empty: emptyLabelForShell,\n error: errorLabel,\n tabHint: tabHintLabel,\n listbox: label\n }}\n hintLabels={{\n cycleFilter: translate(\"agentHost.agentGui.fileMentionSwitchCategory\"),\n moveSelection: translate(\n \"agentHost.agentGui.fileMentionSwitchSelection\"\n ),\n navigateHierarchy: translate(\n \"agentHost.agentGui.fileMentionNavigateHierarchy\"\n )\n }}\n maxHeightPx={maxHeightPx}\n scrollHighlightedIntoViewCentered={shouldCenterHighlightedItem}\n theme={AGENT_MENTION_PALETTE_THEME}\n callbacks={{\n onHighlightChange,\n onActiveCategoryIdChange: (categoryId) => {\n onSelectCategory(categoryId as AgentMentionBrowseCategory[\"id\"]);\n onSelectFilter(categoryId as AgentMentionFilterId);\n },\n onExpandGroup: (groupId) =>\n onExpandGroup(groupId as AgentMentionGroupId),\n onSelectItem\n }}\n onNavigateHierarchy={onNavigateHierarchy}\n />\n );\n}\n\nexport const AgentContextMentionPalette = AgentFileMentionPalette;\nexport type AgentContextMentionPaletteProps = AgentFileMentionPaletteProps;\n\n/**\n * Map a controller group onto the shared shell group, layering in the\n * agent-specific chrome the generic shell intentionally omits: translated\n * group / empty / expand labels, file-search chrome suppression, and the extra\n * top margin between the \"my sessions\" and \"collab sessions\" groups.\n */\nfunction decorateMentionGroup(\n group: AgentMentionGroup,\n index: number,\n groups: ReadonlyArray<AgentMentionGroup>,\n filter: AgentMentionFilterId,\n query: string\n): AgentMentionGroup {\n const groupId = group.id as AgentMentionGroupId;\n const suppressChrome = shouldSuppressFileSearchGroupChrome(filter, query);\n const followsMySessions =\n groupId === \"collab_sessions\" &&\n (groups[index - 1]?.id as AgentMentionGroupId) === \"my_sessions\";\n const showLabel = shouldRenderMentionGroupLabel({\n filter,\n groupCount: groups.length,\n groupId,\n query\n });\n return {\n ...group,\n label: showLabel ? agentMentionGroupLabel(groupId) : undefined,\n emptyLabel: suppressChrome\n ? undefined\n : agentMentionEmptyGroupLabel(groupId, query),\n expandLabel: group.hasMore\n ? translate(\"agentHost.agentGui.contextPickerExpandMore\", {\n count: mentionGroupExpandCount(group, filter)\n })\n : undefined,\n sectionClassName: followsMySessions ? \"mt-2\" : undefined,\n hideTopDivider: suppressChrome\n };\n}\n\nfunction shouldSuppressFileSearchGroupChrome(\n filter: AgentMentionFilterId,\n query: string\n): boolean {\n return filter === \"file\" && query.trim().length > 0;\n}\n\nfunction resolveMentionPaletteEmptyLabel(input: {\n emptyLabel: string;\n filter: AgentMentionFilterId;\n mode: AgentMentionSearchState[\"mode\"];\n query: string;\n}): string {\n if (\n input.mode === \"results\" &&\n input.filter === \"file\" &&\n input.query.trim().length > 0\n ) {\n return translate(\"agentHost.agentGui.mentionNoMatchingFiles\");\n }\n if (input.filter === \"session\") {\n return agentMentionEmptyGroupLabel(\"my_sessions\", input.query);\n }\n if (input.filter === \"app\") {\n return agentMentionEmptyGroupLabel(\"apps\", input.query);\n }\n if (input.filter === \"agent\") {\n return agentMentionEmptyGroupLabel(\"agents\", input.query);\n }\n if (input.filter === \"issue\") {\n return agentMentionEmptyGroupLabel(\"issues\", input.query);\n }\n return input.emptyLabel;\n}\n\nfunction shouldRenderMentionGroupLabel(input: {\n filter: AgentMentionFilterId;\n groupCount: number;\n groupId: AgentMentionGroupId;\n query: string;\n}): boolean {\n if (shouldSuppressFileSearchGroupChrome(input.filter, input.query)) {\n return false;\n }\n if (input.groupCount !== 1) {\n return true;\n }\n return (\n agentMentionGroupLabel(input.groupId) !==\n agentMentionFilterLabel(input.filter)\n );\n}\n\n/**\n * Resolve an agent mention item into the shared, display-ready\n * {@link MentionRowItem} view-model the generic {@link renderMentionRow}\n * consumes. All agent-specific bits — i18n via {@link translate}, the user\n * avatar placeholder asset, the managed-agent rounded icon, and the activity /\n * issue status labels — are resolved here so the shared renderer stays pure.\n */\nfunction agentMentionItemToRowItem(\n item: AgentContextMentionItem\n): MentionRowItem {\n if (item.kind === \"file\") {\n const visualKind = resolveAgentMentionFileVisualKind({\n entryKind: item.entryKind,\n href: item.href,\n mentionNavigation: item.mentionNavigation,\n name: item.name,\n path: item.path\n });\n const childCountLabel =\n item.mentionNavigation === \"agent-generated-folder\" &&\n typeof item.childCount === \"number\" &&\n item.childCount > 0\n ? translate(\"agentHost.agentGui.mentionAgentGeneratedFolderFileCount\", {\n count: item.childCount\n })\n : null;\n return {\n kind: \"file\",\n name: item.name,\n visualKind,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl(item) ?? null,\n childCountLabel,\n entryKind: item.entryKind,\n mentionNavigation: item.mentionNavigation\n };\n }\n\n if (item.kind === \"session\") {\n const isMySession = item.scope === \"my_sessions\";\n return {\n kind: \"session\",\n participant: isMySession\n ? item.agentName\n : `${item.initiatorName} & ${item.agentName}`,\n summary: item.title,\n userAvatarUrl: isMySession ? null : (item.initiatorAvatarUrl ?? null),\n userAvatarPlaceholderUrl,\n agentIconUrl:\n item.agentIconUrl?.trim() ||\n managedAgentRoundedIconUrl(\n mentionSessionAgentProvider(item) ?? item.agentName\n ),\n showUserAvatar: !isMySession,\n statusTag: agentSessionStatusTag(item.status)\n };\n }\n\n if (item.kind === \"workspace-app\") {\n return {\n kind: \"app\",\n name: item.name,\n description: item.description ?? null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"agent-target\") {\n return {\n kind: \"app\",\n name: item.name,\n description: item.description ?? null,\n iconUrl: item.iconUrl ?? managedAgentRoundedIconUrl(item.agentProviderId),\n statusTag: agentTargetAvailableStatusTag()\n };\n }\n\n if (item.kind === \"workspace-reference\") {\n return {\n kind: \"app\",\n name: item.name,\n description: null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"workspace-app-factory\") {\n return {\n kind: \"app-factory\",\n name: item.name\n };\n }\n\n if (item.kind === \"custom\") {\n // 自定义 mention 只经 draftPrompt prefill 进入 composer,不出现在 @ 面板候选;\n // 兜底按通用条目展示(label 即注册方给的 name)。\n return {\n kind: \"issue\",\n title: item.name,\n creatorName: null,\n statusTag: null\n };\n }\n\n return {\n kind: \"issue\",\n title: item.title,\n creatorName: item.creatorName ?? null,\n statusTag: agentIssueStatusTag(item.status)\n };\n}\n\n/**\n * 仅 workspace-issue 行,以及声明了能够提供产物文件(reference)的 workspace-app 行,\n * 才在行末尾展示「查看产物」入口。应用是否能提供产物文件由其 manifest 的\n * references 能力决定(`referencesListSupported`),而非硬编码应用名单。\n */\nfunction isReferenceableMentionItem(item: AgentContextMentionItem): boolean {\n if (item.kind === \"workspace-issue\") {\n return true;\n }\n if (item.kind === \"workspace-app\") {\n return item.referencesListSupported === true;\n }\n return false;\n}\n\nfunction canNavigateIntoMentionItem(\n item: AgentContextMentionItem,\n group: AgentMentionGroup\n): boolean {\n return (\n group.id === \"agent_generated_files\" &&\n item.kind === \"file\" &&\n item.mentionNavigation === \"agent-generated-folder\"\n );\n}\n\nfunction mentionSessionAgentProvider(\n item: Extract<AgentContextMentionItem, { kind: \"session\" }>\n): string | null {\n const queryStart = item.href.indexOf(\"?\");\n if (queryStart < 0) {\n return null;\n }\n return new URLSearchParams(item.href.slice(queryStart + 1)).get(\"provider\");\n}\n\nfunction agentSessionStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n const activityStatus = normalizeAgentActivityDisplayStatus(status);\n return {\n label: workspaceAgentActivityStatusLabel(activityStatus),\n tone: mentionStatusTone(activityStatus),\n pulse: activityStatus === \"working\" || activityStatus === \"waiting\",\n variant: \"activity\",\n dataStatus: activityStatus\n };\n}\n\n/**\n * Agent targets are only surfaced when the provider is ready/available, so the\n * `@` row always shows a green \"Available\" badge at its trailing edge.\n */\nfunction agentTargetAvailableStatusTag(): MentionRowStatusTag {\n return {\n label: translate(\"agentHost.agentGui.mentionAgentTargetAvailable\"),\n tone: \"green\",\n variant: \"activity\",\n dataStatus: \"available\"\n };\n}\n\nfunction agentIssueStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n const presentation = resolveIssueManagerStatusPresentation(status);\n return {\n label: roomIssueStatusLabel(status),\n tone: presentation.mentionTone,\n variant: \"issue\",\n dataStatus: presentation.dataStatus\n };\n}\n\nfunction mentionStatusTone(\n status: AgentActivityDisplayStatus\n): MentionRowStatusTone {\n if (status === \"working\") {\n return \"blue\";\n }\n if (status === \"waiting\" || status === \"canceled\") {\n return \"amber\";\n }\n if (status === \"completed\" || status === \"idle\") {\n return \"green\";\n }\n if (status === \"failed\") {\n return \"red\";\n }\n return \"neutral\";\n}\n\nfunction browseHintForFilter(filter: AgentMentionFilterId): string {\n switch (filter) {\n case \"agent\":\n return translate(\"agentHost.agentGui.contextPickerBrowseAgentHint\");\n case \"app\":\n return translate(\"agentHost.agentGui.contextPickerBrowseAppHint\");\n case \"file\":\n return translate(\"agentHost.agentGui.contextPickerBrowseFileHint\");\n case \"session\":\n return translate(\"agentHost.agentGui.contextPickerBrowseSessionHint\");\n case \"issue\":\n return translate(\"agentHost.agentGui.contextPickerBrowseIssueHint\");\n }\n}\n\nfunction hasInteractiveGroupEntries(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n return groups.some((group) => group.items.length > 0 || group.hasMore);\n}\n\nfunction isFileBrowseGroupsOnlyEmpty(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n const fileGroups = groups.filter(\n (group) =>\n group.id === \"opened_files\" || group.id === \"agent_generated_files\"\n );\n if (fileGroups.length === 0) {\n return false;\n }\n return fileGroups.every(\n (group) => group.items.length === 0 && !group.hasMore\n );\n}\n\nfunction shouldShowBrowseSearchHint(input: {\n browseFilter: AgentMentionFilterId;\n groups: ReadonlyArray<AgentMentionGroup>;\n highlightedBrowseCategory: string | null;\n mode: AgentMentionSearchState[\"mode\"];\n}): boolean {\n if (input.mode !== \"browse\" || hasInteractiveGroupEntries(input.groups)) {\n return false;\n }\n if (input.groups.length === 0) {\n return true;\n }\n if (\n input.highlightedBrowseCategory !== null &&\n input.highlightedBrowseCategory !== input.browseFilter\n ) {\n return true;\n }\n return (\n input.browseFilter === \"file\" && isFileBrowseGroupsOnlyEmpty(input.groups)\n );\n}\n","import { translate, type TranslateFn } from \"../i18n/index\";\n\nexport function roomIssueStatusLabel(status: string, t?: TranslateFn): string {\n const translateFn = t ?? translate;\n switch (status) {\n case \"not_started\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusNotStarted\");\n case \"running\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusRunning\");\n case \"in_progress\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusInProgress\");\n case \"pending_acceptance\":\n return translateFn(\n \"agentHost.roomIssueNode.issueStatusPendingAcceptance\"\n );\n case \"completed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCompleted\");\n case \"failed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusFailed\");\n case \"canceled\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCanceled\");\n default:\n return (\n status || translateFn(\"agentHost.roomIssueNode.issueStatusUnknown\")\n );\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -6,6 +6,7 @@ function normalizeAgentGUIAgents(agents) {
|
|
|
6
6
|
const agentTargetId = agent.agentTargetId.trim();
|
|
7
7
|
const name = agent.name.trim();
|
|
8
8
|
const iconUrl = agent.iconUrl.trim();
|
|
9
|
+
const heroImageUrl = agent.heroImageUrl?.trim() ?? "";
|
|
9
10
|
if (!agentTargetId || !name || !iconUrl || seenAgentTargetIds.has(agentTargetId)) {
|
|
10
11
|
continue;
|
|
11
12
|
}
|
|
@@ -17,6 +18,7 @@ function normalizeAgentGUIAgents(agents) {
|
|
|
17
18
|
agentTargetId,
|
|
18
19
|
name,
|
|
19
20
|
iconUrl,
|
|
21
|
+
...heroImageUrl ? { heroImageUrl } : {},
|
|
20
22
|
...agent.description?.trim() ? { description: agent.description.trim() } : {},
|
|
21
23
|
...ownerName || ownerAvatarUrl ? {
|
|
22
24
|
owner: {
|
|
@@ -61,6 +63,7 @@ function projectAgentGUIAgentsToInternalTargets(agents) {
|
|
|
61
63
|
label: agent.name,
|
|
62
64
|
...agent.description ? { description: agent.description } : {},
|
|
63
65
|
iconUrl: agent.iconUrl,
|
|
66
|
+
...agent.heroImageUrl ? { heroImageUrl: agent.heroImageUrl } : {},
|
|
64
67
|
...agent.owner?.avatarUrl ? {
|
|
65
68
|
badge: {
|
|
66
69
|
iconUrl: agent.owner.avatarUrl,
|
|
@@ -90,4 +93,4 @@ export {
|
|
|
90
93
|
resolveAgentGUISelectedDirectoryAgent,
|
|
91
94
|
projectAgentGUIAgentsToInternalTargets
|
|
92
95
|
};
|
|
93
|
-
//# sourceMappingURL=chunk-
|
|
96
|
+
//# sourceMappingURL=chunk-C35SNDVZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../agents.ts"],"sourcesContent":["import type {\n AgentGUIAgent,\n AgentGUIAgentAvailabilityStatus,\n AgentGUIAgentTarget\n} from \"./types.ts\";\n\nexport function normalizeAgentGUIAgents(\n agents: readonly AgentGUIAgent[] | null | undefined\n): AgentGUIAgent[] {\n const normalized: AgentGUIAgent[] = [];\n const seenAgentTargetIds = new Set<string>();\n for (const agent of agents ?? []) {\n const agentTargetId = agent.agentTargetId.trim();\n const name = agent.name.trim();\n const iconUrl = agent.iconUrl.trim();\n const heroImageUrl = agent.heroImageUrl?.trim() ?? \"\";\n if (\n !agentTargetId ||\n !name ||\n !iconUrl ||\n seenAgentTargetIds.has(agentTargetId)\n ) {\n continue;\n }\n seenAgentTargetIds.add(agentTargetId);\n const ownerName = agent.owner?.name?.trim() ?? \"\";\n const ownerAvatarUrl = agent.owner?.avatarUrl?.trim() ?? \"\";\n const reason = agent.availability.reason?.trim() ?? \"\";\n normalized.push({\n agentTargetId,\n name,\n iconUrl,\n ...(heroImageUrl ? { heroImageUrl } : {}),\n ...(agent.description?.trim()\n ? { description: agent.description.trim() }\n : {}),\n ...(ownerName || ownerAvatarUrl\n ? {\n owner: {\n ...(ownerName ? { name: ownerName } : {}),\n ...(ownerAvatarUrl ? { avatarUrl: ownerAvatarUrl } : {})\n }\n }\n : {}),\n availability: {\n status: normalizeAgentGUIAgentAvailabilityStatus(\n agent.availability.status\n ),\n ...(reason ? { reason } : {}),\n ...(agent.availability.pendingAction\n ? { pendingAction: agent.availability.pendingAction }\n : {})\n },\n provider: agent.provider\n });\n }\n return normalized;\n}\n\nexport function agentGUIAgentIsReady(agent: AgentGUIAgent): boolean {\n return agent.availability.status === \"ready\";\n}\n\nexport function resolveAgentGUISelectedDirectoryAgent(input: {\n agents: readonly AgentGUIAgent[];\n agentTargetId?: string | null;\n defaultAgentTargetId?: string | null;\n}): AgentGUIAgent | null {\n const explicitAgentTargetId =\n input.agentTargetId?.trim() || input.defaultAgentTargetId?.trim() || \"\";\n if (explicitAgentTargetId) {\n return (\n input.agents.find(\n (agent) => agent.agentTargetId === explicitAgentTargetId\n ) ?? null\n );\n }\n return (\n input.agents.find((agent) => agentGUIAgentIsReady(agent)) ??\n input.agents[0] ??\n null\n );\n}\n\n/** Package-internal bridge while the carried node is migrated to agent names. */\nexport function projectAgentGUIAgentsToInternalTargets(\n agents: readonly AgentGUIAgent[]\n): AgentGUIAgentTarget[] {\n return agents.map((agent) => ({\n targetId: agent.agentTargetId,\n agentTargetId: agent.agentTargetId,\n provider: agent.provider,\n ref: {\n kind: \"agent-directory\",\n provider: agent.provider,\n agentTargetId: agent.agentTargetId\n },\n label: agent.name,\n ...(agent.description ? { description: agent.description } : {}),\n iconUrl: agent.iconUrl,\n ...(agent.heroImageUrl ? { heroImageUrl: agent.heroImageUrl } : {}),\n ...(agent.owner?.avatarUrl\n ? {\n badge: {\n iconUrl: agent.owner.avatarUrl,\n ...(agent.owner.name ? { label: agent.owner.name } : {})\n }\n }\n : {}),\n ...(agent.owner?.name ? { ownerLabel: agent.owner.name } : {}),\n ...(agent.availability.status !== \"ready\" ? { disabled: true } : {}),\n ...(agent.availability.reason\n ? { unavailableReason: agent.availability.reason }\n : {})\n }));\n}\n\nfunction normalizeAgentGUIAgentAvailabilityStatus(\n status: AgentGUIAgentAvailabilityStatus\n): AgentGUIAgentAvailabilityStatus {\n switch (status) {\n case \"ready\":\n case \"checking\":\n case \"coming_soon\":\n case \"not_installed\":\n case \"auth_required\":\n case \"unavailable\":\n return status;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
setCurrentAgentGuiI18nRuntime,
|
|
7
7
|
translate,
|
|
8
8
|
translateInUiLanguage
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-W6WAGPMD.js";
|
|
10
10
|
|
|
11
11
|
// i18n/index.ts
|
|
12
12
|
import React, {
|
|
@@ -68,4 +68,4 @@ export {
|
|
|
68
68
|
AgentGuiI18nProvider,
|
|
69
69
|
useTranslation
|
|
70
70
|
};
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
71
|
+
//# sourceMappingURL=chunk-E4HQUTM3.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
translate
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-E4HQUTM3.js";
|
|
4
4
|
import {
|
|
5
5
|
agentGUIProviderIdentityDisplayName,
|
|
6
6
|
resolveMigratedAgentGUIProviderIdentity
|
|
@@ -22,4 +22,4 @@ function titleCase(value) {
|
|
|
22
22
|
export {
|
|
23
23
|
workspaceAgentProviderLabel
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
25
|
+
//# sourceMappingURL=chunk-H5F3QSCF.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
agentGuiWorkbenchProviders,
|
|
3
3
|
isAgentGuiWorkbenchProvider,
|
|
4
4
|
normalizeAgentGuiWorkbenchProvider
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-L3GMMGRS.js";
|
|
6
6
|
|
|
7
7
|
// workbench/state.ts
|
|
8
8
|
function createDefaultAgentGuiWorkbenchNodeState(provider = "codex") {
|
|
@@ -57,10 +57,7 @@ function areAgentGuiWorkbenchStatesEqual(left, right) {
|
|
|
57
57
|
}
|
|
58
58
|
function normalizeAgentGuiWorkbenchNodeState(state, fallbackProvider = "codex") {
|
|
59
59
|
const persistedState = isRecord(state) ? state : {};
|
|
60
|
-
const provider = normalizeAgentGuiWorkbenchProvider(
|
|
61
|
-
persistedState.provider,
|
|
62
|
-
fallbackProvider
|
|
63
|
-
);
|
|
60
|
+
const provider = persistedState.provider === void 0 || persistedState.provider === null ? fallbackProvider : normalizeAgentGuiWorkbenchProvider(persistedState.provider);
|
|
64
61
|
return {
|
|
65
62
|
...createDefaultAgentGuiWorkbenchNodeState(provider),
|
|
66
63
|
agentTargetId: normalizeOptionalNonEmptyString(
|
|
@@ -306,4 +303,4 @@ export {
|
|
|
306
303
|
agentGuiWorkbenchProviderFromInstanceIdOrNull,
|
|
307
304
|
createAgentGuiWorkbenchNodeStateSource
|
|
308
305
|
};
|
|
309
|
-
//# sourceMappingURL=chunk-
|
|
306
|
+
//# sourceMappingURL=chunk-IYEXLOUE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../workbench/state.ts"],"sourcesContent":["import type {\n WorkbenchHostExternalStateLookupInput,\n WorkbenchHostExternalStateSource\n} from \"@tutti-os/workbench-surface\";\nimport {\n agentGuiWorkbenchProviders,\n isAgentGuiWorkbenchProvider,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchComposerOverrides,\n AgentGuiWorkbenchComposerOverridesByAgentTargetId,\n AgentGuiWorkbenchComposerOverridesByProvider,\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState,\n AgentGuiWorkbenchWorkspaceState\n} from \"./types.ts\";\n\ntype AgentGuiWorkbenchStateLookupRequest = Pick<\n WorkbenchHostExternalStateLookupInput,\n \"instanceId\" | \"typeId\"\n> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>;\n\nexport function createDefaultAgentGuiWorkbenchNodeState(\n provider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n return {\n agentTargetId: null,\n composerOverrides: null,\n composerOverridesByAgentTargetId: null,\n composerOverridesByProvider: null,\n conversationCount: null,\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null,\n provider\n };\n}\n\nexport function normalizeAgentGuiWorkbenchState(\n state: unknown\n): AgentGuiWorkbenchState {\n if (!isRecord(state)) {\n return createDefaultAgentGuiWorkbenchState();\n }\n const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null\n };\n}\n\n/**\n * One-time persisted-state reader for snapshots written before agentTargetId\n * became the canonical AgentGUI selection key. Current-state normalizers stay\n * strict so live callers cannot continue using the removed alias.\n */\nexport function migrateLegacyAgentGuiWorkbenchState(state: unknown): unknown {\n if (\n !isRecord(state) ||\n normalizeOptionalNonEmptyString(state.agentTargetId)\n ) {\n return state;\n }\n const legacyAgentTargetId = normalizeOptionalNonEmptyString(\n state.providerTargetId\n );\n return legacyAgentTargetId\n ? { ...state, agentTargetId: legacyAgentTargetId }\n : state;\n}\n\nexport function projectAgentGuiWorkbenchState(\n state: AgentGuiWorkbenchNodeState\n): AgentGuiWorkbenchState {\n const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId: state.lastActiveAgentSessionId ?? null\n };\n}\n\nexport function areAgentGuiWorkbenchStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId\n );\n}\n\nexport function normalizeAgentGuiWorkbenchNodeState(\n state: unknown,\n fallbackProvider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n const persistedState = isRecord(state) ? state : {};\n const provider =\n persistedState.provider === undefined || persistedState.provider === null\n ? fallbackProvider\n : normalizeAgentGuiWorkbenchProvider(persistedState.provider);\n return {\n ...createDefaultAgentGuiWorkbenchNodeState(provider),\n agentTargetId: normalizeOptionalNonEmptyString(\n persistedState.agentTargetId\n ),\n composerOverrides: normalizeAgentGuiWorkbenchComposerOverrides(\n persistedState.composerOverrides\n ),\n composerOverridesByAgentTargetId:\n normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n persistedState.composerOverridesByAgentTargetId\n ),\n composerOverridesByProvider:\n normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n persistedState.composerOverridesByProvider\n ),\n conversationCount: normalizeOptionalNonNegativeNumber(\n persistedState.conversationCount\n ),\n conversationRailCollapsed:\n persistedState.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n persistedState.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof persistedState.lastActiveAgentSessionId === \"string\"\n ? persistedState.lastActiveAgentSessionId\n : null,\n provider\n };\n}\n\nexport function areAgentGuiWorkbenchNodeStatesEqual(\n left: AgentGuiWorkbenchNodeState,\n right: AgentGuiWorkbenchNodeState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n composerOverridesEqual(left.composerOverrides, right.composerOverrides) &&\n composerOverridesByAgentTargetIdEqual(\n left.composerOverridesByAgentTargetId,\n right.composerOverridesByAgentTargetId\n ) &&\n composerOverridesByProviderEqual(\n left.composerOverridesByProvider,\n right.composerOverridesByProvider\n ) &&\n left.conversationCount === right.conversationCount &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n left.provider === right.provider &&\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null)\n );\n}\n\nexport function agentGuiWorkbenchProviderFromInstanceId(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider {\n const provider = agentGuiWorkbenchProviderFromInstanceIdOrNull(instanceId);\n if (!provider) {\n throw new Error(\"agent_gui_workbench.instance_provider_required\");\n }\n return provider;\n}\n\n/**\n * Like {@link agentGuiWorkbenchProviderFromInstanceId} but returns `null`\n * instead of defaulting to `\"codex\"` when the provider cannot be determined\n * yet (e.g. a freshly created session whose instanceId does not encode a\n * provider). Callers that render a provider icon use this so they can show a\n * neutral placeholder during that transient window instead of flashing the\n * wrong provider's icon.\n */\nexport function agentGuiWorkbenchProviderFromInstanceIdOrNull(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider | null {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return null;\n }\n const [, provider] = normalized.split(\":\", 3);\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nexport function createAgentGuiWorkbenchNodeStateSource(input: {\n typeId?: string;\n workspaceId: string;\n}): {\n externalStateSource: WorkbenchHostExternalStateSource<\n AgentGuiWorkbenchState | null,\n AgentGuiWorkbenchWorkspaceState\n >;\n readNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest\n ) => AgentGuiWorkbenchState | null;\n writeNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest & {\n state: AgentGuiWorkbenchState;\n }\n ) => void;\n /**\n * Returns the launch instanceId of an open node currently showing the given\n * agent session, or null when none is found. Used to focus an existing\n * conversation instead of launching a duplicate node.\n */\n findInstanceIdByAgentSessionId: (agentSessionId: string) => string | null;\n} {\n const typeId = input.typeId ?? \"agent-gui\";\n const nodeStateByKey = new Map<string, AgentGuiWorkbenchState>();\n // Tracks the launch instanceId behind each state key so a node can be located\n // by the session it is currently showing, even when its key is node-scoped.\n const instanceIdByKey = new Map<string, string>();\n const listeners = new Set<() => void>();\n\n const lookupState = (request: AgentGuiWorkbenchStateLookupRequest) => {\n const nodeState = request.nodeId\n ? nodeStateByKey.get(agentGuiWorkbenchNodeStateKey(request))\n : null;\n const state =\n nodeState ??\n nodeStateByKey.get(agentGuiWorkbenchInstanceStateKey(request));\n return state ? { ...state } : null;\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n externalStateSource: {\n getNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getSnapshotNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getWorkspaceState() {\n return {\n workspaceId: input.workspaceId\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n },\n readNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n findInstanceIdByAgentSessionId(agentSessionId) {\n const target = agentSessionId.trim();\n if (!target) {\n return null;\n }\n for (const [key, state] of nodeStateByKey) {\n if (state.lastActiveAgentSessionId?.trim() === target) {\n return instanceIdByKey.get(key) ?? null;\n }\n }\n return null;\n },\n writeNodeState(request) {\n if (request.typeId !== typeId) {\n return;\n }\n const key = agentGuiWorkbenchNodeStateKey(request);\n instanceIdByKey.set(key, request.instanceId);\n const previous = nodeStateByKey.get(key);\n let clearedInstanceSeed = false;\n if (request.nodeId) {\n const instanceKey = agentGuiWorkbenchInstanceStateKey(request);\n instanceIdByKey.delete(instanceKey);\n clearedInstanceSeed = nodeStateByKey.delete(instanceKey);\n }\n const next = {\n ...normalizeAgentGuiWorkbenchState(request.state)\n };\n nodeStateByKey.set(key, next);\n if (\n !clearedInstanceSeed &&\n previous &&\n areAgentGuiWorkbenchMemoryStatesEqual(previous, next)\n ) {\n return;\n }\n notify();\n }\n };\n}\n\nfunction areAgentGuiWorkbenchMemoryStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return areAgentGuiWorkbenchStatesEqual(left, right);\n}\n\nfunction agentGuiWorkbenchNodeStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\"> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>\n): string {\n return request.nodeId\n ? `node:${request.nodeId}`\n : agentGuiWorkbenchInstanceStateKey(request);\n}\n\nfunction agentGuiWorkbenchInstanceStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\">\n): string {\n return `instance:${request.instanceId}`;\n}\n\nfunction createDefaultAgentGuiWorkbenchState(): AgentGuiWorkbenchState {\n return {\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null\n };\n}\n\nfunction normalizeOptionalNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverrides(\n value: unknown\n): AgentGuiWorkbenchComposerOverrides | null {\n if (!isRecord(value)) {\n return null;\n }\n const composerOverrides: AgentGuiWorkbenchComposerOverrides = {};\n if (typeof value.model === \"string\" && value.model.trim()) {\n composerOverrides.model = value.model.trim();\n }\n if (\n typeof value.reasoningEffort === \"string\" &&\n value.reasoningEffort.trim()\n ) {\n composerOverrides.reasoningEffort = value.reasoningEffort.trim();\n }\n if (\n typeof value.permissionModeId === \"string\" &&\n value.permissionModeId.trim()\n ) {\n composerOverrides.permissionModeId = value.permissionModeId.trim();\n }\n if (typeof value.planMode === \"boolean\") {\n composerOverrides.planMode = value.planMode;\n }\n return Object.keys(composerOverrides).length > 0 ? composerOverrides : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByProvider | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByProvider = {};\n for (const provider of agentGuiWorkbenchProviders) {\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(\n value[provider]\n );\n if (overrides) {\n result[provider] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByAgentTargetId | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByAgentTargetId = {};\n for (const [rawAgentTargetId, rawOverrides] of Object.entries(value)) {\n const agentTargetId = normalizeOptionalNonEmptyString(rawAgentTargetId);\n if (!agentTargetId) {\n continue;\n }\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(rawOverrides);\n if (overrides) {\n result[agentTargetId] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeOptionalPositiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.round(value)\n : null;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.round(value)\n : null;\n}\n\nfunction composerOverridesEqual(\n left: AgentGuiWorkbenchComposerOverrides | null | undefined,\n right: AgentGuiWorkbenchComposerOverrides | null | undefined\n): boolean {\n return (\n (left?.model ?? null) === (right?.model ?? null) &&\n (left?.permissionModeId ?? null) === (right?.permissionModeId ?? null) &&\n (left?.planMode ?? null) === (right?.planMode ?? null) &&\n (left?.reasoningEffort ?? null) === (right?.reasoningEffort ?? null)\n );\n}\n\nfunction composerOverridesByProviderEqual(\n left: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined\n): boolean {\n for (const provider of agentGuiWorkbenchProviders) {\n if (!composerOverridesEqual(left?.[provider], right?.[provider])) {\n return false;\n }\n }\n return true;\n}\n\nfunction composerOverridesByAgentTargetIdEqual(\n left: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined\n): boolean {\n const leftKeys = Object.keys(left ?? {}).sort();\n const rightKeys = Object.keys(right ?? {}).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n return leftKeys.every(\n (key, index) =>\n key === rightKeys[index] &&\n composerOverridesEqual(left?.[key], right?.[key])\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":[]}
|