hobots 0.3.1 → 1.1.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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +389 -0
  3. package/dist/index.cjs +1203 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +312 -0
  6. package/dist/index.d.ts +312 -0
  7. package/dist/index.js +1180 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/manager/protocol.cjs +19 -0
  10. package/dist/manager/protocol.cjs.map +1 -0
  11. package/dist/manager/protocol.d.cts +72 -0
  12. package/dist/manager/protocol.d.ts +72 -0
  13. package/dist/manager/protocol.js +1 -0
  14. package/dist/manager/protocol.js.map +1 -0
  15. package/dist/protocol.cjs +19 -0
  16. package/dist/protocol.cjs.map +1 -0
  17. package/dist/protocol.d.cts +129 -0
  18. package/dist/protocol.d.ts +129 -0
  19. package/dist/protocol.js +1 -0
  20. package/dist/protocol.js.map +1 -0
  21. package/docs/README.md +41 -0
  22. package/docs/api-reference.md +153 -0
  23. package/docs/getting-started.md +103 -0
  24. package/docs/manager.md +95 -0
  25. package/docs/monitor.md +138 -0
  26. package/docs/protocol.md +101 -0
  27. package/package.json +46 -3
  28. package/auth/index.d.ts +0 -10
  29. package/csv/index.d.ts +0 -9
  30. package/datasets/index.d.ts +0 -2
  31. package/db/drizzle.config.d.ts +0 -8
  32. package/db/index.d.ts +0 -9
  33. package/db/migrate.d.ts +0 -3
  34. package/db/schema.d.ts +0 -215
  35. package/db/storages/base.d.ts +0 -23
  36. package/db/storages/index.d.ts +0 -3
  37. package/db/storages/job.d.ts +0 -233
  38. package/exceptions/break.d.ts +0 -6
  39. package/exceptions/ignore.d.ts +0 -6
  40. package/exceptions/index.d.ts +0 -4
  41. package/exceptions/warning.d.ts +0 -6
  42. package/foreach/foreach.d.ts +0 -7
  43. package/foreach/index.d.ts +0 -5
  44. package/foreach/item.d.ts +0 -13
  45. package/hobots/samples/bot.d.ts +0 -2
  46. package/hobots/samples/index.d.ts +0 -2
  47. package/hobots/src/auth/index.d.ts +0 -10
  48. package/hobots/src/csv/index.d.ts +0 -9
  49. package/hobots/src/datasets/index.d.ts +0 -2
  50. package/hobots/src/db/drizzle.config.d.ts +0 -8
  51. package/hobots/src/db/index.d.ts +0 -9
  52. package/hobots/src/db/migrate.d.ts +0 -3
  53. package/hobots/src/db/schema.d.ts +0 -215
  54. package/hobots/src/db/storages/base.d.ts +0 -23
  55. package/hobots/src/db/storages/index.d.ts +0 -3
  56. package/hobots/src/db/storages/job.d.ts +0 -233
  57. package/hobots/src/exceptions/break.d.ts +0 -6
  58. package/hobots/src/exceptions/ignore.d.ts +0 -6
  59. package/hobots/src/exceptions/index.d.ts +0 -4
  60. package/hobots/src/exceptions/warning.d.ts +0 -6
  61. package/hobots/src/foreach/foreach.d.ts +0 -7
  62. package/hobots/src/foreach/index.d.ts +0 -5
  63. package/hobots/src/foreach/item.d.ts +0 -13
  64. package/hobots/src/index.d.ts +0 -9
  65. package/hobots/src/reports/data-report.d.ts +0 -9
  66. package/hobots/src/reports/index.d.ts +0 -3
  67. package/hobots/src/reports/job-report.d.ts +0 -22
  68. package/hobots/src/setup.d.ts +0 -20
  69. package/hobots/src/sheets/index.d.ts +0 -13
  70. package/hobots/src/types/hobots-types.d.ts +0 -20
  71. package/hobots/src/utils/date.d.ts +0 -117
  72. package/hobots/src/utils/dist.d.ts +0 -8
  73. package/hobots/src/utils/garbage.d.ts +0 -2
  74. package/hobots/src/utils/index.d.ts +0 -10
  75. package/hobots/src/utils/logger.d.ts +0 -21
  76. package/hobots/src/utils/manifest.d.ts +0 -2
  77. package/hobots/src/utils/path.d.ts +0 -13
  78. package/hobots/src/utils/publish.d.ts +0 -2
  79. package/hobots/src/utils/retry.d.ts +0 -5
  80. package/hobots/src/utils/text.d.ts +0 -74
  81. package/hobots/src/utils/timer.d.ts +0 -3
  82. package/index.d.ts +0 -9
  83. package/index.js +0 -131866
  84. package/index.js.map +0 -1
  85. package/reports/data-report.d.ts +0 -9
  86. package/reports/index.d.ts +0 -3
  87. package/reports/job-report.d.ts +0 -22
  88. package/setup.d.ts +0 -20
  89. package/sheets/index.d.ts +0 -13
  90. package/types/hobots-types.d.ts +0 -20
  91. package/utils/date.d.ts +0 -117
  92. package/utils/dist.d.ts +0 -8
  93. package/utils/garbage.d.ts +0 -2
  94. package/utils/index.d.ts +0 -10
  95. package/utils/logger.d.ts +0 -21
  96. package/utils/manifest.d.ts +0 -2
  97. package/utils/path.d.ts +0 -13
  98. package/utils/publish.d.ts +0 -2
  99. package/utils/retry.d.ts +0 -5
  100. package/utils/src/path.d.ts +0 -14
  101. package/utils/text.d.ts +0 -74
  102. package/utils/timer.d.ts +0 -3
@@ -0,0 +1,312 @@
1
+ import { Severity, EventPayload, Breadcrumb, EventUser, TransactionPayload, CheckInPayload, HeartbeatPayload, SpanData, CheckInStatus } from './protocol.js';
2
+ export { Envelope, EnvelopeItem, ExceptionData, StackFrame } from './protocol.js';
3
+ import { RunLogLevel, ManagerPollRequest, ManagerPollResponse, ManagerRunUpdateRequest } from './manager/protocol.js';
4
+ export { ManagerAgentInfo, ManagerRunDescriptor, ManagerRunError, ManagerRunStatus, ManagerRunUpdateResponse, ManagerRunUpdateStatus, RunLogEntry } from './manager/protocol.js';
5
+
6
+ /** Opções do Manager dentro de `init({ manager: ... })`. DSN, identidade (instanceId) e debug vêm do init. */
7
+ interface ManagerOptions {
8
+ /** Intervalo entre polls sem trabalho. Default: 5_000 (mínimo 1_000) */
9
+ pollIntervalMs?: number;
10
+ /** Runs simultâneas (1..5). Default: 1 (sequencial) */
11
+ concurrency?: number;
12
+ /**
13
+ * Timeout client-side por run. O handler não é morto — a run é reportada como
14
+ * falha e o slot é liberado. Default: sem timeout (o servidor é o backstop).
15
+ */
16
+ taskTimeoutMs?: number;
17
+ /** Intervalo do flush incremental de logs. Default: 2_000 */
18
+ logFlushIntervalMs?: number;
19
+ }
20
+ /** Opções resolvidas pelo init unificado e entregues ao ManagerAgent. */
21
+ interface ManagerAgentOptions extends ManagerOptions {
22
+ /** A DSN única do projeto — a mesma do Monitor */
23
+ dsn: string;
24
+ /** Identidade do agente no dashboard — o instanceId do init */
25
+ instanceId: string;
26
+ /** Loga atividade do SDK no console */
27
+ debug?: boolean;
28
+ }
29
+ interface RunContext {
30
+ runId: string;
31
+ task: string;
32
+ /** Log bufferizado — enviado ao servidor em PATCHes incrementais com throttle */
33
+ log(level: RunLogLevel, message: string): void;
34
+ /** Dispara em cancelamento (run cancelada no app), timeout ou shutdown — cancelamento cooperativo */
35
+ signal: AbortSignal;
36
+ }
37
+ /** O retorno do handler é ignorado — nada além de status/logs/erro é enviado ao servidor. */
38
+ type ManagerTaskHandler<P = Record<string, unknown>> = (params: P, ctx: RunContext) => void | Promise<void>;
39
+
40
+ interface HeartbeatOptions {
41
+ /** Intervalo entre batimentos. Default: 30_000 */
42
+ intervalMs?: number;
43
+ /** Nome amigável exibido no dashboard. Default: o instanceId do init */
44
+ name?: string;
45
+ metadata?: Record<string, unknown>;
46
+ }
47
+ interface InitOptions {
48
+ /** A DSN única do projeto — a mesma para Monitor e Manager. Ex.: https://<secretKey>@app.hobots.app/<projeto> */
49
+ dsn: string;
50
+ /** Default: 'production' */
51
+ environment?: string;
52
+ /** Versão do programa, ex.: 'robo-nfe@1.4.2' */
53
+ release?: string;
54
+ /** Identificador único e estável desta instância — a identidade do agente no painel (heartbeat do Monitor e agente do Manager convergem nele) */
55
+ instanceId: string;
56
+ /** Tags aplicadas a todos os eventos */
57
+ tags?: Record<string, string>;
58
+ /** Amostragem de eventos de erro (0..1). Default: 1 */
59
+ sampleRate?: number;
60
+ /** Amostragem de transactions (0..1). Default: 1 */
61
+ tracesSampleRate?: number;
62
+ /** Default: 100 */
63
+ maxBreadcrumbs?: number;
64
+ /** Registra handlers globais de erro (uncaughtException etc.). Default: true */
65
+ captureUnhandled?: boolean;
66
+ /** Habilita heartbeat periódico (true usa defaults) */
67
+ heartbeat?: boolean | HeartbeatOptions;
68
+ /**
69
+ * Habilita o agente Manager — execução remota de tarefas sob demanda (true usa defaults).
70
+ * Usa a mesma DSN e o instanceId como identidade. Depois de init(), chame register() e start().
71
+ */
72
+ manager?: boolean | ManagerOptions;
73
+ /** Última chance de editar/descartar um evento (retorne null para descartar) */
74
+ beforeSend?: (event: EventPayload) => EventPayload | null;
75
+ /** Loga atividade do SDK no console */
76
+ debug?: boolean;
77
+ /** Intervalo do flush automático do transport. Default: 2_000 */
78
+ flushIntervalMs?: number;
79
+ /** Itens por envelope antes de flush imediato. Default: 10 */
80
+ maxBatchSize?: number;
81
+ }
82
+ interface CaptureHint {
83
+ level?: Severity;
84
+ tags?: Record<string, string>;
85
+ extra?: Record<string, unknown>;
86
+ fingerprint?: string[];
87
+ }
88
+
89
+ interface ParsedDsn {
90
+ /** Chave secreta do projeto (enviada como Authorization: Bearer, nunca na URL) */
91
+ key: string;
92
+ /** Slug do projeto (informativo — a identidade real vem da chave) */
93
+ projectSlug: string;
94
+ origin: string;
95
+ /** Ingestão do Monitor: <origin>/api/ingest */
96
+ ingestEndpoint: string;
97
+ /** API do Manager: <origin>/api/manager */
98
+ managerBaseUrl: string;
99
+ }
100
+ /**
101
+ * A DSN única do projeto Hobots — a mesma para Monitor e Manager.
102
+ * Formato: https://<secretKey>@host[:porta]/<projectSlug>
103
+ */
104
+ declare function parseDsn(dsn: string): ParsedDsn;
105
+
106
+ type BreadcrumbInput = Omit<Breadcrumb, 'timestamp'> & {
107
+ timestamp?: string;
108
+ };
109
+ /** Estado contextual anexado aos eventos: tags, usuário, contexts, extras e breadcrumbs. */
110
+ declare class Scope {
111
+ tags: Record<string, string>;
112
+ user?: EventUser;
113
+ contexts: Record<string, Record<string, unknown>>;
114
+ extra: Record<string, unknown>;
115
+ level?: Severity;
116
+ fingerprint?: string[];
117
+ breadcrumbs: Breadcrumb[];
118
+ setTag(key: string, value: string): this;
119
+ setTags(tags: Record<string, string>): this;
120
+ setUser(user: EventUser | null): this;
121
+ setContext(name: string, context: Record<string, unknown> | null): this;
122
+ setExtra(key: string, value: unknown): this;
123
+ setExtras(extras: Record<string, unknown>): this;
124
+ setLevel(level: Severity): this;
125
+ setFingerprint(fingerprint: string[]): this;
126
+ addBreadcrumb(crumb: BreadcrumbInput, maxBreadcrumbs: number): this;
127
+ clearBreadcrumbs(): this;
128
+ clone(): Scope;
129
+ }
130
+
131
+ interface Logger {
132
+ debug: (...args: unknown[]) => void;
133
+ warn: (...args: unknown[]) => void;
134
+ error: (...args: unknown[]) => void;
135
+ }
136
+
137
+ declare class Client {
138
+ readonly options: InitOptions;
139
+ readonly dsn: ParsedDsn;
140
+ readonly logger: Logger;
141
+ private readonly transport;
142
+ constructor(options: InitOptions);
143
+ captureException(error: unknown, hint: CaptureHint | undefined, scope: Scope): string;
144
+ captureMessage(message: string, level: Severity, hint: CaptureHint | undefined, scope: Scope): string;
145
+ captureEvent(event: EventPayload, hint: CaptureHint | undefined, scope: Scope): string;
146
+ private prepareEvent;
147
+ sendTransaction(payload: TransactionPayload): void;
148
+ sendCheckIn(payload: CheckInPayload): void;
149
+ sendHeartbeat(payload: HeartbeatPayload): void;
150
+ flush(timeoutMs?: number): Promise<boolean>;
151
+ close(timeoutMs?: number): Promise<boolean>;
152
+ }
153
+
154
+ declare class Span {
155
+ private readonly transaction;
156
+ readonly parentSpanId: string;
157
+ readonly op?: string | undefined;
158
+ readonly description?: string | undefined;
159
+ readonly spanId: string;
160
+ readonly startTimestamp: string;
161
+ status: string;
162
+ endTimestamp?: string;
163
+ data?: Record<string, unknown>;
164
+ constructor(transaction: Transaction, parentSpanId: string, op?: string | undefined, description?: string | undefined);
165
+ setStatus(status: string): this;
166
+ setData(key: string, value: unknown): this;
167
+ /** Span aninhado (filho deste span). */
168
+ startChild(op?: string, description?: string): Span;
169
+ finish(): void;
170
+ toJSON(): SpanData;
171
+ }
172
+ /**
173
+ * Uma unidade de trabalho nomeada (ex.: uma execução de rotina, uma sincronização).
174
+ * Spans filhos medem as etapas internas (chamadas HTTP, queries, etc.).
175
+ */
176
+ declare class Transaction {
177
+ private readonly client;
178
+ name: string;
179
+ readonly op?: string | undefined;
180
+ private readonly sampled;
181
+ readonly eventId: string;
182
+ readonly spanId: string;
183
+ readonly startTimestamp: string;
184
+ status: string;
185
+ private readonly spans;
186
+ private readonly tags;
187
+ private finished;
188
+ constructor(client: Client | undefined, name: string, op?: string | undefined, sampled?: boolean);
189
+ createSpan(parentSpanId: string, op?: string, description?: string): Span;
190
+ /** Span direto da transaction. */
191
+ startChild(op?: string, description?: string): Span;
192
+ setTag(key: string, value: string): this;
193
+ setStatus(status: string): this;
194
+ setName(name: string): this;
195
+ finish(): void;
196
+ }
197
+
198
+ interface CheckInOptions {
199
+ monitorSlug: string;
200
+ status: CheckInStatus;
201
+ /** Reutilize o id retornado pelo check-in 'in_progress' para fechar a execução */
202
+ checkInId?: string;
203
+ durationMs?: number;
204
+ /** Expressão cron — cria/atualiza o monitor automaticamente no servidor */
205
+ schedule?: string;
206
+ timezone?: string;
207
+ }
208
+ interface WithMonitorOptions {
209
+ schedule?: string;
210
+ timezone?: string;
211
+ }
212
+
213
+ /** Inicializa o SDK. Chame uma vez, o mais cedo possível no programa. */
214
+ declare function init(options: InitOptions): void;
215
+ declare function getClient(): Client | undefined;
216
+ /** Captura uma exceção e retorna o event_id (undefined se o SDK não foi inicializado). */
217
+ declare function captureException(error: unknown, hint?: CaptureHint): string | undefined;
218
+ declare function captureMessage(message: string, level?: Severity, hint?: CaptureHint): string | undefined;
219
+ /** Registra um breadcrumb — anexado aos próximos eventos como trilha do que aconteceu antes. */
220
+ declare function addBreadcrumb(crumb: BreadcrumbInput): void;
221
+ declare function setTag(key: string, value: string): void;
222
+ declare function setTags(tags: Record<string, string>): void;
223
+ declare function setUser(user: EventUser | null): void;
224
+ declare function setContext(name: string, context: Record<string, unknown> | null): void;
225
+ declare function setExtra(key: string, value: unknown): void;
226
+ /** Executa o callback com uma cópia isolada do scope (alterações não vazam para fora). */
227
+ declare function withScope<T>(callback: (scope: Scope) => T): T;
228
+ /** Inicia uma transaction de performance. Chame .finish() para enviá-la. */
229
+ declare function startTransaction(name: string, op?: string): Transaction;
230
+ /** Check-in manual de um monitor cron. Retorna o check_in_id para fechar a execução depois. */
231
+ declare function checkIn(options: CheckInOptions): string | undefined;
232
+ /** Envolve um job monitorado: envia in_progress → ok/error com duração e captura a exceção em caso de falha. */
233
+ declare function withMonitor<T>(monitorSlug: string, fn: () => T | Promise<T>, options?: WithMonitorOptions): Promise<T>;
234
+ /** Aguarda o envio de tudo que está na fila (até timeoutMs). */
235
+ declare function flush(timeoutMs?: number): Promise<boolean>;
236
+ /** Registra o handler de uma task do Manager (o task_slug configurado no formulário do app). */
237
+ declare function register<P = Record<string, unknown>>(task: string, handler: ManagerTaskHandler<P>): void;
238
+ /**
239
+ * Inicia o polling do Manager. O timer NÃO é unref'd: o processo fica vivo
240
+ * aguardando trabalho até stop()/close() — o inverso deliberado do Monitor.
241
+ */
242
+ declare function start(): void;
243
+ /** Para só o Manager: encerra o polling e aguarda as runs ativas (até timeoutMs). A telemetria continua. */
244
+ declare function stop(timeoutMs?: number): Promise<boolean>;
245
+ /**
246
+ * Encerra tudo: para o Manager (aguardando runs em voo), o heartbeat e faz o
247
+ * flush final do transport. Chame antes do processo terminar.
248
+ */
249
+ declare function close(timeoutMs?: number): Promise<boolean>;
250
+
251
+ /**
252
+ * Loop de polling do Manager: busca runs pendentes, executa os handlers registrados
253
+ * e reporta status/logs/result. Ao contrário do Monitor, o timer de polling NÃO é
254
+ * unref'd — um agente iniciado mantém o processo vivo até stop().
255
+ */
256
+ declare class ManagerAgent {
257
+ private readonly options;
258
+ private readonly registry;
259
+ readonly logger: Logger;
260
+ private readonly api;
261
+ private readonly pollIntervalMs;
262
+ private readonly concurrency;
263
+ private readonly instanceId;
264
+ private readonly taskTimeoutMs?;
265
+ private readonly logFlushIntervalMs?;
266
+ private state;
267
+ private timer;
268
+ private pollAbort;
269
+ private consecutiveFailures;
270
+ private consecutiveAuthFailures;
271
+ private readonly activeRuns;
272
+ private readonly reporters;
273
+ constructor(options: ManagerAgentOptions, registry: Map<string, ManagerTaskHandler>);
274
+ get activeCount(): number;
275
+ start(): void;
276
+ /** Para o polling e aguarda as runs ativas (até timeoutMs). Retorna true se tudo terminou a tempo. */
277
+ stop(timeoutMs?: number): Promise<boolean>;
278
+ /** Timer intencionalmente NÃO unref'd: o agente é a razão do processo existir. */
279
+ private schedule;
280
+ private tick;
281
+ private delayAfterPollError;
282
+ private dispatch;
283
+ private executeRun;
284
+ private invokeWithTimeout;
285
+ }
286
+
287
+ declare class ManagerApiError extends Error {
288
+ readonly status: number;
289
+ constructor(message: string, status: number);
290
+ }
291
+ interface ManagerApiOptions {
292
+ baseUrl: string;
293
+ key: string;
294
+ logger: Logger;
295
+ }
296
+ /** Cliente HTTP do agente — bearer auth, retry com backoff nos updates. */
297
+ declare class ManagerApi {
298
+ private readonly baseUrl;
299
+ private readonly key;
300
+ private readonly logger;
301
+ constructor(options: ManagerApiOptions);
302
+ private headers;
303
+ /** Um request só — o loop de polling é quem decide o backoff entre tentativas. */
304
+ poll(request: ManagerPollRequest, signal?: AbortSignal): Promise<ManagerPollResponse>;
305
+ /**
306
+ * PATCH de status/logs com retry em falha de rede/5xx/429.
307
+ * 4xx é definitivo e vira ManagerApiError imediato (409 = run cancelada/transição inválida).
308
+ */
309
+ updateRun(runId: string, update: ManagerRunUpdateRequest): Promise<void>;
310
+ }
311
+
312
+ export { Breadcrumb, type BreadcrumbInput, type CaptureHint, type CheckInOptions, CheckInPayload, CheckInStatus, Client, EventPayload, EventUser, type HeartbeatOptions, HeartbeatPayload, type InitOptions, ManagerAgent, ManagerApi, ManagerApiError, type ManagerOptions, ManagerPollRequest, ManagerPollResponse, ManagerRunUpdateRequest, type ManagerTaskHandler, type ParsedDsn, type RunContext, RunLogLevel, Scope, Severity, Span, SpanData, Transaction, TransactionPayload, type WithMonitorOptions, addBreadcrumb, captureException, captureMessage, checkIn, close, flush, getClient, init, parseDsn, register, setContext, setExtra, setTag, setTags, setUser, start, startTransaction, stop, withMonitor, withScope };