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
- * `value` é ausente para `exists`/`not_exists`. */
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
- * `value` é ausente para `exists`/`not_exists`. */
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
- export type IHubiaConditionOp = "exists" | "not_exists" | "eq" | "neq" | "in" | "not_in" | "contains" | "not_contains" | "matches" | "gt" | "gte" | "lt" | "lte";
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
- * `value` é ausente para `exists`/`not_exists`. */
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
- * `value` é ausente para `exists`/`not_exists`. */
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.368",
3
+ "version": "1.3.371",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",