evo360-types 1.3.369 → 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) ─────────
|
|
@@ -103,14 +103,62 @@ exports.zHubiaConditionOpSchema = zod_1.z.enum([
|
|
|
103
103
|
"contains", "not_contains",
|
|
104
104
|
"matches",
|
|
105
105
|
"gt", "gte", "lt", "lte",
|
|
106
|
+
"in_schedule", "not_in_schedule",
|
|
106
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
|
+
});
|
|
107
137
|
/** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
|
|
108
|
-
*
|
|
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). */
|
|
109
145
|
exports.zHubiaConditionSchema = zod_1.z.object({
|
|
110
|
-
/** 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). */
|
|
111
148
|
fact: zod_1.z.string().min(1),
|
|
112
149
|
op: exports.zHubiaConditionOpSchema,
|
|
113
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
|
+
}
|
|
114
162
|
});
|
|
115
163
|
/** Grupo de condições. Nível 2: um nível de AND/OR, sem aninhamento profundo
|
|
116
164
|
* (Nível 3 fica para depois). Pelo menos uma das listas precisa ter ≥1 condição. */
|
|
@@ -122,15 +122,66 @@ export const zHubiaConditionOpSchema = z.enum([
|
|
|
122
122
|
"contains", "not_contains",
|
|
123
123
|
"matches",
|
|
124
124
|
"gt", "gte", "lt", "lte",
|
|
125
|
+
"in_schedule", "not_in_schedule",
|
|
125
126
|
]);
|
|
126
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
|
+
|
|
127
160
|
/** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
|
|
128
|
-
*
|
|
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). */
|
|
129
168
|
export const zHubiaConditionSchema = z.object({
|
|
130
|
-
/** 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). */
|
|
131
171
|
fact: z.string().min(1),
|
|
132
172
|
op: zHubiaConditionOpSchema,
|
|
133
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
|
+
}
|
|
134
185
|
});
|
|
135
186
|
|
|
136
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,7 +27,10 @@ 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"
|
|
@@ -43,7 +46,36 @@ export type IHubiaConditionOp =
|
|
|
43
46
|
| "gt"
|
|
44
47
|
| "gte"
|
|
45
48
|
| "lt"
|
|
46
|
-
| "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
|
+
}
|
|
47
79
|
|
|
48
80
|
/** Master switch do binding. `dry_run` força TODAS as regras do binding a
|
|
49
81
|
* modo seco (kill switch). Default runtime quando ausente: `live`. */
|
|
@@ -52,9 +84,14 @@ export type IHubiaRulesMode = "live" | "dry_run";
|
|
|
52
84
|
// ── Sub-interfaces ──
|
|
53
85
|
|
|
54
86
|
/** Uma condição: avalia `op(fact, value)` contra o facts provider do runtime.
|
|
55
|
-
*
|
|
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`. */
|
|
56
92
|
export interface IHubiaCondition {
|
|
57
|
-
/** 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). */
|
|
58
95
|
fact: string;
|
|
59
96
|
op: IHubiaConditionOp;
|
|
60
97
|
value?: unknown;
|