@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
|
-
/**
|
|
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.
|
|
14
|
-
//
|
|
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
|
-
|
|
57
|
+
// O endpoint sobrescreve sem gravar histórico: o texto antigo só 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;
|