@rodrigobeber/patoai-dtos 4.8.21 → 4.8.23

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.
@@ -20,21 +20,45 @@ export interface LabActionParam {
20
20
  unit?: string;
21
21
  options?: LabActionOption[];
22
22
  }
23
+ /**
24
+ * Como o usuário volta atrás depois de aplicar. É isto — e não o verbo da operação — que define quanto
25
+ * atrito o diálogo impõe.
26
+ * historico → dá para restaurar a versão anterior pela tela (ex.: roteiro)
27
+ * tela → dá para reeditar/refazer na mão (o valor antigo está no próprio diálogo)
28
+ * nenhuma → não volta: o valor antigo se perde no momento em que aplica
29
+ */
30
+ export type LabActionReversible = 'historico' | 'tela' | 'nenhuma';
23
31
  export interface LabAction {
24
32
  id: string;
25
- op: 'update' | 'create';
33
+ op: 'update' | 'create' | 'delete';
26
34
  render: LabActionRender;
27
35
  title: string;
28
36
  path: string;
29
37
  summary: string;
30
38
  params: LabActionParam[];
39
+ reversible: LabActionReversible;
31
40
  undoHint: string;
41
+ /**
42
+ * O que mais quebra junto, quando o alvo é referenciado em outro lugar (mídia usada em roteiro,
43
+ * template usado em lembrete, estágio com leads dentro). O texto ESTÁTICO fica aqui; a lista do que
44
+ * de fato depende deste item é calculada na materialização e vai em `SupportLabProposalDto.impact`.
45
+ * Cascata é o que o cartão do item NÃO mostra — é por isso que ela precisa ser explícita.
46
+ */
47
+ impactHint?: string;
32
48
  }
33
- /** Uma linha "Antes -> Depois" já formatada em pt-BR (render 'field' e 'item'). */
49
+ /**
50
+ * Uma linha "Antes -> Depois" (render 'field' e 'item').
51
+ *
52
+ * `before`/`after` vêm FORMATADOS em pt-BR pelo support; o frontend só exibe. Quem compara para detectar
53
+ * "mudou desde a proposta" é o `beforeRaw` contra o valor cru lido da API — se os dois lados formatassem
54
+ * por conta própria, "18 segundos" × "18s" viraria um falso aviso de alteração.
55
+ */
34
56
  export interface LabProposalChangeDto {
57
+ param: string;
35
58
  label: string;
36
59
  before: string;
37
60
  after: string;
61
+ beforeRaw?: unknown;
38
62
  }
39
63
  export declare const LAB_ACTIONS: LabAction[];
40
64
  export declare function findLabAction(id: string): LabAction | undefined;
@@ -10,8 +10,11 @@
10
10
  // chamada da Oráculo, porque schema de tool entra no prefixo cacheado.
11
11
  //
12
12
  // A IA NUNCA aplica: a proposta é um formulário pré-preenchido e quem aplica é o usuário, pelo diálogo,
13
- // no endpoint REST normal — com o guard que já existe. Por isso não há `delete` no catálogo: sem
14
- // exclusão não existe perda de dado possível por sugestão de IA.
13
+ // no endpoint REST normal — com o guard que já existe.
14
+ //
15
+ // O eixo de risco NÃO é update × delete (apagar um roteiro é SOFT delete, com restaurar na tela; já
16
+ // reescrever um campo do contexto sobrescreve sem histórico nenhum). O que decide o atrito é
17
+ // `reversible` + `impact`, e o diálogo escala: aplicar direto → caixa de aviso → confirmação digitada.
15
18
  Object.defineProperty(exports, "__esModule", { value: true });
16
19
  exports.LAB_ACTIONS = void 0;
17
20
  exports.findLabAction = findLabAction;
@@ -29,6 +32,7 @@ exports.LAB_ACTIONS = [
29
32
  title: 'Roteiro',
30
33
  path: 'Configurações → Agente → Prompts',
31
34
  summary: 'Reescrever o texto de um roteiro do agente (informe o id do roteiro).',
35
+ reversible: 'historico',
32
36
  undoHint: 'Configurações → Agente → Prompts: o roteiro tem histórico e dá para restaurar a versão anterior.',
33
37
  params: [
34
38
  {
@@ -50,7 +54,10 @@ exports.LAB_ACTIONS = [
50
54
  title: 'Contexto básico',
51
55
  path: 'Configurações → Agente → Contexto Básico',
52
56
  summary: 'Reescrever um campo do contexto básico (sobre, papel, público ou comportamento).',
53
- undoHint: 'Configurações Agente Contexto Básico: para editar o campo de novo a qualquer momento.',
57
+ // O endpoint sobrescreve sem gravar histórico: o texto antigo existe no diálogo, e some no
58
+ // instante em que aplica. Por isso é 'nenhuma' — e leva mais atrito que o roteiro, que tem restaurar.
59
+ reversible: 'nenhuma',
60
+ undoHint: 'Este campo não tem histórico: copie o texto atual antes de aplicar se quiser poder voltar.',
54
61
  params: [
55
62
  {
56
63
  name: 'field', kind: 'enum', identity: true, required: true, options: CONTEXT_FIELDS,
@@ -68,3 +75,85 @@ exports.LAB_ACTIONS = [
68
75
  function findLabAction(id) {
69
76
  return exports.LAB_ACTIONS.find(a => a.id === id);
70
77
  }
78
+ // ── Onda 2: os campos de Comportamento e Avançado ──────────────────────────────────────────────
79
+ // São os únicos que a Oráculo já enxerga SEM gastar uma ida de ferramenta (as duas seções estão em
80
+ // CHAT_CONFIG_SECTIONS, o núcleo que vai no prompt cacheado). Todos reeditáveis na tela.
81
+ //
82
+ // ⚠️ Os `min`/`max` aqui são a ÚNICA barreira: `PUT /agent-settings` e `PUT /advanced-settings` só checam
83
+ // permissão, não faixa. Sem eles, "espera 500 segundos" seria aceito pelo backend e o agente passaria 8
84
+ // minutos calado. Os valores espelham os inputs da tela (ResponseTimesManagement / AgentAdvancedSettings).
85
+ const COMPORTAMENTO = 'Configurações → Agente → Comportamento';
86
+ const AVANCADO = 'Configurações → Agente → Avançado';
87
+ const REEDITAVEL = (tela) => `${tela}: dá para mudar o valor de novo quando quiser.`;
88
+ /** Rótulos da tela (ResponseTimesManagement). Espelhados em `crew-config-labels.ts`, com teste travando. */
89
+ const TYPING_SPEED = [
90
+ { value: 9, label: 'Muito rápido' },
91
+ { value: 8, label: 'Robô' },
92
+ { value: 7, label: 'Humano Rápido' },
93
+ { value: 6, label: 'Humano Normal' },
94
+ { value: 5, label: 'Humano Lento' },
95
+ { value: 4, label: 'Lento' },
96
+ ];
97
+ /** Só as 3 opções que a tela OFERECE (`VISION_OPTIONS`). `both`/`text-ocr` são valores legados que ainda
98
+ * existem no banco: aparecem no "antes" de uma crew antiga, mas não podem ser propostos. */
99
+ const VISION = [
100
+ { value: 'no', label: 'Não' },
101
+ { value: 'text', label: 'Extrai significado' },
102
+ { value: 'file', label: 'Análise direta' },
103
+ ];
104
+ function toggle(id, name, title, path, summary, description) {
105
+ return {
106
+ id, op: 'update', render: 'field', title, path, summary,
107
+ reversible: 'tela', undoHint: REEDITAVEL(path),
108
+ params: [{ name, kind: 'boolean', required: true, label: title, description }],
109
+ };
110
+ }
111
+ exports.LAB_ACTIONS.push({
112
+ id: 'behavior.typingSpeed',
113
+ op: 'update', render: 'field',
114
+ title: 'Velocidade de digitação',
115
+ path: COMPORTAMENTO,
116
+ summary: 'Mudar a velocidade com que o agente "digita" a resposta.',
117
+ reversible: 'tela', undoHint: REEDITAVEL(COMPORTAMENTO),
118
+ params: [{
119
+ name: 'typingSpeed', kind: 'enum', required: true, options: TYPING_SPEED,
120
+ label: 'Velocidade de digitação',
121
+ description: 'Quanto MAIOR o número, mais rápido o agente responde (9 = quase instantâneo, 4 = bem devagar).',
122
+ }],
123
+ }, {
124
+ id: 'behavior.debounce',
125
+ op: 'update', render: 'field',
126
+ title: 'Tempo de espera antes de responder',
127
+ path: COMPORTAMENTO,
128
+ summary: 'Ajustar quantos segundos o agente espera, depois da mensagem do lead, antes de responder.',
129
+ reversible: 'tela', undoHint: REEDITAVEL(COMPORTAMENTO),
130
+ params: [{
131
+ name: 'debounce', kind: 'number', required: true, min: 8, max: 120, unit: 'segundos',
132
+ label: 'Tempo de espera antes de responder',
133
+ description: 'Segundos de espera. Serve para o lead terminar de escrever antes de o agente responder.',
134
+ }],
135
+ }, toggle('behavior.pretend', 'pretend', 'Negar que é IA', COMPORTAMENTO, 'Ligar/desligar o agente negar que é uma inteligência artificial quando perguntam.', 'Ligado = o agente nega ser IA quando o lead pergunta.'), {
136
+ id: 'advanced.window',
137
+ op: 'update', render: 'field',
138
+ title: 'Janela de mensagens para a IA',
139
+ path: AVANCADO,
140
+ summary: 'Ajustar quantas mensagens anteriores o agente enxerga ao responder.',
141
+ reversible: 'tela', undoHint: REEDITAVEL(AVANCADO),
142
+ params: [{
143
+ name: 'window', kind: 'number', required: true, min: 5, max: 80, unit: 'mensagens',
144
+ label: 'Janela de mensagens para a IA',
145
+ description: 'Quantas mensagens do histórico o agente lê. Mais mensagens = mais contexto e mais custo por resposta.',
146
+ }],
147
+ }, toggle('advanced.userInfo', 'userInfo', 'Confirmar nome do lead/cliente', AVANCADO, 'Ligar/desligar o agente confirmar o nome do lead no início da conversa.', 'Ligado = o agente confirma o nome antes de seguir.'), toggle('advanced.document', 'document', 'Capacidade de ler documentos', AVANCADO, 'Ligar/desligar a leitura de documentos (PDF etc.) enviados pelo lead.', 'Ligado = o agente lê documentos que o lead enviar.'), {
148
+ id: 'advanced.vision',
149
+ op: 'update', render: 'field',
150
+ title: 'Suporte a imagens',
151
+ path: AVANCADO,
152
+ summary: 'Mudar como o agente trata imagens enviadas pelo lead.',
153
+ reversible: 'tela', undoHint: REEDITAVEL(AVANCADO),
154
+ params: [{
155
+ name: 'vision', kind: 'enum', required: true, options: VISION,
156
+ label: 'Suporte a imagens',
157
+ description: 'Não = ignora imagens; Extrai significado = outra IA descreve a imagem; Análise direta = o próprio agente olha a imagem.',
158
+ }],
159
+ });
@@ -1,7 +1,7 @@
1
1
  import { SupportMessageDto } from "./support-message.dto";
2
2
  import { SupportAgentBalanceDto } from "./support-agent-balance.dto";
3
3
  import { SupportLabPendingAnalysisDto } from "./support-lab-analyze.dto";
4
- import { LabActionRender, LabProposalChangeDto } from "./lab-action-catalog";
4
+ import { LabActionRender, LabActionReversible, LabProposalChangeDto } from "./lab-action-catalog";
5
5
  export interface SupportLabFocusDto {
6
6
  idStage?: number;
7
7
  runType?: string;
@@ -25,7 +25,14 @@ export interface SupportLabProposalDto {
25
25
  path: string;
26
26
  params: Record<string, unknown>;
27
27
  rationale: string;
28
+ reversible: LabActionReversible;
28
29
  undoHint: string;
30
+ /**
31
+ * O que quebra junto se aplicar (mídia usada em roteiro, template usado em lembrete...). Calculado na
32
+ * materialização, não estático: é o que o cartão do item NÃO mostra. Lista não-vazia => confirmação
33
+ * digitada no diálogo.
34
+ */
35
+ impact?: string[];
29
36
  kind?: 'markdown' | 'spin-yaml';
30
37
  baseText?: string;
31
38
  proposedText?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rodrigobeber/patoai-dtos",
3
- "version": "4.8.21",
3
+ "version": "4.8.23",
4
4
  "description": "Data Transfer Objects for PatoAI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",