@robota-sdk/agent-ui-web 3.0.0-beta.94 → 3.0.0-beta.95

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.
@@ -311,6 +311,8 @@ const SERVER_MESSAGE_HANDLING = {
311
311
  project_status: "reducer-state",
312
312
  project_diff: "reducer-state",
313
313
  project_memory: "reducer-state",
314
+ app_view: "intentionally-not-rendered",
315
+ app_tool_result: "intentionally-not-rendered",
314
316
  background_task_event: "intentionally-not-rendered",
315
317
  background_job_group_event: "intentionally-not-rendered",
316
318
  plan_event: "intentionally-not-rendered",
@@ -3237,6 +3239,26 @@ function isEditableElement(element) {
3237
3239
  function isDestructiveAskOption(requestId, value) {
3238
3240
  return requestId === "provider-profile-action" && value === "delete";
3239
3241
  }
3242
+ /**
3243
+ * The multi-select shape of an ask, or undefined for every other ask (which answers on click). The
3244
+ * rules mirror the terminal checklist (`MultiSelectList` in agent-ui-terminal): `minSelect` (default 1)
3245
+ * gates the submit, and `maxSelect` caps the ticks — a toggle beyond the cap is ignored, never swapped
3246
+ * for the oldest tick. `default.values` pre-select; a default that names no option is dropped, and
3247
+ * more defaults than the cap keep the first ones in option order, so the answer never breaks the cap.
3248
+ */
3249
+ function readMultiSelect(request) {
3250
+ const max = request.maxSelect ?? 1;
3251
+ if (max <= 1) return void 0;
3252
+ const options = (request.options ?? []).filter((opt) => !isDestructiveAskOption(request.id, opt.value));
3253
+ const wanted = new Set(request.default?.values ?? []);
3254
+ const defaults = options.filter((opt) => wanted.has(opt.value)).slice(0, max);
3255
+ return {
3256
+ min: request.minSelect ?? 1,
3257
+ max,
3258
+ options,
3259
+ defaults: new Set(defaults.map((opt) => opt.value))
3260
+ };
3261
+ }
3240
3262
  function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverId = null, layout = "modal", armDelayMs = 450, onFocusReturn }) {
3241
3263
  const prompt = prompts[0];
3242
3264
  const promptId = prompt?.id;
@@ -3248,6 +3270,7 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3248
3270
  const [fieldFocused, setFieldFocused] = (0, react.useState)(false);
3249
3271
  const fieldHandleRef = (0, react.useRef)(null);
3250
3272
  const pendingFocusReturnRef = (0, react.useRef)(false);
3273
+ const [selection, setSelection] = (0, react.useState)(void 0);
3251
3274
  (0, react.useEffect)(() => {
3252
3275
  if (promptId === void 0 || armDelayMs <= 0) return void 0;
3253
3276
  const timer = setTimeout(() => setArmedId(promptId), armDelayMs);
@@ -3312,6 +3335,28 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3312
3335
  fieldHandleRef.current?.clear();
3313
3336
  onAnswerAsk(id, response);
3314
3337
  };
3338
+ const multi = prompt.kind === "ask" ? readMultiSelect(prompt.request) : void 0;
3339
+ const ticks = selection?.promptId === prompt.id ? selection.values : multi?.defaults;
3340
+ const selectedValues = multi && ticks ? multi.options.map((opt) => opt.value).filter((value) => ticks.has(value)) : [];
3341
+ const canSubmit = multi !== void 0 && selectedValues.length >= multi.min;
3342
+ const toggleOption = (value) => {
3343
+ if (!multi) return;
3344
+ setSelection((current) => {
3345
+ const next = new Set(current?.promptId === prompt.id ? current.values : multi.defaults);
3346
+ if (next.has(value)) next.delete(value);
3347
+ else if (next.size < multi.max) next.add(value);
3348
+ return {
3349
+ promptId: prompt.id,
3350
+ values: next
3351
+ };
3352
+ });
3353
+ };
3354
+ const submitSelection = () => {
3355
+ if (canSubmit) answerAsk(prompt.id, {
3356
+ type: "answer",
3357
+ values: selectedValues
3358
+ });
3359
+ };
3315
3360
  /** A click anywhere in the prompt that isn't on a button or the field itself focuses the field. */
3316
3361
  const onContainerClick = (event) => {
3317
3362
  if (!hasFreeText) return;
@@ -3331,6 +3376,13 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3331
3376
  return;
3332
3377
  }
3333
3378
  if (!armed) return;
3379
+ if (multi && event.key === "Enter") {
3380
+ if (event.target === event.currentTarget) {
3381
+ event.preventDefault();
3382
+ submitSelection();
3383
+ }
3384
+ return;
3385
+ }
3334
3386
  const index = Number(event.key) - 1;
3335
3387
  if (!Number.isInteger(index) || index < 0) return;
3336
3388
  if (prompt.kind === "permission") {
@@ -3338,7 +3390,9 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3338
3390
  return;
3339
3391
  }
3340
3392
  const option = (prompt.request.options ?? []).filter((opt) => !isDestructiveAskOption(prompt.request.id, opt.value))[index];
3341
- if (option) answerAsk(prompt.id, {
3393
+ if (!option) return;
3394
+ if (multi) toggleOption(option.value);
3395
+ else answerAsk(prompt.id, {
3342
3396
  type: "answer",
3343
3397
  values: [option.value]
3344
3398
  });
@@ -3350,7 +3404,7 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3350
3404
  const askOptions = prompt.kind === "ask" ? prompt.request.options ?? [] : [];
3351
3405
  const destructiveAskOption = askOptions.find((opt) => isDestructiveAskOption(askRequestId, opt.value));
3352
3406
  const primaryAskOptions = destructiveAskOption ? askOptions.filter((opt) => opt !== destructiveAskOption) : askOptions;
3353
- const askArmedHint = hasFreeText && fieldFocused ? "Enter to submit · Esc to cancel" : askOptions.length > 0 ? "1–9 choose · Esc cancel" : "Esc cancels";
3407
+ const askArmedHint = hasFreeText && fieldFocused ? "Enter to submit · Esc to cancel" : multi && askOptions.length > 0 ? "1–9 toggle · Enter submit · Esc cancel" : askOptions.length > 0 ? "1–9 choose · Esc cancel" : "Esc cancels";
3354
3408
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3355
3409
  className: dock ? "agent-ui gui-rise flex-shrink-0" : "agent-ui fixed inset-0 z-50 flex items-center justify-center bg-black/55 p-4 backdrop-blur-[2px]",
3356
3410
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -3502,12 +3556,23 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3502
3556
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
3503
3557
  type: "button",
3504
3558
  "aria-keyshortcuts": dock && index < 9 ? String(index + 1) : void 0,
3505
- className: index === 0 ? PRIMARY_BUTTON$1 : SECONDARY_BUTTON$1,
3506
- onClick: onButton(() => answerAsk(prompt.id, {
3559
+ "aria-pressed": multi ? selectedValues.includes(opt.value) : void 0,
3560
+ className: (multi ? selectedValues.includes(opt.value) : index === 0) ? PRIMARY_BUTTON$1 : SECONDARY_BUTTON$1,
3561
+ onClick: onButton(() => multi ? toggleOption(opt.value) : answerAsk(prompt.id, {
3507
3562
  type: "answer",
3508
3563
  values: [opt.value]
3509
3564
  })),
3510
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: opt.label }), dock && index < 9 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Kbd, { children: index + 1 })]
3565
+ children: [
3566
+ multi && (selectedValues.includes(opt.value) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.SquareCheck, {
3567
+ size: 15,
3568
+ strokeWidth: 2
3569
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Square, {
3570
+ size: 15,
3571
+ strokeWidth: 2
3572
+ })),
3573
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: opt.label }),
3574
+ dock && index < 9 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Kbd, { children: index + 1 })
3575
+ ]
3511
3576
  }), opt.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
3512
3577
  className: "pl-0.5 text-[11.5px] leading-snug text-subtle",
3513
3578
  children: opt.description
@@ -3549,16 +3614,26 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3549
3614
  }),
3550
3615
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3551
3616
  className: "flex flex-wrap items-center gap-2",
3552
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3553
- type: "button",
3554
- className: GHOST_BUTTON,
3555
- onClick: onButton(() => answerAsk(prompt.id, { type: "cancelled" })),
3556
- children: "Cancel"
3557
- }), dock && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(KeyHint, {
3558
- hasFocus,
3559
- armed,
3560
- armedText: askArmedHint
3561
- })]
3617
+ children: [
3618
+ multi && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3619
+ type: "button",
3620
+ className: `${PRIMARY_BUTTON$1} disabled:opacity-60`,
3621
+ disabled: !canSubmit,
3622
+ onClick: onButton(submitSelection),
3623
+ children: canSubmit ? "Submit" : `Submit (min ${multi.min})`
3624
+ }),
3625
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3626
+ type: "button",
3627
+ className: GHOST_BUTTON,
3628
+ onClick: onButton(() => answerAsk(prompt.id, { type: "cancelled" })),
3629
+ children: "Cancel"
3630
+ }),
3631
+ dock && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(KeyHint, {
3632
+ hasFocus,
3633
+ armed,
3634
+ armedText: askArmedHint
3635
+ })
3636
+ ]
3562
3637
  })
3563
3638
  ]
3564
3639
  })] })
@@ -505,6 +505,12 @@ declare function AgentSwitcherSheet({ state }: {
505
505
  * lives only in `FreeTextField`, keyed by `prompt.id`: a cancelled or answered prompt's text can
506
506
  * never reach the next prompt's render, masked or not, because the field is a fresh component
507
507
  * instance rather than a value carried over in this component's own state (#3280 §3 follow-up).
508
+ *
509
+ * An ask whose `maxSelect` is above 1 is a multi-select: each option is a toggle (a click or 1–9 ticks
510
+ * it, nothing answers yet), and Submit — or Enter at the prompt, once the selection is allowed —
511
+ * answers with the ticked values in option order. Unlike the free-text field, the ticks live in this
512
+ * component, because the dock's keys act on them; they are tagged with `prompt.id`, so a prompt never
513
+ * reads the ticks of another.
508
514
  */
509
515
  interface IPermissionPromptProps {
510
516
  prompts: readonly TPendingPrompt[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/client/ws-session-client.ts","../../src/hooks/prompt-state.ts","../../src/hooks/session-client-types.ts","../../src/hooks/useSessionClient.ts","../../src/hooks/use-session-directory.ts","../../src/components/composer-attachments.ts","../../src/components/Composer.tsx","../../src/client/runtime-host.ts","../../src/hooks/ui-intent-state.ts","../../src/components/ConversationView.tsx","../../src/components/AgentActivityPanel.tsx","../../src/components/AgentSwitcherSheet.tsx","../../src/components/PermissionPrompt.tsx","../../src/components/personal-usage-dashboard-types.ts","../../src/components/PersonalUsageDashboard.tsx","../../src/components/SessionSurface.tsx","../../src/components/SessionSidebar.tsx","../../src/components/SessionMonitor.tsx","../../src/components/Dialog.tsx","../../src/components/SettingsScreen.tsx","../../src/components/HelpSheet.tsx","../../src/components/Brand.tsx","../../src/product-identity.tsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/client/ws-session-client.ts","../../src/hooks/prompt-state.ts","../../src/hooks/session-client-types.ts","../../src/hooks/useSessionClient.ts","../../src/hooks/use-session-directory.ts","../../src/components/composer-attachments.ts","../../src/components/Composer.tsx","../../src/client/runtime-host.ts","../../src/hooks/ui-intent-state.ts","../../src/components/ConversationView.tsx","../../src/components/AgentActivityPanel.tsx","../../src/components/AgentSwitcherSheet.tsx","../../src/components/PermissionPrompt.tsx","../../src/components/personal-usage-dashboard-types.ts","../../src/components/PersonalUsageDashboard.tsx","../../src/components/SessionSurface.tsx","../../src/components/SessionSidebar.tsx","../../src/components/SessionMonitor.tsx","../../src/components/Dialog.tsx","../../src/components/SettingsScreen.tsx","../../src/components/HelpSheet.tsx","../../src/components/Brand.tsx","../../src/product-identity.tsx"],"mappings":"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"}
@@ -505,6 +505,12 @@ declare function AgentSwitcherSheet({ state }: {
505
505
  * lives only in `FreeTextField`, keyed by `prompt.id`: a cancelled or answered prompt's text can
506
506
  * never reach the next prompt's render, masked or not, because the field is a fresh component
507
507
  * instance rather than a value carried over in this component's own state (#3280 §3 follow-up).
508
+ *
509
+ * An ask whose `maxSelect` is above 1 is a multi-select: each option is a toggle (a click or 1–9 ticks
510
+ * it, nothing answers yet), and Submit — or Enter at the prompt, once the selection is allowed —
511
+ * answers with the ticked values in option order. Unlike the free-text field, the ticks live in this
512
+ * component, because the dock's keys act on them; they are tagged with `prompt.id`, so a prompt never
513
+ * reads the ticks of another.
508
514
  */
509
515
  interface IPermissionPromptProps {
510
516
  prompts: readonly TPendingPrompt[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/client/ws-session-client.ts","../../src/hooks/prompt-state.ts","../../src/hooks/session-client-types.ts","../../src/hooks/useSessionClient.ts","../../src/hooks/use-session-directory.ts","../../src/components/composer-attachments.ts","../../src/components/Composer.tsx","../../src/client/runtime-host.ts","../../src/hooks/ui-intent-state.ts","../../src/components/ConversationView.tsx","../../src/components/AgentActivityPanel.tsx","../../src/components/AgentSwitcherSheet.tsx","../../src/components/PermissionPrompt.tsx","../../src/components/personal-usage-dashboard-types.ts","../../src/components/PersonalUsageDashboard.tsx","../../src/components/SessionSurface.tsx","../../src/components/SessionSidebar.tsx","../../src/components/SessionMonitor.tsx","../../src/components/Dialog.tsx","../../src/components/SettingsScreen.tsx","../../src/components/HelpSheet.tsx","../../src/components/Brand.tsx","../../src/product-identity.tsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/client/ws-session-client.ts","../../src/hooks/prompt-state.ts","../../src/hooks/session-client-types.ts","../../src/hooks/useSessionClient.ts","../../src/hooks/use-session-directory.ts","../../src/components/composer-attachments.ts","../../src/components/Composer.tsx","../../src/client/runtime-host.ts","../../src/hooks/ui-intent-state.ts","../../src/components/ConversationView.tsx","../../src/components/AgentActivityPanel.tsx","../../src/components/AgentSwitcherSheet.tsx","../../src/components/PermissionPrompt.tsx","../../src/components/personal-usage-dashboard-types.ts","../../src/components/PersonalUsageDashboard.tsx","../../src/components/SessionSurface.tsx","../../src/components/SessionSidebar.tsx","../../src/components/SessionMonitor.tsx","../../src/components/Dialog.tsx","../../src/components/SettingsScreen.tsx","../../src/components/HelpSheet.tsx","../../src/components/Brand.tsx","../../src/product-identity.tsx"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { decodeFrame, decodeServerMessage } from "@robota-sdk/agent-transport/cl
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  import ReactMarkdown from "react-markdown";
5
5
  import remarkGfm from "remark-gfm";
6
- import { ArrowDown, ArrowUp, Bot, Check, ChevronDown, ChevronLeft, ChevronRight, CircleCheck, CircleDashed, CircleX, Copy, ExternalLink, FileText, Gauge, GitBranch, Globe, LoaderCircle, MessageCircleQuestion, MoreHorizontal, PanelLeftClose, PanelLeftOpen, Paperclip, Pause, Pencil, Play, RefreshCw, Search, Settings, Shield, ShieldAlert, Sparkles, Square, SquarePen, SquareTerminal, Target, Trash2, Wrench, X } from "lucide-react";
6
+ import { ArrowDown, ArrowUp, Bot, Check, ChevronDown, ChevronLeft, ChevronRight, CircleCheck, CircleDashed, CircleX, Copy, ExternalLink, FileText, Gauge, GitBranch, Globe, LoaderCircle, MessageCircleQuestion, MoreHorizontal, PanelLeftClose, PanelLeftOpen, Paperclip, Pause, Pencil, Play, RefreshCw, Search, Settings, Shield, ShieldAlert, Sparkles, Square, SquareCheck, SquarePen, SquareTerminal, Target, Trash2, Wrench, X } from "lucide-react";
7
7
  import { AGENT_DRIVER_ID, OWNER_DRIVER_ID } from "@robota-sdk/agent-interface-session";
8
8
  //#region src/hooks/excluded-commands.ts
9
9
  /**
@@ -285,6 +285,8 @@ const SERVER_MESSAGE_HANDLING = {
285
285
  project_status: "reducer-state",
286
286
  project_diff: "reducer-state",
287
287
  project_memory: "reducer-state",
288
+ app_view: "intentionally-not-rendered",
289
+ app_tool_result: "intentionally-not-rendered",
288
290
  background_task_event: "intentionally-not-rendered",
289
291
  background_job_group_event: "intentionally-not-rendered",
290
292
  plan_event: "intentionally-not-rendered",
@@ -3211,6 +3213,26 @@ function isEditableElement(element) {
3211
3213
  function isDestructiveAskOption(requestId, value) {
3212
3214
  return requestId === "provider-profile-action" && value === "delete";
3213
3215
  }
3216
+ /**
3217
+ * The multi-select shape of an ask, or undefined for every other ask (which answers on click). The
3218
+ * rules mirror the terminal checklist (`MultiSelectList` in agent-ui-terminal): `minSelect` (default 1)
3219
+ * gates the submit, and `maxSelect` caps the ticks — a toggle beyond the cap is ignored, never swapped
3220
+ * for the oldest tick. `default.values` pre-select; a default that names no option is dropped, and
3221
+ * more defaults than the cap keep the first ones in option order, so the answer never breaks the cap.
3222
+ */
3223
+ function readMultiSelect(request) {
3224
+ const max = request.maxSelect ?? 1;
3225
+ if (max <= 1) return void 0;
3226
+ const options = (request.options ?? []).filter((opt) => !isDestructiveAskOption(request.id, opt.value));
3227
+ const wanted = new Set(request.default?.values ?? []);
3228
+ const defaults = options.filter((opt) => wanted.has(opt.value)).slice(0, max);
3229
+ return {
3230
+ min: request.minSelect ?? 1,
3231
+ max,
3232
+ options,
3233
+ defaults: new Set(defaults.map((opt) => opt.value))
3234
+ };
3235
+ }
3214
3236
  function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverId = null, layout = "modal", armDelayMs = 450, onFocusReturn }) {
3215
3237
  const prompt = prompts[0];
3216
3238
  const promptId = prompt?.id;
@@ -3222,6 +3244,7 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3222
3244
  const [fieldFocused, setFieldFocused] = useState(false);
3223
3245
  const fieldHandleRef = useRef(null);
3224
3246
  const pendingFocusReturnRef = useRef(false);
3247
+ const [selection, setSelection] = useState(void 0);
3225
3248
  useEffect(() => {
3226
3249
  if (promptId === void 0 || armDelayMs <= 0) return void 0;
3227
3250
  const timer = setTimeout(() => setArmedId(promptId), armDelayMs);
@@ -3286,6 +3309,28 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3286
3309
  fieldHandleRef.current?.clear();
3287
3310
  onAnswerAsk(id, response);
3288
3311
  };
3312
+ const multi = prompt.kind === "ask" ? readMultiSelect(prompt.request) : void 0;
3313
+ const ticks = selection?.promptId === prompt.id ? selection.values : multi?.defaults;
3314
+ const selectedValues = multi && ticks ? multi.options.map((opt) => opt.value).filter((value) => ticks.has(value)) : [];
3315
+ const canSubmit = multi !== void 0 && selectedValues.length >= multi.min;
3316
+ const toggleOption = (value) => {
3317
+ if (!multi) return;
3318
+ setSelection((current) => {
3319
+ const next = new Set(current?.promptId === prompt.id ? current.values : multi.defaults);
3320
+ if (next.has(value)) next.delete(value);
3321
+ else if (next.size < multi.max) next.add(value);
3322
+ return {
3323
+ promptId: prompt.id,
3324
+ values: next
3325
+ };
3326
+ });
3327
+ };
3328
+ const submitSelection = () => {
3329
+ if (canSubmit) answerAsk(prompt.id, {
3330
+ type: "answer",
3331
+ values: selectedValues
3332
+ });
3333
+ };
3289
3334
  /** A click anywhere in the prompt that isn't on a button or the field itself focuses the field. */
3290
3335
  const onContainerClick = (event) => {
3291
3336
  if (!hasFreeText) return;
@@ -3305,6 +3350,13 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3305
3350
  return;
3306
3351
  }
3307
3352
  if (!armed) return;
3353
+ if (multi && event.key === "Enter") {
3354
+ if (event.target === event.currentTarget) {
3355
+ event.preventDefault();
3356
+ submitSelection();
3357
+ }
3358
+ return;
3359
+ }
3308
3360
  const index = Number(event.key) - 1;
3309
3361
  if (!Number.isInteger(index) || index < 0) return;
3310
3362
  if (prompt.kind === "permission") {
@@ -3312,7 +3364,9 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3312
3364
  return;
3313
3365
  }
3314
3366
  const option = (prompt.request.options ?? []).filter((opt) => !isDestructiveAskOption(prompt.request.id, opt.value))[index];
3315
- if (option) answerAsk(prompt.id, {
3367
+ if (!option) return;
3368
+ if (multi) toggleOption(option.value);
3369
+ else answerAsk(prompt.id, {
3316
3370
  type: "answer",
3317
3371
  values: [option.value]
3318
3372
  });
@@ -3324,7 +3378,7 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3324
3378
  const askOptions = prompt.kind === "ask" ? prompt.request.options ?? [] : [];
3325
3379
  const destructiveAskOption = askOptions.find((opt) => isDestructiveAskOption(askRequestId, opt.value));
3326
3380
  const primaryAskOptions = destructiveAskOption ? askOptions.filter((opt) => opt !== destructiveAskOption) : askOptions;
3327
- const askArmedHint = hasFreeText && fieldFocused ? "Enter to submit · Esc to cancel" : askOptions.length > 0 ? "1–9 choose · Esc cancel" : "Esc cancels";
3381
+ const askArmedHint = hasFreeText && fieldFocused ? "Enter to submit · Esc to cancel" : multi && askOptions.length > 0 ? "1–9 toggle · Enter submit · Esc cancel" : askOptions.length > 0 ? "1–9 choose · Esc cancel" : "Esc cancels";
3328
3382
  return /* @__PURE__ */ jsx("div", {
3329
3383
  className: dock ? "agent-ui gui-rise flex-shrink-0" : "agent-ui fixed inset-0 z-50 flex items-center justify-center bg-black/55 p-4 backdrop-blur-[2px]",
3330
3384
  children: /* @__PURE__ */ jsx("div", {
@@ -3476,12 +3530,23 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3476
3530
  children: [/* @__PURE__ */ jsxs("button", {
3477
3531
  type: "button",
3478
3532
  "aria-keyshortcuts": dock && index < 9 ? String(index + 1) : void 0,
3479
- className: index === 0 ? PRIMARY_BUTTON$1 : SECONDARY_BUTTON$1,
3480
- onClick: onButton(() => answerAsk(prompt.id, {
3533
+ "aria-pressed": multi ? selectedValues.includes(opt.value) : void 0,
3534
+ className: (multi ? selectedValues.includes(opt.value) : index === 0) ? PRIMARY_BUTTON$1 : SECONDARY_BUTTON$1,
3535
+ onClick: onButton(() => multi ? toggleOption(opt.value) : answerAsk(prompt.id, {
3481
3536
  type: "answer",
3482
3537
  values: [opt.value]
3483
3538
  })),
3484
- children: [/* @__PURE__ */ jsx("span", { children: opt.label }), dock && index < 9 && /* @__PURE__ */ jsx(Kbd, { children: index + 1 })]
3539
+ children: [
3540
+ multi && (selectedValues.includes(opt.value) ? /* @__PURE__ */ jsx(SquareCheck, {
3541
+ size: 15,
3542
+ strokeWidth: 2
3543
+ }) : /* @__PURE__ */ jsx(Square, {
3544
+ size: 15,
3545
+ strokeWidth: 2
3546
+ })),
3547
+ /* @__PURE__ */ jsx("span", { children: opt.label }),
3548
+ dock && index < 9 && /* @__PURE__ */ jsx(Kbd, { children: index + 1 })
3549
+ ]
3485
3550
  }), opt.description && /* @__PURE__ */ jsx("p", {
3486
3551
  className: "pl-0.5 text-[11.5px] leading-snug text-subtle",
3487
3552
  children: opt.description
@@ -3523,16 +3588,26 @@ function PermissionPrompt({ prompts, onAnswerPermission, onAnswerAsk, ownDriverI
3523
3588
  }),
3524
3589
  /* @__PURE__ */ jsxs("div", {
3525
3590
  className: "flex flex-wrap items-center gap-2",
3526
- children: [/* @__PURE__ */ jsx("button", {
3527
- type: "button",
3528
- className: GHOST_BUTTON,
3529
- onClick: onButton(() => answerAsk(prompt.id, { type: "cancelled" })),
3530
- children: "Cancel"
3531
- }), dock && /* @__PURE__ */ jsx(KeyHint, {
3532
- hasFocus,
3533
- armed,
3534
- armedText: askArmedHint
3535
- })]
3591
+ children: [
3592
+ multi && /* @__PURE__ */ jsx("button", {
3593
+ type: "button",
3594
+ className: `${PRIMARY_BUTTON$1} disabled:opacity-60`,
3595
+ disabled: !canSubmit,
3596
+ onClick: onButton(submitSelection),
3597
+ children: canSubmit ? "Submit" : `Submit (min ${multi.min})`
3598
+ }),
3599
+ /* @__PURE__ */ jsx("button", {
3600
+ type: "button",
3601
+ className: GHOST_BUTTON,
3602
+ onClick: onButton(() => answerAsk(prompt.id, { type: "cancelled" })),
3603
+ children: "Cancel"
3604
+ }),
3605
+ dock && /* @__PURE__ */ jsx(KeyHint, {
3606
+ hasFocus,
3607
+ armed,
3608
+ armedText: askArmedHint
3609
+ })
3610
+ ]
3536
3611
  })
3537
3612
  ]
3538
3613
  })] })