@tutti-os/agent-gui 0.0.64 → 0.0.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -2
- package/README.md +1 -1
- package/dist/agent-conversation/index.d.ts +2 -2
- package/dist/agent-conversation/index.js +6 -6
- package/dist/agent-message-center/index.js +8 -8
- package/dist/{agentGuiNodeTypes-CCjzXdTe.d.ts → agentGuiNodeTypes-B9Aq3UEU.d.ts} +3 -1
- package/dist/app/renderer/agentactivity.css +46 -3
- package/dist/{chunk-IIXCU2UU.js → chunk-6ULTMCKP.js} +2 -2
- package/dist/{chunk-52VZ54WH.js → chunk-CTJQTUQ3.js} +6 -6
- package/dist/{chunk-52VZ54WH.js.map → chunk-CTJQTUQ3.js.map} +1 -1
- package/dist/{chunk-PVVM7MZZ.js → chunk-DL6BMEHI.js} +2 -2
- package/dist/{chunk-TFPKI4XJ.js → chunk-DXVMRZHH.js} +2 -6
- package/dist/chunk-DXVMRZHH.js.map +1 -0
- package/dist/{chunk-76GTKO4Q.js → chunk-HNODQVG2.js} +2 -2
- package/dist/{chunk-RDRKIMAC.js → chunk-JTFWT6DK.js} +7 -9
- package/dist/chunk-JTFWT6DK.js.map +1 -0
- package/dist/{chunk-MQ6RKXXW.js → chunk-KRJF7WLJ.js} +15 -3
- package/dist/chunk-KRJF7WLJ.js.map +1 -0
- package/dist/{chunk-FUJ73PTH.js → chunk-LJE2W4EM.js} +3 -5
- package/dist/chunk-LJE2W4EM.js.map +1 -0
- package/dist/{chunk-YFTQK2G4.js → chunk-LQHYHF36.js} +7 -7
- package/dist/chunk-LQHYHF36.js.map +1 -0
- package/dist/{chunk-TG3ZXLPM.js → chunk-MYD37I32.js} +27 -3
- package/dist/chunk-MYD37I32.js.map +1 -0
- package/dist/{chunk-ERWDRI3F.js → chunk-N4I3TD4G.js} +2 -2
- package/dist/{chunk-ERWDRI3F.js.map → chunk-N4I3TD4G.js.map} +1 -1
- package/dist/{chunk-FLTLZGIN.js → chunk-NOTZW5WH.js} +3 -3
- package/dist/{chunk-YUMHFZ5A.js → chunk-P5C3ED3V.js} +3 -2
- package/dist/chunk-P5C3ED3V.js.map +1 -0
- package/dist/{chunk-TT2YJNEP.js → chunk-T3KGZV35.js} +50 -12
- package/dist/chunk-T3KGZV35.js.map +1 -0
- package/dist/{chunk-F6GDUU4X.js → chunk-UBBHWDMP.js} +13 -9
- package/dist/{chunk-F6GDUU4X.js.map → chunk-UBBHWDMP.js.map} +1 -1
- package/dist/{chunk-3NSUJ7OF.js → chunk-UI3YDJTC.js} +39 -5
- package/dist/chunk-UI3YDJTC.js.map +1 -0
- package/dist/{chunk-C465B7WK.js → chunk-VBTPXEFH.js} +2 -2
- package/dist/{chunk-ZTZ6STJZ.js → chunk-Z26P2QNT.js} +2 -2
- package/dist/context-mention-palette/index.js +7 -7
- package/dist/i18n/index.d.ts +14 -2
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +37 -5
- package/dist/index.js +750 -774
- package/dist/index.js.map +1 -1
- package/dist/queued-prompt-runtime.d.ts +22 -3
- package/dist/queued-prompt-runtime.js +1 -1
- package/dist/{types-BAPEle8b.d.ts → types-Bxn8bLEp.d.ts} +14 -1
- package/dist/workbench/contribution.d.ts +1 -1
- package/dist/workbench/contribution.js +5 -5
- package/dist/workbench/index.d.ts +1 -1
- package/dist/workbench/index.js +8 -8
- package/dist/workbench/launch.d.ts +3 -1
- package/dist/workbench/launch.js +1 -1
- package/dist/workbench/providerCatalog.d.ts +1 -1
- package/dist/workbench/sessionTitle.d.ts +1 -1
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workbench/state.d.ts +1 -1
- package/dist/workbench/state.js +2 -2
- package/dist/workbench/types.d.ts +1 -1
- package/dist/workspace-agent-generated-files.js +3 -3
- package/package.json +12 -12
- package/dist/app/renderer/assets/icons/@-lined-14px.svg +0 -3
- package/dist/app/renderer/assets/icons/agents/manage-agent-claude-code.png +0 -0
- package/dist/app/renderer/assets/icons/agents/manage-agent-codex.png +0 -0
- package/dist/app/renderer/assets/icons/agents/manage-agent-gemini.png +0 -0
- package/dist/app/renderer/assets/icons/agents/manage-agent-hermes.png +0 -0
- package/dist/app/renderer/assets/icons/agents/manage-agent-openclaw.png +0 -0
- package/dist/app/renderer/assets/icons/agents/tutti-doc-rounded.png +0 -0
- package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-claude-code.png +0 -0
- package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-codex.png +0 -0
- package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-gemini.png +0 -0
- package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-nexight.png +0 -0
- package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-openclaw.png +0 -0
- package/dist/app/renderer/assets/icons/arrow-left-filled.svg +0 -1
- package/dist/chunk-3NSUJ7OF.js.map +0 -1
- package/dist/chunk-FUJ73PTH.js.map +0 -1
- package/dist/chunk-MQ6RKXXW.js.map +0 -1
- package/dist/chunk-RDRKIMAC.js.map +0 -1
- package/dist/chunk-TFPKI4XJ.js.map +0 -1
- package/dist/chunk-TG3ZXLPM.js.map +0 -1
- package/dist/chunk-TT2YJNEP.js.map +0 -1
- package/dist/chunk-YFTQK2G4.js.map +0 -1
- package/dist/chunk-YUMHFZ5A.js.map +0 -1
- package/dist/cursor-flat-filled-CL7N3BTZ.svg +0 -3
- /package/dist/{chunk-IIXCU2UU.js.map → chunk-6ULTMCKP.js.map} +0 -0
- /package/dist/{chunk-PVVM7MZZ.js.map → chunk-DL6BMEHI.js.map} +0 -0
- /package/dist/{chunk-76GTKO4Q.js.map → chunk-HNODQVG2.js.map} +0 -0
- /package/dist/{chunk-FLTLZGIN.js.map → chunk-NOTZW5WH.js.map} +0 -0
- /package/dist/{chunk-C465B7WK.js.map → chunk-VBTPXEFH.js.map} +0 -0
- /package/dist/{chunk-ZTZ6STJZ.js.map → chunk-Z26P2QNT.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../shared/agentConversation/approvalOptionPresentation.ts","../shared/agentConversation/promptToolDetails.ts","../shared/agentConversation/components/AgentInteractivePromptSurface.tsx","../shared/agentConversation/interactiveAnswerPayload.ts"],"sourcesContent":["import { translate } from \"../../i18n/index\";\n\nexport interface ApprovalOptionVisualPresentation {\n label: string;\n commandPrefix?: string;\n}\n\nexport function approvalOptionDisplayLabel(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): string {\n const idToken = normalizeApprovalOptionToken(option.id);\n const kindToken = normalizeApprovalOptionToken(option.kind);\n const label = option.label.trim();\n const specificTranslationKey = approvalOptionSpecificTranslationKey(\n idToken,\n label,\n intent\n );\n if (specificTranslationKey) {\n return translate(specificTranslationKey);\n }\n const providerLabelTranslation =\n approvalOptionProviderLabelTranslation(label);\n if (providerLabelTranslation) {\n return translate(\n providerLabelTranslation.key,\n providerLabelTranslation.params\n );\n }\n if (\n (idToken === \"allowonce\" || kindToken === \"allowonce\") &&\n isGenericAllowOnceLabel(label)\n ) {\n return translate(\"agentHost.agentGui.approvalOptions.allowOnce\");\n }\n if (isGenericAllowForSessionLabel(label)) {\n return translate(\"agentHost.agentGui.approvalOptions.allowForSession\");\n }\n if (\n (idToken === \"allowalways\" ||\n idToken === \"allowall\" ||\n kindToken === \"allowalways\") &&\n isGenericApprovalLabel(label)\n ) {\n return translate(\"agentHost.agentGui.approvalOptions.allowAlways\");\n }\n if (idToken === \"rejectalways\" || kindToken === \"rejectalways\") {\n return translate(\"agentHost.agentGui.approvalOptions.rejectAlways\");\n }\n if (\n idToken === \"rejectonce\" ||\n idToken === \"reject\" ||\n idToken === \"deny\" ||\n kindToken === \"rejectonce\" ||\n kindToken === \"reject\" ||\n kindToken === \"deny\"\n ) {\n return intent.feedback\n ? translate(\"agentHost.agentGui.approvalOptions.rejectWithFollowUp\")\n : translate(\"agentHost.agentGui.approvalOptions.rejectOnce\");\n }\n return label || option.id;\n}\n\nexport function approvalOptionVisualPresentation(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): ApprovalOptionVisualPresentation {\n const commandPrefix = approvalOptionCommandPrefix(option.label);\n if (commandPrefix) {\n return {\n label: translate(\n \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefixLead\"\n ),\n commandPrefix\n };\n }\n return {\n label: approvalOptionDisplayLabel(option, intent)\n };\n}\n\nexport function normalizeApprovalOptionToken(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction approvalOptionSpecificTranslationKey(\n token: string,\n label: string,\n intent: { feedback?: boolean } = {}\n): string | null {\n const labelToken = normalizeApprovalOptionToken(label);\n switch (token) {\n case \"approved\":\n return isGenericAllowOnceLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowOnce\"\n : null;\n case \"approvedforsession\":\n return isGenericAllowForSessionLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowForSession\"\n : null;\n case \"approvedalways\":\n return isGenericApprovalLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowAlways\"\n : null;\n case \"bypasspermissions\":\n return \"agentHost.agentGui.approvalOptions.bypassPermissions\";\n case \"auto\":\n return labelToken === \"yesanduseautomode\"\n ? \"agentHost.agentGui.approvalOptions.autoMode\"\n : null;\n case \"acceptedits\":\n return \"agentHost.agentGui.approvalOptions.acceptEdits\";\n case \"default\":\n return labelToken === \"yesandmanuallyapproveedits\"\n ? \"agentHost.agentGui.approvalOptions.manualApproval\"\n : null;\n case \"cancel\":\n return !intent.feedback && labelToken === \"cancel\"\n ? \"common.cancel\"\n : null;\n default:\n return null;\n }\n}\n\nfunction approvalOptionProviderLabelTranslation(\n label: string\n): { key: string; params: Record<string, string> } | null {\n const commandPrefix = approvalOptionCommandPrefix(label);\n if (commandPrefix) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefix\",\n params: { command: commandPrefix }\n };\n }\n\n const allowScopeMatch = label.match(/^Yes,\\s*and don't ask again for (.+)$/i);\n if (allowScopeMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForScope\",\n params: { scope: allowScopeMatch[1] }\n };\n }\n\n const alwaysAllowMatch = label.match(/^Always Allow\\s+(.+)$/i);\n if (alwaysAllowMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.alwaysAllowScope\",\n params: { scope: alwaysAllowMatch[1] }\n };\n }\n\n return null;\n}\n\nfunction approvalOptionCommandPrefix(label: string): string | null {\n const commandPrefixMatch = label.match(\n /^Yes,\\s*and don't ask again for commands that start with `([^`]+)`$/i\n );\n return commandPrefixMatch?.[1]?.trim() || null;\n}\n\nfunction isGenericApprovalLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allowalways\" ||\n token === \"allowall\" ||\n token === \"alwaysallow\" ||\n token === \"allowanddontaskagain\" ||\n token === \"yesanddontaskagain\"\n );\n}\n\nfunction isGenericAllowOnceLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allow\" ||\n token === \"allowonce\" ||\n token === \"approve\" ||\n token === \"approveonce\" ||\n token === \"yes\" ||\n token === \"yesproceed\" ||\n token === \"yesandproceed\"\n );\n}\n\nfunction isGenericAllowForSessionLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"allowforthissession\" ||\n token === \"allowforsession\" ||\n token === \"approveforsession\"\n );\n}\n","import { extractAgentMcpToolTarget } from \"../agentMcpToolTarget\";\n\nexport interface PromptToolDetail {\n kind: \"command\" | \"mcp\" | \"path\" | \"query\";\n value: string;\n meta?: string;\n}\n\nexport function getPromptToolDetails(\n input: Record<string, unknown> | null\n): PromptToolDetail[] {\n if (!input) {\n return [];\n }\n const mcpTarget = extractAgentMcpToolTarget({ input });\n const mcpDetails: PromptToolDetail[] = mcpTarget\n ? [\n {\n kind: \"mcp\",\n value: mcpTarget.displayName,\n ...(mcpTarget.instruction ? { meta: mcpTarget.instruction } : {})\n }\n ]\n : [];\n const detailInput = resolveToolDetailInput(input);\n const command =\n commandStringValue(detailInput.command) ??\n commandStringValue(detailInput.cmd);\n if (command) {\n return [\n ...mcpDetails,\n {\n kind: \"command\",\n value: command,\n ...(stringValue(detailInput.description)\n ? { meta: stringValue(detailInput.description) as string }\n : {})\n }\n ];\n }\n const filePath =\n stringValue(detailInput.file_path) ??\n stringValue(detailInput.filePath) ??\n stringValue(detailInput.path) ??\n stringValue(detailInput.notebook_path);\n if (filePath) {\n const lineRange = formatLineRange(detailInput);\n return [\n ...mcpDetails,\n {\n kind: \"path\",\n value: filePath,\n ...(lineRange ? { meta: lineRange } : {})\n }\n ];\n }\n const query =\n stringValue(detailInput.query) ??\n stringValue(detailInput.search_query) ??\n stringValue(detailInput.searchQuery) ??\n stringValue(detailInput.pattern);\n if (query) {\n return [\n ...mcpDetails,\n {\n kind: \"query\",\n value: query\n }\n ];\n }\n return mcpDetails;\n}\n\nexport function isPromptRequestIdTitle(value: string): boolean {\n return /^requestid\\s*:/iu.test(value.trim());\n}\n\nfunction resolveToolDetailInput(\n input: Record<string, unknown>\n): Record<string, unknown> {\n const toolCall = objectValue(input.toolCall);\n return (\n firstObjectValue(input, [\n \"command\",\n \"cmd\",\n \"file_path\",\n \"filePath\",\n \"path\",\n \"notebook_path\",\n \"query\",\n \"search_query\",\n \"searchQuery\",\n \"pattern\"\n ]) ??\n firstObjectValue(toolCall, [\n \"input\",\n \"rawInput\",\n \"raw_input\",\n \"arguments\",\n \"args\"\n ]) ??\n toolCall ??\n input\n );\n}\n\nfunction firstObjectValue(\n input: Record<string, unknown> | null,\n keys: readonly string[]\n): Record<string, unknown> | null {\n if (!input) {\n return null;\n }\n if (keys.some((key) => stringValue(input[key]))) {\n return input;\n }\n for (const key of keys) {\n const value = objectValue(input[key]);\n if (value) {\n return value;\n }\n }\n return null;\n}\n\nfunction formatLineRange(input: Record<string, unknown>): string | null {\n const start = numericValue(input.startLine) ?? numericValue(input.start_line);\n const end = numericValue(input.endLine) ?? numericValue(input.end_line);\n if (start === null || end === null) {\n return null;\n }\n return start === end ? `L${start}` : `L${start}-${end}`;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction commandStringValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (!Array.isArray(value)) {\n return null;\n }\n const shellFlag = stringValue(value[value.length - 2]);\n const shellCommand = stringValue(value[value.length - 1]);\n if ((shellFlag === \"-c\" || shellFlag === \"-lc\") && shellCommand) {\n return shellCommand;\n }\n const parts = value.flatMap((part) => {\n const text = stringValue(part);\n return text ? [text] : [];\n });\n return parts.length > 0 ? parts.join(\" \") : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction numericValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type JSX\n} from \"react\";\nimport { MessageSquareMoreIcon } from \"../../../app/renderer/components/icons/MessageSquareMoreIcon\";\nimport { Spinner } from \"../../../app/renderer/components/ui/spinner\";\nimport { translate } from \"../../../i18n/index\";\nimport {\n Button,\n ShortcutBadge,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport {\n getOptionalAgentHostApi,\n useOptionalAgentHostApi\n} from \"../../../agentActivityHost\";\nimport {\n approvalOptionDisplayLabel,\n approvalOptionVisualPresentation,\n normalizeApprovalOptionToken\n} from \"../approvalOptionPresentation\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { buildAskUserAnswerPayload } from \"../interactiveAnswerPayload\";\nimport {\n PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,\n PLAN_IMPLEMENTATION_ACTION_SKIP\n} from \"../planImplementation\";\nimport {\n getPromptToolDetails,\n type PromptToolDetail\n} from \"../promptToolDetails\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\n\nconst COMMAND_TOOLTIP_DELAY_MS = 1000;\n\n/**\n * Where the prompt is rendered, which sets its interaction budget:\n * - \"full\" (conversation / composer): the user is focused here, so every action\n * is shown — primary decisions plus rich follow-ups (feedback textareas,\n * multi-step wizards, \"stay in plan\").\n * - \"compact\" (message-center attention deck): a glanceable needs-attention card\n * across many sessions. Only the primary decision is shown; rich follow-up\n * input is deferred to the conversation, reachable via the card's \"open\n * conversation\" jump. New prompt kinds must consciously choose their compact\n * form here instead of silently inheriting the full conversation surface.\n */\nexport type AgentInteractivePromptVariant = \"full\" | \"compact\";\n\ninterface AgentInteractivePromptSurfaceProps {\n prompt: AgentConversationPromptVM;\n variant?: AgentInteractivePromptVariant;\n edgeGlow?: boolean;\n keyboardShortcuts?: boolean;\n previewMode?: boolean;\n isSubmitting: boolean;\n onSubmit: (input: {\n requestId: string;\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n }) => void;\n labels: {\n approvalLead: string;\n planLead: string;\n planModes: Array<{ id: string; label: string; description: string }>;\n stayInPlan: string;\n sendFeedback: string;\n feedbackPlaceholder: string;\n previousQuestion: string;\n nextQuestion: string;\n submitAnswers: string;\n answerPlaceholder: string;\n waitingForAnswer: string;\n planImplementationLead: string;\n planImplementationConfirm: string;\n planImplementationFeedbackPlaceholder: string;\n planImplementationSend: string;\n planImplementationSkip: string;\n };\n}\n\nexport function AgentInteractivePromptSurface({\n prompt,\n variant = \"full\",\n edgeGlow = false,\n embedded = false,\n keyboardShortcuts = true,\n previewMode = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n embedded?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n\n if (prompt.kind === \"approval\") {\n return (\n <ApprovalPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n keyboardShortcuts={keyboardShortcuts}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"exit-plan\") {\n return (\n <ExitPlanPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"plan-implementation\") {\n return (\n <PlanImplementationSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <AskUserPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n\n// Compact (message-center deck): a single-select question is answered with one\n// click — selecting an option submits it immediately, matching the approval and\n// plan cards. Multi-select / multi-question / free-text-only prompts can't be\n// answered in one tap, so they defer to the conversation (the card's \"open\n// conversation\" jump); their options are still shown as read-only context\n// (see the non-oneClickable branch below) rather than being omitted.\nfunction CompactAskUserPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const question = prompt.questions[0] ?? null;\n const oneClickable =\n prompt.questions.length === 1 &&\n question !== null &&\n !question.multiSelect &&\n question.options.length > 0;\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n {question ? (\n <>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {oneClickable ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: {\n ...buildAskUserAnswerPayload({\n [question.id]: option.label\n })\n }\n })\n }\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n ) : question.options.length > 0 ? (\n // Multi-select / multi-question prompts can't be answered with a\n // single click here, so the options are shown as read-only\n // context instead of being silently omitted. Answering still\n // happens in the full conversation via the card's \"open\n // conversation\" jump.\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => (\n <div\n key={option.label}\n className={styles.interactiveOptionDisplay}\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction ApprovalPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n keyboardShortcuts = true,\n previewMode = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"approval\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const promptDetails = useMemo(\n () => formatToolDetails(prompt.input ?? null),\n [prompt.input]\n );\n const [submittingOptionId, setSubmittingOptionId] = useState<string | null>(\n null\n );\n const [pendingFeedbackOptionId, setPendingFeedbackOptionId] = useState<\n string | null\n >(null);\n const [feedback, setFeedback] = useState(\"\");\n const feedbackTextareaRef = useRef<HTMLTextAreaElement | null>(null);\n const agentHostApi = useOptionalAgentHostApi() ?? getOptionalAgentHostApi();\n const isDarwin = isDarwinPlatform(agentHostApi?.meta?.platform);\n const feedbackOptionId = useMemo(\n () => approvalFeedbackOptionId(prompt.options),\n [prompt.options]\n );\n const feedbackValue = feedback.trim();\n\n useEffect(() => {\n setSubmittingOptionId(null);\n setPendingFeedbackOptionId(null);\n setFeedback(\"\");\n }, [prompt.requestId]);\n\n useEffect(() => {\n if (pendingFeedbackOptionId !== null) {\n feedbackTextareaRef.current?.focus();\n }\n }, [pendingFeedbackOptionId]);\n\n const submitOption = useCallback(\n (optionId: string) => {\n const feedbackOption = feedbackOptionId === optionId;\n if (feedbackOption && pendingFeedbackOptionId !== optionId) {\n setFeedback(\"\");\n setPendingFeedbackOptionId(optionId);\n return;\n }\n setSubmittingOptionId(optionId);\n onSubmit({\n requestId: prompt.requestId,\n ...(feedbackOption ? { action: \"deny\" } : {}),\n optionId,\n ...(feedbackOption && feedbackValue\n ? { payload: { denyMessage: feedbackValue } }\n : {})\n });\n },\n [\n feedbackOptionId,\n feedbackValue,\n onSubmit,\n pendingFeedbackOptionId,\n prompt.requestId\n ]\n );\n\n useEffect(() => {\n if (\n !keyboardShortcuts ||\n isSubmitting ||\n submittingOptionId !== null ||\n prompt.options.length === 0\n ) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (\n !isEnterLikeKey(event) ||\n isEditableKeyboardTarget(event.target) ||\n event.isComposing ||\n event.altKey ||\n event.shiftKey\n ) {\n return;\n }\n const optionIndex = event.metaKey || event.ctrlKey ? 1 : 0;\n const option = prompt.options[optionIndex];\n if (!option) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n submitOption(option.id);\n };\n\n window.addEventListener(\"keydown\", handleKeyDown, true);\n return () => window.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [\n isSubmitting,\n keyboardShortcuts,\n prompt.options,\n submitOption,\n submittingOptionId\n ]);\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.approvalLead)}\n </div>\n {promptDetails.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {promptDetails.map((detail) => (\n <div\n key={`${detail.label}:${detail.value}`}\n className={styles.interactiveOptionDisplay}\n >\n <span className={styles.interactiveOptionTitle}>\n {detail.label}\n </span>\n <PromptDetailValue detail={detail} previewMode={previewMode} />\n {detail.meta ? (\n <span className={styles.interactiveOptionDescription}>\n {detail.meta}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n <div className={styles.interactivePromptOptions}>\n {prompt.options.map((option, optionIndex) => {\n const showSpinner = submittingOptionId === option.id;\n const optionSupportsFeedback = feedbackOptionId === option.id;\n const optionLabel = approvalOptionDisplayLabel(option, {\n feedback: optionSupportsFeedback\n });\n const optionPresentation = approvalOptionVisualPresentation(\n option,\n { feedback: optionSupportsFeedback }\n );\n const shortcutLabel = approvalOptionShortcutLabel(\n optionIndex,\n isDarwin\n );\n const showFeedbackComposer = pendingFeedbackOptionId === option.id;\n if (showFeedbackComposer) {\n return (\n <div\n key={option.id}\n className={styles.interactiveFeedbackComposer}\n >\n <textarea\n ref={feedbackTextareaRef}\n value={feedback}\n placeholder={labels.feedbackPlaceholder}\n disabled={isSubmitting || submittingOptionId !== null}\n className={styles.interactivePromptTextarea}\n aria-label={interactiveOptionLabel(\n optionLabel,\n option.description\n )}\n onChange={(event) => setFeedback(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (\n !keyboardShortcuts ||\n event.key !== \"Enter\" ||\n (!event.metaKey && !event.ctrlKey) ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n if (!feedbackValue) {\n feedbackTextareaRef.current?.focus();\n return;\n }\n submitOption(option.id);\n }}\n />\n <button\n type=\"button\"\n className={styles.interactiveFeedbackSendButton}\n disabled={\n isSubmitting ||\n submittingOptionId !== null ||\n !feedbackValue\n }\n aria-label={labels.sendFeedback}\n title={labels.sendFeedback}\n aria-busy={showSpinner}\n onClick={() => {\n if (!feedbackValue) {\n feedbackTextareaRef.current?.focus();\n return;\n }\n submitOption(option.id);\n }}\n >\n {showSpinner ? (\n <InteractiveOptionSpinner />\n ) : (\n <SendFilledIcon />\n )}\n </button>\n </div>\n );\n }\n return (\n <button\n key={option.id}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n optionLabel,\n option.description\n )}\n disabled={isSubmitting || submittingOptionId !== null}\n onClick={() => submitOption(option.id)}\n >\n <span className={styles.interactiveOptionTitle}>\n {optionPresentation.label}\n </span>\n {optionPresentation.commandPrefix ? (\n <CommandTextWithTooltip\n value={optionPresentation.commandPrefix}\n testId=\"agent-interactive-command-prefix-option\"\n tooltipsEnabled={!previewMode}\n />\n ) : null}\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n {keyboardShortcuts && shortcutLabel && !showSpinner ? (\n <ShortcutBadge\n className={styles.interactiveOptionShortcut}\n aria-hidden=\"true\"\n >\n {shortcutLabel}\n </ShortcutBadge>\n ) : null}\n {showSpinner ? <InteractiveOptionSpinner /> : null}\n </button>\n );\n })}\n </div>\n </div>\n </section>\n );\n}\n\nfunction ExitPlanPromptSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"exit-plan\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [feedback, setFeedback] = useState(\"\");\n // Compact (message-center deck): only the permission-mode decision buttons are\n // offered; refining / staying in plan is deferred to the conversation.\n const showFeedbackFooter = variant !== \"compact\";\n const [submittingOptionId, setSubmittingOptionId] = useState<string | null>(\n null\n );\n const trimmed = feedback.trim();\n const continueLabel =\n trimmed === \"\" ? labels.stayInPlan : labels.sendFeedback;\n // Render the permission modes the runtime actually offered (\"Yes, and ...\")\n // so newly added modes (e.g. \"auto\") appear automatically. Localized\n // label/description are looked up by option id, falling back to the runtime's\n // own label for ids we don't have copy for. Only when the runtime sent no\n // options (Codex plan / legacy exitplanmode) do we use the curated defaults.\n const modes =\n prompt.options.length > 0\n ? prompt.options.map((option) => {\n const known = labels.planModes.find((mode) => mode.id === option.id);\n return {\n id: option.id,\n label: known?.label ?? option.label,\n description: known?.description ?? option.description ?? \"\"\n };\n })\n : labels.planModes;\n\n useEffect(() => {\n setSubmittingOptionId(null);\n }, [prompt.requestId]);\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.planLead)}\n </div>\n <div className={styles.interactivePromptOptions}>\n {modes.map((mode) => {\n const showSpinner = submittingOptionId === mode.id;\n return (\n <button\n key={mode.id}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n mode.label,\n mode.description\n )}\n disabled={isSubmitting || submittingOptionId !== null}\n onClick={() => {\n setSubmittingOptionId(mode.id);\n onSubmit({\n requestId: prompt.requestId,\n action: \"allow\",\n optionId: mode.id\n });\n }}\n >\n <span className={styles.interactiveOptionTitle}>\n {mode.label}\n </span>\n <span className={styles.interactiveOptionDescription}>\n {mode.description}\n </span>\n {showSpinner ? <InteractiveOptionSpinner /> : null}\n </button>\n );\n })}\n </div>\n {showFeedbackFooter ? (\n <div className={styles.interactivePromptFooter}>\n <textarea\n value={feedback}\n placeholder={labels.feedbackPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n onChange={(event) => setFeedback(event.currentTarget.value)}\n />\n <div className={styles.interactivePromptActions}>\n <button\n type=\"button\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n // The runtime models exit-plan as an approval that requires\n // an option id, so \"keep planning\" submits its `plan` option\n // id (when present) rather than a bare deny. `action: deny`\n // is kept so the controller doesn't flip plan mode off.\n action: \"deny\",\n ...(prompt.keepPlanningOptionId\n ? { optionId: prompt.keepPlanningOptionId }\n : {}),\n payload: trimmed ? { denyMessage: trimmed } : undefined\n })\n }\n >\n {continueLabel}\n </button>\n </div>\n </div>\n ) : (\n // Compact (deck): no textarea, but keep declining reachable — the deck\n // must still let the user keep planning (refining/feedback is deferred\n // to the conversation via the card's \"open conversation\" jump).\n <div className={styles.interactivePromptActions}>\n <button\n type=\"button\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"deny\",\n ...(prompt.keepPlanningOptionId\n ? { optionId: prompt.keepPlanningOptionId }\n : {})\n })\n }\n >\n {labels.stayInPlan}\n </button>\n </div>\n )}\n </div>\n </section>\n );\n}\n\n// Codex plan-mode \"implement this plan?\" decision. No server request; actions\n// are routed by the consumer (controller inline, desktop chrome in the message\n// center) keyed on the action id rather than a server submitInteractive.\nfunction PlanImplementationSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"plan-implementation\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [feedback, setFeedback] = useState(\"\");\n const trimmed = feedback.trim();\n const continueLabel =\n trimmed === \"\"\n ? labels.planImplementationSkip\n : labels.planImplementationSend;\n // Compact (message-center deck): only the \"implement\" decision is offered.\n // Refining or staying in plan mode is deferred to the conversation, reachable\n // via the card's \"open conversation\" jump.\n const showFeedbackFooter = variant !== \"compact\";\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(labels.planImplementationLead)}\n </div>\n <div className={styles.interactivePromptOptions}>\n <button\n type=\"button\"\n className={styles.interactiveOptionButton}\n data-testid=\"agent-plan-implementation-implement\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: PLAN_IMPLEMENTATION_ACTION_IMPLEMENT\n })\n }\n >\n <span className={styles.interactiveOptionTitle}>\n {labels.planImplementationConfirm}\n </span>\n </button>\n </div>\n {showFeedbackFooter ? (\n <div className={styles.interactivePromptFooter}>\n <textarea\n value={feedback}\n placeholder={labels.planImplementationFeedbackPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n data-testid=\"agent-plan-implementation-feedback\"\n onChange={(event) => setFeedback(event.currentTarget.value)}\n />\n <div className={styles.interactivePromptActions}>\n <button\n type=\"button\"\n data-testid=\"agent-plan-implementation-continue\"\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action:\n trimmed === \"\"\n ? PLAN_IMPLEMENTATION_ACTION_SKIP\n : PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n payload: trimmed ? { text: trimmed } : undefined\n })\n }\n >\n {continueLabel}\n </button>\n </div>\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction AskUserPromptSurface({\n prompt,\n variant = \"full\",\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n if (variant === \"compact\") {\n return (\n <CompactAskUserPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <FullAskUserPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n\nfunction FullAskUserPromptSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n prompt: Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n embedded?: boolean;\n}) {\n \"use memo\";\n const [index, setIndex] = useState(0);\n const [selectedByQuestionId, setSelectedByQuestionId] = useState<\n Record<string, string[]>\n >({});\n const [freeTextByQuestionId, setFreeTextByQuestionId] = useState<\n Record<string, string>\n >({});\n\n const question = prompt.questions[index] ?? null;\n const selected = question ? (selectedByQuestionId[question.id] ?? []) : [];\n const freeText = question ? (freeTextByQuestionId[question.id] ?? \"\") : \"\";\n const canAdvance =\n question !== null &&\n (selected.length > 0 ||\n freeText.trim() !== \"\" ||\n question.options.length === 0);\n const isLast = index >= prompt.questions.length - 1;\n\n const payload = useMemo(() => {\n const answersByQuestionId: Record<string, string | string[]> = {};\n for (const current of prompt.questions) {\n const chosen = selectedByQuestionId[current.id] ?? [];\n const other = (freeTextByQuestionId[current.id] ?? \"\").trim();\n if (current.multiSelect) {\n const value = other ? [...chosen, other] : chosen;\n if (value.length > 0) {\n answersByQuestionId[current.id] = value;\n }\n continue;\n }\n const value = other || chosen[0];\n if (value) {\n answersByQuestionId[current.id] = value;\n }\n }\n return buildAskUserAnswerPayload(answersByQuestionId);\n }, [freeTextByQuestionId, prompt.questions, selectedByQuestionId]);\n\n if (!question) {\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div\n className={`${styles.interactivePromptLead} inline-flex items-center gap-1.5`}\n >\n <MessageSquareMoreIcon\n size={15}\n active\n aria-hidden=\"true\"\n className=\"shrink-0\"\n />\n {stripPromptTitlePunctuation(labels.waitingForAnswer)}\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n <span className={styles.interactivePromptMeta}>\n {index + 1}/{prompt.questions.length}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {question.options.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => {\n const active = selected.includes(option.label);\n return (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n data-active={active}\n aria-pressed={active}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() => {\n setSelectedByQuestionId((current) => {\n const existing = current[question.id] ?? [];\n const next = question.multiSelect\n ? existing.includes(option.label)\n ? existing.filter((value) => value !== option.label)\n : [...existing, option.label]\n : existing.includes(option.label)\n ? []\n : [option.label];\n return { ...current, [question.id]: next };\n });\n }}\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n </button>\n );\n })}\n </div>\n ) : null}\n <textarea\n value={freeText}\n placeholder={labels.answerPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n onChange={(event) => {\n const value = event.currentTarget.value;\n setFreeTextByQuestionId((current) => ({\n ...current,\n [question.id]: value\n }));\n }}\n />\n <div className={styles.interactivePromptActions}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n disabled={isSubmitting || index === 0}\n onClick={() => setIndex((current) => Math.max(current - 1, 0))}\n >\n {labels.previousQuestion}\n </Button>\n {isLast ? (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={\n isSubmitting ||\n Object.keys(payload.answersByQuestionId).length === 0\n }\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: { ...payload }\n })\n }\n >\n {labels.submitAnswers}\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isSubmitting || !canAdvance}\n onClick={() =>\n setIndex((current) =>\n Math.min(current + 1, prompt.questions.length - 1)\n )\n }\n >\n {labels.nextQuestion}\n </Button>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nfunction isEnterLikeKey(event: KeyboardEvent): boolean {\n return (\n event.key === \"Enter\" ||\n event.code === \"Enter\" ||\n event.code === \"NumpadEnter\"\n );\n}\n\nfunction isEditableKeyboardTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n const tagName = target.tagName.toLowerCase();\n return (\n tagName === \"input\" ||\n tagName === \"textarea\" ||\n tagName === \"select\" ||\n target.isContentEditable\n );\n}\n\nfunction approvalOptionShortcutLabel(\n optionIndex: number,\n isDarwin: boolean\n): string | null {\n if (optionIndex === 0) {\n return translate(\"agentHost.agentGui.shortcutEnter\");\n }\n if (optionIndex === 1) {\n return isDarwin\n ? translate(\"agentHost.agentGui.shortcutCmdEnter\")\n : translate(\"agentHost.agentGui.shortcutCtrEnter\");\n }\n return null;\n}\n\nfunction isDarwinPlatform(platform: string | undefined): boolean {\n if (platform) {\n return platform === \"darwin\";\n }\n if (typeof navigator === \"undefined\") {\n return false;\n }\n const userAgentPlatform =\n \"userAgentData\" in navigator\n ? (\n navigator as Navigator & {\n userAgentData?: { platform?: string };\n }\n ).userAgentData?.platform\n : undefined;\n const navigatorPlatform = userAgentPlatform ?? navigator.platform ?? \"\";\n return /mac/i.test(navigatorPlatform);\n}\n\nfunction InteractiveOptionSpinner(): JSX.Element {\n \"use memo\";\n return (\n <Spinner\n className={styles.interactiveOptionSpinner}\n testId=\"agent-interactive-option-spinner\"\n />\n );\n}\n\nfunction SendFilledIcon(): JSX.Element {\n \"use memo\";\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2.74311 8.80587C2.84592 8.40096 3.14571 8.08844 3.54551 7.97033L18.5197 3.51569C18.9336 3.39383 19.3809 3.5054 19.6881 3.81262C19.9951 4.11984 20.1076 4.56798 19.9857 4.9817L15.5311 19.9559C15.413 20.3557 15.1005 20.6555 14.6956 20.7583C14.2895 20.8597 13.869 20.7438 13.5721 20.4469L10.455 15.1823C10.8585 14.6483 12.1563 12.9094 14.3475 9.96528C14.6086 9.70419 14.6382 9.31168 14.4138 9.08692C14.1891 8.86221 13.796 8.8913 13.5348 9.15252L8.31088 13.0423L3.05316 9.92799C2.7562 9.63104 2.64049 9.21071 2.74311 8.80587Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction interactivePromptClassName(embedded: boolean): string {\n return embedded\n ? `${styles.interactivePrompt} agent-gui-conversation__interactive-prompt--embedded`\n : styles.interactivePrompt;\n}\n\nfunction interactivePromptCardClassName(edgeGlow: boolean): string {\n return edgeGlow\n ? `${styles.interactivePromptCard} agent-gui-edge-glow`\n : styles.interactivePromptCard;\n}\n\ninterface LabeledPromptToolDetail {\n kind: PromptToolDetail[\"kind\"];\n label: string;\n value: string;\n meta?: string;\n}\n\nfunction formatToolDetails(\n input: Record<string, unknown> | null\n): LabeledPromptToolDetail[] {\n return getPromptToolDetails(input).map((detail) => ({\n kind: detail.kind,\n label: promptToolDetailLabel(detail.kind),\n value: detail.value,\n ...(detail.meta ? { meta: detail.meta } : {})\n }));\n}\n\nfunction PromptDetailValue({\n detail,\n previewMode\n}: {\n detail: LabeledPromptToolDetail;\n previewMode: boolean;\n}): JSX.Element {\n \"use memo\";\n if (detail.kind !== \"command\") {\n return (\n <span className={styles.interactiveOptionDescription}>\n {detail.value}\n </span>\n );\n }\n return (\n <CommandTextWithTooltip\n value={detail.value}\n testId=\"agent-interactive-command-detail\"\n tooltipsEnabled={!previewMode}\n />\n );\n}\n\nfunction CommandTextWithTooltip({\n value,\n testId,\n tooltipsEnabled = true\n}: {\n value: string;\n testId: string;\n tooltipsEnabled?: boolean;\n}): JSX.Element {\n \"use memo\";\n const content = (\n <span\n className={`${styles.interactiveOptionDescription} ${styles.interactiveOptionCommandDescription}`}\n data-agent-interactive-command-detail={\n testId === \"agent-interactive-command-detail\" ? \"true\" : undefined\n }\n data-agent-interactive-command-prefix-option={\n testId === \"agent-interactive-command-prefix-option\"\n ? \"true\"\n : undefined\n }\n >\n {value}\n </span>\n );\n\n if (!tooltipsEnabled) {\n return content;\n }\n\n return (\n <TooltipProvider delayDuration={COMMAND_TOOLTIP_DELAY_MS}>\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent className={styles.interactiveOptionCommandTooltip}>\n {value}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction promptToolDetailLabel(kind: PromptToolDetail[\"kind\"]): string {\n switch (kind) {\n case \"command\":\n return translate(\"agentHost.agentTool.details.command\");\n case \"mcp\":\n return translate(\"agentHost.agentTool.details.mcp\");\n case \"path\":\n return translate(\"agentHost.agentTool.details.path\");\n case \"query\":\n return translate(\"agentHost.agentTool.details.query\");\n }\n}\n\nfunction isApprovalFeedbackOption(option: {\n id: string;\n kind: string;\n}): boolean {\n return (\n isDenyApprovalOptionToken(option.id) ||\n isDenyApprovalOptionToken(option.kind)\n );\n}\n\nfunction approvalFeedbackOptionId(\n options: readonly { id: string; kind: string }[]\n): string | null {\n const explicitFeedbackOption = options.find((option) =>\n isExplicitFeedbackDenyApprovalOption(option)\n );\n if (explicitFeedbackOption) {\n return explicitFeedbackOption.id;\n }\n return options.find(isApprovalFeedbackOption)?.id ?? null;\n}\n\nfunction isExplicitFeedbackDenyApprovalOption(option: {\n id: string;\n kind: string;\n}): boolean {\n for (const value of [option.id, option.kind]) {\n switch (normalizeApprovalOptionToken(value ?? \"\")) {\n case \"abort\":\n case \"cancel\":\n case \"cancelled\":\n case \"canceled\":\n case \"denywithfeedback\":\n case \"rejectwithfeedback\":\n return true;\n default:\n break;\n }\n }\n return false;\n}\n\nfunction isDenyApprovalOptionToken(value: string | null | undefined): boolean {\n switch (normalizeApprovalOptionToken(value ?? \"\")) {\n case \"abort\":\n case \"cancel\":\n case \"cancelled\":\n case \"canceled\":\n case \"deny\":\n case \"denied\":\n case \"reject\":\n case \"rejected\":\n case \"rejectonce\":\n case \"disallow\":\n case \"decline\":\n case \"declined\":\n case \"no\":\n return true;\n default:\n return false;\n }\n}\n\nfunction stripPromptTitlePunctuation(value: string): string {\n return value.trim().replace(/[.。]+$/u, \"\");\n}\n\nfunction interactiveOptionLabel(\n label: string,\n description: string | null | undefined\n): string {\n const trimmedDescription = description?.trim();\n return trimmedDescription ? `${label} ${trimmedDescription}` : label;\n}\n","/**\n * Wire contract for the answer submitted back to an interactive `ask-user`\n * prompt. This payload crosses the renderer → daemon boundary (it rides\n * `submitInteractive({ action: \"submit\", payload })`), so its shape is a\n * cross-language contract, not an internal detail.\n *\n * Consumers that MUST stay in sync with this shape:\n * - daemon (Go) standard ACP adapter — forwards `answersByQuestionId` verbatim.\n * - daemon (Go) codex app-server adapter — `appServerUserInputAnswers` reshapes\n * `answersByQuestionId` into codex's `requestUserInput` response.\n *\n * Field semantics:\n * - `answersByQuestionId` is the canonical, machine-readable answer: question id\n * → the chosen option label(s) / free text. This is what providers consume.\n * - `answers` is a flat, human-readable display list (one entry per answered\n * question, multi-select joined). Never the source of truth for routing.\n *\n * Always build this with {@link buildAskUserAnswerPayload} so producers can't\n * drift on field names or which field is authoritative.\n */\nexport interface InteractiveAnswerPayload {\n answers: string[];\n answersByQuestionId: Record<string, string | string[]>;\n}\n\n/**\n * Builds the canonical interactive answer payload from the per-question answers.\n * `answers` is derived from `answersByQuestionId` (multi-select values joined)\n * so the two fields can never disagree.\n */\nexport function buildAskUserAnswerPayload(\n answersByQuestionId: Record<string, string | string[]>\n): InteractiveAnswerPayload {\n const answers = Object.values(answersByQuestionId).map((value) =>\n Array.isArray(value) ? value.join(\", \") : value\n );\n return { answers, answersByQuestionId };\n}\n"],"mappings":"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","names":["value"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../shared/userAvatarPlaceholder.ts","../shared/workspaceAgentActivityStatusLabel.ts","../app/renderer/components/ui/spinner.tsx"],"sourcesContent":["import userAvatarPlaceholderAssetUrl from \"../app/renderer/assets/icons/user-avatar-placeholder.png\";\n\n/**\n * Bundled placeholder avatar shown for users without an avatar URL. Centralized\n * here so every surface (the agent composer mention palette, the message-center\n * card, and the desktop seam that enriches issue-manager session mentions)\n * resolves the SAME asset URL without duplicating the asset import.\n */\nexport const userAvatarPlaceholderUrl: string = userAvatarPlaceholderAssetUrl;\n","import { translate, type TranslateFn } from \"../i18n/index\";\nimport type { WorkspaceAgentActivityStatus } from \"./workspaceAgentActivityListViewModel\";\n\nexport function normalizeWorkspaceAgentActivityDisplayStatus(\n status: string | undefined\n): WorkspaceAgentActivityStatus {\n switch ((status ?? \"\").trim().toLowerCase()) {\n case \"working\":\n return \"working\";\n case \"waiting\":\n return \"waiting\";\n case \"idle\":\n case \"ready\":\n return \"completed\";\n case \"completed\":\n case \"end\":\n return \"completed\";\n case \"canceled\":\n return \"canceled\";\n case \"failed\":\n return \"failed\";\n default:\n return \"idle\";\n }\n}\n\nexport function workspaceAgentActivityStatusLabel(\n status: WorkspaceAgentActivityStatus | string,\n t?: TranslateFn\n): string {\n const translateFn = t ?? translate;\n switch (normalizeWorkspaceAgentActivityDisplayStatus(status)) {\n case \"working\":\n return translateFn(\"agentHost.workspaceAgentActivityStatusWorking\");\n case \"waiting\":\n return translateFn(\"agentHost.workspaceAgentActivityStatusWaiting\");\n case \"idle\":\n return translateFn(\"agentHost.workspaceAgentActivityStatusIdle\");\n case \"completed\":\n return translateFn(\"agentHost.workspaceAgentActivityStatusEnd\");\n case \"canceled\":\n return translateFn(\"agentHost.workspaceAgentActivityStatusCanceled\");\n case \"failed\":\n return translateFn(\"agentHost.workspaceAgentActivityStatusFailed\");\n default:\n return String(status);\n }\n}\n","export { Spinner, type SpinnerProps } from \"@tutti-os/ui-system\";\n"],"mappings":";;;;;;;;AAQO,IAAM,2BAAmC;;;ACLzC,SAAS,6CACd,QAC8B;AAC9B,WAAS,UAAU,IAAI,KAAK,EAAE,YAAY,GAAG;AAAA,IAC3C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,kCACd,QACA,GACQ;AACR,QAAM,cAAc,KAAK;AACzB,UAAQ,6CAA6C,MAAM,GAAG;AAAA,IAC5D,KAAK;AACH,aAAO,YAAY,+CAA+C;AAAA,IACpE,KAAK;AACH,aAAO,YAAY,+CAA+C;AAAA,IACpE,KAAK;AACH,aAAO,YAAY,4CAA4C;AAAA,IACjE,KAAK;AACH,aAAO,YAAY,2CAA2C;AAAA,IAChE,KAAK;AACH,aAAO,YAAY,gDAAgD;AAAA,IACrE,KAAK;AACH,aAAO,YAAY,8CAA8C;AAAA,IACnE;AACE,aAAO,OAAO,MAAM;AAAA,EACxB;AACF;;;AC/CA,SAAS,eAAkC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../agentQueuedPromptRuntimeCore.ts"],"sourcesContent":["import type { AgentGUIQueuedPromptVM } from \"./agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\nimport type { AgentPromptContentBlock } from \"./shared/contracts/dto\";\n\nexport interface AgentQueuedPromptRetryBlock {\n queuedPromptId: string;\n sessionStateUpdatedAtUnixMs: number | null;\n conversationUpdatedAtUnixMs: number | null;\n}\n\nexport interface AgentQueuedPromptClaim {\n agentSessionId: string;\n claimId: string;\n ownerId: string;\n promptId: string;\n leasedUntilUnixMs: number;\n workspaceId: string;\n}\n\nexport interface AgentQueuedPromptQueueSnapshot {\n agentSessionId: string;\n claim: AgentQueuedPromptClaim | null;\n failedPromptId: string | null;\n prompts: readonly AgentGUIQueuedPromptVM[];\n retryBlock: AgentQueuedPromptRetryBlock | null;\n sendNextPromptId: string | null;\n workspaceId: string;\n}\n\nexport interface AgentQueuedPromptSnapshot {\n queuesByKey: Readonly<Record<string, AgentQueuedPromptQueueSnapshot>>;\n version: number;\n}\n\nexport interface AgentQueuedPromptClaimResult {\n claim: AgentQueuedPromptClaim;\n prompt: AgentGUIQueuedPromptVM;\n}\n\nexport interface AgentQueuedPromptRuntime {\n claimNextToDrain(input: {\n agentSessionId: string;\n leaseMs?: number;\n ownerId: string;\n workspaceId: string;\n }): AgentQueuedPromptClaimResult | null;\n cleanupSession(input: { agentSessionId: string; workspaceId: string }): void;\n completeClaim(input: {\n agentSessionId: string;\n claimId: string;\n ownerId: string;\n workspaceId: string;\n }): boolean;\n enqueue(input: {\n prompt: AgentGUIQueuedPromptVM;\n agentSessionId: string;\n workspaceId: string;\n }): void;\n getSessionSnapshot(input: {\n agentSessionId: string;\n workspaceId: string;\n }): AgentQueuedPromptQueueSnapshot;\n getSnapshot(): AgentQueuedPromptSnapshot;\n markPromptFailed(input: {\n agentSessionId: string;\n promptId: string;\n workspaceId: string;\n }): void;\n promotePrompt(input: {\n agentSessionId: string;\n promptId: string;\n workspaceId: string;\n }): void;\n releaseClaim(input: {\n agentSessionId: string;\n claimId: string;\n ownerId: string;\n workspaceId: string;\n }): boolean;\n /** @deprecated Queue drain owners should release exact claims by claim id. */\n releaseOwner(ownerId: string): void;\n removePrompt(input: {\n agentSessionId: string;\n promptId: string;\n workspaceId: string;\n }): AgentGUIQueuedPromptVM | null;\n setRetryBlock(input: {\n agentSessionId: string;\n retryBlock: AgentQueuedPromptRetryBlock | null;\n workspaceId: string;\n }): void;\n subscribe(listener: () => void): () => void;\n}\n\nconst DEFAULT_CLAIM_LEASE_MS = 30_000;\n\nexport const EMPTY_AGENT_QUEUED_PROMPT_SNAPSHOT: AgentQueuedPromptSnapshot =\n Object.freeze({\n queuesByKey: Object.freeze({}),\n version: 0\n });\n\nfunction logAgentQueuedPromptRuntime(\n event: string,\n details: Record<string, unknown>\n): void {\n void event;\n void details;\n}\n\nexport function createAgentQueuedPromptRuntime(): AgentQueuedPromptRuntime {\n let snapshot = EMPTY_AGENT_QUEUED_PROMPT_SNAPSHOT;\n const emptyQueuesByKey = new Map<string, AgentQueuedPromptQueueSnapshot>();\n const expiredClaimsByKey = new Map<string, AgentQueuedPromptClaim>();\n const listeners = new Set<() => void>();\n let claimExpiryTimer: ReturnType<typeof setTimeout> | null = null;\n\n const notify = (): void => {\n for (const listener of [...listeners]) {\n listener();\n }\n };\n\n const updateQueue = (\n workspaceId: string,\n agentSessionId: string,\n updater: (\n queue: AgentQueuedPromptQueueSnapshot\n ) => AgentQueuedPromptQueueSnapshot | null,\n options?: { releaseExpiredClaim?: boolean }\n ): void => {\n const key = queueKey(workspaceId, agentSessionId);\n const current =\n snapshot.queuesByKey[key] ??\n getEmptyQueueSnapshot(emptyQueuesByKey, { workspaceId, agentSessionId });\n const queueForUpdate =\n options?.releaseExpiredClaim === false\n ? current\n : withExpiredClaimReleased(current);\n if (queueForUpdate !== current && current.claim) {\n expiredClaimsByKey.set(key, current.claim);\n }\n const nextQueue = updater(queueForUpdate);\n if (nextQueue === current) {\n return;\n }\n const nextQueuesByKey: Record<string, AgentQueuedPromptQueueSnapshot> = {\n ...snapshot.queuesByKey\n };\n if (nextQueue === null || isEmptyQueue(nextQueue)) {\n delete nextQueuesByKey[key];\n } else {\n nextQueuesByKey[key] = freezeQueue(nextQueue);\n }\n clearExpiredClaimIfReplaced(expiredClaimsByKey, key, nextQueue);\n snapshot = Object.freeze({\n queuesByKey: Object.freeze(nextQueuesByKey),\n version: snapshot.version + 1\n });\n scheduleClaimExpiryWakeup();\n notify();\n };\n\n const releaseExpiredClaims = (): void => {\n claimExpiryTimer = null;\n let changed = false;\n const nextQueuesByKey: Record<string, AgentQueuedPromptQueueSnapshot> = {\n ...snapshot.queuesByKey\n };\n for (const [key, queue] of Object.entries(snapshot.queuesByKey)) {\n const nextQueue = withExpiredClaimReleased(queue);\n if (nextQueue === queue) {\n continue;\n }\n changed = true;\n if (queue.claim) {\n expiredClaimsByKey.set(key, queue.claim);\n }\n if (isEmptyQueue(nextQueue)) {\n delete nextQueuesByKey[key];\n } else {\n nextQueuesByKey[key] = nextQueue;\n }\n }\n if (changed) {\n snapshot = Object.freeze({\n queuesByKey: Object.freeze(nextQueuesByKey),\n version: snapshot.version + 1\n });\n notify();\n }\n scheduleClaimExpiryWakeup();\n };\n\n const scheduleClaimExpiryWakeup = (): void => {\n if (claimExpiryTimer) {\n clearTimeout(claimExpiryTimer);\n claimExpiryTimer = null;\n }\n let nextExpiryUnixMs: number | null = null;\n for (const queue of Object.values(snapshot.queuesByKey)) {\n if (!queue.claim) {\n continue;\n }\n nextExpiryUnixMs =\n nextExpiryUnixMs === null\n ? queue.claim.leasedUntilUnixMs\n : Math.min(nextExpiryUnixMs, queue.claim.leasedUntilUnixMs);\n }\n if (nextExpiryUnixMs === null) {\n return;\n }\n claimExpiryTimer = setTimeout(\n releaseExpiredClaims,\n Math.max(1, nextExpiryUnixMs - Date.now() + 1)\n );\n (claimExpiryTimer as { unref?: () => void }).unref?.();\n };\n\n return {\n claimNextToDrain(input) {\n const workspaceId = input.workspaceId.trim();\n const agentSessionId = input.agentSessionId.trim();\n const ownerId = input.ownerId.trim();\n if (!workspaceId || !agentSessionId || !ownerId) {\n return null;\n }\n const current = withExpiredClaimReleased(\n snapshot.queuesByKey[queueKey(workspaceId, agentSessionId)] ??\n getEmptyQueueSnapshot(emptyQueuesByKey, {\n workspaceId,\n agentSessionId\n })\n );\n if (current.claim || current.prompts.length === 0) {\n return null;\n }\n const prompt = current.prompts[0]!;\n const claim: AgentQueuedPromptClaim = Object.freeze({\n workspaceId,\n agentSessionId,\n ownerId,\n promptId: prompt.id,\n claimId: `claim-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n leasedUntilUnixMs:\n Date.now() + Math.max(1, input.leaseMs ?? DEFAULT_CLAIM_LEASE_MS)\n });\n updateQueue(workspaceId, agentSessionId, (queue) => ({\n ...queue,\n claim\n }));\n expiredClaimsByKey.delete(queueKey(workspaceId, agentSessionId));\n logAgentQueuedPromptRuntime(\"claim\", {\n workspaceId,\n agentSessionId,\n ownerId,\n promptId: prompt.id,\n claimId: claim.claimId,\n queueLength: current.prompts.length\n });\n return { claim, prompt };\n },\n cleanupSession(input) {\n const workspaceId = input.workspaceId.trim();\n const agentSessionId = input.agentSessionId.trim();\n if (!workspaceId || !agentSessionId) {\n return;\n }\n updateQueue(workspaceId, agentSessionId, () => null);\n expiredClaimsByKey.delete(queueKey(workspaceId, agentSessionId));\n },\n completeClaim(input) {\n let completed = false;\n const key = queueKey(input.workspaceId, input.agentSessionId);\n updateQueue(\n input.workspaceId,\n input.agentSessionId,\n (queue) => {\n const matchingClaim = claimMatches(queue.claim, input)\n ? queue.claim\n : queue.claim === null &&\n claimMatches(expiredClaimsByKey.get(key) ?? null, input)\n ? expiredClaimsByKey.get(key)!\n : null;\n if (!matchingClaim) {\n return queue;\n }\n completed = true;\n const promptId = matchingClaim.promptId;\n expiredClaimsByKey.delete(key);\n logAgentQueuedPromptRuntime(\"complete-claim\", {\n workspaceId: input.workspaceId,\n agentSessionId: input.agentSessionId,\n ownerId: input.ownerId,\n promptId,\n claimId: input.claimId\n });\n return {\n ...queue,\n claim: null,\n failedPromptId:\n queue.failedPromptId === promptId ? null : queue.failedPromptId,\n prompts: Object.freeze(\n queue.prompts.filter((prompt) => prompt.id !== promptId)\n ),\n retryBlock:\n queue.retryBlock?.queuedPromptId === promptId\n ? null\n : queue.retryBlock,\n sendNextPromptId:\n queue.sendNextPromptId === promptId\n ? null\n : queue.sendNextPromptId\n };\n },\n { releaseExpiredClaim: false }\n );\n return completed;\n },\n enqueue(input) {\n updateQueue(input.workspaceId, input.agentSessionId, (queue) => ({\n ...queue,\n prompts: Object.freeze([...queue.prompts, freezePrompt(input.prompt)])\n }));\n logAgentQueuedPromptRuntime(\"enqueue\", {\n workspaceId: input.workspaceId,\n agentSessionId: input.agentSessionId,\n promptId: input.prompt.id\n });\n },\n getSessionSnapshot(input) {\n const workspaceId = input.workspaceId.trim();\n const agentSessionId = input.agentSessionId.trim();\n const key = queueKey(workspaceId, agentSessionId);\n const current =\n snapshot.queuesByKey[key] ??\n getEmptyQueueSnapshot(emptyQueuesByKey, {\n workspaceId,\n agentSessionId\n });\n const next = withExpiredClaimReleased(current);\n if (next !== current) {\n updateQueue(workspaceId, agentSessionId, () => next);\n }\n return snapshot.queuesByKey[key] ?? next;\n },\n getSnapshot() {\n return snapshot;\n },\n markPromptFailed(input) {\n updateQueue(input.workspaceId, input.agentSessionId, (queue) => ({\n ...queue,\n failedPromptId: input.promptId.trim() || queue.failedPromptId\n }));\n logAgentQueuedPromptRuntime(\"mark-failed\", {\n workspaceId: input.workspaceId,\n agentSessionId: input.agentSessionId,\n promptId: input.promptId\n });\n },\n promotePrompt(input) {\n const promptId = input.promptId.trim();\n if (!promptId) {\n return;\n }\n updateQueue(input.workspaceId, input.agentSessionId, (queue) => {\n const index = queue.prompts.findIndex(\n (prompt) => prompt.id === promptId\n );\n if (index < 0) {\n return queue;\n }\n if (queue.claim?.promptId === promptId) {\n return queue;\n }\n const prompts = [...queue.prompts];\n if (index > 0) {\n const [selected] = prompts.splice(index, 1);\n prompts.unshift(selected!);\n }\n return {\n ...queue,\n failedPromptId:\n queue.failedPromptId === promptId ? null : queue.failedPromptId,\n prompts: Object.freeze(prompts),\n retryBlock:\n queue.retryBlock?.queuedPromptId === promptId\n ? null\n : queue.retryBlock,\n sendNextPromptId: promptId\n };\n });\n },\n releaseClaim(input) {\n let released = false;\n updateQueue(input.workspaceId, input.agentSessionId, (queue) => {\n if (!claimMatches(queue.claim, input)) {\n return queue;\n }\n released = true;\n logAgentQueuedPromptRuntime(\"release-claim\", {\n workspaceId: input.workspaceId,\n agentSessionId: input.agentSessionId,\n ownerId: input.ownerId,\n claimId: input.claimId,\n promptId: queue.claim.promptId\n });\n return { ...queue, claim: null };\n });\n return released;\n },\n releaseOwner(ownerId) {\n const normalizedOwnerId = ownerId.trim();\n if (!normalizedOwnerId) {\n return;\n }\n for (const queue of Object.values(snapshot.queuesByKey)) {\n if (queue.claim?.ownerId === normalizedOwnerId) {\n updateQueue(queue.workspaceId, queue.agentSessionId, (current) => ({\n ...current,\n claim:\n current.claim?.ownerId === normalizedOwnerId\n ? null\n : current.claim\n }));\n }\n }\n },\n removePrompt(input) {\n const promptId = input.promptId.trim();\n if (!promptId) {\n return null;\n }\n let removed: AgentGUIQueuedPromptVM | null = null;\n updateQueue(input.workspaceId, input.agentSessionId, (queue) => {\n removed =\n queue.prompts.find((prompt) => prompt.id === promptId) ?? null;\n if (!removed) {\n return queue;\n }\n if (queue.claim?.promptId === promptId) {\n removed = null;\n return queue;\n }\n const key = queueKey(input.workspaceId, input.agentSessionId);\n if (expiredClaimsByKey.get(key)?.promptId === promptId) {\n expiredClaimsByKey.delete(key);\n }\n return {\n ...queue,\n claim: queue.claim?.promptId === promptId ? null : queue.claim,\n failedPromptId:\n queue.failedPromptId === promptId ? null : queue.failedPromptId,\n prompts: Object.freeze(\n queue.prompts.filter((prompt) => prompt.id !== promptId)\n ),\n retryBlock:\n queue.retryBlock?.queuedPromptId === promptId\n ? null\n : queue.retryBlock,\n sendNextPromptId:\n queue.sendNextPromptId === promptId ? null : queue.sendNextPromptId\n };\n });\n return removed;\n },\n setRetryBlock(input) {\n updateQueue(input.workspaceId, input.agentSessionId, (queue) => ({\n ...queue,\n retryBlock: input.retryBlock\n ? Object.freeze({ ...input.retryBlock })\n : null\n }));\n logAgentQueuedPromptRuntime(\"set-retry-block\", {\n workspaceId: input.workspaceId,\n agentSessionId: input.agentSessionId,\n retryBlock: input.retryBlock\n });\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n };\n}\n\nfunction queueKey(workspaceId: string, agentSessionId: string): string {\n return `${workspaceId.trim()}\\0${agentSessionId.trim()}`;\n}\n\nfunction emptyQueueSnapshot(input: {\n workspaceId: string;\n agentSessionId: string;\n}): AgentQueuedPromptQueueSnapshot {\n return freezeQueue({\n workspaceId: input.workspaceId,\n agentSessionId: input.agentSessionId,\n claim: null,\n failedPromptId: null,\n prompts: Object.freeze([]),\n retryBlock: null,\n sendNextPromptId: null\n });\n}\n\nfunction getEmptyQueueSnapshot(\n cache: Map<string, AgentQueuedPromptQueueSnapshot>,\n input: {\n workspaceId: string;\n agentSessionId: string;\n }\n): AgentQueuedPromptQueueSnapshot {\n const key = queueKey(input.workspaceId, input.agentSessionId);\n const existing = cache.get(key);\n if (existing) {\n return existing;\n }\n const next = emptyQueueSnapshot(input);\n cache.set(key, next);\n return next;\n}\n\nfunction freezePrompt(prompt: AgentGUIQueuedPromptVM): AgentGUIQueuedPromptVM {\n return Object.freeze({\n ...prompt,\n content: Object.freeze([\n ...prompt.content\n ]) as unknown as AgentPromptContentBlock[]\n });\n}\n\nfunction freezeQueue(\n queue: AgentQueuedPromptQueueSnapshot\n): AgentQueuedPromptQueueSnapshot {\n return Object.freeze({\n ...queue,\n claim: queue.claim ? Object.freeze({ ...queue.claim }) : null,\n prompts: Object.freeze(queue.prompts.map(freezePrompt)),\n retryBlock: queue.retryBlock ? Object.freeze({ ...queue.retryBlock }) : null\n });\n}\n\nfunction withExpiredClaimReleased(\n queue: AgentQueuedPromptQueueSnapshot\n): AgentQueuedPromptQueueSnapshot {\n if (!queue.claim || queue.claim.leasedUntilUnixMs > Date.now()) {\n return queue;\n }\n return freezeQueue({ ...queue, claim: null });\n}\n\nfunction isEmptyQueue(queue: AgentQueuedPromptQueueSnapshot): boolean {\n return (\n queue.prompts.length === 0 &&\n queue.claim === null &&\n queue.failedPromptId === null &&\n queue.retryBlock === null &&\n queue.sendNextPromptId === null\n );\n}\n\nfunction claimMatches(\n claim: AgentQueuedPromptClaim | null,\n input: {\n agentSessionId: string;\n claimId: string;\n ownerId: string;\n workspaceId: string;\n }\n): claim is AgentQueuedPromptClaim {\n return (\n claim !== null &&\n claim.workspaceId === input.workspaceId.trim() &&\n claim.agentSessionId === input.agentSessionId.trim() &&\n claim.ownerId === input.ownerId.trim() &&\n claim.claimId === input.claimId.trim()\n );\n}\n\nfunction clearExpiredClaimIfReplaced(\n expiredClaimsByKey: Map<string, AgentQueuedPromptClaim>,\n key: string,\n queue: AgentQueuedPromptQueueSnapshot | null\n): void {\n const expiredClaim = expiredClaimsByKey.get(key);\n if (\n expiredClaim &&\n (queue === null ||\n queue.claim !== null ||\n !queue.prompts.some((prompt) => prompt.id === expiredClaim.promptId))\n ) {\n expiredClaimsByKey.delete(key);\n }\n}\n"],"mappings":"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","names":[]}
|