@tutti-os/agent-gui 0.0.14 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-conversation/index.d.ts +1 -1
- package/dist/agent-conversation/index.js +4 -4
- package/dist/agent-message-center/index.d.ts +1 -1
- package/dist/agent-message-center/index.js +4 -4
- package/dist/agentFileMentionExtension-CM1c9bqk.d.ts +86 -0
- package/dist/app/renderer/agentactivity.css +33 -9
- package/dist/{chunk-WME2V26J.js → chunk-2CA4NPP3.js} +15 -33
- package/dist/chunk-2CA4NPP3.js.map +1 -0
- package/dist/{chunk-ZO3SZCIX.js → chunk-7CBJJNX6.js} +5 -2
- package/dist/chunk-7CBJJNX6.js.map +1 -0
- package/dist/{chunk-ASAZDEQE.js → chunk-EK5RDKG7.js} +54 -14
- package/dist/chunk-EK5RDKG7.js.map +1 -0
- package/dist/{chunk-GZHQPPK2.js → chunk-H4HT3FE6.js} +113 -36
- package/dist/chunk-H4HT3FE6.js.map +1 -0
- package/dist/{chunk-YXSO4ITT.js → chunk-HIREVEZM.js} +1 -1
- package/dist/chunk-HIREVEZM.js.map +1 -0
- package/dist/{chunk-VDNMTW2E.js → chunk-IXIGWLQY.js} +1 -1
- package/dist/chunk-IXIGWLQY.js.map +1 -0
- package/dist/{chunk-FSTZDNRM.js → chunk-KJPMZ7G5.js} +243 -167
- package/dist/chunk-KJPMZ7G5.js.map +1 -0
- package/dist/{chunk-GEXHKJK5.js → chunk-MUZMBEFO.js} +35 -17
- package/dist/chunk-MUZMBEFO.js.map +1 -0
- package/dist/{chunk-HSXDSFKB.js → chunk-OFGXNXYT.js} +2 -2
- package/dist/{chunk-3YZX5EUC.js → chunk-SVOGXWFJ.js} +53 -17
- package/dist/{chunk-3YZX5EUC.js.map → chunk-SVOGXWFJ.js.map} +1 -1
- package/dist/{chunk-MU2LODEV.js → chunk-U4F3COKL.js} +160 -10
- package/dist/chunk-U4F3COKL.js.map +1 -0
- package/dist/{chunk-KEKPOVQD.js → chunk-XHQGCP7A.js} +2 -2
- package/dist/{chunk-RLPVFX7V.js → chunk-YKDFQADM.js} +36 -7
- package/dist/chunk-YKDFQADM.js.map +1 -0
- package/dist/context-mention-palette/index.d.ts +8 -68
- package/dist/context-mention-palette/index.js +6 -6
- package/dist/context-mention-provider.d.ts +6 -1
- package/dist/context-mention-provider.js +1 -1
- package/dist/i18n/index.d.ts +239 -163
- package/dist/i18n/index.js +1 -1
- package/dist/index.d.ts +35 -2
- package/dist/index.js +1481 -997
- package/dist/index.js.map +1 -1
- package/dist/workbench/contribution.d.ts +7 -1
- package/dist/workbench/contribution.js +6 -4
- package/dist/workbench/index.d.ts +4 -2
- package/dist/workbench/index.js +6 -4
- package/dist/workbench/launch.d.ts +2 -0
- package/dist/workbench/launch.js +2 -2
- package/dist/workbench/state.d.ts +3 -2
- package/dist/workbench/state.js +1 -1
- package/dist/workbench/types.d.ts +3 -0
- package/dist/workbench/types.js +1 -1
- package/dist/workspace-agent-generated-files.js +2 -2
- package/dist/{workspaceLinkActions-BlLN8Pvz.d.ts → workspaceLinkActions-Mjktl_Be.d.ts} +3 -0
- package/package.json +15 -13
- package/dist/chunk-ASAZDEQE.js.map +0 -1
- package/dist/chunk-FSTZDNRM.js.map +0 -1
- package/dist/chunk-GEXHKJK5.js.map +0 -1
- package/dist/chunk-GZHQPPK2.js.map +0 -1
- package/dist/chunk-MU2LODEV.js.map +0 -1
- package/dist/chunk-RLPVFX7V.js.map +0 -1
- package/dist/chunk-VDNMTW2E.js.map +0 -1
- package/dist/chunk-WME2V26J.js.map +0 -1
- package/dist/chunk-YXSO4ITT.js.map +0 -1
- package/dist/chunk-ZO3SZCIX.js.map +0 -1
- /package/dist/{chunk-HSXDSFKB.js.map → chunk-OFGXNXYT.js.map} +0 -0
- /package/dist/{chunk-KEKPOVQD.js.map → chunk-XHQGCP7A.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
translate,
|
|
3
3
|
useTranslation
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-KJPMZ7G5.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveAgentMentionFileThumbnailUrl,
|
|
7
7
|
resolveAgentMentionFileVisualKind
|
|
@@ -34,6 +34,9 @@ function normalizeKind(value) {
|
|
|
34
34
|
if (value === "workspace-app") {
|
|
35
35
|
return "workspace-app";
|
|
36
36
|
}
|
|
37
|
+
if (value === "workspace-app-bundle") {
|
|
38
|
+
return "workspace-app-bundle";
|
|
39
|
+
}
|
|
37
40
|
if (value === "workspace-app-factory") {
|
|
38
41
|
return "workspace-app-factory";
|
|
39
42
|
}
|
|
@@ -164,6 +167,18 @@ function mentionViewModel(attrs, t) {
|
|
|
164
167
|
label: name
|
|
165
168
|
};
|
|
166
169
|
}
|
|
170
|
+
if (kind === "workspace-app-bundle") {
|
|
171
|
+
return {
|
|
172
|
+
ariaLabel: `${t("agentHost.agentGui.mentionKindApp")} ${name}`.trim(),
|
|
173
|
+
directoryPath: "",
|
|
174
|
+
entryKind: "",
|
|
175
|
+
href: href || buildMentionHref("workspace-app", attrs),
|
|
176
|
+
iconUrl: attrString(attrs, "iconUrl").trim() || void 0,
|
|
177
|
+
kind,
|
|
178
|
+
label: name,
|
|
179
|
+
fileCount: parseBundleFilesJson(attrs.filesJson).length
|
|
180
|
+
};
|
|
181
|
+
}
|
|
167
182
|
if (kind === "workspace-app-factory") {
|
|
168
183
|
return {
|
|
169
184
|
ariaLabel: `${t("agentHost.agentGui.mentionKindAppFactory")} ${name}`.trim(),
|
|
@@ -361,7 +376,7 @@ function AgentMentionNodeView(props) {
|
|
|
361
376
|
if (mention.kind === "file") {
|
|
362
377
|
return /* @__PURE__ */ jsx(AgentMentionLegacyFileNodeView, { ...props });
|
|
363
378
|
}
|
|
364
|
-
if (mention.kind === "workspace-app") {
|
|
379
|
+
if (mention.kind === "workspace-app" || mention.kind === "workspace-app-bundle") {
|
|
365
380
|
return /* @__PURE__ */ jsx(
|
|
366
381
|
NodeViewWrapper,
|
|
367
382
|
{
|
|
@@ -417,7 +432,8 @@ function AgentMentionNodeView(props) {
|
|
|
417
432
|
]
|
|
418
433
|
}
|
|
419
434
|
),
|
|
420
|
-
/* @__PURE__ */ jsx("span", { className: "min-w-0 overflow-hidden text-ellipsis whitespace-nowrap", children: mention.label })
|
|
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
|
|
421
437
|
]
|
|
422
438
|
}
|
|
423
439
|
)
|
|
@@ -493,7 +509,8 @@ function createAgentFileMentionExtension(options = {}) {
|
|
|
493
509
|
description: { default: "" },
|
|
494
510
|
iconUrl: { default: "" },
|
|
495
511
|
contentPreview: { default: "" },
|
|
496
|
-
thumbnailUrl: { default: "" }
|
|
512
|
+
thumbnailUrl: { default: "" },
|
|
513
|
+
filesJson: { default: "" }
|
|
497
514
|
};
|
|
498
515
|
},
|
|
499
516
|
parseHTML() {
|
|
@@ -531,7 +548,8 @@ function createAgentFileMentionExtension(options = {}) {
|
|
|
531
548
|
"data-agent-file-visual-kind": resolveAgentMentionFileVisualKind(item)
|
|
532
549
|
} : {},
|
|
533
550
|
...options.renderAsLink ? { href } : {},
|
|
534
|
-
...item.kind === "workspace-app" && item.iconUrl ? { "data-agent-mention-icon-url": item.iconUrl } : {},
|
|
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) } : {},
|
|
535
553
|
...fileThumbnailUrl ? { "data-agent-mention-thumbnail-url": fileThumbnailUrl } : {},
|
|
536
554
|
class: item.kind === "file" ? "tsh-agent-object-token tsh-agent-object-token--file" : "tsh-agent-object-token tsh-agent-object-token--entity"
|
|
537
555
|
}),
|
|
@@ -706,6 +724,14 @@ function buildAgentWorkspaceAppMentionHref(workspaceId, appId) {
|
|
|
706
724
|
workspaceId
|
|
707
725
|
});
|
|
708
726
|
}
|
|
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, {
|
|
730
|
+
workspaceId,
|
|
731
|
+
files: filesParam,
|
|
732
|
+
icon: iconUrl?.trim() || void 0
|
|
733
|
+
});
|
|
734
|
+
}
|
|
709
735
|
function buildAgentWorkspaceAppFactoryMentionHref(workspaceId, jobId, input) {
|
|
710
736
|
const params = new URLSearchParams();
|
|
711
737
|
const trimmedWorkspaceId = workspaceId?.trim() ?? "";
|
|
@@ -735,10 +761,79 @@ function normalizeAgentSessionMentionTitle(value) {
|
|
|
735
761
|
const withoutMentionPrefix = trimmed.replace(/^@+/, "").trim();
|
|
736
762
|
return withoutMentionPrefix || trimmed;
|
|
737
763
|
}
|
|
738
|
-
function
|
|
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
|
+
}
|
|
739
787
|
const label = item.name.trim().startsWith("@") ? item.name : `@${item.name}`;
|
|
740
788
|
return `[${escapeMarkdownLinkLabel(label)}](${escapeMarkdownLinkTarget(item.href)})`;
|
|
741
789
|
}
|
|
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
|
+
}
|
|
836
|
+
}
|
|
742
837
|
function parseAgentMentionMarkdown(value, start = 0) {
|
|
743
838
|
if (!value.startsWith("[", start)) {
|
|
744
839
|
return null;
|
|
@@ -791,7 +886,7 @@ function parseAgentMentionMarkdown(value, start = 0) {
|
|
|
791
886
|
if (!item) {
|
|
792
887
|
return null;
|
|
793
888
|
}
|
|
794
|
-
if (item.kind !== "file" && !prefixedMention) {
|
|
889
|
+
if (item.kind !== "file" && !prefixedMention && !href.trim().toLowerCase().startsWith("mention://")) {
|
|
795
890
|
return null;
|
|
796
891
|
}
|
|
797
892
|
return {
|
|
@@ -877,6 +972,21 @@ function parseMentionItemFromHref(input) {
|
|
|
877
972
|
name: input.name
|
|
878
973
|
};
|
|
879
974
|
}
|
|
975
|
+
if (resource === "workspace-app-bundle") {
|
|
976
|
+
if (!workspaceId) {
|
|
977
|
+
return null;
|
|
978
|
+
}
|
|
979
|
+
return {
|
|
980
|
+
kind: "workspace-app-bundle",
|
|
981
|
+
href,
|
|
982
|
+
workspaceId,
|
|
983
|
+
targetId,
|
|
984
|
+
appId: targetId,
|
|
985
|
+
name: input.name,
|
|
986
|
+
iconUrl: url.searchParams.get("icon")?.trim() || void 0,
|
|
987
|
+
files: decodeBundleFilesParam(url.searchParams.get("files"))
|
|
988
|
+
};
|
|
989
|
+
}
|
|
880
990
|
if (resource === "workspace-app-factory") {
|
|
881
991
|
return {
|
|
882
992
|
kind: "workspace-app-factory",
|
|
@@ -934,6 +1044,18 @@ function mentionItemToAttrs(item) {
|
|
|
934
1044
|
iconUrl: item.iconUrl ?? ""
|
|
935
1045
|
};
|
|
936
1046
|
}
|
|
1047
|
+
if (item.kind === "workspace-app-bundle") {
|
|
1048
|
+
return {
|
|
1049
|
+
name: item.name,
|
|
1050
|
+
kind: item.kind,
|
|
1051
|
+
href: item.href,
|
|
1052
|
+
...workspaceMentionAttrs(item.workspaceId),
|
|
1053
|
+
targetId: item.targetId,
|
|
1054
|
+
appId: item.appId ?? "",
|
|
1055
|
+
iconUrl: item.iconUrl ?? "",
|
|
1056
|
+
filesJson: JSON.stringify(item.files)
|
|
1057
|
+
};
|
|
1058
|
+
}
|
|
937
1059
|
if (item.kind === "workspace-app-factory") {
|
|
938
1060
|
return {
|
|
939
1061
|
name: item.name,
|
|
@@ -1020,6 +1142,27 @@ function attrsToMentionItem(attrs) {
|
|
|
1020
1142
|
iconUrl: typeof attrs.iconUrl === "string" && attrs.iconUrl.trim() ? attrs.iconUrl.trim() : void 0
|
|
1021
1143
|
};
|
|
1022
1144
|
}
|
|
1145
|
+
if (kind === "workspace-app-bundle") {
|
|
1146
|
+
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;
|
|
1150
|
+
return {
|
|
1151
|
+
kind,
|
|
1152
|
+
href: href || buildAgentWorkspaceAppBundleMentionHref(
|
|
1153
|
+
workspaceId,
|
|
1154
|
+
appId,
|
|
1155
|
+
files,
|
|
1156
|
+
bundleIconUrl
|
|
1157
|
+
),
|
|
1158
|
+
workspaceId,
|
|
1159
|
+
targetId: appId,
|
|
1160
|
+
appId,
|
|
1161
|
+
name,
|
|
1162
|
+
iconUrl: bundleIconUrl,
|
|
1163
|
+
files
|
|
1164
|
+
};
|
|
1165
|
+
}
|
|
1023
1166
|
if (kind === "workspace-app-factory") {
|
|
1024
1167
|
const workspaceId = workspaceIdFromMentionAttrs(attrs);
|
|
1025
1168
|
const jobId = typeof attrs.jobId === "string" && attrs.jobId.trim() ? attrs.jobId.trim() : typeof attrs.targetId === "string" ? attrs.targetId.trim() : "";
|
|
@@ -1068,12 +1211,14 @@ function parseAgentMentionHTMLElementAttrs(node) {
|
|
|
1068
1211
|
const parsedItem = href ? parseMentionItemFromHref({ name, href }) : null;
|
|
1069
1212
|
const parsedAttrs = parsedItem ? mentionItemToAttrs(parsedItem) : {};
|
|
1070
1213
|
const iconUrl = node.getAttribute("data-agent-mention-icon-url") || "";
|
|
1214
|
+
const filesJson = node.getAttribute("data-agent-mention-files") || "";
|
|
1071
1215
|
return {
|
|
1072
1216
|
...parsedAttrs,
|
|
1073
1217
|
name,
|
|
1074
1218
|
kind: node.getAttribute("data-agent-mention-kind") || node.getAttribute("kind") || parsedAttrs.kind || "file",
|
|
1075
1219
|
href,
|
|
1076
|
-
...iconUrl ? { iconUrl } : {}
|
|
1220
|
+
...iconUrl ? { iconUrl } : {},
|
|
1221
|
+
...filesJson ? { filesJson } : {}
|
|
1077
1222
|
};
|
|
1078
1223
|
}
|
|
1079
1224
|
function workspaceIdFromMentionUrl(url) {
|
|
@@ -1110,6 +1255,9 @@ function normalizeMentionKind(value) {
|
|
|
1110
1255
|
if (value === "workspace-app") {
|
|
1111
1256
|
return "workspace-app";
|
|
1112
1257
|
}
|
|
1258
|
+
if (value === "workspace-app-bundle") {
|
|
1259
|
+
return "workspace-app-bundle";
|
|
1260
|
+
}
|
|
1113
1261
|
if (value === "workspace-app-factory") {
|
|
1114
1262
|
return "workspace-app-factory";
|
|
1115
1263
|
}
|
|
@@ -1145,7 +1293,7 @@ function mentionVisual(item) {
|
|
|
1145
1293
|
};
|
|
1146
1294
|
}
|
|
1147
1295
|
return {
|
|
1148
|
-
kindLabel: "
|
|
1296
|
+
kindLabel: "Task",
|
|
1149
1297
|
primary: item.name
|
|
1150
1298
|
};
|
|
1151
1299
|
}
|
|
@@ -1202,10 +1350,12 @@ export {
|
|
|
1202
1350
|
buildAgentSessionMentionHref,
|
|
1203
1351
|
buildAgentWorkspaceIssueMentionHref,
|
|
1204
1352
|
buildAgentWorkspaceAppMentionHref,
|
|
1353
|
+
buildAgentWorkspaceAppBundleMentionHref,
|
|
1205
1354
|
normalizeAgentSessionMentionTitle,
|
|
1206
1355
|
formatAgentMentionMarkdown,
|
|
1207
1356
|
parseAgentMentionMarkdown,
|
|
1357
|
+
mentionItemToAttrs,
|
|
1208
1358
|
attrsToMentionItem,
|
|
1209
1359
|
buildAgentGenericMentionHref2 as buildAgentGenericMentionHref
|
|
1210
1360
|
};
|
|
1211
|
-
//# sourceMappingURL=chunk-
|
|
1361
|
+
//# sourceMappingURL=chunk-U4F3COKL.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-app-bundle\"\n | \"workspace-app-factory\"\n | \"workspace-issue\";\n\n/** 折叠在一个 bundle 节点里的单个文件(只携带路径与展示名)。 */\nexport interface AgentMentionBundleFile {\n path: string;\n name: string;\n}\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 AgentMentionWorkspaceAppBundleItem {\n kind: \"workspace-app-bundle\";\n href: string;\n workspaceId: string;\n targetId: string;\n /** 可选:来源 app id(用于 href 身份);文件夹 bundle 不一定有。 */\n appId?: string;\n name: string;\n iconUrl?: string;\n /** 递归打平后的全部子文件;序列化时逐个展开为 file mention。 */\n files: AgentMentionBundleFile[];\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 | AgentMentionWorkspaceAppBundleItem\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 filesJson: { 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-app-bundle\") &&\n item.iconUrl\n ? { \"data-agent-mention-icon-url\": item.iconUrl }\n : {}),\n ...(item.kind === \"workspace-app-bundle\"\n ? { \"data-agent-mention-files\": JSON.stringify(item.files) }\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 buildAgentWorkspaceAppBundleMentionHref(\n workspaceId: string,\n appId: string,\n files?: readonly AgentMentionBundleFile[],\n iconUrl?: string\n): string {\n // files 编进 href,使 bundle 在 markdown 往返(value/草稿)后仍能还原全部文件。\n // 只编路径(展示侧只需路径;label 还原时回退 basename),体积更小。\n // icon 编进 href,使对话流渲染时也能展示应用图标。\n const filesParam =\n files && files.length > 0\n ? JSON.stringify(files.map((file) => file.path))\n : undefined;\n return buildAgentGenericMentionHref(\"workspace-app-bundle\", appId, {\n workspaceId,\n files: filesParam,\n icon: iconUrl?.trim() || 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\n/**\n * 序列化模式:\n * - \"display\"(默认):bundle 渲染成单条 mention 链接(对话流/回显/草稿往返用,files 在 href 里)。\n * - \"agent\":bundle 递归展开成多条 file mention(发给 agent 的真正内容,只含路径)。\n */\nexport type AgentMentionSerializeMode = \"display\" | \"agent\";\n\nexport function formatAgentMentionMarkdown(\n item: AgentContextMentionItem,\n mode: AgentMentionSerializeMode = \"display\"\n): string {\n if (item.kind === \"workspace-app-bundle\") {\n if (mode === \"agent\" && item.files.length > 0) {\n // 给 agent:展开成逐条 file mention(只含路径)。\n return item.files\n .map((file) =>\n formatAgentFileMentionMarkdown(\n file.name || basenameFromPath(file.path),\n file.path\n )\n )\n .join(\" \");\n }\n // 展示模式,或「空项目 bundle」的 agent 模式:单条链接(files 已编码在 href 内,供往返还原)。\n // 空项目没有文件可展开,退回 @项目名 链接 —— 既给 agent 一个可读的项目引用,\n // 也避免空 bundle 序列化成空串、留下一个空白节点。\n const bundleLabel = item.name.trim().startsWith(\"@\")\n ? item.name\n : `@${item.name}`;\n return `[${escapeMarkdownLinkLabel(bundleLabel)}](${escapeMarkdownLinkTarget(item.href)})`;\n }\n const label = item.name.trim().startsWith(\"@\") ? item.name : `@${item.name}`;\n return `[${escapeMarkdownLinkLabel(label)}](${escapeMarkdownLinkTarget(item.href)})`;\n}\n\nfunction basenameFromPath(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n return parts.length > 0 ? (parts[parts.length - 1] ?? path) : path;\n}\n\n/** 解析 href 里的 files 参数(JSON 路径数组),还原为 bundle 文件;label 回退 basename。 */\nexport function decodeBundleFilesParam(\n value: string | null | undefined\n): AgentMentionBundleFile[] {\n if (typeof value !== \"string\" || !value.trim()) {\n return [];\n }\n try {\n const parsed: unknown = JSON.parse(value);\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed\n .filter(\n (path): path is string => typeof path === \"string\" && path.trim() !== \"\"\n )\n .map((path) => ({ path, name: basenameFromPath(path) }));\n } catch {\n return [];\n }\n}\n\n/** 解析 attrs.filesJson(失败时回退空数组,保证不抛)。 */\nexport function parseBundleFilesJson(value: unknown): AgentMentionBundleFile[] {\n if (typeof value !== \"string\" || !value.trim()) {\n return [];\n }\n try {\n const parsed: unknown = JSON.parse(value);\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed\n .map((entry): AgentMentionBundleFile | null => {\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n const path = (entry as Record<string, unknown>).path;\n if (typeof path !== \"string\" || !path.trim()) {\n return null;\n }\n const name = (entry as Record<string, unknown>).name;\n return {\n path,\n name: typeof name === \"string\" ? name : basenameFromPath(path)\n };\n })\n .filter((entry): entry is AgentMentionBundleFile => entry !== null);\n } catch {\n return [];\n }\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\nfunction 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-app-bundle\") {\n if (!workspaceId) {\n return null;\n }\n return {\n kind: \"workspace-app-bundle\",\n href,\n workspaceId,\n targetId,\n appId: targetId,\n name: input.name,\n iconUrl: url.searchParams.get(\"icon\")?.trim() || undefined,\n files: decodeBundleFilesParam(url.searchParams.get(\"files\"))\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-app-bundle\") {\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 iconUrl: item.iconUrl ?? \"\",\n filesJson: JSON.stringify(item.files)\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-app-bundle\") {\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 const files = parseBundleFilesJson(attrs.filesJson);\n const bundleIconUrl =\n typeof attrs.iconUrl === \"string\" && attrs.iconUrl.trim()\n ? attrs.iconUrl.trim()\n : undefined;\n return {\n kind,\n href:\n href ||\n buildAgentWorkspaceAppBundleMentionHref(\n workspaceId,\n appId,\n files,\n bundleIconUrl\n ),\n workspaceId,\n targetId: appId,\n appId,\n name,\n iconUrl: bundleIconUrl,\n files\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 filesJson = node.getAttribute(\"data-agent-mention-files\") || \"\";\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 ...(filesJson ? { filesJson } : {})\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-app-bundle\") {\n return \"workspace-app-bundle\";\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 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 { MentionPill } 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\";\nimport { parseBundleFilesJson } from \"./agentFileMentionExtension\";\n\ntype AgentMentionNodeViewKind =\n | \"file\"\n | \"session\"\n | \"workspace-app\"\n | \"workspace-app-bundle\"\n | \"workspace-app-factory\"\n | \"workspace-issue\";\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 /** bundle 文件数量(workspace-app-bundle 专用)。 */\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-app-bundle\") {\n return \"workspace-app-bundle\";\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-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-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-app-bundle\") {\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 fileCount: parseBundleFilesJson(attrs.filesJson).length\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-app-bundle\"\n ) {\n return (\n <NodeViewWrapper\n as=\"span\"\n aria-label={mention.ariaLabel}\n className={`inline-flex max-w-full 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-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)]\"\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 <span className=\"min-w-0 overflow-hidden text-ellipsis whitespace-nowrap\">\n {mention.label}\n </span>\n {mention.kind === \"workspace-app-bundle\" &&\n mention.fileCount != null &&\n mention.fileCount >= 0 ? (\n <span className=\"shrink-0 tabular-nums text-[var(--text-secondary)]\">\n {mention.fileCount}\n </span>\n ) : null}\n </span>\n </NodeViewWrapper>\n );\n }\n\n return (\n <NodeViewWrapper\n as=\"span\"\n className={`inline-flex max-w-full 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"]}
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
import {
|
|
14
14
|
translate,
|
|
15
15
|
translateInUiLanguage
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-KJPMZ7G5.js";
|
|
17
17
|
|
|
18
18
|
// shared/workspaceAgentStatusNormalizer.ts
|
|
19
19
|
var FAILED_STATUS_TOKENS = /* @__PURE__ */ new Set(["failed", "error"]);
|
|
@@ -915,4 +915,4 @@ export {
|
|
|
915
915
|
resolveWorkspaceAgentActivityStatus,
|
|
916
916
|
resolveWorkspaceAgentActivityTitle
|
|
917
917
|
};
|
|
918
|
-
//# sourceMappingURL=chunk-
|
|
918
|
+
//# sourceMappingURL=chunk-XHQGCP7A.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useTranslation
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-KJPMZ7G5.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveAgentWorkspaceFileVisualKind
|
|
6
6
|
} from "./chunk-PJP5BUU6.js";
|
|
@@ -582,10 +582,16 @@ function resolveWorkspaceMentionLinkAction({
|
|
|
582
582
|
};
|
|
583
583
|
}
|
|
584
584
|
if (url.hostname === "workspace-app") {
|
|
585
|
+
const messageId = url.searchParams.get("messageId")?.trim() || null;
|
|
586
|
+
const summaryTaskId = url.searchParams.get("summaryTaskId")?.trim() || null;
|
|
587
|
+
const conversationId = url.searchParams.get("conversationId")?.trim() || null;
|
|
585
588
|
return {
|
|
586
589
|
type: "open-workspace-app",
|
|
587
590
|
workspaceId,
|
|
588
591
|
appId: targetId,
|
|
592
|
+
...messageId ? { messageId } : {},
|
|
593
|
+
...summaryTaskId ? { summaryTaskId } : {},
|
|
594
|
+
...conversationId ? { conversationId } : {},
|
|
589
595
|
source
|
|
590
596
|
};
|
|
591
597
|
}
|
|
@@ -1605,7 +1611,7 @@ function MentionLink({
|
|
|
1605
1611
|
activateMarkdownLinkFromKey(event, href, onLinkClick);
|
|
1606
1612
|
},
|
|
1607
1613
|
children: [
|
|
1608
|
-
mention.kind === "workspace-app" ? /* @__PURE__ */ jsx4(
|
|
1614
|
+
mention.kind === "workspace-app" || mention.kind === "workspace-app-bundle" ? /* @__PURE__ */ jsx4(
|
|
1609
1615
|
"span",
|
|
1610
1616
|
{
|
|
1611
1617
|
className: "grid h-4 w-4 shrink-0 place-items-center overflow-hidden rounded-[4px] bg-block",
|
|
@@ -1637,7 +1643,8 @@ function MentionLink({
|
|
|
1637
1643
|
" ",
|
|
1638
1644
|
mention.summary
|
|
1639
1645
|
] }) : null
|
|
1640
|
-
] }) : /* @__PURE__ */ jsx4("span", { className: "tsh-agent-object-token__main", children: mention.label })
|
|
1646
|
+
] }) : /* @__PURE__ */ jsx4("span", { className: "tsh-agent-object-token__main", children: mention.label }),
|
|
1647
|
+
mention.kind === "workspace-app-bundle" && mention.fileCount != null && mention.fileCount >= 0 ? /* @__PURE__ */ jsx4("span", { className: "shrink-0 tabular-nums text-[var(--text-secondary)]", children: mention.fileCount }) : null
|
|
1641
1648
|
]
|
|
1642
1649
|
}
|
|
1643
1650
|
);
|
|
@@ -1651,8 +1658,9 @@ function MarkdownCode({
|
|
|
1651
1658
|
...props
|
|
1652
1659
|
}) {
|
|
1653
1660
|
"use memo";
|
|
1661
|
+
const isInsideLink = useContext3(MarkdownLinkContext);
|
|
1654
1662
|
const text = textFromReactNode(children).trim();
|
|
1655
|
-
const isLinkablePath = onLinkClick && !className && (isLocalAbsolutePath(text) || isHttpUrl(text) || workspaceFileLinksEnabled && isLikelyWorkspaceRelativeFilePath(text));
|
|
1663
|
+
const isLinkablePath = !isInsideLink && onLinkClick && !className && (isLocalAbsolutePath(text) || isHttpUrl(text) || workspaceFileLinksEnabled && isLikelyWorkspaceRelativeFilePath(text));
|
|
1656
1664
|
if (isLinkablePath) {
|
|
1657
1665
|
return /* @__PURE__ */ jsx4(PathLink, { href: text, onLinkClick, children });
|
|
1658
1666
|
}
|
|
@@ -2086,8 +2094,8 @@ function parseMentionLink(href, rawLabel, workspaceAppIcons = [], appFactoryFall
|
|
|
2086
2094
|
return null;
|
|
2087
2095
|
}
|
|
2088
2096
|
const resource = url.hostname.trim().toLowerCase();
|
|
2089
|
-
const kind = resource === "agent-session" ? "session" : resource === "workspace-app" ? "workspace-app" : resource === "workspace-app-factory" ? "workspace-app-factory" : resource === "workspace-issue" ? "workspace-issue" : resource;
|
|
2090
|
-
if (kind !== "session" && kind !== "workspace-app" && kind !== "workspace-app-factory" && kind !== "workspace-issue") {
|
|
2097
|
+
const kind = resource === "agent-session" ? "session" : resource === "workspace-app" ? "workspace-app" : resource === "workspace-app-bundle" ? "workspace-app-bundle" : resource === "workspace-app-factory" ? "workspace-app-factory" : resource === "workspace-issue" ? "workspace-issue" : resource;
|
|
2098
|
+
if (kind !== "session" && kind !== "workspace-app" && kind !== "workspace-app-bundle" && kind !== "workspace-app-factory" && kind !== "workspace-issue") {
|
|
2091
2099
|
return null;
|
|
2092
2100
|
}
|
|
2093
2101
|
if (hasLegacyMentionQueryParams(url)) {
|
|
@@ -2116,6 +2124,16 @@ function parseMentionLink(href, rawLabel, workspaceAppIcons = [], appFactoryFall
|
|
|
2116
2124
|
summary: ""
|
|
2117
2125
|
};
|
|
2118
2126
|
}
|
|
2127
|
+
if (kind === "workspace-app-bundle") {
|
|
2128
|
+
return {
|
|
2129
|
+
kind,
|
|
2130
|
+
label,
|
|
2131
|
+
iconUrl: url.searchParams.get("icon")?.trim() || void 0,
|
|
2132
|
+
fileCount: bundleFileCountFromParam(url.searchParams.get("files")),
|
|
2133
|
+
participant: label,
|
|
2134
|
+
summary: ""
|
|
2135
|
+
};
|
|
2136
|
+
}
|
|
2119
2137
|
if (kind === "workspace-issue") {
|
|
2120
2138
|
return {
|
|
2121
2139
|
kind,
|
|
@@ -2132,6 +2150,17 @@ function parseMentionLink(href, rawLabel, workspaceAppIcons = [], appFactoryFall
|
|
|
2132
2150
|
summary: sessionLabel.summary
|
|
2133
2151
|
};
|
|
2134
2152
|
}
|
|
2153
|
+
function bundleFileCountFromParam(value) {
|
|
2154
|
+
if (!value) {
|
|
2155
|
+
return void 0;
|
|
2156
|
+
}
|
|
2157
|
+
try {
|
|
2158
|
+
const parsed = JSON.parse(value);
|
|
2159
|
+
return Array.isArray(parsed) ? parsed.length : void 0;
|
|
2160
|
+
} catch {
|
|
2161
|
+
return void 0;
|
|
2162
|
+
}
|
|
2163
|
+
}
|
|
2135
2164
|
function hasLegacyMentionQueryParams(url) {
|
|
2136
2165
|
return [...url.searchParams.keys()].some(
|
|
2137
2166
|
(key) => key === "appId" || key === "id" || key === "kind" || key === "link" || key === "provider" || key === "v" || key === "version" || key.startsWith("meta.")
|
|
@@ -2719,4 +2748,4 @@ export {
|
|
|
2719
2748
|
CustomScrollArea,
|
|
2720
2749
|
MessageSquareMoreIcon
|
|
2721
2750
|
};
|
|
2722
|
-
//# sourceMappingURL=chunk-
|
|
2751
|
+
//# sourceMappingURL=chunk-YKDFQADM.js.map
|