hobots 1.5.1 → 1.7.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.
package/README.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  SDK JavaScript/TypeScript da **Hobots** para instrumentar funcionários digitais (RPAs) e integrações.
4
4
 
5
- - **Monitor** — telemetria que o programa **emite** sozinho: erros com stack trace, performance (transactions/spans), check-ins de cron e heartbeats de uptime.
6
- - **Manager** — execução **sob demanda**: o agente faz polling no app da Hobots, executa handlers registrados e reporta status e logs.
5
+ - **Telemetria** — o que o programa **emite** sozinho: erros com stack trace (módulo **Issues** do app), performance (transactions/spans) e heartbeats de uptime (módulo **Agentes**), check-ins de cron (módulo **Monitores**).
6
+ - **Tasks** — execução **sob demanda**: o agente faz polling no app da Hobots, executa handlers registrados e reporta status e logs (módulo **Solicitações**).
7
7
 
8
- **Um único import e um único `init()`** cobrem as duas capabilities. Cliente HTTP puro, **sem dependências de runtime**. Requer **Node 18+** (usa o `fetch` global); o Monitor também roda no browser para captura de erros.
8
+ **Um único import e um único `init()`** cobrem as duas capabilities. Cliente HTTP puro, **sem dependências de runtime**. Requer **Node 18+** (usa o `fetch` global); a telemetria também roda no browser para captura de erros.
9
9
 
10
10
  ---
11
11
 
@@ -17,7 +17,7 @@ npm install hobots
17
17
  ```
18
18
 
19
19
  ```js
20
- import * as Hobots from 'hobots'; // um import só — Monitor e Manager
20
+ import * as Hobots from 'hobots'; // um import só — telemetria e tasks
21
21
  ```
22
22
 
23
23
  Também funciona em CommonJS: `const Hobots = require('hobots')`.
@@ -30,21 +30,21 @@ O SDK expõe **duas capabilities** autenticadas pelo **mesmo Client Secret do pr
30
30
 
31
31
  | Capability | Como habilita | Para quê | Ciclo de vida |
32
32
  | --- | --- | --- | --- |
33
- | **Monitor** | sempre ativo no `init()` | Telemetria emitida pelo próprio programa: erros, transactions/spans, crons, heartbeat. | Timers `unref`'d — **não** segura o processo. Chame `close()` no fim. |
34
- | **Manager** | `manager: true` (ou opções) no `init()` | Execução remota sob demanda via polling. | `start()` **segura o processo vivo** até `stop()`/`close()`. |
33
+ | **Telemetria** | sempre ativa no `init()` | O que o programa emite sozinho: erros, transactions/spans, crons, heartbeat. | Timers `unref`'d — **não** segura o processo. Chame `close()` no fim. |
34
+ | **Tasks** | `tasks: true` (ou opções) no `init()` | Execução remota sob demanda via polling. | `start()` **segura o processo vivo** até `stop()`/`close()`. |
35
35
 
36
36
  Você usa **uma, outra ou as duas**:
37
37
 
38
38
  - Só saber se o robô quebrou, quanto demora e se está vivo? → `init({ clientSecret, heartbeat: true })`.
39
- - Disparar o robô sob demanda a partir de um formulário no app? → `init({ clientSecret, manager: true })` + `register()` + `start()`.
40
- - Ambos? Passe `heartbeat` e `manager` no mesmo `init()` — o `instanceId` é a identidade única, e os dois canais convergem em **um agente** no painel.
39
+ - Disparar o robô sob demanda a partir de um formulário no app? → `init({ clientSecret, tasks: true })` + `register()` + `start()`.
40
+ - Ambos? Passe `heartbeat` e `tasks` no mesmo `init()` — o `instanceId` é a identidade única, e os dois canais convergem em **um agente** no painel. Com `tasks: true`, o heartbeat é **opcional**: o próprio poll de tasks já marca a presença do agente.
41
41
 
42
42
  ```js
43
43
  Hobots.init({
44
44
  clientSecret: 'hb_<64 hex>',
45
45
  instanceId: 'vm-cliente-01',
46
- heartbeat: true, // Monitor: "estou vivo" a cada 30s
47
- manager: { pollIntervalMs: 5_000 }, // Manager: execução sob demanda
46
+ heartbeat: true, // telemetria: "estou vivo" a cada 30s
47
+ tasks: { pollIntervalMs: 5_000 }, // execução sob demanda
48
48
  });
49
49
 
50
50
  Hobots.register('processar-nfe', async (params, ctx) => {
@@ -52,24 +52,24 @@ Hobots.register('processar-nfe', async (params, ctx) => {
52
52
  ctx.log.info('12 notas processadas'); // o retorno do handler é ignorado — reporte por log
53
53
  });
54
54
 
55
- Hobots.start(); // inicia o polling do Manager (segura o processo vivo)
55
+ Hobots.start(); // inicia o polling de tasks (segura o processo vivo)
56
56
  ```
57
57
 
58
58
  ---
59
59
 
60
60
  ## O Client Secret
61
61
 
62
- Cada projeto tem **um único Client Secret** — a mesma credencial autentica o Monitor **e** o Manager:
62
+ Cada projeto tem **um único Client Secret** — a mesma credencial autentica a telemetria **e** as tasks:
63
63
 
64
64
  ```
65
65
  hb_<64 hex>
66
66
  ```
67
67
 
68
- (Chaves antigas, 64 hex puros, continuam válidas no servidor.) A credencial é **secreta** e viaja sempre no header `Authorization: Bearer` — nunca na URL. Copie o Client Secret no app, em **Configurações → Projetos** — os snippets de integração já vêm prontos. O SDK fala com a API oficial `https://api2.hobots.app` automaticamente; em desenvolvimento, aponte para outro host com a env `HOBOTS_API_URL` (ex.: `HOBOTS_API_URL=http://localhost:3001`).
68
+ A credencial é **secreta** e viaja sempre no header `Authorization: Bearer` — nunca na URL. Copie o Client Secret no app, em **Configurações → Projetos** — os snippets de integração já vêm prontos. O SDK fala com a API oficial `https://api2.hobots.app` automaticamente; em desenvolvimento, aponte para outro host com a env `HOBOTS_API_URL` (ex.: `HOBOTS_API_URL=http://localhost:3001`).
69
69
 
70
70
  ---
71
71
 
72
- ## Monitor
72
+ ## Telemetria
73
73
 
74
74
  Todas as funções abaixo são **no-op seguras** se `Hobots.init()` não foi chamado (com aviso no console).
75
75
 
@@ -93,14 +93,14 @@ Hobots.init({
93
93
  | `clientSecret` | `string` | **obrigatório** | o Client Secret do projeto (`hb_<64 hex>`), copiado em **Configurações → Projetos** |
94
94
  | `environment` | `string` | `'production'` | ambiente lógico |
95
95
  | `release` | `string` | — | versão do programa, ex. `robo-nfe@1.4.2` |
96
- | `instanceId` | `string` | **obrigatório** | identidade única da instância — heartbeat do Monitor e agente do Manager convergem nela |
96
+ | `instanceId` | `string` | **obrigatório** | identidade única da instância — heartbeat e poll de tasks convergem nela |
97
97
  | `tags` | `Record<string,string>` | — | tags aplicadas a todos os eventos |
98
98
  | `sampleRate` | `number` | `1` | amostragem de erros (0..1) |
99
99
  | `tracesSampleRate` | `number` | `1` | amostragem de transactions (0..1) |
100
100
  | `maxBreadcrumbs` | `number` | `100` | tamanho do buffer de breadcrumbs |
101
101
  | `captureUnhandled` | `boolean` | `true` | handlers globais de erro (`uncaughtException`/`unhandledRejection`) |
102
102
  | `heartbeat` | `boolean \| HeartbeatOptions` | `false` | heartbeat periódico (`true` usa defaults) |
103
- | `manager` | `boolean \| ManagerOptions` | `false` | habilita o agente Manager (`true` usa defaults) — veja [Manager](#manager) |
103
+ | `tasks` | `boolean \| TasksOptions` | `false` | habilita a execução sob demanda (`true` usa defaults) — veja [Tasks](#tasks-execução-sob-demanda) |
104
104
  | `beforeSend` | `(event) => event \| null` | — | edita/descarta evento (retorne `null` para descartar) |
105
105
  | `debug` | `boolean` | `false` | loga atividade do SDK |
106
106
  | `flushIntervalMs` | `number` | `2000` | intervalo do flush automático do transport |
@@ -123,7 +123,7 @@ try {
123
123
  Hobots.captureMessage('Lote processado com sucesso', 'success');
124
124
  ```
125
125
 
126
- Ambas retornam o `event_id` (ou `undefined` se não inicializado). O hint aceita `level`, `tags`, `extra` e `fingerprint`. Erros **não tratados** são capturados e flushados automaticamente antes do processo sair — desligue com `captureUnhandled: false`.
126
+ Ambas retornam o `event_id` (ou `undefined` se não inicializado). O hint aceita `level`, `tags`, `extra` e `fingerprint`. Erros **não tratados** são capturados e flushados automaticamente antes do processo sair — desligue com `captureUnhandled: false`. Os eventos aparecem agrupados em issues no módulo **Issues** do app.
127
127
 
128
128
  `Severity = 'fatal' | 'error' | 'warning' | 'info' | 'debug' | 'success'`. Use `'success'` para reportar itens concluídos com êxito — contam como eventos, mas **não** viram issue nem disparam alertas.
129
129
 
@@ -179,11 +179,11 @@ tx.finish(); // só aqui a transaction é enviada (respeitando tracesSam
179
179
  - Métodos encadeáveis: `setStatus`, `setData` (span), `setTag`/`setName` (transaction).
180
180
  - `finish()` na transaction fecha os spans abertos e envia o payload; nada é enviado se ela não foi amostrada. A amostragem é decidida no `startTransaction()`.
181
181
 
182
- Dentro de um handler do Manager não abra transaction — já existe uma em `ctx.tx`. Conceitos: [Transaction](./docs/concepts.md#transaction) · [Span](./docs/concepts.md#span).
182
+ Dentro de um handler de task, `startTransaction()` **retorna a transaction da própria run** (`ctx.tx`) em vez de criar uma segunda — cada execução tem exatamente **uma** transaction. Conceitos: [Transaction](./docs/concepts.md#transaction) · [Span](./docs/concepts.md#span).
183
183
 
184
184
  ### Crons (check-ins)
185
185
 
186
- Monitora jobs agendados: check-in `in_progress` na entrada, `ok`/`error` na saída, com duração medida. O jeito recomendado é `withMonitor`, que faz o par e captura exceções:
186
+ Monitora jobs agendados no módulo **Monitores** do app: check-in `in_progress` na entrada, `ok`/`error` na saída, com duração medida. O jeito recomendado é `withMonitor`, que faz o par e captura exceções:
187
187
 
188
188
  ```js
189
189
  await Hobots.withMonitor(
@@ -212,7 +212,9 @@ Hobots.init({
212
212
  });
213
213
  ```
214
214
 
215
- `heartbeat: true` usa os defaults. A identidade é o `instanceId` do `init()`; os campos são `intervalMs`, `name` (default: o `instanceId`) e `metadata` — valores em [Tempos e intervalos](./docs/api-reference.md#tempos-e-intervalos). O primeiro batimento sai **na hora** em que o `init()` roda, não depois do primeiro intervalo. Conceito: [Heartbeat](./docs/concepts.md#heartbeat).
215
+ `heartbeat: true` usa os defaults. A identidade é o `instanceId` do `init()`; os campos são `intervalMs`, `name` (default: o `instanceId`) e `metadata` — valores em [Tempos e intervalos](./docs/api-reference.md#tempos-e-intervalos). O primeiro batimento sai **na hora** em que o `init()` roda, não depois do primeiro intervalo.
216
+
217
+ O heartbeat é **essencial** para agentes só de telemetria; com `tasks: true` ele é **opcional**, porque o poll de tasks já marca a presença do agente no painel. Conceito: [Heartbeat](./docs/concepts.md#heartbeat).
216
218
 
217
219
  ### Flush e close
218
220
 
@@ -221,13 +223,13 @@ await Hobots.flush(2000); // envia o buffer, mantém o SDK vivo
221
223
  await Hobots.close(2000); // flush final + para o heartbeat + fecha o transport
222
224
  ```
223
225
 
224
- Chame `close` antes do processo sair. Os timers do Monitor são `unref`'d — ele **não** segura o processo vivo sozinho.
226
+ Chame `close` antes do processo sair. Os timers da telemetria são `unref`'d — ela **não** segura o processo vivo sozinha.
225
227
 
226
228
  ---
227
229
 
228
- ## Manager
230
+ ## Tasks (execução sob demanda)
229
231
 
230
- Capability de **execução remota sob demanda**, habilitada com `manager: true` (ou opções) no `init()`. O agente faz polling no app, executa os handlers registrados quando aparece trabalho e reporta status e logs incrementais. Mesmo Client Secret, mesmo `debug` e o `instanceId` como identidade — nenhum handler global extra é instalado.
232
+ Capability de **execução remota sob demanda**, habilitada com `tasks: true` (ou opções) no `init()`. O agente faz polling no app, executa os handlers registrados quando aparece trabalho e reporta status e logs incrementais — cada execução aparece no módulo **Solicitações** do app. Mesmo Client Secret, mesmo `debug` e o `instanceId` como identidade — nenhum handler global extra é instalado.
231
233
 
232
234
  ### Ciclo de vida
233
235
 
@@ -235,7 +237,7 @@ Capability de **execução remota sob demanda**, habilitada com `manager: true`
235
237
  Hobots.init({
236
238
  clientSecret: 'hb_<64 hex>',
237
239
  instanceId: 'vm-cliente-01',
238
- manager: true, // ou { pollIntervalMs, concurrency, ... }
240
+ tasks: true, // ou { pollIntervalMs, concurrency, ... }
239
241
  });
240
242
 
241
243
  Hobots.register('processar-nfe', async (params, ctx) => {
@@ -251,13 +253,13 @@ process.on('SIGINT', () => {
251
253
  });
252
254
  ```
253
255
 
254
- - `init({ manager })` — cria o agente. Chamar `init()` de novo para o agente anterior e o substitui (o registry de handlers é preservado).
255
- - `register(task, handler)` — `task` é o `task_slug` configurado no formulário do app. Registre **antes** de `start()`. Funciona até antes do `init()`; com o Manager desabilitado, avisa no console.
256
- - `start()` — começa o polling. Lança se o `init()` não configurou `manager` ou se nenhuma task foi registrada.
257
- - `stop(timeoutMs?)` — para **só o Manager**: encerra o polling e aguarda as runs ativas (default 30s); a telemetria continua. Retorna `false` se estourou o timeout.
256
+ - `init({ tasks })` — cria o agente. Chamar `init()` de novo para o agente anterior e o substitui (o registry de handlers é preservado).
257
+ - `register(task, handler)` — `task` é o `task_slug` configurado no formulário do app (**Configurações → Formulários**). Registre **antes** de `start()`. Funciona até antes do `init()`; com as tasks desabilitadas, avisa no console.
258
+ - `start()` — começa o polling. Lança se o `init()` não configurou `tasks` ou se nenhuma task foi registrada.
259
+ - `stop(timeoutMs?)` — para **só o polling de tasks**: encerra o polling e aguarda as runs ativas (default 30s); a telemetria continua. Retorna `false` se estourou o timeout.
258
260
  - `close(timeoutMs?)` — encerra **tudo**: agente (aguardando runs em voo) → heartbeat → flush final do transport.
259
261
 
260
- | Opção (`ManagerOptions`) | Tipo | Default | Descrição |
262
+ | Opção (`TasksOptions`) | Tipo | Default | Descrição |
261
263
  | --- | --- | --- | --- |
262
264
  | `pollIntervalMs` | `number` | `5000` | intervalo entre polls sem trabalho (mínimo `1000`) |
263
265
  | `concurrency` | `number` | `1` | runs simultâneas (clamp 1..5) |
@@ -266,18 +268,18 @@ process.on('SIGINT', () => {
266
268
  | `cancelCheckIntervalMs` | `number` | `5000` | heartbeat de cancelamento por run (clamp 1000..15000) — também é o sinal de vida da run |
267
269
  | `installExitHandlers` | `boolean` | `true` | handlers de SIGINT/SIGTERM/uncaughtException que reportam as runs ativas como `AgentTerminated` antes do processo morrer; nunca interferem quando o programa tem handler próprio |
268
270
 
269
- O Client Secret, o `debug` e a identidade do agente (`instanceId`) vêm do `init()` — o heartbeat do Monitor e o agente do Manager convergem em **um agente** no painel automaticamente.
271
+ O Client Secret, o `debug` e a identidade do agente (`instanceId`) vêm do `init()` — o heartbeat e o poll de tasks convergem em **um agente** no painel automaticamente.
270
272
 
271
273
  ### O handler e o `RunContext`
272
274
 
273
275
  ```ts
274
- type ManagerTaskHandler<P = Record<string, unknown>> =
276
+ type TaskHandler<P = Record<string, unknown>> =
275
277
  (params: P, ctx: RunContext) => void | Promise<void>;
276
278
 
277
279
  interface RunContext {
278
280
  runId: string;
279
281
  task: string;
280
- log(level: 'debug' | 'info' | 'warning' | 'error', message: string): void;
282
+ log: RunLogger; // ctx.log.debug/info/warn/error/success(message)
281
283
  tx: Transaction; // transaction desta run — correlacionada e finalizada pelo SDK
282
284
  signal: AbortSignal;
283
285
  throwIfCanceled(): void; // lança RunCanceled se o signal já disparou
@@ -286,15 +288,15 @@ interface RunContext {
286
288
  ```
287
289
 
288
290
  - **`params`** — os dados do formulário configurado no app (JSON validado). Tipável: `Hobots.register<{ lote: number }>(...)`.
289
- - **`ctx.log.<level>(message)`** — logs enviados **incrementalmente** ao app (PATCHes com throttle), visíveis na run quase em tempo real; também impressos no terminal local, coloridos por nível.
290
- - **`ctx.tx`** — a transaction de performance desta run, já correlacionada e finalizada pelo SDK. Use `ctx.tx.startChild(op, description)` para medir as etapas — elas viram o waterfall da execução no app. Conceito: [ctx.tx](./docs/concepts.md#transaction-de-run-ctxtx).
291
+ - **`ctx.log.<level>(message)`** — níveis `debug`, `info`, `warn`, `error` e `success`; logs enviados **incrementalmente** ao app (PATCHes com throttle), visíveis na solicitação quase em tempo real; também impressos no terminal local, coloridos por nível.
292
+ - **`ctx.tx`** — a transaction de performance desta run, já correlacionada e finalizada pelo SDK. Use `ctx.tx.startChild(op, description)` para medir as etapas — elas viram o waterfall da execução no app. `startTransaction()` chamado dentro do handler retorna essa mesma transaction. Conceito: [ctx.tx](./docs/concepts.md#transaction-de-run-ctxtx).
291
293
  - **`ctx.signal`** — `AbortSignal` que dispara quando a run é **cancelada no app**, em **timeout** ou no **shutdown**.
292
294
  - **`ctx.throwIfCanceled()`** — o ponto de parada de uma linha; lança `RunCanceled` se o `signal` já disparou.
293
295
  - **`ctx.sleep(ms)`** — espera que respeita o `signal` (rejeita com `RunCanceled` em vez de dormir até o fim).
294
296
  - **Retorno** — **ignorado**: o SDK não captura nem envia o valor retornado pelo handler (resultados podem conter dados sensíveis e não são coletados).
295
297
  - **Erro lançado** — a run é reportada como `failed` (mensagem cap 10k, stack 20k).
296
298
 
297
- > **Dados sensíveis:** `ctx.log()` e mensagens/stack de erros **são enviados ao servidor** e ficam visíveis no app. Não inclua senhas, tokens, dados pessoais ou qualquer informação sensível em logs e mensagens de erro.
299
+ > **Dados sensíveis:** `ctx.log` e mensagens/stack de erros **são enviados ao servidor** e ficam visíveis no app. Não inclua senhas, tokens, dados pessoais ou qualquer informação sensível em logs e mensagens de erro.
298
300
 
299
301
  ### Cancelamento cooperativo
300
302
 
@@ -331,13 +333,13 @@ Ainda assim, escreva handlers **idempotentes**: a janela de re-entrega pós-clai
331
333
 
332
334
  ## Encerramento gracioso
333
335
 
334
- `close(timeoutMs?)` encerra tudo na ordem certa: para o Manager (aguardando a run atual), para o heartbeat e faz o flush final do transport.
336
+ `close(timeoutMs?)` encerra tudo na ordem certa: para o polling de tasks (aguardando a run atual), para o heartbeat e faz o flush final do transport.
335
337
 
336
338
  ```js
337
- // só Monitor: não segura o processo, mas faça o flush final para não perder eventos
339
+ // só telemetria: não segura o processo, mas faça o flush final para não perder eventos
338
340
  await Hobots.close(2_000);
339
341
 
340
- // com Manager: segura o processo por design — aguarde a run atual
342
+ // com tasks: segura o processo por design — aguarde a run atual
341
343
  process.on('SIGINT', () => {
342
344
  void Hobots.close(15_000).then(() => process.exit(0));
343
345
  });
@@ -351,40 +353,10 @@ Para parar de aceitar execuções **sem** derrubar a telemetria, use `stop(timeo
351
353
 
352
354
  | Import | Conteúdo |
353
355
  | --- | --- |
354
- | `hobots` | Tudo: `init`, Monitor (captura, transactions, crons, heartbeat), Manager (`register`/`start`/`stop`), `close`, classes e tipos. |
355
- | `hobots/protocol` | Tipos do wire format (Monitor e Manager). |
356
-
357
- Empacotado em **ESM e CommonJS** com **definições de tipos** (`.d.ts`) para todas as entradas. (`hobots/manager/protocol` segue existindo como alias transitório de tipos.)
358
-
359
- ---
360
-
361
- ## Migração da API antiga (`hobots/manager`)
362
-
363
- O Manager foi unificado no import raiz — `hobots/manager` **foi removido**:
364
-
365
- ```diff
366
- -import * as Monitor from 'hobots';
367
- -import * as Manager from 'hobots/manager';
368
- +import * as Hobots from 'hobots';
369
-
370
- -Monitor.init({ dsn, serverName: 'vm-01', heartbeat: true });
371
- -Manager.init({ dsn, agentName: 'vm-01' });
372
- +Hobots.init({ clientSecret, instanceId: 'vm-01', heartbeat: true, manager: true });
373
-
374
- -Manager.register('minha-task', handler);
375
- -Manager.start();
376
- +Hobots.register('minha-task', handler);
377
- +Hobots.start();
378
-
379
- -await Manager.stop(15_000);
380
- -await Monitor.close(3_000);
381
- +await Hobots.close(15_000);
382
- ```
356
+ | `hobots` | Tudo: `init`, telemetria (captura, transactions, crons, heartbeat), tasks (`register`/`start`/`stop`), `close`, classes e tipos. |
357
+ | `hobots/protocol` | Tipos do wire format (telemetria e tasks). |
383
358
 
384
- - A `dsn` (mecanismo antigo, `https://<secretKey>@host/<slug>`) não existe mais — passe `clientSecret` (em desenvolvimento, aponte para outro host com a env `HOBOTS_API_URL`). Copie o Client Secret em **Configurações → Projetos**.
385
- - `agentName` e `serverName` não existem mais — a identidade do agente é o `instanceId` (obrigatório, sem fallback).
386
- - As opções do Manager (`pollIntervalMs`, `concurrency`, `taskTimeoutMs`, `logFlushIntervalMs`, `cancelCheckIntervalMs`, `installExitHandlers`) vão no campo `manager` do `init()`; `clientSecret` e `debug` não se repetem.
387
- - Tipos (`ManagerTaskHandler`, `RunContext`, `ManagerOptions`) e classes (`ManagerAgent`, `ManagerApi`) agora vêm de `hobots`; o wire format vem de `hobots/protocol`.
359
+ Empacotado em **ESM e CommonJS** com **definições de tipos** (`.d.ts`) para todas as entradas.
388
360
 
389
361
  ---
390
362
 
@@ -395,9 +367,9 @@ Guias detalhados acompanham o pacote em [`docs/`](./docs/README.md).
395
367
  Novo no vocabulário de observabilidade (transaction, span, breadcrumb, tag, context, extra, flush, close)? Comece por [Conceitos](./docs/concepts.md) — as outras páginas assumem esses termos.
396
368
 
397
369
  - [Conceitos](./docs/concepts.md) — o que cada coisa é, por que existe e quando escolher uma em vez da outra.
398
- - [Getting started](./docs/getting-started.md) — instalação, Client Secret, primeiro `init`, Monitor e Manager.
399
- - [Monitor](./docs/monitor.md) — erros, breadcrumbs, escopo, transactions/spans, crons, heartbeat.
400
- - [Manager](./docs/manager.md) — handlers, `RunContext`, cancelamento, concorrência, idempotência.
370
+ - [Getting started](./docs/getting-started.md) — instalação, Client Secret, primeiro `init`, telemetria e tasks.
371
+ - [Telemetria](./docs/monitor.md) — erros, breadcrumbs, escopo, transactions/spans, crons, heartbeat.
372
+ - [Tasks](./docs/tasks.md) — handlers, `RunContext`, cancelamento, concorrência, idempotência.
401
373
  - [Referência de API](./docs/api-reference.md) — todas as funções e tabelas de opções com defaults.
402
374
  - [Protocolo & transporte](./docs/protocol.md) — o Client Secret, endpoints, envelope, retries.
403
375