@adonis-agora/agent-dashboard 0.3.2 → 0.5.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 +98 -0
- package/dist/providers/agent_dashboard_provider.d.ts +4 -0
- package/dist/providers/agent_dashboard_provider.d.ts.map +1 -1
- package/dist/providers/agent_dashboard_provider.js +13 -2
- package/dist/providers/agent_dashboard_provider.js.map +1 -1
- package/dist/spa/assets/index-CkOAJYbh.js +9 -0
- package/dist/spa/index.html +1 -1
- package/dist/src/client/agent-client.d.ts +9 -1
- package/dist/src/client/agent-client.d.ts.map +1 -1
- package/dist/src/client/agent-client.js +13 -0
- package/dist/src/client/agent-client.js.map +1 -1
- package/dist/src/client/types.d.ts +55 -1
- package/dist/src/client/types.d.ts.map +1 -1
- package/dist/src/server/define_config.d.ts +39 -3
- package/dist/src/server/define_config.d.ts.map +1 -1
- package/dist/src/server/define_config.js +46 -0
- package/dist/src/server/define_config.js.map +1 -1
- package/dist/src/server/gate.d.ts +17 -5
- package/dist/src/server/gate.d.ts.map +1 -1
- package/dist/src/server/gate.js +17 -5
- package/dist/src/server/gate.js.map +1 -1
- package/package.json +11 -9
- package/dist/spa/assets/index-DR5D-Xzw.js +0 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,103 @@
|
|
|
1
1
|
# @adonis-agora/agent-dashboard
|
|
2
2
|
|
|
3
|
+
## 0.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`4e3a372`](https://github.com/DavideCarvalho/adonis-agent/commit/4e3a372e9ecf53ec4c34bbe31ab6177262b0dcd5) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Add `GET`/`POST /agent/governance/pricing` and a Pricing panel in the console.
|
|
8
|
+
|
|
9
|
+
The `pricingStore` bound to the agent (default-mirrored from a Lucid `store`, or opt-in for other
|
|
10
|
+
backends) was already driving cost accounting for runs, but had no read/write surface of its own —
|
|
11
|
+
operators had to reach for the database directly to see or change a model's per-1M-token rates. The
|
|
12
|
+
two new routes expose `AgentPricingStore.listCurrentPrices()`/`upsertModelPrice()` behind the same
|
|
13
|
+
authenticated + authorized governance gate as every other `/agent/governance/*` route, mounted only
|
|
14
|
+
when a pricing store is bound. The dashboard's new "Pricing" section reads and edits rates through
|
|
15
|
+
them.
|
|
16
|
+
|
|
17
|
+
- [`4e3a372`](https://github.com/DavideCarvalho/adonis-agent/commit/4e3a372e9ecf53ec4c34bbe31ab6177262b0dcd5) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Add a thread governance drill-down: `GET /agent/governance/threads/:id` and a `ThreadDetailView` you
|
|
18
|
+
reach by clicking a row in the console's Recent threads table.
|
|
19
|
+
|
|
20
|
+
`AgentGovernanceQueries` gets a new optional `threadDetail(threadId)` method returning the thread's
|
|
21
|
+
metadata plus a lifetime usage rollup (total tokens, cost, run/message counts) and its most recent
|
|
22
|
+
runs/messages — implemented in both `LucidGovernanceQueries` and `InMemoryGovernanceQueries`. It's
|
|
23
|
+
optional so a third-party or pre-existing adapter that predates it doesn't break: the route responds
|
|
24
|
+
`501` instead of the dashboard hitting a missing endpoint.
|
|
25
|
+
|
|
26
|
+
The Recent threads and Tool calls panels also gain "Load more" pagination instead of a fixed row cap.
|
|
27
|
+
|
|
28
|
+
- [`4e3a372`](https://github.com/DavideCarvalho/adonis-agent/commit/4e3a372e9ecf53ec4c34bbe31ab6177262b0dcd5) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - `RunReliability` (from `GET /agent/governance/reliability`) gains two optional fields: `byAgent` (run
|
|
29
|
+
and failure counts per agent, highest call count first) and `trend` (daily run/failure counts over the
|
|
30
|
+
same range, oldest first) — implemented in both `LucidGovernanceQueries` and
|
|
31
|
+
`InMemoryGovernanceQueries`. Both are optional so an adapter that predates them can keep returning the
|
|
32
|
+
existing shape; the dashboard's Reliability section renders a trend chart and a by-agent breakdown when
|
|
33
|
+
present and stays as before when absent.
|
|
34
|
+
|
|
35
|
+
## 0.4.0
|
|
36
|
+
|
|
37
|
+
### Minor Changes
|
|
38
|
+
|
|
39
|
+
- [`05ea997`](https://github.com/DavideCarvalho/adonis-agent/commit/05ea997c6c9d4f20497ca0a1f81a1e09b77141b3) - O console de governança agora também se recusa a montar quando `governanceQueries: false`, não só quando falta o `governanceAuthorize`.
|
|
40
|
+
|
|
41
|
+
Os dois casos produzem o MESMO console quebrado — 10 dos 11 endpoints de leitura do console são `/agent/governance/*`, e sem read-model essas rotas não existem, então todo painel menos o Quota dá 404 no clique. Antes, `governanceQueries: false` com um gate configurado passava pela checagem de mount e servia esse console morto sem nada explicando o motivo.
|
|
42
|
+
|
|
43
|
+
**Como voltar a ter o console:** o aviso de boot agora nomeia QUAL das duas peças falta, porque as duas quebram igual e mensagem genérica não ajuda ninguém a diagnosticar.
|
|
44
|
+
|
|
45
|
+
- Faltando o gate → configure `governanceAuthorize` em `config/agent.ts` (tipicamente uma checagem de ADMIN), ou `governanceAuthorize: () => true` pra restaurar deliberadamente o comportamento antigo de deixar QUALQUER ator autenticado ler.
|
|
46
|
+
- `governanceQueries: false` → remova essa linha (omitir dá o read-model Lucid quando o store principal é Lucid) ou passe um store/factory explícito.
|
|
47
|
+
- Pra manter o console desligado de propósito e sem aviso: `dashboard: { enabled: false }`.
|
|
48
|
+
|
|
49
|
+
Só um `false` explícito em `governanceQueries` bloqueia o mount. `undefined` NÃO é esse caso: o provider do agent resolve o read-model Lucid por default quando o store principal é Lucid, então omitir a chave continua montando o console normalmente.
|
|
50
|
+
|
|
51
|
+
`GET /agent/approvals/mine` segue inalterado — montado e escopado ao ator chamador.
|
|
52
|
+
|
|
53
|
+
- [`fa39b5f`](https://github.com/DavideCarvalho/adonis-agent/commit/fa39b5faef317fb47cf1fbb8fe29cec448270d21) - **If your governance console suddenly 404s, or every panel in it is failing: set `governanceAuthorize` in `config/agent.ts`.**
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
// config/agent.ts
|
|
57
|
+
export default defineConfig({
|
|
58
|
+
// ...
|
|
59
|
+
governanceAuthorize: (actor) => actor.roles?.includes("ADMIN") ?? false,
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
That one line brings both the console and its data back. If you deliberately want the old behaviour where any authenticated actor could read the platform-wide governance data, say so explicitly with `governanceAuthorize: () => true` — same effect, but greppable and reviewable.
|
|
64
|
+
|
|
65
|
+
**Why.** The cross-actor `/agent/governance/*` read routes stopped mounting without a `governanceAuthorize` gate (see the previous `@adonis-agora/agent` release). Ten of the console's eleven read endpoints are those routes, and the SPA calls them **from the browser** — so an app with the dashboard installed and no gate got a console that loaded fine and then failed on every panel except Quota, with nothing in the logs explaining it.
|
|
66
|
+
|
|
67
|
+
**What changed.** `@adonis-agora/agent-dashboard` now refuses to mount when the agent config has no `governanceAuthorize`, and logs a boot warning naming both fixes above. The console URL returns `404` instead of serving a shell that cannot work. Nothing that still worked is broken by this: every affected app already had a console dead in six of its seven views.
|
|
68
|
+
|
|
69
|
+
Unaffected:
|
|
70
|
+
|
|
71
|
+
- Apps that already set `governanceAuthorize` — no change whatsoever.
|
|
72
|
+
- `dashboard: { enabled: false }` — still off, still silent, no warning.
|
|
73
|
+
- `dashboard.authorize` — still an optional EXTRA gate on the SPA shell, unchanged. It is deliberately not what decides whether the console mounts: it gates the shell, not the data, so an app could set it and still have a console with nothing to render.
|
|
74
|
+
- `GET /agent/approvals/mine` — never behind the governance gate; still mounted and still scoped to the calling actor.
|
|
75
|
+
|
|
76
|
+
The `@adonis-agora/agent` half of this release is documentation only: the `governanceAuthorize` JSDoc and the `governance-gate.ts` comments still described the old open-by-default behaviour they no longer have. `evaluateGovernanceGate`'s behaviour is unchanged.
|
|
77
|
+
|
|
78
|
+
### Patch Changes
|
|
79
|
+
|
|
80
|
+
- [`63b9b08`](https://github.com/DavideCarvalho/adonis-agent/commit/63b9b08caa19a092965a465612215254fbb14997) - **No published version of either package is affected.** This is a repo-tooling fix with no runtime change — nothing in `src/` moved. Checked rather than assumed: the live tarballs for `@adonis-agora/agent@0.17.0` and `@adonis-agora/agent-dashboard@0.3.2` contain 105 and 13 `.js` files respectively, exactly what a full local build emits. The release workflow publishes from a cold `actions/checkout`, which has no `dist/` and no `.tsbuildinfo` to go stale, so the defect below could not reach npm. It could reach a contributor's working copy, and did.
|
|
81
|
+
|
|
82
|
+
`pnpm build` could exit `0` having emitted no JavaScript. `tsc` ran with `incremental: true` against a `.tsbuildinfo` that records what it already wrote to `dist/`; delete `dist/` and leave the buildinfo behind and `tsc` concludes every output is current and emits nothing. In `@adonis-agora/agent`, `copy:stubs` is a plain `cp` and ran anyway, so `dist/` came out holding four stub files and zero `.js`. Turbo then cached that empty directory as a _successful_ `build` and replayed it onto clean trees — a later `pnpm build` on a freshly wiped checkout restored the vacuum as `FULL TURBO` in 32ms. Downstream, `packages/dashboard` failed with `TS2307: Cannot find module '@adonis-agora/agent'` against the package that had just "built".
|
|
83
|
+
|
|
84
|
+
Both packages are fixed the same way:
|
|
85
|
+
|
|
86
|
+
- `build` removes `dist/` up front and compiles through a new `tsconfig.build.json` with `incremental: false`, so an emit is always a full emit and no state survives to disagree with `dist/`.
|
|
87
|
+
- A new `scripts/assert-build-output.mjs` runs as the last step of `build` and fails it if `dist/` holds no JavaScript or is missing the package entrypoint. It runs inside the build, so it also covers `prepack` — which never goes through turbo, and is the path a manual `pnpm publish` would take.
|
|
88
|
+
- `build` and `typecheck` no longer share a buildinfo. `typecheck` keeps `.typecheck.tsbuildinfo`; `build` keeps none at all. `turbo.json` is unchanged.
|
|
89
|
+
|
|
90
|
+
If you have a checkout in the broken state, the guard now prints the way out — and the command it prints works, which took a second pass to get right: the buildinfo files are dotfiles and a shell `*` does not match those.
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
rm -rf dist .*tsbuildinfo *.tsbuildinfo
|
|
94
|
+
pnpm run build
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The dashboard's exposure needed a different guard. Its `build` is `vite build && tsc`, and vite keeps populating `dist/spa/` whatever `tsc` does — a `dist/` with no provider in it still holds a dozen `.js` files. Counting JavaScript would have passed it, so `check:dist` there asserts the entrypoint by name.
|
|
98
|
+
|
|
99
|
+
Neither a count nor a named entrypoint is enough on its own. A _partial_ emit was observed during this fix: `dist/` came out holding exactly one `.js`, `src/index.js`, which satisfies both checks — and because `index.d.ts` was there too, the dashboard compiled against it without a single `TS2307`. Every subpath export (`@adonis-agora/agent/rag-media`, `/durable`, `/testing`, …) pointed at a file that did not exist, and the first thing to notice would have been a consumer's failed import. So the guard also walks `package.json`'s `exports` and requires every target it declares. That list is the package's real publish contract, and it maintains itself — adding an export adds a post-condition, with nobody having to remember. It also covers `@adonis-agora/agent-dashboard/client`, which the by-name check never looked at.
|
|
100
|
+
|
|
3
101
|
## 0.3.2
|
|
4
102
|
|
|
5
103
|
### Patch Changes
|
|
@@ -12,6 +12,10 @@ import type { ApplicationService } from '@adonisjs/core/types';
|
|
|
12
12
|
* - `GET <mount>/` → the SPA shell (`index.html`, with the resolved API base injected)
|
|
13
13
|
* - `GET <mount>/*` → a built asset, or the SPA shell as a fallback (client-rendered console)
|
|
14
14
|
*
|
|
15
|
+
* Nothing mounts unless the agent config carries a `governanceAuthorize` gate: without it the
|
|
16
|
+
* `/agent/governance/*` routes the console reads do not exist, so the console would load and fail on
|
|
17
|
+
* every panel but Quota. The provider declines and logs why (see `decideDashboardMount`).
|
|
18
|
+
*
|
|
15
19
|
* Enable/disable and override the mount via the optional `config('agent').dashboard` block.
|
|
16
20
|
*/
|
|
17
21
|
export default class AgentDashboardProvider {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent_dashboard_provider.d.ts","sourceRoot":"","sources":["../../providers/agent_dashboard_provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent_dashboard_provider.d.ts","sourceRoot":"","sources":["../../providers/agent_dashboard_provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAiB/D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB;IAC7B,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,+FAA+F;IAC/F,OAAO,CAAC,SAAS,CAAuC;IAElD,IAAI;IAsDV;;;;;OAKG;YACW,IAAI;IAalB;;;OAGG;YACW,SAAS;IAOvB,4FAA4F;YAC9E,SAAS;CAmBxB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { resolveDashboardConfig, } from '../src/server/define_config.js';
|
|
2
|
+
import { decideDashboardMount, resolveDashboardConfig, } from '../src/server/define_config.js';
|
|
3
3
|
import { evaluateDashboardGate } from '../src/server/gate.js';
|
|
4
4
|
import { apiBaseFor, contentTypeFor, injectApiBase, injectBaseHref, mountPathFor, safeAssetSegments, } from '../src/server/paths.js';
|
|
5
5
|
/**
|
|
@@ -15,6 +15,10 @@ import { apiBaseFor, contentTypeFor, injectApiBase, injectBaseHref, mountPathFor
|
|
|
15
15
|
* - `GET <mount>/` → the SPA shell (`index.html`, with the resolved API base injected)
|
|
16
16
|
* - `GET <mount>/*` → a built asset, or the SPA shell as a fallback (client-rendered console)
|
|
17
17
|
*
|
|
18
|
+
* Nothing mounts unless the agent config carries a `governanceAuthorize` gate: without it the
|
|
19
|
+
* `/agent/governance/*` routes the console reads do not exist, so the console would load and fail on
|
|
20
|
+
* every panel but Quota. The provider declines and logs why (see `decideDashboardMount`).
|
|
21
|
+
*
|
|
18
22
|
* Enable/disable and override the mount via the optional `config('agent').dashboard` block.
|
|
19
23
|
*/
|
|
20
24
|
export default class AgentDashboardProvider {
|
|
@@ -27,8 +31,15 @@ export default class AgentDashboardProvider {
|
|
|
27
31
|
async boot() {
|
|
28
32
|
const agentConfig = this.app.config.get('agent', {});
|
|
29
33
|
const dashboardConfig = resolveDashboardConfig(this.app.config.get('agent.dashboard', {}));
|
|
30
|
-
|
|
34
|
+
// Mount only when the console can actually work: every panel but Quota reads the agent's
|
|
35
|
+
// cross-actor `/agent/governance/*` routes, and those do not exist without a `governanceAuthorize`
|
|
36
|
+
// gate. Refusing here — loudly — beats serving a shell that 404s its own data with no explanation.
|
|
37
|
+
const decision = decideDashboardMount(dashboardConfig.enabled, agentConfig.governanceAuthorize, agentConfig.governanceQueries);
|
|
38
|
+
if (!decision.mount) {
|
|
39
|
+
if (decision.reason !== 'disabled')
|
|
40
|
+
console.warn(decision.warning);
|
|
31
41
|
return;
|
|
42
|
+
}
|
|
32
43
|
// Resolve the router from the container, NOT from `@adonisjs/core/services/router`: that service's
|
|
33
44
|
// default export is assigned inside an `app.booted()` hook, which runs AFTER every provider's
|
|
34
45
|
// `boot()` — so at this point the module default is still `undefined` and `router.get(...)` throws.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent_dashboard_provider.js","sourceRoot":"","sources":["../../providers/agent_dashboard_provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EAGL,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,YAAY,EACZ,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAEhC
|
|
1
|
+
{"version":3,"file":"agent_dashboard_provider.js","sourceRoot":"","sources":["../../providers/agent_dashboard_provider.ts"],"names":[],"mappings":"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"}
|