@tutti-os/agent-gui 0.0.63 → 0.0.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/agent-conversation/index.d.ts +2 -2
  2. package/dist/agent-conversation/index.js +7 -7
  3. package/dist/agent-env/index.js +2 -1
  4. package/dist/agent-env/index.js.map +1 -1
  5. package/dist/agent-message-center/index.js +9 -9
  6. package/dist/{agentGuiNodeTypes-CC52zXAV.d.ts → agentGuiNodeTypes-CCjzXdTe.d.ts} +4 -1
  7. package/dist/app/renderer/agentactivity.css +41 -7
  8. package/dist/app/renderer/assets/icons/agents/agent-colorful.png +0 -0
  9. package/dist/app/renderer/assets/icons/agents/cursor-colorful.png +0 -0
  10. package/dist/app/renderer/assets/icons/agents/cursor-flat-filled.svg +3 -0
  11. package/dist/app/renderer/assets/icons/agents/cursor-rounded.png +0 -0
  12. package/dist/{chunk-IIVHPXAB.js → chunk-2IMBPRKV.js} +1 -1
  13. package/dist/chunk-2IMBPRKV.js.map +1 -0
  14. package/dist/{chunk-6MUKWI6Z.js → chunk-6OYLLPPN.js} +167 -113
  15. package/dist/chunk-6OYLLPPN.js.map +1 -0
  16. package/dist/{chunk-22L4VWUR.js → chunk-CKCUEHBW.js} +3 -1
  17. package/dist/chunk-CKCUEHBW.js.map +1 -0
  18. package/dist/{chunk-NZN43XT5.js → chunk-DL6BMEHI.js} +8 -6
  19. package/dist/chunk-DL6BMEHI.js.map +1 -0
  20. package/dist/{chunk-G6UO6JVM.js → chunk-EIPQGFAE.js} +2 -2
  21. package/dist/{chunk-SGXYVGQT.js → chunk-HKKC2U6J.js} +5 -5
  22. package/dist/{chunk-SW6JCJCO.js → chunk-IDTB6OID.js} +3 -3
  23. package/dist/{chunk-5WB3NGIN.js → chunk-LJE2W4EM.js} +27 -2
  24. package/dist/chunk-LJE2W4EM.js.map +1 -0
  25. package/dist/{chunk-K4UUEG7X.js → chunk-LQHYHF36.js} +115 -36
  26. package/dist/chunk-LQHYHF36.js.map +1 -0
  27. package/dist/{chunk-FRCIPTUD.js → chunk-N4I3TD4G.js} +8 -18
  28. package/dist/chunk-N4I3TD4G.js.map +1 -0
  29. package/dist/{chunk-QC642RAG.js → chunk-N7BGNAA2.js} +15 -8
  30. package/dist/chunk-N7BGNAA2.js.map +1 -0
  31. package/dist/{chunk-3KS22CG2.js → chunk-P5C3ED3V.js} +5 -4
  32. package/dist/chunk-P5C3ED3V.js.map +1 -0
  33. package/dist/{chunk-7P6CUYQT.js → chunk-QULZNKPA.js} +2 -2
  34. package/dist/{chunk-V4JGVBUN.js → chunk-R2NGSPQS.js} +32 -1
  35. package/dist/chunk-R2NGSPQS.js.map +1 -0
  36. package/dist/{chunk-ZUVEBW5T.js → chunk-R7PSPKBD.js} +2 -2
  37. package/dist/{chunk-4UTWOSHP.js → chunk-UI3YDJTC.js} +43 -5
  38. package/dist/chunk-UI3YDJTC.js.map +1 -0
  39. package/dist/{chunk-RO6KQD3J.js → chunk-UWBX3DZK.js} +2 -2
  40. package/dist/{chunk-CVSCZ3CK.js → chunk-W3Q7B3DV.js} +7 -2
  41. package/dist/chunk-W3Q7B3DV.js.map +1 -0
  42. package/dist/{chunk-CA25GD5Q.js → chunk-XLBJHHDX.js} +38 -6
  43. package/dist/chunk-XLBJHHDX.js.map +1 -0
  44. package/dist/{chunk-FQQDBBNI.js → chunk-XZPAU7FC.js} +3 -3
  45. package/dist/context-mention-palette/index.js +8 -8
  46. package/dist/i18n/index.d.ts +37 -5
  47. package/dist/i18n/index.js +2 -2
  48. package/dist/index.d.ts +25 -6
  49. package/dist/index.js +1093 -425
  50. package/dist/index.js.map +1 -1
  51. package/dist/queued-prompt-runtime.d.ts +2 -2
  52. package/dist/{types-DSc2ta3s.d.ts → types-BAPEle8b.d.ts} +3 -3
  53. package/dist/workbench/contribution.d.ts +10 -3
  54. package/dist/workbench/contribution.js +10 -8
  55. package/dist/workbench/index.d.ts +4 -2
  56. package/dist/workbench/index.js +11 -11
  57. package/dist/workbench/launch.d.ts +3 -1
  58. package/dist/workbench/launch.js +3 -3
  59. package/dist/workbench/providerCatalog.d.ts +2 -2
  60. package/dist/workbench/providerCatalog.js +1 -1
  61. package/dist/workbench/sessionTitle.d.ts +1 -1
  62. package/dist/workbench/sessionTitle.js +3 -3
  63. package/dist/workbench/state.d.ts +1 -1
  64. package/dist/workbench/state.js +3 -3
  65. package/dist/workbench/types.d.ts +3 -2
  66. package/dist/workbench/types.js +1 -1
  67. package/dist/workspace-agent-generated-files.js +3 -3
  68. package/package.json +12 -12
  69. package/dist/chunk-22L4VWUR.js.map +0 -1
  70. package/dist/chunk-3KS22CG2.js.map +0 -1
  71. package/dist/chunk-4UTWOSHP.js.map +0 -1
  72. package/dist/chunk-5WB3NGIN.js.map +0 -1
  73. package/dist/chunk-6MUKWI6Z.js.map +0 -1
  74. package/dist/chunk-CA25GD5Q.js.map +0 -1
  75. package/dist/chunk-CVSCZ3CK.js.map +0 -1
  76. package/dist/chunk-FRCIPTUD.js.map +0 -1
  77. package/dist/chunk-IIVHPXAB.js.map +0 -1
  78. package/dist/chunk-K4UUEG7X.js.map +0 -1
  79. package/dist/chunk-NZN43XT5.js.map +0 -1
  80. package/dist/chunk-QC642RAG.js.map +0 -1
  81. package/dist/chunk-V4JGVBUN.js.map +0 -1
  82. /package/dist/{chunk-G6UO6JVM.js.map → chunk-EIPQGFAE.js.map} +0 -0
  83. /package/dist/{chunk-SGXYVGQT.js.map → chunk-HKKC2U6J.js.map} +0 -0
  84. /package/dist/{chunk-SW6JCJCO.js.map → chunk-IDTB6OID.js.map} +0 -0
  85. /package/dist/{chunk-7P6CUYQT.js.map → chunk-QULZNKPA.js.map} +0 -0
  86. /package/dist/{chunk-ZUVEBW5T.js.map → chunk-R7PSPKBD.js.map} +0 -0
  87. /package/dist/{chunk-RO6KQD3J.js.map → chunk-UWBX3DZK.js.map} +0 -0
  88. /package/dist/{chunk-FQQDBBNI.js.map → chunk-XZPAU7FC.js.map} +0 -0
@@ -2,6 +2,7 @@
2
2
  var agentGuiWorkbenchProviders = [
3
3
  "claude-code",
4
4
  "codex",
5
+ "cursor",
5
6
  "nexight",
6
7
  "hermes",
7
8
  "gemini",
@@ -30,6 +31,7 @@ var comingSoonProviderSet = new Set(
30
31
  var agentGuiWorkbenchProviderLabels = {
31
32
  "claude-code": "Claude Code",
32
33
  codex: "Codex",
34
+ cursor: "Cursor",
33
35
  gemini: "Gemini CLI",
34
36
  hermes: "Hermes Agent",
35
37
  nexight: "Nexight",
@@ -67,4 +69,4 @@ export {
67
69
  isAgentGuiWorkbenchProvider,
68
70
  normalizeAgentGuiWorkbenchProvider
69
71
  };
70
- //# sourceMappingURL=chunk-22L4VWUR.js.map
72
+ //# sourceMappingURL=chunk-CKCUEHBW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/providerCatalog.ts"],"sourcesContent":["import type { AgentGuiWorkbenchProvider } from \"./types.ts\";\n\nexport const agentGuiWorkbenchProviders = [\n \"claude-code\",\n \"codex\",\n \"cursor\",\n \"nexight\",\n \"hermes\",\n \"gemini\",\n \"openclaw\"\n] as const satisfies readonly AgentGuiWorkbenchProvider[];\n\nexport const agentGuiWorkbenchDefaultDockProviders = [\n \"codex\",\n \"claude-code\"\n] as const satisfies readonly AgentGuiWorkbenchProvider[];\n\nexport const agentGuiWorkbenchDockSuppressedProviders = [\n \"hermes\",\n \"gemini\"\n] as const satisfies readonly AgentGuiWorkbenchProvider[];\n\nexport const agentGuiWorkbenchComingSoonProviders = [\n \"nexight\"\n] as const satisfies readonly AgentGuiWorkbenchProvider[];\n\nconst defaultDockProviderSet = new Set<AgentGuiWorkbenchProvider>(\n agentGuiWorkbenchDefaultDockProviders\n);\nconst dockSuppressedProviderSet = new Set<AgentGuiWorkbenchProvider>(\n agentGuiWorkbenchDockSuppressedProviders\n);\nconst comingSoonProviderSet = new Set<AgentGuiWorkbenchProvider>(\n agentGuiWorkbenchComingSoonProviders\n);\n\n// i18n-check-ignore: provider brand names.\nexport const agentGuiWorkbenchProviderLabels: Record<\n AgentGuiWorkbenchProvider,\n string\n> = {\n \"claude-code\": \"Claude Code\",\n codex: \"Codex\",\n cursor: \"Cursor\",\n gemini: \"Gemini CLI\",\n hermes: \"Hermes Agent\",\n nexight: \"Nexight\",\n openclaw: \"OpenClaw\"\n};\n\nexport function resolveAgentGuiWorkbenchProviderLabel(\n provider: AgentGuiWorkbenchProvider\n): string {\n return agentGuiWorkbenchProviderLabels[provider];\n}\n\nexport function isAgentGuiWorkbenchDefaultDockProvider(\n provider: AgentGuiWorkbenchProvider\n): boolean {\n return defaultDockProviderSet.has(provider);\n}\n\nexport function isAgentGuiWorkbenchDockSuppressedProvider(\n provider: AgentGuiWorkbenchProvider\n): boolean {\n return dockSuppressedProviderSet.has(provider);\n}\n\nexport function isAgentGuiWorkbenchComingSoonProvider(\n provider: AgentGuiWorkbenchProvider\n): boolean {\n return comingSoonProviderSet.has(provider);\n}\n\nexport function isAgentGuiWorkbenchProvider(\n value: unknown\n): value is AgentGuiWorkbenchProvider {\n return (\n typeof value === \"string\" &&\n agentGuiWorkbenchProviders.includes(value as AgentGuiWorkbenchProvider)\n );\n}\n\nexport function normalizeAgentGuiWorkbenchProvider(\n value: unknown,\n fallbackProvider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchProvider {\n return isAgentGuiWorkbenchProvider(value) ? value : fallbackProvider;\n}\n"],"mappings":";AAEO,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,wCAAwC;AAAA,EACnD;AAAA,EACA;AACF;AAEO,IAAM,2CAA2C;AAAA,EACtD;AAAA,EACA;AACF;AAEO,IAAM,uCAAuC;AAAA,EAClD;AACF;AAEA,IAAM,yBAAyB,IAAI;AAAA,EACjC;AACF;AACA,IAAM,4BAA4B,IAAI;AAAA,EACpC;AACF;AACA,IAAM,wBAAwB,IAAI;AAAA,EAChC;AACF;AAGO,IAAM,kCAGT;AAAA,EACF,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AACZ;AAEO,SAAS,sCACd,UACQ;AACR,SAAO,gCAAgC,QAAQ;AACjD;AAEO,SAAS,uCACd,UACS;AACT,SAAO,uBAAuB,IAAI,QAAQ;AAC5C;AAEO,SAAS,0CACd,UACS;AACT,SAAO,0BAA0B,IAAI,QAAQ;AAC/C;AAEO,SAAS,sCACd,UACS;AACT,SAAO,sBAAsB,IAAI,QAAQ;AAC3C;AAEO,SAAS,4BACd,OACoC;AACpC,SACE,OAAO,UAAU,YACjB,2BAA2B,SAAS,KAAkC;AAE1E;AAEO,SAAS,mCACd,OACA,mBAA8C,SACnB;AAC3B,SAAO,4BAA4B,KAAK,IAAI,QAAQ;AACtD;","names":[]}
@@ -2,10 +2,10 @@ import {
2
2
  agentGuiWorkbenchProviders,
3
3
  isAgentGuiWorkbenchProvider,
4
4
  normalizeAgentGuiWorkbenchProvider
5
- } from "./chunk-22L4VWUR.js";
5
+ } from "./chunk-CKCUEHBW.js";
6
6
  import {
7
7
  agentGUIProviderTargetRefsEqual
8
- } from "./chunk-4UTWOSHP.js";
8
+ } from "./chunk-UI3YDJTC.js";
9
9
 
10
10
  // workbench/state.ts
11
11
  function createDefaultAgentGuiWorkbenchNodeState(provider = "codex") {
@@ -35,7 +35,8 @@ function normalizeAgentGuiWorkbenchState(state) {
35
35
  conversationRailWidthPx: normalizeOptionalPositiveNumber(
36
36
  state.conversationRailWidthPx
37
37
  ),
38
- lastActiveAgentSessionId: typeof state.lastActiveAgentSessionId === "string" ? state.lastActiveAgentSessionId : null
38
+ lastActiveAgentSessionId: typeof state.lastActiveAgentSessionId === "string" ? state.lastActiveAgentSessionId : null,
39
+ ...typeof state.lastActiveConversationTitle === "string" ? { lastActiveConversationTitle: state.lastActiveConversationTitle } : {}
39
40
  };
40
41
  }
41
42
  function projectAgentGuiWorkbenchState(state) {
@@ -46,11 +47,12 @@ function projectAgentGuiWorkbenchState(state) {
46
47
  conversationRailWidthPx: normalizeOptionalPositiveNumber(
47
48
  state.conversationRailWidthPx
48
49
  ),
49
- lastActiveAgentSessionId: state.lastActiveAgentSessionId ?? null
50
+ lastActiveAgentSessionId: state.lastActiveAgentSessionId ?? null,
51
+ ...typeof state.lastActiveConversationTitle === "string" ? { lastActiveConversationTitle: state.lastActiveConversationTitle } : {}
50
52
  };
51
53
  }
52
54
  function areAgentGuiWorkbenchStatesEqual(left, right) {
53
- return (left.agentTargetId ?? null) === (right.agentTargetId ?? null) && left.conversationRailCollapsed === right.conversationRailCollapsed && left.conversationRailWidthPx === right.conversationRailWidthPx && left.lastActiveAgentSessionId === right.lastActiveAgentSessionId;
55
+ return (left.agentTargetId ?? null) === (right.agentTargetId ?? null) && left.conversationRailCollapsed === right.conversationRailCollapsed && left.conversationRailWidthPx === right.conversationRailWidthPx && left.lastActiveAgentSessionId === right.lastActiveAgentSessionId && (left.lastActiveConversationTitle ?? null) === (right.lastActiveConversationTitle ?? null);
54
56
  }
55
57
  function normalizeAgentGuiWorkbenchNodeState(state, fallbackProvider = "codex") {
56
58
  const provider = normalizeAgentGuiWorkbenchProvider(
@@ -318,4 +320,4 @@ export {
318
320
  agentGuiWorkbenchProviderFromInstanceId,
319
321
  createAgentGuiWorkbenchNodeStateSource
320
322
  };
321
- //# sourceMappingURL=chunk-NZN43XT5.js.map
323
+ //# sourceMappingURL=chunk-DL6BMEHI.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 { agentGUIProviderTargetRefsEqual } from \"../providerTargets.ts\";\nimport type {\n AgentGuiWorkbenchComposerOverrides,\n AgentGuiWorkbenchComposerOverridesByAgentTargetId,\n AgentGuiWorkbenchComposerOverridesByProvider,\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState,\n AgentGuiWorkbenchWorkspaceState\n} from \"./types.ts\";\nimport type { AgentGUIProviderTargetRef } from \"../types.ts\";\n\ntype AgentGuiWorkbenchStateLookupRequest = Pick<\n WorkbenchHostExternalStateLookupInput,\n \"instanceId\" | \"typeId\"\n> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>;\n\nexport function createDefaultAgentGuiWorkbenchNodeState(\n provider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n return {\n agentTargetId: null,\n composerOverrides: null,\n composerOverridesByAgentTargetId: null,\n composerOverridesByProvider: null,\n conversationCount: null,\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null,\n lastActiveConversationTitle: null,\n provider,\n providerTargetId: null,\n providerTargetRef: null\n };\n}\n\nexport function normalizeAgentGuiWorkbenchState(\n state: unknown\n): AgentGuiWorkbenchState {\n if (!isRecord(state)) {\n return createDefaultAgentGuiWorkbenchState();\n }\n const agentTargetId =\n normalizeOptionalNonEmptyString(state.agentTargetId) ??\n normalizeOptionalNonEmptyString(state.providerTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null,\n ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\n };\n}\n\nexport function projectAgentGuiWorkbenchState(\n state: AgentGuiWorkbenchNodeState\n): AgentGuiWorkbenchState {\n const agentTargetId =\n normalizeOptionalNonEmptyString(state.agentTargetId) ??\n normalizeOptionalNonEmptyString(state.providerTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId: state.lastActiveAgentSessionId ?? null,\n ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\n };\n}\n\nexport function areAgentGuiWorkbenchStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n (left.lastActiveConversationTitle ?? null) ===\n (right.lastActiveConversationTitle ?? null)\n );\n}\n\nexport function normalizeAgentGuiWorkbenchNodeState(\n state: Partial<AgentGuiWorkbenchNodeState> | null | undefined,\n fallbackProvider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n const provider = normalizeAgentGuiWorkbenchProvider(\n state?.provider,\n fallbackProvider\n );\n return {\n ...createDefaultAgentGuiWorkbenchNodeState(provider),\n agentTargetId:\n normalizeOptionalNonEmptyString(state?.agentTargetId) ??\n normalizeOptionalNonEmptyString(state?.providerTargetId),\n composerOverrides: normalizeAgentGuiWorkbenchComposerOverrides(\n state?.composerOverrides\n ),\n composerOverridesByAgentTargetId:\n normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n state?.composerOverridesByAgentTargetId\n ),\n composerOverridesByProvider:\n normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n state?.composerOverridesByProvider\n ),\n conversationCount: normalizeOptionalNonNegativeNumber(\n state?.conversationCount\n ),\n conversationRailCollapsed: state?.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state?.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state?.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null,\n lastActiveConversationTitle:\n typeof state?.lastActiveConversationTitle === \"string\"\n ? state.lastActiveConversationTitle\n : null,\n provider,\n providerTargetId: normalizeOptionalNonEmptyString(state?.providerTargetId),\n providerTargetRef: normalizeAgentGuiProviderTargetRef(\n state?.providerTargetRef,\n provider\n )\n };\n}\n\nexport function areAgentGuiWorkbenchNodeStatesEqual(\n left: AgentGuiWorkbenchNodeState,\n right: AgentGuiWorkbenchNodeState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n composerOverridesEqual(left.composerOverrides, right.composerOverrides) &&\n composerOverridesByAgentTargetIdEqual(\n left.composerOverridesByAgentTargetId,\n right.composerOverridesByAgentTargetId\n ) &&\n composerOverridesByProviderEqual(\n left.composerOverridesByProvider,\n right.composerOverridesByProvider\n ) &&\n left.conversationCount === right.conversationCount &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n left.lastActiveConversationTitle === right.lastActiveConversationTitle &&\n left.provider === right.provider &&\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n (left.providerTargetId ?? null) === (right.providerTargetId ?? null) &&\n agentGUIProviderTargetRefsEqual(\n left.providerTargetRef,\n right.providerTargetRef\n )\n );\n}\n\nexport function agentGuiWorkbenchProviderFromInstanceId(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return \"codex\";\n }\n const [, provider] = normalized.split(\":\", 3);\n return normalizeAgentGuiWorkbenchProvider(provider);\n}\n\nexport function createAgentGuiWorkbenchNodeStateSource(input: {\n typeId?: string;\n workspaceId: string;\n}): {\n externalStateSource: WorkbenchHostExternalStateSource<\n AgentGuiWorkbenchState | null,\n AgentGuiWorkbenchWorkspaceState\n >;\n readNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest\n ) => AgentGuiWorkbenchState | null;\n writeNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest & {\n state: AgentGuiWorkbenchState;\n }\n ) => void;\n /**\n * Returns the launch instanceId of an open node currently showing the given\n * agent session, or null when none is found. Used to focus an existing\n * conversation instead of launching a duplicate node.\n */\n findInstanceIdByAgentSessionId: (agentSessionId: string) => string | null;\n} {\n const typeId = input.typeId ?? \"agent-gui\";\n const nodeStateByKey = new Map<string, AgentGuiWorkbenchState>();\n // Tracks the launch instanceId behind each state key so a node can be located\n // by the session it is currently showing, even when its key is node-scoped.\n const instanceIdByKey = new Map<string, string>();\n const listeners = new Set<() => void>();\n\n const lookupState = (request: AgentGuiWorkbenchStateLookupRequest) => {\n const nodeState = request.nodeId\n ? nodeStateByKey.get(agentGuiWorkbenchNodeStateKey(request))\n : null;\n const state =\n nodeState ??\n nodeStateByKey.get(agentGuiWorkbenchInstanceStateKey(request));\n return state ? { ...state } : null;\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n externalStateSource: {\n getNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getSnapshotNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getWorkspaceState() {\n return {\n workspaceId: input.workspaceId\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n },\n readNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n findInstanceIdByAgentSessionId(agentSessionId) {\n const target = agentSessionId.trim();\n if (!target) {\n return null;\n }\n for (const [key, state] of nodeStateByKey) {\n if (state.lastActiveAgentSessionId?.trim() === target) {\n return instanceIdByKey.get(key) ?? null;\n }\n }\n return null;\n },\n writeNodeState(request) {\n if (request.typeId !== typeId) {\n return;\n }\n const key = agentGuiWorkbenchNodeStateKey(request);\n instanceIdByKey.set(key, request.instanceId);\n const previous = nodeStateByKey.get(key);\n let clearedInstanceSeed = false;\n if (request.nodeId) {\n const instanceKey = agentGuiWorkbenchInstanceStateKey(request);\n instanceIdByKey.delete(instanceKey);\n clearedInstanceSeed = nodeStateByKey.delete(instanceKey);\n }\n const next = {\n ...normalizeAgentGuiWorkbenchState(request.state)\n };\n nodeStateByKey.set(key, next);\n if (\n !clearedInstanceSeed &&\n previous &&\n areAgentGuiWorkbenchMemoryStatesEqual(previous, next)\n ) {\n return;\n }\n notify();\n }\n };\n}\n\nfunction areAgentGuiWorkbenchMemoryStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return areAgentGuiWorkbenchStatesEqual(left, right);\n}\n\nfunction agentGuiWorkbenchNodeStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\"> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>\n): string {\n return request.nodeId\n ? `node:${request.nodeId}`\n : agentGuiWorkbenchInstanceStateKey(request);\n}\n\nfunction agentGuiWorkbenchInstanceStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\">\n): string {\n return `instance:${request.instanceId}`;\n}\n\nfunction createDefaultAgentGuiWorkbenchState(): AgentGuiWorkbenchState {\n return {\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null\n };\n}\n\nfunction normalizeOptionalNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction normalizeAgentGuiProviderTargetRef(\n value: unknown,\n expectedProvider?: AgentGuiWorkbenchProvider\n): AgentGUIProviderTargetRef | null {\n if (!isRecord(value)) {\n return null;\n }\n const kind = normalizeOptionalNonEmptyString(value.kind);\n const provider = value.provider;\n if (!kind || !isAgentGuiWorkbenchProvider(provider)) {\n return null;\n }\n if (expectedProvider && provider !== expectedProvider) {\n return null;\n }\n return {\n ...value,\n kind,\n provider\n };\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverrides(\n value: unknown\n): AgentGuiWorkbenchComposerOverrides | null {\n if (!isRecord(value)) {\n return null;\n }\n const composerOverrides: AgentGuiWorkbenchComposerOverrides = {};\n if (typeof value.model === \"string\" && value.model.trim()) {\n composerOverrides.model = value.model.trim();\n }\n if (\n typeof value.reasoningEffort === \"string\" &&\n value.reasoningEffort.trim()\n ) {\n composerOverrides.reasoningEffort = value.reasoningEffort.trim();\n }\n if (\n typeof value.permissionModeId === \"string\" &&\n value.permissionModeId.trim()\n ) {\n composerOverrides.permissionModeId = value.permissionModeId.trim();\n }\n if (typeof value.planMode === \"boolean\") {\n composerOverrides.planMode = value.planMode;\n }\n return Object.keys(composerOverrides).length > 0 ? composerOverrides : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByProvider | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByProvider = {};\n for (const provider of agentGuiWorkbenchProviders) {\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(\n value[provider]\n );\n if (overrides) {\n result[provider] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByAgentTargetId | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByAgentTargetId = {};\n for (const [rawAgentTargetId, rawOverrides] of Object.entries(value)) {\n const agentTargetId = normalizeOptionalNonEmptyString(rawAgentTargetId);\n if (!agentTargetId) {\n continue;\n }\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(rawOverrides);\n if (overrides) {\n result[agentTargetId] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeOptionalPositiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.round(value)\n : null;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.round(value)\n : null;\n}\n\nfunction composerOverridesEqual(\n left: AgentGuiWorkbenchComposerOverrides | null | undefined,\n right: AgentGuiWorkbenchComposerOverrides | null | undefined\n): boolean {\n return (\n (left?.model ?? null) === (right?.model ?? null) &&\n (left?.permissionModeId ?? null) === (right?.permissionModeId ?? null) &&\n (left?.planMode ?? null) === (right?.planMode ?? null) &&\n (left?.reasoningEffort ?? null) === (right?.reasoningEffort ?? null)\n );\n}\n\nfunction composerOverridesByProviderEqual(\n left: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined\n): boolean {\n for (const provider of agentGuiWorkbenchProviders) {\n if (!composerOverridesEqual(left?.[provider], right?.[provider])) {\n return false;\n }\n }\n return true;\n}\n\nfunction composerOverridesByAgentTargetIdEqual(\n left: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined\n): boolean {\n const leftKeys = Object.keys(left ?? {}).sort();\n const rightKeys = Object.keys(right ?? {}).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n return leftKeys.every(\n (key, index) =>\n key === rightKeys[index] &&\n composerOverridesEqual(left?.[key], right?.[key])\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  formatAgentSessionMentionText,
5
5
  normalizeAgentGUIProviderIdentity,
6
6
  resolveAgentGUIExplicitConversationTitle
7
- } from "./chunk-CVSCZ3CK.js";
7
+ } from "./chunk-W3Q7B3DV.js";
8
8
 
9
9
  // workbench/sessionTitle.ts
10
10
  function formatAgentGuiSessionPlainTitle(title, options = {}) {
@@ -96,4 +96,4 @@ export {
96
96
  formatAgentGuiConversationPlainTitle,
97
97
  resolveAgentGuiWorkbenchSessionTitle
98
98
  };
99
- //# sourceMappingURL=chunk-G6UO6JVM.js.map
99
+ //# sourceMappingURL=chunk-EIPQGFAE.js.map
@@ -2,10 +2,10 @@ import {
2
2
  Spinner,
3
3
  userAvatarPlaceholderUrl,
4
4
  workspaceAgentActivityStatusLabel
5
- } from "./chunk-ZUVEBW5T.js";
5
+ } from "./chunk-R7PSPKBD.js";
6
6
  import {
7
7
  normalizeAgentSessionMentionTitle
8
- } from "./chunk-FQQDBBNI.js";
8
+ } from "./chunk-XZPAU7FC.js";
9
9
  import {
10
10
  resolveAgentMentionFileThumbnailUrl,
11
11
  resolveAgentMentionFileVisualKind
@@ -13,10 +13,10 @@ import {
13
13
  import {
14
14
  getOptionalAgentHostApi,
15
15
  managedAgentRoundedIconUrl
16
- } from "./chunk-FRCIPTUD.js";
16
+ } from "./chunk-N4I3TD4G.js";
17
17
  import {
18
18
  translate
19
- } from "./chunk-RO6KQD3J.js";
19
+ } from "./chunk-UWBX3DZK.js";
20
20
  import {
21
21
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
22
22
  } from "./chunk-JM24HADP.js";
@@ -2211,4 +2211,4 @@ export {
2211
2211
  AgentFileMentionPalette,
2212
2212
  AgentContextMentionPalette
2213
2213
  };
2214
- //# sourceMappingURL=chunk-SGXYVGQT.js.map
2214
+ //# sourceMappingURL=chunk-HKKC2U6J.js.map
@@ -3,11 +3,11 @@ import {
3
3
  getOptionalAgentHostApi,
4
4
  managedAgentRoundedIconUrl,
5
5
  useOptionalAgentHostApi
6
- } from "./chunk-FRCIPTUD.js";
6
+ } from "./chunk-N4I3TD4G.js";
7
7
  import {
8
8
  translate,
9
9
  useTranslation
10
- } from "./chunk-RO6KQD3J.js";
10
+ } from "./chunk-UWBX3DZK.js";
11
11
  import {
12
12
  resolveAgentWorkspaceFileVisualKind
13
13
  } from "./chunk-PJP5BUU6.js";
@@ -3659,4 +3659,4 @@ export {
3659
3659
  CustomScrollArea,
3660
3660
  MessageSquareMoreIcon
3661
3661
  };
3662
- //# sourceMappingURL=chunk-SW6JCJCO.js.map
3662
+ //# sourceMappingURL=chunk-IDTB6OID.js.map
@@ -1,11 +1,34 @@
1
1
  import {
2
2
  codexRoundedUrl,
3
+ cursorColorfulUrl,
4
+ cursorRoundedUrl,
3
5
  geminiRoundedUrl,
4
6
  hermesRoundedUrl,
5
7
  manageAgentClaudeCodeUrl,
6
8
  manageAgentTuttiUrl,
9
+ normalizeManagedAgentProvider,
7
10
  openclawRoundedUrl
8
- } from "./chunk-V4JGVBUN.js";
11
+ } from "./chunk-R2NGSPQS.js";
12
+
13
+ // app/renderer/assets/icons/agents/claudecode-flat-filled.svg
14
+ var claudecode_flat_filled_default = "./claudecode-flat-filled-NHO4JCVK.svg";
15
+
16
+ // app/renderer/assets/icons/agents/codex-flat-filled.svg
17
+ var codex_flat_filled_default = "./codex-flat-filled-WYHCF5VR.svg";
18
+
19
+ // agentGuiSessionProviderIconUrls.ts
20
+ function resolveAgentGuiSessionProviderIconUrl(provider) {
21
+ switch (normalizeManagedAgentProvider(provider)) {
22
+ case "claude-code":
23
+ return claudecode_flat_filled_default;
24
+ case "codex":
25
+ return codex_flat_filled_default;
26
+ case "cursor":
27
+ return cursorColorfulUrl;
28
+ default:
29
+ return null;
30
+ }
31
+ }
9
32
 
10
33
  // agent-gui/agentGuiNode/model/agentGuiRailLayout.ts
11
34
  function clamp(value, min, max) {
@@ -92,6 +115,7 @@ var agentGuiDockIconUrl = codexRoundedUrl;
92
115
  var agentGuiDockIconUrls = {
93
116
  "claude-code": manageAgentClaudeCodeUrl,
94
117
  codex: codexRoundedUrl,
118
+ cursor: cursorRoundedUrl,
95
119
  gemini: geminiRoundedUrl,
96
120
  hermes: hermesRoundedUrl,
97
121
  nexight: manageAgentTuttiUrl,
@@ -99,6 +123,7 @@ var agentGuiDockIconUrls = {
99
123
  };
100
124
 
101
125
  export {
126
+ resolveAgentGuiSessionProviderIconUrl,
102
127
  AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
103
128
  AGENT_GUI_DETAIL_MIN_WIDTH_PX,
104
129
  AGENT_GUI_COLLAPSED_MIN_WIDTH_PX,
@@ -110,4 +135,4 @@ export {
110
135
  agentGuiDockIconUrl,
111
136
  agentGuiDockIconUrls
112
137
  };
113
- //# sourceMappingURL=chunk-5WB3NGIN.js.map
138
+ //# sourceMappingURL=chunk-LJE2W4EM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../agentGuiSessionProviderIconUrls.ts","../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts","../dockIcons.ts"],"sourcesContent":["import claudeCodeFlatFilledIconUrl from \"./app/renderer/assets/icons/agents/claudecode-flat-filled.svg\";\nimport codexFlatFilledIconUrl from \"./app/renderer/assets/icons/agents/codex-flat-filled.svg\";\nimport cursorFlatFilledIconUrl from \"./app/renderer/assets/icons/agents/cursor-flat-filled.svg\";\nimport { cursorColorfulUrl } from \"./managedAgentIconAssets\";\nimport { normalizeManagedAgentProvider } from \"./shared/managedAgentProviders\";\n\nexport {\n claudeCodeFlatFilledIconUrl,\n codexFlatFilledIconUrl,\n cursorColorfulUrl,\n cursorFlatFilledIconUrl\n};\n\nexport function resolveAgentGuiSessionProviderIconUrl(\n provider: string | undefined\n): string | null {\n switch (normalizeManagedAgentProvider(provider)) {\n case \"claude-code\":\n return claudeCodeFlatFilledIconUrl;\n case \"codex\":\n return codexFlatFilledIconUrl;\n case \"cursor\":\n return cursorColorfulUrl;\n default:\n return null;\n }\n}\n","function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n// Keep aligned with the issue manager task-list rail dimensions.\nexport const AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX = 280;\nexport const AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX = 248;\nexport const AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX = 520;\nexport const AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;\nexport const AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX = 10;\nexport const AGENT_GUI_COLLAPSED_MIN_WIDTH_PX = 460;\nexport const AGENT_GUI_EXPANDED_MIN_WIDTH_PX =\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\nexport const AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX = 610;\nexport const AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;\n\nexport interface AgentGUIExpandedWindowFrameInput {\n position: { x: number; y: number };\n width: number;\n height: number;\n desktopSize: { width: number; height: number };\n conversationRailWidthPx: number | null | undefined;\n}\n\nexport function shouldAutoCollapseAgentGUIConversationRail(\n containerWidthPx: number\n): boolean {\n return (\n Number.isFinite(containerWidthPx) &&\n containerWidthPx > 0 &&\n containerWidthPx <= AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX\n );\n}\n\nexport function resolveAgentGUIConversationRailMaxWidthPx(\n containerWidthPx: number\n): number {\n const safeContainerWidth =\n Number.isFinite(containerWidthPx) && containerWidthPx > 0\n ? containerWidthPx\n : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\n\n return Math.max(\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n Math.min(\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX,\n safeContainerWidth -\n AGENT_GUI_DETAIL_MIN_WIDTH_PX -\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n )\n );\n}\n\nexport function clampAgentGUIConversationRailWidthPx(\n widthPx: number | null | undefined,\n containerWidthPx: number\n): number {\n const preferredWidthPx =\n typeof widthPx === \"number\" && Number.isFinite(widthPx)\n ? Math.round(widthPx)\n : null;\n\n return clamp(\n preferredWidthPx ?? AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX,\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)\n );\n}\n\nexport function resolveNextAgentGUIConversationRailWidthPx(input: {\n currentWidthPx: number | null | undefined;\n requestedWidthPx: number;\n containerWidthPx: number;\n}): number | null {\n const nextWidthPx = clampAgentGUIConversationRailWidthPx(\n input.requestedWidthPx,\n input.containerWidthPx\n );\n if (input.currentWidthPx === nextWidthPx) {\n return input.currentWidthPx;\n }\n\n if (input.currentWidthPx === null || input.currentWidthPx === undefined) {\n const defaultWidthPx = clampAgentGUIConversationRailWidthPx(\n null,\n input.containerWidthPx\n );\n if (nextWidthPx === defaultWidthPx) {\n return null;\n }\n }\n\n return nextWidthPx;\n}\n\nexport function resolveAgentGUIExpandedWindowFrame(\n input: AgentGUIExpandedWindowFrameInput\n): {\n position: { x: number; y: number };\n size: { width: number; height: number };\n} {\n const desiredRailWidthPx = clampAgentGUIConversationRailWidthPx(\n input.conversationRailWidthPx,\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n );\n const desiredWidthPx = Math.max(\n Math.round(input.width),\n desiredRailWidthPx +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX,\n AGENT_GUI_EXPANDED_MIN_WIDTH_PX,\n AGENT_GUI_EXPANDED_TARGET_WIDTH_PX\n );\n const desktopWidthPx =\n Number.isFinite(input.desktopSize.width) && input.desktopSize.width > 0\n ? Math.round(input.desktopSize.width)\n : desiredWidthPx;\n const nextWidthPx = Math.min(desiredWidthPx, desktopWidthPx);\n const maxX = Math.max(0, desktopWidthPx - nextWidthPx);\n const nextX = clamp(Math.round(input.position.x), 0, maxX);\n\n return {\n position: {\n x: nextX,\n y: input.position.y\n },\n size: {\n width: nextWidthPx,\n height: input.height\n }\n };\n}\n","import {\n codexRoundedUrl,\n cursorRoundedUrl,\n geminiRoundedUrl,\n hermesRoundedUrl,\n manageAgentClaudeCodeUrl,\n manageAgentTuttiUrl,\n openclawRoundedUrl\n} from \"./managedAgentIconAssets.ts\";\n\nexport const agentGuiDockIconUrl = codexRoundedUrl;\n\nexport const agentGuiDockIconUrls = {\n \"claude-code\": manageAgentClaudeCodeUrl,\n codex: codexRoundedUrl,\n cursor: cursorRoundedUrl,\n gemini: geminiRoundedUrl,\n hermes: hermesRoundedUrl,\n nexight: manageAgentTuttiUrl,\n openclaw: openclawRoundedUrl\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAaO,SAAS,sCACd,UACe;AACf,UAAQ,8BAA8B,QAAQ,GAAG;AAAA,IAC/C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AC1BA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAGO,IAAM,+CAA+C;AACrD,IAAM,2CAA2C;AACjD,IAAM,2CAA2C;AACjD,IAAM,gCAAgC;AACtC,IAAM,wCAAwC;AAC9C,IAAM,mCAAmC;AACzC,IAAM,kCACX,2CACA,gCACA;AACK,IAAM,mCAAmC;AACzC,IAAM,qCAAqC;AAU3C,SAAS,2CACd,kBACS;AACT,SACE,OAAO,SAAS,gBAAgB,KAChC,mBAAmB,KACnB,oBAAoB;AAExB;AAEO,SAAS,0CACd,kBACQ;AACR,QAAM,qBACJ,OAAO,SAAS,gBAAgB,KAAK,mBAAmB,IACpD,mBACA,+CACA,gCACA;AAEN,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA,qBACE,gCACA;AAAA,IACJ;AAAA,EACF;AACF;AAEO,SAAS,qCACd,SACA,kBACQ;AACR,QAAM,mBACJ,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,IAClD,KAAK,MAAM,OAAO,IAClB;AAEN,SAAO;AAAA,IACL,oBAAoB;AAAA,IACpB;AAAA,IACA,0CAA0C,gBAAgB;AAAA,EAC5D;AACF;AAEO,SAAS,2CAA2C,OAIzC;AAChB,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,MAAI,MAAM,mBAAmB,aAAa;AACxC,WAAO,MAAM;AAAA,EACf;AAEA,MAAI,MAAM,mBAAmB,QAAQ,MAAM,mBAAmB,QAAW;AACvE,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,MAAM;AAAA,IACR;AACA,QAAI,gBAAgB,gBAAgB;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mCACd,OAIA;AACA,QAAM,qBAAqB;AAAA,IACzB,MAAM;AAAA,IACN,2CACE,gCACA;AAAA,EACJ;AACA,QAAM,iBAAiB,KAAK;AAAA,IAC1B,KAAK,MAAM,MAAM,KAAK;AAAA,IACtB,qBACE,gCACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,QAAM,iBACJ,OAAO,SAAS,MAAM,YAAY,KAAK,KAAK,MAAM,YAAY,QAAQ,IAClE,KAAK,MAAM,MAAM,YAAY,KAAK,IAClC;AACN,QAAM,cAAc,KAAK,IAAI,gBAAgB,cAAc;AAC3D,QAAM,OAAO,KAAK,IAAI,GAAG,iBAAiB,WAAW;AACrD,QAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,SAAS,CAAC,GAAG,GAAG,IAAI;AAEzD,SAAO;AAAA,IACL,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG,MAAM,SAAS;AAAA,IACpB;AAAA,IACA,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AACF;;;AC/HO,IAAM,sBAAsB;AAE5B,IAAM,uBAAuB;AAAA,EAClC,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AACZ;","names":[]}
@@ -3,28 +3,29 @@ import {
3
3
  createAgentGuiWorkbenchNodeStateSource,
4
4
  normalizeAgentGuiWorkbenchNodeState,
5
5
  normalizeAgentGuiWorkbenchState
6
- } from "./chunk-NZN43XT5.js";
6
+ } from "./chunk-DL6BMEHI.js";
7
7
  import {
8
8
  agentGuiWorkbenchDockIdentityFromIdentifier,
9
9
  agentGuiWorkbenchProviderFromIdentifier,
10
10
  agentGuiWorkbenchTypeId,
11
11
  agentGuiWorkbenchUnifiedDockEntryId,
12
12
  createAgentGuiWorkbenchLaunchDescriptor
13
- } from "./chunk-3KS22CG2.js";
13
+ } from "./chunk-P5C3ED3V.js";
14
14
  import {
15
15
  agentGuiWorkbenchDefaultDockProviders,
16
16
  isAgentGuiWorkbenchProvider,
17
17
  resolveAgentGuiWorkbenchProviderLabel
18
- } from "./chunk-22L4VWUR.js";
18
+ } from "./chunk-CKCUEHBW.js";
19
19
  import {
20
20
  agentGuiDockIconUrls,
21
21
  clampAgentGUIConversationRailWidthPx,
22
22
  resolveAgentGUIExpandedWindowFrame,
23
+ resolveAgentGuiSessionProviderIconUrl,
23
24
  shouldAutoCollapseAgentGUIConversationRail
24
- } from "./chunk-5WB3NGIN.js";
25
+ } from "./chunk-LJE2W4EM.js";
25
26
  import {
26
27
  normalizeAgentGUIProviderTargets
27
- } from "./chunk-4UTWOSHP.js";
28
+ } from "./chunk-UI3YDJTC.js";
28
29
 
29
30
  // workbench/contribution.ts
30
31
  import { createElement as createElement2 } from "react";
@@ -32,6 +33,48 @@ import {
32
33
  getWorkbenchLayoutFrame
33
34
  } from "@tutti-os/workbench-surface";
34
35
 
36
+ // workbench/bodyRenderErrorRegistry.ts
37
+ import { useSyncExternalStore } from "react";
38
+ var listenersByNodeId = /* @__PURE__ */ new Map();
39
+ var errorNodeIds = /* @__PURE__ */ new Set();
40
+ function setAgentGuiWorkbenchBodyRenderError(nodeId, hasError) {
41
+ const hadError = errorNodeIds.has(nodeId);
42
+ if (hadError === hasError) {
43
+ return;
44
+ }
45
+ if (hasError) {
46
+ errorNodeIds.add(nodeId);
47
+ } else {
48
+ errorNodeIds.delete(nodeId);
49
+ }
50
+ for (const listener of listenersByNodeId.get(nodeId) ?? []) {
51
+ listener();
52
+ }
53
+ }
54
+ function subscribeAgentGuiWorkbenchBodyRenderError(nodeId, listener) {
55
+ let listeners = listenersByNodeId.get(nodeId);
56
+ if (!listeners) {
57
+ listeners = /* @__PURE__ */ new Set();
58
+ listenersByNodeId.set(nodeId, listeners);
59
+ }
60
+ listeners.add(listener);
61
+ return () => {
62
+ listeners?.delete(listener);
63
+ if (listeners?.size === 0) {
64
+ listenersByNodeId.delete(nodeId);
65
+ }
66
+ };
67
+ }
68
+ function getAgentGuiWorkbenchBodyRenderErrorSnapshot(nodeId) {
69
+ return errorNodeIds.has(nodeId);
70
+ }
71
+ function useAgentGuiWorkbenchBodyRenderError(nodeId) {
72
+ return useSyncExternalStore(
73
+ (listener) => subscribeAgentGuiWorkbenchBodyRenderError(nodeId, listener),
74
+ () => getAgentGuiWorkbenchBodyRenderErrorSnapshot(nodeId)
75
+ );
76
+ }
77
+
35
78
  // workbench/header.ts
36
79
  import {
37
80
  createElement
@@ -57,17 +100,21 @@ function AgentGuiWorkbenchHeader({
57
100
  isConversationRailAutoCollapsed,
58
101
  isConversationRailCollapsed,
59
102
  conversationRailWidthPx,
103
+ conversationIconUrl,
60
104
  providerRailWidthPx,
61
105
  conversationTitle,
106
+ nodeId,
62
107
  onCreateConversation,
63
108
  onToggleConversationRail,
64
- title,
109
+ title: _title,
65
110
  windowActions,
66
111
  ...headerProps
67
112
  }) {
113
+ const hasBodyRenderError = useAgentGuiWorkbenchBodyRenderError(nodeId);
68
114
  const toggleLabel = isConversationRailCollapsed ? copy.expandConversationRail : copy.collapseConversationRail;
69
- const appTitle = title?.trim() || copy.fallbackAgentLabel;
70
- const sessionTitle = conversationTitle?.trim() || "";
115
+ const appTitle = _title?.trim() || copy.fallbackAgentLabel;
116
+ const sessionTitle = hasBodyRenderError ? "" : conversationTitle?.trim() || "";
117
+ const sessionIconUrl = conversationIconUrl?.trim() || "";
71
118
  const safeDisplayMode = displayMode ?? "floating";
72
119
  const safeWindowActions = windowActions ?? {
73
120
  close: () => void 0,
@@ -125,7 +172,7 @@ function AgentGuiWorkbenchHeader({
125
172
  tone: "maximize"
126
173
  })
127
174
  ),
128
- createElement(
175
+ !isConversationRailCollapsed ? createElement(
129
176
  "div",
130
177
  {
131
178
  className: "agent-gui-workbench-header__agent-brand"
@@ -137,7 +184,7 @@ function AgentGuiWorkbenchHeader({
137
184
  },
138
185
  appTitle
139
186
  )
140
- ),
187
+ ) : null,
141
188
  createElement(
142
189
  Button,
143
190
  {
@@ -185,6 +232,13 @@ function AgentGuiWorkbenchHeader({
185
232
  {
186
233
  className: "agent-gui-workbench-header__session-title"
187
234
  },
235
+ sessionIconUrl ? createElement("img", {
236
+ alt: "",
237
+ className: "agent-gui-workbench-header__session-icon",
238
+ "data-testid": "agent-gui-window-session-icon",
239
+ draggable: false,
240
+ src: sessionIconUrl
241
+ }) : null,
188
242
  createElement(
189
243
  "span",
190
244
  {
@@ -277,7 +331,8 @@ var agentGuiWorkbenchDefaultNodeFrame = {
277
331
  x: 140,
278
332
  y: 48
279
333
  };
280
- var agentGuiWorkbenchDefaultUsableHeightRatio = 0.7;
334
+ var agentGuiWorkbenchDefaultUsableWidthRatio = 0.8;
335
+ var agentGuiWorkbenchDefaultUsableHeightRatio = 0.9;
281
336
  var agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;
282
337
  var agentGuiWorkbenchNewWindowCascadeOffset = { x: 180, y: 88 };
283
338
  var agentGuiWorkbenchProviderRailWidthPx = 52;
@@ -315,6 +370,7 @@ function createAgentGuiWorkbenchContribution(input) {
315
370
  providerAvailability: input.providerAvailability,
316
371
  providerTargetsLoading: input.providerTargetsLoading,
317
372
  renderPreview: input.renderPreview,
373
+ resolveDockPopupIdentity: input.resolveDockPopupIdentity,
318
374
  resolveDockPopupTitle: input.resolveDockPopupTitle,
319
375
  sectionId: input.dockSectionId ?? "agents",
320
376
  targets: input.providerTargets,
@@ -326,6 +382,9 @@ function createAgentGuiWorkbenchContribution(input) {
326
382
  {
327
383
  frame,
328
384
  instance: { mode: "multi" },
385
+ onBodyRenderErrorChange: ({ hasError, node }) => {
386
+ setAgentGuiWorkbenchBodyRenderError(node.id, hasError);
387
+ },
329
388
  renderBody: (context) => input.renderBody(
330
389
  context,
331
390
  {
@@ -366,7 +425,12 @@ function createAgentGuiWorkbenchContribution(input) {
366
425
  nodeState.conversationRailWidthPx,
367
426
  node.frame.width
368
427
  );
369
- const conversationTitle = input.resolveDockPopupTitle?.(workbenchState) ?? null;
428
+ const conversationIdentity = input.resolveDockPopupIdentity?.(workbenchState) ?? null;
429
+ const conversationTitle = conversationIdentity?.title ?? input.resolveDockPopupTitle?.(workbenchState) ?? workbenchState.lastActiveConversationTitle ?? null;
430
+ const conversationIconUrl = conversationIdentity?.iconUrl ?? resolveAgentGuiSessionProviderIconUrl(provider) ?? resolveAgentGuiWorkbenchProviderIconUrl({
431
+ dockIconUrls: input.dockIconUrls,
432
+ provider
433
+ });
370
434
  const persistConversationRailCollapsed = (collapsed) => {
371
435
  nodeStateSource.writeNodeState({
372
436
  instanceId,
@@ -405,11 +469,13 @@ function createAgentGuiWorkbenchContribution(input) {
405
469
  };
406
470
  return createElement2(AgentGuiWorkbenchHeader, {
407
471
  copy,
472
+ conversationIconUrl,
408
473
  conversationTitle,
409
474
  conversationRailWidthPx,
410
475
  displayMode,
411
476
  isConversationRailAutoCollapsed,
412
477
  isConversationRailCollapsed,
478
+ nodeId: node.id,
413
479
  providerRailWidthPx: agentGuiWorkbenchProviderRailWidthPx,
414
480
  title: headerTitle,
415
481
  windowActions: {
@@ -494,6 +560,7 @@ function createAgentGuiWorkbenchContribution(input) {
494
560
  launchPayload,
495
561
  provider
496
562
  );
563
+ const launchAgentTargetId = providerTarget.agentTargetId ?? providerTarget.providerTargetId;
497
564
  if (targetAgentSessionId) {
498
565
  const previousState = nodeStateSource.readNodeState({
499
566
  instanceId,
@@ -504,8 +571,7 @@ function createAgentGuiWorkbenchContribution(input) {
504
571
  state: {
505
572
  ...normalizeAgentGuiWorkbenchState(previousState),
506
573
  ...targetAgentSessionId ? { lastActiveAgentSessionId: targetAgentSessionId } : {},
507
- ...providerTarget.agentTargetId ? { agentTargetId: providerTarget.agentTargetId } : {},
508
- ...providerTarget.providerTargetId ? { agentTargetId: providerTarget.providerTargetId } : {}
574
+ agentTargetId: launchAgentTargetId ?? null
509
575
  },
510
576
  typeId: agentGuiWorkbenchTypeId
511
577
  });
@@ -556,7 +622,9 @@ function buildAgentGuiDockEntries(input) {
556
622
  return [
557
623
  createAgentGuiWorkbenchDockEntry({
558
624
  aggregateProviders: agentGuiWorkbenchDefaultDockProviders,
559
- icon: createAgentGuiWorkbenchLaunchpadStyleDockIcon({
625
+ icon: input.unifiedDockIconUrl ? createAgentGuiWorkbenchUnifiedDockIcon({
626
+ iconUrl: input.unifiedDockIconUrl
627
+ }) : createAgentGuiWorkbenchLaunchpadStyleDockIcon({
560
628
  tileIconUrls: unifiedTileIconUrls
561
629
  }),
562
630
  label: input.label ?? agentGuiWorkbenchDefaultCopy.nodeTitle,
@@ -564,6 +632,7 @@ function buildAgentGuiDockEntries(input) {
564
632
  order: 0,
565
633
  provider,
566
634
  renderPreview: input.renderPreview,
635
+ resolveDockPopupIdentity: input.resolveDockPopupIdentity,
567
636
  resolveDockPopupTitle: input.resolveDockPopupTitle,
568
637
  sectionId,
569
638
  visibility: "always"
@@ -592,23 +661,15 @@ function resolveAgentGuiWorkbenchDefaultLaunchFrame(input) {
592
661
  const defaultHeight = Math.round(
593
662
  layoutFrame.height * agentGuiWorkbenchDefaultUsableHeightRatio
594
663
  );
595
- const shouldUseCompactWidth = layoutFrame.width < input.frame.width;
596
- const shouldUseCompactHeight = layoutFrame.height < input.frame.height / agentGuiWorkbenchCompactVisibleAreaRatio;
597
- if (shouldUseCompactWidth || shouldUseCompactHeight) {
598
- const width = shouldUseCompactWidth ? Math.round(layoutFrame.width * agentGuiWorkbenchCompactVisibleAreaRatio) : input.frame.width;
599
- const height = Math.round(
600
- layoutFrame.height * agentGuiWorkbenchCompactVisibleAreaRatio
601
- );
602
- return {
603
- height,
604
- width,
605
- x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),
606
- y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)
607
- };
608
- }
664
+ const defaultWidth = Math.round(
665
+ layoutFrame.width * agentGuiWorkbenchDefaultUsableWidthRatio
666
+ );
609
667
  return {
610
668
  ...input.frame,
611
- height: defaultHeight
669
+ height: defaultHeight,
670
+ width: defaultWidth,
671
+ x: Math.round(layoutFrame.x + (layoutFrame.width - defaultWidth) / 2),
672
+ y: Math.round(layoutFrame.y + (layoutFrame.height - defaultHeight) / 2)
612
673
  };
613
674
  }
614
675
  function isAgentGuiWorkbenchCompactVisibleFrame(frame, defaultFrame) {
@@ -637,12 +698,12 @@ function createAgentGuiWorkbenchDockEntry(input) {
637
698
  label: input.label,
638
699
  provider: input.provider,
639
700
  renderPreview: input.renderPreview,
701
+ resolveDockPopupIdentity: input.resolveDockPopupIdentity,
640
702
  resolveDockPopupTitle: input.resolveDockPopupTitle
641
703
  }) : null,
642
704
  resolvePopupItem: ({ externalNodeState }) => {
643
- const title = input.resolveDockPopupTitle?.(
644
- normalizeAgentGuiWorkbenchState(externalNodeState)
645
- ) ?? null;
705
+ const state = normalizeAgentGuiWorkbenchState(externalNodeState);
706
+ const title = input.resolveDockPopupIdentity?.(state)?.title ?? input.resolveDockPopupTitle?.(state) ?? null;
646
707
  return {
647
708
  revision: `${input.provider}
648
709
  ${title ?? ""}`,
@@ -656,9 +717,12 @@ ${title ?? ""}`,
656
717
  }
657
718
  function resolveAgentGuiUnifiedDockTileIconUrls(dockIconUrls) {
658
719
  return agentGuiWorkbenchUnifiedDockTileProviders.map(
659
- (provider) => dockIconUrls?.[provider] ?? agentGuiDockIconUrls[provider]
720
+ (provider) => resolveAgentGuiWorkbenchProviderIconUrl({ dockIconUrls, provider })
660
721
  );
661
722
  }
723
+ function resolveAgentGuiWorkbenchProviderIconUrl(input) {
724
+ return input.dockIconUrls?.[input.provider] ?? agentGuiDockIconUrls[input.provider];
725
+ }
662
726
  function createAgentGuiWorkbenchLaunchpadStyleDockIcon(input) {
663
727
  return createElement2(
664
728
  "span",
@@ -682,6 +746,20 @@ function createAgentGuiWorkbenchLaunchpadStyleDockIcon(input) {
682
746
  )
683
747
  );
684
748
  }
749
+ function createAgentGuiWorkbenchUnifiedDockIcon(input) {
750
+ return createElement2(
751
+ "span",
752
+ {
753
+ "aria-hidden": "true",
754
+ className: "agent-gui-workbench-dock-icon agent-gui-workbench-dock-icon--single"
755
+ },
756
+ createElement2("img", {
757
+ alt: "",
758
+ draggable: false,
759
+ src: input.iconUrl
760
+ })
761
+ );
762
+ }
685
763
  function resolveAgentGuiWorkbenchProviderFromNode(node) {
686
764
  return agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ?? agentGuiWorkbenchProviderFromIdentifier(node.data.dockEntryId) ?? providerFromState(node.data.snapshotNodeState) ?? providerFromState(node.data.runtimeNodeState) ?? agentGuiWorkbenchProviderFromIdentifier(node.data.typeId) ?? "codex";
687
765
  }
@@ -811,7 +889,7 @@ function providerTargetLaunchPayloadFromRequest(payload, expectedProvider) {
811
889
  function createAgentGuiWorkbenchPreviewContent(input) {
812
890
  const { externalNodeState, node } = input.item;
813
891
  const state = normalizeAgentGuiWorkbenchState(externalNodeState);
814
- const title = input.resolveDockPopupTitle?.(state) ?? node.title;
892
+ const title = input.resolveDockPopupIdentity?.(state)?.title ?? input.resolveDockPopupTitle?.(state) ?? node.title;
815
893
  const provider = input.provider ?? agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ?? agentGuiWorkbenchProviderFromInstanceId(node.data.instanceId);
816
894
  const label = input.label ?? resolveAgentGuiWorkbenchProviderLabel(provider);
817
895
  const lines = [label, state.lastActiveAgentSessionId].filter(
@@ -853,6 +931,7 @@ function createAgentGuiWorkbenchPreviewBodyContext(input) {
853
931
  export {
854
932
  AgentGuiWorkbenchHeader,
855
933
  agentGuiWorkbenchDefaultNodeFrame,
934
+ agentGuiWorkbenchDefaultUsableWidthRatio,
856
935
  agentGuiWorkbenchDefaultUsableHeightRatio,
857
936
  agentGuiWorkbenchCompactVisibleAreaRatio,
858
937
  agentGuiWorkbenchNewWindowCascadeOffset,
@@ -866,4 +945,4 @@ export {
866
945
  resolveAgentGuiWorkbenchDefaultLaunchFrame,
867
946
  resolveAgentGuiWorkbenchContributionCopy
868
947
  };
869
- //# sourceMappingURL=chunk-K4UUEG7X.js.map
948
+ //# sourceMappingURL=chunk-LQHYHF36.js.map