@useago/sdk 0.3.0 → 0.3.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.
- package/README.md +2 -0
- package/dist/AgoClient-DPZdN5n2.js +905 -0
- package/dist/AgoClient-DPZdN5n2.js.map +1 -0
- package/dist/AgoClient-wMVUQqCD.cjs +976 -0
- package/dist/AgoClient-wMVUQqCD.cjs.map +1 -0
- package/dist/angular.cjs +138 -100
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.d.ts +1 -0
- package/dist/angular.js +139 -103
- package/dist/angular.js.map +1 -1
- package/dist/client/AgoClient.d.ts +56 -0
- package/dist/client/types.d.ts +5 -1
- package/dist/createMockClient-Ci_N2tH8.cjs +104 -0
- package/dist/createMockClient-Ci_N2tH8.cjs.map +1 -0
- package/dist/createMockClient-U0ae_AYy.js +99 -0
- package/dist/createMockClient-U0ae_AYy.js.map +1 -0
- package/dist/devtools/index.d.ts +2 -0
- package/dist/devtools/initDevPanel.d.ts +15 -0
- package/dist/devtools.cjs +182 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.ts +2 -0
- package/dist/devtools.js +181 -0
- package/dist/devtools.js.map +1 -0
- package/dist/functions--c6lx3ic.cjs +480 -0
- package/dist/functions--c6lx3ic.cjs.map +1 -0
- package/dist/functions-C9F1dnmh.js +398 -0
- package/dist/functions-C9F1dnmh.js.map +1 -0
- package/dist/helpers/factory.d.ts +20 -0
- package/dist/helpers.cjs +14 -305
- package/dist/helpers.d.ts +1 -0
- package/dist/helpers.js +2 -306
- package/dist/index.cjs +316 -151
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +14 -9
- package/dist/index.js +289 -163
- package/dist/index.js.map +1 -1
- package/dist/react/components/ChatWidget.d.ts +2 -0
- package/dist/react/components/Markdown.d.ts +12 -0
- package/dist/react/components/Message.d.ts +2 -0
- package/dist/react/components/index.d.ts +2 -0
- package/dist/react/context/AgoContext.d.ts +29 -3
- package/dist/react/context/index.d.ts +1 -1
- package/dist/react/hooks/index.d.ts +1 -0
- package/dist/react/hooks/useAgoContext.d.ts +40 -0
- package/dist/react/hooks/useAgoFunction.d.ts +14 -2
- package/dist/react/hooks/useAgoStore.d.ts +17 -0
- package/dist/react/index.d.ts +5 -1
- package/dist/react.cjs +22130 -10274
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.ts +1 -0
- package/dist/react.js +22128 -10289
- package/dist/react.js.map +1 -1
- package/dist/rolldown-runtime-BqCkTl7Q.cjs +50 -0
- package/dist/rolldown-runtime-CNZpIYwj.js +33 -0
- package/dist/state/ClientContextRegistry.d.ts +64 -0
- package/dist/state/createStore.d.ts +30 -0
- package/dist/vue/composables/useAgoStore.d.ts +18 -0
- package/dist/vue/index.d.ts +1 -0
- package/dist/vue.cjs +312 -208
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.d.ts +1 -0
- package/dist/vue.js +311 -218
- package/dist/vue.js.map +1 -1
- package/dist/widget/types.d.ts +1 -0
- package/dist/widget.cjs +0 -2
- package/dist/widget.d.ts +1 -0
- package/dist/widget.js +0 -2
- package/package.json +6 -1
- package/dist/AgoClient-B-SONi_K.js +0 -861
- package/dist/AgoClient-B-SONi_K.js.map +0 -1
- package/dist/AgoClient-xTWfMWKh.cjs +0 -860
- package/dist/AgoClient-xTWfMWKh.cjs.map +0 -1
- package/dist/createMockClient-B1DcBiIK.js +0 -94
- package/dist/createMockClient-B1DcBiIK.js.map +0 -1
- package/dist/createMockClient-BqNSJUu4.cjs +0 -93
- package/dist/createMockClient-BqNSJUu4.cjs.map +0 -1
- package/dist/helpers.cjs.map +0 -1
- package/dist/helpers.js.map +0 -1
- package/dist/widget.cjs.map +0 -1
- package/dist/widget.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgoClient-xTWfMWKh.cjs","sources":["../src/client/errors.ts","../src/utils/logger.ts","../src/api/HttpClient.ts","../src/functions/FunctionRegistry.ts","../src/streaming/SSEHandler.ts","../src/utils/eventEmitter.ts","../src/client/AgoClient.ts"],"sourcesContent":["/**\n * Base error class for AGO SDK\n */\nexport class AgoError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = \"AgoError\";\n }\n}\n\n/**\n * Error from API response\n */\nexport class AgoApiError extends AgoError {\n constructor(\n message: string,\n code: string,\n statusCode: number,\n public type: string,\n public param?: string,\n public docUrl?: string\n ) {\n super(message, code, statusCode);\n this.name = \"AgoApiError\";\n }\n\n static fromResponse(data: ApiErrorResponse, statusCode: number): AgoApiError {\n const error = data.error;\n return new AgoApiError(\n error.message,\n error.code,\n statusCode,\n error.type,\n error.param,\n error.doc_url\n );\n }\n}\n\nexport interface ApiErrorResponse {\n error: {\n type: string;\n code: string;\n message: string;\n param?: string;\n doc_url?: string;\n };\n}\n\n/**\n * Network/connection error\n */\nexport class AgoNetworkError extends AgoError {\n constructor(message: string, public originalError?: Error) {\n super(message, \"network_error\");\n this.name = \"AgoNetworkError\";\n }\n}\n\n/**\n * SSE stream error\n */\nexport class AgoStreamError extends AgoError {\n constructor(message: string) {\n super(message, \"stream_error\");\n this.name = \"AgoStreamError\";\n }\n}\n\n/**\n * Function execution error\n */\nexport class AgoFunctionError extends AgoError {\n constructor(\n message: string,\n public functionName: string,\n public originalError?: Error\n ) {\n super(message, \"function_error\");\n this.name = \"AgoFunctionError\";\n }\n}\n","/**\n * Debug logger for SDK\n */\nexport class Logger {\n constructor(private enabled: boolean = false) {}\n\n enable(): void {\n this.enabled = true;\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n log(...args: unknown[]): void {\n if (this.enabled) {\n console.log(\"[AGO SDK]\", ...args);\n }\n }\n\n warn(...args: unknown[]): void {\n if (this.enabled) {\n console.warn(\"[AGO SDK]\", ...args);\n }\n }\n\n error(...args: unknown[]): void {\n // Always log errors\n console.error(\"[AGO SDK]\", ...args);\n }\n\n debug(...args: unknown[]): void {\n if (this.enabled) {\n console.debug(\"[AGO SDK]\", ...args);\n }\n }\n}\n\nexport const logger = new Logger();\n","import { AgoApiError, AgoNetworkError, ApiErrorResponse } from \"../client/errors\";\nimport type { AgoConfig } from \"../client/types\";\nimport { logger } from \"../utils/logger\";\n\nconst WIDGET_ID_KEY = \"ago_widget_id\";\n\nfunction generateWidgetId(): string {\n // Try to reuse a previously generated ID from localStorage\n if (typeof localStorage !== \"undefined\") {\n const stored = localStorage.getItem(WIDGET_ID_KEY);\n if (stored) return stored;\n }\n\n const id = crypto.randomUUID();\n\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(WIDGET_ID_KEY, id);\n } catch {\n // localStorage may be unavailable (e.g., private browsing)\n }\n }\n\n return id;\n}\n\n/**\n * HTTP client with authentication headers\n */\nexport class HttpClient {\n private baseUrl: string;\n private headers: Record<string, string>;\n\n constructor(config: AgoConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.headers = {\n \"X-Widget-Id\": config.widgetId || generateWidgetId(),\n };\n\n if (config.userEmail) {\n this.headers[\"X-User-Email\"] = config.userEmail;\n }\n\n if (config.userJwt) {\n this.headers[\"Authorization\"] = `Bearer ${config.userJwt}`;\n }\n }\n\n /**\n * Update configuration (e.g., JWT token)\n */\n updateConfig(config: Partial<AgoConfig>): void {\n if (config.baseUrl) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n }\n if (config.widgetId) {\n this.headers[\"X-Widget-Id\"] = config.widgetId;\n }\n if (config.userEmail) {\n this.headers[\"X-User-Email\"] = config.userEmail;\n }\n if (config.userJwt) {\n this.headers[\"Authorization\"] = `Bearer ${config.userJwt}`;\n }\n }\n\n /**\n * Make a GET request\n */\n async get<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path);\n }\n\n /**\n * Make a POST request with JSON body\n */\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, body);\n }\n\n /**\n * Make a POST request and return the raw Response (for streaming)\n */\n async postStream(path: string, body?: unknown): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n logger.debug(\"POST (stream)\", url, body);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n ...this.headers,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n return response;\n } catch (error) {\n if (error instanceof AgoApiError) {\n throw error;\n }\n throw new AgoNetworkError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Make a POST request with FormData (for file uploads)\n */\n async postFormData(path: string, formData: FormData): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n logger.debug(\"POST (formData)\", url);\n\n // Don't set Content-Type for FormData - browser sets it with boundary\n const headers = { ...this.headers };\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n return response;\n } catch (error) {\n if (error instanceof AgoApiError) {\n throw error;\n }\n throw new AgoNetworkError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n logger.debug(method, url, body);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n ...this.headers,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n } catch (error) {\n if (error instanceof AgoApiError) {\n throw error;\n }\n throw new AgoNetworkError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorData: ApiErrorResponse | undefined;\n\n try {\n errorData = await response.json();\n } catch {\n // Response is not JSON\n }\n\n if (errorData?.error) {\n throw AgoApiError.fromResponse(errorData, response.status);\n }\n\n throw new AgoApiError(\n `HTTP ${response.status}: ${response.statusText}`,\n \"http_error\",\n response.status,\n \"api_error\"\n );\n }\n}\n","import { AgoFunctionError } from \"../client/errors\";\nimport { logger } from \"../utils/logger\";\nimport type {\n ClientFunctionDefinition,\n ClientFunctionHandler,\n ClientFunctionSchema,\n RegisteredFunction,\n} from \"./types\";\n\n/**\n * Registry for client-side functions that AGO can call\n */\nexport class FunctionRegistry {\n private functions: Map<string, RegisteredFunction> = new Map();\n\n /**\n * Register a function that AGO can call.\n * Accepts either a single definition object or (name, handler, schema) args.\n */\n register(definition: ClientFunctionDefinition): void;\n register(\n name: string,\n handler: ClientFunctionHandler,\n schema: Omit<ClientFunctionSchema, \"name\">\n ): void;\n register(\n nameOrDef: string | ClientFunctionDefinition,\n handler?: ClientFunctionHandler,\n schema?: Omit<ClientFunctionSchema, \"name\">\n ): void {\n if (typeof nameOrDef === \"object\") {\n const { name, handler: h, description, parameters } = nameOrDef;\n return this.register(name, h, { description, parameters });\n }\n\n const name = nameOrDef;\n if (!handler || !schema) {\n throw new Error(\"handler and schema are required\");\n }\n if (this.functions.has(name)) {\n logger.warn(`Function \"${name}\" is being overwritten`);\n }\n\n this.functions.set(name, {\n schema: { ...schema, name },\n handler,\n });\n\n logger.log(`Registered function: ${name}`);\n }\n\n /**\n * Unregister a function\n */\n unregister(name: string): boolean {\n const deleted = this.functions.delete(name);\n if (deleted) {\n logger.log(`Unregistered function: ${name}`);\n }\n return deleted;\n }\n\n /**\n * Get a registered function\n */\n get(name: string): RegisteredFunction | undefined {\n return this.functions.get(name);\n }\n\n /**\n * Check if a function is registered\n */\n has(name: string): boolean {\n return this.functions.has(name);\n }\n\n /**\n * Get all registered function schemas (for sending to backend)\n */\n getSchemas(): ClientFunctionSchema[] {\n return Array.from(this.functions.values()).map((f) => f.schema);\n }\n\n /**\n * Execute a registered function\n */\n async execute(\n name: string,\n args: Record<string, unknown>\n ): Promise<unknown> {\n const registration = this.functions.get(name);\n\n if (!registration) {\n throw new AgoFunctionError(\n `Function \"${name}\" is not registered`,\n name\n );\n }\n\n logger.log(`Executing function: ${name}`, args);\n\n try {\n const result = await registration.handler(args);\n logger.log(`Function ${name} completed:`, result);\n return result;\n } catch (error) {\n logger.error(`Function ${name} failed:`, error);\n throw new AgoFunctionError(\n `Function \"${name}\" execution failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n name,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Clear all registered functions\n */\n clear(): void {\n this.functions.clear();\n logger.log(\"Cleared all registered functions\");\n }\n\n /**\n * Get the number of registered functions\n */\n get size(): number {\n return this.functions.size;\n }\n}\n","import type {\n AgoMessage,\n AgoSource,\n ToolCallData,\n SSEChunkData,\n} from \"../client/types\";\nimport { AgoStreamError } from \"../client/errors\";\nimport { logger } from \"../utils/logger\";\n\nexport interface SSEHandlerCallbacks {\n onStart?: (data: { conversationId: string; messageId: string }) => void;\n onChunk?: (data: { content: string; conversationId: string; messageId: string }) => void;\n onToolCall?: (toolCall: ToolCallData) => void;\n onClientFunction?: (data: {\n invocationId: string;\n functionName: string;\n arguments: Record<string, unknown>;\n conversationId: string;\n }) => void;\n onComplete?: (message: AgoMessage) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Handles SSE streaming responses from AGO backend\n */\nexport class SSEHandler {\n private buffer = \"\";\n private message: Partial<AgoMessage> = {};\n private toolCalls: ToolCallData[] = [];\n private sources: AgoSource[] = [];\n private followUpReplies: string[] = [];\n private isFirstChunk = true;\n\n constructor(private callbacks: SSEHandlerCallbacks) {}\n\n /**\n * Process a streaming response\n */\n async processStream(response: Response): Promise<AgoMessage> {\n if (!response.body) {\n throw new AgoStreamError(\"Response has no body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const text = decoder.decode(value, { stream: true });\n this.buffer += text;\n this.processBuffer();\n }\n\n // Process any remaining data\n if (this.buffer.trim()) {\n this.processBuffer();\n }\n\n return this.buildFinalMessage();\n } catch (error) {\n const streamError =\n error instanceof Error ? error : new AgoStreamError(\"Stream processing failed\");\n this.callbacks.onError?.(streamError);\n throw streamError;\n } finally {\n reader.releaseLock();\n }\n }\n\n private processBuffer(): void {\n // SSE messages are separated by double newlines\n const parts = this.buffer.split(\"\\n\\n\");\n\n // Keep the last part (might be incomplete)\n this.buffer = parts.pop() || \"\";\n\n for (const part of parts) {\n if (!part.trim()) continue;\n\n // Handle SSE format: \"data: {...}\" or \": heartbeat\"\n const lines = part.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\": \")) {\n // Comment/heartbeat, ignore\n continue;\n }\n\n if (line.startsWith(\"data: \")) {\n const jsonStr = line.slice(6);\n try {\n const data = JSON.parse(jsonStr) as SSEChunkData;\n this.handleChunk(data);\n } catch (error) {\n logger.warn(\"Failed to parse SSE data:\", jsonStr, error);\n }\n }\n }\n }\n }\n\n private handleChunk(data: SSEChunkData): void {\n // Handle message ID and conversation ID\n if (data.message_id && !this.message.id) {\n this.message.id = data.message_id;\n }\n\n if (data.thread?.id) {\n this.message.conversationId = data.thread.id;\n\n // Emit start event on first chunk with IDs\n if (this.isFirstChunk && this.message.id) {\n this.isFirstChunk = false;\n this.callbacks.onStart?.({\n conversationId: this.message.conversationId,\n messageId: this.message.id,\n });\n }\n }\n\n // Handle content\n if (data.content !== undefined) {\n this.message.content = (this.message.content || \"\") + data.content;\n if (this.message.conversationId && this.message.id) {\n this.callbacks.onChunk?.({\n content: data.content,\n conversationId: this.message.conversationId,\n messageId: this.message.id,\n });\n }\n }\n\n // Handle full content replacement\n if (data.full_content !== undefined) {\n this.message.content = data.full_content;\n }\n\n // Handle status\n if (data.status) {\n this.message.status = data.status;\n }\n\n // Handle agent\n if (data.agent) {\n this.message.agent = {\n id: data.agent.id,\n name: data.agent.name,\n displayName: data.agent.display_name,\n };\n }\n\n // Handle knowledge sources\n if (data.knowledge_sources) {\n this.sources = data.knowledge_sources.map((s) => {\n const doc = s.knowledge_document;\n return {\n id: doc.id,\n title: doc.title,\n url: doc.use_external_link ? doc.external_link_url : doc.internal_link_url,\n };\n });\n }\n\n // Client-side function invocation — fires from either the tool_call_data UI\n // event or the raw state dict streamed by the backend (which has no\n // tool_call_data flag). Either form is enough to run the registered handler.\n if (data.type === \"client_function\" && data.function_name) {\n this.callbacks.onClientFunction?.({\n invocationId: data.id || \"\",\n functionName: data.function_name,\n arguments: data.arguments || {},\n conversationId: this.message.conversationId || \"\",\n });\n }\n\n // Handle standard tool call UI events\n if (data.tool_call_data && data.type && data.type !== \"client_function\") {\n const toolCall = this.parseToolCall(data);\n this.callbacks.onToolCall?.(toolCall);\n\n const existingIndex = this.toolCalls.findIndex((t) => t.id === toolCall.id);\n if (existingIndex >= 0) {\n this.toolCalls[existingIndex] = toolCall;\n } else {\n this.toolCalls.push(toolCall);\n }\n }\n\n // Handle follow-up replies\n if (data.follow_up_replies) {\n this.followUpReplies = data.follow_up_replies;\n }\n }\n\n private parseToolCall(data: SSEChunkData): ToolCallData {\n return {\n id: data.id || \"\",\n type: (data.type as ToolCallData[\"type\"]) || \"status_message\",\n status: data.status || \"unknown\",\n toolName: data.tool_name || \"\",\n toolDisplayName: data.tool_display_name,\n message: data.message,\n formSchema: data.form_schema,\n data: data.data,\n functionName: data.function_name,\n arguments: data.arguments,\n };\n }\n\n private buildFinalMessage(): AgoMessage {\n const message: AgoMessage = {\n id: this.message.id || \"\",\n conversationId: this.message.conversationId || \"\",\n content: this.message.content || \"\",\n role: \"assistant\",\n status: this.message.status || \"DONE\",\n agent: this.message.agent,\n sources: this.sources.length > 0 ? this.sources : undefined,\n toolCalls: this.toolCalls.length > 0 ? this.toolCalls : undefined,\n followUpReplies:\n this.followUpReplies.length > 0 ? this.followUpReplies : undefined,\n createdAt: new Date(),\n };\n\n this.callbacks.onComplete?.(message);\n return message;\n }\n}\n\n/**\n * Check if an error is a network error that should trigger polling fallback\n */\nexport function isStreamNetworkError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"load failed\") ||\n message.includes(\"failed to fetch\") ||\n message.includes(\"network\") ||\n message.includes(\"abort\")\n );\n}\n","type EventHandler<T = unknown> = (data: T) => void;\n\n/**\n * Simple typed event emitter\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter<Events extends Record<string, any> = Record<string, unknown>> {\n private handlers: Map<keyof Events, Set<EventHandler<unknown>>> = new Map();\n\n on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as EventHandler<unknown>);\n }\n\n off<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>\n ): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.delete(handler as EventHandler<unknown>);\n }\n }\n\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in event handler for ${String(event)}:`, error);\n }\n });\n }\n }\n\n /**\n * Subscribe to an event and auto-unsubscribe after the first call.\n */\n once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): void {\n const wrapper = ((data: Events[K]) => {\n this.off(event, wrapper as EventHandler<Events[K]>);\n handler(data);\n }) as EventHandler<Events[K]>;\n this.on(event, wrapper);\n }\n\n /**\n * Returns a Promise that resolves the next time `event` fires.\n * Rejects if `timeout` (ms) is reached first.\n */\n waitFor<K extends keyof Events>(\n event: K,\n options?: { timeout?: number }\n ): Promise<Events[K]> {\n return new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const handler = ((data: Events[K]) => {\n if (timer) clearTimeout(timer);\n resolve(data);\n }) as EventHandler<Events[K]>;\n\n this.once(event, handler);\n\n if (options?.timeout) {\n timer = setTimeout(() => {\n this.off(event, handler);\n reject(new Error(`waitFor(\"${String(event)}\") timed out after ${options.timeout}ms`));\n }, options.timeout);\n }\n });\n }\n\n removeAllListeners(event?: keyof Events): void {\n if (event) {\n this.handlers.delete(event);\n } else {\n this.handlers.clear();\n }\n }\n}\n","import { HttpClient } from \"../api/HttpClient\";\nimport { FunctionRegistry } from \"../functions/FunctionRegistry\";\nimport type { ClientFunctionDefinition, ClientFunctionHandler, ClientFunctionSchema } from \"../functions/types\";\nimport { SSEHandler } from \"../streaming/SSEHandler\";\nimport { EventEmitter } from \"../utils/eventEmitter\";\nimport { logger } from \"../utils/logger\";\nimport type {\n AgoConfig,\n AgoClientEvents,\n AgoEventName,\n AgoEventHandler,\n AgoMessage,\n Conversation,\n SendMessageOptions,\n} from \"./types\";\n\n/**\n * Main SDK client for AGO Chat integration\n */\nexport class AgoClient {\n private httpClient: HttpClient;\n private functionRegistry: FunctionRegistry;\n private eventEmitter: EventEmitter<AgoClientEvents>;\n private config: AgoConfig;\n\n constructor(config: AgoConfig) {\n this.config = config;\n this.httpClient = new HttpClient(config);\n this.functionRegistry = new FunctionRegistry();\n this.eventEmitter = new EventEmitter();\n\n if (config.debug) {\n logger.enable();\n }\n\n logger.log(\"AgoClient initialized\");\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Messaging\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Send a message and receive a streaming response\n */\n async sendMessage(\n content: string,\n options?: SendMessageOptions\n ): Promise<AgoMessage> {\n const clientFunctions = this.functionRegistry.getSchemas();\n\n const body: Record<string, unknown> = {\n content,\n conversation_id: options?.conversationId,\n agent_id: options?.agentId || this.config.defaultAgentId,\n };\n\n // Include client functions if any are registered\n if (clientFunctions.length > 0) {\n body.client_functions = clientFunctions;\n }\n\n let response: Response;\n\n if (options?.files && options.files.length > 0) {\n // Use FormData for file uploads\n const formData = new FormData();\n formData.append(\"content\", content);\n\n if (options.conversationId) {\n formData.append(\"conversation_id\", options.conversationId);\n }\n\n if (options.agentId || this.config.defaultAgentId) {\n formData.append(\"agent_id\", options.agentId || this.config.defaultAgentId || \"\");\n }\n\n if (clientFunctions.length > 0) {\n formData.append(\"client_functions\", JSON.stringify(clientFunctions));\n }\n\n for (const file of options.files) {\n formData.append(\"files\", file);\n }\n\n response = await this.httpClient.postFormData(\"/api/sdk/v1/messages\", formData);\n } else {\n response = await this.httpClient.postStream(\"/api/sdk/v1/messages\", body);\n }\n\n return this.processSSEResponse(response);\n }\n\n private async processSSEResponse(response: Response): Promise<AgoMessage> {\n const handler = new SSEHandler({\n onStart: (data) => {\n this.eventEmitter.emit(\"message:start\", data);\n },\n onChunk: (data) => {\n this.eventEmitter.emit(\"message:chunk\", data);\n },\n onToolCall: (toolCall) => {\n this.eventEmitter.emit(\"toolCall:received\", toolCall);\n\n if (toolCall.type === \"form\") {\n this.eventEmitter.emit(\"toolCall:form\", toolCall);\n }\n },\n onClientFunction: async (data) => {\n this.eventEmitter.emit(\"function:invoke\", data);\n await this.handleClientFunctionInvocation(data);\n },\n onComplete: (message) => {\n this.eventEmitter.emit(\"message:complete\", message);\n },\n onError: (error) => {\n this.eventEmitter.emit(\"message:error\", { error: error.message });\n },\n });\n\n return handler.processStream(response);\n }\n\n private async handleClientFunctionInvocation(data: {\n invocationId: string;\n functionName: string;\n arguments: Record<string, unknown>;\n conversationId: string;\n }): Promise<void> {\n let result: unknown;\n let error: string | undefined;\n\n try {\n result = await this.functionRegistry.execute(data.functionName, data.arguments);\n } catch (err) {\n error = err instanceof Error ? err.message : \"Unknown error\";\n logger.error(\"Client function execution failed:\", err);\n }\n\n // Submit result back to backend using existing tool-call submit endpoint.\n // The raw state SSE event carries no invocationId — in that flow the backend\n // already continued with a placeholder, so we just emit the local event.\n if (data.invocationId) {\n try {\n await this.submitToolCallForm(data.invocationId, {\n result,\n error,\n _type: \"client_function_result\",\n });\n } catch (submitError) {\n logger.error(\"Failed to submit function result:\", submitError);\n }\n }\n\n this.eventEmitter.emit(\"function:result\", {\n invocationId: data.invocationId,\n result,\n error,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Conversations\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Get list of conversations\n */\n async getConversations(): Promise<Conversation[]> {\n const response = await this.httpClient.get<{\n count: number;\n items: Array<{\n id: string;\n title: string;\n last_message_date: string;\n }>;\n }>(\"/api/sdk/v1/conversations\");\n\n return response.items.map((item) => ({\n id: item.id,\n title: item.title,\n lastMessageDate: new Date(item.last_message_date),\n }));\n }\n\n /**\n * Get a specific conversation with messages\n */\n async getConversation(conversationId: string): Promise<Conversation> {\n const response = await this.httpClient.get<{\n id: string;\n title: string;\n last_message_date: string;\n messages: Array<{\n id: string;\n content: string;\n role: \"user\" | \"assistant\";\n status: string;\n created_at: string;\n }>;\n }>(`/api/sdk/v1/conversations/${conversationId}`);\n\n return {\n id: response.id,\n title: response.title,\n lastMessageDate: new Date(response.last_message_date),\n messages: response.messages.map((m) => ({\n id: m.id,\n conversationId: response.id,\n content: m.content,\n role: m.role,\n status: m.status as AgoMessage[\"status\"],\n createdAt: new Date(m.created_at),\n })),\n };\n }\n\n /**\n * Get messages for a conversation\n */\n async getMessages(conversationId: string): Promise<AgoMessage[]> {\n const conversation = await this.getConversation(conversationId);\n return conversation.messages || [];\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Tool Calls\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Submit form data for a tool call\n */\n async submitToolCallForm(\n toolCallId: string,\n formData: Record<string, unknown>\n ): Promise<void> {\n await this.httpClient.post(`/api/tool-calls/${toolCallId}/submit/`, {\n formData,\n });\n }\n\n /**\n * Confirm a tool call\n */\n async confirmToolCall(toolCallId: string): Promise<void> {\n await this.httpClient.post(`/api/tool-calls/${toolCallId}/confirm/`);\n }\n\n /**\n * Reject a tool call\n */\n async rejectToolCall(toolCallId: string): Promise<void> {\n await this.httpClient.post(`/api/tool-calls/${toolCallId}/reject/`);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Feedback\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Submit feedback for a message\n */\n async submitFeedback(\n messageId: string,\n rating: \"positive\" | \"negative\"\n ): Promise<void> {\n await this.httpClient.post(`/api/sdk/v1/messages/${messageId}/feedback`, {\n rating,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Client-side Functions\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Register a client-side function that AGO can call.\n * Accepts either a definition object or (name, handler, schema) args.\n *\n * ```ts\n * // Single-object (preferred)\n * client.registerFunction({\n * name: \"lookupOrder\",\n * description: \"Look up an order\",\n * parameters: { type: \"object\", properties: { id: { type: \"string\" } } },\n * handler: async (args) => fetchOrder(args.id),\n * });\n *\n * // Classic 3-arg form\n * client.registerFunction(\"lookupOrder\", handler, schema);\n * ```\n */\n registerFunction(definition: ClientFunctionDefinition): void;\n registerFunction(\n name: string,\n handler: ClientFunctionHandler,\n schema: Omit<ClientFunctionSchema, \"name\">\n ): void;\n registerFunction(\n nameOrDef: string | ClientFunctionDefinition,\n handler?: ClientFunctionHandler,\n schema?: Omit<ClientFunctionSchema, \"name\">\n ): void {\n if (typeof nameOrDef === \"object\") {\n this.functionRegistry.register(nameOrDef);\n } else {\n this.functionRegistry.register(nameOrDef, handler!, schema!);\n }\n }\n\n /**\n * Unregister a client-side function\n */\n unregisterFunction(name: string): boolean {\n return this.functionRegistry.unregister(name);\n }\n\n /**\n * Get all registered function schemas\n */\n getRegisteredFunctions(): ClientFunctionSchema[] {\n return this.functionRegistry.getSchemas();\n }\n\n /**\n * Register a navigation function that lets AGO navigate users to different pages.\n * @param navigate - A callback that performs the navigation (e.g. react-router's navigate)\n * @param routes - Map of route names to paths, with descriptions for the LLM\n */\n registerNavigationFunction(\n navigate: (path: string) => void,\n routes: Array<{ name: string; path: string; description: string }>\n ): void {\n const routeNames = routes.map((r) => r.name);\n const routeDescriptions = routes\n .map((r) => `- \"${r.name}\": ${r.description}`)\n .join(\"\\n\");\n\n this.registerFunction(\n \"navigateToPage\",\n async (args) => {\n const pageName = args.page as string;\n const route = routes.find((r) => r.name === pageName);\n if (!route) {\n return { success: false, error: `Unknown page: ${pageName}` };\n }\n navigate(route.path);\n return { success: true, navigatedTo: route.path };\n },\n {\n description: `Navigate the user to a page in the application. Available pages:\\n${routeDescriptions}`,\n parameters: {\n type: \"object\",\n properties: {\n page: {\n type: \"string\",\n description: \"The page to navigate to\",\n enum: routeNames,\n },\n },\n required: [\"page\"],\n },\n }\n );\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Events\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to an event\n */\n on<K extends AgoEventName>(event: K, handler: AgoEventHandler<K>): void {\n this.eventEmitter.on(event, handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends AgoEventName>(event: K, handler: AgoEventHandler<K>): void {\n this.eventEmitter.off(event, handler);\n }\n\n /**\n * Subscribe to an event once — auto-unsubscribes after the first call.\n */\n once<K extends AgoEventName>(event: K, handler: AgoEventHandler<K>): void {\n this.eventEmitter.once(event, handler);\n }\n\n /**\n * Returns a Promise that resolves the next time `event` fires.\n *\n * ```ts\n * const msg = await client.waitFor(\"message:complete\", { timeout: 10000 });\n * ```\n */\n waitFor<K extends AgoEventName>(\n event: K,\n options?: { timeout?: number }\n ): Promise<AgoClientEvents[K]> {\n return this.eventEmitter.waitFor(event, options);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Configuration\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Update client configuration\n */\n updateConfig(config: Partial<AgoConfig>): void {\n this.config = { ...this.config, ...config };\n this.httpClient.updateConfig(config);\n\n if (config.debug !== undefined) {\n config.debug ? logger.enable() : logger.disable();\n }\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n this.eventEmitter.removeAllListeners();\n this.functionRegistry.clear();\n logger.log(\"AgoClient destroyed\");\n }\n}\n"],"names":["name"],"mappings":"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"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
function createMockClient(options = {}) {
|
|
2
|
-
const { overrides = {} } = options;
|
|
3
|
-
const noopMessage = {
|
|
4
|
-
id: "mock-msg-1",
|
|
5
|
-
conversationId: "mock-conv-1",
|
|
6
|
-
content: "Mock response",
|
|
7
|
-
role: "assistant",
|
|
8
|
-
status: "DONE",
|
|
9
|
-
createdAt: /* @__PURE__ */ new Date()
|
|
10
|
-
};
|
|
11
|
-
const noopConversation = {
|
|
12
|
-
id: "mock-conv-1",
|
|
13
|
-
title: "Mock Conversation",
|
|
14
|
-
lastMessageDate: /* @__PURE__ */ new Date()
|
|
15
|
-
};
|
|
16
|
-
const listeners = /* @__PURE__ */ new Map();
|
|
17
|
-
const calls = [];
|
|
18
|
-
const defaults = {
|
|
19
|
-
sendMessage: async () => noopMessage,
|
|
20
|
-
getConversations: async () => [noopConversation],
|
|
21
|
-
getConversation: async () => noopConversation,
|
|
22
|
-
getMessages: async () => [noopMessage],
|
|
23
|
-
submitToolCallForm: async () => void 0,
|
|
24
|
-
confirmToolCall: async () => void 0,
|
|
25
|
-
rejectToolCall: async () => void 0,
|
|
26
|
-
submitFeedback: async () => void 0,
|
|
27
|
-
registerFunction: () => void 0,
|
|
28
|
-
unregisterFunction: () => true,
|
|
29
|
-
getRegisteredFunctions: () => [],
|
|
30
|
-
registerNavigationFunction: () => void 0,
|
|
31
|
-
on: (event, handler) => {
|
|
32
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
33
|
-
listeners.get(event).add(handler);
|
|
34
|
-
},
|
|
35
|
-
off: (event, handler) => {
|
|
36
|
-
var _a;
|
|
37
|
-
(_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
|
|
38
|
-
},
|
|
39
|
-
once: (event, handler) => {
|
|
40
|
-
const wrapper = (...args) => {
|
|
41
|
-
var _a;
|
|
42
|
-
(_a = listeners.get(event)) == null ? void 0 : _a.delete(wrapper);
|
|
43
|
-
handler(...args);
|
|
44
|
-
};
|
|
45
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
46
|
-
listeners.get(event).add(wrapper);
|
|
47
|
-
},
|
|
48
|
-
waitFor: (event, options2) => {
|
|
49
|
-
return new Promise((resolve, reject) => {
|
|
50
|
-
let timer;
|
|
51
|
-
const handler = (data) => {
|
|
52
|
-
var _a;
|
|
53
|
-
if (timer) clearTimeout(timer);
|
|
54
|
-
(_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
|
|
55
|
-
resolve(data);
|
|
56
|
-
};
|
|
57
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
58
|
-
listeners.get(event).add(handler);
|
|
59
|
-
if (options2 == null ? void 0 : options2.timeout) {
|
|
60
|
-
timer = setTimeout(() => {
|
|
61
|
-
var _a;
|
|
62
|
-
(_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
|
|
63
|
-
reject(new Error(`waitFor("${event}") timed out after ${options2.timeout}ms`));
|
|
64
|
-
}, options2.timeout);
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
},
|
|
68
|
-
updateConfig: () => void 0,
|
|
69
|
-
destroy: () => {
|
|
70
|
-
listeners.clear();
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
const merged = { ...defaults, ...overrides };
|
|
74
|
-
const mock = {};
|
|
75
|
-
for (const [key, fn] of Object.entries(merged)) {
|
|
76
|
-
mock[key] = (...args) => {
|
|
77
|
-
calls.push({ method: key, args });
|
|
78
|
-
return fn(...args);
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
mock.__calls = calls;
|
|
82
|
-
mock.__callsFor = (method) => calls.filter((c) => c.method === method);
|
|
83
|
-
mock.__emitEvent = (event, data) => {
|
|
84
|
-
const handlers = listeners.get(event);
|
|
85
|
-
if (handlers) {
|
|
86
|
-
[...handlers].forEach((h) => h(data));
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
return mock;
|
|
90
|
-
}
|
|
91
|
-
export {
|
|
92
|
-
createMockClient as c
|
|
93
|
-
};
|
|
94
|
-
//# sourceMappingURL=createMockClient-B1DcBiIK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createMockClient-B1DcBiIK.js","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"],"names":["options"],"mappings":"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"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
function createMockClient(options = {}) {
|
|
3
|
-
const { overrides = {} } = options;
|
|
4
|
-
const noopMessage = {
|
|
5
|
-
id: "mock-msg-1",
|
|
6
|
-
conversationId: "mock-conv-1",
|
|
7
|
-
content: "Mock response",
|
|
8
|
-
role: "assistant",
|
|
9
|
-
status: "DONE",
|
|
10
|
-
createdAt: /* @__PURE__ */ new Date()
|
|
11
|
-
};
|
|
12
|
-
const noopConversation = {
|
|
13
|
-
id: "mock-conv-1",
|
|
14
|
-
title: "Mock Conversation",
|
|
15
|
-
lastMessageDate: /* @__PURE__ */ new Date()
|
|
16
|
-
};
|
|
17
|
-
const listeners = /* @__PURE__ */ new Map();
|
|
18
|
-
const calls = [];
|
|
19
|
-
const defaults = {
|
|
20
|
-
sendMessage: async () => noopMessage,
|
|
21
|
-
getConversations: async () => [noopConversation],
|
|
22
|
-
getConversation: async () => noopConversation,
|
|
23
|
-
getMessages: async () => [noopMessage],
|
|
24
|
-
submitToolCallForm: async () => void 0,
|
|
25
|
-
confirmToolCall: async () => void 0,
|
|
26
|
-
rejectToolCall: async () => void 0,
|
|
27
|
-
submitFeedback: async () => void 0,
|
|
28
|
-
registerFunction: () => void 0,
|
|
29
|
-
unregisterFunction: () => true,
|
|
30
|
-
getRegisteredFunctions: () => [],
|
|
31
|
-
registerNavigationFunction: () => void 0,
|
|
32
|
-
on: (event, handler) => {
|
|
33
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
34
|
-
listeners.get(event).add(handler);
|
|
35
|
-
},
|
|
36
|
-
off: (event, handler) => {
|
|
37
|
-
var _a;
|
|
38
|
-
(_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
|
|
39
|
-
},
|
|
40
|
-
once: (event, handler) => {
|
|
41
|
-
const wrapper = (...args) => {
|
|
42
|
-
var _a;
|
|
43
|
-
(_a = listeners.get(event)) == null ? void 0 : _a.delete(wrapper);
|
|
44
|
-
handler(...args);
|
|
45
|
-
};
|
|
46
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
47
|
-
listeners.get(event).add(wrapper);
|
|
48
|
-
},
|
|
49
|
-
waitFor: (event, options2) => {
|
|
50
|
-
return new Promise((resolve, reject) => {
|
|
51
|
-
let timer;
|
|
52
|
-
const handler = (data) => {
|
|
53
|
-
var _a;
|
|
54
|
-
if (timer) clearTimeout(timer);
|
|
55
|
-
(_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
|
|
56
|
-
resolve(data);
|
|
57
|
-
};
|
|
58
|
-
if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
|
|
59
|
-
listeners.get(event).add(handler);
|
|
60
|
-
if (options2 == null ? void 0 : options2.timeout) {
|
|
61
|
-
timer = setTimeout(() => {
|
|
62
|
-
var _a;
|
|
63
|
-
(_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
|
|
64
|
-
reject(new Error(`waitFor("${event}") timed out after ${options2.timeout}ms`));
|
|
65
|
-
}, options2.timeout);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
},
|
|
69
|
-
updateConfig: () => void 0,
|
|
70
|
-
destroy: () => {
|
|
71
|
-
listeners.clear();
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
const merged = { ...defaults, ...overrides };
|
|
75
|
-
const mock = {};
|
|
76
|
-
for (const [key, fn] of Object.entries(merged)) {
|
|
77
|
-
mock[key] = (...args) => {
|
|
78
|
-
calls.push({ method: key, args });
|
|
79
|
-
return fn(...args);
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
mock.__calls = calls;
|
|
83
|
-
mock.__callsFor = (method) => calls.filter((c) => c.method === method);
|
|
84
|
-
mock.__emitEvent = (event, data) => {
|
|
85
|
-
const handlers = listeners.get(event);
|
|
86
|
-
if (handlers) {
|
|
87
|
-
[...handlers].forEach((h) => h(data));
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
return mock;
|
|
91
|
-
}
|
|
92
|
-
exports.createMockClient = createMockClient;
|
|
93
|
-
//# sourceMappingURL=createMockClient-BqNSJUu4.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createMockClient-BqNSJUu4.cjs","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"],"names":["options"],"mappings":"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"}
|
package/dist/helpers.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.cjs","sources":["../src/helpers/functions.ts"],"sourcesContent":["import type { ClientFunctionDefinition } from \"../functions/types\";\n\n/**\n * Show a toast/notification to the user.\n * The handler is a no-op by default — wire it up to your toast library.\n *\n * ```ts\n * import { showToast } from \"@useago/sdk/helpers\";\n * showToast.handler = async (args) => { myToast(args.message); return { shown: true }; };\n * client.registerFunction(showToast);\n * ```\n */\nexport const showToast: ClientFunctionDefinition = {\n name: \"showToast\",\n description:\n \"Show a toast notification to the user. Use this to confirm actions or display brief messages.\",\n parameters: {\n type: \"object\",\n properties: {\n message: { type: \"string\", description: \"The message to display\" },\n type: {\n type: \"string\",\n description: \"Toast type\",\n enum: [\"success\", \"error\", \"warning\", \"info\"],\n },\n duration: {\n type: \"number\",\n description: \"Duration in milliseconds (default 3000)\",\n },\n },\n required: [\"message\"],\n },\n handler: async () => ({ shown: false, error: \"No toast handler configured\" }),\n};\n\n/**\n * Show a browser notification (requires permission).\n */\nexport const showNotification: ClientFunctionDefinition = {\n name: \"showNotification\",\n description:\n \"Show a browser notification to the user. Useful for important alerts even when the tab is not focused.\",\n parameters: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Notification title\" },\n body: { type: \"string\", description: \"Notification body text\" },\n },\n required: [\"title\"],\n },\n handler: async (args) => {\n if (typeof Notification === \"undefined\") {\n return { shown: false, error: \"Notifications not supported\" };\n }\n if (Notification.permission === \"denied\") {\n return { shown: false, error: \"Notification permission denied\" };\n }\n if (Notification.permission !== \"granted\") {\n await Notification.requestPermission();\n }\n if (Notification.permission === \"granted\") {\n new Notification(args.title as string, { body: args.body as string });\n return { shown: true };\n }\n return { shown: false, error: \"Permission not granted\" };\n },\n};\n\n/**\n * Open a URL in a new tab.\n */\nexport const openUrl: ClientFunctionDefinition = {\n name: \"openUrl\",\n description: \"Open a URL in a new browser tab.\",\n parameters: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"The URL to open\" },\n },\n required: [\"url\"],\n },\n handler: async (args) => {\n window.open(args.url as string, \"_blank\", \"noopener,noreferrer\");\n return { opened: true };\n },\n};\n\n/**\n * Copy text to clipboard.\n */\nexport const copyToClipboard: ClientFunctionDefinition = {\n name: \"copyToClipboard\",\n description: \"Copy text to the user's clipboard.\",\n parameters: {\n type: \"object\",\n properties: {\n text: { type: \"string\", description: \"The text to copy\" },\n },\n required: [\"text\"],\n },\n handler: async (args) => {\n await navigator.clipboard.writeText(args.text as string);\n return { copied: true };\n },\n};\n\n/**\n * Set the application theme (light/dark/system).\n * Default handler toggles a `data-theme` attribute on `<html>`.\n */\nexport const setTheme: ClientFunctionDefinition = {\n name: \"setTheme\",\n description:\n \"Change the application's color theme. Sets a data-theme attribute on the document element.\",\n parameters: {\n type: \"object\",\n properties: {\n theme: {\n type: \"string\",\n description: \"Theme to apply\",\n enum: [\"light\", \"dark\", \"system\"],\n },\n },\n required: [\"theme\"],\n },\n handler: async (args) => {\n const theme = args.theme as string;\n document.documentElement.setAttribute(\"data-theme\", theme);\n if (theme === \"dark\") {\n document.documentElement.classList.add(\"dark\");\n } else {\n document.documentElement.classList.remove(\"dark\");\n }\n return { theme, applied: true };\n },\n};\n\n/**\n * Show a confirm dialog and return the user's choice.\n */\nexport const showConfirmDialog: ClientFunctionDefinition = {\n name: \"showConfirmDialog\",\n description:\n \"Show a confirmation dialog to the user and return their choice (true/false).\",\n parameters: {\n type: \"object\",\n properties: {\n message: {\n type: \"string\",\n description: \"The confirmation message to display\",\n },\n },\n required: [\"message\"],\n },\n handler: async (args) => {\n const confirmed = window.confirm(args.message as string);\n return { confirmed };\n },\n};\n\n/**\n * Get the user's geolocation.\n */\nexport const getUserLocation: ClientFunctionDefinition = {\n name: \"getUserLocation\",\n description:\n \"Get the user's current geographic location (requires permission).\",\n parameters: {\n type: \"object\",\n properties: {},\n },\n handler: async () => {\n if (!navigator.geolocation) {\n return { error: \"Geolocation not supported\" };\n }\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (pos) =>\n resolve({\n latitude: pos.coords.latitude,\n longitude: pos.coords.longitude,\n accuracy: pos.coords.accuracy,\n }),\n (err) => resolve({ error: err.message })\n );\n });\n },\n};\n\n/**\n * Scroll to an element on the page.\n */\nexport const scrollToElement: ClientFunctionDefinition = {\n name: \"scrollToElement\",\n description: \"Scroll the page to a specific element identified by CSS selector.\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the element to scroll to (e.g. '#section-pricing')\",\n },\n behavior: {\n type: \"string\",\n description: \"Scroll behavior\",\n enum: [\"smooth\", \"instant\"],\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const el = document.querySelector(args.selector as string);\n if (!el) {\n return { scrolled: false, error: `Element not found: ${args.selector}` };\n }\n el.scrollIntoView({ behavior: (args.behavior as ScrollBehavior) || \"smooth\" });\n return { scrolled: true };\n },\n};\n\n/**\n * Set a value in localStorage.\n */\nexport const setLocalStorage: ClientFunctionDefinition = {\n name: \"setLocalStorage\",\n description: \"Store a value in the browser's localStorage.\",\n parameters: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Storage key\" },\n value: { type: \"string\", description: \"Value to store\" },\n },\n required: [\"key\", \"value\"],\n },\n handler: async (args) => {\n localStorage.setItem(args.key as string, args.value as string);\n return { stored: true };\n },\n};\n\n/**\n * Get a value from localStorage.\n */\nexport const getLocalStorage: ClientFunctionDefinition = {\n name: \"getLocalStorage\",\n description: \"Retrieve a value from the browser's localStorage.\",\n parameters: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Storage key\" },\n },\n required: [\"key\"],\n },\n handler: async (args) => {\n const value = localStorage.getItem(args.key as string);\n return { key: args.key, value, found: value !== null };\n },\n};\n\n/**\n * Highlight an element on the page (useful for guided tours).\n */\nexport const highlightElement: ClientFunctionDefinition = {\n name: \"highlightElement\",\n description:\n \"Highlight a DOM element to draw the user's attention (e.g. for onboarding).\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the element to highlight\",\n },\n color: {\n type: \"string\",\n description: \"Highlight border color (default: #3b82f6)\",\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const el = document.querySelector(args.selector as string) as HTMLElement | null;\n if (!el) {\n return { highlighted: false, error: `Element not found: ${args.selector}` };\n }\n const prev = el.style.outline;\n const color = (args.color as string) || \"#3b82f6\";\n el.style.outline = `3px solid ${color}`;\n el.style.outlineOffset = \"2px\";\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n setTimeout(() => {\n el.style.outline = prev;\n el.style.outlineOffset = \"\";\n }, 3000);\n return { highlighted: true };\n },\n};\n\n/**\n * Submit a form on the page programmatically.\n */\nexport const submitForm: ClientFunctionDefinition = {\n name: \"submitForm\",\n description:\n \"Fill and submit an HTML form on the page. Pass field values as key-value pairs.\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the form element\",\n },\n values: {\n type: \"string\",\n description: \"JSON string of field name → value pairs\",\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const form = document.querySelector(args.selector as string) as HTMLFormElement | null;\n if (!form) {\n return { submitted: false, error: `Form not found: ${args.selector}` };\n }\n if (args.values) {\n const values = JSON.parse(args.values as string) as Record<string, string>;\n for (const [name, value] of Object.entries(values)) {\n const input = form.elements.namedItem(name) as HTMLInputElement | null;\n if (input) input.value = value;\n }\n }\n form.requestSubmit();\n return { submitted: true };\n },\n};\n\n/**\n * Track a custom analytics event.\n * Default handler logs to console — replace with your analytics provider.\n */\nexport const trackEvent: ClientFunctionDefinition = {\n name: \"trackEvent\",\n description:\n \"Track a custom analytics event. Override the handler to wire up your analytics provider.\",\n parameters: {\n type: \"object\",\n properties: {\n event: { type: \"string\", description: \"Event name\" },\n properties: {\n type: \"string\",\n description: \"JSON string of event properties\",\n },\n },\n required: [\"event\"],\n },\n handler: async (args) => {\n const props = args.properties ? JSON.parse(args.properties as string) : {};\n console.log(`[AGO Analytics] ${args.event}`, props);\n return { tracked: true, event: args.event };\n },\n};\n"],"names":[],"mappings":";;AAYO,MAAM,YAAsC;AAAA,EACjD,MAAM;AAAA,EACN,aACE;AAAA,EACF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS,EAAE,MAAM,UAAU,aAAa,yBAAA;AAAA,MACxC,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,CAAC,WAAW,SAAS,WAAW,MAAM;AAAA,MAAA;AAAA,MAE9C,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,IAEF,UAAU,CAAC,SAAS;AAAA,EAAA;AAAA,EAEtB,SAAS,aAAa,EAAE,OAAO,OAAO,OAAO,8BAAA;AAC/C;AAKO,MAAM,mBAA6C;AAAA,EACxD,MAAM;AAAA,EACN,aACE;AAAA,EACF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAA;AAAA,MACtC,MAAM,EAAE,MAAM,UAAU,aAAa,yBAAA;AAAA,IAAyB;AAAA,IAEhE,UAAU,CAAC,OAAO;AAAA,EAAA;AAAA,EAEpB,SAAS,OAAO,SAAS;AACvB,QAAI,OAAO,iBAAiB,aAAa;AACvC,aAAO,EAAE,OAAO,OAAO,OAAO,8BAAA;AAAA,IAChC;AACA,QAAI,aAAa,eAAe,UAAU;AACxC,aAAO,EAAE,OAAO,OAAO,OAAO,iCAAA;AAAA,IAChC;AACA,QAAI,aAAa,eAAe,WAAW;AACzC,YAAM,aAAa,kBAAA;AAAA,IACrB;AACA,QAAI,aAAa,eAAe,WAAW;AACzC,UAAI,aAAa,KAAK,OAAiB,EAAE,MAAM,KAAK,MAAgB;AACpE,aAAO,EAAE,OAAO,KAAA;AAAA,IAClB;AACA,WAAO,EAAE,OAAO,OAAO,OAAO,yBAAA;AAAA,EAChC;AACF;AAKO,MAAM,UAAoC;AAAA,EAC/C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,KAAK,EAAE,MAAM,UAAU,aAAa,kBAAA;AAAA,IAAkB;AAAA,IAExD,UAAU,CAAC,KAAK;AAAA,EAAA;AAAA,EAElB,SAAS,OAAO,SAAS;AACvB,WAAO,KAAK,KAAK,KAAe,UAAU,qBAAqB;AAC/D,WAAO,EAAE,QAAQ,KAAA;AAAA,EACnB;AACF;AAKO,MAAM,kBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,MAAM,EAAE,MAAM,UAAU,aAAa,mBAAA;AAAA,IAAmB;AAAA,IAE1D,UAAU,CAAC,MAAM;AAAA,EAAA;AAAA,EAEnB,SAAS,OAAO,SAAS;AACvB,UAAM,UAAU,UAAU,UAAU,KAAK,IAAc;AACvD,WAAO,EAAE,QAAQ,KAAA;AAAA,EACnB;AACF;AAMO,MAAM,WAAqC;AAAA,EAChD,MAAM;AAAA,EACN,aACE;AAAA,EACF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,CAAC,SAAS,QAAQ,QAAQ;AAAA,MAAA;AAAA,IAClC;AAAA,IAEF,UAAU,CAAC,OAAO;AAAA,EAAA;AAAA,EAEpB,SAAS,OAAO,SAAS;AACvB,UAAM,QAAQ,KAAK;AACnB,aAAS,gBAAgB,aAAa,cAAc,KAAK;AACzD,QAAI,UAAU,QAAQ;AACpB,eAAS,gBAAgB,UAAU,IAAI,MAAM;AAAA,IAC/C,OAAO;AACL,eAAS,gBAAgB,UAAU,OAAO,MAAM;AAAA,IAClD;AACA,WAAO,EAAE,OAAO,SAAS,KAAA;AAAA,EAC3B;AACF;AAKO,MAAM,oBAA8C;AAAA,EACzD,MAAM;AAAA,EACN,aACE;AAAA,EACF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,IAEF,UAAU,CAAC,SAAS;AAAA,EAAA;AAAA,EAEtB,SAAS,OAAO,SAAS;AACvB,UAAM,YAAY,OAAO,QAAQ,KAAK,OAAiB;AACvD,WAAO,EAAE,UAAA;AAAA,EACX;AACF;AAKO,MAAM,kBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aACE;AAAA,EACF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY,CAAA;AAAA,EAAC;AAAA,EAEf,SAAS,YAAY;AACnB,QAAI,CAAC,UAAU,aAAa;AAC1B,aAAO,EAAE,OAAO,4BAAA;AAAA,IAClB;AACA,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,gBAAU,YAAY;AAAA,QACpB,CAAC,QACC,QAAQ;AAAA,UACN,UAAU,IAAI,OAAO;AAAA,UACrB,WAAW,IAAI,OAAO;AAAA,UACtB,UAAU,IAAI,OAAO;AAAA,QAAA,CACtB;AAAA,QACH,CAAC,QAAQ,QAAQ,EAAE,OAAO,IAAI,SAAS;AAAA,MAAA;AAAA,IAE3C,CAAC;AAAA,EACH;AACF;AAKO,MAAM,kBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,MAEf,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,CAAC,UAAU,SAAS;AAAA,MAAA;AAAA,IAC5B;AAAA,IAEF,UAAU,CAAC,UAAU;AAAA,EAAA;AAAA,EAEvB,SAAS,OAAO,SAAS;AACvB,UAAM,KAAK,SAAS,cAAc,KAAK,QAAkB;AACzD,QAAI,CAAC,IAAI;AACP,aAAO,EAAE,UAAU,OAAO,OAAO,sBAAsB,KAAK,QAAQ,GAAA;AAAA,IACtE;AACA,OAAG,eAAe,EAAE,UAAW,KAAK,YAA+B,UAAU;AAC7E,WAAO,EAAE,UAAU,KAAA;AAAA,EACrB;AACF;AAKO,MAAM,kBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,KAAK,EAAE,MAAM,UAAU,aAAa,cAAA;AAAA,MACpC,OAAO,EAAE,MAAM,UAAU,aAAa,iBAAA;AAAA,IAAiB;AAAA,IAEzD,UAAU,CAAC,OAAO,OAAO;AAAA,EAAA;AAAA,EAE3B,SAAS,OAAO,SAAS;AACvB,iBAAa,QAAQ,KAAK,KAAe,KAAK,KAAe;AAC7D,WAAO,EAAE,QAAQ,KAAA;AAAA,EACnB;AACF;AAKO,MAAM,kBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,KAAK,EAAE,MAAM,UAAU,aAAa,cAAA;AAAA,IAAc;AAAA,IAEpD,UAAU,CAAC,KAAK;AAAA,EAAA;AAAA,EAElB,SAAS,OAAO,SAAS;AACvB,UAAM,QAAQ,aAAa,QAAQ,KAAK,GAAa;AACrD,WAAO,EAAE,KAAK,KAAK,KAAK,OAAO,OAAO,UAAU,KAAA;AAAA,EAClD;AACF;AAKO,MAAM,mBAA6C;AAAA,EACxD,MAAM;AAAA,EACN,aACE;AAAA,EACF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,MAEf,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,IAEF,UAAU,CAAC,UAAU;AAAA,EAAA;AAAA,EAEvB,SAAS,OAAO,SAAS;AACvB,UAAM,KAAK,SAAS,cAAc,KAAK,QAAkB;AACzD,QAAI,CAAC,IAAI;AACP,aAAO,EAAE,aAAa,OAAO,OAAO,sBAAsB,KAAK,QAAQ,GAAA;AAAA,IACzE;AACA,UAAM,OAAO,GAAG,MAAM;AACtB,UAAM,QAAS,KAAK,SAAoB;AACxC,OAAG,MAAM,UAAU,aAAa,KAAK;AACrC,OAAG,MAAM,gBAAgB;AACzB,OAAG,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU;AACzD,eAAW,MAAM;AACf,SAAG,MAAM,UAAU;AACnB,SAAG,MAAM,gBAAgB;AAAA,IAC3B,GAAG,GAAI;AACP,WAAO,EAAE,aAAa,KAAA;AAAA,EACxB;AACF;AAKO,MAAM,aAAuC;AAAA,EAClD,MAAM;AAAA,EACN,aACE;AAAA,EACF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,MAEf,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,IAEF,UAAU,CAAC,UAAU;AAAA,EAAA;AAAA,EAEvB,SAAS,OAAO,SAAS;AACvB,UAAM,OAAO,SAAS,cAAc,KAAK,QAAkB;AAC3D,QAAI,CAAC,MAAM;AACT,aAAO,EAAE,WAAW,OAAO,OAAO,mBAAmB,KAAK,QAAQ,GAAA;AAAA,IACpE;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,SAAS,KAAK,MAAM,KAAK,MAAgB;AAC/C,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,cAAM,QAAQ,KAAK,SAAS,UAAU,IAAI;AAC1C,YAAI,aAAa,QAAQ;AAAA,MAC3B;AAAA,IACF;AACA,SAAK,cAAA;AACL,WAAO,EAAE,WAAW,KAAA;AAAA,EACtB;AACF;AAMO,MAAM,aAAuC;AAAA,EAClD,MAAM;AAAA,EACN,aACE;AAAA,EACF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO,EAAE,MAAM,UAAU,aAAa,aAAA;AAAA,MACtC,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,IAEF,UAAU,CAAC,OAAO;AAAA,EAAA;AAAA,EAEpB,SAAS,OAAO,SAAS;AACvB,UAAM,QAAQ,KAAK,aAAa,KAAK,MAAM,KAAK,UAAoB,IAAI,CAAA;AACxE,YAAQ,IAAI,mBAAmB,KAAK,KAAK,IAAI,KAAK;AAClD,WAAO,EAAE,SAAS,MAAM,OAAO,KAAK,MAAA;AAAA,EACtC;AACF;;;;;;;;;;;;;;"}
|
package/dist/helpers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../src/helpers/functions.ts"],"sourcesContent":["import type { ClientFunctionDefinition } from \"../functions/types\";\n\n/**\n * Show a toast/notification to the user.\n * The handler is a no-op by default — wire it up to your toast library.\n *\n * ```ts\n * import { showToast } from \"@useago/sdk/helpers\";\n * showToast.handler = async (args) => { myToast(args.message); return { shown: true }; };\n * client.registerFunction(showToast);\n * ```\n */\nexport const showToast: ClientFunctionDefinition = {\n name: \"showToast\",\n description:\n \"Show a toast notification to the user. Use this to confirm actions or display brief messages.\",\n parameters: {\n type: \"object\",\n properties: {\n message: { type: \"string\", description: \"The message to display\" },\n type: {\n type: \"string\",\n description: \"Toast type\",\n enum: [\"success\", \"error\", \"warning\", \"info\"],\n },\n duration: {\n type: \"number\",\n description: \"Duration in milliseconds (default 3000)\",\n },\n },\n required: [\"message\"],\n },\n handler: async () => ({ shown: false, error: \"No toast handler configured\" }),\n};\n\n/**\n * Show a browser notification (requires permission).\n */\nexport const showNotification: ClientFunctionDefinition = {\n name: \"showNotification\",\n description:\n \"Show a browser notification to the user. Useful for important alerts even when the tab is not focused.\",\n parameters: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Notification title\" },\n body: { type: \"string\", description: \"Notification body text\" },\n },\n required: [\"title\"],\n },\n handler: async (args) => {\n if (typeof Notification === \"undefined\") {\n return { shown: false, error: \"Notifications not supported\" };\n }\n if (Notification.permission === \"denied\") {\n return { shown: false, error: \"Notification permission denied\" };\n }\n if (Notification.permission !== \"granted\") {\n await Notification.requestPermission();\n }\n if (Notification.permission === \"granted\") {\n new Notification(args.title as string, { body: args.body as string });\n return { shown: true };\n }\n return { shown: false, error: \"Permission not granted\" };\n },\n};\n\n/**\n * Open a URL in a new tab.\n */\nexport const openUrl: ClientFunctionDefinition = {\n name: \"openUrl\",\n description: \"Open a URL in a new browser tab.\",\n parameters: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"The URL to open\" },\n },\n required: [\"url\"],\n },\n handler: async (args) => {\n window.open(args.url as string, \"_blank\", \"noopener,noreferrer\");\n return { opened: true };\n },\n};\n\n/**\n * Copy text to clipboard.\n */\nexport const copyToClipboard: ClientFunctionDefinition = {\n name: \"copyToClipboard\",\n description: \"Copy text to the user's clipboard.\",\n parameters: {\n type: \"object\",\n properties: {\n text: { type: \"string\", description: \"The text to copy\" },\n },\n required: [\"text\"],\n },\n handler: async (args) => {\n await navigator.clipboard.writeText(args.text as string);\n return { copied: true };\n },\n};\n\n/**\n * Set the application theme (light/dark/system).\n * Default handler toggles a `data-theme` attribute on `<html>`.\n */\nexport const setTheme: ClientFunctionDefinition = {\n name: \"setTheme\",\n description:\n \"Change the application's color theme. Sets a data-theme attribute on the document element.\",\n parameters: {\n type: \"object\",\n properties: {\n theme: {\n type: \"string\",\n description: \"Theme to apply\",\n enum: [\"light\", \"dark\", \"system\"],\n },\n },\n required: [\"theme\"],\n },\n handler: async (args) => {\n const theme = args.theme as string;\n document.documentElement.setAttribute(\"data-theme\", theme);\n if (theme === \"dark\") {\n document.documentElement.classList.add(\"dark\");\n } else {\n document.documentElement.classList.remove(\"dark\");\n }\n return { theme, applied: true };\n },\n};\n\n/**\n * Show a confirm dialog and return the user's choice.\n */\nexport const showConfirmDialog: ClientFunctionDefinition = {\n name: \"showConfirmDialog\",\n description:\n \"Show a confirmation dialog to the user and return their choice (true/false).\",\n parameters: {\n type: \"object\",\n properties: {\n message: {\n type: \"string\",\n description: \"The confirmation message to display\",\n },\n },\n required: [\"message\"],\n },\n handler: async (args) => {\n const confirmed = window.confirm(args.message as string);\n return { confirmed };\n },\n};\n\n/**\n * Get the user's geolocation.\n */\nexport const getUserLocation: ClientFunctionDefinition = {\n name: \"getUserLocation\",\n description:\n \"Get the user's current geographic location (requires permission).\",\n parameters: {\n type: \"object\",\n properties: {},\n },\n handler: async () => {\n if (!navigator.geolocation) {\n return { error: \"Geolocation not supported\" };\n }\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (pos) =>\n resolve({\n latitude: pos.coords.latitude,\n longitude: pos.coords.longitude,\n accuracy: pos.coords.accuracy,\n }),\n (err) => resolve({ error: err.message })\n );\n });\n },\n};\n\n/**\n * Scroll to an element on the page.\n */\nexport const scrollToElement: ClientFunctionDefinition = {\n name: \"scrollToElement\",\n description: \"Scroll the page to a specific element identified by CSS selector.\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the element to scroll to (e.g. '#section-pricing')\",\n },\n behavior: {\n type: \"string\",\n description: \"Scroll behavior\",\n enum: [\"smooth\", \"instant\"],\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const el = document.querySelector(args.selector as string);\n if (!el) {\n return { scrolled: false, error: `Element not found: ${args.selector}` };\n }\n el.scrollIntoView({ behavior: (args.behavior as ScrollBehavior) || \"smooth\" });\n return { scrolled: true };\n },\n};\n\n/**\n * Set a value in localStorage.\n */\nexport const setLocalStorage: ClientFunctionDefinition = {\n name: \"setLocalStorage\",\n description: \"Store a value in the browser's localStorage.\",\n parameters: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Storage key\" },\n value: { type: \"string\", description: \"Value to store\" },\n },\n required: [\"key\", \"value\"],\n },\n handler: async (args) => {\n localStorage.setItem(args.key as string, args.value as string);\n return { stored: true };\n },\n};\n\n/**\n * Get a value from localStorage.\n */\nexport const getLocalStorage: ClientFunctionDefinition = {\n name: \"getLocalStorage\",\n description: \"Retrieve a value from the browser's localStorage.\",\n parameters: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Storage key\" },\n },\n required: [\"key\"],\n },\n handler: async (args) => {\n const value = localStorage.getItem(args.key as string);\n return { key: args.key, value, found: value !== null };\n },\n};\n\n/**\n * Highlight an element on the page (useful for guided tours).\n */\nexport const highlightElement: ClientFunctionDefinition = {\n name: \"highlightElement\",\n description:\n \"Highlight a DOM element to draw the user's attention (e.g. for onboarding).\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the element to highlight\",\n },\n color: {\n type: \"string\",\n description: \"Highlight border color (default: #3b82f6)\",\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const el = document.querySelector(args.selector as string) as HTMLElement | null;\n if (!el) {\n return { highlighted: false, error: `Element not found: ${args.selector}` };\n }\n const prev = el.style.outline;\n const color = (args.color as string) || \"#3b82f6\";\n el.style.outline = `3px solid ${color}`;\n el.style.outlineOffset = \"2px\";\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n setTimeout(() => {\n el.style.outline = prev;\n el.style.outlineOffset = \"\";\n }, 3000);\n return { highlighted: true };\n },\n};\n\n/**\n * Submit a form on the page programmatically.\n */\nexport const submitForm: ClientFunctionDefinition = {\n name: \"submitForm\",\n description:\n \"Fill and submit an HTML form on the page. Pass field values as key-value pairs.\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the form element\",\n },\n values: {\n type: \"string\",\n description: \"JSON string of field name → value pairs\",\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const form = document.querySelector(args.selector as string) as HTMLFormElement | null;\n if (!form) {\n return { submitted: false, error: `Form not found: ${args.selector}` };\n }\n if (args.values) {\n const values = JSON.parse(args.values as string) as Record<string, string>;\n for (const [name, value] of Object.entries(values)) {\n const input = form.elements.namedItem(name) as HTMLInputElement | null;\n if (input) input.value = value;\n }\n }\n form.requestSubmit();\n return { submitted: true };\n },\n};\n\n/**\n * Track a custom analytics event.\n * Default handler logs to console — replace with your analytics provider.\n */\nexport const trackEvent: ClientFunctionDefinition = {\n name: \"trackEvent\",\n description:\n \"Track a custom analytics event. Override the handler to wire up your analytics provider.\",\n parameters: {\n type: \"object\",\n properties: {\n event: { type: \"string\", description: \"Event name\" },\n properties: {\n type: \"string\",\n description: \"JSON string of event properties\",\n },\n },\n required: [\"event\"],\n },\n handler: async (args) => {\n const props = args.properties ? JSON.parse(args.properties as string) : {};\n console.log(`[AGO Analytics] ${args.event}`, props);\n return { tracked: true, event: args.event };\n },\n};\n"],"names":[],"mappings":"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"}
|
package/dist/widget.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"widget.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/widget.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|