@rodrigobeber/patoai-dtos 4.8.20 → 4.8.22

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.
@@ -14,3 +14,4 @@ export * from './support-insight-access.dto';
14
14
  export * from './support-agent-balance.dto';
15
15
  export * from './support-lab-session.dto';
16
16
  export * from './support-lab-onboarding.dto';
17
+ export * from './lab-action-catalog';
@@ -30,3 +30,4 @@ __exportStar(require("./support-insight-access.dto"), exports);
30
30
  __exportStar(require("./support-agent-balance.dto"), exports);
31
31
  __exportStar(require("./support-lab-session.dto"), exports);
32
32
  __exportStar(require("./support-lab-onboarding.dto"), exports);
33
+ __exportStar(require("./lab-action-catalog"), exports);
@@ -0,0 +1,56 @@
1
+ /** Como o DIÁLOGO renderiza a proposta (é o que decide se um leigo entende o que vai mudar). */
2
+ export type LabActionRender = 'text' | // diff antes/depois (roteiro, contexto — campos longos)
3
+ 'field' | // tabela "Antes -> Depois" com rótulo em pt-BR (liga/desliga, número, enum, horário)
4
+ 'item';
5
+ export type LabActionParamKind = 'text' | 'boolean' | 'number' | 'enum' | 'time';
6
+ export interface LabActionOption {
7
+ value: string | number;
8
+ label: string;
9
+ }
10
+ export interface LabActionParam {
11
+ name: string;
12
+ kind: LabActionParamKind;
13
+ label: string;
14
+ description: string;
15
+ required?: boolean;
16
+ /** Identifica QUAL item/campo a ação altera (ex.: idPrompt). Compõe a chave anti-duplicata. */
17
+ identity?: boolean;
18
+ min?: number;
19
+ max?: number;
20
+ unit?: string;
21
+ options?: LabActionOption[];
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';
31
+ export interface LabAction {
32
+ id: string;
33
+ op: 'update' | 'create' | 'delete';
34
+ render: LabActionRender;
35
+ title: string;
36
+ path: string;
37
+ summary: string;
38
+ params: LabActionParam[];
39
+ reversible: LabActionReversible;
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;
48
+ }
49
+ /** Uma linha "Antes -> Depois" já formatada em pt-BR (render 'field' e 'item'). */
50
+ export interface LabProposalChangeDto {
51
+ label: string;
52
+ before: string;
53
+ after: string;
54
+ }
55
+ export declare const LAB_ACTIONS: LabAction[];
56
+ export declare function findLabAction(id: string): LabAction | undefined;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ // CATÁLOGO DE AÇÕES da Oráculo (Laboratório) — fonte única, consumida pelos DOIS lados:
3
+ // `patoai-support` renderiza o índice no prompt, valida o que o modelo pediu e materializa a proposta;
4
+ // `patoai-frontend` mapeia cada `id` para {ler valor atual, aplicar} e escolhe o formato do diálogo.
5
+ //
6
+ // Por que um catálogo em vez de um alvo por vez: o painel tem 176 endpoints de escrita e quase tudo é
7
+ // ESTRUTURADO (liga/desliga, número, enum, item de lista). Sem uma declaração comum, cada alvo novo
8
+ // reescreveria DTO, diálogo e persona. Aqui, alvo novo = 1 entrada aqui + 1 linha no registro do
9
+ // frontend. O modelo continua com UMA tool genérica (`propose_change`) — tool nova encareceria toda
10
+ // chamada da Oráculo, porque schema de tool entra no prefixo cacheado.
11
+ //
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
+ //
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.
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.LAB_ACTIONS = void 0;
20
+ exports.findLabAction = findLabAction;
21
+ const CONTEXT_FIELDS = [
22
+ { value: 'about', label: 'Sobre a empresa/oferta' },
23
+ { value: 'role', label: 'Papel do agente' },
24
+ { value: 'audience', label: 'Público-alvo' },
25
+ { value: 'behavior', label: 'Comportamento/tom' },
26
+ ];
27
+ exports.LAB_ACTIONS = [
28
+ {
29
+ id: 'prompt.update',
30
+ op: 'update',
31
+ render: 'text',
32
+ title: 'Roteiro',
33
+ path: 'Configurações → Agente → Prompts',
34
+ summary: 'Reescrever o texto de um roteiro do agente (informe o id do roteiro).',
35
+ reversible: 'historico',
36
+ undoHint: 'Configurações → Agente → Prompts: o roteiro tem histórico e dá para restaurar a versão anterior.',
37
+ params: [
38
+ {
39
+ name: 'idPrompt', kind: 'number', identity: true, required: true,
40
+ label: 'Roteiro',
41
+ description: 'Id do roteiro a alterar — o número entre colchetes no ÍNDICE dos roteiros.',
42
+ },
43
+ {
44
+ name: 'proposedText', kind: 'text', required: true,
45
+ label: 'Texto do roteiro',
46
+ description: 'O texto INTEGRAL novo do roteiro (como deve ficar por completo, não um trecho nem instruções).',
47
+ },
48
+ ],
49
+ },
50
+ {
51
+ id: 'context.update',
52
+ op: 'update',
53
+ render: 'text',
54
+ title: 'Contexto básico',
55
+ path: 'Configurações → Agente → Contexto Básico',
56
+ summary: 'Reescrever um campo do contexto básico (sobre, papel, público ou comportamento).',
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.',
61
+ params: [
62
+ {
63
+ name: 'field', kind: 'enum', identity: true, required: true, options: CONTEXT_FIELDS,
64
+ label: 'Campo',
65
+ description: 'Qual campo do contexto básico alterar.',
66
+ },
67
+ {
68
+ name: 'proposedText', kind: 'text', required: true,
69
+ label: 'Texto do campo',
70
+ description: 'O texto INTEGRAL novo do campo (como deve ficar por completo).',
71
+ },
72
+ ],
73
+ },
74
+ ];
75
+ function findLabAction(id) {
76
+ return exports.LAB_ACTIONS.find(a => a.id === id);
77
+ }
@@ -1,6 +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, LabActionReversible, LabProposalChangeDto } from "./lab-action-catalog";
4
5
  export interface SupportLabFocusDto {
5
6
  idStage?: number;
6
7
  runType?: string;
@@ -18,14 +19,30 @@ export interface SupportLabAskDto {
18
19
  }
19
20
  export interface SupportLabProposalDto {
20
21
  id: string;
21
- target: 'context' | 'prompt';
22
- field?: 'about' | 'role' | 'audience' | 'behavior';
23
- idPrompt?: number;
24
- kind: 'markdown' | 'spin-yaml';
22
+ actionId: string;
23
+ render: LabActionRender;
25
24
  title: string;
26
- baseText: string;
27
- proposedText: string;
25
+ path: string;
26
+ params: Record<string, unknown>;
28
27
  rationale: string;
28
+ reversible: LabActionReversible;
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[];
36
+ kind?: 'markdown' | 'spin-yaml';
37
+ baseText?: string;
38
+ proposedText?: string;
39
+ changes?: LabProposalChangeDto[];
40
+ /** @deprecated compat 1 deploy (frontend antigo lê estes); use `actionId` + `params`. */
41
+ target?: 'context' | 'prompt';
42
+ /** @deprecated compat 1 deploy; use `params.field`. */
43
+ field?: 'about' | 'role' | 'audience' | 'behavior';
44
+ /** @deprecated compat 1 deploy; use `params.idPrompt`. */
45
+ idPrompt?: number;
29
46
  }
30
47
  export interface SupportLabAnswerDto {
31
48
  content: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rodrigobeber/patoai-dtos",
3
- "version": "4.8.20",
3
+ "version": "4.8.22",
4
4
  "description": "Data Transfer Objects for PatoAI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",