@tutti-os/agent-gui 0.0.44 → 0.0.45

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 (47) hide show
  1. package/dist/agent-conversation/index.js +5 -4
  2. package/dist/agent-conversation/index.js.map +1 -1
  3. package/dist/agent-message-center/index.js +17 -11
  4. package/dist/agent-message-center/index.js.map +1 -1
  5. package/dist/app/renderer/agentactivity.css +99 -54
  6. package/dist/{chunk-GMLK2EFU.js → chunk-62QOR3TC.js} +4 -97
  7. package/dist/chunk-62QOR3TC.js.map +1 -0
  8. package/dist/{chunk-5UD2YEBX.js → chunk-AMNXH4DJ.js} +47 -14
  9. package/dist/{chunk-5UD2YEBX.js.map → chunk-AMNXH4DJ.js.map} +1 -1
  10. package/dist/{chunk-25VZHG6G.js → chunk-CZ7PS3DU.js} +4 -4
  11. package/dist/{chunk-ZORA4UAT.js → chunk-D6IYEVDT.js} +2 -2
  12. package/dist/chunk-EIC7XS3C.js +71 -0
  13. package/dist/chunk-EIC7XS3C.js.map +1 -0
  14. package/dist/chunk-FJG2EH4V.js +317 -0
  15. package/dist/chunk-FJG2EH4V.js.map +1 -0
  16. package/dist/{chunk-J4MU53PH.js → chunk-NZ2BGOJU.js} +2 -2
  17. package/dist/chunk-OL54R6OL.js +99 -0
  18. package/dist/chunk-OL54R6OL.js.map +1 -0
  19. package/dist/{chunk-ZTQKIJ5J.js → chunk-QT45WUPQ.js} +71 -20
  20. package/dist/chunk-QT45WUPQ.js.map +1 -0
  21. package/dist/{chunk-SF2PE7M6.js → chunk-UGV6JTWM.js} +4 -4
  22. package/dist/{chunk-IGXC7NRW.js → chunk-VFQR7AZI.js} +10 -63
  23. package/dist/chunk-VFQR7AZI.js.map +1 -0
  24. package/dist/{chunk-64OSXJRE.js → chunk-ZG3WZSMV.js} +2 -2
  25. package/dist/context-mention-palette/index.js +7 -6
  26. package/dist/i18n/index.d.ts +2 -2
  27. package/dist/i18n/index.js +2 -1
  28. package/dist/index.d.ts +1 -5
  29. package/dist/index.js +157 -232
  30. package/dist/index.js.map +1 -1
  31. package/dist/uiSettings-BQS9r2eo.d.ts +6 -0
  32. package/dist/workbench/contribution.js +1 -1
  33. package/dist/workbench/index.d.ts +3 -0
  34. package/dist/workbench/index.js +13 -2
  35. package/dist/workbench/sessionTitle.d.ts +28 -0
  36. package/dist/workbench/sessionTitle.js +14 -0
  37. package/dist/workbench/sessionTitle.js.map +1 -0
  38. package/dist/workspace-agent-generated-files.js +3 -2
  39. package/package.json +19 -12
  40. package/dist/chunk-GMLK2EFU.js.map +0 -1
  41. package/dist/chunk-IGXC7NRW.js.map +0 -1
  42. package/dist/chunk-ZTQKIJ5J.js.map +0 -1
  43. /package/dist/{chunk-25VZHG6G.js.map → chunk-CZ7PS3DU.js.map} +0 -0
  44. /package/dist/{chunk-ZORA4UAT.js.map → chunk-D6IYEVDT.js.map} +0 -0
  45. /package/dist/{chunk-J4MU53PH.js.map → chunk-NZ2BGOJU.js.map} +0 -0
  46. /package/dist/{chunk-SF2PE7M6.js.map → chunk-UGV6JTWM.js.map} +0 -0
  47. /package/dist/{chunk-64OSXJRE.js.map → chunk-ZG3WZSMV.js.map} +0 -0
@@ -101,20 +101,15 @@
101
101
  top: max(20px, calc(var(--cove-titlebar-reserve, 0px) + 10px));
102
102
  right: 20px;
103
103
  inset-inline-end: 20px;
104
- background: color-mix(in srgb, var(--background-panel) 78%, black 22%);
105
- box-shadow:
106
- 0 18px 40px color-mix(in srgb, black 26%, transparent),
107
- 0 0 0 1px color-mix(in srgb, white 12%, transparent);
108
- color: var(--text-primary);
109
104
  }
110
105
 
111
106
  .tsh-zoom-dialog__image-actions {
112
107
  position: fixed;
113
108
  top: max(20px, calc(var(--cove-titlebar-reserve, 0px) + 10px));
114
- right: 72px;
109
+ right: 58px;
115
110
  z-index: 100301;
116
111
  display: flex;
117
- gap: 8px;
112
+ gap: 6px;
118
113
  }
119
114
 
120
115
  .tsh-image-context-menu {
@@ -131,7 +126,6 @@
131
126
  -webkit-app-region: no-drag;
132
127
  }
133
128
 
134
- .tsh-zoom-dialog__image-actions button,
135
129
  .tsh-image-context-menu button {
136
130
  display: flex;
137
131
  align-items: center;
@@ -146,23 +140,17 @@
146
140
  line-height: 20px;
147
141
  }
148
142
 
143
+ .tsh-zoom-dialog__icon-button,
149
144
  .tsh-zoom-dialog__image-actions button {
150
145
  justify-content: center;
151
- width: 40px;
152
- height: 40px;
153
- background: color-mix(in srgb, var(--background-panel) 78%, black 22%);
146
+ width: 32px;
147
+ height: 32px;
148
+ border-radius: 6px;
149
+ background: var(--background-fronted);
154
150
  box-shadow:
155
151
  0 18px 40px color-mix(in srgb, black 26%, transparent),
156
152
  0 0 0 1px color-mix(in srgb, white 12%, transparent);
157
- }
158
-
159
- .tsh-zoom-dialog__image-actions button span {
160
- position: absolute;
161
- width: 1px;
162
- height: 1px;
163
- overflow: hidden;
164
- clip: rect(0 0 0 0);
165
- white-space: nowrap;
153
+ color: var(--text-primary);
166
154
  }
167
155
 
168
156
  .tsh-image-context-menu button {
@@ -170,6 +158,7 @@
170
158
  padding: 7px 10px;
171
159
  }
172
160
 
161
+ .tsh-zoom-dialog__icon-button:hover,
173
162
  .tsh-zoom-dialog__image-actions button:hover,
174
163
  .tsh-image-context-menu button:hover {
175
164
  background: color-mix(in srgb, var(--background-panel) 82%, white 12%);
@@ -3897,9 +3886,15 @@ aside.workspace-agents-status-panel
3897
3886
  --agent-conversation-text: var(--text-primary);
3898
3887
  --agent-conversation-user-text: var(--text-primary);
3899
3888
  --agent-conversation-user-bg: var(--agent-gui-surface-muted);
3900
- --agent-gui-background-1: var(--background-1, rgb(245 245 245));
3901
- --agent-gui-detail-padding-x: 28px;
3902
- --agent-gui-detail-flow-max-width: 1280px;
3889
+ --agent-gui-session-flow-background: var(
3890
+ --background-session-flow,
3891
+ rgb(252 253 255)
3892
+ );
3893
+ --agent-gui-session-sidepanel-background: var(
3894
+ --background-session-sidepanel,
3895
+ rgb(244 245 247)
3896
+ );
3897
+ --agent-gui-detail-padding-x: 32px;
3903
3898
  width: 100%;
3904
3899
  height: 100%;
3905
3900
  container: agent-gui-node / inline-size;
@@ -3908,12 +3903,26 @@ aside.workspace-agents-status-panel
3908
3903
  }
3909
3904
 
3910
3905
  :root[data-theme="dark"] .agent-gui-node__shell {
3911
- --agent-gui-background-1: var(--background-1, rgb(24 24 24));
3906
+ --agent-gui-session-flow-background: var(
3907
+ --background-session-flow,
3908
+ rgb(24 24 24)
3909
+ );
3910
+ --agent-gui-session-sidepanel-background: var(
3911
+ --background-session-sidepanel,
3912
+ rgb(42 42 43)
3913
+ );
3912
3914
  }
3913
3915
 
3914
3916
  @media (prefers-color-scheme: dark) {
3915
3917
  :root:not([data-theme="light"]) .agent-gui-node__shell {
3916
- --agent-gui-background-1: var(--background-1, rgb(24 24 24));
3918
+ --agent-gui-session-flow-background: var(
3919
+ --background-session-flow,
3920
+ rgb(24 24 24)
3921
+ );
3922
+ --agent-gui-session-sidepanel-background: var(
3923
+ --background-session-sidepanel,
3924
+ rgb(42 42 43)
3925
+ );
3917
3926
  }
3918
3927
  }
3919
3928
 
@@ -3934,8 +3943,8 @@ aside.workspace-agents-status-panel
3934
3943
  min-height: 0;
3935
3944
  min-width: 0;
3936
3945
  overflow: hidden;
3937
- background: transparent;
3938
- transition: grid-template-columns 100ms cubic-bezier(0.2, 0, 0, 1);
3946
+ background: var(--agent-gui-session-sidepanel-background);
3947
+ transition: grid-template-columns 180ms cubic-bezier(0.22, 1, 0.36, 1);
3939
3948
  }
3940
3949
 
3941
3950
  .agent-gui-node__layout[data-rail-resizing="true"] {
@@ -4009,7 +4018,7 @@ aside.workspace-agents-status-panel
4009
4018
  --agent-gui-workbench-header-traffic-light-hit-area-size: 20px;
4010
4019
  --agent-gui-workbench-header-traffic-light-gap: 8px;
4011
4020
  --agent-gui-workbench-header-traffic-light-size: 12px;
4012
- --agent-gui-workbench-header-title-max-width: 280px;
4021
+ --agent-gui-workbench-header-title-max-width: calc(100% - 32px);
4013
4022
  --agent-gui-workbench-header-text: var(--text-primary);
4014
4023
  --agent-gui-workbench-header-muted: var(--text-secondary);
4015
4024
 
@@ -4025,6 +4034,7 @@ aside.workspace-agents-status-panel
4025
4034
  color: var(--agent-gui-workbench-header-text);
4026
4035
  cursor: grab;
4027
4036
  pointer-events: auto;
4037
+ transition: grid-template-columns 180ms cubic-bezier(0.22, 1, 0.36, 1);
4028
4038
  user-select: none;
4029
4039
  }
4030
4040
 
@@ -4045,7 +4055,7 @@ aside.workspace-agents-status-panel
4045
4055
  align-items: center;
4046
4056
  gap: var(--agent-gui-workbench-header-primary-gap);
4047
4057
  padding: 0 var(--agent-gui-workbench-header-padding-x);
4048
- background: var(--background-panel);
4058
+ background: var(--agent-gui-session-sidepanel-background);
4049
4059
  pointer-events: auto;
4050
4060
  }
4051
4061
 
@@ -4100,24 +4110,54 @@ aside.workspace-agents-status-panel
4100
4110
  transition: background-color 160ms ease;
4101
4111
  }
4102
4112
 
4103
- .agent-gui-workbench-header__traffic-light:hover,
4104
- .agent-gui-workbench-header__traffic-light:focus-visible {
4113
+ .agent-gui-workbench-header__traffic-light-icon {
4114
+ position: absolute;
4115
+ z-index: 1;
4116
+ inset: 5px;
4117
+ width: 10px;
4118
+ height: 10px;
4119
+ color: color-mix(in srgb, #000 68%, transparent);
4120
+ opacity: 0;
4121
+ pointer-events: none;
4122
+ transition: opacity 120ms ease;
4123
+ }
4124
+
4125
+ .agent-gui-workbench-header__traffic-lights:hover
4126
+ .agent-gui-workbench-header__traffic-light,
4127
+ .agent-gui-workbench-header__traffic-lights:focus-within
4128
+ .agent-gui-workbench-header__traffic-light {
4105
4129
  opacity: 1;
4130
+ }
4131
+
4132
+ .agent-gui-workbench-header__traffic-light:focus-visible {
4106
4133
  outline: none;
4107
4134
  }
4108
4135
 
4109
- .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="close"]:hover::before,
4110
- .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="close"]:focus-visible::before {
4136
+ .agent-gui-workbench-header__traffic-lights:hover
4137
+ .agent-gui-workbench-header__traffic-light-icon,
4138
+ .agent-gui-workbench-header__traffic-lights:focus-within
4139
+ .agent-gui-workbench-header__traffic-light-icon {
4140
+ opacity: 1;
4141
+ }
4142
+
4143
+ .agent-gui-workbench-header__traffic-lights:hover
4144
+ .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="close"]::before,
4145
+ .agent-gui-workbench-header__traffic-lights:focus-within
4146
+ .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="close"]::before {
4111
4147
  background-color: #ff5f57;
4112
4148
  }
4113
4149
 
4114
- .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="minimize"]:hover::before,
4115
- .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="minimize"]:focus-visible::before {
4150
+ .agent-gui-workbench-header__traffic-lights:hover
4151
+ .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="minimize"]::before,
4152
+ .agent-gui-workbench-header__traffic-lights:focus-within
4153
+ .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="minimize"]::before {
4116
4154
  background-color: #ffbd2e;
4117
4155
  }
4118
4156
 
4119
- .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="maximize"]:hover::before,
4120
- .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="maximize"]:focus-visible::before {
4157
+ .agent-gui-workbench-header__traffic-lights:hover
4158
+ .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="maximize"]::before,
4159
+ .agent-gui-workbench-header__traffic-lights:focus-within
4160
+ .agent-gui-workbench-header__traffic-light[data-agent-gui-workbench-traffic-light="maximize"]::before {
4121
4161
  background-color: #28c840;
4122
4162
  }
4123
4163
 
@@ -4249,8 +4289,8 @@ aside.workspace-agents-status-panel
4249
4289
  touch-action: none;
4250
4290
  opacity: 1;
4251
4291
  transition:
4252
- left 100ms cubic-bezier(0.2, 0, 0, 1),
4253
- opacity 80ms ease;
4292
+ left 180ms cubic-bezier(0.22, 1, 0.36, 1),
4293
+ opacity 120ms ease;
4254
4294
  }
4255
4295
 
4256
4296
  .agent-gui-node__rail-resize-handle[data-resizing="true"] {
@@ -4291,7 +4331,7 @@ aside.workspace-agents-status-panel
4291
4331
  flex-direction: column;
4292
4332
  overflow: hidden;
4293
4333
  border-radius: 16px;
4294
- background: var(--agent-gui-background-1);
4334
+ background: var(--agent-gui-session-flow-background);
4295
4335
  }
4296
4336
 
4297
4337
  .agent-gui-node__detail-panel > .agent-gui-node__detail {
@@ -4307,15 +4347,16 @@ aside.workspace-agents-status-panel
4307
4347
  height: 100%;
4308
4348
  min-width: 0;
4309
4349
  min-height: 0;
4310
- background: transparent;
4350
+ background: var(--agent-gui-session-sidepanel-background);
4311
4351
  box-shadow: none;
4312
4352
  opacity: 1;
4313
4353
  }
4314
4354
 
4315
4355
  .agent-gui-node__rail > * {
4316
4356
  transition:
4317
- opacity 80ms ease,
4318
- filter 80ms ease;
4357
+ opacity 120ms ease,
4358
+ filter 120ms ease;
4359
+ transition-delay: 40ms;
4319
4360
  }
4320
4361
 
4321
4362
  .agent-gui-node__rail::after {
@@ -4324,9 +4365,13 @@ aside.workspace-agents-status-panel
4324
4365
  position: absolute;
4325
4366
  inset: 0;
4326
4367
  z-index: 1;
4327
- background: color-mix(in srgb, var(--node-surface) 88%, transparent);
4368
+ background: color-mix(
4369
+ in srgb,
4370
+ var(--agent-gui-session-sidepanel-background) 88%,
4371
+ transparent
4372
+ );
4328
4373
  opacity: 0;
4329
- transition: opacity 80ms ease;
4374
+ transition: opacity 120ms ease;
4330
4375
  }
4331
4376
 
4332
4377
  .agent-gui-node__rail-panel--collapsed .agent-gui-node__rail {
@@ -4346,6 +4391,7 @@ aside.workspace-agents-status-panel
4346
4391
 
4347
4392
  @media (prefers-reduced-motion: reduce) {
4348
4393
  .agent-gui-node__layout,
4394
+ .agent-gui-workbench-header,
4349
4395
  .agent-gui-node__rail-resize-handle,
4350
4396
  .agent-gui-node__rail > *,
4351
4397
  .agent-gui-node__rail::after {
@@ -5553,6 +5599,9 @@ button.agent-gui-node__conversation-section-toggle:hover
5553
5599
  scroll-padding-bottom: calc(
5554
5600
  120px + var(--agent-gui-bottom-dock-safe-area, 0px)
5555
5601
  );
5602
+ }
5603
+
5604
+ .agent-gui-node__timeline-with-composer.agent-gui-node__timeline--scrolled-from-top {
5556
5605
  -webkit-mask-image: linear-gradient(
5557
5606
  180deg,
5558
5607
  transparent 0,
@@ -5670,13 +5719,7 @@ button.agent-gui-node__conversation-section-toggle:hover
5670
5719
  gap: 0;
5671
5720
  margin-right: auto;
5672
5721
  margin-left: auto;
5673
- width: min(
5674
- 100%,
5675
- calc(
5676
- var(--agent-gui-detail-flow-max-width) +
5677
- var(--agent-gui-detail-padding-x) + var(--agent-gui-detail-padding-x)
5678
- )
5679
- );
5722
+ width: 100%;
5680
5723
  margin-top: auto;
5681
5724
  padding-top: 0;
5682
5725
  background: transparent;
@@ -5785,7 +5828,9 @@ button.agent-gui-node__conversation-section-toggle:hover
5785
5828
 
5786
5829
  .agent-gui-node__detail-header-title-group {
5787
5830
  display: flex;
5831
+ flex: 1 1 auto;
5788
5832
  min-width: 0;
5833
+ max-width: 100%;
5789
5834
  align-items: center;
5790
5835
  gap: 6px;
5791
5836
  }
@@ -6164,7 +6209,7 @@ button.agent-gui-node__conversation-section-toggle:hover
6164
6209
  align-items: center;
6165
6210
  overflow: hidden;
6166
6211
  padding: 0 12px;
6167
- border: 1px solid var(--agent-gui-border-subtle);
6212
+ border: 1px solid var(--line-2);
6168
6213
  border-radius: 10px;
6169
6214
  background: var(--agent-gui-surface-raised);
6170
6215
  box-shadow: 0 8px 24px rgb(0 0 0 / 4%);
@@ -6178,7 +6223,7 @@ button.agent-gui-node__conversation-section-toggle:hover
6178
6223
  .agent-gui-node__composer-prompt-input-area:focus-within,
6179
6224
  .agent-gui-node__composer[data-layout="dock"]
6180
6225
  .agent-gui-node__composer-prompt-input-area:hover {
6181
- border-color: var(--agent-gui-border-subtle);
6226
+ border-color: var(--line-2);
6182
6227
  box-shadow: 0 8px 24px rgb(0 0 0 / 6%);
6183
6228
  }
6184
6229
 
@@ -7,20 +7,17 @@ import {
7
7
  AgentGUIConversation_styles_default,
8
8
  MessageSquareMoreIcon,
9
9
  extractAgentMcpToolTarget
10
- } from "./chunk-ZTQKIJ5J.js";
10
+ } from "./chunk-QT45WUPQ.js";
11
11
  import {
12
12
  Spinner
13
- } from "./chunk-J4MU53PH.js";
13
+ } from "./chunk-NZ2BGOJU.js";
14
14
  import {
15
15
  getOptionalAgentHostApi,
16
16
  useOptionalAgentHostApi
17
17
  } from "./chunk-TXXWUG2J.js";
18
- import {
19
- normalizeAgentTitleText
20
- } from "./chunk-GCBDIQDX.js";
21
18
  import {
22
19
  translate
23
- } from "./chunk-IGXC7NRW.js";
20
+ } from "./chunk-EIC7XS3C.js";
24
21
 
25
22
  // shared/agentConversation/approvalOptionPresentation.ts
26
23
  function approvalOptionDisplayLabel(option, intent = {}) {
@@ -1117,100 +1114,10 @@ function interactiveOptionLabel(label, description) {
1117
1114
  return trimmedDescription ? `${label} ${trimmedDescription}` : label;
1118
1115
  }
1119
1116
 
1120
- // shared/utils/agentSessionMentionText.ts
1121
- import {
1122
- isRichTextMentionHref,
1123
- parseRichTextMentionHref
1124
- } from "@tutti-os/ui-rich-text/core";
1125
- var MARKDOWN_LINK_PATTERN = /\[((?:\\.|[^\]\\])*)\]\(([^)\s]+)\)/g;
1126
- var MARKDOWN_LABEL_ESCAPE_PATTERN = /\\([\\[\]()])/g;
1127
- var SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE = {
1128
- "zh-CN": "@\u4F1A\u8BDD \xB7 ",
1129
- en: "@session \xB7 "
1130
- };
1131
- var PLAIN_SESSION_AGENT_LABELS = [
1132
- "Claude Code",
1133
- "Gemini CLI",
1134
- "Hermes Agent",
1135
- "OpenClaw",
1136
- "Nexight",
1137
- "Gemini",
1138
- "Hermes",
1139
- "Codex"
1140
- ];
1141
- function formatAgentSessionMentionText(value, options = {}) {
1142
- const trimmed = value?.trim() ?? "";
1143
- if (!trimmed) {
1144
- return "";
1145
- }
1146
- const sessionMentionDisplayPrefix = sessionMentionDisplayPrefixForLanguage(
1147
- options.language
1148
- );
1149
- const withSessionMentionsNormalized = trimmed.replace(
1150
- MARKDOWN_LINK_PATTERN,
1151
- (fullMatch, rawLabel, href) => {
1152
- const label = unescapeMarkdownLabel(rawLabel);
1153
- const mention = parseRichTextMentionHref(href, label);
1154
- if (!mention) {
1155
- return isRichTextMentionHref(href) ? label : fullMatch;
1156
- }
1157
- const providerId = mention.providerId.trim().toLowerCase();
1158
- const displayLabel = label || mention.label;
1159
- if (providerId === "agent-session") {
1160
- return formatSessionLabel(displayLabel, sessionMentionDisplayPrefix);
1161
- }
1162
- if (providerId === "workspace-issue") {
1163
- return formatIssueLabel(displayLabel);
1164
- }
1165
- return displayLabel;
1166
- }
1167
- );
1168
- const normalized = normalizeAgentTitleText(withSessionMentionsNormalized);
1169
- if (isPlainSessionMentionText(normalized, sessionMentionDisplayPrefix)) {
1170
- return formatSessionLabel(normalized, sessionMentionDisplayPrefix);
1171
- }
1172
- return normalized;
1173
- }
1174
- function isPlainSessionMentionText(value, sessionMentionDisplayPrefix) {
1175
- const trimmed = value.trim();
1176
- if (!trimmed.startsWith("@") || trimmed.startsWith(sessionMentionDisplayPrefix)) {
1177
- return false;
1178
- }
1179
- return PLAIN_SESSION_AGENT_LABELS.some((agentLabel) => {
1180
- const ampersandSeparator = ` & ${agentLabel}`;
1181
- const ampersandIndex = trimmed.indexOf(ampersandSeparator);
1182
- if (ampersandIndex > 1) {
1183
- const trailing = trimmed.slice(
1184
- ampersandIndex + ampersandSeparator.length
1185
- );
1186
- if (trailing === "" || trailing.startsWith(" ")) {
1187
- return true;
1188
- }
1189
- }
1190
- const dottedSeparator = ` \xB7 ${agentLabel} \xB7 `;
1191
- return trimmed.indexOf(dottedSeparator) > 1;
1192
- });
1193
- }
1194
- function sessionMentionDisplayPrefixForLanguage(language) {
1195
- return SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE[language ?? "en"];
1196
- }
1197
- function formatSessionLabel(label, sessionMentionDisplayPrefix) {
1198
- const normalizedLabel = label.trim().replace(/^@+/, "").trim();
1199
- return normalizedLabel ? `${sessionMentionDisplayPrefix}${normalizedLabel}` : label.trim();
1200
- }
1201
- function formatIssueLabel(label) {
1202
- const normalizedLabel = label.trim().replace(/^@+/, "").trim();
1203
- return normalizedLabel ? `@Task \xB7 ${normalizedLabel}` : label.trim();
1204
- }
1205
- function unescapeMarkdownLabel(label) {
1206
- return label.replace(MARKDOWN_LABEL_ESCAPE_PATTERN, "$1");
1207
- }
1208
-
1209
1117
  export {
1210
- formatAgentSessionMentionText,
1211
1118
  approvalOptionDisplayLabel,
1212
1119
  getPromptToolDetails,
1213
1120
  isPromptRequestIdTitle,
1214
1121
  AgentInteractivePromptSurface
1215
1122
  };
1216
- //# sourceMappingURL=chunk-GMLK2EFU.js.map
1123
+ //# sourceMappingURL=chunk-62QOR3TC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/agentConversation/approvalOptionPresentation.ts","../shared/agentConversation/promptToolDetails.ts","../shared/agentConversation/components/AgentInteractivePromptSurface.tsx","../shared/agentConversation/interactiveAnswerPayload.ts"],"sourcesContent":["import { translate } from \"../../i18n/index\";\n\nexport interface ApprovalOptionVisualPresentation {\n label: string;\n commandPrefix?: string;\n}\n\nexport function approvalOptionDisplayLabel(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): string {\n const idToken = normalizeApprovalOptionToken(option.id);\n const kindToken = normalizeApprovalOptionToken(option.kind);\n const label = option.label.trim();\n const specificTranslationKey = approvalOptionSpecificTranslationKey(\n idToken,\n label,\n intent\n );\n if (specificTranslationKey) {\n return translate(specificTranslationKey);\n }\n const providerLabelTranslation =\n approvalOptionProviderLabelTranslation(label);\n if (providerLabelTranslation) {\n return translate(\n providerLabelTranslation.key,\n providerLabelTranslation.params\n );\n }\n if (\n (idToken === \"allowonce\" || kindToken === \"allowonce\") &&\n isGenericAllowOnceLabel(label)\n ) {\n return translate(\"agentHost.agentGui.approvalOptions.allowOnce\");\n }\n if (isGenericAllowForSessionLabel(label)) {\n return translate(\"agentHost.agentGui.approvalOptions.allowForSession\");\n }\n if (\n (idToken === \"allowalways\" ||\n idToken === \"allowall\" ||\n kindToken === \"allowalways\") &&\n isGenericApprovalLabel(label)\n ) {\n return translate(\"agentHost.agentGui.approvalOptions.allowAlways\");\n }\n if (idToken === \"rejectalways\" || kindToken === \"rejectalways\") {\n return translate(\"agentHost.agentGui.approvalOptions.rejectAlways\");\n }\n if (\n idToken === \"rejectonce\" ||\n idToken === \"reject\" ||\n idToken === \"deny\" ||\n kindToken === \"rejectonce\" ||\n kindToken === \"reject\" ||\n kindToken === \"deny\"\n ) {\n return intent.feedback\n ? translate(\"agentHost.agentGui.approvalOptions.rejectWithFollowUp\")\n : translate(\"agentHost.agentGui.approvalOptions.rejectOnce\");\n }\n return label || option.id;\n}\n\nexport function approvalOptionVisualPresentation(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): ApprovalOptionVisualPresentation {\n const commandPrefix = approvalOptionCommandPrefix(option.label);\n if (commandPrefix) {\n return {\n label: translate(\n \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefixLead\"\n ),\n commandPrefix\n };\n }\n return {\n label: approvalOptionDisplayLabel(option, intent)\n };\n}\n\nexport function normalizeApprovalOptionToken(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction approvalOptionSpecificTranslationKey(\n token: string,\n label: string,\n intent: { feedback?: boolean } = {}\n): string | null {\n const labelToken = normalizeApprovalOptionToken(label);\n switch (token) {\n case \"approved\":\n return isGenericAllowOnceLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowOnce\"\n : null;\n case \"approvedforsession\":\n return isGenericAllowForSessionLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowForSession\"\n : null;\n case \"approvedalways\":\n return isGenericApprovalLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowAlways\"\n : null;\n case \"bypasspermissions\":\n return \"agentHost.agentGui.approvalOptions.bypassPermissions\";\n case \"auto\":\n return labelToken === \"yesanduseautomode\"\n ? \"agentHost.agentGui.approvalOptions.autoMode\"\n : null;\n case \"acceptedits\":\n return \"agentHost.agentGui.approvalOptions.acceptEdits\";\n case \"default\":\n return labelToken === \"yesandmanuallyapproveedits\"\n ? \"agentHost.agentGui.approvalOptions.manualApproval\"\n : null;\n case \"cancel\":\n return !intent.feedback && labelToken === \"cancel\"\n ? \"common.cancel\"\n : null;\n default:\n return null;\n }\n}\n\nfunction approvalOptionProviderLabelTranslation(\n label: string\n): { key: string; params: Record<string, string> } | null {\n const commandPrefix = approvalOptionCommandPrefix(label);\n if (commandPrefix) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefix\",\n params: { command: commandPrefix }\n };\n }\n\n const allowScopeMatch = label.match(/^Yes,\\s*and don't ask again for (.+)$/i);\n if (allowScopeMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForScope\",\n params: { scope: allowScopeMatch[1] }\n };\n }\n\n const alwaysAllowMatch = label.match(/^Always Allow\\s+(.+)$/i);\n if (alwaysAllowMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.alwaysAllowScope\",\n params: { scope: alwaysAllowMatch[1] }\n };\n }\n\n return null;\n}\n\nfunction approvalOptionCommandPrefix(label: string): string | null {\n const commandPrefixMatch = label.match(\n /^Yes,\\s*and don't ask again for commands that start with `([^`]+)`$/i\n );\n return commandPrefixMatch?.[1]?.trim() || null;\n}\n\nfunction isGenericApprovalLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allowalways\" ||\n token === \"allowall\" ||\n token === \"alwaysallow\" ||\n token === \"allowanddontaskagain\" ||\n token === \"yesanddontaskagain\"\n );\n}\n\nfunction isGenericAllowOnceLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allow\" ||\n token === \"allowonce\" ||\n token === \"approve\" ||\n token === \"approveonce\" ||\n token === \"yes\" ||\n token === \"yesproceed\" ||\n token === \"yesandproceed\"\n );\n}\n\nfunction isGenericAllowForSessionLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"allowforthissession\" ||\n token === \"allowforsession\" ||\n token === \"approveforsession\"\n );\n}\n","import { extractAgentMcpToolTarget } from \"../agentMcpToolTarget\";\n\nexport interface PromptToolDetail {\n kind: \"command\" | \"mcp\" | \"path\" | \"query\";\n value: string;\n meta?: string;\n}\n\nexport function getPromptToolDetails(\n input: Record<string, unknown> | null\n): PromptToolDetail[] {\n if (!input) {\n return [];\n }\n const mcpTarget = extractAgentMcpToolTarget({ input });\n const mcpDetails: PromptToolDetail[] = mcpTarget\n ? [\n {\n kind: \"mcp\",\n value: mcpTarget.displayName,\n ...(mcpTarget.instruction ? { meta: mcpTarget.instruction } : {})\n }\n ]\n : [];\n const detailInput = resolveToolDetailInput(input);\n const command =\n commandStringValue(detailInput.command) ??\n commandStringValue(detailInput.cmd);\n if (command) {\n return [\n ...mcpDetails,\n {\n kind: \"command\",\n value: command,\n ...(stringValue(detailInput.description)\n ? { meta: stringValue(detailInput.description) as string }\n : {})\n }\n ];\n }\n const filePath =\n stringValue(detailInput.file_path) ??\n stringValue(detailInput.filePath) ??\n stringValue(detailInput.path) ??\n stringValue(detailInput.notebook_path);\n if (filePath) {\n const lineRange = formatLineRange(detailInput);\n return [\n ...mcpDetails,\n {\n kind: \"path\",\n value: filePath,\n ...(lineRange ? { meta: lineRange } : {})\n }\n ];\n }\n const query =\n stringValue(detailInput.query) ??\n stringValue(detailInput.search_query) ??\n stringValue(detailInput.searchQuery) ??\n stringValue(detailInput.pattern);\n if (query) {\n return [\n ...mcpDetails,\n {\n kind: \"query\",\n value: query\n }\n ];\n }\n return mcpDetails;\n}\n\nexport function isPromptRequestIdTitle(value: string): boolean {\n return /^requestid\\s*:/iu.test(value.trim());\n}\n\nfunction resolveToolDetailInput(\n input: Record<string, unknown>\n): Record<string, unknown> {\n const toolCall = objectValue(input.toolCall);\n return (\n firstObjectValue(input, [\n \"command\",\n \"cmd\",\n \"file_path\",\n \"filePath\",\n \"path\",\n \"notebook_path\",\n \"query\",\n \"search_query\",\n \"searchQuery\",\n \"pattern\"\n ]) ??\n firstObjectValue(toolCall, [\n \"input\",\n \"rawInput\",\n \"raw_input\",\n \"arguments\",\n \"args\"\n ]) ??\n toolCall ??\n input\n );\n}\n\nfunction firstObjectValue(\n input: Record<string, unknown> | null,\n keys: readonly string[]\n): Record<string, unknown> | null {\n if (!input) {\n return null;\n }\n if (keys.some((key) => stringValue(input[key]))) {\n return input;\n }\n for (const key of keys) {\n const value = objectValue(input[key]);\n if (value) {\n return value;\n }\n }\n return null;\n}\n\nfunction formatLineRange(input: Record<string, unknown>): string | null {\n const start = numericValue(input.startLine) ?? numericValue(input.start_line);\n const end = numericValue(input.endLine) ?? numericValue(input.end_line);\n if (start === null || end === null) {\n return null;\n }\n return start === end ? `L${start}` : `L${start}-${end}`;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction commandStringValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (!Array.isArray(value)) {\n return null;\n }\n const shellFlag = stringValue(value[value.length - 2]);\n const shellCommand = stringValue(value[value.length - 1]);\n if ((shellFlag === \"-c\" || shellFlag === \"-lc\") && shellCommand) {\n return shellCommand;\n }\n const parts = value.flatMap((part) => {\n const text = stringValue(part);\n return text ? [text] : [];\n });\n return parts.length > 0 ? parts.join(\" \") : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction numericValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type JSX\n} from \"react\";\nimport { MessageSquareMoreIcon } from \"../../../app/renderer/components/icons/MessageSquareMoreIcon\";\nimport { Spinner } from \"../../../app/renderer/components/ui/spinner\";\nimport { translate } from \"../../../i18n/index\";\nimport {\n ShortcutBadge,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport {\n getOptionalAgentHostApi,\n useOptionalAgentHostApi\n} from \"../../../agentActivityHost\";\nimport {\n approvalOptionDisplayLabel,\n approvalOptionVisualPresentation,\n normalizeApprovalOptionToken\n} from \"../approvalOptionPresentation\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { buildAskUserAnswerPayload } from \"../interactiveAnswerPayload\";\nimport {\n PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,\n PLAN_IMPLEMENTATION_ACTION_SKIP\n} from \"../planImplementation\";\nimport {\n getPromptToolDetails,\n type PromptToolDetail\n} from \"../promptToolDetails\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\n\nconst COMMAND_TOOLTIP_DELAY_MS = 1000;\n\n/**\n * Where the prompt is rendered, which sets its interaction budget:\n * - \"full\" (conversation / composer): the user is focused here, so every action\n * is shown — primary decisions plus rich follow-ups (feedback textareas,\n * multi-step wizards, \"stay in plan\").\n * - \"compact\" (message-center attention deck): a glanceable needs-attention card\n * across many sessions. Only the primary decision is shown; rich follow-up\n * input is deferred to the conversation, reachable via the card's \"open\n * conversation\" jump. New prompt kinds must consciously choose their compact\n * form here instead of silently inheriting the full conversation surface.\n */\nexport type AgentInteractivePromptVariant = \"full\" | \"compact\";\n\ninterface AgentInteractivePromptSurfaceProps {\n prompt: AgentConversationPromptVM;\n variant?: AgentInteractivePromptVariant;\n edgeGlow?: boolean;\n keyboardShortcuts?: boolean;\n previewMode?: boolean;\n isSubmitting: boolean;\n onSubmit: (input: {\n requestId: string;\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n }) => void;\n labels: {\n approvalLead: string;\n planLead: string;\n planModes: Array<{ id: string; label: string; description: string }>;\n stayInPlan: string;\n sendFeedback: string;\n feedbackPlaceholder: string;\n previousQuestion: string;\n nextQuestion: string;\n submitAnswers: string;\n answerPlaceholder: string;\n waitingForAnswer: string;\n planImplementationLead: string;\n planImplementationConfirm: string;\n planImplementationFeedbackPlaceholder: string;\n planImplementationSend: string;\n planImplementationSkip: string;\n };\n}\n\nexport function AgentInteractivePromptSurface({\n prompt,\n variant = \"full\",\n edgeGlow = false,\n embedded = false,\n keyboardShortcuts = true,\n previewMode = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n embedded?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n\n if (prompt.kind === \"approval\") {\n return (\n <ApprovalPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n keyboardShortcuts={keyboardShortcuts}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"exit-plan\") {\n return (\n <ExitPlanPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"plan-implementation\") {\n return (\n <PlanImplementationSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <AskUserPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n\n// Compact (message-center deck): a single-select question is answered with one\n// click — selecting an option submits it immediately, matching the approval and\n// plan cards. Multi-select / multi-question / free-text-only prompts can't be\n// answered in one tap, so they defer to the conversation (the card's \"open\n// conversation\" jump), showing just the question for context.\nfunction CompactAskUserPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const question = prompt.questions[0] ?? null;\n const oneClickable =\n prompt.questions.length === 1 &&\n question !== null &&\n !question.multiSelect &&\n question.options.length > 0;\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n {question ? (\n <>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {oneClickable ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: {\n ...buildAskUserAnswerPayload({\n [question.id]: option.label\n })\n }\n })\n }\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction ApprovalPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n keyboardShortcuts = true,\n previewMode = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"approval\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const promptDetails = useMemo(\n () => formatToolDetails(prompt.input ?? null),\n [prompt.input]\n );\n const [submittingOptionId, setSubmittingOptionId] = useState<string | null>(\n null\n );\n const [pendingFeedbackOptionId, setPendingFeedbackOptionId] = useState<\n string | null\n >(null);\n const [feedback, setFeedback] = useState(\"\");\n const feedbackTextareaRef = useRef<HTMLTextAreaElement | null>(null);\n const agentHostApi = useOptionalAgentHostApi() ?? getOptionalAgentHostApi();\n const isDarwin = isDarwinPlatform(agentHostApi?.meta?.platform);\n const feedbackOptionId = useMemo(\n () => approvalFeedbackOptionId(prompt.options),\n [prompt.options]\n );\n const feedbackValue = feedback.trim();\n\n useEffect(() => {\n setSubmittingOptionId(null);\n setPendingFeedbackOptionId(null);\n setFeedback(\"\");\n }, [prompt.requestId]);\n\n useEffect(() => {\n if (pendingFeedbackOptionId !== null) {\n feedbackTextareaRef.current?.focus();\n }\n }, [pendingFeedbackOptionId]);\n\n const submitOption = useCallback(\n (optionId: string) => {\n const feedbackOption = feedbackOptionId === optionId;\n if (feedbackOption && pendingFeedbackOptionId !== optionId) {\n setFeedback(\"\");\n setPendingFeedbackOptionId(optionId);\n return;\n }\n setSubmittingOptionId(optionId);\n onSubmit({\n requestId: prompt.requestId,\n ...(feedbackOption ? { action: \"deny\" } : {}),\n optionId,\n ...(feedbackOption && feedbackValue\n ? { payload: { denyMessage: feedbackValue } }\n : {})\n });\n },\n [\n feedbackOptionId,\n feedbackValue,\n onSubmit,\n pendingFeedbackOptionId,\n prompt.requestId\n ]\n );\n\n useEffect(() => {\n if (\n !keyboardShortcuts ||\n isSubmitting ||\n submittingOptionId !== null ||\n prompt.options.length === 0\n ) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (\n !isEnterLikeKey(event) ||\n isEditableKeyboardTarget(event.target) ||\n event.isComposing ||\n event.altKey ||\n event.shiftKey\n ) {\n return;\n }\n const optionIndex = event.metaKey || event.ctrlKey ? 1 : 0;\n const option = prompt.options[optionIndex];\n if (!option) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n submitOption(option.id);\n };\n\n window.addEventListener(\"keydown\", handleKeyDown, true);\n return () => window.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [\n isSubmitting,\n keyboardShortcuts,\n prompt.options,\n submitOption,\n submittingOptionId\n ]);\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.approvalLead)}\n </div>\n {promptDetails.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {promptDetails.map((detail) => (\n <div\n key={`${detail.label}:${detail.value}`}\n className={styles.interactiveOptionDisplay}\n >\n <span className={styles.interactiveOptionTitle}>\n {detail.label}\n </span>\n <PromptDetailValue detail={detail} previewMode={previewMode} />\n {detail.meta ? (\n <span className={styles.interactiveOptionDescription}>\n {detail.meta}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n <div className={styles.interactivePromptOptions}>\n {prompt.options.map((option, optionIndex) => {\n const showSpinner = submittingOptionId === option.id;\n const optionSupportsFeedback = feedbackOptionId === option.id;\n const optionLabel = approvalOptionDisplayLabel(option, {\n feedback: optionSupportsFeedback\n });\n const optionPresentation = approvalOptionVisualPresentation(\n option,\n { feedback: optionSupportsFeedback }\n );\n const shortcutLabel = approvalOptionShortcutLabel(\n optionIndex,\n isDarwin\n );\n const showFeedbackComposer = pendingFeedbackOptionId === option.id;\n if (showFeedbackComposer) {\n return (\n <div\n key={option.id}\n className={styles.interactiveFeedbackComposer}\n >\n <textarea\n ref={feedbackTextareaRef}\n value={feedback}\n placeholder={labels.feedbackPlaceholder}\n disabled={isSubmitting || submittingOptionId !== null}\n className={styles.interactivePromptTextarea}\n aria-label={interactiveOptionLabel(\n optionLabel,\n option.description\n )}\n onChange={(event) => setFeedback(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (\n !keyboardShortcuts ||\n event.key !== \"Enter\" ||\n (!event.metaKey && !event.ctrlKey) ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n if (!feedbackValue) {\n feedbackTextareaRef.current?.focus();\n return;\n }\n submitOption(option.id);\n }}\n />\n <button\n type=\"button\"\n className={styles.interactiveFeedbackSendButton}\n disabled={\n isSubmitting ||\n submittingOptionId !== null ||\n !feedbackValue\n }\n aria-label={labels.sendFeedback}\n title={labels.sendFeedback}\n aria-busy={showSpinner}\n onClick={() => {\n if (!feedbackValue) {\n feedbackTextareaRef.current?.focus();\n return;\n }\n submitOption(option.id);\n }}\n >\n {showSpinner ? (\n <InteractiveOptionSpinner />\n ) : (\n <SendFilledIcon />\n )}\n </button>\n </div>\n );\n }\n return (\n <button\n key={option.id}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n optionLabel,\n option.description\n )}\n disabled={isSubmitting || submittingOptionId !== null}\n onClick={() => submitOption(option.id)}\n >\n <span className={styles.interactiveOptionTitle}>\n {optionPresentation.label}\n </span>\n {optionPresentation.commandPrefix ? (\n <CommandTextWithTooltip\n value={optionPresentation.commandPrefix}\n testId=\"agent-interactive-command-prefix-option\"\n tooltipsEnabled={!previewMode}\n />\n ) : null}\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n {keyboardShortcuts && shortcutLabel && !showSpinner ? (\n <ShortcutBadge\n className={styles.interactiveOptionShortcut}\n aria-hidden=\"true\"\n >\n {shortcutLabel}\n </ShortcutBadge>\n ) : null}\n {showSpinner ? <InteractiveOptionSpinner /> : null}\n </button>\n );\n })}\n </div>\n </div>\n </section>\n );\n}\n\nfunction ExitPlanPromptSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"exit-plan\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [feedback, setFeedback] = useState(\"\");\n // Compact (message-center deck): only the permission-mode decision buttons are\n // offered; refining / staying in plan is deferred to the conversation.\n const showFeedbackFooter = variant !== \"compact\";\n const [submittingOptionId, setSubmittingOptionId] = useState<string | null>(\n null\n );\n const trimmed = feedback.trim();\n const continueLabel =\n trimmed === \"\" ? labels.stayInPlan : labels.sendFeedback;\n\n useEffect(() => {\n setSubmittingOptionId(null);\n }, [prompt.requestId]);\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.planLead)}\n </div>\n <div className={styles.interactivePromptOptions}>\n {labels.planModes.map((mode) => {\n const showSpinner = submittingOptionId === mode.id;\n return (\n <button\n key={mode.id}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n mode.label,\n mode.description\n )}\n disabled={isSubmitting || submittingOptionId !== null}\n onClick={() => {\n setSubmittingOptionId(mode.id);\n onSubmit({\n requestId: prompt.requestId,\n action: \"allow\",\n optionId: mode.id\n });\n }}\n >\n <span className={styles.interactiveOptionTitle}>\n {mode.label}\n </span>\n <span className={styles.interactiveOptionDescription}>\n {mode.description}\n </span>\n {showSpinner ? <InteractiveOptionSpinner /> : null}\n </button>\n );\n })}\n </div>\n {showFeedbackFooter ? (\n <div className={styles.interactivePromptFooter}>\n <textarea\n value={feedback}\n placeholder={labels.feedbackPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n onChange={(event) => setFeedback(event.currentTarget.value)}\n />\n <div className={styles.interactivePromptActions}>\n <button\n type=\"button\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"deny\",\n payload: trimmed ? { denyMessage: trimmed } : undefined\n })\n }\n >\n {continueLabel}\n </button>\n </div>\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\n// Codex plan-mode \"implement this plan?\" decision. No server request; actions\n// are routed by the consumer (controller inline, desktop chrome in the message\n// center) keyed on the action id rather than a server submitInteractive.\nfunction PlanImplementationSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"plan-implementation\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [feedback, setFeedback] = useState(\"\");\n const trimmed = feedback.trim();\n const continueLabel =\n trimmed === \"\"\n ? labels.planImplementationSkip\n : labels.planImplementationSend;\n // Compact (message-center deck): only the \"implement\" decision is offered.\n // Refining or staying in plan mode is deferred to the conversation, reachable\n // via the card's \"open conversation\" jump.\n const showFeedbackFooter = variant !== \"compact\";\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.planImplementationLead)}\n </div>\n <div className={styles.interactivePromptOptions}>\n <button\n type=\"button\"\n className={styles.interactiveOptionButton}\n data-testid=\"agent-plan-implementation-implement\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: PLAN_IMPLEMENTATION_ACTION_IMPLEMENT\n })\n }\n >\n <span className={styles.interactiveOptionTitle}>\n {labels.planImplementationConfirm}\n </span>\n </button>\n </div>\n {showFeedbackFooter ? (\n <div className={styles.interactivePromptFooter}>\n <textarea\n value={feedback}\n placeholder={labels.planImplementationFeedbackPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n data-testid=\"agent-plan-implementation-feedback\"\n onChange={(event) => setFeedback(event.currentTarget.value)}\n />\n <div className={styles.interactivePromptActions}>\n <button\n type=\"button\"\n data-testid=\"agent-plan-implementation-continue\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action:\n trimmed === \"\"\n ? PLAN_IMPLEMENTATION_ACTION_SKIP\n : PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n payload: trimmed ? { text: trimmed } : undefined\n })\n }\n >\n {continueLabel}\n </button>\n </div>\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction AskUserPromptSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n if (variant === \"compact\") {\n return (\n <CompactAskUserPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <FullAskUserPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n\nfunction FullAskUserPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [index, setIndex] = useState(0);\n const [selectedByQuestionId, setSelectedByQuestionId] = useState<\n Record<string, string[]>\n >({});\n const [freeTextByQuestionId, setFreeTextByQuestionId] = useState<\n Record<string, string>\n >({});\n\n const question = prompt.questions[index] ?? null;\n const selected = question ? (selectedByQuestionId[question.id] ?? []) : [];\n const freeText = question ? (freeTextByQuestionId[question.id] ?? \"\") : \"\";\n const canAdvance =\n question !== null &&\n (selected.length > 0 ||\n freeText.trim() !== \"\" ||\n question.options.length === 0);\n const isLast = index >= prompt.questions.length - 1;\n\n const payload = useMemo(() => {\n const answersByQuestionId: Record<string, string | string[]> = {};\n for (const current of prompt.questions) {\n const chosen = selectedByQuestionId[current.id] ?? [];\n const other = (freeTextByQuestionId[current.id] ?? \"\").trim();\n if (current.multiSelect) {\n const value = other ? [...chosen, other] : chosen;\n if (value.length > 0) {\n answersByQuestionId[current.id] = value;\n }\n continue;\n }\n const value = other || chosen[0];\n if (value) {\n answersByQuestionId[current.id] = value;\n }\n }\n return buildAskUserAnswerPayload(answersByQuestionId);\n }, [freeTextByQuestionId, prompt.questions, selectedByQuestionId]);\n\n if (!question) {\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div\n className={`${styles.interactivePromptLead} inline-flex items-center gap-1.5`}\n >\n <MessageSquareMoreIcon\n size={15}\n active\n aria-hidden=\"true\"\n className=\"shrink-0\"\n />\n {stripPromptTitlePunctuation(labels.waitingForAnswer)}\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n <span className={styles.interactivePromptMeta}>\n {index + 1}/{prompt.questions.length}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {question.options.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => {\n const active = selected.includes(option.label);\n return (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n data-active={active}\n aria-pressed={active}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() => {\n setSelectedByQuestionId((current) => {\n const existing = current[question.id] ?? [];\n const next = question.multiSelect\n ? existing.includes(option.label)\n ? existing.filter((value) => value !== option.label)\n : [...existing, option.label]\n : existing.includes(option.label)\n ? []\n : [option.label];\n return { ...current, [question.id]: next };\n });\n }}\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n </button>\n );\n })}\n </div>\n ) : null}\n <textarea\n value={freeText}\n placeholder={labels.answerPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n onChange={(event) => {\n const value = event.currentTarget.value;\n setFreeTextByQuestionId((current) => ({\n ...current,\n [question.id]: value\n }));\n }}\n />\n <div className={styles.interactivePromptActions}>\n <button\n type=\"button\"\n disabled={isSubmitting || index === 0}\n onClick={() => setIndex((current) => Math.max(current - 1, 0))}\n >\n {labels.previousQuestion}\n </button>\n {isLast ? (\n <button\n type=\"button\"\n disabled={\n isSubmitting ||\n Object.keys(payload.answersByQuestionId).length === 0\n }\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: { ...payload }\n })\n }\n >\n {labels.submitAnswers}\n </button>\n ) : (\n <button\n type=\"button\"\n disabled={isSubmitting || !canAdvance}\n onClick={() =>\n setIndex((current) =>\n Math.min(current + 1, prompt.questions.length - 1)\n )\n }\n >\n {labels.nextQuestion}\n </button>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nfunction isEnterLikeKey(event: KeyboardEvent): boolean {\n return (\n event.key === \"Enter\" ||\n event.code === \"Enter\" ||\n event.code === \"NumpadEnter\"\n );\n}\n\nfunction isEditableKeyboardTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n const tagName = target.tagName.toLowerCase();\n return (\n tagName === \"input\" ||\n tagName === \"textarea\" ||\n tagName === \"select\" ||\n target.isContentEditable\n );\n}\n\nfunction approvalOptionShortcutLabel(\n optionIndex: number,\n isDarwin: boolean\n): string | null {\n if (optionIndex === 0) {\n return translate(\"agentHost.agentGui.shortcutEnter\");\n }\n if (optionIndex === 1) {\n return isDarwin\n ? translate(\"agentHost.agentGui.shortcutCmdEnter\")\n : translate(\"agentHost.agentGui.shortcutCtrEnter\");\n }\n return null;\n}\n\nfunction isDarwinPlatform(platform: string | undefined): boolean {\n if (platform) {\n return platform === \"darwin\";\n }\n if (typeof navigator === \"undefined\") {\n return false;\n }\n const userAgentPlatform =\n \"userAgentData\" in navigator\n ? (\n navigator as Navigator & {\n userAgentData?: { platform?: string };\n }\n ).userAgentData?.platform\n : undefined;\n const navigatorPlatform = userAgentPlatform ?? navigator.platform ?? \"\";\n return /mac/i.test(navigatorPlatform);\n}\n\nfunction InteractiveOptionSpinner(): JSX.Element {\n \"use memo\";\n return (\n <Spinner\n className={styles.interactiveOptionSpinner}\n testId=\"agent-interactive-option-spinner\"\n />\n );\n}\n\nfunction SendFilledIcon(): JSX.Element {\n \"use memo\";\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2.74311 8.80587C2.84592 8.40096 3.14571 8.08844 3.54551 7.97033L18.5197 3.51569C18.9336 3.39383 19.3809 3.5054 19.6881 3.81262C19.9951 4.11984 20.1076 4.56798 19.9857 4.9817L15.5311 19.9559C15.413 20.3557 15.1005 20.6555 14.6956 20.7583C14.2895 20.8597 13.869 20.7438 13.5721 20.4469L10.455 15.1823C10.8585 14.6483 12.1563 12.9094 14.3475 9.96528C14.6086 9.70419 14.6382 9.31168 14.4138 9.08692C14.1891 8.86221 13.796 8.8913 13.5348 9.15252L8.31088 13.0423L3.05316 9.92799C2.7562 9.63104 2.64049 9.21071 2.74311 8.80587Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction interactivePromptClassName(embedded: boolean): string {\n return embedded\n ? `${styles.interactivePrompt} agent-gui-conversation__interactive-prompt--embedded`\n : styles.interactivePrompt;\n}\n\nfunction interactivePromptCardClassName(edgeGlow: boolean): string {\n return edgeGlow\n ? `${styles.interactivePromptCard} agent-gui-edge-glow`\n : styles.interactivePromptCard;\n}\n\ninterface LabeledPromptToolDetail {\n kind: PromptToolDetail[\"kind\"];\n label: string;\n value: string;\n meta?: string;\n}\n\nfunction formatToolDetails(\n input: Record<string, unknown> | null\n): LabeledPromptToolDetail[] {\n return getPromptToolDetails(input).map((detail) => ({\n kind: detail.kind,\n label: promptToolDetailLabel(detail.kind),\n value: detail.value,\n ...(detail.meta ? { meta: detail.meta } : {})\n }));\n}\n\nfunction PromptDetailValue({\n detail,\n previewMode\n}: {\n detail: LabeledPromptToolDetail;\n previewMode: boolean;\n}): JSX.Element {\n \"use memo\";\n if (detail.kind !== \"command\") {\n return (\n <span className={styles.interactiveOptionDescription}>\n {detail.value}\n </span>\n );\n }\n return (\n <CommandTextWithTooltip\n value={detail.value}\n testId=\"agent-interactive-command-detail\"\n tooltipsEnabled={!previewMode}\n />\n );\n}\n\nfunction CommandTextWithTooltip({\n value,\n testId,\n tooltipsEnabled = true\n}: {\n value: string;\n testId: string;\n tooltipsEnabled?: boolean;\n}): JSX.Element {\n \"use memo\";\n const content = (\n <span\n className={`${styles.interactiveOptionDescription} ${styles.interactiveOptionCommandDescription}`}\n data-agent-interactive-command-detail={\n testId === \"agent-interactive-command-detail\" ? \"true\" : undefined\n }\n data-agent-interactive-command-prefix-option={\n testId === \"agent-interactive-command-prefix-option\"\n ? \"true\"\n : undefined\n }\n >\n {value}\n </span>\n );\n\n if (!tooltipsEnabled) {\n return content;\n }\n\n return (\n <TooltipProvider delayDuration={COMMAND_TOOLTIP_DELAY_MS}>\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent className={styles.interactiveOptionCommandTooltip}>\n {value}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction promptToolDetailLabel(kind: PromptToolDetail[\"kind\"]): string {\n switch (kind) {\n case \"command\":\n return translate(\"agentHost.agentTool.details.command\");\n case \"mcp\":\n return translate(\"agentHost.agentTool.details.mcp\");\n case \"path\":\n return translate(\"agentHost.agentTool.details.path\");\n case \"query\":\n return translate(\"agentHost.agentTool.details.query\");\n }\n}\n\nfunction isApprovalFeedbackOption(option: {\n id: string;\n kind: string;\n}): boolean {\n return (\n isDenyApprovalOptionToken(option.id) ||\n isDenyApprovalOptionToken(option.kind)\n );\n}\n\nfunction approvalFeedbackOptionId(\n options: readonly { id: string; kind: string }[]\n): string | null {\n const explicitFeedbackOption = options.find((option) =>\n isExplicitFeedbackDenyApprovalOption(option)\n );\n if (explicitFeedbackOption) {\n return explicitFeedbackOption.id;\n }\n return options.find(isApprovalFeedbackOption)?.id ?? null;\n}\n\nfunction isExplicitFeedbackDenyApprovalOption(option: {\n id: string;\n kind: string;\n}): boolean {\n for (const value of [option.id, option.kind]) {\n switch (normalizeApprovalOptionToken(value ?? \"\")) {\n case \"abort\":\n case \"cancel\":\n case \"cancelled\":\n case \"canceled\":\n case \"denywithfeedback\":\n case \"rejectwithfeedback\":\n return true;\n default:\n break;\n }\n }\n return false;\n}\n\nfunction isDenyApprovalOptionToken(value: string | null | undefined): boolean {\n switch (normalizeApprovalOptionToken(value ?? \"\")) {\n case \"abort\":\n case \"cancel\":\n case \"cancelled\":\n case \"canceled\":\n case \"deny\":\n case \"denied\":\n case \"reject\":\n case \"rejected\":\n case \"rejectonce\":\n case \"disallow\":\n case \"decline\":\n case \"declined\":\n case \"no\":\n return true;\n default:\n return false;\n }\n}\n\nfunction stripPromptTitlePunctuation(value: string): string {\n return value.trim().replace(/[.。]+$/u, \"\");\n}\n\nfunction interactiveOptionLabel(\n label: string,\n description: string | null | undefined\n): string {\n const trimmedDescription = description?.trim();\n return trimmedDescription ? `${label} ${trimmedDescription}` : label;\n}\n","/**\n * Wire contract for the answer submitted back to an interactive `ask-user`\n * prompt. This payload crosses the renderer → daemon boundary (it rides\n * `submitInteractive({ action: \"submit\", payload })`), so its shape is a\n * cross-language contract, not an internal detail.\n *\n * Consumers that MUST stay in sync with this shape:\n * - daemon (Go) standard ACP adapter — forwards `answersByQuestionId` verbatim.\n * - daemon (Go) codex app-server adapter — `appServerUserInputAnswers` reshapes\n * `answersByQuestionId` into codex's `requestUserInput` response.\n *\n * Field semantics:\n * - `answersByQuestionId` is the canonical, machine-readable answer: question id\n * → the chosen option label(s) / free text. This is what providers consume.\n * - `answers` is a flat, human-readable display list (one entry per answered\n * question, multi-select joined). Never the source of truth for routing.\n *\n * Always build this with {@link buildAskUserAnswerPayload} so producers can't\n * drift on field names or which field is authoritative.\n */\nexport interface InteractiveAnswerPayload {\n answers: string[];\n answersByQuestionId: Record<string, string | string[]>;\n}\n\n/**\n * Builds the canonical interactive answer payload from the per-question answers.\n * `answers` is derived from `answersByQuestionId` (multi-select values joined)\n * so the two fields can never disagree.\n */\nexport function buildAskUserAnswerPayload(\n answersByQuestionId: Record<string, string | string[]>\n): InteractiveAnswerPayload {\n const answers = Object.values(answersByQuestionId).map((value) =>\n Array.isArray(value) ? value.join(\", \") : value\n );\n return { answers, answersByQuestionId };\n}\n"],"mappings":"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","names":["value"]}