@humaan/payload-plugin-ai-assistant 0.0.0-stage → 0.1.1

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 (190) hide show
  1. package/README.md +277 -2
  2. package/dist/admin/AiAssistantControl.d.ts +11 -0
  3. package/dist/admin/AiAssistantControl.js +31 -0
  4. package/dist/admin/AiAssistantControl.js.map +1 -0
  5. package/dist/admin/AiAssistantPanel.d.ts +10 -0
  6. package/dist/admin/AiAssistantPanel.js +208 -0
  7. package/dist/admin/AiAssistantPanel.js.map +1 -0
  8. package/dist/admin/AiAssistantPanel.module.scss +689 -0
  9. package/dist/admin/AiSourceSwitch.d.ts +13 -0
  10. package/dist/admin/AiSourceSwitch.js +14 -0
  11. package/dist/admin/AiSourceSwitch.js.map +1 -0
  12. package/dist/admin/BudgetField.d.ts +8 -0
  13. package/dist/admin/BudgetField.js +145 -0
  14. package/dist/admin/BudgetField.js.map +1 -0
  15. package/dist/admin/BudgetField.module.scss +47 -0
  16. package/dist/admin/Conversation.d.ts +12 -0
  17. package/dist/admin/Conversation.js +469 -0
  18. package/dist/admin/Conversation.js.map +1 -0
  19. package/dist/admin/Markdown.d.ts +9 -0
  20. package/dist/admin/Markdown.js +63 -0
  21. package/dist/admin/Markdown.js.map +1 -0
  22. package/dist/admin/PageContextBridge.d.ts +5 -0
  23. package/dist/admin/PageContextBridge.js +72 -0
  24. package/dist/admin/PageContextBridge.js.map +1 -0
  25. package/dist/admin/Pill.d.ts +11 -0
  26. package/dist/admin/Pill.js +27 -0
  27. package/dist/admin/Pill.js.map +1 -0
  28. package/dist/admin/PlanCard.d.ts +14 -0
  29. package/dist/admin/PlanCard.js +465 -0
  30. package/dist/admin/PlanCard.js.map +1 -0
  31. package/dist/admin/SettingsAlerts.d.ts +7 -0
  32. package/dist/admin/SettingsAlerts.js +37 -0
  33. package/dist/admin/SettingsAlerts.js.map +1 -0
  34. package/dist/admin/UsageSummary.d.ts +11 -0
  35. package/dist/admin/UsageSummary.js +129 -0
  36. package/dist/admin/UsageSummary.js.map +1 -0
  37. package/dist/admin/attachmentUpload.d.ts +25 -0
  38. package/dist/admin/attachmentUpload.js +76 -0
  39. package/dist/admin/attachmentUpload.js.map +1 -0
  40. package/dist/admin/openDocument.d.ts +13 -0
  41. package/dist/admin/openDocument.js +34 -0
  42. package/dist/admin/openDocument.js.map +1 -0
  43. package/dist/admin/percent.d.ts +10 -0
  44. package/dist/admin/percent.js +21 -0
  45. package/dist/admin/percent.js.map +1 -0
  46. package/dist/admin/threads.d.ts +21 -0
  47. package/dist/admin/threads.js +92 -0
  48. package/dist/admin/threads.js.map +1 -0
  49. package/dist/admin/toolSteps.d.ts +12 -0
  50. package/dist/admin/toolSteps.js +57 -0
  51. package/dist/admin/toolSteps.js.map +1 -0
  52. package/dist/admin/transport.d.ts +24 -0
  53. package/dist/admin/transport.js +75 -0
  54. package/dist/admin/transport.js.map +1 -0
  55. package/dist/admin/useAttachments.d.ts +32 -0
  56. package/dist/admin/useAttachments.js +91 -0
  57. package/dist/admin/useAttachments.js.map +1 -0
  58. package/dist/admin/useEntityLabel.d.ts +3 -0
  59. package/dist/admin/useEntityLabel.js +23 -0
  60. package/dist/admin/useEntityLabel.js.map +1 -0
  61. package/dist/attachments/collection.d.ts +15 -0
  62. package/dist/attachments/collection.js +90 -0
  63. package/dist/attachments/collection.js.map +1 -0
  64. package/dist/attachments/conversation.d.ts +25 -0
  65. package/dist/attachments/conversation.js +105 -0
  66. package/dist/attachments/conversation.js.map +1 -0
  67. package/dist/attachments/rules.d.ts +9 -0
  68. package/dist/attachments/rules.js +17 -0
  69. package/dist/attachments/rules.js.map +1 -0
  70. package/dist/attachments/store.d.ts +27 -0
  71. package/dist/attachments/store.js +187 -0
  72. package/dist/attachments/store.js.map +1 -0
  73. package/dist/billing.d.ts +60 -0
  74. package/dist/billing.js +116 -0
  75. package/dist/billing.js.map +1 -0
  76. package/dist/chat/history.d.ts +37 -0
  77. package/dist/chat/history.js +165 -0
  78. package/dist/chat/history.js.map +1 -0
  79. package/dist/chat/messages.d.ts +5 -0
  80. package/dist/chat/messages.js +3 -0
  81. package/dist/chat/messages.js.map +1 -0
  82. package/dist/chat/threads.d.ts +33 -0
  83. package/dist/chat/threads.js +77 -0
  84. package/dist/chat/threads.js.map +1 -0
  85. package/dist/chat/tools.d.ts +76 -0
  86. package/dist/chat/tools.js +596 -0
  87. package/dist/chat/tools.js.map +1 -0
  88. package/dist/chat/usage.d.ts +66 -0
  89. package/dist/chat/usage.js +219 -0
  90. package/dist/chat/usage.js.map +1 -0
  91. package/dist/collectionAccess.d.ts +6 -0
  92. package/dist/collectionAccess.js +32 -0
  93. package/dist/collectionAccess.js.map +1 -0
  94. package/dist/constants.d.ts +64 -0
  95. package/dist/constants.js +51 -0
  96. package/dist/constants.js.map +1 -0
  97. package/dist/endpoints/access.d.ts +4 -0
  98. package/dist/endpoints/access.js +28 -0
  99. package/dist/endpoints/access.js.map +1 -0
  100. package/dist/endpoints/allowance.d.ts +22 -0
  101. package/dist/endpoints/allowance.js +37 -0
  102. package/dist/endpoints/allowance.js.map +1 -0
  103. package/dist/endpoints/applyEndpoint.d.ts +12 -0
  104. package/dist/endpoints/applyEndpoint.js +170 -0
  105. package/dist/endpoints/applyEndpoint.js.map +1 -0
  106. package/dist/endpoints/budget.d.ts +30 -0
  107. package/dist/endpoints/budget.js +153 -0
  108. package/dist/endpoints/budget.js.map +1 -0
  109. package/dist/endpoints/chatEndpoint.d.ts +12 -0
  110. package/dist/endpoints/chatEndpoint.js +295 -0
  111. package/dist/endpoints/chatEndpoint.js.map +1 -0
  112. package/dist/endpoints/form.d.ts +23 -0
  113. package/dist/endpoints/form.js +95 -0
  114. package/dist/endpoints/form.js.map +1 -0
  115. package/dist/endpoints/usageEndpoint.d.ts +13 -0
  116. package/dist/endpoints/usageEndpoint.js +70 -0
  117. package/dist/endpoints/usageEndpoint.js.map +1 -0
  118. package/dist/index.d.ts +4 -0
  119. package/dist/index.js +5 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/lexical/editorConfig.d.ts +4 -0
  122. package/dist/lexical/editorConfig.js +19 -0
  123. package/dist/lexical/editorConfig.js.map +1 -0
  124. package/dist/lexical/lexicalToMarkdown.d.ts +10 -0
  125. package/dist/lexical/lexicalToMarkdown.js +10 -0
  126. package/dist/lexical/lexicalToMarkdown.js.map +1 -0
  127. package/dist/lexical/markdownToLexical.d.ts +7 -0
  128. package/dist/lexical/markdownToLexical.js +10 -0
  129. package/dist/lexical/markdownToLexical.js.map +1 -0
  130. package/dist/plan/allowed.d.ts +7 -0
  131. package/dist/plan/allowed.js +19 -0
  132. package/dist/plan/allowed.js.map +1 -0
  133. package/dist/plan/applyPlan.d.ts +16 -0
  134. package/dist/plan/applyPlan.js +353 -0
  135. package/dist/plan/applyPlan.js.map +1 -0
  136. package/dist/plan/catalogue.d.ts +37 -0
  137. package/dist/plan/catalogue.js +157 -0
  138. package/dist/plan/catalogue.js.map +1 -0
  139. package/dist/plan/diff.d.ts +13 -0
  140. package/dist/plan/diff.js +87 -0
  141. package/dist/plan/diff.js.map +1 -0
  142. package/dist/plan/parsePlan.d.ts +27 -0
  143. package/dist/plan/parsePlan.js +322 -0
  144. package/dist/plan/parsePlan.js.map +1 -0
  145. package/dist/plan/prompt.d.ts +1 -0
  146. package/dist/plan/prompt.js +45 -0
  147. package/dist/plan/prompt.js.map +1 -0
  148. package/dist/plan/stored.d.ts +53 -0
  149. package/dist/plan/stored.js +3 -0
  150. package/dist/plan/stored.js.map +1 -0
  151. package/dist/plan/tokens.d.ts +8 -0
  152. package/dist/plan/tokens.js +79 -0
  153. package/dist/plan/tokens.js.map +1 -0
  154. package/dist/plan/view.d.ts +4 -0
  155. package/dist/plan/view.js +43 -0
  156. package/dist/plan/view.js.map +1 -0
  157. package/dist/plugin.d.ts +3 -0
  158. package/dist/plugin.js +464 -0
  159. package/dist/plugin.js.map +1 -0
  160. package/dist/read/outline.d.ts +7 -0
  161. package/dist/read/outline.js +70 -0
  162. package/dist/read/outline.js.map +1 -0
  163. package/dist/read/readTarget.d.ts +4 -0
  164. package/dist/read/readTarget.js +13 -0
  165. package/dist/read/readTarget.js.map +1 -0
  166. package/dist/read/readable.d.ts +8 -0
  167. package/dist/read/readable.js +131 -0
  168. package/dist/read/readable.js.map +1 -0
  169. package/dist/runtime.d.ts +15 -0
  170. package/dist/runtime.js +14 -0
  171. package/dist/runtime.js.map +1 -0
  172. package/dist/schema/fields.d.ts +113 -0
  173. package/dist/schema/fields.js +1036 -0
  174. package/dist/schema/fields.js.map +1 -0
  175. package/dist/schema/listingFields.d.ts +9 -0
  176. package/dist/schema/listingFields.js +95 -0
  177. package/dist/schema/listingFields.js.map +1 -0
  178. package/dist/schema/slugify.d.ts +2 -0
  179. package/dist/schema/slugify.js +5 -0
  180. package/dist/schema/slugify.js.map +1 -0
  181. package/dist/settings.d.ts +10 -0
  182. package/dist/settings.js +54 -0
  183. package/dist/settings.js.map +1 -0
  184. package/dist/types.d.ts +198 -0
  185. package/dist/types.js +6 -0
  186. package/dist/types.js.map +1 -0
  187. package/dist/uploads/routeAsset.d.ts +27 -0
  188. package/dist/uploads/routeAsset.js +127 -0
  189. package/dist/uploads/routeAsset.js.map +1 -0
  190. package/package.json +122 -3
@@ -0,0 +1,689 @@
1
+ // Side panel shell. It sits above the page, not over it, so the editor can keep working on the left.
2
+ .panel {
3
+ position: fixed;
4
+ inset-block: 0;
5
+ right: 0;
6
+ z-index: 50;
7
+ display: flex;
8
+ flex-direction: column;
9
+ // Payload sets a 13px root, so the width comes from its spacing unit (20px) rather than rem.
10
+ width: min(calc(var(--base) * 24), 100vw);
11
+ border-inline-start: 1px solid var(--theme-elevation-150);
12
+ background: var(--theme-bg);
13
+ box-shadow: -8px 0 24px rgb(0 0 0 / 12%);
14
+ font-size: 0.875rem;
15
+
16
+ &[hidden] {
17
+ display: none;
18
+ }
19
+
20
+ &__header {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: calc(var(--base) * 0.5);
24
+ padding: calc(var(--base) * 0.75) calc(var(--base) * 1);
25
+ border-bottom: 1px solid var(--theme-elevation-100);
26
+ }
27
+
28
+ &__title {
29
+ flex: 1;
30
+ margin: 0;
31
+ font-size: 1rem;
32
+ }
33
+
34
+ &__usage {
35
+ display: flex;
36
+ flex-wrap: wrap;
37
+ justify-content: flex-end;
38
+ gap: calc(var(--base) * 0.25);
39
+ }
40
+
41
+ &__iconButton {
42
+ display: inline-grid;
43
+ place-items: center;
44
+ width: 2rem;
45
+ height: 2rem;
46
+ padding: 0;
47
+ border: 0;
48
+ border-radius: var(--style-radius-s, 4px);
49
+ background: transparent;
50
+ color: var(--theme-elevation-800);
51
+ font-size: 1.25rem;
52
+ line-height: 1;
53
+ cursor: pointer;
54
+
55
+ &:hover {
56
+ background: var(--theme-elevation-100);
57
+ }
58
+
59
+ &:focus-visible {
60
+ outline: 2px solid var(--theme-success-500);
61
+ outline-offset: 1px;
62
+ }
63
+ }
64
+ }
65
+
66
+ .assistant {
67
+ display: flex;
68
+ flex: 1;
69
+ flex-direction: column;
70
+ min-height: 0;
71
+
72
+ &__bar {
73
+ display: flex;
74
+ align-items: stretch;
75
+ gap: calc(var(--base) * 0.5);
76
+ padding: calc(var(--base) * 0.5) calc(var(--base) * 1);
77
+ border-bottom: 1px solid var(--theme-elevation-100);
78
+ }
79
+
80
+ // The native arrow ignores padding, so it is replaced with a drawn chevron that keeps clear of the text.
81
+ &__selectWrap {
82
+ position: relative;
83
+ flex: 1;
84
+ min-width: 0;
85
+
86
+ &::after {
87
+ content: '';
88
+ position: absolute;
89
+ top: 50%;
90
+ right: 0.875rem;
91
+ width: 0.4375rem;
92
+ height: 0.4375rem;
93
+ border-right: 1.5px solid currentColor;
94
+ border-bottom: 1.5px solid currentColor;
95
+ color: var(--theme-elevation-600);
96
+ transform: translateY(-70%) rotate(45deg);
97
+ pointer-events: none;
98
+ }
99
+ }
100
+
101
+ &__select,
102
+ &__barButton {
103
+ height: 2.25rem;
104
+ border: 1px solid var(--theme-elevation-150);
105
+ border-radius: var(--style-radius-s, 4px);
106
+ color: var(--theme-text);
107
+ font: inherit;
108
+
109
+ &:focus-visible {
110
+ outline: 2px solid var(--theme-success-500);
111
+ outline-offset: 1px;
112
+ }
113
+ }
114
+
115
+ &__select {
116
+ width: 100%;
117
+ padding: 0 2.25rem 0 calc(var(--base) * 0.5);
118
+ overflow: hidden;
119
+ background: var(--theme-input-bg);
120
+ text-overflow: ellipsis;
121
+ white-space: nowrap;
122
+ appearance: none;
123
+ cursor: pointer;
124
+ }
125
+
126
+ &__barButton {
127
+ flex-shrink: 0;
128
+ padding: 0 calc(var(--base) * 0.625);
129
+ background: var(--theme-elevation-50);
130
+ font-weight: 600;
131
+ cursor: pointer;
132
+
133
+ &:hover {
134
+ background: var(--theme-elevation-100);
135
+ }
136
+ }
137
+
138
+ &__chat {
139
+ display: flex;
140
+ flex: 1;
141
+ flex-direction: column;
142
+ min-height: 0;
143
+ }
144
+
145
+ &__log {
146
+ display: flex;
147
+ flex: 1;
148
+ flex-direction: column;
149
+ gap: calc(var(--base) * 1.25);
150
+ min-height: 0;
151
+ overflow-y: auto;
152
+ padding: calc(var(--base) * 1);
153
+ overscroll-behavior: contain;
154
+ }
155
+
156
+ &__welcome {
157
+ color: var(--theme-elevation-600);
158
+
159
+ p {
160
+ margin: 0 0 calc(var(--base) * 0.5);
161
+ }
162
+ }
163
+
164
+ &__user {
165
+ display: flex;
166
+ flex-direction: column;
167
+ align-items: flex-end;
168
+ gap: calc(var(--base) * 0.25);
169
+ align-self: flex-end;
170
+ max-width: 85%;
171
+
172
+ .assistant__text {
173
+ padding: calc(var(--base) * 0.5) calc(var(--base) * 0.75);
174
+ border-radius: calc(var(--base) * 0.75) calc(var(--base) * 0.75) calc(var(--base) * 0.25);
175
+ background: var(--theme-elevation-100);
176
+ line-height: 1.5;
177
+ }
178
+ }
179
+
180
+ &__reply {
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: calc(var(--base) * 0.5);
184
+ max-width: 100%;
185
+ }
186
+
187
+ &__text {
188
+ margin: 0;
189
+ overflow-wrap: anywhere;
190
+ white-space: pre-wrap;
191
+ }
192
+
193
+ &__markdown {
194
+ max-width: 65ch;
195
+ line-height: 1.6;
196
+ overflow-wrap: anywhere;
197
+
198
+ > :first-child {
199
+ margin-top: 0;
200
+ }
201
+
202
+ > :last-child {
203
+ margin-bottom: 0;
204
+ }
205
+
206
+ p,
207
+ ul,
208
+ ol,
209
+ pre {
210
+ margin: 0 0 calc(var(--base) * 0.75);
211
+ }
212
+
213
+ ul,
214
+ ol {
215
+ padding-inline-start: calc(var(--base) * 1.25);
216
+ }
217
+
218
+ li + li {
219
+ margin-top: calc(var(--base) * 0.125);
220
+ }
221
+
222
+ code {
223
+ padding: 0.0625rem 0.25rem;
224
+ border-radius: var(--style-radius-s, 4px);
225
+ background: var(--theme-elevation-100);
226
+ font-size: 0.875em;
227
+ }
228
+
229
+ pre {
230
+ overflow-x: auto;
231
+ padding: calc(var(--base) * 0.5);
232
+ border-radius: var(--style-radius-s, 4px);
233
+ background: var(--theme-elevation-100);
234
+
235
+ code {
236
+ padding: 0;
237
+ background: none;
238
+ }
239
+ }
240
+
241
+ a {
242
+ color: inherit;
243
+ text-decoration: underline;
244
+ }
245
+
246
+ th,
247
+ td {
248
+ padding: calc(var(--base) * 0.25) calc(var(--base) * 0.5);
249
+ border: 1px solid var(--theme-elevation-150);
250
+ text-align: start;
251
+ vertical-align: top;
252
+ }
253
+ }
254
+
255
+ &__markdownHeading {
256
+ margin-top: calc(var(--base) * 0.75);
257
+ }
258
+
259
+ &__markdownTable {
260
+ overflow-x: auto;
261
+ margin-bottom: calc(var(--base) * 0.5);
262
+
263
+ table {
264
+ border-collapse: collapse;
265
+ font-size: 0.875rem;
266
+ }
267
+ }
268
+
269
+ &__thinking {
270
+ margin: 0;
271
+ color: var(--theme-elevation-600);
272
+ }
273
+
274
+ &__steps {
275
+ display: flex;
276
+ flex-direction: column;
277
+ gap: calc(var(--base) * 0.125);
278
+ margin: 0;
279
+ padding: 0;
280
+ color: var(--theme-elevation-600);
281
+ font-size: 0.8125rem;
282
+ list-style: none;
283
+ }
284
+
285
+ &__stepsFold {
286
+ color: var(--theme-elevation-600);
287
+ font-size: 0.8125rem;
288
+
289
+ summary {
290
+ width: fit-content;
291
+ cursor: pointer;
292
+
293
+ &:focus-visible {
294
+ outline: 2px solid var(--theme-success-500);
295
+ outline-offset: 2px;
296
+ }
297
+ }
298
+
299
+ .assistant__steps {
300
+ margin-top: calc(var(--base) * 0.375);
301
+ padding-inline-start: calc(var(--base) * 0.75);
302
+ border-inline-start: 2px solid var(--theme-elevation-150);
303
+ }
304
+ }
305
+
306
+ &__step {
307
+ display: flex;
308
+ gap: calc(var(--base) * 0.375);
309
+
310
+ &[data-state='failed'] {
311
+ color: var(--theme-error-500);
312
+ }
313
+ }
314
+
315
+ &__plan {
316
+ display: flex;
317
+ flex-direction: column;
318
+ gap: calc(var(--base) * 0.5);
319
+ padding: calc(var(--base) * 0.75);
320
+ border: 1px solid var(--theme-elevation-150);
321
+ border-radius: var(--style-radius-m, 6px);
322
+ background: var(--theme-elevation-50);
323
+
324
+ &[data-status='applied'] {
325
+ border-color: var(--theme-success-500);
326
+ }
327
+
328
+ &[data-status='cancelled'] {
329
+ opacity: 0.75;
330
+ }
331
+ }
332
+
333
+ &__planHeader {
334
+ display: flex;
335
+ align-items: center;
336
+ justify-content: space-between;
337
+ gap: calc(var(--base) * 0.5);
338
+ }
339
+
340
+ &__planTitle {
341
+ margin: 0;
342
+ font-size: 1rem;
343
+ }
344
+
345
+ &__ops {
346
+ display: flex;
347
+ flex-direction: column;
348
+ gap: calc(var(--base) * 0.5);
349
+ margin: 0;
350
+ padding: 0;
351
+ list-style: none;
352
+ }
353
+
354
+ &__op {
355
+ display: flex;
356
+ flex-direction: column;
357
+ gap: calc(var(--base) * 0.25);
358
+ padding-block-start: calc(var(--base) * 0.5);
359
+ border-top: 1px solid var(--theme-elevation-150);
360
+ }
361
+
362
+ &__opHeader {
363
+ display: flex;
364
+ flex-wrap: wrap;
365
+ gap: calc(var(--base) * 0.25);
366
+ }
367
+
368
+ &__opLabel {
369
+ margin: 0;
370
+ font-weight: 600;
371
+ }
372
+
373
+ &__pill {
374
+ display: inline-flex;
375
+ align-items: center;
376
+ gap: calc(var(--base) * 0.25);
377
+ padding: 0.0625rem calc(var(--base) * 0.375);
378
+ border: 1px solid transparent;
379
+ border-radius: 999px;
380
+ background: var(--theme-elevation-100);
381
+ color: var(--theme-elevation-800);
382
+ font-size: 0.75rem;
383
+ font-weight: 600;
384
+ line-height: 1.5;
385
+ white-space: nowrap;
386
+
387
+ &[data-tone='success'] {
388
+ background: var(--theme-success-100);
389
+ color: var(--theme-success-800);
390
+ }
391
+
392
+ &[data-tone='warning'] {
393
+ background: var(--theme-warning-100);
394
+ color: var(--theme-warning-800);
395
+ }
396
+
397
+ // Payload has no theme-aware blue, so dark mode swaps the steps itself.
398
+ &[data-tone='info'] {
399
+ background: var(--color-blue-100);
400
+ color: var(--color-blue-800);
401
+
402
+ :global(html[data-theme='dark']) & {
403
+ background: var(--color-blue-800);
404
+ color: var(--color-blue-100);
405
+ }
406
+ }
407
+
408
+ &-dot {
409
+ width: 0.5rem;
410
+ height: 0.5rem;
411
+ border-radius: 50%;
412
+ background: hsl(var(--pill-hue, 0) 65% 50%);
413
+ }
414
+ }
415
+
416
+ &__diff {
417
+ summary {
418
+ cursor: pointer;
419
+ font-size: 0.8125rem;
420
+ font-weight: 600;
421
+
422
+ &:focus-visible {
423
+ outline: 2px solid var(--theme-success-500);
424
+ outline-offset: 2px;
425
+ }
426
+ }
427
+ }
428
+
429
+ &__diffList {
430
+ display: flex;
431
+ flex-direction: column;
432
+ gap: calc(var(--base) * 0.5);
433
+ margin: calc(var(--base) * 0.5) 0 0;
434
+ }
435
+
436
+ &__diffItem {
437
+ display: flex;
438
+ flex-direction: column;
439
+ gap: calc(var(--base) * 0.25);
440
+ }
441
+
442
+ &__diffPath {
443
+ display: flex;
444
+ flex-wrap: wrap;
445
+ align-items: center;
446
+ gap: calc(var(--base) * 0.25);
447
+ font-size: 0.8125rem;
448
+ }
449
+
450
+ &__diffValue {
451
+ margin: 0;
452
+ padding: calc(var(--base) * 0.375) calc(var(--base) * 0.5);
453
+ border-inline-start: 3px solid var(--theme-elevation-250);
454
+ border-radius: var(--style-radius-s, 4px);
455
+ background: var(--theme-elevation-100);
456
+ font-size: 0.8125rem;
457
+ overflow-wrap: anywhere;
458
+ white-space: pre-wrap;
459
+
460
+ &[data-side='before'] {
461
+ color: var(--theme-elevation-600);
462
+ }
463
+
464
+ &[data-side='after'] {
465
+ border-inline-start-color: var(--theme-success-500);
466
+ }
467
+ }
468
+
469
+ &__diffLabel {
470
+ display: block;
471
+ margin-bottom: 0.125rem;
472
+ color: var(--theme-elevation-600);
473
+ font-size: 0.6875rem;
474
+ font-weight: 600;
475
+ letter-spacing: 0.04em;
476
+ text-transform: uppercase;
477
+ }
478
+
479
+ &__list {
480
+ margin: 0;
481
+ padding-inline-start: calc(var(--base) * 1);
482
+ }
483
+
484
+ &__progress {
485
+ position: relative;
486
+ height: 2px;
487
+ overflow: hidden;
488
+ background: var(--theme-elevation-100);
489
+
490
+ &::after {
491
+ content: '';
492
+ position: absolute;
493
+ inset-block: 0;
494
+ width: 30%;
495
+ background: var(--theme-success-500);
496
+ }
497
+
498
+ @media (prefers-reduced-motion: no-preference) {
499
+ &::after {
500
+ animation: assistant-progress 1.2s ease-in-out infinite;
501
+ }
502
+ }
503
+ }
504
+
505
+ &__composer {
506
+ display: flex;
507
+ flex-direction: column;
508
+ gap: calc(var(--base) * 0.5);
509
+ padding: calc(var(--base) * 0.75) calc(var(--base) * 1);
510
+ border-top: 1px solid var(--theme-elevation-100);
511
+ background: var(--theme-bg);
512
+ }
513
+
514
+ &__context {
515
+ display: flex;
516
+ align-items: center;
517
+ gap: calc(var(--base) * 0.375);
518
+ margin: 0;
519
+ color: var(--theme-elevation-600);
520
+ font-size: 0.8125rem;
521
+ }
522
+
523
+ &__chips {
524
+ display: flex;
525
+ flex-wrap: wrap;
526
+ gap: calc(var(--base) * 0.25);
527
+ margin: 0;
528
+ padding: 0;
529
+ list-style: none;
530
+ }
531
+
532
+ &__chip {
533
+ display: inline-flex;
534
+ align-items: center;
535
+ gap: calc(var(--base) * 0.25);
536
+ max-width: 100%;
537
+ padding: 0.125rem calc(var(--base) * 0.375);
538
+ border: 1px solid var(--theme-elevation-150);
539
+ border-radius: 999px;
540
+ font-size: 0.8125rem;
541
+ }
542
+
543
+ &__chip[data-status='failed'] {
544
+ border-color: var(--theme-error-500);
545
+ }
546
+
547
+ &__chipStatus {
548
+ color: var(--theme-elevation-600);
549
+ font-size: 0.75rem;
550
+
551
+ .assistant__chip[data-status='failed'] & {
552
+ color: var(--theme-error-500);
553
+ }
554
+ }
555
+
556
+ &__chipName {
557
+ min-width: 0;
558
+ overflow: hidden;
559
+ text-overflow: ellipsis;
560
+ white-space: nowrap;
561
+ }
562
+
563
+ &__chipRemove {
564
+ display: inline-grid;
565
+ place-items: center;
566
+ width: 1.25rem;
567
+ height: 1.25rem;
568
+ padding: 0;
569
+ border: 0;
570
+ border-radius: 50%;
571
+ background: transparent;
572
+ color: inherit;
573
+ font: inherit;
574
+ cursor: pointer;
575
+
576
+ &:hover {
577
+ background: var(--theme-elevation-100);
578
+ }
579
+
580
+ &:focus-visible {
581
+ outline: 2px solid var(--theme-success-500);
582
+ outline-offset: 1px;
583
+ }
584
+
585
+ &:disabled {
586
+ cursor: not-allowed;
587
+ opacity: 0.5;
588
+ }
589
+ }
590
+
591
+ &__textarea {
592
+ width: 100%;
593
+ min-height: 4.5rem;
594
+ padding: calc(var(--base) * 0.5);
595
+ border: 1px solid var(--theme-elevation-150);
596
+ border-radius: var(--style-radius-m, 6px);
597
+ background: var(--theme-input-bg);
598
+ color: var(--theme-text);
599
+ font: inherit;
600
+ resize: vertical;
601
+
602
+ &:focus-visible {
603
+ outline: 2px solid var(--theme-success-500);
604
+ outline-offset: 2px;
605
+ }
606
+ }
607
+
608
+ &__composerRow {
609
+ display: flex;
610
+ flex-wrap: wrap;
611
+ align-items: flex-start;
612
+ justify-content: space-between;
613
+ gap: calc(var(--base) * 0.5);
614
+ }
615
+
616
+ &__composerActions,
617
+ &__actions {
618
+ display: flex;
619
+ flex-wrap: wrap;
620
+ gap: calc(var(--base) * 0.5);
621
+ }
622
+
623
+ &__composerActions {
624
+ margin-inline-start: auto;
625
+ }
626
+
627
+ &__hint,
628
+ &__meta {
629
+ margin: 0;
630
+ color: var(--theme-elevation-600);
631
+ font-size: 0.8125rem;
632
+ }
633
+
634
+ &__hint {
635
+ flex: 1 1 16rem;
636
+ }
637
+
638
+ &__notice {
639
+ display: flex;
640
+ flex-direction: column;
641
+ align-items: flex-start;
642
+ gap: calc(var(--base) * 0.375);
643
+ padding: calc(var(--base) * 0.5);
644
+ border-radius: var(--style-radius-s, 4px);
645
+ background: var(--theme-warning-100);
646
+ }
647
+
648
+ &__media {
649
+ display: flex;
650
+ align-items: center;
651
+ gap: calc(var(--base) * 0.5);
652
+ }
653
+
654
+ &__mediaThumb {
655
+ flex-shrink: 0;
656
+ width: 2.5rem;
657
+ height: 2.5rem;
658
+ border-radius: var(--style-radius-s, 4px);
659
+ background: var(--theme-elevation-150);
660
+ object-fit: cover;
661
+ }
662
+
663
+ &__error {
664
+ margin: 0 calc(var(--base) * 1);
665
+ color: var(--theme-error-500);
666
+ }
667
+
668
+ &__sr {
669
+ position: absolute;
670
+ width: 1px;
671
+ height: 1px;
672
+ margin: -1px;
673
+ padding: 0;
674
+ overflow: hidden;
675
+ clip-path: inset(50%);
676
+ white-space: nowrap;
677
+ border: 0;
678
+ }
679
+ }
680
+
681
+ @keyframes assistant-progress {
682
+ from {
683
+ left: -30%;
684
+ }
685
+
686
+ to {
687
+ left: 100%;
688
+ }
689
+ }
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from 'react';
2
+ interface AiSourceSwitchProps {
3
+ /** Shown for Humaan AI, and whenever the own key cannot be chosen. */
4
+ humaanAi: ReactNode;
5
+ /** Shown when AI Source is set to the own key. Missing when the own key's credentials are incomplete. */
6
+ ownKey?: ReactNode;
7
+ }
8
+ /**
9
+ * Shows the view that matches AI Source as it stands in the form, saved or not, so changing the choice updates the
10
+ * settings screen straight away. Both views are rendered on the server; this only picks one.
11
+ */
12
+ export declare function AiSourceSwitch({ humaanAi, ownKey }: AiSourceSwitchProps): import("react").JSX.Element;
13
+ export {};
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useFormFields } from '@payloadcms/ui';
4
+ /**
5
+ * Shows the view that matches AI Source as it stands in the form, saved or not, so changing the choice updates the
6
+ * settings screen straight away. Both views are rendered on the server; this only picks one.
7
+ */ export function AiSourceSwitch({ humaanAi, ownKey }) {
8
+ const source = useFormFields(([fields])=>fields.billing?.value);
9
+ return /*#__PURE__*/ _jsx(_Fragment, {
10
+ children: source === 'own-key' && ownKey ? ownKey : humaanAi
11
+ });
12
+ }
13
+
14
+ //# sourceMappingURL=AiSourceSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/AiSourceSwitch.tsx"],"sourcesContent":["'use client'\n\nimport type { ReactNode } from 'react'\n\nimport { useFormFields } from '@payloadcms/ui'\n\ninterface AiSourceSwitchProps {\n /** Shown for Humaan AI, and whenever the own key cannot be chosen. */\n humaanAi: ReactNode\n /** Shown when AI Source is set to the own key. Missing when the own key's credentials are incomplete. */\n ownKey?: ReactNode\n}\n\n/**\n * Shows the view that matches AI Source as it stands in the form, saved or not, so changing the choice updates the\n * settings screen straight away. Both views are rendered on the server; this only picks one.\n */\nexport function AiSourceSwitch({ humaanAi, ownKey }: AiSourceSwitchProps) {\n const source = useFormFields(([fields]) => fields.billing?.value)\n return <>{source === 'own-key' && ownKey ? ownKey : humaanAi}</>\n}\n"],"names":["useFormFields","AiSourceSwitch","humaanAi","ownKey","source","fields","billing","value"],"mappings":"AAAA;;AAIA,SAASA,aAAa,QAAQ,iBAAgB;AAS9C;;;CAGC,GACD,OAAO,SAASC,eAAe,EAAEC,QAAQ,EAAEC,MAAM,EAAuB;IACtE,MAAMC,SAASJ,cAAc,CAAC,CAACK,OAAO,GAAKA,OAAOC,OAAO,EAAEC;IAC3D,qBAAO;kBAAGH,WAAW,aAAaD,SAASA,SAASD;;AACtD"}
@@ -0,0 +1,8 @@
1
+ import type { UIFieldServerProps } from 'payload';
2
+ /**
3
+ * What the model costs, on the settings screen, for AI Source as it stands in the form. On Humaan AI: how much of the
4
+ * project's budget is used, as shares only. On the own key: the site's spend on it, which is the client's own money,
5
+ * so it is shown in US dollars. Both are rendered here, on the server, so no token or key reaches the browser, and
6
+ * `AiSourceSwitch` shows the one that matches. The settings global is admin-only, and so is this screen.
7
+ */
8
+ export declare function BudgetField({ payload, req }: UIFieldServerProps): Promise<import("react").JSX.Element>;