@adonis-agora/agent 0.11.0 → 0.13.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 (65) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/providers/agent_provider.d.ts.map +1 -1
  3. package/dist/providers/agent_provider.js +12 -8
  4. package/dist/providers/agent_provider.js.map +1 -1
  5. package/dist/src/agent-loop.d.ts.map +1 -1
  6. package/dist/src/agent-loop.js +1 -0
  7. package/dist/src/agent-loop.js.map +1 -1
  8. package/dist/src/agent-service.d.ts +2 -1
  9. package/dist/src/agent-service.d.ts.map +1 -1
  10. package/dist/src/agent-service.js.map +1 -1
  11. package/dist/src/ai-sdk/ai-sdk-model.d.ts.map +1 -1
  12. package/dist/src/ai-sdk/ai-sdk-model.js +1 -3
  13. package/dist/src/ai-sdk/ai-sdk-model.js.map +1 -1
  14. package/dist/src/client/chat-client.d.ts +90 -0
  15. package/dist/src/client/chat-client.d.ts.map +1 -0
  16. package/dist/src/client/chat-client.js +204 -0
  17. package/dist/src/client/chat-client.js.map +1 -0
  18. package/dist/src/client/index.d.ts +3 -0
  19. package/dist/src/client/index.d.ts.map +1 -0
  20. package/dist/src/client/index.js +3 -0
  21. package/dist/src/client/index.js.map +1 -0
  22. package/dist/src/client/sse.d.ts +64 -0
  23. package/dist/src/client/sse.d.ts.map +1 -0
  24. package/dist/src/client/sse.js +129 -0
  25. package/dist/src/client/sse.js.map +1 -0
  26. package/dist/src/durable/agent-run-workflow.js +1 -1
  27. package/dist/src/durable/agent-run-workflow.js.map +1 -1
  28. package/dist/src/in-process-sink.d.ts +4 -4
  29. package/dist/src/in-process-sink.d.ts.map +1 -1
  30. package/dist/src/in-process-sink.js +4 -4
  31. package/dist/src/in-process-sink.js.map +1 -1
  32. package/dist/src/index.d.ts +2 -1
  33. package/dist/src/index.d.ts.map +1 -1
  34. package/dist/src/index.js +2 -1
  35. package/dist/src/index.js.map +1 -1
  36. package/dist/src/react/index.d.ts +2 -0
  37. package/dist/src/react/index.d.ts.map +1 -0
  38. package/dist/src/react/index.js +2 -0
  39. package/dist/src/react/index.js.map +1 -0
  40. package/dist/src/react/use-agent-chat.d.ts +33 -0
  41. package/dist/src/react/use-agent-chat.d.ts.map +1 -0
  42. package/dist/src/react/use-agent-chat.js +103 -0
  43. package/dist/src/react/use-agent-chat.js.map +1 -0
  44. package/dist/src/redis-token-stream-sink.d.ts +5 -4
  45. package/dist/src/redis-token-stream-sink.d.ts.map +1 -1
  46. package/dist/src/redis-token-stream-sink.js +6 -11
  47. package/dist/src/redis-token-stream-sink.js.map +1 -1
  48. package/dist/src/runners/inline-agent-runner.js +1 -1
  49. package/dist/src/runners/inline-agent-runner.js.map +1 -1
  50. package/dist/src/spi/token-stream-sink.d.ts +15 -7
  51. package/dist/src/spi/token-stream-sink.d.ts.map +1 -1
  52. package/dist/src/spi/tool.d.ts +6 -0
  53. package/dist/src/spi/tool.d.ts.map +1 -1
  54. package/dist/src/sse.d.ts +8 -0
  55. package/dist/src/sse.d.ts.map +1 -0
  56. package/dist/src/sse.js +12 -0
  57. package/dist/src/sse.js.map +1 -0
  58. package/dist/src/testing/fake-model-provider.d.ts.map +1 -1
  59. package/dist/src/testing/fake-model-provider.js +1 -2
  60. package/dist/src/testing/fake-model-provider.js.map +1 -1
  61. package/dist/src/testing/in-memory-sink.d.ts +3 -3
  62. package/dist/src/testing/in-memory-sink.d.ts.map +1 -1
  63. package/dist/src/testing/in-memory-sink.js +3 -3
  64. package/dist/src/testing/in-memory-sink.js.map +1 -1
  65. package/package.json +17 -1
@@ -0,0 +1,33 @@
1
+ import { type AgentChatClientOptions, type AgentChatRequestBody, type ChatPart } from '../client/index.js';
2
+ /** A message in the chat transcript — the user's text, or the assistant's streamed parts. */
3
+ export interface AgentChatMessage {
4
+ id: string;
5
+ role: 'user' | 'assistant';
6
+ parts: ChatPart[];
7
+ /** `true` while this assistant message is still receiving stream frames. */
8
+ streaming?: boolean;
9
+ }
10
+ export type AgentChatStatus = 'idle' | 'streaming' | 'error';
11
+ export interface UseAgentChatOptions extends AgentChatClientOptions {
12
+ /**
13
+ * Builds the request body for a typed message. Defaults to `{ message }`. Override to attach
14
+ * `pageContext`, `agent`, `persona`, etc. The `threadId` is injected by the hook after the first
15
+ * turn, so a custom `buildBody` should NOT set it.
16
+ */
17
+ buildBody?: (message: string) => AgentChatRequestBody;
18
+ }
19
+ export interface UseAgentChatResult {
20
+ messages: AgentChatMessage[];
21
+ status: AgentChatStatus;
22
+ error: string | null;
23
+ send: (text: string) => Promise<void>;
24
+ cancel: () => void;
25
+ }
26
+ /**
27
+ * React binding over {@link createAgentChatClient}: owns the transcript, thread id, and streaming
28
+ * status, and drives one `AbortController` per turn. Reconnection (re-attach on a dropped stream) is
29
+ * handled by the client — the hook just renders whatever parts it reports. Pass client options
30
+ * (`basePath`, `fetch`, `getHeaders`, `resume`) straight through.
31
+ */
32
+ export declare function useAgentChat(options?: UseAgentChatOptions): UseAgentChatResult;
33
+ //# sourceMappingURL=use-agent-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-agent-chat.d.ts","sourceRoot":"","sources":["../../../src/react/use-agent-chat.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAE3B,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EAEd,MAAM,oBAAoB,CAAC;AAE5B,6FAA6F;AAC7F,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IACjE;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,oBAAoB,CAAC;CACvD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAQD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,kBAAkB,CAgHlF"}
@@ -0,0 +1,103 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { AgentChatDisconnectedError, createAgentChatClient, } from '../client/index.js';
3
+ function randomId() {
4
+ return (globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`);
5
+ }
6
+ /**
7
+ * React binding over {@link createAgentChatClient}: owns the transcript, thread id, and streaming
8
+ * status, and drives one `AbortController` per turn. Reconnection (re-attach on a dropped stream) is
9
+ * handled by the client — the hook just renders whatever parts it reports. Pass client options
10
+ * (`basePath`, `fetch`, `getHeaders`, `resume`) straight through.
11
+ */
12
+ export function useAgentChat(options = {}) {
13
+ const { buildBody, ...clientOptions } = options;
14
+ const [messages, setMessages] = useState([]);
15
+ const [status, setStatus] = useState('idle');
16
+ const [error, setError] = useState(null);
17
+ const threadIdRef = useRef(undefined);
18
+ const abortRef = useRef(null);
19
+ const streamingIdRef = useRef(null);
20
+ // Keep one client instance stable across renders; the latest options ride on a ref so option
21
+ // changes take effect on the next send without re-creating the client.
22
+ const optionsRef = useRef(clientOptions);
23
+ optionsRef.current = clientOptions;
24
+ const buildBodyRef = useRef(buildBody);
25
+ buildBodyRef.current = buildBody;
26
+ const clientRef = useRef(createAgentChatClient({
27
+ ...clientOptions,
28
+ getHeaders: () => optionsRef.current.getHeaders?.() ?? {},
29
+ }));
30
+ useEffect(() => {
31
+ return () => {
32
+ abortRef.current?.abort();
33
+ };
34
+ }, []);
35
+ const send = useCallback(async (text) => {
36
+ const trimmed = text.trim();
37
+ if (!trimmed || streamingIdRef.current) {
38
+ return;
39
+ }
40
+ setError(null);
41
+ const userMessage = {
42
+ id: randomId(),
43
+ role: 'user',
44
+ parts: [{ type: 'text', text: trimmed }],
45
+ };
46
+ const assistantId = randomId();
47
+ setMessages((prev) => [
48
+ ...prev,
49
+ userMessage,
50
+ { id: assistantId, role: 'assistant', parts: [], streaming: true },
51
+ ]);
52
+ setStatus('streaming');
53
+ const controller = new AbortController();
54
+ abortRef.current = controller;
55
+ streamingIdRef.current = assistantId;
56
+ const applyParts = (parts) => setMessages((prev) => prev.map((message) => (message.id === assistantId ? { ...message, parts } : message)));
57
+ const stopStreaming = () => setMessages((prev) => prev.map((message) => message.id === assistantId ? { ...message, streaming: false } : message));
58
+ const body = {
59
+ ...(buildBodyRef.current?.(trimmed) ?? { message: trimmed }),
60
+ ...(threadIdRef.current ? { threadId: threadIdRef.current } : {}),
61
+ };
62
+ try {
63
+ await clientRef.current.send({
64
+ body,
65
+ signal: controller.signal,
66
+ onParts: applyParts,
67
+ onThreadId: (id) => {
68
+ threadIdRef.current = id;
69
+ },
70
+ });
71
+ stopStreaming();
72
+ setStatus('idle');
73
+ }
74
+ catch (caught) {
75
+ if (controller.signal.aborted) {
76
+ return;
77
+ }
78
+ // Keep whatever streamed before the drop so the user doesn't lose a long answer.
79
+ if (caught instanceof AgentChatDisconnectedError && caught.parts.length > 0) {
80
+ applyParts(caught.parts);
81
+ }
82
+ stopStreaming();
83
+ setError(caught instanceof Error ? caught.message : 'Failed to reach the agent.');
84
+ setStatus('error');
85
+ }
86
+ finally {
87
+ abortRef.current = null;
88
+ streamingIdRef.current = null;
89
+ }
90
+ }, []);
91
+ const cancel = useCallback(() => {
92
+ abortRef.current?.abort();
93
+ abortRef.current = null;
94
+ const streamingId = streamingIdRef.current;
95
+ if (streamingId) {
96
+ setMessages((prev) => prev.map((message) => message.id === streamingId ? { ...message, streaming: false } : message));
97
+ streamingIdRef.current = null;
98
+ }
99
+ setStatus('idle');
100
+ }, []);
101
+ return { messages, status, error, send, cancel };
102
+ }
103
+ //# sourceMappingURL=use-agent-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-agent-chat.js","sourceRoot":"","sources":["../../../src/react/use-agent-chat.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { RedisStreamClient } from './redis-stream-client.js';
2
- import type { SinkWriter, TokenStreamSink } from './spi/token-stream-sink.js';
2
+ import type { SinkWriter, StreamFrame, TokenStreamSink } from './spi/token-stream-sink.js';
3
3
  export interface RedisTokenStreamSinkOptions {
4
4
  /** Key/channel namespace. Defaults to `agent:stream`. Keys are `${keyPrefix}:${runId}:...`. */
5
5
  keyPrefix?: string;
@@ -14,8 +14,9 @@ export interface RedisTokenStreamSinkOptions {
14
14
  * (`${keyPrefix}:${runId}:state`), so an SSE handler on ANOTHER replica that subscribes after the run
15
15
  * finished still sees the ending and closes the stream.
16
16
  *
17
- * The yielded chunks are byte-identical to the in-process sink's, so the SSE envelope the provider
18
- * pipes (`data: {"delta":...}`) is unchanged — swapping this in is transparent to clients.
17
+ * The yielded frames are identical (frame-for-frame) to the in-process sink's, so the SSE envelope
18
+ * the provider pipes (`data: {"delta":...}` for text, a component event for `{ t: 'component' }`)
19
+ * is unchanged — swapping this in is transparent to clients.
19
20
  *
20
21
  * The host supplies a {@link RedisStreamClient} adapter over its own Redis driver; `subscribe` needs a
21
22
  * connection in subscriber mode (see the client docs). Wire it with `defineConfig({ sink:
@@ -29,7 +30,7 @@ export declare class RedisTokenStreamSink implements TokenStreamSink {
29
30
  private stateKey;
30
31
  private channel;
31
32
  open(runId: string): SinkWriter;
32
- subscribe(runId: string): AsyncIterable<Uint8Array>;
33
+ subscribe(runId: string): AsyncIterable<StreamFrame>;
33
34
  close(runId: string): Promise<void>;
34
35
  private hasEnded;
35
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"redis-token-stream-sink.d.ts","sourceRoot":"","sources":["../../src/redis-token-stream-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAK9E,MAAM,WAAW,2BAA2B;IAC1C,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAIxD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGhB,MAAM,EAAE,iBAAiB,EAC1C,OAAO,GAAE,2BAAgC;IAK3C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,OAAO;IAIf,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAaxB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;IAgCpD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAI3B,QAAQ;CAIvB"}
1
+ {"version":3,"file":"redis-token-stream-sink.d.ts","sourceRoot":"","sources":["../../src/redis-token-stream-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAK3F,MAAM,WAAW,2BAA2B;IAC1C,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAIxD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGhB,MAAM,EAAE,iBAAiB,EAC1C,OAAO,GAAE,2BAAgC;IAK3C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,OAAO;IAIf,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAaxB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC;IAgCrD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAI3B,QAAQ;CAIvB"}
@@ -10,8 +10,9 @@ const ENDED = 'ended';
10
10
  * (`${keyPrefix}:${runId}:state`), so an SSE handler on ANOTHER replica that subscribes after the run
11
11
  * finished still sees the ending and closes the stream.
12
12
  *
13
- * The yielded chunks are byte-identical to the in-process sink's, so the SSE envelope the provider
14
- * pipes (`data: {"delta":...}`) is unchanged — swapping this in is transparent to clients.
13
+ * The yielded frames are identical (frame-for-frame) to the in-process sink's, so the SSE envelope
14
+ * the provider pipes (`data: {"delta":...}` for text, a component event for `{ t: 'component' }`)
15
+ * is unchanged — swapping this in is transparent to clients.
15
16
  *
16
17
  * The host supplies a {@link RedisStreamClient} adapter over its own Redis driver; `subscribe` needs a
17
18
  * connection in subscriber mode (see the client docs). Wire it with `defineConfig({ sink:
@@ -35,8 +36,8 @@ export class RedisTokenStreamSink {
35
36
  }
36
37
  open(runId) {
37
38
  return {
38
- write: async (chunk) => {
39
- await this.client.rpush(this.chunksKey(runId), toBase64(chunk));
39
+ write: async (frame) => {
40
+ await this.client.rpush(this.chunksKey(runId), JSON.stringify(frame));
40
41
  await this.client.publish(this.channel(runId), 'chunk');
41
42
  },
42
43
  end: async () => {
@@ -65,7 +66,7 @@ export class RedisTokenStreamSink {
65
66
  const chunks = await this.client.lrange(this.chunksKey(runId), index, -1);
66
67
  for (const encoded of chunks) {
67
68
  index += 1;
68
- yield fromBase64(encoded);
69
+ yield JSON.parse(encoded);
69
70
  }
70
71
  if (await this.hasEnded(runId)) {
71
72
  return;
@@ -85,10 +86,4 @@ export class RedisTokenStreamSink {
85
86
  return raw === ENDED;
86
87
  }
87
88
  }
88
- function toBase64(chunk) {
89
- return Buffer.from(chunk).toString('base64');
90
- }
91
- function fromBase64(encoded) {
92
- return new Uint8Array(Buffer.from(encoded, 'base64'));
93
- }
94
89
  //# sourceMappingURL=redis-token-stream-sink.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redis-token-stream-sink.js","sourceRoot":"","sources":["../../src/redis-token-stream-sink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redis-token-stream-sink.js","sourceRoot":"","sources":["../../src/redis-token-stream-sink.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,7 @@ export class InlineAgentRunner {
33
33
  await this.store.recordRunEnd({ runId, status: 'failed', error: message });
34
34
  // Surface the failure on the live stream and close it, so a subscriber isn't left hanging.
35
35
  const writer = await deps.sink.open(runId);
36
- await writer.write(new TextEncoder().encode(`\n[error] ${message}`));
36
+ await writer.write({ t: 'text', v: `\n[error] ${message}` });
37
37
  await writer.end();
38
38
  });
39
39
  return { runId };
@@ -1 +1 @@
1
- {"version":3,"file":"inline-agent-runner.js","sourceRoot":"","sources":["../../../src/runners/inline-agent-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inline-agent-runner.js","sourceRoot":"","sources":["../../../src/runners/inline-agent-runner.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,29 @@
1
1
  /**
2
2
  * The "data plane": live token transport, decoupled from the durable control plane.
3
3
  *
4
- * The model turn writes deltas to a `SinkWriter` keyed by runId; the HTTP layer
5
- * `subscribe`s by runId and pipes the chunks to the browser as SSE. A late subscriber
6
- * (reconnect/resume) replays buffered chunks first, then follows live — which is what
4
+ * The model turn writes typed frames to a `SinkWriter` keyed by runId; the HTTP layer
5
+ * `subscribe`s by runId and pipes the frames to the browser as SSE. A late subscriber
6
+ * (reconnect/resume) replays buffered frames first, then follows live — which is what
7
7
  * makes streaming survive a dropped connection or a pod restart.
8
8
  */
9
+ export type StreamFrame = {
10
+ t: 'text';
11
+ v: string;
12
+ } | {
13
+ t: 'component';
14
+ name: string;
15
+ data: unknown;
16
+ };
9
17
  export interface SinkWriter {
10
- write(chunk: Uint8Array): void | Promise<void>;
11
- /** Mark the run's stream finished (no more chunks). */
18
+ write(frame: StreamFrame): void | Promise<void>;
19
+ /** Mark the run's stream finished (no more frames). */
12
20
  end(): void | Promise<void>;
13
21
  }
14
22
  export interface TokenStreamSink {
15
23
  /** Open (or reopen) the writer for a run. */
16
24
  open(runId: string): SinkWriter | Promise<SinkWriter>;
17
- /** Replay buffered chunks for the run, then yield live ones until `end()`. */
18
- subscribe(runId: string): AsyncIterable<Uint8Array>;
25
+ /** Replay buffered frames for the run, then yield live ones until `end()`. */
26
+ subscribe(runId: string): AsyncIterable<StreamFrame>;
19
27
  /** Drop any buffer/resources for the run. */
20
28
  close(runId: string): void | Promise<void>;
21
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"token-stream-sink.d.ts","sourceRoot":"","sources":["../../../src/spi/token-stream-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,uDAAuD;IACvD,GAAG,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,8EAA8E;IAC9E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACpD,6CAA6C;IAC7C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C"}
1
+ {"version":3,"file":"token-stream-sink.d.ts","sourceRoot":"","sources":["../../../src/spi/token-stream-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB;IAAE,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,uDAAuD;IACvD,GAAG,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,8EAA8E;IAC9E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACrD,6CAA6C;IAC7C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C"}
@@ -13,6 +13,12 @@ export interface AiToolCtx {
13
13
  pageContext?: PageContext;
14
14
  /** Optional host handle (e.g. an ORM EntityManager) the app threads through options. */
15
15
  host?: unknown;
16
+ /**
17
+ * Empurra um componente de UI pro stream do run, na posição atual (entre os
18
+ * tokens de texto já emitidos e os próximos). Opcional: só a montagem no
19
+ * agent-loop provê; outros construtores de ctx podem omitir.
20
+ */
21
+ emitComponent?(name: string, data: unknown): void | Promise<void>;
16
22
  }
17
23
  /**
18
24
  * A tool implementation. `I` is the parsed (Zod-validated) input; `O` is what `execute` returns
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/spi/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,wFAAwF;IACxF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACnD,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACnD"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/spi/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,wFAAwF;IACxF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACnD,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACnD"}
@@ -0,0 +1,8 @@
1
+ import type { StreamFrame } from './spi/token-stream-sink.js';
2
+ /**
3
+ * Serializa um {@link StreamFrame} pro envelope SSE do provider. Texto vira o
4
+ * frame `data: {"delta":...}` (byte-idêntico ao envelope legado só-texto);
5
+ * componente vira `event: component\ndata: {name,data}`.
6
+ */
7
+ export declare function frameToSse(frame: StreamFrame): string;
8
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAKrD"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Serializa um {@link StreamFrame} pro envelope SSE do provider. Texto vira o
3
+ * frame `data: {"delta":...}` (byte-idêntico ao envelope legado só-texto);
4
+ * componente vira `event: component\ndata: {name,data}`.
5
+ */
6
+ export function frameToSse(frame) {
7
+ if (frame.t === 'component') {
8
+ return `event: component\ndata: ${JSON.stringify({ name: frame.name, data: frame.data })}\n\n`;
9
+ }
10
+ return `data: ${JSON.stringify({ delta: frame.v })}\n\n`;
11
+ }
12
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/sse.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,IAAI,KAAK,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO,2BAA2B,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;IACjG,CAAC;IACD,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAC3D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fake-model-provider.d.ts","sourceRoot":"","sources":["../../../src/testing/fake-model-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjF,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5C,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,KAAK,QAAQ,CAAC;AAE9E;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAEzC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;CAwB7D;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,SAAO,GAAG,UAAU,CAEnD"}
1
+ {"version":3,"file":"fake-model-provider.d.ts","sourceRoot":"","sources":["../../../src/testing/fake-model-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjF,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5C,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,KAAK,QAAQ,CAAC;AAE9E;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAEzC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;CAuB7D;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,SAAO,GAAG,UAAU,CAEnD"}
@@ -10,8 +10,7 @@ export class FakeModelProvider {
10
10
  async runTurn(args) {
11
11
  const turnIndex = args.messages.filter((message) => message.role === 'assistant').length;
12
12
  const turn = this.script(args, turnIndex);
13
- const encoder = new TextEncoder();
14
- await args.sink.write(encoder.encode(turn.text));
13
+ await args.sink.write({ t: 'text', v: turn.text });
15
14
  const toolCalls = turn.toolCall
16
15
  ? [
17
16
  {
@@ -1 +1 @@
1
- {"version":3,"file":"fake-model-provider.js","sourceRoot":"","sources":["../../../src/testing/fake-model-provider.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,IAAmB;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;QACzF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ;YAC7B,CAAC,CAAC;gBACE;oBACE,EAAE,EAAE,QAAQ,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;oBAC7C,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;oBACxB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;iBAC3B;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS;YACT,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAC5E,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,KAAK,GAAG,IAAI;IACrC,OAAO,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"fake-model-provider.js","sourceRoot":"","sources":["../../../src/testing/fake-model-provider.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,IAAmB;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;QACzF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAE1C,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ;YAC7B,CAAC,CAAC;gBACE;oBACE,EAAE,EAAE,QAAQ,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;oBAC7C,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;oBACxB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;iBAC3B;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS;YACT,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAC5E,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,KAAK,GAAG,IAAI;IACrC,OAAO,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACjC,CAAC"}
@@ -1,6 +1,6 @@
1
- import type { SinkWriter, TokenStreamSink } from '../index.js';
1
+ import type { SinkWriter, StreamFrame, TokenStreamSink } from '../index.js';
2
2
  /**
3
- * In-memory `TokenStreamSink`. Buffers chunks per run so a late subscriber (reconnect)
3
+ * In-memory `TokenStreamSink`. Buffers typed frames per run so a late subscriber (reconnect)
4
4
  * replays everything emitted so far, then follows live until the run ends.
5
5
  */
6
6
  export declare class InMemoryTokenStreamSink implements TokenStreamSink {
@@ -8,7 +8,7 @@ export declare class InMemoryTokenStreamSink implements TokenStreamSink {
8
8
  private buffer;
9
9
  private wake;
10
10
  open(runId: string): SinkWriter;
11
- subscribe(runId: string): AsyncIterable<Uint8Array>;
11
+ subscribe(runId: string): AsyncIterable<StreamFrame>;
12
12
  close(runId: string): void;
13
13
  }
14
14
  //# sourceMappingURL=in-memory-sink.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-sink.d.ts","sourceRoot":"","sources":["../../../src/testing/in-memory-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ/D;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IAErD,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,IAAI;IAOZ,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAcxB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;IAkB1D,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAG3B"}
1
+ {"version":3,"file":"in-memory-sink.d.ts","sourceRoot":"","sources":["../../../src/testing/in-memory-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ5E;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IAErD,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,IAAI;IAOZ,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAcxB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC;IAkB3D,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAG3B"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * In-memory `TokenStreamSink`. Buffers chunks per run so a late subscriber (reconnect)
2
+ * In-memory `TokenStreamSink`. Buffers typed frames per run so a late subscriber (reconnect)
3
3
  * replays everything emitted so far, then follows live until the run ends.
4
4
  */
5
5
  export class InMemoryTokenStreamSink {
@@ -21,8 +21,8 @@ export class InMemoryTokenStreamSink {
21
21
  open(runId) {
22
22
  const buf = this.buffer(runId);
23
23
  return {
24
- write: (chunk) => {
25
- buf.chunks.push(chunk);
24
+ write: (frame) => {
25
+ buf.chunks.push(frame);
26
26
  this.wake(buf);
27
27
  },
28
28
  end: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-sink.js","sourceRoot":"","sources":["../../../src/testing/in-memory-sink.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IACjB,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE7C,MAAM,CAAC,KAAa;QAC1B,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,IAAI,CAAC,GAAc;QACzB,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,CAAC,KAAiB,EAAE,EAAE;gBAC3B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;YACD,GAAG,EAAE,GAAG,EAAE;gBACR,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,SAAS,CAAC,KAAa;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,EAAE,CAAC;YACZ,OAAO,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChC,KAAK,IAAI,CAAC,CAAC;gBACX,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"in-memory-sink.js","sourceRoot":"","sources":["../../../src/testing/in-memory-sink.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IACjB,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE7C,MAAM,CAAC,KAAa;QAC1B,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,IAAI,CAAC,GAAc;QACzB,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,CAAC,KAAkB,EAAE,EAAE;gBAC5B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;YACD,GAAG,EAAE,GAAG,EAAE;gBACR,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,SAAS,CAAC,KAAa;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,EAAE,CAAC;YACZ,OAAO,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChC,KAAK,IAAI,CAAC,CAAC;gBACX,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonis-agora/agent",
3
- "version": "0.11.0",
3
+ "version": "0.13.0",
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": {
@@ -77,6 +77,16 @@
77
77
  "types": "./dist/src/telescope/index.d.ts",
78
78
  "import": "./dist/src/telescope/index.js",
79
79
  "default": "./dist/src/telescope/index.js"
80
+ },
81
+ "./client": {
82
+ "types": "./dist/src/client/index.d.ts",
83
+ "import": "./dist/src/client/index.js",
84
+ "default": "./dist/src/client/index.js"
85
+ },
86
+ "./react": {
87
+ "types": "./dist/src/react/index.d.ts",
88
+ "import": "./dist/src/react/index.js",
89
+ "default": "./dist/src/react/index.js"
80
90
  }
81
91
  },
82
92
  "files": [
@@ -99,9 +109,13 @@
99
109
  "@adonisjs/redis": "^9.2.0",
100
110
  "ai": "^7.0.0",
101
111
  "node-sql-parser": "^5.3.0",
112
+ "react": "^18.0.0 || ^19.0.0",
102
113
  "zod": "^3.23.0 || ^4.0.0"
103
114
  },
104
115
  "peerDependenciesMeta": {
116
+ "react": {
117
+ "optional": true
118
+ },
105
119
  "node-sql-parser": {
106
120
  "optional": true
107
121
  },
@@ -142,10 +156,12 @@
142
156
  "@adonisjs/core": "^7.3.0",
143
157
  "@adonisjs/lucid": "^22.4.0",
144
158
  "@types/node": "^22.0.0",
159
+ "@types/react": "^19.0.0",
145
160
  "ai": "^7.0.0",
146
161
  "better-sqlite3": "^11.0.0",
147
162
  "luxon": "^3.4.0",
148
163
  "node-sql-parser": "^5.3.0",
164
+ "react": "^19.0.0",
149
165
  "typescript": "^5.4.0",
150
166
  "vitest": "^3.0.0",
151
167
  "zod": "^3.25.0"