hobots 2.3.0 → 2.4.0

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 +1 @@
1
- {"version":3,"sources":["../src/protocol.ts"],"sourcesContent":["/**\n * Tipos do protocolo do Hobots (SDK → servidor).\n *\n * Este arquivo é a fonte de verdade do wire format e só pode reexportar tipos:\n * o app valida os payloads com zod e trava o drift via `satisfies z.ZodType<...>`\n * contra estes tipos (importados de `hobots/protocol`).\n */\n\nimport type { MachineSnapshot } from './machine-protocol';\n\n// Wire format de tasks (agente ↔ servidor) — reexportado aqui para o app\n// consumir tudo de `hobots/protocol`.\nexport type {\n RunStatus,\n RunUpdateStatus,\n RunLogLevel,\n RunLogEntry,\n InstanceInfo,\n PollRequest,\n RunDescriptor,\n PollResponse,\n RunError,\n RunProgress,\n RunUpdateRequest,\n RunUpdateResponse,\n RunItemStatus,\n RunItemInput,\n RunItemsCreateRequest,\n RunItemsCreateResponse,\n RunAttachmentContentType,\n RunAttachmentCreateRequest,\n RunAttachmentCreateResponse,\n RunAttachmentConfirmRequest,\n RunAttachmentConfirmResponse,\n} from './tasks/protocol';\n\n// Snapshot de recursos da máquina — usado no heartbeat, no poll e em contexts.machine.\nexport type { MachineProcess, MachineSnapshot } from './machine-protocol';\n\n/**\n * Tipo de um evento — o que ele é, não o quanto ele fala. Só 'fatal', 'error' e\n * 'warning' viram issue; 'success' é ingerido e nunca abre issue.\n * Ruído de log não é evento: para isso existem os logs da execução (RunLogLevel)\n * e as breadcrumbs, que têm níveis próprios com 'debug'/'info'.\n */\nexport type EventType = 'fatal' | 'error' | 'warning' | 'success';\n\n/** Nível de uma breadcrumb — trilha do que aconteceu antes, aqui log é bem-vindo. */\nexport type BreadcrumbLevel = 'debug' | 'info' | 'warning' | 'error' | 'fatal';\n\n/** Frames em ordem innermost-first (mesma ordem impressa pelo V8). */\nexport interface StackFrame {\n function?: string;\n filename?: string;\n lineno?: number;\n colno?: number;\n in_app: boolean;\n}\n\nexport interface Breadcrumb {\n /** ISO 8601 */\n timestamp: string;\n type?: string;\n category?: string;\n message?: string;\n level?: BreadcrumbLevel;\n data?: Record<string, unknown>;\n}\n\nexport interface ExceptionData {\n type: string;\n value: string;\n stacktrace?: { frames: StackFrame[] };\n}\n\nexport interface EventUser {\n id?: string;\n username?: string;\n email?: string;\n}\n\nexport interface EventPayload {\n /** uuid v4 sem hífens (32 hex), gerado pelo SDK */\n event_id: string;\n /** ISO 8601 */\n timestamp: string;\n type: EventType;\n message?: string;\n exception?: ExceptionData;\n /** Override de agrupamento; quando ausente o servidor calcula pelo stack trace */\n fingerprint?: string[];\n breadcrumbs?: Breadcrumb[];\n tags?: Record<string, string>;\n user?: EventUser;\n contexts?: Record<string, Record<string, unknown>>;\n extra?: Record<string, unknown>;\n release?: string;\n environment?: string;\n}\n\n/** Status de uma step (etapa). `warning` = terminou, mas merece atenção (não é falha). */\nexport type StepStatus = 'ok' | 'warning' | 'error' | 'cancelled';\n\nexport interface StepData {\n /** 16 hex */\n step_id: string;\n parent_step_id?: string;\n op?: string;\n description?: string;\n status?: StepStatus;\n /** ISO 8601 */\n start_timestamp: string;\n /** ISO 8601 (fim da step) */\n timestamp: string;\n data?: Record<string, unknown>;\n}\n\nexport interface TransactionPayload {\n event_id: string;\n name: string;\n op?: string;\n status: string;\n start_timestamp: string;\n timestamp: string;\n steps: StepData[];\n tags?: Record<string, string>;\n release?: string;\n environment?: string;\n /** Correlaciona esta transaction a uma execução de task (ctx.tx dentro de um task handler) */\n run_id?: string;\n}\n\nexport interface HeartbeatPayload {\n instance_id: string;\n name?: string;\n interval_ms: number;\n /** ISO 8601 */\n timestamp: string;\n metadata?: Record<string, unknown>;\n release?: string;\n /** Recursos da máquina no momento do beat (CPU, memória, disco, processo) */\n machine?: MachineSnapshot;\n}\n\nexport type EnvelopeItem =\n | { type: 'event'; payload: EventPayload }\n | { type: 'transaction'; payload: TransactionPayload }\n | { type: 'heartbeat'; payload: HeartbeatPayload };\n\nexport interface Envelope {\n sdk: { name: string; version: string };\n /** ISO 8601 */\n sent_at: string;\n items: EnvelopeItem[];\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../src/protocol.ts"],"sourcesContent":["/**\n * Tipos do protocolo do Hobots (SDK → servidor).\n *\n * Este arquivo é a fonte de verdade do wire format e só pode reexportar tipos:\n * o app valida os payloads com zod e trava o drift via `satisfies z.ZodType<...>`\n * contra estes tipos (importados de `hobots/protocol`).\n */\n\nimport type { EnvironmentInput } from './environment-protocol';\nimport type { MachineSnapshot } from './machine-protocol';\n\n// Wire format de tasks (agente ↔ servidor) — reexportado aqui para o app\n// consumir tudo de `hobots/protocol`.\nexport type {\n RunStatus,\n RunUpdateStatus,\n RunLogLevel,\n RunLogEntry,\n InstanceInfo,\n PollRequest,\n RunDescriptor,\n PollResponse,\n RunError,\n RunProgress,\n RunUpdateRequest,\n RunUpdateResponse,\n RunItemStatus,\n RunItemInput,\n RunItemsCreateRequest,\n RunItemsCreateResponse,\n RunAttachmentContentType,\n RunAttachmentCreateRequest,\n RunAttachmentCreateResponse,\n RunAttachmentConfirmRequest,\n RunAttachmentConfirmResponse,\n} from './tasks/protocol';\n\n// Snapshot de recursos da máquina — usado no heartbeat, no poll e em contexts.machine.\nexport type { MachineProcess, MachineSnapshot } from './machine-protocol';\nexport type { Environment, EnvironmentInput } from './environment-protocol';\n\n/**\n * Tipo de um evento — o que ele é, não o quanto ele fala. Só 'fatal', 'error' e\n * 'warning' viram issue; 'success' é ingerido e nunca abre issue.\n * Ruído de log não é evento: para isso existem os logs da execução (RunLogLevel)\n * e as breadcrumbs, que têm níveis próprios com 'debug'/'info'.\n */\nexport type EventType = 'fatal' | 'error' | 'warning' | 'success';\n\n/** Nível de uma breadcrumb — trilha do que aconteceu antes, aqui log é bem-vindo. */\nexport type BreadcrumbLevel = 'debug' | 'info' | 'warning' | 'error' | 'fatal';\n\n/** Frames em ordem innermost-first (mesma ordem impressa pelo V8). */\nexport interface StackFrame {\n function?: string;\n filename?: string;\n lineno?: number;\n colno?: number;\n in_app: boolean;\n}\n\nexport interface Breadcrumb {\n /** ISO 8601 */\n timestamp: string;\n type?: string;\n category?: string;\n message?: string;\n level?: BreadcrumbLevel;\n data?: Record<string, unknown>;\n}\n\nexport interface ExceptionData {\n type: string;\n value: string;\n stacktrace?: { frames: StackFrame[] };\n}\n\nexport interface EventUser {\n id?: string;\n username?: string;\n email?: string;\n}\n\nexport interface EventPayload {\n /** uuid v4 sem hífens (32 hex), gerado pelo SDK */\n event_id: string;\n /** ISO 8601 */\n timestamp: string;\n type: EventType;\n message?: string;\n exception?: ExceptionData;\n /** Override de agrupamento; quando ausente o servidor calcula pelo stack trace */\n fingerprint?: string[];\n breadcrumbs?: Breadcrumb[];\n tags?: Record<string, string>;\n user?: EventUser;\n contexts?: Record<string, Record<string, unknown>>;\n extra?: Record<string, unknown>;\n release?: string;\n environment?: EnvironmentInput;\n}\n\n/** Status de uma step (etapa). `warning` = terminou, mas merece atenção (não é falha). */\nexport type StepStatus = 'ok' | 'warning' | 'error' | 'cancelled';\n\nexport interface StepData {\n /** 16 hex */\n step_id: string;\n parent_step_id?: string;\n op?: string;\n description?: string;\n status?: StepStatus;\n /** ISO 8601 */\n start_timestamp: string;\n /** ISO 8601 (fim da step) */\n timestamp: string;\n data?: Record<string, unknown>;\n}\n\nexport interface TransactionPayload {\n event_id: string;\n name: string;\n op?: string;\n status: string;\n start_timestamp: string;\n timestamp: string;\n steps: StepData[];\n tags?: Record<string, string>;\n release?: string;\n environment?: EnvironmentInput;\n /** Correlaciona esta transaction a uma execução de task (ctx.tx dentro de um task handler) */\n run_id?: string;\n}\n\nexport interface HeartbeatPayload {\n instance_id: string;\n name?: string;\n interval_ms: number;\n /** ISO 8601 */\n timestamp: string;\n metadata?: Record<string, unknown>;\n release?: string;\n /** Ambiente da instância — é ele que o app exibe e que as regras de alerta filtram */\n environment?: EnvironmentInput;\n /** Recursos da máquina no momento do beat (CPU, memória, disco, processo) */\n machine?: MachineSnapshot;\n}\n\nexport type EnvelopeItem =\n | { type: 'event'; payload: EventPayload }\n | { type: 'transaction'; payload: TransactionPayload }\n | { type: 'heartbeat'; payload: HeartbeatPayload };\n\nexport interface Envelope {\n sdk: { name: string; version: string };\n /** ISO 8601 */\n sent_at: string;\n items: EnvelopeItem[];\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1,3 +1,25 @@
1
+ /**
2
+ * Ambiente lógico onde o robô roda.
3
+ *
4
+ * Arquivo-folha do protocolo (não importa nada): referenciado pelo heartbeat, pelo
5
+ * poll de tasks (`InstanceInfo.environment`) e pelos eventos/transactions, e
6
+ * reexportado por `hobots/protocol`.
7
+ *
8
+ * A fonte única do vocabulário (rótulos em pt-BR, apelidos legados aceitos e a
9
+ * normalização) vive no servidor, em packages/utils/src/environments.ts — o SDK é
10
+ * publicado sozinho no npm e não depende do monorepo, então o union é redeclarado
11
+ * aqui. O servidor normaliza o que chega: valores antigos de texto livre ('prod',
12
+ * 'qa', 'homologacao') continuam sendo aceitos e classificados.
13
+ */
14
+ type Environment = 'development' | 'testing' | 'staging' | 'production';
15
+ /**
16
+ * O que o wire realmente aceita: o ambiente canônico ou uma string legada que o
17
+ * servidor normaliza ('prod', 'qa', 'homologacao'...). O `string & {}` preserva o
18
+ * autocomplete dos quatro valores sem fechar a porta para o que já roda em campo
19
+ * — e mantém os `satisfies z.ZodType<...>` da api fechando contra `z.string()`.
20
+ */
21
+ type EnvironmentInput = Environment | (string & {});
22
+
1
23
  /**
2
24
  * Snapshot dos recursos da máquina onde a instância roda.
3
25
  *
@@ -82,6 +104,8 @@ interface InstanceInfo {
82
104
  version?: string;
83
105
  /** Hostname da máquina */
84
106
  host?: string;
107
+ /** Ambiente da instância — mesmo valor do heartbeat; agentes poll-only só o informam aqui */
108
+ environment?: EnvironmentInput;
85
109
  /** Tasks registradas no agente */
86
110
  tasks?: string[];
87
111
  /**
@@ -275,7 +299,7 @@ interface EventPayload {
275
299
  contexts?: Record<string, Record<string, unknown>>;
276
300
  extra?: Record<string, unknown>;
277
301
  release?: string;
278
- environment?: string;
302
+ environment?: EnvironmentInput;
279
303
  }
280
304
  /** Status de uma step (etapa). `warning` = terminou, mas merece atenção (não é falha). */
281
305
  type StepStatus = 'ok' | 'warning' | 'error' | 'cancelled';
@@ -302,7 +326,7 @@ interface TransactionPayload {
302
326
  steps: StepData[];
303
327
  tags?: Record<string, string>;
304
328
  release?: string;
305
- environment?: string;
329
+ environment?: EnvironmentInput;
306
330
  /** Correlaciona esta transaction a uma execução de task (ctx.tx dentro de um task handler) */
307
331
  run_id?: string;
308
332
  }
@@ -314,6 +338,8 @@ interface HeartbeatPayload {
314
338
  timestamp: string;
315
339
  metadata?: Record<string, unknown>;
316
340
  release?: string;
341
+ /** Ambiente da instância — é ele que o app exibe e que as regras de alerta filtram */
342
+ environment?: EnvironmentInput;
317
343
  /** Recursos da máquina no momento do beat (CPU, memória, disco, processo) */
318
344
  machine?: MachineSnapshot;
319
345
  }
@@ -337,4 +363,4 @@ interface Envelope {
337
363
  items: EnvelopeItem[];
338
364
  }
339
365
 
340
- export type { Breadcrumb, BreadcrumbLevel, Envelope, EnvelopeItem, EventPayload, EventType, EventUser, ExceptionData, HeartbeatPayload, InstanceInfo, MachineProcess, MachineSnapshot, PollRequest, PollResponse, RunAttachmentConfirmRequest, RunAttachmentConfirmResponse, RunAttachmentContentType, RunAttachmentCreateRequest, RunAttachmentCreateResponse, RunDescriptor, RunError, RunItemInput, RunItemStatus, RunItemsCreateRequest, RunItemsCreateResponse, RunLogEntry, RunLogLevel, RunProgress, RunStatus, RunUpdateRequest, RunUpdateResponse, RunUpdateStatus, StackFrame, StepData, StepStatus, TransactionPayload };
366
+ export type { Breadcrumb, BreadcrumbLevel, Envelope, EnvelopeItem, Environment, EnvironmentInput, EventPayload, EventType, EventUser, ExceptionData, HeartbeatPayload, InstanceInfo, MachineProcess, MachineSnapshot, PollRequest, PollResponse, RunAttachmentConfirmRequest, RunAttachmentConfirmResponse, RunAttachmentContentType, RunAttachmentCreateRequest, RunAttachmentCreateResponse, RunDescriptor, RunError, RunItemInput, RunItemStatus, RunItemsCreateRequest, RunItemsCreateResponse, RunLogEntry, RunLogLevel, RunProgress, RunStatus, RunUpdateRequest, RunUpdateResponse, RunUpdateStatus, StackFrame, StepData, StepStatus, TransactionPayload };
@@ -1,3 +1,25 @@
1
+ /**
2
+ * Ambiente lógico onde o robô roda.
3
+ *
4
+ * Arquivo-folha do protocolo (não importa nada): referenciado pelo heartbeat, pelo
5
+ * poll de tasks (`InstanceInfo.environment`) e pelos eventos/transactions, e
6
+ * reexportado por `hobots/protocol`.
7
+ *
8
+ * A fonte única do vocabulário (rótulos em pt-BR, apelidos legados aceitos e a
9
+ * normalização) vive no servidor, em packages/utils/src/environments.ts — o SDK é
10
+ * publicado sozinho no npm e não depende do monorepo, então o union é redeclarado
11
+ * aqui. O servidor normaliza o que chega: valores antigos de texto livre ('prod',
12
+ * 'qa', 'homologacao') continuam sendo aceitos e classificados.
13
+ */
14
+ type Environment = 'development' | 'testing' | 'staging' | 'production';
15
+ /**
16
+ * O que o wire realmente aceita: o ambiente canônico ou uma string legada que o
17
+ * servidor normaliza ('prod', 'qa', 'homologacao'...). O `string & {}` preserva o
18
+ * autocomplete dos quatro valores sem fechar a porta para o que já roda em campo
19
+ * — e mantém os `satisfies z.ZodType<...>` da api fechando contra `z.string()`.
20
+ */
21
+ type EnvironmentInput = Environment | (string & {});
22
+
1
23
  /**
2
24
  * Snapshot dos recursos da máquina onde a instância roda.
3
25
  *
@@ -82,6 +104,8 @@ interface InstanceInfo {
82
104
  version?: string;
83
105
  /** Hostname da máquina */
84
106
  host?: string;
107
+ /** Ambiente da instância — mesmo valor do heartbeat; agentes poll-only só o informam aqui */
108
+ environment?: EnvironmentInput;
85
109
  /** Tasks registradas no agente */
86
110
  tasks?: string[];
87
111
  /**
@@ -275,7 +299,7 @@ interface EventPayload {
275
299
  contexts?: Record<string, Record<string, unknown>>;
276
300
  extra?: Record<string, unknown>;
277
301
  release?: string;
278
- environment?: string;
302
+ environment?: EnvironmentInput;
279
303
  }
280
304
  /** Status de uma step (etapa). `warning` = terminou, mas merece atenção (não é falha). */
281
305
  type StepStatus = 'ok' | 'warning' | 'error' | 'cancelled';
@@ -302,7 +326,7 @@ interface TransactionPayload {
302
326
  steps: StepData[];
303
327
  tags?: Record<string, string>;
304
328
  release?: string;
305
- environment?: string;
329
+ environment?: EnvironmentInput;
306
330
  /** Correlaciona esta transaction a uma execução de task (ctx.tx dentro de um task handler) */
307
331
  run_id?: string;
308
332
  }
@@ -314,6 +338,8 @@ interface HeartbeatPayload {
314
338
  timestamp: string;
315
339
  metadata?: Record<string, unknown>;
316
340
  release?: string;
341
+ /** Ambiente da instância — é ele que o app exibe e que as regras de alerta filtram */
342
+ environment?: EnvironmentInput;
317
343
  /** Recursos da máquina no momento do beat (CPU, memória, disco, processo) */
318
344
  machine?: MachineSnapshot;
319
345
  }
@@ -337,4 +363,4 @@ interface Envelope {
337
363
  items: EnvelopeItem[];
338
364
  }
339
365
 
340
- export type { Breadcrumb, BreadcrumbLevel, Envelope, EnvelopeItem, EventPayload, EventType, EventUser, ExceptionData, HeartbeatPayload, InstanceInfo, MachineProcess, MachineSnapshot, PollRequest, PollResponse, RunAttachmentConfirmRequest, RunAttachmentConfirmResponse, RunAttachmentContentType, RunAttachmentCreateRequest, RunAttachmentCreateResponse, RunDescriptor, RunError, RunItemInput, RunItemStatus, RunItemsCreateRequest, RunItemsCreateResponse, RunLogEntry, RunLogLevel, RunProgress, RunStatus, RunUpdateRequest, RunUpdateResponse, RunUpdateStatus, StackFrame, StepData, StepStatus, TransactionPayload };
366
+ export type { Breadcrumb, BreadcrumbLevel, Envelope, EnvelopeItem, Environment, EnvironmentInput, EventPayload, EventType, EventUser, ExceptionData, HeartbeatPayload, InstanceInfo, MachineProcess, MachineSnapshot, PollRequest, PollResponse, RunAttachmentConfirmRequest, RunAttachmentConfirmResponse, RunAttachmentContentType, RunAttachmentCreateRequest, RunAttachmentCreateResponse, RunDescriptor, RunError, RunItemInput, RunItemStatus, RunItemsCreateRequest, RunItemsCreateResponse, RunLogEntry, RunLogLevel, RunProgress, RunStatus, RunUpdateRequest, RunUpdateResponse, RunUpdateStatus, StackFrame, StepData, StepStatus, TransactionPayload };
@@ -95,7 +95,7 @@ No poll, o agente se identifica com `InstanceInfo` (`hobots/protocol`): o campo
95
95
  | Opção | Tipo | Default | Descrição |
96
96
  | --- | --- | --- | --- |
97
97
  | `clientSecret` | `string` | — | **obrigatório**; o Client Secret do agente (`hb_<64 hex>`), copiado em **Configurações → Agentes** |
98
- | `environment` | `string` | `'production'` | ambiente lógico |
98
+ | `environment` | `'development' \| 'testing' \| 'staging' \| 'production'` | `'production'` | ambiente lógico — vai nos eventos **e** na identidade da instância; é por ele que as regras de alerta decidem se notificam |
99
99
  | `release` | `string` | — | versão do programa, ex. `robo-nfe@1.4.2` |
100
100
  | `instanceId` | `string` | **obrigatório** | identidade única da instância; heartbeat e poll de tasks convergem nela |
101
101
  | `tags` | `Record<string,string>` | — | tags aplicadas a todos os eventos |
package/docs/concepts.md CHANGED
@@ -339,7 +339,7 @@ O que o torna especial é que ele é a identidade dos **dois** canais ao mesmo t
339
339
 
340
340
  ## Release e environment
341
341
 
342
- **`release`** é a versão do seu programa (`robo-nfe@1.4.2`) e **`environment`** é o ambiente lógico (`production`, `homologacao`). Os dois são anexados a **todo** item enviado: eventos e transactions.
342
+ **`release`** é a versão do seu programa (`robo-nfe@1.4.2`) e **`environment`** é o ambiente lógico, um de quatro valores: `development`, `testing`, `staging` (homologação) e `production`. Os dois são anexados a **todo** item enviado: eventos e transactions — e o `environment` vai também na identidade da **instância**, pelo heartbeat e pelo poll.
343
343
 
344
344
  Servem a duas perguntas concretas:
345
345
 
@@ -348,6 +348,10 @@ Servem a duas perguntas concretas:
348
348
 
349
349
  `environment` default é `production`. Se você roda homologação sem definir isso, os dois ambientes se misturam na mesma issue — vale configurar no primeiro dia.
350
350
 
351
+ E não é só organização: é o `environment` que decide **quem é notificado**. Cada regra de alerta lista os ambientes em que dispara, e por padrão só produção — um erro de homologação não acorda a lista de plantão, e uma máquina de testes que desliga no fim do expediente não vira alerta de madrugada. Para ser avisado em outro ambiente, marque-o na regra em **Alertas**.
352
+
353
+ Valores antigos de texto livre (`prod`, `qa`, `homologacao`) continuam sendo aceitos — o servidor os classifica num dos quatro; o que ele não reconhece vira produção, para nunca silenciar um alerta por engano. O ambiente de uma instância também pode ser corrigido no app, na página dela: a partir daí ele ignora o que o robô declara, até você desfazer.
354
+
351
355
  ## Run
352
356
 
353
357
  Uma **run** (execução) é um pedido concreto de trabalho criado no app: alguém preencheu o formulário da task, ou uma automação disparou, e agora existe uma solicitação esperando um agente pegar.
package/docs/protocol.md CHANGED
@@ -81,6 +81,7 @@ Corpo `PollRequest`:
81
81
  "name": "VM 01",
82
82
  "version": "2.0.0",
83
83
  "host": "vm-01",
84
+ "environment": "production", // ambiente da instância: development | testing | staging | production
84
85
  "tasks": ["processar-nfe"]
85
86
  },
86
87
  "max": 1, // quantas reivindicar (1..5)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hobots",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "SDK JavaScript da Hobots — telemetria (erros, transactions e heartbeats) e execução remota de tarefas sob demanda (tasks) para RPAs e integrações. Um único import e um único init().",
5
5
  "type": "module",
6
6
  "sideEffects": false,