evo360-types 1.3.368 → 1.3.371
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.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;
|
|
3
|
+
exports.zAiBindingSchema = exports.zHubiaRuleSchema = exports.zHubiaRulesModeSchema = exports.zHubiaRuleActionSchema = exports.zHubiaRuleScopeSchema = exports.zHubiaConditionGroupSchema = exports.zHubiaConditionSchema = exports.zHubiaScheduleSchema = exports.zHubiaScheduleWindowSchema = 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) ─────────
|
|
@@ -97,19 +97,68 @@ exports.zHubiaRuleOutcomeSchema = zod_1.z.enum(["stop", "to_llm", "to_llm_with_c
|
|
|
97
97
|
exports.zHubiaRuleAppliesToSchema = zod_1.z.enum(["real_message", "kickoff", "any"]);
|
|
98
98
|
exports.zHubiaConditionOpSchema = zod_1.z.enum([
|
|
99
99
|
"exists", "not_exists",
|
|
100
|
+
"is_empty", "is_not_empty",
|
|
100
101
|
"eq", "neq",
|
|
101
102
|
"in", "not_in",
|
|
102
103
|
"contains", "not_contains",
|
|
103
104
|
"matches",
|
|
104
105
|
"gt", "gte", "lt", "lte",
|
|
106
|
+
"in_schedule", "not_in_schedule",
|
|
105
107
|
]);
|
|
108
|
+
// ───────── Schedule (janela de horário por dia da semana) ─────────
|
|
109
|
+
//
|
|
110
|
+
// Usado como `value` das condições com operadores `in_schedule` /
|
|
111
|
+
// `not_in_schedule`. Modelagem POSITIVA: o usuário define a agenda natural
|
|
112
|
+
// (ex: horário comercial Seg-Sex 8h-18h) e escolhe o operador in/not_in
|
|
113
|
+
// conforme quiser disparar dentro ou fora dessa janela.
|
|
114
|
+
//
|
|
115
|
+
// Semântica de boundary: `start <= time_hhmm < end` (start incluso, end
|
|
116
|
+
// excluso — permite janelas adjacentes do mesmo dia sem overlap).
|
|
117
|
+
//
|
|
118
|
+
// Overnight: split por meia-noite — `[{day:1,start:'22:00',end:'23:59'},
|
|
119
|
+
// {day:2,start:'00:00',end:'06:00'}]`. NÃO suportamos `end < start` numa
|
|
120
|
+
// mesma window (regra explícita: 1 window = mesmo dia).
|
|
121
|
+
/** Uma janela individual: dia da semana (0=dom..6=sáb) + intervalo HH:MM. */
|
|
122
|
+
exports.zHubiaScheduleWindowSchema = zod_1.z.object({
|
|
123
|
+
day: zod_1.z.number().int().min(0).max(6),
|
|
124
|
+
start: zod_1.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, "formato HH:MM (00-23 : 00-59)"),
|
|
125
|
+
end: zod_1.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, "formato HH:MM (00-23 : 00-59)"),
|
|
126
|
+
}).refine((w) => w.start < w.end, {
|
|
127
|
+
message: "start deve ser estritamente menor que end (split por meia-noite para overnight)",
|
|
128
|
+
path: ["end"],
|
|
129
|
+
});
|
|
130
|
+
/** Agenda semanal — lista de janelas + timezone opcional.
|
|
131
|
+
* Quando `timezone` ausente, runtime usa a do tenant (`/tenants/{tenant}.timezone`,
|
|
132
|
+
* fallback `'America/Sao_Paulo'`). */
|
|
133
|
+
exports.zHubiaScheduleSchema = zod_1.z.object({
|
|
134
|
+
windows: zod_1.z.array(exports.zHubiaScheduleWindowSchema).min(1),
|
|
135
|
+
timezone: zod_1.z.string().optional(),
|
|
136
|
+
});
|
|
106
137
|
/** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
|
|
107
|
-
*
|
|
138
|
+
*
|
|
139
|
+
* Política do `value`:
|
|
140
|
+
* - Ausente para `exists`/`not_exists`/`is_empty`/`is_not_empty`.
|
|
141
|
+
* - Primitive (string/number/boolean) ou array para os operadores clássicos
|
|
142
|
+
* (`eq`, `in`, `contains`, etc.) — formato livre, casado dinamicamente.
|
|
143
|
+
* - Objeto `IHubiaSchedule` para `in_schedule`/`not_in_schedule` (validado
|
|
144
|
+
* pelo `superRefine` abaixo). */
|
|
108
145
|
exports.zHubiaConditionSchema = zod_1.z.object({
|
|
109
|
-
/** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"
|
|
146
|
+
/** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead",
|
|
147
|
+
* "now.iso" — este último para operadores de schedule). */
|
|
110
148
|
fact: zod_1.z.string().min(1),
|
|
111
149
|
op: exports.zHubiaConditionOpSchema,
|
|
112
150
|
value: zod_1.z.unknown().optional(),
|
|
151
|
+
}).superRefine((c, ctx) => {
|
|
152
|
+
if (c.op === "in_schedule" || c.op === "not_in_schedule") {
|
|
153
|
+
const parsed = exports.zHubiaScheduleSchema.safeParse(c.value);
|
|
154
|
+
if (!parsed.success) {
|
|
155
|
+
ctx.addIssue({
|
|
156
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
157
|
+
path: ["value"],
|
|
158
|
+
message: `value de '${c.op}' precisa ser um IHubiaSchedule válido (${parsed.error.issues.map((i) => i.message).join("; ")})`,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
113
162
|
});
|
|
114
163
|
/** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo
|
|
115
164
|
* (Nível 3 fica para depois). Pelo menos uma das listas precisa ter ≥1 condição. */
|
|
@@ -116,20 +116,72 @@ export const zHubiaRuleAppliesToSchema = z.enum(["real_message", "kickoff", "any
|
|
|
116
116
|
|
|
117
117
|
export const zHubiaConditionOpSchema = z.enum([
|
|
118
118
|
"exists", "not_exists",
|
|
119
|
+
"is_empty", "is_not_empty",
|
|
119
120
|
"eq", "neq",
|
|
120
121
|
"in", "not_in",
|
|
121
122
|
"contains", "not_contains",
|
|
122
123
|
"matches",
|
|
123
124
|
"gt", "gte", "lt", "lte",
|
|
125
|
+
"in_schedule", "not_in_schedule",
|
|
124
126
|
]);
|
|
125
127
|
|
|
128
|
+
// ───────── Schedule (janela de horário por dia da semana) ─────────
|
|
129
|
+
//
|
|
130
|
+
// Usado como `value` das condições com operadores `in_schedule` /
|
|
131
|
+
// `not_in_schedule`. Modelagem POSITIVA: o usuário define a agenda natural
|
|
132
|
+
// (ex: horário comercial Seg-Sex 8h-18h) e escolhe o operador in/not_in
|
|
133
|
+
// conforme quiser disparar dentro ou fora dessa janela.
|
|
134
|
+
//
|
|
135
|
+
// Semântica de boundary: `start <= time_hhmm < end` (start incluso, end
|
|
136
|
+
// excluso — permite janelas adjacentes do mesmo dia sem overlap).
|
|
137
|
+
//
|
|
138
|
+
// Overnight: split por meia-noite — `[{day:1,start:'22:00',end:'23:59'},
|
|
139
|
+
// {day:2,start:'00:00',end:'06:00'}]`. NÃO suportamos `end < start` numa
|
|
140
|
+
// mesma window (regra explícita: 1 window = mesmo dia).
|
|
141
|
+
|
|
142
|
+
/** Uma janela individual: dia da semana (0=dom..6=sáb) + intervalo HH:MM. */
|
|
143
|
+
export const zHubiaScheduleWindowSchema = z.object({
|
|
144
|
+
day: z.number().int().min(0).max(6),
|
|
145
|
+
start: z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, "formato HH:MM (00-23 : 00-59)"),
|
|
146
|
+
end: z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, "formato HH:MM (00-23 : 00-59)"),
|
|
147
|
+
}).refine((w) => w.start < w.end, {
|
|
148
|
+
message: "start deve ser estritamente menor que end (split por meia-noite para overnight)",
|
|
149
|
+
path: ["end"],
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
/** Agenda semanal — lista de janelas + timezone opcional.
|
|
153
|
+
* Quando `timezone` ausente, runtime usa a do tenant (`/tenants/{tenant}.timezone`,
|
|
154
|
+
* fallback `'America/Sao_Paulo'`). */
|
|
155
|
+
export const zHubiaScheduleSchema = z.object({
|
|
156
|
+
windows: z.array(zHubiaScheduleWindowSchema).min(1),
|
|
157
|
+
timezone: z.string().optional(),
|
|
158
|
+
});
|
|
159
|
+
|
|
126
160
|
/** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
|
|
127
|
-
*
|
|
161
|
+
*
|
|
162
|
+
* Política do `value`:
|
|
163
|
+
* - Ausente para `exists`/`not_exists`/`is_empty`/`is_not_empty`.
|
|
164
|
+
* - Primitive (string/number/boolean) ou array para os operadores clássicos
|
|
165
|
+
* (`eq`, `in`, `contains`, etc.) — formato livre, casado dinamicamente.
|
|
166
|
+
* - Objeto `IHubiaSchedule` para `in_schedule`/`not_in_schedule` (validado
|
|
167
|
+
* pelo `superRefine` abaixo). */
|
|
128
168
|
export const zHubiaConditionSchema = z.object({
|
|
129
|
-
/** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"
|
|
169
|
+
/** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead",
|
|
170
|
+
* "now.iso" — este último para operadores de schedule). */
|
|
130
171
|
fact: z.string().min(1),
|
|
131
172
|
op: zHubiaConditionOpSchema,
|
|
132
173
|
value: z.unknown().optional(),
|
|
174
|
+
}).superRefine((c, ctx) => {
|
|
175
|
+
if (c.op === "in_schedule" || c.op === "not_in_schedule") {
|
|
176
|
+
const parsed = zHubiaScheduleSchema.safeParse(c.value);
|
|
177
|
+
if (!parsed.success) {
|
|
178
|
+
ctx.addIssue({
|
|
179
|
+
code: z.ZodIssueCode.custom,
|
|
180
|
+
path: ["value"],
|
|
181
|
+
message: `value de '${c.op}' precisa ser um IHubiaSchedule válido (${parsed.error.issues.map((i) => i.message).join("; ")})`,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
133
185
|
});
|
|
134
186
|
|
|
135
187
|
/** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo
|
|
@@ -14,15 +14,48 @@ export type IHubiaRuleOutcome = "stop" | "to_llm" | "to_llm_with_context";
|
|
|
14
14
|
/** Tipo de batch ao qual a regra se aplica. `real_message` (default) ignora
|
|
15
15
|
* a mensagem de kickoff do sistema — proteção contra loop de transferência. */
|
|
16
16
|
export type IHubiaRuleAppliesTo = "real_message" | "kickoff" | "any";
|
|
17
|
-
/** Operadores suportados pelas condições.
|
|
18
|
-
|
|
17
|
+
/** Operadores suportados pelas condições.
|
|
18
|
+
*
|
|
19
|
+
* `in_schedule` / `not_in_schedule` esperam `value: IHubiaSchedule` e
|
|
20
|
+
* avaliam contra o fact `now.*` (timezone-aware, ver IHubiaSchedule). */
|
|
21
|
+
export type IHubiaConditionOp = "exists" | "not_exists" | "is_empty" | "is_not_empty" | "eq" | "neq" | "in" | "not_in" | "contains" | "not_contains" | "matches" | "gt" | "gte" | "lt" | "lte" | "in_schedule" | "not_in_schedule";
|
|
22
|
+
/** Uma janela de horário num dia da semana.
|
|
23
|
+
*
|
|
24
|
+
* - `day`: 0=dom, 1=seg, …, 6=sáb.
|
|
25
|
+
* - `start`/`end`: formato `HH:MM` (00-23 : 00-59).
|
|
26
|
+
* - Semântica de boundary: `start <= now < end` (end excluso — permite
|
|
27
|
+
* janelas adjacentes sem overlap).
|
|
28
|
+
* - NÃO suporta `end < start`: para overnight, fazer split por meia-noite
|
|
29
|
+
* em duas janelas (`{day:1,end:'23:59'}` + `{day:2,start:'00:00'}`). */
|
|
30
|
+
export interface IHubiaScheduleWindow {
|
|
31
|
+
day: number;
|
|
32
|
+
start: string;
|
|
33
|
+
end: string;
|
|
34
|
+
}
|
|
35
|
+
/** Agenda semanal usada como `value` para `in_schedule`/`not_in_schedule`.
|
|
36
|
+
*
|
|
37
|
+
* Modelagem POSITIVA: descreva a agenda natural (ex: horário comercial)
|
|
38
|
+
* e escolha o operador (`in_` ou `not_in_`) conforme quiser disparar
|
|
39
|
+
* dentro ou fora da janela.
|
|
40
|
+
*
|
|
41
|
+
* `timezone`: IANA tz name (ex: `'America/Sao_Paulo'`). Quando ausente,
|
|
42
|
+
* runtime usa `/tenants/{tenant}.timezone` (fallback `'America/Sao_Paulo'`). */
|
|
43
|
+
export interface IHubiaSchedule {
|
|
44
|
+
windows: IHubiaScheduleWindow[];
|
|
45
|
+
timezone?: string;
|
|
46
|
+
}
|
|
19
47
|
/** Master switch do binding. `dry_run` força TODAS as regras do binding a
|
|
20
48
|
* modo seco (kill switch). Default runtime quando ausente: `live`. */
|
|
21
49
|
export type IHubiaRulesMode = "live" | "dry_run";
|
|
22
50
|
/** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
|
|
23
|
-
*
|
|
51
|
+
*
|
|
52
|
+
* Política do `value`:
|
|
53
|
+
* - Ausente para `exists`/`not_exists`/`is_empty`/`is_not_empty`.
|
|
54
|
+
* - Primitive (string/number/boolean) ou array para `eq`/`in`/`contains`/etc.
|
|
55
|
+
* - `IHubiaSchedule` para `in_schedule`/`not_in_schedule`. */
|
|
24
56
|
export interface IHubiaCondition {
|
|
25
|
-
/** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"
|
|
57
|
+
/** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead",
|
|
58
|
+
* "now.iso" para operadores de schedule). */
|
|
26
59
|
fact: string;
|
|
27
60
|
op: IHubiaConditionOp;
|
|
28
61
|
value?: unknown;
|
|
@@ -27,10 +27,15 @@ export type IHubiaRuleOutcome = "stop" | "to_llm" | "to_llm_with_context";
|
|
|
27
27
|
* a mensagem de kickoff do sistema — proteção contra loop de transferência. */
|
|
28
28
|
export type IHubiaRuleAppliesTo = "real_message" | "kickoff" | "any";
|
|
29
29
|
|
|
30
|
-
/** Operadores suportados pelas condições.
|
|
30
|
+
/** Operadores suportados pelas condições.
|
|
31
|
+
*
|
|
32
|
+
* `in_schedule` / `not_in_schedule` esperam `value: IHubiaSchedule` e
|
|
33
|
+
* avaliam contra o fact `now.*` (timezone-aware, ver IHubiaSchedule). */
|
|
31
34
|
export type IHubiaConditionOp =
|
|
32
35
|
| "exists"
|
|
33
36
|
| "not_exists"
|
|
37
|
+
| "is_empty"
|
|
38
|
+
| "is_not_empty"
|
|
34
39
|
| "eq"
|
|
35
40
|
| "neq"
|
|
36
41
|
| "in"
|
|
@@ -41,7 +46,36 @@ export type IHubiaConditionOp =
|
|
|
41
46
|
| "gt"
|
|
42
47
|
| "gte"
|
|
43
48
|
| "lt"
|
|
44
|
-
| "lte"
|
|
49
|
+
| "lte"
|
|
50
|
+
| "in_schedule"
|
|
51
|
+
| "not_in_schedule";
|
|
52
|
+
|
|
53
|
+
/** Uma janela de horário num dia da semana.
|
|
54
|
+
*
|
|
55
|
+
* - `day`: 0=dom, 1=seg, …, 6=sáb.
|
|
56
|
+
* - `start`/`end`: formato `HH:MM` (00-23 : 00-59).
|
|
57
|
+
* - Semântica de boundary: `start <= now < end` (end excluso — permite
|
|
58
|
+
* janelas adjacentes sem overlap).
|
|
59
|
+
* - NÃO suporta `end < start`: para overnight, fazer split por meia-noite
|
|
60
|
+
* em duas janelas (`{day:1,end:'23:59'}` + `{day:2,start:'00:00'}`). */
|
|
61
|
+
export interface IHubiaScheduleWindow {
|
|
62
|
+
day: number;
|
|
63
|
+
start: string;
|
|
64
|
+
end: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Agenda semanal usada como `value` para `in_schedule`/`not_in_schedule`.
|
|
68
|
+
*
|
|
69
|
+
* Modelagem POSITIVA: descreva a agenda natural (ex: horário comercial)
|
|
70
|
+
* e escolha o operador (`in_` ou `not_in_`) conforme quiser disparar
|
|
71
|
+
* dentro ou fora da janela.
|
|
72
|
+
*
|
|
73
|
+
* `timezone`: IANA tz name (ex: `'America/Sao_Paulo'`). Quando ausente,
|
|
74
|
+
* runtime usa `/tenants/{tenant}.timezone` (fallback `'America/Sao_Paulo'`). */
|
|
75
|
+
export interface IHubiaSchedule {
|
|
76
|
+
windows: IHubiaScheduleWindow[];
|
|
77
|
+
timezone?: string;
|
|
78
|
+
}
|
|
45
79
|
|
|
46
80
|
/** Master switch do binding. `dry_run` força TODAS as regras do binding a
|
|
47
81
|
* modo seco (kill switch). Default runtime quando ausente: `live`. */
|
|
@@ -50,9 +84,14 @@ export type IHubiaRulesMode = "live" | "dry_run";
|
|
|
50
84
|
// ── Sub-interfaces ──
|
|
51
85
|
|
|
52
86
|
/** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
|
|
53
|
-
*
|
|
87
|
+
*
|
|
88
|
+
* Política do `value`:
|
|
89
|
+
* - Ausente para `exists`/`not_exists`/`is_empty`/`is_not_empty`.
|
|
90
|
+
* - Primitive (string/number/boolean) ou array para `eq`/`in`/`contains`/etc.
|
|
91
|
+
* - `IHubiaSchedule` para `in_schedule`/`not_in_schedule`. */
|
|
54
92
|
export interface IHubiaCondition {
|
|
55
|
-
/** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead"
|
|
93
|
+
/** Dot-path no namespace de facts (ex: "lead.tag_names", "contact.has_lead",
|
|
94
|
+
* "now.iso" para operadores de schedule). */
|
|
56
95
|
fact: string;
|
|
57
96
|
op: IHubiaConditionOp;
|
|
58
97
|
value?: unknown;
|