@mvriu5/payload-ai 0.5.6 → 0.5.9

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 (39) hide show
  1. package/README.md +52 -5
  2. package/dist/ai/providerOptions.d.ts +1 -14
  3. package/dist/ai/providerOptions.js +0 -23
  4. package/dist/ai/providerRuntime.d.ts +3 -2
  5. package/dist/ai/providerRuntime.js +6 -15
  6. package/dist/components/AIActionProposalList.d.ts +2 -1
  7. package/dist/components/AIActionProposalList.js +74 -6
  8. package/dist/components/AIActionProposalList.module.css +49 -5
  9. package/dist/components/AIApiKeyField.js +0 -8
  10. package/dist/components/AIInput.d.ts +1 -1
  11. package/dist/components/AIInput.js +156 -23
  12. package/dist/components/AIInput.module.css +185 -147
  13. package/dist/components/CollectionMentionPopover.d.ts +1 -1
  14. package/dist/components/DiffDialog.d.ts +12 -0
  15. package/dist/components/DiffDialog.js +310 -0
  16. package/dist/components/DiffDialog.module.css +249 -0
  17. package/dist/components/Icons.d.ts +9 -0
  18. package/dist/components/Icons.js +266 -0
  19. package/dist/components/RecentChangesList.d.ts +18 -0
  20. package/dist/components/RecentChangesList.js +66 -0
  21. package/dist/components/RecentChangesList.module.css +135 -0
  22. package/dist/components/hooks/useAISettings.d.ts +1 -1
  23. package/dist/endpoints/aiApplyActionEndpointHandler.d.ts +3 -1
  24. package/dist/endpoints/aiApplyActionEndpointHandler.js +209 -8
  25. package/dist/endpoints/aiChatEndpointHandler.d.ts +5 -1
  26. package/dist/endpoints/aiChatEndpointHandler.js +106 -21
  27. package/dist/endpoints/aiMentionSuggestionsEndpointHandler.d.ts +2 -1
  28. package/dist/endpoints/aiMentionSuggestionsEndpointHandler.js +7 -7
  29. package/dist/endpoints/aiProposalDiffEndpointHandler.d.ts +7 -0
  30. package/dist/endpoints/aiProposalDiffEndpointHandler.js +138 -0
  31. package/dist/endpoints/aiRecentChangesEndpointHandler.d.ts +6 -0
  32. package/dist/endpoints/aiRecentChangesEndpointHandler.js +35 -0
  33. package/dist/index.d.ts +3 -1
  34. package/dist/index.js +140 -18
  35. package/dist/payload/collectionPermissions.d.ts +22 -0
  36. package/dist/payload/collectionPermissions.js +68 -0
  37. package/dist/payload/schemaContext.d.ts +46 -2
  38. package/dist/payload/schemaContext.js +105 -14
  39. package/package.json +113 -121
@@ -12,5 +12,5 @@ type CollectionMentionPopoverProps = {
12
12
  suggestions: CollectionMentionOption[];
13
13
  onSelect: (suggestion: CollectionMentionOption) => void;
14
14
  };
15
- export declare const CollectionMentionPopover: ({ containerRef, onSelect, suggestions }: CollectionMentionPopoverProps) => import("react/jsx-runtime").JSX.Element | null;
15
+ export declare const CollectionMentionPopover: ({ containerRef, onSelect, suggestions }: CollectionMentionPopoverProps) => import("react").JSX.Element | null;
16
16
  export {};
@@ -0,0 +1,12 @@
1
+ import type { AIActionProposal } from "./AIActionProposalList.js";
2
+ export type ProposalDiff = {
3
+ after: unknown;
4
+ before: unknown;
5
+ };
6
+ type DiffDialogProps = {
7
+ diff: ProposalDiff;
8
+ onClose: () => void;
9
+ proposal: AIActionProposal;
10
+ };
11
+ export declare const DiffDialog: ({ diff, onClose, proposal }: DiffDialogProps) => import("react").JSX.Element;
12
+ export {};
@@ -0,0 +1,310 @@
1
+ import { XIcon } from "@payloadcms/ui/icons/X";
2
+ import { useState } from "react";
3
+ import styles from "./DiffDialog.module.css";
4
+ const formatDiffValue = (value)=>{
5
+ return JSON.stringify(value, null, 2);
6
+ };
7
+ const createLine = ({ changed, path, placeholder = false, text = "" })=>({
8
+ changed,
9
+ path,
10
+ placeholder,
11
+ text
12
+ });
13
+ const getJSONLineKey = (line)=>{
14
+ const match = /^(\s*)"([^"]+)":/.exec(line);
15
+ return match ? `${match[1]}${match[2]}` : null;
16
+ };
17
+ const shouldPairChangedLines = (beforeLine, afterLine)=>{
18
+ const beforeKey = getJSONLineKey(beforeLine);
19
+ const afterKey = getJSONLineKey(afterLine);
20
+ return Boolean(beforeKey && afterKey && beforeKey === afterKey);
21
+ };
22
+ const getJSONLinePaths = (lines)=>{
23
+ const stack = [];
24
+ return lines.map((line)=>{
25
+ const indentation = line.match(/^\s*/)?.[0].length || 0;
26
+ const level = Math.floor(indentation / 2);
27
+ const keyMatch = /^\s*"([^"]+)":/.exec(line);
28
+ stack.length = level;
29
+ if (keyMatch?.[1]) {
30
+ stack[level] = keyMatch[1];
31
+ return stack.slice(0, level + 1).join(".");
32
+ }
33
+ return stack.slice(0, level).join(".");
34
+ });
35
+ };
36
+ const getRowPath = (row)=>{
37
+ return row.after.path || row.before.path;
38
+ };
39
+ const isChangedRow = (row)=>{
40
+ return row.before.changed || row.after.changed;
41
+ };
42
+ const buildDisplayRows = (rows, expandedGroups)=>{
43
+ const displayRows = [];
44
+ const contextRows = 2;
45
+ let index = 0;
46
+ while(index < rows.length){
47
+ if (isChangedRow(rows[index])) {
48
+ displayRows.push({
49
+ index,
50
+ row: rows[index],
51
+ type: "row"
52
+ });
53
+ index += 1;
54
+ continue;
55
+ }
56
+ const start = index;
57
+ while(index < rows.length && !isChangedRow(rows[index])){
58
+ index += 1;
59
+ }
60
+ const end = index;
61
+ const count = end - start;
62
+ const groupID = `${start}-${end}`;
63
+ if (count <= contextRows * 2 + 2) {
64
+ for(let rowIndex = start; rowIndex < end; rowIndex += 1){
65
+ displayRows.push({
66
+ index: rowIndex,
67
+ row: rows[rowIndex],
68
+ type: "row"
69
+ });
70
+ }
71
+ continue;
72
+ }
73
+ const isExpanded = expandedGroups.has(groupID);
74
+ for(let rowIndex = start; rowIndex < start + contextRows; rowIndex += 1){
75
+ displayRows.push({
76
+ index: rowIndex,
77
+ row: rows[rowIndex],
78
+ type: "row"
79
+ });
80
+ }
81
+ displayRows.push({
82
+ count: count - contextRows * 2,
83
+ expanded: isExpanded,
84
+ id: groupID,
85
+ path: getRowPath(rows[start + contextRows]),
86
+ type: "collapsed"
87
+ });
88
+ if (isExpanded) {
89
+ for(let rowIndex = start + contextRows; rowIndex < end - contextRows; rowIndex += 1){
90
+ displayRows.push({
91
+ index: rowIndex,
92
+ row: rows[rowIndex],
93
+ type: "row"
94
+ });
95
+ }
96
+ }
97
+ for(let rowIndex = end - contextRows; rowIndex < end; rowIndex += 1){
98
+ displayRows.push({
99
+ index: rowIndex,
100
+ row: rows[rowIndex],
101
+ type: "row"
102
+ });
103
+ }
104
+ }
105
+ return displayRows;
106
+ };
107
+ const getDiffRows = (before, after)=>{
108
+ const beforeLines = before.split("\n");
109
+ const afterLines = after.split("\n");
110
+ const beforeLinePaths = getJSONLinePaths(beforeLines);
111
+ const afterLinePaths = getJSONLinePaths(afterLines);
112
+ const dp = Array.from({
113
+ length: beforeLines.length + 1
114
+ }, ()=>Array(afterLines.length + 1).fill(0));
115
+ for(let i = beforeLines.length - 1; i >= 0; i -= 1){
116
+ for(let j = afterLines.length - 1; j >= 0; j -= 1){
117
+ dp[i][j] = beforeLines[i] === afterLines[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);
118
+ }
119
+ }
120
+ const rows = [];
121
+ let beforeIndex = 0;
122
+ let afterIndex = 0;
123
+ while(beforeIndex < beforeLines.length && afterIndex < afterLines.length){
124
+ if (beforeLines[beforeIndex] === afterLines[afterIndex]) {
125
+ rows.push({
126
+ after: createLine({
127
+ changed: false,
128
+ path: afterLinePaths[afterIndex],
129
+ text: afterLines[afterIndex]
130
+ }),
131
+ before: createLine({
132
+ changed: false,
133
+ path: beforeLinePaths[beforeIndex],
134
+ text: beforeLines[beforeIndex]
135
+ })
136
+ });
137
+ beforeIndex += 1;
138
+ afterIndex += 1;
139
+ continue;
140
+ }
141
+ if (shouldPairChangedLines(beforeLines[beforeIndex], afterLines[afterIndex])) {
142
+ rows.push({
143
+ after: createLine({
144
+ changed: true,
145
+ path: afterLinePaths[afterIndex],
146
+ text: afterLines[afterIndex]
147
+ }),
148
+ before: createLine({
149
+ changed: true,
150
+ path: beforeLinePaths[beforeIndex],
151
+ text: beforeLines[beforeIndex]
152
+ })
153
+ });
154
+ beforeIndex += 1;
155
+ afterIndex += 1;
156
+ continue;
157
+ }
158
+ if (dp[beforeIndex + 1][afterIndex] >= dp[beforeIndex][afterIndex + 1]) {
159
+ rows.push({
160
+ after: createLine({
161
+ changed: false,
162
+ placeholder: true
163
+ }),
164
+ before: createLine({
165
+ changed: true,
166
+ path: beforeLinePaths[beforeIndex],
167
+ text: beforeLines[beforeIndex]
168
+ })
169
+ });
170
+ beforeIndex += 1;
171
+ } else {
172
+ rows.push({
173
+ after: createLine({
174
+ changed: true,
175
+ path: afterLinePaths[afterIndex],
176
+ text: afterLines[afterIndex]
177
+ }),
178
+ before: createLine({
179
+ changed: false,
180
+ placeholder: true
181
+ })
182
+ });
183
+ afterIndex += 1;
184
+ }
185
+ }
186
+ while(beforeIndex < beforeLines.length){
187
+ rows.push({
188
+ after: createLine({
189
+ changed: false,
190
+ placeholder: true
191
+ }),
192
+ before: createLine({
193
+ changed: true,
194
+ path: beforeLinePaths[beforeIndex],
195
+ text: beforeLines[beforeIndex]
196
+ })
197
+ });
198
+ beforeIndex += 1;
199
+ }
200
+ while(afterIndex < afterLines.length){
201
+ rows.push({
202
+ after: createLine({
203
+ changed: true,
204
+ path: afterLinePaths[afterIndex],
205
+ text: afterLines[afterIndex]
206
+ }),
207
+ before: createLine({
208
+ changed: false,
209
+ placeholder: true
210
+ })
211
+ });
212
+ afterIndex += 1;
213
+ }
214
+ return rows;
215
+ };
216
+ export const DiffDialog = ({ diff, onClose, proposal })=>{
217
+ const [scrollLeft, setScrollLeft] = useState(0);
218
+ const [expandedGroups, setExpandedGroups] = useState(()=>new Set());
219
+ const beforeValue = formatDiffValue(diff.before);
220
+ const afterValue = formatDiffValue(diff.after);
221
+ const diffRows = getDiffRows(beforeValue, afterValue);
222
+ const displayRows = buildDisplayRows(diffRows, expandedGroups);
223
+ const longestLineLength = Math.max(...beforeValue.split("\n").map((line)=>line.length), ...afterValue.split("\n").map((line)=>line.length), 80);
224
+ const diffShellStyle = {
225
+ "--diff-line-offset": `-${scrollLeft}px`,
226
+ "--diff-line-width": `${longestLineLength + 8}ch`
227
+ };
228
+ return /*#__PURE__*/ React.createElement("div", {
229
+ "aria-modal": "true",
230
+ className: styles.dialogOverlay,
231
+ role: "dialog"
232
+ }, /*#__PURE__*/ React.createElement("div", {
233
+ className: styles.dialog
234
+ }, /*#__PURE__*/ React.createElement("div", {
235
+ className: styles.dialogHeader
236
+ }, /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("div", {
237
+ className: styles.dialogTitle
238
+ }, proposal.label), /*#__PURE__*/ React.createElement("div", {
239
+ className: styles.meta
240
+ }, proposal.action, " in ", proposal.collection || proposal.slug, proposal.id ? ` #${proposal.id}` : "")), /*#__PURE__*/ React.createElement("button", {
241
+ "aria-label": "Close",
242
+ className: styles.closeButton,
243
+ onClick: onClose,
244
+ type: "button"
245
+ }, /*#__PURE__*/ React.createElement(XIcon, null))), /*#__PURE__*/ React.createElement("div", {
246
+ className: styles.diffShell,
247
+ style: diffShellStyle
248
+ }, /*#__PURE__*/ React.createElement("div", {
249
+ className: styles.diffScroll
250
+ }, /*#__PURE__*/ React.createElement("div", {
251
+ className: styles.diffHeaderGrid
252
+ }, /*#__PURE__*/ React.createElement("div", {
253
+ className: styles.diffPaneHeader
254
+ }, "Current"), /*#__PURE__*/ React.createElement("div", {
255
+ className: styles.diffPaneHeader
256
+ }, "Proposed")), /*#__PURE__*/ React.createElement("div", {
257
+ className: styles.diffRows
258
+ }, displayRows.map((displayRow)=>{
259
+ if (displayRow.type === "collapsed") {
260
+ return /*#__PURE__*/ React.createElement("button", {
261
+ className: styles.diffCollapsedRow,
262
+ key: `collapsed-${displayRow.id}`,
263
+ onClick: ()=>{
264
+ setExpandedGroups((current)=>{
265
+ const next = new Set(current);
266
+ if (displayRow.expanded) {
267
+ next.delete(displayRow.id);
268
+ } else {
269
+ next.add(displayRow.id);
270
+ }
271
+ return next;
272
+ });
273
+ },
274
+ type: "button"
275
+ }, displayRow.expanded ? "Hide" : "Show", " ", displayRow.count, " unchanged lines", displayRow.path ? /*#__PURE__*/ React.createElement("span", {
276
+ className: styles.diffCollapsedPath
277
+ }, displayRow.path) : null);
278
+ }
279
+ const row = displayRow.row;
280
+ return /*#__PURE__*/ React.createElement("div", {
281
+ className: styles.diffRow,
282
+ key: `row-${displayRow.index}`
283
+ }, /*#__PURE__*/ React.createElement("span", {
284
+ className: [
285
+ styles.diffLine,
286
+ row.before.changed ? styles.diffLineRemoved : "",
287
+ row.before.placeholder ? styles.diffLinePlaceholder : ""
288
+ ].filter(Boolean).join(" ")
289
+ }, row.before.changed && row.before.path ? /*#__PURE__*/ React.createElement("span", {
290
+ className: styles.diffPathBadge
291
+ }, row.before.path) : null, /*#__PURE__*/ React.createElement("span", {
292
+ className: styles.diffLineContent
293
+ }, row.before.text || " ")), /*#__PURE__*/ React.createElement("span", {
294
+ className: [
295
+ styles.diffLine,
296
+ row.after.changed ? styles.diffLineAdded : "",
297
+ row.after.placeholder ? styles.diffLinePlaceholder : ""
298
+ ].filter(Boolean).join(" ")
299
+ }, row.after.changed && row.after.path ? /*#__PURE__*/ React.createElement("span", {
300
+ className: styles.diffPathBadge
301
+ }, row.after.path) : null, /*#__PURE__*/ React.createElement("span", {
302
+ className: styles.diffLineContent
303
+ }, row.after.text || " ")));
304
+ }))), /*#__PURE__*/ React.createElement("div", {
305
+ className: styles.horizontalScroll,
306
+ onScroll: (event)=>setScrollLeft(event.currentTarget.scrollLeft)
307
+ }, /*#__PURE__*/ React.createElement("div", {
308
+ className: styles.horizontalScrollSpacer
309
+ })))));
310
+ };
@@ -0,0 +1,249 @@
1
+ .dialogOverlay {
2
+ align-items: center;
3
+ background: rgba(0, 0, 0, 0.42);
4
+ display: flex;
5
+ inset: 0;
6
+ justify-content: center;
7
+ padding: 24px;
8
+ position: fixed;
9
+ z-index: 1100;
10
+ }
11
+
12
+ .dialog {
13
+ background: var(--theme-bg);
14
+ border: 1px solid var(--theme-elevation-150);
15
+ border-radius: 6px;
16
+ box-shadow: 0 20px 64px rgba(0, 0, 0, 0.26);
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: 16px;
20
+ max-height: min(760px, calc(100vh - 48px));
21
+ max-width: min(1120px, calc(100vw - 48px));
22
+ padding: 16px;
23
+ width: 100%;
24
+ }
25
+
26
+ .dialogHeader {
27
+ align-items: flex-start;
28
+ display: flex;
29
+ gap: 12px;
30
+ justify-content: space-between;
31
+ }
32
+
33
+ .dialogTitle {
34
+ color: var(--theme-text);
35
+ font-size: 14px;
36
+ font-weight: 600;
37
+ line-height: 1.4;
38
+ }
39
+
40
+ .meta {
41
+ color: var(--theme-elevation-600);
42
+ font-size: 12px;
43
+ line-height: 1.4;
44
+ margin-top: 2px;
45
+ }
46
+
47
+ .closeButton {
48
+ align-items: center;
49
+ background: transparent;
50
+ border: 1px solid var(--theme-elevation-150);
51
+ border-radius: 4px;
52
+ color: var(--theme-text);
53
+ cursor: pointer;
54
+ display: inline-flex;
55
+ flex: 0 0 auto;
56
+ font: inherit;
57
+ height: 24px;
58
+ justify-content: center;
59
+ line-height: 24px;
60
+ min-height: 24px;
61
+ padding: 0;
62
+ text-decoration: none;
63
+ width: 24px;
64
+ }
65
+
66
+ .closeButton svg {
67
+ height: 12px;
68
+ width: 12px;
69
+ }
70
+
71
+ .diffShell {
72
+ border: 1px solid var(--theme-elevation-150);
73
+ border-radius: 0;
74
+ display: flex;
75
+ flex-direction: column;
76
+ min-height: 0;
77
+ min-width: 0;
78
+ overflow: hidden;
79
+ }
80
+
81
+ .diffHeaderGrid {
82
+ display: grid;
83
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
84
+ min-width: 100%;
85
+ position: sticky;
86
+ top: 0;
87
+ z-index: 1;
88
+ }
89
+
90
+ .diffPaneHeader {
91
+ background: var(--theme-elevation-50);
92
+ border-bottom: 1px solid var(--theme-elevation-150);
93
+ color: var(--theme-elevation-700);
94
+ font-size: 12px;
95
+ font-weight: 600;
96
+ line-height: 1.4;
97
+ min-width: 0;
98
+ overflow: hidden;
99
+ padding: 8px 10px;
100
+ }
101
+
102
+ .diffPaneHeader + .diffPaneHeader {
103
+ border-left: 1px solid var(--theme-elevation-150);
104
+ }
105
+
106
+ .diffScroll {
107
+ background: var(--theme-elevation-50);
108
+ color: var(--theme-text);
109
+ flex: 1 1 auto;
110
+ font-size: 12px;
111
+ line-height: 1.5;
112
+ min-height: 260px;
113
+ overflow-x: hidden;
114
+ overflow-y: auto;
115
+ }
116
+
117
+ .diffRows {
118
+ display: grid;
119
+ font-family: monospace;
120
+ min-width: 100%;
121
+ padding: 0;
122
+ }
123
+
124
+ .diffRow {
125
+ display: grid;
126
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
127
+ min-width: 100%;
128
+ }
129
+
130
+ .diffLine {
131
+ display: block;
132
+ min-height: 18px;
133
+ min-width: 0;
134
+ overflow: hidden;
135
+ padding: 0;
136
+ text-overflow: clip;
137
+ white-space: pre;
138
+ }
139
+
140
+ .diffPathBadge {
141
+ background: rgba(255, 255, 255, 0.08);
142
+ border: 1px solid rgba(255, 255, 255, 0.16);
143
+ border-radius: 3px;
144
+ color: var(--theme-elevation-700);
145
+ display: block;
146
+ font-family: monospace;
147
+ font-size: 11px;
148
+ line-height: 18px;
149
+ margin: 2px 6px 1px;
150
+ max-width: calc(100% - 12px);
151
+ overflow: hidden;
152
+ padding: 0 6px;
153
+ text-overflow: ellipsis;
154
+ white-space: nowrap;
155
+ }
156
+
157
+ .diffLineContent {
158
+ display: inline-block;
159
+ min-width: var(--diff-line-width);
160
+ transform: translateX(var(--diff-line-offset));
161
+ }
162
+
163
+ .diffLine + .diffLine {
164
+ box-shadow: inset 1px 0 0 var(--theme-elevation-150);
165
+ }
166
+
167
+ .diffLineAdded {
168
+ background: rgba(39, 132, 90, 0.28);
169
+ border-left: 3px solid rgba(39, 132, 90, 0.92);
170
+ }
171
+
172
+ .diffLineRemoved {
173
+ background: rgba(160, 26, 26, 0.28);
174
+ border-left: 3px solid rgba(136, 18, 18, 0.96);
175
+ }
176
+
177
+ .diffLinePlaceholder {
178
+ background: var(--theme-elevation-50);
179
+ }
180
+
181
+ .diffCollapsedRow {
182
+ align-items: center;
183
+ background: var(--theme-elevation-100);
184
+ border: 0;
185
+ border-bottom: 1px solid var(--theme-elevation-150);
186
+ border-top: 1px solid var(--theme-elevation-150);
187
+ color: var(--theme-elevation-600);
188
+ cursor: pointer;
189
+ display: flex;
190
+ font: inherit;
191
+ font-family: monospace;
192
+ font-size: 12px;
193
+ gap: 8px;
194
+ grid-column: 1 / -1;
195
+ justify-content: center;
196
+ line-height: 24px;
197
+ min-height: 24px;
198
+ padding: 0 10px;
199
+ }
200
+
201
+ .diffCollapsedRow:hover {
202
+ background: var(--theme-elevation-150);
203
+ }
204
+
205
+ .diffCollapsedPath {
206
+ color: var(--theme-elevation-500);
207
+ min-width: 0;
208
+ overflow: hidden;
209
+ text-overflow: ellipsis;
210
+ white-space: nowrap;
211
+ }
212
+
213
+ .horizontalScroll {
214
+ flex: 0 0 auto;
215
+ height: 16px;
216
+ overflow-x: auto;
217
+ overflow-y: hidden;
218
+ }
219
+
220
+ .horizontalScrollSpacer {
221
+ height: 1px;
222
+ min-width: 100%;
223
+ width: calc(50% + var(--diff-line-width));
224
+ }
225
+
226
+ @media (max-width: 768px) {
227
+ .dialogOverlay {
228
+ padding: 12px;
229
+ }
230
+
231
+ .dialog {
232
+ max-height: calc(100vh - 24px);
233
+ max-width: calc(100vw - 24px);
234
+ }
235
+
236
+ .dialogHeader {
237
+ align-items: stretch;
238
+ flex-direction: column;
239
+ }
240
+
241
+ .closeButton {
242
+ align-self: flex-end;
243
+ }
244
+
245
+ .diffScroll {
246
+ min-height: 180px;
247
+ }
248
+
249
+ }
@@ -0,0 +1,9 @@
1
+ import type { SVGProps } from "react";
2
+ export declare function MistralAiIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
3
+ export declare function OpenaiIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
4
+ export declare function ClaudeIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
5
+ export declare function GoogleGeminiIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
6
+ export declare function FileDiff(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
7
+ export declare function Send(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
8
+ export declare function Apply(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
9
+ export declare function Reject(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;