@tutti-os/agent-gui 0.0.73 → 0.0.75

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 (95) hide show
  1. package/README.md +23 -2
  2. package/dist/agent-conversation/index.d.ts +5 -5
  3. package/dist/agent-conversation/index.js +8 -8
  4. package/dist/agent-message-center/index.d.ts +2 -2
  5. package/dist/agent-message-center/index.js +170 -12
  6. package/dist/agent-message-center/index.js.map +1 -1
  7. package/dist/{agentConversationVM-DPAgUJlR.d.ts → agentConversationVM-BgoqFyE9.d.ts} +1 -1
  8. package/dist/{agentGuiNodeTypes-aJ3AX7u2.d.ts → agentGuiNodeTypes-CmuJ7VDZ.d.ts} +17 -6
  9. package/dist/app/renderer/agentactivity.css +58 -33
  10. package/dist/app/renderer/assets/icons/agents/cursor-colorful.png +0 -0
  11. package/dist/app/renderer/assets/icons/agents/opencode-rounded.png +0 -0
  12. package/dist/app/renderer/assets/icons/agents/provider-rail-opencode-colorful.png +0 -0
  13. package/dist/{chunk-IVIXKAEH.js → chunk-3FYA2K4P.js} +76 -7
  14. package/dist/chunk-3FYA2K4P.js.map +1 -0
  15. package/dist/{chunk-4US2YHBY.js → chunk-4HP6V2YA.js} +16 -4
  16. package/dist/chunk-4HP6V2YA.js.map +1 -0
  17. package/dist/{chunk-G6BVEY7I.js → chunk-4TNM6ZEC.js} +3 -114
  18. package/dist/chunk-4TNM6ZEC.js.map +1 -0
  19. package/dist/{chunk-3PKRGSMH.js → chunk-52GTPN7X.js} +4 -23
  20. package/dist/chunk-52GTPN7X.js.map +1 -0
  21. package/dist/{chunk-OBJRIQPX.js → chunk-7GSBP5CN.js} +68 -34
  22. package/dist/chunk-7GSBP5CN.js.map +1 -0
  23. package/dist/{chunk-2I2WRI4F.js → chunk-BEM3KDOJ.js} +3 -4
  24. package/dist/chunk-BEM3KDOJ.js.map +1 -0
  25. package/dist/{chunk-ATEZXUHK.js → chunk-BT2DT2P7.js} +1 -1
  26. package/dist/chunk-BT2DT2P7.js.map +1 -0
  27. package/dist/{chunk-SVGIWXNK.js → chunk-GZX2SGAG.js} +2 -2
  28. package/dist/{chunk-KWQ4N4IZ.js → chunk-KELYWKTC.js} +28 -6
  29. package/dist/chunk-KELYWKTC.js.map +1 -0
  30. package/dist/{chunk-UAAXRSW2.js → chunk-L2ZMLLYL.js} +14 -7
  31. package/dist/chunk-L2ZMLLYL.js.map +1 -0
  32. package/dist/{chunk-5H6NINJY.js → chunk-M6FZ2YIR.js} +3 -8
  33. package/dist/chunk-M6FZ2YIR.js.map +1 -0
  34. package/dist/{chunk-XZF4QNT4.js → chunk-MNESUMOS.js} +2 -2
  35. package/dist/{chunk-466AWJTS.js → chunk-QDKD6RNC.js} +15 -6
  36. package/dist/{chunk-466AWJTS.js.map → chunk-QDKD6RNC.js.map} +1 -1
  37. package/dist/{chunk-GDFQXJMG.js → chunk-RIRFNGPB.js} +7 -7
  38. package/dist/chunk-RIRFNGPB.js.map +1 -0
  39. package/dist/{chunk-4I2VCAMW.js → chunk-SYWMKIRW.js} +4 -11
  40. package/dist/chunk-SYWMKIRW.js.map +1 -0
  41. package/dist/{chunk-SZF52NMJ.js → chunk-U6AZ3XQS.js} +38 -13
  42. package/dist/chunk-U6AZ3XQS.js.map +1 -0
  43. package/dist/{chunk-Q6AWM3RH.js → chunk-U6EDUTUO.js} +4 -4
  44. package/dist/{chunk-MYD37I32.js → chunk-VAKFNNKT.js} +1 -15
  45. package/dist/chunk-VAKFNNKT.js.map +1 -0
  46. package/dist/{chunk-BHNJN2TR.js → chunk-XW4CVBUH.js} +2 -5
  47. package/dist/chunk-XW4CVBUH.js.map +1 -0
  48. package/dist/{chunk-C7K3EFGI.js → chunk-YWQHNFYA.js} +2 -2
  49. package/dist/context-mention-palette/index.js +9 -9
  50. package/dist/i18n/index.d.ts +2 -110
  51. package/dist/i18n/index.js +2 -2
  52. package/dist/index.d.ts +86 -10
  53. package/dist/index.js +1284 -667
  54. package/dist/index.js.map +1 -1
  55. package/dist/plan-decision-ops.d.ts +2 -2
  56. package/dist/queued-prompt-runtime.d.ts +4 -6
  57. package/dist/queued-prompt-runtime.js +1 -1
  58. package/dist/{types-CrwMqBm1.d.ts → types-DUHHejs2.d.ts} +3 -3
  59. package/dist/workbench/contribution.d.ts +1 -1
  60. package/dist/workbench/contribution.js +6 -6
  61. package/dist/workbench/index.d.ts +1 -1
  62. package/dist/workbench/index.js +9 -9
  63. package/dist/workbench/launch.d.ts +2 -2
  64. package/dist/workbench/launch.js +3 -3
  65. package/dist/workbench/providerCatalog.d.ts +3 -3
  66. package/dist/workbench/providerCatalog.js +1 -1
  67. package/dist/workbench/sessionTitle.d.ts +1 -1
  68. package/dist/workbench/sessionTitle.js +3 -3
  69. package/dist/workbench/state.d.ts +1 -1
  70. package/dist/workbench/state.js +2 -2
  71. package/dist/workbench/types.d.ts +2 -2
  72. package/dist/workbench/types.js +1 -1
  73. package/dist/workspace-agent-generated-files.d.ts +1 -1
  74. package/dist/workspace-agent-generated-files.js +4 -4
  75. package/dist/{workspaceAgentActivityListViewModel-DJvAqZso.d.ts → workspaceAgentActivityListViewModel-TXH1VXrk.d.ts} +0 -10
  76. package/package.json +12 -12
  77. package/dist/chunk-2I2WRI4F.js.map +0 -1
  78. package/dist/chunk-3PKRGSMH.js.map +0 -1
  79. package/dist/chunk-4I2VCAMW.js.map +0 -1
  80. package/dist/chunk-4US2YHBY.js.map +0 -1
  81. package/dist/chunk-5H6NINJY.js.map +0 -1
  82. package/dist/chunk-ATEZXUHK.js.map +0 -1
  83. package/dist/chunk-BHNJN2TR.js.map +0 -1
  84. package/dist/chunk-G6BVEY7I.js.map +0 -1
  85. package/dist/chunk-GDFQXJMG.js.map +0 -1
  86. package/dist/chunk-IVIXKAEH.js.map +0 -1
  87. package/dist/chunk-KWQ4N4IZ.js.map +0 -1
  88. package/dist/chunk-MYD37I32.js.map +0 -1
  89. package/dist/chunk-OBJRIQPX.js.map +0 -1
  90. package/dist/chunk-SZF52NMJ.js.map +0 -1
  91. package/dist/chunk-UAAXRSW2.js.map +0 -1
  92. /package/dist/{chunk-SVGIWXNK.js.map → chunk-GZX2SGAG.js.map} +0 -0
  93. /package/dist/{chunk-XZF4QNT4.js.map → chunk-MNESUMOS.js.map} +0 -0
  94. /package/dist/{chunk-Q6AWM3RH.js.map → chunk-U6EDUTUO.js.map} +0 -0
  95. /package/dist/{chunk-C7K3EFGI.js.map → chunk-YWQHNFYA.js.map} +0 -0
package/README.md CHANGED
@@ -25,6 +25,23 @@ Runtime-owned data includes:
25
25
  - provider/session preparation hooks that directly gate activity flow, such as
26
26
  OpenClaw gateway warmup
27
27
 
28
+ Runtime-owned capability declarations are optional and default to enabled:
29
+
30
+ - `canCancel`: shows and enables Stop/cancel controls.
31
+ - `canSubmitInteractive`: shows approval, ask-user, and plan-decision
32
+ interaction entries.
33
+ - `canGoalControl`: shows goal banner controls, `/goal`, and the goal badge.
34
+ - `canUploadAttachment`: enables prompt attachment upload paths such as pasted
35
+ images, pasted large text, and dropped or host-local files. Ordinary `@`
36
+ references and workspace-reference mentions remain available.
37
+
38
+ If `reportDiagnostic` is omitted, non-production development builds emit AgentGUI
39
+ diagnostics to `console` by default for message page requests/resolutions,
40
+ render-state changes, and caught errors. Set
41
+ `devDiagnosticConsoleSink: false` on the runtime to disable that development
42
+ fallback. Production builds stay silent unless the host provides
43
+ `reportDiagnostic`.
44
+
28
45
  `AgentHostApi` is still accepted for host capabilities that are not agent
29
46
  activity data:
30
47
 
@@ -105,5 +122,9 @@ single agent or target icons continue to come from `providerTargets[].iconUrl`.
105
122
 
106
123
  Hosts that need custom main-pane presentation for a disabled selected target may
107
124
  pass `renderProviderUnavailableState`. AgentGUI calls this renderer only when
108
- the selected `providerTargets[]` entry has `disabled: true`; install, login,
109
- checking, and retry readiness gates keep the built-in AgentGUI flows.
125
+ the selected `providerTargets[]` entry has `disabled: true`.
126
+
127
+ Hosts that need custom main-pane presentation for provider readiness gates may
128
+ pass `renderProviderReadinessGateState`. AgentGUI calls this renderer for
129
+ host-projected gates such as checking, install, login, coming-soon, and
130
+ unavailable; when it is omitted, AgentGUI uses the built-in readiness pane.
@@ -2,13 +2,13 @@ import * as react from 'react';
2
2
  import { ReactNode, JSX } from 'react';
3
3
  import { W as WorkspaceLinkAction } from '../workspaceLinkActions-DS9LWqzI.js';
4
4
  import { A as AgentMessageMarkdownWorkspaceAppIcon } from '../AgentMessageMarkdown-DeYPURtF.js';
5
- import { c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-DPAgUJlR.js';
6
- export { B as BuildWorkspaceAgentSessionDetailInput, d as buildWorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-DPAgUJlR.js';
7
- import { e as AgentGUIProviderSkillOption } from '../agentGuiNodeTypes-aJ3AX7u2.js';
8
- export { W as WorkspaceAgentActivityCard, n as WorkspaceAgentActivitySession, q as WorkspaceAgentActivityTimelineItem } from '../workspaceAgentActivityListViewModel-DJvAqZso.js';
5
+ import { c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-BgoqFyE9.js';
6
+ export { B as BuildWorkspaceAgentSessionDetailInput, d as buildWorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-BgoqFyE9.js';
7
+ import { e as AgentGUIProviderSkillOption } from '../agentGuiNodeTypes-CmuJ7VDZ.js';
8
+ export { W as WorkspaceAgentActivityCard, n as WorkspaceAgentActivitySession, q as WorkspaceAgentActivityTimelineItem } from '../workspaceAgentActivityListViewModel-TXH1VXrk.js';
9
9
  import '@tutti-os/workspace-issue-manager/core';
10
10
  import '@tutti-os/agent-activity-core';
11
- import '../types-CrwMqBm1.js';
11
+ import '../types-DUHHejs2.js';
12
12
  import '@tutti-os/workspace-user-project/contracts';
13
13
 
14
14
  interface AgentConversationFlowProps {
@@ -6,20 +6,20 @@ import {
6
6
  projectAgentConversationVM,
7
7
  reconcileProjectedAgentConversationVM,
8
8
  useProjectedAgentConversation
9
- } from "../chunk-OBJRIQPX.js";
10
- import "../chunk-IVIXKAEH.js";
9
+ } from "../chunk-7GSBP5CN.js";
10
+ import "../chunk-3FYA2K4P.js";
11
11
  import "../chunk-PSLAWU25.js";
12
- import "../chunk-KWQ4N4IZ.js";
12
+ import "../chunk-KELYWKTC.js";
13
13
  import "../chunk-Y35GDLP2.js";
14
14
  import "../chunk-LUGELG5V.js";
15
- import "../chunk-GDFQXJMG.js";
16
- import "../chunk-4US2YHBY.js";
15
+ import "../chunk-RIRFNGPB.js";
16
+ import "../chunk-4HP6V2YA.js";
17
17
  import {
18
18
  translate
19
- } from "../chunk-C7K3EFGI.js";
19
+ } from "../chunk-YWQHNFYA.js";
20
20
  import "../chunk-PJP5BUU6.js";
21
- import "../chunk-4I2VCAMW.js";
22
- import "../chunk-G6BVEY7I.js";
21
+ import "../chunk-SYWMKIRW.js";
22
+ import "../chunk-4TNM6ZEC.js";
23
23
 
24
24
  // shared/WorkspaceAgentSessionDetail.tsx
25
25
  import { useMemo } from "react";
@@ -4,8 +4,8 @@ import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
4
4
  import { TranslateFn, useTranslation, AgentGuiI18nLocale } from '../i18n/index.js';
5
5
  import { W as WorkspaceLinkAction } from '../workspaceLinkActions-DS9LWqzI.js';
6
6
  import { AgentActivityNeedsAttentionItem, AgentActivitySnapshot } from '@tutti-os/agent-activity-core';
7
- import { b as AgentConversationPromptVM } from '../agentConversationVM-DPAgUJlR.js';
8
- import { o as WorkspaceAgentActivityStatus } from '../workspaceAgentActivityListViewModel-DJvAqZso.js';
7
+ import { b as AgentConversationPromptVM } from '../agentConversationVM-BgoqFyE9.js';
8
+ import { o as WorkspaceAgentActivityStatus } from '../workspaceAgentActivityListViewModel-TXH1VXrk.js';
9
9
  export { PLAN_IMPLEMENTATION_ACTION_IMPLEMENT, PLAN_IMPLEMENTATION_PROMPT } from '../plan-decision-ops.js';
10
10
  import '@tutti-os/workspace-issue-manager/core';
11
11
 
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  formatAgentGuiConversationPlainTitle
3
- } from "../chunk-XZF4QNT4.js";
3
+ } from "../chunk-MNESUMOS.js";
4
4
  import {
5
5
  AgentInteractivePromptSurface,
6
6
  approvalOptionDisplayLabel,
7
7
  getPromptToolDetails,
8
8
  isPromptRequestIdTitle
9
- } from "../chunk-Q6AWM3RH.js";
9
+ } from "../chunk-U6EDUTUO.js";
10
10
  import {
11
11
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
12
12
  PLAN_IMPLEMENTATION_PROMPT,
@@ -15,7 +15,7 @@ import {
15
15
  } from "../chunk-MKHDRIGN.js";
16
16
  import {
17
17
  formatAgentSessionMentionText
18
- } from "../chunk-5H6NINJY.js";
18
+ } from "../chunk-M6FZ2YIR.js";
19
19
  import {
20
20
  AgentMessageMarkdown,
21
21
  CustomScrollArea,
@@ -25,28 +25,28 @@ import {
25
25
  extractExitPlanModeOptions,
26
26
  isExitPlanSwitchModeInput,
27
27
  normalizeAskUserQuestions
28
- } from "../chunk-IVIXKAEH.js";
28
+ } from "../chunk-3FYA2K4P.js";
29
29
  import {
30
30
  userAvatarPlaceholderUrl,
31
31
  workspaceAgentActivityStatusLabel
32
- } from "../chunk-SVGIWXNK.js";
32
+ } from "../chunk-GZX2SGAG.js";
33
33
  import {
34
34
  resolveWorkspaceAgentSessionSortTimeUnixMs
35
35
  } from "../chunk-IBIMGLCD.js";
36
36
  import {
37
37
  managedAgentRoundedIconUrl
38
- } from "../chunk-GDFQXJMG.js";
38
+ } from "../chunk-RIRFNGPB.js";
39
39
  import {
40
40
  workspaceAgentProviderLabel
41
- } from "../chunk-4US2YHBY.js";
41
+ } from "../chunk-4HP6V2YA.js";
42
42
  import {
43
43
  AgentGuiI18nProvider,
44
44
  getActiveUiLanguage,
45
45
  useTranslation
46
- } from "../chunk-C7K3EFGI.js";
46
+ } from "../chunk-YWQHNFYA.js";
47
47
  import "../chunk-PJP5BUU6.js";
48
- import "../chunk-4I2VCAMW.js";
49
- import "../chunk-G6BVEY7I.js";
48
+ import "../chunk-SYWMKIRW.js";
49
+ import "../chunk-4TNM6ZEC.js";
50
50
  import "../chunk-GCBDIQDX.js";
51
51
 
52
52
  // agent-message-center/WorkspaceAgentMessageCenterPanel.tsx
@@ -116,6 +116,7 @@ import {
116
116
  } from "@tutti-os/agent-activity-core";
117
117
 
118
118
  // agent-message-center/workspaceAgentMessageCenterDigest.ts
119
+ var digestAgentMessageSummaryByMessage = /* @__PURE__ */ new WeakMap();
119
120
  function buildWorkspaceAgentMessageCenterDigest(input) {
120
121
  const {
121
122
  fallbackTitle,
@@ -179,10 +180,31 @@ function buildWorkspaceAgentMessageCenterDigest(input) {
179
180
  };
180
181
  }
181
182
  function resolveWorkspaceAgentMessageCenterDigestAgentMessageSummary(message) {
183
+ const cached = digestAgentMessageSummaryByMessage.get(message);
184
+ if (cached && cached.role === message.role && cached.kind === message.kind && cached.status === message.status && cached.payload === message.payload && cached.version === message.version) {
185
+ return cached.summary;
186
+ }
182
187
  if (!isAgentMessageRole(message.role) || isReasoningMessageKind(message.kind)) {
188
+ digestAgentMessageSummaryByMessage.set(message, {
189
+ kind: message.kind,
190
+ payload: message.payload,
191
+ role: message.role,
192
+ status: message.status,
193
+ summary: "",
194
+ version: message.version
195
+ });
183
196
  return "";
184
197
  }
185
- return meaningfulMessageSummary(message);
198
+ const summary = meaningfulMessageSummary(message);
199
+ digestAgentMessageSummaryByMessage.set(message, {
200
+ kind: message.kind,
201
+ payload: message.payload,
202
+ role: message.role,
203
+ status: message.status,
204
+ summary,
205
+ version: message.version
206
+ });
207
+ return summary;
186
208
  }
187
209
  function pendingPromptSummary(prompt) {
188
210
  if (!prompt) {
@@ -607,7 +629,29 @@ function resolveSessionTitle(session, latestUserMessageSummary, firstUserMessage
607
629
  function resolveDigestFallbackTitle(session) {
608
630
  return session.title.trim() || session.provider || session.agentSessionId;
609
631
  }
632
+ var messageAnalysisByMessages = /* @__PURE__ */ new WeakMap();
633
+ var codexPlanImplementationPromptByMessages = /* @__PURE__ */ new WeakMap();
610
634
  function analyzeMessageCenterSessionMessages(agentSessionId, messages) {
635
+ let bySessionId = messageAnalysisByMessages.get(messages);
636
+ if (!bySessionId) {
637
+ bySessionId = /* @__PURE__ */ new Map();
638
+ messageAnalysisByMessages.set(messages, bySessionId);
639
+ }
640
+ const cached = bySessionId.get(agentSessionId);
641
+ if (cached && isMessageArrayCacheEntryCurrent(cached, messages)) {
642
+ return cached.result;
643
+ }
644
+ const result = analyzeMessageCenterSessionMessagesUncached(
645
+ agentSessionId,
646
+ messages
647
+ );
648
+ bySessionId.set(agentSessionId, {
649
+ messages: messageCenterMessageCacheKeys(messages),
650
+ result
651
+ });
652
+ return result;
653
+ }
654
+ function analyzeMessageCenterSessionMessagesUncached(agentSessionId, messages) {
611
655
  let firstUserMessageSummary = "";
612
656
  let latestUserMessageSummary = "";
613
657
  let latestUserMessageAtUnixMs = Number.NEGATIVE_INFINITY;
@@ -767,6 +811,24 @@ function isExitPlanMessage(message, input = recordValue2(
767
811
  return includesAny2(normalizedMetadataValues(message), ["exitplanmode"]) || isExitPlanSwitchModeInput(input);
768
812
  }
769
813
  function codexPlanImplementationPrompt(session, status, messages) {
814
+ const cached = codexPlanImplementationPromptByMessages.get(messages);
815
+ if (cached && cached.provider === session.provider && cached.status === status && isMessageArrayCacheEntryCurrent(cached, messages)) {
816
+ return cached.result;
817
+ }
818
+ const result = codexPlanImplementationPromptUncached(
819
+ session,
820
+ status,
821
+ messages
822
+ );
823
+ codexPlanImplementationPromptByMessages.set(messages, {
824
+ messages: messageCenterMessageCacheKeys(messages),
825
+ provider: session.provider,
826
+ result,
827
+ status
828
+ });
829
+ return result;
830
+ }
831
+ function codexPlanImplementationPromptUncached(session, status, messages) {
770
832
  if (session.provider.trim().toLowerCase() !== "codex") {
771
833
  return null;
772
834
  }
@@ -783,6 +845,32 @@ function codexPlanImplementationPrompt(session, status, messages) {
783
845
  const title = planMessage ? messageSummary(planMessage) : "";
784
846
  return planImplementationPromptFromPlanTurn(planTurnId, title);
785
847
  }
848
+ function isMessageArrayCacheEntryCurrent(entry, messages) {
849
+ if (entry.messages.length !== messages.length) {
850
+ return false;
851
+ }
852
+ return entry.messages.every(
853
+ (key, index) => messageCenterMessageCacheKeyMatches(key, messages[index])
854
+ );
855
+ }
856
+ function messageCenterMessageCacheKeys(messages) {
857
+ return messages.map((message) => ({
858
+ completedAtUnixMs: message.completedAtUnixMs,
859
+ kind: message.kind,
860
+ message,
861
+ messageId: message.messageId,
862
+ occurredAtUnixMs: message.occurredAtUnixMs,
863
+ payload: message.payload,
864
+ role: message.role,
865
+ startedAtUnixMs: message.startedAtUnixMs,
866
+ status: message.status,
867
+ turnId: message.turnId,
868
+ version: message.version
869
+ }));
870
+ }
871
+ function messageCenterMessageCacheKeyMatches(key, message) {
872
+ return message !== void 0 && key.message === message && key.messageId === message.messageId && key.version === message.version && key.turnId === message.turnId && key.role === message.role && key.kind === message.kind && key.status === message.status && key.payload === message.payload && key.occurredAtUnixMs === message.occurredAtUnixMs && key.startedAtUnixMs === message.startedAtUnixMs && key.completedAtUnixMs === message.completedAtUnixMs;
873
+ }
786
874
  function turnOutcomeFromMessage(agentSessionId, message) {
787
875
  const status = outcomeStatusFromMessage(message);
788
876
  if (!status) {
@@ -3451,7 +3539,77 @@ function messageCenterPromptEqual(left, right) {
3451
3539
  if (!left || !right || left.kind !== right.kind) {
3452
3540
  return false;
3453
3541
  }
3454
- return JSON.stringify(left) === JSON.stringify(right);
3542
+ switch (left.kind) {
3543
+ case "approval":
3544
+ return right.kind === "approval" && left.id === right.id && left.turnId === right.turnId && left.requestId === right.requestId && left.callId === right.callId && left.title === right.title && left.toolName === right.toolName && left.status === right.status && left.occurredAtUnixMs === right.occurredAtUnixMs && messageCenterJsonValueEqual(left.input, right.input) && messageCenterJsonValueEqual(
3545
+ left.output ?? null,
3546
+ right.output ?? null
3547
+ ) && messageCenterApprovalOptionsEqual(left.options, right.options);
3548
+ case "ask-user":
3549
+ return right.kind === "ask-user" && left.requestId === right.requestId && left.title === right.title && messageCenterAskUserQuestionsEqual(left.questions, right.questions);
3550
+ case "exit-plan":
3551
+ return right.kind === "exit-plan" && left.requestId === right.requestId && left.title === right.title && left.keepPlanningOptionId === right.keepPlanningOptionId && messageCenterApprovalOptionsEqual(left.options, right.options);
3552
+ case "plan-implementation":
3553
+ return right.kind === "plan-implementation" && left.requestId === right.requestId && left.title === right.title;
3554
+ }
3555
+ }
3556
+ function messageCenterApprovalOptionsEqual(left, right) {
3557
+ if (left.length !== right.length) {
3558
+ return false;
3559
+ }
3560
+ return left.every((option, index) => {
3561
+ const rightOption = right[index];
3562
+ return rightOption && option.id === rightOption.id && option.label === rightOption.label && option.kind === rightOption.kind && option.description === rightOption.description;
3563
+ });
3564
+ }
3565
+ function messageCenterAskUserQuestionsEqual(left, right) {
3566
+ if (left.length !== right.length) {
3567
+ return false;
3568
+ }
3569
+ return left.every((question, index) => {
3570
+ const rightQuestion = right[index];
3571
+ return rightQuestion && question.id === rightQuestion.id && question.header === rightQuestion.header && question.question === rightQuestion.question && question.multiSelect === rightQuestion.multiSelect && messageCenterAnswerEqual(
3572
+ question.answer ?? null,
3573
+ rightQuestion.answer ?? null
3574
+ ) && question.options.length === rightQuestion.options.length && question.options.every((option, optionIndex) => {
3575
+ const rightOption = rightQuestion.options[optionIndex];
3576
+ return rightOption && option.label === rightOption.label && option.description === rightOption.description;
3577
+ });
3578
+ });
3579
+ }
3580
+ function messageCenterAnswerEqual(left, right) {
3581
+ if (left === right) {
3582
+ return true;
3583
+ }
3584
+ if (!Array.isArray(left) || !Array.isArray(right)) {
3585
+ return false;
3586
+ }
3587
+ return left.length === right.length && left.every((value, index) => value === right[index]);
3588
+ }
3589
+ function messageCenterJsonValueEqual(left, right) {
3590
+ if (left === right) {
3591
+ return true;
3592
+ }
3593
+ if (!left || !right || typeof left !== "object" || typeof right !== "object") {
3594
+ return false;
3595
+ }
3596
+ if (Array.isArray(left) || Array.isArray(right)) {
3597
+ if (!Array.isArray(left) || !Array.isArray(right)) {
3598
+ return false;
3599
+ }
3600
+ return left.length === right.length && left.every(
3601
+ (value, index) => messageCenterJsonValueEqual(value, right[index])
3602
+ );
3603
+ }
3604
+ const leftRecord = left;
3605
+ const rightRecord = right;
3606
+ const leftKeys = Object.keys(leftRecord);
3607
+ if (leftKeys.length !== Object.keys(rightRecord).length) {
3608
+ return false;
3609
+ }
3610
+ return leftKeys.every(
3611
+ (key) => messageCenterJsonValueEqual(leftRecord[key], rightRecord[key])
3612
+ );
3455
3613
  }
3456
3614
  export {
3457
3615
  AgentInteractivePromptSurface,