@greatapps/greatagents-ui 0.3.24 → 0.3.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greatapps/greatagents-ui",
3
- "version": "0.3.24",
3
+ "version": "0.3.25",
4
4
  "description": "Shared agents UI components for Great platform",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -27,11 +27,11 @@ import {
27
27
  PopoverTrigger,
28
28
  Input,
29
29
  Textarea,
30
- Dialog,
31
- DialogContent,
32
- DialogHeader,
33
- DialogTitle,
34
- DialogFooter,
30
+ Sheet,
31
+ SheetContent,
32
+ SheetHeader,
33
+ SheetTitle,
34
+ SheetFooter,
35
35
  Label,
36
36
  Select,
37
37
  SelectContent,
@@ -291,18 +291,18 @@ export function AgentToolsList({ agent, config }: AgentToolsListProps) {
291
291
  </div>
292
292
  )}
293
293
 
294
- {/* Config dialog for custom_instructions */}
295
- <Dialog
294
+ {/* Config sheet for custom_instructions */}
295
+ <Sheet
296
296
  open={!!configTarget}
297
297
  onOpenChange={(open) => !open && setConfigTarget(null)}
298
298
  >
299
- <DialogContent className="sm:max-w-lg">
300
- <DialogHeader>
301
- <DialogTitle>
299
+ <SheetContent className="sm:max-w-lg">
300
+ <SheetHeader>
301
+ <SheetTitle>
302
302
  Instruções da Ferramenta
303
- </DialogTitle>
304
- </DialogHeader>
305
- <div className="space-y-4">
303
+ </SheetTitle>
304
+ </SheetHeader>
305
+ <div className="flex-1 overflow-y-auto px-4 space-y-4">
306
306
  {configTarget && getToolInfo(configTarget.id_tool)?.type !== "none" && (
307
307
  <div className="space-y-2">
308
308
  <Label htmlFor="tool-credential">Credencial</Label>
@@ -344,7 +344,7 @@ export function AgentToolsList({ agent, config }: AgentToolsListProps) {
344
344
  </p>
345
345
  </div>
346
346
  </div>
347
- <DialogFooter>
347
+ <SheetFooter className="flex-row justify-end border-t">
348
348
  <Button
349
349
  variant="outline"
350
350
  onClick={() => setConfigTarget(null)}
@@ -357,9 +357,9 @@ export function AgentToolsList({ agent, config }: AgentToolsListProps) {
357
357
  >
358
358
  Salvar
359
359
  </Button>
360
- </DialogFooter>
361
- </DialogContent>
362
- </Dialog>
360
+ </SheetFooter>
361
+ </SheetContent>
362
+ </Sheet>
363
363
 
364
364
  {/* Remove confirmation */}
365
365
  <AlertDialog
@@ -3,11 +3,11 @@ import { useCreateTool, useUpdateTool } from "../../hooks";
3
3
  import type { Tool } from "../../types";
4
4
  import type { GagentsHookConfig } from "../../hooks/types";
5
5
  import {
6
- Dialog,
7
- DialogContent,
8
- DialogHeader,
9
- DialogTitle,
10
- DialogFooter,
6
+ Sheet,
7
+ SheetContent,
8
+ SheetHeader,
9
+ SheetTitle,
10
+ SheetFooter,
11
11
  Button,
12
12
  Input,
13
13
  Textarea,
@@ -177,127 +177,128 @@ export function ToolFormDialog({
177
177
  }
178
178
 
179
179
  return (
180
- <Dialog open={open} onOpenChange={onOpenChange}>
181
- <DialogContent className="sm:max-w-lg">
182
- <DialogHeader>
183
- <DialogTitle>
180
+ <Sheet open={open} onOpenChange={onOpenChange}>
181
+ <SheetContent className="sm:max-w-lg">
182
+ <SheetHeader>
183
+ <SheetTitle>
184
184
  {isEditing ? "Editar Ferramenta" : "Nova Ferramenta"}
185
- </DialogTitle>
186
- </DialogHeader>
187
- <form onSubmit={handleSubmit} className="space-y-4">
188
- <div className="space-y-2">
189
- <Label htmlFor="tool-name">Nome *</Label>
190
- <Input
191
- id="tool-name"
192
- name="name"
193
- value={form.name}
194
- onChange={(e) => {
195
- const name = e.target.value;
196
- setForm((prev) => ({
197
- ...prev,
198
- name,
199
- nameError: name.trim() ? false : prev.nameError,
200
- ...(!slugManuallyEdited && !isEditing
201
- ? { slug: slugify(name), slugError: false }
202
- : {}),
203
- }));
204
- }}
205
- placeholder="Ex: Google Calendar"
206
- disabled={isPending}
207
- />
208
- {form.nameError && (
209
- <p className="text-sm text-destructive">Nome é obrigatório</p>
210
- )}
211
- </div>
185
+ </SheetTitle>
186
+ </SheetHeader>
187
+ <form onSubmit={handleSubmit} className="flex flex-1 flex-col overflow-hidden">
188
+ <div className="flex-1 overflow-y-auto px-4 space-y-4">
189
+ <div className="space-y-2">
190
+ <Label htmlFor="tool-name">Nome *</Label>
191
+ <Input
192
+ id="tool-name"
193
+ name="name"
194
+ value={form.name}
195
+ onChange={(e) => {
196
+ const name = e.target.value;
197
+ setForm((prev) => ({
198
+ ...prev,
199
+ name,
200
+ nameError: name.trim() ? false : prev.nameError,
201
+ ...(!slugManuallyEdited && !isEditing
202
+ ? { slug: slugify(name), slugError: false }
203
+ : {}),
204
+ }));
205
+ }}
206
+ placeholder="Ex: Google Calendar"
207
+ disabled={isPending}
208
+ />
209
+ {form.nameError && (
210
+ <p className="text-sm text-destructive">Nome é obrigatório</p>
211
+ )}
212
+ </div>
212
213
 
213
- <div className="space-y-2">
214
- <Label htmlFor="tool-slug">Slug (identificador único) *</Label>
215
- <Input
216
- id="tool-slug"
217
- name="slug"
218
- value={form.slug}
219
- onChange={(e) => {
220
- setSlugManuallyEdited(true);
221
- setForm((prev) => ({
222
- ...prev,
223
- slug: e.target.value,
224
- slugError: e.target.value.trim() ? false : prev.slugError,
225
- }));
226
- }}
227
- placeholder="Ex: google-calendar"
228
- disabled={isPending}
229
- />
230
- <p className="text-xs text-muted-foreground">
231
- Gerado automaticamente a partir do nome. Usado internamente para identificar a ferramenta.
232
- </p>
233
- {form.slugError && (
234
- <p className="text-sm text-destructive">Slug é obrigatório</p>
235
- )}
236
- </div>
214
+ <div className="space-y-2">
215
+ <Label htmlFor="tool-slug">Slug (identificador único) *</Label>
216
+ <Input
217
+ id="tool-slug"
218
+ name="slug"
219
+ value={form.slug}
220
+ onChange={(e) => {
221
+ setSlugManuallyEdited(true);
222
+ setForm((prev) => ({
223
+ ...prev,
224
+ slug: e.target.value,
225
+ slugError: e.target.value.trim() ? false : prev.slugError,
226
+ }));
227
+ }}
228
+ placeholder="Ex: google-calendar"
229
+ disabled={isPending}
230
+ />
231
+ <p className="text-xs text-muted-foreground">
232
+ Gerado automaticamente a partir do nome. Usado internamente para identificar a ferramenta.
233
+ </p>
234
+ {form.slugError && (
235
+ <p className="text-sm text-destructive">Slug é obrigatório</p>
236
+ )}
237
+ </div>
237
238
 
238
- <div className="space-y-2">
239
- <Label htmlFor="tool-type">Tipo de Autenticação *</Label>
240
- <Select
241
- value={form.type}
242
- onValueChange={(value) => {
243
- setForm((prev) => ({
244
- ...prev,
245
- type: value,
246
- typeError: false,
247
- }));
248
- }}
249
- disabled={isPending}
250
- >
251
- <SelectTrigger id="tool-type">
252
- <SelectValue placeholder="Selecione o tipo" />
253
- </SelectTrigger>
254
- <SelectContent>
255
- {TOOL_AUTH_TYPES.map((t) => (
256
- <SelectItem key={t.value} value={t.value}>
257
- {t.label}
258
- </SelectItem>
259
- ))}
260
- </SelectContent>
261
- </Select>
262
- <p className="text-xs text-muted-foreground">
263
- Define se a ferramenta requer credenciais para funcionar.
264
- </p>
265
- {form.typeError && (
266
- <p className="text-sm text-destructive">Tipo é obrigatório</p>
267
- )}
268
- </div>
239
+ <div className="space-y-2">
240
+ <Label htmlFor="tool-type">Tipo de Autenticação *</Label>
241
+ <Select
242
+ value={form.type}
243
+ onValueChange={(value) => {
244
+ setForm((prev) => ({
245
+ ...prev,
246
+ type: value,
247
+ typeError: false,
248
+ }));
249
+ }}
250
+ disabled={isPending}
251
+ >
252
+ <SelectTrigger id="tool-type">
253
+ <SelectValue placeholder="Selecione o tipo" />
254
+ </SelectTrigger>
255
+ <SelectContent>
256
+ {TOOL_AUTH_TYPES.map((t) => (
257
+ <SelectItem key={t.value} value={t.value}>
258
+ {t.label}
259
+ </SelectItem>
260
+ ))}
261
+ </SelectContent>
262
+ </Select>
263
+ <p className="text-xs text-muted-foreground">
264
+ Define se a ferramenta requer credenciais para funcionar.
265
+ </p>
266
+ {form.typeError && (
267
+ <p className="text-sm text-destructive">Tipo é obrigatório</p>
268
+ )}
269
+ </div>
269
270
 
270
- <div className="space-y-2">
271
- <Label htmlFor="tool-description">Descrição</Label>
272
- <Textarea
273
- id="tool-description"
274
- name="description"
275
- value={form.description}
276
- onChange={(e) =>
277
- setForm((prev) => ({ ...prev, description: e.target.value }))
278
- }
279
- placeholder="Descri\u00e7\u00e3o da ferramenta\u2026"
280
- rows={3}
281
- disabled={isPending}
282
- />
283
- </div>
271
+ <div className="space-y-2">
272
+ <Label htmlFor="tool-description">Descrição</Label>
273
+ <Textarea
274
+ id="tool-description"
275
+ name="description"
276
+ value={form.description}
277
+ onChange={(e) =>
278
+ setForm((prev) => ({ ...prev, description: e.target.value }))
279
+ }
280
+ placeholder="Descri\u00e7\u00e3o da ferramenta\u2026"
281
+ rows={3}
282
+ disabled={isPending}
283
+ />
284
+ </div>
284
285
 
285
- <div className="space-y-2">
286
- <Label htmlFor="tool-function-defs">
287
- Definições de Função (JSON)
288
- </Label>
289
- <Textarea
290
- id="tool-function-defs"
291
- name="functionDefs"
292
- value={form.functionDefinitions}
293
- onChange={(e) => {
294
- setForm((prev) => ({
295
- ...prev,
296
- functionDefinitions: e.target.value,
297
- jsonError: false,
298
- }));
299
- }}
300
- placeholder={`[
286
+ <div className="space-y-2">
287
+ <Label htmlFor="tool-function-defs">
288
+ Definições de Função (JSON)
289
+ </Label>
290
+ <Textarea
291
+ id="tool-function-defs"
292
+ name="functionDefs"
293
+ value={form.functionDefinitions}
294
+ onChange={(e) => {
295
+ setForm((prev) => ({
296
+ ...prev,
297
+ functionDefinitions: e.target.value,
298
+ jsonError: false,
299
+ }));
300
+ }}
301
+ placeholder={`[
301
302
  {
302
303
  "type": "function",
303
304
  "function": {
@@ -311,19 +312,20 @@ export function ToolFormDialog({
311
312
  }
312
313
  }
313
314
  ]`}
314
- rows={10}
315
- className="font-mono text-sm"
316
- disabled={isPending}
317
- />
318
- <p className="text-xs text-muted-foreground">
319
- Array de definições no formato OpenAI Function Calling.
320
- </p>
321
- {form.jsonError && (
322
- <p className="text-sm text-destructive">JSON inválido</p>
323
- )}
315
+ rows={10}
316
+ className="font-mono text-sm"
317
+ disabled={isPending}
318
+ />
319
+ <p className="text-xs text-muted-foreground">
320
+ Array de definições no formato OpenAI Function Calling.
321
+ </p>
322
+ {form.jsonError && (
323
+ <p className="text-sm text-destructive">JSON inválido</p>
324
+ )}
325
+ </div>
324
326
  </div>
325
327
 
326
- <DialogFooter>
328
+ <SheetFooter className="flex-row justify-end border-t">
327
329
  <Button
328
330
  type="button"
329
331
  variant="outline"
@@ -338,9 +340,9 @@ export function ToolFormDialog({
338
340
  ) : null}
339
341
  {isEditing ? "Salvar" : "Criar"}
340
342
  </Button>
341
- </DialogFooter>
343
+ </SheetFooter>
342
344
  </form>
343
- </DialogContent>
344
- </Dialog>
345
+ </SheetContent>
346
+ </Sheet>
345
347
  );
346
348
  }