evo360-types 1.3.367 → 1.3.368

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,84 @@ 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
+ "eq", "neq",
101
+ "in", "not_in",
102
+ "contains", "not_contains",
103
+ "matches",
104
+ "gt", "gte", "lt", "lte",
105
+ ]);
106
+ /** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
107
+ * `value` é ausente para `exists`/`not_exists`. */
108
+ exports.zHubiaConditionSchema = zod_1.z.object({
109
+ /** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"). */
110
+ fact: zod_1.z.string().min(1),
111
+ op: exports.zHubiaConditionOpSchema,
112
+ value: zod_1.z.unknown().optional(),
113
+ });
114
+ /** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo
115
+ * (Nível 3 fica para depois). Pelo menos uma das listas precisa ter ≥1 condição. */
116
+ exports.zHubiaConditionGroupSchema = zod_1.z.object({
117
+ all: zod_1.z.array(exports.zHubiaConditionSchema).optional(),
118
+ any: zod_1.z.array(exports.zHubiaConditionSchema).optional(),
119
+ }).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`." });
120
+ /** Refinamento opcional do escopo. Departamento é implícito (regra mora no
121
+ * binding do departamento). */
122
+ exports.zHubiaRuleScopeSchema = zod_1.z.object({
123
+ applies_to: exports.zHubiaRuleAppliesToSchema.optional(),
124
+ provider: zod_1.z.enum(["chatbee", "hub-waba"]).optional(),
125
+ }).partial();
126
+ /** Uma ação a executar via ToolRegistry. `input` aceita templating
127
+ * `{{fact.path}}` resolvido em runtime pelo facts provider. */
128
+ exports.zHubiaRuleActionSchema = zod_1.z.object({
129
+ /** Nome de uma tool `category: 'action'` do evo-hubia-tools
130
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
131
+ tool: zod_1.z.string().min(1),
132
+ input: zod_1.z.record(zod_1.z.unknown()).default({}),
133
+ });
134
+ /** Master switch do binding. `dry_run` força TODAS as regras do binding a
135
+ * modo seco (kill switch). Default runtime quando ausente: `live`. */
136
+ exports.zHubiaRulesModeSchema = zod_1.z.enum(["live", "dry_run"]);
137
+ /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
138
+ * `evo-hubia-rules`. Reusa ToolRegistry para executar actions, herdando
139
+ * as policies já existentes (mode, requiresLinkedLead, etc.). */
140
+ exports.zHubiaRuleSchema = zod_1.z.object({
141
+ /** Identificador estável (auditoria, idempotência). */
142
+ id: zod_1.z.string().min(1),
143
+ /** Nome legível ("Paciente existente → Clínica"). */
144
+ name: zod_1.z.string().min(1),
145
+ active: zod_1.z.boolean().default(true),
146
+ /** Menor avalia primeiro (first-match). */
147
+ priority: zod_1.z.number().int().default(100),
148
+ phase: exports.zHubiaRulePhaseSchema.default("pre_llm"),
149
+ when: exports.zHubiaRuleTriggerSchema.default("inbound_message"),
150
+ scope: exports.zHubiaRuleScopeSchema.optional(),
151
+ conditions: exports.zHubiaConditionGroupSchema,
152
+ actions: zod_1.z.array(exports.zHubiaRuleActionSchema).min(1),
153
+ outcome: exports.zHubiaRuleOutcomeSchema,
154
+ /** Shadow mode por regra (característica permanente, não só de rollout):
155
+ * avalia + grava trace, mas NÃO executa as actions. Permite canário de
156
+ * regras novas convivendo com regras live no mesmo binding.
157
+ * Efetivo: `binding.rules_mode === 'dry_run' || rule.dry_run === true`. */
158
+ dry_run: zod_1.z.boolean().default(false),
159
+ /** Aborta sequência de ações no primeiro erro. */
160
+ stop_actions_on_error: zod_1.z.boolean().default(true),
161
+ }).passthrough();
84
162
  // ───────── AI Binding (department → AI agent routing) ─────────
85
163
  const zHubiaCapabilitiesSchema = zod_1.z.object({
86
164
  can_schedule: zod_1.z.boolean().default(false),
@@ -112,4 +190,12 @@ exports.zAiBindingSchema = zod_schemas_1.zFireDocSchema.extend({
112
190
  /** Prompts específicos do fluxo do departamento (texto inline).
113
191
  * Empilhados após identity/safety/channel_custom do canal. */
114
192
  prompt_overrides: zHubiaPromptOverridesSchema.optional(),
193
+ // ───── evo-hubia-rules (deterministic rule layer) ─────
194
+ /** Camada de regras determinísticas avaliada antes do LLM (e, no futuro,
195
+ * também depois). Ausente/vazio = camada off, comportamento atual (só LLM). */
196
+ rules: zod_1.z.array(exports.zHubiaRuleSchema).optional(),
197
+ /** Master switch do binding para a camada de regras.
198
+ * `dry_run` força todas as regras deste binding a modo seco (sem executar
199
+ * actions; apenas avalia e grava trace). Default runtime quando ausente: `live`. */
200
+ rules_mode: exports.zHubiaRulesModeSchema.optional(),
115
201
  }).passthrough();
@@ -95,6 +95,103 @@ 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
+ "eq", "neq",
120
+ "in", "not_in",
121
+ "contains", "not_contains",
122
+ "matches",
123
+ "gt", "gte", "lt", "lte",
124
+ ]);
125
+
126
+ /** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
127
+ * `value` é ausente para `exists`/`not_exists`. */
128
+ export const zHubiaConditionSchema = z.object({
129
+ /** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"). */
130
+ fact: z.string().min(1),
131
+ op: zHubiaConditionOpSchema,
132
+ value: z.unknown().optional(),
133
+ });
134
+
135
+ /** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo
136
+ * (Nível 3 fica para depois). Pelo menos uma das listas precisa ter ≥1 condição. */
137
+ export const zHubiaConditionGroupSchema = z.object({
138
+ all: z.array(zHubiaConditionSchema).optional(),
139
+ any: z.array(zHubiaConditionSchema).optional(),
140
+ }).refine(
141
+ (v) => (!!v.all && v.all.length > 0) || (!!v.any && v.any.length > 0),
142
+ { message: "ConditionGroup precisa ter ao menos uma condição em `all` ou `any`." },
143
+ );
144
+
145
+ /** Refinamento opcional do escopo. Departamento é implícito (regra mora no
146
+ * binding do departamento). */
147
+ export const zHubiaRuleScopeSchema = z.object({
148
+ applies_to: zHubiaRuleAppliesToSchema.optional(),
149
+ provider: z.enum(["chatbee", "hub-waba"]).optional(),
150
+ }).partial();
151
+
152
+ /** Uma ação a executar via ToolRegistry. `input` aceita templating
153
+ * `{{fact.path}}` resolvido em runtime pelo facts provider. */
154
+ export const zHubiaRuleActionSchema = z.object({
155
+ /** Nome de uma tool `category: 'action'` do evo-hubia-tools
156
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
157
+ tool: z.string().min(1),
158
+ input: z.record(z.unknown()).default({}),
159
+ });
160
+
161
+ /** Master switch do binding. `dry_run` força TODAS as regras do binding a
162
+ * modo seco (kill switch). Default runtime quando ausente: `live`. */
163
+ export const zHubiaRulesModeSchema = z.enum(["live", "dry_run"]);
164
+
165
+ /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
166
+ * `evo-hubia-rules`. Reusa ToolRegistry para executar actions, herdando
167
+ * as policies já existentes (mode, requiresLinkedLead, etc.). */
168
+ export const zHubiaRuleSchema = z.object({
169
+ /** Identificador estável (auditoria, idempotência). */
170
+ id: z.string().min(1),
171
+ /** Nome legível ("Paciente existente → Clínica"). */
172
+ name: z.string().min(1),
173
+ active: z.boolean().default(true),
174
+ /** Menor avalia primeiro (first-match). */
175
+ priority: z.number().int().default(100),
176
+
177
+ phase: zHubiaRulePhaseSchema.default("pre_llm"),
178
+ when: zHubiaRuleTriggerSchema.default("inbound_message"),
179
+
180
+ scope: zHubiaRuleScopeSchema.optional(),
181
+ conditions: zHubiaConditionGroupSchema,
182
+ actions: z.array(zHubiaRuleActionSchema).min(1),
183
+ outcome: zHubiaRuleOutcomeSchema,
184
+
185
+ /** Shadow mode por regra (característica permanente, não só de rollout):
186
+ * avalia + grava trace, mas NÃO executa as actions. Permite canário de
187
+ * regras novas convivendo com regras live no mesmo binding.
188
+ * Efetivo: `binding.rules_mode === 'dry_run' || rule.dry_run === true`. */
189
+ dry_run: z.boolean().default(false),
190
+
191
+ /** Aborta sequência de ações no primeiro erro. */
192
+ stop_actions_on_error: z.boolean().default(true),
193
+ }).passthrough();
194
+
98
195
  // ───────── AI Binding (department → AI agent routing) ─────────
99
196
 
100
197
  const zHubiaCapabilitiesSchema = z.object({
@@ -129,6 +226,15 @@ export const zAiBindingSchema = zFireDocSchema.extend({
129
226
  /** Prompts específicos do fluxo do departamento (texto inline).
130
227
  * Empilhados após identity/safety/channel_custom do canal. */
131
228
  prompt_overrides: zHubiaPromptOverridesSchema.optional(),
229
+
230
+ // ───── evo-hubia-rules (deterministic rule layer) ─────
231
+ /** Camada de regras determinísticas avaliada antes do LLM (e, no futuro,
232
+ * também depois). Ausente/vazio = camada off, comportamento atual (só LLM). */
233
+ rules: z.array(zHubiaRuleSchema).optional(),
234
+ /** Master switch do binding para a camada de regras.
235
+ * `dry_run` força todas as regras deste binding a modo seco (sem executar
236
+ * actions; apenas avalia e grava trace). Default runtime quando ausente: `live`. */
237
+ rules_mode: zHubiaRulesModeSchema.optional(),
132
238
  }).passthrough();
133
239
 
134
240
  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" | "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,122 @@
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
+ | "eq"
35
+ | "neq"
36
+ | "in"
37
+ | "not_in"
38
+ | "contains"
39
+ | "not_contains"
40
+ | "matches"
41
+ | "gt"
42
+ | "gte"
43
+ | "lt"
44
+ | "lte";
45
+
46
+ /** Master switch do binding. `dry_run` força TODAS as regras do binding a
47
+ * modo seco (kill switch). Default runtime quando ausente: `live`. */
48
+ export type IHubiaRulesMode = "live" | "dry_run";
49
+
50
+ // ── Sub-interfaces ──
51
+
52
+ /** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
53
+ * `value` é ausente para `exists`/`not_exists`. */
54
+ export interface IHubiaCondition {
55
+ /** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"). */
56
+ fact: string;
57
+ op: IHubiaConditionOp;
58
+ value?: unknown;
59
+ }
60
+
61
+ /** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo.
62
+ * Pelo menos uma das listas precisa ter ≥1 condição (validado em runtime
63
+ * pelo refine do schema zod). */
64
+ export interface IHubiaConditionGroup {
65
+ all?: IHubiaCondition[];
66
+ any?: IHubiaCondition[];
67
+ }
68
+
69
+ /** Refinamento opcional do escopo. Departamento é implícito (regra mora no
70
+ * binding do departamento). */
71
+ export interface IHubiaRuleScope {
72
+ applies_to?: IHubiaRuleAppliesTo;
73
+ provider?: "chatbee" | "hub-waba";
74
+ }
75
+
76
+ /** Uma ação a executar via ToolRegistry. `input` aceita templating
77
+ * `{{fact.path}}` resolvido em runtime pelo facts provider. */
78
+ export interface IHubiaRuleAction {
79
+ /** Nome de uma tool `category: 'action'` do evo-hubia-tools
80
+ * (transfer_to_department, close_attendance, handoff_to_human, update_lead_tags, …). */
81
+ tool: string;
82
+ input?: Record<string, unknown>;
83
+ }
84
+
85
+ // ── Main ──
86
+
87
+ /** Uma regra completa. Mora em `binding.rules[]`. Avaliada pelo motor
88
+ * `evo-hubia-rules`. Reusa ToolRegistry para executar actions, herdando
89
+ * as policies já existentes (mode, requiresLinkedLead, etc.). */
90
+ export interface IHubiaRule {
91
+ /** Identificador estável (auditoria, idempotência). */
92
+ id: string;
93
+ /** Nome legível ("Paciente existente → Clínica"). */
94
+ name: string;
95
+ /** Default: true. */
96
+ active?: boolean;
97
+ /** Menor avalia primeiro (first-match). Default: 100. */
98
+ priority?: number;
99
+
100
+ /** Default: "pre_llm". */
101
+ phase?: IHubiaRulePhase;
102
+ /** Default: "inbound_message" (compatível com `phase: pre_llm`). */
103
+ when?: IHubiaRuleTrigger;
104
+
105
+ scope?: IHubiaRuleScope;
106
+ conditions: IHubiaConditionGroup;
107
+ actions: IHubiaRuleAction[];
108
+ outcome: IHubiaRuleOutcome;
109
+
110
+ /** Shadow mode por regra (característica permanente, não só de rollout):
111
+ * avalia + grava trace, mas NÃO executa as actions. Permite canário de
112
+ * regras novas convivendo com regras live no mesmo binding.
113
+ * Efetivo: `binding.rules_mode === 'dry_run' || rule.dry_run === true`.
114
+ * Default: false. */
115
+ dry_run?: boolean;
116
+
117
+ /** Aborta sequência de ações no primeiro erro. Default: true. */
118
+ stop_actions_on_error?: boolean;
119
+
120
+ /** Passthrough no schema zod — campos custom são preservados. */
121
+ [key: string]: unknown;
122
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.367",
3
+ "version": "1.3.368",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",