@tutti-os/agent-gui 0.0.13 → 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 +37 -2
- package/dist/index.js +1495 -990
- 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
|
@@ -3,13 +3,13 @@ import {
|
|
|
3
3
|
agentGuiWorkbenchProviderFromIdentifier,
|
|
4
4
|
agentGuiWorkbenchTypeId,
|
|
5
5
|
createAgentGuiWorkbenchLaunchDescriptor
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-7CBJJNX6.js";
|
|
7
7
|
import {
|
|
8
8
|
agentGuiWorkbenchProviderFromInstanceId,
|
|
9
9
|
createAgentGuiWorkbenchNodeStateSource,
|
|
10
10
|
normalizeAgentGuiWorkbenchNodeState,
|
|
11
11
|
normalizeAgentGuiWorkbenchState
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-MUZMBEFO.js";
|
|
13
13
|
import {
|
|
14
14
|
agentGuiWorkbenchProviderLabels,
|
|
15
15
|
agentGuiWorkbenchProviders,
|
|
@@ -31,12 +31,14 @@ import {
|
|
|
31
31
|
// workbench/header.ts
|
|
32
32
|
import { createElement } from "react";
|
|
33
33
|
import { Button, PanelIcon, cn } from "@tutti-os/ui-system";
|
|
34
|
+
import { EditIcon } from "@tutti-os/ui-system/icons";
|
|
34
35
|
function AgentGuiWorkbenchHeader({
|
|
35
36
|
className,
|
|
36
37
|
copy,
|
|
37
38
|
defaultActions,
|
|
38
39
|
isConversationRailAutoCollapsed,
|
|
39
40
|
isConversationRailCollapsed,
|
|
41
|
+
onCreateConversation,
|
|
40
42
|
onToggleConversationRail,
|
|
41
43
|
title,
|
|
42
44
|
...headerProps
|
|
@@ -53,7 +55,7 @@ function AgentGuiWorkbenchHeader({
|
|
|
53
55
|
},
|
|
54
56
|
createElement(
|
|
55
57
|
"div",
|
|
56
|
-
{ className: "flex min-w-0 items-center gap-
|
|
58
|
+
{ className: "flex min-w-0 items-center gap-1" },
|
|
57
59
|
createElement(
|
|
58
60
|
"span",
|
|
59
61
|
{
|
|
@@ -69,7 +71,7 @@ function AgentGuiWorkbenchHeader({
|
|
|
69
71
|
"data-agent-gui-conversation-rail-auto-collapsed": isConversationRailAutoCollapsed ? "true" : void 0,
|
|
70
72
|
"data-agent-gui-conversation-rail-collapsed": isConversationRailCollapsed ? "true" : void 0,
|
|
71
73
|
"data-testid": "agent-gui-toggle-conversation-rail",
|
|
72
|
-
size: "icon-
|
|
74
|
+
size: "icon-xs",
|
|
73
75
|
title: toggleLabel,
|
|
74
76
|
type: "button",
|
|
75
77
|
variant: "ghost",
|
|
@@ -81,7 +83,28 @@ function AgentGuiWorkbenchHeader({
|
|
|
81
83
|
onPointerDown: (event) => event.stopPropagation()
|
|
82
84
|
},
|
|
83
85
|
createElement(PanelIcon, { className: "size-[18px]" })
|
|
84
|
-
)
|
|
86
|
+
),
|
|
87
|
+
isConversationRailCollapsed && onCreateConversation ? createElement(
|
|
88
|
+
Button,
|
|
89
|
+
{
|
|
90
|
+
"aria-label": copy.newConversation,
|
|
91
|
+
className: "cursor-pointer rounded-md",
|
|
92
|
+
size: "icon-xs",
|
|
93
|
+
title: copy.newConversation,
|
|
94
|
+
type: "button",
|
|
95
|
+
variant: "ghost",
|
|
96
|
+
onClick: (event) => {
|
|
97
|
+
event.stopPropagation();
|
|
98
|
+
onCreateConversation();
|
|
99
|
+
},
|
|
100
|
+
onDoubleClick: (event) => event.stopPropagation(),
|
|
101
|
+
onPointerDown: (event) => event.stopPropagation()
|
|
102
|
+
},
|
|
103
|
+
createElement(EditIcon, {
|
|
104
|
+
"aria-hidden": true,
|
|
105
|
+
className: "size-[16px]"
|
|
106
|
+
})
|
|
107
|
+
) : null
|
|
85
108
|
),
|
|
86
109
|
createElement(
|
|
87
110
|
"div",
|
|
@@ -105,10 +128,12 @@ var agentGuiWorkbenchDefaultNodeFrame = {
|
|
|
105
128
|
var agentGuiWorkbenchDefaultUsableHeightRatio = 0.7;
|
|
106
129
|
var agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;
|
|
107
130
|
var AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT = "tutti:agent-gui-workbench-conversation-rail-toggle";
|
|
131
|
+
var AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT = "tutti:agent-gui-workbench-new-conversation";
|
|
108
132
|
var agentGuiWorkbenchDefaultCopy = {
|
|
109
133
|
collapseConversationRail: "Collapse conversation rail",
|
|
110
134
|
expandConversationRail: "Expand conversation rail",
|
|
111
135
|
fallbackAgentLabel: "Agent",
|
|
136
|
+
newConversation: "New conversation",
|
|
112
137
|
nodeTitle: "Agent"
|
|
113
138
|
};
|
|
114
139
|
function createAgentGuiWorkbenchContribution(input) {
|
|
@@ -125,6 +150,7 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
125
150
|
order: index,
|
|
126
151
|
provider,
|
|
127
152
|
renderPreview: input.renderPreview,
|
|
153
|
+
resolveDockPopupTitle: input.resolveDockPopupTitle,
|
|
128
154
|
sectionId: input.dockSectionId ?? "agents",
|
|
129
155
|
visibility: input.resolveDockEntryVisibility?.(provider) ?? (isAgentGuiWorkbenchDefaultDockProvider(provider) ? "always" : "never")
|
|
130
156
|
})
|
|
@@ -142,6 +168,7 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
142
168
|
onStateChange: (state) => {
|
|
143
169
|
nodeStateSource.writeNodeState({
|
|
144
170
|
instanceId: context.instanceId,
|
|
171
|
+
nodeId: context.node.id,
|
|
145
172
|
state,
|
|
146
173
|
typeId: agentGuiWorkbenchTypeId
|
|
147
174
|
});
|
|
@@ -175,6 +202,7 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
175
202
|
const persistConversationRailCollapsed = (collapsed) => {
|
|
176
203
|
nodeStateSource.writeNodeState({
|
|
177
204
|
instanceId,
|
|
205
|
+
nodeId: node.id,
|
|
178
206
|
state: {
|
|
179
207
|
...workbenchState,
|
|
180
208
|
conversationRailCollapsed: collapsed
|
|
@@ -195,6 +223,18 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
195
223
|
)
|
|
196
224
|
);
|
|
197
225
|
};
|
|
226
|
+
const announceNewConversation = () => {
|
|
227
|
+
window.dispatchEvent(
|
|
228
|
+
new CustomEvent(
|
|
229
|
+
AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT,
|
|
230
|
+
{
|
|
231
|
+
detail: {
|
|
232
|
+
instanceId
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
);
|
|
237
|
+
};
|
|
198
238
|
return createElement2(AgentGuiWorkbenchHeader, {
|
|
199
239
|
copy,
|
|
200
240
|
defaultActions,
|
|
@@ -202,6 +242,7 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
202
242
|
isConversationRailCollapsed,
|
|
203
243
|
title,
|
|
204
244
|
...dragHandleProps,
|
|
245
|
+
onCreateConversation: announceNewConversation,
|
|
205
246
|
onPointerDown: (event) => {
|
|
206
247
|
dragHandleProps.onPointerDown?.(event);
|
|
207
248
|
if (!isFocused) {
|
|
@@ -266,7 +307,7 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
266
307
|
nodeStateSource.writeNodeState({
|
|
267
308
|
instanceId,
|
|
268
309
|
state: {
|
|
269
|
-
...
|
|
310
|
+
...normalizeAgentGuiWorkbenchState(previousState),
|
|
270
311
|
...targetAgentSessionId ? { lastActiveAgentSessionId: targetAgentSessionId } : {}
|
|
271
312
|
},
|
|
272
313
|
typeId: agentGuiWorkbenchTypeId
|
|
@@ -344,8 +385,8 @@ function createAgentGuiWorkbenchDockEntry(input) {
|
|
|
344
385
|
return null;
|
|
345
386
|
}
|
|
346
387
|
const { externalNodeState, node } = item;
|
|
347
|
-
const state = externalNodeState
|
|
348
|
-
const title =
|
|
388
|
+
const state = normalizeAgentGuiWorkbenchState(externalNodeState);
|
|
389
|
+
const title = input.resolveDockPopupTitle?.(state) ?? node.title;
|
|
349
390
|
const lines = [input.label, state.lastActiveAgentSessionId].filter(
|
|
350
391
|
(line) => Boolean(line?.trim())
|
|
351
392
|
);
|
|
@@ -366,7 +407,9 @@ ${lines.join("\n")}`;
|
|
|
366
407
|
};
|
|
367
408
|
},
|
|
368
409
|
resolvePopupItem: ({ externalNodeState }) => {
|
|
369
|
-
const title =
|
|
410
|
+
const title = input.resolveDockPopupTitle?.(
|
|
411
|
+
normalizeAgentGuiWorkbenchState(externalNodeState)
|
|
412
|
+
) ?? null;
|
|
370
413
|
return {
|
|
371
414
|
revision: `${input.provider}
|
|
372
415
|
${title ?? ""}`,
|
|
@@ -378,10 +421,6 @@ ${title ?? ""}`,
|
|
|
378
421
|
visibility: input.visibility
|
|
379
422
|
};
|
|
380
423
|
}
|
|
381
|
-
function resolveAgentGuiWorkbenchDockPopupTitle(state) {
|
|
382
|
-
const title = state?.lastActiveConversationTitle;
|
|
383
|
-
return typeof title === "string" && title.trim() ? title.trim() : null;
|
|
384
|
-
}
|
|
385
424
|
function createAgentGuiWorkbenchPreviewBodyContext(input) {
|
|
386
425
|
return {
|
|
387
426
|
activation: null,
|
|
@@ -405,9 +444,10 @@ export {
|
|
|
405
444
|
agentGuiWorkbenchDefaultUsableHeightRatio,
|
|
406
445
|
agentGuiWorkbenchCompactVisibleAreaRatio,
|
|
407
446
|
AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,
|
|
447
|
+
AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT,
|
|
408
448
|
agentGuiWorkbenchDefaultCopy,
|
|
409
449
|
createAgentGuiWorkbenchContribution,
|
|
410
450
|
resolveAgentGuiWorkbenchDefaultLaunchFrame,
|
|
411
451
|
resolveAgentGuiWorkbenchContributionCopy
|
|
412
452
|
};
|
|
413
|
-
//# sourceMappingURL=chunk-
|
|
453
|
+
//# sourceMappingURL=chunk-EK5RDKG7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../workbench/contribution.ts","../workbench/header.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport {\n getWorkbenchLayoutFrame,\n type WorkbenchContribution,\n type WorkbenchFrame,\n type WorkbenchHostDockEntry,\n type WorkbenchHostDockPopupItemInput,\n type WorkbenchHostLaunchRequest,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport {\n resolveAgentGUIExpandedWindowFrame,\n shouldAutoCollapseAgentGUIConversationRail\n} from \"../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts\";\nimport { agentGuiDockIconUrls } from \"../dockIcons.ts\";\nimport { AgentGuiWorkbenchHeader } from \"./header.ts\";\nimport {\n agentGuiWorkbenchDockEntryId,\n agentGuiWorkbenchProviderFromIdentifier,\n agentGuiWorkbenchTypeId,\n createAgentGuiWorkbenchLaunchDescriptor\n} from \"./launch.ts\";\nimport {\n agentGuiWorkbenchProviderFromInstanceId,\n createAgentGuiWorkbenchNodeStateSource,\n normalizeAgentGuiWorkbenchNodeState,\n normalizeAgentGuiWorkbenchState\n} from \"./state.ts\";\nimport {\n agentGuiWorkbenchProviderLabels,\n agentGuiWorkbenchProviders,\n isAgentGuiWorkbenchDefaultDockProvider,\n resolveAgentGuiWorkbenchProviderLabel\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\n\nexport const agentGuiWorkbenchDefaultNodeFrame: WorkbenchFrame = {\n height: 560,\n width: 1040,\n x: 140,\n y: 48\n};\n\nexport const agentGuiWorkbenchDefaultUsableHeightRatio = 0.7;\nexport const agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;\n\nexport const AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT =\n \"tutti:agent-gui-workbench-conversation-rail-toggle\";\n\nexport const AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT =\n \"tutti:agent-gui-workbench-new-conversation\";\n\nexport interface AgentGuiWorkbenchConversationRailToggleDetail {\n conversationRailCollapsed: boolean;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchNewConversationDetail {\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchContributionCopy {\n collapseConversationRail: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n newConversation: string;\n nodeTitle: string;\n}\n\nexport type AgentGuiWorkbenchContributionCopyOverrides =\n Partial<AgentGuiWorkbenchContributionCopy>;\n\nexport const agentGuiWorkbenchDefaultCopy: AgentGuiWorkbenchContributionCopy = {\n collapseConversationRail: \"Collapse conversation rail\",\n expandConversationRail: \"Expand conversation rail\",\n fallbackAgentLabel: \"Agent\",\n newConversation: \"New conversation\",\n nodeTitle: \"Agent\"\n};\n\nexport interface AgentGuiWorkbenchRenderBodyHelpers {\n nodeTypeId: string;\n onStateChange(state: AgentGuiWorkbenchState): void;\n provider: AgentGuiWorkbenchProvider;\n}\n\nexport interface CreateAgentGuiWorkbenchContributionInput {\n copy?: AgentGuiWorkbenchContributionCopyOverrides;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n dockSectionId?: string;\n frame?: WorkbenchFrame;\n id?: string;\n renderBody(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n renderPreview?(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n resolveDockPopupTitle?: (\n state: AgentGuiWorkbenchState | null\n ) => string | null;\n resolveDockEntryVisibility?: (\n provider: AgentGuiWorkbenchProvider\n ) => WorkbenchHostDockEntry[\"visibility\"];\n workspaceId: string;\n}\n\nexport function createAgentGuiWorkbenchContribution(\n input: CreateAgentGuiWorkbenchContributionInput\n): WorkbenchContribution {\n const nodeStateSource = createAgentGuiWorkbenchNodeStateSource({\n workspaceId: input.workspaceId\n });\n const frame = input.frame ?? agentGuiWorkbenchDefaultNodeFrame;\n const copy = resolveAgentGuiWorkbenchContributionCopy(input.copy);\n\n return {\n dockEntries: agentGuiWorkbenchProviders.map((provider, index) =>\n createAgentGuiWorkbenchDockEntry({\n label: agentGuiWorkbenchProviderLabels[provider],\n iconUrl:\n input.dockIconUrls?.[provider] ?? agentGuiDockIconUrls[provider],\n order: index,\n provider,\n renderPreview: input.renderPreview,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId: input.dockSectionId ?? \"agents\",\n visibility:\n input.resolveDockEntryVisibility?.(provider) ??\n (isAgentGuiWorkbenchDefaultDockProvider(provider)\n ? \"always\"\n : \"never\")\n })\n ),\n externalStateSource: nodeStateSource.externalStateSource,\n id: input.id ?? \"workspace-agent-gui\",\n nodes: [\n {\n frame,\n instance: { mode: \"multi\" },\n renderBody: (context) =>\n input.renderBody(\n context as WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n {\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: (state) => {\n nodeStateSource.writeNodeState({\n instanceId: context.instanceId,\n nodeId: context.node.id,\n state,\n typeId: agentGuiWorkbenchTypeId\n });\n },\n provider: agentGuiWorkbenchProviderFromInstanceId(\n context.instanceId\n )\n }\n ),\n renderHeader: ({\n defaultActions,\n dragHandleProps,\n externalNodeState,\n instanceId,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const provider = agentGuiWorkbenchProviderFromInstanceId(instanceId);\n const title = resolveAgentGuiWorkbenchProviderLabel(provider);\n const workbenchState = normalizeAgentGuiWorkbenchState(\n externalNodeState ?? node.data.runtimeNodeState\n );\n const nodeState = normalizeAgentGuiWorkbenchNodeState(\n workbenchState,\n provider\n );\n const isConversationRailAutoCollapsed =\n shouldAutoCollapseAgentGUIConversationRail(node.frame.width);\n const isConversationRailCollapsed =\n nodeState.conversationRailCollapsed === true ||\n isConversationRailAutoCollapsed;\n const persistConversationRailCollapsed = (collapsed: boolean) => {\n nodeStateSource.writeNodeState({\n instanceId,\n nodeId: node.id,\n state: {\n ...workbenchState,\n conversationRailCollapsed: collapsed\n },\n typeId: agentGuiWorkbenchTypeId\n });\n };\n const announceConversationRailCollapsed = (collapsed: boolean) => {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchConversationRailToggleDetail>(\n AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,\n {\n detail: {\n conversationRailCollapsed: collapsed,\n instanceId\n }\n }\n )\n );\n };\n const announceNewConversation = () => {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchNewConversationDetail>(\n AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT,\n {\n detail: {\n instanceId\n }\n }\n )\n );\n };\n\n return createElement(AgentGuiWorkbenchHeader, {\n copy,\n defaultActions,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n title,\n ...dragHandleProps,\n onCreateConversation: announceNewConversation,\n onPointerDown: (event) => {\n dragHandleProps.onPointerDown?.(event);\n if (!isFocused) {\n windowActions.focus();\n }\n },\n onToggleConversationRail: (nextCollapsed) => {\n announceConversationRailCollapsed(nextCollapsed);\n if (\n isConversationRailCollapsed &&\n nextCollapsed === false &&\n node.displayMode !== \"fullscreen\"\n ) {\n const expandedFrame = resolveAgentGUIExpandedWindowFrame({\n conversationRailWidthPx: nodeState.conversationRailWidthPx,\n desktopSize: surfaceSize,\n height: node.frame.height,\n position: {\n x: node.frame.x,\n y: node.frame.y\n },\n width: node.frame.width\n });\n\n windowActions.resize({\n ...node.frame,\n height: expandedFrame.size.height,\n width: expandedFrame.size.width,\n x: expandedFrame.position.x,\n y: expandedFrame.position.y\n });\n }\n\n persistConversationRailCollapsed(nextCollapsed);\n }\n });\n },\n title: copy.nodeTitle,\n typeId: agentGuiWorkbenchTypeId,\n window: {\n closable: true,\n defaultOpen: false,\n minimizedDock: {\n kind: \"snapshot\"\n },\n minimizable: true\n }\n }\n ],\n onLaunchRequest: (request) => {\n if (request.typeId !== agentGuiWorkbenchTypeId) {\n return null;\n }\n\n const {\n activation,\n dockEntryId,\n instanceId,\n provider,\n reuseDockEntryNode,\n targetAgentSessionId\n } = createAgentGuiWorkbenchLaunchDescriptor(request);\n const title = resolveAgentGuiWorkbenchProviderLabel(provider);\n if (targetAgentSessionId) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...normalizeAgentGuiWorkbenchState(previousState),\n ...(targetAgentSessionId\n ? { lastActiveAgentSessionId: targetAgentSessionId }\n : {})\n },\n typeId: agentGuiWorkbenchTypeId\n });\n }\n const defaultFrame = resolveAgentGuiWorkbenchDefaultLaunchFrame({\n frame,\n request\n });\n return {\n activation,\n defaultFrame,\n dockEntryId,\n framePolicy: isAgentGuiWorkbenchCompactVisibleFrame(defaultFrame, frame)\n ? \"absolute\"\n : \"cascade-same-type-centered\",\n instanceId,\n reuseDockEntryNode,\n title,\n typeId: agentGuiWorkbenchTypeId\n };\n }\n };\n}\n\nexport function resolveAgentGuiWorkbenchDefaultLaunchFrame(input: {\n frame: WorkbenchFrame;\n request: Pick<\n WorkbenchHostLaunchRequest,\n \"layoutConstraints\" | \"surfaceSize\"\n >;\n}): WorkbenchFrame {\n const layoutFrame = getWorkbenchLayoutFrame(\n input.request.surfaceSize,\n input.request.layoutConstraints\n );\n const defaultHeight = Math.round(\n layoutFrame.height * agentGuiWorkbenchDefaultUsableHeightRatio\n );\n const shouldUseCompactWidth = layoutFrame.width < input.frame.width;\n const shouldUseCompactHeight =\n layoutFrame.height <\n input.frame.height / agentGuiWorkbenchCompactVisibleAreaRatio;\n\n if (shouldUseCompactWidth || shouldUseCompactHeight) {\n const width = shouldUseCompactWidth\n ? Math.round(layoutFrame.width * agentGuiWorkbenchCompactVisibleAreaRatio)\n : input.frame.width;\n const height = Math.round(\n layoutFrame.height * agentGuiWorkbenchCompactVisibleAreaRatio\n );\n\n return {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n };\n }\n\n return {\n ...input.frame,\n height: defaultHeight\n };\n}\n\nfunction isAgentGuiWorkbenchCompactVisibleFrame(\n frame: WorkbenchFrame,\n defaultFrame: WorkbenchFrame\n): boolean {\n return frame.width !== defaultFrame.width || frame.x !== defaultFrame.x;\n}\n\nexport function resolveAgentGuiWorkbenchContributionCopy(\n copy?: AgentGuiWorkbenchContributionCopyOverrides\n): AgentGuiWorkbenchContributionCopy {\n return {\n ...agentGuiWorkbenchDefaultCopy,\n ...copy\n };\n}\n\nfunction createAgentGuiWorkbenchDockEntry(input: {\n iconUrl?: string;\n label: string;\n order: number;\n provider: AgentGuiWorkbenchProvider;\n renderPreview?: CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId: string;\n visibility: WorkbenchHostDockEntry[\"visibility\"];\n}): WorkbenchHostDockEntry {\n return {\n icon: createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src: input.iconUrl\n }),\n iconSize: \"large\",\n id: agentGuiWorkbenchDockEntryId(input.provider),\n label: input.label,\n launchBehavior: \"enabled\",\n launchPayload: { provider: input.provider },\n matchNode: (node) =>\n node.data.typeId === agentGuiWorkbenchTypeId &&\n agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ===\n input.provider,\n order: input.order,\n providePopupItemPreview: (item) => {\n if (!input.renderPreview) {\n return null;\n }\n const { externalNodeState, node } = item;\n const state = normalizeAgentGuiWorkbenchState(externalNodeState);\n const title = input.resolveDockPopupTitle?.(state) ?? node.title;\n const lines = [input.label, state.lastActiveAgentSessionId].filter(\n (line): line is string => Boolean(line?.trim())\n );\n const revision = `${input.provider}\\n${title}\\n${lines.join(\"\\n\")}`;\n return {\n element: input.renderPreview(\n createAgentGuiWorkbenchPreviewBodyContext(item),\n {\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: () => undefined,\n provider: input.provider\n }\n ),\n kind: \"component\",\n revision\n };\n },\n resolvePopupItem: ({ externalNodeState }) => {\n const title =\n input.resolveDockPopupTitle?.(\n normalizeAgentGuiWorkbenchState(externalNodeState)\n ) ?? null;\n return {\n revision: `${input.provider}\\n${title ?? \"\"}`,\n title\n };\n },\n sectionId: input.sectionId,\n typeId: agentGuiWorkbenchTypeId,\n visibility: input.visibility\n };\n}\n\nfunction createAgentGuiWorkbenchPreviewBodyContext(\n input: WorkbenchHostDockPopupItemInput\n): WorkbenchHostNodeBodyContext<AgentGuiWorkbenchState | null, unknown> {\n return {\n activation: null,\n displayMode: input.node.displayMode,\n externalNodeState: input.externalNodeState as AgentGuiWorkbenchState | null,\n externalWorkspaceState: input.externalWorkspaceState,\n focus: () => undefined,\n host: input.host,\n instanceId: input.node.data.instanceId,\n instanceKey: input.node.data.instanceKey ?? null,\n isFocused: false,\n node: input.node,\n setNodeRuntimeState: () => undefined,\n setSnapshotNodeState: () => undefined\n };\n}\n","import { createElement, type HTMLAttributes, type ReactNode } from \"react\";\nimport { Button, PanelIcon, cn } from \"@tutti-os/ui-system\";\nimport { EditIcon } from \"@tutti-os/ui-system/icons\";\n\nexport interface AgentGuiWorkbenchHeaderCopy {\n collapseConversationRail: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n newConversation: string;\n}\n\nexport interface AgentGuiWorkbenchHeaderProps extends HTMLAttributes<HTMLElement> {\n copy: AgentGuiWorkbenchHeaderCopy;\n defaultActions?: ReactNode;\n isConversationRailAutoCollapsed: boolean;\n isConversationRailCollapsed: boolean;\n onCreateConversation?: () => void;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n title?: string;\n}\n\nexport function AgentGuiWorkbenchHeader({\n className,\n copy,\n defaultActions,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n onCreateConversation,\n onToggleConversationRail,\n title,\n ...headerProps\n}: AgentGuiWorkbenchHeaderProps): ReactNode {\n const toggleLabel = isConversationRailCollapsed\n ? copy.expandConversationRail\n : copy.collapseConversationRail;\n\n return createElement(\n \"header\",\n {\n ...headerProps,\n className: cn(\n \"flex h-full min-h-0 items-center justify-between gap-3 bg-[var(--background-panel)] px-2 pl-3\",\n className\n )\n },\n createElement(\n \"div\",\n { className: \"flex min-w-0 items-center gap-1\" },\n createElement(\n \"span\",\n {\n className:\n \"min-w-0 truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\"\n },\n title?.trim() || copy.fallbackAgentLabel\n ),\n createElement(\n Button as never,\n {\n \"aria-label\": toggleLabel,\n className: \"cursor-pointer rounded-md\",\n \"data-agent-gui-conversation-rail-auto-collapsed\":\n isConversationRailAutoCollapsed ? \"true\" : undefined,\n \"data-agent-gui-conversation-rail-collapsed\":\n isConversationRailCollapsed ? \"true\" : undefined,\n \"data-testid\": \"agent-gui-toggle-conversation-rail\",\n size: \"icon-xs\",\n title: toggleLabel,\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onToggleConversationRail(!isConversationRailCollapsed);\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(PanelIcon, { className: \"size-[18px]\" })\n ),\n isConversationRailCollapsed && onCreateConversation\n ? createElement(\n Button as never,\n {\n \"aria-label\": copy.newConversation,\n className: \"cursor-pointer rounded-md\",\n size: \"icon-xs\",\n title: copy.newConversation,\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onCreateConversation();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(EditIcon, {\n \"aria-hidden\": true,\n className: \"size-[16px]\"\n })\n )\n : null\n ),\n createElement(\n \"div\",\n {\n className: \"flex flex-none items-center gap-1\",\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n defaultActions\n )\n );\n}\n"],"mappings":"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","names":["createElement","createElement"]}
|
|
@@ -12,13 +12,14 @@ import {
|
|
|
12
12
|
resolveWorkspaceFilePathCandidate,
|
|
13
13
|
resolveWorkspaceLinkAction,
|
|
14
14
|
useOptionalAgentHostApi
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-YKDFQADM.js";
|
|
16
16
|
import {
|
|
17
17
|
attrsToMentionItem,
|
|
18
18
|
createAgentFileMentionExtension,
|
|
19
19
|
formatAgentMentionMarkdown,
|
|
20
|
+
mentionItemToAttrs,
|
|
20
21
|
parseAgentMentionMarkdown
|
|
21
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-U4F3COKL.js";
|
|
22
23
|
import {
|
|
23
24
|
isWorkspaceAgentSyntheticControlMessage
|
|
24
25
|
} from "./chunk-XJ34OIEQ.js";
|
|
@@ -27,7 +28,7 @@ import {
|
|
|
27
28
|
} from "./chunk-TYGL25EL.js";
|
|
28
29
|
import {
|
|
29
30
|
translate
|
|
30
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-KJPMZ7G5.js";
|
|
31
32
|
|
|
32
33
|
// shared/imageGenerationTool.ts
|
|
33
34
|
var KNOWN_IMAGE_GENERATION_TOOL_NAMES = /* @__PURE__ */ new Set([
|
|
@@ -2890,7 +2891,8 @@ function computeAgentToolGroups(sequence, {
|
|
|
2890
2891
|
}) {
|
|
2891
2892
|
const groups = /* @__PURE__ */ new Map();
|
|
2892
2893
|
const groupedIndices = /* @__PURE__ */ new Set();
|
|
2893
|
-
const suppressedIndices =
|
|
2894
|
+
const suppressedIndices = /* @__PURE__ */ new Set();
|
|
2895
|
+
const splitFromIndex = allowTrailingFinalization ? -1 : findActiveTailRunStartIndex(sequence);
|
|
2894
2896
|
let currentCalls = [];
|
|
2895
2897
|
let currentEntries = [];
|
|
2896
2898
|
let currentIndices = [];
|
|
@@ -2920,7 +2922,8 @@ function computeAgentToolGroups(sequence, {
|
|
|
2920
2922
|
if (!item) {
|
|
2921
2923
|
continue;
|
|
2922
2924
|
}
|
|
2923
|
-
if (
|
|
2925
|
+
if (splitFromIndex >= 0 && index >= splitFromIndex) {
|
|
2926
|
+
finalizeGroup();
|
|
2924
2927
|
continue;
|
|
2925
2928
|
}
|
|
2926
2929
|
if (item.kind === "tool-call" && isGroupableToolCall2(item.call)) {
|
|
@@ -3040,27 +3043,22 @@ function isGroupableToolCall2(call) {
|
|
|
3040
3043
|
return true;
|
|
3041
3044
|
}
|
|
3042
3045
|
}
|
|
3043
|
-
function
|
|
3044
|
-
|
|
3045
|
-
let latestTailToolIndex = -1;
|
|
3046
|
+
function findActiveTailRunStartIndex(sequence) {
|
|
3047
|
+
let tailIndex = -1;
|
|
3046
3048
|
for (let index = sequence.length - 1; index >= 0; index -= 1) {
|
|
3047
3049
|
const item = sequence[index];
|
|
3048
3050
|
if (!item) {
|
|
3049
3051
|
continue;
|
|
3050
3052
|
}
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
}
|
|
3054
|
-
latestTailToolIndex = Math.max(latestTailToolIndex, index);
|
|
3055
|
-
}
|
|
3056
|
-
if (latestTailToolIndex < 0) {
|
|
3057
|
-
return suppressedIndices;
|
|
3053
|
+
tailIndex = index;
|
|
3054
|
+
break;
|
|
3058
3055
|
}
|
|
3059
|
-
const
|
|
3060
|
-
if (
|
|
3061
|
-
return
|
|
3056
|
+
const tailItem = tailIndex >= 0 ? sequence[tailIndex] : void 0;
|
|
3057
|
+
if (tailItem?.kind !== "tool-call" || !isActiveTailTool(tailItem.call)) {
|
|
3058
|
+
return -1;
|
|
3062
3059
|
}
|
|
3063
|
-
|
|
3060
|
+
let startIndex = tailIndex;
|
|
3061
|
+
for (let index = tailIndex - 1; index >= 0; index -= 1) {
|
|
3064
3062
|
const item = sequence[index];
|
|
3065
3063
|
if (!item) {
|
|
3066
3064
|
continue;
|
|
@@ -3068,11 +3066,11 @@ function findActiveTailSuppressedToolIndices(sequence) {
|
|
|
3068
3066
|
if (item.kind !== "tool-call") {
|
|
3069
3067
|
break;
|
|
3070
3068
|
}
|
|
3071
|
-
|
|
3069
|
+
startIndex = index;
|
|
3072
3070
|
}
|
|
3073
|
-
return
|
|
3071
|
+
return startIndex;
|
|
3074
3072
|
}
|
|
3075
|
-
function
|
|
3073
|
+
function isActiveTailTool(call) {
|
|
3076
3074
|
if (call.statusKind !== "working" && call.statusKind !== "waiting") {
|
|
3077
3075
|
return false;
|
|
3078
3076
|
}
|
|
@@ -4874,7 +4872,7 @@ function createAgentSkillTokenExtension(options = {}) {
|
|
|
4874
4872
|
group: "inline",
|
|
4875
4873
|
inline: true,
|
|
4876
4874
|
atom: true,
|
|
4877
|
-
selectable:
|
|
4875
|
+
selectable: true,
|
|
4878
4876
|
addOptions() {
|
|
4879
4877
|
return options;
|
|
4880
4878
|
},
|
|
@@ -4890,6 +4888,7 @@ function createAgentSkillTokenExtension(options = {}) {
|
|
|
4890
4888
|
},
|
|
4891
4889
|
renderHTML({ HTMLAttributes }) {
|
|
4892
4890
|
const attrs = attrsToSkillTokenAttrs(HTMLAttributes);
|
|
4891
|
+
const displayLabel = skillTokenDisplayLabel(attrs);
|
|
4893
4892
|
return [
|
|
4894
4893
|
"span",
|
|
4895
4894
|
mergeAttributes(HTMLAttributes, {
|
|
@@ -4915,7 +4914,7 @@ function createAgentSkillTokenExtension(options = {}) {
|
|
|
4915
4914
|
""
|
|
4916
4915
|
]
|
|
4917
4916
|
],
|
|
4918
|
-
["span", { class: "tsh-agent-object-token__main" },
|
|
4917
|
+
["span", { class: "tsh-agent-object-token__main" }, displayLabel]
|
|
4919
4918
|
];
|
|
4920
4919
|
},
|
|
4921
4920
|
renderText({ node }) {
|
|
@@ -4971,6 +4970,13 @@ function attrsToSkillTokenAttrs(attrs) {
|
|
|
4971
4970
|
trigger: typeof attrs.trigger === "string" ? attrs.trigger : ""
|
|
4972
4971
|
};
|
|
4973
4972
|
}
|
|
4973
|
+
function skillTokenDisplayLabel(attrs) {
|
|
4974
|
+
const label = attrs.label.trim() || attrs.trigger.trim();
|
|
4975
|
+
if (!label || label.startsWith("/") || label.startsWith("$")) {
|
|
4976
|
+
return label;
|
|
4977
|
+
}
|
|
4978
|
+
return `/${label}`;
|
|
4979
|
+
}
|
|
4974
4980
|
|
|
4975
4981
|
// agent-gui/agentGuiNode/agentRichText/agentCapabilityTokenExtension.ts
|
|
4976
4982
|
import { mergeAttributes as mergeAttributes2, Node as Node2 } from "@tiptap/core";
|
|
@@ -4980,7 +4986,7 @@ function createAgentCapabilityTokenExtension(options = {}) {
|
|
|
4980
4986
|
group: "inline",
|
|
4981
4987
|
inline: true,
|
|
4982
4988
|
atom: true,
|
|
4983
|
-
selectable:
|
|
4989
|
+
selectable: true,
|
|
4984
4990
|
addOptions() {
|
|
4985
4991
|
return options;
|
|
4986
4992
|
},
|
|
@@ -4997,6 +5003,7 @@ function createAgentCapabilityTokenExtension(options = {}) {
|
|
|
4997
5003
|
},
|
|
4998
5004
|
renderHTML({ HTMLAttributes }) {
|
|
4999
5005
|
const attrs = attrsToCapabilityTokenAttrs(HTMLAttributes);
|
|
5006
|
+
const displayLabel = capabilityTokenDisplayLabel(attrs);
|
|
5000
5007
|
return [
|
|
5001
5008
|
"span",
|
|
5002
5009
|
mergeAttributes2(HTMLAttributes, {
|
|
@@ -5022,7 +5029,7 @@ function createAgentCapabilityTokenExtension(options = {}) {
|
|
|
5022
5029
|
""
|
|
5023
5030
|
]
|
|
5024
5031
|
],
|
|
5025
|
-
["span", { class: "tsh-agent-object-token__main" },
|
|
5032
|
+
["span", { class: "tsh-agent-object-token__main" }, displayLabel]
|
|
5026
5033
|
];
|
|
5027
5034
|
},
|
|
5028
5035
|
renderText({ node }) {
|
|
@@ -5078,6 +5085,13 @@ function attrsToCapabilityTokenAttrs(attrs) {
|
|
|
5078
5085
|
trigger: typeof attrs.trigger === "string" ? attrs.trigger : ""
|
|
5079
5086
|
};
|
|
5080
5087
|
}
|
|
5088
|
+
function capabilityTokenDisplayLabel(attrs) {
|
|
5089
|
+
const label = attrs.label.trim() || attrs.trigger.trim();
|
|
5090
|
+
if (!label || label.startsWith("/") || label.startsWith("$")) {
|
|
5091
|
+
return label;
|
|
5092
|
+
}
|
|
5093
|
+
return `/${label}`;
|
|
5094
|
+
}
|
|
5081
5095
|
|
|
5082
5096
|
// agent-gui/agentGuiNode/agentRichText/agentRichTextDocument.ts
|
|
5083
5097
|
function createEmptyDocument() {
|
|
@@ -5110,7 +5124,9 @@ function createParagraphFromText(text, options = {}) {
|
|
|
5110
5124
|
flushTextBuffer();
|
|
5111
5125
|
content.push({
|
|
5112
5126
|
type: "agentFileMention",
|
|
5113
|
-
attrs
|
|
5127
|
+
// 转成规范 node attrs(如 bundle 的 filesJson),否则只读回显里的
|
|
5128
|
+
// bundle chip 拿不到文件数 → 不显示「N 个文件」角标。
|
|
5129
|
+
attrs: mentionItemToAttrs(parsedMention.item)
|
|
5114
5130
|
});
|
|
5115
5131
|
index = parsedMention.end;
|
|
5116
5132
|
continue;
|
|
@@ -5162,25 +5178,28 @@ function plainTextToAgentRichTextInlineContent(text, options = {}) {
|
|
|
5162
5178
|
);
|
|
5163
5179
|
return paragraph.content ?? [];
|
|
5164
5180
|
}
|
|
5165
|
-
function agentRichTextDocToPromptText(doc) {
|
|
5181
|
+
function agentRichTextDocToPromptText(doc, mode = "display") {
|
|
5166
5182
|
if (doc.type !== "doc") {
|
|
5167
|
-
return nodeToPromptText(doc);
|
|
5183
|
+
return nodeToPromptText(doc, mode);
|
|
5168
5184
|
}
|
|
5169
5185
|
const blocks = doc.content ?? [];
|
|
5170
5186
|
if (blocks.length === 0) {
|
|
5171
5187
|
return "";
|
|
5172
5188
|
}
|
|
5173
|
-
return blocks.map(nodeToPromptText).join("\n");
|
|
5189
|
+
return blocks.map((block) => nodeToPromptText(block, mode)).join("\n");
|
|
5174
5190
|
}
|
|
5175
|
-
function editorToPromptText(editor) {
|
|
5176
|
-
return agentRichTextDocToPromptText(editor.getJSON());
|
|
5191
|
+
function editorToPromptText(editor, mode = "display") {
|
|
5192
|
+
return agentRichTextDocToPromptText(editor.getJSON(), mode);
|
|
5177
5193
|
}
|
|
5178
|
-
function nodeToPromptText(node) {
|
|
5194
|
+
function nodeToPromptText(node, mode) {
|
|
5179
5195
|
if (node.type === "text") {
|
|
5180
5196
|
return node.text ?? "";
|
|
5181
5197
|
}
|
|
5182
5198
|
if (node.type === "agentFileMention") {
|
|
5183
|
-
return formatAgentMentionMarkdown(
|
|
5199
|
+
return formatAgentMentionMarkdown(
|
|
5200
|
+
attrsToMentionItem(node.attrs ?? {}),
|
|
5201
|
+
mode
|
|
5202
|
+
);
|
|
5184
5203
|
}
|
|
5185
5204
|
if (node.type === "agentSkillToken") {
|
|
5186
5205
|
return typeof node.attrs?.trigger === "string" ? node.attrs.trigger : "";
|
|
@@ -5194,10 +5213,13 @@ function nodeToPromptText(node) {
|
|
|
5194
5213
|
if (!node.content || node.content.length === 0) {
|
|
5195
5214
|
return "";
|
|
5196
5215
|
}
|
|
5197
|
-
return node.content.map(nodeToPromptText).join("");
|
|
5216
|
+
return node.content.map((child) => nodeToPromptText(child, mode)).join("");
|
|
5198
5217
|
}
|
|
5199
5218
|
|
|
5200
5219
|
// agent-gui/agentGuiNode/agentRichText/agentRichTextExtensions.ts
|
|
5220
|
+
import { Extension } from "@tiptap/core";
|
|
5221
|
+
import { NodeSelection, TextSelection } from "@tiptap/pm/state";
|
|
5222
|
+
import { Plugin } from "@tiptap/pm/state";
|
|
5201
5223
|
import StarterKit from "@tiptap/starter-kit";
|
|
5202
5224
|
function createAgentPromptStarterKit() {
|
|
5203
5225
|
return StarterKit.configure({
|
|
@@ -5220,8 +5242,63 @@ function createAgentPromptStarterKit() {
|
|
|
5220
5242
|
underline: false
|
|
5221
5243
|
});
|
|
5222
5244
|
}
|
|
5245
|
+
function createAgentTokenKeyboardExtension() {
|
|
5246
|
+
return Extension.create({
|
|
5247
|
+
name: "agentTokenKeyboard",
|
|
5248
|
+
addProseMirrorPlugins() {
|
|
5249
|
+
return [
|
|
5250
|
+
new Plugin({
|
|
5251
|
+
props: {
|
|
5252
|
+
handleKeyDown(view, event) {
|
|
5253
|
+
if (event.key !== "Backspace" && event.key !== "ArrowLeft") {
|
|
5254
|
+
return false;
|
|
5255
|
+
}
|
|
5256
|
+
const { doc, selection } = view.state;
|
|
5257
|
+
if (selection instanceof NodeSelection && isSelectableAgentToken(selection.node)) {
|
|
5258
|
+
event.preventDefault();
|
|
5259
|
+
if (event.key === "ArrowLeft") {
|
|
5260
|
+
view.dispatch(
|
|
5261
|
+
view.state.tr.setSelection(
|
|
5262
|
+
TextSelection.create(doc, selection.from)
|
|
5263
|
+
)
|
|
5264
|
+
);
|
|
5265
|
+
} else {
|
|
5266
|
+
view.dispatch(
|
|
5267
|
+
view.state.tr.delete(selection.from, selection.to)
|
|
5268
|
+
);
|
|
5269
|
+
}
|
|
5270
|
+
return true;
|
|
5271
|
+
}
|
|
5272
|
+
if (!selection.empty) {
|
|
5273
|
+
return false;
|
|
5274
|
+
}
|
|
5275
|
+
const nodeBefore = selection.$from.nodeBefore;
|
|
5276
|
+
if (!nodeBefore || !isSelectableAgentToken(nodeBefore)) {
|
|
5277
|
+
return false;
|
|
5278
|
+
}
|
|
5279
|
+
event.preventDefault();
|
|
5280
|
+
view.dispatch(
|
|
5281
|
+
view.state.tr.setSelection(
|
|
5282
|
+
NodeSelection.create(
|
|
5283
|
+
doc,
|
|
5284
|
+
selection.from - nodeBefore.nodeSize
|
|
5285
|
+
)
|
|
5286
|
+
)
|
|
5287
|
+
);
|
|
5288
|
+
return true;
|
|
5289
|
+
}
|
|
5290
|
+
}
|
|
5291
|
+
})
|
|
5292
|
+
];
|
|
5293
|
+
}
|
|
5294
|
+
});
|
|
5295
|
+
}
|
|
5296
|
+
function isSelectableAgentToken(node) {
|
|
5297
|
+
return node?.type.name === "agentSkillToken" || node?.type.name === "agentCapabilityToken";
|
|
5298
|
+
}
|
|
5223
5299
|
function createAgentRichTextInputExtensions(fileMentionOptions, skillTokenOptions, capabilityTokenOptions) {
|
|
5224
5300
|
return [
|
|
5301
|
+
createAgentTokenKeyboardExtension(),
|
|
5225
5302
|
createAgentPromptStarterKit(),
|
|
5226
5303
|
createAgentFileMentionExtension(fileMentionOptions),
|
|
5227
5304
|
createAgentCapabilityTokenExtension(capabilityTokenOptions),
|
|
@@ -11998,4 +12075,4 @@ export {
|
|
|
11998
12075
|
AgentConversationFlow,
|
|
11999
12076
|
useProjectedAgentConversation
|
|
12000
12077
|
};
|
|
12001
|
-
//# sourceMappingURL=chunk-
|
|
12078
|
+
//# sourceMappingURL=chunk-H4HT3FE6.js.map
|