evo360-types 1.3.367 → 1.3.369

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.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.zAiBindingSchema = exports.zHubiaConversationModeSchema = exports.zHubiaConversationMessageSchema = exports.zHubiaV1ChannelConfigSchema = exports.zHubiaAttendanceModeSchema = void 0;
3
+ exports.zAiBindingSchema = exports.zHubiaRuleSchema = exports.zHubiaRulesModeSchema = exports.zHubiaRuleActionSchema = exports.zHubiaRuleScopeSchema = exports.zHubiaConditionGroupSchema = exports.zHubiaConditionSchema = exports.zHubiaConditionOpSchema = exports.zHubiaRuleAppliesToSchema = exports.zHubiaRuleOutcomeSchema = exports.zHubiaRuleTriggerSchema = exports.zHubiaRulePhaseSchema = exports.zHubiaConversationModeSchema = exports.zHubiaConversationMessageSchema = exports.zHubiaV1ChannelConfigSchema = exports.zHubiaAttendanceModeSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const zod_schemas_1 = require("../../shared/zod-schemas");
6
6
  // ───────── Attendance Mode (how AI operates on this channel) ─────────
@@ -81,6 +81,85 @@ exports.zHubiaConversationMessageSchema = zod_1.z.object({
81
81
  }).passthrough();
82
82
  // ───────── Conversation Mode ─────────
83
83
  exports.zHubiaConversationModeSchema = zod_1.z.enum(["ai_only", "hybrid_assist", "human_only", "blocked"]);
84
+ // ───────── evo-hubia-rules (deterministic rule layer) ─────────
85
+ //
86
+ // Camada de regras determinísticas avaliada pelo motor `evo-hubia-rules`
87
+ // (ver cloud-functions/docs/evo-hubia-rules/). Roda ANTES do LLM (fase
88
+ // `pre_llm`, único escopo de implementação atual). O campo `phase` já
89
+ // reserva espaço arquitetural para um hook `post_llm` futuro.
90
+ //
91
+ // As regras moram em `binding.rules[]` — o binding É o cruzamento canal⨯
92
+ // departamento, então o escopo de departamento é implícito.
93
+ /** Fase de avaliação. Tipos TS em src/types/evo-hub-ia/v1/. */
94
+ exports.zHubiaRulePhaseSchema = zod_1.z.enum(["pre_llm", "post_llm"]);
95
+ exports.zHubiaRuleTriggerSchema = zod_1.z.enum(["inbound_message", "llm_completed"]);
96
+ exports.zHubiaRuleOutcomeSchema = zod_1.z.enum(["stop", "to_llm", "to_llm_with_context"]);
97
+ exports.zHubiaRuleAppliesToSchema = zod_1.z.enum(["real_message", "kickoff", "any"]);
98
+ exports.zHubiaConditionOpSchema = zod_1.z.enum([
99
+ "exists", "not_exists",
100
+ "is_empty", "is_not_empty",
101
+ "eq", "neq",
102
+ "in", "not_in",
103
+ "contains", "not_contains",
104
+ "matches",
105
+ "gt", "gte", "lt", "lte",
106
+ ]);
107
+ /** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
108
+ * `value` é ausente para `exists`/`not_exists`. */
109
+ exports.zHubiaConditionSchema = zod_1.z.object({
110
+ /** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"). */
111
+ fact: zod_1.z.string().min(1),
112
+ op: exports.zHubiaConditionOpSchema,
113
+ value: zod_1.z.unknown().optional(),
114
+ });
115
+ /** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo
116
+ * (Nível 3 fica para depois). Pelo menos uma das listas precisa ter ≥1 condição. */
117
+ exports.zHubiaConditionGroupSchema = zod_1.z.object({
118
+ all: zod_1.z.array(exports.zHubiaConditionSchema).optional(),
119
+ any: zod_1.z.array(exports.zHubiaConditionSchema).optional(),
120
+ }).refine((v) => (!!v.all && v.all.length > 0) || (!!v.any && v.any.length > 0), { message: "ConditionGroup precisa ter ao menos uma condição em `all` ou `any`." });
121
+ /** Refinamento opcional do escopo. Departamento é implícito (regra mora no
122
+ * binding do departamento). */
123
+ exports.zHubiaRuleScopeSchema = zod_1.z.object({
124
+ applies_to: exports.zHubiaRuleAppliesToSchema.optional(),
125
+ provider: zod_1.z.enum(["chatbee", "hub-waba"]).optional(),
126
+ }).partial();
127
+ /** Uma ação a executar via ToolRegistry. `input` aceita templating
128
+ * `{{fact.path}}` resolvido em runtime pelo facts provider. */
129
+ exports.zHubiaRuleActionSchema = zod_1.z.object({
130
+ /** Nome de uma tool `category: 'action'` do evo-hubia-tools
131
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
132
+ tool: zod_1.z.string().min(1),
133
+ input: zod_1.z.record(zod_1.z.unknown()).default({}),
134
+ });
135
+ /** Master switch do binding. `dry_run` força TODAS as regras do binding a
136
+ * modo seco (kill switch). Default runtime quando ausente: `live`. */
137
+ exports.zHubiaRulesModeSchema = zod_1.z.enum(["live", "dry_run"]);
138
+ /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
139
+ * `evo-hubia-rules`. Reusa ToolRegistry para executar actions, herdando
140
+ * as policies já existentes (mode, requiresLinkedLead, etc.). */
141
+ exports.zHubiaRuleSchema = zod_1.z.object({
142
+ /** Identificador estável (auditoria, idempotência). */
143
+ id: zod_1.z.string().min(1),
144
+ /** Nome legível ("Paciente existente → Clínica"). */
145
+ name: zod_1.z.string().min(1),
146
+ active: zod_1.z.boolean().default(true),
147
+ /** Menor avalia primeiro (first-match). */
148
+ priority: zod_1.z.number().int().default(100),
149
+ phase: exports.zHubiaRulePhaseSchema.default("pre_llm"),
150
+ when: exports.zHubiaRuleTriggerSchema.default("inbound_message"),
151
+ scope: exports.zHubiaRuleScopeSchema.optional(),
152
+ conditions: exports.zHubiaConditionGroupSchema,
153
+ actions: zod_1.z.array(exports.zHubiaRuleActionSchema).min(1),
154
+ outcome: exports.zHubiaRuleOutcomeSchema,
155
+ /** Shadow mode por regra (característica permanente, não só de rollout):
156
+ * avalia + grava trace, mas NÃO executa as actions. Permite canário de
157
+ * regras novas convivendo com regras live no mesmo binding.
158
+ * Efetivo: `binding.rules_mode === 'dry_run' || rule.dry_run === true`. */
159
+ dry_run: zod_1.z.boolean().default(false),
160
+ /** Aborta sequência de ações no primeiro erro. */
161
+ stop_actions_on_error: zod_1.z.boolean().default(true),
162
+ }).passthrough();
84
163
  // ───────── AI Binding (department → AI agent routing) ─────────
85
164
  const zHubiaCapabilitiesSchema = zod_1.z.object({
86
165
  can_schedule: zod_1.z.boolean().default(false),
@@ -112,4 +191,12 @@ exports.zAiBindingSchema = zod_schemas_1.zFireDocSchema.extend({
112
191
  /** Prompts específicos do fluxo do departamento (texto inline).
113
192
  * Empilhados após identity/safety/channel_custom do canal. */
114
193
  prompt_overrides: zHubiaPromptOverridesSchema.optional(),
194
+ // ───── evo-hubia-rules (deterministic rule layer) ─────
195
+ /** Camada de regras determinísticas avaliada antes do LLM (e, no futuro,
196
+ * também depois). Ausente/vazio = camada off, comportamento atual (só LLM). */
197
+ rules: zod_1.z.array(exports.zHubiaRuleSchema).optional(),
198
+ /** Master switch do binding para a camada de regras.
199
+ * `dry_run` força todas as regras deste binding a modo seco (sem executar
200
+ * actions; apenas avalia e grava trace). Default runtime quando ausente: `live`. */
201
+ rules_mode: exports.zHubiaRulesModeSchema.optional(),
115
202
  }).passthrough();
@@ -95,6 +95,104 @@ export type IHubiaConversationMessage = z.infer<typeof zHubiaConversationMessage
95
95
  export const zHubiaConversationModeSchema = z.enum(["ai_only", "hybrid_assist", "human_only", "blocked"]);
96
96
  export type IHubiaConversationMode = z.infer<typeof zHubiaConversationModeSchema>;
97
97
 
98
+ // ───────── evo-hubia-rules (deterministic rule layer) ─────────
99
+ //
100
+ // Camada de regras determinísticas avaliada pelo motor `evo-hubia-rules`
101
+ // (ver cloud-functions/docs/evo-hubia-rules/). Roda ANTES do LLM (fase
102
+ // `pre_llm`, único escopo de implementação atual). O campo `phase` já
103
+ // reserva espaço arquitetural para um hook `post_llm` futuro.
104
+ //
105
+ // As regras moram em `binding.rules[]` — o binding É o cruzamento canal⨯
106
+ // departamento, então o escopo de departamento é implícito.
107
+
108
+ /** Fase de avaliação. Tipos TS em src/types/evo-hub-ia/v1/. */
109
+ export const zHubiaRulePhaseSchema = z.enum(["pre_llm", "post_llm"]);
110
+
111
+ export const zHubiaRuleTriggerSchema = z.enum(["inbound_message", "llm_completed"]);
112
+
113
+ export const zHubiaRuleOutcomeSchema = z.enum(["stop", "to_llm", "to_llm_with_context"]);
114
+
115
+ export const zHubiaRuleAppliesToSchema = z.enum(["real_message", "kickoff", "any"]);
116
+
117
+ export const zHubiaConditionOpSchema = z.enum([
118
+ "exists", "not_exists",
119
+ "is_empty", "is_not_empty",
120
+ "eq", "neq",
121
+ "in", "not_in",
122
+ "contains", "not_contains",
123
+ "matches",
124
+ "gt", "gte", "lt", "lte",
125
+ ]);
126
+
127
+ /** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
128
+ * `value` é ausente para `exists`/`not_exists`. */
129
+ export const zHubiaConditionSchema = z.object({
130
+ /** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"). */
131
+ fact: z.string().min(1),
132
+ op: zHubiaConditionOpSchema,
133
+ value: z.unknown().optional(),
134
+ });
135
+
136
+ /** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo
137
+ * (Nível 3 fica para depois). Pelo menos uma das listas precisa ter ≥1 condição. */
138
+ export const zHubiaConditionGroupSchema = z.object({
139
+ all: z.array(zHubiaConditionSchema).optional(),
140
+ any: z.array(zHubiaConditionSchema).optional(),
141
+ }).refine(
142
+ (v) => (!!v.all && v.all.length > 0) || (!!v.any && v.any.length > 0),
143
+ { message: "ConditionGroup precisa ter ao menos uma condição em `all` ou `any`." },
144
+ );
145
+
146
+ /** Refinamento opcional do escopo. Departamento é implícito (regra mora no
147
+ * binding do departamento). */
148
+ export const zHubiaRuleScopeSchema = z.object({
149
+ applies_to: zHubiaRuleAppliesToSchema.optional(),
150
+ provider: z.enum(["chatbee", "hub-waba"]).optional(),
151
+ }).partial();
152
+
153
+ /** Uma ação a executar via ToolRegistry. `input` aceita templating
154
+ * `{{fact.path}}` resolvido em runtime pelo facts provider. */
155
+ export const zHubiaRuleActionSchema = z.object({
156
+ /** Nome de uma tool `category: 'action'` do evo-hubia-tools
157
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
158
+ tool: z.string().min(1),
159
+ input: z.record(z.unknown()).default({}),
160
+ });
161
+
162
+ /** Master switch do binding. `dry_run` força TODAS as regras do binding a
163
+ * modo seco (kill switch). Default runtime quando ausente: `live`. */
164
+ export const zHubiaRulesModeSchema = z.enum(["live", "dry_run"]);
165
+
166
+ /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
167
+ * `evo-hubia-rules`. Reusa ToolRegistry para executar actions, herdando
168
+ * as policies já existentes (mode, requiresLinkedLead, etc.). */
169
+ export const zHubiaRuleSchema = z.object({
170
+ /** Identificador estável (auditoria, idempotência). */
171
+ id: z.string().min(1),
172
+ /** Nome legível ("Paciente existente → Clínica"). */
173
+ name: z.string().min(1),
174
+ active: z.boolean().default(true),
175
+ /** Menor avalia primeiro (first-match). */
176
+ priority: z.number().int().default(100),
177
+
178
+ phase: zHubiaRulePhaseSchema.default("pre_llm"),
179
+ when: zHubiaRuleTriggerSchema.default("inbound_message"),
180
+
181
+ scope: zHubiaRuleScopeSchema.optional(),
182
+ conditions: zHubiaConditionGroupSchema,
183
+ actions: z.array(zHubiaRuleActionSchema).min(1),
184
+ outcome: zHubiaRuleOutcomeSchema,
185
+
186
+ /** Shadow mode por regra (característica permanente, não só de rollout):
187
+ * avalia + grava trace, mas NÃO executa as actions. Permite canário de
188
+ * regras novas convivendo com regras live no mesmo binding.
189
+ * Efetivo: `binding.rules_mode === 'dry_run' || rule.dry_run === true`. */
190
+ dry_run: z.boolean().default(false),
191
+
192
+ /** Aborta sequência de ações no primeiro erro. */
193
+ stop_actions_on_error: z.boolean().default(true),
194
+ }).passthrough();
195
+
98
196
  // ───────── AI Binding (department → AI agent routing) ─────────
99
197
 
100
198
  const zHubiaCapabilitiesSchema = z.object({
@@ -129,6 +227,15 @@ export const zAiBindingSchema = zFireDocSchema.extend({
129
227
  /** Prompts específicos do fluxo do departamento (texto inline).
130
228
  * Empilhados após identity/safety/channel_custom do canal. */
131
229
  prompt_overrides: zHubiaPromptOverridesSchema.optional(),
230
+
231
+ // ───── evo-hubia-rules (deterministic rule layer) ─────
232
+ /** Camada de regras determinísticas avaliada antes do LLM (e, no futuro,
233
+ * também depois). Ausente/vazio = camada off, comportamento atual (só LLM). */
234
+ rules: z.array(zHubiaRuleSchema).optional(),
235
+ /** Master switch do binding para a camada de regras.
236
+ * `dry_run` força todas as regras deste binding a modo seco (sem executar
237
+ * actions; apenas avalia e grava trace). Default runtime quando ausente: `live`. */
238
+ rules_mode: zHubiaRulesModeSchema.optional(),
132
239
  }).passthrough();
133
240
 
134
241
  export type IAiBinding = z.infer<typeof zAiBindingSchema>;
@@ -1,4 +1,5 @@
1
1
  export * from "./channel";
2
+ export * from "./v1";
2
3
  export declare const EvoHubiaPermissions: {
3
4
  readonly Read: "evo_hubia_read";
4
5
  };
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.EvoHubiaMcpPermissions = exports.EvoHubiaPermissions = void 0;
18
18
  __exportStar(require("./channel"), exports);
19
+ __exportStar(require("./v1"), exports);
19
20
  // Permissões para o evo-hubia
20
21
  exports.EvoHubiaPermissions = {
21
22
  Read: "evo_hubia_read",
@@ -1,4 +1,5 @@
1
1
  export * from "./channel";
2
+ export * from "./v1";
2
3
 
3
4
  // Permissões para o evo-hubia
4
5
  export const EvoHubiaPermissions = {
@@ -0,0 +1,81 @@
1
+ /** Fase de avaliação. `pre_llm` roda antes do orchestrator;
2
+ * `post_llm` está reservado (não implementado nesta entrega). */
3
+ export type IHubiaRulePhase = "pre_llm" | "post_llm";
4
+ /** Gatilho que dispara a avaliação. */
5
+ export type IHubiaRuleTrigger = "inbound_message" | "llm_completed";
6
+ /** Desfecho do turno após a regra disparar:
7
+ * - `stop` — finaliza turno sem chamar o LLM.
8
+ * - `to_llm` — segue para o orchestrator normalmente.
9
+ * - `to_llm_with_context` — segue para o orchestrator com trace das ações
10
+ * injetado como bloco de sistema.
11
+ * Quando o LLM está desligado no binding (default_mode `human_only`/`blocked`),
12
+ * `to_llm`/`to_llm_with_context` degradam para "cai pro humano". */
13
+ export type IHubiaRuleOutcome = "stop" | "to_llm" | "to_llm_with_context";
14
+ /** Tipo de batch ao qual a regra se aplica. `real_message` (default) ignora
15
+ * a mensagem de kickoff do sistema — proteção contra loop de transferência. */
16
+ export type IHubiaRuleAppliesTo = "real_message" | "kickoff" | "any";
17
+ /** Operadores suportados pelas condições. */
18
+ export type IHubiaConditionOp = "exists" | "not_exists" | "is_empty" | "is_not_empty" | "eq" | "neq" | "in" | "not_in" | "contains" | "not_contains" | "matches" | "gt" | "gte" | "lt" | "lte";
19
+ /** Master switch do binding. `dry_run` força TODAS as regras do binding a
20
+ * modo seco (kill switch). Default runtime quando ausente: `live`. */
21
+ export type IHubiaRulesMode = "live" | "dry_run";
22
+ /** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
23
+ * `value` é ausente para `exists`/`not_exists`. */
24
+ export interface IHubiaCondition {
25
+ /** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"). */
26
+ fact: string;
27
+ op: IHubiaConditionOp;
28
+ value?: unknown;
29
+ }
30
+ /** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo.
31
+ * Pelo menos uma das listas precisa ter ≥1 condição (validado em runtime
32
+ * pelo refine do schema zod). */
33
+ export interface IHubiaConditionGroup {
34
+ all?: IHubiaCondition[];
35
+ any?: IHubiaCondition[];
36
+ }
37
+ /** Refinamento opcional do escopo. Departamento é implícito (regra mora no
38
+ * binding do departamento). */
39
+ export interface IHubiaRuleScope {
40
+ applies_to?: IHubiaRuleAppliesTo;
41
+ provider?: "chatbee" | "hub-waba";
42
+ }
43
+ /** Uma ação a executar via ToolRegistry. `input` aceita templating
44
+ * `{{fact.path}}` resolvido em runtime pelo facts provider. */
45
+ export interface IHubiaRuleAction {
46
+ /** Nome de uma tool `category: 'action'` do evo-hubia-tools
47
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
48
+ tool: string;
49
+ input?: Record<string, unknown>;
50
+ }
51
+ /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
52
+ * `evo-hubia-rules`. Reusa ToolRegistry para executar actions, herdando
53
+ * as policies já existentes (mode, requiresLinkedLead, etc.). */
54
+ export interface IHubiaRule {
55
+ /** Identificador estável (auditoria, idempotência). */
56
+ id: string;
57
+ /** Nome legível ("Paciente existente → Clínica"). */
58
+ name: string;
59
+ /** Default: true. */
60
+ active?: boolean;
61
+ /** Menor avalia primeiro (first-match). Default: 100. */
62
+ priority?: number;
63
+ /** Default: "pre_llm". */
64
+ phase?: IHubiaRulePhase;
65
+ /** Default: "inbound_message" (compatível com `phase: pre_llm`). */
66
+ when?: IHubiaRuleTrigger;
67
+ scope?: IHubiaRuleScope;
68
+ conditions: IHubiaConditionGroup;
69
+ actions: IHubiaRuleAction[];
70
+ outcome: IHubiaRuleOutcome;
71
+ /** Shadow mode por regra (característica permanente, não só de rollout):
72
+ * avalia + grava trace, mas NÃO executa as actions. Permite canário de
73
+ * regras novas convivendo com regras live no mesmo binding.
74
+ * Efetivo: `binding.rules_mode === 'dry_run' || rule.dry_run === true`.
75
+ * Default: false. */
76
+ dry_run?: boolean;
77
+ /** Aborta sequência de ações no primeiro erro. Default: true. */
78
+ stop_actions_on_error?: boolean;
79
+ /** Passthrough no schema zod — campos custom são preservados. */
80
+ [key: string]: unknown;
81
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ // Tipos da camada evo-hubia-rules (motor determinístico pré-LLM).
3
+ // Schemas zod correspondentes ficam em src/apps/evo-hub-ia/v1/zod-schemas.ts;
4
+ // estes tipos são escritos à mão e mantidos em paralelo (convenção do projeto:
5
+ // `apps/` = zod, `types/` = interfaces TS).
6
+ //
7
+ // Ver docs em cloud-functions/docs/evo-hubia-rules/.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,124 @@
1
+ // Tipos da camada evo-hubia-rules (motor determinístico pré-LLM).
2
+ // Schemas zod correspondentes ficam em src/apps/evo-hub-ia/v1/zod-schemas.ts;
3
+ // estes tipos são escritos à mão e mantidos em paralelo (convenção do projeto:
4
+ // `apps/` = zod, `types/` = interfaces TS).
5
+ //
6
+ // Ver docs em cloud-functions/docs/evo-hubia-rules/.
7
+
8
+ // ── Enums / Literals ──
9
+
10
+ /** Fase de avaliação. `pre_llm` roda antes do orchestrator;
11
+ * `post_llm` está reservado (não implementado nesta entrega). */
12
+ export type IHubiaRulePhase = "pre_llm" | "post_llm";
13
+
14
+ /** Gatilho que dispara a avaliação. */
15
+ export type IHubiaRuleTrigger = "inbound_message" | "llm_completed";
16
+
17
+ /** Desfecho do turno após a regra disparar:
18
+ * - `stop` — finaliza turno sem chamar o LLM.
19
+ * - `to_llm` — segue para o orchestrator normalmente.
20
+ * - `to_llm_with_context` — segue para o orchestrator com trace das ações
21
+ * injetado como bloco de sistema.
22
+ * Quando o LLM está desligado no binding (default_mode `human_only`/`blocked`),
23
+ * `to_llm`/`to_llm_with_context` degradam para "cai pro humano". */
24
+ export type IHubiaRuleOutcome = "stop" | "to_llm" | "to_llm_with_context";
25
+
26
+ /** Tipo de batch ao qual a regra se aplica. `real_message` (default) ignora
27
+ * a mensagem de kickoff do sistema — proteção contra loop de transferência. */
28
+ export type IHubiaRuleAppliesTo = "real_message" | "kickoff" | "any";
29
+
30
+ /** Operadores suportados pelas condições. */
31
+ export type IHubiaConditionOp =
32
+ | "exists"
33
+ | "not_exists"
34
+ | "is_empty"
35
+ | "is_not_empty"
36
+ | "eq"
37
+ | "neq"
38
+ | "in"
39
+ | "not_in"
40
+ | "contains"
41
+ | "not_contains"
42
+ | "matches"
43
+ | "gt"
44
+ | "gte"
45
+ | "lt"
46
+ | "lte";
47
+
48
+ /** Master switch do binding. `dry_run` força TODAS as regras do binding a
49
+ * modo seco (kill switch). Default runtime quando ausente: `live`. */
50
+ export type IHubiaRulesMode = "live" | "dry_run";
51
+
52
+ // ── Sub-interfaces ──
53
+
54
+ /** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
55
+ * `value` é ausente para `exists`/`not_exists`. */
56
+ export interface IHubiaCondition {
57
+ /** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"). */
58
+ fact: string;
59
+ op: IHubiaConditionOp;
60
+ value?: unknown;
61
+ }
62
+
63
+ /** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo.
64
+ * Pelo menos uma das listas precisa ter ≥1 condição (validado em runtime
65
+ * pelo refine do schema zod). */
66
+ export interface IHubiaConditionGroup {
67
+ all?: IHubiaCondition[];
68
+ any?: IHubiaCondition[];
69
+ }
70
+
71
+ /** Refinamento opcional do escopo. Departamento é implícito (regra mora no
72
+ * binding do departamento). */
73
+ export interface IHubiaRuleScope {
74
+ applies_to?: IHubiaRuleAppliesTo;
75
+ provider?: "chatbee" | "hub-waba";
76
+ }
77
+
78
+ /** Uma ação a executar via ToolRegistry. `input` aceita templating
79
+ * `{{fact.path}}` resolvido em runtime pelo facts provider. */
80
+ export interface IHubiaRuleAction {
81
+ /** Nome de uma tool `category: 'action'` do evo-hubia-tools
82
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
83
+ tool: string;
84
+ input?: Record<string, unknown>;
85
+ }
86
+
87
+ // ── Main ──
88
+
89
+ /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
90
+ * `evo-hubia-rules`. Reusa ToolRegistry para executar actions, herdando
91
+ * as policies já existentes (mode, requiresLinkedLead, etc.). */
92
+ export interface IHubiaRule {
93
+ /** Identificador estável (auditoria, idempotência). */
94
+ id: string;
95
+ /** Nome legível ("Paciente existente → Clínica"). */
96
+ name: string;
97
+ /** Default: true. */
98
+ active?: boolean;
99
+ /** Menor avalia primeiro (first-match). Default: 100. */
100
+ priority?: number;
101
+
102
+ /** Default: "pre_llm". */
103
+ phase?: IHubiaRulePhase;
104
+ /** Default: "inbound_message" (compatível com `phase: pre_llm`). */
105
+ when?: IHubiaRuleTrigger;
106
+
107
+ scope?: IHubiaRuleScope;
108
+ conditions: IHubiaConditionGroup;
109
+ actions: IHubiaRuleAction[];
110
+ outcome: IHubiaRuleOutcome;
111
+
112
+ /** Shadow mode por regra (característica permanente, não só de rollout):
113
+ * avalia + grava trace, mas NÃO executa as actions. Permite canário de
114
+ * regras novas convivendo com regras live no mesmo binding.
115
+ * Efetivo: `binding.rules_mode === 'dry_run' || rule.dry_run === true`.
116
+ * Default: false. */
117
+ dry_run?: boolean;
118
+
119
+ /** Aborta sequência de ações no primeiro erro. Default: true. */
120
+ stop_actions_on_error?: boolean;
121
+
122
+ /** Passthrough no schema zod — campos custom são preservados. */
123
+ [key: string]: unknown;
124
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.367",
3
+ "version": "1.3.369",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",