@adonis-agora/agent 0.30.2 → 0.31.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/CHANGELOG.md +114 -0
- package/dist/assets/spa/assets/{index-Cfi3g3b2.js → index-3Q2m5_Ax.js} +1 -1
- package/dist/assets/spa/index.html +1 -1
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +17 -7
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/pagination.d.ts +63 -0
- package/dist/src/pagination.d.ts.map +1 -0
- package/dist/src/pagination.js +16 -0
- package/dist/src/pagination.js.map +1 -0
- package/dist/src/rag/qdrant-store.d.ts +48 -6
- package/dist/src/rag/qdrant-store.d.ts.map +1 -1
- package/dist/src/rag/qdrant-store.js +77 -24
- package/dist/src/rag/qdrant-store.js.map +1 -1
- package/dist/src/spi/governance-queries.d.ts +28 -13
- package/dist/src/spi/governance-queries.d.ts.map +1 -1
- package/dist/src/stores/lucid-governance-queries.d.ts +5 -2
- package/dist/src/stores/lucid-governance-queries.d.ts.map +1 -1
- package/dist/src/stores/lucid-governance-queries.js +11 -5
- package/dist/src/stores/lucid-governance-queries.js.map +1 -1
- package/dist/src/telescope/agent-governance-providers.js +2 -2
- package/dist/src/telescope/agent-governance-providers.js.map +1 -1
- package/dist/src/testing/in-memory-governance-queries.d.ts.map +1 -1
- package/dist/src/testing/in-memory-governance-queries.js +7 -3
- package/dist/src/testing/in-memory-governance-queries.js.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,119 @@
|
|
|
1
1
|
# @adonis-agora/agent
|
|
2
2
|
|
|
3
|
+
## 0.31.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#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
|
|
8
|
+
|
|
9
|
+
Cada `@adonis-agora/*` paginava do seu jeito. Agora todos falam o `CursorParams`/`CursorPage` do
|
|
10
|
+
`@adonis-agora/filter`: `{ after?, first? }` entra, `{ items, nextCursor, prevCursor, hasNext, hasPrev }`
|
|
11
|
+
sai. Um consumidor que aprende a paginar uma lib paginou todas.
|
|
12
|
+
|
|
13
|
+
Os tipos vivem em `@adonis-agora/agent` (`CursorPage`, `CursorParams`, exportados da raiz) e espelham os do
|
|
14
|
+
`@adonis-agora/filter` **estruturalmente** — sem dependência entre os pacotes, por convenção do
|
|
15
|
+
ecossistema. O `-dashboard` carrega a mesma declaração no seu `client/types.ts`, como já fazia com todas as
|
|
16
|
+
outras wire shapes.
|
|
17
|
+
|
|
18
|
+
**Forward-only, e isso está no tipo.** Os dois backends aqui só sabem avançar — o `scroll` do Qdrant
|
|
19
|
+
devolve um `next_page_offset` opaco e nenhum token de volta, e o read-model de runs pagina com um cursor
|
|
20
|
+
opaco pra frente. Então `CursorParams` NÃO tem `before`/`last` (um parâmetro que compila e não faz nada é
|
|
21
|
+
pior que um que não existe), e todo `CursorPage` daqui sai com `prevCursor: null` / `hasPrev: false`. Esses
|
|
22
|
+
dois campos ficam porque o ponto é ser a MESMA forma do `@adonis-agora/filter`: quem escreveu contra um
|
|
23
|
+
renderiza o outro sem condicional, e uma superfície que ganhar paginação pra trás preenche os campos sem
|
|
24
|
+
quebrar ninguém. São constantes, não bug.
|
|
25
|
+
|
|
26
|
+
Como é 0.x, o breaking sai como **minor** (convenção semver de 0.x).
|
|
27
|
+
|
|
28
|
+
### 1. `QdrantStore.scrollChunks` — uma PÁGINA por chamada, não a coleção inteira
|
|
29
|
+
|
|
30
|
+
`scrollChunks` drenava o cursor até o fim e devolvia um array. Agora é uma superfície paginada de verdade:
|
|
31
|
+
uma ida de rede, `first` é o `limit` do scroll, `nextCursor` embrulha o `next_page_offset` do Qdrant em
|
|
32
|
+
base64url — **opaco**, justamente pra ninguém passar a depender de ele ser um id de ponto. Devolver esse
|
|
33
|
+
cursor adulterado agora falha com erro nomeado em vez de rebobinar em silêncio pra primeira página (um
|
|
34
|
+
scroll que rebobina reprocessa chunks que um painel de deleção já tratou).
|
|
35
|
+
|
|
36
|
+
`pageSize` virou `first` (mesmo default, 256) e `maxPages` sumiu: com uma página por chamada, o teto de
|
|
37
|
+
páginas é o laço de quem chama. O `MAX_SCROLL_PAGES` interno segue guardando os scrolls que a store ainda
|
|
38
|
+
drena sozinha (`listDocuments`, `listDocumentIds`, `updateMetadata`).
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
// antes — drenava tudo, guardado por maxPages
|
|
42
|
+
const payloads = await store.scrollChunks({ filter, payloadKeys: ['id'], pageSize: 256 });
|
|
43
|
+
|
|
44
|
+
// depois — uma página; drenar é um laço seu sobre nextCursor
|
|
45
|
+
const page = await store.scrollChunks({ filter, payloadKeys: ['id'], first: 256 });
|
|
46
|
+
page.items; // Record<string, unknown>[]
|
|
47
|
+
|
|
48
|
+
const all: Record<string, unknown>[] = [];
|
|
49
|
+
let after: string | undefined;
|
|
50
|
+
do {
|
|
51
|
+
const p = await store.scrollChunks({ filter, ...(after ? { after } : {}) });
|
|
52
|
+
all.push(...p.items);
|
|
53
|
+
after = p.nextCursor ?? undefined;
|
|
54
|
+
} while (after !== undefined);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`facetValues(field, { limit })` virou `facetValues(field, { first })` — mesmo default (200), só o nome do
|
|
58
|
+
tamanho de página alinhado ao `CursorParams`. Ele **não** virou `CursorPage`, de propósito: o endpoint
|
|
59
|
+
`/facet` do Qdrant devolve os top-`first` valores de uma vez e não emite token de continuação nenhum, então
|
|
60
|
+
um envelope de página aqui anunciaria um `nextCursor` que só poderia ser `null` pra sempre. Facet é
|
|
61
|
+
agregado com teto; `scrollChunks` é a superfície paginada. `countChunks` (um número) segue igual.
|
|
62
|
+
|
|
63
|
+
`PgVectorStore`/`MemoryVectorStore` não precisaram mudar: `scrollChunks`/`facetValues`/`countChunks` são
|
|
64
|
+
capacidades do Qdrant, não estão na interface `VectorStore` que as três stores implementam, então não há
|
|
65
|
+
como as duas formas divergirem.
|
|
66
|
+
|
|
67
|
+
### 2. `AgentGovernanceQueries.listRuns` — mesmos cursores, nomes do ecossistema
|
|
68
|
+
|
|
69
|
+
Já era baseado em cursor, só com nomes próprios. `ListRunsResult` agora é literalmente
|
|
70
|
+
`CursorPage<RunSummaryRow>`: as linhas saem em **`items`** (não `runs`), com `prevCursor`/`hasPrev`
|
|
71
|
+
constantes.
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
// antes
|
|
75
|
+
const page = await gov.listRuns({ status: 'failed', limit: 50, cursor: prev });
|
|
76
|
+
page.runs;
|
|
77
|
+
page.nextCursor;
|
|
78
|
+
|
|
79
|
+
// depois
|
|
80
|
+
const page = await gov.listRuns({ status: 'failed', first: 50, after: prev });
|
|
81
|
+
page.items;
|
|
82
|
+
page.nextCursor; // + prevCursor: null, hasNext, hasPrev: false
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Quem implementa `AgentGovernanceQueries` por fora precisa renomear `runs` → `items` e devolver os três
|
|
86
|
+
campos novos. As duas implementações que este pacote traz (`LucidGovernanceQueries` e a
|
|
87
|
+
`InMemoryGovernanceQueries` de teste) já vieram atualizadas.
|
|
88
|
+
|
|
89
|
+
**Rota HTTP** — `GET /agent/governance/runs` troca a query string e o corpo:
|
|
90
|
+
|
|
91
|
+
```diff
|
|
92
|
+
- GET /agent/governance/runs?limit=50&cursor=<opaco>
|
|
93
|
+
- { "runs": [...], "nextCursor": "<opaco>" }
|
|
94
|
+
+ GET /agent/governance/runs?first=50&after=<opaco>
|
|
95
|
+
+ { "items": [...], "nextCursor": "<opaco>", "prevCursor": null, "hasNext": true, "hasPrev": false }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
O `?limit=` continua existindo — só nas listas com TETO, que não são paginadas por cursor
|
|
99
|
+
(`recentToolCalls`, `recentThreads`, a caixa de aprovações). A regra é essa: superfície com cursor fala
|
|
100
|
+
`after`/`first`; top-N com teto fala `limit`.
|
|
101
|
+
|
|
102
|
+
**Cliente do console** — `AgentClient.listRuns({ cursor, limit })` virou `listRuns({ after, first })` e
|
|
103
|
+
devolve `CursorPage`. O provider do Telescope (`agent.runs.recent`) e o hook `useRuns` da SPA já
|
|
104
|
+
acompanham; a UI do console não muda.
|
|
105
|
+
|
|
106
|
+
- [#112](https://github.com/DavideCarvalho/adonis-agora-agent/pull/112) [`3b7c240`](https://github.com/DavideCarvalho/adonis-agora-agent/commit/3b7c2403d6ee37555e40e18d02c0114962f90e95) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Require zod 4: the optional `zod` peer narrows from `^3.23.0 || ^4.0.0` to `^4.0.0`.
|
|
107
|
+
|
|
108
|
+
The zod 3 half was a promise this package could not keep. `@adonis-agora/durable` — which agent
|
|
109
|
+
peers on — types its public step API with zod 4 (`import type { z } from 'zod'`), and a zod 3 schema
|
|
110
|
+
does **not** satisfy zod 4's `ZodType`: an app on zod 3 was already broken against the published
|
|
111
|
+
ecosystem, it just failed later and less clearly. Narrowing makes the manifest honest.
|
|
112
|
+
|
|
113
|
+
The peer stays **optional** — nothing changes for an app that never passes a zod schema. If you are
|
|
114
|
+
still on zod 3, upgrade to zod 4 (`z.object`/`z.string()`/`z.infer`, the surface agent uses, is
|
|
115
|
+
unchanged across the major).
|
|
116
|
+
|
|
3
117
|
## 0.30.2
|
|
4
118
|
|
|
5
119
|
### Patch Changes
|