@tutti-os/agent-gui 0.0.107 → 0.0.109

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 (126) hide show
  1. package/dist/{AgentGUI-Do6py-T_.d.ts → AgentGUI-BSr3cWcJ.d.ts} +6 -3
  2. package/dist/AgentRichTextReadonly-42TUVYX5.js +18 -0
  3. package/dist/agent-conversation/index.d.ts +4 -4
  4. package/dist/agent-conversation/index.js +13 -12
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-env/index.js +1 -1
  7. package/dist/agent-gui.d.ts +5 -4
  8. package/dist/agent-gui.js +27 -25
  9. package/dist/agent-message-center/index.d.ts +12 -3
  10. package/dist/agent-message-center/index.js +75 -31
  11. package/dist/agent-message-center/index.js.map +1 -1
  12. package/dist/{agentConversationVM-Bf3Zv3iI.d.ts → agentConversationVM-D3Dn2LqN.d.ts} +18 -2
  13. package/dist/{agentGuiNodeTypes-DbgQBiYz.d.ts → agentGuiNodeTypes-CR_l4HhU.d.ts} +6 -3
  14. package/dist/agents.d.ts +1 -1
  15. package/dist/agents.js +1 -1
  16. package/dist/app/renderer/agentactivity.css +65 -3
  17. package/dist/app/renderer/assets/icons/agent-vinyl-beta-tag.svg +5 -0
  18. package/dist/{chunk-OWW7CU4U.js → chunk-25BPR75P.js} +2 -2
  19. package/dist/{chunk-N4WVVCNI.js → chunk-2QHKXI5N.js} +2 -2
  20. package/dist/{chunk-ZWY32ZKZ.js → chunk-34JD75OB.js} +1296 -737
  21. package/dist/chunk-34JD75OB.js.map +1 -0
  22. package/dist/{chunk-KJQERFKX.js → chunk-6CUELYIF.js} +3 -3
  23. package/dist/chunk-6CUELYIF.js.map +1 -0
  24. package/dist/{chunk-TKBEVCHG.js → chunk-7BN2WQ2M.js} +32 -2
  25. package/dist/chunk-7BN2WQ2M.js.map +1 -0
  26. package/dist/chunk-7KVZPJ3O.js +25 -0
  27. package/dist/chunk-7KVZPJ3O.js.map +1 -0
  28. package/dist/{chunk-C35SNDVZ.js → chunk-7OYHDOGG.js} +2 -1
  29. package/dist/chunk-7OYHDOGG.js.map +1 -0
  30. package/dist/{chunk-P3CVAWGJ.js → chunk-A5UXTAYJ.js} +5 -5
  31. package/dist/{chunk-4ZWV57MF.js → chunk-AIZJHA4Q.js} +14 -9
  32. package/dist/chunk-AIZJHA4Q.js.map +1 -0
  33. package/dist/{chunk-QY22OBJS.js → chunk-AY5AFMT2.js} +8 -84
  34. package/dist/chunk-AY5AFMT2.js.map +1 -0
  35. package/dist/{chunk-V5ROOS2O.js → chunk-BM3CSFWU.js} +22 -6
  36. package/dist/chunk-BM3CSFWU.js.map +1 -0
  37. package/dist/{chunk-F7Q7QK42.js → chunk-BRLKORQI.js} +1432 -1902
  38. package/dist/chunk-BRLKORQI.js.map +1 -0
  39. package/dist/{chunk-LDZ6C3YV.js → chunk-E74BMFHI.js} +3 -3
  40. package/dist/chunk-E74BMFHI.js.map +1 -0
  41. package/dist/{chunk-ZSJBCZUH.js → chunk-EBXOSQ5G.js} +102 -73
  42. package/dist/chunk-EBXOSQ5G.js.map +1 -0
  43. package/dist/chunk-J4K7KIFZ.js +75 -0
  44. package/dist/chunk-J4K7KIFZ.js.map +1 -0
  45. package/dist/{chunk-UFIEUC3Y.js → chunk-JBX3JPTC.js} +9 -8
  46. package/dist/chunk-JBX3JPTC.js.map +1 -0
  47. package/dist/{chunk-4YVKAPKW.js → chunk-JLRPIEIE.js} +2 -17
  48. package/dist/chunk-JLRPIEIE.js.map +1 -0
  49. package/dist/{chunk-BXOKBZH4.js → chunk-K7WFXVSD.js} +81 -45
  50. package/dist/chunk-K7WFXVSD.js.map +1 -0
  51. package/dist/{chunk-4YG7YK7S.js → chunk-L2GENUG3.js} +3 -3
  52. package/dist/{chunk-J2HG7UCP.js → chunk-OEYXSD3O.js} +3 -3
  53. package/dist/{chunk-L3GMMGRS.js → chunk-R2ZADXRB.js} +2 -2
  54. package/dist/chunk-R7AXDQCA.js +146 -0
  55. package/dist/chunk-R7AXDQCA.js.map +1 -0
  56. package/dist/{chunk-7MPN2JGL.js → chunk-U4CVBCHD.js} +37 -119
  57. package/dist/chunk-U4CVBCHD.js.map +1 -0
  58. package/dist/{chunk-4YCCATI4.js → chunk-USIFGHT3.js} +17 -4
  59. package/dist/chunk-USIFGHT3.js.map +1 -0
  60. package/dist/{chunk-7BXWPI4F.js → chunk-VMQNG2KI.js} +13 -1
  61. package/dist/{chunk-7BXWPI4F.js.map → chunk-VMQNG2KI.js.map} +1 -1
  62. package/dist/{chunk-SN6UYX54.js → chunk-W6TO6K2X.js} +4 -4
  63. package/dist/{chunk-UGVI47X6.js → chunk-YNSXUEIR.js} +6 -6
  64. package/dist/context-mention-palette/index.js +13 -12
  65. package/dist/{contribution-C6K5YfJ7.d.ts → contribution-C2LDwLA7.d.ts} +3 -2
  66. package/dist/dock-icons.js +3 -3
  67. package/dist/i18n/index.d.ts +31 -1
  68. package/dist/i18n/index.js +2 -2
  69. package/dist/index.d.ts +8 -7
  70. package/dist/index.js +27 -25
  71. package/dist/index.js.map +1 -1
  72. package/dist/mention-search.js +11 -10
  73. package/dist/provider-icons.js +1 -1
  74. package/dist/provider-identity.js +1 -1
  75. package/dist/{types-CnT8rNUI.d.ts → types-yF_0mrNS.d.ts} +1 -0
  76. package/dist/workbench/contribution.d.ts +2 -2
  77. package/dist/workbench/contribution.js +11 -11
  78. package/dist/workbench/index.d.ts +4 -4
  79. package/dist/workbench/index.js +22 -28
  80. package/dist/workbench/launch.d.ts +11 -14
  81. package/dist/workbench/launch.js +5 -11
  82. package/dist/workbench/providerCatalog.js +2 -2
  83. package/dist/workbench/sessionTitle.js +3 -3
  84. package/dist/workbench/state.d.ts +2 -12
  85. package/dist/workbench/state.js +3 -9
  86. package/dist/workspace-agent-generated-files.js +2 -1
  87. package/dist/workspace-query-cache.d.ts +19 -0
  88. package/dist/workspace-query-cache.js +7 -0
  89. package/dist/workspace-query-cache.js.map +1 -0
  90. package/package.json +21 -14
  91. package/dist/@-bold-lined-BLLFKBFI.svg +0 -10
  92. package/dist/AgentRichTextReadonly-F6PHC5SX.js +0 -18
  93. package/dist/add-lined-bold-5QPUDZCU.svg +0 -3
  94. package/dist/chunk-4YCCATI4.js.map +0 -1
  95. package/dist/chunk-4YVKAPKW.js.map +0 -1
  96. package/dist/chunk-4ZWV57MF.js.map +0 -1
  97. package/dist/chunk-7MPN2JGL.js.map +0 -1
  98. package/dist/chunk-BXOKBZH4.js.map +0 -1
  99. package/dist/chunk-C35SNDVZ.js.map +0 -1
  100. package/dist/chunk-F7Q7QK42.js.map +0 -1
  101. package/dist/chunk-H6IQ63DQ.js +0 -14
  102. package/dist/chunk-H6IQ63DQ.js.map +0 -1
  103. package/dist/chunk-KJQERFKX.js.map +0 -1
  104. package/dist/chunk-LDZ6C3YV.js.map +0 -1
  105. package/dist/chunk-QY22OBJS.js.map +0 -1
  106. package/dist/chunk-TKBEVCHG.js.map +0 -1
  107. package/dist/chunk-UFIEUC3Y.js.map +0 -1
  108. package/dist/chunk-V5ROOS2O.js.map +0 -1
  109. package/dist/chunk-ZSJBCZUH.js.map +0 -1
  110. package/dist/chunk-ZWY32ZKZ.js.map +0 -1
  111. package/dist/claudecode-flat-filled-NHO4JCVK.svg +0 -10
  112. package/dist/codex-flat-filled-WYHCF5VR.svg +0 -10
  113. package/dist/cursor-flat-filled-CL7N3BTZ.svg +0 -3
  114. package/dist/handoff-lined-4WQUBVG3.svg +0 -11
  115. package/dist/open-link-lined-JWEKUKME.svg +0 -4
  116. package/dist/opencode-flat-filled-CYAJPX45.svg +0 -4
  117. package/dist/tutti-flat-filled-K32QBTZE.svg +0 -12
  118. /package/dist/{AgentRichTextReadonly-F6PHC5SX.js.map → AgentRichTextReadonly-42TUVYX5.js.map} +0 -0
  119. /package/dist/{chunk-OWW7CU4U.js.map → chunk-25BPR75P.js.map} +0 -0
  120. /package/dist/{chunk-N4WVVCNI.js.map → chunk-2QHKXI5N.js.map} +0 -0
  121. /package/dist/{chunk-P3CVAWGJ.js.map → chunk-A5UXTAYJ.js.map} +0 -0
  122. /package/dist/{chunk-4YG7YK7S.js.map → chunk-L2GENUG3.js.map} +0 -0
  123. /package/dist/{chunk-J2HG7UCP.js.map → chunk-OEYXSD3O.js.map} +0 -0
  124. /package/dist/{chunk-L3GMMGRS.js.map → chunk-R2ZADXRB.js.map} +0 -0
  125. /package/dist/{chunk-SN6UYX54.js.map → chunk-W6TO6K2X.js.map} +0 -0
  126. /package/dist/{chunk-UGVI47X6.js.map → chunk-YNSXUEIR.js.map} +0 -0
@@ -0,0 +1,25 @@
1
+ import {
2
+ resolveAgentGUIProviderCatalogIdentity
3
+ } from "./chunk-6CUELYIF.js";
4
+
5
+ // shared/managedAgentProviders.ts
6
+ function normalizeManagedAgentProvider(provider) {
7
+ const normalized = provider?.trim().toLowerCase().replace(/[_\s]+/gu, "-") ?? "";
8
+ return resolveAgentGUIProviderCatalogIdentity(normalized)?.iconKey ?? (normalized === "tutti-doc" ? "tutti" : normalized);
9
+ }
10
+ var BETA_AGENT_PROVIDERS = /* @__PURE__ */ new Set([
11
+ "opencode",
12
+ "cursor"
13
+ ]);
14
+ function isBetaAgentProvider(provider) {
15
+ if (!provider) {
16
+ return false;
17
+ }
18
+ return BETA_AGENT_PROVIDERS.has(normalizeManagedAgentProvider(provider));
19
+ }
20
+
21
+ export {
22
+ normalizeManagedAgentProvider,
23
+ isBetaAgentProvider
24
+ };
25
+ //# sourceMappingURL=chunk-7KVZPJ3O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/managedAgentProviders.ts"],"sourcesContent":["import { resolveAgentGUIProviderCatalogIdentity } from \"../providerIdentityCatalog.ts\";\n\nexport function normalizeManagedAgentProvider(\n provider: string | undefined\n): string {\n const normalized =\n provider\n ?.trim()\n .toLowerCase()\n .replace(/[_\\s]+/gu, \"-\") ?? \"\";\n return (\n resolveAgentGUIProviderCatalogIdentity(normalized)?.iconKey ??\n (normalized === \"tutti-doc\" ? \"tutti\" : normalized)\n );\n}\n\n/** Providers still shipping in preview; the hero surfaces a \"Beta\" tag for them. */\nconst BETA_AGENT_PROVIDERS: ReadonlySet<string> = new Set([\n \"opencode\",\n \"cursor\"\n]);\n\nexport function isBetaAgentProvider(\n provider: string | null | undefined\n): boolean {\n if (!provider) {\n return false;\n }\n return BETA_AGENT_PROVIDERS.has(normalizeManagedAgentProvider(provider));\n}\n"],"mappings":";;;;;AAEO,SAAS,8BACd,UACQ;AACR,QAAM,aACJ,UACI,KAAK,EACN,YAAY,EACZ,QAAQ,YAAY,GAAG,KAAK;AACjC,SACE,uCAAuC,UAAU,GAAG,YACnD,eAAe,cAAc,UAAU;AAE5C;AAGA,IAAM,uBAA4C,oBAAI,IAAI;AAAA,EACxD;AAAA,EACA;AACF,CAAC;AAEM,SAAS,oBACd,UACS;AACT,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,IAAI,8BAA8B,QAAQ,CAAC;AACzE;","names":[]}
@@ -61,6 +61,7 @@ function projectAgentGUIAgentsToInternalTargets(agents) {
61
61
  agentTargetId: agent.agentTargetId
62
62
  },
63
63
  label: agent.name,
64
+ availability: agent.availability,
64
65
  ...agent.description ? { description: agent.description } : {},
65
66
  iconUrl: agent.iconUrl,
66
67
  ...agent.heroImageUrl ? { heroImageUrl: agent.heroImageUrl } : {},
@@ -93,4 +94,4 @@ export {
93
94
  resolveAgentGUISelectedDirectoryAgent,
94
95
  projectAgentGUIAgentsToInternalTargets
95
96
  };
96
- //# sourceMappingURL=chunk-C35SNDVZ.js.map
97
+ //# sourceMappingURL=chunk-7OYHDOGG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../agents.ts"],"sourcesContent":["import type {\n AgentGUIAgent,\n AgentGUIAgentAvailabilityStatus,\n AgentGUIAgentTarget\n} from \"./types.ts\";\n\nexport function normalizeAgentGUIAgents(\n agents: readonly AgentGUIAgent[] | null | undefined\n): AgentGUIAgent[] {\n const normalized: AgentGUIAgent[] = [];\n const seenAgentTargetIds = new Set<string>();\n for (const agent of agents ?? []) {\n const agentTargetId = agent.agentTargetId.trim();\n const name = agent.name.trim();\n const iconUrl = agent.iconUrl.trim();\n const heroImageUrl = agent.heroImageUrl?.trim() ?? \"\";\n if (\n !agentTargetId ||\n !name ||\n !iconUrl ||\n seenAgentTargetIds.has(agentTargetId)\n ) {\n continue;\n }\n seenAgentTargetIds.add(agentTargetId);\n const ownerName = agent.owner?.name?.trim() ?? \"\";\n const ownerAvatarUrl = agent.owner?.avatarUrl?.trim() ?? \"\";\n const reason = agent.availability.reason?.trim() ?? \"\";\n normalized.push({\n agentTargetId,\n name,\n iconUrl,\n ...(heroImageUrl ? { heroImageUrl } : {}),\n ...(agent.description?.trim()\n ? { description: agent.description.trim() }\n : {}),\n ...(ownerName || ownerAvatarUrl\n ? {\n owner: {\n ...(ownerName ? { name: ownerName } : {}),\n ...(ownerAvatarUrl ? { avatarUrl: ownerAvatarUrl } : {})\n }\n }\n : {}),\n availability: {\n status: normalizeAgentGUIAgentAvailabilityStatus(\n agent.availability.status\n ),\n ...(reason ? { reason } : {}),\n ...(agent.availability.pendingAction\n ? { pendingAction: agent.availability.pendingAction }\n : {})\n },\n provider: agent.provider\n });\n }\n return normalized;\n}\n\nexport function agentGUIAgentIsReady(agent: AgentGUIAgent): boolean {\n return agent.availability.status === \"ready\";\n}\n\nexport function resolveAgentGUISelectedDirectoryAgent(input: {\n agents: readonly AgentGUIAgent[];\n agentTargetId?: string | null;\n defaultAgentTargetId?: string | null;\n}): AgentGUIAgent | null {\n const explicitAgentTargetId =\n input.agentTargetId?.trim() || input.defaultAgentTargetId?.trim() || \"\";\n if (explicitAgentTargetId) {\n return (\n input.agents.find(\n (agent) => agent.agentTargetId === explicitAgentTargetId\n ) ?? null\n );\n }\n return (\n input.agents.find((agent) => agentGUIAgentIsReady(agent)) ??\n input.agents[0] ??\n null\n );\n}\n\n/** Package-internal bridge while the carried node is migrated to agent names. */\nexport function projectAgentGUIAgentsToInternalTargets(\n agents: readonly AgentGUIAgent[]\n): AgentGUIAgentTarget[] {\n return agents.map((agent) => ({\n targetId: agent.agentTargetId,\n agentTargetId: agent.agentTargetId,\n provider: agent.provider,\n ref: {\n kind: \"agent-directory\",\n provider: agent.provider,\n agentTargetId: agent.agentTargetId\n },\n label: agent.name,\n availability: agent.availability,\n ...(agent.description ? { description: agent.description } : {}),\n iconUrl: agent.iconUrl,\n ...(agent.heroImageUrl ? { heroImageUrl: agent.heroImageUrl } : {}),\n ...(agent.owner?.avatarUrl\n ? {\n badge: {\n iconUrl: agent.owner.avatarUrl,\n ...(agent.owner.name ? { label: agent.owner.name } : {})\n }\n }\n : {}),\n ...(agent.owner?.name ? { ownerLabel: agent.owner.name } : {}),\n ...(agent.availability.status !== \"ready\" ? { disabled: true } : {}),\n ...(agent.availability.reason\n ? { unavailableReason: agent.availability.reason }\n : {})\n }));\n}\n\nfunction normalizeAgentGUIAgentAvailabilityStatus(\n status: AgentGUIAgentAvailabilityStatus\n): AgentGUIAgentAvailabilityStatus {\n switch (status) {\n case \"ready\":\n case \"checking\":\n case \"coming_soon\":\n case \"not_installed\":\n case \"auth_required\":\n case \"unavailable\":\n return status;\n }\n}\n"],"mappings":"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","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  agentMentionFilterLabel,
6
6
  agentMentionGroupLabel,
7
7
  mentionGroupExpandCount
8
- } from "./chunk-BXOKBZH4.js";
8
+ } from "./chunk-K7WFXVSD.js";
9
9
  import {
10
10
  resolveAgentMentionFileThumbnailUrl,
11
11
  resolveAgentMentionFileVisualKind
@@ -13,13 +13,13 @@ import {
13
13
  import {
14
14
  userAvatarPlaceholderUrl,
15
15
  workspaceAgentActivityStatusLabel
16
- } from "./chunk-N4WVVCNI.js";
16
+ } from "./chunk-2QHKXI5N.js";
17
17
  import {
18
18
  managedAgentRoundedIconUrl
19
- } from "./chunk-SN6UYX54.js";
19
+ } from "./chunk-W6TO6K2X.js";
20
20
  import {
21
21
  translate
22
- } from "./chunk-OWW7CU4U.js";
22
+ } from "./chunk-25BPR75P.js";
23
23
 
24
24
  // agent-gui/agentGuiNode/AgentFileMentionPalette.tsx
25
25
  import {
@@ -505,4 +505,4 @@ export {
505
505
  AgentFileMentionPalette,
506
506
  AgentContextMentionPalette
507
507
  };
508
- //# sourceMappingURL=chunk-P3CVAWGJ.js.map
508
+ //# sourceMappingURL=chunk-A5UXTAYJ.js.map
@@ -2,17 +2,17 @@ import {
2
2
  AgentGUIConversation_styles_default,
3
3
  MessageSquareMoreIcon,
4
4
  extractAgentMcpToolTarget
5
- } from "./chunk-7MPN2JGL.js";
5
+ } from "./chunk-U4CVBCHD.js";
6
6
  import {
7
7
  getOptionalAgentHostApi,
8
8
  useOptionalAgentHostApi
9
- } from "./chunk-LDZ6C3YV.js";
9
+ } from "./chunk-E74BMFHI.js";
10
10
  import {
11
11
  fileChangePathsFromChanges
12
12
  } from "./chunk-F5UR6EJG.js";
13
13
  import {
14
14
  translate
15
- } from "./chunk-OWW7CU4U.js";
15
+ } from "./chunk-25BPR75P.js";
16
16
 
17
17
  // shared/agentConversation/planImplementationPresentation.ts
18
18
  var PLAN_IMPLEMENTATION_PROMPT = "Implement the plan.";
@@ -551,8 +551,8 @@ function formatToolDetails(input) {
551
551
  ...detail.meta ? { meta: detail.meta } : {}
552
552
  }));
553
553
  }
554
- function formatApprovalToolPresentation(input) {
555
- const details = formatToolDetails(input);
554
+ function formatApprovalToolPresentation(prompt, labels) {
555
+ const details = formatToolDetails(prompt.input);
556
556
  const hasFileChanges = details.some((detail) => detail.kind === "files");
557
557
  const isLeadDetail = (detail) => detail.kind === "reason" || hasFileChanges && (detail.kind === "directory" || detail.kind === "path");
558
558
  const leadDetails = [
@@ -565,7 +565,12 @@ function formatApprovalToolPresentation(input) {
565
565
  (candidate) => candidate.value === detail.value && candidate.meta === detail.meta
566
566
  ) === index
567
567
  );
568
+ const purposeLeads = {
569
+ generic: labels.approvalLead,
570
+ "edit-files": labels.fileChangeApprovalLead
571
+ };
568
572
  return {
573
+ lead: purposeLeads[prompt.approvalPurpose ?? "generic"],
569
574
  leadDetails,
570
575
  cardDetails: details.filter((detail) => !isLeadDetail(detail))
571
576
  };
@@ -988,8 +993,8 @@ function ApprovalPromptSurface({
988
993
  }) {
989
994
  "use memo";
990
995
  const promptToolPresentation = useMemo2(
991
- () => formatApprovalToolPresentation(prompt.input ?? null),
992
- [prompt.input]
996
+ () => formatApprovalToolPresentation(prompt, labels),
997
+ [labels, prompt]
993
998
  );
994
999
  const [submittingOptionId, setSubmittingOptionId] = useState2(
995
1000
  null
@@ -1071,7 +1076,7 @@ function ApprovalPromptSurface({
1071
1076
  ]);
1072
1077
  return /* @__PURE__ */ jsx3("section", { className: interactivePromptClassName(embedded), children: /* @__PURE__ */ jsxs3("div", { className: interactivePromptCardClassName(edgeGlow), children: [
1073
1078
  /* @__PURE__ */ jsxs3("div", { className: AgentGUIConversation_styles_default.interactivePromptLeadContent, children: [
1074
- /* @__PURE__ */ jsx3("div", { className: AgentGUIConversation_styles_default.interactivePromptLead, children: stripPromptTitlePunctuation(labels.approvalLead) }),
1079
+ /* @__PURE__ */ jsx3("div", { className: AgentGUIConversation_styles_default.interactivePromptLead, children: stripPromptTitlePunctuation(promptToolPresentation.lead) }),
1075
1080
  promptToolPresentation.leadDetails.map((detail) => /* @__PURE__ */ jsxs3(
1076
1081
  "div",
1077
1082
  {
@@ -1466,4 +1471,4 @@ export {
1466
1471
  isPromptRequestIdTitle,
1467
1472
  AgentInteractivePromptSurface
1468
1473
  };
1469
- //# sourceMappingURL=chunk-4ZWV57MF.js.map
1474
+ //# sourceMappingURL=chunk-AIZJHA4Q.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/interactiveAnswerPayload.ts","../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","import {\n selectPlanDecisionForTurn,\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 input.engine.dispatch({\n type: \"plan/feedbackRequested\",\n agentSessionId: input.agentSessionId,\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","/**\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","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 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\nfunction readOwnValue<T>(\n values: Record<string, T>,\n key: string,\n fallback: T\n): T {\n return Object.prototype.hasOwnProperty.call(values, key)\n ? values[key]!\n : fallback;\n}\n\nfunction writeOwnValue<T>(\n values: Record<string, T>,\n key: string,\n value: T\n): void {\n Object.defineProperty(values, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\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 ? readOwnValue(selectedByQuestionId, currentQuestion.id, [])\n : [];\n const freeText = currentQuestion\n ? readOwnValue(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 = readOwnValue(selectedByQuestionId, question.id, []);\n const customAnswer = readOwnValue(\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 writeOwnValue(answersByQuestionId, question.id, answers);\n }\n continue;\n }\n const answer = customAnswer || selected[0];\n if (answer) {\n writeOwnValue(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 = readOwnValue(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 writeOwnValue(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 writeOwnValue(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":";;;;;;;;;;;;;;;;;AAEO,IAAM,6BAA6B;AACnC,IAAM,uCAAuC;AAC7C,IAAM,sCAAsC;AAC5C,IAAM,kCAAkC;AAExC,SAAS,qCACd,YACA,OACqE;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAUA,SAAS,SAAS,MAAgC;AAChD,SAAO,KAAK,oBAAoB,KAAK,mBAAmB,KAAK,OAAO;AACtE;AAEA,SAAS,WAAW,MAAiC;AACnD,SAAO,KAAK,SAAS,gBAAgB;AACvC;AAEO,SAAS,iBACd,eACe;AACf,MAAI,eAA8B;AAClC,MAAI,aAAa,OAAO;AACxB,aAAW,QAAQ,eAAe;AAChC,UAAM,SAAS,KAAK,QAAQ,KAAK;AACjC,QAAI,CAAC,OAAQ;AACb,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,QAAQ,YAAY;AACtB,mBAAa;AACb,qBAAe;AAAA,IACjB;AAAA,EACF;AACA,MAAI,CAAC,aAAc,QAAO;AAC1B,SAAO,cAAc;AAAA,IACnB,CAAC,SAAS,KAAK,QAAQ,KAAK,MAAM,gBAAgB,WAAW,IAAI;AAAA,EACnE,IACI,eACA;AACN;;;ACtDA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAYA,SAAS,0BACd,OACA,gBACA,WACA;AACA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF,GAAG;AACH,SAAO,YAAY,WAAW,aAC5B,WAAW,UAAU,aACrB,WAAW,YAAY,cACrB,aACA;AACN;AAEO,SAAS,8BAA8B,OAQlC;AACV,QAAM,OAAO;AAAA,IACX,MAAM,OAAO,YAAY;AAAA,IACzB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,WAAW;AAAA,IACf;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,EACP,EAAE,KAAK,GAAG;AACV,MAAI,MAAM,WAAW,sCAAsC;AACzD,UAAM,WAAW;AAAA,MACf,MAAM,OAAO,YAAY;AAAA,MACzB,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AACA,UAAM,OAAO,SAAS;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,gBAAgB,MAAM;AAAA,MACtB,WAAW,iBAAiB,QAAQ;AAAA,MACpC,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW,MAAM;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,GAAI,UAAU,WAAW,YAAY,UAAU,WAAW,YACtD,EAAE,OAAO,KAAK,IACd,CAAC;AAAA,MACL,WAAW;AAAA,IACb,CAAC;AACD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW,iCAAiC;AACpD,UAAM,OAAO,SAAS;AAAA,MACpB,MAAM;AAAA,MACN,gBAAgB,MAAM;AAAA,MACtB,WAAW,MAAM;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,aAAa,MAAM;AAAA,IACrB,CAAC;AACD,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,cAAc,KAAK,KAAK;AAC3C,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,qBAAqB,MAAM,aAAa,KAAK,KAAK;AACxD,QAAM,OAAO,SAAS;AAAA,IACpB,MAAM;AAAA,IACN,gBAAgB,MAAM;AAAA,IACtB,gBAAgB,GAAG,QAAQ,aAAa,iBAAiB;AAAA,IACzD,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IAChC,eAAe;AAAA,IACf,iBAAiB,oBAAoB;AAAA,IACrC;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,gBAAgB,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IACvC,QAAQ,KAAK;AAAA,IACb,aAAa,MAAM;AAAA,EACrB,CAAC;AACD,SAAO;AACT;;;ACjGO,SAAS,2BACd,QAKA,SAAiC,CAAC,GAC1B;AACR,QAAM,UAAU,6BAA6B,OAAO,EAAE;AACtD,QAAM,YAAY,6BAA6B,OAAO,IAAI;AAC1D,QAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,wBAAwB;AAC1B,WAAO,UAAU,sBAAsB;AAAA,EACzC;AACA,QAAM,2BACJ,uCAAuC,KAAK;AAC9C,MAAI,0BAA0B;AAC5B,WAAO;AAAA,MACL,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,IAC3B;AAAA,EACF;AACA,OACG,YAAY,eAAe,cAAc,gBAC1C,wBAAwB,KAAK,GAC7B;AACA,WAAO,UAAU,8CAA8C;AAAA,EACjE;AACA,MAAI,8BAA8B,KAAK,GAAG;AACxC,WAAO,UAAU,oDAAoD;AAAA,EACvE;AACA,OACG,YAAY,iBACX,YAAY,cACZ,cAAc,kBAChB,uBAAuB,KAAK,GAC5B;AACA,WAAO,UAAU,gDAAgD;AAAA,EACnE;AACA,MAAI,YAAY,kBAAkB,cAAc,gBAAgB;AAC9D,WAAO,OAAO,WACV,UAAU,uDAAuD,IACjE,UAAU,iDAAiD;AAAA,EACjE;AACA,MACE,YAAY,gBACZ,YAAY,YACZ,YAAY,UACZ,cAAc,gBACd,cAAc,YACd,cAAc,QACd;AACA,WAAO,OAAO,WACV,UAAU,uDAAuD,IACjE,UAAU,+CAA+C;AAAA,EAC/D;AACA,SAAO,SAAS,OAAO;AACzB;AAEO,SAAS,iCACd,QAKA,SAAiC,CAAC,GACA;AAClC,QAAM,gBAAgB,4BAA4B,OAAO,KAAK;AAC9D,MAAI,eAAe;AACjB,WAAO;AAAA,MACL,OAAO;AAAA,QACL;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO,2BAA2B,QAAQ,MAAM;AAAA,EAClD;AACF;AAEO,SAAS,6BAA6B,OAAuB;AAClE,SAAO,MACJ,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,EAAE;AAC9B;AAEA,SAAS,qCACP,OACA,OACA,SAAiC,CAAC,GACnB;AACf,QAAM,aAAa,6BAA6B,KAAK;AACrD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,wBAAwB,KAAK,IAChC,iDACA;AAAA,IACN,KAAK;AACH,aAAO,8BAA8B,KAAK,IACtC,uDACA;AAAA,IACN,KAAK;AACH,aAAO,uBAAuB,KAAK,IAC/B,mDACA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,eAAe,sBAClB,gDACA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,eAAe,+BAClB,sDACA;AAAA,IACN,KAAK;AACH,aAAO,CAAC,OAAO,YAAY,eAAe,WACtC,kBACA;AAAA,IACN;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,uCACP,OACwD;AACxD,QAAM,gBAAgB,4BAA4B,KAAK;AACvD,MAAI,eAAe;AACjB,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ,EAAE,SAAS,cAAc;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM,MAAM,wCAAwC;AAC5E,MAAI,kBAAkB,CAAC,GAAG;AACxB,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ,EAAE,OAAO,gBAAgB,CAAC,EAAE;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM,MAAM,wBAAwB;AAC7D,MAAI,mBAAmB,CAAC,GAAG;AACzB,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ,EAAE,OAAO,iBAAiB,CAAC,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,OAA8B;AACjE,QAAM,qBAAqB,MAAM;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,qBAAqB,CAAC,GAAG,KAAK,KAAK;AAC5C;AAEA,SAAS,uBAAuB,OAAwB;AACtD,QAAM,QAAQ,6BAA6B,KAAK;AAChD,SACE,UAAU,MACV,UAAU,iBACV,UAAU,cACV,UAAU,iBACV,UAAU,0BACV,UAAU;AAEd;AAEA,SAAS,wBAAwB,OAAwB;AACvD,QAAM,QAAQ,6BAA6B,KAAK;AAChD,SACE,UAAU,MACV,UAAU,WACV,UAAU,eACV,UAAU,aACV,UAAU,iBACV,UAAU,SACV,UAAU,gBACV,UAAU;AAEd;AAEA,SAAS,8BAA8B,OAAwB;AAC7D,QAAM,QAAQ,6BAA6B,KAAK;AAChD,SACE,UAAU,yBACV,UAAU,qBACV,UAAU;AAEd;;;ACzMO,SAAS,qBACd,OACoB;AACpB,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AACA,QAAM,YAAY,0BAA0B,EAAE,MAAM,CAAC;AACrD,QAAM,aAAiC,YACnC;AAAA,IACE;AAAA,MACE,MAAM;AAAA,MACN,OAAO,UAAU;AAAA,MACjB,GAAI,UAAU,cAAc,EAAE,MAAM,UAAU,YAAY,IAAI,CAAC;AAAA,IACjE;AAAA,EACF,IACA,CAAC;AACL,QAAM,cAAc,uBAAuB,KAAK;AAChD,QAAM,UAA8B,CAAC,GAAG,UAAU;AAClD,QAAM,cAAc,gBAAgB,WAAW;AAC/C,QAAM,yBAAyB,uBAAuB,WAAW;AACjE,MAAI,YAAY,SAAS,GAAG;AAC1B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO,uBAAuB;AAAA,IAChC,CAAC;AACD,QAAI,uBAAuB,WAAW;AACpC,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,OAAO,uBAAuB;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,UACJ,mBAAmB,YAAY,OAAO,KACtC,mBAAmB,YAAY,GAAG;AACpC,MAAI,SAAS;AACX,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAI,YAAY,YAAY,WAAW,IACnC,EAAE,MAAM,YAAY,YAAY,WAAW,EAAY,IACvD,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AACA,QAAM,WACJ,YAAY,YAAY,SAAS,KACjC,YAAY,YAAY,SAAS,KACjC,YAAY,YAAY,QAAQ,KAChC,YAAY,YAAY,IAAI,KAC5B,YAAY,YAAY,aAAa;AACvC,MAAI,YAAY,CAAC,0BAA0B,UAAU,WAAW,GAAG;AACjE,UAAM,YAAY,gBAAgB,WAAW;AAC7C,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAI,YAAY,EAAE,MAAM,UAAU,IAAI,CAAC;AAAA,IACzC,CAAC;AAAA,EACH;AACA,QAAM,QACJ,YAAY,YAAY,KAAK,KAC7B,YAAY,YAAY,YAAY,KACpC,YAAY,YAAY,WAAW,KACnC,YAAY,YAAY,OAAO;AACjC,MAAI,OAAO;AACT,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,QAAM,SAAS,YAAY,YAAY,MAAM;AAC7C,MAAI,QAAQ;AACV,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,OAAwB;AAC7D,SAAO,mBAAmB,KAAK,MAAM,KAAK,CAAC;AAC7C;AAEA,SAAS,uBACP,OACyB;AACzB,MAAI,gBAAgB,KAAK,EAAE,SAAS,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,WAAW,YAAY,MAAM,QAAQ;AAC3C,SACE,iBAAiB,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,KACD,iBAAiB,UAAU;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,KACD,YACA;AAEJ;AAEA,SAAS,iBACP,OACA,MACgC;AAChC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,KAAK,KAAK,CAAC,QAAQ,YAAY,MAAM,GAAG,CAAC,CAAC,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,YAAY,MAAM,GAAG,CAAC;AACpC,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA+C;AACtE,QAAM,QAAQ,aAAa,MAAM,SAAS,KAAK,aAAa,MAAM,UAAU;AAC5E,QAAM,MAAM,aAAa,MAAM,OAAO,KAAK,aAAa,MAAM,QAAQ;AACtE,MAAI,UAAU,QAAQ,QAAQ,MAAM;AAClC,WAAO;AAAA,EACT;AACA,SAAO,UAAU,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG;AACvD;AAEA,SAAS,YAAY,OAA+B;AAClD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,mBAAmB,OAA+B;AACzD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,YAAY,MAAM,MAAM,SAAS,CAAC,CAAC;AACrD,QAAM,eAAe,YAAY,MAAM,MAAM,SAAS,CAAC,CAAC;AACxD,OAAK,cAAc,QAAQ,cAAc,UAAU,cAAc;AAC/D,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,QAAQ,CAAC,SAAS;AACpC,UAAM,OAAO,YAAY,IAAI;AAC7B,WAAO,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,EAC1B,CAAC;AACD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,IAAI;AAC9C;AAEA,SAAS,YAAY,OAAgD;AACnE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AACN;AAEA,SAAS,gBAAgB,OAA0C;AACjE,QAAM,aAAa;AAAA,IACjB,YAAY,MAAM,WAAW,GAAG;AAAA,IAChC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,2BAA2B,SAAS;AAClD,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,uBAAuB,OAG9B;AACA,QAAM,cAAc,MAAM;AAAA,IACxB,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;AAAA,EAC5E;AACA,QAAM,YAAY,4BAA4B,WAAW;AACzD,QAAM,eAAe,YACjB,YAAY,IAAI,CAAC,SAAS,0BAA0B,MAAM,SAAS,CAAC,IACpE;AACJ,MAAI,aAAa,UAAU,GAAG;AAC5B,WAAO,EAAE,WAAW,OAAO,aAAa,KAAK,IAAI,EAAE;AAAA,EACrD;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,GAAG,aAAa,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,aAAa,SAAS,CAAC;AAAA,EAC3E;AACF;AAEA,SAAS,4BAA4B,OAAyC;AAC5E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,MAAM,IAAI,oBAAoB;AACjD,MAAI,CAAC,WAAW,MAAM,qBAAqB,GAAG;AAC5C,WAAO;AAAA,EACT;AACA,QAAM,cAAc,WAAW;AAAA,IAAI,CAAC,SAClC,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC;AAAA,EACrC;AACA,QAAM,aAAa,YAAY,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;AAClD,MAAI,eAAe,WAAW;AAC9B,aAAW,aAAa,YAAY,MAAM,CAAC,GAAG;AAC5C,UAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,mBAAe,KAAK,IAAI,cAAc,MAAM,MAAM;AAClD,WACE,eAAe,KACf,WAAW,eAAe,CAAC,MAAM,MAAM,eAAe,CAAC,GACvD;AACA,sBAAgB;AAAA,IAClB;AAAA,EACF;AACA,QAAM,SAAS,WAAW,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG;AACzD,SAAO,UAAU,WAAW,OAAO,CAAC,eAAe,KAAK,MAAM,IAC1D,SACA;AACN;AAEA,SAAS,0BAA0B,MAAc,WAA2B;AAC1E,QAAM,aAAa,qBAAqB,IAAI;AAC5C,QAAM,SAAS,GAAG,SAAS;AAC3B,SAAO,WAAW,WAAW,MAAM,IAAI,WAAW,MAAM,OAAO,MAAM,IAAI;AAC3E;AAEA,SAAS,0BACP,MACA,aACS;AACT,QAAM,iBAAiB,qBAAqB,IAAI;AAChD,SAAO,YAAY;AAAA,IACjB,CAAC,cAAc,qBAAqB,SAAS,MAAM;AAAA,EACrD;AACF;AAEA,SAAS,qBAAqB,MAAsB;AAClD,SAAO,KAAK,KAAK,EAAE,WAAW,MAAM,GAAG,EAAE,QAAQ,SAAS,EAAE;AAC9D;AAEA,SAAS,sBAAsB,MAAuB;AACpD,SAAO,KAAK,WAAW,GAAG,KAAK,gBAAgB,KAAK,IAAI;AAC1D;AAEA,SAAS,aAAa,OAA+B;AACnD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;;;ACjRA,SAAS,cAAc;;;AC6BhB,SAAS,0BACd,qBAC0B;AAC1B,QAAM,UAAU,OAAO,OAAO,mBAAmB,EAAE;AAAA,IAAI,CAAC,UACtD,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,EAC5C;AACA,SAAO,EAAE,SAAS,oBAAoB;AACxC;;;AClCA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAmEH,cAwJE,YAxJF;AA5DJ,IAAM,2BAA2B;AAE1B,SAAS,eAAe,OAA+B;AAC5D,SACE,MAAM,QAAQ,WACd,MAAM,SAAS,WACf,MAAM,SAAS;AAEnB;AAEO,SAAS,yBAAyB,QAAqC;AAC5E,MAAI,EAAE,kBAAkB,cAAc;AACpC,WAAO;AAAA,EACT;AACA,QAAM,UAAU,OAAO,QAAQ,YAAY;AAC3C,SACE,YAAY,WACZ,YAAY,cACZ,YAAY,YACZ,OAAO;AAEX;AAEO,SAAS,4BACd,aACA,UACe;AACf,MAAI,gBAAgB,GAAG;AACrB,WAAO,UAAU,kCAAkC;AAAA,EACrD;AACA,MAAI,gBAAgB,GAAG;AACrB,WAAO,WACH,UAAU,qCAAqC,IAC/C,UAAU,qCAAqC;AAAA,EACrD;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,UAAuC;AACtE,MAAI,UAAU;AACZ,WAAO,aAAa;AAAA,EACtB;AACA,MAAI,OAAO,cAAc,aAAa;AACpC,WAAO;AAAA,EACT;AACA,QAAM,oBACJ,mBAAmB,YAEb,UAGA,eAAe,WACjB;AACN,QAAM,oBAAoB,qBAAqB,UAAU,YAAY;AACrE,SAAO,OAAO,KAAK,iBAAiB;AACtC;AAEO,SAAS,2BAAwC;AACtD;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,oCAAO;AAAA,MAClB,QAAO;AAAA;AAAA,EACT;AAEJ;AAEO,SAAS,iBAA8B;AAC5C;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAY;AAAA,MAEZ;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,2BAA2B,UAA2B;AACpE,SAAO,WACH,GAAG,oCAAO,iBAAiB,0DAC3B,oCAAO;AACb;AAEO,SAAS,+BAA+B,UAA2B;AACxE,SAAO,WACH,GAAG,oCAAO,qBAAqB,yBAC/B,oCAAO;AACb;AAeO,SAAS,kBACd,OAC2B;AAC3B,SAAO,qBAAqB,KAAK,EAAE,IAAI,CAAC,YAAY;AAAA,IAClD,MAAM,OAAO;AAAA,IACb,OAAO,sBAAsB,OAAO,IAAI;AAAA,IACxC,OAAO,OAAO;AAAA,IACd,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,EAC7C,EAAE;AACJ;AAEO,SAAS,+BACd,QACA,QACgC;AAChC,QAAM,UAAU,kBAAkB,OAAO,KAAK;AAC9C,QAAM,iBAAiB,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,OAAO;AACvE,QAAM,eAAe,CAAC,WACpB,OAAO,SAAS,YACf,mBAAmB,OAAO,SAAS,eAAe,OAAO,SAAS;AACrE,QAAM,cAAc;AAAA,IAClB,GAAG,QAAQ,OAAO,CAAC,WAAW,OAAO,SAAS,QAAQ;AAAA,IACtD,GAAG,QAAQ;AAAA,MACT,CAAC,WAAW,OAAO,SAAS,YAAY,aAAa,MAAM;AAAA,IAC7D;AAAA,EACF,EAAE;AAAA,IACA,CAAC,QAAQ,OAAO,eACd,WAAW;AAAA,MACT,CAAC,cACC,UAAU,UAAU,OAAO,SAAS,UAAU,SAAS,OAAO;AAAA,IAClE,MAAM;AAAA,EACV;AACA,QAAM,eAAe;AAAA,IACnB,SAAS,OAAO;AAAA,IAChB,cAAc,OAAO;AAAA,EACvB;AAIA,SAAO;AAAA,IACL,MAAM,aAAa,OAAO,mBAAmB,SAAS;AAAA,IACtD;AAAA,IACA,aAAa,QAAQ,OAAO,CAAC,WAAW,CAAC,aAAa,MAAM,CAAC;AAAA,EAC/D;AACF;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAGgB;AACd;AACA,MAAI,OAAO,SAAS,WAAW;AAC7B,WACE,oBAAC,UAAK,WAAW,oCAAO,8BACrB,iBAAO,OACV;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO;AAAA,MACd,QAAO;AAAA,MACP,iBAAiB,CAAC;AAAA;AAAA,EACpB;AAEJ;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAIgB;AACd;AACA,QAAM,UACJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,oCAAO,4BAA4B,IAAI,oCAAO,mCAAmC;AAAA,MAC/F,yCACE,WAAW,qCAAqC,SAAS;AAAA,MAE3D,gDACE,WAAW,4CACP,SACA;AAAA,MAGL;AAAA;AAAA,EACH;AAGF,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,mBAAgB,eAAe,0BAC9B,+BAAC,WACC;AAAA,wBAAC,kBAAe,SAAO,MAAE,mBAAQ;AAAA,IACjC,oBAAC,kBAAe,WAAW,oCAAO,iCAC/B,iBACH;AAAA,KACF,GACF;AAEJ;AAEO,SAAS,sBAAsB,MAAwC;AAC5E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,UAAU,qCAAqC;AAAA,IACxD,KAAK;AACH,aAAO,UAAU,mCAAmC;AAAA,IACtD,KAAK;AACH,aAAO,UAAU,qCAAqC;AAAA,IACxD,KAAK;AACH,aAAO,UAAU,iCAAiC;AAAA,IACpD,KAAK;AACH,aAAO,UAAU,kCAAkC;AAAA,IACrD,KAAK;AACH,aAAO,UAAU,mCAAmC;AAAA,IACtD,KAAK;AACH,aAAO,UAAU,qCAAqC;AAAA,EAC1D;AACF;AAEO,SAAS,yBAAyB,QAG7B;AACV,SACE,0BAA0B,OAAO,EAAE,KACnC,0BAA0B,OAAO,IAAI;AAEzC;AAEO,SAAS,yBACd,SACe;AACf,QAAM,yBAAyB,QAAQ;AAAA,IAAK,CAAC,WAC3C,qCAAqC,MAAM;AAAA,EAC7C;AACA,MAAI,wBAAwB;AAC1B,WAAO,uBAAuB;AAAA,EAChC;AACA,SAAO,QAAQ,KAAK,wBAAwB,GAAG,MAAM;AACvD;AAEO,SAAS,qCAAqC,QAGzC;AACV,aAAW,SAAS,CAAC,OAAO,IAAI,OAAO,IAAI,GAAG;AAC5C,YAAQ,6BAA6B,SAAS,EAAE,GAAG;AAAA,MACjD,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT;AACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,0BACd,OACS;AACT,UAAQ,6BAA6B,SAAS,EAAE,GAAG;AAAA,IACjD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,4BAA4B,OAAuB;AACjE,SAAO,MAAM,KAAK,EAAE,QAAQ,WAAW,EAAE;AAC3C;AAEO,SAAS,uBACd,OACA,aACQ;AACR,QAAM,qBAAqB,aAAa,KAAK;AAC7C,SAAO,qBAAqB,GAAG,KAAK,IAAI,kBAAkB,KAAK;AACjE;;;AC5UA,SAAS,aAAa,SAAS,gBAAgB;AAsB/C,SAAS,aACP,QACA,KACA,UACG;AACH,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,IACnD,OAAO,GAAG,IACV;AACN;AAEA,SAAS,cACP,QACA,KACA,OACM;AACN,SAAO,eAAe,QAAQ,KAAK;AAAA,IACjC,cAAc;AAAA,IACd,YAAY;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AACH;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGsB;AACpB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAEtD,CAAC,CAAC;AACJ,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAEtD,CAAC,CAAC;AAEJ,QAAM,kBAAkB,UAAU,YAAY,KAAK;AACnD,QAAM,kBAAkB,kBACpB,aAAa,sBAAsB,gBAAgB,IAAI,CAAC,CAAC,IACzD,CAAC;AACL,QAAM,WAAW,kBACb,aAAa,sBAAsB,gBAAgB,IAAI,EAAE,IACzD;AACJ,QAAM,0BACJ,oBAAoB,SACnB,gBAAgB,SAAS,KAAK,SAAS,KAAK,MAAM;AACrD,QAAM,iBAAiB,gBAAgB,UAAU,SAAS;AAE1D,QAAM,gBAAgB,QAAQ,MAAM;AAClC,UAAM,sBAAyD,CAAC;AAChE,eAAW,YAAY,WAAW;AAChC,YAAM,WAAW,aAAa,sBAAsB,SAAS,IAAI,CAAC,CAAC;AACnE,YAAM,eAAe;AAAA,QACnB;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MACF,EAAE,KAAK;AACP,UAAI,SAAS,aAAa;AACxB,cAAM,UAAU,eAAe,CAAC,GAAG,UAAU,YAAY,IAAI;AAC7D,YAAI,QAAQ,SAAS,GAAG;AACtB,wBAAc,qBAAqB,SAAS,IAAI,OAAO;AAAA,QACzD;AACA;AAAA,MACF;AACA,YAAM,SAAS,gBAAgB,SAAS,CAAC;AACzC,UAAI,QAAQ;AACV,sBAAc,qBAAqB,SAAS,IAAI,MAAM;AAAA,MACxD;AAAA,IACF;AACA,WAAO,0BAA0B,mBAAmB;AAAA,EACtD,GAAG,CAAC,sBAAsB,WAAW,oBAAoB,CAAC;AAE1D,QAAM,uBACJ,UAAU,SAAS,KACnB,UAAU;AAAA,IAAM,CAAC,aACf,OAAO,UAAU,eAAe;AAAA,MAC9B,cAAc;AAAA,MACd,SAAS;AAAA,IACX;AAAA,EACF;AAEF,QAAM,eAAe;AAAA,IACnB,CAAC,gBAAwB;AACvB,UAAI,gBAAgB,CAAC,gBAAiB;AACtC,8BAAwB,CAAC,YAAY;AACnC,cAAM,WAAW,aAAa,SAAS,gBAAgB,IAAI,CAAC,CAAC;AAC7D,cAAM,OAAO,gBAAgB,cACzB,SAAS,SAAS,WAAW,IAC3B,SAAS,OAAO,CAAC,UAAU,UAAU,WAAW,IAChD,CAAC,GAAG,UAAU,WAAW,IAC3B,SAAS,SAAS,WAAW,IAC3B,CAAC,IACD,CAAC,WAAW;AAClB,cAAM,UAAU,EAAE,GAAG,QAAQ;AAC7B,sBAAc,SAAS,gBAAgB,IAAI,IAAI;AAC/C,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,iBAAiB,YAAY;AAAA,EAChC;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,UAAkB;AACjB,UAAI,gBAAgB,CAAC,gBAAiB;AACtC,8BAAwB,CAAC,YAAY;AACnC,cAAM,UAAU,EAAE,GAAG,QAAQ;AAC7B,sBAAc,SAAS,gBAAgB,IAAI,KAAK;AAChD,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,iBAAiB,YAAY;AAAA,EAChC;AAEA,QAAM,uBAAuB,YAAY,MAAM;AAC7C,QAAI,aAAc;AAClB,oBAAgB,CAAC,YAAY,KAAK,IAAI,UAAU,GAAG,CAAC,CAAC;AAAA,EACvD,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,mBAAmB,YAAY,MAAM;AACzC,QAAI,gBAAgB,CAAC,wBAAyB;AAC9C,oBAAgB,CAAC,YAAY,KAAK,IAAI,UAAU,GAAG,UAAU,SAAS,CAAC,CAAC;AAAA,EAC1E,GAAG,CAAC,yBAAyB,cAAc,UAAU,MAAM,CAAC;AAE5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AHnHM,gBAAAA,MAwCM,QAAAC,aAxCN;AAlBC,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAEgB;AACd;AACA,QAAM,WAAW,OAAO,UAAU,CAAC,KAAK;AACxC,QAAM,wBACJ,YAAY,aACZ,OAAO,UAAU,WAAW,KAC5B,aAAa,QACb,CAAC,SAAS,eACV,SAAS,QAAQ,SAAS;AAE5B,MAAI,uBAAuB;AACzB,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEE,GAAG;AAAA,MACJ;AAAA;AAAA,IAFK,OAAO;AAAA,EAGd;AAEJ;AAEA,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAEgB;AACd,SACE,gBAAAA,KAAC,aAAQ,WAAW,2BAA2B,QAAQ,GACrD,0BAAAC,MAAC,SAAI,WAAW,+BAA+B,QAAQ,GACrD;AAAA,oBAAAD,KAAC,SAAI,WAAW,oCAAO,yBACrB,0BAAAA,KAAC,UAAK,WAAW,oCAAO,uBACrB,sCAA4B,SAAS,MAAM,GAC9C,GACF;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAW,oCAAO,2BACpB,mBAAS,UACZ;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAW,oCAAO,0BACpB,mBAAS,QAAQ,IAAI,CAAC,WACrB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,oCAAO;AAAA,QAClB,cAAY;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,SAAS,MACP,SAAS;AAAA,UACP,WAAW,OAAO;AAAA,UAClB,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,GAAG,0BAA0B;AAAA,cAC3B,CAAC,SAAS,EAAE,GAAG,OAAO;AAAA,YACxB,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,QAGH;AAAA,0BAAAD,KAAC,UAAK,WAAW,oCAAO,wBACrB,iBAAO,OACV;AAAA,UACC,OAAO,cACN,gBAAAA,KAAC,UAAK,WAAW,oCAAO,8BACrB,iBAAO,aACV,IACE;AAAA;AAAA;AAAA,MA3BC,OAAO;AAAA,IA4Bd,CACD,GACH;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,GAA2C;AACzC;AACA,QAAM,OAAO,qBAAqB;AAAA,IAChC;AAAA,IACA,WAAW,OAAO;AAAA,EACpB,CAAC;AACD,QAAM,WAAW,KAAK;AAEtB,MAAI,CAAC,UAAU;AACb,WACE,gBAAAA,KAAC,aAAQ,WAAW,2BAA2B,QAAQ,GACrD,0BAAAA,KAAC,SAAI,WAAW,+BAA+B,QAAQ,GACrD,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,oCAAO,qBAAqB;AAAA,QAE1C;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,QAAM;AAAA,cACN,eAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA,UACC,4BAA4B,OAAO,gBAAgB;AAAA;AAAA;AAAA,IACtD,GACF,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,aAAQ,WAAW,2BAA2B,QAAQ,GACrD,0BAAAC,MAAC,SAAI,WAAW,+BAA+B,QAAQ,GACrD;AAAA,oBAAAA,MAAC,SAAI,WAAW,oCAAO,yBACrB;AAAA,sBAAAD,KAAC,UAAK,WAAW,oCAAO,uBACrB,sCAA4B,SAAS,MAAM,GAC9C;AAAA,MACA,gBAAAC,MAAC,UAAK,WAAW,oCAAO,uBACrB;AAAA,aAAK,eAAe;AAAA,QAAE;AAAA,QAAE,OAAO,UAAU;AAAA,SAC5C;AAAA,OACF;AAAA,IACA,gBAAAD,KAAC,SAAI,WAAW,oCAAO,2BACpB,mBAAS,UACZ;AAAA,IACC,SAAS,QAAQ,SAAS,IACzB,gBAAAA,KAAC,SAAI,WAAW,oCAAO,0BACpB,mBAAS,QAAQ,IAAI,CAAC,WAAW;AAChC,YAAM,SAAS,KAAK,gBAAgB,SAAS,OAAO,KAAK;AACzD,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW,oCAAO;AAAA,UAClB,eAAa;AAAA,UACb,gBAAc;AAAA,UACd,cAAY;AAAA,YACV,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA,UAAU;AAAA,UACV,SAAS,MAAM,KAAK,aAAa,OAAO,KAAK;AAAA,UAE7C;AAAA,4BAAAD,KAAC,UAAK,WAAW,oCAAO,wBACrB,iBAAO,OACV;AAAA,YACC,OAAO,cACN,gBAAAA,KAAC,UAAK,WAAW,oCAAO,8BACrB,iBAAO,aACV,IACE;AAAA;AAAA;AAAA,QAnBC,OAAO;AAAA,MAoBd;AAAA,IAEJ,CAAC,GACH,IACE;AAAA,IACJ,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,KAAK;AAAA,QACZ,aAAa,OAAO;AAAA,QACpB,UAAU;AAAA,QACV,WAAW,oCAAO;AAAA,QAClB,UAAU,CAAC,UAAU,KAAK,YAAY,MAAM,cAAc,KAAK;AAAA;AAAA,IACjE;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAW,oCAAO,0BACpB;AAAA,aAAO,UAAU,SAAS,IACzB,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,UAAU,gBAAgB,KAAK,iBAAiB;AAAA,UAChD,SAAS,KAAK;AAAA,UAEb,iBAAO;AAAA;AAAA,MACV,IACE;AAAA,MACH,KAAK,iBACJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,UAAU,gBAAgB,CAAC,KAAK;AAAA,UAChC,SAAS,MACP,SAAS;AAAA,YACP,WAAW,OAAO;AAAA,YAClB,QAAQ;AAAA,YACR,SAAS,EAAE,GAAG,KAAK,cAAc;AAAA,UACnC,CAAC;AAAA,UAGF,iBAAO;AAAA;AAAA,MACV,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,UAAU,gBAAgB,CAAC,KAAK;AAAA,UAChC,SAAS,KAAK;AAAA,UAEb,iBAAO;AAAA;AAAA,MACV;AAAA,OAEJ;AAAA,KACF,GACF;AAEJ;;;AI7PA,SAAS,eAAAE,cAAa,WAAW,WAAAC,UAAS,QAAQ,YAAAC,iBAAgB;AAClE,SAAS,qBAAqB;AA6JpB,gBAAAC,MAIE,QAAAC,aAJF;AA3HH,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,GAGG;AACD;AACA,QAAM,yBAAyBC;AAAA,IAC7B,MAAM,+BAA+B,QAAQ,MAAM;AAAA,IACnD,CAAC,QAAQ,MAAM;AAAA,EACjB;AACA,QAAM,CAAC,oBAAoB,qBAAqB,IAAIC;AAAA,IAClD;AAAA,EACF;AACA,QAAM,CAAC,yBAAyB,0BAA0B,IAAIA,UAE5D,IAAI;AACN,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,sBAAsB,OAAmC,IAAI;AACnE,QAAM,eAAe,wBAAwB,KAAK,wBAAwB;AAC1E,QAAM,WAAW,iBAAiB,cAAc,MAAM,QAAQ;AAC9D,QAAM,mBAAmBD;AAAA,IACvB,MAAM,yBAAyB,OAAO,OAAO;AAAA,IAC7C,CAAC,OAAO,OAAO;AAAA,EACjB;AACA,QAAM,gBAAgB,SAAS,KAAK;AAEpC,YAAU,MAAM;AACd,0BAAsB,IAAI;AAC1B,+BAA2B,IAAI;AAC/B,gBAAY,EAAE;AAAA,EAChB,GAAG,CAAC,OAAO,SAAS,CAAC;AAErB,YAAU,MAAM;AACd,QAAI,CAAC,cAAc;AACjB,4BAAsB,IAAI;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,YAAU,MAAM;AACd,QAAI,4BAA4B,MAAM;AACpC,0BAAoB,SAAS,MAAM;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,uBAAuB,CAAC;AAE5B,QAAM,eAAeE;AAAA,IACnB,CAAC,aAAqB;AACpB,YAAM,iBAAiB,qBAAqB;AAC5C,UAAI,kBAAkB,4BAA4B,UAAU;AAC1D,oBAAY,EAAE;AACd,mCAA2B,QAAQ;AACnC;AAAA,MACF;AACA,4BAAsB,QAAQ;AAC9B,eAAS;AAAA,QACP,WAAW,OAAO;AAAA,QAClB,GAAI,iBAAiB,EAAE,QAAQ,OAAO,IAAI,CAAC;AAAA,QAC3C;AAAA,QACA,GAAI,kBAAkB,gBAClB,EAAE,SAAS,EAAE,aAAa,cAAc,EAAE,IAC1C,CAAC;AAAA,MACP,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QACE,CAAC,qBACD,gBACA,uBAAuB,QACvB,OAAO,QAAQ,WAAW,GAC1B;AACA,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,CAAC,UAA+B;AACpD,UACE,CAAC,eAAe,KAAK,KACrB,yBAAyB,MAAM,MAAM,KACrC,MAAM,eACN,MAAM,UACN,MAAM,UACN;AACA;AAAA,MACF;AACA,YAAM,cAAc,MAAM,WAAW,MAAM,UAAU,IAAI;AACzD,YAAM,SAAS,OAAO,QAAQ,WAAW;AACzC,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,mBAAa,OAAO,EAAE;AAAA,IACxB;AAEA,WAAO,iBAAiB,WAAW,eAAe,IAAI;AACtD,WAAO,MAAM,OAAO,oBAAoB,WAAW,eAAe,IAAI;AAAA,EACxE,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,gBAAAJ,KAAC,aAAQ,WAAW,2BAA2B,QAAQ,GACrD,0BAAAC,MAAC,SAAI,WAAW,+BAA+B,QAAQ,GACrD;AAAA,oBAAAA,MAAC,SAAI,WAAW,oCAAO,8BACrB;AAAA,sBAAAD,KAAC,SAAI,WAAW,oCAAO,uBACpB,sCAA4B,uBAAuB,IAAI,GAC1D;AAAA,MACC,uBAAuB,YAAY,IAAI,CAAC,WACvC,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,oCAAO;AAAA,UAEjB;AAAA,mBAAO;AAAA,YACP,OAAO,OAAO,IAAI,OAAO,IAAI,KAAK;AAAA;AAAA;AAAA,QAJ9B,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,MAKrC,CACD;AAAA,OACH;AAAA,IACC,uBAAuB,YAAY,SAAS,IAC3C,gBAAAD,KAAC,SAAI,WAAW,oCAAO,0BACpB,iCAAuB,YAAY,IAAI,CAAC,WACvC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,oCAAO;AAAA,QAElB;AAAA,0BAAAD,KAAC,UAAK,WAAW,oCAAO,wBACrB,iBAAO,OACV;AAAA,UACA,gBAAAA,KAAC,qBAAkB,QAAgB,aAA0B;AAAA,UAC5D,OAAO,OACN,gBAAAA,KAAC,UAAK,WAAW,oCAAO,8BACrB,iBAAO,MACV,IACE;AAAA;AAAA;AAAA,MAXC,GAAG,OAAO,KAAK,IAAI,OAAO,KAAK;AAAA,IAYtC,CACD,GACH,IACE;AAAA,IACJ,gBAAAA,KAAC,SAAI,WAAW,oCAAO,0BACpB,iBAAO,QAAQ,IAAI,CAAC,QAAQ,gBAAgB;AAC3C,YAAM,cAAc,uBAAuB,OAAO;AAClD,YAAM,yBAAyB,qBAAqB,OAAO;AAC3D,YAAM,cAAc,2BAA2B,QAAQ;AAAA,QACrD,UAAU;AAAA,MACZ,CAAC;AACD,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA,EAAE,UAAU,uBAAuB;AAAA,MACrC;AACA,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AACA,YAAM,uBAAuB,4BAA4B,OAAO;AAChE,UAAI,sBAAsB;AACxB,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,oCAAO;AAAA,YAElB;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,aAAa,OAAO;AAAA,kBACpB,UAAU,gBAAgB,uBAAuB;AAAA,kBACjD,WAAW,oCAAO;AAAA,kBAClB,cAAY;AAAA,oBACV;AAAA,oBACA,OAAO;AAAA,kBACT;AAAA,kBACA,UAAU,CAAC,UAAU,YAAY,MAAM,cAAc,KAAK;AAAA,kBAC1D,WAAW,CAAC,UAAU;AACpB,wBACE,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,YAAY,aAClB;AACA;AAAA,oBACF;AACA,0BAAM,eAAe;AACrB,wBAAI,CAAC,eAAe;AAClB,0CAAoB,SAAS,MAAM;AACnC;AAAA,oBACF;AACA,iCAAa,OAAO,EAAE;AAAA,kBACxB;AAAA;AAAA,cACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oCAAO;AAAA,kBAClB,UACE,gBACA,uBAAuB,QACvB,CAAC;AAAA,kBAEH,cAAY,OAAO;AAAA,kBACnB,OAAO,OAAO;AAAA,kBACd,aAAW;AAAA,kBACX,SAAS,MAAM;AACb,wBAAI,CAAC,eAAe;AAClB,0CAAoB,SAAS,MAAM;AACnC;AAAA,oBACF;AACA,iCAAa,OAAO,EAAE;AAAA,kBACxB;AAAA,kBAEC,wBACC,gBAAAA,KAAC,4BAAyB,IAE1B,gBAAAA,KAAC,kBAAe;AAAA;AAAA,cAEpB;AAAA;AAAA;AAAA,UAtDK,OAAO;AAAA,QAuDd;AAAA,MAEJ;AACA,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW,oCAAO;AAAA,UAClB,cAAY;AAAA,YACV;AAAA,YACA,OAAO;AAAA,UACT;AAAA,UACA,UAAU,gBAAgB,uBAAuB;AAAA,UACjD,SAAS,MAAM,aAAa,OAAO,EAAE;AAAA,UAErC;AAAA,4BAAAD,KAAC,UAAK,WAAW,oCAAO,wBACrB,6BAAmB,OACtB;AAAA,YACC,mBAAmB,gBAClB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,mBAAmB;AAAA,gBAC1B,QAAO;AAAA,gBACP,iBAAiB,CAAC;AAAA;AAAA,YACpB,IACE;AAAA,YACH,OAAO,cACN,gBAAAA,KAAC,UAAK,WAAW,oCAAO,8BACrB,iBAAO,aACV,IACE;AAAA,YACH,qBAAqB,iBAAiB,CAAC,cACtC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,oCAAO;AAAA,gBAClB,eAAY;AAAA,gBAEX;AAAA;AAAA,YACH,IACE;AAAA,YACH,cAAc,gBAAAA,KAAC,4BAAyB,IAAK;AAAA;AAAA;AAAA,QAjCzC,OAAO;AAAA,MAkCd;AAAA,IAEJ,CAAC,GACH;AAAA,KACF,GACF;AAEJ;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,GAGG;AACD;AACA,QAAM,CAAC,UAAU,WAAW,IAAIG,UAAS,EAAE;AAG3C,QAAM,qBAAqB,YAAY;AACvC,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA;AAAA,IAClD;AAAA,EACF;AACA,QAAM,UAAU,SAAS,KAAK;AAC9B,QAAM,gBACJ,YAAY,KAAK,OAAO,aAAa,OAAO;AAM9C,QAAM,QACJ,OAAO,QAAQ,SAAS,IACpB,OAAO,QAAQ,IAAI,CAAC,WAAW;AAC7B,UAAM,QAAQ,OAAO,UAAU,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO,EAAE;AACnE,WAAO;AAAA,MACL,IAAI,OAAO;AAAA,MACX,OAAO,OAAO,SAAS,OAAO;AAAA,MAC9B,aAAa,OAAO,eAAe,OAAO,eAAe;AAAA,IAC3D;AAAA,EACF,CAAC,IACD,OAAO;AAEb,YAAU,MAAM;AACd,0BAAsB,IAAI;AAAA,EAC5B,GAAG,CAAC,OAAO,SAAS,CAAC;AAErB,YAAU,MAAM;AACd,QAAI,CAAC,cAAc;AACjB,4BAAsB,IAAI;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,SACE,gBAAAH,KAAC,aAAQ,WAAW,2BAA2B,QAAQ,GACrD,0BAAAC,MAAC,SAAI,WAAW,+BAA+B,QAAQ,GACrD;AAAA,oBAAAD,KAAC,SAAI,WAAW,oCAAO,uBACpB,sCAA4B,OAAO,QAAQ,GAC9C;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAW,oCAAO,0BACpB,gBAAM,IAAI,CAAC,SAAS;AACnB,YAAM,cAAc,uBAAuB,KAAK;AAChD,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW,oCAAO;AAAA,UAClB,cAAY;AAAA,YACV,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AAAA,UACA,UAAU,gBAAgB,uBAAuB;AAAA,UACjD,SAAS,MAAM;AACb,kCAAsB,KAAK,EAAE;AAC7B,qBAAS;AAAA,cACP,WAAW,OAAO;AAAA,cAClB,QAAQ;AAAA,cACR,UAAU,KAAK;AAAA,YACjB,CAAC;AAAA,UACH;AAAA,UAEA;AAAA,4BAAAD,KAAC,UAAK,WAAW,oCAAO,wBACrB,eAAK,OACR;AAAA,YACA,gBAAAA,KAAC,UAAK,WAAW,oCAAO,8BACrB,eAAK,aACR;AAAA,YACC,cAAc,gBAAAA,KAAC,4BAAyB,IAAK;AAAA;AAAA;AAAA,QAvBzC,KAAK;AAAA,MAwBZ;AAAA,IAEJ,CAAC,GACH;AAAA,IACC,qBACC,gBAAAC,MAAC,SAAI,WAAW,oCAAO,yBACrB;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,aAAa,OAAO;AAAA,UACpB,UAAU;AAAA,UACV,WAAW,oCAAO;AAAA,UAClB,UAAU,CAAC,UAAU,YAAY,MAAM,cAAc,KAAK;AAAA;AAAA,MAC5D;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAW,oCAAO,0BACrB,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV,SAAS,MACP,SAAS;AAAA,YACP,WAAW,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,YAKlB,QAAQ;AAAA,YACR,GAAI,OAAO,uBACP,EAAE,UAAU,OAAO,qBAAqB,IACxC,CAAC;AAAA,YACL,SAAS,UAAU,EAAE,aAAa,QAAQ,IAAI;AAAA,UAChD,CAAC;AAAA,UAGF;AAAA;AAAA,MACH,GACF;AAAA,OACF;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAAA,KAAC,SAAI,WAAW,oCAAO,0BACrB,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV,SAAS,MACP,SAAS;AAAA,YACP,WAAW,OAAO;AAAA,YAClB,QAAQ;AAAA,YACR,GAAI,OAAO,uBACP,EAAE,UAAU,OAAO,qBAAqB,IACxC,CAAC;AAAA,UACP,CAAC;AAAA,UAGF,iBAAO;AAAA;AAAA,MACV,GACF;AAAA;AAAA,KAEJ,GACF;AAEJ;AAKO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,GAGG;AACD;AACA,QAAM,CAAC,UAAU,WAAW,IAAIG,UAAS,EAAE;AAC3C,QAAM,UAAU,SAAS,KAAK;AAC9B,QAAM,gBACJ,YAAY,KACR,OAAO,yBACP,OAAO;AAIb,QAAM,qBAAqB,YAAY;AAEvC,SACE,gBAAAH,KAAC,aAAQ,WAAW,2BAA2B,QAAQ,GACrD,0BAAAC,MAAC,SAAI,WAAW,+BAA+B,QAAQ,GACrD;AAAA,oBAAAD,KAAC,SAAI,WAAW,oCAAO,uBACpB,sCAA4B,OAAO,sBAAsB,GAC5D;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAW,oCAAO,0BACrB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,oCAAO;AAAA,QAClB,eAAY;AAAA,QACZ,UAAU;AAAA,QACV,SAAS,MACP,SAAS;AAAA,UACP,WAAW,OAAO;AAAA,UAClB,QAAQ;AAAA,QACV,CAAC;AAAA,QAGH,0BAAAA,KAAC,UAAK,WAAW,oCAAO,wBACrB,iBAAO,2BACV;AAAA;AAAA,IACF,GACF;AAAA,IACC,qBACC,gBAAAC,MAAC,SAAI,WAAW,oCAAO,yBACrB;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,aAAa,OAAO;AAAA,UACpB,UAAU;AAAA,UACV,WAAW,oCAAO;AAAA,UAClB,eAAY;AAAA,UACZ,UAAU,CAAC,UAAU,YAAY,MAAM,cAAc,KAAK;AAAA;AAAA,MAC5D;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAW,oCAAO,0BACrB,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,eAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS,MACP,SAAS;AAAA,YACP,WAAW,OAAO;AAAA,YAClB,QACE,YAAY,KACR,kCACA;AAAA,YACN,SAAS,UAAU,EAAE,MAAM,QAAQ,IAAI;AAAA,UACzC,CAAC;AAAA,UAGF;AAAA;AAAA,MACH,GACF;AAAA,OACF,IACE;AAAA,KACN,GACF;AAEJ;;;AC3dM,gBAAAK,YAAA;AAjBC,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,GAEuB;AACrB;AAEA,MAAI,OAAO,SAAS,YAAY;AAC9B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,MAAI,OAAO,SAAS,aAAa;AAC/B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,MAAI,OAAO,SAAS,uBAAuB;AACzC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IAPK,OAAO;AAAA,EAQd;AAEJ;","names":["jsx","jsxs","useCallback","useMemo","useState","jsx","jsxs","useMemo","useState","useCallback","jsx"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  isAgentGuiWorkbenchProvider,
3
3
  normalizeAgentGuiWorkbenchProvider
4
- } from "./chunk-L3GMMGRS.js";
4
+ } from "./chunk-R2ZADXRB.js";
5
5
  import {
6
6
  agentGuiWorkbenchOpenSessionActivationType,
7
7
  agentGuiWorkbenchPrefillPromptActivationType
@@ -9,7 +9,6 @@ import {
9
9
 
10
10
  // workbench/launch.ts
11
11
  var agentGuiWorkbenchTypeId = "agent-gui";
12
- var agentGuiWorkbenchDockEntryPrefix = "agent-gui:";
13
12
  var agentGuiWorkbenchUnifiedDockEntryIdValue = "agent-gui:unified";
14
13
  var agentGuiWorkbenchDockPopupNewWindowLaunchSource = "dock-popup-new-window";
15
14
  var agentGuiWorkbenchInstanceSequence = 0;
@@ -19,47 +18,9 @@ function agentGuiWorkbenchDockEntryId(_provider) {
19
18
  function agentGuiWorkbenchUnifiedDockEntryId() {
20
19
  return agentGuiWorkbenchUnifiedDockEntryIdValue;
21
20
  }
22
- function agentGuiWorkbenchInstanceId(provider) {
23
- return `${agentGuiWorkbenchDockEntryPrefix}${encodeAgentGuiWorkbenchInstanceSegment(
24
- provider
25
- )}`;
26
- }
27
- function createAgentGuiWorkbenchInstanceId(input) {
28
- const prefix = agentGuiWorkbenchInstanceId(input.provider);
29
- const agentSessionId = input.agentSessionId?.trim();
30
- if (agentSessionId) {
31
- return `${prefix}:session:${encodeAgentGuiWorkbenchInstanceSegment(
32
- agentSessionId
33
- )}`;
34
- }
35
- const agentTargetId = input.agentTargetId?.trim();
36
- if (agentTargetId) {
37
- return `${prefix}:target:${encodeAgentGuiWorkbenchInstanceSegment(
38
- agentTargetId
39
- )}`;
40
- }
21
+ function createAgentGuiWorkbenchInstanceId() {
41
22
  agentGuiWorkbenchInstanceSequence += 1;
42
- return [
43
- prefix,
44
- "panel",
45
- `${Date.now().toString(36)}-${agentGuiWorkbenchInstanceSequence.toString(36)}`
46
- ].join(":");
47
- }
48
- function agentGuiWorkbenchProviderFromIdentifier(value) {
49
- if (agentGuiWorkbenchDockIdentityFromIdentifier(value)) {
50
- return null;
51
- }
52
- const normalized = value?.trim();
53
- if (!normalized?.startsWith(agentGuiWorkbenchDockEntryPrefix)) {
54
- return null;
55
- }
56
- const identifier = normalized.slice(agentGuiWorkbenchDockEntryPrefix.length);
57
- const structuredSuffix = identifier.match(
58
- /:(?:panel|session|target):[^:]*$/u
59
- );
60
- const encodedProvider = structuredSuffix ? identifier.slice(0, structuredSuffix.index) : identifier;
61
- const provider = decodeAgentGuiWorkbenchInstanceSegment(encodedProvider);
62
- return isAgentGuiWorkbenchProvider(provider) ? provider : null;
23
+ return `agent-gui:instance:${Date.now().toString(36)}-${agentGuiWorkbenchInstanceSequence.toString(36)}`;
63
24
  }
64
25
  function agentGuiWorkbenchDockIdentityFromIdentifier(value) {
65
26
  const normalized = value?.trim();
@@ -123,27 +84,16 @@ function createAgentGuiWorkbenchLaunchDescriptor(request) {
123
84
  type: agentGuiWorkbenchPrefillPromptActivationType
124
85
  },
125
86
  dockEntryId,
126
- instanceId: createAgentGuiWorkbenchInstanceId({
127
- agentTargetId: openInNewWindow2 ? null : agentTargetIdFromLaunchPayload(request.payload),
128
- provider
129
- }),
87
+ instanceId: createAgentGuiWorkbenchInstanceId(),
130
88
  openInNewWindow: openInNewWindow2,
131
89
  provider,
132
- reuseDockEntryNode: !openInNewWindow2 && shouldReuseAgentGuiWorkbenchDockEntryNode({
133
- dockEntryId,
134
- launchKind: "prefill"
135
- }),
136
- reuseExistingSessionNode: !openInNewWindow2,
90
+ reusePolicy: { kind: "none" },
137
91
  targetAgentSessionId: null
138
92
  };
139
93
  }
140
94
  const targetAgentSessionId = agentSessionIdFromLaunchPayload(request.payload);
141
95
  const openInNewWindow = openInNewWindowFromLaunchRequest(request);
142
- const instanceId = createAgentGuiWorkbenchInstanceId({
143
- agentSessionId: null,
144
- agentTargetId: openInNewWindow ? null : agentTargetIdFromLaunchPayload(request.payload),
145
- provider
146
- });
96
+ const instanceId = createAgentGuiWorkbenchInstanceId();
147
97
  return {
148
98
  activation: targetAgentSessionId ? {
149
99
  payload: {
@@ -155,36 +105,13 @@ function createAgentGuiWorkbenchLaunchDescriptor(request) {
155
105
  instanceId,
156
106
  openInNewWindow,
157
107
  provider,
158
- reuseDockEntryNode: !openInNewWindow && shouldReuseAgentGuiWorkbenchDockEntryNode({
159
- dockEntryId,
160
- launchKind: targetAgentSessionId ? "session" : "empty"
161
- }),
162
- reuseExistingSessionNode: !openInNewWindow,
108
+ reusePolicy: openInNewWindow ? { kind: "none" } : targetAgentSessionId ? { agentSessionId: targetAgentSessionId, kind: "current-session" } : { kind: "dock-entry" },
163
109
  targetAgentSessionId
164
110
  };
165
111
  }
166
- function shouldReuseAgentGuiWorkbenchDockEntryNode(input) {
167
- if (input.launchKind === "empty") {
168
- return true;
169
- }
170
- if (input.launchKind === "session") {
171
- return false;
172
- }
173
- return agentGuiWorkbenchDockIdentityFromIdentifier(input.dockEntryId)?.kind !== "unifiedAggregate";
174
- }
175
112
  function resolveAgentGuiWorkbenchLaunchDockEntryId(_input) {
176
113
  return agentGuiWorkbenchUnifiedDockEntryId();
177
114
  }
178
- function encodeAgentGuiWorkbenchInstanceSegment(value) {
179
- return encodeURIComponent(value.trim());
180
- }
181
- function decodeAgentGuiWorkbenchInstanceSegment(value) {
182
- try {
183
- return decodeURIComponent(value).trim();
184
- } catch {
185
- return null;
186
- }
187
- }
188
115
  function prefillPromptFromLaunchPayload(payload) {
189
116
  if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
190
117
  return null;
@@ -238,15 +165,12 @@ export {
238
165
  agentGuiWorkbenchTypeId,
239
166
  agentGuiWorkbenchDockEntryId,
240
167
  agentGuiWorkbenchUnifiedDockEntryId,
241
- agentGuiWorkbenchInstanceId,
242
168
  createAgentGuiWorkbenchInstanceId,
243
- agentGuiWorkbenchProviderFromIdentifier,
244
169
  agentGuiWorkbenchDockIdentityFromIdentifier,
245
170
  agentGuiWorkbenchProviderFromLaunchRequest,
246
171
  createAgentGuiWorkbenchSessionLaunchRequest,
247
172
  createAgentGuiWorkbenchDraftLaunchRequest,
248
173
  createAgentGuiWorkbenchLaunchDescriptor,
249
- shouldReuseAgentGuiWorkbenchDockEntryNode,
250
174
  resolveAgentGuiWorkbenchLaunchDockEntryId
251
175
  };
252
- //# sourceMappingURL=chunk-QY22OBJS.js.map
176
+ //# sourceMappingURL=chunk-AY5AFMT2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/launch.ts"],"sourcesContent":["import type { WorkbenchHostLaunchRequest } from \"@tutti-os/workbench-surface\";\nimport {\n isAgentGuiWorkbenchProvider,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport {\n agentGuiWorkbenchOpenSessionActivationType,\n agentGuiWorkbenchPrefillPromptActivationType,\n type AgentGuiWorkbenchPrefillPromptPayload,\n type AgentGuiWorkbenchProvider\n} from \"./types.ts\";\n\nexport { agentGuiWorkbenchPrefillPromptActivationType } from \"./types.ts\";\n\ntype AgentGuiWorkbenchLaunchRequestInput = Pick<\n WorkbenchHostLaunchRequest,\n \"launchSource\" | \"payload\" | \"typeId\"\n> & {\n dockEntryId?: string | null;\n};\n\nexport const agentGuiWorkbenchTypeId = \"agent-gui\";\n\nconst agentGuiWorkbenchUnifiedDockEntryIdValue = \"agent-gui:unified\";\nconst agentGuiWorkbenchDockPopupNewWindowLaunchSource = \"dock-popup-new-window\";\nlet agentGuiWorkbenchInstanceSequence = 0;\n\nexport interface AgentGuiWorkbenchDockIdentity {\n kind: \"unifiedAggregate\";\n}\n\n/**\n * @deprecated AgentGUI has one canonical Dock entry. Use\n * {@link agentGuiWorkbenchUnifiedDockEntryId} instead.\n */\nexport function agentGuiWorkbenchDockEntryId(\n _provider: AgentGuiWorkbenchProvider\n): string {\n return agentGuiWorkbenchUnifiedDockEntryId();\n}\n\nexport function agentGuiWorkbenchUnifiedDockEntryId(): string {\n return agentGuiWorkbenchUnifiedDockEntryIdValue;\n}\n\nexport function createAgentGuiWorkbenchInstanceId(): string {\n agentGuiWorkbenchInstanceSequence += 1;\n return `agent-gui:instance:${Date.now().toString(36)}-${agentGuiWorkbenchInstanceSequence.toString(36)}`;\n}\n\nexport function agentGuiWorkbenchDockIdentityFromIdentifier(\n value: string | null | undefined\n): AgentGuiWorkbenchDockIdentity | null {\n const normalized = value?.trim();\n if (!normalized) {\n return null;\n }\n if (normalized === agentGuiWorkbenchUnifiedDockEntryId()) {\n return { kind: \"unifiedAggregate\" };\n }\n return null;\n}\n\nexport function agentGuiWorkbenchProviderFromLaunchRequest(\n request: AgentGuiWorkbenchLaunchRequestInput\n): AgentGuiWorkbenchProvider {\n const payloadProvider =\n request.payload &&\n typeof request.payload === \"object\" &&\n !Array.isArray(request.payload)\n ? (request.payload as { provider?: unknown }).provider\n : null;\n if (isAgentGuiWorkbenchProvider(payloadProvider)) {\n return payloadProvider;\n }\n throw new Error(\"agent_gui_workbench.launch_provider_required\");\n}\n\nexport function createAgentGuiWorkbenchSessionLaunchRequest(input: {\n agentTargetId?: string | null;\n agentSessionId?: string;\n openInNewWindow?: boolean;\n provider: unknown;\n}) {\n const provider = normalizeAgentGuiWorkbenchProvider(input.provider);\n return {\n dockEntryId: agentGuiWorkbenchUnifiedDockEntryId(),\n payload: {\n ...(input.agentTargetId?.trim()\n ? { agentTargetId: input.agentTargetId.trim() }\n : {}),\n ...(input.agentSessionId ? { agentSessionId: input.agentSessionId } : {}),\n ...(input.openInNewWindow ? { openInNewWindow: true } : {}),\n provider\n },\n reason: \"host\" as const,\n typeId: agentGuiWorkbenchTypeId\n };\n}\n\nexport function createAgentGuiWorkbenchDraftLaunchRequest(input: {\n agentTargetId?: string | null;\n autoSubmit?: boolean;\n draftPrompt: string;\n openInNewWindow?: boolean;\n provider: unknown;\n userProjectPath?: string | null;\n}) {\n const provider = normalizeAgentGuiWorkbenchProvider(input.provider);\n const userProjectPath = normalizeAgentGuiWorkbenchUserProjectPath(\n input.userProjectPath\n );\n return {\n dockEntryId: agentGuiWorkbenchUnifiedDockEntryId(),\n payload: {\n draftPrompt: input.draftPrompt,\n provider,\n ...(input.agentTargetId?.trim()\n ? { agentTargetId: input.agentTargetId.trim() }\n : {}),\n ...(input.autoSubmit ? { autoSubmit: true } : {}),\n ...(input.openInNewWindow ? { openInNewWindow: true } : {}),\n ...(userProjectPath ? { userProjectPath } : {})\n },\n reason: \"host\" as const,\n typeId: agentGuiWorkbenchTypeId\n };\n}\n\nexport interface AgentGuiWorkbenchLaunchDescriptor {\n activation:\n | {\n payload: {\n agentSessionId: string;\n };\n type: typeof agentGuiWorkbenchOpenSessionActivationType;\n }\n | {\n payload: AgentGuiWorkbenchPrefillPromptPayload;\n type: typeof agentGuiWorkbenchPrefillPromptActivationType;\n }\n | null;\n dockEntryId: string;\n instanceId: string;\n openInNewWindow: boolean;\n provider: AgentGuiWorkbenchProvider;\n reusePolicy: AgentGuiWorkbenchReusePolicy;\n targetAgentSessionId: string | null;\n}\n\nexport type AgentGuiWorkbenchReusePolicy =\n | { kind: \"dock-entry\" }\n | { agentSessionId: string; kind: \"current-session\" }\n | { kind: \"none\" };\n\nexport function createAgentGuiWorkbenchLaunchDescriptor(\n request: AgentGuiWorkbenchLaunchRequestInput\n): AgentGuiWorkbenchLaunchDescriptor {\n const provider = agentGuiWorkbenchProviderFromLaunchRequest(request);\n const dockEntryId = agentGuiWorkbenchUnifiedDockEntryId();\n const prefillPrompt = prefillPromptFromLaunchPayload(request.payload);\n if (prefillPrompt) {\n const openInNewWindow = openInNewWindowFromLaunchPayload(request.payload);\n return {\n activation: {\n payload: prefillPrompt,\n type: agentGuiWorkbenchPrefillPromptActivationType\n },\n dockEntryId,\n instanceId: createAgentGuiWorkbenchInstanceId(),\n openInNewWindow,\n provider,\n reusePolicy: { kind: \"none\" },\n targetAgentSessionId: null\n };\n }\n\n const targetAgentSessionId = agentSessionIdFromLaunchPayload(request.payload);\n const openInNewWindow = openInNewWindowFromLaunchRequest(request);\n const instanceId = createAgentGuiWorkbenchInstanceId();\n\n return {\n activation: targetAgentSessionId\n ? {\n payload: {\n agentSessionId: targetAgentSessionId\n },\n type: agentGuiWorkbenchOpenSessionActivationType\n }\n : null,\n dockEntryId,\n instanceId,\n openInNewWindow,\n provider,\n reusePolicy: openInNewWindow\n ? { kind: \"none\" }\n : targetAgentSessionId\n ? { agentSessionId: targetAgentSessionId, kind: \"current-session\" }\n : { kind: \"dock-entry\" },\n targetAgentSessionId\n };\n}\n\n/**\n * @deprecated AgentGUI launch results always use the unified Dock entry. Use\n * {@link agentGuiWorkbenchUnifiedDockEntryId} instead.\n */\nexport function resolveAgentGuiWorkbenchLaunchDockEntryId(_input: {\n provider: AgentGuiWorkbenchProvider;\n requestedDockEntryId?: string | null;\n}): string {\n return agentGuiWorkbenchUnifiedDockEntryId();\n}\n\nfunction prefillPromptFromLaunchPayload(\n payload: unknown\n): AgentGuiWorkbenchPrefillPromptPayload | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return null;\n }\n const draftPrompt = (payload as { draftPrompt?: unknown }).draftPrompt;\n if (typeof draftPrompt !== \"string\" || !draftPrompt.trim()) {\n return null;\n }\n const autoSubmit = (payload as { autoSubmit?: unknown }).autoSubmit === true;\n const provider = (payload as { provider?: unknown }).provider;\n const agentTargetId = agentTargetIdFromLaunchPayload(payload);\n const userProjectPath = (payload as { userProjectPath?: unknown })\n .userProjectPath;\n const normalizedUserProjectPath =\n typeof userProjectPath === \"string\"\n ? normalizeAgentGuiWorkbenchUserProjectPath(userProjectPath)\n : null;\n return {\n draftPrompt,\n ...(agentTargetId ? { agentTargetId } : {}),\n ...(autoSubmit ? { autoSubmit: true } : {}),\n ...(isAgentGuiWorkbenchProvider(provider) ? { provider } : {}),\n ...(normalizedUserProjectPath\n ? { userProjectPath: normalizedUserProjectPath }\n : {})\n };\n}\n\nfunction normalizeAgentGuiWorkbenchUserProjectPath(\n value: string | null | undefined\n): string | null {\n const normalized = value?.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/, \"\");\n return normalized ? normalized : null;\n}\n\nfunction agentSessionIdFromLaunchPayload(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return null;\n }\n const agentSessionId = (payload as { agentSessionId?: unknown })\n .agentSessionId;\n return typeof agentSessionId === \"string\" && agentSessionId.trim()\n ? agentSessionId.trim()\n : null;\n}\n\nfunction agentTargetIdFromLaunchPayload(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return null;\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n return typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : null;\n}\n\nfunction openInNewWindowFromLaunchPayload(payload: unknown): boolean {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return false;\n }\n return (payload as { openInNewWindow?: unknown }).openInNewWindow === true;\n}\n\nfunction openInNewWindowFromLaunchRequest(\n request: AgentGuiWorkbenchLaunchRequestInput\n): boolean {\n return (\n openInNewWindowFromLaunchPayload(request.payload) ||\n request.launchSource === agentGuiWorkbenchDockPopupNewWindowLaunchSource\n );\n}\n"],"mappings":"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","names":["openInNewWindow"]}