@lexnode/legal-data-sdk 1.24.0 → 1.26.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
@@ -259,10 +259,10 @@ if (desfecho.kind === "sync") {
259
259
  ## Ler um processo quando a fonte está lenta
260
260
 
261
261
  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.
262
+ processo fresco; o retrato (`processes.snapshot`) vai sempre. Os dois só
263
+ recorrem ao acervo quando a fonte falha (seção seguinte). A fonte às vezes leva
264
+ perto de um minuto por consulta. `waitSeconds` diz quanto o motor espera por
265
+ ela: de 10 a 180 segundos, padrão 20 na API.
266
266
 
267
267
  ```ts
268
268
  const { data, meta } = await lexnode.processes.get(numero, {
@@ -302,10 +302,91 @@ if (meta.partialIndex) {
302
302
  }
303
303
  ```
304
304
 
305
+ Antes de recusar a resposta parcial que veio sem o processo porque partes do
306
+ índice ficaram fora, o motor consulta a fonte de novo — até duas vezes, com uma
307
+ pausa curta, enquanto a espera couber.
308
+
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.
317
+
318
+ ```ts
319
+ for (const outra of meta.otherInstances ?? []) {
320
+ // Ex.: { grau: "G1", updatedAt: "2026-04-15T12:00:00.000Z" }
321
+ }
322
+ ```
323
+
305
324
  **Agentes têm a espera deles.** No canal para agentes (MCP), as tools
306
325
  `ler_processo` e `consultar_processo` escolhem a espera em `maxWaitSeconds`, na
307
326
  mesma faixa e com padrão de 120 s; esse canal não passa pelo SDK.
308
327
 
328
+ ## Quando a fonte falha: o retrato guardado
329
+
330
+ Quando a fonte processual falha — não responde dentro de `waitSeconds`, fica
331
+ indisponível, responde com parte do índice sem poder servir o processo ou pede
332
+ para esperar por volume — e o acervo guarda uma cópia do processo, a ficha
333
+ (`processes.get`) e o retrato (`processes.snapshot`) respondem com essa cópia em
334
+ vez do erro. A resposta diz que é cópia, e de quando:
335
+
336
+ - `meta.lakeRescue.cause` diz por que a fonte não entregou: `UPSTREAM_TIMEOUT`,
337
+ `UPSTREAM_UNAVAILABLE` ou `UPSTREAM_RATE_LIMITED`;
338
+ - `meta.lakeRescue.retryAfterSeconds`, repetido no header `Retry-After`, diz na
339
+ recusa por volume quanto esperar antes de consultar a fonte de novo. É a
340
+ espera da fonte, não do teto do motor: `meta.rateLimit.retryAfterSeconds`
341
+ fica `null` no sucesso;
342
+ - `meta.sourceFetchedAt` diz quando a cópia foi buscada na fonte. Esse campo
343
+ acompanha toda resposta das duas leituras, socorrida ou não, menos a ficha
344
+ que o controle de confidencialidade entrega retida, sem o teor.
345
+
346
+ A cópia custa 1 crédito, na ficha e no retrato. O retrato confere o saldo pelo
347
+ preço cheio, 8, antes de ir à fonte; a ficha confere pelo preço do que
348
+ entregou, depois da leitura. No retrato guardado, os movimentos são os da
349
+ última vez que o motor buscou o processo, e `sourcePayload` é nulo: o que andou
350
+ depois dessa data não está na resposta. Na ficha guardada, a data vale para os
351
+ dados do processo, e o resumo das publicações (`djen`) é relido na hora.
352
+
353
+ **Até que idade.** Sem pedir nada, só a cópia de até 24 h socorre a leitura —
354
+ nessas duas rotas, uma resposta de sucesso já podia ser cópia do acervo dentro
355
+ desse prazo. A cópia de qualquer idade vem com `staleOnFailure: true`:
356
+
357
+ ```ts
358
+ import { describeFreshness, lakeRescueOf } from "@lexnode/legal-data-sdk";
359
+
360
+ const retrato = await lexnode.processes.snapshot(numero, {
361
+ tribunalAlias: "api_publica_tjsp",
362
+ staleOnFailure: true,
363
+ });
364
+
365
+ const socorro = lakeRescueOf(retrato);
366
+ if (socorro) {
367
+ // A fonte falhou e isto é a cópia guardada: o que andou depois de
368
+ // socorro.sourceFetchedAt não está aqui.
369
+ mostrar(describeFreshness(retrato));
370
+ // "cópia guardada em 26/09/2026, servida porque a fonte não respondeu a tempo"
371
+ }
372
+ ```
373
+
374
+ `lakeRescueOf` devolve `{ cause, sourceFetchedAt, retryAfterSeconds }` ou
375
+ `null` — `sourceFetchedAt` é nulo na ficha retida —, e `sourceFetchedAtOf`
376
+ devolve a data de qualquer resposta dessas leituras. As duas aceitam o envelope
377
+ inteiro e o item do lote.
378
+
379
+ **O que não é socorrido.** A resposta da fonte que não traz o processo segue
380
+ 404 `PROCESS_NOT_FOUND`, com cópia guardada ou sem ela: é a fonte dizendo que
381
+ não tem o número, e não uma falha dela. A cópia passa pelo mesmo controle de
382
+ confidencialidade da leitura; além de 24 h, só a recebe quem já tem interesse
383
+ registrado no processo — de uma leitura anterior dele ou de uma assinatura
384
+ ativa —, e os demais recebem a falha da fonte, como se não houvesse cópia.
385
+
386
+ **No lote.** `processes.snapshotBatch` socorre só com a cópia de até 24 h. O
387
+ item socorrido traz `lakeRescue` com a causa e a data, e custa 1 crédito em vez
388
+ de 8.
389
+
309
390
  ## Frescor: o `total: 0` qualificado
310
391
 
311
392
  Um resultado vazio não distingue sozinho "não existe" de "a fonte ainda não
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
@@ -20,7 +20,7 @@ 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
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lexnode/legal-data-sdk",
3
- "version": "1.24.0",
3
+ "version": "1.26.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
@@ -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.
162
+ * @description Retorna o registro exato do processo para o tribunal e o número informados, com resolução cache-first quando disponível. `meta.sourceFetchedAt` diz quando os dados servidos foram buscados na fonte; a ficha retida pelo controle de confidencialidade, sem o teor, não o traz. `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. **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. 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.
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. `meta.sourceFetchedAt` diz quando os dados servidos foram buscados na fonte; a ficha retida pelo controle de confidencialidade, sem o teor, não o traz. `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. **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. 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. No retrato socorrido pelo acervo, os movimentos e o registro do processo são os da última captura guardada, 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
  */
@@ -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. 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
  */
@@ -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. */
@@ -2122,6 +2124,21 @@ export interface operations {
2122
2124
  requestId: string;
2123
2125
  credits?: number;
2124
2126
  cacheHit?: boolean;
2127
+ /**
2128
+ * Format: date-time
2129
+ * @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.
2130
+ */
2131
+ sourceFetchedAt?: string;
2132
+ /** @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. */
2133
+ lakeRescue?: {
2134
+ /**
2135
+ * @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).
2136
+ * @enum {string}
2137
+ */
2138
+ cause: "UPSTREAM_TIMEOUT" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_RATE_LIMITED";
2139
+ /** @description A espera que a fonte pediu: não consulte a fonte de novo antes dela. */
2140
+ retryAfterSeconds?: number;
2141
+ };
2125
2142
  /** @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. */
2126
2143
  partialIndex?: {
2127
2144
  /** @description Partes do índice da fonte que não responderam. */
@@ -2131,6 +2148,18 @@ export interface operations {
2131
2148
  /** @description A fonte estourou o próprio prazo interno e devolveu só o que deu tempo de olhar. */
2132
2149
  timedOut: boolean;
2133
2150
  };
2151
+ /** @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. */
2152
+ otherInstances?: {
2153
+ /** @description O grau deste documento na fonte: G1, G2, JE, TR… */
2154
+ grau: string | null;
2155
+ /**
2156
+ * Format: date-time
2157
+ * @description Quando a fonte atualizou este documento pela última vez.
2158
+ */
2159
+ updatedAt: string | null;
2160
+ /** @description O órgão julgador deste documento, quando a fonte o traz. */
2161
+ courtBody?: string;
2162
+ }[];
2134
2163
  } & {
2135
2164
  [key: string]: unknown;
2136
2165
  };
@@ -2664,6 +2693,8 @@ export interface operations {
2664
2693
  since?: unknown;
2665
2694
  /** @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. */
2666
2695
  waitSeconds?: number;
2696
+ /** @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. */
2697
+ staleOnFailure?: boolean;
2667
2698
  };
2668
2699
  header?: {
2669
2700
  /** @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. */
@@ -2755,6 +2786,21 @@ export interface operations {
2755
2786
  requestId: string;
2756
2787
  credits?: number;
2757
2788
  cacheHit?: boolean;
2789
+ /**
2790
+ * Format: date-time
2791
+ * @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.
2792
+ */
2793
+ sourceFetchedAt?: string;
2794
+ /** @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. */
2795
+ lakeRescue?: {
2796
+ /**
2797
+ * @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).
2798
+ * @enum {string}
2799
+ */
2800
+ cause: "UPSTREAM_TIMEOUT" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_RATE_LIMITED";
2801
+ /** @description A espera que a fonte pediu: não consulte a fonte de novo antes dela. */
2802
+ retryAfterSeconds?: number;
2803
+ };
2758
2804
  /** @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. */
2759
2805
  partialIndex?: {
2760
2806
  /** @description Partes do índice da fonte que não responderam. */
@@ -2764,6 +2810,18 @@ export interface operations {
2764
2810
  /** @description A fonte estourou o próprio prazo interno e devolveu só o que deu tempo de olhar. */
2765
2811
  timedOut: boolean;
2766
2812
  };
2813
+ /** @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. */
2814
+ otherInstances?: {
2815
+ /** @description O grau deste documento na fonte: G1, G2, JE, TR… */
2816
+ grau: string | null;
2817
+ /**
2818
+ * Format: date-time
2819
+ * @description Quando a fonte atualizou este documento pela última vez.
2820
+ */
2821
+ updatedAt: string | null;
2822
+ /** @description O órgão julgador deste documento, quando a fonte o traz. */
2823
+ courtBody?: string;
2824
+ }[];
2767
2825
  } & {
2768
2826
  [key: string]: unknown;
2769
2827
  };
@@ -3338,6 +3396,21 @@ export interface operations {
3338
3396
  };
3339
3397
  movements: unknown[];
3340
3398
  };
3399
+ /** @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. */
3400
+ lakeRescue?: {
3401
+ /**
3402
+ * @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).
3403
+ * @enum {string}
3404
+ */
3405
+ cause: "UPSTREAM_TIMEOUT" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_RATE_LIMITED";
3406
+ /** @description A espera que a fonte pediu: não consulte a fonte de novo antes dela. */
3407
+ retryAfterSeconds?: number;
3408
+ /**
3409
+ * Format: date-time
3410
+ * @description Quando a cópia servida foi buscada na fonte.
3411
+ */
3412
+ sourceFetchedAt: string;
3413
+ };
3341
3414
  error?: {
3342
3415
  status?: number;
3343
3416
  /** @description Código estável da taxonomia, quando a falha do item o carrega — é o que distingue, por exemplo, a recusa da chave de teste de um bloqueio LGPD. */