@adonis-agora/agent 0.65.1 → 0.66.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.
Files changed (136) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/src/ag-ui/core/encoder.d.ts.map +1 -1
  3. package/dist/src/ag-ui/core/encoder.js +6 -1
  4. package/dist/src/ag-ui/core/encoder.js.map +1 -1
  5. package/dist/src/ag-ui/frames.d.ts.map +1 -1
  6. package/dist/src/ag-ui/frames.js +1 -0
  7. package/dist/src/ag-ui/frames.js.map +1 -1
  8. package/dist/src/agent-loop.d.ts +12 -1
  9. package/dist/src/agent-loop.d.ts.map +1 -1
  10. package/dist/src/agent-loop.js +100 -14
  11. package/dist/src/agent-loop.js.map +1 -1
  12. package/dist/src/agent-service.d.ts +6 -0
  13. package/dist/src/agent-service.d.ts.map +1 -1
  14. package/dist/src/agent-service.js +10 -4
  15. package/dist/src/agent-service.js.map +1 -1
  16. package/dist/src/ai-sdk/ai-sdk-model.js +6 -2
  17. package/dist/src/ai-sdk/ai-sdk-model.js.map +1 -1
  18. package/dist/src/authz/authz-tool-authorizer.d.ts +1 -1
  19. package/dist/src/authz/authz-tool-authorizer.js +1 -1
  20. package/dist/src/channels/handler.d.ts.map +1 -1
  21. package/dist/src/channels/handler.js +6 -0
  22. package/dist/src/channels/handler.js.map +1 -1
  23. package/dist/src/client/chat-client.d.ts.map +1 -1
  24. package/dist/src/client/chat-client.js +5 -1
  25. package/dist/src/client/chat-client.js.map +1 -1
  26. package/dist/src/client/index.d.ts +1 -1
  27. package/dist/src/client/index.d.ts.map +1 -1
  28. package/dist/src/client/index.js +1 -1
  29. package/dist/src/client/index.js.map +1 -1
  30. package/dist/src/client/sse.d.ts +12 -0
  31. package/dist/src/client/sse.d.ts.map +1 -1
  32. package/dist/src/client/sse.js +18 -0
  33. package/dist/src/client/sse.js.map +1 -1
  34. package/dist/src/define_config.d.ts +1 -1
  35. package/dist/src/genui/catalog.d.ts +13 -0
  36. package/dist/src/genui/catalog.d.ts.map +1 -1
  37. package/dist/src/genui/catalog.js +4 -0
  38. package/dist/src/genui/catalog.js.map +1 -1
  39. package/dist/src/genui/index.d.ts +3 -2
  40. package/dist/src/genui/index.d.ts.map +1 -1
  41. package/dist/src/genui/index.js +3 -2
  42. package/dist/src/genui/index.js.map +1 -1
  43. package/dist/src/genui/progressive.d.ts +44 -0
  44. package/dist/src/genui/progressive.d.ts.map +1 -0
  45. package/dist/src/genui/progressive.js +101 -0
  46. package/dist/src/genui/progressive.js.map +1 -0
  47. package/dist/src/genui/public.d.ts +3 -2
  48. package/dist/src/genui/public.d.ts.map +1 -1
  49. package/dist/src/genui/public.js +1 -0
  50. package/dist/src/genui/public.js.map +1 -1
  51. package/dist/src/genui/tools.d.ts +29 -6
  52. package/dist/src/genui/tools.d.ts.map +1 -1
  53. package/dist/src/genui/tools.js +40 -6
  54. package/dist/src/genui/tools.js.map +1 -1
  55. package/dist/src/genui/tree.d.ts +26 -5
  56. package/dist/src/genui/tree.d.ts.map +1 -1
  57. package/dist/src/genui/tree.js +81 -12
  58. package/dist/src/genui/tree.js.map +1 -1
  59. package/dist/src/index.d.ts +2 -1
  60. package/dist/src/index.d.ts.map +1 -1
  61. package/dist/src/index.js +2 -1
  62. package/dist/src/index.js.map +1 -1
  63. package/dist/src/partial-json.d.ts +28 -0
  64. package/dist/src/partial-json.d.ts.map +1 -0
  65. package/dist/src/partial-json.js +231 -0
  66. package/dist/src/partial-json.js.map +1 -0
  67. package/dist/src/react/core/agent-chat-transport.d.ts.map +1 -1
  68. package/dist/src/react/core/agent-chat-transport.js +3 -0
  69. package/dist/src/react/core/agent-chat-transport.js.map +1 -1
  70. package/dist/src/react/core/approvals/use-action-proposals.d.ts +7 -0
  71. package/dist/src/react/core/approvals/use-action-proposals.d.ts.map +1 -1
  72. package/dist/src/react/core/approvals/use-action-proposals.js +54 -8
  73. package/dist/src/react/core/approvals/use-action-proposals.js.map +1 -1
  74. package/dist/src/react/core/genui/generative-ui.d.ts +29 -4
  75. package/dist/src/react/core/genui/generative-ui.d.ts.map +1 -1
  76. package/dist/src/react/core/genui/generative-ui.js +96 -40
  77. package/dist/src/react/core/genui/generative-ui.js.map +1 -1
  78. package/dist/src/react/core/genui/index.d.ts +2 -2
  79. package/dist/src/react/core/genui/index.d.ts.map +1 -1
  80. package/dist/src/react/core/genui/index.js +1 -1
  81. package/dist/src/react/core/genui/index.js.map +1 -1
  82. package/dist/src/react/core/genui/json-render.d.ts.map +1 -1
  83. package/dist/src/react/core/genui/json-render.js +3 -1
  84. package/dist/src/react/core/genui/json-render.js.map +1 -1
  85. package/dist/src/react/core/genui/share-structure.d.ts +13 -0
  86. package/dist/src/react/core/genui/share-structure.d.ts.map +1 -0
  87. package/dist/src/react/core/genui/share-structure.js +49 -0
  88. package/dist/src/react/core/genui/share-structure.js.map +1 -0
  89. package/dist/src/react/core/genui/types.d.ts +33 -0
  90. package/dist/src/react/core/genui/types.d.ts.map +1 -1
  91. package/dist/src/react/core/genui/use-generative-ui.d.ts.map +1 -1
  92. package/dist/src/react/core/genui/use-generative-ui.js +4 -0
  93. package/dist/src/react/core/genui/use-generative-ui.js.map +1 -1
  94. package/dist/src/react/core/transcript/model.d.ts +5 -0
  95. package/dist/src/react/core/transcript/model.d.ts.map +1 -1
  96. package/dist/src/react/core/transcript/model.js +17 -0
  97. package/dist/src/react/core/transcript/model.js.map +1 -1
  98. package/dist/src/react/core/transcript/use-chat-transcript.d.ts.map +1 -1
  99. package/dist/src/react/core/transcript/use-chat-transcript.js +15 -2
  100. package/dist/src/react/core/transcript/use-chat-transcript.js.map +1 -1
  101. package/dist/src/runners/inline-agent-runner.d.ts +9 -0
  102. package/dist/src/runners/inline-agent-runner.d.ts.map +1 -1
  103. package/dist/src/runners/inline-agent-runner.js +28 -4
  104. package/dist/src/runners/inline-agent-runner.js.map +1 -1
  105. package/dist/src/spi/token-stream-sink.d.ts +2 -0
  106. package/dist/src/spi/token-stream-sink.d.ts.map +1 -1
  107. package/dist/src/spi/token-stream-sink.js.map +1 -1
  108. package/dist/src/spi/tool.d.ts +54 -2
  109. package/dist/src/spi/tool.d.ts.map +1 -1
  110. package/dist/src/sse.d.ts.map +1 -1
  111. package/dist/src/sse.js +1 -0
  112. package/dist/src/sse.js.map +1 -1
  113. package/dist/src/stores/factory.d.ts +2 -2
  114. package/dist/src/stores/factory.js +2 -2
  115. package/dist/src/stream-events.d.ts +7 -0
  116. package/dist/src/stream-events.d.ts.map +1 -1
  117. package/dist/src/testing/fake-model-provider.d.ts +9 -1
  118. package/dist/src/testing/fake-model-provider.d.ts.map +1 -1
  119. package/dist/src/testing/fake-model-provider.js +12 -1
  120. package/dist/src/testing/fake-model-provider.js.map +1 -1
  121. package/dist/src/tool-input-preview.d.ts +34 -0
  122. package/dist/src/tool-input-preview.d.ts.map +1 -0
  123. package/dist/src/tool-input-preview.js +137 -0
  124. package/dist/src/tool-input-preview.js.map +1 -0
  125. package/dist/src/tool-registry.d.ts +8 -2
  126. package/dist/src/tool-registry.d.ts.map +1 -1
  127. package/dist/src/tool-registry.js +34 -1
  128. package/dist/src/tool-registry.js.map +1 -1
  129. package/dist/src/turn-frames.d.ts.map +1 -1
  130. package/dist/src/turn-frames.js +5 -0
  131. package/dist/src/turn-frames.js.map +1 -1
  132. package/dist/stubs/config/agent.stub +10 -2
  133. package/package.json +1 -1
  134. package/skills/agent-setup/SKILL.md +10 -0
  135. package/skills/agent-testing/SKILL.md +3 -1
  136. package/skills/agent-tools/SKILL.md +14 -3
@@ -33,6 +33,11 @@ export function observeTurnFrames(writer, now = Date.now) {
33
33
  return;
34
34
  }
35
35
  closeBurst();
36
+ // A preview of a call's streaming input is shown, never kept: the call's own push is.
37
+ if ((frame.t === 'component' && frame.partial === true) ||
38
+ (frame.t === 'event' && frame.event.kind === 'ui' && frame.event.partial === true)) {
39
+ return;
40
+ }
36
41
  // A repeat id replaces the props but keeps the component where it first appeared, exactly as
37
42
  // the client's data part does.
38
43
  if (frame.t === 'event' && frame.event.kind === 'ui') {
@@ -1 +1 @@
1
- {"version":3,"file":"turn-frames.js","sourceRoot":"","sources":["../../src/turn-frames.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turn-frames.js","sourceRoot":"","sources":["../../src/turn-frames.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ import { defineConfig, stores } from '@adonis-agora/agent'
6
6
  // import { attachmentStores } from '@adonis-agora/agent'
7
7
  // import { aiSdkModel } from '@adonis-agora/agent/ai-sdk'
8
8
  // import { openai } from '@ai-sdk/openai'
9
+ // import { defineCatalog, genui } from '@adonis-agora/agent/genui'
10
+ // import { BUILTIN_COMPONENTS, LAYOUT_COMPONENTS } from '@adonis-agora/agent/genui/builtins'
9
11
 
10
12
  /**
11
13
  * Configuration for @adonis-agora/agent. Only \`model\` is required. Pick a \`store\` by name from the
@@ -21,10 +23,10 @@ export default defineConfig({
21
23
  * The LLM provider. Wrap the Vercel AI SDK via \`aiSdkModel(...)\` (from \`@adonis-agora/agent/ai-sdk\`)
22
24
  * or supply any \`ModelProvider\`. A lazy thunk keeps the provider SDK peer imported only at boot:
23
25
  *
24
- * model: () => aiSdkModel({ model: openai('gpt-4o-mini') }),
26
+ * model: () => aiSdkModel(openai('gpt-4o-mini')),
25
27
  */
26
28
  model: () => {
27
- throw new Error('Configure a model in config/agent.ts (e.g. aiSdkModel({ model: ... }))')
29
+ throw new Error('Configure a model in config/agent.ts (e.g. aiSdkModel(openai(...)))')
28
30
  },
29
31
 
30
32
  store: 'lucid',
@@ -53,6 +55,12 @@ export default defineConfig({
53
55
  // disk). Mounts POST /agent/attachments; a send names uploads as { mediaId }, resolved server-side.
54
56
  // attachments: attachmentStores.media(),
55
57
 
58
+ // Generative UI: the model composes catalog components (tables, charts, cards, …) into one
59
+ // \`ui__render\` tree, validated before it streams; your client renders each by name. Keep the
60
+ // catalog in its own file to share it with the browser. \`mode: 'per-component'\` gives one
61
+ // \`ui__show_*\` tool per component instead.
62
+ // genui: genui({ catalog: defineCatalog([...BUILTIN_COMPONENTS, ...LAYOUT_COMPONENTS]) }),
63
+
56
64
  // The implicit default agent (base prompt, personas, tool allow-list). Omit for a bare assistant.
57
65
  // defaultAgent: {
58
66
  // systemPrompt: 'You are a helpful assistant.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonis-agora/agent",
3
- "version": "0.65.1",
3
+ "version": "0.66.1",
4
4
  "description": "Governed, durable-backed AI agent (chat + tool-calling + governance) for AdonisJS — part of the Agora ecosystem.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -315,6 +315,16 @@ Agora owns its catalog (`@adonis-agora/agent/genui`), browser rendering
315
315
  (`@adonis-agora/agent/react/media`). Protocol compatibility does not require installing
316
316
  Aviary packages.
317
317
 
318
+ `genui({ catalog })` in `config/agent.ts` registers ONE model tool, `ui__render`, taking a
319
+ component tree (`{ type, props, children? }`; a single node is a valid tree and is pushed as
320
+ that component). Its input schema is exact per component. Put `LAYOUT_COMPONENTS` (`Stack`,
321
+ `Card`, …) in the catalog next to `BUILTIN_COMPONENTS` and register a React renderer for each
322
+ layout you use. `mode: 'per-component'` instead registers one `ui__show_<component>` tool per
323
+ standalone component — for small models or when each tool should carry its own exact schema.
324
+ `streaming: 'partial'` draws the tree while the model writes it; renderers then read
325
+ `useGenuiNode()?.incomplete` and must tolerate half-written props. Source:
326
+ `packages/adonis/docs/generative-ui.mdx`.
327
+
318
328
  For static HTML, use `createReactComponentRegistry` and `createReactServerRenderer` from
319
329
  `@adonis-agora/agent/react/genui/server`; install matching `react` and `react-dom` peers.
320
330
  Keep this server entry out of browser bundles: it reads trusted filesystem stylesheets
@@ -78,7 +78,9 @@ Source: `packages/adonis/README.md` ("Framework-agnostic core"),
78
78
  ### Pattern 1 — script a tool-call round-trip
79
79
 
80
80
  `FakeModelProvider` takes a script — a pure function of `(args, turnIndex)`. `turnIndex`
81
- counts assistant turns already in history, so there is no internal counter to reset:
81
+ counts assistant turns already in history, so there is no internal counter to reset. A tool
82
+ call's id is `call-<turnIndex>-<name>`, with a `-2`, `-3`… suffix when that provider instance
83
+ already issued it (another thread's same turn), so one provider can serve many threads:
82
84
 
83
85
  ```ts
84
86
  import { FakeModelProvider } from '@adonis-agora/agent/testing'
@@ -241,6 +241,14 @@ export const listRecords = defineTool({
241
241
  `table` and `chart` present the builtin `DataTable` and `Chart` definitions: put them in the
242
242
  genui catalog (`BUILTIN_COMPONENTS` from `@adonis-agora/agent/genui/builtins`, or the two
243
243
  definitions) and register app renderers under those names. Builtins carry no visuals.
244
+ `genui({ catalog })` also offers the model one `ui__render` tree tool over that catalog (the
245
+ default mode; `mode: 'per-component'` gives `ui__show_*` tools instead).
246
+ A tool that knows its component before it reads can push a skeleton first: `ctx.emitUi(name,
247
+ { state: 'loading', … })`, then the data with `{ id }` from that push (the component's props
248
+ schema must accept the placeholder variant; mark it `internal: true`). Always end on that id
249
+ (data, `empty` or `error`), and only push the skeleton when the component is declared in
250
+ `ctx.uiCapabilities` and `ctx.pageContext.channel` is unset. A tool that throws persists none
251
+ of its pushes. See `packages/adonis/docs/genui-loading-states.mdx`.
244
252
  Use `createComponent` for custom definitions and one `createComponentRegistry` per app
245
253
  or tenant. Input `props` may transform; if the transform changes shape or is not
246
254
  idempotent, declare `outputProps` to validate the normalized JSON persisted in frames.
@@ -267,10 +275,13 @@ canUse(actor: Actor) { return this.plans.includesDocs(actor.tenantRef) }
267
275
 
268
276
  `defineTool` / `defineConfirmedTool` take `enabled` and `canUse` as options; `mcpServers[]`
269
277
  takes both per server. Order on the offered list AND on invoke: allow-list → `enabled` →
270
- `RolesPolicy` → `canUse`; none can widen. A disabled tool is never shown to the model and
271
- invoking one throws `ToolDisabledError` (not `ToolForbiddenError`). Prefer these to registering a
278
+ `RolesPolicy` → `canUse`; none can widen. `invoke` additionally re-asks `describe()` with the
279
+ call's actor, thread, agent and `uiCapabilities`: a tool answering `available: false` for that
280
+ scope was never offered, and calling it anyway throws `ToolNotFoundError`. A disabled tool is
281
+ never shown to the model and invoking one throws `ToolDisabledError` (not `ToolForbiddenError`). Prefer these to registering a
272
282
  tool conditionally, and to refusing inside `execute` (which costs the model a turn).
273
- Source: `packages/adonis/docs/authoring/tools.mdx`, `packages/adonis/src/tool-filters.ts`.
283
+ Source: `packages/adonis/docs/authoring/tools.mdx`, `packages/adonis/src/tool-filters.ts`,
284
+ `packages/adonis/src/tool-registry.ts` (`validated`, `describeScopeOf`).
274
285
 
275
286
  ## Common mistakes
276
287