evo360-types 1.3.369 → 1.3.372

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
- * `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). */
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
- * `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). */
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
@@ -13,7 +13,13 @@ export type HubiaConversationMode = 'ai_only' | 'ai_suggest' | 'human_only' | 'h
13
13
  export interface IInbox extends IFireGlobalDoc {
14
14
  name: string;
15
15
  type: InboxType;
16
- status: InboxStatus;
16
+ /**
17
+ * @deprecated Eliminado em feat-025-omni-inboxes-v2 — inboxes que existem
18
+ * são sempre ativas (hard-delete é a única forma de "desativar"). Mantido
19
+ * opcional apenas para compatibilidade com documentos legados que possam
20
+ * ter o field gravado.
21
+ */
22
+ status?: InboxStatus;
17
23
  [key: string]: unknown;
18
24
  }
19
25
  export interface IInboxMemberPermissions {
@@ -25,7 +25,13 @@ export type HubiaConversationMode =
25
25
  export interface IInbox extends IFireGlobalDoc {
26
26
  name: string;
27
27
  type: InboxType;
28
- status: InboxStatus;
28
+ /**
29
+ * @deprecated Eliminado em feat-025-omni-inboxes-v2 — inboxes que existem
30
+ * são sempre ativas (hard-delete é a única forma de "desativar"). Mantido
31
+ * opcional apenas para compatibilidade com documentos legados que possam
32
+ * ter o field gravado.
33
+ */
34
+ status?: InboxStatus;
29
35
  [key: string]: unknown;
30
36
  }
31
37
 
@@ -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" | "is_empty" | "is_not_empty" | "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,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
- * `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`. */
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.369",
3
+ "version": "1.3.372",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",