@adonis-agora/agent-dashboard 0.7.5 → 0.8.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,119 @@
1
1
  # @adonis-agora/agent-dashboard
2
2
 
3
+ ## 0.8.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#216](https://github.com/DavideCarvalho/adonis-agora-agent/pull/216) [`b032763`](https://github.com/DavideCarvalho/adonis-agora-agent/commit/b03276346c6a7679b795a598da06f49c945a7f57) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - One way each, matching `@dudousxd/nestjs-agent`'s consolidation ([#230](https://github.com/DavideCarvalho/adonis-agora-agent/issues/230)):
8
+
9
+ - **One `quota` option (BREAKING).** `quota: { limits: { day?: { tokens?, usd? }, month?: { tokens?, usd? } } }` or a `QuotaProvider`. The `quotas.*` factories (`ledger`, `memory`, `windows`), `LedgerQuotaStore` and `QuotaStore`-as-`quota` are removed; migrate `quota: quotas.ledger({ limitTokens: N })` to `quota: { limits: { day: { tokens: N } } }`. The check moved to the send (`429 quota_exceeded` before the turn starts). Drain in-flight durable runs started under the old option first — their journals hold the loop's quota checkpoints.
10
+ - **`GET /agent/quota/today` removed** — read the day window of `GET /agent/quota`. The governance dashboard now does.
11
+ - **`activeRunId` only.** Thread summaries and details carry `activeRunId` (the run streaming right now, `null` otherwise) instead of `ThreadDetail.activeStreamId`. The runners set it before a turn starts and clear it when it ends (`clearActiveStream`, optional on `AgentStore`, only clears a pointer still naming that run), so a reloading client resumes only a live run.
12
+ - **`GET /agent/config`** — `{ attachments: { enabled, upload, maxBytes, allowedContentTypes, maxPerMessage }, models: { enabled }, quota: { enforced }, identity: { anonymous } }`, what the React `useAgentConfig` reads.
13
+
14
+ ## 0.8.0
15
+
16
+ ### Minor Changes
17
+
18
+ - [#111](https://github.com/DavideCarvalho/adonis-agora-agent/pull/111) [`4c9bfe2`](https://github.com/DavideCarvalho/adonis-agora-agent/commit/4c9bfe2cae0e750d778dfaffd95118df122b6afc) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - **BREAKING** — pagination agora fala a MESMA interface de cursor de `@adonis-agora/filter`, em todo o ecossistema Agora
19
+
20
+ Cada `@adonis-agora/*` paginava do seu jeito. Agora todos falam o `CursorParams`/`CursorPage` do
21
+ `@adonis-agora/filter`: `{ after?, first? }` entra, `{ items, nextCursor, prevCursor, hasNext, hasPrev }`
22
+ sai. Um consumidor que aprende a paginar uma lib paginou todas.
23
+
24
+ Os tipos vivem em `@adonis-agora/agent` (`CursorPage`, `CursorParams`, exportados da raiz) e espelham os do
25
+ `@adonis-agora/filter` **estruturalmente** — sem dependência entre os pacotes, por convenção do
26
+ ecossistema. O `-dashboard` carrega a mesma declaração no seu `client/types.ts`, como já fazia com todas as
27
+ outras wire shapes.
28
+
29
+ **Forward-only, e isso está no tipo.** Os dois backends aqui só sabem avançar — o `scroll` do Qdrant
30
+ devolve um `next_page_offset` opaco e nenhum token de volta, e o read-model de runs pagina com um cursor
31
+ opaco pra frente. Então `CursorParams` NÃO tem `before`/`last` (um parâmetro que compila e não faz nada é
32
+ pior que um que não existe), e todo `CursorPage` daqui sai com `prevCursor: null` / `hasPrev: false`. Esses
33
+ dois campos ficam porque o ponto é ser a MESMA forma do `@adonis-agora/filter`: quem escreveu contra um
34
+ renderiza o outro sem condicional, e uma superfície que ganhar paginação pra trás preenche os campos sem
35
+ quebrar ninguém. São constantes, não bug.
36
+
37
+ Como é 0.x, o breaking sai como **minor** (convenção semver de 0.x).
38
+
39
+ ### 1. `QdrantStore.scrollChunks` — uma PÁGINA por chamada, não a coleção inteira
40
+
41
+ `scrollChunks` drenava o cursor até o fim e devolvia um array. Agora é uma superfície paginada de verdade:
42
+ uma ida de rede, `first` é o `limit` do scroll, `nextCursor` embrulha o `next_page_offset` do Qdrant em
43
+ base64url — **opaco**, justamente pra ninguém passar a depender de ele ser um id de ponto. Devolver esse
44
+ cursor adulterado agora falha com erro nomeado em vez de rebobinar em silêncio pra primeira página (um
45
+ scroll que rebobina reprocessa chunks que um painel de deleção já tratou).
46
+
47
+ `pageSize` virou `first` (mesmo default, 256) e `maxPages` sumiu: com uma página por chamada, o teto de
48
+ páginas é o laço de quem chama. O `MAX_SCROLL_PAGES` interno segue guardando os scrolls que a store ainda
49
+ drena sozinha (`listDocuments`, `listDocumentIds`, `updateMetadata`).
50
+
51
+ ```ts
52
+ // antes — drenava tudo, guardado por maxPages
53
+ const payloads = await store.scrollChunks({ filter, payloadKeys: ['id'], pageSize: 256 });
54
+
55
+ // depois — uma página; drenar é um laço seu sobre nextCursor
56
+ const page = await store.scrollChunks({ filter, payloadKeys: ['id'], first: 256 });
57
+ page.items; // Record<string, unknown>[]
58
+
59
+ const all: Record<string, unknown>[] = [];
60
+ let after: string | undefined;
61
+ do {
62
+ const p = await store.scrollChunks({ filter, ...(after ? { after } : {}) });
63
+ all.push(...p.items);
64
+ after = p.nextCursor ?? undefined;
65
+ } while (after !== undefined);
66
+ ```
67
+
68
+ `facetValues(field, { limit })` virou `facetValues(field, { first })` — mesmo default (200), só o nome do
69
+ tamanho de página alinhado ao `CursorParams`. Ele **não** virou `CursorPage`, de propósito: o endpoint
70
+ `/facet` do Qdrant devolve os top-`first` valores de uma vez e não emite token de continuação nenhum, então
71
+ um envelope de página aqui anunciaria um `nextCursor` que só poderia ser `null` pra sempre. Facet é
72
+ agregado com teto; `scrollChunks` é a superfície paginada. `countChunks` (um número) segue igual.
73
+
74
+ `PgVectorStore`/`MemoryVectorStore` não precisaram mudar: `scrollChunks`/`facetValues`/`countChunks` são
75
+ capacidades do Qdrant, não estão na interface `VectorStore` que as três stores implementam, então não há
76
+ como as duas formas divergirem.
77
+
78
+ ### 2. `AgentGovernanceQueries.listRuns` — mesmos cursores, nomes do ecossistema
79
+
80
+ Já era baseado em cursor, só com nomes próprios. `ListRunsResult` agora é literalmente
81
+ `CursorPage<RunSummaryRow>`: as linhas saem em **`items`** (não `runs`), com `prevCursor`/`hasPrev`
82
+ constantes.
83
+
84
+ ```ts
85
+ // antes
86
+ const page = await gov.listRuns({ status: 'failed', limit: 50, cursor: prev });
87
+ page.runs;
88
+ page.nextCursor;
89
+
90
+ // depois
91
+ const page = await gov.listRuns({ status: 'failed', first: 50, after: prev });
92
+ page.items;
93
+ page.nextCursor; // + prevCursor: null, hasNext, hasPrev: false
94
+ ```
95
+
96
+ Quem implementa `AgentGovernanceQueries` por fora precisa renomear `runs` → `items` e devolver os três
97
+ campos novos. As duas implementações que este pacote traz (`LucidGovernanceQueries` e a
98
+ `InMemoryGovernanceQueries` de teste) já vieram atualizadas.
99
+
100
+ **Rota HTTP** — `GET /agent/governance/runs` troca a query string e o corpo:
101
+
102
+ ```diff
103
+ - GET /agent/governance/runs?limit=50&cursor=<opaco>
104
+ - { "runs": [...], "nextCursor": "<opaco>" }
105
+ + GET /agent/governance/runs?first=50&after=<opaco>
106
+ + { "items": [...], "nextCursor": "<opaco>", "prevCursor": null, "hasNext": true, "hasPrev": false }
107
+ ```
108
+
109
+ O `?limit=` continua existindo — só nas listas com TETO, que não são paginadas por cursor
110
+ (`recentToolCalls`, `recentThreads`, a caixa de aprovações). A regra é essa: superfície com cursor fala
111
+ `after`/`first`; top-N com teto fala `limit`.
112
+
113
+ **Cliente do console** — `AgentClient.listRuns({ cursor, limit })` virou `listRuns({ after, first })` e
114
+ devolve `CursorPage`. O provider do Telescope (`agent.runs.recent`) e o hook `useRuns` da SPA já
115
+ acompanham; a UI do console não muda.
116
+
3
117
  ## 0.7.5
4
118
 
5
119
  ### Patch Changes