@adonis-agora/agent 0.19.1 → 0.21.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +39 -1
  3. package/dist/assets/spa/assets/index-BYLm0nq8.css +1 -0
  4. package/dist/assets/spa/assets/index-CkOAJYbh.js +9 -0
  5. package/dist/assets/spa/index.html +13 -0
  6. package/dist/configure.d.ts +11 -6
  7. package/dist/configure.d.ts.map +1 -1
  8. package/dist/configure.js +12 -6
  9. package/dist/configure.js.map +1 -1
  10. package/dist/providers/agent_provider.d.ts.map +1 -1
  11. package/dist/providers/agent_provider.js +60 -2
  12. package/dist/providers/agent_provider.js.map +1 -1
  13. package/dist/providers/dashboard_provider.d.ts +55 -0
  14. package/dist/providers/dashboard_provider.d.ts.map +1 -0
  15. package/dist/providers/dashboard_provider.js +152 -0
  16. package/dist/providers/dashboard_provider.js.map +1 -0
  17. package/dist/src/dashboard/define_config.d.ts +75 -0
  18. package/dist/src/dashboard/define_config.d.ts.map +1 -0
  19. package/dist/src/dashboard/define_config.js +56 -0
  20. package/dist/src/dashboard/define_config.js.map +1 -0
  21. package/dist/src/dashboard/gate.d.ts +33 -0
  22. package/dist/src/dashboard/gate.d.ts.map +1 -0
  23. package/dist/src/dashboard/gate.js +52 -0
  24. package/dist/src/dashboard/gate.js.map +1 -0
  25. package/dist/src/dashboard/index.d.ts +20 -0
  26. package/dist/src/dashboard/index.d.ts.map +1 -0
  27. package/dist/src/dashboard/index.js +20 -0
  28. package/dist/src/dashboard/index.js.map +1 -0
  29. package/dist/src/dashboard/paths.d.ts +40 -0
  30. package/dist/src/dashboard/paths.d.ts.map +1 -0
  31. package/dist/src/dashboard/paths.js +99 -0
  32. package/dist/src/dashboard/paths.js.map +1 -0
  33. package/dist/src/index.d.ts +1 -1
  34. package/dist/src/index.js +1 -1
  35. package/dist/src/spi/governance-queries.d.ts +49 -0
  36. package/dist/src/spi/governance-queries.d.ts.map +1 -1
  37. package/dist/src/stores/lucid-governance-queries.d.ts +10 -2
  38. package/dist/src/stores/lucid-governance-queries.d.ts.map +1 -1
  39. package/dist/src/stores/lucid-governance-queries.js +92 -1
  40. package/dist/src/stores/lucid-governance-queries.js.map +1 -1
  41. package/dist/src/testing/in-memory-governance-queries.d.ts +8 -1
  42. package/dist/src/testing/in-memory-governance-queries.d.ts.map +1 -1
  43. package/dist/src/testing/in-memory-governance-queries.js +74 -0
  44. package/dist/src/testing/in-memory-governance-queries.js.map +1 -1
  45. package/dist/stubs/config/agent.stub +7 -0
  46. package/package.json +34 -24
package/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # @adonis-agora/agent
2
2
 
3
+ ## 0.21.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`58783fb`](https://github.com/DavideCarvalho/adonis-agora-agent/commit/58783fb433fd3c641dc9a42b80eaba09f2c9a62b) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - `@adonis-agora/agent` now ships its own governance dashboard — `node ace configure @adonis-agora/agent` registers an embedded `dashboard_provider` that serves the `@adonis-agora/agent-dashboard` SPA straight out of `@adonis-agora/agent`'s own build (`../dashboard/dist/spa` is copied into `dist/assets/spa` at build time), so a new app needs no separate install or provider registration to get the console. Configure it via the same optional `config('agent').dashboard` block as before.
8
+
9
+ This is purely additive: the standalone `@adonis-agora/agent-dashboard` package and its own `agent_dashboard_provider` keep working exactly as before for apps that already install and register it directly — both providers now share one implementation (`@adonis-agora/agent/dashboard`, a new subpath export) so their behavior is byte-for-byte identical. Register only one of the two in a given app; mounting both at the same path throws AdonisJS's "duplicate route" error at boot.
10
+
11
+ `@adonis-agora/agent-dashboard`'s peer dependency floor on `@adonis-agora/agent` moves to `>=0.21.0` (the version that introduces the shared `@adonis-agora/agent/dashboard` export its provider now imports from); already-published `agent-dashboard` versions are unaffected.
12
+
13
+ ## 0.20.0
14
+
15
+ ### Minor Changes
16
+
17
+ - [`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.
18
+
19
+ The `pricingStore` bound to the agent (default-mirrored from a Lucid `store`, or opt-in for other
20
+ backends) was already driving cost accounting for runs, but had no read/write surface of its own —
21
+ operators had to reach for the database directly to see or change a model's per-1M-token rates. The
22
+ two new routes expose `AgentPricingStore.listCurrentPrices()`/`upsertModelPrice()` behind the same
23
+ authenticated + authorized governance gate as every other `/agent/governance/*` route, mounted only
24
+ when a pricing store is bound. The dashboard's new "Pricing" section reads and edits rates through
25
+ them.
26
+
27
+ - [`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
28
+ reach by clicking a row in the console's Recent threads table.
29
+
30
+ `AgentGovernanceQueries` gets a new optional `threadDetail(threadId)` method returning the thread's
31
+ metadata plus a lifetime usage rollup (total tokens, cost, run/message counts) and its most recent
32
+ runs/messages — implemented in both `LucidGovernanceQueries` and `InMemoryGovernanceQueries`. It's
33
+ optional so a third-party or pre-existing adapter that predates it doesn't break: the route responds
34
+ `501` instead of the dashboard hitting a missing endpoint.
35
+
36
+ The Recent threads and Tool calls panels also gain "Load more" pagination instead of a fixed row cap.
37
+
38
+ - [`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
39
+ and failure counts per agent, highest call count first) and `trend` (daily run/failure counts over the
40
+ same range, oldest first) — implemented in both `LucidGovernanceQueries` and
41
+ `InMemoryGovernanceQueries`. Both are optional so an adapter that predates them can keep returning the
42
+ existing shape; the dashboard's Reliability section renders a trend chart and a by-agent breakdown when
43
+ present and stays as before when absent.
44
+
3
45
  ## 0.19.1
4
46
 
5
47
  ### Patch Changes
package/README.md CHANGED
@@ -187,6 +187,44 @@ const { text } = await runAgentLoop(
187
187
  )
188
188
  ```
189
189
 
190
+ ## Dashboard
191
+
192
+ `node ace configure @adonis-agora/agent` also registers an embedded governance console — the
193
+ `@adonis-agora/agent-dashboard` React SPA, bundled straight into `@adonis-agora/agent`'s own `dist/`
194
+ at build time. **No separate install, no separate provider registration.** It mounts at
195
+ `<path>/dashboard` (default `/agent/dashboard`) once `governanceAuthorize` is configured — every panel
196
+ but Quota reads the cross-actor `/agent/governance/*` routes, and those don't exist without that gate
197
+ either, so the console refuses to mount (with a boot warning explaining why) rather than load and 404
198
+ on every panel:
199
+
200
+ ```ts
201
+ // config/agent.ts
202
+ export default defineConfig({
203
+ // ...
204
+ governanceAuthorize: (actor) => actor.roles?.includes('ADMIN') ?? false,
205
+ // dashboard: { enabled: true, path: '/agent/dashboard', authorize: (actor) => actor.roles?.includes('ADMIN') ?? false },
206
+ })
207
+ ```
208
+
209
+ See [Governance dashboard](./docs/governance/dashboard.mdx) for the full config shape.
210
+
211
+ <details>
212
+ <summary>Standalone install (still supported)</summary>
213
+
214
+ `@adonis-agora/agent-dashboard` also ships as its own installable package with its own provider, for
215
+ apps that want its independent release cadence or that configured it before the embedded provider
216
+ existed:
217
+
218
+ ```sh
219
+ pnpm add @adonis-agora/agent-dashboard
220
+ node ace add @adonis-agora/agent-dashboard
221
+ ```
222
+
223
+ It reads the SAME `config('agent').dashboard` block. Register only ONE of the two providers — mounting
224
+ both at the same path throws AdonisJS's "duplicate route" error at boot.
225
+
226
+ </details>
227
+
190
228
  ## Diagnostics
191
229
 
192
230
  Runtime events flow through `@adonis-agora/agent/telescope`'s watcher when
@@ -203,7 +241,7 @@ or a real model provider.
203
241
 
204
242
  - Repo: https://github.com/DavideCarvalho/adonis-agent
205
243
  - Changelog: https://github.com/DavideCarvalho/adonis-agent/blob/master/packages/adonis/CHANGELOG.md
206
- - Companion package: [`@adonis-agora/agent-dashboard`](https://github.com/DavideCarvalho/adonis-agent/tree/master/packages/dashboard)
244
+ - Companion package (also embedded automatically, see [Dashboard](#dashboard) above): [`@adonis-agora/agent-dashboard`](https://github.com/DavideCarvalho/adonis-agent/tree/master/packages/dashboard)
207
245
 
208
246
  ## License
209
247
 
@@ -0,0 +1 @@
1
+ :root{--agora-primary: #5a45ff;--agora-primary-soft: hsl(250 74% 51% / .14);--agora-accent: #06b6d4;--bg: hsl(240 10% 6.5%);--panel: hsl(240 9% 9%);--panel-2: hsl(240 9% 11%);--line: hsl(40 30% 82% / .1);--line-soft: hsl(40 30% 82% / .05);--text: hsl(40 28% 92%);--muted: hsl(40 12% 66%);--primary: var(--agora-primary);--primary-fg: hsl(40 40% 96%);--good: #34d399;--warn: #fbbf24;--bad: #f87171;--info: var(--agora-accent)}:root[data-theme=light],:root:not([data-theme=dark]){color-scheme:light}:root[data-theme=dark]{color-scheme:dark}@media(prefers-color-scheme:light){:root:not([data-theme=dark]){--bg: hsl(40 30% 96%);--panel: hsl(40 28% 98%);--panel-2: hsl(40 24% 95%);--line: hsl(240 10% 14% / .12);--line-soft: hsl(240 10% 14% / .06);--text: hsl(240 14% 12%);--muted: hsl(240 6% 42%);--primary-fg: hsl(40 40% 97%)}}:root[data-theme=light]{--bg: hsl(40 30% 96%);--panel: hsl(40 28% 98%);--panel-2: hsl(40 24% 95%);--line: hsl(240 10% 14% / .12);--line-soft: hsl(240 10% 14% / .06);--text: hsl(240 14% 12%);--muted: hsl(240 6% 42%);--primary-fg: hsl(40 40% 97%)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;-webkit-font-smoothing:antialiased}.mono{font-family:ui-monospace,JetBrains Mono,SF Mono,Menlo,monospace}.tnum{font-variant-numeric:tabular-nums}.app-bg{position:fixed;inset:0;z-index:0;pointer-events:none;background-image:radial-gradient(900px 420px at 82% -10%,hsl(250 74% 51% / .12),transparent 70%),radial-gradient(700px 360px at 8% -12%,hsl(190 90% 50% / .06),transparent 70%);opacity:.9}.shell{position:relative;z-index:1;max-width:1180px;margin:0 auto;padding:28px 24px 64px}.masthead{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:22px}.brand{display:flex;align-items:center;gap:12px}.brand-mark{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;color:var(--primary-fg);background:linear-gradient(140deg,var(--agora-primary),#8b78ff);box-shadow:0 6px 20px #4426df59;font-weight:700}.brand h1{font-size:17px;margin:0;letter-spacing:-.01em}.brand p{margin:1px 0 0;font-size:12px;color:var(--muted)}.tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:20px}.tab{appearance:none;border:1px solid var(--line);background:var(--panel);color:var(--muted);border-radius:999px;padding:7px 14px;font-size:13px;cursor:pointer;display:inline-flex;align-items:center;gap:7px;transition:color .15s,border-color .15s,background .15s}.tab:hover{color:var(--text)}.tab[aria-selected=true]{color:var(--primary-fg);background:var(--primary);border-color:var(--primary)}.controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.range-input{background:var(--panel);border:1px solid var(--line);color:var(--text);border-radius:8px;padding:6px 9px;font-size:12px;font-family:inherit}.icon-btn{appearance:none;border:1px solid var(--line);background:var(--panel);color:var(--muted);border-radius:8px;width:34px;height:32px;cursor:pointer;display:grid;place-items:center}.icon-btn:hover{color:var(--text)}.panel{background:linear-gradient(180deg,var(--panel-2),var(--panel));border:1px solid var(--line);border-radius:14px;padding:18px}.grid{display:grid;gap:16px}.grid.cols-3{grid-template-columns:repeat(3,1fr)}.grid.cols-2{grid-template-columns:repeat(2,1fr)}.grid.stat-4{grid-template-columns:repeat(4,1fr)}@media(max-width:900px){.grid.cols-3,.grid.cols-2,.grid.stat-4{grid-template-columns:repeat(2,1fr)}}@media(max-width:560px){.grid.cols-3,.grid.cols-2,.grid.stat-4{grid-template-columns:1fr}}.stat .label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin-bottom:8px}.stat .value{font-size:24px;font-weight:600;letter-spacing:-.02em}.stat .sub{font-size:12px;color:var(--muted);margin-top:4px}.section-title{display:flex;align-items:center;justify-content:space-between;margin:0 0 14px;gap:12px}.section-title h2{font-size:14px;margin:0;letter-spacing:.01em}.section-title .hint{font-size:12px;color:var(--muted)}.table{width:100%;border-collapse:collapse;font-size:13px}.table th{text-align:left;font-weight:500;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);padding:0 10px 10px;border-bottom:1px solid var(--line)}.table td{padding:10px;border-bottom:1px solid var(--line-soft);vertical-align:middle}.table tr:last-child td{border-bottom:none}.table .num{text-align:right}.table-wrap{overflow-x:auto}.bar{height:6px;border-radius:999px;background:var(--line);overflow:hidden;min-width:60px}.bar>span{display:block;height:100%;border-radius:999px;background:var(--primary)}.legend{display:flex;flex-direction:column;gap:8px;font-size:12px}.legend .row{display:flex;align-items:center;gap:8px}.swatch{width:10px;height:10px;border-radius:3px;flex:none}.legend .name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pill{display:inline-flex;align-items:center;gap:6px;padding:2px 9px;border-radius:999px;font-size:11px;border:1px solid var(--line);color:var(--muted)}.dot{width:7px;height:7px;border-radius:999px;background:currentColor;display:inline-block}.s-completed,.s-ok,.s-success,.s-approved{color:var(--good)}.s-running,.s-pending,.s-pending_approval,.s-awaiting_approval{color:var(--info)}.s-failed,.s-error,.s-rejected,.s-forbidden{color:var(--bad)}.s-cancelled,.s-canceled{color:var(--warn)}.btn{appearance:none;border:1px solid var(--line);background:var(--panel);color:var(--text);border-radius:8px;padding:6px 12px;font-size:12px;font-family:inherit;cursor:pointer;transition:color .15s,border-color .15s,background .15s}.btn:hover:not(:disabled){border-color:var(--muted)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn.approve{color:var(--good);border-color:color-mix(in srgb,var(--good) 40%,var(--line))}.btn.reject{color:var(--bad);border-color:color-mix(in srgb,var(--bad) 40%,var(--line))}.rowbtns{display:inline-flex;gap:6px;justify-content:flex-end}.table tr.clickable{cursor:pointer}.table tr.clickable:hover td{background:var(--panel-2)}.th-sort{appearance:none;background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;text-transform:inherit;letter-spacing:inherit;cursor:pointer}.th-sort:hover{color:var(--text)}.warnnum{color:var(--warn)}.msg{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:var(--panel-2)}.msg-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.msg-body{font-size:13px;white-space:pre-wrap;word-break:break-word}.empty{color:var(--muted);font-size:13px;text-align:center;padding:26px 10px}.err{color:var(--bad);font-size:13px;padding:20px 10px;text-align:center}.skeleton{border-radius:8px;background:linear-gradient(90deg,var(--line-soft),var(--line),var(--line-soft));background-size:200% 100%;animation:shimmer 1.3s ease-in-out infinite;height:14px}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.stack{display:flex;flex-direction:column;gap:16px}.muted{color:var(--muted)}.right{text-align:right}.chart-svg{width:100%;height:auto;display:block}.foot{margin-top:26px;font-size:11px;color:var(--muted);text-align:center}