@lexnode/legal-data-sdk 1.25.0 → 1.27.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
@@ -51,7 +51,7 @@ Toda chamada manda `Authorization: Bearer`, `X-Request-Id`, `X-Trace-Id` e,
51
51
  quando há um, `X-Office-Id`; respeita o prazo do cliente **combinado** com o
52
52
  `signal` de quem chamou; e devolve `{ data, meta }` tipados pela rota. O `meta`
53
53
  é o do contrato mais `status` (o código HTTP) e `rateLimit` (os cabeçalhos
54
- `RateLimit-*` / `Retry-After`, lidos **inclusive no sucesso**).
54
+ `RateLimit-*`, lidos **inclusive no sucesso**, e o `Retry-After` da recusa).
55
55
 
56
56
  Em `rateLimit`, use `remaining` para desacelerar: `resetSeconds` repete o que o
57
57
  cabeçalho `RateLimit-Reset` trouxe, e o motor lhe dá dois sentidos — segundos
@@ -194,6 +194,14 @@ switch (resultado.event.type) {
194
194
  break;
195
195
  case "PROCESS_MOVEMENT_CREATED":
196
196
  resultado.event.payload.externalRef;
197
+ resultado.event.payload.degree; // o grau do movimento mais recente
198
+ break;
199
+ case "PROCESS_INSTANCE_DISCOVERED":
200
+ // Outro grau do processo apareceu na fonte; o histórico dele está no
201
+ // retrato, em `instances`. O processo retido vem sem o grau.
202
+ if (!resultado.event.payload.contentWithheld) {
203
+ resultado.event.payload.degree;
204
+ }
197
205
  break;
198
206
  case "SEARCH_JOB_COMPLETED":
199
207
  if (resultado.event.payload.status === "FAILED") {
@@ -256,13 +264,101 @@ if (desfecho.kind === "sync") {
256
264
  }
257
265
  ```
258
266
 
267
+ ## Um número, várias instâncias
268
+
269
+ A fonte processual guarda um documento por instância do processo — 1º grau, 2º
270
+ grau, turma recursal… —, às vezes dois do mesmo grau, e o motor guarda cada um
271
+ na sua instância.
272
+
273
+ **O topo não troca.** O topo da ficha (`data`) e do retrato (`data.process` e
274
+ `data.movements`) é sempre a instância principal do número, com o grau em
275
+ `degree`: a mesma de uma leitura para a outra, qualquer que seja a ordem em que
276
+ a fonte devolve os documentos. Ela só muda quando uma resposta completa da
277
+ fonte pelo número deixa de trazê-la. Quem compara movimentos pela chave não vê
278
+ o histórico de outro grau aparecer como novo no topo — e o topo pode não ser o
279
+ grau que anda: o 2º grau guardado primeiro continua no topo enquanto o 1º se
280
+ move.
281
+
282
+ **Todos os graus em `instances`.** A ficha e o retrato listam em `instances`
283
+ todos os documentos que o motor guarda do número, a principal primeiro
284
+ (`primary: true`). Cada um diz de onde veio nesta resposta (`origin`: `SOURCE`
285
+ quando a fonte o trouxe, `LAKE` quando saiu do acervo), quando foi buscado
286
+ (`fetchedAt`) e desde quando a resposta completa da fonte vem sem ele
287
+ (`absentSince`). No retrato, cada instância traz os movimentos da última captura
288
+ dela, do mais recente ao mais antigo e sem o payload bruto da fonte; a que o
289
+ motor nunca capturou vem com `movementsCaptured: false` e `movements` nulo, nunca
290
+ com lista vazia, que diria que o grau não andou. Todos os documentos levam a
291
+ classificação do número inteiro — basta um em segredo de justiça para todos
292
+ saírem marcados —, e a ficha retida pelo controle de confidencialidade sai sem a
293
+ lista.
294
+
295
+ ```ts
296
+ const { data } = await lexnode.processes.snapshot(numero, { tribunalAlias });
297
+
298
+ for (const instancia of data.instances) {
299
+ instancia.degree; // "G1", "G2", "TR"…
300
+ instancia.primary; // true só na do topo
301
+ instancia.movements ?? "movimentos nunca capturados";
302
+ }
303
+ ```
304
+
305
+ No lote (`processes.snapshotBatch`), `instances` traz só o cabeçalho de cada
306
+ documento; os movimentos de cada instância vêm no retrato de um processo. A
307
+ busca por número completo servida do acervo devolve um item por documento que a
308
+ fonte ainda traz do número, a principal primeiro; quando eles não cabem em
309
+ `limit`, a busca vai à fonte, que pagina.
310
+
311
+ **Recorte por grau.** A lista de movimentações aceita `degree` e devolve só os
312
+ movimentos que o documento daquele grau trouxe na última captura; cada item diz
313
+ em `degrees` o grau — ou os graus, quando o mesmo ato está nos dois documentos
314
+ — que o trouxe, e vem vazio no movimento que nenhuma captura atual traz.
315
+
316
+ ```ts
317
+ const { data } = await lexnode.processes.movements(numero, {
318
+ tribunalAlias,
319
+ degree: "G1",
320
+ });
321
+ data.items; // só o que o 1º grau trouxe
322
+ ```
323
+
324
+ **O grau novo chega num evento só.** Quando outro grau de um processo assinado
325
+ aparece na fonte, o histórico dele entra no acervo sem virar
326
+ `PROCESS_MOVEMENT_CREATED` movimento a movimento: chega um
327
+ `PROCESS_INSTANCE_DISCOVERED`, com o grau, o órgão julgador e as contagens —
328
+ `historyMovementCount` entrou sem aviso próprio, `announcedMovementCount` saiu
329
+ também como movimento novo. O `PROCESS_MOVEMENT_CREATED` diz o grau do
330
+ movimento mais recente (`degree`, `instanceSourceId`) e quantos movimentos novos
331
+ vieram de cada grau (`instances`). Assine os dois: quem assina só o movimento
332
+ não fica sabendo do grau que apareceu.
333
+
334
+ **`meta.otherInstances`: o resumo do que veio.** Quando a resposta da fonte traz
335
+ outros documentos do número além da principal, `meta.otherInstances` resume cada
336
+ um com o grau (`grau`), a data em que a fonte o atualizou (`updatedAt`) e o
337
+ órgão julgador (`courtBody`, quando vem). A lista não sai para processo restrito
338
+ e não inclui documento que o motor classificaria como segredo de justiça; os
339
+ documentos inteiros estão em `instances`.
340
+
341
+ ```ts
342
+ for (const outra of meta.otherInstances ?? []) {
343
+ // Ex.: { grau: "G1", updatedAt: "2026-04-15T12:00:00.000Z" }
344
+ }
345
+ ```
346
+
347
+ **Continuação.** Na API nada é cortado: o retrato traz os movimentos guardados
348
+ de cada instância, e a lista de movimentações lê do acervo, grau a grau, sem ir
349
+ à fonte. No canal para agentes (MCP), `consultar_processo` cabe no teto de uma
350
+ resposta: de cada grau vêm os movimentos mais recentes, o grau que se moveu por
351
+ último primeiro, e a mesma tool com `grau` e `pagina` traz os seguintes do que o
352
+ motor guardou, por 1 crédito e sem ir à fonte — só para quem já leu o processo
353
+ ou o acompanha.
354
+
259
355
  ## Ler um processo quando a fonte está lenta
260
356
 
261
357
  A ficha (`processes.get`) vai à fonte processual quando o acervo não tem o
262
- processo fresco; o retrato (`processes.snapshot`) vai sempre, e só recorre ao
263
- acervo quando a fonte falha. A fonte às vezes leva perto de um minuto por
264
- consulta. `waitSeconds` diz quanto o motor espera por ela: de 10 a 180
265
- segundos, padrão 20 na API.
358
+ processo fresco; o retrato (`processes.snapshot`) vai sempre. Os dois só
359
+ recorrem ao acervo quando a fonte falha (seção seguinte). A fonte às vezes leva
360
+ perto de um minuto por consulta. `waitSeconds` diz quanto o motor espera por
361
+ ela: de 10 a 180 segundos, padrão 20 na API.
266
362
 
267
363
  ```ts
268
364
  const { data, meta } = await lexnode.processes.get(numero, {
@@ -290,15 +386,15 @@ ou a vigília do processo (`watchProcess`), que consulta em segundo plano.
290
386
  responde com só parte do índice e o processo estava na parte que respondeu, ele
291
387
  é servido, e `meta.partialIndex` diz quantas partes falharam (`shardsFailed`),
292
388
  de quantas (`shardsTotal`, nulo quando a fonte não as contou) e se o prazo
293
- interno dela estourou (`timedOut`). O processo servido é o que a fonte tem, mas
294
- outra instância do mesmo número — outro grau — pode estar na parte que não
295
- respondeu. A resposta parcial que não serve o processo — sem ele, ou com uma
296
- instância diferente da que o acervo já guarda — é 502 `UPSTREAM_UNAVAILABLE`
389
+ interno dela estourou (`timedOut`). O documento que o acervo já guardava e não
390
+ veio sai em `instances` do acervo (`origin: "LAKE"`), com a data dele, e outro
391
+ grau que o acervo não conhece, se existir, pode estar na parte que não
392
+ respondeu. A resposta parcial sem o processo é 502 `UPSTREAM_UNAVAILABLE`
297
393
  retentável, nunca 404.
298
394
 
299
395
  ```ts
300
396
  if (meta.partialIndex) {
301
- // Outro grau deste número, se existir, pode não ter vindo.
397
+ // Outro grau deste número que o acervo não conhece pode não ter vindo.
302
398
  }
303
399
  ```
304
400
 
@@ -306,24 +402,74 @@ Antes de recusar a resposta parcial que veio sem o processo porque partes do
306
402
  índice ficaram fora, o motor consulta a fonte de novo — até duas vezes, com uma
307
403
  pausa curta, enquanto a espera couber.
308
404
 
309
- **`meta.otherInstances`: o número tem outro documento na fonte.** A fonte pode
310
- guardar mais de um documento por número — em geral um por instância (1º grau,
311
- 2º grau, turma recursal…), às vezes dois no mesmo grau —, e o motor serve e
312
- guarda um só: o de `data`, cujo grau está em `degree`. Quando a resposta da
313
- fonte trouxe outros, `meta.otherInstances` lista cada um com o grau (`grau`), a
314
- data em que a fonte o atualizou (`updatedAt`) e o órgão julgador (`courtBody`,
315
- quando vem). A lista não sai para processo restrito e não inclui documento que o
316
- motor classificaria como segredo de justiça.
405
+ **Agentes têm a espera deles.** No canal para agentes (MCP), as tools
406
+ `ler_processo` e `consultar_processo` escolhem a espera em `maxWaitSeconds`, na
407
+ mesma faixa e com padrão de 120 s; esse canal não passa pelo SDK.
408
+
409
+ ## Quando a fonte falha: o retrato guardado
410
+
411
+ Quando a fonte processual falha — não responde dentro de `waitSeconds`, fica
412
+ indisponível, responde com parte do índice sem poder servir o processo ou pede
413
+ para esperar por volume — e o acervo guarda uma cópia do processo, a ficha
414
+ (`processes.get`) e o retrato (`processes.snapshot`) respondem com essa cópia em
415
+ vez do erro. A resposta diz que é cópia, e de quando:
416
+
417
+ - `meta.lakeRescue.cause` diz por que a fonte não entregou: `UPSTREAM_TIMEOUT`,
418
+ `UPSTREAM_UNAVAILABLE` ou `UPSTREAM_RATE_LIMITED`;
419
+ - `meta.lakeRescue.retryAfterSeconds`, repetido no header `Retry-After`, diz na
420
+ recusa por volume quanto esperar antes de consultar a fonte de novo. É a
421
+ espera da fonte, não do teto do motor: `meta.rateLimit.retryAfterSeconds`
422
+ fica `null` no sucesso;
423
+ - `meta.sourceFetchedAt` diz quando a cópia foi buscada na fonte. Esse campo
424
+ acompanha toda resposta das duas leituras, socorrida ou não, menos a ficha
425
+ que o controle de confidencialidade entrega retida, sem o teor.
426
+
427
+ A cópia custa 1 crédito, na ficha e no retrato. O retrato confere o saldo pelo
428
+ preço cheio, 8, antes de ir à fonte; a ficha confere pelo preço do que
429
+ entregou, depois da leitura. No retrato guardado, cada instância traz os
430
+ movimentos da última vez que o motor a buscou, com a data em
431
+ `instances[].fetchedAt`, e `sourcePayload` é nulo: o que andou depois dessas
432
+ datas não está na resposta. O número que a resposta completa mais recente da
433
+ fonte já não trazia em documento nenhum não é socorrido. Na ficha guardada, a
434
+ data vale para os dados do processo, e o resumo das publicações (`djen`) é
435
+ relido na hora.
436
+
437
+ **Até que idade.** Sem pedir nada, só a cópia de até 24 h socorre a leitura —
438
+ nessas duas rotas, uma resposta de sucesso já podia ser cópia do acervo dentro
439
+ desse prazo. A cópia de qualquer idade vem com `staleOnFailure: true`:
317
440
 
318
441
  ```ts
319
- for (const outra of meta.otherInstances ?? []) {
320
- // Ex.: { grau: "G1", updatedAt: "2026-04-15T12:00:00.000Z" }
442
+ import { describeFreshness, lakeRescueOf } from "@lexnode/legal-data-sdk";
443
+
444
+ const retrato = await lexnode.processes.snapshot(numero, {
445
+ tribunalAlias: "api_publica_tjsp",
446
+ staleOnFailure: true,
447
+ });
448
+
449
+ const socorro = lakeRescueOf(retrato);
450
+ if (socorro) {
451
+ // A fonte falhou e isto é a cópia guardada: o que andou depois de
452
+ // socorro.sourceFetchedAt não está aqui.
453
+ mostrar(describeFreshness(retrato));
454
+ // "cópia guardada em 26/09/2026, servida porque a fonte não respondeu a tempo"
321
455
  }
322
456
  ```
323
457
 
324
- **Agentes têm a espera deles.** No canal para agentes (MCP), as tools
325
- `ler_processo` e `consultar_processo` escolhem a espera em `maxWaitSeconds`, na
326
- mesma faixa e com padrão de 120 s; esse canal não passa pelo SDK.
458
+ `lakeRescueOf` devolve `{ cause, sourceFetchedAt, retryAfterSeconds }` ou
459
+ `null` — `sourceFetchedAt` é nulo na ficha retida —, e `sourceFetchedAtOf`
460
+ devolve a data de qualquer resposta dessas leituras. As duas aceitam o envelope
461
+ inteiro e o item do lote.
462
+
463
+ **O que não é socorrido.** A resposta da fonte que não traz o processo segue
464
+ 404 `PROCESS_NOT_FOUND`, com cópia guardada ou sem ela: é a fonte dizendo que
465
+ não tem o número, e não uma falha dela. A cópia passa pelo mesmo controle de
466
+ confidencialidade da leitura; além de 24 h, só a recebe quem já tem interesse
467
+ registrado no processo — de uma leitura anterior dele ou de uma assinatura
468
+ ativa —, e os demais recebem a falha da fonte, como se não houvesse cópia.
469
+
470
+ **No lote.** `processes.snapshotBatch` socorre só com a cópia de até 24 h. O
471
+ item socorrido traz `lakeRescue` com a causa e a data, e custa 1 crédito em vez
472
+ de 8.
327
473
 
328
474
  ## Frescor: o `total: 0` qualificado
329
475
 
package/dist/client.js CHANGED
@@ -66,12 +66,16 @@ function readHeaderNumber(headers, name) {
66
66
  /**
67
67
  * O teto por minuto sai em TODA resposta autenticada, não só na recusa. Lê-lo
68
68
  * no sucesso é o que permite ao consumidor desacelerar ANTES de bater no 429.
69
+ * O `Retry-After` só conta na recusa: no sucesso ele é a espera que a fonte
70
+ * pediu a uma leitura socorrida pelo acervo, e sai em `meta.lakeRescue`.
69
71
  */
70
- function readRateLimit(headers) {
72
+ function readRateLimit(headers, succeeded) {
71
73
  const limit = readHeaderNumber(headers, "RateLimit-Limit");
72
74
  const remaining = readHeaderNumber(headers, "RateLimit-Remaining");
73
75
  const resetSeconds = readHeaderNumber(headers, "RateLimit-Reset");
74
- const retryAfterSeconds = readHeaderNumber(headers, "Retry-After");
76
+ const retryAfterSeconds = succeeded
77
+ ? null
78
+ : readHeaderNumber(headers, "Retry-After");
75
79
  if (limit === null &&
76
80
  remaining === null &&
77
81
  resetSeconds === null &&
@@ -272,7 +276,7 @@ export function createLexNodeClient(options) {
272
276
  // corpo de outro host como se fosse a resposta do motor.
273
277
  redirect: "error",
274
278
  });
275
- rateLimit = readRateLimit(response.headers);
279
+ rateLimit = readRateLimit(response.headers, response.ok);
276
280
  // A leitura do corpo fica DENTRO do prazo: um corpo que trava depois dos
277
281
  // cabeçalhos pendura a chamada por tempo indefinido se o vínculo já tiver
278
282
  // sido desfeito aqui.
@@ -7,6 +7,10 @@
7
7
  * publica a data-limite do índice em dois eixos — `updatedThrough` na busca de
8
8
  * processo, `lastEditionDate` na leitura do diário — e este módulo é a leitura
9
9
  * dos dois pelo mesmo nome.
10
+ *
11
+ * A leitura de UM processo diz também de quando são os dados servidos
12
+ * (`meta.sourceFetchedAt`) e, quando a fonte falhou e o acervo socorreu, que a
13
+ * resposta é a cópia guardada (`meta.lakeRescue`).
10
14
  */
11
15
  export type FreshnessAxis = "PROCESS" | "PUBLICATION";
12
16
  export type FreshnessState =
@@ -44,5 +48,40 @@ export interface NotYetIndexedOptions {
44
48
  * data-limite que cobre o que se perguntou: aí o vazio é resposta.
45
49
  */
46
50
  export declare function isNotYetIndexed(result: unknown, options?: NotYetIndexedOptions): boolean;
47
- /** Uma frase em pt-BR sobre o alcance da fonte, pronta para a tela. */
51
+ /** Por que a fonte não entregou o processo que o acervo socorreu. */
52
+ export type LakeRescueCause = "UPSTREAM_TIMEOUT" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_RATE_LIMITED";
53
+ /**
54
+ * A leitura de UM processo cuja fonte falhou e que o motor serviu com a cópia
55
+ * que o acervo guarda.
56
+ */
57
+ export interface LakeRescue {
58
+ /**
59
+ * A causa, pelo código público da taxonomia. Valor novo pode entrar no
60
+ * contrato; trate o desconhecido como "a fonte falhou".
61
+ */
62
+ cause: LakeRescueCause | (string & {});
63
+ /**
64
+ * Quando a cópia servida foi buscada na fonte; nulo na ficha que o controle
65
+ * de confidencialidade entrega retida, que sai sem a data.
66
+ */
67
+ sourceFetchedAt: Date | null;
68
+ /** A espera que a fonte pediu, na recusa por volume. */
69
+ retryAfterSeconds: number | null;
70
+ }
71
+ /**
72
+ * O socorro pelo acervo, ou `null` quando a resposta veio da fonte ou do
73
+ * acervo em dia. Aceita o envelope inteiro (`{ data, meta }`) ou o item do
74
+ * lote de retratos; só o `data` não traz a marca.
75
+ */
76
+ export declare function lakeRescueOf(result: unknown): LakeRescue | null;
77
+ /**
78
+ * Quando os dados servidos foram buscados na fonte: `meta.sourceFetchedAt` das
79
+ * leituras de um processo, ou a data do item socorrido do lote.
80
+ */
81
+ export declare function sourceFetchedAtOf(result: unknown): Date | null;
82
+ /**
83
+ * Uma frase em pt-BR sobre o frescor da resposta, pronta para a tela: a cópia
84
+ * guardada e o porquê, quando o acervo socorreu a fonte; senão, até onde a
85
+ * fonte foi lida.
86
+ */
48
87
  export declare function describeFreshness(result: unknown): string;
package/dist/freshness.js CHANGED
@@ -7,6 +7,10 @@
7
7
  * publica a data-limite do índice em dois eixos — `updatedThrough` na busca de
8
8
  * processo, `lastEditionDate` na leitura do diário — e este módulo é a leitura
9
9
  * dos dois pelo mesmo nome.
10
+ *
11
+ * A leitura de UM processo diz também de quando são os dados servidos
12
+ * (`meta.sourceFetchedAt`) e, quando a fonte falhou e o acervo socorreu, que a
13
+ * resposta é a cópia guardada (`meta.lakeRescue`).
10
14
  */
11
15
  function asRecord(value) {
12
16
  return value && typeof value === "object" && !Array.isArray(value)
@@ -96,8 +100,88 @@ function ddmmaaaa(date) {
96
100
  const mes = String(date.getUTCMonth() + 1).padStart(2, "0");
97
101
  return `${dia}/${mes}/${date.getUTCFullYear()}`;
98
102
  }
99
- /** Uma frase em pt-BR sobre o alcance da fonte, pronta para a tela. */
103
+ function toInstant(value) {
104
+ if (value instanceof Date) {
105
+ return Number.isNaN(value.getTime()) ? null : value;
106
+ }
107
+ return toDate(value);
108
+ }
109
+ /**
110
+ * A marca do socorro e a data da cópia, onde quer que elas venham: no `meta`
111
+ * do envelope das leituras de um processo, ou no item do lote de retratos,
112
+ * que leva as duas em `lakeRescue`.
113
+ */
114
+ function rescueFieldsOf(result) {
115
+ const record = asRecord(result);
116
+ const meta = asRecord(record?.meta);
117
+ if (meta) {
118
+ return {
119
+ rescue: asRecord(meta.lakeRescue),
120
+ fetchedAt: meta.sourceFetchedAt,
121
+ };
122
+ }
123
+ const itemRescue = asRecord(record?.lakeRescue);
124
+ return { rescue: itemRescue, fetchedAt: itemRescue?.sourceFetchedAt };
125
+ }
126
+ /**
127
+ * O socorro pelo acervo, ou `null` quando a resposta veio da fonte ou do
128
+ * acervo em dia. Aceita o envelope inteiro (`{ data, meta }`) ou o item do
129
+ * lote de retratos; só o `data` não traz a marca.
130
+ */
131
+ export function lakeRescueOf(result) {
132
+ const { rescue, fetchedAt } = rescueFieldsOf(result);
133
+ if (!rescue || typeof rescue.cause !== "string")
134
+ return null;
135
+ return {
136
+ cause: rescue.cause,
137
+ sourceFetchedAt: toInstant(fetchedAt),
138
+ retryAfterSeconds: typeof rescue.retryAfterSeconds === "number"
139
+ ? rescue.retryAfterSeconds
140
+ : null,
141
+ };
142
+ }
143
+ /**
144
+ * Quando os dados servidos foram buscados na fonte: `meta.sourceFetchedAt` das
145
+ * leituras de um processo, ou a data do item socorrido do lote.
146
+ */
147
+ export function sourceFetchedAtOf(result) {
148
+ return toInstant(rescueFieldsOf(result).fetchedAt);
149
+ }
150
+ const BRASILIA_DATE = new Intl.DateTimeFormat("pt-BR", {
151
+ day: "2-digit",
152
+ month: "2-digit",
153
+ year: "numeric",
154
+ timeZone: "America/Sao_Paulo",
155
+ });
156
+ /** O dia de um instante no horário de Brasília, montado pelas partes. */
157
+ function ddmmaaaaBrasilia(date) {
158
+ const parts = Object.fromEntries(BRASILIA_DATE.formatToParts(date).map((part) => [part.type, part.value]));
159
+ return `${parts.day}/${parts.month}/${parts.year}`;
160
+ }
161
+ const RESCUE_REASON = {
162
+ UPSTREAM_TIMEOUT: "não respondeu a tempo",
163
+ UPSTREAM_UNAVAILABLE: "não conseguiu entregar o processo",
164
+ UPSTREAM_RATE_LIMITED: "pediu para esperar por volume",
165
+ };
166
+ function rescueReason(cause) {
167
+ return cause in RESCUE_REASON
168
+ ? RESCUE_REASON[cause]
169
+ : "falhou";
170
+ }
171
+ /**
172
+ * Uma frase em pt-BR sobre o frescor da resposta, pronta para a tela: a cópia
173
+ * guardada e o porquê, quando o acervo socorreu a fonte; senão, até onde a
174
+ * fonte foi lida.
175
+ */
100
176
  export function describeFreshness(result) {
177
+ const rescue = lakeRescueOf(result);
178
+ if (rescue) {
179
+ const date = rescue.sourceFetchedAt
180
+ ? ` em ${ddmmaaaaBrasilia(rescue.sourceFetchedAt)}`
181
+ : "";
182
+ const reason = rescueReason(rescue.cause);
183
+ return `cópia guardada${date}, servida porque a fonte ${reason}`;
184
+ }
101
185
  const { readThrough: limite } = freshnessOf(result);
102
186
  return limite
103
187
  ? `fonte lida até ${ddmmaaaa(limite)}`
package/dist/index.d.ts CHANGED
@@ -15,12 +15,12 @@ export { LEXNODE_ERROR_CODES, LexNodeError, isLexNodeError } from "./errors.js";
15
15
  export type { LexNodeErrorClass, LexNodeErrorCode, LexNodeErrorInit, } from "./errors.js";
16
16
  export type { Body, CallOptions, Data, HttpMethod, LexNodeResult, Meta, MetaExtras, MethodOf, Operation, PathParams, Query, RateLimitSnapshot, RequestArgs, RetryPolicy, } from "./types.js";
17
17
  export { DEFAULT_WEBHOOK_TOLERANCE_SECONDS, LEXNODE_WEBHOOK_HEADERS, WEBHOOK_EVENT_TYPES, WEBHOOK_TEST_EVENT_TYPE, isKnownWebhookEventType, isReceiverFault, isWebhookTest, parseWebhookEvent, verifyWebhookSignature, webhookRejectionStatus, } from "./webhooks.js";
18
- export type { MonitorSyncFailedPayload, MonitorSyncSucceededPayload, PeriodEndingPayload, ProcessMovementCreatedPayload, ProcessSourceIndex, PublicationCreatedPayload, PublicationHarvestCompletedPayload, PublicationTextAlertMatch, PublicationTextAlertMatchedPayload, QuotaLowPayload, SubscribableWebhookEventType, SearchJobFailedPayload, SearchJobSucceededPayload, SubscriptionPastDuePayload, SuspensionSignal, UnknownWebhookEvent, VerifyWebhookOptions, WebhookEvent, WebhookEventEnvelope, WebhookEventType, WebhookHeaders, WebhookParseRejection, WebhookParseResult, WebhookRawBody, WebhookRejection, WebhookTestPayload, WebhookVerification, } from "./webhooks.js";
18
+ export type { MonitorSyncFailedPayload, MonitorSyncInstance, MonitorSyncSucceededPayload, PeriodEndingPayload, ProcessInstanceDiscoveredPayload, ProcessInstanceDiscoveredWithheldPayload, ProcessMovementCreatedPayload, ProcessMovementInstanceCount, ProcessSourceIndex, PublicationCreatedPayload, PublicationHarvestCompletedPayload, PublicationTextAlertMatch, PublicationTextAlertMatchedPayload, QuotaLowPayload, SubscribableWebhookEventType, SearchJobFailedPayload, SearchJobSucceededPayload, SubscriptionPastDuePayload, SuspensionSignal, UnknownWebhookEvent, VerifyWebhookOptions, WebhookEvent, WebhookEventEnvelope, WebhookEventType, WebhookHeaders, WebhookParseRejection, WebhookParseResult, WebhookRawBody, WebhookRejection, WebhookTestPayload, WebhookVerification, } from "./webhooks.js";
19
19
  export { paginate } from "./paginate.js";
20
20
  export type { PaginateOptions } from "./paginate.js";
21
21
  export { searchProcesses, waitForSearchJob } from "./search.js";
22
22
  export type { ProcessSearchOutcome, ProcessSearchResult, QueuedSearchJob, SearchJob, SearchJobState, WaitForSearchJobOptions, } from "./search.js";
23
- export { describeFreshness, freshnessOf, isNotYetIndexed, readThrough, } from "./freshness.js";
24
- export type { Freshness, FreshnessAxis, FreshnessState, NotYetIndexedOptions, } from "./freshness.js";
23
+ export { describeFreshness, freshnessOf, isNotYetIndexed, lakeRescueOf, readThrough, sourceFetchedAtOf, } from "./freshness.js";
24
+ export type { Freshness, FreshnessAxis, FreshnessState, LakeRescue, LakeRescueCause, NotYetIndexedOptions, } from "./freshness.js";
25
25
  export { isFirstAppearance, resubscribeOnFirstAppearance, unwatchProcess, watchProcess, } from "./watch.js";
26
26
  export type { FirstAppearanceEvent, ResubscribeSubscriber, UnwatchProcessInput, WatchProcessInput, WatchProcessResult, } from "./watch.js";
package/dist/index.js CHANGED
@@ -13,5 +13,5 @@ export { LEXNODE_ERROR_CODES, LexNodeError, isLexNodeError } from "./errors.js";
13
13
  export { DEFAULT_WEBHOOK_TOLERANCE_SECONDS, LEXNODE_WEBHOOK_HEADERS, WEBHOOK_EVENT_TYPES, WEBHOOK_TEST_EVENT_TYPE, isKnownWebhookEventType, isReceiverFault, isWebhookTest, parseWebhookEvent, verifyWebhookSignature, webhookRejectionStatus, } from "./webhooks.js";
14
14
  export { paginate } from "./paginate.js";
15
15
  export { searchProcesses, waitForSearchJob } from "./search.js";
16
- export { describeFreshness, freshnessOf, isNotYetIndexed, readThrough, } from "./freshness.js";
16
+ export { describeFreshness, freshnessOf, isNotYetIndexed, lakeRescueOf, readThrough, sourceFetchedAtOf, } from "./freshness.js";
17
17
  export { isFirstAppearance, resubscribeOnFirstAppearance, unwatchProcess, watchProcess, } from "./watch.js";
package/dist/types.d.ts CHANGED
@@ -89,7 +89,11 @@ export interface RateLimitSnapshot {
89
89
  * dormir a janela inteira — para desacelerar, olhe `remaining`.
90
90
  */
91
91
  resetSeconds: number | null;
92
- /** O `Retry-After` da recusa, quando houve. */
92
+ /**
93
+ * O `Retry-After` da recusa, quando houve; `null` em todo sucesso. A espera
94
+ * que a fonte pediu a uma leitura socorrida pelo acervo sai em
95
+ * `meta.lakeRescue.retryAfterSeconds`.
96
+ */
93
97
  retryAfterSeconds: number | null;
94
98
  }
95
99
  /**
@@ -83,6 +83,19 @@ export interface ProcessSourceIndex {
83
83
  updatedThrough: string | null;
84
84
  checkedAt: string;
85
85
  }
86
+ /** Quantos movimentos novos de um grau a captura anunciou. */
87
+ export interface ProcessMovementInstanceCount {
88
+ /** A sigla do grau (G1, G2, JE, TR…); nula quando a fonte não a declara. */
89
+ degree: string | null;
90
+ newMovementCount: number;
91
+ /** A chave do movimento novo mais recente deste grau. */
92
+ latestMovementKey: string;
93
+ }
94
+ /**
95
+ * Um aviso por assinante e por captura do processo, descrito pelo movimento
96
+ * novo mais recente: o topo do payload é dele, e a chave dele é
97
+ * `latestMovementKey`.
98
+ */
86
99
  export interface ProcessMovementCreatedPayload {
87
100
  canonicalProcessId: string;
88
101
  tribunalAlias: string;
@@ -99,12 +112,82 @@ export interface ProcessMovementCreatedPayload {
99
112
  */
100
113
  latestMovementCode?: number | null;
101
114
  latestMovementLabel?: string | null;
115
+ /**
116
+ * O grau do movimento mais recente e o documento da fonte que o trouxe — o
117
+ * `sourceId` da instância na leitura do processo. Ausentes quando o processo
118
+ * não é compartilhável.
119
+ */
120
+ degree?: string | null;
121
+ instanceSourceId?: string | null;
122
+ /**
123
+ * Quantos movimentos novos vieram de cada grau nesta captura, o grau do mais
124
+ * recente primeiro. Ausente quando o processo não é compartilhável.
125
+ */
126
+ instances?: ProcessMovementInstanceCount[];
102
127
  /**
103
128
  * Presente quando o processo não é compartilhável: o aviso diz que ele andou
104
- * e não diz o quê, porque ali o nome do ato é teor.
129
+ * e não diz o quê nem em que grau, porque ali o nome do ato é teor.
105
130
  */
106
131
  contentWithheld?: true;
107
132
  }
133
+ /**
134
+ * Outro grau de um processo assinado apareceu na fonte (1º grau, 2º grau,
135
+ * turma recursal…). O histórico dele entrou no acervo sem virar
136
+ * `PROCESS_MOVEMENT_CREATED` movimento a movimento: este aviso é o que diz que
137
+ * ele chegou, e os movimentos estão no retrato do processo, em `instances`.
138
+ */
139
+ export interface ProcessInstanceDiscoveredPayload {
140
+ canonicalProcessId: string;
141
+ tribunalAlias: string;
142
+ processNumber: string;
143
+ /** O ponteiro que o consumidor informou ao assinar o processo. */
144
+ externalRef: string | null;
145
+ /** A sigla do grau novo; nula quando a fonte não a declara. */
146
+ degree: string | null;
147
+ /** O documento da fonte deste grau — o `sourceId` dele em `instances`. */
148
+ instanceSourceId: string;
149
+ courtBody: string | null;
150
+ /** Quantos movimentos o grau trouxe na captura que o descobriu. */
151
+ movementCount: number;
152
+ /** Quantos deles entraram no acervo sem aviso próprio. */
153
+ historyMovementCount: number;
154
+ /**
155
+ * Quantos deles saíram também em `PROCESS_MOVEMENT_CREATED`: os datados
156
+ * depois da primeira captura do número.
157
+ */
158
+ announcedMovementCount: number;
159
+ /** O movimento mais recente do grau novo. */
160
+ latestMovementAt: string | null;
161
+ latestMovementCode: number | null;
162
+ latestMovementLabel: string | null;
163
+ contentWithheld?: never;
164
+ }
165
+ /**
166
+ * O mesmo aviso sobre processo não compartilhável: diz que o número ganhou um
167
+ * grau e não diz qual, nem o órgão, nem quantos movimentos.
168
+ */
169
+ export interface ProcessInstanceDiscoveredWithheldPayload {
170
+ canonicalProcessId: string;
171
+ tribunalAlias: string;
172
+ processNumber: string;
173
+ externalRef: string | null;
174
+ contentWithheld: true;
175
+ }
176
+ /** Um grau do número como a varredura da vigília de processo o deixou. */
177
+ export interface MonitorSyncInstance {
178
+ degree: string | null;
179
+ /** O documento da fonte deste grau — o `sourceId` dele em `instances`. */
180
+ instanceSourceId: string;
181
+ /** A instância que o topo da leitura do processo serve. */
182
+ primary: boolean;
183
+ courtBody: string | null;
184
+ sourceUpdatedAt: string | null;
185
+ latestMovementAt: string | null;
186
+ /** Nulo quando os movimentos deste grau nunca foram capturados. */
187
+ movementCount: number | null;
188
+ /** Desde quando a resposta completa da fonte vem sem este documento. */
189
+ absentSince: string | null;
190
+ }
108
191
  export interface PublicationCreatedPayload {
109
192
  monitorId: string;
110
193
  officeId: string | null;
@@ -151,6 +234,21 @@ export interface MonitorSyncSucceededPayload {
151
234
  snapshotHash?: string;
152
235
  sourceUpdatedAt?: string | null;
153
236
  latestMovementAt?: string | null;
237
+ /**
238
+ * Vigília de processo: os graus do número e os que esta passada reconheceu
239
+ * como novos. Só quando o controle de confidencialidade deixa o dono do
240
+ * monitor ler o número inteiro.
241
+ */
242
+ instances?: MonitorSyncInstance[];
243
+ instancesDiscovered?: MonitorSyncInstance[];
244
+ /**
245
+ * Vigília de processo cujo número corre em segredo num grau que o dono do
246
+ * monitor não buscou: a passada sai sem o hash e sem as datas da fonte, e
247
+ * `changed` fica `false`. O dono que buscou o grau em segredo, numa conta
248
+ * que não aceita a proveniência, recebe a passada com `changed`, o hash e as
249
+ * datas, e sem `instances`.
250
+ */
251
+ contentWithheld?: true;
154
252
  /** O alvo que a fonte não indexava passou a existir nesta passada. */
155
253
  firstAppearance?: true;
156
254
  /** A vigília de aparição segue esperando o alvo entrar no índice. */
@@ -280,8 +378,8 @@ type Typed<T extends string, P> = WebhookEventEnvelope & {
280
378
  type: T;
281
379
  payload: P;
282
380
  };
283
- /** Os dez tipos do catálogo, discriminados por `type`. */
284
- export type WebhookEvent = Typed<"PROCESS_MOVEMENT_CREATED", ProcessMovementCreatedPayload> | Typed<"PUBLICATION_CREATED", PublicationCreatedPayload> | Typed<"MONITOR_SYNC_SUCCEEDED", MonitorSyncSucceededPayload> | Typed<"MONITOR_SYNC_FAILED", MonitorSyncFailedPayload> | Typed<"SEARCH_JOB_COMPLETED", SearchJobSucceededPayload | SearchJobFailedPayload> | Typed<"PUBLICATION_TEXT_ALERT_MATCHED", PublicationTextAlertMatchedPayload> | Typed<"PUBLICATION_HARVEST_COMPLETED", PublicationHarvestCompletedPayload> | Typed<"QUOTA_LOW", QuotaLowPayload> | Typed<"PERIOD_ENDING", PeriodEndingPayload> | Typed<"SUBSCRIPTION_PAST_DUE", SubscriptionPastDuePayload> | Typed<"WEBHOOK_TEST", WebhookTestPayload>;
381
+ /** Os tipos do catálogo e a entrega de teste, discriminados por `type`. */
382
+ export type WebhookEvent = Typed<"PROCESS_MOVEMENT_CREATED", ProcessMovementCreatedPayload> | Typed<"PROCESS_INSTANCE_DISCOVERED", ProcessInstanceDiscoveredPayload | ProcessInstanceDiscoveredWithheldPayload> | Typed<"PUBLICATION_CREATED", PublicationCreatedPayload> | Typed<"MONITOR_SYNC_SUCCEEDED", MonitorSyncSucceededPayload> | Typed<"MONITOR_SYNC_FAILED", MonitorSyncFailedPayload> | Typed<"SEARCH_JOB_COMPLETED", SearchJobSucceededPayload | SearchJobFailedPayload> | Typed<"PUBLICATION_TEXT_ALERT_MATCHED", PublicationTextAlertMatchedPayload> | Typed<"PUBLICATION_HARVEST_COMPLETED", PublicationHarvestCompletedPayload> | Typed<"QUOTA_LOW", QuotaLowPayload> | Typed<"PERIOD_ENDING", PeriodEndingPayload> | Typed<"SUBSCRIPTION_PAST_DUE", SubscriptionPastDuePayload> | Typed<"WEBHOOK_TEST", WebhookTestPayload>;
285
383
  /**
286
384
  * O evento que o catálogo ainda não descreve.
287
385
  *
@@ -304,7 +402,7 @@ export type WebhookEventType = WebhookEvent["type"];
304
402
  */
305
403
  export declare const WEBHOOK_TEST_EVENT_TYPE: "WEBHOOK_TEST";
306
404
  /** Os tipos que se pode ASSINAR ao cadastrar um endpoint. */
307
- export declare const WEBHOOK_EVENT_TYPES: readonly ["PROCESS_MOVEMENT_CREATED", "PUBLICATION_CREATED", "MONITOR_SYNC_SUCCEEDED", "MONITOR_SYNC_FAILED", "SEARCH_JOB_COMPLETED", "PUBLICATION_TEXT_ALERT_MATCHED", "PUBLICATION_HARVEST_COMPLETED", "QUOTA_LOW", "PERIOD_ENDING", "SUBSCRIPTION_PAST_DUE"];
405
+ export declare const WEBHOOK_EVENT_TYPES: readonly ["PROCESS_MOVEMENT_CREATED", "PROCESS_INSTANCE_DISCOVERED", "PUBLICATION_CREATED", "MONITOR_SYNC_SUCCEEDED", "MONITOR_SYNC_FAILED", "SEARCH_JOB_COMPLETED", "PUBLICATION_TEXT_ALERT_MATCHED", "PUBLICATION_HARVEST_COMPLETED", "QUOTA_LOW", "PERIOD_ENDING", "SUBSCRIPTION_PAST_DUE"];
308
406
  /**
309
407
  * O que entra em `eventTypes` ao cadastrar um endpoint. É subconjunto próprio
310
408
  * de `WebhookEventType`: mandar a entrega de teste nessa lista é recusa.
package/dist/webhooks.js CHANGED
@@ -117,6 +117,7 @@ export const WEBHOOK_TEST_EVENT_TYPE = "WEBHOOK_TEST";
117
117
  /** Os tipos que se pode ASSINAR ao cadastrar um endpoint. */
118
118
  export const WEBHOOK_EVENT_TYPES = [
119
119
  "PROCESS_MOVEMENT_CREATED",
120
+ "PROCESS_INSTANCE_DISCOVERED",
120
121
  "PUBLICATION_CREATED",
121
122
  "MONITOR_SYNC_SUCCEEDED",
122
123
  "MONITOR_SYNC_FAILED",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lexnode/legal-data-sdk",
3
- "version": "1.25.0",
3
+ "version": "1.27.0",
4
4
  "description": "Cliente TypeScript do LexNode, o motor de dados jur\u00eddicos do Brasil: transporte tipado, erros classificados, verifica\u00e7\u00e3o de webhook e os tipos gerados do contrato OpenAPI.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://www.lexnode.com.br/docs",
package/schema.d.ts CHANGED
@@ -139,7 +139,7 @@ export interface paths {
139
139
  put?: never;
140
140
  /**
141
141
  * Buscar processos
142
- * @description Executa uma busca estruturada de processos em um tribunal suportado. A consulta por número completo é atendida lake-first (sem chamada ao upstream enquanto o dado está fresco); todo hit vivo é gravado de volta no data lake. No modo assíncrono o endpoint responde 202 com um descritor de job — consulte o resultado em GET /v1/search-jobs/{jobId}. **Antes de concluir que um processo não existe, leia `sourceIndex.updatedThrough`:** é a data até onde o índice do tribunal está atualizado. Um processo distribuído depois dela ainda não é encontrável, e `total: 0` ali significa *ainda não chegou*, não *não existe*. O campo acompanha toda resposta que consulta a fonte, sem custo adicional.
142
+ * @description Executa uma busca estruturada de processos em um tribunal suportado. A consulta por número completo é atendida lake-first (sem chamada ao upstream enquanto o dado está fresco), com um item por documento que a fonte ainda traz do número, a principal primeiro; quando eles não cabem em `limit`, a consulta vai à fonte, que pagina. Todo hit vivo é gravado de volta no data lake, cada documento na sua instância. No modo assíncrono o endpoint responde 202 com um descritor de job — consulte o resultado em GET /v1/search-jobs/{jobId}. **Antes de concluir que um processo não existe, leia `sourceIndex.updatedThrough`:** é a data até onde o índice do tribunal está atualizado. Um processo distribuído depois dela ainda não é encontrável, e `total: 0` ali significa *ainda não chegou*, não *não existe*. O campo acompanha toda resposta que consulta a fonte, sem custo adicional.
143
143
  *
144
144
  * **Escopo exigido na chave de API:** `PROCESSES_SEARCH`
145
145
  */
@@ -159,7 +159,7 @@ export interface paths {
159
159
  };
160
160
  /**
161
161
  * Obter um processo pelo número
162
- * @description Retorna o registro exato do processo para o tribunal e o número informados, com resolução cache-first quando disponível. `waitSeconds` escolhe quanto esperar pela fonte processual. Quando a fonte responde com parte do índice e o processo está na parte que respondeu, ele é servido e `meta.partialIndex` diz quantas partes falharam (`shardsFailed`), de quantas (`shardsTotal`) e se o prazo interno da fonte estourou (`timedOut`): outra instância do mesmo número, se existir, pode não ter vindo. A exceção é o processo que veio de uma instância diferente da que o acervo já guarda do número: a guardada pode estar na parte que não respondeu, e a resposta parcial não é servida. Resposta parcial que não serve o processo — sem ele, ou com a outra instância — é 502 `UPSTREAM_UNAVAILABLE` retentável, nunca 404; antes dela, o motor consulta a fonte de novo, até duas vezes, enquanto o prazo de `waitSeconds` couber. Quando a resposta traz mais de um documento do número — em geral um por instância, mas dois podem ser do mesmo grau —, o motor serve e guarda um só, o de `data` (grau em `degree`), e `meta.otherInstances` lista os outros que vieram: grau, data de atualização na fonte e órgão julgador.
162
+ * @description Retorna o registro exato do processo para o tribunal e o número informados, com resolução cache-first quando disponível. **Um número, várias instâncias.** A fonte guarda um documento por instância do processo (1º grau, 2º grau, turma recursal…), às vezes dois do mesmo grau, e o motor guarda cada um na sua instância. O topo da resposta é sempre a instância principal do número — a mesma de uma leitura para a outra, que só muda quando uma resposta completa da fonte deixa de trazê-la —, com o grau em `degree`, e `data.instances` lista todos os documentos, a principal primeiro, cada um com `origin` (`SOURCE` quando veio da fonte nesta resposta, `LAKE` quando saiu do acervo), `fetchedAt` e `absentSince`. Todos levam a classificação do número inteiro: basta um documento em segredo de justiça para todos saírem marcados. `meta.sourceFetchedAt` diz quando os dados do topo foram buscados na fonte; a ficha retida pelo controle de confidencialidade, sem o teor, não o traz nem lista as instâncias. `waitSeconds` escolhe quanto esperar pela fonte processual. Quando a fonte responde com parte do índice e o processo está na parte que respondeu, ele é servido e `meta.partialIndex` diz quantas partes falharam (`shardsFailed`), de quantas (`shardsTotal`) e se o prazo interno da fonte estourou (`timedOut`): o documento que o acervo já guardava e não veio sai em `data.instances` do acervo, com a data dele, e outra instância que o acervo não conhece, se existir, pode não ter vindo. Resposta parcial sem o processo é 502 `UPSTREAM_UNAVAILABLE` retentável, nunca 404; antes dela, o motor consulta a fonte de novo, até duas vezes, enquanto o prazo de `waitSeconds` couber. `meta.otherInstances` resume os outros documentos do número que vieram na resposta, além da principal: grau, data de atualização na fonte e órgão julgador. **Quando a fonte falha** — não responde dentro de `waitSeconds`, fica indisponível, responde com parte do índice sem poder servir o processo ou pede para esperar por volume — e o acervo guarda uma cópia do processo, a resposta é essa cópia, por 1 crédito: `meta.lakeRescue.cause` diz a causa e `meta.sourceFetchedAt` a data em que a cópia foi buscada. Movimentos posteriores a essa data podem existir e não estão na resposta. Sem `staleOnFailure=true`, só a cópia de até 24 h socorre; com ele, a de qualquer idade. A cópia é montada por instância, cada uma com a data dela em `data.instances[].fetchedAt`, e o número que a resposta completa mais recente da fonte já não trazia em documento nenhum não é socorrido. Na recusa por volume, `meta.lakeRescue.retryAfterSeconds` e o header `Retry-After` dizem quanto esperar antes de consultar de novo. A resposta da fonte que não traz o processo nunca é socorrida e segue 404. A cópia passa pelo mesmo controle de confidencialidade da leitura; além de 24 h, só a recebe quem já tem interesse registrado no processo — de uma leitura anterior dele ou de uma assinatura ativa —, e os demais recebem a falha da fonte. Na ficha socorrida pelo acervo, a data vale para os dados do processo, e o resumo das publicações (`djen`) é relido na hora das publicações que o acervo guarda.
163
163
  *
164
164
  * **Escopo exigido na chave de API:** `PROCESSES_READ`
165
165
  */
@@ -203,7 +203,7 @@ export interface paths {
203
203
  };
204
204
  /**
205
205
  * Obter um snapshot vivo do processo
206
- * @description Busca o hit exato do processo no upstream do CNJ e retorna o registro normalizado do processo, o payload bruto da fonte e as movimentações CNJ normalizadas. `waitSeconds` escolhe quanto esperar pela fonte processual. Quando a fonte responde com parte do índice e o processo está na parte que respondeu, ele é servido e `meta.partialIndex` diz quantas partes falharam (`shardsFailed`), de quantas (`shardsTotal`) e se o prazo interno da fonte estourou (`timedOut`): outra instância do mesmo número, se existir, pode não ter vindo. A exceção é o processo que veio de uma instância diferente da que o acervo já guarda do número: a guardada pode estar na parte que não respondeu, e a resposta parcial não é servida. Resposta parcial que não serve o processo — sem ele, ou com a outra instância — é 502 `UPSTREAM_UNAVAILABLE` retentável, nunca 404; antes dela, o motor consulta a fonte de novo, até duas vezes, enquanto o prazo de `waitSeconds` couber. Quando a resposta traz mais de um documento do número — em geral um por instância, mas dois podem ser do mesmo grau —, o motor serve e guarda um só, o de `data` (grau em `degree`), e `meta.otherInstances` lista os outros que vieram: grau, data de atualização na fonte e órgão julgador.
206
+ * @description Busca o processo na fonte processual e retorna o registro normalizado do processo, o payload bruto da fonte e as movimentações normalizadas. **Um número, várias instâncias.** A fonte guarda um documento por instância do processo (1º grau, 2º grau, turma recursal…), às vezes dois do mesmo grau, e o motor guarda cada um na sua instância. O topo da resposta é sempre a instância principal do número — a mesma de uma leitura para a outra, que só muda quando uma resposta completa da fonte deixa de trazê-la —, com o grau em `degree`, e `data.instances` lista todos os documentos, a principal primeiro, cada um com `origin` (`SOURCE` quando veio da fonte nesta resposta, `LAKE` quando saiu do acervo), `fetchedAt` e `absentSince`. Todos levam a classificação do número inteiro: basta um documento em segredo de justiça para todos saírem marcados. `meta.sourceFetchedAt` diz quando os dados do topo foram buscados na fonte; a ficha retida pelo controle de confidencialidade, sem o teor, não o traz nem lista as instâncias. `waitSeconds` escolhe quanto esperar pela fonte processual. Quando a fonte responde com parte do índice e o processo está na parte que respondeu, ele é servido e `meta.partialIndex` diz quantas partes falharam (`shardsFailed`), de quantas (`shardsTotal`) e se o prazo interno da fonte estourou (`timedOut`): o documento que o acervo já guardava e não veio sai em `data.instances` do acervo, com a data dele, e outra instância que o acervo não conhece, se existir, pode não ter vindo. Resposta parcial sem o processo é 502 `UPSTREAM_UNAVAILABLE` retentável, nunca 404; antes dela, o motor consulta a fonte de novo, até duas vezes, enquanto o prazo de `waitSeconds` couber. `meta.otherInstances` resume os outros documentos do número que vieram na resposta, além da principal: grau, data de atualização na fonte e órgão julgador. **Quando a fonte falha** — não responde dentro de `waitSeconds`, fica indisponível, responde com parte do índice sem poder servir o processo ou pede para esperar por volume — e o acervo guarda uma cópia do processo, a resposta é essa cópia, por 1 crédito: `meta.lakeRescue.cause` diz a causa e `meta.sourceFetchedAt` a data em que a cópia foi buscada. Movimentos posteriores a essa data podem existir e não estão na resposta. Sem `staleOnFailure=true`, só a cópia de até 24 h socorre; com ele, a de qualquer idade. A cópia é montada por instância, cada uma com a data dela em `data.instances[].fetchedAt`, e o número que a resposta completa mais recente da fonte já não trazia em documento nenhum não é socorrido. Na recusa por volume, `meta.lakeRescue.retryAfterSeconds` e o header `Retry-After` dizem quanto esperar antes de consultar de novo. A resposta da fonte que não traz o processo nunca é socorrida e segue 404. A cópia passa pelo mesmo controle de confidencialidade da leitura; além de 24 h, só a recebe quem já tem interesse registrado no processo — de uma leitura anterior dele ou de uma assinatura ativa —, e os demais recebem a falha da fonte. `process` e `movements` são os da instância principal, e cada entrada de `data.instances` traz os movimentos da última captura dela, do mais recente ao mais antigo; na instância cujos movimentos o motor nunca capturou, `movements` e `movementCount` são nulos, nunca lista vazia. A resposta parcial sem a instância principal serve a principal do acervo, e é 502 `UPSTREAM_UNAVAILABLE` quando o acervo não guarda os movimentos dela. No retrato socorrido pelo acervo, os movimentos e o registro de cada instância são os da última captura guardada dela — o socorro exige a da principal —, e `sourcePayload` é nulo: o documento bruto da fonte não é guardado.
207
207
  *
208
208
  * **Escopo exigido na chave de API:** `PROCESSES_READ`
209
209
  */
@@ -225,7 +225,7 @@ export interface paths {
225
225
  };
226
226
  /**
227
227
  * Listar as movimentações em cache do processo
228
- * @description Retorna as movimentações em cache de um número de processo no tribunal informado. Esta rota não busca movimentações no upstream sob demanda.
228
+ * @description Retorna as movimentações em cache de um número de processo no tribunal informado. Esta rota não busca movimentações no upstream sob demanda. Cada item diz em `degrees` o grau (ou os graus) cujo documento o trouxe na última captura — vazio no movimento que nenhuma captura atual traz —, e `degree` recorta a lista por grau.
229
229
  *
230
230
  * **Escopo exigido na chave de API:** `PROCESSES_READ`
231
231
  */
@@ -249,7 +249,7 @@ export interface paths {
249
249
  put?: never;
250
250
  /**
251
251
  * Snapshot em lote
252
- * @description Snapshot de até N processos em uma única ida e volta (elimina o N+1 noturno de uma chamada por processo). Sucesso parcial: item que falha é reportado individualmente e nunca derruba o lote; só os itens bem-sucedidos são cobrados. Todo snapshot obtido é gravado de volta no data lake.
252
+ * @description Snapshot de até N processos em uma única ida e volta (elimina o N+1 noturno de uma chamada por processo). Sucesso parcial: item que falha é reportado individualmente e nunca derruba o lote; só os itens bem-sucedidos são cobrados. Todo snapshot obtido é gravado de volta no data lake. O `process` e os `movements` do item são os da instância principal do número, e `snapshot.instances` lista os documentos do número só com o cabeçalho. Quando a fonte processual falha num item e o acervo guarda uma cópia dele de até 24 h, o item sai com essa cópia e com `lakeRescue` (a causa e a data da cópia), e custa 1 crédito em vez de 8; cópia mais velha não socorre o lote.
253
253
  *
254
254
  * **Escopo exigido na chave de API:** `PROCESSES_READ`
255
255
  */
@@ -397,7 +397,7 @@ export interface paths {
397
397
  };
398
398
  /**
399
399
  * Consultar um job de busca
400
- * @description Retorna o status do job; em SUCCEEDED, `result` carrega o mesmo formato da busca síncrona de processos — inclusive `sourceIndex.updatedThrough`, a data até onde o índice do tribunal está atualizado, que qualifica um `total: 0` como *ainda não chegou* em vez de *não existe*. O campo acompanha o resultado que consultou a fonte; um job servido do acervo não o traz. Jobs são visíveis apenas para a conta/office que os submeteu (404 caso contrário). A submissão acontece via POST /v1/processes/search, que responde 202 + jobId quando o modo assíncrono está ativo.
400
+ * @description Retorna o status do job; em SUCCEEDED, `result` carrega o mesmo formato da busca síncrona de processos — inclusive `sourceIndex.updatedThrough`, a data até onde o índice do tribunal está atualizado, que qualifica um `total: 0` como *ainda não chegou* em vez de *não existe*. O campo acompanha o resultado que consultou a fonte; um job servido do acervo não o traz. O processo que o controle de confidencialidade retém de quem consulta sai de `items`, conta em `redactedCount` e uma vez só em `total`, quantos documentos dele a busca tenha achado. Jobs são visíveis apenas para a conta/office que os submeteu (404 caso contrário). A submissão acontece via POST /v1/processes/search, que responde 202 + jobId quando o modo assíncrono está ativo.
401
401
  *
402
402
  * **Escopo exigido na chave de API:** `PROCESSES_READ`
403
403
  */
@@ -449,7 +449,7 @@ export interface paths {
449
449
  put?: never;
450
450
  /**
451
451
  * Registrar interesse durável em um processo
452
- * @description Concede uma assinatura CASE_LINK para que o motor mantenha o processo atualizado e emita `PROCESS_MOVEMENT_CREATED` aos endpoints da conta a cada movimentação nova. Idempotente por (reason, externalRef).
452
+ * @description Concede uma assinatura CASE_LINK para que o motor mantenha o processo atualizado e emita `PROCESS_MOVEMENT_CREATED` aos endpoints da conta a cada movimentação nova, e `PROCESS_INSTANCE_DISCOVERED` quando outro grau do número aparece na fonte. Idempotente por (reason, externalRef).
453
453
  *
454
454
  * **Escopo exigido na chave de API:** `SUBSCRIPTIONS_WRITE`
455
455
  */
@@ -2043,6 +2043,8 @@ export interface operations {
2043
2043
  since?: unknown;
2044
2044
  /** @description Quanto esperar pela fonte processual quando o processo precisa ser buscado nela, em segundos: de 10 a 180, padrão 20. É o teto da consulta à fonte: ela às vezes leva até ~60 s por consulta, cada ida a ela espera no máximo 60 s, e a segunda ida só sai depois de uma recusa por volume ou de um erro da fonte, nunca depois de tempo esgotado. Depois dela, a ficha ainda espera até 10 s pelo resumo das publicações do processo. Tempo esgotado é 504 `UPSTREAM_TIMEOUT` (lentidão, não ausência). Dê ao seu cliente HTTP um tempo limite que cubra a espera, esses segundos da ficha e a rede: no padrão, mais de 30 s. */
2045
2045
  waitSeconds?: number;
2046
+ /** @description O que fazer quando a fonte processual falha — não responde dentro da espera, fica indisponível ou pede para esperar por volume — e o acervo guarda uma cópia do processo. Sem ele (`false`), a cópia só é servida se tiver até 24 h. Com `true`, ela é servida de qualquer idade. Nos dois casos a resposta custa 1 crédito, `meta.lakeRescue` diz a causa e `meta.sourceFetchedAt` diz quando a cópia foi buscada na fonte. A resposta da fonte que não traz o processo segue 404 `PROCESS_NOT_FOUND`, com cópia guardada ou sem ela. */
2047
+ staleOnFailure?: boolean;
2046
2048
  };
2047
2049
  header?: {
2048
2050
  /** @description Identificador da requisição escolhido pelo cliente, ecoado em meta.requestId e no corpo de erro. Tem DOIS papéis: (1) rastreio, em toda rota — é por ele que o suporte encontra a chamada; (2) idempotência por conta em POST /v1/publications/text-searches e POST /v1/search-jobs, onde reenviar o mesmo valor reapresenta o resultado já produzido, sem nova cobrança. Fora dessas duas rotas o valor não deduplica nada: para repetir uma chamada de propósito, mande um valor novo. Aceita [A-Za-z0-9_.:-], até 200 caracteres; valor fora disso é ignorado e o motor cunha o próprio. */
@@ -2116,13 +2118,91 @@ export interface operations {
2116
2118
  latestPublicationExcerpt?: string | null;
2117
2119
  latestPublicationUrl?: string | null;
2118
2120
  } | null;
2121
+ /** @description Todos os documentos que o motor guarda deste número — em geral um por instância (1º grau, 2º grau, turma recursal…), às vezes dois do mesmo grau —, a principal primeiro, depois os que a fonte ainda traz e por fim os que ela deixou de trazer. O topo da resposta é a principal. Cada um leva a classificação do número inteiro: basta um documento em segredo de justiça para todos saírem marcados. Ausente na ficha que o controle de confidencialidade entrega retida, sem o teor. */
2122
+ instances?: {
2123
+ sourceId?: string | null;
2124
+ number: string;
2125
+ formattedNumber: string;
2126
+ tribunal: {
2127
+ alias: string;
2128
+ code: string;
2129
+ };
2130
+ degree?: string | null;
2131
+ sigiloLevel?: number | null;
2132
+ /**
2133
+ * @description Classificação do motor: PUBLIC ou SEGREDO_DE_JUSTICA. Linha em segredo nunca deve ser exibida a público.
2134
+ * @enum {string}
2135
+ */
2136
+ confidentiality?: "PUBLIC" | "SEGREDO_DE_JUSTICA";
2137
+ /** @description Se a linha pode ser amortizada entre consumidores. Falso acompanha o segredo e também a linha que o motor reteve por outro motivo. */
2138
+ shareable?: boolean;
2139
+ class: {
2140
+ code?: number | null;
2141
+ name?: string | null;
2142
+ } | null;
2143
+ courtBody: {
2144
+ code?: number | null;
2145
+ name?: string | null;
2146
+ municipalityIbgeCode?: number | null;
2147
+ } | null;
2148
+ system?: {
2149
+ code?: number | null;
2150
+ name?: string | null;
2151
+ } | null;
2152
+ format?: {
2153
+ code?: number | null;
2154
+ name?: string | null;
2155
+ } | null;
2156
+ /** Format: date-time */
2157
+ filedAt?: string | null;
2158
+ /** Format: date-time */
2159
+ updatedAt?: string | null;
2160
+ /** Format: date-time */
2161
+ indexedAt?: string | null;
2162
+ subjects: {
2163
+ code?: number | null;
2164
+ name: string;
2165
+ }[];
2166
+ /** @description A instância principal do número, a que o topo da resposta serve. É a mesma de uma leitura para a outra e só muda quando uma resposta completa da fonte pelo número deixa de trazê-la. */
2167
+ primary: boolean;
2168
+ /**
2169
+ * @description `SOURCE`: veio da fonte nesta resposta. `LAKE`: servida do que o acervo guarda — a fonte não a trouxe nesta resposta, ou a resposta inteira saiu do acervo.
2170
+ * @enum {string}
2171
+ */
2172
+ origin: "SOURCE" | "LAKE";
2173
+ /**
2174
+ * Format: date-time
2175
+ * @description Quando os dados desta instância foram buscados na fonte. No retrato, com os movimentos servidos do acervo, é a data da captura deles.
2176
+ */
2177
+ fetchedAt: string;
2178
+ /**
2179
+ * Format: date-time
2180
+ * @description Desde quando a resposta completa da fonte pelo número vem sem este documento; nulo enquanto ela o traz.
2181
+ */
2182
+ absentSince: string | null;
2183
+ }[];
2119
2184
  };
2120
2185
  meta: {
2121
2186
  /** @description Identificador da requisição, para suporte e rastreamento. É o X-Request-Id enviado pelo cliente quando há um; senão, um req_<uuid> cunhado pelo motor. */
2122
2187
  requestId: string;
2123
2188
  credits?: number;
2124
2189
  cacheHit?: boolean;
2125
- /** @description Presente só quando a fonte respondeu com parte do índice e o processo estava na parte que respondeu: outra instância do mesmo número, se existir, pode não ter vindo. */
2190
+ /**
2191
+ * Format: date-time
2192
+ * @description Quando os dados servidos foram buscados na fonte: agora, se ela respondeu; antes, se vieram do acervo. No retrato socorrido pelo acervo, é a data da captura dos movimentos servidos. Ausente na ficha que o controle de confidencialidade entrega retida, sem o teor.
2193
+ */
2194
+ sourceFetchedAt?: string;
2195
+ /** @description Presente só quando a fonte processual falhou e o motor serviu a cópia que o acervo guarda do processo. A data da cópia está em `meta.sourceFetchedAt`; movimentos posteriores a ela podem existir e não estão na resposta. */
2196
+ lakeRescue?: {
2197
+ /**
2198
+ * @description Por que a fonte não entregou: `UPSTREAM_TIMEOUT` (não respondeu dentro da espera), `UPSTREAM_UNAVAILABLE` (indisponível, ou respondeu com parte do índice sem poder servir o processo) ou `UPSTREAM_RATE_LIMITED` (pediu para esperar por volume).
2199
+ * @enum {string}
2200
+ */
2201
+ cause: "UPSTREAM_TIMEOUT" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_RATE_LIMITED";
2202
+ /** @description A espera que a fonte pediu: não consulte a fonte de novo antes dela. */
2203
+ retryAfterSeconds?: number;
2204
+ };
2205
+ /** @description Presente só quando a fonte respondeu com parte do índice e o processo estava na parte que respondeu: o documento que o acervo já guardava e não veio sai em `instances` do acervo (`origin: LAKE`), e outra instância que o acervo não conhece, se existir, pode não ter vindo. */
2126
2206
  partialIndex?: {
2127
2207
  /** @description Partes do índice da fonte que não responderam. */
2128
2208
  shardsFailed: number;
@@ -2131,7 +2211,7 @@ export interface operations {
2131
2211
  /** @description A fonte estourou o próprio prazo interno e devolveu só o que deu tempo de olhar. */
2132
2212
  timedOut: boolean;
2133
2213
  };
2134
- /** @description Presente só quando a resposta da fonte trouxe mais de um documento do número — em geral de instâncias diferentes, mas dois podem ter o mesmo `grau`. O motor serve e guarda um só (o de `data`, que diz o grau em `degree`); estes são os outros que vieram na mesma resposta. Não inclui documento que o motor classificaria como segredo de justiça, e não aparece quando o processo servido é restrito. */
2214
+ /** @description Presente só quando a resposta da fonte trouxe outros documentos do número além da instância principal, que é o topo de `data` (com o grau em `degree`) — em geral de instâncias diferentes, mas dois podem ter o mesmo `grau`. O motor guarda cada documento na sua instância e serve todos em `data.instances`; esta lista é o resumo dos outros que vieram na mesma resposta. Não inclui documento que o motor classificaria como segredo de justiça, e não aparece quando o processo servido é restrito. */
2135
2215
  otherInstances?: {
2136
2216
  /** @description O grau deste documento na fonte: G1, G2, JE, TR… */
2137
2217
  grau: string | null;
@@ -2676,6 +2756,8 @@ export interface operations {
2676
2756
  since?: unknown;
2677
2757
  /** @description Quanto esperar pela fonte processual quando o processo precisa ser buscado nela, em segundos: de 10 a 180, padrão 20. É o teto da consulta à fonte: ela às vezes leva até ~60 s por consulta, cada ida a ela espera no máximo 60 s, e a segunda ida só sai depois de uma recusa por volume ou de um erro da fonte, nunca depois de tempo esgotado. Depois dela, a ficha ainda espera até 10 s pelo resumo das publicações do processo. Tempo esgotado é 504 `UPSTREAM_TIMEOUT` (lentidão, não ausência). Dê ao seu cliente HTTP um tempo limite que cubra a espera, esses segundos da ficha e a rede: no padrão, mais de 30 s. */
2678
2758
  waitSeconds?: number;
2759
+ /** @description O que fazer quando a fonte processual falha — não responde dentro da espera, fica indisponível ou pede para esperar por volume — e o acervo guarda uma cópia do processo. Sem ele (`false`), a cópia só é servida se tiver até 24 h. Com `true`, ela é servida de qualquer idade. Nos dois casos a resposta custa 1 crédito, `meta.lakeRescue` diz a causa e `meta.sourceFetchedAt` diz quando a cópia foi buscada na fonte. A resposta da fonte que não traz o processo segue 404 `PROCESS_NOT_FOUND`, com cópia guardada ou sem ela. */
2760
+ staleOnFailure?: boolean;
2679
2761
  };
2680
2762
  header?: {
2681
2763
  /** @description Identificador da requisição escolhido pelo cliente, ecoado em meta.requestId e no corpo de erro. Tem DOIS papéis: (1) rastreio, em toda rota — é por ele que o suporte encontra a chamada; (2) idempotência por conta em POST /v1/publications/text-searches e POST /v1/search-jobs, onde reenviar o mesmo valor reapresenta o resultado já produzido, sem nova cobrança. Fora dessas duas rotas o valor não deduplica nada: para repetir uma chamada de propósito, mande um valor novo. Aceita [A-Za-z0-9_.:-], até 200 caracteres; valor fora disso é ignorado e o motor cunha o próprio. */
@@ -2761,13 +2843,104 @@ export interface operations {
2761
2843
  complementos: unknown;
2762
2844
  rawPayload: unknown;
2763
2845
  }[];
2846
+ /** @description Todos os documentos que o motor guarda deste número — em geral um por instância (1º grau, 2º grau, turma recursal…), às vezes dois do mesmo grau —, a principal primeiro, depois os que a fonte ainda traz e por fim os que ela deixou de trazer. O topo da resposta é a principal. Cada um leva a classificação do número inteiro: basta um documento em segredo de justiça para todos saírem marcados. `process` e `movements` são os da principal, e cada instância traz os movimentos dela. */
2847
+ instances: {
2848
+ sourceId?: string | null;
2849
+ number: string;
2850
+ formattedNumber: string;
2851
+ tribunal: {
2852
+ alias: string;
2853
+ code: string;
2854
+ };
2855
+ degree?: string | null;
2856
+ sigiloLevel?: number | null;
2857
+ /**
2858
+ * @description Classificação do motor: PUBLIC ou SEGREDO_DE_JUSTICA. Linha em segredo nunca deve ser exibida a público.
2859
+ * @enum {string}
2860
+ */
2861
+ confidentiality?: "PUBLIC" | "SEGREDO_DE_JUSTICA";
2862
+ /** @description Se a linha pode ser amortizada entre consumidores. Falso acompanha o segredo e também a linha que o motor reteve por outro motivo. */
2863
+ shareable?: boolean;
2864
+ class: {
2865
+ code?: number | null;
2866
+ name?: string | null;
2867
+ } | null;
2868
+ courtBody: {
2869
+ code?: number | null;
2870
+ name?: string | null;
2871
+ municipalityIbgeCode?: number | null;
2872
+ } | null;
2873
+ system?: {
2874
+ code?: number | null;
2875
+ name?: string | null;
2876
+ } | null;
2877
+ format?: {
2878
+ code?: number | null;
2879
+ name?: string | null;
2880
+ } | null;
2881
+ /** Format: date-time */
2882
+ filedAt?: string | null;
2883
+ /** Format: date-time */
2884
+ updatedAt?: string | null;
2885
+ /** Format: date-time */
2886
+ indexedAt?: string | null;
2887
+ subjects: {
2888
+ code?: number | null;
2889
+ name: string;
2890
+ }[];
2891
+ /** @description A instância principal do número, a que o topo da resposta serve. É a mesma de uma leitura para a outra e só muda quando uma resposta completa da fonte pelo número deixa de trazê-la. */
2892
+ primary: boolean;
2893
+ /**
2894
+ * @description `SOURCE`: veio da fonte nesta resposta. `LAKE`: servida do que o acervo guarda — a fonte não a trouxe nesta resposta, ou a resposta inteira saiu do acervo.
2895
+ * @enum {string}
2896
+ */
2897
+ origin: "SOURCE" | "LAKE";
2898
+ /**
2899
+ * Format: date-time
2900
+ * @description Quando os dados desta instância foram buscados na fonte. No retrato, com os movimentos servidos do acervo, é a data da captura deles.
2901
+ */
2902
+ fetchedAt: string;
2903
+ /**
2904
+ * Format: date-time
2905
+ * @description Desde quando a resposta completa da fonte pelo número vem sem este documento; nulo enquanto ela o traz.
2906
+ */
2907
+ absentSince: string | null;
2908
+ /** @description Se o motor guarda os movimentos desta instância. Falso quando eles nunca foram capturados — o documento só veio numa ficha ou numa busca — ou quando o acervo já não guarda algum deles, e aí `movements` e `movementCount` são nulos. */
2909
+ movementsCaptured: boolean;
2910
+ /** @description Quantos movimentos a última captura desta instância trouxe; nulo quando eles nunca foram capturados. */
2911
+ movementCount: number | null;
2912
+ /** @description Os movimentos da última captura desta instância, do mais recente ao mais antigo, sem o payload bruto da fonte; nulo quando eles nunca foram capturados. */
2913
+ movements: {
2914
+ externalMovementKey: string;
2915
+ codigo?: number | null;
2916
+ nome: string;
2917
+ /** Format: date-time */
2918
+ dataHora?: string | null;
2919
+ complementos: unknown;
2920
+ }[] | null;
2921
+ }[];
2764
2922
  };
2765
2923
  meta: {
2766
2924
  /** @description Identificador da requisição, para suporte e rastreamento. É o X-Request-Id enviado pelo cliente quando há um; senão, um req_<uuid> cunhado pelo motor. */
2767
2925
  requestId: string;
2768
2926
  credits?: number;
2769
2927
  cacheHit?: boolean;
2770
- /** @description Presente só quando a fonte respondeu com parte do índice e o processo estava na parte que respondeu: outra instância do mesmo número, se existir, pode não ter vindo. */
2928
+ /**
2929
+ * Format: date-time
2930
+ * @description Quando os dados servidos foram buscados na fonte: agora, se ela respondeu; antes, se vieram do acervo. No retrato socorrido pelo acervo, é a data da captura dos movimentos servidos. Ausente na ficha que o controle de confidencialidade entrega retida, sem o teor.
2931
+ */
2932
+ sourceFetchedAt?: string;
2933
+ /** @description Presente só quando a fonte processual falhou e o motor serviu a cópia que o acervo guarda do processo. A data da cópia está em `meta.sourceFetchedAt`; movimentos posteriores a ela podem existir e não estão na resposta. */
2934
+ lakeRescue?: {
2935
+ /**
2936
+ * @description Por que a fonte não entregou: `UPSTREAM_TIMEOUT` (não respondeu dentro da espera), `UPSTREAM_UNAVAILABLE` (indisponível, ou respondeu com parte do índice sem poder servir o processo) ou `UPSTREAM_RATE_LIMITED` (pediu para esperar por volume).
2937
+ * @enum {string}
2938
+ */
2939
+ cause: "UPSTREAM_TIMEOUT" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_RATE_LIMITED";
2940
+ /** @description A espera que a fonte pediu: não consulte a fonte de novo antes dela. */
2941
+ retryAfterSeconds?: number;
2942
+ };
2943
+ /** @description Presente só quando a fonte respondeu com parte do índice e o processo estava na parte que respondeu: o documento que o acervo já guardava e não veio sai em `instances` do acervo (`origin: LAKE`), e outra instância que o acervo não conhece, se existir, pode não ter vindo. */
2771
2944
  partialIndex?: {
2772
2945
  /** @description Partes do índice da fonte que não responderam. */
2773
2946
  shardsFailed: number;
@@ -2776,7 +2949,7 @@ export interface operations {
2776
2949
  /** @description A fonte estourou o próprio prazo interno e devolveu só o que deu tempo de olhar. */
2777
2950
  timedOut: boolean;
2778
2951
  };
2779
- /** @description Presente só quando a resposta da fonte trouxe mais de um documento do número — em geral de instâncias diferentes, mas dois podem ter o mesmo `grau`. O motor serve e guarda um só (o de `data`, que diz o grau em `degree`); estes são os outros que vieram na mesma resposta. Não inclui documento que o motor classificaria como segredo de justiça, e não aparece quando o processo servido é restrito. */
2952
+ /** @description Presente só quando a resposta da fonte trouxe outros documentos do número além da instância principal, que é o topo de `data` (com o grau em `degree`) — em geral de instâncias diferentes, mas dois podem ter o mesmo `grau`. O motor guarda cada documento na sua instância e serve todos em `data.instances`; esta lista é o resumo dos outros que vieram na mesma resposta. Não inclui documento que o motor classificaria como segredo de justiça, e não aparece quando o processo servido é restrito. */
2780
2953
  otherInstances?: {
2781
2954
  /** @description O grau deste documento na fonte: G1, G2, JE, TR… */
2782
2955
  grau: string | null;
@@ -3011,6 +3184,8 @@ export interface operations {
3011
3184
  query: {
3012
3185
  tribunalAlias: string;
3013
3186
  since?: unknown;
3187
+ /** @description Só os movimentos que o documento deste grau (G1, G2, JE, TR…) trouxe na última captura, sem distinguir maiúsculas. O grau sem movimento guardado responde lista vazia. */
3188
+ degree?: string;
3014
3189
  };
3015
3190
  header?: {
3016
3191
  /** @description Identificador da requisição escolhido pelo cliente, ecoado em meta.requestId e no corpo de erro. Tem DOIS papéis: (1) rastreio, em toda rota — é por ele que o suporte encontra a chamada; (2) idempotência por conta em POST /v1/publications/text-searches e POST /v1/search-jobs, onde reenviar o mesmo valor reapresenta o resultado já produzido, sem nova cobrança. Fora dessas duas rotas o valor não deduplica nada: para repetir uma chamada de propósito, mande um valor novo. Aceita [A-Za-z0-9_.:-], até 200 caracteres; valor fora disso é ignorado e o motor cunha o próprio. */
@@ -3040,6 +3215,8 @@ export interface operations {
3040
3215
  formattedProcessNumber: string;
3041
3216
  /** Format: date-time */
3042
3217
  movementDate?: string | null;
3218
+ /** @description Os graus (G1, G2, JE, TR…) cujo documento trouxe este movimento na última captura. Em geral um; dois quando o mesmo ato está nos dois documentos do número. Vazio quando nenhuma captura atual o traz. */
3219
+ degrees: string[];
3043
3220
  code: number | null;
3044
3221
  label?: string | null;
3045
3222
  payload: unknown;
@@ -3361,6 +3538,84 @@ export interface operations {
3361
3538
  } | null;
3362
3539
  };
3363
3540
  movements: unknown[];
3541
+ /** @description Os documentos que o motor guarda do número, a principal primeiro, só com o cabeçalho de cada um: os movimentos de cada instância vêm no retrato de um processo. */
3542
+ instances: {
3543
+ sourceId?: string | null;
3544
+ number: string;
3545
+ formattedNumber: string;
3546
+ tribunal: {
3547
+ alias: string;
3548
+ code: string;
3549
+ };
3550
+ degree?: string | null;
3551
+ sigiloLevel?: number | null;
3552
+ /**
3553
+ * @description Classificação do motor: PUBLIC ou SEGREDO_DE_JUSTICA. Linha em segredo nunca deve ser exibida a público.
3554
+ * @enum {string}
3555
+ */
3556
+ confidentiality?: "PUBLIC" | "SEGREDO_DE_JUSTICA";
3557
+ /** @description Se a linha pode ser amortizada entre consumidores. Falso acompanha o segredo e também a linha que o motor reteve por outro motivo. */
3558
+ shareable?: boolean;
3559
+ class: {
3560
+ code?: number | null;
3561
+ name?: string | null;
3562
+ } | null;
3563
+ courtBody: {
3564
+ code?: number | null;
3565
+ name?: string | null;
3566
+ municipalityIbgeCode?: number | null;
3567
+ } | null;
3568
+ system?: {
3569
+ code?: number | null;
3570
+ name?: string | null;
3571
+ } | null;
3572
+ format?: {
3573
+ code?: number | null;
3574
+ name?: string | null;
3575
+ } | null;
3576
+ /** Format: date-time */
3577
+ filedAt?: string | null;
3578
+ /** Format: date-time */
3579
+ updatedAt?: string | null;
3580
+ /** Format: date-time */
3581
+ indexedAt?: string | null;
3582
+ subjects: {
3583
+ code?: number | null;
3584
+ name: string;
3585
+ }[];
3586
+ /** @description A instância principal do número, a que o topo da resposta serve. É a mesma de uma leitura para a outra e só muda quando uma resposta completa da fonte pelo número deixa de trazê-la. */
3587
+ primary: boolean;
3588
+ /**
3589
+ * @description `SOURCE`: veio da fonte nesta resposta. `LAKE`: servida do que o acervo guarda — a fonte não a trouxe nesta resposta, ou a resposta inteira saiu do acervo.
3590
+ * @enum {string}
3591
+ */
3592
+ origin: "SOURCE" | "LAKE";
3593
+ /**
3594
+ * Format: date-time
3595
+ * @description Quando os dados desta instância foram buscados na fonte. No retrato, com os movimentos servidos do acervo, é a data da captura deles.
3596
+ */
3597
+ fetchedAt: string;
3598
+ /**
3599
+ * Format: date-time
3600
+ * @description Desde quando a resposta completa da fonte pelo número vem sem este documento; nulo enquanto ela o traz.
3601
+ */
3602
+ absentSince: string | null;
3603
+ }[];
3604
+ };
3605
+ /** @description Presente só no item que a fonte processual não entregou e que o acervo socorreu com a cópia guardada de até 24 h: a causa, a espera que a fonte pediu, quando pediu, e quando a cópia foi buscada. O item socorrido custa 1 crédito. */
3606
+ lakeRescue?: {
3607
+ /**
3608
+ * @description Por que a fonte não entregou: `UPSTREAM_TIMEOUT` (não respondeu dentro da espera), `UPSTREAM_UNAVAILABLE` (indisponível, ou respondeu com parte do índice sem poder servir o processo) ou `UPSTREAM_RATE_LIMITED` (pediu para esperar por volume).
3609
+ * @enum {string}
3610
+ */
3611
+ cause: "UPSTREAM_TIMEOUT" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_RATE_LIMITED";
3612
+ /** @description A espera que a fonte pediu: não consulte a fonte de novo antes dela. */
3613
+ retryAfterSeconds?: number;
3614
+ /**
3615
+ * Format: date-time
3616
+ * @description Quando a cópia servida foi buscada na fonte.
3617
+ */
3618
+ sourceFetchedAt: string;
3364
3619
  };
3365
3620
  error?: {
3366
3621
  status?: number;
@@ -11838,7 +12093,7 @@ export interface operations {
11838
12093
  windowDays: number;
11839
12094
  items: ({
11840
12095
  /** @enum {string} */
11841
- type: "PROCESS_MOVEMENT_CREATED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE";
12096
+ type: "PROCESS_MOVEMENT_CREATED" | "PROCESS_INSTANCE_DISCOVERED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE";
11842
12097
  /** @enum {string} */
11843
12098
  class: "DATA" | "OPERATIONAL";
11844
12099
  count: number;
@@ -11849,7 +12104,7 @@ export interface operations {
11849
12104
  })[];
11850
12105
  dismissed: ({
11851
12106
  /** @enum {string} */
11852
- type: "PROCESS_MOVEMENT_CREATED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE";
12107
+ type: "PROCESS_MOVEMENT_CREATED" | "PROCESS_INSTANCE_DISCOVERED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE";
11853
12108
  /** Format: date-time */
11854
12109
  dismissedAt: string;
11855
12110
  } & {
@@ -12054,7 +12309,7 @@ export interface operations {
12054
12309
  query?: {
12055
12310
  cursor?: string;
12056
12311
  limit?: number;
12057
- type?: "PROCESS_MOVEMENT_CREATED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE";
12312
+ type?: "PROCESS_MOVEMENT_CREATED" | "PROCESS_INSTANCE_DISCOVERED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE";
12058
12313
  monitorId?: string;
12059
12314
  since?: unknown;
12060
12315
  until?: unknown;
@@ -12807,7 +13062,7 @@ export interface operations {
12807
13062
  /** Format: uri */
12808
13063
  url: string;
12809
13064
  description?: string;
12810
- eventTypes: ("PROCESS_MOVEMENT_CREATED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE")[];
13065
+ eventTypes: ("PROCESS_MOVEMENT_CREATED" | "PROCESS_INSTANCE_DISCOVERED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE")[];
12811
13066
  /** @default true */
12812
13067
  isActive?: boolean;
12813
13068
  };
@@ -13282,7 +13537,7 @@ export interface operations {
13282
13537
  /** Format: uri */
13283
13538
  url?: string;
13284
13539
  description?: string;
13285
- eventTypes?: ("PROCESS_MOVEMENT_CREATED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE")[];
13540
+ eventTypes?: ("PROCESS_MOVEMENT_CREATED" | "PROCESS_INSTANCE_DISCOVERED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE")[];
13286
13541
  isActive?: boolean;
13287
13542
  };
13288
13543
  };
@@ -13975,7 +14230,7 @@ export interface operations {
13975
14230
  from: unknown;
13976
14231
  to?: unknown;
13977
14232
  /** @enum {string} */
13978
- type?: "PROCESS_MOVEMENT_CREATED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE";
14233
+ type?: "PROCESS_MOVEMENT_CREATED" | "PROCESS_INSTANCE_DISCOVERED" | "PUBLICATION_CREATED" | "MONITOR_SYNC_SUCCEEDED" | "MONITOR_SYNC_FAILED" | "SEARCH_JOB_COMPLETED" | "PUBLICATION_TEXT_ALERT_MATCHED" | "PUBLICATION_HARVEST_COMPLETED" | "QUOTA_LOW" | "PERIOD_ENDING" | "SUBSCRIPTION_PAST_DUE";
13979
14234
  /** @default false */
13980
14235
  includeDelivered?: boolean;
13981
14236
  };