@better-agent/client 0.1.0-canary.6 → 0.2.0-beta.2

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.
@@ -1,152 +1,59 @@
1
- import { t as AgentChatController } from "../controller-BrBUfjhZ.mjs";
2
- import { n as getLatestUserMessageId, r as normalizeSendInput, t as cloneControllerOptions } from "../utils-CiHUj_BW.mjs";
3
- import { computed, onMounted, onUnmounted, ref, toValue, watchEffect } from "vue";
1
+ import { n as createAgentController } from "../controller-xMlzSCc7.mjs";
2
+ import { computed, onMounted, onUnmounted, ref, toValue } from "vue";
4
3
 
5
4
  //#region src/vue/useAgent.ts
6
- /**
7
- * Vue composable for talking to one Better Agent conversation.
8
- *
9
- * Returns reactive chat state and chat actions.
10
- *
11
- * @example
12
- * ```ts
13
- * const agent = useAgent(client, {
14
- * agent: "assistant",
15
- * conversationId: "conv_123",
16
- * });
17
- *
18
- * await agent.sendMessage("Hello");
19
- *
20
- * console.log(agent.messages.value);
21
- * console.log(agent.status.value);
22
- * agent.stop();
23
- * ```
24
- *
25
- * @example
26
- * ```vue
27
- * <script setup lang="ts">
28
- * const agent = useAgent(client, { agent: "assistant" });
29
- * <\/script>
30
- *
31
- * <template>
32
- * <div v-for="message in agent.messages.value" :key="message.localId">
33
- * {{ message.role }}
34
- * </div>
35
- * <button @click="agent.sendMessage('Hello')">Send</button>
36
- * </template>
37
- * ```
38
- */
39
- function useAgent(client, options) {
40
- const controller = new AgentChatController(toValue(client), cloneControllerOptions(toValue(options)));
5
+ function useAgent(agent, options) {
6
+ const readOptions = () => toValue(options) ?? {};
7
+ const toolHandlers = new Proxy({}, { get(_target, key) {
8
+ return readOptions().toolHandlers?.[key];
9
+ } });
10
+ const initialOptions = readOptions();
11
+ const controller = createAgentController(agent, {
12
+ initialMessages: initialOptions.initialMessages,
13
+ initialState: initialOptions.initialState,
14
+ initialInterruptState: initialOptions.initialInterruptState,
15
+ resume: initialOptions.resume,
16
+ context: initialOptions.context,
17
+ threadId: initialOptions.threadId,
18
+ toolHandlers,
19
+ onEvent: (event) => readOptions().onEvent?.(event),
20
+ onFinish: (finish) => readOptions().onFinish?.(finish),
21
+ onError: (error) => readOptions().onError?.(error)
22
+ });
41
23
  const version = ref(0);
42
- /** Pushes the latest client and options into the controller. */
43
- const syncController = () => {
44
- controller.updateClient(toValue(client));
45
- controller.updateOptions(cloneControllerOptions(toValue(options)));
24
+ const snapshot = () => {
25
+ version.value;
26
+ return controller.getSnapshot();
46
27
  };
47
28
  const unsubscribe = controller.subscribe(() => {
48
29
  version.value++;
49
30
  });
50
- watchEffect(() => {
51
- syncController();
52
- });
53
31
  onMounted(() => {
54
- syncController();
55
- controller.init();
32
+ controller.start();
56
33
  });
57
34
  onUnmounted(() => {
58
35
  unsubscribe();
59
- controller.destroy();
60
- });
61
- const messages = computed(() => {
62
- version.value;
63
- return controller.getMessages();
64
- });
65
- const id = computed(() => {
66
- version.value;
67
- return controller.getSnapshot().id;
68
- });
69
- const status = computed(() => {
70
- version.value;
71
- return controller.getStatus();
72
- });
73
- const error = computed(() => {
74
- version.value;
75
- return controller.getError();
76
- });
77
- const streamId = computed(() => {
78
- version.value;
79
- return controller.getStreamId();
80
- });
81
- const runId = computed(() => {
82
- version.value;
83
- return controller.getRunId();
84
- });
85
- const isLoading = computed(() => {
86
- version.value;
87
- return controller.isLoading;
88
- });
89
- const isStreaming = computed(() => {
90
- version.value;
91
- return controller.isStreaming;
36
+ controller.stop();
92
37
  });
93
38
  return {
94
- id,
95
- messages,
96
- status,
97
- error,
98
- streamId,
99
- runId,
100
- conversationId: computed(() => {
101
- version.value;
102
- return controller.getSnapshot().conversationId;
103
- }),
104
- isLoading,
105
- isStreaming,
106
- pendingToolApprovals: computed(() => {
107
- version.value;
108
- return controller.getPendingToolApprovals();
109
- }),
110
- sendMessage: (input, requestOptions) => {
111
- syncController();
112
- return controller.sendMessage(normalizeSendInput(input), requestOptions);
113
- },
114
- regenerate: async () => {
115
- syncController();
116
- await controller.retryMessage(getLatestUserMessageId(controller));
117
- },
118
- retryMessage: (localId) => {
119
- syncController();
120
- return controller.retryMessage(localId);
121
- },
122
- stop: () => {
123
- syncController();
124
- controller.stop();
125
- },
126
- resumeStream: (resumeOptions) => {
127
- syncController();
128
- return controller.resumeStream(resumeOptions);
129
- },
130
- resumeConversation: (resumeOptions) => {
131
- syncController();
132
- return controller.resumeConversation(resumeOptions);
133
- },
134
- approveToolCall: (params) => {
135
- syncController();
136
- return controller.approveToolCall(params);
137
- },
138
- clearError: () => {
139
- syncController();
140
- controller.clearError();
141
- },
142
- reset: () => {
143
- syncController();
144
- controller.reset();
145
- },
146
- setMessages: (input) => {
147
- syncController();
148
- controller.setMessages(input);
149
- }
39
+ messages: computed(() => snapshot().messages),
40
+ state: computed(() => snapshot().state),
41
+ status: computed(() => snapshot().status),
42
+ error: computed(() => snapshot().error),
43
+ runId: computed(() => snapshot().runId),
44
+ threadId: computed(() => snapshot().threadId),
45
+ isRunning: computed(() => snapshot().isRunning),
46
+ pendingClientTools: computed(() => snapshot().pendingClientTools),
47
+ pendingToolApprovals: computed(() => snapshot().pendingToolApprovals),
48
+ sendMessage: (input, sendOptions) => controller.sendMessage(input, sendOptions),
49
+ stop: () => controller.stop(),
50
+ resume: (resume) => controller.resume(resume),
51
+ selectThread: (threadId) => controller.selectThread(threadId),
52
+ clearThread: () => controller.clearThread(),
53
+ loadMessages: (threadId) => controller.loadMessages(threadId),
54
+ approveToolCall: (interruptId, metadata) => controller.approveToolCall(interruptId, metadata),
55
+ rejectToolCall: (interruptId, metadata) => controller.rejectToolCall(interruptId, metadata),
56
+ setMessages: (messages) => controller.setMessages(messages)
150
57
  };
151
58
  }
152
59
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vue/useAgent.ts"],"sourcesContent":["import { computed, onMounted, onUnmounted, ref, toValue, watchEffect } from \"vue\";\nimport type { MaybeRefOrGetter } from \"vue\";\nimport { AgentChatController } from \"../core/controller\";\nimport {\n cloneControllerOptions,\n getLatestUserMessageId,\n normalizeSendInput,\n} from \"../framework-internals/utils\";\nimport type { BetterAgentClient } from \"../types/client\";\nimport type { AgentNameFromApp } from \"../types/client-type-helpers\";\nimport type { UseAgentOptions, UseAgentResult } from \"./types\";\n\n/**\n * Vue composable for talking to one Better Agent conversation.\n *\n * Returns reactive chat state and chat actions.\n *\n * @example\n * ```ts\n * const agent = useAgent(client, {\n * agent: \"assistant\",\n * conversationId: \"conv_123\",\n * });\n *\n * await agent.sendMessage(\"Hello\");\n *\n * console.log(agent.messages.value);\n * console.log(agent.status.value);\n * agent.stop();\n * ```\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * const agent = useAgent(client, { agent: \"assistant\" });\n * </script>\n *\n * <template>\n * <div v-for=\"message in agent.messages.value\" :key=\"message.localId\">\n * {{ message.role }}\n * </div>\n * <button @click=\"agent.sendMessage('Hello')\">Send</button>\n * </template>\n * ```\n */\nexport function useAgent<\n TApp = unknown,\n TAgentName extends AgentNameFromApp<TApp> = AgentNameFromApp<TApp>,\n>(\n client: MaybeRefOrGetter<BetterAgentClient<TApp>>,\n options: MaybeRefOrGetter<UseAgentOptions<TApp, TAgentName>>,\n): UseAgentResult<TApp, TAgentName> {\n const controller = new AgentChatController<TApp, TAgentName>(\n toValue(client),\n cloneControllerOptions(toValue(options)),\n );\n const version = ref(0);\n\n /** Pushes the latest client and options into the controller. */\n const syncController = () => {\n controller.updateClient(toValue(client));\n controller.updateOptions(\n cloneControllerOptions(toValue(options)) as UseAgentOptions<TApp, TAgentName>,\n );\n };\n\n const unsubscribe = controller.subscribe(() => {\n version.value++;\n });\n\n watchEffect(() => {\n syncController();\n });\n\n onMounted(() => {\n syncController();\n controller.init();\n });\n\n onUnmounted(() => {\n unsubscribe();\n controller.destroy();\n });\n\n const messages = computed(() => {\n void version.value;\n return controller.getMessages();\n });\n const id = computed(() => {\n void version.value;\n return controller.getSnapshot().id;\n });\n const status = computed(() => {\n void version.value;\n return controller.getStatus();\n });\n const error = computed(() => {\n void version.value;\n return controller.getError();\n });\n const streamId = computed(() => {\n void version.value;\n return controller.getStreamId();\n });\n const runId = computed(() => {\n void version.value;\n return controller.getRunId();\n });\n const isLoading = computed(() => {\n void version.value;\n return controller.isLoading;\n });\n const isStreaming = computed(() => {\n void version.value;\n return controller.isStreaming;\n });\n const conversationId = computed(() => {\n void version.value;\n return controller.getSnapshot().conversationId;\n });\n const pendingToolApprovals = computed(() => {\n void version.value;\n return controller.getPendingToolApprovals();\n });\n\n return {\n id,\n messages,\n status,\n error,\n streamId,\n runId,\n conversationId,\n isLoading,\n isStreaming,\n pendingToolApprovals,\n sendMessage: (input, requestOptions) => {\n syncController();\n return controller.sendMessage(normalizeSendInput(input), requestOptions);\n },\n regenerate: async () => {\n syncController();\n await controller.retryMessage(getLatestUserMessageId(controller));\n },\n retryMessage: (localId) => {\n syncController();\n return controller.retryMessage(localId);\n },\n stop: () => {\n syncController();\n controller.stop();\n },\n resumeStream: (resumeOptions) => {\n syncController();\n return controller.resumeStream(resumeOptions);\n },\n resumeConversation: (resumeOptions) => {\n syncController();\n return controller.resumeConversation(resumeOptions);\n },\n approveToolCall: (params) => {\n syncController();\n return controller.approveToolCall(params);\n },\n clearError: () => {\n syncController();\n controller.clearError();\n },\n reset: () => {\n syncController();\n controller.reset();\n },\n setMessages: (input) => {\n syncController();\n controller.setMessages(input);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAgB,SAIZ,QACA,SACgC;CAChC,MAAM,aAAa,IAAI,oBACnB,QAAQ,OAAO,EACf,uBAAuB,QAAQ,QAAQ,CAAC,CAC3C;CACD,MAAM,UAAU,IAAI,EAAE;;CAGtB,MAAM,uBAAuB;AACzB,aAAW,aAAa,QAAQ,OAAO,CAAC;AACxC,aAAW,cACP,uBAAuB,QAAQ,QAAQ,CAAC,CAC3C;;CAGL,MAAM,cAAc,WAAW,gBAAgB;AAC3C,UAAQ;GACV;AAEF,mBAAkB;AACd,kBAAgB;GAClB;AAEF,iBAAgB;AACZ,kBAAgB;AAChB,aAAW,MAAM;GACnB;AAEF,mBAAkB;AACd,eAAa;AACb,aAAW,SAAS;GACtB;CAEF,MAAM,WAAW,eAAe;AAC5B,EAAK,QAAQ;AACb,SAAO,WAAW,aAAa;GACjC;CACF,MAAM,KAAK,eAAe;AACtB,EAAK,QAAQ;AACb,SAAO,WAAW,aAAa,CAAC;GAClC;CACF,MAAM,SAAS,eAAe;AAC1B,EAAK,QAAQ;AACb,SAAO,WAAW,WAAW;GAC/B;CACF,MAAM,QAAQ,eAAe;AACzB,EAAK,QAAQ;AACb,SAAO,WAAW,UAAU;GAC9B;CACF,MAAM,WAAW,eAAe;AAC5B,EAAK,QAAQ;AACb,SAAO,WAAW,aAAa;GACjC;CACF,MAAM,QAAQ,eAAe;AACzB,EAAK,QAAQ;AACb,SAAO,WAAW,UAAU;GAC9B;CACF,MAAM,YAAY,eAAe;AAC7B,EAAK,QAAQ;AACb,SAAO,WAAW;GACpB;CACF,MAAM,cAAc,eAAe;AAC/B,EAAK,QAAQ;AACb,SAAO,WAAW;GACpB;AAUF,QAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA,gBAhBmB,eAAe;AAClC,GAAK,QAAQ;AACb,UAAO,WAAW,aAAa,CAAC;IAClC;EAcE;EACA;EACA,sBAfyB,eAAe;AACxC,GAAK,QAAQ;AACb,UAAO,WAAW,yBAAyB;IAC7C;EAaE,cAAc,OAAO,mBAAmB;AACpC,mBAAgB;AAChB,UAAO,WAAW,YAAY,mBAAmB,MAAM,EAAE,eAAe;;EAE5E,YAAY,YAAY;AACpB,mBAAgB;AAChB,SAAM,WAAW,aAAa,uBAAuB,WAAW,CAAC;;EAErE,eAAe,YAAY;AACvB,mBAAgB;AAChB,UAAO,WAAW,aAAa,QAAQ;;EAE3C,YAAY;AACR,mBAAgB;AAChB,cAAW,MAAM;;EAErB,eAAe,kBAAkB;AAC7B,mBAAgB;AAChB,UAAO,WAAW,aAAa,cAAc;;EAEjD,qBAAqB,kBAAkB;AACnC,mBAAgB;AAChB,UAAO,WAAW,mBAAmB,cAAc;;EAEvD,kBAAkB,WAAW;AACzB,mBAAgB;AAChB,UAAO,WAAW,gBAAgB,OAAO;;EAE7C,kBAAkB;AACd,mBAAgB;AAChB,cAAW,YAAY;;EAE3B,aAAa;AACT,mBAAgB;AAChB,cAAW,OAAO;;EAEtB,cAAc,UAAU;AACpB,mBAAgB;AAChB,cAAW,YAAY,MAAM;;EAEpC"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vue/useAgent.ts"],"sourcesContent":["import { computed, onMounted, onUnmounted, ref, toValue } from \"vue\";\nimport type { MaybeRefOrGetter } from \"vue\";\nimport { createAgentController } from \"../core/controller\";\nimport type { AgentNameOf } from \"../core/inference\";\nimport type {\n AgentControllerOptions,\n BetterAgentClientAgentHandle,\n BetterAgentClientAgentMemoryHandle,\n} from \"../types\";\nimport type { UseAgentOptions, UseAgentResult } from \"./types\";\n\nexport function useAgent<TApp = unknown, TName extends AgentNameOf<TApp> = AgentNameOf<TApp>>(\n agent: BetterAgentClientAgentMemoryHandle<TApp, TName>,\n options?: MaybeRefOrGetter<UseAgentOptions<TApp, TName> | undefined>,\n): UseAgentResult<TApp, TName>;\nexport function useAgent<TApp = unknown, TName extends AgentNameOf<TApp> = AgentNameOf<TApp>>(\n agent: BetterAgentClientAgentHandle<TApp, TName>,\n options?: MaybeRefOrGetter<UseAgentOptions<TApp, TName> | undefined>,\n): UseAgentResult<TApp, TName>;\nexport function useAgent<TApp = unknown, TName extends AgentNameOf<TApp> = AgentNameOf<TApp>>(\n agent: BetterAgentClientAgentHandle<TApp, TName>,\n options?: MaybeRefOrGetter<UseAgentOptions<TApp, TName> | undefined>,\n): UseAgentResult<TApp, TName> {\n const readOptions = () => toValue(options) ?? {};\n const toolHandlers = new Proxy(\n {},\n {\n get(_target, key) {\n const handlers = readOptions().toolHandlers as\n | Record<PropertyKey, unknown>\n | undefined;\n return handlers?.[key];\n },\n },\n ) as AgentControllerOptions<TApp, TName>[\"toolHandlers\"];\n\n const initialOptions = readOptions();\n const controller = createAgentController<TApp, TName>(agent, {\n initialMessages: initialOptions.initialMessages,\n initialState: initialOptions.initialState,\n initialInterruptState: initialOptions.initialInterruptState,\n resume: initialOptions.resume,\n context: initialOptions.context,\n threadId: initialOptions.threadId,\n toolHandlers,\n onEvent: (event) => readOptions().onEvent?.(event),\n onFinish: (finish) => readOptions().onFinish?.(finish),\n onError: (error) => readOptions().onError?.(error),\n });\n const version = ref(0);\n const snapshot = () => {\n void version.value;\n return controller.getSnapshot();\n };\n\n const unsubscribe = controller.subscribe(() => {\n version.value++;\n });\n\n onMounted(() => {\n controller.start();\n });\n\n onUnmounted(() => {\n unsubscribe();\n controller.stop();\n });\n\n return {\n messages: computed(() => snapshot().messages),\n state: computed(() => snapshot().state),\n status: computed(() => snapshot().status),\n error: computed(() => snapshot().error),\n runId: computed(() => snapshot().runId),\n threadId: computed(() => snapshot().threadId),\n isRunning: computed(() => snapshot().isRunning),\n pendingClientTools: computed(() => snapshot().pendingClientTools),\n pendingToolApprovals: computed(() => snapshot().pendingToolApprovals),\n sendMessage: (input, sendOptions) => controller.sendMessage(input, sendOptions),\n stop: () => controller.stop(),\n resume: (resume) => controller.resume(resume),\n selectThread: (threadId) => controller.selectThread(threadId),\n clearThread: () => controller.clearThread(),\n loadMessages: (threadId) => controller.loadMessages(threadId),\n approveToolCall: (interruptId, metadata) =>\n controller.approveToolCall(interruptId, metadata),\n rejectToolCall: (interruptId, metadata) => controller.rejectToolCall(interruptId, metadata),\n setMessages: (messages) => controller.setMessages(messages),\n };\n}\n"],"mappings":";;;;AAmBA,SAAgB,SACZ,OACA,SAC2B;CAC3B,MAAM,oBAAoB,QAAQ,QAAQ,IAAI,EAAE;CAChD,MAAM,eAAe,IAAI,MACrB,EAAE,EACF,EACI,IAAI,SAAS,KAAK;AAId,SAHiB,aAAa,CAAC,eAGb;IAEzB,CACJ;CAED,MAAM,iBAAiB,aAAa;CACpC,MAAM,aAAa,sBAAmC,OAAO;EACzD,iBAAiB,eAAe;EAChC,cAAc,eAAe;EAC7B,uBAAuB,eAAe;EACtC,QAAQ,eAAe;EACvB,SAAS,eAAe;EACxB,UAAU,eAAe;EACzB;EACA,UAAU,UAAU,aAAa,CAAC,UAAU,MAAM;EAClD,WAAW,WAAW,aAAa,CAAC,WAAW,OAAO;EACtD,UAAU,UAAU,aAAa,CAAC,UAAU,MAAM;EACrD,CAAC;CACF,MAAM,UAAU,IAAI,EAAE;CACtB,MAAM,iBAAiB;AACnB,EAAK,QAAQ;AACb,SAAO,WAAW,aAAa;;CAGnC,MAAM,cAAc,WAAW,gBAAgB;AAC3C,UAAQ;GACV;AAEF,iBAAgB;AACZ,aAAW,OAAO;GACpB;AAEF,mBAAkB;AACd,eAAa;AACb,aAAW,MAAM;GACnB;AAEF,QAAO;EACH,UAAU,eAAe,UAAU,CAAC,SAAS;EAC7C,OAAO,eAAe,UAAU,CAAC,MAAM;EACvC,QAAQ,eAAe,UAAU,CAAC,OAAO;EACzC,OAAO,eAAe,UAAU,CAAC,MAAM;EACvC,OAAO,eAAe,UAAU,CAAC,MAAM;EACvC,UAAU,eAAe,UAAU,CAAC,SAAS;EAC7C,WAAW,eAAe,UAAU,CAAC,UAAU;EAC/C,oBAAoB,eAAe,UAAU,CAAC,mBAAmB;EACjE,sBAAsB,eAAe,UAAU,CAAC,qBAAqB;EACrE,cAAc,OAAO,gBAAgB,WAAW,YAAY,OAAO,YAAY;EAC/E,YAAY,WAAW,MAAM;EAC7B,SAAS,WAAW,WAAW,OAAO,OAAO;EAC7C,eAAe,aAAa,WAAW,aAAa,SAAS;EAC7D,mBAAmB,WAAW,aAAa;EAC3C,eAAe,aAAa,WAAW,aAAa,SAAS;EAC7D,kBAAkB,aAAa,aAC3B,WAAW,gBAAgB,aAAa,SAAS;EACrD,iBAAiB,aAAa,aAAa,WAAW,eAAe,aAAa,SAAS;EAC3F,cAAc,aAAa,WAAW,YAAY,SAAS;EAC9D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-agent/client",
3
- "version": "0.1.0-canary.6",
3
+ "version": "0.2.0-beta.2",
4
4
  "description": "Better Agent client TypeScript library",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -97,19 +97,15 @@
97
97
  }
98
98
  },
99
99
  "dependencies": {
100
- "@better-agent/core": "0.1.0-canary.6",
101
- "@better-agent/shared": "0.1.0-canary.6"
100
+ "@better-agent/core": "0.2.0-beta.2"
102
101
  },
103
102
  "devDependencies": {
104
- "@types/bun": "^1.2.18",
105
- "@types/node": "^22.15.30",
106
- "@types/jsdom": "^28.0.0",
103
+ "@types/bun": "^1.3.12",
104
+ "@types/node": "^22.19.17",
107
105
  "@types/react": "^19.2.9",
108
- "@types/react-dom": "19.2.2",
109
- "jsdom": "^28.1.0",
106
+ "jsdom": "^29.1.1",
110
107
  "preact": "^10.27.2",
111
108
  "react": "19.2.3",
112
- "react-dom": "19.2.3",
113
109
  "solid-js": "^1.9.11",
114
110
  "svelte": "^5.39.6",
115
111
  "vue": "^3.5.28"
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # @better-agent/client
2
-
3
- Framework client bindings for Better Agent.