@tutti-os/agent-gui 0.0.215 → 0.0.217
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/README.md +9 -5
- package/dist/{agentFileMentionContracts-BeBex-Sf.d.ts → AgentMentionSearchContracts-y1_u9cPi.d.ts} +73 -1
- package/dist/{AgentRichTextReadonly-56TZAJ47.js → AgentRichTextReadonly-WZHUIARR.js} +7 -7
- package/dist/agent-conversation/index.d.ts +0 -2
- package/dist/agent-conversation/index.js +9 -9
- package/dist/agent-gui.d.ts +14 -8
- package/dist/agent-gui.js +23 -22
- package/dist/agent-message-center/index.d.ts +1 -2
- package/dist/agent-message-center/index.js +6 -6
- package/dist/app/renderer/agentactivity.css +93 -93
- package/dist/{chunk-KVFBUOKZ.js → chunk-2QF3RBR4.js} +4 -4
- package/dist/{chunk-XERDRMSF.js → chunk-44OCOBJS.js} +9 -11
- package/dist/chunk-44OCOBJS.js.map +1 -0
- package/dist/chunk-6GX57XB5.js +135 -0
- package/dist/chunk-6GX57XB5.js.map +1 -0
- package/dist/{chunk-AQ7CRDGX.js → chunk-FS7EMOVD.js} +8 -14
- package/dist/chunk-FS7EMOVD.js.map +1 -0
- package/dist/{chunk-ISC67YBJ.js → chunk-G2KRK7Z5.js} +44 -18
- package/dist/chunk-G2KRK7Z5.js.map +1 -0
- package/dist/{chunk-YTU6IUO2.js → chunk-GDLM6FLK.js} +123 -184
- package/dist/chunk-GDLM6FLK.js.map +1 -0
- package/dist/{chunk-BYHNJQYH.js → chunk-GLVENTN6.js} +2 -2
- package/dist/{chunk-2HYADTQP.js → chunk-JQOQETPN.js} +5 -5
- package/dist/{chunk-YBIT37P5.js → chunk-M6WEFXPL.js} +2 -2
- package/dist/{chunk-AD2RTSMS.js → chunk-N2M4B3G3.js} +2 -2
- package/dist/{chunk-MWAUXAD2.js → chunk-NXQGAXIE.js} +8 -8
- package/dist/{chunk-GUD5NOHO.js → chunk-O4QFGCLU.js} +44 -189
- package/dist/chunk-O4QFGCLU.js.map +1 -0
- package/dist/{chunk-KNSLQO52.js → chunk-PPAV2TB4.js} +7 -13
- package/dist/chunk-PPAV2TB4.js.map +1 -0
- package/dist/{chunk-4CHBM3G3.js → chunk-SUVMLCED.js} +5 -5
- package/dist/{chunk-JOUEYIV3.js → chunk-TKECUCUW.js} +863 -946
- package/dist/chunk-TKECUCUW.js.map +1 -0
- package/dist/{chunk-QVLEP54U.js → chunk-ZXEICU6J.js} +5 -3
- package/dist/chunk-ZXEICU6J.js.map +1 -0
- package/dist/context-mention-palette/index.d.ts +3 -3
- package/dist/context-mention-palette/index.js +12 -12
- package/dist/{contribution-DfeuQHH6.d.ts → contribution-D4lcOjSU.d.ts} +2 -14
- package/dist/headerLayout-CP4ujEbo.d.ts +14 -0
- package/dist/i18n/index.d.ts +4 -2
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +77 -53
- package/dist/index.js +46 -39
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +7 -0
- package/dist/layout.js +9 -0
- package/dist/layout.js.map +1 -0
- package/dist/mention-search.d.ts +6 -73
- package/dist/mention-search.js +8 -8
- package/dist/workbench/browser-element-context/index.js +2 -2
- package/dist/workbench/contribution.d.ts +1 -1
- package/dist/workbench/contribution.js +7 -8
- package/dist/workbench/index.d.ts +5 -3
- package/dist/workbench/index.js +10 -11
- package/dist/workbench/launch.js +2 -2
- package/dist/workbench/sessionTitle.js +2 -2
- package/dist/workbench/tool-sidebar/index.d.ts +14 -13
- package/dist/workbench/tool-sidebar/index.js +66 -55
- package/dist/workbench/tool-sidebar/index.js.map +1 -1
- package/package.json +23 -16
- package/dist/chunk-AQ7CRDGX.js.map +0 -1
- package/dist/chunk-GUD5NOHO.js.map +0 -1
- package/dist/chunk-ISC67YBJ.js.map +0 -1
- package/dist/chunk-JOUEYIV3.js.map +0 -1
- package/dist/chunk-KNSLQO52.js.map +0 -1
- package/dist/chunk-QVLEP54U.js.map +0 -1
- package/dist/chunk-XERDRMSF.js.map +0 -1
- package/dist/chunk-YTU6IUO2.js.map +0 -1
- /package/dist/{AgentRichTextReadonly-56TZAJ47.js.map → AgentRichTextReadonly-WZHUIARR.js.map} +0 -0
- /package/dist/{chunk-KVFBUOKZ.js.map → chunk-2QF3RBR4.js.map} +0 -0
- /package/dist/{chunk-BYHNJQYH.js.map → chunk-GLVENTN6.js.map} +0 -0
- /package/dist/{chunk-2HYADTQP.js.map → chunk-JQOQETPN.js.map} +0 -0
- /package/dist/{chunk-YBIT37P5.js.map → chunk-M6WEFXPL.js.map} +0 -0
- /package/dist/{chunk-AD2RTSMS.js.map → chunk-N2M4B3G3.js.map} +0 -0
- /package/dist/{chunk-MWAUXAD2.js.map → chunk-NXQGAXIE.js.map} +0 -0
- /package/dist/{chunk-4CHBM3G3.js.map → chunk-SUVMLCED.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts"],"sourcesContent":["function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n// Keep aligned with the issue manager task-list rail dimensions.\nexport const AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX = 280;\nexport const AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX = 248;\nexport const AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX = 520;\nexport const AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;\nexport const AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX = 320;\nexport const AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX = 10;\nexport const AGENT_GUI_PROVIDER_RAIL_WIDTH_PX = 52;\nexport const AGENT_GUI_COLLAPSED_MIN_WIDTH_PX = 460;\nexport const AGENT_GUI_STANDALONE_MIDDLE_CONTENT_MIN_WIDTH_PX =\n AGENT_GUI_COLLAPSED_MIN_WIDTH_PX - AGENT_GUI_PROVIDER_RAIL_WIDTH_PX;\nexport const AGENT_GUI_EXPANDED_MIN_WIDTH_PX =\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\n// One package-owned responsive threshold applies to every Agent GUI surface:\n// 248px conversation rail + 320px composer + 10px resize handle + 52px\n// provider rail = 630px. Hosts project container width and persisted user\n// preference only; they do not replace this layout policy.\nexport const AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX =\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX +\n AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX +\n AGENT_GUI_PROVIDER_RAIL_WIDTH_PX;\nexport const AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;\n\nexport interface AgentGUIConversationRailPresentation {\n conversationRailWidthPx: number;\n isAutoCollapsed: boolean;\n isCollapsed: boolean;\n}\n\nexport type AgentGUIConversationRailAutoCollapseMode =\n | \"default\"\n | \"preserve-middle-content\";\n\nexport interface AgentGUIExpandedWindowFrameInput {\n position: { x: number; y: number };\n width: number;\n height: number;\n desktopSize: { width: number; height: number };\n conversationRailWidthPx: number | null | undefined;\n}\n\nexport function shouldAutoCollapseAgentGUIConversationRail(\n containerWidthPx: number,\n options?: {\n mode?: AgentGUIConversationRailAutoCollapseMode;\n conversationRailWidthPx?: number | null;\n }\n): boolean {\n if (\n options?.mode === \"preserve-middle-content\" &&\n Number.isFinite(containerWidthPx) &&\n containerWidthPx > 0\n ) {\n return (\n containerWidthPx <\n resolveStandaloneAgentGUIViewportMinimumWidthPx({\n conversationRailCollapsed: false,\n conversationRailWidthPx: options.conversationRailWidthPx\n })\n );\n }\n return (\n Number.isFinite(containerWidthPx) &&\n containerWidthPx > 0 &&\n containerWidthPx <= AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX\n );\n}\n\nexport function resolveAgentGUIConversationRailPresentation(input: {\n autoCollapseMode?: AgentGUIConversationRailAutoCollapseMode;\n containerWidthPx: number;\n conversationRailCollapsed?: boolean | null;\n conversationRailWidthPx?: number | null;\n}): AgentGUIConversationRailPresentation {\n const isAutoCollapsed = shouldAutoCollapseAgentGUIConversationRail(\n input.containerWidthPx,\n {\n mode: input.autoCollapseMode,\n conversationRailWidthPx: input.conversationRailWidthPx\n }\n );\n return {\n conversationRailWidthPx: clampAgentGUIConversationRailWidthPx(\n input.conversationRailWidthPx,\n input.containerWidthPx\n ),\n isAutoCollapsed,\n isCollapsed: input.conversationRailCollapsed === true || isAutoCollapsed\n };\n}\n\nexport function resolveStandaloneAgentGUIViewportMinimumWidthPx(input: {\n conversationRailCollapsed?: boolean | null;\n conversationRailWidthPx?: number | null;\n}): number {\n if (input.conversationRailCollapsed === true) {\n return AGENT_GUI_COLLAPSED_MIN_WIDTH_PX;\n }\n return (\n AGENT_GUI_PROVIDER_RAIL_WIDTH_PX +\n resolvePreferredConversationRailWidthPx(input.conversationRailWidthPx) +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX +\n AGENT_GUI_STANDALONE_MIDDLE_CONTENT_MIN_WIDTH_PX\n );\n}\n\nexport function resolveAgentGUIConversationRailMaxWidthPx(\n containerWidthPx: number\n): number {\n const safeContainerWidth =\n Number.isFinite(containerWidthPx) && containerWidthPx > 0\n ? containerWidthPx\n : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\n\n return Math.max(\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n Math.min(\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX,\n safeContainerWidth -\n AGENT_GUI_DETAIL_MIN_WIDTH_PX -\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n )\n );\n}\n\nexport function clampAgentGUIConversationRailWidthPx(\n widthPx: number | null | undefined,\n containerWidthPx: number\n): number {\n return clamp(\n resolvePreferredConversationRailWidthPx(widthPx),\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)\n );\n}\n\nfunction resolvePreferredConversationRailWidthPx(\n widthPx: number | null | undefined\n): number {\n const preferredWidthPx =\n typeof widthPx === \"number\" && Number.isFinite(widthPx)\n ? Math.round(widthPx)\n : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX;\n return clamp(\n preferredWidthPx,\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX\n );\n}\n\nexport function resolveNextAgentGUIConversationRailWidthPx(input: {\n currentWidthPx: number | null | undefined;\n requestedWidthPx: number;\n containerWidthPx: number;\n}): number | null {\n const nextWidthPx = clampAgentGUIConversationRailWidthPx(\n input.requestedWidthPx,\n input.containerWidthPx\n );\n if (input.currentWidthPx === nextWidthPx) {\n return input.currentWidthPx;\n }\n\n if (input.currentWidthPx === null || input.currentWidthPx === undefined) {\n const defaultWidthPx = clampAgentGUIConversationRailWidthPx(\n null,\n input.containerWidthPx\n );\n if (nextWidthPx === defaultWidthPx) {\n return null;\n }\n }\n\n return nextWidthPx;\n}\n\nexport function resolveAgentGUIExpandedWindowFrame(\n input: AgentGUIExpandedWindowFrameInput\n): {\n position: { x: number; y: number };\n size: { width: number; height: number };\n} {\n const desiredRailWidthPx = clampAgentGUIConversationRailWidthPx(\n input.conversationRailWidthPx,\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n );\n const desiredWidthPx = Math.max(\n Math.round(input.width),\n desiredRailWidthPx +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX,\n AGENT_GUI_EXPANDED_MIN_WIDTH_PX,\n AGENT_GUI_EXPANDED_TARGET_WIDTH_PX\n );\n const desktopWidthPx =\n Number.isFinite(input.desktopSize.width) && input.desktopSize.width > 0\n ? Math.round(input.desktopSize.width)\n : desiredWidthPx;\n const nextWidthPx = Math.min(desiredWidthPx, desktopWidthPx);\n const maxX = Math.max(0, desktopWidthPx - nextWidthPx);\n const nextX = clamp(Math.round(input.position.x), 0, maxX);\n\n return {\n position: {\n x: nextX,\n y: input.position.y\n },\n size: {\n width: nextWidthPx,\n height: input.height\n }\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
AgentGUIConversation_styles_default,
|
|
3
3
|
MessageSquareMoreIcon,
|
|
4
4
|
extractAgentMcpToolTarget
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-PPAV2TB4.js";
|
|
6
6
|
import {
|
|
7
7
|
buildAskUserAnswerPayload,
|
|
8
8
|
readOwnAnswer,
|
|
@@ -11,13 +11,13 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
getOptionalAgentHostApi,
|
|
13
13
|
useOptionalAgentHostApi
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-M6WEFXPL.js";
|
|
15
15
|
import {
|
|
16
16
|
fileChangePathsFromChanges
|
|
17
17
|
} from "./chunk-F5UR6EJG.js";
|
|
18
18
|
import {
|
|
19
19
|
translate
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-GLVENTN6.js";
|
|
21
21
|
|
|
22
22
|
// shared/agentConversation/planImplementationPresentation.ts
|
|
23
23
|
var PLAN_IMPLEMENTATION_PROMPT = "Implement the plan.";
|
|
@@ -618,8 +618,7 @@ function formatApprovalToolPresentation(prompt, labels) {
|
|
|
618
618
|
};
|
|
619
619
|
}
|
|
620
620
|
function PromptDetailValue({
|
|
621
|
-
detail
|
|
622
|
-
previewMode
|
|
621
|
+
detail
|
|
623
622
|
}) {
|
|
624
623
|
"use memo";
|
|
625
624
|
if (detail.kind !== "command") {
|
|
@@ -630,7 +629,7 @@ function PromptDetailValue({
|
|
|
630
629
|
{
|
|
631
630
|
value: detail.value,
|
|
632
631
|
testId: "agent-interactive-command-detail",
|
|
633
|
-
tooltipsEnabled:
|
|
632
|
+
tooltipsEnabled: true
|
|
634
633
|
}
|
|
635
634
|
);
|
|
636
635
|
}
|
|
@@ -1017,7 +1016,6 @@ function ApprovalPromptSurface({
|
|
|
1017
1016
|
embedded = false,
|
|
1018
1017
|
edgeGlow = false,
|
|
1019
1018
|
keyboardShortcuts = true,
|
|
1020
|
-
previewMode = false,
|
|
1021
1019
|
isSubmitting,
|
|
1022
1020
|
onSubmit,
|
|
1023
1021
|
labels
|
|
@@ -1126,7 +1124,7 @@ function ApprovalPromptSurface({
|
|
|
1126
1124
|
className: AgentGUIConversation_styles_default.interactiveOptionDisplay,
|
|
1127
1125
|
children: [
|
|
1128
1126
|
/* @__PURE__ */ jsx3("span", { className: AgentGUIConversation_styles_default.interactiveOptionTitle, children: detail.label }),
|
|
1129
|
-
/* @__PURE__ */ jsx3(PromptDetailValue, { detail
|
|
1127
|
+
/* @__PURE__ */ jsx3(PromptDetailValue, { detail }),
|
|
1130
1128
|
detail.meta ? /* @__PURE__ */ jsx3("span", { className: AgentGUIConversation_styles_default.interactiveOptionDescription, children: detail.meta }) : null
|
|
1131
1129
|
]
|
|
1132
1130
|
},
|
|
@@ -1221,7 +1219,7 @@ function ApprovalPromptSurface({
|
|
|
1221
1219
|
{
|
|
1222
1220
|
value: optionPresentation.commandPrefix,
|
|
1223
1221
|
testId: "agent-interactive-command-prefix-option",
|
|
1224
|
-
tooltipsEnabled:
|
|
1222
|
+
tooltipsEnabled: true
|
|
1225
1223
|
}
|
|
1226
1224
|
) : null,
|
|
1227
1225
|
option.description ? /* @__PURE__ */ jsx3("span", { className: AgentGUIConversation_styles_default.interactiveOptionDescription, children: option.description }) : null,
|
|
@@ -1422,7 +1420,6 @@ function AgentInteractivePromptSurface({
|
|
|
1422
1420
|
edgeGlow = false,
|
|
1423
1421
|
embedded = false,
|
|
1424
1422
|
keyboardShortcuts = true,
|
|
1425
|
-
previewMode = false,
|
|
1426
1423
|
isSubmitting,
|
|
1427
1424
|
onSubmit,
|
|
1428
1425
|
labels
|
|
@@ -1436,7 +1433,6 @@ function AgentInteractivePromptSurface({
|
|
|
1436
1433
|
embedded,
|
|
1437
1434
|
edgeGlow,
|
|
1438
1435
|
keyboardShortcuts,
|
|
1439
|
-
previewMode,
|
|
1440
1436
|
isSubmitting,
|
|
1441
1437
|
onSubmit,
|
|
1442
1438
|
labels
|
|
@@ -1451,7 +1447,6 @@ function AgentInteractivePromptSurface({
|
|
|
1451
1447
|
variant,
|
|
1452
1448
|
embedded,
|
|
1453
1449
|
edgeGlow,
|
|
1454
|
-
previewMode,
|
|
1455
1450
|
isSubmitting,
|
|
1456
1451
|
onSubmit,
|
|
1457
1452
|
labels
|
|
@@ -1466,7 +1461,6 @@ function AgentInteractivePromptSurface({
|
|
|
1466
1461
|
variant,
|
|
1467
1462
|
embedded,
|
|
1468
1463
|
edgeGlow,
|
|
1469
|
-
previewMode,
|
|
1470
1464
|
isSubmitting,
|
|
1471
1465
|
onSubmit,
|
|
1472
1466
|
labels
|
|
@@ -1504,4 +1498,4 @@ export {
|
|
|
1504
1498
|
isPromptRequestIdTitle,
|
|
1505
1499
|
AgentInteractivePromptSurface
|
|
1506
1500
|
};
|
|
1507
|
-
//# sourceMappingURL=chunk-
|
|
1501
|
+
//# sourceMappingURL=chunk-FS7EMOVD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/agentConversation/planImplementationPresentation.ts","../shared/agentConversation/agentPlanPromptDispatch.ts","../shared/agentConversation/approvalOptionPresentation.ts","../shared/agentConversation/promptToolDetails.ts","../shared/agentConversation/components/AgentAskUserPromptSurface.tsx","../shared/agentConversation/components/interactivePromptPresentation.tsx","../shared/agentConversation/components/useAskUserAnswerFlow.ts","../shared/agentConversation/components/AgentInteractiveDecisionPromptSurfaces.tsx","../shared/agentConversation/components/AgentInteractivePromptSurface.tsx"],"sourcesContent":["import type { AgentConversationPromptVM } from \"./contracts/agentConversationVM\";\n\nexport const PLAN_IMPLEMENTATION_PROMPT = \"Implement the plan.\";\nexport const PLAN_IMPLEMENTATION_ACTION_IMPLEMENT = \"implement\";\nexport const PLAN_IMPLEMENTATION_ACTION_FEEDBACK = \"feedback\";\nexport const PLAN_IMPLEMENTATION_ACTION_SKIP = \"skip\";\n\nexport function planImplementationPromptFromPlanTurn(\n planTurnId: string,\n title: string\n): Extract<AgentConversationPromptVM, { kind: \"plan-implementation\" }> {\n return {\n kind: \"plan-implementation\",\n requestId: planTurnId,\n title\n };\n}\n\ninterface PlanTimelineItem {\n turnId?: string | null;\n occurredAtUnixMs?: number | null;\n createdAtUnixMs?: number | null;\n seq?: number | null;\n payload?: Record<string, unknown> | null;\n}\n\nfunction itemTime(item: PlanTimelineItem): number {\n return item.occurredAtUnixMs ?? item.createdAtUnixMs ?? item.seq ?? 0;\n}\n\nfunction isPlanItem(item: PlanTimelineItem): boolean {\n return item.payload?.messageKind === \"plan\";\n}\n\nexport function latestPlanTurnId(\n timelineItems: readonly PlanTimelineItem[]\n): string | null {\n let latestTurnId: string | null = null;\n let latestTime = Number.NEGATIVE_INFINITY;\n for (const item of timelineItems) {\n const turnId = item.turnId?.trim();\n if (!turnId) continue;\n const time = itemTime(item);\n if (time >= latestTime) {\n latestTime = time;\n latestTurnId = turnId;\n }\n }\n if (!latestTurnId) return null;\n return timelineItems.some(\n (item) => item.turnId?.trim() === latestTurnId && isPlanItem(item)\n )\n ? latestTurnId\n : null;\n}\n\nexport const MINIMUM_AUTO_TOKEN_BUDGET = 32_000;\nexport const MAXIMUM_AUTO_TOKEN_BUDGET = 2_000_000;\n\nexport interface PlanIssueExecutionProfile {\n reasoningIntensity: number;\n orchestrationIntensity: number;\n}\n\nexport interface PlanIssueBudget {\n mode: \"auto\" | \"fixed\";\n tokenLimit: number;\n quotaWaterlinePercent: number;\n}\n\n/**\n * Remembered planning defaults chosen before a Plan turn is submitted. The\n * generated plan can still provide explicit values; otherwise these values\n * seed the mandatory Issue-decomposition review.\n */\nexport interface PlanIssueBudgetPreset {\n executionProfile: PlanIssueExecutionProfile;\n budget: PlanIssueBudget;\n}\n\nexport function autoTokenBudget(\n taskCount: number,\n profile: PlanIssueExecutionProfile\n): number {\n const count = Number.isSafeInteger(taskCount) ? Math.max(1, taskCount) : 1;\n const compiled =\n 16_000 +\n count *\n (24_000 +\n Math.round(profile.reasoningIntensity) * 320 +\n Math.round(profile.orchestrationIntensity) * 160);\n return Math.min(\n MAXIMUM_AUTO_TOKEN_BUDGET,\n Math.max(MINIMUM_AUTO_TOKEN_BUDGET, compiled)\n );\n}\n\nexport function defaultPlanIssueBudgetPreset(): PlanIssueBudgetPreset {\n const executionProfile: PlanIssueExecutionProfile = {\n reasoningIntensity: 50,\n orchestrationIntensity: 50\n };\n return {\n executionProfile,\n budget: {\n mode: \"auto\",\n tokenLimit: autoTokenBudget(1, executionProfile),\n quotaWaterlinePercent: 10\n }\n };\n}\n\n/** Strict persisted-state reader; malformed values are dropped safely. */\nexport function normalizePlanIssueBudgetPreset(\n value: unknown\n): PlanIssueBudgetPreset | null {\n if (!isRecord(value)) return null;\n const executionProfileValue = isRecord(value.executionProfile)\n ? value.executionProfile\n : null;\n const budgetValue = isRecord(value.budget) ? value.budget : null;\n if (!executionProfileValue || !budgetValue) return null;\n const reasoningIntensity = percentValue(\n executionProfileValue.reasoningIntensity\n );\n const orchestrationIntensity = percentValue(\n executionProfileValue.orchestrationIntensity\n );\n const mode = budgetValue.mode === \"fixed\" ? \"fixed\" : \"auto\";\n const tokenLimit = positiveInteger(budgetValue.tokenLimit);\n const quotaWaterlinePercent = percentValue(budgetValue.quotaWaterlinePercent);\n if (\n reasoningIntensity === undefined ||\n orchestrationIntensity === undefined ||\n tokenLimit === undefined ||\n quotaWaterlinePercent === undefined\n ) {\n return null;\n }\n return {\n executionProfile: { reasoningIntensity, orchestrationIntensity },\n budget: { mode, tokenLimit, quotaWaterlinePercent }\n };\n}\n\nexport function planIssueBudgetPresetsEqual(\n left: PlanIssueBudgetPreset | null | undefined,\n right: PlanIssueBudgetPreset | null | undefined\n): boolean {\n return (\n (left?.executionProfile.reasoningIntensity ?? null) ===\n (right?.executionProfile.reasoningIntensity ?? null) &&\n (left?.executionProfile.orchestrationIntensity ?? null) ===\n (right?.executionProfile.orchestrationIntensity ?? null) &&\n (left?.budget.mode ?? null) === (right?.budget.mode ?? null) &&\n (left?.budget.tokenLimit ?? null) === (right?.budget.tokenLimit ?? null) &&\n (left?.budget.quotaWaterlinePercent ?? null) ===\n (right?.budget.quotaWaterlinePercent ?? null)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction percentValue(value: unknown): number | undefined {\n return typeof value === \"number\" &&\n Number.isFinite(value) &&\n Number.isInteger(value) &&\n value >= 0 &&\n value <= 100\n ? value\n : undefined;\n}\n\nfunction positiveInteger(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0\n ? value\n : undefined;\n}\n","import {\n selectPlanDecisionForTurn,\n selectTuttiModeActivationPresentation,\n selectWorkspaceAgentConsumerSession,\n type AgentSessionEngine,\n type AgentSessionEngineState\n} from \"@tutti-os/agent-activity-core\";\nimport {\n PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,\n PLAN_IMPLEMENTATION_ACTION_SKIP\n} from \"./planImplementationPresentation\";\n\nexport type AgentPlanPromptAction =\n | typeof PLAN_IMPLEMENTATION_ACTION_IMPLEMENT\n | typeof PLAN_IMPLEMENTATION_ACTION_FEEDBACK\n | typeof PLAN_IMPLEMENTATION_ACTION_SKIP;\n\nexport function selectAgentPlanPromptTurn(\n state: AgentSessionEngineState,\n agentSessionId: string,\n requestId: string\n) {\n const latestTurn = selectWorkspaceAgentConsumerSession(\n state,\n agentSessionId\n )?.latestTurn;\n return latestTurn?.turnId === requestId &&\n latestTurn.phase === \"settled\" &&\n latestTurn.outcome === \"completed\"\n ? latestTurn\n : null;\n}\n\nexport function dispatchAgentPlanPromptAction(input: {\n action: AgentPlanPromptAction;\n agentSessionId: string;\n engine: AgentSessionEngine;\n feedbackText?: string;\n nowUnixMs?: () => number;\n requestId: string;\n workspaceId: string;\n}): boolean {\n const turn = selectAgentPlanPromptTurn(\n input.engine.getSnapshot(),\n input.agentSessionId,\n input.requestId\n );\n if (!turn) return false;\n const scopeKey = [\n \"plan-implementation\",\n input.workspaceId,\n input.agentSessionId,\n turn.turnId\n ].join(\":\");\n if (input.action === PLAN_IMPLEMENTATION_ACTION_IMPLEMENT) {\n const existing = selectPlanDecisionForTurn(\n input.engine.getSnapshot(),\n input.agentSessionId,\n turn.turnId\n );\n input.engine.dispatch({\n type: \"plan/decisionRequested\",\n action: \"implement\",\n agentSessionId: input.agentSessionId,\n commandId: `plan-decision:${scopeKey}`,\n idempotencyKey: scopeKey,\n promptKind: \"plan-implementation\",\n requestId: input.requestId,\n turnId: turn.turnId,\n workspaceId: input.workspaceId,\n ...(existing?.status === \"failed\" || existing?.status === \"unknown\"\n ? { retry: true }\n : {}),\n timeoutMs: 30_000\n });\n return true;\n }\n if (input.action === PLAN_IMPLEMENTATION_ACTION_SKIP) {\n input.engine.dispatch({\n type: \"plan/skipped\",\n agentSessionId: input.agentSessionId,\n requestId: input.requestId,\n turnId: turn.turnId,\n workspaceId: input.workspaceId\n });\n return true;\n }\n const text = input.feedbackText?.trim() ?? \"\";\n if (!text) return false;\n const requestedAtUnixMs = (input.nowUnixMs ?? Date.now)();\n const tuttiModeActive = selectTuttiModeActivationPresentation(\n input.engine.getSnapshot(),\n input.agentSessionId,\n \"\"\n ).active;\n input.engine.dispatch({\n type: \"plan/feedbackRequested\",\n agentSessionId: input.agentSessionId,\n ...(tuttiModeActive\n ? {\n capabilityRefs: [\n { capability: \"tutti\" as const, source: \"slash_command\" as const }\n ]\n }\n : {}),\n clientSubmitId: `${scopeKey}:feedback:${requestedAtUnixMs}`,\n content: [{ type: \"text\", text }],\n displayPrompt: text,\n expiresAtUnixMs: requestedAtUnixMs + 120_000,\n requestedAtUnixMs,\n requestId: input.requestId,\n runtimeContent: [{ type: \"text\", text }],\n turnId: turn.turnId,\n workspaceId: input.workspaceId\n });\n return true;\n}\n","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 intent.feedback\n ? translate(\"agentHost.agentGui.approvalOptions.rejectWithFollowUp\")\n : 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\";\nimport { fileChangePathsFromChanges } from \"../workspaceAgentFileChangePayload\";\n\nexport interface PromptToolDetail {\n kind: \"command\" | \"directory\" | \"files\" | \"mcp\" | \"path\" | \"query\" | \"reason\";\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 details: PromptToolDetail[] = [...mcpDetails];\n const fileChanges = fileChangePaths(detailInput);\n const fileChangePresentation = presentFileChangePaths(fileChanges);\n if (fileChanges.length > 0) {\n details.push({\n kind: \"files\",\n value: fileChangePresentation.value\n });\n if (fileChangePresentation.directory) {\n details.push({\n kind: \"directory\",\n value: fileChangePresentation.directory\n });\n }\n }\n const command =\n commandStringValue(detailInput.command) ??\n commandStringValue(detailInput.cmd);\n if (command) {\n details.push({\n kind: \"command\",\n value: command,\n ...(stringValue(detailInput.description)\n ? { meta: stringValue(detailInput.description) as string }\n : {})\n });\n }\n const filePath =\n stringValue(detailInput.grantRoot) ??\n stringValue(detailInput.file_path) ??\n stringValue(detailInput.filePath) ??\n stringValue(detailInput.path) ??\n stringValue(detailInput.notebook_path);\n if (filePath && !isRedundantFileChangePath(filePath, fileChanges)) {\n const lineRange = formatLineRange(detailInput);\n details.push({\n kind: \"path\",\n value: filePath,\n ...(lineRange ? { meta: lineRange } : {})\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 details.push({\n kind: \"query\",\n value: query\n });\n }\n const reason = stringValue(detailInput.reason);\n if (reason) {\n details.push({\n kind: \"reason\",\n value: reason\n });\n }\n return details;\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 if (fileChangePaths(input).length > 0) {\n return input;\n }\n const toolCall = objectValue(input.toolCall);\n return (\n firstObjectValue(input, [\n \"command\",\n \"cmd\",\n \"reason\",\n \"grantRoot\",\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 fileChangePaths(input: Record<string, unknown>): string[] {\n const candidates = [\n objectValue(input.fileChanges)?.files,\n input.fileChanges,\n input.files,\n input.changes\n ];\n for (const candidate of candidates) {\n const paths = fileChangePathsFromChanges(candidate);\n if (paths.length > 0) {\n return paths;\n }\n }\n return [];\n}\n\nfunction presentFileChangePaths(paths: readonly string[]): {\n directory: string | null;\n value: string;\n} {\n const uniquePaths = Array.from(\n new Set(paths.map((path) => path.trim()).filter((path) => path.length > 0))\n );\n const directory = commonAbsoluteFileDirectory(uniquePaths);\n const displayPaths = directory\n ? uniquePaths.map((path) => relativePathFromDirectory(path, directory))\n : uniquePaths;\n if (displayPaths.length <= 3) {\n return { directory, value: displayPaths.join(\", \") };\n }\n return {\n directory,\n value: `${displayPaths.slice(0, 3).join(\", \")} +${displayPaths.length - 3} more`\n };\n}\n\nfunction commonAbsoluteFileDirectory(paths: readonly string[]): string | null {\n if (paths.length === 0) {\n return null;\n }\n const normalized = paths.map(normalizeDisplayPath);\n if (!normalized.every(isAbsoluteDisplayPath)) {\n return null;\n }\n const directories = normalized.map((path) =>\n path.slice(0, path.lastIndexOf(\"/\"))\n );\n const firstParts = directories[0]?.split(\"/\") ?? [];\n let sharedLength = firstParts.length;\n for (const directory of directories.slice(1)) {\n const parts = directory.split(\"/\");\n sharedLength = Math.min(sharedLength, parts.length);\n while (\n sharedLength > 0 &&\n firstParts[sharedLength - 1] !== parts[sharedLength - 1]\n ) {\n sharedLength -= 1;\n }\n }\n const shared = firstParts.slice(0, sharedLength).join(\"/\");\n return shared && shared !== \"/\" && !/^[A-Za-z]:$/u.test(shared)\n ? shared\n : null;\n}\n\nfunction relativePathFromDirectory(path: string, directory: string): string {\n const normalized = normalizeDisplayPath(path);\n const prefix = `${directory}/`;\n return normalized.startsWith(prefix) ? normalized.slice(prefix.length) : path;\n}\n\nfunction isRedundantFileChangePath(\n path: string,\n fileChanges: readonly string[]\n): boolean {\n const normalizedPath = normalizeDisplayPath(path);\n return fileChanges.some(\n (candidate) => normalizeDisplayPath(candidate) === normalizedPath\n );\n}\n\nfunction normalizeDisplayPath(path: string): string {\n return path.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/u, \"\");\n}\n\nfunction isAbsoluteDisplayPath(path: string): boolean {\n return path.startsWith(\"/\") || /^[A-Za-z]:\\//u.test(path);\n}\n\nfunction numericValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n","import type { JSX } from \"react\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport { MessageSquareMoreIcon } from \"../../../app/renderer/components/icons/MessageSquareMoreIcon\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { buildAskUserAnswerPayload } from \"../interactiveAnswerPayload\";\nimport type {\n AgentInteractivePromptSurfaceProps,\n AgentInteractivePromptVariant\n} from \"./AgentInteractivePromptSurface\";\nimport {\n interactiveOptionLabel,\n interactivePromptCardClassName,\n interactivePromptClassName,\n stripPromptTitlePunctuation\n} from \"./interactivePromptPresentation\";\nimport { useAskUserAnswerFlow } from \"./useAskUserAnswerFlow\";\n\ntype AskUserPrompt = Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n\ntype SharedAskUserSurfaceProps = Pick<\n AgentInteractivePromptSurfaceProps,\n \"edgeGlow\" | \"isSubmitting\" | \"labels\" | \"onSubmit\"\n> & {\n embedded?: boolean;\n prompt: AskUserPrompt;\n};\n\nexport function AgentAskUserPromptSurface({\n prompt,\n variant,\n ...props\n}: SharedAskUserSurfaceProps & {\n variant: AgentInteractivePromptVariant;\n}): JSX.Element {\n \"use memo\";\n const question = prompt.questions[0] ?? null;\n const useCompactQuickAnswer =\n variant === \"compact\" &&\n prompt.questions.length === 1 &&\n question !== null &&\n !question.multiSelect &&\n question.options.length > 0;\n\n if (useCompactQuickAnswer) {\n return (\n <CompactQuickAnswerSurface\n {...props}\n prompt={prompt}\n question={question}\n />\n );\n }\n\n return (\n <AskUserAnswerFlowSurface\n key={prompt.requestId}\n {...props}\n prompt={prompt}\n />\n );\n}\n\nfunction CompactQuickAnswerSurface({\n prompt,\n question,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit\n}: Omit<SharedAskUserSurfaceProps, \"labels\"> & {\n question: AskUserPrompt[\"questions\"][number];\n}): JSX.Element {\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 </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\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 </div>\n </section>\n );\n}\n\nfunction AskUserAnswerFlowSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: SharedAskUserSurfaceProps): JSX.Element {\n \"use memo\";\n const flow = useAskUserAnswerFlow({\n isSubmitting,\n questions: prompt.questions\n });\n const question = flow.currentQuestion;\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 {flow.currentIndex + 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 = flow.selectedOptions.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={() => flow.toggleOption(option.label)}\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 })}\n </div>\n ) : null}\n <textarea\n value={flow.freeText}\n placeholder={labels.answerPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n onChange={(event) => flow.setFreeText(event.currentTarget.value)}\n />\n <div className={styles.interactivePromptActions}>\n {prompt.questions.length > 1 ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n disabled={isSubmitting || flow.currentIndex === 0}\n onClick={flow.goToPreviousQuestion}\n >\n {labels.previousQuestion}\n </Button>\n ) : null}\n {flow.isLastQuestion ? (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isSubmitting || !flow.allQuestionsAnswered}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: { ...flow.answerPayload }\n })\n }\n >\n {labels.submitAnswers}\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isSubmitting || !flow.currentQuestionAnswered}\n onClick={flow.goToNextQuestion}\n >\n {labels.nextQuestion}\n </Button>\n )}\n </div>\n </div>\n </section>\n );\n}\n","import type { JSX } from \"react\";\nimport type { AgentApprovalItemVM } from \"../contracts/agentApprovalItemVM\";\nimport { translate } from \"../../../i18n/index\";\nimport {\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport { normalizeApprovalOptionToken } from \"../approvalOptionPresentation\";\nimport {\n getPromptToolDetails,\n type PromptToolDetail\n} from \"../promptToolDetails\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\nconst COMMAND_TOOLTIP_DELAY_MS = 1000;\n\nexport function isEnterLikeKey(event: KeyboardEvent): boolean {\n return (\n event.key === \"Enter\" ||\n event.code === \"Enter\" ||\n event.code === \"NumpadEnter\"\n );\n}\n\nexport function 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\nexport function 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\nexport function 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\nexport function InteractiveOptionSpinner(): JSX.Element {\n \"use memo\";\n return (\n <Spinner\n className={styles.interactiveOptionSpinner}\n testId=\"agent-interactive-option-spinner\"\n />\n );\n}\n\nexport function 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\nexport function interactivePromptClassName(embedded: boolean): string {\n return embedded\n ? `${styles.interactivePrompt} agent-gui-conversation__interactive-prompt--embedded`\n : styles.interactivePrompt;\n}\n\nexport function interactivePromptCardClassName(edgeGlow: boolean): string {\n return edgeGlow\n ? `${styles.interactivePromptCard} agent-gui-edge-glow`\n : styles.interactivePromptCard;\n}\n\nexport interface LabeledPromptToolDetail {\n kind: PromptToolDetail[\"kind\"];\n label: string;\n value: string;\n meta?: string;\n}\n\nexport interface ApprovalPromptToolPresentation {\n lead: string;\n leadDetails: LabeledPromptToolDetail[];\n cardDetails: LabeledPromptToolDetail[];\n}\n\nexport function 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\nexport function formatApprovalToolPresentation(\n prompt: Pick<AgentApprovalItemVM, \"approvalPurpose\" | \"input\">,\n labels: { approvalLead: string; fileChangeApprovalLead: string }\n): ApprovalPromptToolPresentation {\n const details = formatToolDetails(prompt.input);\n const hasFileChanges = details.some((detail) => detail.kind === \"files\");\n const isLeadDetail = (detail: LabeledPromptToolDetail): boolean =>\n detail.kind === \"reason\" ||\n (hasFileChanges && (detail.kind === \"directory\" || detail.kind === \"path\"));\n const leadDetails = [\n ...details.filter((detail) => detail.kind === \"reason\"),\n ...details.filter(\n (detail) => detail.kind !== \"reason\" && isLeadDetail(detail)\n )\n ].filter(\n (detail, index, candidates) =>\n candidates.findIndex(\n (candidate) =>\n candidate.value === detail.value && candidate.meta === detail.meta\n ) === index\n );\n const purposeLeads = {\n generic: labels.approvalLead,\n \"edit-files\": labels.fileChangeApprovalLead\n } satisfies Record<\n NonNullable<AgentApprovalItemVM[\"approvalPurpose\"]> | \"generic\",\n string\n >;\n return {\n lead: purposeLeads[prompt.approvalPurpose ?? \"generic\"],\n leadDetails,\n cardDetails: details.filter((detail) => !isLeadDetail(detail))\n };\n}\n\nexport function PromptDetailValue({\n detail\n}: {\n detail: LabeledPromptToolDetail;\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\n />\n );\n}\n\nexport function 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\nexport function promptToolDetailLabel(kind: PromptToolDetail[\"kind\"]): string {\n switch (kind) {\n case \"command\":\n return translate(\"agentHost.agentTool.details.command\");\n case \"directory\":\n return translate(\"agentHost.agentTool.details.scope\");\n case \"files\":\n return translate(\"workspaceCanvas.nodeDockLabel.files\");\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 case \"reason\":\n return translate(\"agentHost.agentTool.details.summary\");\n }\n}\n\nexport function isApprovalFeedbackOption(option: {\n id: string;\n kind: string;\n}): boolean {\n return (\n isDenyApprovalOptionToken(option.id) ||\n isDenyApprovalOptionToken(option.kind)\n );\n}\n\nexport function 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\nexport function 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\nexport function isDenyApprovalOptionToken(\n value: string | null | undefined\n): 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\nexport function stripPromptTitlePunctuation(value: string): string {\n return value.trim().replace(/[.。]+$/u, \"\");\n}\n\nexport function interactiveOptionLabel(\n label: string,\n description: string | null | undefined\n): string {\n const trimmedDescription = description?.trim();\n return trimmedDescription ? `${label} ${trimmedDescription}` : label;\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { AgentAskUserQuestionVM } from \"../contracts/agentAskUserQuestionItemVM\";\nimport {\n buildAskUserAnswerPayload,\n readOwnAnswer,\n writeOwnAnswer,\n type InteractiveAnswerPayload\n} from \"../interactiveAnswerPayload\";\n\nexport interface AskUserAnswerFlow {\n allQuestionsAnswered: boolean;\n answerPayload: InteractiveAnswerPayload;\n currentIndex: number;\n currentQuestion: AgentAskUserQuestionVM | null;\n currentQuestionAnswered: boolean;\n freeText: string;\n isLastQuestion: boolean;\n selectedOptions: string[];\n goToNextQuestion: () => void;\n goToPreviousQuestion: () => void;\n setFreeText: (value: string) => void;\n toggleOption: (optionLabel: string) => void;\n}\n\nexport function useAskUserAnswerFlow({\n isSubmitting,\n questions\n}: {\n isSubmitting: boolean;\n questions: AgentAskUserQuestionVM[];\n}): AskUserAnswerFlow {\n const [currentIndex, setCurrentIndex] = 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 currentQuestion = questions[currentIndex] ?? null;\n const selectedOptions = currentQuestion\n ? readOwnAnswer(selectedByQuestionId, currentQuestion.id, [])\n : [];\n const freeText = currentQuestion\n ? readOwnAnswer(freeTextByQuestionId, currentQuestion.id, \"\")\n : \"\";\n const currentQuestionAnswered =\n currentQuestion !== null &&\n (selectedOptions.length > 0 || freeText.trim() !== \"\");\n const isLastQuestion = currentIndex >= questions.length - 1;\n\n const answerPayload = useMemo(() => {\n const answersByQuestionId: Record<string, string | string[]> = {};\n for (const question of questions) {\n const selected = readOwnAnswer(selectedByQuestionId, question.id, []);\n const customAnswer = readOwnAnswer(\n freeTextByQuestionId,\n question.id,\n \"\"\n ).trim();\n if (question.multiSelect) {\n const answers = customAnswer ? [...selected, customAnswer] : selected;\n if (answers.length > 0) {\n writeOwnAnswer(answersByQuestionId, question.id, answers);\n }\n continue;\n }\n const answer = customAnswer || selected[0];\n if (answer) {\n writeOwnAnswer(answersByQuestionId, question.id, answer);\n }\n }\n return buildAskUserAnswerPayload(answersByQuestionId);\n }, [freeTextByQuestionId, questions, selectedByQuestionId]);\n\n const allQuestionsAnswered =\n questions.length > 0 &&\n questions.every((question) =>\n Object.prototype.hasOwnProperty.call(\n answerPayload.answersByQuestionId,\n question.id\n )\n );\n\n const toggleOption = useCallback(\n (optionLabel: string) => {\n if (isSubmitting || !currentQuestion) return;\n setSelectedByQuestionId((current) => {\n const existing = readOwnAnswer(current, currentQuestion.id, []);\n const next = currentQuestion.multiSelect\n ? existing.includes(optionLabel)\n ? existing.filter((value) => value !== optionLabel)\n : [...existing, optionLabel]\n : existing.includes(optionLabel)\n ? []\n : [optionLabel];\n const updated = { ...current };\n writeOwnAnswer(updated, currentQuestion.id, next);\n return updated;\n });\n },\n [currentQuestion, isSubmitting]\n );\n\n const setFreeText = useCallback(\n (value: string) => {\n if (isSubmitting || !currentQuestion) return;\n setFreeTextByQuestionId((current) => {\n const updated = { ...current };\n writeOwnAnswer(updated, currentQuestion.id, value);\n return updated;\n });\n },\n [currentQuestion, isSubmitting]\n );\n\n const goToPreviousQuestion = useCallback(() => {\n if (isSubmitting) return;\n setCurrentIndex((current) => Math.max(current - 1, 0));\n }, [isSubmitting]);\n\n const goToNextQuestion = useCallback(() => {\n if (isSubmitting || !currentQuestionAnswered) return;\n setCurrentIndex((current) => Math.min(current + 1, questions.length - 1));\n }, [currentQuestionAnswered, isSubmitting, questions.length]);\n\n return {\n allQuestionsAnswered,\n answerPayload,\n currentIndex,\n currentQuestion,\n currentQuestionAnswered,\n freeText,\n isLastQuestion,\n selectedOptions,\n goToNextQuestion,\n goToPreviousQuestion,\n setFreeText,\n toggleOption\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ShortcutBadge } from \"@tutti-os/ui-system\";\nimport {\n getOptionalAgentHostApi,\n useOptionalAgentHostApi\n} from \"../../../agentActivityHost\";\nimport {\n approvalOptionDisplayLabel,\n approvalOptionVisualPresentation\n} from \"../approvalOptionPresentation\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport {\n PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,\n PLAN_IMPLEMENTATION_ACTION_SKIP\n} from \"../planImplementationPresentation\";\nimport type { AgentInteractivePromptSurfaceProps } from \"./AgentInteractivePromptSurface\";\nimport {\n approvalFeedbackOptionId,\n approvalOptionShortcutLabel,\n CommandTextWithTooltip,\n formatApprovalToolPresentation,\n InteractiveOptionSpinner,\n interactiveOptionLabel,\n interactivePromptCardClassName,\n interactivePromptClassName,\n isDarwinPlatform,\n isEditableKeyboardTarget,\n isEnterLikeKey,\n PromptDetailValue,\n SendFilledIcon,\n stripPromptTitlePunctuation\n} from \"./interactivePromptPresentation\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\n\nexport function ApprovalPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n keyboardShortcuts = true,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"approval\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const promptToolPresentation = useMemo(\n () => formatApprovalToolPresentation(prompt, labels),\n [labels, prompt]\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 (!isSubmitting) {\n setSubmittingOptionId(null);\n }\n }, [isSubmitting]);\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.interactivePromptLeadContent}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(promptToolPresentation.lead)}\n </div>\n {promptToolPresentation.leadDetails.map((detail) => (\n <div\n key={`${detail.kind}:${detail.value}`}\n className={styles.interactivePromptQuestion}\n >\n {detail.value}\n {detail.meta ? ` ${detail.meta}` : null}\n </div>\n ))}\n </div>\n {promptToolPresentation.cardDetails.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {promptToolPresentation.cardDetails.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} />\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 event.key !== \"Enter\" ||\n event.shiftKey ||\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\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\nexport function 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 // Render the permission modes the runtime actually offered (\"Yes, and ...\")\n // so newly added modes (e.g. \"auto\") appear automatically. Localized\n // label/description are looked up by option id, falling back to the runtime's\n // own label for ids we don't have copy for. Only when the runtime sent no\n // options (Codex plan / legacy exitplanmode) do we use the curated defaults.\n const modes =\n prompt.options.length > 0\n ? prompt.options.map((option) => {\n const known = labels.planModes.find((mode) => mode.id === option.id);\n return {\n id: option.id,\n label: known?.label ?? option.label,\n description: known?.description ?? option.description ?? \"\"\n };\n })\n : labels.planModes;\n\n useEffect(() => {\n setSubmittingOptionId(null);\n }, [prompt.requestId]);\n\n useEffect(() => {\n if (!isSubmitting) {\n setSubmittingOptionId(null);\n }\n }, [isSubmitting]);\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 {modes.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 // The runtime models exit-plan as an approval that requires\n // an option id, so \"keep planning\" submits its `plan` option\n // id (when present) rather than a bare deny. `action: deny`\n // is kept so the controller doesn't flip plan mode off.\n action: \"deny\",\n ...(prompt.keepPlanningOptionId\n ? { optionId: prompt.keepPlanningOptionId }\n : {}),\n payload: trimmed ? { denyMessage: trimmed } : undefined\n })\n }\n >\n {continueLabel}\n </button>\n </div>\n </div>\n ) : (\n // Compact (deck): no textarea, but keep declining reachable — the deck\n // must still let the user keep planning (refining/feedback is deferred\n // to the conversation via the card's \"open conversation\" jump).\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 ...(prompt.keepPlanningOptionId\n ? { optionId: prompt.keepPlanningOptionId }\n : {})\n })\n }\n >\n {labels.stayInPlan}\n </button>\n </div>\n )}\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.\nexport function 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","import type { JSX } from \"react\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { AgentAskUserPromptSurface } from \"./AgentAskUserPromptSurface\";\nimport {\n ApprovalPromptSurface,\n ExitPlanPromptSurface,\n PlanImplementationSurface\n} from \"./AgentInteractiveDecisionPromptSurfaces\";\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. Ask-user prompts retain the full answer flow in a\n * denser layout; other prompt kinds may intentionally limit secondary actions.\n */\nexport type AgentInteractivePromptVariant = \"full\" | \"compact\";\n\nexport interface AgentInteractivePromptSurfaceProps {\n prompt: AgentConversationPromptVM;\n variant?: AgentInteractivePromptVariant;\n edgeGlow?: boolean;\n keyboardShortcuts?: 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 fileChangeApprovalLead: 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 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 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 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 isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <AgentAskUserPromptSurface\n key={prompt.requestId}\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","useCallback","useMemo","useState","jsx","jsxs","useMemo","useState","useCallback","jsx"]}
|
|
@@ -2,33 +2,33 @@ import {
|
|
|
2
2
|
changedFilesForSession,
|
|
3
3
|
workspaceAgentSessionMessageAliases
|
|
4
4
|
} from "./chunk-VMPA46ET.js";
|
|
5
|
+
import {
|
|
6
|
+
resolveWorkspaceAgentSessionSortTimeUnixMs
|
|
7
|
+
} from "./chunk-YMXYBG7U.js";
|
|
5
8
|
import {
|
|
6
9
|
isWorkspaceAgentSyntheticControlMessage
|
|
7
10
|
} from "./chunk-XJ34OIEQ.js";
|
|
8
11
|
import {
|
|
9
12
|
normalizeAgentSessionMentionTitle,
|
|
10
13
|
resolveAgentSessionMentionIconUrl
|
|
11
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-JQOQETPN.js";
|
|
12
15
|
import {
|
|
13
16
|
resolveAgentMentionFileThumbnailUrl
|
|
14
17
|
} from "./chunk-3V5OCA2M.js";
|
|
15
|
-
import {
|
|
16
|
-
AGENT_CONTEXT_MENTION_PROVIDER_IDS
|
|
17
|
-
} from "./chunk-RMQREVJY.js";
|
|
18
|
-
import {
|
|
19
|
-
resolveWorkspaceAgentSessionSortTimeUnixMs
|
|
20
|
-
} from "./chunk-YMXYBG7U.js";
|
|
21
18
|
import {
|
|
22
19
|
getOptionalAgentHostApi,
|
|
23
20
|
workspaceAgentProviderLabel
|
|
24
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-M6WEFXPL.js";
|
|
25
22
|
import {
|
|
26
23
|
translate,
|
|
27
24
|
translateInUiLanguage
|
|
28
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-GLVENTN6.js";
|
|
29
26
|
import {
|
|
30
27
|
normalizeAgentTitleText
|
|
31
28
|
} from "./chunk-MIJXEELH.js";
|
|
29
|
+
import {
|
|
30
|
+
AGENT_CONTEXT_MENTION_PROVIDER_IDS
|
|
31
|
+
} from "./chunk-RMQREVJY.js";
|
|
32
32
|
|
|
33
33
|
// agent-gui/agentGuiNode/AgentMentionLabels.ts
|
|
34
34
|
function agentMentionGroupLabel(groupId) {
|
|
@@ -2479,9 +2479,6 @@ var AgentMentionDirectoryRequestLifecycle = class {
|
|
|
2479
2479
|
}
|
|
2480
2480
|
};
|
|
2481
2481
|
|
|
2482
|
-
// agent-gui/agentGuiNode/AgentMentionSearchController.ts
|
|
2483
|
-
import { referenceProvenanceFilterCacheKey as referenceProvenanceFilterCacheKey2 } from "@tutti-os/workspace-file-reference/core";
|
|
2484
|
-
|
|
2485
2482
|
// agent-gui/agentGuiNode/agentMentionWorkspaceFilesPresentation.ts
|
|
2486
2483
|
function presentWorkspaceFileDirectoryMentionItems(input) {
|
|
2487
2484
|
return [createWorkspaceFileFolderBackItem(input.browsePath), ...input.items];
|
|
@@ -2506,10 +2503,39 @@ function parentWorkspaceFileDirectoryPath(path) {
|
|
|
2506
2503
|
return normalized.slice(0, index);
|
|
2507
2504
|
}
|
|
2508
2505
|
|
|
2506
|
+
// agent-gui/agentGuiNode/AgentMentionProvenanceFilterState.ts
|
|
2507
|
+
import { referenceProvenanceFilterCacheKey as referenceProvenanceFilterCacheKey2 } from "@tutti-os/workspace-file-reference/core";
|
|
2508
|
+
var EMPTY_PROVENANCE_FILTERS = {
|
|
2509
|
+
session: null,
|
|
2510
|
+
file: null,
|
|
2511
|
+
issue: null,
|
|
2512
|
+
agent: null,
|
|
2513
|
+
app: null
|
|
2514
|
+
};
|
|
2515
|
+
var AgentMentionProvenanceFilterState = class {
|
|
2516
|
+
filters = EMPTY_PROVENANCE_FILTERS;
|
|
2517
|
+
replace(filters, activeFilter) {
|
|
2518
|
+
const previous = this.value(activeFilter);
|
|
2519
|
+
this.filters = filters;
|
|
2520
|
+
const value = this.value(activeFilter);
|
|
2521
|
+
return {
|
|
2522
|
+
changed: provenanceFilterKey(previous) !== provenanceFilterKey(value),
|
|
2523
|
+
value
|
|
2524
|
+
};
|
|
2525
|
+
}
|
|
2526
|
+
value(filter) {
|
|
2527
|
+
return this.filters[filter];
|
|
2528
|
+
}
|
|
2529
|
+
};
|
|
2530
|
+
function provenanceFilterKey(filter) {
|
|
2531
|
+
return filter ? referenceProvenanceFilterCacheKey2(filter) : "disabled";
|
|
2532
|
+
}
|
|
2533
|
+
|
|
2509
2534
|
// agent-gui/agentGuiNode/AgentMentionSearchController.ts
|
|
2510
2535
|
var AgentMentionSearchController = class extends AgentMentionSearchControllerBase {
|
|
2511
2536
|
issueLoadMoreRequests = /* @__PURE__ */ new Map();
|
|
2512
2537
|
directoryRequestLifecycle = new AgentMentionDirectoryRequestLifecycle();
|
|
2538
|
+
provenanceFilters = new AgentMentionProvenanceFilterState();
|
|
2513
2539
|
setProvenanceCatalog(catalog) {
|
|
2514
2540
|
if (this.currentProvenanceCatalog === catalog) return;
|
|
2515
2541
|
this.currentProvenanceCatalog = catalog;
|
|
@@ -2521,12 +2547,11 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
|
|
|
2521
2547
|
groups: this.groupsFromRawGroups()
|
|
2522
2548
|
});
|
|
2523
2549
|
}
|
|
2524
|
-
|
|
2525
|
-
const
|
|
2526
|
-
|
|
2527
|
-
if (previousKey === nextKey) return;
|
|
2550
|
+
setProvenanceFilters(filters) {
|
|
2551
|
+
const next = this.provenanceFilters.replace(filters, this.currentFilter);
|
|
2552
|
+
if (!next.changed) return;
|
|
2528
2553
|
this.cancelPendingPreload();
|
|
2529
|
-
this.currentProvenanceFilter =
|
|
2554
|
+
this.currentProvenanceFilter = next.value;
|
|
2530
2555
|
this.updateQuery({
|
|
2531
2556
|
workspaceId: this.activeWorkspaceId,
|
|
2532
2557
|
currentUserId: this.currentUserId,
|
|
@@ -2606,6 +2631,7 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
|
|
|
2606
2631
|
return;
|
|
2607
2632
|
}
|
|
2608
2633
|
this.currentFilter = filter;
|
|
2634
|
+
this.currentProvenanceFilter = this.provenanceFilters.value(filter);
|
|
2609
2635
|
this.clearTimer();
|
|
2610
2636
|
this.abortActiveRequest();
|
|
2611
2637
|
this.directoryRequestLifecycle.cancel();
|
|
@@ -3184,4 +3210,4 @@ export {
|
|
|
3184
3210
|
AgentMentionSearchController,
|
|
3185
3211
|
preloadAgentMentionBrowse
|
|
3186
3212
|
};
|
|
3187
|
-
//# sourceMappingURL=chunk-
|
|
3213
|
+
//# sourceMappingURL=chunk-G2KRK7Z5.js.map
|