@tutti-os/agent-gui 0.0.15 → 0.0.16

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 (50) hide show
  1. package/dist/AgentMentionSearchController-DqssJ2-b.d.ts +218 -0
  2. package/dist/agent-conversation/index.d.ts +3 -1
  3. package/dist/agent-conversation/index.js +5 -4
  4. package/dist/agent-conversation/index.js.map +1 -1
  5. package/dist/agent-message-center/index.d.ts +2 -1
  6. package/dist/agent-message-center/index.js +547 -287
  7. package/dist/agent-message-center/index.js.map +1 -1
  8. package/dist/app/renderer/agentactivity.css +144 -8
  9. package/dist/{chunk-H4HT3FE6.js → chunk-267VY3EJ.js} +40 -30
  10. package/dist/chunk-267VY3EJ.js.map +1 -0
  11. package/dist/{chunk-XHQGCP7A.js → chunk-CABHBFYH.js} +2 -2
  12. package/dist/{chunk-OFGXNXYT.js → chunk-EKATXC3W.js} +2 -2
  13. package/dist/{chunk-YKDFQADM.js → chunk-FJYH2ZPX.js} +177 -332
  14. package/dist/chunk-FJYH2ZPX.js.map +1 -0
  15. package/dist/{chunk-EK5RDKG7.js → chunk-GWR6WGZY.js} +21 -11
  16. package/dist/chunk-GWR6WGZY.js.map +1 -0
  17. package/dist/{chunk-7CBJJNX6.js → chunk-JNGYJ7GM.js} +2 -2
  18. package/dist/{chunk-7CBJJNX6.js.map → chunk-JNGYJ7GM.js.map} +1 -1
  19. package/dist/{chunk-U4F3COKL.js → chunk-KWPL3JYS.js} +83 -115
  20. package/dist/chunk-KWPL3JYS.js.map +1 -0
  21. package/dist/{chunk-2CA4NPP3.js → chunk-LW2S255I.js} +10 -7
  22. package/dist/{chunk-2CA4NPP3.js.map → chunk-LW2S255I.js.map} +1 -1
  23. package/dist/{chunk-SVOGXWFJ.js → chunk-LWRYYGPZ.js} +562 -468
  24. package/dist/chunk-LWRYYGPZ.js.map +1 -0
  25. package/dist/chunk-O5TUTXHT.js +196 -0
  26. package/dist/chunk-O5TUTXHT.js.map +1 -0
  27. package/dist/{chunk-KJPMZ7G5.js → chunk-SIDWRR5I.js} +39 -17
  28. package/dist/chunk-SIDWRR5I.js.map +1 -0
  29. package/dist/context-mention-palette/index.d.ts +5 -104
  30. package/dist/context-mention-palette/index.js +6 -5
  31. package/dist/i18n/index.d.ts +38 -16
  32. package/dist/i18n/index.js +1 -1
  33. package/dist/index.d.ts +22 -2
  34. package/dist/index.js +1825 -1303
  35. package/dist/index.js.map +1 -1
  36. package/dist/workbench/contribution.js +2 -2
  37. package/dist/workbench/index.d.ts +2 -1
  38. package/dist/workbench/index.js +2 -2
  39. package/dist/workbench/launch.js +1 -1
  40. package/dist/workspace-agent-generated-files.js +2 -2
  41. package/package.json +12 -12
  42. package/dist/agentFileMentionExtension-CM1c9bqk.d.ts +0 -86
  43. package/dist/chunk-EK5RDKG7.js.map +0 -1
  44. package/dist/chunk-H4HT3FE6.js.map +0 -1
  45. package/dist/chunk-KJPMZ7G5.js.map +0 -1
  46. package/dist/chunk-SVOGXWFJ.js.map +0 -1
  47. package/dist/chunk-U4F3COKL.js.map +0 -1
  48. package/dist/chunk-YKDFQADM.js.map +0 -1
  49. /package/dist/{chunk-XHQGCP7A.js.map → chunk-CABHBFYH.js.map} +0 -0
  50. /package/dist/{chunk-OFGXNXYT.js.map → chunk-EKATXC3W.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  translate,
3
3
  useTranslation
4
- } from "./chunk-KJPMZ7G5.js";
4
+ } from "./chunk-SIDWRR5I.js";
5
5
  import {
6
6
  resolveAgentMentionFileThumbnailUrl,
7
7
  resolveAgentMentionFileVisualKind
@@ -17,9 +17,16 @@ import { isRichTextTriggerPrefixBoundary } from "@tutti-os/ui-rich-text/editor";
17
17
  // agent-gui/agentGuiNode/agentRichText/AgentMentionNodeView.tsx
18
18
  import { useEffect, useState } from "react";
19
19
  import { NodeViewWrapper } from "@tiptap/react";
20
- import { MentionPill } from "@tutti-os/ui-system/components";
20
+ import {
21
+ MentionPill,
22
+ TruncatingPillLabel
23
+ } from "@tutti-os/ui-system/components";
21
24
  import { CloseIcon } from "@tutti-os/ui-system/icons";
22
25
  import { jsx, jsxs } from "react/jsx-runtime";
26
+ function parseFileCountAttr(value) {
27
+ const parsed = typeof value === "string" ? Number.parseInt(value.trim(), 10) : Number.NaN;
28
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
29
+ }
23
30
  function attrString(attrs, key) {
24
31
  const value = attrs[key];
25
32
  return typeof value === "string" ? value : "";
@@ -34,8 +41,8 @@ function normalizeKind(value) {
34
41
  if (value === "workspace-app") {
35
42
  return "workspace-app";
36
43
  }
37
- if (value === "workspace-app-bundle") {
38
- return "workspace-app-bundle";
44
+ if (value === "workspace-reference") {
45
+ return "workspace-reference";
39
46
  }
40
47
  if (value === "workspace-app-factory") {
41
48
  return "workspace-app-factory";
@@ -51,6 +58,15 @@ function buildMentionHref(resource, attrs) {
51
58
  workspaceId
52
59
  });
53
60
  }
61
+ if (resource === "workspace-reference") {
62
+ return buildAgentGenericMentionHref(resource, targetId, {
63
+ source: attrString(attrs, "source").trim(),
64
+ groupId: attrString(attrs, "groupId").trim(),
65
+ icon: attrString(attrs, "iconUrl").trim(),
66
+ count: attrString(attrs, "fileCount").trim(),
67
+ workspaceId
68
+ });
69
+ }
54
70
  if (resource === "workspace-app") {
55
71
  const appId = attrString(attrs, "appId").trim() || targetId;
56
72
  return buildAgentGenericMentionHref(resource, appId, { workspaceId });
@@ -167,16 +183,16 @@ function mentionViewModel(attrs, t) {
167
183
  label: name
168
184
  };
169
185
  }
170
- if (kind === "workspace-app-bundle") {
186
+ if (kind === "workspace-reference") {
171
187
  return {
172
188
  ariaLabel: `${t("agentHost.agentGui.mentionKindApp")} ${name}`.trim(),
173
189
  directoryPath: "",
174
190
  entryKind: "",
175
- href: href || buildMentionHref("workspace-app", attrs),
191
+ href: href || buildMentionHref("workspace-reference", attrs),
176
192
  iconUrl: attrString(attrs, "iconUrl").trim() || void 0,
177
193
  kind,
178
194
  label: name,
179
- fileCount: parseBundleFilesJson(attrs.filesJson).length
195
+ fileCount: parseFileCountAttr(attrs.fileCount)
180
196
  };
181
197
  }
182
198
  if (kind === "workspace-app-factory") {
@@ -376,13 +392,13 @@ function AgentMentionNodeView(props) {
376
392
  if (mention.kind === "file") {
377
393
  return /* @__PURE__ */ jsx(AgentMentionLegacyFileNodeView, { ...props });
378
394
  }
379
- if (mention.kind === "workspace-app" || mention.kind === "workspace-app-bundle") {
395
+ if (mention.kind === "workspace-app" || mention.kind === "workspace-reference") {
380
396
  return /* @__PURE__ */ jsx(
381
397
  NodeViewWrapper,
382
398
  {
383
399
  as: "span",
384
400
  "aria-label": mention.ariaLabel,
385
- className: `inline-flex max-w-full align-baseline ${selected ? "is-selected" : ""}`,
401
+ className: `inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] align-baseline ${selected ? "is-selected" : ""}`,
386
402
  contentEditable: false,
387
403
  "data-agent-file-mention": "true",
388
404
  "data-agent-mention-href": mention.href,
@@ -391,7 +407,7 @@ function AgentMentionNodeView(props) {
391
407
  children: /* @__PURE__ */ jsxs(
392
408
  "span",
393
409
  {
394
- className: "group relative top-[3px] inline-flex max-w-full cursor-default items-center gap-1 overflow-hidden rounded-[4px] border border-transparent bg-transparent px-1 py-0.5 align-baseline text-[13px] font-medium leading-5 text-[var(--accent)] no-underline transition-colors hover:border-transparent hover:bg-[color-mix(in_srgb,currentColor_12%,transparent)]",
410
+ className: "group relative top-[3px] inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] cursor-pointer items-center gap-1 overflow-hidden rounded-[4px] border border-transparent bg-transparent px-1 py-0.5 align-baseline text-[13px] font-medium leading-5 text-[var(--accent)] no-underline transition-colors hover:border-transparent hover:bg-[color-mix(in_srgb,currentColor_12%,transparent)]",
395
411
  "data-agent-mention-kind": mention.kind,
396
412
  "data-slot": "mention-pill",
397
413
  children: [
@@ -432,8 +448,7 @@ function AgentMentionNodeView(props) {
432
448
  ]
433
449
  }
434
450
  ),
435
- /* @__PURE__ */ jsx("span", { className: "min-w-0 overflow-hidden text-ellipsis whitespace-nowrap", children: mention.label }),
436
- mention.kind === "workspace-app-bundle" && mention.fileCount != null && mention.fileCount >= 0 ? /* @__PURE__ */ jsx("span", { className: "shrink-0 tabular-nums text-[var(--text-secondary)]", children: mention.fileCount }) : null
451
+ /* @__PURE__ */ jsx(TruncatingPillLabel, { tooltip: mention.label, children: mention.label })
437
452
  ]
438
453
  }
439
454
  )
@@ -444,7 +459,7 @@ function AgentMentionNodeView(props) {
444
459
  NodeViewWrapper,
445
460
  {
446
461
  as: "span",
447
- className: `inline-flex max-w-full align-baseline ${selected ? "is-selected" : ""}`,
462
+ className: `inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] align-baseline ${selected ? "is-selected" : ""}`,
448
463
  contentEditable: false,
449
464
  children: /* @__PURE__ */ jsx(
450
465
  MentionPill,
@@ -510,7 +525,9 @@ function createAgentFileMentionExtension(options = {}) {
510
525
  iconUrl: { default: "" },
511
526
  contentPreview: { default: "" },
512
527
  thumbnailUrl: { default: "" },
513
- filesJson: { default: "" }
528
+ source: { default: "" },
529
+ groupId: { default: "" },
530
+ fileCount: { default: "" }
514
531
  };
515
532
  },
516
533
  parseHTML() {
@@ -548,8 +565,8 @@ function createAgentFileMentionExtension(options = {}) {
548
565
  "data-agent-file-visual-kind": resolveAgentMentionFileVisualKind(item)
549
566
  } : {},
550
567
  ...options.renderAsLink ? { href } : {},
551
- ...(item.kind === "workspace-app" || item.kind === "workspace-app-bundle") && item.iconUrl ? { "data-agent-mention-icon-url": item.iconUrl } : {},
552
- ...item.kind === "workspace-app-bundle" ? { "data-agent-mention-files": JSON.stringify(item.files) } : {},
568
+ ...(item.kind === "workspace-app" || item.kind === "workspace-reference") && item.iconUrl ? { "data-agent-mention-icon-url": item.iconUrl } : {},
569
+ ...item.kind === "workspace-reference" ? { "data-agent-mention-file-count": String(item.fileCount) } : {},
553
570
  ...fileThumbnailUrl ? { "data-agent-mention-thumbnail-url": fileThumbnailUrl } : {},
554
571
  class: item.kind === "file" ? "tsh-agent-object-token tsh-agent-object-token--file" : "tsh-agent-object-token tsh-agent-object-token--entity"
555
572
  }),
@@ -724,12 +741,13 @@ function buildAgentWorkspaceAppMentionHref(workspaceId, appId) {
724
741
  workspaceId
725
742
  });
726
743
  }
727
- function buildAgentWorkspaceAppBundleMentionHref(workspaceId, appId, files, iconUrl) {
728
- const filesParam = files && files.length > 0 ? JSON.stringify(files.map((file) => file.path)) : void 0;
729
- return buildAgentGenericMentionHref2("workspace-app-bundle", appId, {
744
+ function buildAgentWorkspaceReferenceMentionHref(workspaceId, handle, options) {
745
+ return buildAgentGenericMentionHref2("workspace-reference", handle.id, {
730
746
  workspaceId,
731
- files: filesParam,
732
- icon: iconUrl?.trim() || void 0
747
+ source: handle.source,
748
+ groupId: handle.groupId?.trim() || void 0,
749
+ icon: options?.iconUrl?.trim() || void 0,
750
+ count: options?.fileCount != null && options.fileCount > 0 ? String(options.fileCount) : void 0
733
751
  });
734
752
  }
735
753
  function buildAgentWorkspaceAppFactoryMentionHref(workspaceId, jobId, input) {
@@ -761,78 +779,13 @@ function normalizeAgentSessionMentionTitle(value) {
761
779
  const withoutMentionPrefix = trimmed.replace(/^@+/, "").trim();
762
780
  return withoutMentionPrefix || trimmed;
763
781
  }
764
- function formatAgentFileMentionMarkdown(name, path) {
765
- return formatAgentMentionMarkdown({
766
- kind: "file",
767
- href: path,
768
- path,
769
- name,
770
- entryKind: "unknown",
771
- directoryPath: ""
772
- });
773
- }
774
- function formatAgentMentionMarkdown(item, mode = "display") {
775
- if (item.kind === "workspace-app-bundle") {
776
- if (mode === "agent" && item.files.length > 0) {
777
- return item.files.map(
778
- (file) => formatAgentFileMentionMarkdown(
779
- file.name || basenameFromPath(file.path),
780
- file.path
781
- )
782
- ).join(" ");
783
- }
784
- const bundleLabel = item.name.trim().startsWith("@") ? item.name : `@${item.name}`;
785
- return `[${escapeMarkdownLinkLabel(bundleLabel)}](${escapeMarkdownLinkTarget(item.href)})`;
786
- }
782
+ function formatAgentMentionMarkdown(item) {
787
783
  const label = item.name.trim().startsWith("@") ? item.name : `@${item.name}`;
788
784
  return `[${escapeMarkdownLinkLabel(label)}](${escapeMarkdownLinkTarget(item.href)})`;
789
785
  }
790
- function basenameFromPath(path) {
791
- const parts = path.split("/").filter(Boolean);
792
- return parts.length > 0 ? parts[parts.length - 1] ?? path : path;
793
- }
794
- function decodeBundleFilesParam(value) {
795
- if (typeof value !== "string" || !value.trim()) {
796
- return [];
797
- }
798
- try {
799
- const parsed = JSON.parse(value);
800
- if (!Array.isArray(parsed)) {
801
- return [];
802
- }
803
- return parsed.filter(
804
- (path) => typeof path === "string" && path.trim() !== ""
805
- ).map((path) => ({ path, name: basenameFromPath(path) }));
806
- } catch {
807
- return [];
808
- }
809
- }
810
- function parseBundleFilesJson(value) {
811
- if (typeof value !== "string" || !value.trim()) {
812
- return [];
813
- }
814
- try {
815
- const parsed = JSON.parse(value);
816
- if (!Array.isArray(parsed)) {
817
- return [];
818
- }
819
- return parsed.map((entry) => {
820
- if (!entry || typeof entry !== "object") {
821
- return null;
822
- }
823
- const path = entry.path;
824
- if (typeof path !== "string" || !path.trim()) {
825
- return null;
826
- }
827
- const name = entry.name;
828
- return {
829
- path,
830
- name: typeof name === "string" ? name : basenameFromPath(path)
831
- };
832
- }).filter((entry) => entry !== null);
833
- } catch {
834
- return [];
835
- }
786
+ function parseMentionFileCount(value) {
787
+ const parsed = typeof value === "number" ? value : typeof value === "string" ? Number.parseInt(value.trim(), 10) : Number.NaN;
788
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
836
789
  }
837
790
  function parseAgentMentionMarkdown(value, start = 0) {
838
791
  if (!value.startsWith("[", start)) {
@@ -972,19 +925,24 @@ function parseMentionItemFromHref(input) {
972
925
  name: input.name
973
926
  };
974
927
  }
975
- if (resource === "workspace-app-bundle") {
928
+ if (resource === "workspace-reference") {
976
929
  if (!workspaceId) {
977
930
  return null;
978
931
  }
932
+ const source = url.searchParams.get("source")?.trim();
933
+ if (source !== "app" && source !== "task") {
934
+ return null;
935
+ }
979
936
  return {
980
- kind: "workspace-app-bundle",
937
+ kind: "workspace-reference",
981
938
  href,
982
939
  workspaceId,
983
940
  targetId,
984
- appId: targetId,
941
+ source,
942
+ groupId: url.searchParams.get("groupId")?.trim() || void 0,
985
943
  name: input.name,
986
944
  iconUrl: url.searchParams.get("icon")?.trim() || void 0,
987
- files: decodeBundleFilesParam(url.searchParams.get("files"))
945
+ fileCount: parseMentionFileCount(url.searchParams.get("count"))
988
946
  };
989
947
  }
990
948
  if (resource === "workspace-app-factory") {
@@ -1044,16 +1002,17 @@ function mentionItemToAttrs(item) {
1044
1002
  iconUrl: item.iconUrl ?? ""
1045
1003
  };
1046
1004
  }
1047
- if (item.kind === "workspace-app-bundle") {
1005
+ if (item.kind === "workspace-reference") {
1048
1006
  return {
1049
1007
  name: item.name,
1050
1008
  kind: item.kind,
1051
1009
  href: item.href,
1052
1010
  ...workspaceMentionAttrs(item.workspaceId),
1053
1011
  targetId: item.targetId,
1054
- appId: item.appId ?? "",
1012
+ source: item.source,
1013
+ groupId: item.groupId ?? "",
1055
1014
  iconUrl: item.iconUrl ?? "",
1056
- filesJson: JSON.stringify(item.files)
1015
+ fileCount: String(item.fileCount)
1057
1016
  };
1058
1017
  }
1059
1018
  if (item.kind === "workspace-app-factory") {
@@ -1142,25 +1101,27 @@ function attrsToMentionItem(attrs) {
1142
1101
  iconUrl: typeof attrs.iconUrl === "string" && attrs.iconUrl.trim() ? attrs.iconUrl.trim() : void 0
1143
1102
  };
1144
1103
  }
1145
- if (kind === "workspace-app-bundle") {
1104
+ if (kind === "workspace-reference") {
1146
1105
  const workspaceId = workspaceIdFromMentionAttrs(attrs);
1147
- const appId = typeof attrs.appId === "string" && attrs.appId.trim() ? attrs.appId.trim() : typeof attrs.targetId === "string" ? attrs.targetId.trim() : "";
1148
- const files = parseBundleFilesJson(attrs.filesJson);
1149
- const bundleIconUrl = typeof attrs.iconUrl === "string" && attrs.iconUrl.trim() ? attrs.iconUrl.trim() : void 0;
1106
+ const targetId = typeof attrs.targetId === "string" ? attrs.targetId.trim() : "";
1107
+ const source = attrs.source === "task" ? "task" : "app";
1108
+ const groupId = typeof attrs.groupId === "string" && attrs.groupId.trim() ? attrs.groupId.trim() : void 0;
1109
+ const iconUrl = typeof attrs.iconUrl === "string" && attrs.iconUrl.trim() ? attrs.iconUrl.trim() : void 0;
1110
+ const fileCount = parseMentionFileCount(attrs.fileCount);
1150
1111
  return {
1151
1112
  kind,
1152
- href: href || buildAgentWorkspaceAppBundleMentionHref(
1113
+ href: href || buildAgentWorkspaceReferenceMentionHref(
1153
1114
  workspaceId,
1154
- appId,
1155
- files,
1156
- bundleIconUrl
1115
+ { source, id: targetId, groupId },
1116
+ { iconUrl, fileCount }
1157
1117
  ),
1158
1118
  workspaceId,
1159
- targetId: appId,
1160
- appId,
1119
+ targetId,
1120
+ source,
1121
+ groupId,
1161
1122
  name,
1162
- iconUrl: bundleIconUrl,
1163
- files
1123
+ iconUrl,
1124
+ fileCount
1164
1125
  };
1165
1126
  }
1166
1127
  if (kind === "workspace-app-factory") {
@@ -1211,14 +1172,14 @@ function parseAgentMentionHTMLElementAttrs(node) {
1211
1172
  const parsedItem = href ? parseMentionItemFromHref({ name, href }) : null;
1212
1173
  const parsedAttrs = parsedItem ? mentionItemToAttrs(parsedItem) : {};
1213
1174
  const iconUrl = node.getAttribute("data-agent-mention-icon-url") || "";
1214
- const filesJson = node.getAttribute("data-agent-mention-files") || "";
1175
+ const fileCount = node.getAttribute("data-agent-mention-file-count") || "";
1215
1176
  return {
1216
1177
  ...parsedAttrs,
1217
1178
  name,
1218
1179
  kind: node.getAttribute("data-agent-mention-kind") || node.getAttribute("kind") || parsedAttrs.kind || "file",
1219
1180
  href,
1220
1181
  ...iconUrl ? { iconUrl } : {},
1221
- ...filesJson ? { filesJson } : {}
1182
+ ...fileCount ? { fileCount } : {}
1222
1183
  };
1223
1184
  }
1224
1185
  function workspaceIdFromMentionUrl(url) {
@@ -1255,8 +1216,8 @@ function normalizeMentionKind(value) {
1255
1216
  if (value === "workspace-app") {
1256
1217
  return "workspace-app";
1257
1218
  }
1258
- if (value === "workspace-app-bundle") {
1259
- return "workspace-app-bundle";
1219
+ if (value === "workspace-reference") {
1220
+ return "workspace-reference";
1260
1221
  }
1261
1222
  if (value === "workspace-app-factory") {
1262
1223
  return "workspace-app-factory";
@@ -1292,6 +1253,12 @@ function mentionVisual(item) {
1292
1253
  primary: item.name
1293
1254
  };
1294
1255
  }
1256
+ if (item.kind === "workspace-reference") {
1257
+ return {
1258
+ kindLabel: "Reference",
1259
+ primary: item.name
1260
+ };
1261
+ }
1295
1262
  return {
1296
1263
  kindLabel: "Task",
1297
1264
  primary: item.name
@@ -1350,12 +1317,13 @@ export {
1350
1317
  buildAgentSessionMentionHref,
1351
1318
  buildAgentWorkspaceIssueMentionHref,
1352
1319
  buildAgentWorkspaceAppMentionHref,
1353
- buildAgentWorkspaceAppBundleMentionHref,
1320
+ buildAgentWorkspaceReferenceMentionHref,
1354
1321
  normalizeAgentSessionMentionTitle,
1355
1322
  formatAgentMentionMarkdown,
1356
1323
  parseAgentMentionMarkdown,
1324
+ parseMentionItemFromHref,
1357
1325
  mentionItemToAttrs,
1358
1326
  attrsToMentionItem,
1359
1327
  buildAgentGenericMentionHref2 as buildAgentGenericMentionHref
1360
1328
  };
1361
- //# sourceMappingURL=chunk-U4F3COKL.js.map
1329
+ //# sourceMappingURL=chunk-KWPL3JYS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../agent-gui/agentGuiNode/agentRichText/agentFileMentionExtension.ts","../agent-gui/agentGuiNode/agentRichText/AgentMentionNodeView.tsx"],"sourcesContent":["import { mergeAttributes, Node, type Editor, type Range } from \"@tiptap/core\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport Suggestion, { exitSuggestion } from \"@tiptap/suggestion\";\nimport { isRichTextTriggerPrefixBoundary } from \"@tutti-os/ui-rich-text/editor\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../../shared/mentionFilePresentation\";\nimport { translate } from \"../../../i18n/index\";\nimport { AgentMentionNodeView } from \"./AgentMentionNodeView\";\n\nexport type AgentFileMentionKind = \"file\" | \"directory\" | \"unknown\";\nexport type AgentMentionFileNavigationAction =\n | \"agent-generated-folder\"\n | \"agent-generated-folder-back\";\nexport type AgentMentionScope = \"my_sessions\" | \"collab_sessions\";\nexport type AgentMentionKind =\n | \"file\"\n | \"session\"\n | \"workspace-app\"\n | \"workspace-reference\"\n | \"workspace-app-factory\"\n | \"workspace-issue\";\n\n/** workspace-reference 句柄的来源(与 daemon `reference list --source` 一致)。 */\nexport type AgentMentionReferenceSource = \"app\" | \"task\";\n\nexport interface AgentMentionFileItem {\n kind: \"file\";\n path: string;\n href: string;\n name: string;\n entryKind: AgentFileMentionKind;\n directoryPath: string;\n score?: number;\n thumbnailUrl?: string | null;\n mentionNavigation?: AgentMentionFileNavigationAction;\n childCount?: number;\n}\n\nexport interface AgentMentionSessionItem {\n kind: \"session\";\n href: string;\n workspaceId: string;\n targetId: string;\n name: string;\n title: string;\n scope: AgentMentionScope;\n initiatorName: string;\n initiatorAvatarUrl?: string;\n agentName: string;\n status?: string;\n inputPreview?: string;\n summaryPreview?: string;\n updatedAtUnixMs?: number;\n}\n\nexport interface AgentMentionWorkspaceIssueItem {\n kind: \"workspace-issue\";\n href: string;\n workspaceId: string;\n targetId: string;\n topicId?: string;\n name: string;\n title: string;\n creatorName?: string;\n status?: string;\n contentPreview?: string;\n updatedAtUnixMs?: number;\n}\n\nexport interface AgentMentionWorkspaceAppItem {\n kind: \"workspace-app\";\n href: string;\n workspaceId: string;\n targetId: string;\n appId: string;\n name: string;\n description?: string;\n iconUrl?: string;\n /** 应用是否能够提供产物文件(reference),决定 @ 面板行末尾是否展示「查看产物文件」入口。 */\n referencesListSupported?: boolean;\n}\n\nexport interface AgentMentionWorkspaceReferenceItem {\n kind: \"workspace-reference\";\n href: string;\n workspaceId: string;\n /** URI path id:source=app 时为 appId,source=task 时为 topicId。 */\n targetId: string;\n source: AgentMentionReferenceSource;\n /** 子级 id:app 子分组 / issueId。缺省表示整个 app / topic。 */\n groupId?: string;\n name: string;\n iconUrl?: string;\n /** 展示用文件数(来自 picker 节点 childCount);序列化不再展开文件。 */\n fileCount: number;\n}\n\nexport interface AgentMentionWorkspaceAppFactoryItem {\n kind: \"workspace-app-factory\";\n href: string;\n workspaceId: string;\n targetId: string;\n jobId: string;\n name: string;\n action?: string;\n contextPath?: string;\n}\n\nexport type AgentContextMentionItem =\n | AgentMentionFileItem\n | AgentMentionSessionItem\n | AgentMentionWorkspaceAppItem\n | AgentMentionWorkspaceReferenceItem\n | AgentMentionWorkspaceAppFactoryItem\n | AgentMentionWorkspaceIssueItem;\n\nexport type AgentFileMentionItem = AgentContextMentionItem;\n\nexport interface AgentMentionSuggestionState {\n editor: Editor;\n range: Range;\n query: string;\n text: string;\n command: (item: AgentContextMentionItem) => void;\n clientRect?: (() => DOMRect | null) | null;\n}\n\nexport type AgentFileMentionSuggestionState = AgentMentionSuggestionState;\n\nexport interface AgentFileMentionExtensionOptions {\n enableSuggestions?: boolean;\n onSuggestionChange?: (state: AgentMentionSuggestionState | null) => void;\n onSuggestionKeyDown?: (event: KeyboardEvent) => boolean;\n removeActionAriaLabel?: string;\n renderAsLink?: boolean;\n}\n\nexport interface ParsedAgentMentionMarkdown {\n item: AgentContextMentionItem;\n end: number;\n}\n\nexport const agentFileMentionPluginKey = new PluginKey(\n \"agentFileMentionSuggestion\"\n);\n\nexport function exitAgentFileMentionSuggestion(editor: Editor): void {\n exitSuggestion(editor.view, agentFileMentionPluginKey);\n}\n\nexport function createAgentFileMentionExtension(\n options: AgentFileMentionExtensionOptions = {}\n): Node {\n return Node.create({\n name: \"agentFileMention\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: false,\n\n addOptions() {\n return options;\n },\n\n addAttributes() {\n return {\n name: { default: \"\" },\n kind: { default: \"file\" },\n href: { default: \"\" },\n path: { default: \"\" },\n entryKind: { default: \"unknown\" },\n directoryPath: { default: \"\" },\n workspaceId: { default: \"\" },\n targetId: { default: \"\" },\n scope: { default: \"\" },\n title: { default: \"\" },\n initiatorName: { default: \"\" },\n agentName: { default: \"\" },\n status: { default: \"\" },\n inputPreview: { default: \"\" },\n summaryPreview: { default: \"\" },\n creatorName: { default: \"\" },\n topicId: { default: \"\" },\n appId: { default: \"\" },\n jobId: { default: \"\" },\n action: { default: \"\" },\n contextPath: { default: \"\" },\n description: { default: \"\" },\n iconUrl: { default: \"\" },\n contentPreview: { default: \"\" },\n thumbnailUrl: { default: \"\" },\n source: { default: \"\" },\n groupId: { default: \"\" },\n fileCount: { default: \"\" }\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-agent-file-mention]\",\n getAttrs: parseAgentMentionHTMLElementAttrs\n },\n {\n tag: \"a[data-agent-file-mention]\",\n getAttrs: parseAgentMentionHTMLElementAttrs\n }\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const item = attrsToMentionItem(HTMLAttributes);\n const fileThumbnailUrl =\n item.kind === \"file\"\n ? resolveAgentMentionFileThumbnailUrl(item)\n : undefined;\n const href = item.href;\n const tagName = options.renderAsLink ? \"a\" : \"span\";\n const visual = mentionVisual(item);\n const sessionVisual =\n item.kind === \"session\" ? sessionMentionVisual(item) : null;\n const sharedAttributes = {\n \"data-agent-file-mention\": \"true\",\n \"data-agent-mention-href\": href,\n \"data-agent-mention-kind\": item.kind,\n \"aria-label\":\n item.kind === \"file\"\n ? visual.primary\n : `${visual.kindLabel} ${visual.primary}`.trim()\n };\n return [\n tagName,\n mergeAttributes(HTMLAttributes, {\n ...sharedAttributes,\n ...(item.kind === \"file\"\n ? {\n \"data-agent-file-entry-kind\": item.entryKind,\n \"data-agent-file-directory-path\": item.directoryPath,\n \"data-agent-file-visual-kind\":\n resolveAgentMentionFileVisualKind(item)\n }\n : {}),\n ...(options.renderAsLink ? { href } : {}),\n ...((item.kind === \"workspace-app\" ||\n item.kind === \"workspace-reference\") &&\n item.iconUrl\n ? { \"data-agent-mention-icon-url\": item.iconUrl }\n : {}),\n ...(item.kind === \"workspace-reference\"\n ? { \"data-agent-mention-file-count\": String(item.fileCount) }\n : {}),\n ...(fileThumbnailUrl\n ? { \"data-agent-mention-thumbnail-url\": fileThumbnailUrl }\n : {}),\n class:\n item.kind === \"file\"\n ? \"tsh-agent-object-token tsh-agent-object-token--file\"\n : \"tsh-agent-object-token tsh-agent-object-token--entity\"\n }),\n ...(item.kind === \"file\"\n ? [\n fileThumbnailUrl\n ? [\n \"span\",\n {\n class: \"agent-gui-node__mention-file-thumb\",\n \"data-agent-mention-file-thumb\": \"true\",\n \"aria-hidden\": \"true\"\n },\n [\n \"img\",\n {\n src: fileThumbnailUrl,\n alt: \"\",\n decoding: \"async\",\n loading: \"lazy\",\n draggable: \"false\"\n }\n ]\n ]\n : [\n \"span\",\n {\n class: \"tsh-agent-object-token__icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ],\n [\n \"span\",\n { class: \"tsh-agent-object-token__main\" },\n visual.primary\n ]\n ]\n : item.kind === \"session\"\n ? [\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind\",\n \"aria-hidden\": \"true\"\n },\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind-icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ]\n ],\n [\n \"span\",\n { class: \"tsh-agent-object-token__main\" },\n [\n \"span\",\n { class: \"tsh-agent-object-token__participant\" },\n sessionVisual?.participant ?? \"\"\n ],\n [\n \"span\",\n { class: \"tsh-agent-object-token__summary\" },\n sessionVisual?.summary ? ` ${sessionVisual.summary}` : \"\"\n ]\n ]\n ]\n : [\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind\",\n \"aria-hidden\": \"true\"\n },\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind-icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ]\n ],\n [\n \"span\",\n { class: \"tsh-agent-object-token__main\" },\n visual.primary\n ]\n ])\n ];\n },\n\n renderText({ node }) {\n return formatAgentMentionMarkdown(attrsToMentionItem(node.attrs ?? {}));\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(AgentMentionNodeView);\n },\n\n addProseMirrorPlugins() {\n if (options.enableSuggestions === false) {\n return [];\n }\n return [\n Suggestion<AgentContextMentionItem, AgentContextMentionItem>({\n editor: this.editor,\n pluginKey: agentFileMentionPluginKey,\n char: \"@\",\n allowedPrefixes: [\" \", \"\\n\", \"\\t\"],\n allowSpaces: true,\n items: () => [],\n allow: ({ state, range }) => {\n if (range.from <= 1) {\n return true;\n }\n const previous = state.doc.textBetween(\n range.from - 1,\n range.from,\n \"\\n\",\n \"\\n\"\n );\n return isRichTextTriggerPrefixBoundary(previous, \"whitespace\");\n },\n command: ({ editor, range, props }) => {\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: this.name,\n attrs: mentionItemToAttrs(props)\n },\n { type: \"text\", text: \" \" }\n ])\n .run();\n },\n render: () => ({\n onStart: (props) => {\n options.onSuggestionChange?.({\n editor: props.editor,\n range: props.range,\n query: props.query,\n text: props.text,\n command: props.command,\n clientRect: props.clientRect\n });\n },\n onUpdate: (props) => {\n options.onSuggestionChange?.({\n editor: props.editor,\n range: props.range,\n query: props.query,\n text: props.text,\n command: props.command,\n clientRect: props.clientRect\n });\n },\n onExit: () => {\n options.onSuggestionChange?.(null);\n },\n onKeyDown: (props) =>\n options.onSuggestionKeyDown?.(props.event) ?? false\n })\n })\n ];\n }\n });\n}\n\nexport function buildAgentSessionMentionHref(\n workspaceId: string,\n agentSessionId: string,\n _provider?: string | null\n): string {\n return buildAgentGenericMentionHref(\"agent-session\", agentSessionId, {\n workspaceId\n });\n}\n\nexport function buildAgentWorkspaceIssueMentionHref(\n workspaceId: string,\n issueId: string,\n input?: {\n mode?: \"breakdown\" | \"execute\";\n outputDir?: string | null;\n runId?: string | null;\n taskId?: string | null;\n topicId?: string | null;\n }\n): string {\n return buildAgentGenericMentionHref(\"workspace-issue\", issueId, {\n workspaceId,\n topicId: input?.topicId ?? undefined\n });\n}\n\nexport function buildAgentWorkspaceAppMentionHref(\n workspaceId: string,\n appId: string\n): string {\n return buildAgentGenericMentionHref(\"workspace-app\", appId, {\n workspaceId\n });\n}\n\nexport function buildAgentWorkspaceReferenceMentionHref(\n workspaceId: string,\n handle: {\n source: AgentMentionReferenceSource;\n id: string;\n groupId?: string | null;\n },\n options?: { iconUrl?: string | null; fileCount?: number }\n): string {\n // 只编可被 daemon/CLI 解析的领域句柄(source + id + groupId);不再夹带文件路径。\n // icon / count 仅供展示侧渲染(对话流图标、chip 文件数),不影响 agent 解析。\n return buildAgentGenericMentionHref(\"workspace-reference\", handle.id, {\n workspaceId,\n source: handle.source,\n groupId: handle.groupId?.trim() || undefined,\n icon: options?.iconUrl?.trim() || undefined,\n count:\n options?.fileCount != null && options.fileCount > 0\n ? String(options.fileCount)\n : undefined\n });\n}\n\nexport function buildAgentWorkspaceAppFactoryMentionHref(\n workspaceId?: string | null,\n jobId?: string | null,\n input?: { action?: string | null; contextPath?: string | null }\n): string {\n const params = new URLSearchParams();\n const trimmedWorkspaceId = workspaceId?.trim() ?? \"\";\n const trimmedJobId = jobId?.trim() ?? \"\";\n const action = input?.action?.trim() ?? \"\";\n const contextPath = input?.contextPath?.trim() ?? \"\";\n if (trimmedWorkspaceId) {\n params.set(\"workspaceId\", trimmedWorkspaceId);\n }\n if (trimmedJobId) {\n params.set(\"jobId\", trimmedJobId);\n }\n if (action) {\n params.set(\"action\", action);\n }\n if (contextPath) {\n params.set(\"contextPath\", contextPath);\n }\n return buildAgentGenericMentionHref(\n \"workspace-app-factory\",\n trimmedJobId || \"create\",\n Object.fromEntries(params)\n );\n}\n\nexport function normalizeAgentSessionMentionTitle(value: string): string {\n const trimmed = value.trim();\n const withoutMentionPrefix = trimmed.replace(/^@+/, \"\").trim();\n return withoutMentionPrefix || trimmed;\n}\n\nexport function formatAgentFileMentionMarkdown(\n name: string,\n path: string\n): string {\n return formatAgentMentionMarkdown({\n kind: \"file\",\n href: path,\n path,\n name,\n entryKind: \"unknown\",\n directoryPath: \"\"\n });\n}\n\nexport function formatAgentMentionMarkdown(\n item: AgentContextMentionItem\n): string {\n // 所有 entity(含 workspace-reference)统一序列化成单条 mention 链接。\n // workspace-reference 不再展开成文件路径——agent 拿到 URI 后经 skill+CLI 按需解析。\n const label = item.name.trim().startsWith(\"@\") ? item.name : `@${item.name}`;\n return `[${escapeMarkdownLinkLabel(label)}](${escapeMarkdownLinkTarget(item.href)})`;\n}\n\nfunction parseMentionFileCount(value: unknown): number {\n const parsed =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\"\n ? Number.parseInt(value.trim(), 10)\n : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;\n}\n\nexport function parseAgentMentionMarkdown(\n value: string,\n start = 0\n): ParsedAgentMentionMarkdown | null {\n if (!value.startsWith(\"[\", start)) {\n return null;\n }\n\n let index = start + 1;\n const prefixedMention = value[index] === \"@\";\n if (prefixedMention) {\n index += 1;\n }\n let name = \"\";\n while (index < value.length) {\n const current = value[index];\n if (current === \"\\\\\") {\n const escaped = value[index + 1];\n if (escaped === \"\\\\\" || escaped === \"[\" || escaped === \"]\") {\n name += escaped;\n index += 2;\n continue;\n }\n name += current;\n index += 1;\n continue;\n }\n if (current === \"]\") {\n break;\n }\n name += current;\n index += 1;\n }\n\n if (value[index] !== \"]\" || value[index + 1] !== \"(\") {\n return null;\n }\n\n index += 2;\n let href = \"\";\n while (index < value.length) {\n const current = value[index];\n if (current === \"\\\\\") {\n const escaped = value[index + 1];\n if (escaped === \"\\\\\" || escaped === \")\") {\n href += escaped;\n index += 2;\n continue;\n }\n href += current;\n index += 1;\n continue;\n }\n if (current === \")\") {\n const item = parseMentionItemFromHref({ name, href });\n if (!item) {\n return null;\n }\n if (\n item.kind !== \"file\" &&\n !prefixedMention &&\n !href.trim().toLowerCase().startsWith(\"mention://\")\n ) {\n return null;\n }\n return {\n item,\n end: index + 1\n };\n }\n href += current;\n index += 1;\n }\n\n return null;\n}\n\nexport function parseMentionItemFromHref(input: {\n name: string;\n href: string;\n}): AgentContextMentionItem | null {\n const href = input.href.trim();\n if (!href) {\n return null;\n }\n if (!href.startsWith(\"mention://\")) {\n return {\n kind: \"file\",\n href,\n path: href,\n name: input.name,\n entryKind: isLocalDirectoryMentionHref(href) ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromPath(href)\n };\n }\n\n let url: URL;\n try {\n url = new URL(href);\n } catch {\n return null;\n }\n const resource = url.hostname.trim().toLowerCase();\n if (!resource || hasLegacyMentionQueryParams(url)) {\n return null;\n }\n const targetId = decodeURIComponent(url.pathname.replace(/^\\/+/, \"\")).trim();\n if (!targetId) {\n return null;\n }\n const workspaceId = workspaceIdFromMentionUrl(url);\n if (resource === \"agent-session\") {\n if (!workspaceId) {\n return null;\n }\n return {\n kind: \"session\",\n href,\n workspaceId,\n targetId,\n name: input.name,\n title: input.name,\n scope: \"collab_sessions\",\n initiatorName: \"\",\n agentName: \"\"\n };\n }\n if (resource === \"workspace-issue\") {\n if (!workspaceId) {\n return null;\n }\n return {\n kind: \"workspace-issue\",\n href,\n workspaceId,\n targetId,\n topicId: url.searchParams.get(\"topicId\")?.trim() || undefined,\n name: input.name,\n title: input.name\n };\n }\n if (resource === \"workspace-app\") {\n if (!workspaceId) {\n return null;\n }\n return {\n kind: \"workspace-app\",\n href,\n workspaceId,\n targetId,\n appId: targetId,\n name: input.name\n };\n }\n if (resource === \"workspace-reference\") {\n if (!workspaceId) {\n return null;\n }\n const source = url.searchParams.get(\"source\")?.trim();\n if (source !== \"app\" && source !== \"task\") {\n return null;\n }\n return {\n kind: \"workspace-reference\",\n href,\n workspaceId,\n targetId,\n source,\n groupId: url.searchParams.get(\"groupId\")?.trim() || undefined,\n name: input.name,\n iconUrl: url.searchParams.get(\"icon\")?.trim() || undefined,\n fileCount: parseMentionFileCount(url.searchParams.get(\"count\"))\n };\n }\n if (resource === \"workspace-app-factory\") {\n return {\n kind: \"workspace-app-factory\",\n href,\n workspaceId,\n targetId,\n jobId: targetId === \"create\" ? \"\" : targetId,\n name:\n input.name ||\n translate(\"agentHost.agentGui.workspaceAppFactoryMentionFallback\"),\n action: url.searchParams.get(\"action\")?.trim() || undefined,\n contextPath: url.searchParams.get(\"contextPath\")?.trim() || undefined\n };\n }\n return null;\n}\n\nfunction isLocalDirectoryMentionHref(href: string): boolean {\n return href.endsWith(\"/\") && !/^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(href);\n}\n\nexport function mentionItemToAttrs(\n item: AgentContextMentionItem\n): Record<string, string> {\n if (item.kind === \"file\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n path: item.path,\n entryKind: item.entryKind,\n directoryPath: item.directoryPath,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl(item) ?? \"\"\n };\n }\n if (item.kind === \"session\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n scope: item.scope,\n title: item.title,\n initiatorName: item.initiatorName,\n agentName: item.agentName,\n status: item.status ?? \"\",\n inputPreview: item.inputPreview ?? \"\",\n summaryPreview: item.summaryPreview ?? \"\"\n };\n }\n if (item.kind === \"workspace-app\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n appId: item.appId,\n description: item.description ?? \"\",\n iconUrl: item.iconUrl ?? \"\"\n };\n }\n if (item.kind === \"workspace-reference\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n source: item.source,\n groupId: item.groupId ?? \"\",\n iconUrl: item.iconUrl ?? \"\",\n fileCount: String(item.fileCount)\n };\n }\n if (item.kind === \"workspace-app-factory\") {\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n jobId: item.jobId,\n action: item.action ?? \"\",\n contextPath: item.contextPath ?? \"\"\n };\n }\n return {\n name: item.name,\n kind: item.kind,\n href: item.href,\n ...workspaceMentionAttrs(item.workspaceId),\n targetId: item.targetId,\n topicId: item.topicId ?? \"\",\n title: item.title,\n creatorName: item.creatorName ?? \"\",\n status: item.status ?? \"\",\n contentPreview: item.contentPreview ?? \"\"\n };\n}\n\nfunction workspaceMentionAttrs(\n workspaceId: string\n): Pick<AgentMentionSessionItem, \"workspaceId\"> {\n const normalizedWorkspaceId = workspaceId.trim();\n return {\n workspaceId: normalizedWorkspaceId\n };\n}\n\nexport function attrsToMentionItem(\n attrs: Record<string, unknown>\n): AgentContextMentionItem {\n const kind = normalizeMentionKind(attrs.kind);\n const name = typeof attrs.name === \"string\" ? attrs.name : \"\";\n const href =\n typeof attrs.href === \"string\" && attrs.href.trim() ? attrs.href : \"\";\n if (kind === \"session\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const targetId = typeof attrs.targetId === \"string\" ? attrs.targetId : \"\";\n return {\n kind,\n href: href || buildAgentSessionMentionHref(workspaceId, targetId),\n workspaceId,\n targetId,\n name,\n title:\n typeof attrs.title === \"string\" && attrs.title.trim()\n ? attrs.title\n : name,\n scope:\n attrs.scope === \"my_sessions\" || attrs.scope === \"collab_sessions\"\n ? attrs.scope\n : \"collab_sessions\",\n initiatorName:\n typeof attrs.initiatorName === \"string\" ? attrs.initiatorName : \"\",\n agentName: typeof attrs.agentName === \"string\" ? attrs.agentName : \"\",\n status: typeof attrs.status === \"string\" ? attrs.status : undefined,\n inputPreview:\n typeof attrs.inputPreview === \"string\" ? attrs.inputPreview : undefined,\n summaryPreview:\n typeof attrs.summaryPreview === \"string\"\n ? attrs.summaryPreview\n : undefined\n };\n }\n if (kind === \"workspace-issue\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const targetId = typeof attrs.targetId === \"string\" ? attrs.targetId : \"\";\n const topicId =\n typeof attrs.topicId === \"string\" && attrs.topicId.trim()\n ? attrs.topicId.trim()\n : undefined;\n return {\n kind,\n href:\n href ||\n buildAgentWorkspaceIssueMentionHref(workspaceId, targetId, {\n topicId\n }),\n workspaceId,\n targetId,\n topicId,\n name,\n title:\n typeof attrs.title === \"string\" && attrs.title.trim()\n ? attrs.title\n : name,\n creatorName:\n typeof attrs.creatorName === \"string\" ? attrs.creatorName : undefined,\n status: typeof attrs.status === \"string\" ? attrs.status : undefined,\n contentPreview:\n typeof attrs.contentPreview === \"string\"\n ? attrs.contentPreview\n : undefined\n };\n }\n if (kind === \"workspace-app\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const appId =\n typeof attrs.appId === \"string\" && attrs.appId.trim()\n ? attrs.appId.trim()\n : typeof attrs.targetId === \"string\"\n ? attrs.targetId.trim()\n : \"\";\n return {\n kind,\n href: href || buildAgentWorkspaceAppMentionHref(workspaceId, appId),\n workspaceId,\n targetId: appId,\n appId,\n name,\n description:\n typeof attrs.description === \"string\" ? attrs.description : undefined,\n iconUrl:\n typeof attrs.iconUrl === \"string\" && attrs.iconUrl.trim()\n ? attrs.iconUrl.trim()\n : undefined\n };\n }\n if (kind === \"workspace-reference\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const targetId =\n typeof attrs.targetId === \"string\" ? attrs.targetId.trim() : \"\";\n const source: AgentMentionReferenceSource =\n attrs.source === \"task\" ? \"task\" : \"app\";\n const groupId =\n typeof attrs.groupId === \"string\" && attrs.groupId.trim()\n ? attrs.groupId.trim()\n : undefined;\n const iconUrl =\n typeof attrs.iconUrl === \"string\" && attrs.iconUrl.trim()\n ? attrs.iconUrl.trim()\n : undefined;\n const fileCount = parseMentionFileCount(attrs.fileCount);\n return {\n kind,\n href:\n href ||\n buildAgentWorkspaceReferenceMentionHref(\n workspaceId,\n { source, id: targetId, groupId },\n { iconUrl, fileCount }\n ),\n workspaceId,\n targetId,\n source,\n groupId,\n name,\n iconUrl,\n fileCount\n };\n }\n if (kind === \"workspace-app-factory\") {\n const workspaceId = workspaceIdFromMentionAttrs(attrs);\n const jobId =\n typeof attrs.jobId === \"string\" && attrs.jobId.trim()\n ? attrs.jobId.trim()\n : typeof attrs.targetId === \"string\"\n ? attrs.targetId.trim()\n : \"\";\n const action =\n typeof attrs.action === \"string\" && attrs.action.trim()\n ? attrs.action.trim()\n : undefined;\n const contextPath =\n typeof attrs.contextPath === \"string\" && attrs.contextPath.trim()\n ? attrs.contextPath.trim()\n : undefined;\n return {\n kind,\n href:\n href ||\n buildAgentWorkspaceAppFactoryMentionHref(workspaceId, jobId, {\n action,\n contextPath\n }),\n workspaceId,\n targetId: jobId,\n jobId,\n name,\n action,\n contextPath\n };\n }\n const path =\n typeof attrs.path === \"string\" && attrs.path.trim()\n ? attrs.path\n : typeof attrs.href === \"string\"\n ? attrs.href\n : \"\";\n return {\n kind: \"file\",\n href: href || path,\n path,\n name,\n entryKind: normalizeEntryKind(attrs.entryKind),\n directoryPath:\n typeof attrs.directoryPath === \"string\" && attrs.directoryPath.trim()\n ? attrs.directoryPath\n : dirnameFromPath(path),\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl({\n entryKind: normalizeEntryKind(attrs.entryKind),\n href: href || path,\n name,\n path,\n thumbnailUrl:\n typeof attrs.thumbnailUrl === \"string\" ? attrs.thumbnailUrl : undefined\n })\n };\n}\n\nfunction workspaceIdFromMentionAttrs(attrs: Record<string, unknown>): string {\n return typeof attrs.workspaceId === \"string\" ? attrs.workspaceId.trim() : \"\";\n}\n\nfunction parseAgentMentionHTMLElementAttrs(\n node: HTMLElement | string\n): Record<string, string> | false {\n if (typeof node === \"string\") {\n return false;\n }\n const href =\n node.getAttribute(\"data-agent-mention-href\") ||\n node.getAttribute(\"data-agent-link-href\") ||\n node.getAttribute(\"href\") ||\n \"\";\n const name =\n node.getAttribute(\"name\") ||\n (node.textContent ?? \"\").replace(/^@+/, \"\").trim();\n const parsedItem = href ? parseMentionItemFromHref({ name, href }) : null;\n const parsedAttrs = parsedItem ? mentionItemToAttrs(parsedItem) : {};\n const iconUrl = node.getAttribute(\"data-agent-mention-icon-url\") || \"\";\n const fileCount = node.getAttribute(\"data-agent-mention-file-count\") || \"\";\n return {\n ...parsedAttrs,\n name,\n kind:\n node.getAttribute(\"data-agent-mention-kind\") ||\n node.getAttribute(\"kind\") ||\n parsedAttrs.kind ||\n \"file\",\n href,\n ...(iconUrl ? { iconUrl } : {}),\n ...(fileCount ? { fileCount } : {})\n };\n}\n\nfunction workspaceIdFromMentionUrl(url: URL): string {\n return url.searchParams.get(\"workspaceId\")?.trim() ?? \"\";\n}\n\nexport function buildAgentGenericMentionHref(\n providerId: string,\n entityId: string,\n scope?: Readonly<Record<string, string | null | undefined>>\n): string {\n const normalizedProviderId = providerId.trim();\n const normalizedEntityId = entityId.trim();\n if (!normalizedProviderId || !normalizedEntityId) {\n return \"\";\n }\n const params = new URLSearchParams();\n Object.entries(scope ?? {})\n .map(([key, value]) => [key.trim(), value?.trim() ?? \"\"] as const)\n .filter(([key, value]) => key && value)\n .sort(([left], [right]) => left.localeCompare(right))\n .forEach(([key, value]) => {\n params.set(key, value);\n });\n const query = params.toString();\n const href = `mention://${encodeURIComponent(\n normalizedProviderId\n )}/${encodeURIComponent(normalizedEntityId)}`;\n return query ? `${href}?${query}` : href;\n}\n\nfunction hasLegacyMentionQueryParams(url: URL): boolean {\n return [...url.searchParams.keys()].some(\n (key) =>\n key === \"appId\" ||\n key === \"id\" ||\n key === \"kind\" ||\n key === \"link\" ||\n key === \"provider\" ||\n key === \"v\" ||\n key === \"version\" ||\n key.startsWith(\"meta.\")\n );\n}\n\nfunction normalizeMentionKind(value: unknown): AgentMentionKind {\n if (value === \"session\" || value === \"agent-session\") {\n return \"session\";\n }\n if (value === \"workspace-issue\") {\n return \"workspace-issue\";\n }\n if (value === \"workspace-app\") {\n return \"workspace-app\";\n }\n if (value === \"workspace-reference\") {\n return \"workspace-reference\";\n }\n if (value === \"workspace-app-factory\") {\n return \"workspace-app-factory\";\n }\n return \"file\";\n}\n\nfunction normalizeEntryKind(value: unknown): AgentFileMentionKind {\n return value === \"directory\" || value === \"file\" ? value : \"unknown\";\n}\n\nfunction mentionVisual(item: AgentContextMentionItem): {\n kindLabel: string;\n primary: string;\n} {\n if (item.kind === \"file\") {\n return {\n kindLabel: \"File\",\n primary: item.name\n };\n }\n if (item.kind === \"session\") {\n const visual = sessionMentionVisual(item);\n return {\n kindLabel: \"Session\",\n primary: `${visual.participant} ${visual.summary}`.trim()\n };\n }\n if (item.kind === \"workspace-app\") {\n return {\n kindLabel: \"App\",\n primary: item.name\n };\n }\n if (item.kind === \"workspace-app-factory\") {\n return {\n kindLabel: \"App Factory\",\n primary: item.name\n };\n }\n if (item.kind === \"workspace-reference\") {\n return {\n kindLabel: \"Reference\",\n primary: item.name\n };\n }\n return {\n kindLabel: \"Task\",\n primary: item.name\n };\n}\n\nfunction sessionMentionVisual(\n item: Extract<AgentContextMentionItem, { kind: \"session\" }>\n): {\n participant: string;\n summary: string;\n} {\n const initiatorName = item.initiatorName.trim();\n const agentName = item.agentName.trim();\n const title = normalizeAgentSessionMentionTitle(item.title);\n if (initiatorName && agentName) {\n const dottedTitle = parseDottedSessionMentionText(title);\n return {\n participant: `${initiatorName} & ${agentName}`,\n summary:\n dottedTitle?.summary ||\n (title && title !== item.name.trim()\n ? title\n : item.inputPreview?.trim() || \"\")\n };\n }\n\n const dottedName = parseDottedSessionMentionText(item.name);\n if (dottedName) {\n return {\n participant: dottedName.participant,\n summary: dottedName.summary\n };\n }\n\n return {\n participant: item.name.trim(),\n summary:\n title && title !== item.name.trim()\n ? title\n : item.inputPreview?.trim() || \"\"\n };\n}\n\nfunction parseDottedSessionMentionText(\n value: string\n): { participant: string; summary: string } | null {\n const parts = value\n .split(\"·\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (parts.length < 3) {\n return null;\n }\n return {\n participant: `${parts[0]} & ${parts[1]}`,\n summary: normalizeAgentSessionMentionTitle(parts.slice(2).join(\" \"))\n };\n}\n\nfunction dirnameFromPath(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n if (parts.length <= 1) {\n return path.startsWith(\"/\") ? \"/\" : \"\";\n }\n return `/${parts.slice(0, -1).join(\"/\")}`;\n}\n\nfunction escapeMarkdownLinkLabel(value: string): string {\n return value.replace(/([\\\\[\\]])/g, \"\\\\$1\");\n}\n\nfunction escapeMarkdownLinkTarget(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\)/g, \"\\\\)\");\n}\n","import { useEffect, useState, type JSX, type MouseEvent } from \"react\";\nimport { NodeViewWrapper, type NodeViewProps } from \"@tiptap/react\";\nimport {\n MentionPill,\n TruncatingPillLabel\n} from \"@tutti-os/ui-system/components\";\nimport { CloseIcon } from \"@tutti-os/ui-system/icons\";\nimport { useTranslation } from \"../../../i18n/index\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../../shared/mentionFilePresentation\";\n\ntype AgentMentionNodeViewKind =\n | \"file\"\n | \"session\"\n | \"workspace-app\"\n | \"workspace-reference\"\n | \"workspace-app-factory\"\n | \"workspace-issue\";\n\nfunction parseFileCountAttr(value: unknown): number {\n const parsed =\n typeof value === \"string\" ? Number.parseInt(value.trim(), 10) : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;\n}\n\ninterface AgentMentionNodeViewModel {\n ariaLabel: string;\n directoryPath: string;\n entryKind: string;\n href: string;\n iconUrl?: string;\n kind: AgentMentionNodeViewKind;\n label: string;\n summary?: string;\n thumbnailUrl?: string;\n /** 引用文件数量(workspace-reference 专用)。 */\n fileCount?: number;\n}\n\nfunction attrString(attrs: Record<string, unknown>, key: string): string {\n const value = attrs[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction normalizeKind(value: string): AgentMentionNodeViewKind {\n if (value === \"session\" || value === \"agent-session\") {\n return \"session\";\n }\n if (value === \"workspace-issue\") {\n return \"workspace-issue\";\n }\n if (value === \"workspace-app\") {\n return \"workspace-app\";\n }\n if (value === \"workspace-reference\") {\n return \"workspace-reference\";\n }\n if (value === \"workspace-app-factory\") {\n return \"workspace-app-factory\";\n }\n return \"file\";\n}\n\nfunction buildMentionHref(\n resource:\n | \"agent-session\"\n | \"workspace-app\"\n | \"workspace-reference\"\n | \"workspace-app-factory\"\n | \"workspace-issue\",\n attrs: Record<string, unknown>\n): string {\n const workspaceId = attrString(attrs, \"workspaceId\").trim();\n const targetId = attrString(attrs, \"targetId\").trim();\n if (resource === \"workspace-issue\") {\n return buildAgentGenericMentionHref(resource, targetId, {\n topicId: attrString(attrs, \"topicId\").trim(),\n workspaceId\n });\n }\n if (resource === \"workspace-reference\") {\n return buildAgentGenericMentionHref(resource, targetId, {\n source: attrString(attrs, \"source\").trim(),\n groupId: attrString(attrs, \"groupId\").trim(),\n icon: attrString(attrs, \"iconUrl\").trim(),\n count: attrString(attrs, \"fileCount\").trim(),\n workspaceId\n });\n }\n if (resource === \"workspace-app\") {\n const appId = attrString(attrs, \"appId\").trim() || targetId;\n return buildAgentGenericMentionHref(resource, appId, { workspaceId });\n }\n if (resource === \"workspace-app-factory\") {\n const jobId = attrString(attrs, \"jobId\").trim() || targetId;\n return buildAgentGenericMentionHref(resource, jobId || \"create\", {\n action: attrString(attrs, \"action\").trim(),\n contextPath: attrString(attrs, \"contextPath\").trim(),\n workspaceId\n });\n }\n return buildAgentGenericMentionHref(resource, targetId, { workspaceId });\n}\n\nfunction buildAgentGenericMentionHref(\n providerId: string,\n entityId: string,\n scope?: Readonly<Record<string, string | null | undefined>>\n): string {\n const normalizedProviderId = providerId.trim();\n const normalizedEntityId = entityId.trim();\n if (!normalizedProviderId || !normalizedEntityId) {\n return \"\";\n }\n const params = new URLSearchParams();\n Object.entries(scope ?? {})\n .map(([key, value]) => [key.trim(), value?.trim() ?? \"\"] as const)\n .filter(([key, value]) => key && value)\n .sort(([left], [right]) => left.localeCompare(right))\n .forEach(([key, value]) => {\n params.set(key, value);\n });\n const query = params.toString();\n const href = `mention://${encodeURIComponent(\n normalizedProviderId\n )}/${encodeURIComponent(normalizedEntityId)}`;\n return query ? `${href}?${query}` : href;\n}\n\nfunction normalizeSessionTitle(value: string): string {\n const trimmed = value.trim();\n const withoutMentionPrefix = trimmed.replace(/^@+/, \"\").trim();\n return withoutMentionPrefix || trimmed;\n}\n\nfunction parseDottedSessionText(\n value: string\n): { participant: string; summary: string } | null {\n const parts = value\n .split(\"·\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (parts.length < 3) {\n return null;\n }\n return {\n participant: `${parts[0]} & ${parts[1]}`,\n summary: normalizeSessionTitle(parts.slice(2).join(\" \"))\n };\n}\n\nfunction sessionPresentation(attrs: Record<string, unknown>): {\n label: string;\n summary: string;\n} {\n const name = attrString(attrs, \"name\").trim();\n const initiatorName = attrString(attrs, \"initiatorName\").trim();\n const agentName = attrString(attrs, \"agentName\").trim();\n const title = normalizeSessionTitle(attrString(attrs, \"title\") || name);\n const inputPreview = attrString(attrs, \"inputPreview\").trim();\n\n if (initiatorName && agentName) {\n const dottedTitle = parseDottedSessionText(title);\n return {\n // i18n-check-ignore: Dynamic participant display names.\n label: `${initiatorName} & ${agentName}`,\n summary:\n dottedTitle?.summary || (title && title !== name ? title : inputPreview)\n };\n }\n\n const dottedName = parseDottedSessionText(name);\n if (dottedName) {\n return {\n label: dottedName.participant,\n summary: dottedName.summary\n };\n }\n\n return {\n label: name,\n summary: title && title !== name ? title : inputPreview\n };\n}\n\nfunction dirnameFromPath(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n if (parts.length <= 1) {\n return path.startsWith(\"/\") ? \"/\" : \"\";\n }\n return `/${parts.slice(0, -1).join(\"/\")}`;\n}\n\nfunction mentionViewModel(\n attrs: Record<string, unknown>,\n t: (key: string) => string\n): AgentMentionNodeViewModel {\n const kind = normalizeKind(attrString(attrs, \"kind\"));\n const name = attrString(attrs, \"name\");\n const href = attrString(attrs, \"href\");\n\n if (kind === \"session\") {\n const presentation = sessionPresentation(attrs);\n const primary = `${presentation.label} ${presentation.summary}`.trim();\n return {\n ariaLabel:\n `${t(\"agentHost.agentGui.mentionKindSession\")} ${primary}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href: href || buildMentionHref(\"agent-session\", attrs),\n kind,\n label: presentation.label,\n summary: presentation.summary\n };\n }\n\n if (kind === \"workspace-issue\") {\n return {\n ariaLabel: `${t(\"agentHost.agentGui.mentionKindIssue\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href: href || buildMentionHref(\"workspace-issue\", attrs),\n kind,\n label: name\n };\n }\n\n if (kind === \"workspace-app\") {\n return {\n ariaLabel: `${t(\"agentHost.agentGui.mentionKindApp\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href: href || buildMentionHref(\"workspace-app\", attrs),\n iconUrl: attrString(attrs, \"iconUrl\").trim() || undefined,\n kind,\n label: name\n };\n }\n\n if (kind === \"workspace-reference\") {\n return {\n ariaLabel: `${t(\"agentHost.agentGui.mentionKindApp\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href: href || buildMentionHref(\"workspace-reference\", attrs),\n iconUrl: attrString(attrs, \"iconUrl\").trim() || undefined,\n kind,\n label: name,\n fileCount: parseFileCountAttr(attrs.fileCount)\n };\n }\n\n if (kind === \"workspace-app-factory\") {\n return {\n ariaLabel:\n `${t(\"agentHost.agentGui.mentionKindAppFactory\")} ${name}`.trim(),\n directoryPath: \"\",\n entryKind: \"\",\n href: href || buildMentionHref(\"workspace-app-factory\", attrs),\n kind,\n label: name\n };\n }\n\n const path = attrString(attrs, \"path\") || href;\n const entryKind = attrString(attrs, \"entryKind\") || \"unknown\";\n return {\n ariaLabel: name,\n directoryPath: attrString(attrs, \"directoryPath\") || dirnameFromPath(path),\n entryKind,\n href: href || path,\n kind,\n label: name,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl({\n entryKind,\n href: href || path,\n name,\n path,\n thumbnailUrl: attrString(attrs, \"thumbnailUrl\")\n })\n };\n}\n\nfunction fileVisualKind(entryKind: string, path: string): string {\n return resolveAgentMentionFileVisualKind({ entryKind, path });\n}\n\nfunction hasPromptContentAfterMentionRemoval(\n doc: NodeViewProps[\"editor\"][\"state\"][\"doc\"]\n): boolean {\n let hasContent = false;\n doc.descendants((node) => {\n if (hasContent) {\n return false;\n }\n if (node.type.name === \"agentFileMention\") {\n hasContent = true;\n return false;\n }\n if (node.isText && node.textContent.trim().length > 0) {\n hasContent = true;\n return false;\n }\n return true;\n });\n return hasContent;\n}\n\nfunction AgentMentionLegacyFileNodeView({\n deleteNode,\n editor,\n extension,\n node,\n selected\n}: NodeViewProps): JSX.Element {\n const mention = mentionViewModel(node.attrs ?? {}, () => \"\");\n const [isEditable, setIsEditable] = useState(editor.isEditable);\n const extensionOptions = extension.options as {\n removeActionAriaLabel?: string;\n };\n const removeActionAriaLabel =\n typeof extensionOptions.removeActionAriaLabel === \"string\"\n ? extensionOptions.removeActionAriaLabel\n : undefined;\n\n useEffect(() => {\n const syncEditable = () => {\n setIsEditable(editor.isEditable);\n };\n\n syncEditable();\n editor.on(\"transaction\", syncEditable);\n editor.on(\"update\", syncEditable);\n return () => {\n editor.off(\"transaction\", syncEditable);\n editor.off(\"update\", syncEditable);\n };\n }, [editor]);\n\n const handleRemove = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (!editor.isEditable) {\n return;\n }\n deleteNode();\n if (!hasPromptContentAfterMentionRemoval(editor.state.doc)) {\n editor.commands.clearContent();\n }\n };\n\n return (\n <NodeViewWrapper\n as=\"span\"\n aria-label={mention.ariaLabel}\n className={`group tsh-agent-object-token tsh-agent-object-token--file ${\n selected ? \"is-selected\" : \"\"\n }`}\n contentEditable={false}\n data-agent-file-directory-path={mention.directoryPath}\n data-agent-file-entry-kind={mention.entryKind}\n data-agent-file-mention=\"true\"\n {...(mention.thumbnailUrl\n ? {}\n : {\n \"data-agent-file-visual-kind\": fileVisualKind(\n mention.entryKind,\n mention.href || mention.label\n )\n })}\n data-agent-mention-href={mention.href}\n data-agent-mention-kind={mention.kind}\n {...(mention.thumbnailUrl\n ? { \"data-agent-mention-thumbnail-url\": mention.thumbnailUrl }\n : {})}\n >\n {mention.thumbnailUrl ? (\n <span\n className=\"agent-gui-node__mention-file-thumb relative\"\n data-agent-mention-file-thumb=\"true\"\n aria-hidden={isEditable ? undefined : true}\n >\n <img\n src={mention.thumbnailUrl}\n alt=\"\"\n className={`h-full w-full object-cover transition-opacity ${\n isEditable\n ? \"group-hover:opacity-0 group-focus-within:opacity-0\"\n : \"\"\n }`}\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n {isEditable ? (\n <button\n aria-label={removeActionAriaLabel}\n className=\"absolute left-1/2 top-1/2 inline-flex size-5 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-opacity hover:bg-transparency-block hover:text-[var(--text-primary)] focus-visible:opacity-100 group-hover:opacity-100\"\n type=\"button\"\n onMouseDown={handleRemove}\n >\n <CloseIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n ) : (\n <span\n className=\"relative grid size-4 shrink-0 place-items-center\"\n aria-hidden={isEditable ? undefined : true}\n >\n <span\n className={`tsh-agent-object-token__icon transition-opacity ${\n isEditable\n ? \"group-hover:opacity-0 group-focus-within:opacity-0\"\n : \"\"\n }`}\n aria-hidden=\"true\"\n />\n {isEditable ? (\n <button\n aria-label={removeActionAriaLabel}\n className=\"absolute left-1/2 top-1/2 inline-flex size-5 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-opacity hover:bg-transparency-block hover:text-[var(--text-primary)] focus-visible:opacity-100 group-hover:opacity-100\"\n type=\"button\"\n onMouseDown={handleRemove}\n >\n <CloseIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n )}\n <span className=\"tsh-agent-object-token__main\">{mention.label}</span>\n </NodeViewWrapper>\n );\n}\n\nexport function AgentMentionNodeView(props: NodeViewProps): JSX.Element {\n const { deleteNode, editor, extension, node, selected } = props;\n const { t } = useTranslation();\n const mention = mentionViewModel(node.attrs ?? {}, t);\n const [isEditable, setIsEditable] = useState(editor.isEditable);\n const extensionOptions = extension.options as {\n removeActionAriaLabel?: string;\n };\n const removeActionAriaLabel =\n typeof extensionOptions.removeActionAriaLabel === \"string\"\n ? extensionOptions.removeActionAriaLabel\n : undefined;\n\n useEffect(() => {\n const syncEditable = () => {\n setIsEditable(editor.isEditable);\n };\n\n syncEditable();\n editor.on(\"transaction\", syncEditable);\n editor.on(\"update\", syncEditable);\n return () => {\n editor.off(\"transaction\", syncEditable);\n editor.off(\"update\", syncEditable);\n };\n }, [editor]);\n\n const handleRemove = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (!editor.isEditable) {\n return;\n }\n deleteNode();\n if (!hasPromptContentAfterMentionRemoval(editor.state.doc)) {\n editor.commands.clearContent();\n }\n };\n\n if (mention.kind === \"file\") {\n return <AgentMentionLegacyFileNodeView {...props} />;\n }\n\n if (\n mention.kind === \"workspace-app\" ||\n mention.kind === \"workspace-reference\"\n ) {\n return (\n <NodeViewWrapper\n as=\"span\"\n aria-label={mention.ariaLabel}\n className={`inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] align-baseline ${\n selected ? \"is-selected\" : \"\"\n }`}\n contentEditable={false}\n data-agent-file-mention=\"true\"\n data-agent-mention-href={mention.href}\n data-agent-mention-icon-url={mention.iconUrl}\n data-agent-mention-kind={mention.kind}\n >\n <span\n className=\"group relative top-[3px] inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] cursor-pointer items-center gap-1 overflow-hidden rounded-[4px] border border-transparent bg-transparent px-1 py-0.5 align-baseline text-[13px] font-medium leading-5 text-[var(--accent)] no-underline transition-colors hover:border-transparent hover:bg-[color-mix(in_srgb,currentColor_12%,transparent)]\"\n data-agent-mention-kind={mention.kind}\n data-slot=\"mention-pill\"\n >\n <span\n aria-hidden={isEditable ? undefined : true}\n className=\"relative grid size-4 shrink-0 place-items-center overflow-hidden rounded-[4px] bg-block\"\n data-agent-mention-app-icon=\"true\"\n data-workspace-app-icon=\"true\"\n >\n {mention.iconUrl ? (\n <img\n src={mention.iconUrl}\n alt=\"\"\n className={`size-full object-cover transition-opacity ${\n isEditable\n ? \"group-hover:opacity-0 group-focus-within:opacity-0\"\n : \"\"\n }`}\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n ) : (\n <span\n className={`tsh-agent-object-token__kind-icon size-4 transition-opacity ${\n isEditable\n ? \"group-hover:opacity-0 group-focus-within:opacity-0\"\n : \"\"\n }`}\n />\n )}\n {isEditable ? (\n <button\n aria-label={removeActionAriaLabel}\n className=\"absolute left-1/2 top-1/2 inline-flex size-5 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-opacity hover:bg-transparency-block hover:text-[var(--text-primary)] focus-visible:opacity-100 group-hover:opacity-100\"\n type=\"button\"\n onMouseDown={handleRemove}\n >\n <CloseIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </span>\n <TruncatingPillLabel tooltip={mention.label}>\n {mention.label}\n </TruncatingPillLabel>\n </span>\n </NodeViewWrapper>\n );\n }\n\n return (\n <NodeViewWrapper\n as=\"span\"\n className={`inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] align-baseline ${\n selected ? \"is-selected\" : \"\"\n }`}\n contentEditable={false}\n >\n <MentionPill\n aria-label={mention.ariaLabel}\n data-agent-mention-href={mention.href}\n data-agent-mention-kind={mention.kind}\n kind={mention.kind === \"session\" ? \"session\" : \"issue\"}\n label={mention.label}\n removable={isEditable}\n removeButtonProps={\n isEditable\n ? {\n \"aria-label\": removeActionAriaLabel,\n onMouseDown: handleRemove\n }\n : undefined\n }\n summary={mention.summary}\n />\n </NodeViewWrapper>\n );\n}\n"],"mappings":"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","names":["buildAgentGenericMentionHref","dirnameFromPath","buildAgentGenericMentionHref"]}
@@ -6,16 +6,18 @@ import {
6
6
  import {
7
7
  AgentGUIConversation_styles_default,
8
8
  MessageSquareMoreIcon,
9
- extractAgentMcpToolTarget,
10
- getOptionalAgentHostApi,
11
- useOptionalAgentHostApi
12
- } from "./chunk-YKDFQADM.js";
9
+ extractAgentMcpToolTarget
10
+ } from "./chunk-FJYH2ZPX.js";
13
11
  import {
14
12
  Spinner
15
- } from "./chunk-OFGXNXYT.js";
13
+ } from "./chunk-EKATXC3W.js";
14
+ import {
15
+ getOptionalAgentHostApi,
16
+ useOptionalAgentHostApi
17
+ } from "./chunk-O5TUTXHT.js";
16
18
  import {
17
19
  translate
18
- } from "./chunk-KJPMZ7G5.js";
20
+ } from "./chunk-SIDWRR5I.js";
19
21
 
20
22
  // shared/agentConversation/approvalOptionPresentation.ts
21
23
  function approvalOptionDisplayLabel(option, intent = {}) {
@@ -850,6 +852,7 @@ function FullAskUserPromptSurface({
850
852
  type: "button",
851
853
  className: AgentGUIConversation_styles_default.interactiveOptionButton,
852
854
  "data-active": active,
855
+ "aria-pressed": active,
853
856
  "aria-label": interactiveOptionLabel(
854
857
  option.label,
855
858
  option.description
@@ -1103,4 +1106,4 @@ export {
1103
1106
  isPromptRequestIdTitle,
1104
1107
  AgentInteractivePromptSurface
1105
1108
  };
1106
- //# sourceMappingURL=chunk-2CA4NPP3.js.map
1109
+ //# sourceMappingURL=chunk-LW2S255I.js.map