@tutti-os/agent-gui 0.0.210 → 0.0.212

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +3 -1
  2. package/dist/{AgentRichTextReadonly-DFWY2WYO.js → AgentRichTextReadonly-WWU4ZF7W.js} +5 -5
  3. package/dist/agent-conversation/index.d.ts +1 -1
  4. package/dist/agent-conversation/index.js +8 -8
  5. package/dist/agent-conversation/interactive-answer.d.ts +34 -0
  6. package/dist/agent-conversation/interactive-answer.js +11 -0
  7. package/dist/agent-conversation/interactive-answer.js.map +1 -0
  8. package/dist/agent-gui.d.ts +7 -4
  9. package/dist/agent-gui.js +16 -15
  10. package/dist/agent-message-center/index.js +8 -7
  11. package/dist/agent-message-center/index.js.map +1 -1
  12. package/dist/{agentFileMentionContracts-B0yQizXB.d.ts → agentFileMentionContracts-BeBex-Sf.d.ts} +5 -0
  13. package/dist/{agentGuiNodeTypes-DTeerTzS.d.ts → agentGuiNodeTypes-BMcpfKTn.d.ts} +5 -1
  14. package/dist/app/renderer/agentactivity.css +50 -0
  15. package/dist/app/renderer/assets/icons/agents/tutti-mode.png +0 -0
  16. package/dist/app/renderer/assets/icons/tutti-intensity-handle-balance.png +0 -0
  17. package/dist/app/renderer/assets/icons/tutti-intensity-handle-cost.png +0 -0
  18. package/dist/app/renderer/assets/icons/tutti-intensity-handle-powerful.png +0 -0
  19. package/dist/app/renderer/assets/icons/tutti-mode-lined.svg +3 -0
  20. package/dist/{chunk-6LXC5BME.js → chunk-4DAJ5SVX.js} +11 -5
  21. package/dist/chunk-4DAJ5SVX.js.map +1 -0
  22. package/dist/{chunk-Y6M27YYS.js → chunk-4IJYTGS2.js} +670 -619
  23. package/dist/chunk-4IJYTGS2.js.map +1 -0
  24. package/dist/{chunk-DKRX5IZS.js → chunk-5UOJCDLE.js} +8 -8
  25. package/dist/{chunk-M2VRYG7U.js → chunk-62LWOH3P.js} +13 -17
  26. package/dist/chunk-62LWOH3P.js.map +1 -0
  27. package/dist/{chunk-HXAOFFZJ.js → chunk-7LSLB7CN.js} +2 -2
  28. package/dist/{chunk-CKUR2VKA.js → chunk-BGNYUYLP.js} +2 -2
  29. package/dist/chunk-FMTWYOHM.js +25 -0
  30. package/dist/chunk-FMTWYOHM.js.map +1 -0
  31. package/dist/{chunk-JRYR2EA5.js → chunk-FRSV66P3.js} +171 -36
  32. package/dist/chunk-FRSV66P3.js.map +1 -0
  33. package/dist/{chunk-THRBLO2B.js → chunk-GXXPUEX6.js} +2 -2
  34. package/dist/{chunk-FWR5BZYR.js → chunk-JUL7J4VN.js} +2 -2
  35. package/dist/{chunk-RAO2PI3T.js → chunk-JVVLKTLR.js} +18 -32
  36. package/dist/chunk-JVVLKTLR.js.map +1 -0
  37. package/dist/{chunk-5RZVXSQQ.js → chunk-POU5WZNH.js} +7 -2
  38. package/dist/chunk-POU5WZNH.js.map +1 -0
  39. package/dist/{chunk-CCFYCSBK.js → chunk-RNBZBBI7.js} +13 -13
  40. package/dist/{chunk-VGPFDVSK.js → chunk-WSIGQG7C.js} +3 -3
  41. package/dist/{chunk-V2MU37VN.js → chunk-YJ27WHM3.js} +2 -2
  42. package/dist/context-mention-palette/index.d.ts +1 -1
  43. package/dist/context-mention-palette/index.js +8 -8
  44. package/dist/i18n/index.d.ts +12 -16
  45. package/dist/i18n/index.js +2 -2
  46. package/dist/index.d.ts +27 -21
  47. package/dist/index.js +17 -16
  48. package/dist/index.js.map +1 -1
  49. package/dist/mention-search.d.ts +2 -2
  50. package/dist/mention-search.js +6 -6
  51. package/dist/workbench/contribution.js +3 -3
  52. package/dist/workbench/index.js +6 -6
  53. package/dist/workbench/sessionTitle.js +2 -2
  54. package/package.json +21 -14
  55. package/dist/chunk-5RZVXSQQ.js.map +0 -1
  56. package/dist/chunk-6LXC5BME.js.map +0 -1
  57. package/dist/chunk-JRYR2EA5.js.map +0 -1
  58. package/dist/chunk-M2VRYG7U.js.map +0 -1
  59. package/dist/chunk-RAO2PI3T.js.map +0 -1
  60. package/dist/chunk-Y6M27YYS.js.map +0 -1
  61. /package/dist/{AgentRichTextReadonly-DFWY2WYO.js.map → AgentRichTextReadonly-WWU4ZF7W.js.map} +0 -0
  62. /package/dist/{chunk-DKRX5IZS.js.map → chunk-5UOJCDLE.js.map} +0 -0
  63. /package/dist/{chunk-HXAOFFZJ.js.map → chunk-7LSLB7CN.js.map} +0 -0
  64. /package/dist/{chunk-CKUR2VKA.js.map → chunk-BGNYUYLP.js.map} +0 -0
  65. /package/dist/{chunk-THRBLO2B.js.map → chunk-GXXPUEX6.js.map} +0 -0
  66. /package/dist/{chunk-FWR5BZYR.js.map → chunk-JUL7J4VN.js.map} +0 -0
  67. /package/dist/{chunk-CCFYCSBK.js.map → chunk-RNBZBBI7.js.map} +0 -0
  68. /package/dist/{chunk-VGPFDVSK.js.map → chunk-WSIGQG7C.js.map} +0 -0
  69. /package/dist/{chunk-V2MU37VN.js.map → chunk-YJ27WHM3.js.map} +0 -0
@@ -2,17 +2,22 @@ import {
2
2
  AgentGUIConversation_styles_default,
3
3
  MessageSquareMoreIcon,
4
4
  extractAgentMcpToolTarget
5
- } from "./chunk-VGPFDVSK.js";
5
+ } from "./chunk-WSIGQG7C.js";
6
+ import {
7
+ buildAskUserAnswerPayload,
8
+ readOwnAnswer,
9
+ writeOwnAnswer
10
+ } from "./chunk-FMTWYOHM.js";
6
11
  import {
7
12
  getOptionalAgentHostApi,
8
13
  useOptionalAgentHostApi
9
- } from "./chunk-FWR5BZYR.js";
14
+ } from "./chunk-JUL7J4VN.js";
10
15
  import {
11
16
  fileChangePathsFromChanges
12
17
  } from "./chunk-F5UR6EJG.js";
13
18
  import {
14
19
  translate
15
- } from "./chunk-THRBLO2B.js";
20
+ } from "./chunk-GXXPUEX6.js";
16
21
 
17
22
  // shared/agentConversation/planImplementationPresentation.ts
18
23
  var PLAN_IMPLEMENTATION_PROMPT = "Implement the plan.";
@@ -504,14 +509,6 @@ function numericValue(value) {
504
509
  // shared/agentConversation/components/AgentAskUserPromptSurface.tsx
505
510
  import { Button } from "@tutti-os/ui-system";
506
511
 
507
- // shared/agentConversation/interactiveAnswerPayload.ts
508
- function buildAskUserAnswerPayload(answersByQuestionId) {
509
- const answers = Object.values(answersByQuestionId).map(
510
- (value) => Array.isArray(value) ? value.join(", ") : value
511
- );
512
- return { answers, answersByQuestionId };
513
- }
514
-
515
512
  // shared/agentConversation/components/interactivePromptPresentation.tsx
516
513
  import {
517
514
  Spinner,
@@ -736,17 +733,6 @@ function interactiveOptionLabel(label, description) {
736
733
 
737
734
  // shared/agentConversation/components/useAskUserAnswerFlow.ts
738
735
  import { useCallback, useMemo, useState } from "react";
739
- function readOwnValue(values, key, fallback) {
740
- return Object.prototype.hasOwnProperty.call(values, key) ? values[key] : fallback;
741
- }
742
- function writeOwnValue(values, key, value) {
743
- Object.defineProperty(values, key, {
744
- configurable: true,
745
- enumerable: true,
746
- value,
747
- writable: true
748
- });
749
- }
750
736
  function useAskUserAnswerFlow({
751
737
  isSubmitting,
752
738
  questions
@@ -755,15 +741,15 @@ function useAskUserAnswerFlow({
755
741
  const [selectedByQuestionId, setSelectedByQuestionId] = useState({});
756
742
  const [freeTextByQuestionId, setFreeTextByQuestionId] = useState({});
757
743
  const currentQuestion = questions[currentIndex] ?? null;
758
- const selectedOptions = currentQuestion ? readOwnValue(selectedByQuestionId, currentQuestion.id, []) : [];
759
- const freeText = currentQuestion ? readOwnValue(freeTextByQuestionId, currentQuestion.id, "") : "";
744
+ const selectedOptions = currentQuestion ? readOwnAnswer(selectedByQuestionId, currentQuestion.id, []) : [];
745
+ const freeText = currentQuestion ? readOwnAnswer(freeTextByQuestionId, currentQuestion.id, "") : "";
760
746
  const currentQuestionAnswered = currentQuestion !== null && (selectedOptions.length > 0 || freeText.trim() !== "");
761
747
  const isLastQuestion = currentIndex >= questions.length - 1;
762
748
  const answerPayload = useMemo(() => {
763
749
  const answersByQuestionId = {};
764
750
  for (const question of questions) {
765
- const selected = readOwnValue(selectedByQuestionId, question.id, []);
766
- const customAnswer = readOwnValue(
751
+ const selected = readOwnAnswer(selectedByQuestionId, question.id, []);
752
+ const customAnswer = readOwnAnswer(
767
753
  freeTextByQuestionId,
768
754
  question.id,
769
755
  ""
@@ -771,13 +757,13 @@ function useAskUserAnswerFlow({
771
757
  if (question.multiSelect) {
772
758
  const answers = customAnswer ? [...selected, customAnswer] : selected;
773
759
  if (answers.length > 0) {
774
- writeOwnValue(answersByQuestionId, question.id, answers);
760
+ writeOwnAnswer(answersByQuestionId, question.id, answers);
775
761
  }
776
762
  continue;
777
763
  }
778
764
  const answer = customAnswer || selected[0];
779
765
  if (answer) {
780
- writeOwnValue(answersByQuestionId, question.id, answer);
766
+ writeOwnAnswer(answersByQuestionId, question.id, answer);
781
767
  }
782
768
  }
783
769
  return buildAskUserAnswerPayload(answersByQuestionId);
@@ -792,10 +778,10 @@ function useAskUserAnswerFlow({
792
778
  (optionLabel) => {
793
779
  if (isSubmitting || !currentQuestion) return;
794
780
  setSelectedByQuestionId((current) => {
795
- const existing = readOwnValue(current, currentQuestion.id, []);
781
+ const existing = readOwnAnswer(current, currentQuestion.id, []);
796
782
  const next = currentQuestion.multiSelect ? existing.includes(optionLabel) ? existing.filter((value) => value !== optionLabel) : [...existing, optionLabel] : existing.includes(optionLabel) ? [] : [optionLabel];
797
783
  const updated = { ...current };
798
- writeOwnValue(updated, currentQuestion.id, next);
784
+ writeOwnAnswer(updated, currentQuestion.id, next);
799
785
  return updated;
800
786
  });
801
787
  },
@@ -806,7 +792,7 @@ function useAskUserAnswerFlow({
806
792
  if (isSubmitting || !currentQuestion) return;
807
793
  setFreeTextByQuestionId((current) => {
808
794
  const updated = { ...current };
809
- writeOwnValue(updated, currentQuestion.id, value);
795
+ writeOwnAnswer(updated, currentQuestion.id, value);
810
796
  return updated;
811
797
  });
812
798
  },
@@ -1518,4 +1504,4 @@ export {
1518
1504
  isPromptRequestIdTitle,
1519
1505
  AgentInteractivePromptSurface
1520
1506
  };
1521
- //# sourceMappingURL=chunk-RAO2PI3T.js.map
1507
+ //# sourceMappingURL=chunk-JVVLKTLR.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 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\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 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 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} 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 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={!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\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 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 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 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 <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"]}
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  translate,
13
13
  useTranslation
14
- } from "./chunk-THRBLO2B.js";
14
+ } from "./chunk-GXXPUEX6.js";
15
15
  import {
16
16
  getAgentCustomMentionKind
17
17
  } from "./chunk-D2JUDUYY.js";
@@ -469,6 +469,10 @@ function resolveAgentSessionMentionIconUrl(input) {
469
469
  if (explicitIconUrl) {
470
470
  return explicitIconUrl;
471
471
  }
472
+ const agentProviderId = input.agentProviderId?.trim() ?? "";
473
+ if (agentProviderId) {
474
+ return managedAgentRoundedIconUrl(agentProviderId);
475
+ }
472
476
  const agentTargetId = input.agentTargetId?.trim() || agentSessionTargetIdFromHref(input.href?.trim() ?? "") || "";
473
477
  if (!agentTargetId.startsWith("local:")) {
474
478
  return void 0;
@@ -1827,10 +1831,11 @@ export {
1827
1831
  materializeAgentComposerFileMentions,
1828
1832
  agentExternalPromptFileErrorI18nKey,
1829
1833
  AGENT_RICH_TEXT_CARET_ANCHOR,
1834
+ resolveAgentSessionMentionIconUrl,
1830
1835
  AgentMentionReadonlyView,
1831
1836
  mentionItemToAttrs,
1832
1837
  attrsToMentionItem,
1833
1838
  exitAgentFileMentionSuggestion,
1834
1839
  createAgentFileMentionExtension
1835
1840
  };
1836
- //# sourceMappingURL=chunk-5RZVXSQQ.js.map
1841
+ //# sourceMappingURL=chunk-POU5WZNH.js.map