@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 +114 -0
- package/dist/spa/assets/index-Be6OClIm.js +9 -0
- package/dist/spa/index.html +1 -1
- package/dist/src/client/agent-client.d.ts +7 -2
- package/dist/src/client/agent-client.d.ts.map +1 -1
- package/dist/src/client/agent-client.js +14 -7
- package/dist/src/client/agent-client.js.map +1 -1
- package/dist/src/client/types.d.ts +39 -12
- package/dist/src/client/types.d.ts.map +1 -1
- package/dist/src/client/types.js +1 -1
- package/package.json +30 -26
- package/dist/spa/assets/index-Cfi3g3b2.js +0 -9
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
|