@alpaca-editor/core 1.0.4135 → 1.0.4141

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 (149) hide show
  1. package/dist/components/index.d.ts +2 -0
  2. package/dist/components/index.js +1 -0
  3. package/dist/components/index.js.map +1 -1
  4. package/dist/components/ui/select.d.ts +2 -1
  5. package/dist/components/ui/select.js +2 -2
  6. package/dist/components/ui/select.js.map +1 -1
  7. package/dist/components/ui/tabs.d.ts +17 -0
  8. package/dist/components/ui/tabs.js +27 -0
  9. package/dist/components/ui/tabs.js.map +1 -0
  10. package/dist/config/config.js +7 -1
  11. package/dist/config/config.js.map +1 -1
  12. package/dist/editor/FieldListField.js +3 -4
  13. package/dist/editor/FieldListField.js.map +1 -1
  14. package/dist/editor/ImageEditButton.d.ts +2 -1
  15. package/dist/editor/ImageEditButton.js +4 -4
  16. package/dist/editor/ImageEditButton.js.map +1 -1
  17. package/dist/editor/PictureEditor.js +42 -1
  18. package/dist/editor/PictureEditor.js.map +1 -1
  19. package/dist/editor/Terminal.js +1 -1
  20. package/dist/editor/Terminal.js.map +1 -1
  21. package/dist/editor/Titlebar.js +0 -1
  22. package/dist/editor/Titlebar.js.map +1 -1
  23. package/dist/editor/ai/AgentCostDisplay.d.ts +3 -1
  24. package/dist/editor/ai/AgentCostDisplay.js +26 -2
  25. package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
  26. package/dist/editor/ai/AgentStatusBadge.d.ts +26 -0
  27. package/dist/editor/ai/AgentStatusBadge.js +110 -0
  28. package/dist/editor/ai/AgentStatusBadge.js.map +1 -0
  29. package/dist/editor/ai/AgentTerminal.js +289 -198
  30. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  31. package/dist/editor/ai/Agents.d.ts +2 -2
  32. package/dist/editor/ai/Agents.js +115 -19
  33. package/dist/editor/ai/Agents.js.map +1 -1
  34. package/dist/editor/ai/AiResponseMessage.js +259 -45
  35. package/dist/editor/ai/AiResponseMessage.js.map +1 -1
  36. package/dist/editor/ai/ContextInfoBar.js +124 -113
  37. package/dist/editor/ai/ContextInfoBar.js.map +1 -1
  38. package/dist/editor/ai/ToolCallDisplay.d.ts +1 -0
  39. package/dist/editor/ai/ToolCallDisplay.js +70 -58
  40. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  41. package/dist/editor/ai/useAgentStatus.d.ts +13 -0
  42. package/dist/editor/ai/useAgentStatus.js +101 -0
  43. package/dist/editor/ai/useAgentStatus.js.map +1 -0
  44. package/dist/editor/client/EditorShell.js +23 -8
  45. package/dist/editor/client/EditorShell.js.map +1 -1
  46. package/dist/editor/client/itemsRepository.js.map +1 -1
  47. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +5 -5
  48. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js.map +1 -1
  49. package/dist/editor/control-center/About.js +1 -1
  50. package/dist/editor/control-center/About.js.map +1 -1
  51. package/dist/editor/control-center/AllAgentsPanel.d.ts +5 -0
  52. package/dist/editor/control-center/AllAgentsPanel.js +126 -0
  53. package/dist/editor/control-center/AllAgentsPanel.js.map +1 -0
  54. package/dist/editor/control-center/WebSocketMessages.js +1 -0
  55. package/dist/editor/control-center/WebSocketMessages.js.map +1 -1
  56. package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.js +42 -7
  57. package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.js.map +1 -1
  58. package/dist/editor/media-selector/AiImageSearch.d.ts +1 -1
  59. package/dist/editor/media-selector/AiImageSearch.js +162 -103
  60. package/dist/editor/media-selector/AiImageSearch.js.map +1 -1
  61. package/dist/editor/media-selector/TreeSelector.js +20 -4
  62. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  63. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +5 -2
  64. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  65. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
  66. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +7 -5
  67. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  68. package/dist/editor/page-viewer/DeviceToolbar.js +2 -2
  69. package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
  70. package/dist/editor/page-viewer/PageViewerFrame.js +18 -11
  71. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  72. package/dist/editor/services/agentService.d.ts +53 -48
  73. package/dist/editor/services/agentService.js +137 -79
  74. package/dist/editor/services/agentService.js.map +1 -1
  75. package/dist/editor/services/aiService.d.ts +1 -1
  76. package/dist/editor/services/editService.js +1 -0
  77. package/dist/editor/services/editService.js.map +1 -1
  78. package/dist/editor/sidebar/GraphQL.js +20 -7
  79. package/dist/editor/sidebar/GraphQL.js.map +1 -1
  80. package/dist/editor/sidebar/SEOInfo.js +1 -2
  81. package/dist/editor/sidebar/SEOInfo.js.map +1 -1
  82. package/dist/editor/sidebar/Translations.js +10 -7
  83. package/dist/editor/sidebar/Translations.js.map +1 -1
  84. package/dist/editor/ui/ItemNameDialogNew.js +1 -1
  85. package/dist/editor/ui/ItemSearch.js +10 -4
  86. package/dist/editor/ui/ItemSearch.js.map +1 -1
  87. package/dist/index.d.ts +5 -1
  88. package/dist/index.js +4 -1
  89. package/dist/index.js.map +1 -1
  90. package/dist/page-wizard/steps/CollectStep.js +2 -2
  91. package/dist/page-wizard/steps/CollectStep.js.map +1 -1
  92. package/dist/page-wizard/steps/FieldEditor.js +2 -2
  93. package/dist/page-wizard/steps/FieldEditor.js.map +1 -1
  94. package/dist/revision.d.ts +2 -2
  95. package/dist/revision.js +2 -2
  96. package/dist/splash-screen/NewPage.js +2 -2
  97. package/dist/splash-screen/NewPage.js.map +1 -1
  98. package/dist/splash-screen/RecentPages.js +1 -1
  99. package/dist/splash-screen/RecentPages.js.map +1 -1
  100. package/dist/styles.css +167 -15
  101. package/dist/tour/Tour.js +15 -11
  102. package/dist/tour/Tour.js.map +1 -1
  103. package/package.json +1 -1
  104. package/src/components/index.ts +2 -0
  105. package/src/components/ui/select.tsx +3 -0
  106. package/src/components/ui/tabs.tsx +87 -0
  107. package/src/config/config.tsx +7 -1
  108. package/src/editor/FieldListField.tsx +13 -13
  109. package/src/editor/ImageEditButton.tsx +5 -3
  110. package/src/editor/PictureEditor.tsx +48 -1
  111. package/src/editor/Terminal.tsx +1 -1
  112. package/src/editor/Titlebar.tsx +0 -1
  113. package/src/editor/ai/AgentCostDisplay.tsx +57 -1
  114. package/src/editor/ai/AgentStatusBadge.tsx +144 -0
  115. package/src/editor/ai/AgentTerminal.tsx +345 -219
  116. package/src/editor/ai/Agents.tsx +179 -30
  117. package/src/editor/ai/AiResponseMessage.tsx +411 -114
  118. package/src/editor/ai/ContextInfoBar.tsx +134 -131
  119. package/src/editor/ai/ToolCallDisplay.tsx +217 -176
  120. package/src/editor/ai/useAgentStatus.ts +123 -0
  121. package/src/editor/client/EditorShell.tsx +34 -8
  122. package/src/editor/client/itemsRepository.ts +1 -2
  123. package/src/editor/commands/localizeItem/LocalizeItemDialog.tsx +5 -5
  124. package/src/editor/control-center/About.tsx +0 -14
  125. package/src/editor/control-center/AllAgentsPanel.tsx +300 -0
  126. package/src/editor/control-center/WebSocketMessages.tsx +1 -0
  127. package/src/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.tsx +49 -8
  128. package/src/editor/media-selector/AiImageSearch.tsx +162 -172
  129. package/src/editor/media-selector/TreeSelector.tsx +137 -116
  130. package/src/editor/menubar/toolbar-sections/UtilityControls.tsx +9 -1
  131. package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +7 -4
  132. package/src/editor/page-viewer/DeviceToolbar.tsx +15 -11
  133. package/src/editor/page-viewer/PageViewerFrame.tsx +20 -14
  134. package/src/editor/services/agentService.ts +217 -129
  135. package/src/editor/services/aiService.ts +2 -2
  136. package/src/editor/services/editService.ts +1 -0
  137. package/src/editor/sidebar/GraphQL.tsx +143 -117
  138. package/src/editor/sidebar/SEOInfo.tsx +1 -2
  139. package/src/editor/sidebar/Translations.tsx +14 -12
  140. package/src/editor/ui/ItemNameDialogNew.tsx +1 -1
  141. package/src/editor/ui/ItemSearch.tsx +11 -4
  142. package/src/editor/ui/SimpleTabs.tsx +1 -1
  143. package/src/index.ts +6 -0
  144. package/src/page-wizard/steps/CollectStep.tsx +2 -2
  145. package/src/page-wizard/steps/FieldEditor.tsx +13 -15
  146. package/src/revision.ts +2 -2
  147. package/src/splash-screen/NewPage.tsx +2 -2
  148. package/src/splash-screen/RecentPages.tsx +1 -1
  149. package/src/tour/Tour.tsx +61 -48
@@ -14,7 +14,7 @@ import { getComponentById } from "../componentTreeHelper";
14
14
  import {
15
15
  AgentDetails,
16
16
  AgentMetadata,
17
- updateAgentMetadata,
17
+ updateAgentContext,
18
18
  } from "../services/agentService";
19
19
  import { ItemDescriptor } from "../pageModel";
20
20
 
@@ -42,42 +42,29 @@ export function ContextInfoBar({
42
42
 
43
43
  const removeContextKey = useCallback(
44
44
  async (
45
- key: "pages" | "componentIds" | "field" | "comment",
45
+ key: "pages" | "componentIds" | "components" | "field" | "comment",
46
46
  index?: number,
47
47
  ) => {
48
48
  if (!agent?.id) return;
49
49
  const current = agentMetadata || {};
50
- // Exclude top-level context to avoid duplicate keys when spreading
51
- const { context: _, ...currentWithoutContext } = current;
52
- const next: AgentMetadata = {
53
- ...currentWithoutContext,
54
- additionalData: {
55
- ...(current.additionalData || {}),
56
- context: {
57
- ...((current.additionalData &&
58
- (current.additionalData as any).context) ||
59
- {}),
60
- },
61
- },
62
- } as AgentMetadata;
63
-
64
- if (next.additionalData && (next.additionalData as any).context) {
65
- const ctx = (next.additionalData as any).context;
66
- if (key === "pages" && typeof index === "number" && ctx.pages) {
67
- ctx.pages.splice(index, 1);
68
- if (ctx.pages.length === 0) delete ctx.pages;
69
- } else if (
70
- key === "componentIds" &&
71
- typeof index === "number" &&
72
- ctx.componentIds
73
- ) {
74
- ctx.componentIds.splice(index, 1);
75
- if (ctx.componentIds.length === 0) delete ctx.componentIds;
76
- } else if (key === "field") {
77
- delete ctx.field;
78
- } else if (key === "comment") {
79
- delete ctx.comment;
80
- }
50
+ const next: AgentMetadata = { ...current };
51
+
52
+ if (key === "pages" && typeof index === "number" && next.pages) {
53
+ next.pages = [...next.pages];
54
+ next.pages.splice(index, 1);
55
+ if (next.pages.length === 0) delete next.pages;
56
+ } else if (
57
+ (key === "componentIds" || key === "components") &&
58
+ typeof index === "number" &&
59
+ next.components
60
+ ) {
61
+ next.components = [...next.components];
62
+ next.components.splice(index, 1);
63
+ if (next.components.length === 0) delete next.components;
64
+ } else if (key === "field") {
65
+ delete next.field;
66
+ } else if (key === "comment") {
67
+ delete next.comment;
81
68
  }
82
69
 
83
70
  try {
@@ -85,13 +72,13 @@ export function ContextInfoBar({
85
72
  setAgentMetadata(next);
86
73
  return;
87
74
  }
88
- await updateAgentMetadata(agent.id, next);
75
+ await updateAgentContext(agent.id, next);
89
76
  setAgentMetadata(next);
90
77
  setAgent((prev) =>
91
- prev ? { ...prev, metadata: JSON.stringify(next) } : prev,
78
+ prev ? { ...prev, agentContext: JSON.stringify(next) } : prev,
92
79
  );
93
80
  } catch (e) {
94
- console.error("Failed to update agent metadata", e);
81
+ console.error("Failed to update agent context", e);
95
82
  }
96
83
  },
97
84
  [agent?.id, agent?.status, agentMetadata, setAgent, setAgentMetadata],
@@ -106,12 +93,11 @@ export function ContextInfoBar({
106
93
  language: item.language,
107
94
  version: item.version,
108
95
  name: editContext.contentEditorItem?.name,
109
- path: agent?.itemPath,
96
+ path: undefined,
110
97
  };
111
98
 
112
99
  const current = agentMetadata || {};
113
- const currentPages =
114
- ((current.additionalData as any)?.context?.pages as Array<any>) || [];
100
+ const currentPages = current.pages || [];
115
101
 
116
102
  const existingPageIds = new Set(
117
103
  currentPages.map((p: any) => `${p.id}-${p.language}-${p.version}`),
@@ -125,33 +111,23 @@ export function ContextInfoBar({
125
111
  return;
126
112
  }
127
113
 
128
- // Exclude top-level context to avoid duplicate keys when spreading
129
- const { context: _, ...currentWithoutContext } = current;
130
114
  const next: AgentMetadata = {
131
- ...currentWithoutContext,
132
- additionalData: {
133
- ...(current.additionalData || {}),
134
- context: {
135
- ...((current.additionalData &&
136
- (current.additionalData as any).context) ||
137
- {}),
138
- pages: [...currentPages, pageToAdd],
139
- },
140
- },
141
- } as AgentMetadata;
115
+ ...current,
116
+ pages: [...currentPages, pageToAdd],
117
+ };
142
118
 
143
119
  try {
144
120
  if (agent.status === "new") {
145
121
  setAgentMetadata(next);
146
122
  return;
147
123
  }
148
- await updateAgentMetadata(agent.id, next);
124
+ await updateAgentContext(agent.id, next);
149
125
  setAgentMetadata(next);
150
126
  setAgent((prev) =>
151
- prev ? { ...prev, metadata: JSON.stringify(next) } : prev,
127
+ prev ? { ...prev, agentContext: JSON.stringify(next) } : prev,
152
128
  );
153
129
  } catch (e) {
154
- console.error("Failed to update agent metadata (add pages)", e);
130
+ console.error("Failed to update agent context (add pages)", e);
155
131
  }
156
132
  };
157
133
 
@@ -159,44 +135,47 @@ export function ContextInfoBar({
159
135
  if (!agent?.id || !editContext?.selection?.length) return;
160
136
 
161
137
  const current = agentMetadata || {};
162
- const currentComponentIds =
163
- ((current.additionalData as any)?.context?.componentIds as string[]) ||
164
- [];
138
+ const currentComponents = current.components || [];
165
139
 
166
- const existingIds = new Set(currentComponentIds);
140
+ const existingIds = new Set(currentComponents.map(c => c.componentId));
167
141
  const newComponentIds = editContext.selection.filter(
168
142
  (id) => !existingIds.has(id),
169
143
  );
170
144
 
171
145
  if (newComponentIds.length === 0) return;
172
146
 
173
- // Exclude top-level context to avoid duplicate keys when spreading
174
- const { context: _, ...currentWithoutContext } = current;
147
+ // Get page item descriptor from edit context
148
+ const pageItem = editContext.currentItemDescriptor ? {
149
+ id: editContext.currentItemDescriptor.id,
150
+ language: editContext.currentItemDescriptor.language,
151
+ version: editContext.currentItemDescriptor.version,
152
+ name: editContext.contentEditorItem?.name,
153
+ path: undefined,
154
+ } : undefined;
155
+
156
+ // Build new components with page info
157
+ const newComponents = newComponentIds.map(componentId => ({
158
+ componentId,
159
+ pageItem: pageItem!,
160
+ }));
161
+
175
162
  const next: AgentMetadata = {
176
- ...currentWithoutContext,
177
- additionalData: {
178
- ...(current.additionalData || {}),
179
- context: {
180
- ...((current.additionalData &&
181
- (current.additionalData as any).context) ||
182
- {}),
183
- componentIds: [...currentComponentIds, ...newComponentIds],
184
- },
185
- },
186
- } as AgentMetadata;
163
+ ...current,
164
+ components: [...currentComponents, ...newComponents],
165
+ };
187
166
 
188
167
  try {
189
168
  if (agent.status === "new") {
190
169
  setAgentMetadata(next);
191
170
  return;
192
171
  }
193
- await updateAgentMetadata(agent.id, next);
172
+ await updateAgentContext(agent.id, next);
194
173
  setAgentMetadata(next);
195
174
  setAgent((prev) =>
196
- prev ? { ...prev, metadata: JSON.stringify(next) } : prev,
175
+ prev ? { ...prev, agentContext: JSON.stringify(next) } : prev,
197
176
  );
198
177
  } catch (e) {
199
- console.error("Failed to update agent metadata (add components)", e);
178
+ console.error("Failed to update agent context (add components)", e);
200
179
  }
201
180
  };
202
181
 
@@ -204,41 +183,44 @@ export function ContextInfoBar({
204
183
  if (!agent?.id || !ids?.length) return;
205
184
 
206
185
  const current = agentMetadata || {};
207
- const currentComponentIds =
208
- ((current.additionalData as any)?.context?.componentIds as string[]) ||
209
- [];
186
+ const currentComponents = current.components || [];
210
187
 
211
- const existingIds = new Set(currentComponentIds);
188
+ const existingIds = new Set(currentComponents.map(c => c.componentId));
212
189
  const newComponentIds = ids.filter((id) => !!id && !existingIds.has(id));
213
190
  if (newComponentIds.length === 0) return;
214
191
 
215
- // Exclude top-level context to avoid duplicate keys when spreading
216
- const { context: _, ...currentWithoutContext } = current;
192
+ // Get page item descriptor from edit context
193
+ const pageItem = editContext?.currentItemDescriptor ? {
194
+ id: editContext.currentItemDescriptor.id,
195
+ language: editContext.currentItemDescriptor.language,
196
+ version: editContext.currentItemDescriptor.version,
197
+ name: editContext.contentEditorItem?.name,
198
+ path: undefined,
199
+ } : undefined;
200
+
201
+ // Build new components with page info
202
+ const newComponents = newComponentIds.map(componentId => ({
203
+ componentId,
204
+ pageItem: pageItem!,
205
+ }));
206
+
217
207
  const next: AgentMetadata = {
218
- ...currentWithoutContext,
219
- additionalData: {
220
- ...(current.additionalData || {}),
221
- context: {
222
- ...((current.additionalData &&
223
- (current.additionalData as any).context) ||
224
- {}),
225
- componentIds: [...currentComponentIds, ...newComponentIds],
226
- },
227
- },
228
- } as AgentMetadata;
208
+ ...current,
209
+ components: [...currentComponents, ...newComponents],
210
+ };
229
211
 
230
212
  try {
231
213
  if (agent.status === "new") {
232
214
  setAgentMetadata(next);
233
215
  return;
234
216
  }
235
- await updateAgentMetadata(agent.id, next);
217
+ await updateAgentContext(agent.id, next);
236
218
  setAgentMetadata(next);
237
219
  setAgent((prev) =>
238
- prev ? { ...prev, metadata: JSON.stringify(next) } : prev,
220
+ prev ? { ...prev, agentContext: JSON.stringify(next) } : prev,
239
221
  );
240
222
  } catch (e) {
241
- console.error("Failed to update agent metadata (add components)", e);
223
+ console.error("Failed to update agent context (add components)", e);
242
224
  }
243
225
  };
244
226
 
@@ -246,8 +228,7 @@ export function ContextInfoBar({
246
228
  if (!agent?.id || !items?.length) return;
247
229
 
248
230
  const current = agentMetadata || {};
249
- const currentPages =
250
- ((current.additionalData as any)?.context?.pages as Array<any>) || [];
231
+ const currentPages = current.pages || [];
251
232
 
252
233
  const existingPageIds = new Set(
253
234
  currentPages.map((p: any) => `${p.id}-${p.language}-${p.version}`),
@@ -279,33 +260,23 @@ export function ContextInfoBar({
279
260
 
280
261
  if (pagesToAdd.length === 0) return;
281
262
 
282
- // Exclude top-level context to avoid duplicate keys when spreading
283
- const { context: _, ...currentWithoutContext } = current;
284
263
  const next: AgentMetadata = {
285
- ...currentWithoutContext,
286
- additionalData: {
287
- ...(current.additionalData || {}),
288
- context: {
289
- ...((current.additionalData &&
290
- (current.additionalData as any).context) ||
291
- {}),
292
- pages: [...currentPages, ...pagesToAdd],
293
- },
294
- },
295
- } as AgentMetadata;
264
+ ...current,
265
+ pages: [...currentPages, ...pagesToAdd],
266
+ };
296
267
 
297
268
  try {
298
269
  if (agent.status === "new") {
299
270
  setAgentMetadata(next);
300
271
  return;
301
272
  }
302
- await updateAgentMetadata(agent.id, next);
273
+ await updateAgentContext(agent.id, next);
303
274
  setAgentMetadata(next);
304
275
  setAgent((prev) =>
305
- prev ? { ...prev, metadata: JSON.stringify(next) } : prev,
276
+ prev ? { ...prev, agentContext: JSON.stringify(next) } : prev,
306
277
  );
307
278
  } catch (e) {
308
- console.error("Failed to update agent metadata (add items/pages)", e);
279
+ console.error("Failed to update agent context (add items/pages)", e);
309
280
  }
310
281
  };
311
282
 
@@ -377,22 +348,10 @@ export function ContextInfoBar({
377
348
  }
378
349
  };
379
350
 
380
- const ctx = (agentMetadata as any)?.additionalData?.context as
381
- | {
382
- pages?: Array<{
383
- id: string;
384
- language: string;
385
- version: number;
386
- path?: string;
387
- name?: string;
388
- }>;
389
- componentIds?: string[];
390
- field?: { fieldId: string; itemId: string; name?: string };
391
- }
392
- | undefined;
351
+ const ctx = agentMetadata;
393
352
 
394
353
  const hasContext =
395
- ctx && (ctx.pages?.length || ctx.componentIds?.length || ctx.field);
354
+ ctx && (ctx.pages?.length || ctx.components?.length || ctx.componentIds?.length || ctx.field);
396
355
 
397
356
  const currentPageAlreadyAdded =
398
357
  editContext?.currentItemDescriptor &&
@@ -406,6 +365,7 @@ export function ContextInfoBar({
406
365
  const selectedComponentsAlreadyAdded =
407
366
  !!editContext?.selection?.length &&
408
367
  !!editContext.selection?.every((selectedId) =>
368
+ ctx?.components?.some(c => c.componentId === selectedId) ||
409
369
  ctx?.componentIds?.includes(selectedId),
410
370
  );
411
371
 
@@ -447,7 +407,7 @@ export function ContextInfoBar({
447
407
  const pageLabelName =
448
408
  page.name ||
449
409
  resolvedPageName ||
450
- (agent?.itemPath ? agent.itemPath.split("/").pop() : undefined);
410
+ undefined;
451
411
  const pageLabel = `${pageLabelName || page.path || page.id} (${page.language}/${page.version})`;
452
412
  chips.push(
453
413
  <Chip
@@ -460,7 +420,35 @@ export function ContextInfoBar({
460
420
  });
461
421
  }
462
422
 
463
- if (ctx?.componentIds && ctx.componentIds.length > 0) {
423
+ if (ctx?.components && ctx.components.length > 0) {
424
+ ctx.components.forEach((component, index) => {
425
+ const componentId = component.componentId;
426
+ let compLabel: string = componentId;
427
+ if (index === 0 && resolvedComponentName) {
428
+ compLabel = resolvedComponentName as string;
429
+ } else if (editContext?.page) {
430
+ try {
431
+ const comp = getComponentById(componentId, editContext.page);
432
+ compLabel = (comp?.name as string) || componentId;
433
+ } catch {}
434
+ }
435
+
436
+ // Include page info in the label
437
+ const pageInfo = component.pageItem
438
+ ? ` on ${component.pageItem.name || component.pageItem.path || component.pageItem.id}`
439
+ : '';
440
+
441
+ chips.push(
442
+ <Chip
443
+ key={`component-${index}`}
444
+ icon={<Puzzle className="h-3 w-3 text-gray-500" strokeWidth={1} />}
445
+ label={`Component: ${compLabel}${pageInfo}`}
446
+ onRemove={() => removeContextKey("components", index)}
447
+ />,
448
+ );
449
+ });
450
+ } else if (ctx?.componentIds && ctx.componentIds.length > 0) {
451
+ // Legacy support for componentIds without page info
464
452
  ctx.componentIds.forEach((componentId, index) => {
465
453
  let compLabel: string = componentId as string;
466
454
  if (index === 0 && resolvedComponentName) {
@@ -504,12 +492,27 @@ export function ContextInfoBar({
504
492
  const pageLabelName =
505
493
  first.name ||
506
494
  resolvedPageName ||
507
- (agent?.itemPath ? agent.itemPath.split("/").pop() : undefined);
495
+ undefined;
508
496
  const pageText = pageLabelName || first.path || first.id;
509
497
  const more = ctx.pages.length > 1 ? ` (+${ctx.pages.length - 1})` : "";
510
498
  summaryParts.push(`Item: ${pageText}${more}`);
511
499
  }
512
- if (ctx?.componentIds && ctx.componentIds.length > 0) {
500
+ if (ctx?.components && ctx.components.length > 0) {
501
+ const firstComponent = ctx.components[0]!;
502
+ const firstId = firstComponent.componentId;
503
+ let compLabel: string = firstId;
504
+ if (resolvedComponentName) compLabel = resolvedComponentName as string;
505
+ else if (editContext?.page) {
506
+ try {
507
+ const comp = getComponentById(firstId, editContext.page);
508
+ compLabel = (comp?.name as string) || firstId;
509
+ } catch {}
510
+ }
511
+ const more =
512
+ ctx.components.length > 1 ? ` (+${ctx.components.length - 1})` : "";
513
+ summaryParts.push(`Component: ${compLabel}${more}`);
514
+ } else if (ctx?.componentIds && ctx.componentIds.length > 0) {
515
+ // Legacy support for componentIds
513
516
  const firstId = ctx.componentIds[0]!;
514
517
  let compLabel: string = firstId as string;
515
518
  if (resolvedComponentName) compLabel = resolvedComponentName as string;