@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.
Files changed (64) hide show
  1. package/dist/agent-conversation/index.d.ts +1 -1
  2. package/dist/agent-conversation/index.js +4 -4
  3. package/dist/agent-message-center/index.d.ts +1 -1
  4. package/dist/agent-message-center/index.js +4 -4
  5. package/dist/agentFileMentionExtension-CM1c9bqk.d.ts +86 -0
  6. package/dist/app/renderer/agentactivity.css +33 -9
  7. package/dist/{chunk-WME2V26J.js → chunk-2CA4NPP3.js} +15 -33
  8. package/dist/chunk-2CA4NPP3.js.map +1 -0
  9. package/dist/{chunk-ZO3SZCIX.js → chunk-7CBJJNX6.js} +5 -2
  10. package/dist/chunk-7CBJJNX6.js.map +1 -0
  11. package/dist/{chunk-ASAZDEQE.js → chunk-EK5RDKG7.js} +54 -14
  12. package/dist/chunk-EK5RDKG7.js.map +1 -0
  13. package/dist/{chunk-GZHQPPK2.js → chunk-H4HT3FE6.js} +113 -36
  14. package/dist/chunk-H4HT3FE6.js.map +1 -0
  15. package/dist/{chunk-YXSO4ITT.js → chunk-HIREVEZM.js} +1 -1
  16. package/dist/chunk-HIREVEZM.js.map +1 -0
  17. package/dist/{chunk-VDNMTW2E.js → chunk-IXIGWLQY.js} +1 -1
  18. package/dist/chunk-IXIGWLQY.js.map +1 -0
  19. package/dist/{chunk-FSTZDNRM.js → chunk-KJPMZ7G5.js} +243 -167
  20. package/dist/chunk-KJPMZ7G5.js.map +1 -0
  21. package/dist/{chunk-GEXHKJK5.js → chunk-MUZMBEFO.js} +35 -17
  22. package/dist/chunk-MUZMBEFO.js.map +1 -0
  23. package/dist/{chunk-HSXDSFKB.js → chunk-OFGXNXYT.js} +2 -2
  24. package/dist/{chunk-3YZX5EUC.js → chunk-SVOGXWFJ.js} +53 -17
  25. package/dist/{chunk-3YZX5EUC.js.map → chunk-SVOGXWFJ.js.map} +1 -1
  26. package/dist/{chunk-MU2LODEV.js → chunk-U4F3COKL.js} +160 -10
  27. package/dist/chunk-U4F3COKL.js.map +1 -0
  28. package/dist/{chunk-KEKPOVQD.js → chunk-XHQGCP7A.js} +2 -2
  29. package/dist/{chunk-RLPVFX7V.js → chunk-YKDFQADM.js} +36 -7
  30. package/dist/chunk-YKDFQADM.js.map +1 -0
  31. package/dist/context-mention-palette/index.d.ts +8 -68
  32. package/dist/context-mention-palette/index.js +6 -6
  33. package/dist/context-mention-provider.d.ts +6 -1
  34. package/dist/context-mention-provider.js +1 -1
  35. package/dist/i18n/index.d.ts +239 -163
  36. package/dist/i18n/index.js +1 -1
  37. package/dist/index.d.ts +37 -2
  38. package/dist/index.js +1495 -990
  39. package/dist/index.js.map +1 -1
  40. package/dist/workbench/contribution.d.ts +7 -1
  41. package/dist/workbench/contribution.js +6 -4
  42. package/dist/workbench/index.d.ts +4 -2
  43. package/dist/workbench/index.js +6 -4
  44. package/dist/workbench/launch.d.ts +2 -0
  45. package/dist/workbench/launch.js +2 -2
  46. package/dist/workbench/state.d.ts +3 -2
  47. package/dist/workbench/state.js +1 -1
  48. package/dist/workbench/types.d.ts +3 -0
  49. package/dist/workbench/types.js +1 -1
  50. package/dist/workspace-agent-generated-files.js +2 -2
  51. package/dist/{workspaceLinkActions-BlLN8Pvz.d.ts → workspaceLinkActions-Mjktl_Be.d.ts} +3 -0
  52. package/package.json +15 -13
  53. package/dist/chunk-ASAZDEQE.js.map +0 -1
  54. package/dist/chunk-FSTZDNRM.js.map +0 -1
  55. package/dist/chunk-GEXHKJK5.js.map +0 -1
  56. package/dist/chunk-GZHQPPK2.js.map +0 -1
  57. package/dist/chunk-MU2LODEV.js.map +0 -1
  58. package/dist/chunk-RLPVFX7V.js.map +0 -1
  59. package/dist/chunk-VDNMTW2E.js.map +0 -1
  60. package/dist/chunk-WME2V26J.js.map +0 -1
  61. package/dist/chunk-YXSO4ITT.js.map +0 -1
  62. package/dist/chunk-ZO3SZCIX.js.map +0 -1
  63. /package/dist/{chunk-HSXDSFKB.js.map → chunk-OFGXNXYT.js.map} +0 -0
  64. /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-ZO3SZCIX.js";
6
+ } from "./chunk-7CBJJNX6.js";
7
7
  import {
8
8
  agentGuiWorkbenchProviderFromInstanceId,
9
9
  createAgentGuiWorkbenchNodeStateSource,
10
10
  normalizeAgentGuiWorkbenchNodeState,
11
11
  normalizeAgentGuiWorkbenchState
12
- } from "./chunk-GEXHKJK5.js";
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-2" },
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-sm",
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
- ...previousState ?? normalizeAgentGuiWorkbenchState(null),
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 = resolveAgentGuiWorkbenchDockPopupTitle(externalNodeState) ?? node.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 = resolveAgentGuiWorkbenchDockPopupTitle(externalNodeState);
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-ASAZDEQE.js.map
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-RLPVFX7V.js";
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-MU2LODEV.js";
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-FSTZDNRM.js";
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 = allowTrailingFinalization ? /* @__PURE__ */ new Set() : findActiveTailSuppressedToolIndices(sequence);
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 (suppressedIndices.has(index)) {
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 findActiveTailSuppressedToolIndices(sequence) {
3044
- const suppressedIndices = /* @__PURE__ */ new Set();
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
- if (item.kind !== "tool-call") {
3052
- break;
3053
- }
3054
- latestTailToolIndex = Math.max(latestTailToolIndex, index);
3055
- }
3056
- if (latestTailToolIndex < 0) {
3057
- return suppressedIndices;
3053
+ tailIndex = index;
3054
+ break;
3058
3055
  }
3059
- const latestTailTool = sequence[latestTailToolIndex];
3060
- if (latestTailTool?.kind !== "tool-call" || !isSuppressingActiveTailTool(latestTailTool.call)) {
3061
- return suppressedIndices;
3056
+ const tailItem = tailIndex >= 0 ? sequence[tailIndex] : void 0;
3057
+ if (tailItem?.kind !== "tool-call" || !isActiveTailTool(tailItem.call)) {
3058
+ return -1;
3062
3059
  }
3063
- for (let index = latestTailToolIndex - 1; index >= 0; index -= 1) {
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
- suppressedIndices.add(index);
3069
+ startIndex = index;
3072
3070
  }
3073
- return suppressedIndices;
3071
+ return startIndex;
3074
3072
  }
3075
- function isSuppressingActiveTailTool(call) {
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: false,
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" }, attrs.label]
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: false,
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" }, attrs.label]
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: parsedMention.item
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(attrsToMentionItem(node.attrs ?? {}));
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-GZHQPPK2.js.map
12078
+ //# sourceMappingURL=chunk-H4HT3FE6.js.map