@useago/sdk 0.3.1 → 0.3.3
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/README.md +2 -0
- package/dist/AgoClient-DF7M2WAz.js +575 -0
- package/dist/AgoClient-bjN-z2ZQ.cjs +6 -0
- package/dist/angular.cjs +1 -143
- package/dist/angular.d.cts +530 -0
- package/dist/angular.d.ts +530 -2
- package/dist/angular.js +71 -139
- package/dist/createMockClient-D6uVh-B9.js +254 -0
- package/dist/createMockClient-DecMEUcK.cjs +1 -0
- package/dist/devtools.cjs +108 -0
- package/dist/devtools.d.cts +443 -0
- package/dist/devtools.d.ts +443 -0
- package/dist/devtools.js +156 -0
- package/dist/functions-Bz-1Bs3I.cjs +1 -0
- package/dist/functions-DdROP6Ui.js +312 -0
- package/dist/helpers.cjs +1 -15
- package/dist/{helpers/functions.d.ts → helpers.d.cts} +121 -62
- package/dist/helpers.d.ts +121 -2
- package/dist/helpers.js +16 -2
- package/dist/index.cjs +1 -335
- package/dist/index.d.cts +1150 -0
- package/dist/index.d.ts +1150 -20
- package/dist/index.js +128 -286
- package/dist/react.cjs +31 -22438
- package/dist/react.d.cts +960 -0
- package/dist/react.d.ts +960 -2
- package/dist/react.js +8401 -22376
- package/dist/rolldown-runtime-CaekUdDJ.cjs +1 -0
- package/dist/rolldown-runtime-DxmricAu.js +25 -0
- package/dist/vue.cjs +1 -336
- package/dist/vue.d.cts +1063 -0
- package/dist/vue.d.ts +1063 -2
- package/dist/vue.js +174 -316
- package/dist/{widget/types.d.ts → widget.d.cts} +41 -43
- package/dist/widget.d.ts +41 -2
- package/package.json +37 -21
- package/dist/AgoClient-CNT-8sh_.js +0 -905
- package/dist/AgoClient-CNT-8sh_.js.map +0 -1
- package/dist/AgoClient-D0l1GTRs.cjs +0 -976
- package/dist/AgoClient-D0l1GTRs.cjs.map +0 -1
- package/dist/angular/ago.service.d.ts +0 -98
- package/dist/angular/index.d.ts +0 -4
- package/dist/angular/provide.d.ts +0 -27
- package/dist/angular.cjs.map +0 -1
- package/dist/angular.js.map +0 -1
- package/dist/api/HttpClient.d.ts +0 -31
- package/dist/api/index.d.ts +0 -1
- package/dist/auto/createAgo.d.ts +0 -39
- package/dist/auto/index.d.ts +0 -1
- package/dist/client/AgoClient.d.ts +0 -169
- package/dist/client/errors.d.ts +0 -48
- package/dist/client/index.d.ts +0 -3
- package/dist/client/types.d.ts +0 -205
- package/dist/createMockClient-Ci_N2tH8.cjs +0 -104
- package/dist/createMockClient-Ci_N2tH8.cjs.map +0 -1
- package/dist/createMockClient-U0ae_AYy.js +0 -99
- package/dist/createMockClient-U0ae_AYy.js.map +0 -1
- package/dist/functions/FunctionRegistry.d.ts +0 -41
- package/dist/functions/defineFunction.d.ts +0 -22
- package/dist/functions/index.d.ts +0 -2
- package/dist/functions/types.d.ts +0 -50
- package/dist/functions--c6lx3ic.cjs +0 -480
- package/dist/functions--c6lx3ic.cjs.map +0 -1
- package/dist/functions-C9F1dnmh.js +0 -398
- package/dist/functions-C9F1dnmh.js.map +0 -1
- package/dist/helpers/factory.d.ts +0 -20
- package/dist/helpers/index.d.ts +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/react/components/ChatInput.d.ts +0 -12
- package/dist/react/components/ChatWidget.d.ts +0 -35
- package/dist/react/components/Markdown.d.ts +0 -12
- package/dist/react/components/Message.d.ts +0 -9
- package/dist/react/components/index.d.ts +0 -8
- package/dist/react/context/AgoContext.d.ts +0 -62
- package/dist/react/context/index.d.ts +0 -2
- package/dist/react/hooks/index.d.ts +0 -7
- package/dist/react/hooks/useAgo.d.ts +0 -14
- package/dist/react/hooks/useAgoContext.d.ts +0 -40
- package/dist/react/hooks/useAgoFunction.d.ts +0 -58
- package/dist/react/hooks/useAgoStore.d.ts +0 -17
- package/dist/react/hooks/useChat.d.ts +0 -45
- package/dist/react/hooks/useConversation.d.ts +0 -28
- package/dist/react/hooks/useMessages.d.ts +0 -26
- package/dist/react/index.d.ts +0 -24
- package/dist/react/testing.d.ts +0 -2
- package/dist/react.cjs.map +0 -1
- package/dist/react.js.map +0 -1
- package/dist/rolldown-runtime-BqCkTl7Q.cjs +0 -50
- package/dist/rolldown-runtime-CNZpIYwj.js +0 -33
- package/dist/state/ClientContextRegistry.d.ts +0 -64
- package/dist/state/createStore.d.ts +0 -18
- package/dist/streaming/SSEHandler.d.ts +0 -46
- package/dist/streaming/helpers.d.ts +0 -67
- package/dist/streaming/index.d.ts +0 -2
- package/dist/testing/createMockClient.d.ts +0 -42
- package/dist/testing/index.d.ts +0 -2
- package/dist/utils/eventEmitter.d.ts +0 -23
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/logger.d.ts +0 -14
- package/dist/vue/composables/useAgo.d.ts +0 -17
- package/dist/vue/composables/useAgoEvents.d.ts +0 -11
- package/dist/vue/composables/useAgoFunction.d.ts +0 -34
- package/dist/vue/composables/useAgoStore.d.ts +0 -18
- package/dist/vue/composables/useChat.d.ts +0 -251
- package/dist/vue/composables/useConversation.d.ts +0 -178
- package/dist/vue/composables/useMessages.d.ts +0 -89
- package/dist/vue/index.d.ts +0 -11
- package/dist/vue/plugin.d.ts +0 -16
- package/dist/vue/symbols.d.ts +0 -3
- package/dist/vue.cjs.map +0 -1
- package/dist/vue.js.map +0 -1
- package/dist/widget/index.d.ts +0 -1
package/dist/client/types.d.ts
DELETED
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDK Configuration
|
|
3
|
-
*/
|
|
4
|
-
export interface AgoConfig {
|
|
5
|
-
/** API base URL (e.g., https://YOUR-DOMAIN.useago.com) */
|
|
6
|
-
baseUrl: string;
|
|
7
|
-
/** Widget ID (X-Widget-Id header). Auto-generated if not provided. */
|
|
8
|
-
widgetId?: string;
|
|
9
|
-
/** Default agent (id or slug) for new conversations. Shorthand for `defaultAgentId`. */
|
|
10
|
-
agent?: string;
|
|
11
|
-
/** Default agent ID for new conversations. Prefer `agent`. */
|
|
12
|
-
defaultAgentId?: string;
|
|
13
|
-
/** Permission name to apply to all requests (sent as `X-Widget-Permission`). Mirrors the widget's `window.AGO.permission`. */
|
|
14
|
-
permission?: string;
|
|
15
|
-
/** User email for identification */
|
|
16
|
-
userEmail?: string;
|
|
17
|
-
/** JWT token for authenticated users */
|
|
18
|
-
userJwt?: string;
|
|
19
|
-
/** Enable debug logging */
|
|
20
|
-
debug?: boolean;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Options for sending a message
|
|
24
|
-
*/
|
|
25
|
-
export interface SendMessageOptions {
|
|
26
|
-
/** Existing conversation ID */
|
|
27
|
-
conversationId?: string;
|
|
28
|
-
/** Override default agent */
|
|
29
|
-
agentId?: string;
|
|
30
|
-
/** File attachments */
|
|
31
|
-
files?: File[];
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Message from AGO
|
|
35
|
-
*/
|
|
36
|
-
export interface AgoMessage {
|
|
37
|
-
id: string;
|
|
38
|
-
conversationId: string;
|
|
39
|
-
content: string;
|
|
40
|
-
role: "user" | "assistant";
|
|
41
|
-
status: MessageStatus;
|
|
42
|
-
agent?: AgoAgent;
|
|
43
|
-
sources?: AgoSource[];
|
|
44
|
-
toolCalls?: ToolCallData[];
|
|
45
|
-
followUpReplies?: string[];
|
|
46
|
-
createdAt: Date;
|
|
47
|
-
}
|
|
48
|
-
export type MessageStatus = "IN_PROGRESS" | "DONE" | "ERROR" | "TODO" | "CANCELED";
|
|
49
|
-
/**
|
|
50
|
-
* Agent information
|
|
51
|
-
*/
|
|
52
|
-
export interface AgoAgent {
|
|
53
|
-
id: string;
|
|
54
|
-
name: string;
|
|
55
|
-
displayName?: string;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Knowledge source citation
|
|
59
|
-
*/
|
|
60
|
-
export interface AgoSource {
|
|
61
|
-
id: string;
|
|
62
|
-
title: string;
|
|
63
|
-
url?: string;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Conversation/Thread
|
|
67
|
-
*/
|
|
68
|
-
export interface Conversation {
|
|
69
|
-
id: string;
|
|
70
|
-
title: string;
|
|
71
|
-
lastMessageDate: Date;
|
|
72
|
-
messages?: AgoMessage[];
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Tool call data from SSE stream
|
|
76
|
-
*/
|
|
77
|
-
export interface ToolCallData {
|
|
78
|
-
id: string;
|
|
79
|
-
type: ToolCallType;
|
|
80
|
-
status: string;
|
|
81
|
-
toolName: string;
|
|
82
|
-
toolDisplayName?: string;
|
|
83
|
-
message?: string;
|
|
84
|
-
formSchema?: FormSchema;
|
|
85
|
-
data?: Record<string, unknown>;
|
|
86
|
-
functionName?: string;
|
|
87
|
-
arguments?: Record<string, unknown>;
|
|
88
|
-
}
|
|
89
|
-
export type ToolCallType = "form" | "confirmation_input" | "status_message" | "progress_indicator" | "client_function" | "reasoning" | "mcp_ui_resource";
|
|
90
|
-
/**
|
|
91
|
-
* Form schema for tool calls requiring user input
|
|
92
|
-
*/
|
|
93
|
-
export interface FormSchema {
|
|
94
|
-
type: "object";
|
|
95
|
-
properties: Record<string, FormField>;
|
|
96
|
-
required?: string[];
|
|
97
|
-
}
|
|
98
|
-
export interface FormField {
|
|
99
|
-
type: "string" | "number" | "boolean" | "array";
|
|
100
|
-
title?: string;
|
|
101
|
-
description?: string;
|
|
102
|
-
enum?: string[];
|
|
103
|
-
default?: unknown;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Client-side function types
|
|
107
|
-
*/
|
|
108
|
-
export interface FunctionSchema {
|
|
109
|
-
name: string;
|
|
110
|
-
description: string;
|
|
111
|
-
parameters: {
|
|
112
|
-
type: "object";
|
|
113
|
-
properties: Record<string, {
|
|
114
|
-
type: string;
|
|
115
|
-
description?: string;
|
|
116
|
-
enum?: string[];
|
|
117
|
-
}>;
|
|
118
|
-
required?: string[];
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
export type ClientFunction = (args: Record<string, unknown>) => Promise<unknown> | unknown;
|
|
122
|
-
export interface FunctionDefinition {
|
|
123
|
-
name: string;
|
|
124
|
-
schema: FunctionSchema;
|
|
125
|
-
handler: ClientFunction;
|
|
126
|
-
}
|
|
127
|
-
export interface ClientFunctionInvocation {
|
|
128
|
-
invocationId: string;
|
|
129
|
-
functionName: string;
|
|
130
|
-
arguments: Record<string, unknown>;
|
|
131
|
-
conversationId: string;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* SSE stream chunk data
|
|
135
|
-
*/
|
|
136
|
-
export interface SSEChunkData {
|
|
137
|
-
content?: string;
|
|
138
|
-
full_content?: string;
|
|
139
|
-
message_id?: string;
|
|
140
|
-
status?: MessageStatus;
|
|
141
|
-
thread?: {
|
|
142
|
-
id: string;
|
|
143
|
-
};
|
|
144
|
-
agent?: {
|
|
145
|
-
id: string;
|
|
146
|
-
name: string;
|
|
147
|
-
display_name?: string;
|
|
148
|
-
};
|
|
149
|
-
knowledge_sources?: Array<{
|
|
150
|
-
knowledge_document: {
|
|
151
|
-
id: string;
|
|
152
|
-
title: string;
|
|
153
|
-
use_external_link: boolean;
|
|
154
|
-
external_link_url?: string;
|
|
155
|
-
internal_link_url?: string;
|
|
156
|
-
};
|
|
157
|
-
position: number;
|
|
158
|
-
}>;
|
|
159
|
-
tool_call_data?: boolean;
|
|
160
|
-
type?: string;
|
|
161
|
-
id?: string;
|
|
162
|
-
tool_name?: string;
|
|
163
|
-
tool_display_name?: string;
|
|
164
|
-
function_name?: string;
|
|
165
|
-
arguments?: Record<string, unknown>;
|
|
166
|
-
form_schema?: FormSchema;
|
|
167
|
-
message?: string;
|
|
168
|
-
data?: Record<string, unknown>;
|
|
169
|
-
follow_up_replies?: string[];
|
|
170
|
-
satisfaction_feedback?: unknown;
|
|
171
|
-
ask_to_talk_to_human?: boolean;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* SDK Events
|
|
175
|
-
*/
|
|
176
|
-
export interface AgoClientEvents {
|
|
177
|
-
"message:start": {
|
|
178
|
-
conversationId: string;
|
|
179
|
-
messageId: string;
|
|
180
|
-
};
|
|
181
|
-
"message:chunk": {
|
|
182
|
-
content: string;
|
|
183
|
-
conversationId: string;
|
|
184
|
-
messageId: string;
|
|
185
|
-
};
|
|
186
|
-
"message:complete": AgoMessage;
|
|
187
|
-
"message:error": {
|
|
188
|
-
error: string;
|
|
189
|
-
conversationId?: string;
|
|
190
|
-
messageId?: string;
|
|
191
|
-
};
|
|
192
|
-
"toolCall:received": ToolCallData;
|
|
193
|
-
"toolCall:form": ToolCallData;
|
|
194
|
-
"function:invoke": ClientFunctionInvocation;
|
|
195
|
-
"function:result": {
|
|
196
|
-
invocationId: string;
|
|
197
|
-
result: unknown;
|
|
198
|
-
error?: string;
|
|
199
|
-
};
|
|
200
|
-
"connection:status": {
|
|
201
|
-
connected: boolean;
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
export type AgoEventName = keyof AgoClientEvents;
|
|
205
|
-
export type AgoEventHandler<K extends AgoEventName> = (data: AgoClientEvents[K]) => void;
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
//#region src/testing/createMockClient.ts
|
|
2
|
-
/**
|
|
3
|
-
* Create a mock AgoClient for testing. Works with any framework.
|
|
4
|
-
*
|
|
5
|
-
* ```ts
|
|
6
|
-
* import { createMockClient } from "@useago/sdk/testing";
|
|
7
|
-
*
|
|
8
|
-
* const mock = createMockClient();
|
|
9
|
-
* mock.__emitEvent("message:complete", someMessage);
|
|
10
|
-
* expect(mock.__callsFor("sendMessage")).toHaveLength(1);
|
|
11
|
-
* ```
|
|
12
|
-
*/
|
|
13
|
-
function createMockClient(options = {}) {
|
|
14
|
-
const { overrides = {} } = options;
|
|
15
|
-
const noopMessage = {
|
|
16
|
-
id: "mock-msg-1",
|
|
17
|
-
conversationId: "mock-conv-1",
|
|
18
|
-
content: "Mock response",
|
|
19
|
-
role: "assistant",
|
|
20
|
-
status: "DONE",
|
|
21
|
-
createdAt: /* @__PURE__ */ new Date()
|
|
22
|
-
};
|
|
23
|
-
const noopConversation = {
|
|
24
|
-
id: "mock-conv-1",
|
|
25
|
-
title: "Mock Conversation",
|
|
26
|
-
lastMessageDate: /* @__PURE__ */ new Date()
|
|
27
|
-
};
|
|
28
|
-
const listeners = /* @__PURE__ */ new Map();
|
|
29
|
-
const calls = [];
|
|
30
|
-
const merged = {
|
|
31
|
-
sendMessage: async () => noopMessage,
|
|
32
|
-
getConversations: async () => [noopConversation],
|
|
33
|
-
getConversation: async () => noopConversation,
|
|
34
|
-
getMessages: async () => [noopMessage],
|
|
35
|
-
submitToolCallForm: async () => void 0,
|
|
36
|
-
confirmToolCall: async () => void 0,
|
|
37
|
-
rejectToolCall: async () => void 0,
|
|
38
|
-
submitFeedback: async () => void 0,
|
|
39
|
-
registerFunction: () => void 0,
|
|
40
|
-
unregisterFunction: () => true,
|
|
41
|
-
getRegisteredFunctions: () => [],
|
|
42
|
-
registerNavigationFunction: () => void 0,
|
|
43
|
-
on: (event, handler) => {
|
|
44
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
45
|
-
listeners.get(event).add(handler);
|
|
46
|
-
},
|
|
47
|
-
off: (event, handler) => {
|
|
48
|
-
listeners.get(event)?.delete(handler);
|
|
49
|
-
},
|
|
50
|
-
once: (event, handler) => {
|
|
51
|
-
const wrapper = (...args) => {
|
|
52
|
-
listeners.get(event)?.delete(wrapper);
|
|
53
|
-
handler(...args);
|
|
54
|
-
};
|
|
55
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
56
|
-
listeners.get(event).add(wrapper);
|
|
57
|
-
},
|
|
58
|
-
waitFor: (event, options) => {
|
|
59
|
-
return new Promise((resolve, reject) => {
|
|
60
|
-
let timer;
|
|
61
|
-
const handler = (data) => {
|
|
62
|
-
if (timer) clearTimeout(timer);
|
|
63
|
-
listeners.get(event)?.delete(handler);
|
|
64
|
-
resolve(data);
|
|
65
|
-
};
|
|
66
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
67
|
-
listeners.get(event).add(handler);
|
|
68
|
-
if (options?.timeout) timer = setTimeout(() => {
|
|
69
|
-
listeners.get(event)?.delete(handler);
|
|
70
|
-
reject(/* @__PURE__ */ new Error(`waitFor("${event}") timed out after ${options.timeout}ms`));
|
|
71
|
-
}, options.timeout);
|
|
72
|
-
});
|
|
73
|
-
},
|
|
74
|
-
updateConfig: () => void 0,
|
|
75
|
-
destroy: () => {
|
|
76
|
-
listeners.clear();
|
|
77
|
-
},
|
|
78
|
-
...overrides
|
|
79
|
-
};
|
|
80
|
-
const mock = {};
|
|
81
|
-
for (const [key, fn] of Object.entries(merged)) mock[key] = (...args) => {
|
|
82
|
-
calls.push({
|
|
83
|
-
method: key,
|
|
84
|
-
args
|
|
85
|
-
});
|
|
86
|
-
return fn(...args);
|
|
87
|
-
};
|
|
88
|
-
mock.__calls = calls;
|
|
89
|
-
mock.__callsFor = (method) => calls.filter((c) => c.method === method);
|
|
90
|
-
mock.__emitEvent = (event, data) => {
|
|
91
|
-
const handlers = listeners.get(event);
|
|
92
|
-
if (handlers) [...handlers].forEach((h) => h(data));
|
|
93
|
-
};
|
|
94
|
-
return mock;
|
|
95
|
-
}
|
|
96
|
-
//#endregion
|
|
97
|
-
Object.defineProperty(exports, "createMockClient", {
|
|
98
|
-
enumerable: true,
|
|
99
|
-
get: function() {
|
|
100
|
-
return createMockClient;
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
//# sourceMappingURL=createMockClient-Ci_N2tH8.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createMockClient-Ci_N2tH8.cjs","names":[],"sources":["../src/testing/createMockClient.ts"],"sourcesContent":["import type { AgoClient } from \"../client/AgoClient\";\nimport type {\n AgoClientEvents,\n AgoEventName,\n AgoMessage,\n Conversation,\n} from \"../client/types\";\nimport type { ClientFunctionSchema } from \"../functions/types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MockFn = (...args: any[]) => any;\n\nexport interface MockAgoClientOptions {\n overrides?: Partial<Record<string, MockFn>>;\n}\n\nexport interface MockAgoClient extends AgoClient {\n /**\n * Simulate a server-pushed event.\n * ```ts\n * mock.__emitEvent(\"message:complete\", { id: \"1\", content: \"hi\", ... });\n * ```\n */\n __emitEvent<K extends AgoEventName>(event: K, data: AgoClientEvents[K]): void;\n\n /**\n * All recorded method calls: `[methodName, ...args][]`\n */\n __calls: Array<{ method: string; args: unknown[] }>;\n\n /**\n * Get calls for a specific method.\n */\n __callsFor(method: string): Array<{ method: string; args: unknown[] }>;\n}\n\n/**\n * Create a mock AgoClient for testing. Works with any framework.\n *\n * ```ts\n * import { createMockClient } from \"@useago/sdk/testing\";\n *\n * const mock = createMockClient();\n * mock.__emitEvent(\"message:complete\", someMessage);\n * expect(mock.__callsFor(\"sendMessage\")).toHaveLength(1);\n * ```\n */\nexport function createMockClient(\n options: MockAgoClientOptions = {}\n): MockAgoClient {\n const { overrides = {} } = options;\n\n const noopMessage: AgoMessage = {\n id: \"mock-msg-1\",\n conversationId: \"mock-conv-1\",\n content: \"Mock response\",\n role: \"assistant\",\n status: \"DONE\",\n createdAt: new Date(),\n };\n\n const noopConversation: Conversation = {\n id: \"mock-conv-1\",\n title: \"Mock Conversation\",\n lastMessageDate: new Date(),\n };\n\n const listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n const calls: Array<{ method: string; args: unknown[] }> = [];\n\n const defaults: Record<string, MockFn> = {\n sendMessage: async () => noopMessage,\n getConversations: async () => [noopConversation],\n getConversation: async () => noopConversation,\n getMessages: async () => [noopMessage],\n submitToolCallForm: async () => undefined,\n confirmToolCall: async () => undefined,\n rejectToolCall: async () => undefined,\n submitFeedback: async () => undefined,\n registerFunction: () => undefined,\n unregisterFunction: () => true,\n getRegisteredFunctions: () => [] as ClientFunctionSchema[],\n registerNavigationFunction: () => undefined,\n on: (event: string, handler: (...args: unknown[]) => void) => {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n },\n off: (event: string, handler: (...args: unknown[]) => void) => {\n listeners.get(event)?.delete(handler);\n },\n once: (event: string, handler: (...args: unknown[]) => void) => {\n const wrapper = (...args: unknown[]) => {\n listeners.get(event)?.delete(wrapper);\n handler(...args);\n };\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(wrapper);\n },\n waitFor: (event: string, options?: { timeout?: number }) => {\n return new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const handler = (data: unknown) => {\n if (timer) clearTimeout(timer);\n listeners.get(event)?.delete(handler);\n resolve(data);\n };\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n if (options?.timeout) {\n timer = setTimeout(() => {\n listeners.get(event)?.delete(handler);\n reject(new Error(`waitFor(\"${event}\") timed out after ${options.timeout}ms`));\n }, options.timeout);\n }\n });\n },\n updateConfig: () => undefined,\n destroy: () => {\n listeners.clear();\n },\n };\n\n const merged = { ...defaults, ...overrides } as Record<string, MockFn>;\n\n // Wrap all methods to record calls\n const mock: Record<string, unknown> = {};\n\n for (const [key, fn] of Object.entries(merged)) {\n mock[key] = (...args: unknown[]) => {\n calls.push({ method: key, args });\n return (fn as MockFn)(...args);\n };\n }\n\n // Test helpers (not recorded)\n mock.__calls = calls;\n mock.__callsFor = (method: string) => calls.filter((c) => c.method === method);\n mock.__emitEvent = (event: string, data: unknown) => {\n // Copy the set to avoid mutation during iteration (once handlers remove themselves)\n const handlers = listeners.get(event);\n if (handlers) {\n [...handlers].forEach((h) => h(data));\n }\n };\n\n return mock as unknown as MockAgoClient;\n}\n"],"mappings":";;;;;;;;;;;;AA+CA,SAAgB,iBACd,UAAgC,EAAE,EACnB;CACf,MAAM,EAAE,YAAY,EAAE,KAAK;CAE3B,MAAM,cAA0B;EAC9B,IAAI;EACJ,gBAAgB;EAChB,SAAS;EACT,MAAM;EACN,QAAQ;EACR,2BAAW,IAAI,MAAM;EACtB;CAED,MAAM,mBAAiC;EACrC,IAAI;EACJ,OAAO;EACP,iCAAiB,IAAI,MAAM;EAC5B;CAED,MAAM,4BAAY,IAAI,KAAgD;CACtE,MAAM,QAAoD,EAAE;CAsD5D,MAAM,SAAS;EAnDb,aAAa,YAAY;EACzB,kBAAkB,YAAY,CAAC,iBAAiB;EAChD,iBAAiB,YAAY;EAC7B,aAAa,YAAY,CAAC,YAAY;EACtC,oBAAoB,YAAY,KAAA;EAChC,iBAAiB,YAAY,KAAA;EAC7B,gBAAgB,YAAY,KAAA;EAC5B,gBAAgB,YAAY,KAAA;EAC5B,wBAAwB,KAAA;EACxB,0BAA0B;EAC1B,8BAA8B,EAAE;EAChC,kCAAkC,KAAA;EAClC,KAAK,OAAe,YAA0C;AAC5D,OAAI,CAAC,UAAU,IAAI,MAAM,CAAE,WAAU,IAAI,uBAAO,IAAI,KAAK,CAAC;AAC1D,aAAU,IAAI,MAAM,CAAE,IAAI,QAAQ;;EAEpC,MAAM,OAAe,YAA0C;AAC7D,aAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;;EAEvC,OAAO,OAAe,YAA0C;GAC9D,MAAM,WAAW,GAAG,SAAoB;AACtC,cAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;AACrC,YAAQ,GAAG,KAAK;;AAElB,OAAI,CAAC,UAAU,IAAI,MAAM,CAAE,WAAU,IAAI,uBAAO,IAAI,KAAK,CAAC;AAC1D,aAAU,IAAI,MAAM,CAAE,IAAI,QAAQ;;EAEpC,UAAU,OAAe,YAAmC;AAC1D,UAAO,IAAI,SAAS,SAAS,WAAW;IACtC,IAAI;IACJ,MAAM,WAAW,SAAkB;AACjC,SAAI,MAAO,cAAa,MAAM;AAC9B,eAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;AACrC,aAAQ,KAAK;;AAEf,QAAI,CAAC,UAAU,IAAI,MAAM,CAAE,WAAU,IAAI,uBAAO,IAAI,KAAK,CAAC;AAC1D,cAAU,IAAI,MAAM,CAAE,IAAI,QAAQ;AAClC,QAAI,SAAS,QACX,SAAQ,iBAAiB;AACvB,eAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;AACrC,4BAAO,IAAI,MAAM,YAAY,MAAM,qBAAqB,QAAQ,QAAQ,IAAI,CAAC;OAC5E,QAAQ,QAAQ;KAErB;;EAEJ,oBAAoB,KAAA;EACpB,eAAe;AACb,aAAU,OAAO;;EAIS,GAAG;EAAW;CAG5C,MAAM,OAAgC,EAAE;AAExC,MAAK,MAAM,CAAC,KAAK,OAAO,OAAO,QAAQ,OAAO,CAC5C,MAAK,QAAQ,GAAG,SAAoB;AAClC,QAAM,KAAK;GAAE,QAAQ;GAAK;GAAM,CAAC;AACjC,SAAQ,GAAc,GAAG,KAAK;;AAKlC,MAAK,UAAU;AACf,MAAK,cAAc,WAAmB,MAAM,QAAQ,MAAM,EAAE,WAAW,OAAO;AAC9E,MAAK,eAAe,OAAe,SAAkB;EAEnD,MAAM,WAAW,UAAU,IAAI,MAAM;AACrC,MAAI,SACF,EAAC,GAAG,SAAS,CAAC,SAAS,MAAM,EAAE,KAAK,CAAC;;AAIzC,QAAO"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
//#region src/testing/createMockClient.ts
|
|
2
|
-
/**
|
|
3
|
-
* Create a mock AgoClient for testing. Works with any framework.
|
|
4
|
-
*
|
|
5
|
-
* ```ts
|
|
6
|
-
* import { createMockClient } from "@useago/sdk/testing";
|
|
7
|
-
*
|
|
8
|
-
* const mock = createMockClient();
|
|
9
|
-
* mock.__emitEvent("message:complete", someMessage);
|
|
10
|
-
* expect(mock.__callsFor("sendMessage")).toHaveLength(1);
|
|
11
|
-
* ```
|
|
12
|
-
*/
|
|
13
|
-
function createMockClient(options = {}) {
|
|
14
|
-
const { overrides = {} } = options;
|
|
15
|
-
const noopMessage = {
|
|
16
|
-
id: "mock-msg-1",
|
|
17
|
-
conversationId: "mock-conv-1",
|
|
18
|
-
content: "Mock response",
|
|
19
|
-
role: "assistant",
|
|
20
|
-
status: "DONE",
|
|
21
|
-
createdAt: /* @__PURE__ */ new Date()
|
|
22
|
-
};
|
|
23
|
-
const noopConversation = {
|
|
24
|
-
id: "mock-conv-1",
|
|
25
|
-
title: "Mock Conversation",
|
|
26
|
-
lastMessageDate: /* @__PURE__ */ new Date()
|
|
27
|
-
};
|
|
28
|
-
const listeners = /* @__PURE__ */ new Map();
|
|
29
|
-
const calls = [];
|
|
30
|
-
const merged = {
|
|
31
|
-
sendMessage: async () => noopMessage,
|
|
32
|
-
getConversations: async () => [noopConversation],
|
|
33
|
-
getConversation: async () => noopConversation,
|
|
34
|
-
getMessages: async () => [noopMessage],
|
|
35
|
-
submitToolCallForm: async () => void 0,
|
|
36
|
-
confirmToolCall: async () => void 0,
|
|
37
|
-
rejectToolCall: async () => void 0,
|
|
38
|
-
submitFeedback: async () => void 0,
|
|
39
|
-
registerFunction: () => void 0,
|
|
40
|
-
unregisterFunction: () => true,
|
|
41
|
-
getRegisteredFunctions: () => [],
|
|
42
|
-
registerNavigationFunction: () => void 0,
|
|
43
|
-
on: (event, handler) => {
|
|
44
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
45
|
-
listeners.get(event).add(handler);
|
|
46
|
-
},
|
|
47
|
-
off: (event, handler) => {
|
|
48
|
-
listeners.get(event)?.delete(handler);
|
|
49
|
-
},
|
|
50
|
-
once: (event, handler) => {
|
|
51
|
-
const wrapper = (...args) => {
|
|
52
|
-
listeners.get(event)?.delete(wrapper);
|
|
53
|
-
handler(...args);
|
|
54
|
-
};
|
|
55
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
56
|
-
listeners.get(event).add(wrapper);
|
|
57
|
-
},
|
|
58
|
-
waitFor: (event, options) => {
|
|
59
|
-
return new Promise((resolve, reject) => {
|
|
60
|
-
let timer;
|
|
61
|
-
const handler = (data) => {
|
|
62
|
-
if (timer) clearTimeout(timer);
|
|
63
|
-
listeners.get(event)?.delete(handler);
|
|
64
|
-
resolve(data);
|
|
65
|
-
};
|
|
66
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
67
|
-
listeners.get(event).add(handler);
|
|
68
|
-
if (options?.timeout) timer = setTimeout(() => {
|
|
69
|
-
listeners.get(event)?.delete(handler);
|
|
70
|
-
reject(/* @__PURE__ */ new Error(`waitFor("${event}") timed out after ${options.timeout}ms`));
|
|
71
|
-
}, options.timeout);
|
|
72
|
-
});
|
|
73
|
-
},
|
|
74
|
-
updateConfig: () => void 0,
|
|
75
|
-
destroy: () => {
|
|
76
|
-
listeners.clear();
|
|
77
|
-
},
|
|
78
|
-
...overrides
|
|
79
|
-
};
|
|
80
|
-
const mock = {};
|
|
81
|
-
for (const [key, fn] of Object.entries(merged)) mock[key] = (...args) => {
|
|
82
|
-
calls.push({
|
|
83
|
-
method: key,
|
|
84
|
-
args
|
|
85
|
-
});
|
|
86
|
-
return fn(...args);
|
|
87
|
-
};
|
|
88
|
-
mock.__calls = calls;
|
|
89
|
-
mock.__callsFor = (method) => calls.filter((c) => c.method === method);
|
|
90
|
-
mock.__emitEvent = (event, data) => {
|
|
91
|
-
const handlers = listeners.get(event);
|
|
92
|
-
if (handlers) [...handlers].forEach((h) => h(data));
|
|
93
|
-
};
|
|
94
|
-
return mock;
|
|
95
|
-
}
|
|
96
|
-
//#endregion
|
|
97
|
-
export { createMockClient as t };
|
|
98
|
-
|
|
99
|
-
//# sourceMappingURL=createMockClient-U0ae_AYy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createMockClient-U0ae_AYy.js","names":[],"sources":["../src/testing/createMockClient.ts"],"sourcesContent":["import type { AgoClient } from \"../client/AgoClient\";\nimport type {\n AgoClientEvents,\n AgoEventName,\n AgoMessage,\n Conversation,\n} from \"../client/types\";\nimport type { ClientFunctionSchema } from \"../functions/types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MockFn = (...args: any[]) => any;\n\nexport interface MockAgoClientOptions {\n overrides?: Partial<Record<string, MockFn>>;\n}\n\nexport interface MockAgoClient extends AgoClient {\n /**\n * Simulate a server-pushed event.\n * ```ts\n * mock.__emitEvent(\"message:complete\", { id: \"1\", content: \"hi\", ... });\n * ```\n */\n __emitEvent<K extends AgoEventName>(event: K, data: AgoClientEvents[K]): void;\n\n /**\n * All recorded method calls: `[methodName, ...args][]`\n */\n __calls: Array<{ method: string; args: unknown[] }>;\n\n /**\n * Get calls for a specific method.\n */\n __callsFor(method: string): Array<{ method: string; args: unknown[] }>;\n}\n\n/**\n * Create a mock AgoClient for testing. Works with any framework.\n *\n * ```ts\n * import { createMockClient } from \"@useago/sdk/testing\";\n *\n * const mock = createMockClient();\n * mock.__emitEvent(\"message:complete\", someMessage);\n * expect(mock.__callsFor(\"sendMessage\")).toHaveLength(1);\n * ```\n */\nexport function createMockClient(\n options: MockAgoClientOptions = {}\n): MockAgoClient {\n const { overrides = {} } = options;\n\n const noopMessage: AgoMessage = {\n id: \"mock-msg-1\",\n conversationId: \"mock-conv-1\",\n content: \"Mock response\",\n role: \"assistant\",\n status: \"DONE\",\n createdAt: new Date(),\n };\n\n const noopConversation: Conversation = {\n id: \"mock-conv-1\",\n title: \"Mock Conversation\",\n lastMessageDate: new Date(),\n };\n\n const listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n const calls: Array<{ method: string; args: unknown[] }> = [];\n\n const defaults: Record<string, MockFn> = {\n sendMessage: async () => noopMessage,\n getConversations: async () => [noopConversation],\n getConversation: async () => noopConversation,\n getMessages: async () => [noopMessage],\n submitToolCallForm: async () => undefined,\n confirmToolCall: async () => undefined,\n rejectToolCall: async () => undefined,\n submitFeedback: async () => undefined,\n registerFunction: () => undefined,\n unregisterFunction: () => true,\n getRegisteredFunctions: () => [] as ClientFunctionSchema[],\n registerNavigationFunction: () => undefined,\n on: (event: string, handler: (...args: unknown[]) => void) => {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n },\n off: (event: string, handler: (...args: unknown[]) => void) => {\n listeners.get(event)?.delete(handler);\n },\n once: (event: string, handler: (...args: unknown[]) => void) => {\n const wrapper = (...args: unknown[]) => {\n listeners.get(event)?.delete(wrapper);\n handler(...args);\n };\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(wrapper);\n },\n waitFor: (event: string, options?: { timeout?: number }) => {\n return new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const handler = (data: unknown) => {\n if (timer) clearTimeout(timer);\n listeners.get(event)?.delete(handler);\n resolve(data);\n };\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n if (options?.timeout) {\n timer = setTimeout(() => {\n listeners.get(event)?.delete(handler);\n reject(new Error(`waitFor(\"${event}\") timed out after ${options.timeout}ms`));\n }, options.timeout);\n }\n });\n },\n updateConfig: () => undefined,\n destroy: () => {\n listeners.clear();\n },\n };\n\n const merged = { ...defaults, ...overrides } as Record<string, MockFn>;\n\n // Wrap all methods to record calls\n const mock: Record<string, unknown> = {};\n\n for (const [key, fn] of Object.entries(merged)) {\n mock[key] = (...args: unknown[]) => {\n calls.push({ method: key, args });\n return (fn as MockFn)(...args);\n };\n }\n\n // Test helpers (not recorded)\n mock.__calls = calls;\n mock.__callsFor = (method: string) => calls.filter((c) => c.method === method);\n mock.__emitEvent = (event: string, data: unknown) => {\n // Copy the set to avoid mutation during iteration (once handlers remove themselves)\n const handlers = listeners.get(event);\n if (handlers) {\n [...handlers].forEach((h) => h(data));\n }\n };\n\n return mock as unknown as MockAgoClient;\n}\n"],"mappings":";;;;;;;;;;;;AA+CA,SAAgB,iBACd,UAAgC,EAAE,EACnB;CACf,MAAM,EAAE,YAAY,EAAE,KAAK;CAE3B,MAAM,cAA0B;EAC9B,IAAI;EACJ,gBAAgB;EAChB,SAAS;EACT,MAAM;EACN,QAAQ;EACR,2BAAW,IAAI,MAAM;EACtB;CAED,MAAM,mBAAiC;EACrC,IAAI;EACJ,OAAO;EACP,iCAAiB,IAAI,MAAM;EAC5B;CAED,MAAM,4BAAY,IAAI,KAAgD;CACtE,MAAM,QAAoD,EAAE;CAsD5D,MAAM,SAAS;EAnDb,aAAa,YAAY;EACzB,kBAAkB,YAAY,CAAC,iBAAiB;EAChD,iBAAiB,YAAY;EAC7B,aAAa,YAAY,CAAC,YAAY;EACtC,oBAAoB,YAAY,KAAA;EAChC,iBAAiB,YAAY,KAAA;EAC7B,gBAAgB,YAAY,KAAA;EAC5B,gBAAgB,YAAY,KAAA;EAC5B,wBAAwB,KAAA;EACxB,0BAA0B;EAC1B,8BAA8B,EAAE;EAChC,kCAAkC,KAAA;EAClC,KAAK,OAAe,YAA0C;AAC5D,OAAI,CAAC,UAAU,IAAI,MAAM,CAAE,WAAU,IAAI,uBAAO,IAAI,KAAK,CAAC;AAC1D,aAAU,IAAI,MAAM,CAAE,IAAI,QAAQ;;EAEpC,MAAM,OAAe,YAA0C;AAC7D,aAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;;EAEvC,OAAO,OAAe,YAA0C;GAC9D,MAAM,WAAW,GAAG,SAAoB;AACtC,cAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;AACrC,YAAQ,GAAG,KAAK;;AAElB,OAAI,CAAC,UAAU,IAAI,MAAM,CAAE,WAAU,IAAI,uBAAO,IAAI,KAAK,CAAC;AAC1D,aAAU,IAAI,MAAM,CAAE,IAAI,QAAQ;;EAEpC,UAAU,OAAe,YAAmC;AAC1D,UAAO,IAAI,SAAS,SAAS,WAAW;IACtC,IAAI;IACJ,MAAM,WAAW,SAAkB;AACjC,SAAI,MAAO,cAAa,MAAM;AAC9B,eAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;AACrC,aAAQ,KAAK;;AAEf,QAAI,CAAC,UAAU,IAAI,MAAM,CAAE,WAAU,IAAI,uBAAO,IAAI,KAAK,CAAC;AAC1D,cAAU,IAAI,MAAM,CAAE,IAAI,QAAQ;AAClC,QAAI,SAAS,QACX,SAAQ,iBAAiB;AACvB,eAAU,IAAI,MAAM,EAAE,OAAO,QAAQ;AACrC,4BAAO,IAAI,MAAM,YAAY,MAAM,qBAAqB,QAAQ,QAAQ,IAAI,CAAC;OAC5E,QAAQ,QAAQ;KAErB;;EAEJ,oBAAoB,KAAA;EACpB,eAAe;AACb,aAAU,OAAO;;EAIS,GAAG;EAAW;CAG5C,MAAM,OAAgC,EAAE;AAExC,MAAK,MAAM,CAAC,KAAK,OAAO,OAAO,QAAQ,OAAO,CAC5C,MAAK,QAAQ,GAAG,SAAoB;AAClC,QAAM,KAAK;GAAE,QAAQ;GAAK;GAAM,CAAC;AACjC,SAAQ,GAAc,GAAG,KAAK;;AAKlC,MAAK,UAAU;AACf,MAAK,cAAc,WAAmB,MAAM,QAAQ,MAAM,EAAE,WAAW,OAAO;AAC9E,MAAK,eAAe,OAAe,SAAkB;EAEnD,MAAM,WAAW,UAAU,IAAI,MAAM;AACrC,MAAI,SACF,EAAC,GAAG,SAAS,CAAC,SAAS,MAAM,EAAE,KAAK,CAAC;;AAIzC,QAAO"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { ClientFunctionDefinition, ClientFunctionHandler, ClientFunctionSchema, RegisteredFunction } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* Registry for client-side functions that AGO can call
|
|
4
|
-
*/
|
|
5
|
-
export declare class FunctionRegistry {
|
|
6
|
-
private functions;
|
|
7
|
-
/**
|
|
8
|
-
* Register a function that AGO can call.
|
|
9
|
-
* Accepts either a single definition object or (name, handler, schema) args.
|
|
10
|
-
*/
|
|
11
|
-
register(definition: ClientFunctionDefinition): void;
|
|
12
|
-
register(name: string, handler: ClientFunctionHandler, schema: Omit<ClientFunctionSchema, "name">): void;
|
|
13
|
-
/**
|
|
14
|
-
* Unregister a function
|
|
15
|
-
*/
|
|
16
|
-
unregister(name: string): boolean;
|
|
17
|
-
/**
|
|
18
|
-
* Get a registered function
|
|
19
|
-
*/
|
|
20
|
-
get(name: string): RegisteredFunction | undefined;
|
|
21
|
-
/**
|
|
22
|
-
* Check if a function is registered
|
|
23
|
-
*/
|
|
24
|
-
has(name: string): boolean;
|
|
25
|
-
/**
|
|
26
|
-
* Get all registered function schemas (for sending to backend)
|
|
27
|
-
*/
|
|
28
|
-
getSchemas(): ClientFunctionSchema[];
|
|
29
|
-
/**
|
|
30
|
-
* Execute a registered function
|
|
31
|
-
*/
|
|
32
|
-
execute(name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
33
|
-
/**
|
|
34
|
-
* Clear all registered functions
|
|
35
|
-
*/
|
|
36
|
-
clear(): void;
|
|
37
|
-
/**
|
|
38
|
-
* Get the number of registered functions
|
|
39
|
-
*/
|
|
40
|
-
get size(): number;
|
|
41
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { ClientFunctionDefinition } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* Create a reusable function definition.
|
|
4
|
-
* Returns the same object — this is an identity function for discoverability and type-checking.
|
|
5
|
-
*
|
|
6
|
-
* ```ts
|
|
7
|
-
* // Define once, reuse anywhere
|
|
8
|
-
* export const lookupOrder = defineFunction({
|
|
9
|
-
* name: "lookupOrder",
|
|
10
|
-
* description: "Look up an order by ID",
|
|
11
|
-
* parameters: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
|
|
12
|
-
* handler: async (args) => fetchOrder(args.id as string),
|
|
13
|
-
* });
|
|
14
|
-
*
|
|
15
|
-
* // Register with client
|
|
16
|
-
* client.registerFunction(lookupOrder);
|
|
17
|
-
*
|
|
18
|
-
* // Or use in React
|
|
19
|
-
* useAgoFunction(lookupOrder.name, lookupOrder);
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export declare function defineFunction(definition: ClientFunctionDefinition): ClientFunctionDefinition;
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Schema for a client-side function that AGO can call
|
|
3
|
-
*/
|
|
4
|
-
export interface ClientFunctionSchema {
|
|
5
|
-
/** Function name (must be unique) */
|
|
6
|
-
name: string;
|
|
7
|
-
/** Description for the LLM to understand when to call this function */
|
|
8
|
-
description: string;
|
|
9
|
-
/** JSON Schema for function parameters */
|
|
10
|
-
parameters: {
|
|
11
|
-
type: "object";
|
|
12
|
-
properties: Record<string, {
|
|
13
|
-
type: string;
|
|
14
|
-
description?: string;
|
|
15
|
-
enum?: string[];
|
|
16
|
-
default?: unknown;
|
|
17
|
-
}>;
|
|
18
|
-
required?: string[];
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Function handler type
|
|
23
|
-
*/
|
|
24
|
-
export type ClientFunctionHandler = (args: Record<string, unknown>) => Promise<unknown> | unknown;
|
|
25
|
-
/**
|
|
26
|
-
* Registered function with handler
|
|
27
|
-
*/
|
|
28
|
-
export interface RegisteredFunction {
|
|
29
|
-
schema: ClientFunctionSchema;
|
|
30
|
-
handler: ClientFunctionHandler;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Single-object function definition — combines name, schema, and handler.
|
|
34
|
-
*
|
|
35
|
-
* ```ts
|
|
36
|
-
* const fn = defineFunction({
|
|
37
|
-
* name: "lookupOrder",
|
|
38
|
-
* description: "Look up an order by ID",
|
|
39
|
-
* parameters: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
|
|
40
|
-
* handler: async (args) => fetchOrder(args.id as string),
|
|
41
|
-
* });
|
|
42
|
-
* client.registerFunction(fn);
|
|
43
|
-
* ```
|
|
44
|
-
*/
|
|
45
|
-
export interface ClientFunctionDefinition {
|
|
46
|
-
name: string;
|
|
47
|
-
description: string;
|
|
48
|
-
parameters: ClientFunctionSchema["parameters"];
|
|
49
|
-
handler: ClientFunctionHandler;
|
|
50
|
-
}
|