evo360-types 1.3.387 → 1.3.390

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.
@@ -29,6 +29,42 @@ export interface ILeadDistChannel {
29
29
  ref?: FirestoreDocumentReference;
30
30
  updated_at?: Date | null;
31
31
  }
32
+ /** Origem de aquisição do lead (feat-038) — base expansível p/ múltiplas
33
+ * plataformas. v1 implementa só `type:'ctwa'` (Click-to-WhatsApp da Meta);
34
+ * Google Ads / Instagram Direct / TikTok / site ficam para fast-follow. */
35
+ export type LeadReferralType = "ctwa" | "instagram_direct" | "google_ads" | "tiktok" | "site" | "other";
36
+ export interface ILeadReferralBase {
37
+ type: LeadReferralType;
38
+ captured_at?: Date | string | null;
39
+ source_url?: string | null;
40
+ label?: string | null;
41
+ raw?: Record<string, unknown> | null;
42
+ }
43
+ export interface ILeadReferralCTWA extends ILeadReferralBase {
44
+ type: "ctwa";
45
+ ad_id?: string | null;
46
+ source_type?: string | null;
47
+ headline?: string | null;
48
+ body?: string | null;
49
+ media_type?: string | null;
50
+ ctwa_clid?: string | null;
51
+ }
52
+ export type ILeadReferral = ILeadReferralCTWA;
53
+ /** Estado da régua de reativação de lead (feat-037).
54
+ * Mantido pelo subscriber `ticket_closed` (streak) e pela task
55
+ * `lead_reactivation` (último disparo). Semântica do streak alinhada ao
56
+ * `seminter_streak` do feat-018: incrementa a cada fechamento "sem interação"
57
+ * consecutivo e zera em fechamento não-seminter / resposta do lead. */
58
+ export interface ILeadReactivation {
59
+ /** Fechamentos "sem interação" (`seminter`) consecutivos sem reengajamento.
60
+ * Usado como teto anti-spam na condição da regra
61
+ * (`lead.reactivation.no_interaction_streak < N`). */
62
+ no_interaction_streak?: number;
63
+ /** Quando ocorreu o último fechamento "sem interação" que incrementou o streak. */
64
+ last_no_interaction_close_at?: Date | null;
65
+ /** Quando a última mensagem de reativação foi efetivamente enviada. */
66
+ last_reactivation_at?: Date | null;
67
+ }
32
68
  export interface ILead extends IProfile {
33
69
  external_id?: string | null;
34
70
  social_id?: string | null;
@@ -42,6 +78,10 @@ export interface ILead extends IProfile {
42
78
  tags?: ITag[] | null;
43
79
  userRef?: FirestoreDocumentReference;
44
80
  ctwa_clid?: string | null;
81
+ /**
82
+ * @deprecated A ESCRITA foi substituída por `acquisition_sources[]` (feat-038).
83
+ * Tipo mantido para leitura de leads antigos; sem backfill.
84
+ */
45
85
  ctwa_referral?: {
46
86
  source_type?: string;
47
87
  source_id?: string;
@@ -51,5 +91,7 @@ export interface ILead extends IProfile {
51
91
  media_type?: string;
52
92
  captured_at?: Date | string | null;
53
93
  } | null;
94
+ acquisition_sources?: ILeadReferral[] | null;
95
+ reactivation?: ILeadReactivation | null;
54
96
  [key: string]: unknown;
55
97
  }
@@ -44,6 +44,53 @@ export interface ILeadDistChannel {
44
44
  updated_at?: Date | null;
45
45
  }
46
46
 
47
+ /** Origem de aquisição do lead (feat-038) — base expansível p/ múltiplas
48
+ * plataformas. v1 implementa só `type:'ctwa'` (Click-to-WhatsApp da Meta);
49
+ * Google Ads / Instagram Direct / TikTok / site ficam para fast-follow. */
50
+ export type LeadReferralType =
51
+ | "ctwa" // Click-to-WhatsApp (Meta FB/IG → WhatsApp) ← v1
52
+ | "instagram_direct" // ig.me ?ref= ← futuro
53
+ | "google_ads" // gclid / token em ?text= ← futuro
54
+ | "tiktok"
55
+ | "site"
56
+ | "other"; // ← futuro
57
+
58
+ export interface ILeadReferralBase {
59
+ type: LeadReferralType; // discriminador p/ o parser
60
+ captured_at?: Date | string | null; // 1º toque desta origem (idioma do repo)
61
+ source_url?: string | null; // link clicável
62
+ label?: string | null; // rótulo de exibição (headline || ad_id || domínio)
63
+ raw?: Record<string, unknown> | null; // payload original lossless → re-parse futuro sem backfill
64
+ }
65
+
66
+ export interface ILeadReferralCTWA extends ILeadReferralBase {
67
+ type: "ctwa";
68
+ ad_id?: string | null; // referral.source_id
69
+ source_type?: string | null; // 'ad' | 'post'
70
+ headline?: string | null;
71
+ body?: string | null;
72
+ media_type?: string | null;
73
+ ctwa_clid?: string | null; // espelho; o de topo (CAPI/feat-034) permanece na raiz
74
+ }
75
+
76
+ export type ILeadReferral = ILeadReferralCTWA; // | ILeadReferralGoogleAds | ...
77
+
78
+ /** Estado da régua de reativação de lead (feat-037).
79
+ * Mantido pelo subscriber `ticket_closed` (streak) e pela task
80
+ * `lead_reactivation` (último disparo). Semântica do streak alinhada ao
81
+ * `seminter_streak` do feat-018: incrementa a cada fechamento "sem interação"
82
+ * consecutivo e zera em fechamento não-seminter / resposta do lead. */
83
+ export interface ILeadReactivation {
84
+ /** Fechamentos "sem interação" (`seminter`) consecutivos sem reengajamento.
85
+ * Usado como teto anti-spam na condição da regra
86
+ * (`lead.reactivation.no_interaction_streak < N`). */
87
+ no_interaction_streak?: number;
88
+ /** Quando ocorreu o último fechamento "sem interação" que incrementou o streak. */
89
+ last_no_interaction_close_at?: Date | null;
90
+ /** Quando a última mensagem de reativação foi efetivamente enviada. */
91
+ last_reactivation_at?: Date | null;
92
+ }
93
+
47
94
  export interface ILead extends IProfile {
48
95
  external_id?: string | null; // ID externo do paciente
49
96
  social_id?: string | null; //CPF
@@ -58,6 +105,10 @@ export interface ILead extends IProfile {
58
105
  userRef?: FirestoreDocumentReference;
59
106
  // CTWA attribution (feat-034) — capturado do referral do 1º inbound vindo de anúncio Click-to-WhatsApp.
60
107
  ctwa_clid?: string | null;
108
+ /**
109
+ * @deprecated A ESCRITA foi substituída por `acquisition_sources[]` (feat-038).
110
+ * Tipo mantido para leitura de leads antigos; sem backfill.
111
+ */
61
112
  ctwa_referral?: {
62
113
  source_type?: string;
63
114
  source_id?: string;
@@ -67,5 +118,10 @@ export interface ILead extends IProfile {
67
118
  media_type?: string;
68
119
  captured_at?: Date | string | null;
69
120
  } | null;
121
+ // Origens de aquisição multi-touch (feat-038) — união discriminada por `type`.
122
+ // Substitui a escrita de `ctwa_referral`; `ctwa_clid` de topo permanece (CAPI).
123
+ acquisition_sources?: ILeadReferral[] | null;
124
+ // Régua de reativação (feat-037) — mantida pelo subscriber ticket_closed + task lead_reactivation.
125
+ reactivation?: ILeadReactivation | null;
70
126
  [key: string]: unknown; // index signature
71
127
  }
@@ -1,18 +1,25 @@
1
+ import type { IExternalLink } from "../../shared";
1
2
  /** Fase de avaliação.
2
- * - `pre_llm` (v1.0) : avalia antes do orchestrator LLM.
3
- * - `post_llm` (v1.1) : avalia depois do orchestrator e antes do envio
4
- * outbound (safety/governance).
3
+ * - `pre_llm` (v1.0) : avalia antes do orchestrator LLM.
4
+ * - `post_llm` (v1.1) : avalia depois do orchestrator e antes do envio
5
+ * outbound (safety/governance).
6
+ * - `ticket_closed` (feat-037) : avalia quando um atendimento é fechado
7
+ * (v1: ATTENDANCE_CLOSED do Chatbee). Side-effects
8
+ * only — não há mensagem em trânsito; a regra
9
+ * apenas executa actions (ex: `create_task`).
5
10
  * Ortogonal ao `when` (trigger): regras outbound (feat-027) usam
6
11
  * `when=outbound_message + phase=pre_llm`. O par
7
- * `outbound_message + post_llm` fica reservado p/ LLM-em-outbound futuro. */
8
- export type IHubiaRulePhase = "pre_llm" | "post_llm";
12
+ * `outbound_message + post_llm` fica reservado p/ LLM-em-outbound futuro.
13
+ * `ticket_closed` é a única phase em que phase e when andam juntos. */
14
+ export type IHubiaRulePhase = "pre_llm" | "post_llm" | "ticket_closed";
9
15
  /** Gatilho que dispara a avaliação. Combinações válidas com `phase`
10
16
  * (validado pelo superRefine de `zHubiaRuleSchema`):
11
- * - `inbound_message` + pre_llm : mensagem do paciente (v1.0).
12
- * - `llm_completed` + post_llm : turno do LLM concluído (feat-026).
13
- * - `outbound_message` + pre_llm : mensagem enviada ao paciente, reativo
14
- * pós-fato (feat-027). */
15
- export type IHubiaRuleTrigger = "inbound_message" | "llm_completed" | "outbound_message";
17
+ * - `inbound_message` + pre_llm : mensagem do paciente (v1.0).
18
+ * - `llm_completed` + post_llm : turno do LLM concluído (feat-026).
19
+ * - `outbound_message` + pre_llm : mensagem enviada ao paciente, reativo
20
+ * pós-fato (feat-027).
21
+ * - `ticket_closed` + ticket_closed : atendimento fechado (feat-037). */
22
+ export type IHubiaRuleTrigger = "inbound_message" | "llm_completed" | "outbound_message" | "ticket_closed";
16
23
  /** Desfecho do turno após a regra disparar:
17
24
  * - `stop` — finaliza turno; em pre_llm pula o LLM,
18
25
  * em post_llm bloqueia o envio outbound, em
@@ -102,10 +109,44 @@ export interface IHubiaRuleScope {
102
109
  * `{{fact.path}}` resolvido em runtime pelo facts provider. */
103
110
  export interface IHubiaRuleAction {
104
111
  /** Nome de uma tool `category: 'action'` do evo-hubia-tools
105
- * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
112
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags,
113
+ * create_task, …). */
106
114
  tool: string;
107
115
  input?: Record<string, unknown>;
108
116
  }
117
+ /** Input da action `create_task` (feat-037) — genérica: cria qualquer
118
+ * `IAutoTask` (a reativação de lead é o 1º caso de uso). Disponível apenas na
119
+ * phase `ticket_closed`. Todos os campos string/record aceitam templating
120
+ * `{{fact.path}}` resolvido em runtime pelo facts provider.
121
+ *
122
+ * Mapeamento p/ `IAutoTask` (no executor do cloud-functions):
123
+ * - `handler`/`kind`/`payload` → `auto.{handler,kind,payload}`.
124
+ * - `delay_hours` → `schedule.execute_at = now + delay_hours`.
125
+ * - `send_window` (opcional) → adia `execute_at` p/ a próxima abertura da
126
+ * janela (via `isInsideSchedule`/`nowInTz`).
127
+ * - `external_links` (opcional) → `externalLinks[]` (além do `crm_lead`
128
+ * derivado automaticamente do fact `lead.id`).
129
+ * - `idempotency_key` (opcional) → `idempotency_key` (dedup de criação). */
130
+ export interface ICreateTaskActionInput {
131
+ /** Handler lógico que processará a task (`TaskAutoHandler`). Define o tópico
132
+ * PubSub do executor (`{handler}.execute_requests`). Ex: `lead_reactivation`. */
133
+ handler: string;
134
+ /** Sub-tipo do trabalho dentro do handler (`auto.kind`). Ex: `reactivate.send`. */
135
+ kind: string;
136
+ /** Payload específico do handler (`auto.payload`). Forma livre. */
137
+ payload?: Record<string, unknown>;
138
+ /** Atraso, em horas, a partir de agora para o `execute_at` da task. */
139
+ delay_hours: number;
140
+ /** Janela de horário opcional (por-regra). Quando presente, o `execute_at`
141
+ * é adiado para a próxima abertura da janela. Reusa `IHubiaSchedule`
142
+ * (mesma estrutura/editor das condições `in_schedule`). */
143
+ send_window?: IHubiaSchedule;
144
+ /** Links externos adicionais p/ a task (além do `crm_lead` automático). */
145
+ external_links?: IExternalLink[];
146
+ /** Chave de idempotência para a criação da task (evita duplicação em
147
+ * entrega at-least-once do gatilho). */
148
+ idempotency_key?: string;
149
+ }
109
150
  /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
110
151
  * `evo-hubia-rules`. Reusa ToolRegistry para executar actions, herdando
111
152
  * as policies já existentes (mode, requiresLinkedLead, etc.). */
@@ -5,24 +5,32 @@
5
5
  //
6
6
  // Ver docs em cloud-functions/docs/evo-hubia-rules/.
7
7
 
8
+ import type { IExternalLink } from "../../shared";
9
+
8
10
  // ── Enums / Literals ──
9
11
 
10
12
  /** Fase de avaliação.
11
- * - `pre_llm` (v1.0) : avalia antes do orchestrator LLM.
12
- * - `post_llm` (v1.1) : avalia depois do orchestrator e antes do envio
13
- * outbound (safety/governance).
13
+ * - `pre_llm` (v1.0) : avalia antes do orchestrator LLM.
14
+ * - `post_llm` (v1.1) : avalia depois do orchestrator e antes do envio
15
+ * outbound (safety/governance).
16
+ * - `ticket_closed` (feat-037) : avalia quando um atendimento é fechado
17
+ * (v1: ATTENDANCE_CLOSED do Chatbee). Side-effects
18
+ * only — não há mensagem em trânsito; a regra
19
+ * apenas executa actions (ex: `create_task`).
14
20
  * Ortogonal ao `when` (trigger): regras outbound (feat-027) usam
15
21
  * `when=outbound_message + phase=pre_llm`. O par
16
- * `outbound_message + post_llm` fica reservado p/ LLM-em-outbound futuro. */
17
- export type IHubiaRulePhase = "pre_llm" | "post_llm";
22
+ * `outbound_message + post_llm` fica reservado p/ LLM-em-outbound futuro.
23
+ * `ticket_closed` é a única phase em que phase e when andam juntos. */
24
+ export type IHubiaRulePhase = "pre_llm" | "post_llm" | "ticket_closed";
18
25
 
19
26
  /** Gatilho que dispara a avaliação. Combinações válidas com `phase`
20
27
  * (validado pelo superRefine de `zHubiaRuleSchema`):
21
- * - `inbound_message` + pre_llm : mensagem do paciente (v1.0).
22
- * - `llm_completed` + post_llm : turno do LLM concluído (feat-026).
23
- * - `outbound_message` + pre_llm : mensagem enviada ao paciente, reativo
24
- * pós-fato (feat-027). */
25
- export type IHubiaRuleTrigger = "inbound_message" | "llm_completed" | "outbound_message";
28
+ * - `inbound_message` + pre_llm : mensagem do paciente (v1.0).
29
+ * - `llm_completed` + post_llm : turno do LLM concluído (feat-026).
30
+ * - `outbound_message` + pre_llm : mensagem enviada ao paciente, reativo
31
+ * pós-fato (feat-027).
32
+ * - `ticket_closed` + ticket_closed : atendimento fechado (feat-037). */
33
+ export type IHubiaRuleTrigger = "inbound_message" | "llm_completed" | "outbound_message" | "ticket_closed";
26
34
 
27
35
  /** Desfecho do turno após a regra disparar:
28
36
  * - `stop` — finaliza turno; em pre_llm pula o LLM,
@@ -142,11 +150,46 @@ export interface IHubiaRuleScope {
142
150
  * `{{fact.path}}` resolvido em runtime pelo facts provider. */
143
151
  export interface IHubiaRuleAction {
144
152
  /** Nome de uma tool `category: 'action'` do evo-hubia-tools
145
- * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
153
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags,
154
+ * create_task, …). */
146
155
  tool: string;
147
156
  input?: Record<string, unknown>;
148
157
  }
149
158
 
159
+ /** Input da action `create_task` (feat-037) — genérica: cria qualquer
160
+ * `IAutoTask` (a reativação de lead é o 1º caso de uso). Disponível apenas na
161
+ * phase `ticket_closed`. Todos os campos string/record aceitam templating
162
+ * `{{fact.path}}` resolvido em runtime pelo facts provider.
163
+ *
164
+ * Mapeamento p/ `IAutoTask` (no executor do cloud-functions):
165
+ * - `handler`/`kind`/`payload` → `auto.{handler,kind,payload}`.
166
+ * - `delay_hours` → `schedule.execute_at = now + delay_hours`.
167
+ * - `send_window` (opcional) → adia `execute_at` p/ a próxima abertura da
168
+ * janela (via `isInsideSchedule`/`nowInTz`).
169
+ * - `external_links` (opcional) → `externalLinks[]` (além do `crm_lead`
170
+ * derivado automaticamente do fact `lead.id`).
171
+ * - `idempotency_key` (opcional) → `idempotency_key` (dedup de criação). */
172
+ export interface ICreateTaskActionInput {
173
+ /** Handler lógico que processará a task (`TaskAutoHandler`). Define o tópico
174
+ * PubSub do executor (`{handler}.execute_requests`). Ex: `lead_reactivation`. */
175
+ handler: string;
176
+ /** Sub-tipo do trabalho dentro do handler (`auto.kind`). Ex: `reactivate.send`. */
177
+ kind: string;
178
+ /** Payload específico do handler (`auto.payload`). Forma livre. */
179
+ payload?: Record<string, unknown>;
180
+ /** Atraso, em horas, a partir de agora para o `execute_at` da task. */
181
+ delay_hours: number;
182
+ /** Janela de horário opcional (por-regra). Quando presente, o `execute_at`
183
+ * é adiado para a próxima abertura da janela. Reusa `IHubiaSchedule`
184
+ * (mesma estrutura/editor das condições `in_schedule`). */
185
+ send_window?: IHubiaSchedule;
186
+ /** Links externos adicionais p/ a task (além do `crm_lead` automático). */
187
+ external_links?: IExternalLink[];
188
+ /** Chave de idempotência para a criação da task (evita duplicação em
189
+ * entrega at-least-once do gatilho). */
190
+ idempotency_key?: string;
191
+ }
192
+
150
193
  // ── Main ──
151
194
 
152
195
  /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
@@ -52,6 +52,7 @@ export declare const TaskAutoHandlerEnum: {
52
52
  readonly Invoices: "invoices";
53
53
  readonly Webhook: "webhook";
54
54
  readonly Custom: "custom";
55
+ readonly LeadReactivation: "lead_reactivation";
55
56
  };
56
57
  export type TaskAutoHandler = (typeof TaskAutoHandlerEnum)[keyof typeof TaskAutoHandlerEnum];
57
58
  export declare const TaskRetryStrategyEnum: {
@@ -83,6 +83,10 @@ exports.TaskAutoHandlerEnum = {
83
83
  Invoices: "invoices",
84
84
  Webhook: "webhook",
85
85
  Custom: "custom",
86
+ // feat-037: handler que processa a régua de reativação de lead
87
+ // (gerado pela action `create_task` da phase `ticket_closed`).
88
+ // Tópico PubSub do executor: `lead_reactivation.execute_requests`.
89
+ LeadReactivation: "lead_reactivation",
86
90
  };
87
91
  // ----- Retry policy
88
92
  exports.TaskRetryStrategyEnum = {
@@ -94,6 +94,10 @@ export const TaskAutoHandlerEnum = {
94
94
  Invoices: "invoices",
95
95
  Webhook: "webhook",
96
96
  Custom: "custom",
97
+ // feat-037: handler que processa a régua de reativação de lead
98
+ // (gerado pela action `create_task` da phase `ticket_closed`).
99
+ // Tópico PubSub do executor: `lead_reactivation.execute_requests`.
100
+ LeadReactivation: "lead_reactivation",
97
101
  } as const;
98
102
 
99
103
  export type TaskAutoHandler =
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.387",
3
+ "version": "1.3.390",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",