@tutti-os/agent-gui 0.0.95 → 0.0.96

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 (110) hide show
  1. package/README.md +38 -6
  2. package/dist/{AgentGUI-CwBLYtv-.d.ts → AgentGUI-DWdvUV4x.d.ts} +64 -18
  3. package/dist/agent-conversation/index.d.ts +3 -2
  4. package/dist/agent-conversation/index.js +10 -9
  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 -5
  8. package/dist/agent-gui.js +26 -26
  9. package/dist/agent-message-center/index.d.ts +14 -3
  10. package/dist/agent-message-center/index.js +182 -47
  11. package/dist/agent-message-center/index.js.map +1 -1
  12. package/dist/{agentFileMentionContracts-Czvz6YMI.d.ts → agentFileMentionContracts-58IjMU-u.d.ts} +1 -0
  13. package/dist/{agentGuiNodeTypes-DppADPHW.d.ts → agentGuiNodeTypes-B9X4aWfv.d.ts} +30 -18
  14. package/dist/agents.d.ts +1 -1
  15. package/dist/agents.js +1 -1
  16. package/dist/app/renderer/agentactivity.css +150 -3
  17. package/dist/{chunk-C5FV4UGI.js → chunk-2HJEOO7W.js} +14 -6
  18. package/dist/chunk-2HJEOO7W.js.map +1 -0
  19. package/dist/{chunk-BFNJKTDV.js → chunk-3XXBDYAI.js} +11 -16
  20. package/dist/chunk-3XXBDYAI.js.map +1 -0
  21. package/dist/{chunk-YE25HN6T.js → chunk-3Y3F7CS5.js} +17 -25
  22. package/dist/chunk-3Y3F7CS5.js.map +1 -0
  23. package/dist/{chunk-CRO2MV2Y.js → chunk-4PQPJ5OY.js} +21 -116
  24. package/dist/chunk-4PQPJ5OY.js.map +1 -0
  25. package/dist/{chunk-R2EWECUP.js → chunk-7BXWPI4F.js} +17 -2
  26. package/dist/{chunk-R2EWECUP.js.map → chunk-7BXWPI4F.js.map} +1 -1
  27. package/dist/{chunk-LQVXBT65.js → chunk-AGT7MUTV.js} +9 -9
  28. package/dist/{chunk-LQVXBT65.js.map → chunk-AGT7MUTV.js.map} +1 -1
  29. package/dist/{chunk-O6W72SEP.js → chunk-C35SNDVZ.js} +4 -1
  30. package/dist/chunk-C35SNDVZ.js.map +1 -0
  31. package/dist/{chunk-BIHBXWK5.js → chunk-E4HQUTM3.js} +2 -2
  32. package/dist/{chunk-NX3CZJXW.js → chunk-H5F3QSCF.js} +2 -2
  33. package/dist/{chunk-WEDMAVX2.js → chunk-IYEXLOUE.js} +3 -6
  34. package/dist/chunk-IYEXLOUE.js.map +1 -0
  35. package/dist/{chunk-3R2D4E57.js → chunk-JKIZA7EJ.js} +933 -844
  36. package/dist/chunk-JKIZA7EJ.js.map +1 -0
  37. package/dist/{chunk-UQJPV6HP.js → chunk-L3GMMGRS.js} +8 -6
  38. package/dist/chunk-L3GMMGRS.js.map +1 -0
  39. package/dist/{chunk-KAL4XZMA.js → chunk-MASXZENX.js} +1 -1
  40. package/dist/chunk-MASXZENX.js.map +1 -0
  41. package/dist/{chunk-7PFDA2HQ.js → chunk-O3Q5SIJH.js} +3 -3
  42. package/dist/{chunk-NITOD7WF.js → chunk-QVBF5BN5.js} +2 -2
  43. package/dist/{chunk-7RDD3EWP.js → chunk-RE4AXS27.js} +24 -15
  44. package/dist/chunk-RE4AXS27.js.map +1 -0
  45. package/dist/{chunk-NJAZ7LQM.js → chunk-TVIGLNNI.js} +3 -3
  46. package/dist/{chunk-VF22EG3F.js → chunk-UHBCM6RO.js} +1 -1
  47. package/dist/chunk-UHBCM6RO.js.map +1 -0
  48. package/dist/{chunk-AOS2VWU6.js → chunk-W6WAGPMD.js} +33 -3
  49. package/dist/chunk-W6WAGPMD.js.map +1 -0
  50. package/dist/{chunk-RY6GIO3K.js → chunk-WKSFPJHZ.js} +5010 -3656
  51. package/dist/chunk-WKSFPJHZ.js.map +1 -0
  52. package/dist/{chunk-JX2SIXNL.js → chunk-WMNS4MAQ.js} +8 -7
  53. package/dist/{chunk-JX2SIXNL.js.map → chunk-WMNS4MAQ.js.map} +1 -1
  54. package/dist/{chunk-XMO45GKA.js → chunk-XPFHJMZP.js} +14 -4
  55. package/dist/chunk-XPFHJMZP.js.map +1 -0
  56. package/dist/chunk-YMXYBG7U.js +12 -0
  57. package/dist/chunk-YMXYBG7U.js.map +1 -0
  58. package/dist/context-mention-palette/index.d.ts +1 -1
  59. package/dist/context-mention-palette/index.js +14 -14
  60. package/dist/custom-mention.d.ts +2 -4
  61. package/dist/dock-icons.d.ts +2 -4
  62. package/dist/i18n/index.d.ts +30 -0
  63. package/dist/i18n/index.js +2 -2
  64. package/dist/index.d.ts +14 -12
  65. package/dist/index.js +34 -30
  66. package/dist/index.js.map +1 -1
  67. package/dist/mention-search.d.ts +1 -1
  68. package/dist/mention-search.js +11 -11
  69. package/dist/pastedTextKinds-D-XuInaS.d.ts +4 -0
  70. package/dist/startup-shell.d.ts +8 -0
  71. package/dist/startup-shell.js +184 -0
  72. package/dist/startup-shell.js.map +1 -0
  73. package/dist/{types-DX2bxgB8.d.ts → types-CnT8rNUI.d.ts} +16 -5
  74. package/dist/workbench/contribution.d.ts +3 -2
  75. package/dist/workbench/contribution.js +6 -6
  76. package/dist/workbench/index.d.ts +4 -4
  77. package/dist/workbench/index.js +14 -16
  78. package/dist/workbench/launch.d.ts +2 -2
  79. package/dist/workbench/launch.js +3 -3
  80. package/dist/workbench/providerCatalog.d.ts +2 -2
  81. package/dist/workbench/providerCatalog.js +1 -1
  82. package/dist/workbench/sessionTitle.d.ts +8 -12
  83. package/dist/workbench/sessionTitle.js +5 -7
  84. package/dist/workbench/state.js +2 -2
  85. package/dist/workbench/types.d.ts +2 -1
  86. package/dist/workbench/types.js +1 -1
  87. package/dist/workspace-agent-generated-files.js +6 -6
  88. package/package.json +19 -12
  89. package/dist/chunk-3R2D4E57.js.map +0 -1
  90. package/dist/chunk-7J4K6WKB.js +0 -66
  91. package/dist/chunk-7J4K6WKB.js.map +0 -1
  92. package/dist/chunk-7RDD3EWP.js.map +0 -1
  93. package/dist/chunk-AOS2VWU6.js.map +0 -1
  94. package/dist/chunk-BFNJKTDV.js.map +0 -1
  95. package/dist/chunk-C5FV4UGI.js.map +0 -1
  96. package/dist/chunk-CRO2MV2Y.js.map +0 -1
  97. package/dist/chunk-KAL4XZMA.js.map +0 -1
  98. package/dist/chunk-O6W72SEP.js.map +0 -1
  99. package/dist/chunk-RY6GIO3K.js.map +0 -1
  100. package/dist/chunk-UQJPV6HP.js.map +0 -1
  101. package/dist/chunk-VF22EG3F.js.map +0 -1
  102. package/dist/chunk-WEDMAVX2.js.map +0 -1
  103. package/dist/chunk-XMO45GKA.js.map +0 -1
  104. package/dist/chunk-YE25HN6T.js.map +0 -1
  105. package/dist/uiSettings-BQS9r2eo.d.ts +0 -6
  106. /package/dist/{chunk-BIHBXWK5.js.map → chunk-E4HQUTM3.js.map} +0 -0
  107. /package/dist/{chunk-NX3CZJXW.js.map → chunk-H5F3QSCF.js.map} +0 -0
  108. /package/dist/{chunk-7PFDA2HQ.js.map → chunk-O3Q5SIJH.js.map} +0 -0
  109. /package/dist/{chunk-NITOD7WF.js.map → chunk-QVBF5BN5.js.map} +0 -0
  110. /package/dist/{chunk-NJAZ7LQM.js.map → chunk-TVIGLNNI.js.map} +0 -0
@@ -2,14 +2,14 @@ import {
2
2
  AgentGUIConversation_styles_default,
3
3
  MessageSquareMoreIcon,
4
4
  extractAgentMcpToolTarget
5
- } from "./chunk-C5FV4UGI.js";
5
+ } from "./chunk-2HJEOO7W.js";
6
6
  import {
7
7
  getOptionalAgentHostApi,
8
8
  useOptionalAgentHostApi
9
- } from "./chunk-KAL4XZMA.js";
9
+ } from "./chunk-MASXZENX.js";
10
10
  import {
11
11
  translate
12
- } from "./chunk-BIHBXWK5.js";
12
+ } from "./chunk-E4HQUTM3.js";
13
13
 
14
14
  // shared/engine/useEngineSelector.ts
15
15
  import { useSyncExternalStoreWithSelector } from "use-sync-external-store/with-selector.js";
@@ -621,6 +621,11 @@ function ApprovalPromptSurface({
621
621
  setPendingFeedbackOptionId(null);
622
622
  setFeedback("");
623
623
  }, [prompt.requestId]);
624
+ useEffect(() => {
625
+ if (!isSubmitting) {
626
+ setSubmittingOptionId(null);
627
+ }
628
+ }, [isSubmitting]);
624
629
  useEffect(() => {
625
630
  if (pendingFeedbackOptionId !== null) {
626
631
  feedbackTextareaRef.current?.focus();
@@ -827,6 +832,11 @@ function ExitPlanPromptSurface({
827
832
  useEffect(() => {
828
833
  setSubmittingOptionId(null);
829
834
  }, [prompt.requestId]);
835
+ useEffect(() => {
836
+ if (!isSubmitting) {
837
+ setSubmittingOptionId(null);
838
+ }
839
+ }, [isSubmitting]);
830
840
  return /* @__PURE__ */ jsx2("section", { className: interactivePromptClassName(embedded), children: /* @__PURE__ */ jsxs2("div", { className: interactivePromptCardClassName(edgeGlow), children: [
831
841
  /* @__PURE__ */ jsx2("div", { className: AgentGUIConversation_styles_default.interactivePromptLead, children: stripPromptTitlePunctuation(labels.planLead) }),
832
842
  /* @__PURE__ */ jsx2("div", { className: AgentGUIConversation_styles_default.interactivePromptOptions, children: modes.map((mode) => {
@@ -1302,4 +1312,4 @@ export {
1302
1312
  isPromptRequestIdTitle,
1303
1313
  AgentInteractivePromptSurface
1304
1314
  };
1305
- //# sourceMappingURL=chunk-XMO45GKA.js.map
1315
+ //# sourceMappingURL=chunk-XPFHJMZP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/engine/useEngineSelector.ts","../shared/agentConversation/planImplementationPresentation.ts","../shared/agentConversation/agentPlanPromptDispatch.ts","../shared/agentConversation/approvalOptionPresentation.ts","../shared/agentConversation/promptToolDetails.ts","../shared/agentConversation/components/AgentInteractivePromptSurface.tsx","../shared/agentConversation/interactiveAnswerPayload.ts","../shared/agentConversation/components/AgentInteractiveDecisionPromptSurfaces.tsx","../shared/agentConversation/components/interactivePromptPresentation.tsx"],"sourcesContent":["import { useSyncExternalStoreWithSelector } from \"use-sync-external-store/with-selector.js\";\n\n// Single React binding for workspace session engine subscriptions\n// (docs/architecture/agent-gui-refactor-plan.md, sections 3.5 and 4.1).\n//\n// This is the only file in the package allowed to touch useSyncExternalStore\n// (enforced by tools/scripts/check-agent-gui-degradation.mjs). Components\n// subscribe through useEngineSelector so selector memoization and equality\n// comparison are implemented exactly once, via React's official with-selector\n// shim; hand-rolled subscriptions returning fresh references are the classic\n// infinite re-render trap this file exists to contain.\n\n/**\n * Structural surface the binding needs from an engine instance. Matches\n * AgentSessionEngine from @tutti-os/agent-activity-core, but stays structural\n * so focused tests and future engine slices can bind without the full engine.\n *\n * Contract: `subscribe` and `getSnapshot` must be stable, this-free function\n * references for the lifetime of the instance (the engine factory returns\n * closures, satisfying this by construction). A fresh `subscribe` identity per\n * render would force useSyncExternalStore to resubscribe on every render.\n */\nexport interface EngineStateStore<TState> {\n getSnapshot(): TState;\n subscribe(listener: (state: TState) => void): () => void;\n}\n\nexport function useEngineSelector<TState, TSelected>(\n engine: EngineStateStore<TState>,\n selector: (state: TState) => TSelected,\n isEqual?: (a: TSelected, b: TSelected) => boolean\n): TSelected {\n return useSyncExternalStoreWithSelector(\n engine.subscribe,\n engine.getSnapshot,\n engine.getSnapshot,\n selector,\n isEqual\n );\n}\n","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 translate(\"agentHost.agentGui.approvalOptions.rejectAlways\");\n }\n if (\n idToken === \"rejectonce\" ||\n idToken === \"reject\" ||\n idToken === \"deny\" ||\n kindToken === \"rejectonce\" ||\n kindToken === \"reject\" ||\n kindToken === \"deny\"\n ) {\n return intent.feedback\n ? translate(\"agentHost.agentGui.approvalOptions.rejectWithFollowUp\")\n : translate(\"agentHost.agentGui.approvalOptions.rejectOnce\");\n }\n return label || option.id;\n}\n\nexport function approvalOptionVisualPresentation(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): ApprovalOptionVisualPresentation {\n const commandPrefix = approvalOptionCommandPrefix(option.label);\n if (commandPrefix) {\n return {\n label: translate(\n \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefixLead\"\n ),\n commandPrefix\n };\n }\n return {\n label: approvalOptionDisplayLabel(option, intent)\n };\n}\n\nexport function normalizeApprovalOptionToken(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction approvalOptionSpecificTranslationKey(\n token: string,\n label: string,\n intent: { feedback?: boolean } = {}\n): string | null {\n const labelToken = normalizeApprovalOptionToken(label);\n switch (token) {\n case \"approved\":\n return isGenericAllowOnceLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowOnce\"\n : null;\n case \"approvedforsession\":\n return isGenericAllowForSessionLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowForSession\"\n : null;\n case \"approvedalways\":\n return isGenericApprovalLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowAlways\"\n : null;\n case \"bypasspermissions\":\n return \"agentHost.agentGui.approvalOptions.bypassPermissions\";\n case \"auto\":\n return labelToken === \"yesanduseautomode\"\n ? \"agentHost.agentGui.approvalOptions.autoMode\"\n : null;\n case \"acceptedits\":\n return \"agentHost.agentGui.approvalOptions.acceptEdits\";\n case \"default\":\n return labelToken === \"yesandmanuallyapproveedits\"\n ? \"agentHost.agentGui.approvalOptions.manualApproval\"\n : null;\n case \"cancel\":\n return !intent.feedback && labelToken === \"cancel\"\n ? \"common.cancel\"\n : null;\n default:\n return null;\n }\n}\n\nfunction approvalOptionProviderLabelTranslation(\n label: string\n): { key: string; params: Record<string, string> } | null {\n const commandPrefix = approvalOptionCommandPrefix(label);\n if (commandPrefix) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefix\",\n params: { command: commandPrefix }\n };\n }\n\n const allowScopeMatch = label.match(/^Yes,\\s*and don't ask again for (.+)$/i);\n if (allowScopeMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForScope\",\n params: { scope: allowScopeMatch[1] }\n };\n }\n\n const alwaysAllowMatch = label.match(/^Always Allow\\s+(.+)$/i);\n if (alwaysAllowMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.alwaysAllowScope\",\n params: { scope: alwaysAllowMatch[1] }\n };\n }\n\n return null;\n}\n\nfunction approvalOptionCommandPrefix(label: string): string | null {\n const commandPrefixMatch = label.match(\n /^Yes,\\s*and don't ask again for commands that start with `([^`]+)`$/i\n );\n return commandPrefixMatch?.[1]?.trim() || null;\n}\n\nfunction isGenericApprovalLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allowalways\" ||\n token === \"allowall\" ||\n token === \"alwaysallow\" ||\n token === \"allowanddontaskagain\" ||\n token === \"yesanddontaskagain\"\n );\n}\n\nfunction isGenericAllowOnceLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allow\" ||\n token === \"allowonce\" ||\n token === \"approve\" ||\n token === \"approveonce\" ||\n token === \"yes\" ||\n token === \"yesproceed\" ||\n token === \"yesandproceed\"\n );\n}\n\nfunction isGenericAllowForSessionLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"allowforthissession\" ||\n token === \"allowforsession\" ||\n token === \"approveforsession\"\n );\n}\n","import { extractAgentMcpToolTarget } from \"../agentMcpToolTarget\";\n\nexport interface PromptToolDetail {\n kind: \"command\" | \"mcp\" | \"path\" | \"query\";\n value: string;\n meta?: string;\n}\n\nexport function getPromptToolDetails(\n input: Record<string, unknown> | null\n): PromptToolDetail[] {\n if (!input) {\n return [];\n }\n const mcpTarget = extractAgentMcpToolTarget({ input });\n const mcpDetails: PromptToolDetail[] = mcpTarget\n ? [\n {\n kind: \"mcp\",\n value: mcpTarget.displayName,\n ...(mcpTarget.instruction ? { meta: mcpTarget.instruction } : {})\n }\n ]\n : [];\n const detailInput = resolveToolDetailInput(input);\n const command =\n commandStringValue(detailInput.command) ??\n commandStringValue(detailInput.cmd);\n if (command) {\n return [\n ...mcpDetails,\n {\n kind: \"command\",\n value: command,\n ...(stringValue(detailInput.description)\n ? { meta: stringValue(detailInput.description) as string }\n : {})\n }\n ];\n }\n const filePath =\n stringValue(detailInput.file_path) ??\n stringValue(detailInput.filePath) ??\n stringValue(detailInput.path) ??\n stringValue(detailInput.notebook_path);\n if (filePath) {\n const lineRange = formatLineRange(detailInput);\n return [\n ...mcpDetails,\n {\n kind: \"path\",\n value: filePath,\n ...(lineRange ? { meta: lineRange } : {})\n }\n ];\n }\n const query =\n stringValue(detailInput.query) ??\n stringValue(detailInput.search_query) ??\n stringValue(detailInput.searchQuery) ??\n stringValue(detailInput.pattern);\n if (query) {\n return [\n ...mcpDetails,\n {\n kind: \"query\",\n value: query\n }\n ];\n }\n return mcpDetails;\n}\n\nexport function isPromptRequestIdTitle(value: string): boolean {\n return /^requestid\\s*:/iu.test(value.trim());\n}\n\nfunction resolveToolDetailInput(\n input: Record<string, unknown>\n): Record<string, unknown> {\n const toolCall = objectValue(input.toolCall);\n return (\n firstObjectValue(input, [\n \"command\",\n \"cmd\",\n \"file_path\",\n \"filePath\",\n \"path\",\n \"notebook_path\",\n \"query\",\n \"search_query\",\n \"searchQuery\",\n \"pattern\"\n ]) ??\n firstObjectValue(toolCall, [\n \"input\",\n \"rawInput\",\n \"raw_input\",\n \"arguments\",\n \"args\"\n ]) ??\n toolCall ??\n input\n );\n}\n\nfunction firstObjectValue(\n input: Record<string, unknown> | null,\n keys: readonly string[]\n): Record<string, unknown> | null {\n if (!input) {\n return null;\n }\n if (keys.some((key) => stringValue(input[key]))) {\n return input;\n }\n for (const key of keys) {\n const value = objectValue(input[key]);\n if (value) {\n return value;\n }\n }\n return null;\n}\n\nfunction formatLineRange(input: Record<string, unknown>): string | null {\n const start = numericValue(input.startLine) ?? numericValue(input.start_line);\n const end = numericValue(input.endLine) ?? numericValue(input.end_line);\n if (start === null || end === null) {\n return null;\n }\n return start === end ? `L${start}` : `L${start}-${end}`;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction commandStringValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (!Array.isArray(value)) {\n return null;\n }\n const shellFlag = stringValue(value[value.length - 2]);\n const shellCommand = stringValue(value[value.length - 1]);\n if ((shellFlag === \"-c\" || shellFlag === \"-lc\") && shellCommand) {\n return shellCommand;\n }\n const parts = value.flatMap((part) => {\n const text = stringValue(part);\n return text ? [text] : [];\n });\n return parts.length > 0 ? parts.join(\" \") : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction numericValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { MessageSquareMoreIcon } from \"../../../app/renderer/components/icons/MessageSquareMoreIcon\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { buildAskUserAnswerPayload } from \"../interactiveAnswerPayload\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\nimport {\n ApprovalPromptSurface,\n ExitPlanPromptSurface,\n PlanImplementationSurface\n} from \"./AgentInteractiveDecisionPromptSurfaces\";\nimport {\n interactiveOptionLabel,\n interactivePromptCardClassName,\n interactivePromptClassName,\n stripPromptTitlePunctuation\n} from \"./interactivePromptPresentation\";\n\n/**\n * Where the prompt is rendered, which sets its interaction budget:\n * - \"full\" (conversation / composer): the user is focused here, so every action\n * is shown — primary decisions plus rich follow-ups (feedback textareas,\n * multi-step wizards, \"stay in plan\").\n * - \"compact\" (message-center attention deck): a glanceable needs-attention card\n * across many sessions. Only the primary decision is shown; rich follow-up\n * input is deferred to the conversation, reachable via the card's \"open\n * conversation\" jump. New prompt kinds must consciously choose their compact\n * form here instead of silently inheriting the full conversation surface.\n */\nexport type AgentInteractivePromptVariant = \"full\" | \"compact\";\n\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 planLead: string;\n planModes: Array<{ id: string; label: string; description: string }>;\n stayInPlan: string;\n sendFeedback: string;\n feedbackPlaceholder: string;\n previousQuestion: string;\n nextQuestion: string;\n submitAnswers: string;\n answerPlaceholder: string;\n waitingForAnswer: string;\n planImplementationLead: string;\n planImplementationConfirm: string;\n planImplementationFeedbackPlaceholder: string;\n planImplementationSend: string;\n planImplementationSkip: string;\n };\n}\n\nexport function AgentInteractivePromptSurface({\n prompt,\n variant = \"full\",\n edgeGlow = false,\n embedded = false,\n keyboardShortcuts = true,\n previewMode = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n embedded?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n\n if (prompt.kind === \"approval\") {\n return (\n <ApprovalPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n keyboardShortcuts={keyboardShortcuts}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"exit-plan\") {\n return (\n <ExitPlanPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"plan-implementation\") {\n return (\n <PlanImplementationSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <AskUserPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n\n// Compact (message-center deck): a single-select question is answered with one\n// click — selecting an option submits it immediately, matching the approval and\n// plan cards. Multi-select / multi-question / free-text-only prompts can't be\n// answered in one tap, so they defer to the conversation (the card's \"open\n// conversation\" jump); their options are still shown as read-only context\n// (see the non-oneClickable branch below) rather than being omitted.\nfunction CompactAskUserPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const question = prompt.questions[0] ?? null;\n const oneClickable =\n prompt.questions.length === 1 &&\n question !== null &&\n !question.multiSelect &&\n question.options.length > 0;\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n {question ? (\n <>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {oneClickable ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: {\n ...buildAskUserAnswerPayload({\n [question.id]: option.label\n })\n }\n })\n }\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n ) : question.options.length > 0 ? (\n // Multi-select / multi-question prompts can't be answered with a\n // single click here, so the options are shown as read-only\n // context instead of being silently omitted. Answering still\n // happens in the full conversation via the card's \"open\n // conversation\" jump.\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => (\n <div\n key={option.label}\n className={styles.interactiveOptionDisplay}\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction AskUserPromptSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n if (variant === \"compact\") {\n return (\n <CompactAskUserPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <FullAskUserPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n\nfunction FullAskUserPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [index, setIndex] = useState(0);\n const [selectedByQuestionId, setSelectedByQuestionId] = useState<\n Record<string, string[]>\n >({});\n const [freeTextByQuestionId, setFreeTextByQuestionId] = useState<\n Record<string, string>\n >({});\n\n const question = prompt.questions[index] ?? null;\n const selected = question ? (selectedByQuestionId[question.id] ?? []) : [];\n const freeText = question ? (freeTextByQuestionId[question.id] ?? \"\") : \"\";\n const canAdvance =\n question !== null &&\n (selected.length > 0 ||\n freeText.trim() !== \"\" ||\n question.options.length === 0);\n const isLast = index >= prompt.questions.length - 1;\n\n const payload = useMemo(() => {\n const answersByQuestionId: Record<string, string | string[]> = {};\n for (const current of prompt.questions) {\n const chosen = selectedByQuestionId[current.id] ?? [];\n const other = (freeTextByQuestionId[current.id] ?? \"\").trim();\n if (current.multiSelect) {\n const value = other ? [...chosen, other] : chosen;\n if (value.length > 0) {\n answersByQuestionId[current.id] = value;\n }\n continue;\n }\n const value = other || chosen[0];\n if (value) {\n answersByQuestionId[current.id] = value;\n }\n }\n return buildAskUserAnswerPayload(answersByQuestionId);\n }, [freeTextByQuestionId, prompt.questions, selectedByQuestionId]);\n\n if (!question) {\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div\n className={`${styles.interactivePromptLead} inline-flex items-center gap-1.5`}\n >\n <MessageSquareMoreIcon\n size={15}\n active\n aria-hidden=\"true\"\n className=\"shrink-0\"\n />\n {stripPromptTitlePunctuation(labels.waitingForAnswer)}\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n <span className={styles.interactivePromptMeta}>\n {index + 1}/{prompt.questions.length}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {question.options.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => {\n const active = selected.includes(option.label);\n return (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n data-active={active}\n aria-pressed={active}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() => {\n setSelectedByQuestionId((current) => {\n const existing = current[question.id] ?? [];\n const next = question.multiSelect\n ? existing.includes(option.label)\n ? existing.filter((value) => value !== option.label)\n : [...existing, option.label]\n : existing.includes(option.label)\n ? []\n : [option.label];\n return { ...current, [question.id]: next };\n });\n }}\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n </button>\n );\n })}\n </div>\n ) : null}\n <textarea\n value={freeText}\n placeholder={labels.answerPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n onChange={(event) => {\n const value = event.currentTarget.value;\n setFreeTextByQuestionId((current) => ({\n ...current,\n [question.id]: value\n }));\n }}\n />\n <div className={styles.interactivePromptActions}>\n {prompt.questions.length > 1 ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n disabled={isSubmitting || index === 0}\n onClick={() => setIndex((current) => Math.max(current - 1, 0))}\n >\n {labels.previousQuestion}\n </Button>\n ) : null}\n {isLast ? (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={\n isSubmitting ||\n Object.keys(payload.answersByQuestionId).length === 0\n }\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: { ...payload }\n })\n }\n >\n {labels.submitAnswers}\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isSubmitting || !canAdvance}\n onClick={() =>\n setIndex((current) =>\n Math.min(current + 1, prompt.questions.length - 1)\n )\n }\n >\n {labels.nextQuestion}\n </Button>\n )}\n </div>\n </div>\n </section>\n );\n}\n","/**\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 { 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 formatToolDetails,\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 promptDetails = useMemo(\n () => formatToolDetails(prompt.input ?? null),\n [prompt.input]\n );\n const [submittingOptionId, setSubmittingOptionId] = useState<string | null>(\n null\n );\n const [pendingFeedbackOptionId, setPendingFeedbackOptionId] = useState<\n string | null\n >(null);\n const [feedback, setFeedback] = useState(\"\");\n const feedbackTextareaRef = useRef<HTMLTextAreaElement | null>(null);\n const agentHostApi = useOptionalAgentHostApi() ?? getOptionalAgentHostApi();\n const isDarwin = isDarwinPlatform(agentHostApi?.meta?.platform);\n const feedbackOptionId = useMemo(\n () => approvalFeedbackOptionId(prompt.options),\n [prompt.options]\n );\n const feedbackValue = feedback.trim();\n\n useEffect(() => {\n setSubmittingOptionId(null);\n setPendingFeedbackOptionId(null);\n setFeedback(\"\");\n }, [prompt.requestId]);\n\n useEffect(() => {\n if (!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.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.approvalLead)}\n </div>\n {promptDetails.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {promptDetails.map((detail) => (\n <div\n key={`${detail.label}:${detail.value}`}\n className={styles.interactiveOptionDisplay}\n >\n <span className={styles.interactiveOptionTitle}>\n {detail.label}\n </span>\n <PromptDetailValue detail={detail} previewMode={previewMode} />\n {detail.meta ? (\n <span className={styles.interactiveOptionDescription}>\n {detail.meta}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n <div className={styles.interactivePromptOptions}>\n {prompt.options.map((option, optionIndex) => {\n const showSpinner = submittingOptionId === option.id;\n const optionSupportsFeedback = feedbackOptionId === option.id;\n const optionLabel = approvalOptionDisplayLabel(option, {\n feedback: optionSupportsFeedback\n });\n const optionPresentation = approvalOptionVisualPresentation(\n option,\n { feedback: optionSupportsFeedback }\n );\n const shortcutLabel = approvalOptionShortcutLabel(\n optionIndex,\n isDarwin\n );\n const showFeedbackComposer = pendingFeedbackOptionId === option.id;\n if (showFeedbackComposer) {\n return (\n <div\n key={option.id}\n className={styles.interactiveFeedbackComposer}\n >\n <textarea\n ref={feedbackTextareaRef}\n value={feedback}\n placeholder={labels.feedbackPlaceholder}\n disabled={isSubmitting || submittingOptionId !== null}\n className={styles.interactivePromptTextarea}\n aria-label={interactiveOptionLabel(\n optionLabel,\n option.description\n )}\n onChange={(event) => setFeedback(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (\n !keyboardShortcuts ||\n event.key !== \"Enter\" ||\n (!event.metaKey && !event.ctrlKey) ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n if (!feedbackValue) {\n feedbackTextareaRef.current?.focus();\n return;\n }\n submitOption(option.id);\n }}\n />\n <button\n type=\"button\"\n className={styles.interactiveFeedbackSendButton}\n disabled={\n isSubmitting ||\n submittingOptionId !== null ||\n !feedbackValue\n }\n aria-label={labels.sendFeedback}\n title={labels.sendFeedback}\n aria-busy={showSpinner}\n onClick={() => {\n if (!feedbackValue) {\n feedbackTextareaRef.current?.focus();\n return;\n }\n submitOption(option.id);\n }}\n >\n {showSpinner ? (\n <InteractiveOptionSpinner />\n ) : (\n <SendFilledIcon />\n )}\n </button>\n </div>\n );\n }\n return (\n <button\n key={option.id}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n optionLabel,\n option.description\n )}\n disabled={isSubmitting || submittingOptionId !== null}\n onClick={() => submitOption(option.id)}\n >\n <span className={styles.interactiveOptionTitle}>\n {optionPresentation.label}\n </span>\n {optionPresentation.commandPrefix ? (\n <CommandTextWithTooltip\n value={optionPresentation.commandPrefix}\n testId=\"agent-interactive-command-prefix-option\"\n tooltipsEnabled={!previewMode}\n />\n ) : null}\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n {keyboardShortcuts && shortcutLabel && !showSpinner ? (\n <ShortcutBadge\n className={styles.interactiveOptionShortcut}\n aria-hidden=\"true\"\n >\n {shortcutLabel}\n </ShortcutBadge>\n ) : null}\n {showSpinner ? <InteractiveOptionSpinner /> : null}\n </button>\n );\n })}\n </div>\n </div>\n </section>\n );\n}\n\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 { 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 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 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 \"mcp\":\n return translate(\"agentHost.agentTool.details.mcp\");\n case \"path\":\n return translate(\"agentHost.agentTool.details.path\");\n case \"query\":\n return translate(\"agentHost.agentTool.details.query\");\n }\n}\n\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"],"mappings":"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","names":["useMemo","useState","jsx","jsxs","jsx","jsxs","useState","useMemo","value"]}
@@ -0,0 +1,12 @@
1
+ // shared/workspaceAgentSessionSortTime.ts
2
+ function resolveWorkspaceAgentSessionSortTimeUnixMs(session) {
3
+ return positiveNumber(session.latestTurn?.startedAtUnixMs) ?? positiveNumber(session.createdAtUnixMs) ?? 0;
4
+ }
5
+ function positiveNumber(value) {
6
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : null;
7
+ }
8
+
9
+ export {
10
+ resolveWorkspaceAgentSessionSortTimeUnixMs
11
+ };
12
+ //# sourceMappingURL=chunk-YMXYBG7U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/workspaceAgentSessionSortTime.ts"],"sourcesContent":["export interface WorkspaceAgentSessionSortTimeSession {\n createdAtUnixMs?: number;\n latestTurn?: WorkspaceAgentSessionSortTimeTurn | null;\n}\n\nexport interface WorkspaceAgentSessionSortTimeTurn {\n startedAtUnixMs: number;\n}\n\nexport function resolveWorkspaceAgentSessionSortTimeUnixMs(\n session: WorkspaceAgentSessionSortTimeSession\n): number {\n return (\n positiveNumber(session.latestTurn?.startedAtUnixMs) ??\n positiveNumber(session.createdAtUnixMs) ??\n 0\n );\n}\n\nfunction positiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n"],"mappings":";AASO,SAAS,2CACd,SACQ;AACR,SACE,eAAe,QAAQ,YAAY,eAAe,KAClD,eAAe,QAAQ,eAAe,KACtC;AAEJ;AAEA,SAAS,eAAe,OAA+B;AACrD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAClE,QACA;AACN;","names":[]}
@@ -1,4 +1,4 @@
1
- import { A as AgentContextMentionItem } from '../agentFileMentionContracts-Czvz6YMI.js';
1
+ import { A as AgentContextMentionItem } from '../agentFileMentionContracts-58IjMU-u.js';
2
2
  import { AgentMentionSearchState, AgentMentionBrowseCategory, AgentMentionFilterId, AgentMentionGroupId } from '../mention-search.js';
3
3
  export { AgentMentionGroup, AgentMentionSearchController } from '../mention-search.js';
4
4
  export { AGENT_CONTEXT_MENTION_PROVIDER_IDS, AgentContextMentionInsertResult, AgentContextMentionProvider, AgentContextMentionProviderId, AgentContextMentionQueryInput } from '../context-mention-provider.js';
@@ -3,26 +3,26 @@ import {
3
3
  AgentFileMentionPalette,
4
4
  flattenAgentMentionPaletteEntries,
5
5
  groupStartKeys
6
- } from "../chunk-LQVXBT65.js";
6
+ } from "../chunk-AGT7MUTV.js";
7
7
  import {
8
8
  AgentMentionSearchController
9
- } from "../chunk-JX2SIXNL.js";
10
- import "../chunk-BFNJKTDV.js";
9
+ } from "../chunk-WMNS4MAQ.js";
10
+ import "../chunk-3XXBDYAI.js";
11
+ import "../chunk-O3Q5SIJH.js";
12
+ import "../chunk-Y35GDLP2.js";
13
+ import "../chunk-LUGELG5V.js";
11
14
  import {
12
15
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
13
16
  } from "../chunk-JM24HADP.js";
14
- import "../chunk-NITOD7WF.js";
15
- import "../chunk-7J4K6WKB.js";
16
- import "../chunk-GCBDIQDX.js";
17
- import "../chunk-7PFDA2HQ.js";
18
- import "../chunk-Y35GDLP2.js";
19
- import "../chunk-LUGELG5V.js";
20
- import "../chunk-KAL4XZMA.js";
21
- import "../chunk-H6IQ63DQ.js";
22
- import "../chunk-NX3CZJXW.js";
23
- import "../chunk-BIHBXWK5.js";
24
- import "../chunk-AOS2VWU6.js";
17
+ import "../chunk-QVBF5BN5.js";
18
+ import "../chunk-YMXYBG7U.js";
19
+ import "../chunk-MASXZENX.js";
20
+ import "../chunk-H5F3QSCF.js";
25
21
  import "../chunk-PJP5BUU6.js";
22
+ import "../chunk-H6IQ63DQ.js";
23
+ import "../chunk-GCBDIQDX.js";
24
+ import "../chunk-E4HQUTM3.js";
25
+ import "../chunk-W6WAGPMD.js";
26
26
  import "../chunk-5X7YDOC6.js";
27
27
  import "../chunk-KJQERFKX.js";
28
28
  import "../chunk-UGVI47X6.js";
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
+ export { A as AGENT_PASTED_TEXT_BLOCK_KIND, a as AGENT_PASTED_TEXT_MENTION_KIND } from './pastedTextKinds-D-XuInaS.js';
2
3
 
3
4
  interface AgentCustomMentionIdentity {
4
5
  entityId: string;
@@ -38,7 +39,4 @@ declare function registerAgentCustomMentionKind(definition: AgentCustomMentionKi
38
39
  declare function getAgentCustomMentionKind(kind: string): AgentCustomMentionKindDefinition | undefined;
39
40
  declare function resetAgentCustomMentionKindsForTests(): void;
40
41
 
41
- declare const AGENT_PASTED_TEXT_BLOCK_KIND = "pasted-text";
42
- declare const AGENT_PASTED_TEXT_MENTION_KIND = "pasted-text";
43
-
44
- export { AGENT_PASTED_TEXT_BLOCK_KIND, AGENT_PASTED_TEXT_MENTION_KIND, type AgentCustomMentionChipContext, type AgentCustomMentionIdentity, type AgentCustomMentionKindDefinition, type AgentCustomMentionPresentation, getAgentCustomMentionKind, registerAgentCustomMentionKind, resetAgentCustomMentionKindsForTests };
42
+ export { type AgentCustomMentionChipContext, type AgentCustomMentionIdentity, type AgentCustomMentionKindDefinition, type AgentCustomMentionPresentation, getAgentCustomMentionKind, registerAgentCustomMentionKind, resetAgentCustomMentionKindsForTests };
@@ -1,6 +1,4 @@
1
- import { m as AgentGUIProvider } from './types-DX2bxgB8.js';
2
-
3
- declare const agentGuiDockIconUrls: Record<AgentGUIProvider, string>;
4
- declare const agentGuiDockIconUrl: string;
1
+ declare const agentGuiDockIconUrls: Record<string, string>;
2
+ declare const agentGuiDockIconUrl: string | undefined;
5
3
 
6
4
  export { agentGuiDockIconUrl, agentGuiDockIconUrls };
@@ -385,6 +385,7 @@ declare const agentGuiI18nResources: {
385
385
  readonly loadMore: "Load more";
386
386
  readonly loadMoreGroups: "Load more";
387
387
  readonly loading: "Loading...";
388
+ readonly loadError: "Couldn't load this content. Try again later.";
388
389
  readonly previewBinary: "This file looks like binary content.";
389
390
  readonly previewDecodeFailed: "This file couldn't be decoded as UTF-8 text.";
390
391
  readonly previewError: "Couldn't load a preview.";
@@ -679,6 +680,18 @@ declare const agentGuiI18nResources: {
679
680
  readonly conversationFilterNexight: "Nexight";
680
681
  readonly conversationFilterHermes: "Hermes Agent";
681
682
  readonly conversationFilterOpenClaw: "OpenClaw";
683
+ readonly manageAgents: "Agent Sidebar Display Settings";
684
+ readonly manageAgentsTitle: "Agent Sidebar Display Settings";
685
+ readonly manageAgentsDescription: "Drag to reorder or move agents between the available and disabled groups. Press and hold an agent to edit.";
686
+ readonly manageAgentsAvailable: "Available Agents";
687
+ readonly manageAgentsDisabled: "Disabled Agents";
688
+ readonly manageAgentsNoAvailable: "Add an agent from the disabled list below.";
689
+ readonly manageAgentsNoDisabled: "Drag agents you don’t want to show in the sidebar here.";
690
+ readonly manageAgentsKeepOneAvailable: "Keep at least one agent available.";
691
+ readonly manageAgentsRunningBlocked: "{{agent}} is running and can't be disabled. Wait for it to finish and try again.";
692
+ readonly removeAgentFromSidebar: "Remove {{agent}} from sidebar";
693
+ readonly addAgentToSidebar: "Add {{agent}} to sidebar";
694
+ readonly dragAgentToReorder: "Drag {{agent}} to reorder";
682
695
  readonly initialPlaceholder: "Type @ to reference sessions, files, tasks, and apps";
683
696
  readonly followupPlaceholder: "Request follow-up changes from {{provider}}";
684
697
  readonly installRequiredPlaceholder: "Connect {{provider}} to send messages";
@@ -837,6 +850,7 @@ declare const agentGuiI18nResources: {
837
850
  readonly planModeOffLabel: "Off";
838
851
  readonly planUnavailable: "Plan unavailable";
839
852
  readonly queuedLabel: "Queued";
853
+ readonly queuePausedByUserLabel: "The queue is paused because you interrupted the current response.";
840
854
  readonly sendQueuedPromptNext: "Send next";
841
855
  readonly editQueuedPrompt: "Edit";
842
856
  readonly deleteQueuedPrompt: "Delete";
@@ -885,6 +899,7 @@ declare const agentGuiI18nResources: {
885
899
  readonly pastedTextFilesHeader: "Referenced pasted text files:";
886
900
  readonly pastedTextFileLine: "- pasted text file \"{{preview}}\": {{path}}. Read this file before continuing.";
887
901
  readonly pastedTextAttachmentTitle: "Pasted text";
902
+ readonly pastedTextAttachmentFailed: "Pasted text couldn't be saved";
888
903
  readonly pastedTextRestoreToComposer: "Show in text field";
889
904
  readonly copyMessage: "Copy message";
890
905
  readonly copyImage: "Copy image";
@@ -2862,6 +2877,7 @@ declare const agentGuiI18nResources: {
2862
2877
  readonly loadMore: "加载更多";
2863
2878
  readonly loadMoreGroups: "拉取更多";
2864
2879
  readonly loading: "正在加载";
2880
+ readonly loadError: "加载内容失败,请稍后重试";
2865
2881
  readonly previewBinary: "这个文件更像二进制内容";
2866
2882
  readonly previewDecodeFailed: "暂时无法按 UTF-8 文本解码这个文件";
2867
2883
  readonly previewError: "加载预览失败";
@@ -3156,6 +3172,18 @@ declare const agentGuiI18nResources: {
3156
3172
  readonly conversationFilterNexight: "Nexight";
3157
3173
  readonly conversationFilterHermes: "Hermes Agent";
3158
3174
  readonly conversationFilterOpenClaw: "OpenClaw";
3175
+ readonly manageAgents: "Agent 栏展示设置";
3176
+ readonly manageAgentsTitle: "Agent 栏展示设置";
3177
+ readonly manageAgentsDescription: "拖拽调整顺序或在可用与停用分组间移动,长按 Agent 可进入编辑。";
3178
+ readonly manageAgentsAvailable: "可用 Agent";
3179
+ readonly manageAgentsDisabled: "停用 Agent";
3180
+ readonly manageAgentsNoAvailable: "可从下方停用列表添加 Agent。";
3181
+ readonly manageAgentsNoDisabled: "可以把不希望展示在侧边栏的agent拖到这里";
3182
+ readonly manageAgentsKeepOneAvailable: "至少保留一个可用 Agent。";
3183
+ readonly manageAgentsRunningBlocked: "{{agent}} 正在运行,暂时无法停用。请等待任务结束后再试。";
3184
+ readonly removeAgentFromSidebar: "从左侧栏移除 {{agent}}";
3185
+ readonly addAgentToSidebar: "将 {{agent}} 添加到左侧栏";
3186
+ readonly dragAgentToReorder: "拖拽 {{agent}} 调整顺序";
3159
3187
  readonly initialPlaceholder: "输入 @ 引用会话、文件、任务和应用";
3160
3188
  readonly followupPlaceholder: "要求 {{provider}} 继续后续变更";
3161
3189
  readonly installRequiredPlaceholder: "请先连接 {{provider}},然后再发送消息";
@@ -3314,6 +3342,7 @@ declare const agentGuiI18nResources: {
3314
3342
  readonly planModeOffLabel: "关闭";
3315
3343
  readonly planUnavailable: "规划模式不可用";
3316
3344
  readonly queuedLabel: "排队中";
3345
+ readonly queuePausedByUserLabel: "由于你中断了当前响应,队列已暂停";
3317
3346
  readonly sendQueuedPromptNext: "直接发送";
3318
3347
  readonly editQueuedPrompt: "编辑";
3319
3348
  readonly deleteQueuedPrompt: "删除";
@@ -3362,6 +3391,7 @@ declare const agentGuiI18nResources: {
3362
3391
  readonly pastedTextFilesHeader: "引用的粘贴文本文件:";
3363
3392
  readonly pastedTextFileLine: "- 粘贴的文本文件 \"{{preview}}\":{{path}},继续前请先阅读此文件。";
3364
3393
  readonly pastedTextAttachmentTitle: "粘贴的文本";
3394
+ readonly pastedTextAttachmentFailed: "无法保存粘贴的文本";
3365
3395
  readonly pastedTextRestoreToComposer: "在文本框中显示";
3366
3396
  readonly copyMessage: "复制消息";
3367
3397
  readonly copyImage: "复制图片";
@@ -6,8 +6,8 @@ import {
6
6
  translate,
7
7
  translateInUiLanguage,
8
8
  useTranslation
9
- } from "../chunk-BIHBXWK5.js";
10
- import "../chunk-AOS2VWU6.js";
9
+ } from "../chunk-E4HQUTM3.js";
10
+ import "../chunk-W6WAGPMD.js";
11
11
  export {
12
12
  AgentGuiI18nProvider,
13
13
  agentGuiI18nModule,
package/dist/index.d.ts CHANGED
@@ -1,14 +1,15 @@
1
- export { AGENT_PASTED_TEXT_BLOCK_KIND, AGENT_PASTED_TEXT_MENTION_KIND, AgentCustomMentionChipContext, AgentCustomMentionIdentity, AgentCustomMentionKindDefinition, AgentCustomMentionPresentation, getAgentCustomMentionKind, registerAgentCustomMentionKind, resetAgentCustomMentionKindsForTests } from './custom-mention.js';
2
- import { A as AgentActivityRuntime } from './AgentGUI-CwBLYtv-.js';
3
- export { a as AgentActivityRuntimeDeleteSessionSectionResult, b as AgentActivityRuntimeListSessionMessagesInput, c as AgentActivityRuntimePromptContentBlock, d as AgentActivityRuntimeProvider, e as AgentActivityRuntimeProviderProps, f as AgentActivityRuntimeSessionSectionCount, g as AgentActivityRuntimeSessionSectionScopeInput, h as AgentActivityRuntimeSetSessionPinnedInput, i as AgentActivityRuntimeUpdateSessionSettingsInput, j as AgentActivityRuntimeUpdateSessionSettingsResult, k as AgentActivityRuntimeUploadPromptContentInput, l as AgentActivityRuntimeUploadPromptContentResult, m as AgentGUI, n as AgentGUIAccountMenuState, o as AgentGUIAgentsEmptyRenderer, p as AgentGUIProps, q as AgentGUIProviderUnavailableStateContext, r as AgentGUIProviderUnavailableStateRenderer, s as AgentGUISidebarFooterContext, t as AgentGUISidebarFooterRenderer, u as resetAgentActivityRuntimeForTests, v as setAgentActivityRuntimeForTests, w as useAgentActivityRuntime, x as useAgentActivitySnapshot, y as useOptionalAgentActivityRuntime } from './AgentGUI-CwBLYtv-.js';
1
+ export { AgentCustomMentionChipContext, AgentCustomMentionIdentity, AgentCustomMentionKindDefinition, AgentCustomMentionPresentation, getAgentCustomMentionKind, registerAgentCustomMentionKind, resetAgentCustomMentionKindsForTests } from './custom-mention.js';
2
+ export { A as AGENT_PASTED_TEXT_BLOCK_KIND, a as AGENT_PASTED_TEXT_MENTION_KIND } from './pastedTextKinds-D-XuInaS.js';
3
+ import { A as AgentActivityRuntime } from './AgentGUI-DWdvUV4x.js';
4
+ export { a as AgentActivityRuntimeDeleteSessionsBatchInput, b as AgentActivityRuntimeDeleteSessionsBatchResult, c as AgentActivityRuntimeListSessionMessagesInput, d as AgentActivityRuntimePromptContentBlock, e as AgentActivityRuntimeProvider, f as AgentActivityRuntimeProviderProps, g as AgentActivityRuntimeSessionSectionDeletionCandidates, h as AgentActivityRuntimeSessionSectionScopeInput, i as AgentActivityRuntimeSetSessionPinnedInput, j as AgentActivityRuntimeUpdateSessionSettingsInput, k as AgentActivityRuntimeUpdateSessionSettingsResult, l as AgentActivityRuntimeUploadPromptContentInput, m as AgentActivityRuntimeUploadPromptContentResult, n as AgentGUI, o as AgentGUIAccountMenuState, p as AgentGUIAgentsEmptyRenderer, q as AgentGUIProps, r as AgentGUIProviderUnavailableStateContext, s as AgentGUIProviderUnavailableStateRenderer, t as AgentGUISidebarFooterContext, u as AgentGUISidebarFooterRenderer, v as resetAgentActivityRuntimeForTests, w as setAgentActivityRuntimeForTests, x as useAgentActivityRuntime, y as useAgentActivitySnapshot, z as useOptionalAgentActivityRuntime } from './AgentGUI-DWdvUV4x.js';
4
5
  export { agentGUIAgentIsReady, normalizeAgentGUIAgents, resolveAgentGUISelectedDirectoryAgent } from './agents.js';
5
- import { m as AgentGUIProvider, h as AgentGUIAgentTarget, i as AgentGUIAgentTargetBadge } from './types-DX2bxgB8.js';
6
- export { A as AgentGUIAgent, a as AgentGUIAgentAvailability, b as AgentGUIAgentAvailabilityAction, c as AgentGUIAgentAvailabilityStatus, d as AgentGUIAgentDirectoryPort, e as AgentGUIAgentDirectorySnapshot, f as AgentGUIAgentDirectoryStatus, g as AgentGUIAgentOwner, j as AgentGUIAgentTargetRef, k as AgentGUIAllAgentsPresentation, n as AgentGUIProviderRailAllPresentation, o as AgentGUIProviderRailMode, p as AgentGUIProviderReadinessGate, q as AgentGUIProviderReadinessGateAction, r as AgentGUIProviderReadinessGateStatus } from './types-DX2bxgB8.js';
6
+ import { n as AgentGUIProvider, h as AgentGUIAgentTarget, i as AgentGUIAgentTargetBadge } from './types-CnT8rNUI.js';
7
+ export { A as AgentGUIAgent, a as AgentGUIAgentAvailability, b as AgentGUIAgentAvailabilityAction, c as AgentGUIAgentAvailabilityStatus, d as AgentGUIAgentDirectoryPort, e as AgentGUIAgentDirectorySnapshot, f as AgentGUIAgentDirectoryStatus, g as AgentGUIAgentOwner, j as AgentGUIAgentTargetRef, k as AgentGUIAllAgentsPresentation, l as AgentGUIHomeSuggestionId, o as AgentGUIProviderRailAllPresentation, p as AgentGUIProviderRailMode, q as AgentGUIProviderReadinessGate, r as AgentGUIProviderReadinessGateAction, s as AgentGUIProviderReadinessGateStatus } from './types-CnT8rNUI.js';
7
8
  export { AgentGuiI18nProvider, agentGuiI18nModule, agentGuiI18nResources } from './i18n/index.js';
8
9
  export { agentGuiDockIconUrl, agentGuiDockIconUrls } from './dock-icons.js';
9
- import { g as AgentHostInputApi } from './agentGuiNodeTypes-DppADPHW.js';
10
- export { e as AgentHostApi, f as AgentHostApplyWorkspaceGitPatchInput, h as AgentHostRuntimeApi, i as AgentHostSelectFilesInput, k as AgentProbeProvider, l as AgentProbeSnapshot, m as AgentProviderProbeListInput, n as AgentProviderProbeListResult, q as AgentUsageQuota, r as AgentUsageSnapshot, P as PersistWriteResult, R as ReadWorkspaceAgentReadStateInput, W as WorkspaceAgentReadStateSnapshot, s as WriteWorkspaceAgentReadStateInput } from './agentGuiNodeTypes-DppADPHW.js';
11
- export { AgentActivityAdapter, AgentActivityController, AgentActivityMessage, AgentActivityNeedsAttentionItem, AgentActivitySnapshot, selectNeedsAttentionCount, selectNeedsAttentionItems } from '@tutti-os/agent-activity-core';
10
+ import { h as AgentHostInputApi } from './agentGuiNodeTypes-B9X4aWfv.js';
11
+ export { f as AgentHostApi, g as AgentHostApplyWorkspaceGitPatchInput, i as AgentHostRuntimeApi, j as AgentHostSelectFilesInput, l as AgentProbeProvider, m as AgentProbeSnapshot, n as AgentProviderProbeListInput, o as AgentProviderProbeListResult, r as AgentUsageQuota, s as AgentUsageSnapshot, P as PersistWriteResult, R as ReadWorkspaceAgentReadStateInput, W as WorkspaceAgentReadStateSnapshot, t as WriteWorkspaceAgentReadStateInput } from './agentGuiNodeTypes-B9X4aWfv.js';
12
+ export { AgentActivityAdapter, AgentActivityMessage, AgentActivityNeedsAttentionItem, AgentActivitySnapshot, selectNeedsAttentionCount, selectNeedsAttentionItems } from '@tutti-os/agent-activity-core';
12
13
  export { AGENT_CONTEXT_MENTION_PROVIDER_IDS, AgentContextMentionProvider, AgentContextMentionProviderId } from './context-mention-provider.js';
13
14
  export { preloadAgentMentionBrowse } from './mention-search.js';
14
15
  import { PropsWithChildren, JSX } from 'react';
@@ -16,10 +17,9 @@ export { A as AgentPlanPromptAction, E as EngineStateStore, d as dispatchAgentPl
16
17
  export { A as AgentGuiI18nLocale } from './runtime-BBNdWgDU.js';
17
18
  import '@tutti-os/ui-i18n-runtime';
18
19
  import '@tutti-os/workspace-file-reference/contracts';
19
- import './agentFileMentionContracts-Czvz6YMI.js';
20
+ import './agentFileMentionContracts-58IjMU-u.js';
20
21
  import '@tutti-os/workspace-file-manager/services';
21
22
  import '@tutti-os/workspace-file-reference/core';
22
- import './uiSettings-BQS9r2eo.js';
23
23
  import './agentConversationVM-C335TR6S.js';
24
24
  import '@tutti-os/workspace-issue-manager/core';
25
25
  import './workspaceAgentActivityListTypes-C7gPWYiA.js';
@@ -59,6 +59,8 @@ declare function resolveAgentGUIAgentTarget(input: {
59
59
  }): AgentGUIAgentTarget | null;
60
60
 
61
61
  declare const AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;
62
+ declare const AGENT_GUI_STANDALONE_AUTO_COLLAPSE_WIDTH_PX = 720;
63
+ declare const AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;
62
64
  interface AgentGUIExpandedWindowFrameInput {
63
65
  position: {
64
66
  x: number;
@@ -72,7 +74,7 @@ interface AgentGUIExpandedWindowFrameInput {
72
74
  };
73
75
  conversationRailWidthPx: number | null | undefined;
74
76
  }
75
- declare function shouldAutoCollapseAgentGUIConversationRail(containerWidthPx: number): boolean;
77
+ declare function shouldAutoCollapseAgentGUIConversationRail(containerWidthPx: number, autoCollapseWidthPx?: number): boolean;
76
78
  declare function resolveAgentGUIExpandedWindowFrame(input: AgentGUIExpandedWindowFrameInput): {
77
79
  position: {
78
80
  x: number;
@@ -90,4 +92,4 @@ interface AgentActivityHostProviderProps extends PropsWithChildren {
90
92
  }
91
93
  declare function AgentActivityHostProvider({ agentActivityRuntime, agentHostApi, children }: AgentActivityHostProviderProps): JSX.Element;
92
94
 
93
- export { AGENT_GUI_DETAIL_MIN_WIDTH_PX, AgentActivityHostProvider, type AgentActivityHostProviderProps, AgentActivityRuntime, AgentGUIAgentTarget, AgentGUIAgentTargetBadge, AgentGUIProvider, AgentHostInputApi, agentGUIDefaultTargetProviders, createLocalAgentGUIAgentTarget, createLocalAgentGUIAgentTargets, createSharedAgentGUIAgentTarget, localAgentGUIAgentTargetId, normalizeAgentGUIAgentTargets, resolveAgentGUIAgentTarget, resolveAgentGUIExpandedWindowFrame, shouldAutoCollapseAgentGUIConversationRail };
95
+ export { AGENT_GUI_DETAIL_MIN_WIDTH_PX, AGENT_GUI_EXPANDED_TARGET_WIDTH_PX, AGENT_GUI_STANDALONE_AUTO_COLLAPSE_WIDTH_PX, AgentActivityHostProvider, type AgentActivityHostProviderProps, AgentActivityRuntime, AgentGUIAgentTarget, AgentGUIAgentTargetBadge, AgentGUIProvider, AgentHostInputApi, agentGUIDefaultTargetProviders, createLocalAgentGUIAgentTarget, createLocalAgentGUIAgentTargets, createSharedAgentGUIAgentTarget, localAgentGUIAgentTargetId, normalizeAgentGUIAgentTargets, resolveAgentGUIAgentTarget, resolveAgentGUIExpandedWindowFrame, shouldAutoCollapseAgentGUIConversationRail };