@tutti-os/agent-gui 0.0.101 → 0.0.103

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 (52) hide show
  1. package/README.md +31 -0
  2. package/dist/{AgentGUI-FECh2x1p.d.ts → AgentGUI-D6IQ0F_N.d.ts} +10 -2
  3. package/dist/agent-conversation/index.d.ts +1 -1
  4. package/dist/agent-conversation/index.js +7 -7
  5. package/dist/agent-gui.d.ts +3 -3
  6. package/dist/agent-gui.js +14 -14
  7. package/dist/agent-message-center/index.d.ts +1 -1
  8. package/dist/agent-message-center/index.js +7 -6
  9. package/dist/agent-message-center/index.js.map +1 -1
  10. package/dist/{agentGuiNodeTypes-BH3lz6gn.d.ts → agentGuiNodeTypes-8U3q_frv.d.ts} +1 -0
  11. package/dist/app/renderer/agentactivity.css +11 -0
  12. package/dist/{chunk-DWUVRWXD.js → chunk-3ZBDWWCV.js} +2 -2
  13. package/dist/{chunk-KAV2WHTG.js → chunk-5Z4ZXXX4.js} +2 -2
  14. package/dist/{chunk-UESYITH6.js → chunk-6PMLIVTI.js} +2 -2
  15. package/dist/{chunk-E5AD46HP.js → chunk-IBFGOAY3.js} +2 -2
  16. package/dist/{chunk-ZPKPIHMZ.js → chunk-IVY4OL7B.js} +69 -52
  17. package/dist/chunk-IVY4OL7B.js.map +1 -0
  18. package/dist/{chunk-VQOPBBBI.js → chunk-L2MTZMVH.js} +239 -152
  19. package/dist/chunk-L2MTZMVH.js.map +1 -0
  20. package/dist/{chunk-GCW57WYQ.js → chunk-PCXBTG5X.js} +3 -3
  21. package/dist/{chunk-4E3QCW6L.js → chunk-RGG5UGJD.js} +3 -1
  22. package/dist/chunk-RGG5UGJD.js.map +1 -0
  23. package/dist/{chunk-TDVYZEUI.js → chunk-SGGGE2F3.js} +126 -30
  24. package/dist/chunk-SGGGE2F3.js.map +1 -0
  25. package/dist/{chunk-MJOQP2ED.js → chunk-UHOVZI6B.js} +3 -3
  26. package/dist/{chunk-EUW6VPIK.js → chunk-WXMBD2O7.js} +11 -8
  27. package/dist/{chunk-EUW6VPIK.js.map → chunk-WXMBD2O7.js.map} +1 -1
  28. package/dist/{chunk-FAE7CXZO.js → chunk-XZD5KTM4.js} +11 -7
  29. package/dist/{chunk-FAE7CXZO.js.map → chunk-XZD5KTM4.js.map} +1 -1
  30. package/dist/{chunk-D7HMQLBO.js → chunk-ZRJS4MOQ.js} +2 -2
  31. package/dist/context-mention-palette/index.js +8 -8
  32. package/dist/i18n/index.d.ts +2 -0
  33. package/dist/i18n/index.js +2 -2
  34. package/dist/index.d.ts +5 -5
  35. package/dist/index.js +14 -14
  36. package/dist/index.js.map +1 -1
  37. package/dist/mention-search.js +6 -6
  38. package/dist/workbench/contribution.js +3 -3
  39. package/dist/workbench/index.js +3 -3
  40. package/dist/workbench/sessionTitle.js +2 -2
  41. package/package.json +12 -12
  42. package/dist/chunk-4E3QCW6L.js.map +0 -1
  43. package/dist/chunk-TDVYZEUI.js.map +0 -1
  44. package/dist/chunk-VQOPBBBI.js.map +0 -1
  45. package/dist/chunk-ZPKPIHMZ.js.map +0 -1
  46. /package/dist/{chunk-DWUVRWXD.js.map → chunk-3ZBDWWCV.js.map} +0 -0
  47. /package/dist/{chunk-KAV2WHTG.js.map → chunk-5Z4ZXXX4.js.map} +0 -0
  48. /package/dist/{chunk-UESYITH6.js.map → chunk-6PMLIVTI.js.map} +0 -0
  49. /package/dist/{chunk-E5AD46HP.js.map → chunk-IBFGOAY3.js.map} +0 -0
  50. /package/dist/{chunk-GCW57WYQ.js.map → chunk-PCXBTG5X.js.map} +0 -0
  51. /package/dist/{chunk-MJOQP2ED.js.map → chunk-UHOVZI6B.js.map} +0 -0
  52. /package/dist/{chunk-D7HMQLBO.js.map → chunk-ZRJS4MOQ.js.map} +0 -0
@@ -2,14 +2,17 @@ import {
2
2
  AgentGUIConversation_styles_default,
3
3
  MessageSquareMoreIcon,
4
4
  extractAgentMcpToolTarget
5
- } from "./chunk-MJOQP2ED.js";
5
+ } from "./chunk-UHOVZI6B.js";
6
6
  import {
7
7
  getOptionalAgentHostApi,
8
8
  useOptionalAgentHostApi
9
- } from "./chunk-UESYITH6.js";
9
+ } from "./chunk-6PMLIVTI.js";
10
+ import {
11
+ fileChangePathsFromChanges
12
+ } from "./chunk-F5UR6EJG.js";
10
13
  import {
11
14
  translate
12
- } from "./chunk-E5AD46HP.js";
15
+ } from "./chunk-IBFGOAY3.js";
13
16
 
14
17
  // shared/agentConversation/planImplementationPresentation.ts
15
18
  var PLAN_IMPLEMENTATION_PROMPT = "Implement the plan.";
@@ -256,49 +259,67 @@ function getPromptToolDetails(input) {
256
259
  }
257
260
  ] : [];
258
261
  const detailInput = resolveToolDetailInput(input);
262
+ const details = [...mcpDetails];
263
+ const fileChanges = fileChangePaths(detailInput);
264
+ const fileChangePresentation = presentFileChangePaths(fileChanges);
265
+ if (fileChanges.length > 0) {
266
+ details.push({
267
+ kind: "files",
268
+ value: fileChangePresentation.value
269
+ });
270
+ if (fileChangePresentation.directory) {
271
+ details.push({
272
+ kind: "directory",
273
+ value: fileChangePresentation.directory
274
+ });
275
+ }
276
+ }
259
277
  const command = commandStringValue(detailInput.command) ?? commandStringValue(detailInput.cmd);
260
278
  if (command) {
261
- return [
262
- ...mcpDetails,
263
- {
264
- kind: "command",
265
- value: command,
266
- ...stringValue(detailInput.description) ? { meta: stringValue(detailInput.description) } : {}
267
- }
268
- ];
279
+ details.push({
280
+ kind: "command",
281
+ value: command,
282
+ ...stringValue(detailInput.description) ? { meta: stringValue(detailInput.description) } : {}
283
+ });
269
284
  }
270
- const filePath = stringValue(detailInput.file_path) ?? stringValue(detailInput.filePath) ?? stringValue(detailInput.path) ?? stringValue(detailInput.notebook_path);
271
- if (filePath) {
285
+ const filePath = stringValue(detailInput.grantRoot) ?? stringValue(detailInput.file_path) ?? stringValue(detailInput.filePath) ?? stringValue(detailInput.path) ?? stringValue(detailInput.notebook_path);
286
+ if (filePath && !isRedundantFileChangePath(filePath, fileChanges)) {
272
287
  const lineRange = formatLineRange(detailInput);
273
- return [
274
- ...mcpDetails,
275
- {
276
- kind: "path",
277
- value: filePath,
278
- ...lineRange ? { meta: lineRange } : {}
279
- }
280
- ];
288
+ details.push({
289
+ kind: "path",
290
+ value: filePath,
291
+ ...lineRange ? { meta: lineRange } : {}
292
+ });
281
293
  }
282
294
  const query = stringValue(detailInput.query) ?? stringValue(detailInput.search_query) ?? stringValue(detailInput.searchQuery) ?? stringValue(detailInput.pattern);
283
295
  if (query) {
284
- return [
285
- ...mcpDetails,
286
- {
287
- kind: "query",
288
- value: query
289
- }
290
- ];
296
+ details.push({
297
+ kind: "query",
298
+ value: query
299
+ });
300
+ }
301
+ const reason = stringValue(detailInput.reason);
302
+ if (reason) {
303
+ details.push({
304
+ kind: "reason",
305
+ value: reason
306
+ });
291
307
  }
292
- return mcpDetails;
308
+ return details;
293
309
  }
294
310
  function isPromptRequestIdTitle(value) {
295
311
  return /^requestid\s*:/iu.test(value.trim());
296
312
  }
297
313
  function resolveToolDetailInput(input) {
314
+ if (fileChangePaths(input).length > 0) {
315
+ return input;
316
+ }
298
317
  const toolCall = objectValue(input.toolCall);
299
318
  return firstObjectValue(input, [
300
319
  "command",
301
320
  "cmd",
321
+ "reason",
322
+ "grantRoot",
302
323
  "file_path",
303
324
  "filePath",
304
325
  "path",
@@ -362,6 +383,75 @@ function commandStringValue(value) {
362
383
  function objectValue(value) {
363
384
  return value && typeof value === "object" && !Array.isArray(value) ? value : null;
364
385
  }
386
+ function fileChangePaths(input) {
387
+ const candidates = [
388
+ objectValue(input.fileChanges)?.files,
389
+ input.fileChanges,
390
+ input.files,
391
+ input.changes
392
+ ];
393
+ for (const candidate of candidates) {
394
+ const paths = fileChangePathsFromChanges(candidate);
395
+ if (paths.length > 0) {
396
+ return paths;
397
+ }
398
+ }
399
+ return [];
400
+ }
401
+ function presentFileChangePaths(paths) {
402
+ const uniquePaths = Array.from(
403
+ new Set(paths.map((path) => path.trim()).filter((path) => path.length > 0))
404
+ );
405
+ const directory = commonAbsoluteFileDirectory(uniquePaths);
406
+ const displayPaths = directory ? uniquePaths.map((path) => relativePathFromDirectory(path, directory)) : uniquePaths;
407
+ if (displayPaths.length <= 3) {
408
+ return { directory, value: displayPaths.join(", ") };
409
+ }
410
+ return {
411
+ directory,
412
+ value: `${displayPaths.slice(0, 3).join(", ")} +${displayPaths.length - 3} more`
413
+ };
414
+ }
415
+ function commonAbsoluteFileDirectory(paths) {
416
+ if (paths.length === 0) {
417
+ return null;
418
+ }
419
+ const normalized = paths.map(normalizeDisplayPath);
420
+ if (!normalized.every(isAbsoluteDisplayPath)) {
421
+ return null;
422
+ }
423
+ const directories = normalized.map(
424
+ (path) => path.slice(0, path.lastIndexOf("/"))
425
+ );
426
+ const firstParts = directories[0]?.split("/") ?? [];
427
+ let sharedLength = firstParts.length;
428
+ for (const directory of directories.slice(1)) {
429
+ const parts = directory.split("/");
430
+ sharedLength = Math.min(sharedLength, parts.length);
431
+ while (sharedLength > 0 && firstParts[sharedLength - 1] !== parts[sharedLength - 1]) {
432
+ sharedLength -= 1;
433
+ }
434
+ }
435
+ const shared = firstParts.slice(0, sharedLength).join("/");
436
+ return shared && shared !== "/" && !/^[A-Za-z]:$/u.test(shared) ? shared : null;
437
+ }
438
+ function relativePathFromDirectory(path, directory) {
439
+ const normalized = normalizeDisplayPath(path);
440
+ const prefix = `${directory}/`;
441
+ return normalized.startsWith(prefix) ? normalized.slice(prefix.length) : path;
442
+ }
443
+ function isRedundantFileChangePath(path, fileChanges) {
444
+ const normalizedPath = normalizeDisplayPath(path);
445
+ return fileChanges.some(
446
+ (candidate) => normalizeDisplayPath(candidate) === normalizedPath
447
+ );
448
+ }
449
+ function normalizeDisplayPath(path) {
450
+ return path.trim().replaceAll("\\", "/").replace(/\/+$/u, "");
451
+ }
452
+ function isAbsoluteDisplayPath(path) {
453
+ return path.startsWith("/") || /^[A-Za-z]:\//u.test(path);
454
+ }
365
455
  function numericValue(value) {
366
456
  return typeof value === "number" && Number.isFinite(value) ? value : null;
367
457
  }
@@ -505,12 +595,18 @@ function promptToolDetailLabel(kind) {
505
595
  switch (kind) {
506
596
  case "command":
507
597
  return translate("agentHost.agentTool.details.command");
598
+ case "directory":
599
+ return translate("agentHost.agentTool.details.scope");
600
+ case "files":
601
+ return translate("workspaceCanvas.nodeDockLabel.files");
508
602
  case "mcp":
509
603
  return translate("agentHost.agentTool.details.mcp");
510
604
  case "path":
511
605
  return translate("agentHost.agentTool.details.path");
512
606
  case "query":
513
607
  return translate("agentHost.agentTool.details.query");
608
+ case "reason":
609
+ return translate("agentHost.agentTool.details.summary");
514
610
  }
515
611
  }
516
612
  function isApprovalFeedbackOption(option) {
@@ -1338,4 +1434,4 @@ export {
1338
1434
  isPromptRequestIdTitle,
1339
1435
  AgentInteractivePromptSurface
1340
1436
  };
1341
- //# sourceMappingURL=chunk-TDVYZEUI.js.map
1437
+ //# sourceMappingURL=chunk-SGGGE2F3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/agentConversation/planImplementationPresentation.ts","../shared/agentConversation/agentPlanPromptDispatch.ts","../shared/agentConversation/approvalOptionPresentation.ts","../shared/agentConversation/promptToolDetails.ts","../shared/agentConversation/components/AgentAskUserPromptSurface.tsx","../shared/agentConversation/interactiveAnswerPayload.ts","../shared/agentConversation/components/interactivePromptPresentation.tsx","../shared/agentConversation/components/useAskUserAnswerFlow.ts","../shared/agentConversation/components/AgentInteractiveDecisionPromptSurfaces.tsx","../shared/agentConversation/components/AgentInteractivePromptSurface.tsx"],"sourcesContent":["import type { AgentConversationPromptVM } from \"./contracts/agentConversationVM\";\n\nexport const PLAN_IMPLEMENTATION_PROMPT = \"Implement the plan.\";\nexport const PLAN_IMPLEMENTATION_ACTION_IMPLEMENT = \"implement\";\nexport const PLAN_IMPLEMENTATION_ACTION_FEEDBACK = \"feedback\";\nexport const PLAN_IMPLEMENTATION_ACTION_SKIP = \"skip\";\n\nexport function planImplementationPromptFromPlanTurn(\n planTurnId: string,\n title: string\n): Extract<AgentConversationPromptVM, { kind: \"plan-implementation\" }> {\n return {\n kind: \"plan-implementation\",\n requestId: planTurnId,\n title\n };\n}\n\ninterface PlanTimelineItem {\n turnId?: string | null;\n occurredAtUnixMs?: number | null;\n createdAtUnixMs?: number | null;\n seq?: number | null;\n payload?: Record<string, unknown> | null;\n}\n\nfunction itemTime(item: PlanTimelineItem): number {\n return item.occurredAtUnixMs ?? item.createdAtUnixMs ?? item.seq ?? 0;\n}\n\nfunction isPlanItem(item: PlanTimelineItem): boolean {\n return item.payload?.messageKind === \"plan\";\n}\n\nexport function latestPlanTurnId(\n timelineItems: readonly PlanTimelineItem[]\n): string | null {\n let latestTurnId: string | null = null;\n let latestTime = Number.NEGATIVE_INFINITY;\n for (const item of timelineItems) {\n const turnId = item.turnId?.trim();\n if (!turnId) continue;\n const time = itemTime(item);\n if (time >= latestTime) {\n latestTime = time;\n latestTurnId = turnId;\n }\n }\n if (!latestTurnId) return null;\n return timelineItems.some(\n (item) => item.turnId?.trim() === latestTurnId && isPlanItem(item)\n )\n ? latestTurnId\n : null;\n}\n","import {\n selectPlanDecisionForTurn,\n selectWorkspaceAgentConsumerSession,\n type AgentSessionEngine,\n type AgentSessionEngineState\n} from \"@tutti-os/agent-activity-core\";\nimport {\n PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,\n PLAN_IMPLEMENTATION_ACTION_SKIP\n} from \"./planImplementationPresentation\";\n\nexport type AgentPlanPromptAction =\n | typeof PLAN_IMPLEMENTATION_ACTION_IMPLEMENT\n | typeof PLAN_IMPLEMENTATION_ACTION_FEEDBACK\n | typeof PLAN_IMPLEMENTATION_ACTION_SKIP;\n\nexport function selectAgentPlanPromptTurn(\n state: AgentSessionEngineState,\n agentSessionId: string,\n requestId: string\n) {\n const latestTurn = selectWorkspaceAgentConsumerSession(\n state,\n agentSessionId\n )?.latestTurn;\n return latestTurn?.turnId === requestId &&\n latestTurn.phase === \"settled\" &&\n latestTurn.outcome === \"completed\"\n ? latestTurn\n : null;\n}\n\nexport function dispatchAgentPlanPromptAction(input: {\n action: AgentPlanPromptAction;\n agentSessionId: string;\n engine: AgentSessionEngine;\n feedbackText?: string;\n nowUnixMs?: () => number;\n requestId: string;\n workspaceId: string;\n}): boolean {\n const turn = selectAgentPlanPromptTurn(\n input.engine.getSnapshot(),\n input.agentSessionId,\n input.requestId\n );\n if (!turn) return false;\n const scopeKey = [\n \"plan-implementation\",\n input.workspaceId,\n input.agentSessionId,\n turn.turnId\n ].join(\":\");\n if (input.action === PLAN_IMPLEMENTATION_ACTION_IMPLEMENT) {\n const existing = selectPlanDecisionForTurn(\n input.engine.getSnapshot(),\n input.agentSessionId,\n turn.turnId\n );\n input.engine.dispatch({\n type: \"plan/decisionRequested\",\n action: \"implement\",\n agentSessionId: input.agentSessionId,\n commandId: `plan-decision:${scopeKey}`,\n idempotencyKey: scopeKey,\n promptKind: \"plan-implementation\",\n requestId: input.requestId,\n turnId: turn.turnId,\n workspaceId: input.workspaceId,\n ...(existing?.status === \"failed\" || existing?.status === \"unknown\"\n ? { retry: true }\n : {}),\n timeoutMs: 30_000\n });\n return true;\n }\n if (input.action === PLAN_IMPLEMENTATION_ACTION_SKIP) {\n input.engine.dispatch({\n type: \"plan/skipped\",\n agentSessionId: input.agentSessionId,\n requestId: input.requestId,\n turnId: turn.turnId,\n workspaceId: input.workspaceId\n });\n return true;\n }\n const text = input.feedbackText?.trim() ?? \"\";\n if (!text) return false;\n const requestedAtUnixMs = (input.nowUnixMs ?? Date.now)();\n input.engine.dispatch({\n type: \"plan/feedbackRequested\",\n agentSessionId: input.agentSessionId,\n clientSubmitId: `${scopeKey}:feedback:${requestedAtUnixMs}`,\n content: [{ type: \"text\", text }],\n displayPrompt: text,\n expiresAtUnixMs: requestedAtUnixMs + 120_000,\n requestedAtUnixMs,\n requestId: input.requestId,\n runtimeContent: [{ type: \"text\", text }],\n turnId: turn.turnId,\n workspaceId: input.workspaceId\n });\n return true;\n}\n","import { translate } from \"../../i18n/index\";\n\nexport interface ApprovalOptionVisualPresentation {\n label: string;\n commandPrefix?: string;\n}\n\nexport function approvalOptionDisplayLabel(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): string {\n const idToken = normalizeApprovalOptionToken(option.id);\n const kindToken = normalizeApprovalOptionToken(option.kind);\n const label = option.label.trim();\n const specificTranslationKey = approvalOptionSpecificTranslationKey(\n idToken,\n label,\n intent\n );\n if (specificTranslationKey) {\n return translate(specificTranslationKey);\n }\n const providerLabelTranslation =\n approvalOptionProviderLabelTranslation(label);\n if (providerLabelTranslation) {\n return translate(\n providerLabelTranslation.key,\n providerLabelTranslation.params\n );\n }\n if (\n (idToken === \"allowonce\" || kindToken === \"allowonce\") &&\n isGenericAllowOnceLabel(label)\n ) {\n return translate(\"agentHost.agentGui.approvalOptions.allowOnce\");\n }\n if (isGenericAllowForSessionLabel(label)) {\n return translate(\"agentHost.agentGui.approvalOptions.allowForSession\");\n }\n if (\n (idToken === \"allowalways\" ||\n idToken === \"allowall\" ||\n kindToken === \"allowalways\") &&\n isGenericApprovalLabel(label)\n ) {\n return translate(\"agentHost.agentGui.approvalOptions.allowAlways\");\n }\n if (idToken === \"rejectalways\" || kindToken === \"rejectalways\") {\n return translate(\"agentHost.agentGui.approvalOptions.rejectAlways\");\n }\n if (\n idToken === \"rejectonce\" ||\n idToken === \"reject\" ||\n idToken === \"deny\" ||\n kindToken === \"rejectonce\" ||\n kindToken === \"reject\" ||\n kindToken === \"deny\"\n ) {\n return intent.feedback\n ? translate(\"agentHost.agentGui.approvalOptions.rejectWithFollowUp\")\n : translate(\"agentHost.agentGui.approvalOptions.rejectOnce\");\n }\n return label || option.id;\n}\n\nexport function approvalOptionVisualPresentation(\n option: {\n id: string;\n kind: string;\n label: string;\n },\n intent: { feedback?: boolean } = {}\n): ApprovalOptionVisualPresentation {\n const commandPrefix = approvalOptionCommandPrefix(option.label);\n if (commandPrefix) {\n return {\n label: translate(\n \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefixLead\"\n ),\n commandPrefix\n };\n }\n return {\n label: approvalOptionDisplayLabel(option, intent)\n };\n}\n\nexport function normalizeApprovalOptionToken(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction approvalOptionSpecificTranslationKey(\n token: string,\n label: string,\n intent: { feedback?: boolean } = {}\n): string | null {\n const labelToken = normalizeApprovalOptionToken(label);\n switch (token) {\n case \"approved\":\n return isGenericAllowOnceLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowOnce\"\n : null;\n case \"approvedforsession\":\n return isGenericAllowForSessionLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowForSession\"\n : null;\n case \"approvedalways\":\n return isGenericApprovalLabel(label)\n ? \"agentHost.agentGui.approvalOptions.allowAlways\"\n : null;\n case \"bypasspermissions\":\n return \"agentHost.agentGui.approvalOptions.bypassPermissions\";\n case \"auto\":\n return labelToken === \"yesanduseautomode\"\n ? \"agentHost.agentGui.approvalOptions.autoMode\"\n : null;\n case \"acceptedits\":\n return \"agentHost.agentGui.approvalOptions.acceptEdits\";\n case \"default\":\n return labelToken === \"yesandmanuallyapproveedits\"\n ? \"agentHost.agentGui.approvalOptions.manualApproval\"\n : null;\n case \"cancel\":\n return !intent.feedback && labelToken === \"cancel\"\n ? \"common.cancel\"\n : null;\n default:\n return null;\n }\n}\n\nfunction approvalOptionProviderLabelTranslation(\n label: string\n): { key: string; params: Record<string, string> } | null {\n const commandPrefix = approvalOptionCommandPrefix(label);\n if (commandPrefix) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForCommandPrefix\",\n params: { command: commandPrefix }\n };\n }\n\n const allowScopeMatch = label.match(/^Yes,\\s*and don't ask again for (.+)$/i);\n if (allowScopeMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.allowAlwaysForScope\",\n params: { scope: allowScopeMatch[1] }\n };\n }\n\n const alwaysAllowMatch = label.match(/^Always Allow\\s+(.+)$/i);\n if (alwaysAllowMatch?.[1]) {\n return {\n key: \"agentHost.agentGui.approvalOptions.alwaysAllowScope\",\n params: { scope: alwaysAllowMatch[1] }\n };\n }\n\n return null;\n}\n\nfunction approvalOptionCommandPrefix(label: string): string | null {\n const commandPrefixMatch = label.match(\n /^Yes,\\s*and don't ask again for commands that start with `([^`]+)`$/i\n );\n return commandPrefixMatch?.[1]?.trim() || null;\n}\n\nfunction isGenericApprovalLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allowalways\" ||\n token === \"allowall\" ||\n token === \"alwaysallow\" ||\n token === \"allowanddontaskagain\" ||\n token === \"yesanddontaskagain\"\n );\n}\n\nfunction isGenericAllowOnceLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"\" ||\n token === \"allow\" ||\n token === \"allowonce\" ||\n token === \"approve\" ||\n token === \"approveonce\" ||\n token === \"yes\" ||\n token === \"yesproceed\" ||\n token === \"yesandproceed\"\n );\n}\n\nfunction isGenericAllowForSessionLabel(label: string): boolean {\n const token = normalizeApprovalOptionToken(label);\n return (\n token === \"allowforthissession\" ||\n token === \"allowforsession\" ||\n token === \"approveforsession\"\n );\n}\n","import { extractAgentMcpToolTarget } from \"../agentMcpToolTarget\";\nimport { fileChangePathsFromChanges } from \"../workspaceAgentFileChangePayload\";\n\nexport interface PromptToolDetail {\n kind: \"command\" | \"directory\" | \"files\" | \"mcp\" | \"path\" | \"query\" | \"reason\";\n value: string;\n meta?: string;\n}\n\nexport function getPromptToolDetails(\n input: Record<string, unknown> | null\n): PromptToolDetail[] {\n if (!input) {\n return [];\n }\n const mcpTarget = extractAgentMcpToolTarget({ input });\n const mcpDetails: PromptToolDetail[] = mcpTarget\n ? [\n {\n kind: \"mcp\",\n value: mcpTarget.displayName,\n ...(mcpTarget.instruction ? { meta: mcpTarget.instruction } : {})\n }\n ]\n : [];\n const detailInput = resolveToolDetailInput(input);\n const details: PromptToolDetail[] = [...mcpDetails];\n const fileChanges = fileChangePaths(detailInput);\n const fileChangePresentation = presentFileChangePaths(fileChanges);\n if (fileChanges.length > 0) {\n details.push({\n kind: \"files\",\n value: fileChangePresentation.value\n });\n if (fileChangePresentation.directory) {\n details.push({\n kind: \"directory\",\n value: fileChangePresentation.directory\n });\n }\n }\n const command =\n commandStringValue(detailInput.command) ??\n commandStringValue(detailInput.cmd);\n if (command) {\n details.push({\n kind: \"command\",\n value: command,\n ...(stringValue(detailInput.description)\n ? { meta: stringValue(detailInput.description) as string }\n : {})\n });\n }\n const filePath =\n stringValue(detailInput.grantRoot) ??\n stringValue(detailInput.file_path) ??\n stringValue(detailInput.filePath) ??\n stringValue(detailInput.path) ??\n stringValue(detailInput.notebook_path);\n if (filePath && !isRedundantFileChangePath(filePath, fileChanges)) {\n const lineRange = formatLineRange(detailInput);\n details.push({\n kind: \"path\",\n value: filePath,\n ...(lineRange ? { meta: lineRange } : {})\n });\n }\n const query =\n stringValue(detailInput.query) ??\n stringValue(detailInput.search_query) ??\n stringValue(detailInput.searchQuery) ??\n stringValue(detailInput.pattern);\n if (query) {\n details.push({\n kind: \"query\",\n value: query\n });\n }\n const reason = stringValue(detailInput.reason);\n if (reason) {\n details.push({\n kind: \"reason\",\n value: reason\n });\n }\n return details;\n}\n\nexport function isPromptRequestIdTitle(value: string): boolean {\n return /^requestid\\s*:/iu.test(value.trim());\n}\n\nfunction resolveToolDetailInput(\n input: Record<string, unknown>\n): Record<string, unknown> {\n if (fileChangePaths(input).length > 0) {\n return input;\n }\n const toolCall = objectValue(input.toolCall);\n return (\n firstObjectValue(input, [\n \"command\",\n \"cmd\",\n \"reason\",\n \"grantRoot\",\n \"file_path\",\n \"filePath\",\n \"path\",\n \"notebook_path\",\n \"query\",\n \"search_query\",\n \"searchQuery\",\n \"pattern\"\n ]) ??\n firstObjectValue(toolCall, [\n \"input\",\n \"rawInput\",\n \"raw_input\",\n \"arguments\",\n \"args\"\n ]) ??\n toolCall ??\n input\n );\n}\n\nfunction firstObjectValue(\n input: Record<string, unknown> | null,\n keys: readonly string[]\n): Record<string, unknown> | null {\n if (!input) {\n return null;\n }\n if (keys.some((key) => stringValue(input[key]))) {\n return input;\n }\n for (const key of keys) {\n const value = objectValue(input[key]);\n if (value) {\n return value;\n }\n }\n return null;\n}\n\nfunction formatLineRange(input: Record<string, unknown>): string | null {\n const start = numericValue(input.startLine) ?? numericValue(input.start_line);\n const end = numericValue(input.endLine) ?? numericValue(input.end_line);\n if (start === null || end === null) {\n return null;\n }\n return start === end ? `L${start}` : `L${start}-${end}`;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction commandStringValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (!Array.isArray(value)) {\n return null;\n }\n const shellFlag = stringValue(value[value.length - 2]);\n const shellCommand = stringValue(value[value.length - 1]);\n if ((shellFlag === \"-c\" || shellFlag === \"-lc\") && shellCommand) {\n return shellCommand;\n }\n const parts = value.flatMap((part) => {\n const text = stringValue(part);\n return text ? [text] : [];\n });\n return parts.length > 0 ? parts.join(\" \") : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction fileChangePaths(input: Record<string, unknown>): string[] {\n const candidates = [\n objectValue(input.fileChanges)?.files,\n input.fileChanges,\n input.files,\n input.changes\n ];\n for (const candidate of candidates) {\n const paths = fileChangePathsFromChanges(candidate);\n if (paths.length > 0) {\n return paths;\n }\n }\n return [];\n}\n\nfunction presentFileChangePaths(paths: readonly string[]): {\n directory: string | null;\n value: string;\n} {\n const uniquePaths = Array.from(\n new Set(paths.map((path) => path.trim()).filter((path) => path.length > 0))\n );\n const directory = commonAbsoluteFileDirectory(uniquePaths);\n const displayPaths = directory\n ? uniquePaths.map((path) => relativePathFromDirectory(path, directory))\n : uniquePaths;\n if (displayPaths.length <= 3) {\n return { directory, value: displayPaths.join(\", \") };\n }\n return {\n directory,\n value: `${displayPaths.slice(0, 3).join(\", \")} +${displayPaths.length - 3} more`\n };\n}\n\nfunction commonAbsoluteFileDirectory(paths: readonly string[]): string | null {\n if (paths.length === 0) {\n return null;\n }\n const normalized = paths.map(normalizeDisplayPath);\n if (!normalized.every(isAbsoluteDisplayPath)) {\n return null;\n }\n const directories = normalized.map((path) =>\n path.slice(0, path.lastIndexOf(\"/\"))\n );\n const firstParts = directories[0]?.split(\"/\") ?? [];\n let sharedLength = firstParts.length;\n for (const directory of directories.slice(1)) {\n const parts = directory.split(\"/\");\n sharedLength = Math.min(sharedLength, parts.length);\n while (\n sharedLength > 0 &&\n firstParts[sharedLength - 1] !== parts[sharedLength - 1]\n ) {\n sharedLength -= 1;\n }\n }\n const shared = firstParts.slice(0, sharedLength).join(\"/\");\n return shared && shared !== \"/\" && !/^[A-Za-z]:$/u.test(shared)\n ? shared\n : null;\n}\n\nfunction relativePathFromDirectory(path: string, directory: string): string {\n const normalized = normalizeDisplayPath(path);\n const prefix = `${directory}/`;\n return normalized.startsWith(prefix) ? normalized.slice(prefix.length) : path;\n}\n\nfunction isRedundantFileChangePath(\n path: string,\n fileChanges: readonly string[]\n): boolean {\n const normalizedPath = normalizeDisplayPath(path);\n return fileChanges.some(\n (candidate) => normalizeDisplayPath(candidate) === normalizedPath\n );\n}\n\nfunction normalizeDisplayPath(path: string): string {\n return path.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/u, \"\");\n}\n\nfunction isAbsoluteDisplayPath(path: string): boolean {\n return path.startsWith(\"/\") || /^[A-Za-z]:\\//u.test(path);\n}\n\nfunction numericValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n","import type { JSX } from \"react\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport { MessageSquareMoreIcon } from \"../../../app/renderer/components/icons/MessageSquareMoreIcon\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { buildAskUserAnswerPayload } from \"../interactiveAnswerPayload\";\nimport type {\n AgentInteractivePromptSurfaceProps,\n AgentInteractivePromptVariant\n} from \"./AgentInteractivePromptSurface\";\nimport {\n interactiveOptionLabel,\n interactivePromptCardClassName,\n interactivePromptClassName,\n stripPromptTitlePunctuation\n} from \"./interactivePromptPresentation\";\nimport { useAskUserAnswerFlow } from \"./useAskUserAnswerFlow\";\n\ntype AskUserPrompt = Extract<AgentConversationPromptVM, { kind: \"ask-user\" }>;\n\ntype SharedAskUserSurfaceProps = Pick<\n AgentInteractivePromptSurfaceProps,\n \"edgeGlow\" | \"isSubmitting\" | \"labels\" | \"onSubmit\"\n> & {\n embedded?: boolean;\n prompt: AskUserPrompt;\n};\n\nexport function AgentAskUserPromptSurface({\n prompt,\n variant,\n ...props\n}: SharedAskUserSurfaceProps & {\n variant: AgentInteractivePromptVariant;\n}): JSX.Element {\n \"use memo\";\n const question = prompt.questions[0] ?? null;\n const useCompactQuickAnswer =\n variant === \"compact\" &&\n prompt.questions.length === 1 &&\n question !== null &&\n !question.multiSelect &&\n question.options.length > 0;\n\n if (useCompactQuickAnswer) {\n return (\n <CompactQuickAnswerSurface\n {...props}\n prompt={prompt}\n question={question}\n />\n );\n }\n\n return (\n <AskUserAnswerFlowSurface\n key={prompt.requestId}\n {...props}\n prompt={prompt}\n />\n );\n}\n\nfunction CompactQuickAnswerSurface({\n prompt,\n question,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit\n}: Omit<SharedAskUserSurfaceProps, \"labels\"> & {\n question: AskUserPrompt[\"questions\"][number];\n}): JSX.Element {\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: {\n ...buildAskUserAnswerPayload({\n [question.id]: option.label\n })\n }\n })\n }\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n </div>\n </section>\n );\n}\n\nfunction AskUserAnswerFlowSurface({\n prompt,\n embedded = false,\n edgeGlow = false,\n isSubmitting,\n onSubmit,\n labels\n}: SharedAskUserSurfaceProps): JSX.Element {\n \"use memo\";\n const flow = useAskUserAnswerFlow({\n isSubmitting,\n questions: prompt.questions\n });\n const question = flow.currentQuestion;\n\n if (!question) {\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div\n className={`${styles.interactivePromptLead} inline-flex items-center gap-1.5`}\n >\n <MessageSquareMoreIcon\n size={15}\n active\n aria-hidden=\"true\"\n className=\"shrink-0\"\n />\n {stripPromptTitlePunctuation(labels.waitingForAnswer)}\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <section className={interactivePromptClassName(embedded)}>\n <div className={interactivePromptCardClassName(edgeGlow)}>\n <div className={styles.interactivePromptHeader}>\n <span className={styles.interactivePromptLead}>\n {stripPromptTitlePunctuation(question.header)}\n </span>\n <span className={styles.interactivePromptMeta}>\n {flow.currentIndex + 1}/{prompt.questions.length}\n </span>\n </div>\n <div className={styles.interactivePromptQuestion}>\n {question.question}\n </div>\n {question.options.length > 0 ? (\n <div className={styles.interactivePromptOptions}>\n {question.options.map((option) => {\n const active = flow.selectedOptions.includes(option.label);\n return (\n <button\n key={option.label}\n type=\"button\"\n className={styles.interactiveOptionButton}\n data-active={active}\n aria-pressed={active}\n aria-label={interactiveOptionLabel(\n option.label,\n option.description\n )}\n disabled={isSubmitting}\n onClick={() => flow.toggleOption(option.label)}\n >\n <span className={styles.interactiveOptionTitle}>\n {option.label}\n </span>\n {option.description ? (\n <span className={styles.interactiveOptionDescription}>\n {option.description}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n ) : null}\n <textarea\n value={flow.freeText}\n placeholder={labels.answerPlaceholder}\n disabled={isSubmitting}\n className={styles.interactivePromptTextarea}\n onChange={(event) => flow.setFreeText(event.currentTarget.value)}\n />\n <div className={styles.interactivePromptActions}>\n {prompt.questions.length > 1 ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n disabled={isSubmitting || flow.currentIndex === 0}\n onClick={flow.goToPreviousQuestion}\n >\n {labels.previousQuestion}\n </Button>\n ) : null}\n {flow.isLastQuestion ? (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isSubmitting || !flow.allQuestionsAnswered}\n onClick={() =>\n onSubmit({\n requestId: prompt.requestId,\n action: \"submit\",\n payload: { ...flow.answerPayload }\n })\n }\n >\n {labels.submitAnswers}\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isSubmitting || !flow.currentQuestionAnswered}\n onClick={flow.goToNextQuestion}\n >\n {labels.nextQuestion}\n </Button>\n )}\n </div>\n </div>\n </section>\n );\n}\n","/**\n * Wire contract for the answer submitted back to an interactive `ask-user`\n * prompt. This payload crosses the renderer → daemon boundary (it rides\n * `submitInteractive({ action: \"submit\", payload })`), so its shape is a\n * cross-language contract, not an internal detail.\n *\n * Consumers that MUST stay in sync with this shape:\n * - daemon (Go) standard ACP adapter — forwards `answersByQuestionId` verbatim.\n * - daemon (Go) codex app-server adapter — `appServerUserInputAnswers` reshapes\n * `answersByQuestionId` into codex's `requestUserInput` response.\n *\n * Field semantics:\n * - `answersByQuestionId` is the canonical, machine-readable answer: question id\n * → the chosen option label(s) / free text. This is what providers consume.\n * - `answers` is a flat, human-readable display list (one entry per answered\n * question, multi-select joined). Never the source of truth for routing.\n *\n * Always build this with {@link buildAskUserAnswerPayload} so producers can't\n * drift on field names or which field is authoritative.\n */\nexport interface InteractiveAnswerPayload {\n answers: string[];\n answersByQuestionId: Record<string, string | string[]>;\n}\n\n/**\n * Builds the canonical interactive answer payload from the per-question answers.\n * `answers` is derived from `answersByQuestionId` (multi-select values joined)\n * so the two fields can never disagree.\n */\nexport function buildAskUserAnswerPayload(\n answersByQuestionId: Record<string, string | string[]>\n): InteractiveAnswerPayload {\n const answers = Object.values(answersByQuestionId).map((value) =>\n Array.isArray(value) ? value.join(\", \") : value\n );\n return { answers, answersByQuestionId };\n}\n","import type { JSX } from \"react\";\nimport { 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 \"directory\":\n return translate(\"agentHost.agentTool.details.scope\");\n case \"files\":\n return translate(\"workspaceCanvas.nodeDockLabel.files\");\n case \"mcp\":\n return translate(\"agentHost.agentTool.details.mcp\");\n case \"path\":\n return translate(\"agentHost.agentTool.details.path\");\n case \"query\":\n return translate(\"agentHost.agentTool.details.query\");\n case \"reason\":\n return translate(\"agentHost.agentTool.details.summary\");\n }\n}\n\nexport function isApprovalFeedbackOption(option: {\n id: string;\n kind: string;\n}): boolean {\n return (\n isDenyApprovalOptionToken(option.id) ||\n isDenyApprovalOptionToken(option.kind)\n );\n}\n\nexport function approvalFeedbackOptionId(\n options: readonly { id: string; kind: string }[]\n): string | null {\n const explicitFeedbackOption = options.find((option) =>\n isExplicitFeedbackDenyApprovalOption(option)\n );\n if (explicitFeedbackOption) {\n return explicitFeedbackOption.id;\n }\n return options.find(isApprovalFeedbackOption)?.id ?? null;\n}\n\nexport function isExplicitFeedbackDenyApprovalOption(option: {\n id: string;\n kind: string;\n}): boolean {\n for (const value of [option.id, option.kind]) {\n switch (normalizeApprovalOptionToken(value ?? \"\")) {\n case \"abort\":\n case \"cancel\":\n case \"cancelled\":\n case \"canceled\":\n case \"denywithfeedback\":\n case \"rejectwithfeedback\":\n return true;\n default:\n break;\n }\n }\n return false;\n}\n\nexport function isDenyApprovalOptionToken(\n value: string | null | undefined\n): boolean {\n switch (normalizeApprovalOptionToken(value ?? \"\")) {\n case \"abort\":\n case \"cancel\":\n case \"cancelled\":\n case \"canceled\":\n case \"deny\":\n case \"denied\":\n case \"reject\":\n case \"rejected\":\n case \"rejectonce\":\n case \"disallow\":\n case \"decline\":\n case \"declined\":\n case \"no\":\n return true;\n default:\n return false;\n }\n}\n\nexport function stripPromptTitlePunctuation(value: string): string {\n return value.trim().replace(/[.。]+$/u, \"\");\n}\n\nexport function interactiveOptionLabel(\n label: string,\n description: string | null | undefined\n): string {\n const trimmedDescription = description?.trim();\n return trimmedDescription ? `${label} ${trimmedDescription}` : label;\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { AgentAskUserQuestionVM } from \"../contracts/agentAskUserQuestionItemVM\";\nimport {\n buildAskUserAnswerPayload,\n type InteractiveAnswerPayload\n} from \"../interactiveAnswerPayload\";\n\nexport interface AskUserAnswerFlow {\n allQuestionsAnswered: boolean;\n answerPayload: InteractiveAnswerPayload;\n currentIndex: number;\n currentQuestion: AgentAskUserQuestionVM | null;\n currentQuestionAnswered: boolean;\n freeText: string;\n isLastQuestion: boolean;\n selectedOptions: string[];\n goToNextQuestion: () => void;\n goToPreviousQuestion: () => void;\n setFreeText: (value: string) => void;\n toggleOption: (optionLabel: string) => void;\n}\n\nfunction readOwnValue<T>(\n values: Record<string, T>,\n key: string,\n fallback: T\n): T {\n return Object.prototype.hasOwnProperty.call(values, key)\n ? values[key]!\n : fallback;\n}\n\nfunction writeOwnValue<T>(\n values: Record<string, T>,\n key: string,\n value: T\n): void {\n Object.defineProperty(values, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\n}\n\nexport function useAskUserAnswerFlow({\n isSubmitting,\n questions\n}: {\n isSubmitting: boolean;\n questions: AgentAskUserQuestionVM[];\n}): AskUserAnswerFlow {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [selectedByQuestionId, setSelectedByQuestionId] = useState<\n Record<string, string[]>\n >({});\n const [freeTextByQuestionId, setFreeTextByQuestionId] = useState<\n Record<string, string>\n >({});\n\n const currentQuestion = questions[currentIndex] ?? null;\n const selectedOptions = currentQuestion\n ? readOwnValue(selectedByQuestionId, currentQuestion.id, [])\n : [];\n const freeText = currentQuestion\n ? readOwnValue(freeTextByQuestionId, currentQuestion.id, \"\")\n : \"\";\n const currentQuestionAnswered =\n currentQuestion !== null &&\n (selectedOptions.length > 0 || freeText.trim() !== \"\");\n const isLastQuestion = currentIndex >= questions.length - 1;\n\n const answerPayload = useMemo(() => {\n const answersByQuestionId: Record<string, string | string[]> = {};\n for (const question of questions) {\n const selected = readOwnValue(selectedByQuestionId, question.id, []);\n const customAnswer = readOwnValue(\n freeTextByQuestionId,\n question.id,\n \"\"\n ).trim();\n if (question.multiSelect) {\n const answers = customAnswer ? [...selected, customAnswer] : selected;\n if (answers.length > 0) {\n writeOwnValue(answersByQuestionId, question.id, answers);\n }\n continue;\n }\n const answer = customAnswer || selected[0];\n if (answer) {\n writeOwnValue(answersByQuestionId, question.id, answer);\n }\n }\n return buildAskUserAnswerPayload(answersByQuestionId);\n }, [freeTextByQuestionId, questions, selectedByQuestionId]);\n\n const allQuestionsAnswered =\n questions.length > 0 &&\n questions.every((question) =>\n Object.prototype.hasOwnProperty.call(\n answerPayload.answersByQuestionId,\n question.id\n )\n );\n\n const toggleOption = useCallback(\n (optionLabel: string) => {\n if (isSubmitting || !currentQuestion) return;\n setSelectedByQuestionId((current) => {\n const existing = readOwnValue(current, currentQuestion.id, []);\n const next = currentQuestion.multiSelect\n ? existing.includes(optionLabel)\n ? existing.filter((value) => value !== optionLabel)\n : [...existing, optionLabel]\n : existing.includes(optionLabel)\n ? []\n : [optionLabel];\n const updated = { ...current };\n writeOwnValue(updated, currentQuestion.id, next);\n return updated;\n });\n },\n [currentQuestion, isSubmitting]\n );\n\n const setFreeText = useCallback(\n (value: string) => {\n if (isSubmitting || !currentQuestion) return;\n setFreeTextByQuestionId((current) => {\n const updated = { ...current };\n writeOwnValue(updated, currentQuestion.id, value);\n return updated;\n });\n },\n [currentQuestion, isSubmitting]\n );\n\n const goToPreviousQuestion = useCallback(() => {\n if (isSubmitting) return;\n setCurrentIndex((current) => Math.max(current - 1, 0));\n }, [isSubmitting]);\n\n const goToNextQuestion = useCallback(() => {\n if (isSubmitting || !currentQuestionAnswered) return;\n setCurrentIndex((current) => Math.min(current + 1, questions.length - 1));\n }, [currentQuestionAnswered, isSubmitting, questions.length]);\n\n return {\n allQuestionsAnswered,\n answerPayload,\n currentIndex,\n currentQuestion,\n currentQuestionAnswered,\n freeText,\n isLastQuestion,\n selectedOptions,\n goToNextQuestion,\n goToPreviousQuestion,\n setFreeText,\n toggleOption\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ShortcutBadge } from \"@tutti-os/ui-system\";\nimport {\n getOptionalAgentHostApi,\n useOptionalAgentHostApi\n} from \"../../../agentActivityHost\";\nimport {\n approvalOptionDisplayLabel,\n approvalOptionVisualPresentation\n} from \"../approvalOptionPresentation\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport {\n PLAN_IMPLEMENTATION_ACTION_FEEDBACK,\n PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,\n PLAN_IMPLEMENTATION_ACTION_SKIP\n} from \"../planImplementationPresentation\";\nimport type { AgentInteractivePromptSurfaceProps } from \"./AgentInteractivePromptSurface\";\nimport {\n approvalFeedbackOptionId,\n approvalOptionShortcutLabel,\n CommandTextWithTooltip,\n 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 type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { AgentAskUserPromptSurface } from \"./AgentAskUserPromptSurface\";\nimport {\n ApprovalPromptSurface,\n ExitPlanPromptSurface,\n PlanImplementationSurface\n} from \"./AgentInteractiveDecisionPromptSurfaces\";\n\n/**\n * Where the prompt is rendered, which sets its interaction budget:\n * - \"full\" (conversation / composer): the user is focused here, so every action\n * is shown — primary decisions plus rich follow-ups (feedback textareas,\n * multi-step wizards, \"stay in plan\").\n * - \"compact\" (message-center attention deck): a glanceable needs-attention card\n * across many sessions. Ask-user prompts retain the full answer flow in a\n * denser layout; other prompt kinds may intentionally limit secondary actions.\n */\nexport type AgentInteractivePromptVariant = \"full\" | \"compact\";\n\nexport interface AgentInteractivePromptSurfaceProps {\n prompt: AgentConversationPromptVM;\n variant?: AgentInteractivePromptVariant;\n edgeGlow?: boolean;\n keyboardShortcuts?: boolean;\n previewMode?: boolean;\n isSubmitting: boolean;\n onSubmit: (input: {\n requestId: string;\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n }) => void;\n labels: {\n approvalLead: string;\n planLead: string;\n planModes: Array<{ id: string; label: string; description: string }>;\n stayInPlan: string;\n sendFeedback: string;\n feedbackPlaceholder: string;\n previousQuestion: string;\n nextQuestion: string;\n submitAnswers: string;\n answerPlaceholder: string;\n waitingForAnswer: string;\n planImplementationLead: string;\n planImplementationConfirm: string;\n planImplementationFeedbackPlaceholder: string;\n planImplementationSend: string;\n planImplementationSkip: string;\n };\n}\n\nexport function AgentInteractivePromptSurface({\n prompt,\n variant = \"full\",\n edgeGlow = false,\n embedded = false,\n keyboardShortcuts = true,\n previewMode = false,\n isSubmitting,\n onSubmit,\n labels\n}: AgentInteractivePromptSurfaceProps & {\n embedded?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n\n if (prompt.kind === \"approval\") {\n return (\n <ApprovalPromptSurface\n prompt={prompt}\n embedded={embedded}\n edgeGlow={edgeGlow}\n keyboardShortcuts={keyboardShortcuts}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"exit-plan\") {\n return (\n <ExitPlanPromptSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n if (prompt.kind === \"plan-implementation\") {\n return (\n <PlanImplementationSurface\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n previewMode={previewMode}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n }\n return (\n <AgentAskUserPromptSurface\n key={prompt.requestId}\n prompt={prompt}\n variant={variant}\n embedded={embedded}\n edgeGlow={edgeGlow}\n isSubmitting={isSubmitting}\n onSubmit={onSubmit}\n labels={labels}\n />\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","useCallback","useMemo","useState","jsx","jsxs","useMemo","useState","useCallback","jsx"]}
@@ -2,14 +2,14 @@ import {
2
2
  getOptionalAgentHostApi,
3
3
  managedAgentRoundedIconUrl,
4
4
  useOptionalAgentHostApi
5
- } from "./chunk-UESYITH6.js";
5
+ } from "./chunk-6PMLIVTI.js";
6
6
  import {
7
7
  resolveAgentWorkspaceFileVisualKind
8
8
  } from "./chunk-PJP5BUU6.js";
9
9
  import {
10
10
  translate,
11
11
  useTranslation
12
- } from "./chunk-E5AD46HP.js";
12
+ } from "./chunk-IBFGOAY3.js";
13
13
  import {
14
14
  getAgentCustomMentionKind
15
15
  } from "./chunk-5X7YDOC6.js";
@@ -3740,4 +3740,4 @@ export {
3740
3740
  AgentMessageMarkdown,
3741
3741
  CustomScrollArea
3742
3742
  };
3743
- //# sourceMappingURL=chunk-MJOQP2ED.js.map
3743
+ //# sourceMappingURL=chunk-UHOVZI6B.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  isWorkspaceAgentSyntheticControlMessage,
7
7
  normalizeAgentSessionMentionTitle
8
- } from "./chunk-GCW57WYQ.js";
8
+ } from "./chunk-PCXBTG5X.js";
9
9
  import {
10
10
  resolveAgentMentionFileThumbnailUrl
11
11
  } from "./chunk-LUGELG5V.js";
@@ -18,14 +18,14 @@ import {
18
18
  import {
19
19
  getOptionalAgentHostApi,
20
20
  workspaceAgentProviderLabel
21
- } from "./chunk-UESYITH6.js";
21
+ } from "./chunk-6PMLIVTI.js";
22
22
  import {
23
23
  normalizeAgentTitleText
24
24
  } from "./chunk-MIJXEELH.js";
25
25
  import {
26
26
  translate,
27
27
  translateInUiLanguage
28
- } from "./chunk-E5AD46HP.js";
28
+ } from "./chunk-IBFGOAY3.js";
29
29
 
30
30
  // agent-gui/agentGuiNode/AgentMentionLabels.ts
31
31
  function agentMentionGroupLabel(groupId) {
@@ -1138,12 +1138,15 @@ async function runAgentMentionProviderQuery(input) {
1138
1138
  }
1139
1139
 
1140
1140
  // agent-gui/agentGuiNode/AgentMentionSearchIndex.ts
1141
+ import { referenceProvenanceFilterIsActive } from "@tutti-os/workspace-file-reference/core";
1141
1142
  async function fetchAgentMentionFilterResult(input) {
1142
1143
  const providerDiagnostics = [];
1143
- const agentFilterActive = input.provenanceFilter !== null && input.provenanceFilter.agentTargetIds !== null;
1144
+ const provenanceFilterActive = referenceProvenanceFilterIsActive(
1145
+ input.provenanceFilter
1146
+ );
1144
1147
  switch (input.filter) {
1145
1148
  case "file": {
1146
- const fileQuery = agentFilterActive ? Promise.resolve([]) : input.queryProviderMentionItemsById({
1149
+ const fileQuery = provenanceFilterActive ? Promise.resolve([]) : input.queryProviderMentionItemsById({
1147
1150
  providerId: FILE_PROVIDER_ID,
1148
1151
  workspaceId: input.workspaceId,
1149
1152
  currentUserId: input.currentUserId,
@@ -1153,7 +1156,7 @@ async function fetchAgentMentionFilterResult(input) {
1153
1156
  diagnostics: providerDiagnostics,
1154
1157
  provenanceFilter: input.provenanceFilter
1155
1158
  });
1156
- const agentGeneratedFileQuery = input.includeAgentGeneratedFiles || agentFilterActive ? input.queryProviderMentionItemsById({
1159
+ const agentGeneratedFileQuery = input.includeAgentGeneratedFiles || provenanceFilterActive ? input.queryProviderMentionItemsById({
1157
1160
  providerId: AGENT_GENERATED_FILE_PROVIDER_ID,
1158
1161
  workspaceId: input.workspaceId,
1159
1162
  currentUserId: input.currentUserId,
@@ -1201,7 +1204,7 @@ async function fetchAgentMentionFilterResult(input) {
1201
1204
  };
1202
1205
  }
1203
1206
  case "issue": {
1204
- const issueItems = agentFilterActive ? [] : await input.queryProviderMentionItemsById({
1207
+ const issueItems = provenanceFilterActive ? [] : await input.queryProviderMentionItemsById({
1205
1208
  providerId: WORKSPACE_ISSUE_PROVIDER_ID,
1206
1209
  workspaceId: input.workspaceId,
1207
1210
  currentUserId: input.currentUserId,
@@ -2152,4 +2155,4 @@ export {
2152
2155
  AgentMentionSearchController,
2153
2156
  preloadAgentMentionBrowse
2154
2157
  };
2155
- //# sourceMappingURL=chunk-EUW6VPIK.js.map
2158
+ //# sourceMappingURL=chunk-WXMBD2O7.js.map