@tutti-os/agent-gui 0.0.94 → 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.
Files changed (163) hide show
  1. package/README.md +86 -38
  2. package/dist/AgentGUI-DWdvUV4x.d.ts +1038 -0
  3. package/dist/agent-conversation/index.d.ts +6 -7
  4. package/dist/agent-conversation/index.js +15 -10
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-env/index.d.ts +10 -36
  7. package/dist/agent-env/index.js +2 -57
  8. package/dist/agent-env/index.js.map +1 -1
  9. package/dist/agent-gui.d.ts +21 -0
  10. package/dist/agent-gui.js +39 -0
  11. package/dist/agent-message-center/index.d.ts +156 -124
  12. package/dist/agent-message-center/index.js +1656 -1463
  13. package/dist/agent-message-center/index.js.map +1 -1
  14. package/dist/{agentConversationVM-Cl4G0Lln.d.ts → agentConversationVM-C335TR6S.d.ts} +112 -7
  15. package/dist/agentFileMentionContracts-58IjMU-u.d.ts +108 -0
  16. package/dist/{agentGuiNodeTypes-CAioPXK9.d.ts → agentGuiNodeTypes-B9X4aWfv.d.ts} +123 -163
  17. package/dist/agentPlanPromptDispatch-C7cCMjve.d.ts +37 -0
  18. package/dist/agents.d.ts +13 -0
  19. package/dist/agents.js +13 -0
  20. package/dist/app/renderer/agentactivity.css +276 -83
  21. package/dist/app/renderer/assets/icons/agent-vinyls/tutti-vinyl.png +0 -0
  22. package/dist/app/renderer/assets/icons/open-link-lined.svg +4 -0
  23. package/dist/{chunk-7BUYFVRI.js → chunk-2HJEOO7W.js} +2931 -2946
  24. package/dist/chunk-2HJEOO7W.js.map +1 -0
  25. package/dist/{chunk-E5FOXRUM.js → chunk-3XXBDYAI.js} +293 -258
  26. package/dist/chunk-3XXBDYAI.js.map +1 -0
  27. package/dist/{chunk-ZUW4B5AT.js → chunk-3Y3F7CS5.js} +21 -32
  28. package/dist/chunk-3Y3F7CS5.js.map +1 -0
  29. package/dist/{chunk-SCLLP5DO.js → chunk-4PQPJ5OY.js} +50 -155
  30. package/dist/chunk-4PQPJ5OY.js.map +1 -0
  31. package/dist/chunk-4YG7YK7S.js +23 -0
  32. package/dist/chunk-4YG7YK7S.js.map +1 -0
  33. package/dist/chunk-5X7YDOC6.js +42 -0
  34. package/dist/chunk-5X7YDOC6.js.map +1 -0
  35. package/dist/{chunk-R2EWECUP.js → chunk-7BXWPI4F.js} +17 -2
  36. package/dist/{chunk-R2EWECUP.js.map → chunk-7BXWPI4F.js.map} +1 -1
  37. package/dist/chunk-AGT7MUTV.js +491 -0
  38. package/dist/chunk-AGT7MUTV.js.map +1 -0
  39. package/dist/chunk-C35SNDVZ.js +96 -0
  40. package/dist/chunk-C35SNDVZ.js.map +1 -0
  41. package/dist/{chunk-5FE7M42A.js → chunk-E4HQUTM3.js} +2 -2
  42. package/dist/chunk-FGLQZ6I4.js +9 -0
  43. package/dist/chunk-FGLQZ6I4.js.map +1 -0
  44. package/dist/chunk-H5F3QSCF.js +25 -0
  45. package/dist/chunk-H5F3QSCF.js.map +1 -0
  46. package/dist/chunk-H6IQ63DQ.js +14 -0
  47. package/dist/chunk-H6IQ63DQ.js.map +1 -0
  48. package/dist/{chunk-45FF4DQU.js → chunk-IYEXLOUE.js} +22 -27
  49. package/dist/chunk-IYEXLOUE.js.map +1 -0
  50. package/dist/{chunk-P72YLKC6.js → chunk-JKIZA7EJ.js} +3573 -3755
  51. package/dist/chunk-JKIZA7EJ.js.map +1 -0
  52. package/dist/chunk-KJQERFKX.js +259 -0
  53. package/dist/chunk-KJQERFKX.js.map +1 -0
  54. package/dist/{chunk-XW4CVBUH.js → chunk-L3GMMGRS.js} +25 -16
  55. package/dist/chunk-L3GMMGRS.js.map +1 -0
  56. package/dist/chunk-MASXZENX.js +231 -0
  57. package/dist/chunk-MASXZENX.js.map +1 -0
  58. package/dist/{chunk-BXVPOGYK.js → chunk-O3Q5SIJH.js} +505 -504
  59. package/dist/chunk-O3Q5SIJH.js.map +1 -0
  60. package/dist/{chunk-554VG7ZW.js → chunk-QVBF5BN5.js} +2 -2
  61. package/dist/{chunk-AWAIUYG4.js → chunk-RE4AXS27.js} +532 -565
  62. package/dist/chunk-RE4AXS27.js.map +1 -0
  63. package/dist/{chunk-7LMJXF4R.js → chunk-TVIGLNNI.js} +20 -16
  64. package/dist/chunk-TVIGLNNI.js.map +1 -0
  65. package/dist/{chunk-XDV4ZRVK.js → chunk-UGVI47X6.js} +98 -37
  66. package/dist/chunk-UGVI47X6.js.map +1 -0
  67. package/dist/{chunk-GAPTLVII.js → chunk-UHBCM6RO.js} +1 -1
  68. package/dist/chunk-UHBCM6RO.js.map +1 -0
  69. package/dist/{chunk-UBDPV34P.js → chunk-W6WAGPMD.js} +1385 -1305
  70. package/dist/chunk-W6WAGPMD.js.map +1 -0
  71. package/dist/chunk-WKSFPJHZ.js +33054 -0
  72. package/dist/chunk-WKSFPJHZ.js.map +1 -0
  73. package/dist/{chunk-IGY4ASUF.js → chunk-WMNS4MAQ.js} +1288 -1696
  74. package/dist/chunk-WMNS4MAQ.js.map +1 -0
  75. package/dist/{chunk-MATIJPGF.js → chunk-XPFHJMZP.js} +541 -401
  76. package/dist/chunk-XPFHJMZP.js.map +1 -0
  77. package/dist/chunk-YMXYBG7U.js +12 -0
  78. package/dist/chunk-YMXYBG7U.js.map +1 -0
  79. package/dist/context-mention-palette/index.d.ts +3 -2
  80. package/dist/context-mention-palette/index.js +17 -12
  81. package/dist/custom-mention.d.ts +42 -0
  82. package/dist/custom-mention.js +17 -0
  83. package/dist/custom-mention.js.map +1 -0
  84. package/dist/dock-icons.d.ts +4 -0
  85. package/dist/dock-icons.js +11 -0
  86. package/dist/dock-icons.js.map +1 -0
  87. package/dist/i18n/index.d.ts +880 -841
  88. package/dist/i18n/index.js +2 -2
  89. package/dist/index.d.ts +56 -1063
  90. package/dist/index.js +78 -35532
  91. package/dist/index.js.map +1 -1
  92. package/dist/mention-search.d.ts +226 -0
  93. package/dist/mention-search.js +29 -0
  94. package/dist/mention-search.js.map +1 -0
  95. package/dist/open-link-lined-JWEKUKME.svg +4 -0
  96. package/dist/pastedTextKinds-D-XuInaS.d.ts +4 -0
  97. package/dist/provider-icons.d.ts +6 -0
  98. package/dist/provider-icons.js +12 -0
  99. package/dist/provider-icons.js.map +1 -0
  100. package/dist/provider-identity.d.ts +9 -0
  101. package/dist/provider-identity.js +21 -0
  102. package/dist/provider-identity.js.map +1 -0
  103. package/dist/runtime-BBNdWgDU.d.ts +10 -0
  104. package/dist/startup-shell.d.ts +8 -0
  105. package/dist/startup-shell.js +184 -0
  106. package/dist/startup-shell.js.map +1 -0
  107. package/dist/{types-PLFZ8SBX.d.ts → types-CnT8rNUI.d.ts} +43 -87
  108. package/dist/workbench/contribution.d.ts +34 -41
  109. package/dist/workbench/contribution.js +10 -6
  110. package/dist/workbench/index.d.ts +5 -4
  111. package/dist/workbench/index.js +27 -25
  112. package/dist/workbench/launch.d.ts +4 -7
  113. package/dist/workbench/launch.js +4 -3
  114. package/dist/workbench/providerCatalog.d.ts +2 -2
  115. package/dist/workbench/providerCatalog.js +2 -1
  116. package/dist/workbench/sessionTitle.d.ts +11 -14
  117. package/dist/workbench/sessionTitle.js +6 -7
  118. package/dist/workbench/state.d.ts +1 -1
  119. package/dist/workbench/state.js +3 -2
  120. package/dist/workbench/types.d.ts +2 -4
  121. package/dist/workbench/types.js +1 -1
  122. package/dist/workspace-agent-generated-files.d.ts +20 -2
  123. package/dist/workspace-agent-generated-files.js +6 -5
  124. package/dist/workspaceAgentActivityListTypes-C7gPWYiA.d.ts +71 -0
  125. package/package.json +70 -26
  126. package/dist/AgentMentionSearchController-DD_WOred.d.ts +0 -241
  127. package/dist/AgentMessageMarkdown-DeYPURtF.d.ts +0 -7
  128. package/dist/chunk-45FF4DQU.js.map +0 -1
  129. package/dist/chunk-4HP6V2YA.js +0 -207
  130. package/dist/chunk-4HP6V2YA.js.map +0 -1
  131. package/dist/chunk-7BUYFVRI.js.map +0 -1
  132. package/dist/chunk-7LMJXF4R.js.map +0 -1
  133. package/dist/chunk-AWAIUYG4.js.map +0 -1
  134. package/dist/chunk-BXVPOGYK.js.map +0 -1
  135. package/dist/chunk-E5FOXRUM.js.map +0 -1
  136. package/dist/chunk-GAPTLVII.js.map +0 -1
  137. package/dist/chunk-IBIMGLCD.js +0 -66
  138. package/dist/chunk-IBIMGLCD.js.map +0 -1
  139. package/dist/chunk-IGY4ASUF.js.map +0 -1
  140. package/dist/chunk-LR4FA5X6.js +0 -368
  141. package/dist/chunk-LR4FA5X6.js.map +0 -1
  142. package/dist/chunk-MATIJPGF.js.map +0 -1
  143. package/dist/chunk-MKHDRIGN.js +0 -71
  144. package/dist/chunk-MKHDRIGN.js.map +0 -1
  145. package/dist/chunk-P72YLKC6.js.map +0 -1
  146. package/dist/chunk-SCLLP5DO.js.map +0 -1
  147. package/dist/chunk-UBDPV34P.js.map +0 -1
  148. package/dist/chunk-VAKFNNKT.js +0 -410
  149. package/dist/chunk-VAKFNNKT.js.map +0 -1
  150. package/dist/chunk-XDV4ZRVK.js.map +0 -1
  151. package/dist/chunk-XW4CVBUH.js.map +0 -1
  152. package/dist/chunk-ZUW4B5AT.js.map +0 -1
  153. package/dist/plan-decision-ops.d.ts +0 -70
  154. package/dist/plan-decision-ops.js +0 -19
  155. package/dist/queued-prompt-runtime.d.ts +0 -115
  156. package/dist/queued-prompt-runtime.js +0 -9
  157. package/dist/uiSettings-BQS9r2eo.d.ts +0 -6
  158. package/dist/workspaceAgentActivityListViewModel-BzV-cf0D.d.ts +0 -340
  159. package/dist/workspaceLinkActions-DS9LWqzI.d.ts +0 -74
  160. /package/dist/{plan-decision-ops.js.map → agent-gui.js.map} +0 -0
  161. /package/dist/{queued-prompt-runtime.js.map → agents.js.map} +0 -0
  162. /package/dist/{chunk-5FE7M42A.js.map → chunk-E4HQUTM3.js.map} +0 -0
  163. /package/dist/{chunk-554VG7ZW.js.map → chunk-QVBF5BN5.js.map} +0 -0
@@ -1,4 +1,5 @@
1
- type AgentGuiWorkbenchProvider = "claude-code" | "codex" | "tutti-agent" | "cursor" | "nexight" | "hermes" | "openclaw" | "opencode";
1
+ /** Open runtime metadata; agentTargetId remains the launch identity. */
2
+ type AgentGuiWorkbenchProvider = string;
2
3
  declare const agentGuiWorkbenchOpenSessionActivationType = "agent-gui:open-session";
3
4
  declare const agentGuiWorkbenchPrefillPromptActivationType = "agent-gui:prefill-prompt";
4
5
  interface AgentGuiWorkbenchPrefillPromptPayload {
@@ -26,8 +27,6 @@ interface AgentGuiWorkbenchNodeState {
26
27
  conversationRailCollapsed?: boolean | null;
27
28
  conversationRailWidthPx?: number | null;
28
29
  lastActiveAgentSessionId: string | null;
29
- /** @deprecated Conversation titles are derived from the active session id. */
30
- lastActiveConversationTitle?: string | null;
31
30
  provider: AgentGuiWorkbenchProvider;
32
31
  }
33
32
  interface AgentGuiWorkbenchState {
@@ -35,7 +34,6 @@ interface AgentGuiWorkbenchState {
35
34
  conversationRailCollapsed?: boolean | null;
36
35
  conversationRailWidthPx?: number | null;
37
36
  lastActiveAgentSessionId: string | null;
38
- lastActiveConversationTitle?: string | null;
39
37
  }
40
38
  interface AgentGuiWorkbenchWorkspaceState {
41
39
  workspaceId: string;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  agentGuiWorkbenchOpenSessionActivationType,
3
3
  agentGuiWorkbenchPrefillPromptActivationType
4
- } from "../chunk-GAPTLVII.js";
4
+ } from "../chunk-UHBCM6RO.js";
5
5
  export {
6
6
  agentGuiWorkbenchOpenSessionActivationType,
7
7
  agentGuiWorkbenchPrefillPromptActivationType
@@ -1,2 +1,20 @@
1
- export { B as BuildWorkspaceAgentActivityListOptions, C as CollectWorkspaceAgentGeneratedFilesOptions, W as WorkspaceAgentActivityCard, m as WorkspaceAgentActivityListViewModel, o as WorkspaceAgentActivityStatus, r as WorkspaceAgentChangedFile, s as buildWorkspaceAgentActivityListViewModel, t as collectWorkspaceAgentGeneratedFiles, u as resolveWorkspaceAgentActivityStatus, v as resolveWorkspaceAgentActivityTitle, w as reuseWorkspaceAgentActivityListViewModelIfUnchanged, x as workspaceAgentProviderLabel } from './workspaceAgentActivityListViewModel-BzV-cf0D.js';
2
- import '@tutti-os/agent-activity-core';
1
+ import { b as WorkspaceAgentActivityListSnapshot, B as BuildWorkspaceAgentActivityListOptions, c as WorkspaceAgentActivityListViewModel, d as WorkspaceAgentActivityStatus, C as CollectWorkspaceAgentGeneratedFilesOptions, e as WorkspaceAgentChangedFile } from './workspaceAgentActivityListTypes-C7gPWYiA.js';
2
+ export { W as WorkspaceAgentActivityCard } from './workspaceAgentActivityListTypes-C7gPWYiA.js';
3
+ import { AgentActivitySession, AgentActivityMessage } from '@tutti-os/agent-activity-core';
4
+
5
+ declare function workspaceAgentProviderLabel(provider: string): string;
6
+
7
+ declare function buildWorkspaceAgentActivityListViewModel(snapshot: WorkspaceAgentActivityListSnapshot, options?: BuildWorkspaceAgentActivityListOptions): WorkspaceAgentActivityListViewModel;
8
+ declare function reuseWorkspaceAgentActivityListViewModelIfUnchanged(previous: WorkspaceAgentActivityListViewModel | null, next: WorkspaceAgentActivityListViewModel): WorkspaceAgentActivityListViewModel;
9
+
10
+ declare function resolveWorkspaceAgentActivityStatus(session: AgentActivitySession): WorkspaceAgentActivityStatus;
11
+
12
+ declare function resolveWorkspaceAgentActivityTitle(session: AgentActivitySession, messages?: readonly AgentActivityMessage[]): string;
13
+
14
+ interface WorkspaceAgentGeneratedFilesSource {
15
+ sessionMessagesById: Readonly<Record<string, AgentActivityMessage[]>>;
16
+ sessions: readonly AgentActivitySession[];
17
+ }
18
+ declare function collectWorkspaceAgentGeneratedFiles(source: WorkspaceAgentGeneratedFilesSource, options?: CollectWorkspaceAgentGeneratedFilesOptions): WorkspaceAgentChangedFile[];
19
+
20
+ export { BuildWorkspaceAgentActivityListOptions, CollectWorkspaceAgentGeneratedFilesOptions, WorkspaceAgentActivityListSnapshot, WorkspaceAgentActivityListViewModel, WorkspaceAgentActivityStatus, WorkspaceAgentChangedFile, buildWorkspaceAgentActivityListViewModel, collectWorkspaceAgentGeneratedFiles, resolveWorkspaceAgentActivityStatus, resolveWorkspaceAgentActivityTitle, reuseWorkspaceAgentActivityListViewModelIfUnchanged, workspaceAgentProviderLabel };
@@ -4,15 +4,16 @@ import {
4
4
  resolveWorkspaceAgentActivityStatus,
5
5
  resolveWorkspaceAgentActivityTitle,
6
6
  reuseWorkspaceAgentActivityListViewModelIfUnchanged
7
- } from "./chunk-E5FOXRUM.js";
8
- import "./chunk-IBIMGLCD.js";
7
+ } from "./chunk-3XXBDYAI.js";
9
8
  import "./chunk-Y35GDLP2.js";
9
+ import "./chunk-YMXYBG7U.js";
10
10
  import {
11
11
  workspaceAgentProviderLabel
12
- } from "./chunk-4HP6V2YA.js";
13
- import "./chunk-5FE7M42A.js";
14
- import "./chunk-UBDPV34P.js";
12
+ } from "./chunk-H5F3QSCF.js";
15
13
  import "./chunk-GCBDIQDX.js";
14
+ import "./chunk-E4HQUTM3.js";
15
+ import "./chunk-W6WAGPMD.js";
16
+ import "./chunk-KJQERFKX.js";
16
17
  export {
17
18
  buildWorkspaceAgentActivityListViewModel,
18
19
  collectWorkspaceAgentGeneratedFiles,
@@ -0,0 +1,71 @@
1
+ import { AgentActivityMessage, AgentActivitySnapshot } from '@tutti-os/agent-activity-core';
2
+
3
+ interface AgentHostUserInfo {
4
+ userId: string;
5
+ email?: string;
6
+ avatar?: string;
7
+ avatarObjectKey?: string;
8
+ name?: string;
9
+ }
10
+ interface AgentHostBatchUserInfoInput {
11
+ userIds: string[];
12
+ }
13
+ interface AgentHostBatchUserInfoResult {
14
+ users: AgentHostUserInfo[];
15
+ }
16
+
17
+ type ToolCallStatusKind = "working" | "completed" | "failed" | "canceled" | "waiting";
18
+ interface WorkspaceAgentToolCallDisplay {
19
+ id: string;
20
+ name: string;
21
+ status: string | null;
22
+ statusKind: ToolCallStatusKind | null;
23
+ detail?: string;
24
+ }
25
+
26
+ type WorkspaceAgentLatestActivityStatus = "working" | "waiting" | "idle" | "completed" | "canceled" | "failed";
27
+ interface WorkspaceAgentConversationPreviewLine {
28
+ actorName: string;
29
+ summary: string;
30
+ }
31
+
32
+ type WorkspaceAgentActivityStatus = WorkspaceAgentLatestActivityStatus;
33
+ interface WorkspaceAgentChangedFile {
34
+ path: string;
35
+ label: string;
36
+ }
37
+ interface WorkspaceAgentActivityCard {
38
+ id: string;
39
+ sessionId: string;
40
+ userId: string | null;
41
+ userName: string;
42
+ userAvatarUrl?: string;
43
+ agentProvider: string;
44
+ agentName: string;
45
+ title: string;
46
+ status: WorkspaceAgentActivityStatus;
47
+ latestActivitySummary: string;
48
+ /** User prompt + latest agent reply for task/issue execution cards; room status list uses single-line summary only. */
49
+ conversationPreview?: WorkspaceAgentConversationPreviewLine[];
50
+ latestActivityActorName?: string;
51
+ toolCalls?: WorkspaceAgentToolCallDisplay[];
52
+ changedFiles: WorkspaceAgentChangedFile[];
53
+ sortTimeUnixMs: number;
54
+ readTimeUnixMs?: number;
55
+ }
56
+ interface WorkspaceAgentActivityListViewModel {
57
+ activities: WorkspaceAgentActivityCard[];
58
+ }
59
+ interface BuildWorkspaceAgentActivityListOptions {
60
+ sessionMessagesById?: Record<string, AgentActivityMessage[]>;
61
+ userProfilesById?: Record<string, AgentHostUserInfo>;
62
+ }
63
+ interface CollectWorkspaceAgentGeneratedFilesOptions {
64
+ workspaceRoot?: string | null;
65
+ /** When set, only include files from sessions whose cwd matches this path. */
66
+ sessionCwd?: string | null;
67
+ }
68
+
69
+ type WorkspaceAgentActivityListSnapshot = Pick<AgentActivitySnapshot, "presences" | "sessions">;
70
+
71
+ export type { AgentHostBatchUserInfoInput as A, BuildWorkspaceAgentActivityListOptions as B, CollectWorkspaceAgentGeneratedFilesOptions as C, ToolCallStatusKind as T, WorkspaceAgentActivityCard as W, AgentHostBatchUserInfoResult as a, WorkspaceAgentActivityListSnapshot as b, WorkspaceAgentActivityListViewModel as c, WorkspaceAgentActivityStatus as d, WorkspaceAgentChangedFile as e };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/agent-gui",
3
- "version": "0.0.94",
3
+ "version": "0.0.96",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -9,6 +9,30 @@
9
9
  "types": "./dist/index.d.ts",
10
10
  "import": "./dist/index.js"
11
11
  },
12
+ "./agent-gui": {
13
+ "types": "./dist/agent-gui.d.ts",
14
+ "import": "./dist/agent-gui.js"
15
+ },
16
+ "./startup-shell": {
17
+ "types": "./dist/startup-shell.d.ts",
18
+ "import": "./dist/startup-shell.js"
19
+ },
20
+ "./agents": {
21
+ "types": "./dist/agents.d.ts",
22
+ "import": "./dist/agents.js"
23
+ },
24
+ "./custom-mention": {
25
+ "types": "./dist/custom-mention.d.ts",
26
+ "import": "./dist/custom-mention.js"
27
+ },
28
+ "./dock-icons": {
29
+ "types": "./dist/dock-icons.d.ts",
30
+ "import": "./dist/dock-icons.js"
31
+ },
32
+ "./mention-search": {
33
+ "types": "./dist/mention-search.d.ts",
34
+ "import": "./dist/mention-search.js"
35
+ },
12
36
  "./agent-message-center": {
13
37
  "types": "./dist/agent-message-center/index.d.ts",
14
38
  "import": "./dist/agent-message-center/index.js"
@@ -25,10 +49,6 @@
25
49
  "types": "./dist/context-mention-palette/index.d.ts",
26
50
  "import": "./dist/context-mention-palette/index.js"
27
51
  },
28
- "./plan-decision-ops": {
29
- "types": "./dist/plan-decision-ops.d.ts",
30
- "import": "./dist/plan-decision-ops.js"
31
- },
32
52
  "./context-mention-provider": {
33
53
  "types": "./dist/context-mention-provider.d.ts",
34
54
  "import": "./dist/context-mention-provider.js"
@@ -37,14 +57,18 @@
37
57
  "types": "./dist/mention-file-presentation.d.ts",
38
58
  "import": "./dist/mention-file-presentation.js"
39
59
  },
40
- "./queued-prompt-runtime": {
41
- "types": "./dist/queued-prompt-runtime.d.ts",
42
- "import": "./dist/queued-prompt-runtime.js"
43
- },
44
60
  "./agent-title-text": {
45
61
  "types": "./dist/agent-title-text.d.ts",
46
62
  "import": "./dist/agent-title-text.js"
47
63
  },
64
+ "./provider-icons": {
65
+ "types": "./dist/provider-icons.d.ts",
66
+ "import": "./dist/provider-icons.js"
67
+ },
68
+ "./provider-identity": {
69
+ "types": "./dist/provider-identity.d.ts",
70
+ "import": "./dist/provider-identity.js"
71
+ },
48
72
  "./workspace-agent-generated-files": {
49
73
  "types": "./dist/workspace-agent-generated-files.d.ts",
50
74
  "import": "./dist/workspace-agent-generated-files.js"
@@ -100,17 +124,17 @@
100
124
  "@tiptap/react": "^3.11.1",
101
125
  "@tiptap/starter-kit": "^3.11.1",
102
126
  "@tiptap/suggestion": "^3.11.1",
103
- "@tutti-os/agent-activity-core": "0.0.94",
104
- "@tutti-os/ui-i18n-runtime": "0.0.94",
105
- "@tutti-os/ui-react-hooks": "0.0.94",
106
- "@tutti-os/ui-rich-text": "0.0.94",
107
- "@tutti-os/ui-system": "0.0.94",
108
- "@tutti-os/workbench-surface": "0.0.94",
109
- "@tutti-os/workspace-external-core": "0.0.94",
110
- "@tutti-os/workspace-file-manager": "0.0.94",
111
- "@tutti-os/workspace-file-reference": "0.0.94",
112
- "@tutti-os/workspace-issue-manager": "0.0.94",
113
- "@tutti-os/workspace-user-project": "0.0.94",
127
+ "@tutti-os/agent-activity-core": "0.0.96",
128
+ "@tutti-os/ui-i18n-runtime": "0.0.96",
129
+ "@tutti-os/ui-react-hooks": "0.0.96",
130
+ "@tutti-os/ui-rich-text": "0.0.96",
131
+ "@tutti-os/ui-system": "0.0.96",
132
+ "@tutti-os/workbench-surface": "0.0.96",
133
+ "@tutti-os/workspace-external-core": "0.0.96",
134
+ "@tutti-os/workspace-file-manager": "0.0.96",
135
+ "@tutti-os/workspace-file-reference": "0.0.96",
136
+ "@tutti-os/workspace-issue-manager": "0.0.96",
137
+ "@tutti-os/workspace-user-project": "0.0.96",
114
138
  "clsx": "^2.1.1",
115
139
  "framer-motion": "^12.40.0",
116
140
  "lodash": "^4.17.21",
@@ -120,6 +144,7 @@
120
144
  "remark-gfm": "^4.0.1",
121
145
  "tailwind-merge": "^3.6.0",
122
146
  "three": "^0.185.1",
147
+ "use-sync-external-store": "^1.6.0",
123
148
  "valtio": "^2.3.2",
124
149
  "zustand": "^5.0.14"
125
150
  },
@@ -131,6 +156,7 @@
131
156
  "@types/react": "^19.1.6",
132
157
  "@types/react-dom": "^19.1.5",
133
158
  "@types/three": "^0.185.1",
159
+ "@types/use-sync-external-store": "^0.0.6",
134
160
  "jsdom": "^27.2.0",
135
161
  "tsup": "8.5.1",
136
162
  "typescript": "^5.8.3",
@@ -156,9 +182,27 @@
156
182
  },
157
183
  "typesVersions": {
158
184
  "*": {
185
+ "agent-gui": [
186
+ "./dist/agent-gui.d.ts"
187
+ ],
188
+ "startup-shell": [
189
+ "./dist/startup-shell.d.ts"
190
+ ],
191
+ "agents": [
192
+ "./dist/agents.d.ts"
193
+ ],
159
194
  "agent-message-center": [
160
195
  "./dist/agent-message-center/index.d.ts"
161
196
  ],
197
+ "custom-mention": [
198
+ "./dist/custom-mention.d.ts"
199
+ ],
200
+ "dock-icons": [
201
+ "./dist/dock-icons.d.ts"
202
+ ],
203
+ "mention-search": [
204
+ "./dist/mention-search.d.ts"
205
+ ],
162
206
  "agent-conversation": [
163
207
  "./dist/agent-conversation/index.d.ts"
164
208
  ],
@@ -168,21 +212,21 @@
168
212
  "context-mention-palette": [
169
213
  "./dist/context-mention-palette/index.d.ts"
170
214
  ],
171
- "plan-decision-ops": [
172
- "./dist/plan-decision-ops.d.ts"
173
- ],
174
215
  "context-mention-provider": [
175
216
  "./dist/context-mention-provider.d.ts"
176
217
  ],
177
218
  "mention-file-presentation": [
178
219
  "./dist/mention-file-presentation.d.ts"
179
220
  ],
180
- "queued-prompt-runtime": [
181
- "./dist/queued-prompt-runtime.d.ts"
182
- ],
183
221
  "agent-title-text": [
184
222
  "./dist/agent-title-text.d.ts"
185
223
  ],
224
+ "provider-icons": [
225
+ "./dist/provider-icons.d.ts"
226
+ ],
227
+ "provider-identity": [
228
+ "./dist/provider-identity.d.ts"
229
+ ],
186
230
  "workspace-agent-generated-files": [
187
231
  "./dist/workspace-agent-generated-files.d.ts"
188
232
  ],
@@ -1,241 +0,0 @@
1
- import { AgentContextMentionProvider } from './context-mention-provider.js';
2
- import { MentionPaletteState, MentionPaletteGroup } from '@tutti-os/ui-rich-text/at-panel';
3
-
4
- type AgentFileMentionKind = "file" | "directory" | "unknown";
5
- type AgentMentionFileNavigationAction = "agent-generated-folder" | "agent-generated-folder-back";
6
- type AgentMentionScope = "my_sessions" | "collab_sessions";
7
- type AgentMentionReferenceSource = "app" | "task";
8
- interface AgentMentionFileItem {
9
- kind: "file";
10
- path: string;
11
- href: string;
12
- name: string;
13
- entryKind: AgentFileMentionKind;
14
- directoryPath: string;
15
- score?: number;
16
- thumbnailUrl?: string | null;
17
- mentionNavigation?: AgentMentionFileNavigationAction;
18
- childCount?: number;
19
- }
20
- interface AgentMentionSessionItem {
21
- kind: "session";
22
- href: string;
23
- workspaceId: string;
24
- targetId: string;
25
- agentTargetId?: string;
26
- name: string;
27
- title: string;
28
- scope: AgentMentionScope;
29
- initiatorName: string;
30
- initiatorAvatarUrl?: string;
31
- agentName: string;
32
- status?: string;
33
- inputPreview?: string;
34
- summaryPreview?: string;
35
- updatedAtUnixMs?: number;
36
- }
37
- interface AgentMentionWorkspaceIssueItem {
38
- kind: "workspace-issue";
39
- href: string;
40
- workspaceId: string;
41
- targetId: string;
42
- topicId?: string;
43
- name: string;
44
- title: string;
45
- creatorName?: string;
46
- status?: string;
47
- contentPreview?: string;
48
- updatedAtUnixMs?: number;
49
- }
50
- interface AgentMentionWorkspaceAppItem {
51
- kind: "workspace-app";
52
- href: string;
53
- workspaceId: string;
54
- targetId: string;
55
- appId: string;
56
- name: string;
57
- description?: string;
58
- iconUrl?: string;
59
- /** 应用是否能够提供产物文件(reference),决定 @ 面板行末尾是否展示「查看产物」入口。 */
60
- referencesListSupported?: boolean;
61
- }
62
- interface AgentMentionAgentTargetItem {
63
- kind: "agent-target";
64
- href: string;
65
- workspaceId: string;
66
- targetId: string;
67
- name: string;
68
- description?: string;
69
- agentProviderId?: string;
70
- iconUrl?: string;
71
- }
72
- interface AgentMentionWorkspaceReferenceItem {
73
- kind: "workspace-reference";
74
- href: string;
75
- workspaceId: string;
76
- /** URI path id:source=app 时为 appId,source=task 时为 topicId。 */
77
- targetId: string;
78
- source: AgentMentionReferenceSource;
79
- /** 子级 id:app 子分组 / issueId。缺省表示整个 app / topic。 */
80
- groupId?: string;
81
- name: string;
82
- iconUrl?: string;
83
- /** 展示用文件数(来自 picker 节点 childCount);序列化不再展开文件。 */
84
- fileCount: number;
85
- }
86
- interface AgentMentionWorkspaceAppFactoryItem {
87
- kind: "workspace-app-factory";
88
- href: string;
89
- workspaceId: string;
90
- targetId: string;
91
- jobId: string;
92
- name: string;
93
- action?: string;
94
- contextPath?: string;
95
- }
96
- interface AgentMentionCustomItem {
97
- kind: "custom";
98
- /** 注册表里的 kind(= mention:// providerId)。 */
99
- customKind: string;
100
- href: string;
101
- workspaceId: string;
102
- targetId: string;
103
- /** chip 第一行。 */
104
- name: string;
105
- /** chip 第二行(通用双行卡)。 */
106
- summary?: string;
107
- }
108
- type AgentContextMentionItem = AgentMentionFileItem | AgentMentionAgentTargetItem | AgentMentionSessionItem | AgentMentionWorkspaceAppItem | AgentMentionWorkspaceReferenceItem | AgentMentionWorkspaceAppFactoryItem | AgentMentionWorkspaceIssueItem | AgentMentionCustomItem;
109
-
110
- type AgentMentionProviderDiagnosticStatus = "success" | "timeout" | "error" | "missing";
111
- interface AgentMentionProviderQueryDiagnostic {
112
- durationMs: number;
113
- errorKind?: string;
114
- providerId: string;
115
- resultCount: number;
116
- status: AgentMentionProviderDiagnosticStatus;
117
- }
118
- interface AgentMentionSearchDiagnosticLog {
119
- debounceMs: number;
120
- durationMs: number;
121
- errorKind?: string;
122
- event: "agent_gui.mention_search";
123
- filter: AgentMentionFilterId;
124
- groupCount: number;
125
- itemCount: number;
126
- mode: "browse" | "results";
127
- providerResults: AgentMentionProviderQueryDiagnostic[];
128
- providerTimeoutMs: number;
129
- queryLength: number;
130
- requestId: number;
131
- status: "ready" | "error";
132
- workspaceId: string;
133
- }
134
-
135
- type AgentMentionFilterId = "session" | "file" | "issue" | "agent" | "app";
136
- type AgentMentionGroupId = "apps" | "agents" | "files" | "opened_files" | "agent_generated_files" | "my_sessions" | "collab_sessions" | "issues";
137
- interface AgentMentionBrowseCategory {
138
- id: AgentMentionFilterId;
139
- label: string;
140
- }
141
- type AgentMentionGroup = MentionPaletteGroup<AgentContextMentionItem>;
142
- type AgentMentionSearchState = MentionPaletteState<AgentContextMentionItem>;
143
- interface AgentMentionSearchControllerOptions {
144
- contextMentionProviders?: readonly AgentContextMentionProvider[];
145
- debounceMs?: number;
146
- fileLimit?: number;
147
- issueLimit?: number;
148
- browseCacheTtlMs?: number;
149
- providerTimeoutMs?: number;
150
- diagnosticInfoLogger?: (payload: AgentMentionSearchDiagnosticLog) => void;
151
- diagnosticNow?: () => number;
152
- diagnosticSlowThresholdMs?: number;
153
- }
154
- type Listener = (state: AgentMentionSearchState) => void;
155
- declare class AgentMentionSearchController {
156
- private readonly contextMentionProviders;
157
- private readonly debounceMs;
158
- private readonly fileLimit;
159
- private readonly issueLimit;
160
- private readonly browseCacheTtlMs;
161
- private readonly providerTimeoutMs;
162
- private readonly diagnosticInfoLogger;
163
- private readonly diagnosticNow;
164
- private readonly diagnosticSlowThresholdMs;
165
- private readonly listeners;
166
- private readonly expandedCounts;
167
- private readonly totalCounts;
168
- private timer;
169
- private preloadCancel;
170
- private pendingPreloadKey;
171
- private requestId;
172
- private disposed;
173
- private activeWorkspaceId;
174
- private currentUserId;
175
- private currentFilter;
176
- private currentQuery;
177
- private currentSessionCwd;
178
- private currentFileSearchLimit;
179
- private currentIssueSearchLimit;
180
- private agentGeneratedBrowsePath;
181
- private rawGroups;
182
- private state;
183
- constructor(options: AgentMentionSearchControllerOptions);
184
- subscribe(listener: Listener): () => void;
185
- updateQuery(input: {
186
- workspaceId: string;
187
- currentUserId?: string | null;
188
- query: string;
189
- sessionCwd?: string | null;
190
- }): void;
191
- setFilter(filter: AgentMentionFilterId): void;
192
- preloadBrowse(input: {
193
- workspaceId: string;
194
- currentUserId?: string | null;
195
- sessionCwd?: string | null;
196
- filter?: AgentMentionFilterId;
197
- }): void;
198
- private runBrowsePreload;
199
- private cancelPendingPreload;
200
- enterCategory(category: AgentMentionFilterId): void;
201
- selectAgentGeneratedMentionItem(item: AgentContextMentionItem): boolean;
202
- exitAgentGeneratedBrowse(): boolean;
203
- expandGroup(groupId: AgentMentionGroupId): void;
204
- close(): void;
205
- dispose(): void;
206
- private startBrowseModeFetch;
207
- private runSearch;
208
- private runBrowseSearch;
209
- private loadBrowseFetchResult;
210
- private fetchBrowseResult;
211
- private fetchFilterResult;
212
- private queryProviderMentionItems;
213
- private applyBrowseFetchResult;
214
- private readBrowseCache;
215
- private readBrowseCacheForBrowseInput;
216
- private browseCacheKey;
217
- private logBrowseCacheState;
218
- private logLifecycle;
219
- private providerIdsForDiagnostics;
220
- private queryProviderMentionItemsById;
221
- private logSearchDiagnostic;
222
- private groupsFromRawGroups;
223
- private emitBrowseState;
224
- private canApply;
225
- private clearTimer;
226
- private resetExpandedCounts;
227
- private resetSearchLimits;
228
- private resetRawGroups;
229
- private resetAgentGeneratedBrowsePath;
230
- private resetTotalCounts;
231
- private setState;
232
- }
233
- declare function preloadAgentMentionBrowse(input: {
234
- workspaceId: string;
235
- currentUserId?: string | null;
236
- sessionCwd?: string | null;
237
- contextMentionProviders?: readonly AgentContextMentionProvider[];
238
- filter?: AgentMentionFilterId;
239
- }): void;
240
-
241
- export { type AgentContextMentionItem as A, type AgentMentionBrowseCategory as a, type AgentMentionFilterId as b, type AgentMentionGroup as c, type AgentMentionGroupId as d, AgentMentionSearchController as e, type AgentMentionSearchState as f, preloadAgentMentionBrowse as p };
@@ -1,7 +0,0 @@
1
- interface AgentMessageMarkdownWorkspaceAppIcon {
2
- appId: string;
3
- iconUrl: string | null;
4
- workspaceId?: string | null;
5
- }
6
-
7
- export type { AgentMessageMarkdownWorkspaceAppIcon as A };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../workbench/state.ts"],"sourcesContent":["import type {\n WorkbenchHostExternalStateLookupInput,\n WorkbenchHostExternalStateSource\n} from \"@tutti-os/workbench-surface\";\nimport {\n agentGuiWorkbenchProviders,\n isAgentGuiWorkbenchProvider,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport 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 lastActiveConversationTitle: 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 ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\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 ...(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: normalizeOptionalNonEmptyString(state?.agentTargetId),\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 };\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 );\n}\n\nexport function agentGuiWorkbenchProviderFromInstanceId(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return \"codex\";\n }\n const [, provider] = normalized.split(\":\", 3);\n return normalizeAgentGuiWorkbenchProvider(provider);\n}\n\n/**\n * Like {@link agentGuiWorkbenchProviderFromInstanceId} but returns `null`\n * instead of defaulting to `\"codex\"` when the provider cannot be determined\n * yet (e.g. a freshly created session whose instanceId does not encode a\n * provider). Callers that render a provider icon use this so they can show a\n * neutral placeholder during that transient window instead of flashing the\n * wrong provider's icon.\n */\nexport function agentGuiWorkbenchProviderFromInstanceIdOrNull(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider | null {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return null;\n }\n const [, provider] = normalized.split(\":\", 3);\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nexport function createAgentGuiWorkbenchNodeStateSource(input: {\n typeId?: string;\n workspaceId: string;\n}): {\n externalStateSource: WorkbenchHostExternalStateSource<\n AgentGuiWorkbenchState | null,\n AgentGuiWorkbenchWorkspaceState\n >;\n readNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest\n ) => AgentGuiWorkbenchState | null;\n writeNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest & {\n state: AgentGuiWorkbenchState;\n }\n ) => void;\n /**\n * Returns the launch instanceId of an open node currently showing the given\n * agent session, or null when none is found. Used to focus an existing\n * conversation instead of launching a duplicate node.\n */\n findInstanceIdByAgentSessionId: (agentSessionId: string) => string | null;\n} {\n const typeId = input.typeId ?? \"agent-gui\";\n const nodeStateByKey = new Map<string, AgentGuiWorkbenchState>();\n // Tracks the launch instanceId behind each state key so a node can be located\n // by the session it is currently showing, even when its key is node-scoped.\n const instanceIdByKey = new Map<string, string>();\n const listeners = new Set<() => void>();\n\n const lookupState = (request: AgentGuiWorkbenchStateLookupRequest) => {\n const nodeState = request.nodeId\n ? nodeStateByKey.get(agentGuiWorkbenchNodeStateKey(request))\n : null;\n const state =\n nodeState ??\n nodeStateByKey.get(agentGuiWorkbenchInstanceStateKey(request));\n return state ? { ...state } : null;\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n externalStateSource: {\n getNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getSnapshotNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getWorkspaceState() {\n return {\n workspaceId: input.workspaceId\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n },\n readNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n findInstanceIdByAgentSessionId(agentSessionId) {\n const target = agentSessionId.trim();\n if (!target) {\n return null;\n }\n for (const [key, state] of nodeStateByKey) {\n if (state.lastActiveAgentSessionId?.trim() === target) {\n return instanceIdByKey.get(key) ?? null;\n }\n }\n return null;\n },\n writeNodeState(request) {\n if (request.typeId !== typeId) {\n return;\n }\n const key = agentGuiWorkbenchNodeStateKey(request);\n instanceIdByKey.set(key, request.instanceId);\n const previous = nodeStateByKey.get(key);\n let clearedInstanceSeed = false;\n if (request.nodeId) {\n const instanceKey = agentGuiWorkbenchInstanceStateKey(request);\n instanceIdByKey.delete(instanceKey);\n clearedInstanceSeed = nodeStateByKey.delete(instanceKey);\n }\n const next = {\n ...normalizeAgentGuiWorkbenchState(request.state)\n };\n nodeStateByKey.set(key, next);\n if (\n !clearedInstanceSeed &&\n previous &&\n areAgentGuiWorkbenchMemoryStatesEqual(previous, next)\n ) {\n return;\n }\n notify();\n }\n };\n}\n\nfunction areAgentGuiWorkbenchMemoryStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return areAgentGuiWorkbenchStatesEqual(left, right);\n}\n\nfunction agentGuiWorkbenchNodeStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\"> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>\n): string {\n return request.nodeId\n ? `node:${request.nodeId}`\n : agentGuiWorkbenchInstanceStateKey(request);\n}\n\nfunction agentGuiWorkbenchInstanceStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\">\n): string {\n return `instance:${request.instanceId}`;\n}\n\nfunction createDefaultAgentGuiWorkbenchState(): AgentGuiWorkbenchState {\n return {\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null\n };\n}\n\nfunction normalizeOptionalNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction 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":";;;;;;;AAyBO,SAAS,wCACd,WAAsC,SACV;AAC5B,SAAO;AAAA,IACL,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,kCAAkC;AAAA,IAClC,6BAA6B;AAAA,IAC7B,mBAAmB;AAAA,IACnB,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,6BAA6B;AAAA,IAC7B;AAAA,EACF;AACF;AAEO,SAAS,gCACd,OACwB;AACxB,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO,oCAAoC;AAAA,EAC7C;AACA,QAAM,gBAAgB,gCAAgC,MAAM,aAAa;AACzE,SAAO;AAAA,IACL,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,IACzC,2BAA2B,MAAM,8BAA8B;AAAA,IAC/D,yBAAyB;AAAA,MACvB,MAAM;AAAA,IACR;AAAA,IACA,0BACE,OAAO,MAAM,6BAA6B,WACtC,MAAM,2BACN;AAAA,IACN,GAAI,OAAO,MAAM,gCAAgC,WAC7C,EAAE,6BAA6B,MAAM,4BAA4B,IACjE,CAAC;AAAA,EACP;AACF;AAOO,SAAS,oCAAoC,OAAyB;AAC3E,MACE,CAAC,SAAS,KAAK,KACf,gCAAgC,MAAM,aAAa,GACnD;AACA,WAAO;AAAA,EACT;AACA,QAAM,sBAAsB;AAAA,IAC1B,MAAM;AAAA,EACR;AACA,SAAO,sBACH,EAAE,GAAG,OAAO,eAAe,oBAAoB,IAC/C;AACN;AAEO,SAAS,8BACd,OACwB;AACxB,QAAM,gBAAgB,gCAAgC,MAAM,aAAa;AACzE,SAAO;AAAA,IACL,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,IACzC,2BAA2B,MAAM,8BAA8B;AAAA,IAC/D,yBAAyB;AAAA,MACvB,MAAM;AAAA,IACR;AAAA,IACA,0BAA0B,MAAM,4BAA4B;AAAA,IAC5D,GAAI,OAAO,MAAM,gCAAgC,WAC7C,EAAE,6BAA6B,MAAM,4BAA4B,IACjE,CAAC;AAAA,EACP;AACF;AAEO,SAAS,gCACd,MACA,OACS;AACT,UACG,KAAK,iBAAiB,WAAW,MAAM,iBAAiB,SACzD,KAAK,8BAA8B,MAAM,6BACzC,KAAK,4BAA4B,MAAM,2BACvC,KAAK,6BAA6B,MAAM,6BACvC,KAAK,+BAA+B,WAClC,MAAM,+BAA+B;AAE5C;AAEO,SAAS,oCACd,OACA,mBAA8C,SAClB;AAC5B,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,IACP;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG,wCAAwC,QAAQ;AAAA,IACnD,eAAe,gCAAgC,OAAO,aAAa;AAAA,IACnE,mBAAmB;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IACA,kCACE;AAAA,MACE,OAAO;AAAA,IACT;AAAA,IACF,6BACE;AAAA,MACE,OAAO;AAAA,IACT;AAAA,IACF,mBAAmB;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IACA,2BAA2B,OAAO,8BAA8B;AAAA,IAChE,yBAAyB;AAAA,MACvB,OAAO;AAAA,IACT;AAAA,IACA,0BACE,OAAO,OAAO,6BAA6B,WACvC,MAAM,2BACN;AAAA,IACN,6BACE,OAAO,OAAO,gCAAgC,WAC1C,MAAM,8BACN;AAAA,IACN;AAAA,EACF;AACF;AAEO,SAAS,oCACd,MACA,OACS;AACT,UACG,KAAK,iBAAiB,WAAW,MAAM,iBAAiB,SACzD,uBAAuB,KAAK,mBAAmB,MAAM,iBAAiB,KACtE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,EACR,KACA;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,EACR,KACA,KAAK,sBAAsB,MAAM,qBACjC,KAAK,8BAA8B,MAAM,6BACzC,KAAK,4BAA4B,MAAM,2BACvC,KAAK,6BAA6B,MAAM,4BACxC,KAAK,gCAAgC,MAAM,+BAC3C,KAAK,aAAa,MAAM,aACvB,KAAK,iBAAiB,WAAW,MAAM,iBAAiB;AAE7D;AAEO,SAAS,wCACd,YAC2B;AAC3B,QAAM,aAAa,YAAY,KAAK;AACpC,MAAI,CAAC,cAAc,eAAe,aAAa;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,CAAC,EAAE,QAAQ,IAAI,WAAW,MAAM,KAAK,CAAC;AAC5C,SAAO,mCAAmC,QAAQ;AACpD;AAUO,SAAS,8CACd,YACkC;AAClC,QAAM,aAAa,YAAY,KAAK;AACpC,MAAI,CAAC,cAAc,eAAe,aAAa;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,CAAC,EAAE,QAAQ,IAAI,WAAW,MAAM,KAAK,CAAC;AAC5C,SAAO,4BAA4B,QAAQ,IAAI,WAAW;AAC5D;AAEO,SAAS,uCAAuC,OAsBrD;AACA,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,iBAAiB,oBAAI,IAAoC;AAG/D,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,QAAM,YAAY,oBAAI,IAAgB;AAEtC,QAAM,cAAc,CAAC,YAAiD;AACpE,UAAM,YAAY,QAAQ,SACtB,eAAe,IAAI,8BAA8B,OAAO,CAAC,IACzD;AACJ,UAAM,QACJ,aACA,eAAe,IAAI,kCAAkC,OAAO,CAAC;AAC/D,WAAO,QAAQ,EAAE,GAAG,MAAM,IAAI;AAAA,EAChC;AAEA,QAAM,SAAS,MAAM;AACnB,eAAW,YAAY,WAAW;AAChC,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,qBAAqB;AAAA,MACnB,aAAa,SAAS;AACpB,YAAI,QAAQ,WAAW,QAAQ;AAC7B,iBAAO;AAAA,QACT;AACA,eAAO,YAAY,OAAO;AAAA,MAC5B;AAAA,MACA,qBAAqB,SAAS;AAC5B,YAAI,QAAQ,WAAW,QAAQ;AAC7B,iBAAO;AAAA,QACT;AACA,eAAO,YAAY,OAAO;AAAA,MAC5B;AAAA,MACA,oBAAoB;AAClB,eAAO;AAAA,UACL,aAAa,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,MACA,UAAU,UAAU;AAClB,kBAAU,IAAI,QAAQ;AACtB,eAAO,MAAM;AACX,oBAAU,OAAO,QAAQ;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAc,SAAS;AACrB,UAAI,QAAQ,WAAW,QAAQ;AAC7B,eAAO;AAAA,MACT;AACA,aAAO,YAAY,OAAO;AAAA,IAC5B;AAAA,IACA,+BAA+B,gBAAgB;AAC7C,YAAM,SAAS,eAAe,KAAK;AACnC,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AACA,iBAAW,CAAC,KAAK,KAAK,KAAK,gBAAgB;AACzC,YAAI,MAAM,0BAA0B,KAAK,MAAM,QAAQ;AACrD,iBAAO,gBAAgB,IAAI,GAAG,KAAK;AAAA,QACrC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,eAAe,SAAS;AACtB,UAAI,QAAQ,WAAW,QAAQ;AAC7B;AAAA,MACF;AACA,YAAM,MAAM,8BAA8B,OAAO;AACjD,sBAAgB,IAAI,KAAK,QAAQ,UAAU;AAC3C,YAAM,WAAW,eAAe,IAAI,GAAG;AACvC,UAAI,sBAAsB;AAC1B,UAAI,QAAQ,QAAQ;AAClB,cAAM,cAAc,kCAAkC,OAAO;AAC7D,wBAAgB,OAAO,WAAW;AAClC,8BAAsB,eAAe,OAAO,WAAW;AAAA,MACzD;AACA,YAAM,OAAO;AAAA,QACX,GAAG,gCAAgC,QAAQ,KAAK;AAAA,MAClD;AACA,qBAAe,IAAI,KAAK,IAAI;AAC5B,UACE,CAAC,uBACD,YACA,sCAAsC,UAAU,IAAI,GACpD;AACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,sCACP,MACA,OACS;AACT,SAAO,gCAAgC,MAAM,KAAK;AACpD;AAEA,SAAS,8BACP,SAEQ;AACR,SAAO,QAAQ,SACX,QAAQ,QAAQ,MAAM,KACtB,kCAAkC,OAAO;AAC/C;AAEA,SAAS,kCACP,SACQ;AACR,SAAO,YAAY,QAAQ,UAAU;AACvC;AAEA,SAAS,sCAA8D;AACrE,SAAO;AAAA,IACL,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,EAC5B;AACF;AAEA,SAAS,gCAAgC,OAA+B;AACtE,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,4CACP,OAC2C;AAC3C,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,oBAAwD,CAAC;AAC/D,MAAI,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,KAAK,GAAG;AACzD,sBAAkB,QAAQ,MAAM,MAAM,KAAK;AAAA,EAC7C;AACA,MACE,OAAO,MAAM,oBAAoB,YACjC,MAAM,gBAAgB,KAAK,GAC3B;AACA,sBAAkB,kBAAkB,MAAM,gBAAgB,KAAK;AAAA,EACjE;AACA,MACE,OAAO,MAAM,qBAAqB,YAClC,MAAM,iBAAiB,KAAK,GAC5B;AACA,sBAAkB,mBAAmB,MAAM,iBAAiB,KAAK;AAAA,EACnE;AACA,MAAI,OAAO,MAAM,aAAa,WAAW;AACvC,sBAAkB,WAAW,MAAM;AAAA,EACrC;AACA,SAAO,OAAO,KAAK,iBAAiB,EAAE,SAAS,IAAI,oBAAoB;AACzE;AAEA,SAAS,sDACP,OACqD;AACrD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,SAAuD,CAAC;AAC9D,aAAW,YAAY,4BAA4B;AACjD,UAAM,YAAY;AAAA,MAChB,MAAM,QAAQ;AAAA,IAChB;AACA,QAAI,WAAW;AACb,aAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,EACF;AACA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,2DACP,OAC0D;AAC1D,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,SAA4D,CAAC;AACnE,aAAW,CAAC,kBAAkB,YAAY,KAAK,OAAO,QAAQ,KAAK,GAAG;AACpE,UAAM,gBAAgB,gCAAgC,gBAAgB;AACtE,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AACA,UAAM,YAAY,4CAA4C,YAAY;AAC1E,QAAI,WAAW;AACb,aAAO,aAAa,IAAI;AAAA,IAC1B;AAAA,EACF;AACA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,gCAAgC,OAA+B;AACtE,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAClE,KAAK,MAAM,KAAK,IAChB;AACN;AAEA,SAAS,mCAAmC,OAA+B;AACzE,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,SAAS,IACnE,KAAK,MAAM,KAAK,IAChB;AACN;AAEA,SAAS,uBACP,MACA,OACS;AACT,UACG,MAAM,SAAS,WAAW,OAAO,SAAS,UAC1C,MAAM,oBAAoB,WAAW,OAAO,oBAAoB,UAChE,MAAM,YAAY,WAAW,OAAO,YAAY,UAChD,MAAM,mBAAmB,WAAW,OAAO,mBAAmB;AAEnE;AAEA,SAAS,iCACP,MACA,OACS;AACT,aAAW,YAAY,4BAA4B;AACjD,QAAI,CAAC,uBAAuB,OAAO,QAAQ,GAAG,QAAQ,QAAQ,CAAC,GAAG;AAChE,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sCACP,MACA,OACS;AACT,QAAM,WAAW,OAAO,KAAK,QAAQ,CAAC,CAAC,EAAE,KAAK;AAC9C,QAAM,YAAY,OAAO,KAAK,SAAS,CAAC,CAAC,EAAE,KAAK;AAChD,MAAI,SAAS,WAAW,UAAU,QAAQ;AACxC,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAAA,IACd,CAAC,KAAK,UACJ,QAAQ,UAAU,KAAK,KACvB,uBAAuB,OAAO,GAAG,GAAG,QAAQ,GAAG,CAAC;AAAA,EACpD;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;","names":[]}