@tutti-os/agent-gui 0.0.63 → 0.0.64
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/dist/agent-conversation/index.d.ts +2 -2
- package/dist/agent-conversation/index.js +7 -7
- package/dist/agent-env/index.js +2 -1
- package/dist/agent-env/index.js.map +1 -1
- package/dist/agent-message-center/index.js +9 -9
- package/dist/{agentGuiNodeTypes-CC52zXAV.d.ts → agentGuiNodeTypes-CCjzXdTe.d.ts} +4 -1
- package/dist/app/renderer/agentactivity.css +38 -4
- package/dist/app/renderer/assets/icons/agents/agent-colorful.png +0 -0
- package/dist/app/renderer/assets/icons/agents/cursor-colorful.png +0 -0
- package/dist/app/renderer/assets/icons/agents/cursor-flat-filled.svg +3 -0
- package/dist/app/renderer/assets/icons/agents/cursor-rounded.png +0 -0
- package/dist/{chunk-IIVHPXAB.js → chunk-2IMBPRKV.js} +1 -1
- package/dist/chunk-2IMBPRKV.js.map +1 -0
- package/dist/{chunk-4UTWOSHP.js → chunk-3NSUJ7OF.js} +5 -1
- package/dist/chunk-3NSUJ7OF.js.map +1 -0
- package/dist/{chunk-SGXYVGQT.js → chunk-52VZ54WH.js} +5 -5
- package/dist/{chunk-CVSCZ3CK.js → chunk-76GTKO4Q.js} +7 -2
- package/dist/chunk-76GTKO4Q.js.map +1 -0
- package/dist/{chunk-G6UO6JVM.js → chunk-C465B7WK.js} +2 -2
- package/dist/{chunk-22L4VWUR.js → chunk-CKCUEHBW.js} +3 -1
- package/dist/chunk-CKCUEHBW.js.map +1 -0
- package/dist/{chunk-FRCIPTUD.js → chunk-ERWDRI3F.js} +8 -18
- package/dist/chunk-ERWDRI3F.js.map +1 -0
- package/dist/{chunk-6MUKWI6Z.js → chunk-F6GDUU4X.js} +167 -113
- package/dist/chunk-F6GDUU4X.js.map +1 -0
- package/dist/{chunk-FQQDBBNI.js → chunk-FLTLZGIN.js} +3 -3
- package/dist/{chunk-5WB3NGIN.js → chunk-FUJ73PTH.js} +29 -2
- package/dist/chunk-FUJ73PTH.js.map +1 -0
- package/dist/{chunk-RO6KQD3J.js → chunk-IIXCU2UU.js} +2 -2
- package/dist/{chunk-CA25GD5Q.js → chunk-MQ6RKXXW.js} +34 -4
- package/dist/chunk-MQ6RKXXW.js.map +1 -0
- package/dist/{chunk-NZN43XT5.js → chunk-PVVM7MZZ.js} +8 -6
- package/dist/chunk-PVVM7MZZ.js.map +1 -0
- package/dist/{chunk-V4JGVBUN.js → chunk-R2NGSPQS.js} +32 -1
- package/dist/chunk-R2NGSPQS.js.map +1 -0
- package/dist/{chunk-QC642RAG.js → chunk-RDRKIMAC.js} +15 -8
- package/dist/chunk-RDRKIMAC.js.map +1 -0
- package/dist/{chunk-ZUVEBW5T.js → chunk-TFPKI4XJ.js} +2 -2
- package/dist/{chunk-SW6JCJCO.js → chunk-TT2YJNEP.js} +3 -3
- package/dist/{chunk-K4UUEG7X.js → chunk-YFTQK2G4.js} +113 -34
- package/dist/chunk-YFTQK2G4.js.map +1 -0
- package/dist/{chunk-3KS22CG2.js → chunk-YUMHFZ5A.js} +3 -3
- package/dist/{chunk-7P6CUYQT.js → chunk-ZTZ6STJZ.js} +2 -2
- package/dist/context-mention-palette/index.js +8 -8
- package/dist/cursor-flat-filled-CL7N3BTZ.svg +3 -0
- package/dist/i18n/index.d.ts +33 -3
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +7 -5
- package/dist/index.js +666 -214
- package/dist/index.js.map +1 -1
- package/dist/queued-prompt-runtime.d.ts +2 -2
- package/dist/{types-DSc2ta3s.d.ts → types-BAPEle8b.d.ts} +3 -3
- package/dist/workbench/contribution.d.ts +10 -3
- package/dist/workbench/contribution.js +10 -8
- package/dist/workbench/index.d.ts +4 -2
- package/dist/workbench/index.js +11 -11
- package/dist/workbench/launch.d.ts +1 -1
- package/dist/workbench/launch.js +3 -3
- package/dist/workbench/providerCatalog.d.ts +2 -2
- package/dist/workbench/providerCatalog.js +1 -1
- package/dist/workbench/sessionTitle.d.ts +1 -1
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workbench/state.d.ts +1 -1
- package/dist/workbench/state.js +3 -3
- package/dist/workbench/types.d.ts +3 -2
- package/dist/workbench/types.js +1 -1
- package/dist/workspace-agent-generated-files.js +3 -3
- package/package.json +12 -12
- package/dist/chunk-22L4VWUR.js.map +0 -1
- package/dist/chunk-4UTWOSHP.js.map +0 -1
- package/dist/chunk-5WB3NGIN.js.map +0 -1
- package/dist/chunk-6MUKWI6Z.js.map +0 -1
- package/dist/chunk-CA25GD5Q.js.map +0 -1
- package/dist/chunk-CVSCZ3CK.js.map +0 -1
- package/dist/chunk-FRCIPTUD.js.map +0 -1
- package/dist/chunk-IIVHPXAB.js.map +0 -1
- package/dist/chunk-K4UUEG7X.js.map +0 -1
- package/dist/chunk-NZN43XT5.js.map +0 -1
- package/dist/chunk-QC642RAG.js.map +0 -1
- package/dist/chunk-V4JGVBUN.js.map +0 -1
- /package/dist/{chunk-SGXYVGQT.js.map → chunk-52VZ54WH.js.map} +0 -0
- /package/dist/{chunk-G6UO6JVM.js.map → chunk-C465B7WK.js.map} +0 -0
- /package/dist/{chunk-FQQDBBNI.js.map → chunk-FLTLZGIN.js.map} +0 -0
- /package/dist/{chunk-RO6KQD3J.js.map → chunk-IIXCU2UU.js.map} +0 -0
- /package/dist/{chunk-ZUVEBW5T.js.map → chunk-TFPKI4XJ.js.map} +0 -0
- /package/dist/{chunk-SW6JCJCO.js.map → chunk-TT2YJNEP.js.map} +0 -0
- /package/dist/{chunk-3KS22CG2.js.map → chunk-YUMHFZ5A.js.map} +0 -0
- /package/dist/{chunk-7P6CUYQT.js.map → chunk-ZTZ6STJZ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/managedAgentProviders.ts","../managedAgentIconAssets.ts"],"sourcesContent":["export function normalizeManagedAgentProvider(\n provider: string | undefined\n): string {\n const normalized =\n provider\n ?.trim()\n .toLowerCase()\n .replace(/[_\\s]+/gu, \"-\") ?? \"\";\n switch (normalized) {\n case \"claude\":\n case \"claude-code\":\n return \"claude-code\";\n case \"nexight\":\n case \"tutti-doc\":\n return \"tutti\";\n default:\n return normalized;\n }\n}\n","import claudeRoundedAssetUrl from \"./app/renderer/assets/icons/agents/claude-rounded.png\";\nimport codexRoundedAssetUrl from \"./app/renderer/assets/icons/agents/codex-rounded.png\";\nimport cursorColorfulAssetUrl from \"./app/renderer/assets/icons/agents/cursor-colorful.png\";\nimport cursorRoundedAssetUrl from \"./app/renderer/assets/icons/agents/cursor-rounded.png\";\nimport geminiRoundedAssetUrl from \"./app/renderer/assets/icons/agents/gemini-rounded.png\";\nimport hermesRoundedAssetUrl from \"./app/renderer/assets/icons/agents/hermes-rounded.png\";\nimport agentColorfulAssetUrl from \"./app/renderer/assets/icons/agents/agent-colorful.png\";\nimport manageAgentTuttiAssetUrl from \"./app/renderer/assets/icons/agents/manage-agent-tutti.png\";\nimport openclawRoundedAssetUrl from \"./app/renderer/assets/icons/agents/openclaw-rounded.png\";\nimport providerRailClaudeCodeColorfulAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-claude-code-colorful.png\";\nimport providerRailCodexColorfulAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-codex-colorful.png\";\nimport providerRailHermesColorfulAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-hermes-colorful.png\";\nimport providerRailTuttiAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-tutti.png\";\n\nexport const manageAgentClaudeCodeUrl = claudeRoundedAssetUrl;\nexport const manageAgentCodexUrl = codexRoundedAssetUrl;\nexport const manageAgentCursorUrl = cursorRoundedAssetUrl;\nexport const manageAgentGeminiUrl = geminiRoundedAssetUrl;\nexport const manageAgentHermesUrl = hermesRoundedAssetUrl;\nexport const manageAgentTuttiUrl = manageAgentTuttiAssetUrl;\nexport const manageAgentOpenclawUrl = openclawRoundedAssetUrl;\nexport const agentColorfulUrl = agentColorfulAssetUrl;\nexport const claudeRoundedUrl = claudeRoundedAssetUrl;\nexport const codexRoundedUrl = codexRoundedAssetUrl;\nexport const cursorColorfulUrl = cursorColorfulAssetUrl;\nexport const cursorRoundedUrl = cursorRoundedAssetUrl;\nexport const geminiRoundedUrl = geminiRoundedAssetUrl;\nexport const hermesRoundedUrl = hermesRoundedAssetUrl;\nexport const tuttiDocRoundedUrl = manageAgentTuttiAssetUrl;\nexport const openclawRoundedUrl = openclawRoundedAssetUrl;\nexport const providerRailClaudeCodeColorfulUrl =\n providerRailClaudeCodeColorfulAssetUrl;\nexport const providerRailCodexColorfulUrl = providerRailCodexColorfulAssetUrl;\nexport const providerRailHermesColorfulUrl = providerRailHermesColorfulAssetUrl;\nexport const providerRailTuttiUrl = providerRailTuttiAssetUrl;\n"],"mappings":";AAAO,SAAS,8BACd,UACQ;AACR,QAAM,aACJ,UACI,KAAK,EACN,YAAY,EACZ,QAAQ,YAAY,GAAG,KAAK;AACjC,UAAQ,YAAY;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJO,IAAM,2BAA2B;AACjC,IAAM,sBAAsB;AAE5B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,oCACX;AACK,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AACtC,IAAM,uBAAuB;","names":[]}
|
|
@@ -7,17 +7,17 @@ import {
|
|
|
7
7
|
AgentGUIConversation_styles_default,
|
|
8
8
|
MessageSquareMoreIcon,
|
|
9
9
|
extractAgentMcpToolTarget
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-TT2YJNEP.js";
|
|
11
11
|
import {
|
|
12
12
|
Spinner
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-TFPKI4XJ.js";
|
|
14
14
|
import {
|
|
15
15
|
getOptionalAgentHostApi,
|
|
16
16
|
useOptionalAgentHostApi
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-ERWDRI3F.js";
|
|
18
18
|
import {
|
|
19
19
|
translate
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-IIXCU2UU.js";
|
|
21
21
|
|
|
22
22
|
// shared/agentConversation/approvalOptionPresentation.ts
|
|
23
23
|
function approvalOptionDisplayLabel(option, intent = {}) {
|
|
@@ -272,6 +272,7 @@ import {
|
|
|
272
272
|
useState
|
|
273
273
|
} from "react";
|
|
274
274
|
import {
|
|
275
|
+
Button,
|
|
275
276
|
ShortcutBadge,
|
|
276
277
|
Tooltip,
|
|
277
278
|
TooltipContent,
|
|
@@ -945,18 +946,22 @@ function FullAskUserPromptSurface({
|
|
|
945
946
|
),
|
|
946
947
|
/* @__PURE__ */ jsxs("div", { className: AgentGUIConversation_styles_default.interactivePromptActions, children: [
|
|
947
948
|
/* @__PURE__ */ jsx(
|
|
948
|
-
|
|
949
|
+
Button,
|
|
949
950
|
{
|
|
950
951
|
type: "button",
|
|
952
|
+
variant: "secondary",
|
|
953
|
+
size: "sm",
|
|
951
954
|
disabled: isSubmitting || index === 0,
|
|
952
955
|
onClick: () => setIndex((current) => Math.max(current - 1, 0)),
|
|
953
956
|
children: labels.previousQuestion
|
|
954
957
|
}
|
|
955
958
|
),
|
|
956
959
|
isLast ? /* @__PURE__ */ jsx(
|
|
957
|
-
|
|
960
|
+
Button,
|
|
958
961
|
{
|
|
959
962
|
type: "button",
|
|
963
|
+
variant: "default",
|
|
964
|
+
size: "sm",
|
|
960
965
|
disabled: isSubmitting || Object.keys(payload.answersByQuestionId).length === 0,
|
|
961
966
|
onClick: () => onSubmit({
|
|
962
967
|
requestId: prompt.requestId,
|
|
@@ -966,9 +971,11 @@ function FullAskUserPromptSurface({
|
|
|
966
971
|
children: labels.submitAnswers
|
|
967
972
|
}
|
|
968
973
|
) : /* @__PURE__ */ jsx(
|
|
969
|
-
|
|
974
|
+
Button,
|
|
970
975
|
{
|
|
971
976
|
type: "button",
|
|
977
|
+
variant: "default",
|
|
978
|
+
size: "sm",
|
|
972
979
|
disabled: isSubmitting || !canAdvance,
|
|
973
980
|
onClick: () => setIndex(
|
|
974
981
|
(current) => Math.min(current + 1, prompt.questions.length - 1)
|
|
@@ -1167,4 +1174,4 @@ export {
|
|
|
1167
1174
|
isPromptRequestIdTitle,
|
|
1168
1175
|
AgentInteractivePromptSurface
|
|
1169
1176
|
};
|
|
1170
|
-
//# sourceMappingURL=chunk-
|
|
1177
|
+
//# sourceMappingURL=chunk-RDRKIMAC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/agentConversation/approvalOptionPresentation.ts","../shared/agentConversation/promptToolDetails.ts","../shared/agentConversation/components/AgentInteractivePromptSurface.tsx","../shared/agentConversation/interactiveAnswerPayload.ts"],"sourcesContent":["import { translate } from \"../../i18n/index\";\n\nexport interface ApprovalOptionVisualPresentation {\n label: string;\n commandPrefix?: string;\n}\n\nexport function approvalOptionDisplayLabel(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): string {\n const idToken = normalizeApprovalOptionToken(option.id);\n const kindToken = normalizeApprovalOptionToken(option.kind);\n const label = option.label.trim();\n const specificTranslationKey = approvalOptionSpecificTranslationKey(\n idToken,\n label,\n intent\n );\n if (specificTranslationKey) {\n return translate(specificTranslationKey);\n }\n const providerLabelTranslation =\n approvalOptionProviderLabelTranslation(label);\n if (providerLabelTranslation) {\n return translate(\n providerLabelTranslation.key,\n providerLabelTranslation.params\n );\n }\n if (\n (idToken === \"allowonce\" || kindToken === \"allowonce\") &&\n isGenericAllowOnceLabel(label)\n ) {\n return translate(\"agentHost.agentGui.approvalOptions.allowOnce\");\n }\n if (isGenericAllowForSessionLabel(label)) {\n return translate(\"agentHost.agentGui.approvalOptions.allowForSession\");\n }\n if (\n (idToken === \"allowalways\" ||\n idToken === \"allowall\" ||\n kindToken === \"allowalways\") &&\n isGenericApprovalLabel(label)\n ) {\n return translate(\"agentHost.agentGui.approvalOptions.allowAlways\");\n }\n if (idToken === \"rejectalways\" || kindToken === \"rejectalways\") {\n return translate(\"agentHost.agentGui.approvalOptions.rejectAlways\");\n }\n if (\n idToken === \"rejectonce\" ||\n idToken === \"reject\" ||\n idToken === \"deny\" ||\n kindToken === \"rejectonce\" ||\n kindToken === \"reject\" ||\n kindToken === \"deny\"\n ) {\n return intent.feedback\n ? translate(\"agentHost.agentGui.approvalOptions.rejectWithFollowUp\")\n : translate(\"agentHost.agentGui.approvalOptions.rejectOnce\");\n }\n return label || option.id;\n}\n\nexport function approvalOptionVisualPresentation(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): ApprovalOptionVisualPresentation {\n const commandPrefix = approvalOptionCommandPrefix(option.label);\n if (commandPrefix) {\n return {\n label: translate(\n \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefixLead\"\n ),\n commandPrefix\n };\n }\n return {\n label: approvalOptionDisplayLabel(option, intent)\n };\n}\n\nexport function normalizeApprovalOptionToken(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction approvalOptionSpecificTranslationKey(\n token: string,\n label: string,\n intent: { feedback?: boolean } = {}\n): string | null {\n const labelToken = normalizeApprovalOptionToken(label);\n switch (token) {\n case \"approved\":\n return isGenericAllowOnceLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowOnce\"\n : null;\n case \"approvedforsession\":\n return isGenericAllowForSessionLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowForSession\"\n : null;\n case \"approvedalways\":\n return isGenericApprovalLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowAlways\"\n : null;\n case \"bypasspermissions\":\n return \"agentHost.agentGui.approvalOptions.bypassPermissions\";\n case \"auto\":\n return labelToken === \"yesanduseautomode\"\n ? \"agentHost.agentGui.approvalOptions.autoMode\"\n : null;\n case \"acceptedits\":\n return \"agentHost.agentGui.approvalOptions.acceptEdits\";\n case \"default\":\n return labelToken === \"yesandmanuallyapproveedits\"\n ? \"agentHost.agentGui.approvalOptions.manualApproval\"\n : null;\n case \"cancel\":\n return !intent.feedback && labelToken === \"cancel\"\n ? \"common.cancel\"\n : null;\n default:\n return null;\n }\n}\n\nfunction approvalOptionProviderLabelTranslation(\n label: string\n): { key: string; params: Record<string, string> } | null {\n const commandPrefix = approvalOptionCommandPrefix(label);\n if (commandPrefix) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefix\",\n params: { command: commandPrefix }\n };\n }\n\n const allowScopeMatch = label.match(/^Yes,\\s*and don't ask again for (.+)$/i);\n if (allowScopeMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForScope\",\n params: { scope: allowScopeMatch[1] }\n };\n }\n\n const alwaysAllowMatch = label.match(/^Always Allow\\s+(.+)$/i);\n if (alwaysAllowMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.alwaysAllowScope\",\n params: { scope: alwaysAllowMatch[1] }\n };\n }\n\n return null;\n}\n\nfunction approvalOptionCommandPrefix(label: string): string | null {\n const commandPrefixMatch = label.match(\n /^Yes,\\s*and don't ask again for commands that start with `([^`]+)`$/i\n );\n return commandPrefixMatch?.[1]?.trim() || null;\n}\n\nfunction isGenericApprovalLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allowalways\" ||\n token === \"allowall\" ||\n token === \"alwaysallow\" ||\n token === \"allowanddontaskagain\" ||\n token === \"yesanddontaskagain\"\n );\n}\n\nfunction isGenericAllowOnceLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allow\" ||\n token === \"allowonce\" ||\n token === \"approve\" ||\n token === \"approveonce\" ||\n token === \"yes\" ||\n token === \"yesproceed\" ||\n token === \"yesandproceed\"\n );\n}\n\nfunction isGenericAllowForSessionLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"allowforthissession\" ||\n token === \"allowforsession\" ||\n token === \"approveforsession\"\n );\n}\n","import { extractAgentMcpToolTarget } from \"../agentMcpToolTarget\";\n\nexport interface PromptToolDetail {\n kind: \"command\" | \"mcp\" | \"path\" | \"query\";\n value: string;\n meta?: string;\n}\n\nexport function getPromptToolDetails(\n input: Record<string, unknown> | null\n): PromptToolDetail[] {\n if (!input) {\n return [];\n }\n const mcpTarget = extractAgentMcpToolTarget({ input });\n const mcpDetails: PromptToolDetail[] = mcpTarget\n ? [\n {\n kind: \"mcp\",\n value: mcpTarget.displayName,\n ...(mcpTarget.instruction ? { meta: mcpTarget.instruction } : {})\n }\n ]\n : [];\n const detailInput = resolveToolDetailInput(input);\n const command =\n commandStringValue(detailInput.command) ??\n commandStringValue(detailInput.cmd);\n if (command) {\n return [\n ...mcpDetails,\n {\n kind: \"command\",\n value: command,\n ...(stringValue(detailInput.description)\n ? { meta: stringValue(detailInput.description) as string }\n : {})\n }\n ];\n }\n const filePath =\n stringValue(detailInput.file_path) ??\n stringValue(detailInput.filePath) ??\n stringValue(detailInput.path) ??\n stringValue(detailInput.notebook_path);\n if (filePath) {\n const lineRange = formatLineRange(detailInput);\n return [\n ...mcpDetails,\n {\n kind: \"path\",\n value: filePath,\n ...(lineRange ? { meta: lineRange } : {})\n }\n ];\n }\n const query =\n stringValue(detailInput.query) ??\n stringValue(detailInput.search_query) ??\n stringValue(detailInput.searchQuery) ??\n stringValue(detailInput.pattern);\n if (query) {\n return [\n ...mcpDetails,\n {\n kind: \"query\",\n value: query\n }\n ];\n }\n return mcpDetails;\n}\n\nexport function isPromptRequestIdTitle(value: string): boolean {\n return /^requestid\\s*:/iu.test(value.trim());\n}\n\nfunction resolveToolDetailInput(\n input: Record<string, unknown>\n): Record<string, unknown> {\n const toolCall = objectValue(input.toolCall);\n return (\n firstObjectValue(input, [\n \"command\",\n \"cmd\",\n \"file_path\",\n \"filePath\",\n \"path\",\n \"notebook_path\",\n \"query\",\n \"search_query\",\n \"searchQuery\",\n \"pattern\"\n ]) ??\n firstObjectValue(toolCall, [\n \"input\",\n \"rawInput\",\n \"raw_input\",\n \"arguments\",\n \"args\"\n ]) ??\n toolCall ??\n input\n );\n}\n\nfunction firstObjectValue(\n input: Record<string, unknown> | null,\n keys: readonly string[]\n): Record<string, unknown> | null {\n if (!input) {\n return null;\n }\n if (keys.some((key) => stringValue(input[key]))) {\n return input;\n }\n for (const key of keys) {\n const value = objectValue(input[key]);\n if (value) {\n return value;\n }\n }\n return null;\n}\n\nfunction formatLineRange(input: Record<string, unknown>): string | null {\n const start = numericValue(input.startLine) ?? numericValue(input.start_line);\n const end = numericValue(input.endLine) ?? numericValue(input.end_line);\n if (start === null || end === null) {\n return null;\n }\n return start === end ? `L${start}` : `L${start}-${end}`;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction commandStringValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (!Array.isArray(value)) {\n return null;\n }\n const shellFlag = stringValue(value[value.length - 2]);\n const shellCommand = stringValue(value[value.length - 1]);\n if ((shellFlag === \"-c\" || shellFlag === \"-lc\") && shellCommand) {\n return shellCommand;\n }\n const parts = value.flatMap((part) => {\n const text = stringValue(part);\n return text ? [text] : [];\n });\n return parts.length > 0 ? parts.join(\" \") : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction numericValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type JSX\n} from \"react\";\nimport { MessageSquareMoreIcon } from \"../../../app/renderer/components/icons/MessageSquareMoreIcon\";\nimport { Spinner } from \"../../../app/renderer/components/ui/spinner\";\nimport { translate } from \"../../../i18n/index\";\nimport {\n Button,\n ShortcutBadge,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport {\n getOptionalAgentHostApi,\n useOptionalAgentHostApi\n} from \"../../../agentActivityHost\";\nimport {\n approvalOptionDisplayLabel,\n approvalOptionVisualPresentation,\n normalizeApprovalOptionToken\n} from \"../approvalOptionPresentation\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { buildAskUserAnswerPayload } from \"../interactiveAnswerPayload\";\nimport {\n PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,\n PLAN_IMPLEMENTATION_ACTION_SKIP\n} from \"../planImplementation\";\nimport {\n getPromptToolDetails,\n type PromptToolDetail\n} from \"../promptToolDetails\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\n\nconst COMMAND_TOOLTIP_DELAY_MS = 1000;\n\n/**\n * Where the prompt is rendered, which sets its interaction budget:\n * - \"full\" (conversation / composer): the user is focused here, so every action\n * is shown — primary decisions plus rich follow-ups (feedback textareas,\n * multi-step wizards, \"stay in plan\").\n * - \"compact\" (message-center attention deck): a glanceable needs-attention card\n * across many sessions. Only the primary decision is shown; rich follow-up\n * input is deferred to the conversation, reachable via the card's \"open\n * conversation\" jump. New prompt kinds must consciously choose their compact\n * form here instead of silently inheriting the full conversation surface.\n */\nexport type AgentInteractivePromptVariant = \"full\" | \"compact\";\n\ninterface AgentInteractivePromptSurfaceProps {\n prompt: AgentConversationPromptVM;\n variant?: AgentInteractivePromptVariant;\n edgeGlow?: boolean;\n keyboardShortcuts?: boolean;\n previewMode?: boolean;\n isSubmitting: boolean;\n onSubmit: (input: {\n requestId: string;\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n }) => void;\n labels: {\n approvalLead: string;\n planLead: string;\n planModes: Array<{ id: string; label: string; description: string }>;\n stayInPlan: string;\n sendFeedback: string;\n feedbackPlaceholder: string;\n previousQuestion: string;\n nextQuestion: string;\n submitAnswers: string;\n answerPlaceholder: string;\n waitingForAnswer: string;\n planImplementationLead: string;\n planImplementationConfirm: string;\n planImplementationFeedbackPlaceholder: string;\n planImplementationSend: string;\n planImplementationSkip: string;\n };\n}\n\nexport function AgentInteractivePromptSurface({\n prompt,\n variant = \"full\",\n edgeGlow = false,\n embedded = false,\n keyboardShortcuts = true,\n previewMode = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n embedded?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n\n if (prompt.kind === \"approval\") {\n return (\n <ApprovalPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n keyboardShortcuts={keyboardShortcuts}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"exit-plan\") {\n return (\n <ExitPlanPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"plan-implementation\") {\n return (\n <PlanImplementationSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <AskUserPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n\n// Compact (message-center deck): a single-select question is answered with one\n// click — selecting an option submits it immediately, matching the approval and\n// plan cards. Multi-select / multi-question / free-text-only prompts can't be\n// answered in one tap, so they defer to the conversation (the card's \"open\n// conversation\" jump); their options are still shown as read-only context\n// (see the non-oneClickable branch below) rather than being omitted.\nfunction CompactAskUserPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const question = prompt.questions[0] ?? null;\n const oneClickable =\n prompt.questions.length === 1 &&\n question !== null &&\n !question.multiSelect &&\n question.options.length > 0;\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n {question ? (\n <>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {oneClickable ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: {\n ...buildAskUserAnswerPayload({\n [question.id]: option.label\n })\n }\n })\n }\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n ) : question.options.length > 0 ? (\n // Multi-select / multi-question prompts can't be answered with a\n // single click here, so the options are shown as read-only\n // context instead of being silently omitted. Answering still\n // happens in the full conversation via the card's \"open\n // conversation\" jump.\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => (\n <div\n key={option.label}\n className={styles.interactiveOptionDisplay}\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 </div>\n ))}\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction ApprovalPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n keyboardShortcuts = true,\n previewMode = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"approval\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const promptDetails = useMemo(\n () => formatToolDetails(prompt.input ?? null),\n [prompt.input]\n );\n const [submittingOptionId, setSubmittingOptionId] = useState<string | null>(\n null\n );\n const [pendingFeedbackOptionId, setPendingFeedbackOptionId] = useState<\n string | null\n >(null);\n const [feedback, setFeedback] = useState(\"\");\n const feedbackTextareaRef = useRef<HTMLTextAreaElement | null>(null);\n const agentHostApi = useOptionalAgentHostApi() ?? getOptionalAgentHostApi();\n const isDarwin = isDarwinPlatform(agentHostApi?.meta?.platform);\n const feedbackOptionId = useMemo(\n () => approvalFeedbackOptionId(prompt.options),\n [prompt.options]\n );\n const feedbackValue = feedback.trim();\n\n useEffect(() => {\n setSubmittingOptionId(null);\n setPendingFeedbackOptionId(null);\n setFeedback(\"\");\n }, [prompt.requestId]);\n\n useEffect(() => {\n if (pendingFeedbackOptionId !== null) {\n feedbackTextareaRef.current?.focus();\n }\n }, [pendingFeedbackOptionId]);\n\n const submitOption = useCallback(\n (optionId: string) => {\n const feedbackOption = feedbackOptionId === optionId;\n if (feedbackOption && pendingFeedbackOptionId !== optionId) {\n setFeedback(\"\");\n setPendingFeedbackOptionId(optionId);\n return;\n }\n setSubmittingOptionId(optionId);\n onSubmit({\n requestId: prompt.requestId,\n ...(feedbackOption ? { action: \"deny\" } : {}),\n optionId,\n ...(feedbackOption && feedbackValue\n ? { payload: { denyMessage: feedbackValue } }\n : {})\n });\n },\n [\n feedbackOptionId,\n feedbackValue,\n onSubmit,\n pendingFeedbackOptionId,\n prompt.requestId\n ]\n );\n\n useEffect(() => {\n if (\n !keyboardShortcuts ||\n isSubmitting ||\n submittingOptionId !== null ||\n prompt.options.length === 0\n ) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (\n !isEnterLikeKey(event) ||\n isEditableKeyboardTarget(event.target) ||\n event.isComposing ||\n event.altKey ||\n event.shiftKey\n ) {\n return;\n }\n const optionIndex = event.metaKey || event.ctrlKey ? 1 : 0;\n const option = prompt.options[optionIndex];\n if (!option) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n submitOption(option.id);\n };\n\n window.addEventListener(\"keydown\", handleKeyDown, true);\n return () => window.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [\n isSubmitting,\n keyboardShortcuts,\n prompt.options,\n submitOption,\n submittingOptionId\n ]);\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.approvalLead)}\n </div>\n {promptDetails.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {promptDetails.map((detail) => (\n <div\n key={`${detail.label}:${detail.value}`}\n className={styles.interactiveOptionDisplay}\n >\n <span className={styles.interactiveOptionTitle}>\n {detail.label}\n </span>\n <PromptDetailValue detail={detail} previewMode={previewMode} />\n {detail.meta ? (\n <span className={styles.interactiveOptionDescription}>\n {detail.meta}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n <div className={styles.interactivePromptOptions}>\n {prompt.options.map((option, optionIndex) => {\n const showSpinner = submittingOptionId === option.id;\n const optionSupportsFeedback = feedbackOptionId === option.id;\n const optionLabel = approvalOptionDisplayLabel(option, {\n feedback: optionSupportsFeedback\n });\n const optionPresentation = approvalOptionVisualPresentation(\n option,\n { feedback: optionSupportsFeedback }\n );\n const shortcutLabel = approvalOptionShortcutLabel(\n optionIndex,\n isDarwin\n );\n const showFeedbackComposer = pendingFeedbackOptionId === option.id;\n if (showFeedbackComposer) {\n return (\n <div\n key={option.id}\n className={styles.interactiveFeedbackComposer}\n >\n <textarea\n ref={feedbackTextareaRef}\n value={feedback}\n placeholder={labels.feedbackPlaceholder}\n disabled={isSubmitting || submittingOptionId !== null}\n className={styles.interactivePromptTextarea}\n aria-label={interactiveOptionLabel(\n optionLabel,\n option.description\n )}\n onChange={(event) => setFeedback(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (\n !keyboardShortcuts ||\n event.key !== \"Enter\" ||\n (!event.metaKey && !event.ctrlKey) ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n if (!feedbackValue) {\n feedbackTextareaRef.current?.focus();\n return;\n }\n submitOption(option.id);\n }}\n />\n <button\n type=\"button\"\n className={styles.interactiveFeedbackSendButton}\n disabled={\n isSubmitting ||\n submittingOptionId !== null ||\n !feedbackValue\n }\n aria-label={labels.sendFeedback}\n title={labels.sendFeedback}\n aria-busy={showSpinner}\n onClick={() => {\n if (!feedbackValue) {\n feedbackTextareaRef.current?.focus();\n return;\n }\n submitOption(option.id);\n }}\n >\n {showSpinner ? (\n <InteractiveOptionSpinner />\n ) : (\n <SendFilledIcon />\n )}\n </button>\n </div>\n );\n }\n return (\n <button\n key={option.id}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n optionLabel,\n option.description\n )}\n disabled={isSubmitting || submittingOptionId !== null}\n onClick={() => submitOption(option.id)}\n >\n <span className={styles.interactiveOptionTitle}>\n {optionPresentation.label}\n </span>\n {optionPresentation.commandPrefix ? (\n <CommandTextWithTooltip\n value={optionPresentation.commandPrefix}\n testId=\"agent-interactive-command-prefix-option\"\n tooltipsEnabled={!previewMode}\n />\n ) : null}\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n {keyboardShortcuts && shortcutLabel && !showSpinner ? (\n <ShortcutBadge\n className={styles.interactiveOptionShortcut}\n aria-hidden=\"true\"\n >\n {shortcutLabel}\n </ShortcutBadge>\n ) : null}\n {showSpinner ? <InteractiveOptionSpinner /> : null}\n </button>\n );\n })}\n </div>\n </div>\n </section>\n );\n}\n\nfunction ExitPlanPromptSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"exit-plan\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [feedback, setFeedback] = useState(\"\");\n // Compact (message-center deck): only the permission-mode decision buttons are\n // offered; refining / staying in plan is deferred to the conversation.\n const showFeedbackFooter = variant !== \"compact\";\n const [submittingOptionId, setSubmittingOptionId] = useState<string | null>(\n null\n );\n const trimmed = feedback.trim();\n const continueLabel =\n trimmed === \"\" ? labels.stayInPlan : labels.sendFeedback;\n // 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 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.\nfunction PlanImplementationSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"plan-implementation\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [feedback, setFeedback] = useState(\"\");\n const trimmed = feedback.trim();\n const continueLabel =\n trimmed === \"\"\n ? labels.planImplementationSkip\n : labels.planImplementationSend;\n // Compact (message-center deck): only the \"implement\" decision is offered.\n // Refining or staying in plan mode is deferred to the conversation, reachable\n // via the card's \"open conversation\" jump.\n const showFeedbackFooter = variant !== \"compact\";\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.planImplementationLead)}\n </div>\n <div className={styles.interactivePromptOptions}>\n <button\n type=\"button\"\n className={styles.interactiveOptionButton}\n data-testid=\"agent-plan-implementation-implement\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: PLAN_IMPLEMENTATION_ACTION_IMPLEMENT\n })\n }\n >\n <span className={styles.interactiveOptionTitle}>\n {labels.planImplementationConfirm}\n </span>\n </button>\n </div>\n {showFeedbackFooter ? (\n <div className={styles.interactivePromptFooter}>\n <textarea\n value={feedback}\n placeholder={labels.planImplementationFeedbackPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n data-testid=\"agent-plan-implementation-feedback\"\n onChange={(event) => setFeedback(event.currentTarget.value)}\n />\n <div className={styles.interactivePromptActions}>\n <button\n type=\"button\"\n data-testid=\"agent-plan-implementation-continue\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action:\n trimmed === \"\"\n ? PLAN_IMPLEMENTATION_ACTION_SKIP\n : PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n payload: trimmed ? { text: trimmed } : undefined\n })\n }\n >\n {continueLabel}\n </button>\n </div>\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction AskUserPromptSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n if (variant === \"compact\") {\n return (\n <CompactAskUserPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <FullAskUserPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n\nfunction FullAskUserPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [index, setIndex] = useState(0);\n const [selectedByQuestionId, setSelectedByQuestionId] = useState<\n Record<string, string[]>\n >({});\n const [freeTextByQuestionId, setFreeTextByQuestionId] = useState<\n Record<string, string>\n >({});\n\n const question = prompt.questions[index] ?? null;\n const selected = question ? (selectedByQuestionId[question.id] ?? []) : [];\n const freeText = question ? (freeTextByQuestionId[question.id] ?? \"\") : \"\";\n const canAdvance =\n question !== null &&\n (selected.length > 0 ||\n freeText.trim() !== \"\" ||\n question.options.length === 0);\n const isLast = index >= prompt.questions.length - 1;\n\n const payload = useMemo(() => {\n const answersByQuestionId: Record<string, string | string[]> = {};\n for (const current of prompt.questions) {\n const chosen = selectedByQuestionId[current.id] ?? [];\n const other = (freeTextByQuestionId[current.id] ?? \"\").trim();\n if (current.multiSelect) {\n const value = other ? [...chosen, other] : chosen;\n if (value.length > 0) {\n answersByQuestionId[current.id] = value;\n }\n continue;\n }\n const value = other || chosen[0];\n if (value) {\n answersByQuestionId[current.id] = value;\n }\n }\n return buildAskUserAnswerPayload(answersByQuestionId);\n }, [freeTextByQuestionId, prompt.questions, selectedByQuestionId]);\n\n if (!question) {\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div\n className={`${styles.interactivePromptLead} inline-flex items-center gap-1.5`}\n >\n <MessageSquareMoreIcon\n size={15}\n active\n aria-hidden=\"true\"\n className=\"shrink-0\"\n />\n {stripPromptTitlePunctuation(labels.waitingForAnswer)}\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n <span className={styles.interactivePromptMeta}>\n {index + 1}/{prompt.questions.length}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {question.options.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => {\n const active = selected.includes(option.label);\n return (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n data-active={active}\n aria-pressed={active}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() => {\n setSelectedByQuestionId((current) => {\n const existing = current[question.id] ?? [];\n const next = question.multiSelect\n ? existing.includes(option.label)\n ? existing.filter((value) => value !== option.label)\n : [...existing, option.label]\n : existing.includes(option.label)\n ? []\n : [option.label];\n return { ...current, [question.id]: next };\n });\n }}\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n </button>\n );\n })}\n </div>\n ) : null}\n <textarea\n value={freeText}\n placeholder={labels.answerPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n onChange={(event) => {\n const value = event.currentTarget.value;\n setFreeTextByQuestionId((current) => ({\n ...current,\n [question.id]: value\n }));\n }}\n />\n <div className={styles.interactivePromptActions}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n disabled={isSubmitting || index === 0}\n onClick={() => setIndex((current) => Math.max(current - 1, 0))}\n >\n {labels.previousQuestion}\n </Button>\n {isLast ? (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={\n isSubmitting ||\n Object.keys(payload.answersByQuestionId).length === 0\n }\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: { ...payload }\n })\n }\n >\n {labels.submitAnswers}\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isSubmitting || !canAdvance}\n onClick={() =>\n setIndex((current) =>\n Math.min(current + 1, prompt.questions.length - 1)\n )\n }\n >\n {labels.nextQuestion}\n </Button>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nfunction isEnterLikeKey(event: KeyboardEvent): boolean {\n return (\n event.key === \"Enter\" ||\n event.code === \"Enter\" ||\n event.code === \"NumpadEnter\"\n );\n}\n\nfunction isEditableKeyboardTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n const tagName = target.tagName.toLowerCase();\n return (\n tagName === \"input\" ||\n tagName === \"textarea\" ||\n tagName === \"select\" ||\n target.isContentEditable\n );\n}\n\nfunction approvalOptionShortcutLabel(\n optionIndex: number,\n isDarwin: boolean\n): string | null {\n if (optionIndex === 0) {\n return translate(\"agentHost.agentGui.shortcutEnter\");\n }\n if (optionIndex === 1) {\n return isDarwin\n ? translate(\"agentHost.agentGui.shortcutCmdEnter\")\n : translate(\"agentHost.agentGui.shortcutCtrEnter\");\n }\n return null;\n}\n\nfunction isDarwinPlatform(platform: string | undefined): boolean {\n if (platform) {\n return platform === \"darwin\";\n }\n if (typeof navigator === \"undefined\") {\n return false;\n }\n const userAgentPlatform =\n \"userAgentData\" in navigator\n ? (\n navigator as Navigator & {\n userAgentData?: { platform?: string };\n }\n ).userAgentData?.platform\n : undefined;\n const navigatorPlatform = userAgentPlatform ?? navigator.platform ?? \"\";\n return /mac/i.test(navigatorPlatform);\n}\n\nfunction InteractiveOptionSpinner(): JSX.Element {\n \"use memo\";\n return (\n <Spinner\n className={styles.interactiveOptionSpinner}\n testId=\"agent-interactive-option-spinner\"\n />\n );\n}\n\nfunction SendFilledIcon(): JSX.Element {\n \"use memo\";\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2.74311 8.80587C2.84592 8.40096 3.14571 8.08844 3.54551 7.97033L18.5197 3.51569C18.9336 3.39383 19.3809 3.5054 19.6881 3.81262C19.9951 4.11984 20.1076 4.56798 19.9857 4.9817L15.5311 19.9559C15.413 20.3557 15.1005 20.6555 14.6956 20.7583C14.2895 20.8597 13.869 20.7438 13.5721 20.4469L10.455 15.1823C10.8585 14.6483 12.1563 12.9094 14.3475 9.96528C14.6086 9.70419 14.6382 9.31168 14.4138 9.08692C14.1891 8.86221 13.796 8.8913 13.5348 9.15252L8.31088 13.0423L3.05316 9.92799C2.7562 9.63104 2.64049 9.21071 2.74311 8.80587Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction interactivePromptClassName(embedded: boolean): string {\n return embedded\n ? `${styles.interactivePrompt} agent-gui-conversation__interactive-prompt--embedded`\n : styles.interactivePrompt;\n}\n\nfunction interactivePromptCardClassName(edgeGlow: boolean): string {\n return edgeGlow\n ? `${styles.interactivePromptCard} agent-gui-edge-glow`\n : styles.interactivePromptCard;\n}\n\ninterface LabeledPromptToolDetail {\n kind: PromptToolDetail[\"kind\"];\n label: string;\n value: string;\n meta?: string;\n}\n\nfunction formatToolDetails(\n input: Record<string, unknown> | null\n): LabeledPromptToolDetail[] {\n return getPromptToolDetails(input).map((detail) => ({\n kind: detail.kind,\n label: promptToolDetailLabel(detail.kind),\n value: detail.value,\n ...(detail.meta ? { meta: detail.meta } : {})\n }));\n}\n\nfunction PromptDetailValue({\n detail,\n previewMode\n}: {\n detail: LabeledPromptToolDetail;\n previewMode: boolean;\n}): JSX.Element {\n \"use memo\";\n if (detail.kind !== \"command\") {\n return (\n <span className={styles.interactiveOptionDescription}>\n {detail.value}\n </span>\n );\n }\n return (\n <CommandTextWithTooltip\n value={detail.value}\n testId=\"agent-interactive-command-detail\"\n tooltipsEnabled={!previewMode}\n />\n );\n}\n\nfunction CommandTextWithTooltip({\n value,\n testId,\n tooltipsEnabled = true\n}: {\n value: string;\n testId: string;\n tooltipsEnabled?: boolean;\n}): JSX.Element {\n \"use memo\";\n const content = (\n <span\n className={`${styles.interactiveOptionDescription} ${styles.interactiveOptionCommandDescription}`}\n data-agent-interactive-command-detail={\n testId === \"agent-interactive-command-detail\" ? \"true\" : undefined\n }\n data-agent-interactive-command-prefix-option={\n testId === \"agent-interactive-command-prefix-option\"\n ? \"true\"\n : undefined\n }\n >\n {value}\n </span>\n );\n\n if (!tooltipsEnabled) {\n return content;\n }\n\n return (\n <TooltipProvider delayDuration={COMMAND_TOOLTIP_DELAY_MS}>\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent className={styles.interactiveOptionCommandTooltip}>\n {value}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction promptToolDetailLabel(kind: PromptToolDetail[\"kind\"]): string {\n switch (kind) {\n case \"command\":\n return translate(\"agentHost.agentTool.details.command\");\n case \"mcp\":\n return translate(\"agentHost.agentTool.details.mcp\");\n case \"path\":\n return translate(\"agentHost.agentTool.details.path\");\n case \"query\":\n return translate(\"agentHost.agentTool.details.query\");\n }\n}\n\nfunction isApprovalFeedbackOption(option: {\n id: string;\n kind: string;\n}): boolean {\n return (\n isDenyApprovalOptionToken(option.id) ||\n isDenyApprovalOptionToken(option.kind)\n );\n}\n\nfunction approvalFeedbackOptionId(\n options: readonly { id: string; kind: string }[]\n): string | null {\n const explicitFeedbackOption = options.find((option) =>\n isExplicitFeedbackDenyApprovalOption(option)\n );\n if (explicitFeedbackOption) {\n return explicitFeedbackOption.id;\n }\n return options.find(isApprovalFeedbackOption)?.id ?? null;\n}\n\nfunction isExplicitFeedbackDenyApprovalOption(option: {\n id: string;\n kind: string;\n}): boolean {\n for (const value of [option.id, option.kind]) {\n switch (normalizeApprovalOptionToken(value ?? \"\")) {\n case \"abort\":\n case \"cancel\":\n case \"cancelled\":\n case \"canceled\":\n case \"denywithfeedback\":\n case \"rejectwithfeedback\":\n return true;\n default:\n break;\n }\n }\n return false;\n}\n\nfunction isDenyApprovalOptionToken(value: string | null | undefined): boolean {\n switch (normalizeApprovalOptionToken(value ?? \"\")) {\n case \"abort\":\n case \"cancel\":\n case \"cancelled\":\n case \"canceled\":\n case \"deny\":\n case \"denied\":\n case \"reject\":\n case \"rejected\":\n case \"rejectonce\":\n case \"disallow\":\n case \"decline\":\n case \"declined\":\n case \"no\":\n return true;\n default:\n return false;\n }\n}\n\nfunction stripPromptTitlePunctuation(value: string): string {\n return value.trim().replace(/[.。]+$/u, \"\");\n}\n\nfunction interactiveOptionLabel(\n label: string,\n description: string | null | undefined\n): string {\n const trimmedDescription = description?.trim();\n return trimmedDescription ? `${label} ${trimmedDescription}` : label;\n}\n","/**\n * Wire contract for the answer submitted back to an interactive `ask-user`\n * prompt. This payload crosses the renderer → daemon boundary (it rides\n * `submitInteractive({ action: \"submit\", payload })`), so its shape is a\n * cross-language contract, not an internal detail.\n *\n * Consumers that MUST stay in sync with this shape:\n * - daemon (Go) standard ACP adapter — forwards `answersByQuestionId` verbatim.\n * - daemon (Go) codex app-server adapter — `appServerUserInputAnswers` reshapes\n * `answersByQuestionId` into codex's `requestUserInput` response.\n *\n * Field semantics:\n * - `answersByQuestionId` is the canonical, machine-readable answer: question id\n * → the chosen option label(s) / free text. This is what providers consume.\n * - `answers` is a flat, human-readable display list (one entry per answered\n * question, multi-select joined). Never the source of truth for routing.\n *\n * Always build this with {@link buildAskUserAnswerPayload} so producers can't\n * drift on field names or which field is authoritative.\n */\nexport interface InteractiveAnswerPayload {\n answers: string[];\n answersByQuestionId: Record<string, string | string[]>;\n}\n\n/**\n * Builds the canonical interactive answer payload from the per-question answers.\n * `answers` is derived from `answersByQuestionId` (multi-select values joined)\n * so the two fields can never disagree.\n */\nexport function buildAskUserAnswerPayload(\n answersByQuestionId: Record<string, string | string[]>\n): InteractiveAnswerPayload {\n const answers = Object.values(answersByQuestionId).map((value) =>\n Array.isArray(value) ? value.join(\", \") : value\n );\n return { answers, answersByQuestionId };\n}\n"],"mappings":"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","names":["value"]}
|