@usecrow/client 0.1.16 → 0.1.19
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/dist/index.cjs +20 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -442,6 +442,22 @@ async function* streamResponse(response, signal) {
|
|
|
442
442
|
}
|
|
443
443
|
}
|
|
444
444
|
|
|
445
|
+
// src/defaultTools.ts
|
|
446
|
+
var DEFAULT_TOOLS = {
|
|
447
|
+
/**
|
|
448
|
+
* Refresh the current page in the user's browser
|
|
449
|
+
*/
|
|
450
|
+
refreshPage: async () => {
|
|
451
|
+
try {
|
|
452
|
+
window.location.reload();
|
|
453
|
+
return { status: "success", data: { message: "Page refresh initiated" } };
|
|
454
|
+
} catch (error) {
|
|
455
|
+
return { status: "error", error: String(error) };
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
var DEFAULT_TOOL_NAMES = Object.keys(DEFAULT_TOOLS);
|
|
460
|
+
|
|
445
461
|
// src/CrowClient.ts
|
|
446
462
|
var DEFAULT_API_URL = "https://api.usecrow.org";
|
|
447
463
|
var DEFAULT_MODEL = "claude-sonnet-4-20250514";
|
|
@@ -467,6 +483,8 @@ var CrowClient = class {
|
|
|
467
483
|
this.config.productId,
|
|
468
484
|
this.config.apiUrl
|
|
469
485
|
);
|
|
486
|
+
this.tools.register(DEFAULT_TOOLS);
|
|
487
|
+
console.log("[Crow] Default tools registered:", DEFAULT_TOOL_NAMES.join(", "));
|
|
470
488
|
this.identity.subscribe((state) => {
|
|
471
489
|
this.callbacks.onVerificationStatus?.(state.isVerified);
|
|
472
490
|
});
|
|
@@ -835,6 +853,8 @@ var CrowClient = class {
|
|
|
835
853
|
|
|
836
854
|
exports.ConversationManager = ConversationManager;
|
|
837
855
|
exports.CrowClient = CrowClient;
|
|
856
|
+
exports.DEFAULT_TOOLS = DEFAULT_TOOLS;
|
|
857
|
+
exports.DEFAULT_TOOL_NAMES = DEFAULT_TOOL_NAMES;
|
|
838
858
|
exports.IdentityManager = IdentityManager;
|
|
839
859
|
exports.ToolManager = ToolManager;
|
|
840
860
|
exports.parseSSEChunk = parseSSEChunk;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/identity.ts","../src/tools.ts","../src/conversations.ts","../src/streaming.ts","../src/CrowClient.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Identity management for user authentication\n */\n\nimport type { IdentifyOptions, IdentityState } from './types';\n\nexport class IdentityManager {\n private state: IdentityState = {\n token: null,\n metadata: {},\n isVerified: false,\n };\n\n private listeners: Set<(state: IdentityState) => void> = new Set();\n\n /**\n * Identify the current user with a JWT token\n */\n identify(options: IdentifyOptions): void {\n const { token, ...metadata } = options;\n\n this.state = {\n token,\n metadata,\n isVerified: false, // Will be set when server confirms\n };\n\n this.notify();\n console.log('[Crow] User identified');\n }\n\n /**\n * Update verification status (called when server confirms)\n */\n setVerified(isVerified: boolean): void {\n this.state = { ...this.state, isVerified };\n this.notify();\n }\n\n /**\n * Reset user identity (call on logout)\n */\n reset(): void {\n this.state = {\n token: null,\n metadata: {},\n isVerified: false,\n };\n this.notify();\n console.log('[Crow] User reset');\n }\n\n /**\n * Get current identity token\n */\n getToken(): string | null {\n return this.state.token;\n }\n\n /**\n * Get current identity state\n */\n getState(): IdentityState {\n return { ...this.state };\n }\n\n /**\n * Check if user is identified\n */\n isIdentified(): boolean {\n return this.state.token !== null;\n }\n\n /**\n * Check if user is verified\n */\n isVerified(): boolean {\n return this.state.isVerified;\n }\n\n /**\n * Subscribe to identity changes\n */\n subscribe(callback: (state: IdentityState) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n private notify(): void {\n const state = this.getState();\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n}\n\n","/**\n * Client-side tool management\n */\n\nimport type { ToolHandlers, ToolResult } from './types';\n\nexport class ToolManager {\n private handlers: ToolHandlers = {};\n\n /**\n * Register client-side tool handlers\n */\n register(tools: ToolHandlers): void {\n for (const [name, handler] of Object.entries(tools)) {\n if (typeof handler === 'function') {\n this.handlers[name] = handler;\n console.log(`[Crow] Registered client tool: ${name}`);\n } else {\n console.warn(`[Crow] Skipping ${name}: handler is not a function`);\n }\n }\n }\n\n /**\n * Unregister a tool handler\n */\n unregister(name: string): void {\n delete this.handlers[name];\n console.log(`[Crow] Unregistered client tool: ${name}`);\n }\n\n /**\n * Check if a tool is registered\n */\n has(name: string): boolean {\n return name in this.handlers;\n }\n\n /**\n * Get all registered tool names\n */\n getRegisteredTools(): string[] {\n return Object.keys(this.handlers);\n }\n\n /**\n * Execute a client-side tool\n */\n async execute(name: string, args: Record<string, unknown>): Promise<ToolResult> {\n const handler = this.handlers[name];\n\n if (!handler) {\n console.warn(`[Crow] No handler registered for tool: ${name}`);\n return {\n status: 'error',\n error: `No handler registered for tool: ${name}`,\n };\n }\n\n try {\n console.log(`[Crow] Executing client tool: ${name}`, args);\n const result = await handler(args);\n console.log(`[Crow] Tool ${name} completed:`, result);\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[Crow] Tool ${name} failed:`, error);\n return {\n status: 'error',\n error: errorMessage,\n };\n }\n }\n}\n\n","/**\n * Conversation management\n */\n\nimport type { Conversation, Message } from './types';\n\nconst STORAGE_KEY_PREFIX = 'crow_conv_';\n\nexport class ConversationManager {\n private productId: string;\n private apiUrl: string;\n private currentId: string | null = null;\n\n constructor(productId: string, apiUrl: string) {\n this.productId = productId;\n this.apiUrl = apiUrl;\n\n // Try to restore from localStorage\n this.currentId = this.loadFromStorage();\n }\n\n /**\n * Get localStorage key for this product\n */\n private getStorageKey(): string {\n return `${STORAGE_KEY_PREFIX}${this.productId}`;\n }\n\n /**\n * Load conversation ID from localStorage\n */\n private loadFromStorage(): string | null {\n try {\n return localStorage.getItem(this.getStorageKey());\n } catch {\n return null;\n }\n }\n\n /**\n * Save conversation ID to localStorage\n */\n private saveToStorage(id: string): void {\n try {\n localStorage.setItem(this.getStorageKey(), id);\n } catch {\n // localStorage may be unavailable\n }\n }\n\n /**\n * Clear conversation ID from localStorage\n */\n private clearStorage(): void {\n try {\n localStorage.removeItem(this.getStorageKey());\n } catch {\n // localStorage may be unavailable\n }\n }\n\n /**\n * Get current conversation ID\n */\n getCurrentId(): string | null {\n return this.currentId;\n }\n\n /**\n * Set current conversation ID\n */\n setCurrentId(id: string | null): void {\n this.currentId = id;\n if (id) {\n this.saveToStorage(id);\n } else {\n this.clearStorage();\n }\n }\n\n /**\n * Check if there's a restored conversation\n */\n hasRestoredConversation(): boolean {\n return this.currentId !== null;\n }\n\n /**\n * Clear current conversation (start new)\n */\n clear(): void {\n this.currentId = null;\n this.clearStorage();\n }\n\n /**\n * Fetch list of conversations for verified user\n */\n async getConversations(identityToken: string): Promise<Conversation[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations?product_id=${this.productId}&identity_token=${encodeURIComponent(identityToken)}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return data.conversations || [];\n } catch (error) {\n console.error('[Crow] Failed to load conversations:', error);\n return [];\n }\n }\n\n /**\n * Load conversation history for verified user\n */\n async loadHistory(\n conversationId: string,\n identityToken: string\n ): Promise<Message[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations/${conversationId}/history?product_id=${this.productId}&identity_token=${encodeURIComponent(identityToken)}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return this.parseHistoryMessages(data.messages || []);\n } catch (error) {\n console.error('[Crow] Failed to load conversation history:', error);\n return [];\n }\n }\n\n /**\n * Load conversation history for anonymous user\n */\n async loadAnonymousHistory(conversationId: string): Promise<Message[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations/${conversationId}/history/anonymous?product_id=${this.productId}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return this.parseHistoryMessages(data.messages || []);\n } catch (error) {\n console.error('[Crow] Failed to load anonymous conversation history:', error);\n return [];\n }\n }\n\n /**\n * Parse history messages from API format\n */\n private parseHistoryMessages(\n messages: Array<{ role: string; content: string }>\n ): Message[] {\n return messages\n .filter((msg) => msg.role !== \"tool\" && !msg.content.startsWith(\"[Client Tool Result:\"))\n .map((msg, idx) => ({\n id: `history-${idx}`,\n content: this.parseContent(msg.content),\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n timestamp: new Date(),\n }));\n }\n\n /**\n * Parse structured content (with thinking/text blocks) and extract just text\n */\n private parseContent(content: string): string {\n // Try JSON first\n try {\n const parsed = JSON.parse(content);\n if (Array.isArray(parsed)) {\n const textBlock = parsed.find(\n (b: { type: string; text?: string }) => b.type === 'text'\n );\n return textBlock?.text || content;\n }\n } catch {\n /* not valid JSON */\n }\n\n // Fallback: extract text block from Python-style repr\n if (content.includes(\"'type': 'text'\")) {\n const textBlockMatch = content.match(\n /\\{'text':\\s*'((?:[^'\\\\]|\\\\.)*)'\\s*,\\s*'type':\\s*'text'/\n );\n if (textBlockMatch) {\n return textBlockMatch[1].replace(/\\\\n/g, '\\n').replace(/\\\\'/g, \"'\");\n }\n }\n\n return content;\n }\n}\n\n","/**\n * SSE streaming utilities for parsing server-sent events\n */\n\nimport type { StreamEvent, Citation, WorkflowTodo } from './types';\n\n/**\n * Parse a single SSE data line into a StreamEvent\n */\nexport function parseSSEData(data: string): StreamEvent | null {\n if (data === '[DONE]') {\n return { type: 'done' };\n }\n\n try {\n const parsed = JSON.parse(data);\n\n switch (parsed.type) {\n case 'verification_status':\n return {\n type: 'verification_status',\n isVerified: parsed.is_verified === true,\n };\n\n case 'conversation_id':\n return {\n type: 'conversation_id',\n conversationId: parsed.conversation_id,\n };\n\n case 'thinking':\n if (parsed.status === 'complete') {\n return { type: 'thinking_complete' };\n }\n return null;\n\n case 'thinking_token':\n return {\n type: 'thinking',\n content: parsed.content || '',\n };\n\n case 'content':\n return {\n type: 'content',\n text: parsed.content || '',\n accumulated: '', // Will be set by caller\n };\n\n case 'citations':\n return {\n type: 'citations',\n citations: parsed.citations as Citation[],\n };\n\n case 'error':\n return {\n type: 'error',\n message: parsed.message || 'Unknown error',\n };\n\n case 'tool_call_start':\n return {\n type: 'tool_call_start',\n toolName: parsed.tool_name,\n arguments: parsed.arguments || {},\n };\n\n case 'tool_call_complete':\n return {\n type: 'tool_call_complete',\n toolName: parsed.tool_name,\n success: parsed.success,\n };\n\n case 'client_tool_call':\n return {\n type: 'client_tool_call',\n toolName: parsed.tool_name,\n arguments: parsed.arguments || {},\n };\n\n case 'workflow_started':\n return {\n type: 'workflow_started',\n name: parsed.name,\n todos: parsed.todos as WorkflowTodo[],\n };\n\n case 'todo_updated':\n return {\n type: 'workflow_todo_updated',\n todoId: parsed.id,\n status: parsed.status,\n };\n\n case 'workflow_ended':\n return { type: 'workflow_ended' };\n\n case 'workflow_complete_prompt':\n return { type: 'workflow_complete_prompt' };\n\n default:\n return null;\n }\n } catch {\n console.error('[Crow] Failed to parse SSE data:', data);\n return null;\n }\n}\n\n/**\n * Parse SSE chunk into lines and extract data\n */\nexport function* parseSSEChunk(chunk: string): Generator<string> {\n const lines = chunk.split('\\n');\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n yield line.slice(6).trim();\n }\n }\n}\n\n/**\n * Create an async generator that streams events from a Response\n */\nexport async function* streamResponse(\n response: Response,\n signal?: AbortSignal\n): AsyncGenerator<StreamEvent> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let accumulatedContent = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n reader.cancel();\n return;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n\n for (const data of parseSSEChunk(chunk)) {\n const event = parseSSEData(data);\n if (event) {\n // Track accumulated content for content events\n if (event.type === 'content') {\n accumulatedContent += event.text;\n yield { ...event, accumulated: accumulatedContent };\n } else {\n yield event;\n }\n\n // Stop on done\n if (event.type === 'done') {\n return;\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n","/**\n * CrowClient - Main headless client for Crow AI agents\n */\n\nimport { IdentityManager } from './identity';\nimport { ToolManager } from './tools';\nimport { ConversationManager } from './conversations';\nimport { streamResponse } from './streaming';\nimport type {\n CrowClientConfig,\n IdentifyOptions,\n Message,\n StreamEvent,\n ToolHandlers,\n Conversation,\n ContextData,\n CrowEventCallbacks,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.usecrow.org';\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\nexport class CrowClient {\n private config: Required<CrowClientConfig>;\n private identity: IdentityManager;\n private tools: ToolManager;\n private conversations: ConversationManager;\n private context: ContextData = {};\n private abortController: AbortController | null = null;\n private callbacks: CrowEventCallbacks = {};\n\n // Message state\n private _messages: Message[] = [];\n private messageListeners: Set<(messages: Message[]) => void> = new Set();\n\n // Loading state\n private _isLoading = false;\n private loadingListeners: Set<(isLoading: boolean) => void> = new Set();\n\n constructor(config: CrowClientConfig) {\n this.config = {\n productId: config.productId,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n model: config.model || DEFAULT_MODEL,\n };\n\n this.identity = new IdentityManager();\n this.tools = new ToolManager();\n this.conversations = new ConversationManager(\n this.config.productId,\n this.config.apiUrl\n );\n\n // Subscribe to identity changes for verification status\n this.identity.subscribe((state) => {\n this.callbacks.onVerificationStatus?.(state.isVerified);\n });\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Get current product ID\n */\n get productId(): string {\n return this.config.productId;\n }\n\n /**\n * Get current API URL\n */\n get apiUrl(): string {\n return this.config.apiUrl;\n }\n\n /**\n * Get/set current model\n */\n get model(): string {\n return this.config.model;\n }\n\n set model(value: string) {\n this.config.model = value;\n }\n\n // ============================================================================\n // Event Callbacks\n // ============================================================================\n\n /**\n * Register event callbacks\n */\n on(callbacks: CrowEventCallbacks): void {\n this.callbacks = { ...this.callbacks, ...callbacks };\n }\n\n // ============================================================================\n // Identity\n // ============================================================================\n\n /**\n * Identify the current user with a JWT token\n */\n identify(options: IdentifyOptions): void {\n this.identity.identify(options);\n }\n\n /**\n * Reset user identity (call on logout)\n */\n resetUser(): void {\n this.identity.reset();\n this.clearMessages();\n }\n\n /**\n * Check if user is identified\n */\n isIdentified(): boolean {\n return this.identity.isIdentified();\n }\n\n /**\n * Check if user is verified by server\n */\n isVerified(): boolean {\n return this.identity.isVerified();\n }\n\n // ============================================================================\n // Tools\n // ============================================================================\n\n /**\n * Register client-side tool handlers\n */\n registerTools(tools: ToolHandlers): void {\n this.tools.register(tools);\n }\n\n /**\n * Unregister a tool handler\n */\n unregisterTool(name: string): void {\n this.tools.unregister(name);\n }\n\n /**\n * Get list of registered tool names\n */\n getRegisteredTools(): string[] {\n return this.tools.getRegisteredTools();\n }\n\n // ============================================================================\n // Context\n // ============================================================================\n\n /**\n * Set context data to be sent with messages\n */\n setContext(data: ContextData): void {\n this.context = { ...this.context, ...data };\n }\n\n /**\n * Clear context data\n */\n clearContext(): void {\n this.context = {};\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n /**\n * Get current messages\n */\n get messages(): Message[] {\n return [...this._messages];\n }\n\n /**\n * Check if currently loading/streaming\n */\n get isLoading(): boolean {\n return this._isLoading;\n }\n\n /**\n * Subscribe to message changes\n */\n onMessages(callback: (messages: Message[]) => void): () => void {\n this.messageListeners.add(callback);\n return () => this.messageListeners.delete(callback);\n }\n\n /**\n * Subscribe to loading state changes\n */\n onLoading(callback: (isLoading: boolean) => void): () => void {\n this.loadingListeners.add(callback);\n return () => this.loadingListeners.delete(callback);\n }\n\n /**\n * Clear all messages and start new conversation\n */\n clearMessages(): void {\n this._messages = [];\n this.conversations.clear();\n this.notifyMessages();\n }\n\n /**\n * Load messages from history\n */\n loadMessages(messages: Message[]): void {\n this._messages = messages;\n this.notifyMessages();\n }\n\n private notifyMessages(): void {\n const messages = this.messages;\n for (const listener of this.messageListeners) {\n listener(messages);\n }\n }\n\n private setLoading(isLoading: boolean): void {\n this._isLoading = isLoading;\n for (const listener of this.loadingListeners) {\n listener(isLoading);\n }\n }\n\n private addMessage(message: Message): void {\n this._messages = [...this._messages, message];\n this.notifyMessages();\n this.callbacks.onMessage?.(message);\n }\n\n private updateMessage(id: string, updates: Partial<Message>): void {\n this._messages = this._messages.map((msg) =>\n msg.id === id ? { ...msg, ...updates } : msg\n );\n this.notifyMessages();\n this.callbacks.onMessageUpdate?.(id, updates);\n }\n\n private generateMessageId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n // ============================================================================\n // Conversations\n // ============================================================================\n\n /**\n * Get current conversation ID\n */\n get conversationId(): string | null {\n return this.conversations.getCurrentId();\n }\n\n /**\n * Set current conversation ID\n */\n set conversationId(id: string | null) {\n this.conversations.setCurrentId(id);\n }\n\n /**\n * Get list of conversations for verified user\n */\n async getConversations(): Promise<Conversation[]> {\n const token = this.identity.getToken();\n if (!token) {\n console.warn('[Crow] Cannot get conversations: user not identified');\n return [];\n }\n return this.conversations.getConversations(token);\n }\n\n /**\n * Load conversation history\n */\n async loadHistory(conversationId: string): Promise<Message[]> {\n const token = this.identity.getToken();\n if (token) {\n return this.conversations.loadHistory(conversationId, token);\n }\n return this.conversations.loadAnonymousHistory(conversationId);\n }\n\n /**\n * Switch to a different conversation\n */\n async switchConversation(conversationId: string): Promise<void> {\n const messages = await this.loadHistory(conversationId);\n this.conversations.setCurrentId(conversationId);\n this.loadMessages(messages);\n }\n\n // ============================================================================\n // Messaging\n // ============================================================================\n\n /**\n * Send a message and receive streaming response\n * Returns an async generator of stream events\n */\n async *sendMessage(content: string): AsyncGenerator<StreamEvent> {\n if (!content.trim()) {\n return;\n }\n\n // Create and add user message\n const userMsgId = this.generateMessageId('user');\n this.addMessage({\n id: userMsgId,\n content,\n role: 'user',\n timestamp: new Date(),\n });\n\n // Create placeholder for assistant message\n const botMsgId = this.generateMessageId('assistant');\n this.addMessage({\n id: botMsgId,\n content: '',\n role: 'assistant',\n timestamp: new Date(),\n });\n\n this.setLoading(true);\n this.abortController = new AbortController();\n\n let accumulatedContent = '';\n let accumulatedThinking = '';\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/chat/message`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n product_id: this.config.productId,\n message: content,\n conversation_id: this.conversations.getCurrentId(),\n identity_token: this.identity.getToken(),\n model: this.config.model,\n context: Object.keys(this.context).length > 0 ? this.context : undefined,\n }),\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n for await (const event of streamResponse(response, this.abortController.signal)) {\n // Handle event and update state\n switch (event.type) {\n case 'content':\n accumulatedContent = event.accumulated;\n this.updateMessage(botMsgId, { content: accumulatedContent });\n break;\n\n case 'thinking':\n accumulatedThinking += event.content;\n this.updateMessage(botMsgId, { thinking: accumulatedThinking });\n break;\n\n case 'thinking_complete':\n this.updateMessage(botMsgId, { thinkingComplete: true });\n break;\n\n case 'citations':\n this.updateMessage(botMsgId, { citations: event.citations });\n break;\n\n case 'verification_status':\n this.identity.setVerified(event.isVerified);\n break;\n\n case 'conversation_id':\n this.conversations.setCurrentId(event.conversationId);\n break;\n\n case 'client_tool_call':\n // Execute client tool and get result\n // TODO: Send result back to server when bidirectional tool calls are implemented\n await this.tools.execute(event.toolName, event.arguments);\n this.callbacks.onToolCall?.(event);\n break;\n\n case 'tool_call_start':\n case 'tool_call_complete':\n this.callbacks.onToolCall?.(event);\n break;\n\n case 'workflow_started':\n case 'workflow_todo_updated':\n case 'workflow_ended':\n case 'workflow_complete_prompt':\n this.callbacks.onWorkflow?.(event);\n break;\n\n case 'error':\n this.updateMessage(botMsgId, { content: event.message });\n this.callbacks.onError?.(new Error(event.message));\n break;\n }\n\n yield event;\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // User stopped - keep accumulated text or remove message\n if (accumulatedContent) {\n this.updateMessage(botMsgId, { content: accumulatedContent });\n } else {\n this._messages = this._messages.filter((msg) => msg.id !== botMsgId);\n this.notifyMessages();\n }\n return;\n }\n\n console.error('[Crow] Error:', error);\n this.updateMessage(botMsgId, {\n content: 'Sorry, I encountered an error. Please try again.',\n });\n this.callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n } finally {\n this.setLoading(false);\n this.abortController = null;\n }\n }\n\n /**\n * Send a message and wait for complete response (non-streaming)\n */\n async send(content: string): Promise<Message | null> {\n let lastMessage: Message | null = null;\n\n for await (const event of this.sendMessage(content)) {\n if (event.type === 'done') {\n break;\n }\n }\n\n // Return the assistant message\n const messages = this.messages;\n if (messages.length > 0) {\n lastMessage = messages[messages.length - 1];\n if (lastMessage.role === 'assistant') {\n return lastMessage;\n }\n }\n\n return null;\n }\n\n /**\n * Stop current generation\n */\n stop(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.setLoading(false);\n }\n }\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n /**\n * Destroy the client and clean up resources\n */\n destroy(): void {\n this.stop();\n this.messageListeners.clear();\n this.loadingListeners.clear();\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/identity.ts","../src/tools.ts","../src/conversations.ts","../src/streaming.ts","../src/defaultTools.ts","../src/CrowClient.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Identity management for user authentication\n */\n\nimport type { IdentifyOptions, IdentityState } from './types';\n\nexport class IdentityManager {\n private state: IdentityState = {\n token: null,\n metadata: {},\n isVerified: false,\n };\n\n private listeners: Set<(state: IdentityState) => void> = new Set();\n\n /**\n * Identify the current user with a JWT token\n */\n identify(options: IdentifyOptions): void {\n const { token, ...metadata } = options;\n\n this.state = {\n token,\n metadata,\n isVerified: false, // Will be set when server confirms\n };\n\n this.notify();\n console.log('[Crow] User identified');\n }\n\n /**\n * Update verification status (called when server confirms)\n */\n setVerified(isVerified: boolean): void {\n this.state = { ...this.state, isVerified };\n this.notify();\n }\n\n /**\n * Reset user identity (call on logout)\n */\n reset(): void {\n this.state = {\n token: null,\n metadata: {},\n isVerified: false,\n };\n this.notify();\n console.log('[Crow] User reset');\n }\n\n /**\n * Get current identity token\n */\n getToken(): string | null {\n return this.state.token;\n }\n\n /**\n * Get current identity state\n */\n getState(): IdentityState {\n return { ...this.state };\n }\n\n /**\n * Check if user is identified\n */\n isIdentified(): boolean {\n return this.state.token !== null;\n }\n\n /**\n * Check if user is verified\n */\n isVerified(): boolean {\n return this.state.isVerified;\n }\n\n /**\n * Subscribe to identity changes\n */\n subscribe(callback: (state: IdentityState) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n private notify(): void {\n const state = this.getState();\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n}\n\n","/**\n * Client-side tool management\n */\n\nimport type { ToolHandlers, ToolResult } from './types';\n\nexport class ToolManager {\n private handlers: ToolHandlers = {};\n\n /**\n * Register client-side tool handlers\n */\n register(tools: ToolHandlers): void {\n for (const [name, handler] of Object.entries(tools)) {\n if (typeof handler === 'function') {\n this.handlers[name] = handler;\n console.log(`[Crow] Registered client tool: ${name}`);\n } else {\n console.warn(`[Crow] Skipping ${name}: handler is not a function`);\n }\n }\n }\n\n /**\n * Unregister a tool handler\n */\n unregister(name: string): void {\n delete this.handlers[name];\n console.log(`[Crow] Unregistered client tool: ${name}`);\n }\n\n /**\n * Check if a tool is registered\n */\n has(name: string): boolean {\n return name in this.handlers;\n }\n\n /**\n * Get all registered tool names\n */\n getRegisteredTools(): string[] {\n return Object.keys(this.handlers);\n }\n\n /**\n * Execute a client-side tool\n */\n async execute(name: string, args: Record<string, unknown>): Promise<ToolResult> {\n const handler = this.handlers[name];\n\n if (!handler) {\n console.warn(`[Crow] No handler registered for tool: ${name}`);\n return {\n status: 'error',\n error: `No handler registered for tool: ${name}`,\n };\n }\n\n try {\n console.log(`[Crow] Executing client tool: ${name}`, args);\n const result = await handler(args);\n console.log(`[Crow] Tool ${name} completed:`, result);\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[Crow] Tool ${name} failed:`, error);\n return {\n status: 'error',\n error: errorMessage,\n };\n }\n }\n}\n\n","/**\n * Conversation management\n */\n\nimport type { Conversation, Message } from './types';\n\nconst STORAGE_KEY_PREFIX = 'crow_conv_';\n\nexport class ConversationManager {\n private productId: string;\n private apiUrl: string;\n private currentId: string | null = null;\n\n constructor(productId: string, apiUrl: string) {\n this.productId = productId;\n this.apiUrl = apiUrl;\n\n // Try to restore from localStorage\n this.currentId = this.loadFromStorage();\n }\n\n /**\n * Get localStorage key for this product\n */\n private getStorageKey(): string {\n return `${STORAGE_KEY_PREFIX}${this.productId}`;\n }\n\n /**\n * Load conversation ID from localStorage\n */\n private loadFromStorage(): string | null {\n try {\n return localStorage.getItem(this.getStorageKey());\n } catch {\n return null;\n }\n }\n\n /**\n * Save conversation ID to localStorage\n */\n private saveToStorage(id: string): void {\n try {\n localStorage.setItem(this.getStorageKey(), id);\n } catch {\n // localStorage may be unavailable\n }\n }\n\n /**\n * Clear conversation ID from localStorage\n */\n private clearStorage(): void {\n try {\n localStorage.removeItem(this.getStorageKey());\n } catch {\n // localStorage may be unavailable\n }\n }\n\n /**\n * Get current conversation ID\n */\n getCurrentId(): string | null {\n return this.currentId;\n }\n\n /**\n * Set current conversation ID\n */\n setCurrentId(id: string | null): void {\n this.currentId = id;\n if (id) {\n this.saveToStorage(id);\n } else {\n this.clearStorage();\n }\n }\n\n /**\n * Check if there's a restored conversation\n */\n hasRestoredConversation(): boolean {\n return this.currentId !== null;\n }\n\n /**\n * Clear current conversation (start new)\n */\n clear(): void {\n this.currentId = null;\n this.clearStorage();\n }\n\n /**\n * Fetch list of conversations for verified user\n */\n async getConversations(identityToken: string): Promise<Conversation[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations?product_id=${this.productId}&identity_token=${encodeURIComponent(identityToken)}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return data.conversations || [];\n } catch (error) {\n console.error('[Crow] Failed to load conversations:', error);\n return [];\n }\n }\n\n /**\n * Load conversation history for verified user\n */\n async loadHistory(\n conversationId: string,\n identityToken: string\n ): Promise<Message[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations/${conversationId}/history?product_id=${this.productId}&identity_token=${encodeURIComponent(identityToken)}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return this.parseHistoryMessages(data.messages || []);\n } catch (error) {\n console.error('[Crow] Failed to load conversation history:', error);\n return [];\n }\n }\n\n /**\n * Load conversation history for anonymous user\n */\n async loadAnonymousHistory(conversationId: string): Promise<Message[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations/${conversationId}/history/anonymous?product_id=${this.productId}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return this.parseHistoryMessages(data.messages || []);\n } catch (error) {\n console.error('[Crow] Failed to load anonymous conversation history:', error);\n return [];\n }\n }\n\n /**\n * Parse history messages from API format\n */\n private parseHistoryMessages(\n messages: Array<{ role: string; content: string }>\n ): Message[] {\n return messages\n .filter((msg) => msg.role !== \"tool\" && !msg.content.startsWith(\"[Client Tool Result:\"))\n .map((msg, idx) => ({\n id: `history-${idx}`,\n content: this.parseContent(msg.content),\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n timestamp: new Date(),\n }));\n }\n\n /**\n * Parse structured content (with thinking/text blocks) and extract just text\n */\n private parseContent(content: string): string {\n // Try JSON first\n try {\n const parsed = JSON.parse(content);\n if (Array.isArray(parsed)) {\n const textBlock = parsed.find(\n (b: { type: string; text?: string }) => b.type === 'text'\n );\n return textBlock?.text || content;\n }\n } catch {\n /* not valid JSON */\n }\n\n // Fallback: extract text block from Python-style repr\n if (content.includes(\"'type': 'text'\")) {\n const textBlockMatch = content.match(\n /\\{'text':\\s*'((?:[^'\\\\]|\\\\.)*)'\\s*,\\s*'type':\\s*'text'/\n );\n if (textBlockMatch) {\n return textBlockMatch[1].replace(/\\\\n/g, '\\n').replace(/\\\\'/g, \"'\");\n }\n }\n\n return content;\n }\n}\n\n","/**\n * SSE streaming utilities for parsing server-sent events\n */\n\nimport type { StreamEvent, Citation, WorkflowTodo } from './types';\n\n/**\n * Parse a single SSE data line into a StreamEvent\n */\nexport function parseSSEData(data: string): StreamEvent | null {\n if (data === '[DONE]') {\n return { type: 'done' };\n }\n\n try {\n const parsed = JSON.parse(data);\n\n switch (parsed.type) {\n case 'verification_status':\n return {\n type: 'verification_status',\n isVerified: parsed.is_verified === true,\n };\n\n case 'conversation_id':\n return {\n type: 'conversation_id',\n conversationId: parsed.conversation_id,\n };\n\n case 'thinking':\n if (parsed.status === 'complete') {\n return { type: 'thinking_complete' };\n }\n return null;\n\n case 'thinking_token':\n return {\n type: 'thinking',\n content: parsed.content || '',\n };\n\n case 'content':\n return {\n type: 'content',\n text: parsed.content || '',\n accumulated: '', // Will be set by caller\n };\n\n case 'citations':\n return {\n type: 'citations',\n citations: parsed.citations as Citation[],\n };\n\n case 'error':\n return {\n type: 'error',\n message: parsed.message || 'Unknown error',\n };\n\n case 'tool_call_start':\n return {\n type: 'tool_call_start',\n toolName: parsed.tool_name,\n arguments: parsed.arguments || {},\n };\n\n case 'tool_call_complete':\n return {\n type: 'tool_call_complete',\n toolName: parsed.tool_name,\n success: parsed.success,\n };\n\n case 'client_tool_call':\n return {\n type: 'client_tool_call',\n toolName: parsed.tool_name,\n arguments: parsed.arguments || {},\n };\n\n case 'workflow_started':\n return {\n type: 'workflow_started',\n name: parsed.name,\n todos: parsed.todos as WorkflowTodo[],\n };\n\n case 'todo_updated':\n return {\n type: 'workflow_todo_updated',\n todoId: parsed.id,\n status: parsed.status,\n };\n\n case 'workflow_ended':\n return { type: 'workflow_ended' };\n\n case 'workflow_complete_prompt':\n return { type: 'workflow_complete_prompt' };\n\n default:\n return null;\n }\n } catch {\n console.error('[Crow] Failed to parse SSE data:', data);\n return null;\n }\n}\n\n/**\n * Parse SSE chunk into lines and extract data\n */\nexport function* parseSSEChunk(chunk: string): Generator<string> {\n const lines = chunk.split('\\n');\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n yield line.slice(6).trim();\n }\n }\n}\n\n/**\n * Create an async generator that streams events from a Response\n */\nexport async function* streamResponse(\n response: Response,\n signal?: AbortSignal\n): AsyncGenerator<StreamEvent> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let accumulatedContent = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n reader.cancel();\n return;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n\n for (const data of parseSSEChunk(chunk)) {\n const event = parseSSEData(data);\n if (event) {\n // Track accumulated content for content events\n if (event.type === 'content') {\n accumulatedContent += event.text;\n yield { ...event, accumulated: accumulatedContent };\n } else {\n yield event;\n }\n\n // Stop on done\n if (event.type === 'done') {\n return;\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n","/**\n * SDK Default Tools - automatically registered, zero configuration\n * \n * These tools are built into the Crow SDK and available to all agents\n * without any user configuration required.\n */\n\nimport type { ToolResult } from './types';\n\n/**\n * SDK Default Tools - automatically registered, zero configuration\n */\nexport const DEFAULT_TOOLS = {\n /**\n * Refresh the current page in the user's browser\n */\n refreshPage: async (): Promise<ToolResult> => {\n try {\n window.location.reload();\n return { status: 'success', data: { message: 'Page refresh initiated' } };\n } catch (error) {\n return { status: 'error', error: String(error) };\n }\n },\n} as const;\n\nexport type DefaultToolName = keyof typeof DEFAULT_TOOLS;\nexport const DEFAULT_TOOL_NAMES = Object.keys(DEFAULT_TOOLS) as DefaultToolName[];\n","/**\n * CrowClient - Main headless client for Crow AI agents\n */\n\nimport { IdentityManager } from './identity';\nimport { ToolManager } from './tools';\nimport { ConversationManager } from './conversations';\nimport { streamResponse } from './streaming';\nimport { DEFAULT_TOOLS, DEFAULT_TOOL_NAMES } from './defaultTools';\nimport type {\n CrowClientConfig,\n IdentifyOptions,\n Message,\n StreamEvent,\n ToolHandlers,\n Conversation,\n ContextData,\n CrowEventCallbacks,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.usecrow.org';\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\nexport class CrowClient {\n private config: Required<CrowClientConfig>;\n private identity: IdentityManager;\n private tools: ToolManager;\n private conversations: ConversationManager;\n private context: ContextData = {};\n private abortController: AbortController | null = null;\n private callbacks: CrowEventCallbacks = {};\n\n // Message state\n private _messages: Message[] = [];\n private messageListeners: Set<(messages: Message[]) => void> = new Set();\n\n // Loading state\n private _isLoading = false;\n private loadingListeners: Set<(isLoading: boolean) => void> = new Set();\n\n constructor(config: CrowClientConfig) {\n this.config = {\n productId: config.productId,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n model: config.model || DEFAULT_MODEL,\n };\n\n this.identity = new IdentityManager();\n this.tools = new ToolManager();\n this.conversations = new ConversationManager(\n this.config.productId,\n this.config.apiUrl\n );\n\n // Register SDK default tools (e.g., refreshPage)\n this.tools.register(DEFAULT_TOOLS);\n console.log('[Crow] Default tools registered:', DEFAULT_TOOL_NAMES.join(', '));\n\n // Subscribe to identity changes for verification status\n this.identity.subscribe((state) => {\n this.callbacks.onVerificationStatus?.(state.isVerified);\n });\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Get current product ID\n */\n get productId(): string {\n return this.config.productId;\n }\n\n /**\n * Get current API URL\n */\n get apiUrl(): string {\n return this.config.apiUrl;\n }\n\n /**\n * Get/set current model\n */\n get model(): string {\n return this.config.model;\n }\n\n set model(value: string) {\n this.config.model = value;\n }\n\n // ============================================================================\n // Event Callbacks\n // ============================================================================\n\n /**\n * Register event callbacks\n */\n on(callbacks: CrowEventCallbacks): void {\n this.callbacks = { ...this.callbacks, ...callbacks };\n }\n\n // ============================================================================\n // Identity\n // ============================================================================\n\n /**\n * Identify the current user with a JWT token\n */\n identify(options: IdentifyOptions): void {\n this.identity.identify(options);\n }\n\n /**\n * Reset user identity (call on logout)\n */\n resetUser(): void {\n this.identity.reset();\n this.clearMessages();\n }\n\n /**\n * Check if user is identified\n */\n isIdentified(): boolean {\n return this.identity.isIdentified();\n }\n\n /**\n * Check if user is verified by server\n */\n isVerified(): boolean {\n return this.identity.isVerified();\n }\n\n // ============================================================================\n // Tools\n // ============================================================================\n\n /**\n * Register client-side tool handlers\n */\n registerTools(tools: ToolHandlers): void {\n this.tools.register(tools);\n }\n\n /**\n * Unregister a tool handler\n */\n unregisterTool(name: string): void {\n this.tools.unregister(name);\n }\n\n /**\n * Get list of registered tool names\n */\n getRegisteredTools(): string[] {\n return this.tools.getRegisteredTools();\n }\n\n // ============================================================================\n // Context\n // ============================================================================\n\n /**\n * Set context data to be sent with messages\n */\n setContext(data: ContextData): void {\n this.context = { ...this.context, ...data };\n }\n\n /**\n * Clear context data\n */\n clearContext(): void {\n this.context = {};\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n /**\n * Get current messages\n */\n get messages(): Message[] {\n return [...this._messages];\n }\n\n /**\n * Check if currently loading/streaming\n */\n get isLoading(): boolean {\n return this._isLoading;\n }\n\n /**\n * Subscribe to message changes\n */\n onMessages(callback: (messages: Message[]) => void): () => void {\n this.messageListeners.add(callback);\n return () => this.messageListeners.delete(callback);\n }\n\n /**\n * Subscribe to loading state changes\n */\n onLoading(callback: (isLoading: boolean) => void): () => void {\n this.loadingListeners.add(callback);\n return () => this.loadingListeners.delete(callback);\n }\n\n /**\n * Clear all messages and start new conversation\n */\n clearMessages(): void {\n this._messages = [];\n this.conversations.clear();\n this.notifyMessages();\n }\n\n /**\n * Load messages from history\n */\n loadMessages(messages: Message[]): void {\n this._messages = messages;\n this.notifyMessages();\n }\n\n private notifyMessages(): void {\n const messages = this.messages;\n for (const listener of this.messageListeners) {\n listener(messages);\n }\n }\n\n private setLoading(isLoading: boolean): void {\n this._isLoading = isLoading;\n for (const listener of this.loadingListeners) {\n listener(isLoading);\n }\n }\n\n private addMessage(message: Message): void {\n this._messages = [...this._messages, message];\n this.notifyMessages();\n this.callbacks.onMessage?.(message);\n }\n\n private updateMessage(id: string, updates: Partial<Message>): void {\n this._messages = this._messages.map((msg) =>\n msg.id === id ? { ...msg, ...updates } : msg\n );\n this.notifyMessages();\n this.callbacks.onMessageUpdate?.(id, updates);\n }\n\n private generateMessageId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n // ============================================================================\n // Conversations\n // ============================================================================\n\n /**\n * Get current conversation ID\n */\n get conversationId(): string | null {\n return this.conversations.getCurrentId();\n }\n\n /**\n * Set current conversation ID\n */\n set conversationId(id: string | null) {\n this.conversations.setCurrentId(id);\n }\n\n /**\n * Get list of conversations for verified user\n */\n async getConversations(): Promise<Conversation[]> {\n const token = this.identity.getToken();\n if (!token) {\n console.warn('[Crow] Cannot get conversations: user not identified');\n return [];\n }\n return this.conversations.getConversations(token);\n }\n\n /**\n * Load conversation history\n */\n async loadHistory(conversationId: string): Promise<Message[]> {\n const token = this.identity.getToken();\n if (token) {\n return this.conversations.loadHistory(conversationId, token);\n }\n return this.conversations.loadAnonymousHistory(conversationId);\n }\n\n /**\n * Switch to a different conversation\n */\n async switchConversation(conversationId: string): Promise<void> {\n const messages = await this.loadHistory(conversationId);\n this.conversations.setCurrentId(conversationId);\n this.loadMessages(messages);\n }\n\n // ============================================================================\n // Messaging\n // ============================================================================\n\n /**\n * Send a message and receive streaming response\n * Returns an async generator of stream events\n */\n async *sendMessage(content: string): AsyncGenerator<StreamEvent> {\n if (!content.trim()) {\n return;\n }\n\n // Create and add user message\n const userMsgId = this.generateMessageId('user');\n this.addMessage({\n id: userMsgId,\n content,\n role: 'user',\n timestamp: new Date(),\n });\n\n // Create placeholder for assistant message\n const botMsgId = this.generateMessageId('assistant');\n this.addMessage({\n id: botMsgId,\n content: '',\n role: 'assistant',\n timestamp: new Date(),\n });\n\n this.setLoading(true);\n this.abortController = new AbortController();\n\n let accumulatedContent = '';\n let accumulatedThinking = '';\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/chat/message`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n product_id: this.config.productId,\n message: content,\n conversation_id: this.conversations.getCurrentId(),\n identity_token: this.identity.getToken(),\n model: this.config.model,\n context: Object.keys(this.context).length > 0 ? this.context : undefined,\n }),\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n for await (const event of streamResponse(response, this.abortController.signal)) {\n // Handle event and update state\n switch (event.type) {\n case 'content':\n accumulatedContent = event.accumulated;\n this.updateMessage(botMsgId, { content: accumulatedContent });\n break;\n\n case 'thinking':\n accumulatedThinking += event.content;\n this.updateMessage(botMsgId, { thinking: accumulatedThinking });\n break;\n\n case 'thinking_complete':\n this.updateMessage(botMsgId, { thinkingComplete: true });\n break;\n\n case 'citations':\n this.updateMessage(botMsgId, { citations: event.citations });\n break;\n\n case 'verification_status':\n this.identity.setVerified(event.isVerified);\n break;\n\n case 'conversation_id':\n this.conversations.setCurrentId(event.conversationId);\n break;\n\n case 'client_tool_call':\n // Execute client tool and get result\n // TODO: Send result back to server when bidirectional tool calls are implemented\n await this.tools.execute(event.toolName, event.arguments);\n this.callbacks.onToolCall?.(event);\n break;\n\n case 'tool_call_start':\n case 'tool_call_complete':\n this.callbacks.onToolCall?.(event);\n break;\n\n case 'workflow_started':\n case 'workflow_todo_updated':\n case 'workflow_ended':\n case 'workflow_complete_prompt':\n this.callbacks.onWorkflow?.(event);\n break;\n\n case 'error':\n this.updateMessage(botMsgId, { content: event.message });\n this.callbacks.onError?.(new Error(event.message));\n break;\n }\n\n yield event;\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // User stopped - keep accumulated text or remove message\n if (accumulatedContent) {\n this.updateMessage(botMsgId, { content: accumulatedContent });\n } else {\n this._messages = this._messages.filter((msg) => msg.id !== botMsgId);\n this.notifyMessages();\n }\n return;\n }\n\n console.error('[Crow] Error:', error);\n this.updateMessage(botMsgId, {\n content: 'Sorry, I encountered an error. Please try again.',\n });\n this.callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n } finally {\n this.setLoading(false);\n this.abortController = null;\n }\n }\n\n /**\n * Send a message and wait for complete response (non-streaming)\n */\n async send(content: string): Promise<Message | null> {\n let lastMessage: Message | null = null;\n\n for await (const event of this.sendMessage(content)) {\n if (event.type === 'done') {\n break;\n }\n }\n\n // Return the assistant message\n const messages = this.messages;\n if (messages.length > 0) {\n lastMessage = messages[messages.length - 1];\n if (lastMessage.role === 'assistant') {\n return lastMessage;\n }\n }\n\n return null;\n }\n\n /**\n * Stop current generation\n */\n stop(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.setLoading(false);\n }\n }\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n /**\n * Destroy the client and clean up resources\n */\n destroy(): void {\n this.stop();\n this.messageListeners.clear();\n this.loadingListeners.clear();\n }\n}\n\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -421,4 +421,23 @@ declare function parseSSEChunk(chunk: string): Generator<string>;
|
|
|
421
421
|
*/
|
|
422
422
|
declare function streamResponse(response: Response, signal?: AbortSignal): AsyncGenerator<StreamEvent>;
|
|
423
423
|
|
|
424
|
-
|
|
424
|
+
/**
|
|
425
|
+
* SDK Default Tools - automatically registered, zero configuration
|
|
426
|
+
*
|
|
427
|
+
* These tools are built into the Crow SDK and available to all agents
|
|
428
|
+
* without any user configuration required.
|
|
429
|
+
*/
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* SDK Default Tools - automatically registered, zero configuration
|
|
433
|
+
*/
|
|
434
|
+
declare const DEFAULT_TOOLS: {
|
|
435
|
+
/**
|
|
436
|
+
* Refresh the current page in the user's browser
|
|
437
|
+
*/
|
|
438
|
+
readonly refreshPage: () => Promise<ToolResult>;
|
|
439
|
+
};
|
|
440
|
+
type DefaultToolName = keyof typeof DEFAULT_TOOLS;
|
|
441
|
+
declare const DEFAULT_TOOL_NAMES: DefaultToolName[];
|
|
442
|
+
|
|
443
|
+
export { type ActiveWorkflow, type Citation, type ContextData, type Conversation, ConversationManager, CrowClient, type CrowClientConfig, type CrowEventCallbacks, DEFAULT_TOOLS, DEFAULT_TOOL_NAMES, type DefaultToolName, type IdentifyOptions, IdentityManager, type IdentityState, type Message, type StreamEvent, type ToolHandler, type ToolHandlers, ToolManager, type ToolResult, type WorkflowTodo, parseSSEChunk, parseSSEData, streamResponse };
|
package/dist/index.d.ts
CHANGED
|
@@ -421,4 +421,23 @@ declare function parseSSEChunk(chunk: string): Generator<string>;
|
|
|
421
421
|
*/
|
|
422
422
|
declare function streamResponse(response: Response, signal?: AbortSignal): AsyncGenerator<StreamEvent>;
|
|
423
423
|
|
|
424
|
-
|
|
424
|
+
/**
|
|
425
|
+
* SDK Default Tools - automatically registered, zero configuration
|
|
426
|
+
*
|
|
427
|
+
* These tools are built into the Crow SDK and available to all agents
|
|
428
|
+
* without any user configuration required.
|
|
429
|
+
*/
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* SDK Default Tools - automatically registered, zero configuration
|
|
433
|
+
*/
|
|
434
|
+
declare const DEFAULT_TOOLS: {
|
|
435
|
+
/**
|
|
436
|
+
* Refresh the current page in the user's browser
|
|
437
|
+
*/
|
|
438
|
+
readonly refreshPage: () => Promise<ToolResult>;
|
|
439
|
+
};
|
|
440
|
+
type DefaultToolName = keyof typeof DEFAULT_TOOLS;
|
|
441
|
+
declare const DEFAULT_TOOL_NAMES: DefaultToolName[];
|
|
442
|
+
|
|
443
|
+
export { type ActiveWorkflow, type Citation, type ContextData, type Conversation, ConversationManager, CrowClient, type CrowClientConfig, type CrowEventCallbacks, DEFAULT_TOOLS, DEFAULT_TOOL_NAMES, type DefaultToolName, type IdentifyOptions, IdentityManager, type IdentityState, type Message, type StreamEvent, type ToolHandler, type ToolHandlers, ToolManager, type ToolResult, type WorkflowTodo, parseSSEChunk, parseSSEData, streamResponse };
|
package/dist/index.js
CHANGED
|
@@ -440,6 +440,22 @@ async function* streamResponse(response, signal) {
|
|
|
440
440
|
}
|
|
441
441
|
}
|
|
442
442
|
|
|
443
|
+
// src/defaultTools.ts
|
|
444
|
+
var DEFAULT_TOOLS = {
|
|
445
|
+
/**
|
|
446
|
+
* Refresh the current page in the user's browser
|
|
447
|
+
*/
|
|
448
|
+
refreshPage: async () => {
|
|
449
|
+
try {
|
|
450
|
+
window.location.reload();
|
|
451
|
+
return { status: "success", data: { message: "Page refresh initiated" } };
|
|
452
|
+
} catch (error) {
|
|
453
|
+
return { status: "error", error: String(error) };
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
var DEFAULT_TOOL_NAMES = Object.keys(DEFAULT_TOOLS);
|
|
458
|
+
|
|
443
459
|
// src/CrowClient.ts
|
|
444
460
|
var DEFAULT_API_URL = "https://api.usecrow.org";
|
|
445
461
|
var DEFAULT_MODEL = "claude-sonnet-4-20250514";
|
|
@@ -465,6 +481,8 @@ var CrowClient = class {
|
|
|
465
481
|
this.config.productId,
|
|
466
482
|
this.config.apiUrl
|
|
467
483
|
);
|
|
484
|
+
this.tools.register(DEFAULT_TOOLS);
|
|
485
|
+
console.log("[Crow] Default tools registered:", DEFAULT_TOOL_NAMES.join(", "));
|
|
468
486
|
this.identity.subscribe((state) => {
|
|
469
487
|
this.callbacks.onVerificationStatus?.(state.isVerified);
|
|
470
488
|
});
|
|
@@ -831,6 +849,6 @@ var CrowClient = class {
|
|
|
831
849
|
}
|
|
832
850
|
};
|
|
833
851
|
|
|
834
|
-
export { ConversationManager, CrowClient, IdentityManager, ToolManager, parseSSEChunk, parseSSEData, streamResponse };
|
|
852
|
+
export { ConversationManager, CrowClient, DEFAULT_TOOLS, DEFAULT_TOOL_NAMES, IdentityManager, ToolManager, parseSSEChunk, parseSSEData, streamResponse };
|
|
835
853
|
//# sourceMappingURL=index.js.map
|
|
836
854
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/identity.ts","../src/tools.ts","../src/conversations.ts","../src/streaming.ts","../src/CrowClient.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Identity management for user authentication\n */\n\nimport type { IdentifyOptions, IdentityState } from './types';\n\nexport class IdentityManager {\n private state: IdentityState = {\n token: null,\n metadata: {},\n isVerified: false,\n };\n\n private listeners: Set<(state: IdentityState) => void> = new Set();\n\n /**\n * Identify the current user with a JWT token\n */\n identify(options: IdentifyOptions): void {\n const { token, ...metadata } = options;\n\n this.state = {\n token,\n metadata,\n isVerified: false, // Will be set when server confirms\n };\n\n this.notify();\n console.log('[Crow] User identified');\n }\n\n /**\n * Update verification status (called when server confirms)\n */\n setVerified(isVerified: boolean): void {\n this.state = { ...this.state, isVerified };\n this.notify();\n }\n\n /**\n * Reset user identity (call on logout)\n */\n reset(): void {\n this.state = {\n token: null,\n metadata: {},\n isVerified: false,\n };\n this.notify();\n console.log('[Crow] User reset');\n }\n\n /**\n * Get current identity token\n */\n getToken(): string | null {\n return this.state.token;\n }\n\n /**\n * Get current identity state\n */\n getState(): IdentityState {\n return { ...this.state };\n }\n\n /**\n * Check if user is identified\n */\n isIdentified(): boolean {\n return this.state.token !== null;\n }\n\n /**\n * Check if user is verified\n */\n isVerified(): boolean {\n return this.state.isVerified;\n }\n\n /**\n * Subscribe to identity changes\n */\n subscribe(callback: (state: IdentityState) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n private notify(): void {\n const state = this.getState();\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n}\n\n","/**\n * Client-side tool management\n */\n\nimport type { ToolHandlers, ToolResult } from './types';\n\nexport class ToolManager {\n private handlers: ToolHandlers = {};\n\n /**\n * Register client-side tool handlers\n */\n register(tools: ToolHandlers): void {\n for (const [name, handler] of Object.entries(tools)) {\n if (typeof handler === 'function') {\n this.handlers[name] = handler;\n console.log(`[Crow] Registered client tool: ${name}`);\n } else {\n console.warn(`[Crow] Skipping ${name}: handler is not a function`);\n }\n }\n }\n\n /**\n * Unregister a tool handler\n */\n unregister(name: string): void {\n delete this.handlers[name];\n console.log(`[Crow] Unregistered client tool: ${name}`);\n }\n\n /**\n * Check if a tool is registered\n */\n has(name: string): boolean {\n return name in this.handlers;\n }\n\n /**\n * Get all registered tool names\n */\n getRegisteredTools(): string[] {\n return Object.keys(this.handlers);\n }\n\n /**\n * Execute a client-side tool\n */\n async execute(name: string, args: Record<string, unknown>): Promise<ToolResult> {\n const handler = this.handlers[name];\n\n if (!handler) {\n console.warn(`[Crow] No handler registered for tool: ${name}`);\n return {\n status: 'error',\n error: `No handler registered for tool: ${name}`,\n };\n }\n\n try {\n console.log(`[Crow] Executing client tool: ${name}`, args);\n const result = await handler(args);\n console.log(`[Crow] Tool ${name} completed:`, result);\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[Crow] Tool ${name} failed:`, error);\n return {\n status: 'error',\n error: errorMessage,\n };\n }\n }\n}\n\n","/**\n * Conversation management\n */\n\nimport type { Conversation, Message } from './types';\n\nconst STORAGE_KEY_PREFIX = 'crow_conv_';\n\nexport class ConversationManager {\n private productId: string;\n private apiUrl: string;\n private currentId: string | null = null;\n\n constructor(productId: string, apiUrl: string) {\n this.productId = productId;\n this.apiUrl = apiUrl;\n\n // Try to restore from localStorage\n this.currentId = this.loadFromStorage();\n }\n\n /**\n * Get localStorage key for this product\n */\n private getStorageKey(): string {\n return `${STORAGE_KEY_PREFIX}${this.productId}`;\n }\n\n /**\n * Load conversation ID from localStorage\n */\n private loadFromStorage(): string | null {\n try {\n return localStorage.getItem(this.getStorageKey());\n } catch {\n return null;\n }\n }\n\n /**\n * Save conversation ID to localStorage\n */\n private saveToStorage(id: string): void {\n try {\n localStorage.setItem(this.getStorageKey(), id);\n } catch {\n // localStorage may be unavailable\n }\n }\n\n /**\n * Clear conversation ID from localStorage\n */\n private clearStorage(): void {\n try {\n localStorage.removeItem(this.getStorageKey());\n } catch {\n // localStorage may be unavailable\n }\n }\n\n /**\n * Get current conversation ID\n */\n getCurrentId(): string | null {\n return this.currentId;\n }\n\n /**\n * Set current conversation ID\n */\n setCurrentId(id: string | null): void {\n this.currentId = id;\n if (id) {\n this.saveToStorage(id);\n } else {\n this.clearStorage();\n }\n }\n\n /**\n * Check if there's a restored conversation\n */\n hasRestoredConversation(): boolean {\n return this.currentId !== null;\n }\n\n /**\n * Clear current conversation (start new)\n */\n clear(): void {\n this.currentId = null;\n this.clearStorage();\n }\n\n /**\n * Fetch list of conversations for verified user\n */\n async getConversations(identityToken: string): Promise<Conversation[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations?product_id=${this.productId}&identity_token=${encodeURIComponent(identityToken)}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return data.conversations || [];\n } catch (error) {\n console.error('[Crow] Failed to load conversations:', error);\n return [];\n }\n }\n\n /**\n * Load conversation history for verified user\n */\n async loadHistory(\n conversationId: string,\n identityToken: string\n ): Promise<Message[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations/${conversationId}/history?product_id=${this.productId}&identity_token=${encodeURIComponent(identityToken)}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return this.parseHistoryMessages(data.messages || []);\n } catch (error) {\n console.error('[Crow] Failed to load conversation history:', error);\n return [];\n }\n }\n\n /**\n * Load conversation history for anonymous user\n */\n async loadAnonymousHistory(conversationId: string): Promise<Message[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations/${conversationId}/history/anonymous?product_id=${this.productId}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return this.parseHistoryMessages(data.messages || []);\n } catch (error) {\n console.error('[Crow] Failed to load anonymous conversation history:', error);\n return [];\n }\n }\n\n /**\n * Parse history messages from API format\n */\n private parseHistoryMessages(\n messages: Array<{ role: string; content: string }>\n ): Message[] {\n return messages\n .filter((msg) => msg.role !== \"tool\" && !msg.content.startsWith(\"[Client Tool Result:\"))\n .map((msg, idx) => ({\n id: `history-${idx}`,\n content: this.parseContent(msg.content),\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n timestamp: new Date(),\n }));\n }\n\n /**\n * Parse structured content (with thinking/text blocks) and extract just text\n */\n private parseContent(content: string): string {\n // Try JSON first\n try {\n const parsed = JSON.parse(content);\n if (Array.isArray(parsed)) {\n const textBlock = parsed.find(\n (b: { type: string; text?: string }) => b.type === 'text'\n );\n return textBlock?.text || content;\n }\n } catch {\n /* not valid JSON */\n }\n\n // Fallback: extract text block from Python-style repr\n if (content.includes(\"'type': 'text'\")) {\n const textBlockMatch = content.match(\n /\\{'text':\\s*'((?:[^'\\\\]|\\\\.)*)'\\s*,\\s*'type':\\s*'text'/\n );\n if (textBlockMatch) {\n return textBlockMatch[1].replace(/\\\\n/g, '\\n').replace(/\\\\'/g, \"'\");\n }\n }\n\n return content;\n }\n}\n\n","/**\n * SSE streaming utilities for parsing server-sent events\n */\n\nimport type { StreamEvent, Citation, WorkflowTodo } from './types';\n\n/**\n * Parse a single SSE data line into a StreamEvent\n */\nexport function parseSSEData(data: string): StreamEvent | null {\n if (data === '[DONE]') {\n return { type: 'done' };\n }\n\n try {\n const parsed = JSON.parse(data);\n\n switch (parsed.type) {\n case 'verification_status':\n return {\n type: 'verification_status',\n isVerified: parsed.is_verified === true,\n };\n\n case 'conversation_id':\n return {\n type: 'conversation_id',\n conversationId: parsed.conversation_id,\n };\n\n case 'thinking':\n if (parsed.status === 'complete') {\n return { type: 'thinking_complete' };\n }\n return null;\n\n case 'thinking_token':\n return {\n type: 'thinking',\n content: parsed.content || '',\n };\n\n case 'content':\n return {\n type: 'content',\n text: parsed.content || '',\n accumulated: '', // Will be set by caller\n };\n\n case 'citations':\n return {\n type: 'citations',\n citations: parsed.citations as Citation[],\n };\n\n case 'error':\n return {\n type: 'error',\n message: parsed.message || 'Unknown error',\n };\n\n case 'tool_call_start':\n return {\n type: 'tool_call_start',\n toolName: parsed.tool_name,\n arguments: parsed.arguments || {},\n };\n\n case 'tool_call_complete':\n return {\n type: 'tool_call_complete',\n toolName: parsed.tool_name,\n success: parsed.success,\n };\n\n case 'client_tool_call':\n return {\n type: 'client_tool_call',\n toolName: parsed.tool_name,\n arguments: parsed.arguments || {},\n };\n\n case 'workflow_started':\n return {\n type: 'workflow_started',\n name: parsed.name,\n todos: parsed.todos as WorkflowTodo[],\n };\n\n case 'todo_updated':\n return {\n type: 'workflow_todo_updated',\n todoId: parsed.id,\n status: parsed.status,\n };\n\n case 'workflow_ended':\n return { type: 'workflow_ended' };\n\n case 'workflow_complete_prompt':\n return { type: 'workflow_complete_prompt' };\n\n default:\n return null;\n }\n } catch {\n console.error('[Crow] Failed to parse SSE data:', data);\n return null;\n }\n}\n\n/**\n * Parse SSE chunk into lines and extract data\n */\nexport function* parseSSEChunk(chunk: string): Generator<string> {\n const lines = chunk.split('\\n');\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n yield line.slice(6).trim();\n }\n }\n}\n\n/**\n * Create an async generator that streams events from a Response\n */\nexport async function* streamResponse(\n response: Response,\n signal?: AbortSignal\n): AsyncGenerator<StreamEvent> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let accumulatedContent = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n reader.cancel();\n return;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n\n for (const data of parseSSEChunk(chunk)) {\n const event = parseSSEData(data);\n if (event) {\n // Track accumulated content for content events\n if (event.type === 'content') {\n accumulatedContent += event.text;\n yield { ...event, accumulated: accumulatedContent };\n } else {\n yield event;\n }\n\n // Stop on done\n if (event.type === 'done') {\n return;\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n","/**\n * CrowClient - Main headless client for Crow AI agents\n */\n\nimport { IdentityManager } from './identity';\nimport { ToolManager } from './tools';\nimport { ConversationManager } from './conversations';\nimport { streamResponse } from './streaming';\nimport type {\n CrowClientConfig,\n IdentifyOptions,\n Message,\n StreamEvent,\n ToolHandlers,\n Conversation,\n ContextData,\n CrowEventCallbacks,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.usecrow.org';\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\nexport class CrowClient {\n private config: Required<CrowClientConfig>;\n private identity: IdentityManager;\n private tools: ToolManager;\n private conversations: ConversationManager;\n private context: ContextData = {};\n private abortController: AbortController | null = null;\n private callbacks: CrowEventCallbacks = {};\n\n // Message state\n private _messages: Message[] = [];\n private messageListeners: Set<(messages: Message[]) => void> = new Set();\n\n // Loading state\n private _isLoading = false;\n private loadingListeners: Set<(isLoading: boolean) => void> = new Set();\n\n constructor(config: CrowClientConfig) {\n this.config = {\n productId: config.productId,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n model: config.model || DEFAULT_MODEL,\n };\n\n this.identity = new IdentityManager();\n this.tools = new ToolManager();\n this.conversations = new ConversationManager(\n this.config.productId,\n this.config.apiUrl\n );\n\n // Subscribe to identity changes for verification status\n this.identity.subscribe((state) => {\n this.callbacks.onVerificationStatus?.(state.isVerified);\n });\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Get current product ID\n */\n get productId(): string {\n return this.config.productId;\n }\n\n /**\n * Get current API URL\n */\n get apiUrl(): string {\n return this.config.apiUrl;\n }\n\n /**\n * Get/set current model\n */\n get model(): string {\n return this.config.model;\n }\n\n set model(value: string) {\n this.config.model = value;\n }\n\n // ============================================================================\n // Event Callbacks\n // ============================================================================\n\n /**\n * Register event callbacks\n */\n on(callbacks: CrowEventCallbacks): void {\n this.callbacks = { ...this.callbacks, ...callbacks };\n }\n\n // ============================================================================\n // Identity\n // ============================================================================\n\n /**\n * Identify the current user with a JWT token\n */\n identify(options: IdentifyOptions): void {\n this.identity.identify(options);\n }\n\n /**\n * Reset user identity (call on logout)\n */\n resetUser(): void {\n this.identity.reset();\n this.clearMessages();\n }\n\n /**\n * Check if user is identified\n */\n isIdentified(): boolean {\n return this.identity.isIdentified();\n }\n\n /**\n * Check if user is verified by server\n */\n isVerified(): boolean {\n return this.identity.isVerified();\n }\n\n // ============================================================================\n // Tools\n // ============================================================================\n\n /**\n * Register client-side tool handlers\n */\n registerTools(tools: ToolHandlers): void {\n this.tools.register(tools);\n }\n\n /**\n * Unregister a tool handler\n */\n unregisterTool(name: string): void {\n this.tools.unregister(name);\n }\n\n /**\n * Get list of registered tool names\n */\n getRegisteredTools(): string[] {\n return this.tools.getRegisteredTools();\n }\n\n // ============================================================================\n // Context\n // ============================================================================\n\n /**\n * Set context data to be sent with messages\n */\n setContext(data: ContextData): void {\n this.context = { ...this.context, ...data };\n }\n\n /**\n * Clear context data\n */\n clearContext(): void {\n this.context = {};\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n /**\n * Get current messages\n */\n get messages(): Message[] {\n return [...this._messages];\n }\n\n /**\n * Check if currently loading/streaming\n */\n get isLoading(): boolean {\n return this._isLoading;\n }\n\n /**\n * Subscribe to message changes\n */\n onMessages(callback: (messages: Message[]) => void): () => void {\n this.messageListeners.add(callback);\n return () => this.messageListeners.delete(callback);\n }\n\n /**\n * Subscribe to loading state changes\n */\n onLoading(callback: (isLoading: boolean) => void): () => void {\n this.loadingListeners.add(callback);\n return () => this.loadingListeners.delete(callback);\n }\n\n /**\n * Clear all messages and start new conversation\n */\n clearMessages(): void {\n this._messages = [];\n this.conversations.clear();\n this.notifyMessages();\n }\n\n /**\n * Load messages from history\n */\n loadMessages(messages: Message[]): void {\n this._messages = messages;\n this.notifyMessages();\n }\n\n private notifyMessages(): void {\n const messages = this.messages;\n for (const listener of this.messageListeners) {\n listener(messages);\n }\n }\n\n private setLoading(isLoading: boolean): void {\n this._isLoading = isLoading;\n for (const listener of this.loadingListeners) {\n listener(isLoading);\n }\n }\n\n private addMessage(message: Message): void {\n this._messages = [...this._messages, message];\n this.notifyMessages();\n this.callbacks.onMessage?.(message);\n }\n\n private updateMessage(id: string, updates: Partial<Message>): void {\n this._messages = this._messages.map((msg) =>\n msg.id === id ? { ...msg, ...updates } : msg\n );\n this.notifyMessages();\n this.callbacks.onMessageUpdate?.(id, updates);\n }\n\n private generateMessageId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n // ============================================================================\n // Conversations\n // ============================================================================\n\n /**\n * Get current conversation ID\n */\n get conversationId(): string | null {\n return this.conversations.getCurrentId();\n }\n\n /**\n * Set current conversation ID\n */\n set conversationId(id: string | null) {\n this.conversations.setCurrentId(id);\n }\n\n /**\n * Get list of conversations for verified user\n */\n async getConversations(): Promise<Conversation[]> {\n const token = this.identity.getToken();\n if (!token) {\n console.warn('[Crow] Cannot get conversations: user not identified');\n return [];\n }\n return this.conversations.getConversations(token);\n }\n\n /**\n * Load conversation history\n */\n async loadHistory(conversationId: string): Promise<Message[]> {\n const token = this.identity.getToken();\n if (token) {\n return this.conversations.loadHistory(conversationId, token);\n }\n return this.conversations.loadAnonymousHistory(conversationId);\n }\n\n /**\n * Switch to a different conversation\n */\n async switchConversation(conversationId: string): Promise<void> {\n const messages = await this.loadHistory(conversationId);\n this.conversations.setCurrentId(conversationId);\n this.loadMessages(messages);\n }\n\n // ============================================================================\n // Messaging\n // ============================================================================\n\n /**\n * Send a message and receive streaming response\n * Returns an async generator of stream events\n */\n async *sendMessage(content: string): AsyncGenerator<StreamEvent> {\n if (!content.trim()) {\n return;\n }\n\n // Create and add user message\n const userMsgId = this.generateMessageId('user');\n this.addMessage({\n id: userMsgId,\n content,\n role: 'user',\n timestamp: new Date(),\n });\n\n // Create placeholder for assistant message\n const botMsgId = this.generateMessageId('assistant');\n this.addMessage({\n id: botMsgId,\n content: '',\n role: 'assistant',\n timestamp: new Date(),\n });\n\n this.setLoading(true);\n this.abortController = new AbortController();\n\n let accumulatedContent = '';\n let accumulatedThinking = '';\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/chat/message`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n product_id: this.config.productId,\n message: content,\n conversation_id: this.conversations.getCurrentId(),\n identity_token: this.identity.getToken(),\n model: this.config.model,\n context: Object.keys(this.context).length > 0 ? this.context : undefined,\n }),\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n for await (const event of streamResponse(response, this.abortController.signal)) {\n // Handle event and update state\n switch (event.type) {\n case 'content':\n accumulatedContent = event.accumulated;\n this.updateMessage(botMsgId, { content: accumulatedContent });\n break;\n\n case 'thinking':\n accumulatedThinking += event.content;\n this.updateMessage(botMsgId, { thinking: accumulatedThinking });\n break;\n\n case 'thinking_complete':\n this.updateMessage(botMsgId, { thinkingComplete: true });\n break;\n\n case 'citations':\n this.updateMessage(botMsgId, { citations: event.citations });\n break;\n\n case 'verification_status':\n this.identity.setVerified(event.isVerified);\n break;\n\n case 'conversation_id':\n this.conversations.setCurrentId(event.conversationId);\n break;\n\n case 'client_tool_call':\n // Execute client tool and get result\n // TODO: Send result back to server when bidirectional tool calls are implemented\n await this.tools.execute(event.toolName, event.arguments);\n this.callbacks.onToolCall?.(event);\n break;\n\n case 'tool_call_start':\n case 'tool_call_complete':\n this.callbacks.onToolCall?.(event);\n break;\n\n case 'workflow_started':\n case 'workflow_todo_updated':\n case 'workflow_ended':\n case 'workflow_complete_prompt':\n this.callbacks.onWorkflow?.(event);\n break;\n\n case 'error':\n this.updateMessage(botMsgId, { content: event.message });\n this.callbacks.onError?.(new Error(event.message));\n break;\n }\n\n yield event;\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // User stopped - keep accumulated text or remove message\n if (accumulatedContent) {\n this.updateMessage(botMsgId, { content: accumulatedContent });\n } else {\n this._messages = this._messages.filter((msg) => msg.id !== botMsgId);\n this.notifyMessages();\n }\n return;\n }\n\n console.error('[Crow] Error:', error);\n this.updateMessage(botMsgId, {\n content: 'Sorry, I encountered an error. Please try again.',\n });\n this.callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n } finally {\n this.setLoading(false);\n this.abortController = null;\n }\n }\n\n /**\n * Send a message and wait for complete response (non-streaming)\n */\n async send(content: string): Promise<Message | null> {\n let lastMessage: Message | null = null;\n\n for await (const event of this.sendMessage(content)) {\n if (event.type === 'done') {\n break;\n }\n }\n\n // Return the assistant message\n const messages = this.messages;\n if (messages.length > 0) {\n lastMessage = messages[messages.length - 1];\n if (lastMessage.role === 'assistant') {\n return lastMessage;\n }\n }\n\n return null;\n }\n\n /**\n * Stop current generation\n */\n stop(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.setLoading(false);\n }\n }\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n /**\n * Destroy the client and clean up resources\n */\n destroy(): void {\n this.stop();\n this.messageListeners.clear();\n this.loadingListeners.clear();\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/identity.ts","../src/tools.ts","../src/conversations.ts","../src/streaming.ts","../src/defaultTools.ts","../src/CrowClient.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Identity management for user authentication\n */\n\nimport type { IdentifyOptions, IdentityState } from './types';\n\nexport class IdentityManager {\n private state: IdentityState = {\n token: null,\n metadata: {},\n isVerified: false,\n };\n\n private listeners: Set<(state: IdentityState) => void> = new Set();\n\n /**\n * Identify the current user with a JWT token\n */\n identify(options: IdentifyOptions): void {\n const { token, ...metadata } = options;\n\n this.state = {\n token,\n metadata,\n isVerified: false, // Will be set when server confirms\n };\n\n this.notify();\n console.log('[Crow] User identified');\n }\n\n /**\n * Update verification status (called when server confirms)\n */\n setVerified(isVerified: boolean): void {\n this.state = { ...this.state, isVerified };\n this.notify();\n }\n\n /**\n * Reset user identity (call on logout)\n */\n reset(): void {\n this.state = {\n token: null,\n metadata: {},\n isVerified: false,\n };\n this.notify();\n console.log('[Crow] User reset');\n }\n\n /**\n * Get current identity token\n */\n getToken(): string | null {\n return this.state.token;\n }\n\n /**\n * Get current identity state\n */\n getState(): IdentityState {\n return { ...this.state };\n }\n\n /**\n * Check if user is identified\n */\n isIdentified(): boolean {\n return this.state.token !== null;\n }\n\n /**\n * Check if user is verified\n */\n isVerified(): boolean {\n return this.state.isVerified;\n }\n\n /**\n * Subscribe to identity changes\n */\n subscribe(callback: (state: IdentityState) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n private notify(): void {\n const state = this.getState();\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n}\n\n","/**\n * Client-side tool management\n */\n\nimport type { ToolHandlers, ToolResult } from './types';\n\nexport class ToolManager {\n private handlers: ToolHandlers = {};\n\n /**\n * Register client-side tool handlers\n */\n register(tools: ToolHandlers): void {\n for (const [name, handler] of Object.entries(tools)) {\n if (typeof handler === 'function') {\n this.handlers[name] = handler;\n console.log(`[Crow] Registered client tool: ${name}`);\n } else {\n console.warn(`[Crow] Skipping ${name}: handler is not a function`);\n }\n }\n }\n\n /**\n * Unregister a tool handler\n */\n unregister(name: string): void {\n delete this.handlers[name];\n console.log(`[Crow] Unregistered client tool: ${name}`);\n }\n\n /**\n * Check if a tool is registered\n */\n has(name: string): boolean {\n return name in this.handlers;\n }\n\n /**\n * Get all registered tool names\n */\n getRegisteredTools(): string[] {\n return Object.keys(this.handlers);\n }\n\n /**\n * Execute a client-side tool\n */\n async execute(name: string, args: Record<string, unknown>): Promise<ToolResult> {\n const handler = this.handlers[name];\n\n if (!handler) {\n console.warn(`[Crow] No handler registered for tool: ${name}`);\n return {\n status: 'error',\n error: `No handler registered for tool: ${name}`,\n };\n }\n\n try {\n console.log(`[Crow] Executing client tool: ${name}`, args);\n const result = await handler(args);\n console.log(`[Crow] Tool ${name} completed:`, result);\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[Crow] Tool ${name} failed:`, error);\n return {\n status: 'error',\n error: errorMessage,\n };\n }\n }\n}\n\n","/**\n * Conversation management\n */\n\nimport type { Conversation, Message } from './types';\n\nconst STORAGE_KEY_PREFIX = 'crow_conv_';\n\nexport class ConversationManager {\n private productId: string;\n private apiUrl: string;\n private currentId: string | null = null;\n\n constructor(productId: string, apiUrl: string) {\n this.productId = productId;\n this.apiUrl = apiUrl;\n\n // Try to restore from localStorage\n this.currentId = this.loadFromStorage();\n }\n\n /**\n * Get localStorage key for this product\n */\n private getStorageKey(): string {\n return `${STORAGE_KEY_PREFIX}${this.productId}`;\n }\n\n /**\n * Load conversation ID from localStorage\n */\n private loadFromStorage(): string | null {\n try {\n return localStorage.getItem(this.getStorageKey());\n } catch {\n return null;\n }\n }\n\n /**\n * Save conversation ID to localStorage\n */\n private saveToStorage(id: string): void {\n try {\n localStorage.setItem(this.getStorageKey(), id);\n } catch {\n // localStorage may be unavailable\n }\n }\n\n /**\n * Clear conversation ID from localStorage\n */\n private clearStorage(): void {\n try {\n localStorage.removeItem(this.getStorageKey());\n } catch {\n // localStorage may be unavailable\n }\n }\n\n /**\n * Get current conversation ID\n */\n getCurrentId(): string | null {\n return this.currentId;\n }\n\n /**\n * Set current conversation ID\n */\n setCurrentId(id: string | null): void {\n this.currentId = id;\n if (id) {\n this.saveToStorage(id);\n } else {\n this.clearStorage();\n }\n }\n\n /**\n * Check if there's a restored conversation\n */\n hasRestoredConversation(): boolean {\n return this.currentId !== null;\n }\n\n /**\n * Clear current conversation (start new)\n */\n clear(): void {\n this.currentId = null;\n this.clearStorage();\n }\n\n /**\n * Fetch list of conversations for verified user\n */\n async getConversations(identityToken: string): Promise<Conversation[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations?product_id=${this.productId}&identity_token=${encodeURIComponent(identityToken)}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return data.conversations || [];\n } catch (error) {\n console.error('[Crow] Failed to load conversations:', error);\n return [];\n }\n }\n\n /**\n * Load conversation history for verified user\n */\n async loadHistory(\n conversationId: string,\n identityToken: string\n ): Promise<Message[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations/${conversationId}/history?product_id=${this.productId}&identity_token=${encodeURIComponent(identityToken)}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return this.parseHistoryMessages(data.messages || []);\n } catch (error) {\n console.error('[Crow] Failed to load conversation history:', error);\n return [];\n }\n }\n\n /**\n * Load conversation history for anonymous user\n */\n async loadAnonymousHistory(conversationId: string): Promise<Message[]> {\n try {\n const response = await fetch(\n `${this.apiUrl}/api/chat/conversations/${conversationId}/history/anonymous?product_id=${this.productId}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data = await response.json();\n return this.parseHistoryMessages(data.messages || []);\n } catch (error) {\n console.error('[Crow] Failed to load anonymous conversation history:', error);\n return [];\n }\n }\n\n /**\n * Parse history messages from API format\n */\n private parseHistoryMessages(\n messages: Array<{ role: string; content: string }>\n ): Message[] {\n return messages\n .filter((msg) => msg.role !== \"tool\" && !msg.content.startsWith(\"[Client Tool Result:\"))\n .map((msg, idx) => ({\n id: `history-${idx}`,\n content: this.parseContent(msg.content),\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n timestamp: new Date(),\n }));\n }\n\n /**\n * Parse structured content (with thinking/text blocks) and extract just text\n */\n private parseContent(content: string): string {\n // Try JSON first\n try {\n const parsed = JSON.parse(content);\n if (Array.isArray(parsed)) {\n const textBlock = parsed.find(\n (b: { type: string; text?: string }) => b.type === 'text'\n );\n return textBlock?.text || content;\n }\n } catch {\n /* not valid JSON */\n }\n\n // Fallback: extract text block from Python-style repr\n if (content.includes(\"'type': 'text'\")) {\n const textBlockMatch = content.match(\n /\\{'text':\\s*'((?:[^'\\\\]|\\\\.)*)'\\s*,\\s*'type':\\s*'text'/\n );\n if (textBlockMatch) {\n return textBlockMatch[1].replace(/\\\\n/g, '\\n').replace(/\\\\'/g, \"'\");\n }\n }\n\n return content;\n }\n}\n\n","/**\n * SSE streaming utilities for parsing server-sent events\n */\n\nimport type { StreamEvent, Citation, WorkflowTodo } from './types';\n\n/**\n * Parse a single SSE data line into a StreamEvent\n */\nexport function parseSSEData(data: string): StreamEvent | null {\n if (data === '[DONE]') {\n return { type: 'done' };\n }\n\n try {\n const parsed = JSON.parse(data);\n\n switch (parsed.type) {\n case 'verification_status':\n return {\n type: 'verification_status',\n isVerified: parsed.is_verified === true,\n };\n\n case 'conversation_id':\n return {\n type: 'conversation_id',\n conversationId: parsed.conversation_id,\n };\n\n case 'thinking':\n if (parsed.status === 'complete') {\n return { type: 'thinking_complete' };\n }\n return null;\n\n case 'thinking_token':\n return {\n type: 'thinking',\n content: parsed.content || '',\n };\n\n case 'content':\n return {\n type: 'content',\n text: parsed.content || '',\n accumulated: '', // Will be set by caller\n };\n\n case 'citations':\n return {\n type: 'citations',\n citations: parsed.citations as Citation[],\n };\n\n case 'error':\n return {\n type: 'error',\n message: parsed.message || 'Unknown error',\n };\n\n case 'tool_call_start':\n return {\n type: 'tool_call_start',\n toolName: parsed.tool_name,\n arguments: parsed.arguments || {},\n };\n\n case 'tool_call_complete':\n return {\n type: 'tool_call_complete',\n toolName: parsed.tool_name,\n success: parsed.success,\n };\n\n case 'client_tool_call':\n return {\n type: 'client_tool_call',\n toolName: parsed.tool_name,\n arguments: parsed.arguments || {},\n };\n\n case 'workflow_started':\n return {\n type: 'workflow_started',\n name: parsed.name,\n todos: parsed.todos as WorkflowTodo[],\n };\n\n case 'todo_updated':\n return {\n type: 'workflow_todo_updated',\n todoId: parsed.id,\n status: parsed.status,\n };\n\n case 'workflow_ended':\n return { type: 'workflow_ended' };\n\n case 'workflow_complete_prompt':\n return { type: 'workflow_complete_prompt' };\n\n default:\n return null;\n }\n } catch {\n console.error('[Crow] Failed to parse SSE data:', data);\n return null;\n }\n}\n\n/**\n * Parse SSE chunk into lines and extract data\n */\nexport function* parseSSEChunk(chunk: string): Generator<string> {\n const lines = chunk.split('\\n');\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n yield line.slice(6).trim();\n }\n }\n}\n\n/**\n * Create an async generator that streams events from a Response\n */\nexport async function* streamResponse(\n response: Response,\n signal?: AbortSignal\n): AsyncGenerator<StreamEvent> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let accumulatedContent = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n reader.cancel();\n return;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n\n for (const data of parseSSEChunk(chunk)) {\n const event = parseSSEData(data);\n if (event) {\n // Track accumulated content for content events\n if (event.type === 'content') {\n accumulatedContent += event.text;\n yield { ...event, accumulated: accumulatedContent };\n } else {\n yield event;\n }\n\n // Stop on done\n if (event.type === 'done') {\n return;\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n","/**\n * SDK Default Tools - automatically registered, zero configuration\n * \n * These tools are built into the Crow SDK and available to all agents\n * without any user configuration required.\n */\n\nimport type { ToolResult } from './types';\n\n/**\n * SDK Default Tools - automatically registered, zero configuration\n */\nexport const DEFAULT_TOOLS = {\n /**\n * Refresh the current page in the user's browser\n */\n refreshPage: async (): Promise<ToolResult> => {\n try {\n window.location.reload();\n return { status: 'success', data: { message: 'Page refresh initiated' } };\n } catch (error) {\n return { status: 'error', error: String(error) };\n }\n },\n} as const;\n\nexport type DefaultToolName = keyof typeof DEFAULT_TOOLS;\nexport const DEFAULT_TOOL_NAMES = Object.keys(DEFAULT_TOOLS) as DefaultToolName[];\n","/**\n * CrowClient - Main headless client for Crow AI agents\n */\n\nimport { IdentityManager } from './identity';\nimport { ToolManager } from './tools';\nimport { ConversationManager } from './conversations';\nimport { streamResponse } from './streaming';\nimport { DEFAULT_TOOLS, DEFAULT_TOOL_NAMES } from './defaultTools';\nimport type {\n CrowClientConfig,\n IdentifyOptions,\n Message,\n StreamEvent,\n ToolHandlers,\n Conversation,\n ContextData,\n CrowEventCallbacks,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.usecrow.org';\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\nexport class CrowClient {\n private config: Required<CrowClientConfig>;\n private identity: IdentityManager;\n private tools: ToolManager;\n private conversations: ConversationManager;\n private context: ContextData = {};\n private abortController: AbortController | null = null;\n private callbacks: CrowEventCallbacks = {};\n\n // Message state\n private _messages: Message[] = [];\n private messageListeners: Set<(messages: Message[]) => void> = new Set();\n\n // Loading state\n private _isLoading = false;\n private loadingListeners: Set<(isLoading: boolean) => void> = new Set();\n\n constructor(config: CrowClientConfig) {\n this.config = {\n productId: config.productId,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n model: config.model || DEFAULT_MODEL,\n };\n\n this.identity = new IdentityManager();\n this.tools = new ToolManager();\n this.conversations = new ConversationManager(\n this.config.productId,\n this.config.apiUrl\n );\n\n // Register SDK default tools (e.g., refreshPage)\n this.tools.register(DEFAULT_TOOLS);\n console.log('[Crow] Default tools registered:', DEFAULT_TOOL_NAMES.join(', '));\n\n // Subscribe to identity changes for verification status\n this.identity.subscribe((state) => {\n this.callbacks.onVerificationStatus?.(state.isVerified);\n });\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Get current product ID\n */\n get productId(): string {\n return this.config.productId;\n }\n\n /**\n * Get current API URL\n */\n get apiUrl(): string {\n return this.config.apiUrl;\n }\n\n /**\n * Get/set current model\n */\n get model(): string {\n return this.config.model;\n }\n\n set model(value: string) {\n this.config.model = value;\n }\n\n // ============================================================================\n // Event Callbacks\n // ============================================================================\n\n /**\n * Register event callbacks\n */\n on(callbacks: CrowEventCallbacks): void {\n this.callbacks = { ...this.callbacks, ...callbacks };\n }\n\n // ============================================================================\n // Identity\n // ============================================================================\n\n /**\n * Identify the current user with a JWT token\n */\n identify(options: IdentifyOptions): void {\n this.identity.identify(options);\n }\n\n /**\n * Reset user identity (call on logout)\n */\n resetUser(): void {\n this.identity.reset();\n this.clearMessages();\n }\n\n /**\n * Check if user is identified\n */\n isIdentified(): boolean {\n return this.identity.isIdentified();\n }\n\n /**\n * Check if user is verified by server\n */\n isVerified(): boolean {\n return this.identity.isVerified();\n }\n\n // ============================================================================\n // Tools\n // ============================================================================\n\n /**\n * Register client-side tool handlers\n */\n registerTools(tools: ToolHandlers): void {\n this.tools.register(tools);\n }\n\n /**\n * Unregister a tool handler\n */\n unregisterTool(name: string): void {\n this.tools.unregister(name);\n }\n\n /**\n * Get list of registered tool names\n */\n getRegisteredTools(): string[] {\n return this.tools.getRegisteredTools();\n }\n\n // ============================================================================\n // Context\n // ============================================================================\n\n /**\n * Set context data to be sent with messages\n */\n setContext(data: ContextData): void {\n this.context = { ...this.context, ...data };\n }\n\n /**\n * Clear context data\n */\n clearContext(): void {\n this.context = {};\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n /**\n * Get current messages\n */\n get messages(): Message[] {\n return [...this._messages];\n }\n\n /**\n * Check if currently loading/streaming\n */\n get isLoading(): boolean {\n return this._isLoading;\n }\n\n /**\n * Subscribe to message changes\n */\n onMessages(callback: (messages: Message[]) => void): () => void {\n this.messageListeners.add(callback);\n return () => this.messageListeners.delete(callback);\n }\n\n /**\n * Subscribe to loading state changes\n */\n onLoading(callback: (isLoading: boolean) => void): () => void {\n this.loadingListeners.add(callback);\n return () => this.loadingListeners.delete(callback);\n }\n\n /**\n * Clear all messages and start new conversation\n */\n clearMessages(): void {\n this._messages = [];\n this.conversations.clear();\n this.notifyMessages();\n }\n\n /**\n * Load messages from history\n */\n loadMessages(messages: Message[]): void {\n this._messages = messages;\n this.notifyMessages();\n }\n\n private notifyMessages(): void {\n const messages = this.messages;\n for (const listener of this.messageListeners) {\n listener(messages);\n }\n }\n\n private setLoading(isLoading: boolean): void {\n this._isLoading = isLoading;\n for (const listener of this.loadingListeners) {\n listener(isLoading);\n }\n }\n\n private addMessage(message: Message): void {\n this._messages = [...this._messages, message];\n this.notifyMessages();\n this.callbacks.onMessage?.(message);\n }\n\n private updateMessage(id: string, updates: Partial<Message>): void {\n this._messages = this._messages.map((msg) =>\n msg.id === id ? { ...msg, ...updates } : msg\n );\n this.notifyMessages();\n this.callbacks.onMessageUpdate?.(id, updates);\n }\n\n private generateMessageId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n // ============================================================================\n // Conversations\n // ============================================================================\n\n /**\n * Get current conversation ID\n */\n get conversationId(): string | null {\n return this.conversations.getCurrentId();\n }\n\n /**\n * Set current conversation ID\n */\n set conversationId(id: string | null) {\n this.conversations.setCurrentId(id);\n }\n\n /**\n * Get list of conversations for verified user\n */\n async getConversations(): Promise<Conversation[]> {\n const token = this.identity.getToken();\n if (!token) {\n console.warn('[Crow] Cannot get conversations: user not identified');\n return [];\n }\n return this.conversations.getConversations(token);\n }\n\n /**\n * Load conversation history\n */\n async loadHistory(conversationId: string): Promise<Message[]> {\n const token = this.identity.getToken();\n if (token) {\n return this.conversations.loadHistory(conversationId, token);\n }\n return this.conversations.loadAnonymousHistory(conversationId);\n }\n\n /**\n * Switch to a different conversation\n */\n async switchConversation(conversationId: string): Promise<void> {\n const messages = await this.loadHistory(conversationId);\n this.conversations.setCurrentId(conversationId);\n this.loadMessages(messages);\n }\n\n // ============================================================================\n // Messaging\n // ============================================================================\n\n /**\n * Send a message and receive streaming response\n * Returns an async generator of stream events\n */\n async *sendMessage(content: string): AsyncGenerator<StreamEvent> {\n if (!content.trim()) {\n return;\n }\n\n // Create and add user message\n const userMsgId = this.generateMessageId('user');\n this.addMessage({\n id: userMsgId,\n content,\n role: 'user',\n timestamp: new Date(),\n });\n\n // Create placeholder for assistant message\n const botMsgId = this.generateMessageId('assistant');\n this.addMessage({\n id: botMsgId,\n content: '',\n role: 'assistant',\n timestamp: new Date(),\n });\n\n this.setLoading(true);\n this.abortController = new AbortController();\n\n let accumulatedContent = '';\n let accumulatedThinking = '';\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/chat/message`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n product_id: this.config.productId,\n message: content,\n conversation_id: this.conversations.getCurrentId(),\n identity_token: this.identity.getToken(),\n model: this.config.model,\n context: Object.keys(this.context).length > 0 ? this.context : undefined,\n }),\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n for await (const event of streamResponse(response, this.abortController.signal)) {\n // Handle event and update state\n switch (event.type) {\n case 'content':\n accumulatedContent = event.accumulated;\n this.updateMessage(botMsgId, { content: accumulatedContent });\n break;\n\n case 'thinking':\n accumulatedThinking += event.content;\n this.updateMessage(botMsgId, { thinking: accumulatedThinking });\n break;\n\n case 'thinking_complete':\n this.updateMessage(botMsgId, { thinkingComplete: true });\n break;\n\n case 'citations':\n this.updateMessage(botMsgId, { citations: event.citations });\n break;\n\n case 'verification_status':\n this.identity.setVerified(event.isVerified);\n break;\n\n case 'conversation_id':\n this.conversations.setCurrentId(event.conversationId);\n break;\n\n case 'client_tool_call':\n // Execute client tool and get result\n // TODO: Send result back to server when bidirectional tool calls are implemented\n await this.tools.execute(event.toolName, event.arguments);\n this.callbacks.onToolCall?.(event);\n break;\n\n case 'tool_call_start':\n case 'tool_call_complete':\n this.callbacks.onToolCall?.(event);\n break;\n\n case 'workflow_started':\n case 'workflow_todo_updated':\n case 'workflow_ended':\n case 'workflow_complete_prompt':\n this.callbacks.onWorkflow?.(event);\n break;\n\n case 'error':\n this.updateMessage(botMsgId, { content: event.message });\n this.callbacks.onError?.(new Error(event.message));\n break;\n }\n\n yield event;\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // User stopped - keep accumulated text or remove message\n if (accumulatedContent) {\n this.updateMessage(botMsgId, { content: accumulatedContent });\n } else {\n this._messages = this._messages.filter((msg) => msg.id !== botMsgId);\n this.notifyMessages();\n }\n return;\n }\n\n console.error('[Crow] Error:', error);\n this.updateMessage(botMsgId, {\n content: 'Sorry, I encountered an error. Please try again.',\n });\n this.callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n } finally {\n this.setLoading(false);\n this.abortController = null;\n }\n }\n\n /**\n * Send a message and wait for complete response (non-streaming)\n */\n async send(content: string): Promise<Message | null> {\n let lastMessage: Message | null = null;\n\n for await (const event of this.sendMessage(content)) {\n if (event.type === 'done') {\n break;\n }\n }\n\n // Return the assistant message\n const messages = this.messages;\n if (messages.length > 0) {\n lastMessage = messages[messages.length - 1];\n if (lastMessage.role === 'assistant') {\n return lastMessage;\n }\n }\n\n return null;\n }\n\n /**\n * Stop current generation\n */\n stop(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.setLoading(false);\n }\n }\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n /**\n * Destroy the client and clean up resources\n */\n destroy(): void {\n this.stop();\n this.messageListeners.clear();\n this.loadingListeners.clear();\n }\n}\n\n"]}
|