@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.
- package/CHANGELOG.md +85 -0
- package/dist/browser/index.d.ts +6 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +91 -16
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +90 -15
- package/dist/node/index.d.cts +6 -0
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.ts +6 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +91 -16
- package/dist/node/index.js.map +1 -1
- package/docs/SPEC.md +2 -1
- package/package.json +6 -6
- package/src/components/PermissionPrompt.tsx +108 -7
- package/src/hooks/server-message-handling.ts +4 -0
package/dist/node/index.cjs
CHANGED
|
@@ -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)
|
|
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
|
-
|
|
3506
|
-
|
|
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: [
|
|
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: [
|
|
3553
|
-
|
|
3554
|
-
|
|
3555
|
-
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
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
|
})] })
|
package/dist/node/index.d.cts
CHANGED
|
@@ -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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"}
|
package/dist/node/index.d.ts
CHANGED
|
@@ -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[];
|
package/dist/node/index.d.ts.map
CHANGED
|
@@ -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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"}
|
package/dist/node/index.js
CHANGED
|
@@ -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)
|
|
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
|
-
|
|
3480
|
-
|
|
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: [
|
|
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: [
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
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
|
})] })
|