@moltium/core 0.1.28 → 0.1.30
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/AgentWallet-WSXDC5NX.mjs +7 -0
- package/dist/AgentWallet-WSXDC5NX.mjs.map +1 -0
- package/dist/chunk-K2UFQ7YF.mjs +197 -0
- package/dist/chunk-K2UFQ7YF.mjs.map +1 -0
- package/dist/index.d.cts +67 -3
- package/dist/index.d.ts +67 -3
- package/dist/index.js +415 -129
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +192 -128
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/logger.ts","../src/agent/scheduler.ts","../src/actions/registry.ts","../src/actions/ActionHandler.ts","../src/actions/built-in/social.ts","../src/actions/built-in/moltbook.ts","../src/actions/built-in/world.ts","../src/actions/built-in/index.ts","../src/llm/prompt.ts","../src/actions/interpreter.ts","../src/memory/Memory.ts","../src/memory/shortterm.ts","../src/llm/anthropic.ts","../src/llm/Provider.ts","../src/llm/openai.ts","../src/social/moltbook.ts","../src/social/SocialAdapter.ts","../src/social/twitter.ts","../src/a2a/client.ts","../src/a2a/actions.ts","../src/agent/Agent.ts","../src/config/ConfigLoader.ts","../src/config/MarkdownParser.ts","../src/config/types.ts","../src/config/validator.ts","../src/memory/longterm.ts","../src/server/app.ts","../src/server/routes.ts","../src/server/middleware.ts","../src/a2a/AgentCardBuilder.ts","../src/a2a/MoltiumExecutor.ts","../src/a2a/integration.ts"],"sourcesContent":["import winston from 'winston';\n\nconst logLevel = process.env.LOG_LEVEL || 'info';\n\nexport function createLogger(label: string): winston.Logger {\n return winston.createLogger({\n level: logLevel,\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.label({ label }),\n winston.format.printf(({ timestamp, level, label, message, ...meta }) => {\n const metaStr = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} [${label}] ${level}: ${message}${metaStr}`;\n }),\n ),\n transports: [new winston.transports.Console()],\n });\n}\n","import { createLogger } from '../logger.js';\n\nconst logger = createLogger('Scheduler');\n\nexport interface ScheduledJob {\n name: string;\n intervalMs: number;\n handler: () => Promise<void>;\n lastRun?: number;\n}\n\nexport class Scheduler {\n private jobs: ScheduledJob[] = [];\n private timers: Map<string, ReturnType<typeof setInterval>> = new Map();\n private running = false;\n\n addJob(job: ScheduledJob): void {\n this.jobs.push(job);\n logger.debug(`Job registered: ${job.name} (every ${job.intervalMs}ms)`);\n }\n\n removeJob(name: string): void {\n this.jobs = this.jobs.filter((j) => j.name !== name);\n const timer = this.timers.get(name);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(name);\n }\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n\n for (const job of this.jobs) {\n const timer = setInterval(async () => {\n try {\n logger.debug(`Running job: ${job.name}`);\n await job.handler();\n job.lastRun = Date.now();\n } catch (error) {\n logger.error(`Job failed: ${job.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }, job.intervalMs);\n\n this.timers.set(job.name, timer);\n }\n\n logger.info(`Scheduler started with ${this.jobs.length} jobs`);\n }\n\n stop(): void {\n this.running = false;\n for (const [name, timer] of this.timers) {\n clearInterval(timer);\n }\n this.timers.clear();\n logger.info('Scheduler stopped');\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getJobs(): ScheduledJob[] {\n return [...this.jobs];\n }\n}\n","\nimport type { Action } from '../config/types.js';\n\nexport class ActionRegistry {\n private actions = new Map<string, Action>();\n\n register(action: Action): void {\n if (this.actions.has(action.name)) {\n throw new Error(`Action \"${action.name}\" is already registered`);\n }\n this.actions.set(action.name, action);\n }\n\n unregister(name: string): void {\n this.actions.delete(name);\n }\n\n get(name: string): Action | undefined {\n return this.actions.get(name);\n }\n\n has(name: string): boolean {\n return this.actions.has(name);\n }\n\n list(): Action[] {\n return Array.from(this.actions.values());\n }\n\n listNames(): string[] {\n return Array.from(this.actions.keys());\n }\n}\n","import { ActionRegistry } from './registry.js';\nimport type { Action, ActionContext, ActionResult } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('ActionHandler');\n\nexport class ActionExecutionError extends Error {\n constructor(\n message: string,\n public actionName: string,\n public recoverable: boolean = true,\n ) {\n super(message);\n this.name = 'ActionExecutionError';\n }\n}\n\nexport class ActionHandler {\n private registry: ActionRegistry;\n\n constructor(registry: ActionRegistry) {\n this.registry = registry;\n }\n\n async execute(actionName: string, context: ActionContext): Promise<ActionResult> {\n const action = this.registry.get(actionName);\n\n if (!action) {\n throw new ActionExecutionError(\n `Action \"${actionName}\" not found in registry`,\n actionName,\n false,\n );\n }\n\n logger.info(`Executing action: ${actionName}`);\n\n try {\n const result = await action.execute(context);\n logger.info(`Action completed: ${actionName}`, { success: result.success });\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Action failed: ${actionName}`, { error: message });\n throw new ActionExecutionError(\n `Action \"${actionName}\" failed: ${message}`,\n actionName,\n );\n }\n }\n\n getAvailableActions(): Array<{ name: string; description: string }> {\n return this.registry.list().map((action) => ({\n name: action.name,\n description: action.description,\n }));\n }\n}\n","import type { Action, ActionContext, ActionResult } from '../../config/types.js';\n\nexport const postSocialUpdateAction: Action = {\n name: 'post_social_update',\n description: 'Post a status update to configured social platforms',\n async execute(context: ActionContext): Promise<ActionResult> {\n const { content, platforms } = context.parameters as {\n content: string;\n platforms?: string[];\n };\n\n if (!content) {\n return { success: false, error: 'Missing required parameter: content' };\n }\n\n const results: Record<string, unknown> = {};\n const socialAdapters = context.agent?.socialAdapters || {};\n const targetPlatforms = platforms || Object.keys(socialAdapters);\n\n for (const platform of targetPlatforms) {\n const adapter = socialAdapters[platform];\n if (!adapter) continue;\n\n try {\n const result = await adapter.post(content);\n results[platform] = result;\n } catch (error) {\n results[platform] = {\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n return { success: true, data: results };\n },\n};\n\nexport const respondToMentionAction: Action = {\n name: 'respond_to_mention',\n description: 'Respond to a social platform mention',\n async execute(context: ActionContext): Promise<ActionResult> {\n const { mentionId, content, platform } = context.parameters as {\n mentionId: string;\n content: string;\n platform: string;\n };\n\n if (!mentionId || !content || !platform) {\n return { success: false, error: 'Missing required parameters: mentionId, content, platform' };\n }\n\n const adapter = context.agent?.socialAdapters?.[platform];\n if (!adapter) {\n return { success: false, error: `No adapter configured for platform: ${platform}` };\n }\n\n const result = await adapter.reply(mentionId, content);\n return { success: true, data: result };\n },\n};\n\nexport const dmUserAction: Action = {\n name: 'dm_user',\n description: 'Send a direct message to a user on a social platform',\n async execute(context: ActionContext): Promise<ActionResult> {\n // DM functionality depends on platform-specific APIs\n // This is a placeholder for the generic interface\n const { userId, content, platform } = context.parameters as {\n userId: string;\n content: string;\n platform: string;\n };\n\n if (!userId || !content || !platform) {\n return { success: false, error: 'Missing required parameters: userId, content, platform' };\n }\n\n return {\n success: false,\n error: `DM not yet implemented for platform: ${platform}`,\n };\n },\n};\n\nexport const scheduleTaskAction: Action = {\n name: 'schedule_task',\n description: 'Schedule a task for later execution',\n async execute(context: ActionContext): Promise<ActionResult> {\n const { taskName, delay, parameters } = context.parameters as {\n taskName: string;\n delay: number;\n parameters?: Record<string, unknown>;\n };\n\n if (!taskName || delay === undefined) {\n return { success: false, error: 'Missing required parameters: taskName, delay' };\n }\n\n // Store scheduled task in memory for the scheduler to pick up\n const scheduledTask = {\n taskName,\n executeAt: Date.now() + delay * 1000,\n parameters: parameters || {},\n };\n\n await context.memory.store(`scheduled:${taskName}:${Date.now()}`, scheduledTask);\n\n return { success: true, data: scheduledTask };\n },\n};\n","import type { Action, ActionContext, ActionResult } from '../../config/types.js';\nimport type { MoltbookAdapter } from '../../social/moltbook.js';\n\n/** Helper: get the moltbook adapter from context or fail gracefully. */\nfunction getMoltbook(context: ActionContext): MoltbookAdapter | null {\n return (context.agent?.socialAdapters?.['moltbook'] as MoltbookAdapter) || null;\n}\n\nexport const checkFeedAction: Action = {\n name: 'check_feed',\n description: 'Browse the moltbook feed (personalized or global) to find posts to engage with',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { sort, limit, global: useGlobal } = context.parameters as {\n sort?: string; limit?: number; global?: boolean;\n };\n\n try {\n const posts = useGlobal\n ? await mb.getGlobalFeed({ sort: (sort as any) || 'hot', limit: limit || 15 })\n : await mb.getFeed({ sort: (sort as any) || 'new', limit: limit || 15 });\n return { success: true, data: { posts, count: posts.length } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const checkDMsAction: Action = {\n name: 'check_dms',\n description: 'Check for new DM requests and unread messages from other agents',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n try {\n const result = await mb.checkDMs();\n return { success: true, data: result };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const searchMoltbookAction: Action = {\n name: 'search_moltbook',\n description: 'Search moltbook for posts and comments by meaning (semantic search). Params: { \"query\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { query, limit } = context.parameters as {\n query: string; limit?: number;\n };\n if (!query) return { success: false, error: 'Missing required parameter: query' };\n\n try {\n const results = await mb.search(query, { limit: limit || 10 });\n return { success: true, data: { results, count: results.length } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const commentOnPostAction: Action = {\n name: 'comment_on_post',\n description: 'Reply to a post with a comment. Params: { \"post_id\": \"...\", \"content\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { post_id, content } = context.parameters as { post_id: string; content: string };\n if (!post_id || !content) return { success: false, error: 'Missing required parameters: post_id, content' };\n\n try {\n const result = await mb.reply(post_id, content);\n return { success: true, data: result };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const upvotePostAction: Action = {\n name: 'upvote_post',\n description: 'Upvote a post you find valuable. Params: { \"post_id\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { post_id } = context.parameters as { post_id: string };\n if (!post_id) return { success: false, error: 'Missing required parameter: post_id' };\n\n try {\n await mb.like(post_id);\n return { success: true, data: { post_id, action: 'upvoted' } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const downvotePostAction: Action = {\n name: 'downvote_post',\n description: 'Downvote a post you disagree with. Params: { \"post_id\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { post_id } = context.parameters as { post_id: string };\n if (!post_id) return { success: false, error: 'Missing required parameter: post_id' };\n\n try {\n await mb.downvote(post_id);\n return { success: true, data: { post_id, action: 'downvoted' } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const browseSubmoltsAction: Action = {\n name: 'browse_submolts',\n description: 'Discover moltbook communities (submolts) to subscribe to',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n try {\n const submolts = await mb.listSubmolts();\n return { success: true, data: { submolts, count: submolts.length } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const followAgentAction: Action = {\n name: 'follow_agent',\n description: 'Follow another agent whose posts you enjoy. Params: { \"agent_name\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { agent_name } = context.parameters as { agent_name: string };\n if (!agent_name) return { success: false, error: 'Missing required parameter: agent_name' };\n\n try {\n await mb.follow(agent_name);\n return { success: true, data: { agent_name, action: 'followed' } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const sendDMRequestAction: Action = {\n name: 'send_dm_request',\n description: 'Request to start a private conversation with another agent. Params: { \"to\": \"...\", \"message\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { to, to_owner, message } = context.parameters as { to?: string; to_owner?: string; message: string };\n if ((!to && !to_owner) || !message) return { success: false, error: 'Missing required parameters: (to or to_owner), message' };\n\n try {\n const target = to || to_owner || '';\n const byOwner = !to && !!to_owner;\n const result = await mb.sendDMRequest(target, message, byOwner);\n return { success: true, data: result };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const sendDMAction: Action = {\n name: 'send_dm',\n description: 'Send a message in an existing DM conversation. Params: { \"conversation_id\": \"...\", \"message\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { conversation_id, message, needs_human_input } = context.parameters as {\n conversation_id: string; message: string; needs_human_input?: boolean;\n };\n if (!conversation_id || !message) return { success: false, error: 'Missing required parameters: conversation_id, message' };\n\n try {\n const result = await mb.sendDM(conversation_id, message, needs_human_input);\n return { success: true, data: result };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const approveDMRequestAction: Action = {\n name: 'approve_dm_request',\n description: 'Approve a pending DM request from another agent. Params: { \"conversation_id\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { conversation_id } = context.parameters as { conversation_id: string };\n if (!conversation_id) return { success: false, error: 'Missing required parameter: conversation_id' };\n\n try {\n await mb.approveDMRequest(conversation_id);\n return { success: true, data: { conversation_id, action: 'approved' } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const readConversationAction: Action = {\n name: 'read_conversation',\n description: 'Read messages in a DM conversation (marks as read). Params: { \"conversation_id\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { conversation_id } = context.parameters as { conversation_id: string };\n if (!conversation_id) return { success: false, error: 'Missing required parameter: conversation_id' };\n\n try {\n const detail = await mb.readConversation(conversation_id);\n return { success: true, data: detail };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\n/** All Moltbook-specific actions */\nexport const moltbookActions: Action[] = [\n checkFeedAction,\n checkDMsAction,\n searchMoltbookAction,\n commentOnPostAction,\n upvotePostAction,\n downvotePostAction,\n browseSubmoltsAction,\n followAgentAction,\n sendDMRequestAction,\n sendDMAction,\n approveDMRequestAction,\n readConversationAction,\n];\n","import type { Action, ActionContext, ActionResult } from '../../config/types.js';\n\n/**\n * ============================================================================\n * WORLD SDK BUILT-IN ACTIONS\n * ============================================================================\n *\n * Built-in actions for agents to interact with worlds created using\n * @moltium/world-core. These use plain HTTP to call the world's REST endpoints.\n */\n\n/**\n * Creates a join_world action that POSTs to a world's /world/join endpoint\n */\nexport function createJoinWorldAction(config?: {\n defaultWorldUrl?: string;\n}): Action {\n return {\n name: 'join_world',\n description:\n `Join a world by URL. The world will fetch this agent's A2A Agent Card and evaluate admission. ` +\n `Parameters: worldUrl (string${config?.defaultWorldUrl ? ', optional' : ', required'}) - the world server URL` +\n `${config?.defaultWorldUrl ? ` (defaults to ${config.defaultWorldUrl})` : ''}, ` +\n `walletAddress (string, optional) - wallet address for blockchain worlds.`,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters, agent } = context;\n const worldUrl = (parameters.worldUrl as string) || config?.defaultWorldUrl;\n\n if (!worldUrl) {\n return { success: false, error: 'Parameter \"worldUrl\" is required' };\n }\n\n // Determine this agent's URL from server config or default\n const agentPort = process.env.PORT || '3000';\n const agentHost = process.env.HOST || 'localhost';\n const agentUrl = `http://${agentHost}:${agentPort}`;\n\n try {\n const { default: axios } = await import('axios');\n const response = await axios.post(`${worldUrl}/world/join`, {\n agentUrl,\n walletAddress: parameters.walletAddress || agent?.config?.world?.walletAddress,\n }, { timeout: 10000 });\n\n return {\n success: true,\n data: response.data,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || error?.message || String(error);\n return { success: false, error: `Failed to join world: ${msg}` };\n }\n },\n };\n}\n\n/**\n * Creates a leave_world action that DELETEs from a world's /world/agents endpoint\n */\nexport function createLeaveWorldAction(config?: {\n defaultWorldUrl?: string;\n}): Action {\n return {\n name: 'leave_world',\n description:\n `Leave a world. ` +\n `Parameters: worldUrl (string${config?.defaultWorldUrl ? ', optional' : ', required'}) - the world server URL.`,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters } = context;\n const worldUrl = (parameters.worldUrl as string) || config?.defaultWorldUrl;\n\n if (!worldUrl) {\n return { success: false, error: 'Parameter \"worldUrl\" is required' };\n }\n\n const agentPort = process.env.PORT || '3000';\n const agentHost = process.env.HOST || 'localhost';\n const agentUrl = `http://${agentHost}:${agentPort}`;\n\n try {\n const { default: axios } = await import('axios');\n const response = await axios.delete(\n `${worldUrl}/world/agents/${encodeURIComponent(agentUrl)}`,\n { timeout: 10000 }\n );\n\n return {\n success: true,\n data: response.data,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || error?.message || String(error);\n return { success: false, error: `Failed to leave world: ${msg}` };\n }\n },\n };\n}\n\n/**\n * Creates a query_world action that GETs world state and info\n */\nexport function createQueryWorldAction(config?: {\n defaultWorldUrl?: string;\n}): Action {\n return {\n name: 'query_world',\n description:\n `Query a world's state, agents, and available actions. ` +\n `Parameters: worldUrl (string${config?.defaultWorldUrl ? ', optional' : ', required'}) - the world server URL, ` +\n `endpoint (string, optional) - specific endpoint: \"state\", \"agents\", \"actions\", or \"info\" (default: \"info\").`,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters } = context;\n const worldUrl = (parameters.worldUrl as string) || config?.defaultWorldUrl;\n\n if (!worldUrl) {\n return { success: false, error: 'Parameter \"worldUrl\" is required' };\n }\n\n const endpoint = (parameters.endpoint as string) || 'info';\n const pathMap: Record<string, string> = {\n info: '/',\n state: '/world/state',\n agents: '/world/agents',\n actions: '/world/actions',\n };\n\n const path = pathMap[endpoint] || '/';\n\n try {\n const { default: axios } = await import('axios');\n const response = await axios.get(`${worldUrl}${path}`, { timeout: 10000 });\n\n return {\n success: true,\n data: response.data,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || error?.message || String(error);\n return { success: false, error: `Failed to query world: ${msg}` };\n }\n },\n };\n}\n\n/**\n * Creates a send_world_message action for agent-to-agent messaging through a world\n */\nexport function createSendWorldMessageAction(config?: {\n defaultWorldUrl?: string;\n}): Action {\n return {\n name: 'send_world_message',\n description:\n `Send a message to another agent through the world hub. ` +\n `Parameters: worldUrl (string${config?.defaultWorldUrl ? ', optional' : ', required'}) - the world server URL, ` +\n `toAgentUrl (string, optional) - target agent URL (omit to broadcast to all), ` +\n `message (string, required) - the message to send.`,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters } = context;\n const worldUrl = (parameters.worldUrl as string) || config?.defaultWorldUrl;\n\n if (!worldUrl) {\n return { success: false, error: 'Parameter \"worldUrl\" is required' };\n }\n\n if (!parameters.message) {\n return { success: false, error: 'Parameter \"message\" is required' };\n }\n\n const agentPort = process.env.PORT || '3000';\n const agentHost = process.env.HOST || 'localhost';\n const agentUrl = `http://${agentHost}:${agentPort}`;\n\n try {\n const { default: axios } = await import('axios');\n const response = await axios.post(`${worldUrl}/world/message`, {\n fromAgentUrl: agentUrl,\n toAgentUrl: parameters.toAgentUrl,\n message: parameters.message,\n }, { timeout: 15000 });\n\n return {\n success: true,\n data: response.data,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || error?.message || String(error);\n return { success: false, error: `Failed to send world message: ${msg}` };\n }\n },\n };\n}\n\n/**\n * All world actions as a convenience array\n */\nexport const worldActions = {\n createJoinWorldAction,\n createLeaveWorldAction,\n createQueryWorldAction,\n createSendWorldMessageAction,\n};\n","export {\n postSocialUpdateAction,\n respondToMentionAction,\n dmUserAction,\n scheduleTaskAction,\n} from './social.js';\n\nexport {\n checkFeedAction,\n checkDMsAction,\n searchMoltbookAction,\n commentOnPostAction,\n upvotePostAction,\n downvotePostAction,\n browseSubmoltsAction,\n followAgentAction,\n sendDMRequestAction,\n sendDMAction,\n approveDMRequestAction,\n readConversationAction,\n moltbookActions,\n} from './moltbook.js';\n\nexport {\n createJoinWorldAction,\n createLeaveWorldAction,\n createQueryWorldAction,\n createSendWorldMessageAction,\n worldActions,\n} from './world.js';\n\nimport type { Action } from '../../config/types.js';\nimport {\n postSocialUpdateAction,\n respondToMentionAction,\n dmUserAction,\n scheduleTaskAction,\n} from './social.js';\nimport { moltbookActions } from './moltbook.js';\n\nexport const builtInActions: Action[] = [\n postSocialUpdateAction,\n respondToMentionAction,\n dmUserAction,\n scheduleTaskAction,\n ...moltbookActions,\n];\n","import type { AgentConfig, Action } from '../config/types.js';\n\nexport function buildSystemPrompt(config: AgentConfig): string {\n const parts: string[] = [];\n\n parts.push(`You are ${config.name}, an autonomous AI agent.`);\n\n if (config.type) {\n parts.push(`Your role: ${config.type}.`);\n }\n\n if (config.personality.bio) {\n parts.push(`\\nBackground:\\n${config.personality.bio}`);\n }\n\n if (config.personality.traits.length > 0) {\n parts.push(`\\nPersonality traits: ${config.personality.traits.join(', ')}`);\n }\n\n if (config.llm.systemPrompt) {\n parts.push(`\\n${config.llm.systemPrompt}`);\n }\n\n return parts.join('\\n');\n}\n\nexport function buildDecisionPrompt(\n context: Record<string, unknown>,\n availableActions: Array<{ name: string; description: string }>,\n): string {\n const actionList = availableActions\n .map((a) => `- ${a.name}: ${a.description}`)\n .join('\\n');\n\n // Extract recent actions for variety guidance\n const recent = (context.recentActions as Array<{ action: string }>) || [];\n const recentNames = recent.map((r) => r.action);\n const lastAction = recentNames.length > 0 ? recentNames[recentNames.length - 1] : 'none';\n\n let varietyHint = '';\n if (recentNames.length > 0) {\n varietyHint = `\\nYour recent actions (most recent last): ${recentNames.join(' → ')}` +\n `\\nIMPORTANT: Do NOT repeat \"${lastAction}\" again. Choose a DIFFERENT action to keep your behavior varied and interesting.` +\n `\\nVary between: posting content, checking your feed, replying to others, checking DMs, browsing communities, searching for topics, and following interesting agents.`;\n }\n\n return `You are an autonomous AI agent on moltbook (a social network for AI agents).\nDecide what action to take next based on the current context and your personality.\n\nAvailable actions:\n${actionList}\n\nCurrent context:\n${JSON.stringify(context, null, 2)}\n${varietyHint}\n\nThink about what would be most natural and valuable right now.\nIf the action generates content (post, comment, DM), include the actual content in parameters.\n\nRespond with a JSON object:\n{\n \"action\": \"<action_name>\",\n \"reasoning\": \"<brief explanation of why you chose this>\",\n \"parameters\": { <any parameters for the action> }\n}`;\n}\n\nexport function buildSkillPrompt(skillName: string, skillDescription: string, parameters: Record<string, unknown>): string {\n return `Execute the following skill: ${skillName}\n\nInstructions:\n${skillDescription}\n\nParameters:\n${JSON.stringify(parameters, null, 2)}\n\nExecute these instructions step by step and return the result as a JSON object:\n{\n \"success\": true/false,\n \"data\": { <result data> },\n \"reasoning\": \"<what you did and why>\"\n}`;\n}\n","import type { LLMProvider } from '../llm/Provider.js';\nimport type { Action, ActionContext, ActionResult } from '../config/types.js';\nimport { buildSkillPrompt } from '../llm/prompt.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('MarkdownInterpreter');\n\nexport class LLMInterpretationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'LLMInterpretationError';\n }\n}\n\n/**\n * Creates an Action from a markdown skill description.\n * The skill's behavior is interpreted by the LLM at runtime.\n */\nexport function createMarkdownAction(\n name: string,\n description: string,\n llmProvider: LLMProvider,\n): Action {\n return {\n name,\n description,\n execute: async (context: ActionContext): Promise<ActionResult> => {\n logger.info(`Interpreting markdown skill: ${name}`);\n\n const prompt = buildSkillPrompt(name, description, context.parameters);\n\n try {\n const response = await llmProvider.generateText(prompt, {\n temperature: 0.7,\n maxTokens: 2048,\n });\n\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new LLMInterpretationError(\n `LLM did not return valid JSON for skill \"${name}\"`,\n );\n }\n\n const result = JSON.parse(jsonMatch[0]);\n return {\n success: result.success ?? true,\n data: result.data || result,\n };\n } catch (error) {\n if (error instanceof LLMInterpretationError) throw error;\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Markdown skill interpretation failed: ${name}`, { error: message });\n throw new LLMInterpretationError(\n `Failed to interpret skill \"${name}\": ${message}`,\n );\n }\n },\n };\n}\n","import type { Experience } from '../config/types.js';\n\nexport abstract class Memory {\n // Short-term (current session)\n abstract remember(key: string, value: unknown, ttl?: number): Promise<void>;\n abstract recall(key: string): Promise<unknown>;\n abstract forget(key: string): Promise<void>;\n\n // Long-term (persistent)\n abstract store(key: string, value: unknown): Promise<void>;\n abstract retrieve(key: string): Promise<unknown>;\n abstract delete(key: string): Promise<void>;\n\n // Semantic memory\n abstract addExperience(experience: Experience): Promise<void>;\n abstract queryExperiences(query: string, limit?: number): Promise<Experience[]>;\n\n // Lifecycle\n abstract clear(): Promise<void>;\n}\n","import { Memory } from './Memory.js';\nimport type { Experience } from '../config/types.js';\n\ninterface CacheEntry {\n value: unknown;\n expiresAt?: number;\n}\n\nexport class ShortTermMemory extends Memory {\n private cache = new Map<string, CacheEntry>();\n private store_ = new Map<string, unknown>();\n private experiences: Experience[] = [];\n\n async remember(key: string, value: unknown, ttl?: number): Promise<void> {\n this.cache.set(key, {\n value,\n expiresAt: ttl ? Date.now() + ttl * 1000 : undefined,\n });\n }\n\n async recall(key: string): Promise<unknown> {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n async forget(key: string): Promise<void> {\n this.cache.delete(key);\n }\n\n async store(key: string, value: unknown): Promise<void> {\n this.store_.set(key, value);\n }\n\n async retrieve(key: string): Promise<unknown> {\n return this.store_.get(key);\n }\n\n async delete(key: string): Promise<void> {\n this.store_.delete(key);\n }\n\n async addExperience(experience: Experience): Promise<void> {\n this.experiences.push(experience);\n }\n\n async queryExperiences(query: string, limit: number = 10): Promise<Experience[]> {\n // Simple keyword matching — will be replaced with vector search in longterm\n const queryLower = query.toLowerCase();\n return this.experiences\n .filter(\n (exp) =>\n exp.type.toLowerCase().includes(queryLower) ||\n exp.action.toLowerCase().includes(queryLower),\n )\n .slice(-limit);\n }\n\n async clear(): Promise<void> {\n this.cache.clear();\n this.store_.clear();\n this.experiences = [];\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport { LLMProvider, type GenerateOptions, type Message, type StructuredSchema } from './Provider.js';\n\nexport class AnthropicProvider extends LLMProvider {\n name = 'anthropic';\n private client: Anthropic;\n private model: string;\n\n constructor(apiKey: string, model: string = 'claude-sonnet-4-20250514') {\n super();\n this.client = new Anthropic({ apiKey });\n this.model = model;\n }\n\n async generateText(prompt: string, options?: GenerateOptions): Promise<string> {\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: options?.maxTokens || 2048,\n messages: [{ role: 'user', content: prompt }],\n ...(options?.systemPrompt ? { system: options.systemPrompt } : {}),\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options?.stopSequences ? { stop_sequences: options.stopSequences } : {}),\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n return textBlock ? textBlock.text : '';\n }\n\n async generateStructured<T>(prompt: string, schema: StructuredSchema, options?: GenerateOptions): Promise<T> {\n const structuredPrompt = `${prompt}\\n\\nRespond with a JSON object matching this schema:\\n${JSON.stringify(schema, null, 2)}\\n\\nRespond with valid JSON only, no other text.`;\n\n const text = await this.generateText(structuredPrompt, options);\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('LLM did not return valid JSON');\n }\n\n return JSON.parse(jsonMatch[0]) as T;\n }\n\n async chat(messages: Message[], options?: GenerateOptions): Promise<Message> {\n const systemMessages = messages.filter((m) => m.role === 'system');\n const chatMessages = messages\n .filter((m) => m.role !== 'system')\n .map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content }));\n\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: options?.maxTokens || 2048,\n messages: chatMessages,\n ...(systemMessages.length > 0 ? { system: systemMessages.map((m) => m.content).join('\\n') } : {}),\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n return { role: 'assistant', content: textBlock ? textBlock.text : '' };\n }\n\n async *streamGenerate(prompt: string, options?: GenerateOptions): AsyncGenerator<string> {\n const stream = this.client.messages.stream({\n model: this.model,\n max_tokens: options?.maxTokens || 2048,\n messages: [{ role: 'user', content: prompt }],\n ...(options?.systemPrompt ? { system: options.systemPrompt } : {}),\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n });\n\n for await (const event of stream) {\n if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {\n yield event.delta.text;\n }\n }\n }\n}\n","export interface GenerateOptions {\n temperature?: number;\n maxTokens?: number;\n stopSequences?: string[];\n systemPrompt?: string;\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport interface StructuredSchema {\n type: string;\n properties?: Record<string, unknown>;\n required?: string[];\n}\n\nexport abstract class LLMProvider {\n abstract name: string;\n\n abstract generateText(prompt: string, options?: GenerateOptions): Promise<string>;\n\n abstract generateStructured<T>(prompt: string, schema: StructuredSchema, options?: GenerateOptions): Promise<T>;\n\n abstract chat(messages: Message[], options?: GenerateOptions): Promise<Message>;\n\n abstract streamGenerate(prompt: string, options?: GenerateOptions): AsyncGenerator<string>;\n}\n","import OpenAI from 'openai';\nimport { LLMProvider, type GenerateOptions, type Message, type StructuredSchema } from './Provider.js';\n\nexport class OpenAIProvider extends LLMProvider {\n name = 'openai';\n private client: OpenAI;\n private model: string;\n\n constructor(apiKey: string, model: string = 'gpt-4o') {\n super();\n this.client = new OpenAI({ apiKey });\n this.model = model;\n }\n\n async generateText(prompt: string, options?: GenerateOptions): Promise<string> {\n const messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [];\n\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n max_tokens: options?.maxTokens || 2048,\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options?.stopSequences ? { stop: options.stopSequences } : {}),\n });\n\n return response.choices[0]?.message?.content || '';\n }\n\n async generateStructured<T>(prompt: string, schema: StructuredSchema, options?: GenerateOptions): Promise<T> {\n const structuredPrompt = `${prompt}\\n\\nRespond with a JSON object matching this schema:\\n${JSON.stringify(schema, null, 2)}\\n\\nRespond with valid JSON only, no other text.`;\n\n const text = await this.generateText(structuredPrompt, options);\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('LLM did not return valid JSON');\n }\n\n return JSON.parse(jsonMatch[0]) as T;\n }\n\n async chat(messages: Message[], options?: GenerateOptions): Promise<Message> {\n const openaiMessages: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = messages.map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages: openaiMessages,\n max_tokens: options?.maxTokens || 2048,\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n });\n\n return { role: 'assistant', content: response.choices[0]?.message?.content || '' };\n }\n\n async *streamGenerate(prompt: string, options?: GenerateOptions): AsyncGenerator<string> {\n const messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [];\n\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n max_tokens: options?.maxTokens || 2048,\n stream: true,\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n });\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) yield delta;\n }\n }\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport { SocialAdapter } from './SocialAdapter.js';\nimport type {\n PostResult, ReplyResult, Mention, Profile, Post, FeedOptions,\n Comment, SearchResult, SearchOptions,\n Submolt, SubmoltSettings,\n DMCheckResult, DMRequest, Conversation, ConversationDetail, DirectMessage,\n MoltbookRegistration, MoltbookStatus,\n} from './types.js';\nimport type { MoltbookConfig } from '../config/types.js';\n\nexport class MoltbookAdapter extends SocialAdapter {\n platform = 'moltbook';\n private client: AxiosInstance;\n private config: MoltbookConfig;\n\n constructor(config: MoltbookConfig) {\n super();\n this.config = config;\n this.client = axios.create({\n baseURL: config.baseUrl || 'https://www.moltbook.com/api/v1',\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n }\n\n // ── Connection ──\n\n async connect(): Promise<void> {\n await this.client.get('/agents/me');\n }\n\n async disconnect(): Promise<void> {\n // No persistent connection to close\n }\n\n // ── Registration & Status ──\n\n async register(name: string, description: string): Promise<MoltbookRegistration> {\n const response = await this.client.post('/agents/register', { name, description });\n const agent = response.data.agent || response.data;\n return {\n apiKey: agent.api_key,\n claimUrl: agent.claim_url,\n verificationCode: agent.verification_code,\n };\n }\n\n async getStatus(): Promise<MoltbookStatus> {\n const response = await this.client.get('/agents/status');\n return { status: response.data.status };\n }\n\n // ── Profile ──\n\n async getProfile(agentName: string): Promise<Profile> {\n const response = await this.client.get('/agents/profile', {\n params: { name: agentName },\n });\n const agent = response.data.agent || response.data;\n return {\n id: agent.id || agent.name,\n name: agent.name,\n bio: agent.description,\n followers: agent.follower_count,\n following: agent.following_count,\n platform: 'moltbook',\n };\n }\n\n async getMyProfile(): Promise<any> {\n const response = await this.client.get('/agents/me');\n return response.data;\n }\n\n async updateProfile(data: { description?: string; metadata?: Record<string, unknown> }): Promise<void> {\n await this.client.patch('/agents/me', data);\n }\n\n async uploadAvatar(filePath: string): Promise<void> {\n const fs = await import('node:fs');\n const FormData = (await import('form-data')).default;\n const form = new FormData();\n form.append('file', fs.createReadStream(filePath));\n await this.client.post('/agents/me/avatar', form, {\n headers: { ...form.getHeaders(), Authorization: `Bearer ${this.config.apiKey}` },\n });\n }\n\n async deleteAvatar(): Promise<void> {\n await this.client.delete('/agents/me/avatar');\n }\n\n // ── Posts ──\n\n async post(content: string): Promise<PostResult> {\n const submolt = this.config.defaultSubmolt || 'general';\n const title = extractTitle(content);\n\n const response = await this.client.post('/posts', {\n submolt,\n title,\n content,\n });\n return {\n id: response.data.id,\n url: response.data.url,\n timestamp: new Date(response.data.created_at),\n };\n }\n\n async postLink(submolt: string, title: string, url: string): Promise<PostResult> {\n const response = await this.client.post('/posts', { submolt, title, url });\n return {\n id: response.data.id,\n url: response.data.url,\n timestamp: new Date(response.data.created_at),\n };\n }\n\n async getPost(postId: string): Promise<Post> {\n const response = await this.client.get(`/posts/${postId}`);\n const p = response.data.post || response.data;\n return {\n id: p.id,\n authorId: p.author_id || p.author?.id || '',\n authorName: p.author_name || p.author?.name || '',\n content: p.content,\n title: p.title,\n timestamp: new Date(p.created_at),\n platform: 'moltbook',\n likes: p.upvotes ?? p.likes_count,\n replies: p.comment_count ?? p.replies_count,\n url: p.url,\n submolt: p.submolt?.name || p.submolt,\n };\n }\n\n async deletePost(postId: string): Promise<void> {\n await this.client.delete(`/posts/${postId}`);\n }\n\n // ── Comments ──\n\n async reply(postId: string, content: string): Promise<ReplyResult> {\n const response = await this.client.post(`/posts/${postId}/comments`, { content });\n return {\n id: response.data.id,\n parentId: postId,\n url: response.data.url,\n timestamp: new Date(response.data.created_at),\n };\n }\n\n async replyToComment(postId: string, content: string, parentId: string): Promise<ReplyResult> {\n const response = await this.client.post(`/posts/${postId}/comments`, {\n content,\n parent_id: parentId,\n });\n return {\n id: response.data.id,\n parentId,\n url: response.data.url,\n timestamp: new Date(response.data.created_at),\n };\n }\n\n async getComments(postId: string, sort: string = 'top'): Promise<Comment[]> {\n const response = await this.client.get(`/posts/${postId}/comments`, {\n params: { sort },\n });\n const items = response.data.comments || response.data || [];\n return items.map((c: any) => mapComment(c, postId));\n }\n\n async upvoteComment(commentId: string): Promise<void> {\n await this.client.post(`/comments/${commentId}/upvote`);\n }\n\n // ── Voting ──\n\n async like(postId: string): Promise<void> {\n await this.client.post(`/posts/${postId}/upvote`);\n }\n\n async downvote(postId: string): Promise<void> {\n await this.client.post(`/posts/${postId}/downvote`);\n }\n\n // ── Following ──\n\n async follow(agentName: string): Promise<void> {\n await this.client.post(`/agents/${agentName}/follow`);\n }\n\n async unfollow(agentName: string): Promise<void> {\n await this.client.delete(`/agents/${agentName}/follow`);\n }\n\n // ── Feed ──\n\n async getMentions(): Promise<Mention[]> {\n const response = await this.client.get('/feed', {\n params: { sort: 'new', limit: 20 },\n });\n return (response.data.posts || []).map((m: any) => ({\n id: m.id,\n authorId: m.author_id || m.author?.id || '',\n authorName: m.author_name || m.author?.name || '',\n content: m.content,\n timestamp: new Date(m.created_at),\n platform: 'moltbook',\n }));\n }\n\n async getFeed(options?: FeedOptions): Promise<Post[]> {\n const params: Record<string, unknown> = { sort: options?.sort || 'hot' };\n if (options?.limit) params.limit = options.limit;\n if (options?.cursor) params.cursor = options.cursor;\n if (options?.since) params.since = options.since.toISOString();\n if (options?.submolt) params.submolt = options.submolt;\n\n const response = await this.client.get('/feed', { params });\n return (response.data.posts || []).map((p: any) => mapPost(p));\n }\n\n async getGlobalFeed(options?: FeedOptions): Promise<Post[]> {\n const params: Record<string, unknown> = { sort: options?.sort || 'hot' };\n if (options?.limit) params.limit = options.limit;\n if (options?.submolt) params.submolt = options.submolt;\n\n const response = await this.client.get('/posts', { params });\n return (response.data.posts || []).map((p: any) => mapPost(p));\n }\n\n // ── Search ──\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const params: Record<string, unknown> = { q: query };\n if (options?.type) params.type = options.type;\n if (options?.limit) params.limit = options.limit;\n\n const response = await this.client.get('/search', { params });\n return (response.data.results || []).map((r: any) => ({\n id: r.id,\n type: r.type,\n title: r.title,\n content: r.content,\n upvotes: r.upvotes ?? 0,\n downvotes: r.downvotes ?? 0,\n similarity: r.similarity,\n author: { name: r.author?.name || '' },\n submolt: r.submolt,\n postId: r.post_id || r.id,\n timestamp: new Date(r.created_at),\n }));\n }\n\n // ── Submolts (Communities) ──\n\n async createSubmolt(name: string, displayName: string, description: string): Promise<Submolt> {\n const response = await this.client.post('/submolts', {\n name,\n display_name: displayName,\n description,\n });\n const s = response.data.submolt || response.data;\n return mapSubmolt(s);\n }\n\n async listSubmolts(): Promise<Submolt[]> {\n const response = await this.client.get('/submolts');\n const items = response.data.submolts || response.data || [];\n return items.map((s: any) => mapSubmolt(s));\n }\n\n async getSubmolt(name: string): Promise<Submolt> {\n const response = await this.client.get(`/submolts/${name}`);\n const s = response.data.submolt || response.data;\n return mapSubmolt(s);\n }\n\n async subscribe(submoltName: string): Promise<void> {\n await this.client.post(`/submolts/${submoltName}/subscribe`);\n }\n\n async unsubscribe(submoltName: string): Promise<void> {\n await this.client.delete(`/submolts/${submoltName}/subscribe`);\n }\n\n async getSubmoltFeed(submoltName: string, sort: string = 'hot', limit: number = 25): Promise<Post[]> {\n const response = await this.client.get(`/submolts/${submoltName}/feed`, {\n params: { sort, limit },\n });\n return (response.data.posts || []).map((p: any) => mapPost(p));\n }\n\n // ── Moderation ──\n\n async pinPost(postId: string): Promise<void> {\n await this.client.post(`/posts/${postId}/pin`);\n }\n\n async unpinPost(postId: string): Promise<void> {\n await this.client.delete(`/posts/${postId}/pin`);\n }\n\n async updateSubmoltSettings(submoltName: string, settings: SubmoltSettings): Promise<void> {\n const payload: Record<string, unknown> = {};\n if (settings.description !== undefined) payload.description = settings.description;\n if (settings.bannerColor !== undefined) payload.banner_color = settings.bannerColor;\n if (settings.themeColor !== undefined) payload.theme_color = settings.themeColor;\n await this.client.patch(`/submolts/${submoltName}/settings`, payload);\n }\n\n async uploadSubmoltAvatar(submoltName: string, filePath: string): Promise<void> {\n const fs = await import('node:fs');\n const FormData = (await import('form-data')).default;\n const form = new FormData();\n form.append('file', fs.createReadStream(filePath));\n form.append('type', 'avatar');\n await this.client.post(`/submolts/${submoltName}/settings`, form, {\n headers: { ...form.getHeaders(), Authorization: `Bearer ${this.config.apiKey}` },\n });\n }\n\n async uploadSubmoltBanner(submoltName: string, filePath: string): Promise<void> {\n const fs = await import('node:fs');\n const FormData = (await import('form-data')).default;\n const form = new FormData();\n form.append('file', fs.createReadStream(filePath));\n form.append('type', 'banner');\n await this.client.post(`/submolts/${submoltName}/settings`, form, {\n headers: { ...form.getHeaders(), Authorization: `Bearer ${this.config.apiKey}` },\n });\n }\n\n async addModerator(submoltName: string, agentName: string, role: string = 'moderator'): Promise<void> {\n await this.client.post(`/submolts/${submoltName}/moderators`, {\n agent_name: agentName,\n role,\n });\n }\n\n async removeModerator(submoltName: string, agentName: string): Promise<void> {\n await this.client.delete(`/submolts/${submoltName}/moderators`, {\n data: { agent_name: agentName },\n });\n }\n\n async listModerators(submoltName: string): Promise<Array<{ name: string; role: string }>> {\n const response = await this.client.get(`/submolts/${submoltName}/moderators`);\n return response.data.moderators || response.data || [];\n }\n\n // ── DM / Private Messaging ──\n\n async checkDMs(): Promise<DMCheckResult> {\n const response = await this.client.get('/agents/dm/check');\n const d = response.data;\n return {\n hasActivity: d.has_activity,\n summary: d.summary || '',\n requests: {\n count: d.requests?.count || 0,\n items: (d.requests?.items || []).map((r: any) => ({\n conversationId: r.conversation_id,\n from: {\n name: r.from?.name || '',\n owner: r.from?.owner ? {\n xHandle: r.from.owner.x_handle,\n xName: r.from.owner.x_name,\n } : undefined,\n },\n messagePreview: r.message_preview || '',\n createdAt: new Date(r.created_at),\n })),\n },\n messages: {\n totalUnread: d.messages?.total_unread || 0,\n conversationsWithUnread: d.messages?.conversations_with_unread || 0,\n latest: d.messages?.latest || [],\n },\n };\n }\n\n async sendDMRequest(to: string, message: string, byOwner: boolean = false): Promise<{ conversationId: string }> {\n const payload: Record<string, string> = { message };\n if (byOwner) {\n payload.to_owner = to;\n } else {\n payload.to = to;\n }\n const response = await this.client.post('/agents/dm/request', payload);\n return { conversationId: response.data.conversation_id || response.data.id };\n }\n\n async getDMRequests(): Promise<DMRequest[]> {\n const response = await this.client.get('/agents/dm/requests');\n const items = response.data.requests || response.data || [];\n return items.map((r: any) => ({\n conversationId: r.conversation_id,\n from: {\n name: r.from?.name || '',\n owner: r.from?.owner ? {\n xHandle: r.from.owner.x_handle,\n xName: r.from.owner.x_name,\n } : undefined,\n },\n messagePreview: r.message_preview || r.message || '',\n createdAt: new Date(r.created_at),\n }));\n }\n\n async approveDMRequest(conversationId: string): Promise<void> {\n await this.client.post(`/agents/dm/requests/${conversationId}/approve`);\n }\n\n async rejectDMRequest(conversationId: string, block: boolean = false): Promise<void> {\n const payload = block ? { block: true } : undefined;\n await this.client.post(`/agents/dm/requests/${conversationId}/reject`, payload);\n }\n\n async listConversations(): Promise<Conversation[]> {\n const response = await this.client.get('/agents/dm/conversations');\n const items = response.data.conversations?.items || response.data.conversations || [];\n return items.map((c: any) => ({\n conversationId: c.conversation_id,\n withAgent: {\n name: c.with_agent?.name || '',\n description: c.with_agent?.description,\n karma: c.with_agent?.karma,\n owner: c.with_agent?.owner ? {\n xHandle: c.with_agent.owner.x_handle,\n xName: c.with_agent.owner.x_name,\n } : undefined,\n },\n unreadCount: c.unread_count || 0,\n lastMessageAt: new Date(c.last_message_at),\n youInitiated: c.you_initiated ?? false,\n }));\n }\n\n async readConversation(conversationId: string): Promise<ConversationDetail> {\n const response = await this.client.get(`/agents/dm/conversations/${conversationId}`);\n const d = response.data;\n return {\n conversationId: d.conversation_id || conversationId,\n withAgent: { name: d.with_agent?.name || '' },\n messages: (d.messages || []).map((m: any) => ({\n id: m.id,\n sender: m.sender || m.from || '',\n content: m.content || m.message || '',\n timestamp: new Date(m.created_at || m.timestamp),\n needsHumanInput: m.needs_human_input,\n })),\n };\n }\n\n async sendDM(conversationId: string, message: string, needsHumanInput: boolean = false): Promise<void> {\n const payload: Record<string, unknown> = { message };\n if (needsHumanInput) {\n payload.needs_human_input = true;\n }\n await this.client.post(`/agents/dm/conversations/${conversationId}/send`, payload);\n }\n}\n\n// ── Helpers ──\n\nfunction extractTitle(content: string): string {\n const firstLine = content.split('\\n')[0].trim();\n const sentenceEnd = firstLine.search(/[.!?]/);\n const raw = sentenceEnd > 0 && sentenceEnd <= 80\n ? firstLine.slice(0, sentenceEnd + 1)\n : firstLine;\n\n if (raw.length <= 80) return raw;\n const truncated = raw.slice(0, 80).replace(/\\s+\\S*$/, '');\n return truncated + '...';\n}\n\nfunction mapPost(p: any): Post {\n return {\n id: p.id,\n authorId: p.author_id || p.author?.id || '',\n authorName: p.author_name || p.author?.name || '',\n content: p.content,\n title: p.title,\n timestamp: new Date(p.created_at),\n platform: 'moltbook',\n likes: p.upvotes ?? p.likes_count,\n replies: p.comment_count ?? p.replies_count,\n reposts: p.reposts_count,\n mentions: p.mentions || [],\n url: p.url,\n submolt: p.submolt?.name || p.submolt,\n };\n}\n\nfunction mapComment(c: any, postId: string): Comment {\n return {\n id: c.id,\n postId,\n parentId: c.parent_id,\n authorName: c.author?.name || c.author_name || '',\n content: c.content,\n upvotes: c.upvotes ?? 0,\n downvotes: c.downvotes ?? 0,\n timestamp: new Date(c.created_at),\n replies: c.replies?.map((r: any) => mapComment(r, postId)),\n };\n}\n\nfunction mapSubmolt(s: any): Submolt {\n return {\n name: s.name,\n displayName: s.display_name || s.name,\n description: s.description || '',\n subscriberCount: s.subscriber_count || 0,\n postCount: s.post_count,\n yourRole: s.your_role || null,\n createdAt: new Date(s.created_at),\n };\n}\n","import type { PostResult, ReplyResult, Mention, Profile, Post, FeedOptions, Comment, SearchResult, SearchOptions } from './types.js';\n\nexport abstract class SocialAdapter {\n abstract platform: string;\n\n abstract post(content: string): Promise<PostResult>;\n abstract reply(id: string, content: string): Promise<ReplyResult>;\n abstract like(id: string): Promise<void>;\n abstract follow(userId: string): Promise<void>;\n abstract getMentions(): Promise<Mention[]>;\n abstract getFeed(options?: FeedOptions): Promise<Post[]>;\n abstract getProfile(userId: string): Promise<Profile>;\n\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n\n // Optional methods with defaults — override in platform adapters as needed\n\n async downvote(_id: string): Promise<void> {\n throw new Error(`downvote() is not supported on ${this.platform}`);\n }\n\n async unfollow(_userId: string): Promise<void> {\n throw new Error(`unfollow() is not supported on ${this.platform}`);\n }\n\n async getPost(_id: string): Promise<Post> {\n throw new Error(`getPost() is not supported on ${this.platform}`);\n }\n\n async deletePost(_id: string): Promise<void> {\n throw new Error(`deletePost() is not supported on ${this.platform}`);\n }\n\n async getComments(_postId: string, _sort?: string): Promise<Comment[]> {\n throw new Error(`getComments() is not supported on ${this.platform}`);\n }\n\n async search(_query: string, _options?: SearchOptions): Promise<SearchResult[]> {\n throw new Error(`search() is not supported on ${this.platform}`);\n }\n}\n","import { SocialAdapter } from './SocialAdapter.js';\nimport type { PostResult, ReplyResult, Mention, Profile, Post, FeedOptions } from './types.js';\nimport type { TwitterConfig } from '../config/types.js';\n\nexport class TwitterAdapter extends SocialAdapter {\n platform = 'twitter';\n private config: TwitterConfig;\n private client: any; // twitter-api-v2 client\n\n constructor(config: TwitterConfig) {\n super();\n this.config = config;\n }\n\n async connect(): Promise<void> {\n // Dynamic import to keep twitter-api-v2 optional\n const { TwitterApi } = await import('twitter-api-v2');\n this.client = new TwitterApi({\n appKey: this.config.credentials.apiKey,\n appSecret: this.config.credentials.apiSecret,\n accessToken: this.config.credentials.accessToken,\n accessSecret: this.config.credentials.accessSecret,\n });\n\n // Verify credentials\n await this.client.v2.me();\n }\n\n async disconnect(): Promise<void> {\n this.client = null;\n }\n\n async post(content: string): Promise<PostResult> {\n const tweet = await this.client.v2.tweet(content);\n return {\n id: tweet.data.id,\n url: `https://twitter.com/i/status/${tweet.data.id}`,\n timestamp: new Date(),\n };\n }\n\n async reply(tweetId: string, content: string): Promise<ReplyResult> {\n const tweet = await this.client.v2.reply(content, tweetId);\n return {\n id: tweet.data.id,\n parentId: tweetId,\n url: `https://twitter.com/i/status/${tweet.data.id}`,\n timestamp: new Date(),\n };\n }\n\n async like(tweetId: string): Promise<void> {\n const me = await this.client.v2.me();\n await this.client.v2.like(me.data.id, tweetId);\n }\n\n async follow(userId: string): Promise<void> {\n const me = await this.client.v2.me();\n await this.client.v2.follow(me.data.id, userId);\n }\n\n async getMentions(): Promise<Mention[]> {\n const me = await this.client.v2.me();\n const mentions = await this.client.v2.userMentionTimeline(me.data.id, {\n max_results: 20,\n expansions: ['author_id'],\n 'tweet.fields': ['created_at'],\n 'user.fields': ['name', 'username'],\n });\n\n const users = new Map<string, string>();\n if (mentions.includes?.users) {\n for (const user of mentions.includes.users) {\n users.set(user.id, user.username);\n }\n }\n\n return (mentions.data?.data || []).map((tweet: any) => ({\n id: tweet.id,\n authorId: tweet.author_id,\n authorName: users.get(tweet.author_id) || 'unknown',\n content: tweet.text,\n timestamp: new Date(tweet.created_at),\n platform: 'twitter',\n }));\n }\n\n async getFeed(options?: FeedOptions): Promise<Post[]> {\n const me = await this.client.v2.me();\n const timeline = await this.client.v2.userTimeline(me.data.id, {\n max_results: options?.limit || 20,\n 'tweet.fields': ['created_at', 'public_metrics'],\n });\n\n return (timeline.data?.data || []).map((tweet: any) => ({\n id: tweet.id,\n authorId: me.data.id,\n authorName: me.data.username,\n content: tweet.text,\n timestamp: new Date(tweet.created_at),\n platform: 'twitter',\n likes: tweet.public_metrics?.like_count,\n replies: tweet.public_metrics?.reply_count,\n reposts: tweet.public_metrics?.retweet_count,\n }));\n }\n\n async getProfile(userId: string): Promise<Profile> {\n const user = await this.client.v2.user(userId, {\n 'user.fields': ['description', 'public_metrics'],\n });\n\n return {\n id: user.data.id,\n name: user.data.name,\n bio: user.data.description,\n followers: user.data.public_metrics?.followers_count,\n following: user.data.public_metrics?.following_count,\n platform: 'twitter',\n };\n }\n}\n","import { A2AClient as SDKClient } from '@a2a-js/sdk/client';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Configuration for A2A client operations\n */\nexport interface A2AClientConfig {\n /**\n * The base URL of the target agent\n * @example 'http://localhost:3001'\n */\n agentUrl: string;\n\n /**\n * Path to the agent card (defaults to '.well-known/agent.json')\n */\n agentCardPath?: string;\n\n /**\n * Timeout for requests in milliseconds (optional)\n */\n timeout?: number;\n}\n\n/**\n * Options for sending messages via A2A\n */\nexport interface A2AMessageOptions {\n /**\n * The text message to send\n */\n text: string;\n\n /**\n * Optional context ID to group related messages\n */\n contextId?: string;\n\n /**\n * Optional metadata for extensions\n */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Response from an A2A message\n */\nexport interface A2AMessageResponse {\n /**\n * Whether the message was successfully sent and received\n */\n success: boolean;\n\n /**\n * The reply text from the agent (if successful)\n */\n reply?: string;\n\n /**\n * The agent URL that responded\n */\n agentUrl?: string;\n\n /**\n * Error message (if failed)\n */\n error?: string;\n\n /**\n * Raw response from the A2A protocol (for advanced use)\n */\n raw?: any;\n}\n\n/**\n * Wrapper around A2A Client SDK with improved developer experience\n * \n * @example\n * ```typescript\n * const client = new A2AClient({ agentUrl: 'http://localhost:3001' });\n * const response = await client.sendMessage({ text: 'Hello!' });\n * console.log(response.reply);\n * ```\n */\nexport class A2AClient {\n private sdkClient: SDKClient;\n private config: Required<A2AClientConfig>;\n\n constructor(config: A2AClientConfig) {\n this.config = {\n agentUrl: config.agentUrl,\n agentCardPath: config.agentCardPath || '.well-known/agent.json',\n timeout: config.timeout || 30000,\n };\n\n const agentUrl: string = this.config.agentUrl;\n const agentCardPath: string = this.config.agentCardPath;\n \n this.sdkClient = new SDKClient(agentUrl, agentCardPath);\n }\n\n /**\n * Send a text message to the agent and get a response\n * \n * @param options Message options including text content\n * @returns Promise resolving to the agent's response\n * \n * @example\n * ```typescript\n * const response = await client.sendMessage({\n * text: 'What are your thoughts on AI?',\n * contextId: 'conversation-123'\n * });\n * \n * if (response.success) {\n * console.log('Agent replied:', response.reply);\n * }\n * ```\n */\n async sendMessage(options: A2AMessageOptions): Promise<A2AMessageResponse> {\n try {\n const response = await this.sdkClient.sendMessage({\n message: {\n kind: 'message',\n messageId: uuidv4(),\n role: 'user',\n contextId: options.contextId,\n metadata: options.metadata,\n parts: [\n {\n kind: 'text',\n text: options.text,\n },\n ],\n },\n });\n\n // Extract reply from response\n const reply = this.extractReply(response);\n\n return {\n success: true,\n reply,\n agentUrl: this.config.agentUrl,\n raw: response,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Unknown error occurred',\n agentUrl: this.config.agentUrl,\n };\n }\n }\n\n /**\n * Extract text reply from A2A protocol response\n * Handles both Message and Task response types\n */\n private extractReply(response: any): string {\n if (!('result' in response) || !response.result) {\n return JSON.stringify(response);\n }\n\n const result = response.result;\n\n // Check if it's a Message with parts\n if ('kind' in result && result.kind === 'message' && 'parts' in result) {\n const textParts = result.parts\n .filter((part: any) => part.kind === 'text')\n .map((part: any) => part.text);\n return textParts.join('\\n');\n }\n\n // Task or other response type\n return typeof result === 'string' ? result : JSON.stringify(result);\n }\n\n /**\n * Get the agent card information\n * \n * @returns Promise resolving to the agent card\n */\n async getAgentCard(): Promise<any> {\n return this.sdkClient.getAgentCard();\n }\n\n /**\n * Get the base URL of the agent\n */\n getAgentUrl(): string {\n return this.config.agentUrl;\n }\n}\n\n/**\n * Factory function to create A2A clients easily\n * \n * @example\n * ```typescript\n * const client = createA2AClient('http://localhost:3001');\n * const response = await client.sendMessage({ text: 'Hello!' });\n * ```\n */\nexport function createA2AClient(\n agentUrlOrConfig: string | A2AClientConfig\n): A2AClient {\n const config =\n typeof agentUrlOrConfig === 'string'\n ? { agentUrl: agentUrlOrConfig }\n : agentUrlOrConfig;\n\n return new A2AClient(config);\n}\n","import type { Action, ActionContext, ActionResult } from '../config/types.js';\nimport { A2AClient } from './client.js';\n\n/**\n * Configuration for the built-in A2A communication action\n */\nexport interface A2ACommunicationActionConfig {\n /**\n * Default agent URL to communicate with\n * Can be overridden per-action execution\n */\n defaultAgentUrl?: string;\n\n /**\n * Custom name for the action (defaults to 'talk_to_agent')\n */\n actionName?: string;\n\n /**\n * Custom description for the action\n */\n description?: string;\n\n /**\n * Whether to enable verbose logging\n */\n verbose?: boolean;\n}\n\n/**\n * Creates a ready-to-use A2A communication action\n * \n * @param config Configuration for the A2A action\n * @returns An Action that can be registered with the agent\n * \n * @example\n * ```typescript\n * const a2aAction = createA2ACommunicationAction({\n * defaultAgentUrl: 'http://localhost:3001',\n * actionName: 'talk_to_partner',\n * verbose: true\n * });\n * \n * // Register in agent.config.ts\n * export default {\n * customActions: [a2aAction],\n * actions: ['talk_to_partner']\n * }\n * ```\n */\nexport function createA2ACommunicationAction(\n config: A2ACommunicationActionConfig = {}\n): Action {\n const {\n defaultAgentUrl,\n actionName = 'talk_to_agent',\n description,\n verbose = false,\n } = config;\n\n const defaultDescription =\n description ||\n `Send a message to another A2A-compliant agent and receive their response. ` +\n `Parameters: message (required string) - the message to send, ` +\n `agentUrl (optional string) - target agent URL${defaultAgentUrl ? ` (defaults to ${defaultAgentUrl})` : ''}`;\n\n return {\n name: actionName,\n description: defaultDescription,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters } = context;\n const message = parameters.message as string;\n const agentUrl = (parameters.agentUrl as string) || defaultAgentUrl;\n\n if (!message) {\n return {\n success: false,\n error: 'Parameter \"message\" is required',\n };\n }\n\n if (!agentUrl) {\n return {\n success: false,\n error: 'Parameter \"agentUrl\" is required or defaultAgentUrl must be configured',\n };\n }\n\n if (verbose) {\n console.log(`[A2A] Sending message to ${agentUrl}:`, message);\n }\n\n try {\n const client = new A2AClient({ agentUrl });\n const response = await client.sendMessage({ text: message });\n\n if (verbose) {\n console.log(`[A2A] Response from ${agentUrl}:`, response.reply);\n }\n\n if (!response.success) {\n return {\n success: false,\n error: response.error || 'Failed to communicate with agent',\n };\n }\n\n return {\n success: true,\n data: {\n reply: response.reply,\n agentUrl: response.agentUrl,\n },\n };\n } catch (error: any) {\n if (verbose) {\n console.error(`[A2A] Error:`, error);\n }\n\n return {\n success: false,\n error: error.message || 'Unknown error occurred',\n };\n }\n },\n };\n}\n\n/**\n * Creates multiple A2A communication actions for different agents\n * \n * @param configs Map of action names to their configurations\n * @returns Array of Actions ready to be registered\n * \n * @example\n * ```typescript\n * const actions = createMultipleA2AActions({\n * talk_to_analyst: {\n * defaultAgentUrl: 'http://localhost:3001',\n * description: 'Communicate with the business analyst agent'\n * },\n * talk_to_engineer: {\n * defaultAgentUrl: 'http://localhost:3002',\n * description: 'Communicate with the engineering agent'\n * }\n * });\n * \n * // In agent.config.ts\n * export default {\n * customActions: actions,\n * actions: ['talk_to_analyst', 'talk_to_engineer']\n * }\n * ```\n */\nexport function createMultipleA2AActions(\n configs: Record<string, A2ACommunicationActionConfig>\n): Action[] {\n return Object.entries(configs).map(([name, config]) =>\n createA2ACommunicationAction({\n ...config,\n actionName: name,\n })\n );\n}\n","import type { AgentConfig, Decision, Experience, ActionResult, Action } from '../config/types.js';\nimport type { LifecycleHooks } from './lifecycle.js';\nimport { Scheduler } from './scheduler.js';\nimport { ActionRegistry } from '../actions/registry.js';\nimport { ActionHandler } from '../actions/ActionHandler.js';\nimport { builtInActions, moltbookActions } from '../actions/built-in/index.js';\nimport { createMarkdownAction } from '../actions/interpreter.js';\nimport { ShortTermMemory } from '../memory/shortterm.js';\nimport type { Memory } from '../memory/Memory.js';\nimport type { LLMProvider } from '../llm/Provider.js';\nimport { AnthropicProvider } from '../llm/anthropic.js';\nimport { OpenAIProvider } from '../llm/openai.js';\nimport { SocialAdapter } from '../social/SocialAdapter.js';\nimport { MoltbookAdapter } from '../social/moltbook.js';\nimport { TwitterAdapter } from '../social/twitter.js';\nimport { buildSystemPrompt, buildDecisionPrompt } from '../llm/prompt.js';\nimport { createLogger } from '../logger.js';\nimport {\n createA2ACommunicationAction,\n createMultipleA2AActions,\n} from '../a2a/actions.js';\nimport {\n createJoinWorldAction,\n createLeaveWorldAction,\n createQueryWorldAction,\n createSendWorldMessageAction,\n} from '../actions/built-in/world.js';\n\nconst logger = createLogger('Agent');\n\n/** Parse a postFrequency string into milliseconds. Supports: 'hourly', 'daily', '30m', '2h', etc. */\nfunction parsePostFrequency(freq: string): number {\n const lower = freq.toLowerCase().trim();\n\n // Named presets\n if (lower === 'realtime') return 5 * 60 * 1000; // 5 minutes\n if (lower === 'hourly') return 60 * 60 * 1000; // 1 hour\n if (lower === 'daily') return 24 * 60 * 60 * 1000; // 24 hours\n\n // Short-form: \"30m\", \"2h\", \"1d\"\n const match = lower.match(/^(\\d+)\\s*(m|min|mins|minutes?|h|hr|hrs|hours?|d|days?)$/);\n if (match) {\n const n = parseInt(match[1], 10);\n const unit = match[2][0]; // 'm', 'h', or 'd'\n if (unit === 'm') return n * 60 * 1000;\n if (unit === 'h') return n * 60 * 60 * 1000;\n if (unit === 'd') return n * 24 * 60 * 60 * 1000;\n }\n\n // Natural language: \"every 30 minutes\", \"every 2 hours\"\n const nlMin = lower.match(/every\\s+(\\d+)\\s+minutes?/);\n if (nlMin) return parseInt(nlMin[1], 10) * 60 * 1000;\n\n const nlHour = lower.match(/every\\s+(\\d+)\\s+hours?/);\n if (nlHour) return parseInt(nlHour[1], 10) * 60 * 60 * 1000;\n\n if (/every\\s+hour/.test(lower)) return 60 * 60 * 1000;\n if (/every\\s+day/.test(lower)) return 24 * 60 * 60 * 1000;\n\n return 0;\n}\n\n/** Format milliseconds into a human-readable string */\nfunction formatInterval(ms: number): string {\n if (ms < 60 * 1000) return `${Math.round(ms / 1000)}s`;\n if (ms < 60 * 60 * 1000) return `${Math.round(ms / 60000)}m`;\n if (ms < 24 * 60 * 60 * 1000) return `${Math.round(ms / 3600000)}h`;\n return `${Math.round(ms / 86400000)}d`;\n}\n\nexport type AgentState = 'idle' | 'initializing' | 'running' | 'stopping' | 'stopped' | 'error';\n\nexport class Agent {\n readonly config: AgentConfig;\n\n private state: AgentState = 'idle';\n private llm!: LLMProvider;\n private memory_: Memory;\n private scheduler: Scheduler;\n private actionRegistry: ActionRegistry;\n private actionHandler: ActionHandler;\n private hooks: LifecycleHooks = {};\n private tickTimer?: ReturnType<typeof setInterval>;\n private systemPrompt: string;\n\n socialAdapters: Record<string, SocialAdapter> = {};\n private recentActions: Array<{ action: string; reasoning: string; time: string }> = [];\n private tickCount = 0;\n\n constructor(config: AgentConfig, hooks?: LifecycleHooks) {\n this.config = config;\n this.hooks = hooks || {};\n this.memory_ = new ShortTermMemory();\n this.scheduler = new Scheduler();\n this.actionRegistry = new ActionRegistry();\n this.actionHandler = new ActionHandler(this.actionRegistry);\n this.systemPrompt = buildSystemPrompt(config);\n }\n\n get name(): string {\n return this.config.name;\n }\n\n getState(): AgentState {\n return this.state;\n }\n\n getMemory(): Memory {\n return this.memory_;\n }\n\n getLLM(): LLMProvider {\n return this.llm;\n }\n\n getActionRegistry(): ActionRegistry {\n return this.actionRegistry;\n }\n\n // ── Configuration Methods ──\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n appendSystemPrompt(additional: string): void {\n this.systemPrompt += '\\n\\n' + additional;\n }\n\n getSystemPrompt(): string {\n return this.systemPrompt;\n }\n\n setHooks(hooks: LifecycleHooks): void {\n this.hooks = hooks;\n }\n\n mergeHooks(hooks: Partial<LifecycleHooks>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n setMemory(memory: Memory): void {\n this.memory_ = memory;\n }\n\n async preloadMemory(entries: Record<string, unknown>): Promise<void> {\n for (const [key, value] of Object.entries(entries)) {\n await this.memory_.remember(key, value);\n }\n }\n\n registerAction(action: Action): void {\n this.actionRegistry.register(action);\n }\n\n // ── Lifecycle ──\n\n async init(): Promise<void> {\n this.state = 'initializing';\n logger.info(`Initializing agent: ${this.config.name}`);\n\n this.initLLM();\n this.registerActions();\n await this.initSocialAdapters();\n this.initScheduledJobs();\n\n if (this.hooks.onInit) {\n await this.hooks.onInit(this);\n }\n\n await this.postStartupMessages();\n\n logger.info(`Agent initialized: ${this.config.name}`);\n }\n\n async start(): Promise<void> {\n if (this.state !== 'initializing' && this.state !== 'idle') {\n throw new Error(`Cannot start agent in state: ${this.state}`);\n }\n\n if (this.state === 'idle') {\n await this.init();\n }\n\n this.state = 'running';\n logger.info(`Agent started: ${this.config.name}`);\n\n if (this.hooks.onStart) {\n await this.hooks.onStart(this);\n }\n\n // Auto-join world if configured\n if (this.config.world?.url && this.config.world.autoJoin !== false) {\n await this.autoJoinWorld();\n }\n\n this.scheduler.start();\n\n if (this.config.behaviors.autonomous) {\n this.startAutonomousLoop();\n }\n }\n\n async stop(): Promise<void> {\n this.state = 'stopping';\n logger.info(`Stopping agent: ${this.config.name}`);\n\n if (this.tickTimer) {\n clearInterval(this.tickTimer);\n this.tickTimer = undefined;\n }\n\n this.scheduler.stop();\n\n for (const adapter of Object.values(this.socialAdapters)) {\n await adapter.disconnect();\n }\n\n if (this.hooks.onShutdown) {\n await this.hooks.onShutdown(this);\n }\n\n this.state = 'stopped';\n logger.info(`Agent stopped: ${this.config.name}`);\n }\n\n // ── Decision Loop ──\n\n async think(): Promise<Decision> {\n const context = await this.gatherContext();\n const availableActions = this.actionHandler.getAvailableActions();\n\n const prompt = buildDecisionPrompt(context, availableActions);\n\n const decision = await this.llm.generateStructured<Decision>(\n prompt,\n {\n type: 'object',\n properties: {\n action: { type: 'string' },\n reasoning: { type: 'string' },\n parameters: { type: 'object' },\n },\n required: ['action', 'reasoning', 'parameters'],\n },\n { systemPrompt: this.systemPrompt, temperature: this.config.llm.temperature },\n );\n\n logger.debug(`Decision: ${decision.action} — ${decision.reasoning}`);\n return decision;\n }\n\n async act(actionName: string, parameters: Record<string, unknown> = {}): Promise<ActionResult> {\n const context = {\n agent: this,\n memory: this.memory_,\n llm: this.llm,\n parameters,\n };\n\n return this.actionHandler.execute(actionName, context);\n }\n\n async learn(experience: Experience): Promise<void> {\n await this.memory_.addExperience(experience);\n }\n\n async tick(): Promise<void> {\n if (this.state !== 'running') return;\n\n this.tickCount++;\n\n try {\n if (this.hooks.onTick) {\n await this.hooks.onTick(this);\n }\n\n if (this.isSleeping()) {\n logger.info(`Tick #${this.tickCount}: Sleeping — skipped`);\n return;\n }\n\n logger.info(`Tick #${this.tickCount}: Thinking...`);\n const decision = await this.think();\n\n logger.info(`Tick #${this.tickCount}: Decision → ${decision.action} | Reasoning: ${decision.reasoning}`);\n if (decision.parameters && Object.keys(decision.parameters).length > 0) {\n logger.info(`Tick #${this.tickCount}: Parameters → ${JSON.stringify(decision.parameters)}`);\n }\n\n const result = await this.act(decision.action, decision.parameters);\n\n logger.info(`Tick #${this.tickCount}: Result → success=${result.success}${result.data ? ` data=${JSON.stringify(result.data).slice(0, 200)}` : ''}`);\n\n // Track recent actions for context (keep last 10)\n this.recentActions.push({\n action: decision.action,\n reasoning: decision.reasoning,\n time: new Date().toISOString(),\n });\n if (this.recentActions.length > 10) this.recentActions.shift();\n\n await this.learn({\n type: 'action',\n action: decision.action,\n result,\n timestamp: new Date(),\n context: { reasoning: decision.reasoning },\n });\n\n if (this.config.webhooks?.onAction) {\n await this.fireWebhook('onAction', decision, result);\n }\n } catch (error) {\n logger.error(`Tick #${this.tickCount} error: ${error instanceof Error ? error.message : error}`);\n if (this.hooks.onError && error instanceof Error) {\n await this.hooks.onError(error, this);\n }\n }\n }\n\n // ── Markdown skill registration ──\n\n registerMarkdownSkills(skills: Array<{ name: string; description: string }>): void {\n for (const skill of skills) {\n const action = createMarkdownAction(skill.name, skill.description, this.llm);\n this.actionRegistry.register(action);\n }\n }\n\n // ── Internal ──\n\n private initLLM(): void {\n const { provider, apiKey, model } = this.config.llm;\n\n switch (provider) {\n case 'anthropic':\n this.llm = new AnthropicProvider(apiKey, model);\n break;\n case 'openai':\n this.llm = new OpenAIProvider(apiKey, model);\n break;\n default:\n throw new Error(`Unsupported LLM provider: ${provider}`);\n }\n }\n\n private registerActions(): void {\n // Register built-in generic actions that the config references\n for (const action of builtInActions) {\n if (this.config.actions.includes(action.name)) {\n this.actionRegistry.register(action);\n }\n }\n\n // Auto-register all Moltbook actions when moltbook is configured\n // (these check for the adapter at execution time, not registration time)\n const mb = this.config.social.moltbook;\n if (mb && mb.enabled !== false) {\n for (const action of moltbookActions) {\n if (!this.actionRegistry.has(action.name)) {\n this.actionRegistry.register(action);\n }\n }\n logger.info(`Registered ${moltbookActions.length} Moltbook actions`);\n }\n\n // Auto-register A2A communication actions when A2A is configured\n const a2a = this.config.a2a;\n if (a2a && a2a.enabled !== false) {\n if (a2a.peers && Object.keys(a2a.peers).length > 0) {\n // Create specific actions for each peer\n const peerActions = createMultipleA2AActions(\n Object.entries(a2a.peers).reduce((acc, [actionName, url]) => {\n acc[actionName] = {\n defaultAgentUrl: url,\n verbose: a2a.verbose,\n description: `Communicate with peer agent at ${url}`,\n };\n return acc;\n }, {} as Record<string, any>)\n );\n\n for (const action of peerActions) {\n if (!this.actionRegistry.has(action.name)) {\n this.actionRegistry.register(action);\n }\n }\n logger.info(`Registered ${peerActions.length} A2A peer actions`);\n } else {\n // Create generic A2A action\n const genericAction = createA2ACommunicationAction({\n defaultAgentUrl: a2a.defaultPeerUrl,\n actionName: a2a.genericActionName || 'talk_to_agent',\n verbose: a2a.verbose,\n });\n\n if (!this.actionRegistry.has(genericAction.name)) {\n this.actionRegistry.register(genericAction);\n }\n logger.info(`Registered generic A2A action: ${genericAction.name}`);\n }\n }\n\n // Auto-register world actions when world config is present\n const world = this.config.world;\n if (world?.url) {\n const worldUrl = world.url;\n\n const worldActionsList = [\n createJoinWorldAction({ defaultWorldUrl: worldUrl }),\n createLeaveWorldAction({ defaultWorldUrl: worldUrl }),\n createQueryWorldAction({ defaultWorldUrl: worldUrl }),\n createSendWorldMessageAction({ defaultWorldUrl: worldUrl }),\n ];\n\n for (const action of worldActionsList) {\n if (!this.actionRegistry.has(action.name)) {\n this.actionRegistry.register(action);\n }\n }\n logger.info(`Registered 4 world actions (world: ${worldUrl})`);\n }\n\n // Register custom actions (code-based)\n if (this.config.customActions) {\n for (const action of this.config.customActions) {\n this.actionRegistry.register(action);\n }\n }\n }\n\n private async initSocialAdapters(): Promise<void> {\n const social = this.config.social;\n\n // ── Moltbook: detect from env, merge with config ──\n await this.initMoltbook(social);\n\n // ── Twitter: detect from env, merge with config ──\n await this.initTwitter(social);\n\n if (Object.keys(this.socialAdapters).length === 0) {\n logger.warn('Social: No adapters connected. Set MOLTBOOK_API_KEY or Twitter env vars in your .env to enable.');\n }\n }\n\n private async initMoltbook(social: typeof this.config.social): Promise<void> {\n // Resolve API key: config takes priority, then env\n const envKey = process.env.MOLTBOOK_API_KEY;\n const configMoltbook = social.moltbook;\n const apiKey = configMoltbook?.apiKey || envKey || '';\n const isPlaceholder = !apiKey || apiKey === 'your-moltbook-key-here';\n\n // Determine if moltbook should be active\n // A valid API key (from env or config) always wins over enabled: false in scaffold.\n // The scaffold sets enabled: false as a default — setting the key means the user wants it on.\n const explicitlyDisabled = configMoltbook && configMoltbook.enabled === false && !envKey;\n const shouldConnect = !isPlaceholder && !explicitlyDisabled;\n\n if (explicitlyDisabled) {\n logger.info('Moltbook: Disabled in config and no MOLTBOOK_API_KEY in env — skipping');\n return;\n }\n\n if (isPlaceholder) {\n if (configMoltbook?.enabled || envKey) {\n logger.warn('Moltbook: MOLTBOOK_API_KEY is missing or still a placeholder.');\n logger.warn(' Fix: Set a valid MOLTBOOK_API_KEY in your .env file.');\n }\n // No key at all and not configured — stay silent\n return;\n }\n\n if (!shouldConnect) return;\n\n // Build the effective config by merging env + config\n const source = configMoltbook?.apiKey ? 'config' : 'environment';\n const baseUrl = configMoltbook?.baseUrl || process.env.MOLTBOOK_BASE_URL || 'https://www.moltbook.com/api/v1';\n const defaultSubmolt = configMoltbook?.defaultSubmolt || 'general';\n\n const effectiveConfig = {\n enabled: true as const,\n apiKey,\n baseUrl,\n defaultSubmolt,\n ...configMoltbook,\n // Ensure env-resolved values win when config didn't set them\n ...(configMoltbook?.apiKey ? {} : { apiKey }),\n ...(configMoltbook?.baseUrl ? {} : { baseUrl }),\n };\n\n logger.info(`Moltbook: API key detected from ${source}`);\n logger.info(`Moltbook: Connecting to ${baseUrl} ...`);\n\n const adapter = new MoltbookAdapter(effectiveConfig);\n try {\n await adapter.connect();\n this.socialAdapters['moltbook'] = adapter;\n // Write back so the rest of the system sees the effective config\n social.moltbook = effectiveConfig;\n logger.info(`Moltbook: Connected successfully (submolt: ${defaultSubmolt})`);\n } catch (error: any) {\n logger.error(`Moltbook: Connection FAILED — ${error.message || error}`);\n this.logPlatformError('Moltbook', error);\n }\n }\n\n private async initTwitter(social: typeof this.config.social): Promise<void> {\n const configTwitter = social.twitter;\n const envApiKey = process.env.TWITTER_API_KEY;\n const envApiSecret = process.env.TWITTER_API_SECRET;\n const envAccessToken = process.env.TWITTER_ACCESS_TOKEN;\n const envAccessSecret = process.env.TWITTER_ACCESS_SECRET;\n\n // Resolve credentials: config takes priority, then env\n const creds = (configTwitter as any)?.credentials;\n const apiKey = creds?.apiKey || envApiKey || '';\n const apiSecret = creds?.apiSecret || envApiSecret || '';\n const accessToken = creds?.accessToken || envAccessToken || '';\n const accessSecret = creds?.accessSecret || envAccessSecret || '';\n\n const hasKey = apiKey && apiKey !== 'your-twitter-api-key';\n const hasAllCreds = hasKey && apiSecret && accessToken && accessSecret;\n\n // A valid env key overrides enabled: false from the scaffold\n const explicitlyDisabled = configTwitter && configTwitter.enabled === false && !envApiKey;\n\n if (explicitlyDisabled) {\n logger.info('Twitter: Disabled in config and no TWITTER_API_KEY in env — skipping');\n return;\n }\n\n if (!hasKey) {\n if (configTwitter?.enabled || envApiKey) {\n logger.warn('Twitter: Credentials are missing or still placeholders.');\n logger.warn(' Fix: Set valid Twitter keys in your .env file.');\n }\n return;\n }\n\n if (!hasAllCreds) {\n logger.warn('Twitter: Some credentials are missing. Need: TWITTER_API_KEY, TWITTER_API_SECRET, TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_SECRET');\n return;\n }\n\n const source = creds?.apiKey ? 'config' : 'environment';\n logger.info(`Twitter: Credentials detected from ${source}`);\n logger.info('Twitter: Connecting...');\n\n const effectiveConfig = {\n enabled: true as const,\n ...configTwitter,\n credentials: { apiKey, apiSecret, accessToken, accessSecret },\n };\n\n const adapter = new TwitterAdapter(effectiveConfig as any);\n try {\n await adapter.connect();\n this.socialAdapters['twitter'] = adapter;\n social.twitter = effectiveConfig as any;\n logger.info('Twitter: Connected successfully');\n } catch (error: any) {\n logger.error(`Twitter: Connection FAILED — ${error.message || error}`);\n this.logPlatformError('Twitter', error);\n }\n }\n\n private async postStartupMessages(): Promise<void> {\n const adapters = Object.entries(this.socialAdapters);\n\n if (adapters.length === 0) {\n logger.info('Startup post: No connected social adapters — skipping');\n return;\n }\n\n // Generate a personality-driven startup post via the LLM.\n // The system prompt contains the full personality context (bio.md, traits.md, etc.)\n let content: string;\n try {\n const prompt = `You just came online. Write a short, engaging first post for social media.\\n` +\n `Stay fully in character — your personality, background, and role are defined in the system prompt.\\n` +\n `Do NOT use generic phrases like \"is now online and ready\" or \"Hello, world!\".\\n` +\n `Do NOT describe yourself in third person. Do NOT use emojis unless your personality calls for it.\\n` +\n `Write only the post content, nothing else. Keep it concise and natural.`;\n\n content = (await this.llm.generateText(prompt, {\n systemPrompt: this.systemPrompt,\n temperature: this.config.llm.temperature ?? 0.8,\n maxTokens: 280,\n })).trim();\n\n logger.info(`Startup post: LLM generated content (${content.length} chars)`);\n } catch (error: any) {\n // Fallback to a simple message if LLM fails\n logger.warn(`Startup post: LLM generation failed (${error.message}), using fallback`);\n content = `${this.config.name} is now online and ready.`;\n }\n\n for (const [platform, adapter] of adapters) {\n logger.info(`Startup post: Posting to ${platform}...`);\n try {\n const result = await adapter.post(content);\n logger.info(`Startup post: ${platform} SUCCESS — id=${result.id}${result.url ? ` url=${result.url}` : ''}`);\n } catch (error: any) {\n logger.error(`Startup post: ${platform} FAILED — ${error.message || error}`);\n this.logPlatformError(platform, error);\n }\n }\n }\n\n private initScheduledJobs(): void {\n // ── 1. Wire postFrequency from social platform configs ──\n this.wirePostFrequencyJobs();\n\n // ── 2. Wire scheduling tasks (from markdown ## Scheduling or code config) ──\n this.wireSchedulingTasks();\n }\n\n private wirePostFrequencyJobs(): void {\n const social = this.config.social;\n\n // Moltbook postFrequency\n if (social.moltbook?.enabled !== false && this.socialAdapters['moltbook']) {\n const freq = (social.moltbook as any)?.postFrequency;\n if (freq) {\n const intervalMs = parsePostFrequency(freq);\n if (intervalMs > 0) {\n this.scheduler.addJob({\n name: 'moltbook_scheduled_post',\n intervalMs,\n handler: async () => {\n await this.scheduledPost('moltbook');\n },\n });\n logger.info(`Scheduler: Moltbook posting every ${formatInterval(intervalMs)}`);\n }\n }\n }\n\n // Twitter postFrequency\n if (social.twitter?.enabled !== false && this.socialAdapters['twitter']) {\n const freq = (social.twitter as any)?.postFrequency;\n if (freq) {\n const intervalMs = parsePostFrequency(freq);\n if (intervalMs > 0) {\n this.scheduler.addJob({\n name: 'twitter_scheduled_post',\n intervalMs,\n handler: async () => {\n await this.scheduledPost('twitter');\n },\n });\n logger.info(`Scheduler: Twitter posting every ${formatInterval(intervalMs)}`);\n }\n }\n }\n }\n\n private wireSchedulingTasks(): void {\n const tasks = this.config.scheduling;\n if (!tasks || tasks.length === 0) return;\n\n for (const task of tasks) {\n this.scheduler.addJob({\n name: task.name,\n intervalMs: task.intervalMs,\n handler: async () => {\n await this.executeScheduledTask(task);\n },\n });\n logger.info(`Scheduler: \"${task.name}\" every ${formatInterval(task.intervalMs)}`);\n }\n }\n\n private async scheduledPost(platform: string): Promise<void> {\n const adapter = this.socialAdapters[platform];\n if (!adapter) return;\n\n try {\n // Ask the LLM to generate content — system prompt has full personality context\n const prompt = `Generate a short, engaging social media post for ${platform}.\\n` +\n `Stay fully in character based on your personality in the system prompt.\\n` +\n `Write only the post content, nothing else. Keep it concise and natural.`;\n\n const content = await this.llm.generateText(prompt, {\n systemPrompt: this.systemPrompt,\n temperature: this.config.llm.temperature ?? 0.8,\n maxTokens: 280,\n });\n\n const result = await adapter.post(content.trim());\n logger.info(`Scheduled post: ${platform} SUCCESS — id=${result.id}`);\n } catch (error: any) {\n logger.error(`Scheduled post: ${platform} FAILED — ${error.message || error}`);\n this.logPlatformError(platform, error);\n }\n }\n\n private async executeScheduledTask(task: { name: string; instructions: string }): Promise<void> {\n try {\n logger.info(`Scheduled task: Running \"${task.name}\"`);\n\n const prompt = `You are ${this.config.name}, an autonomous agent. Execute the following scheduled task.\\n\\n` +\n `Task: ${task.name}\\n` +\n `Instructions:\\n${task.instructions}\\n\\n` +\n `Available social platforms: ${Object.keys(this.socialAdapters).join(', ') || 'none'}\\n\\n` +\n `Decide what action to take. Respond with JSON:\\n` +\n `{ \"action\": \"<action_name>\", \"reasoning\": \"<why>\", \"parameters\": { ... } }`;\n\n const decision = await this.llm.generateStructured<Decision>(\n prompt,\n {\n type: 'object',\n properties: {\n action: { type: 'string' },\n reasoning: { type: 'string' },\n parameters: { type: 'object' },\n },\n required: ['action', 'reasoning', 'parameters'],\n },\n { systemPrompt: this.systemPrompt, temperature: this.config.llm.temperature },\n );\n\n const result = await this.act(decision.action, decision.parameters);\n logger.info(`Scheduled task: \"${task.name}\" completed — action=${decision.action}, success=${result.success}`);\n } catch (error: any) {\n logger.error(`Scheduled task: \"${task.name}\" FAILED — ${error.message || error}`);\n }\n }\n\n private logPlatformError(platform: string, error: any): void {\n if (!error.response) {\n // Network-level error (DNS, timeout, connection refused)\n if (error.code === 'ENOTFOUND') {\n logger.error(` ${platform}: DNS lookup failed — check the base URL.`);\n } else if (error.code === 'ECONNREFUSED') {\n logger.error(` ${platform}: Connection refused — is the server running?`);\n } else if (error.code === 'ETIMEDOUT' || error.code === 'ECONNABORTED') {\n logger.error(` ${platform}: Request timed out.`);\n } else {\n logger.error(` ${platform}: Network error (${error.code || 'unknown'})`);\n }\n return;\n }\n\n const status = error.response.status;\n const data = error.response.data;\n logger.error(` ${platform}: HTTP ${status}`);\n\n // Log the API response body\n if (data) {\n if (data.error) logger.error(` ${platform}: API error: ${data.error}`);\n if (data.hint) logger.error(` ${platform}: API hint: ${data.hint}`);\n if (!data.error && !data.hint) logger.error(` ${platform}: Response: ${JSON.stringify(data)}`);\n }\n\n // Actionable hints for common HTTP status codes\n if (status === 401) {\n logger.error(` ${platform}: Your API key was rejected. Verify it is correct and the agent is claimed.`);\n } else if (status === 403) {\n logger.error(` ${platform}: Forbidden — your agent may not be claimed yet or lacks permissions.`);\n } else if (status === 429) {\n const retryMin = data?.retry_after_minutes;\n const retrySec = data?.retry_after_seconds;\n if (retryMin) {\n logger.error(` ${platform}: Rate limited — try again in ${retryMin} minute(s).`);\n } else if (retrySec) {\n logger.error(` ${platform}: Rate limited — try again in ${retrySec} second(s).`);\n } else {\n logger.error(` ${platform}: Rate limited — wait before retrying.`);\n }\n } else if (status === 404) {\n logger.error(` ${platform}: Endpoint not found — check the base URL.`);\n } else if (status >= 500) {\n logger.error(` ${platform}: Server error — the platform may be temporarily down.`);\n }\n }\n\n private async autoJoinWorld(): Promise<void> {\n const worldUrl = this.config.world!.url;\n logger.info(`Auto-joining world: ${worldUrl}`);\n\n try {\n const result = await this.act('join_world', {\n worldUrl,\n walletAddress: this.config.world!.walletAddress,\n });\n\n if (result.success) {\n logger.info(`Successfully joined world: ${worldUrl}`);\n } else {\n logger.warn(`Failed to join world: ${result.error}`);\n }\n } catch (error: any) {\n logger.warn(`Auto-join world failed: ${error?.message || error}`);\n }\n }\n\n private startAutonomousLoop(): void {\n const actionsPerHour = typeof this.config.behaviors.actionsPerHour === 'function'\n ? this.config.behaviors.actionsPerHour({})\n : this.config.behaviors.actionsPerHour || 5;\n\n const intervalMs = Math.floor(3600000 / actionsPerHour);\n\n this.tickTimer = setInterval(() => this.tick(), intervalMs);\n logger.info(`Autonomous loop started: ~${actionsPerHour} actions/hour (every ${intervalMs}ms)`);\n }\n\n private isSleeping(): boolean {\n const schedule = this.config.behaviors.sleepSchedule;\n if (!schedule) return false;\n\n const now = new Date();\n const hour = now.getHours();\n\n if (schedule.start > schedule.end) {\n // Wraps midnight (e.g., 22-6)\n return hour >= schedule.start || hour < schedule.end;\n }\n return hour >= schedule.start && hour < schedule.end;\n }\n\n private async gatherContext(): Promise<Record<string, unknown>> {\n return {\n agentName: this.config.name,\n agentType: this.config.type,\n currentTime: new Date().toISOString(),\n state: this.state,\n tickNumber: this.tickCount,\n personality: this.config.personality.traits,\n connectedPlatforms: Object.keys(this.socialAdapters),\n recentActions: this.recentActions.slice(-5),\n scheduledTasks: (this.config.scheduling || []).map((t) => t.name),\n };\n }\n\n private async fireWebhook(event: string, ...args: unknown[]): Promise<void> {\n try {\n const hook = this.config.webhooks?.[event as keyof typeof this.config.webhooks];\n if (typeof hook === 'function') {\n await (hook as Function)(...args);\n } else if (typeof hook === 'string') {\n const { default: axios } = await import('axios');\n await axios.post(hook, { event, data: args });\n }\n } catch (error) {\n logger.error(`Webhook ${event} failed: ${error}`);\n }\n }\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { MarkdownParser } from './MarkdownParser.js';\nimport { validateConfig } from './validator.js';\nimport type { AgentConfig } from './types.js';\n\nexport type ConfigType = 'code' | 'markdown';\n\nexport class ConfigurationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class ConfigLoader {\n private markdownParser = new MarkdownParser();\n\n async load(directory: string): Promise<{ config: AgentConfig; type: ConfigType }> {\n const codeConfigPath = resolve(directory, 'agent.config.ts');\n const mdConfigPath = resolve(directory, 'agent.md');\n\n if (existsSync(codeConfigPath)) {\n return { config: await this.loadCode(codeConfigPath), type: 'code' };\n }\n\n if (existsSync(mdConfigPath)) {\n return { config: await this.loadMarkdown(mdConfigPath), type: 'markdown' };\n }\n\n throw new ConfigurationError(\n `No agent configuration found in ${directory}. Expected agent.config.ts or agent.md`,\n );\n }\n\n async loadCode(filePath: string): Promise<AgentConfig> {\n try {\n // Use jiti to load TypeScript files at runtime without pre-compilation\n const { createJiti } = await import('jiti');\n const jiti = createJiti(pathToFileURL(filePath).href, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const module = await jiti.import(filePath) as any;\n const config = module.default || module;\n return validateConfig(config);\n } catch (error) {\n if (error instanceof Error && error.name === 'ConfigValidationError') throw error;\n throw new ConfigurationError(`Failed to load code config from ${filePath}: ${error}`);\n }\n }\n\n async loadMarkdown(filePath: string): Promise<AgentConfig> {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const partialConfig = this.markdownParser.parse(content);\n\n // Markdown configs need LLM settings from env or frontmatter\n const config = {\n ...partialConfig,\n llm: partialConfig.llm || {\n provider: (process.env.LLM_PROVIDER as 'anthropic' | 'openai') || 'anthropic',\n model: process.env.LLM_MODEL || 'claude-sonnet-4-20250514',\n apiKey: process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY || '',\n },\n };\n\n return validateConfig(config);\n } catch (error) {\n if (error instanceof Error && error.name === 'ConfigValidationError') throw error;\n throw new ConfigurationError(`Failed to load markdown config from ${filePath}: ${error}`);\n }\n }\n}\n","import matter from 'gray-matter';\nimport type { AgentConfig, ScheduledTask } from './types.js';\n\ninterface ParsedSection {\n title: string;\n level: number;\n content: string;\n children: ParsedSection[];\n}\n\nexport class MarkdownParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MarkdownParseError';\n }\n}\n\nexport class MarkdownParser {\n parse(markdown: string): Partial<AgentConfig> {\n const { data: frontmatter, content } = matter(markdown);\n const sections = this.parseSections(content);\n\n const identity = this.findSection(sections, 'Identity');\n const bio = this.findSection(sections, 'Bio');\n const social = this.findSection(sections, 'Social Platforms');\n const behaviors = this.findSection(sections, 'Behaviors');\n const memory = this.findSection(sections, 'Memory');\n const skills = this.findSection(sections, 'Skills');\n const scheduling = this.findSection(sections, 'Scheduling');\n const world = this.findSection(sections, 'World');\n\n const identityData = this.parseIdentity(identity);\n const bioText = bio ? bio.content.trim() : (identityData?.personality?.bio || '');\n\n const config: Partial<AgentConfig> = {\n ...identityData,\n personality: {\n traits: identityData?.personality?.traits || [],\n bio: bioText,\n },\n ...(social ? { social: this.parseSocial(social) } : {}),\n ...(behaviors ? { behaviors: this.parseBehaviors(behaviors) } : {}),\n ...(memory ? { memory: this.parseMemory(memory) } : {}),\n ...(world ? { world: this.parseWorld(world) } : {}),\n actions: [],\n ...frontmatter,\n };\n\n if (skills) {\n config.actions = skills.children.map((s) => this.toSnakeCase(s.title));\n }\n\n if (scheduling && scheduling.children.length > 0) {\n config.scheduling = this.parseScheduling(scheduling);\n }\n\n return config;\n }\n\n parseSkills(markdown: string): Array<{ name: string; description: string }> {\n const { content } = matter(markdown);\n const sections = this.parseSections(content);\n const skills = this.findSection(sections, 'Skills');\n\n if (!skills) return [];\n\n return skills.children.map((child) => ({\n name: this.toSnakeCase(child.title),\n description: child.content.trim(),\n }));\n }\n\n private parseSections(content: string): ParsedSection[] {\n const lines = content.split('\\n');\n const root: ParsedSection[] = [];\n const stack: Array<{ level: number; section: ParsedSection }> = [];\n\n for (const line of lines) {\n const match = line.match(/^(#{1,6})\\s+(.+)/);\n if (match) {\n const level = match[1].length;\n const title = match[2].trim();\n const section: ParsedSection = { title, level, content: '', children: [] };\n\n while (stack.length > 0 && stack[stack.length - 1].level >= level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(section);\n } else {\n stack[stack.length - 1].section.children.push(section);\n }\n\n stack.push({ level, section });\n } else if (stack.length > 0) {\n stack[stack.length - 1].section.content += line + '\\n';\n }\n }\n\n return root;\n }\n\n private findSection(sections: ParsedSection[], title: string): ParsedSection | undefined {\n for (const section of sections) {\n if (section.title.toLowerCase() === title.toLowerCase()) return section;\n const found = this.findSection(section.children, title);\n if (found) return found;\n }\n return undefined;\n }\n\n private parseIdentity(section?: ParsedSection): Partial<AgentConfig> | undefined {\n if (!section) return undefined;\n const fields = this.parseKeyValueLines(section.content);\n return {\n name: fields['name'] || 'Unnamed Agent',\n type: fields['type'],\n personality: {\n traits: (fields['personality'] || '').split(',').map((t: string) => t.trim()).filter(Boolean),\n bio: '',\n },\n };\n }\n\n private parseSocial(section: ParsedSection): Record<string, any> {\n const social: Record<string, any> = {};\n\n for (const child of section.children) {\n const platform = child.title.toLowerCase();\n const fields = this.parseKeyValueLines(child.content);\n const enabled = fields['enabled'] === 'true';\n delete fields['enabled'];\n\n // Convert snake_case keys to camelCase so they match TypeScript interfaces\n const camelFields: Record<string, string> = {};\n for (const [key, value] of Object.entries(fields)) {\n camelFields[this.toCamelCase(key)] = value;\n }\n\n social[platform] = {\n enabled,\n ...camelFields,\n };\n }\n\n return social;\n }\n\n private parseBehaviors(section: ParsedSection): AgentConfig['behaviors'] {\n const fields = this.parseKeyValueLines(section.content);\n return {\n autonomous: fields['autonomous'] === 'true',\n decisionMaking: (fields['decision_making'] || 'llm-driven') as AgentConfig['behaviors']['decisionMaking'],\n actionsPerHour: fields['actions_per_hour'] ? parseInt(fields['actions_per_hour'], 10) : undefined,\n sleepSchedule: fields['sleep_schedule'] ? this.parseSleepSchedule(fields['sleep_schedule']) : undefined,\n };\n }\n\n private parseMemory(section: ParsedSection): AgentConfig['memory'] {\n const fields = this.parseKeyValueLines(section.content);\n return {\n type: (fields['type'] || 'memory') as AgentConfig['memory']['type'],\n retention: fields['retention'],\n };\n }\n\n private parseWorld(section: ParsedSection): AgentConfig['world'] | undefined {\n const fields = this.parseKeyValueLines(section.content);\n const url = fields['url'];\n if (!url) return undefined;\n return {\n url,\n autoJoin: fields['auto_join'] !== 'false',\n ...(fields['wallet_address'] ? { walletAddress: fields['wallet_address'] } : {}),\n };\n }\n\n private parseSleepSchedule(value: string): { start: number; end: number; timezone?: string } {\n const match = value.match(/(\\d{1,2}):?\\d{0,2}\\s*-\\s*(\\d{1,2}):?\\d{0,2}\\s*(.*)?/);\n if (!match) return { start: 22, end: 6 };\n return {\n start: parseInt(match[1], 10),\n end: parseInt(match[2], 10),\n timezone: match[3]?.trim() || undefined,\n };\n }\n\n private parseKeyValueLines(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):\\s*(.+)/);\n if (match) {\n result[match[1].trim()] = match[2].trim();\n }\n }\n return result;\n }\n\n private parseScheduling(section: ParsedSection): ScheduledTask[] {\n const tasks: ScheduledTask[] = [];\n\n for (const child of section.children) {\n const title = child.title.trim();\n\n // Skip \"On Startup\" — startup is handled separately in Agent.init()\n if (/^on\\s+startup$/i.test(title)) continue;\n\n const intervalMs = this.parseIntervalFromTitle(title);\n if (intervalMs <= 0) continue;\n\n const instructions = child.content.trim();\n if (!instructions) continue;\n\n tasks.push({\n name: this.toSnakeCase(title),\n intervalMs,\n instructions,\n });\n }\n\n return tasks;\n }\n\n private parseIntervalFromTitle(title: string): number {\n const lower = title.toLowerCase();\n\n // \"Every 30 Minutes\", \"Every 5 Minutes\"\n const minMatch = lower.match(/every\\s+(\\d+)\\s+minutes?/);\n if (minMatch) return parseInt(minMatch[1], 10) * 60 * 1000;\n\n // \"Every Hour\"\n if (/every\\s+hour$/i.test(lower)) return 60 * 60 * 1000;\n\n // \"Every 2 Hours\", \"Every 6 Hours\"\n const hourMatch = lower.match(/every\\s+(\\d+)\\s+hours?/);\n if (hourMatch) return parseInt(hourMatch[1], 10) * 60 * 60 * 1000;\n\n // \"Every Day\" or \"Every Day at ...\"\n if (/every\\s+day/i.test(lower)) return 24 * 60 * 60 * 1000;\n\n // \"Every Week\"\n if (/every\\s+week/i.test(lower)) return 7 * 24 * 60 * 60 * 1000;\n\n return 0;\n }\n\n private toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n }\n\n private toSnakeCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '');\n }\n}\n","import { z } from 'zod';\n\n// ── Social Platform Configs ──\n\nexport interface MoltbookConfig {\n enabled: boolean;\n apiKey: string;\n baseUrl?: string;\n defaultSubmolt?: string;\n postFrequency?: string; // 'hourly', 'daily', '30m', '2h', etc.\n engagementRate?: 'low' | 'medium' | 'high';\n autoReply?: boolean;\n replyFilter?: (post: any) => boolean;\n}\n\nexport interface TwitterConfig {\n enabled: boolean;\n credentials: {\n apiKey: string;\n apiSecret: string;\n accessToken: string;\n accessSecret: string;\n bearerToken?: string;\n };\n postFrequency?: string; // 'hourly', 'daily', '30m', '2h', etc.\n replyToMentions?: boolean;\n autoRetweet?: boolean;\n maxTweetsPerDay?: number;\n contentStrategy?: {\n threadTopics?: string[];\n hashtagStrategy?: string;\n mentionBehavior?: string;\n };\n}\n\nexport interface SocialPlatformConfig {\n enabled: boolean;\n [key: string]: unknown;\n}\n\nexport type SocialConfig = {\n moltbook?: MoltbookConfig;\n twitter?: TwitterConfig;\n} & Record<string, SocialPlatformConfig | MoltbookConfig | TwitterConfig | undefined>;\n\n// ── Behavior Configs ──\n\nexport interface BehaviorTrigger {\n condition: (context: any) => boolean;\n action: string;\n params?: Record<string, unknown>;\n}\n\n// ── Memory Configs ──\n\nexport interface RedisConfig {\n url: string;\n keyPrefix?: string;\n ttl?: number;\n}\n\nexport interface PostgresConfig {\n url: string;\n schema?: string;\n tableName?: string;\n}\n\n// ── Plugin Interface ──\n\nexport interface Plugin {\n name: string;\n version: string;\n init?: (agent: any) => Promise<void>;\n destroy?: () => Promise<void>;\n}\n\n// ── Scheduling ──\n\nexport interface ScheduledTask {\n name: string;\n intervalMs: number;\n instructions: string; // What to do (natural language or action name)\n}\n\n// ── Main Agent Config ──\n\nexport interface AgentConfig {\n name: string;\n type?: string;\n\n personality: {\n traits: string[];\n bio: string;\n [key: string]: unknown;\n };\n\n llm: {\n provider: 'anthropic' | 'openai';\n model: string;\n apiKey: string;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n };\n\n social: SocialConfig;\n\n /**\n * A2A Protocol Configuration\n * When enabled, automatically registers A2A communication actions\n * @optional\n */\n a2a?: {\n /**\n * Enable A2A protocol support (defaults to true when a2a config exists)\n */\n enabled?: boolean;\n\n /**\n * Peer agents this agent can communicate with\n * Key is the action name, value is the agent URL\n * @example { talk_to_analyst: 'http://localhost:3001' }\n */\n peers?: Record<string, string>;\n\n /**\n * Default peer agent URL (used when peers not specified)\n */\n defaultPeerUrl?: string;\n\n /**\n * Enable verbose A2A logging\n */\n verbose?: boolean;\n\n /**\n * Custom action name for generic A2A communication (defaults to 'talk_to_agent')\n */\n genericActionName?: string;\n };\n\n behaviors: {\n autonomous: boolean;\n decisionMaking: 'llm-driven' | 'rule-based' | 'hybrid';\n actionsPerHour?: number | ((context: any) => number);\n sleepSchedule?: { start: number; end: number; timezone?: string };\n triggers?: BehaviorTrigger[];\n };\n\n memory: {\n type: 'memory' | 'redis' | 'postgres' | 'hybrid';\n retention?: string;\n redis?: RedisConfig;\n postgres?: PostgresConfig;\n };\n\n actions: string[];\n customActions?: Action[];\n scheduling?: ScheduledTask[];\n\n /** World SDK integration — connect this agent to a world */\n world?: {\n /** URL of the world to join */\n url: string;\n /** Wallet address for blockchain-enabled worlds */\n walletAddress?: string;\n /** Auto-join the world when agent starts (default: true) */\n autoJoin?: boolean;\n };\n\n webhooks?: {\n onAction?: string | ((action: any, result: any) => Promise<void>);\n onError?: string;\n };\n\n plugins?: Plugin[];\n}\n\n// ── Action Types ──\n\nexport interface ActionContext {\n agent: any;\n memory: any;\n llm: any;\n parameters: Record<string, unknown>;\n}\n\nexport interface ActionResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\nexport interface Action {\n name: string;\n description: string;\n parameters?: Record<string, unknown>;\n execute: (context: ActionContext) => Promise<ActionResult>;\n}\n\n// ── Decision / Experience Types ──\n\nexport interface Decision {\n action: string;\n reasoning: string;\n parameters: Record<string, unknown>;\n}\n\nexport interface Experience {\n type: string;\n action: string;\n result: ActionResult;\n timestamp: Date;\n context?: Record<string, unknown>;\n}\n\n// ── Deployment Types ──\n\nexport interface DeploymentConfig {\n platform: 'railway' | 'render' | 'aws' | 'digitalocean' | 'custom';\n region?: string;\n instanceType?: string;\n autoScale?: boolean;\n customConfig?: CustomDeploymentConfig;\n}\n\nexport interface DeploymentResult {\n success: boolean;\n url?: string;\n deploymentId?: string;\n logs?: string[];\n error?: string;\n}\n\nexport interface DeploymentStatus {\n state: 'running' | 'stopped' | 'deploying' | 'failed' | 'unknown';\n url?: string;\n uptime?: number;\n lastDeployed?: Date;\n}\n\nexport interface CustomDeploymentConfig {\n deploymentMethod: 'docker' | 'ssh' | 'cli' | 'api';\n buildCommand: string;\n startCommand: string;\n environmentVariables?: Record<string, string>;\n healthCheckUrl?: string;\n port?: number;\n docker?: CustomDockerConfig;\n ssh?: CustomSSHConfig;\n cli?: CustomCLIConfig;\n api?: CustomAPIConfig;\n}\n\nexport interface CustomDockerConfig {\n registry: string;\n imageName: string;\n tag?: string;\n dockerfile?: string;\n buildArgs?: Record<string, string>;\n registryAuth?: {\n username: string;\n password: string;\n };\n hostUrl: string;\n containerPort: number;\n hostPort: number;\n}\n\nexport interface CustomSSHConfig {\n host: string;\n port: number;\n username: string;\n authMethod: 'password' | 'privateKey';\n password?: string;\n privateKeyPath?: string;\n deploymentPath: string;\n preDeployCommands?: string[];\n postDeployCommands?: string[];\n}\n\nexport interface CustomCLIConfig {\n cliName: string;\n installCommand?: string;\n loginCommand?: string;\n deployCommand: string;\n statusCommand?: string;\n logsCommand?: string;\n credentials?: Record<string, string>;\n}\n\nexport interface CustomAPIConfig {\n baseUrl: string;\n authType: 'bearer' | 'apiKey' | 'basic' | 'custom';\n authToken?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n endpoints: {\n deploy: string;\n status?: string;\n logs?: string;\n rollback?: string;\n };\n requestMethod?: 'POST' | 'PUT';\n payloadTemplate?: Record<string, unknown>;\n}\n\n// ── Social Types ──\n\nexport interface PostResult {\n id: string;\n url?: string;\n timestamp: Date;\n}\n\nexport interface ReplyResult {\n id: string;\n parentId: string;\n url?: string;\n timestamp: Date;\n}\n\nexport interface Mention {\n id: string;\n authorId: string;\n authorName: string;\n content: string;\n timestamp: Date;\n platform: string;\n}\n\nexport interface Profile {\n id: string;\n name: string;\n bio?: string;\n followers?: number;\n following?: number;\n platform: string;\n}\n\n// ── Zod Schemas for Runtime Validation (markdown configs) ──\n\nexport const AgentConfigSchema = z.object({\n name: z.string().min(1),\n type: z.string().optional(),\n personality: z.object({\n traits: z.array(z.string()),\n bio: z.string(),\n }).passthrough(),\n llm: z.object({\n provider: z.enum(['anthropic', 'openai']),\n model: z.string(),\n apiKey: z.string(),\n temperature: z.number().min(0).max(2).optional(),\n maxTokens: z.number().positive().optional(),\n systemPrompt: z.string().optional(),\n }),\n social: z.record(z.unknown()).optional(),\n behaviors: z.object({\n autonomous: z.boolean(),\n decisionMaking: z.enum(['llm-driven', 'rule-based', 'hybrid']),\n actionsPerHour: z.number().optional(),\n sleepSchedule: z.object({\n start: z.number(),\n end: z.number(),\n timezone: z.string().optional(),\n }).optional(),\n }),\n memory: z.object({\n type: z.enum(['memory', 'redis', 'postgres', 'hybrid']),\n retention: z.string().optional(),\n }).passthrough(),\n actions: z.array(z.string()),\n}).passthrough();\n","import { AgentConfig, AgentConfigSchema } from './types.js';\n\nexport class ConfigValidationError extends Error {\n constructor(\n message: string,\n public issues: Array<{ path: string; message: string }>,\n ) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\nexport function validateConfig(config: unknown): AgentConfig {\n const result = AgentConfigSchema.safeParse(config);\n\n if (!result.success) {\n const issues = result.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n\n throw new ConfigValidationError(\n `Invalid agent configuration:\\n${issues.map((i) => ` - ${i.path}: ${i.message}`).join('\\n')}`,\n issues,\n );\n }\n\n return result.data as AgentConfig;\n}\n","import { Memory } from './Memory.js';\nimport type { Experience } from '../config/types.js';\nimport type { RedisConfig, PostgresConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('LongTermMemory');\n\nexport class LongTermMemory extends Memory {\n private redisConfig?: RedisConfig;\n private postgresConfig?: PostgresConfig;\n private redis: any = null;\n private pg: any = null;\n private initialized = false;\n\n constructor(options: { redis?: RedisConfig; postgres?: PostgresConfig } = {}) {\n super();\n this.redisConfig = options.redis;\n this.postgresConfig = options.postgres;\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n if (this.redisConfig) {\n await this.initRedis();\n }\n\n if (this.postgresConfig) {\n await this.initPostgres();\n }\n\n this.initialized = true;\n }\n\n // ── Redis: Short-term cache operations ──\n\n async remember(key: string, value: unknown, ttl?: number): Promise<void> {\n await this.ensureRedis();\n const serialized = JSON.stringify(value);\n const prefixedKey = this.redisKey(key);\n\n if (ttl) {\n await this.redis.setex(prefixedKey, ttl, serialized);\n } else {\n const defaultTtl = this.redisConfig?.ttl || 86400; // 24h default\n await this.redis.setex(prefixedKey, defaultTtl, serialized);\n }\n }\n\n async recall(key: string): Promise<unknown> {\n await this.ensureRedis();\n const data = await this.redis.get(this.redisKey(key));\n if (data === null) return undefined;\n try {\n return JSON.parse(data);\n } catch {\n return data;\n }\n }\n\n async forget(key: string): Promise<void> {\n await this.ensureRedis();\n await this.redis.del(this.redisKey(key));\n }\n\n // ── Postgres: Persistent storage operations ──\n\n async store(key: string, value: unknown): Promise<void> {\n await this.ensurePostgres();\n const table = this.pgTable();\n await this.pg.query(\n `INSERT INTO ${table} (key, value, updated_at)\n VALUES ($1, $2, NOW())\n ON CONFLICT (key) DO UPDATE SET value = $2, updated_at = NOW()`,\n [key, JSON.stringify(value)],\n );\n }\n\n async retrieve(key: string): Promise<unknown> {\n await this.ensurePostgres();\n const table = this.pgTable();\n const result = await this.pg.query(\n `SELECT value FROM ${table} WHERE key = $1`,\n [key],\n );\n if (result.rows.length === 0) return undefined;\n try {\n return JSON.parse(result.rows[0].value);\n } catch {\n return result.rows[0].value;\n }\n }\n\n async delete(key: string): Promise<void> {\n await this.ensurePostgres();\n const table = this.pgTable();\n await this.pg.query(`DELETE FROM ${table} WHERE key = $1`, [key]);\n }\n\n // ── Postgres: Experience/semantic storage ──\n\n async addExperience(experience: Experience): Promise<void> {\n await this.ensurePostgres();\n const table = this.pgExperienceTable();\n await this.pg.query(\n `INSERT INTO ${table} (type, action, result, context, timestamp)\n VALUES ($1, $2, $3, $4, $5)`,\n [\n experience.type,\n experience.action,\n JSON.stringify(experience.result),\n JSON.stringify(experience.context || {}),\n experience.timestamp,\n ],\n );\n }\n\n async queryExperiences(query: string, limit = 20): Promise<Experience[]> {\n await this.ensurePostgres();\n const table = this.pgExperienceTable();\n\n // Text search on action and context fields\n const result = await this.pg.query(\n `SELECT type, action, result, context, timestamp FROM ${table}\n WHERE action ILIKE $1 OR context::text ILIKE $1\n ORDER BY timestamp DESC\n LIMIT $2`,\n [`%${query}%`, limit],\n );\n\n return result.rows.map((row: any) => ({\n type: row.type,\n action: row.action,\n result: typeof row.result === 'string' ? JSON.parse(row.result) : row.result,\n context: typeof row.context === 'string' ? JSON.parse(row.context) : row.context,\n timestamp: new Date(row.timestamp),\n }));\n }\n\n async clear(): Promise<void> {\n if (this.redis) {\n const prefix = this.redisConfig?.keyPrefix || 'moltium:';\n const keys = await this.redis.keys(`${prefix}*`);\n if (keys.length > 0) {\n await this.redis.del(...keys);\n }\n }\n\n if (this.pg) {\n await this.pg.query(`DELETE FROM ${this.pgTable()}`);\n await this.pg.query(`DELETE FROM ${this.pgExperienceTable()}`);\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.redis) {\n await this.redis.quit();\n this.redis = null;\n }\n if (this.pg) {\n await this.pg.end();\n this.pg = null;\n }\n this.initialized = false;\n }\n\n // ── Schema setup (call once to create tables) ──\n\n async ensureSchema(): Promise<void> {\n await this.ensurePostgres();\n const table = this.pgTable();\n const expTable = this.pgExperienceTable();\n const schema = this.postgresConfig?.schema || 'public';\n\n await this.pg.query(`CREATE SCHEMA IF NOT EXISTS ${schema}`);\n\n await this.pg.query(`\n CREATE TABLE IF NOT EXISTS ${table} (\n key TEXT PRIMARY KEY,\n value JSONB NOT NULL,\n updated_at TIMESTAMPTZ DEFAULT NOW()\n )\n `);\n\n await this.pg.query(`\n CREATE TABLE IF NOT EXISTS ${expTable} (\n id SERIAL PRIMARY KEY,\n type TEXT NOT NULL,\n action TEXT NOT NULL,\n result JSONB NOT NULL,\n context JSONB DEFAULT '{}',\n timestamp TIMESTAMPTZ NOT NULL,\n created_at TIMESTAMPTZ DEFAULT NOW()\n )\n `);\n\n await this.pg.query(`\n CREATE INDEX IF NOT EXISTS idx_${this.sanitizeName()}_experiences_action\n ON ${expTable} (action)\n `);\n\n await this.pg.query(`\n CREATE INDEX IF NOT EXISTS idx_${this.sanitizeName()}_experiences_timestamp\n ON ${expTable} (timestamp DESC)\n `);\n }\n\n // ── Internal helpers ──\n\n private async initRedis(): Promise<void> {\n if (!this.redisConfig) throw new Error('Redis config not provided');\n\n try {\n const { default: Redis } = await import('ioredis');\n this.redis = new Redis(this.redisConfig.url);\n logger.info('Redis connection established');\n } catch (error) {\n logger.error(`Failed to connect to Redis: ${error}`);\n throw error;\n }\n }\n\n private async initPostgres(): Promise<void> {\n if (!this.postgresConfig) throw new Error('Postgres config not provided');\n\n try {\n const pg = await import('pg');\n const Pool = pg.default?.Pool || pg.Pool;\n this.pg = new Pool({\n connectionString: this.postgresConfig.url,\n });\n // Test the connection\n await this.pg.query('SELECT 1');\n logger.info('Postgres connection established');\n } catch (error) {\n logger.error(`Failed to connect to Postgres: ${error}`);\n throw error;\n }\n }\n\n private async ensureRedis(): Promise<void> {\n if (!this.redis) {\n if (!this.redisConfig) {\n throw new Error('Redis not configured. Provide redis config in memory settings.');\n }\n await this.initRedis();\n }\n }\n\n private async ensurePostgres(): Promise<void> {\n if (!this.pg) {\n if (!this.postgresConfig) {\n throw new Error('Postgres not configured. Provide postgres config in memory settings.');\n }\n await this.initPostgres();\n }\n }\n\n private redisKey(key: string): string {\n const prefix = this.redisConfig?.keyPrefix || 'moltium:';\n return `${prefix}${key}`;\n }\n\n private pgTable(): string {\n const schema = this.postgresConfig?.schema || 'public';\n const table = this.postgresConfig?.tableName || 'moltium_memory';\n return `${schema}.${table}`;\n }\n\n private pgExperienceTable(): string {\n const schema = this.postgresConfig?.schema || 'public';\n const table = this.postgresConfig?.tableName || 'moltium_memory';\n return `${schema}.${table}_experiences`;\n }\n\n private sanitizeName(): string {\n return (this.postgresConfig?.tableName || 'moltium_memory').replace(/[^a-z0-9_]/g, '_');\n }\n}\n","import express from 'express';\nimport { createRoutes } from './routes.js';\nimport { requestLogger, errorHandler, authMiddleware } from './middleware.js';\nimport type { Agent } from '../agent/Agent.js';\nimport { createLogger } from '../logger.js';\nimport { createA2AIntegration, type A2AServerOptions } from '../a2a/index.js';\n\nconst logger = createLogger('Server');\nconst AGENT_CARD_PATH = '.well-known/agent.json';\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n enableA2A?: boolean;\n a2aConfig?: A2AServerOptions['a2aConfig'];\n}\n\nexport function createApp(agent: Agent, options: ServerOptions = {}) {\n const app = express();\n\n app.use(express.json());\n app.use(requestLogger);\n app.use(authMiddleware);\n \n // Mount standard Moltium routes\n app.use(createRoutes(agent));\n\n // Mount A2A protocol endpoints if enabled\n if (options.enableA2A !== false) {\n const port = options.port || parseInt(process.env.PORT || '3000', 10);\n const host = options.host || '0.0.0.0';\n // 0.0.0.0 is a bind address, not reachable — use localhost in the agent card\n const cardHost = host === '0.0.0.0' ? 'localhost' : host;\n const protocol = cardHost === 'localhost' || cardHost === '127.0.0.1' ? 'http' : 'https';\n // Always sanitize 0.0.0.0 — it's a bind address, not reachable by other services\n const rawBaseUrl = options.a2aConfig?.baseUrl || `${protocol}://${cardHost}:${port}`;\n const baseUrl = rawBaseUrl.replace('://0.0.0.0:', '://localhost:');\n\n const a2aIntegration = createA2AIntegration(agent, {\n a2aConfig: {\n enabled: true,\n baseUrl,\n pushNotifications: options.a2aConfig?.pushNotifications ?? false,\n streaming: options.a2aConfig?.streaming ?? true,\n stateTransitionHistory: options.a2aConfig?.stateTransitionHistory ?? true,\n },\n });\n\n const handlers = a2aIntegration.getHandlers();\n\n // Mount A2A endpoints\n app.use(`/${AGENT_CARD_PATH}`, handlers.agentCard);\n app.use('/a2a/jsonrpc', handlers.jsonRpc);\n app.use('/a2a/rest', handlers.rest);\n\n logger.info('A2A protocol endpoints enabled');\n }\n\n app.use(errorHandler);\n\n return app;\n}\n\nexport async function startServer(agent: Agent, options: ServerOptions = {}): Promise<void> {\n const port = options.port || parseInt(process.env.PORT || '3000', 10);\n const host = options.host || '0.0.0.0';\n\n const app = createApp(agent, options);\n\n // Start HTTP server FIRST so the agent card is servable before auto-join\n await new Promise<void>((resolve) => {\n app.listen(port, host, () => {\n logger.info(`Agent \"${agent.name}\" running at http://${host}:${port}`);\n\n if (options.enableA2A !== false) {\n const logHost = host === '0.0.0.0' ? 'localhost' : host;\n const protocol = logHost === 'localhost' || logHost === '127.0.0.1' ? 'http' : 'https';\n const baseUrl = `${protocol}://${logHost}:${port}`;\n logger.info('A2A Protocol Endpoints:');\n logger.info(` Agent Card: ${baseUrl}/.well-known/agent.json`);\n logger.info(` JSON-RPC: ${baseUrl}/a2a/jsonrpc`);\n logger.info(` HTTP+JSON: ${baseUrl}/a2a/rest`);\n }\n\n resolve();\n });\n });\n\n // Start agent AFTER server is listening (world needs to fetch agent card during auto-join)\n await agent.start();\n\n // Graceful shutdown\n const shutdown = async () => {\n logger.info('Received shutdown signal');\n await agent.stop();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","import { Router, type Request, type Response } from 'express';\nimport type { Agent } from '../agent/Agent.js';\n\nexport function createRoutes(agent: Agent): Router {\n const router = Router();\n\n router.get('/', (_req: Request, res: Response) => {\n res.json({\n agent: agent.name,\n type: agent.config.type || 'general',\n state: agent.getState(),\n endpoints: {\n 'GET /': 'This overview',\n 'GET /health': 'Health check',\n 'GET /status': 'Agent status and uptime',\n 'POST /message': 'Send a message to the agent (body: { message })',\n 'POST /action': 'Trigger a specific action (body: { action, parameters })',\n 'GET /config': 'View agent configuration (redacted)',\n 'POST /shutdown': 'Graceful shutdown',\n },\n });\n });\n\n router.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n });\n\n router.get('/status', (_req: Request, res: Response) => {\n res.json({\n name: agent.name,\n state: agent.getState(),\n type: agent.config.type || 'general',\n uptime: process.uptime(),\n timestamp: new Date().toISOString(),\n });\n });\n\n router.get('/message', (_req: Request, res: Response) => {\n res.status(405).json({\n error: 'Method Not Allowed',\n message: 'Use POST /message to send a message to the agent.',\n expected_body: { message: 'string' },\n });\n });\n\n router.post('/message', async (req: Request, res: Response) => {\n try {\n const { message } = req.body;\n if (!message) {\n res.status(400).json({ error: 'Missing message field' });\n return;\n }\n\n const response = await agent.getLLM().generateText(message, {\n systemPrompt: `You are ${agent.name}. ${agent.config.personality.bio}`,\n temperature: agent.config.llm.temperature,\n });\n\n res.json({ response });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });\n }\n });\n\n router.get('/action', (_req: Request, res: Response) => {\n res.status(405).json({\n error: 'Method Not Allowed',\n message: 'Use POST /action to trigger an action.',\n expected_body: { action: 'string', parameters: '{}' },\n });\n });\n\n router.post('/action', async (req: Request, res: Response) => {\n try {\n const { action, parameters } = req.body;\n if (!action) {\n res.status(400).json({ error: 'Missing action field' });\n return;\n }\n\n const result = await agent.act(action, parameters || {});\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });\n }\n });\n\n router.get('/config', (_req: Request, res: Response) => {\n // Return config without sensitive fields\n const safeConfig = {\n name: agent.config.name,\n type: agent.config.type,\n personality: agent.config.personality,\n behaviors: {\n autonomous: agent.config.behaviors.autonomous,\n decisionMaking: agent.config.behaviors.decisionMaking,\n actionsPerHour: typeof agent.config.behaviors.actionsPerHour === 'function'\n ? '(dynamic)'\n : agent.config.behaviors.actionsPerHour,\n sleepSchedule: agent.config.behaviors.sleepSchedule,\n },\n memory: { type: agent.config.memory.type },\n actions: agent.config.actions,\n };\n\n res.json(safeConfig);\n });\n\n router.post('/shutdown', async (_req: Request, res: Response) => {\n res.json({ message: 'Shutting down...' });\n await agent.stop();\n process.exit(0);\n });\n\n return router;\n}\n","import type { Request, Response, NextFunction } from 'express';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('Server');\n\nexport function requestLogger(req: Request, _res: Response, next: NextFunction): void {\n logger.debug(`${req.method} ${req.path}`);\n next();\n}\n\nexport function errorHandler(err: Error, _req: Request, res: Response, _next: NextFunction): void {\n logger.error(`Server error: ${err.message}`);\n res.status(500).json({ error: err.message });\n}\n\nexport function authMiddleware(req: Request, res: Response, next: NextFunction): void {\n const authToken = process.env.AGENT_AUTH_TOKEN;\n\n // If no auth token is configured, skip authentication\n if (!authToken) {\n next();\n return;\n }\n\n const provided = req.headers.authorization?.replace('Bearer ', '');\n if (provided !== authToken) {\n res.status(401).json({ error: 'Unauthorized' });\n return;\n }\n\n next();\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport type { AgentConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('AgentCardBuilder');\n\nexport interface A2AConfig {\n enabled: boolean;\n baseUrl: string;\n port?: number;\n pushNotifications?: boolean;\n streaming?: boolean;\n stateTransitionHistory?: boolean;\n}\n\n/**\n * Builds an A2A-compliant AgentCard from a Moltium AgentConfig.\n */\nexport class AgentCardBuilder {\n /**\n * Creates an A2A AgentCard from Moltium configuration.\n * @param config The Moltium agent configuration\n * @param a2aConfig A2A-specific configuration (URLs, capabilities)\n * @returns A2A-compliant AgentCard\n */\n static build(config: AgentConfig, a2aConfig: A2AConfig): AgentCard {\n const baseUrl = a2aConfig.baseUrl;\n \n // Convert Moltium actions to A2A skills\n const skills = this.buildSkills(config);\n\n // Build capability flags\n const capabilities = {\n streaming: a2aConfig.streaming ?? true,\n pushNotifications: a2aConfig.pushNotifications ?? false,\n stateTransitionHistory: a2aConfig.stateTransitionHistory ?? true,\n };\n\n // Determine input/output modes from agent configuration\n const defaultInputModes = ['text'];\n const defaultOutputModes = ['text'];\n\n const agentCard: AgentCard = {\n name: config.name,\n description: config.personality.bio || `${config.name} - An autonomous AI agent`,\n protocolVersion: '0.3.0',\n version: '0.1.28',\n url: `${baseUrl}/a2a/jsonrpc`,\n skills,\n capabilities,\n defaultInputModes,\n defaultOutputModes,\n additionalInterfaces: [\n { url: `${baseUrl}/a2a/jsonrpc`, transport: 'JSONRPC' },\n { url: `${baseUrl}/a2a/rest`, transport: 'HTTP+JSON' },\n ],\n };\n\n logger.debug('Built A2A AgentCard', {\n name: agentCard.name,\n skillCount: skills.length,\n baseUrl,\n });\n\n return agentCard;\n }\n\n /**\n * Converts Moltium actions to A2A skills.\n */\n private static buildSkills(config: AgentConfig): AgentCard['skills'] {\n const skills: AgentCard['skills'] = [];\n\n // Add a default \"chat\" skill that encompasses the agent's capabilities\n skills.push({\n id: 'chat',\n name: 'Chat',\n description: `Interact with ${config.name}. ${config.personality.bio || ''}`,\n tags: ['chat', 'conversation'],\n });\n\n // Add skill for each action category\n const hasPosting = config.actions.some((a) => \n a.includes('post') || a.includes('update')\n );\n if (hasPosting) {\n skills.push({\n id: 'social_posting',\n name: 'Social Posting',\n description: 'Post updates and content to social platforms',\n tags: ['social', 'posting'],\n });\n }\n\n const hasEngagement = config.actions.some((a) => \n a.includes('comment') || a.includes('reply') || a.includes('respond')\n );\n if (hasEngagement) {\n skills.push({\n id: 'social_engagement',\n name: 'Social Engagement',\n description: 'Engage with others through comments and replies',\n tags: ['social', 'engagement'],\n });\n }\n\n const hasSearch = config.actions.some((a) => \n a.includes('search') || a.includes('check_feed') || a.includes('browse')\n );\n if (hasSearch) {\n skills.push({\n id: 'content_discovery',\n name: 'Content Discovery',\n description: 'Search and discover relevant content',\n tags: ['search', 'discovery'],\n });\n }\n\n const hasAnalysis = config.actions.some((a) => \n a.includes('analyze') || a.includes('think') || a.includes('research')\n );\n if (hasAnalysis) {\n skills.push({\n id: 'analysis',\n name: 'Analysis & Research',\n description: 'Analyze problems and conduct research',\n tags: ['analysis', 'research', 'thinking'],\n });\n }\n\n return skills;\n }\n\n /**\n * Updates an agent card with runtime information.\n */\n static updateWithRuntime(\n agentCard: AgentCard,\n actualPort: number,\n actualHost: string = 'localhost'\n ): AgentCard {\n const protocol = actualHost === 'localhost' || actualHost === '127.0.0.1' ? 'http' : 'https';\n const baseUrl = `${protocol}://${actualHost}:${actualPort}`;\n\n return {\n ...agentCard,\n url: `${baseUrl}/a2a/jsonrpc`,\n additionalInterfaces: [\n { url: `${baseUrl}/a2a/jsonrpc`, transport: 'JSONRPC' },\n { url: `${baseUrl}/a2a/rest`, transport: 'HTTP+JSON' },\n ],\n };\n }\n}\n","import type { Message, Task, TaskStatusUpdateEvent, TaskArtifactUpdateEvent } from '@a2a-js/sdk';\nimport type { AgentExecutor, RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\nimport type { Agent } from '../agent/Agent.js';\nimport type { ActionResult } from '../config/types.js';\nimport { createLogger } from '../logger.js';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst logger = createLogger('MoltiumExecutor');\n\n/**\n * Adapts a Moltium Agent to the A2A AgentExecutor interface.\n * This allows Moltium agents to respond to A2A protocol requests.\n */\nexport class MoltiumExecutor implements AgentExecutor {\n private agent: Agent;\n private cancelledTasks = new Set<string>();\n\n constructor(agent: Agent) {\n this.agent = agent;\n }\n\n /**\n * Executes an A2A request using the Moltium agent.\n * Converts A2A messages to Moltium actions and publishes results back via the event bus.\n */\n async execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise<void> {\n const { taskId, contextId, userMessage, task } = requestContext;\n\n try {\n logger.info(`[A2A] Executing request for task ${taskId}`);\n\n // 1. Create task if it doesn't exist\n if (!task) {\n const initialTask: Task = {\n kind: 'task',\n id: taskId,\n contextId: contextId,\n status: {\n state: 'submitted',\n timestamp: new Date().toISOString(),\n },\n history: [userMessage],\n };\n eventBus.publish(initialTask);\n }\n\n // 2. Check for cancellation before starting work\n if (this.cancelledTasks.has(taskId)) {\n this.publishCancellation(taskId, contextId, eventBus);\n return;\n }\n\n // 3. Update status to 'working'\n this.publishStatusUpdate(taskId, contextId, 'working', eventBus, false);\n\n // 4. Extract the user's message content\n const userContent = this.extractMessageContent(userMessage);\n\n // 5. Check if this is a simple chat message or an action request\n const isActionRequest = this.isActionRequest(userContent);\n\n let result: ActionResult;\n\n if (isActionRequest) {\n // Execute as a direct action\n result = await this.executeAction(userContent, taskId);\n } else {\n // Execute as a conversational interaction using the LLM\n result = await this.executeChat(userContent, taskId);\n }\n\n // 6. Check for cancellation after execution\n if (this.cancelledTasks.has(taskId)) {\n this.publishCancellation(taskId, contextId, eventBus);\n return;\n }\n\n // 7. Publish the result as an artifact or message\n if (result.success) {\n await this.publishResult(taskId, contextId, result, eventBus);\n } else {\n await this.publishError(taskId, contextId, result.error || 'Unknown error', eventBus);\n }\n\n // 8. Mark task as completed\n this.publishStatusUpdate(taskId, contextId, 'completed', eventBus, true);\n eventBus.finished();\n\n logger.info(`[A2A] Task ${taskId} completed successfully`);\n } catch (error) {\n logger.error(`[A2A] Task ${taskId} failed`, {\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Publish error and mark as failed\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.publishError(taskId, contextId, errorMessage, eventBus);\n this.publishStatusUpdate(taskId, contextId, 'failed', eventBus, true);\n eventBus.finished();\n } finally {\n // Clean up cancelled task tracking\n this.cancelledTasks.delete(taskId);\n }\n }\n\n /**\n * Handles task cancellation requests.\n */\n async cancelTask(taskId: string, eventBus: ExecutionEventBus): Promise<void> {\n logger.info(`[A2A] Cancellation requested for task ${taskId}`);\n this.cancelledTasks.add(taskId);\n // The execute method will handle publishing the cancellation status\n }\n\n /**\n * Extracts text content from an A2A message.\n */\n private extractMessageContent(message: Message): string {\n const textParts = message.parts.filter((part) => part.kind === 'text');\n return textParts.map((part) => part.text).join('\\n');\n }\n\n /**\n * Determines if the user message is requesting a specific action.\n */\n private isActionRequest(content: string): boolean {\n const actionKeywords = [\n 'post',\n 'search',\n 'check feed',\n 'browse',\n 'comment',\n 'upvote',\n 'follow',\n 'send dm',\n ];\n\n const lowerContent = content.toLowerCase();\n return actionKeywords.some((keyword) => lowerContent.includes(keyword));\n }\n\n /**\n * Executes a chat interaction using the agent's LLM.\n */\n private async executeChat(userContent: string, taskId: string): Promise<ActionResult> {\n try {\n const llm = this.agent.getLLM();\n const systemPrompt = this.agent.getSystemPrompt();\n\n const response = await llm.generateText(userContent, {\n systemPrompt,\n temperature: this.agent.config.llm.temperature,\n });\n\n return {\n success: true,\n data: { response, type: 'chat' },\n };\n } catch (error) {\n return {\n success: false,\n error: `Chat execution failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Executes an action based on the user's request.\n */\n private async executeAction(userContent: string, taskId: string): Promise<ActionResult> {\n try {\n // Use the agent's think method to determine the action\n const decision = await this.agent.think();\n\n // Execute the chosen action\n const result = await this.agent.act(decision.action, decision.parameters);\n\n return {\n success: result.success,\n data: {\n action: decision.action,\n reasoning: decision.reasoning,\n result: result.data,\n type: 'action',\n },\n error: result.error,\n };\n } catch (error) {\n return {\n success: false,\n error: `Action execution failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Publishes a successful result as an A2A artifact.\n */\n private async publishResult(\n taskId: string,\n contextId: string,\n result: ActionResult,\n eventBus: ExecutionEventBus\n ): Promise<void> {\n const data = result.data as any;\n\n if (data?.type === 'chat') {\n // Publish chat response as a text artifact\n const artifactUpdate: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId: `response-${uuidv4()}`,\n name: 'response.txt',\n parts: [{ kind: 'text', text: data.response }],\n },\n };\n eventBus.publish(artifactUpdate);\n } else if (data?.type === 'action') {\n // Publish action result as a structured artifact\n const resultText = JSON.stringify(\n {\n action: data.action,\n reasoning: data.reasoning,\n result: data.result,\n },\n null,\n 2\n );\n\n const artifactUpdate: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId: `action-result-${uuidv4()}`,\n name: 'action_result.json',\n parts: [{ kind: 'text', text: resultText }],\n },\n };\n eventBus.publish(artifactUpdate);\n } else {\n // Generic result\n const resultText =\n typeof result.data === 'string' ? result.data : JSON.stringify(result.data, null, 2);\n\n const artifactUpdate: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId: `result-${uuidv4()}`,\n name: 'result.txt',\n parts: [{ kind: 'text', text: resultText }],\n },\n };\n eventBus.publish(artifactUpdate);\n }\n }\n\n /**\n * Publishes an error as an A2A artifact.\n */\n private async publishError(\n taskId: string,\n contextId: string,\n error: string,\n eventBus: ExecutionEventBus\n ): Promise<void> {\n const artifactUpdate: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId: `error-${uuidv4()}`,\n name: 'error.txt',\n parts: [{ kind: 'text', text: `Error: ${error}` }],\n },\n };\n eventBus.publish(artifactUpdate);\n }\n\n /**\n * Publishes a status update event.\n */\n private publishStatusUpdate(\n taskId: string,\n contextId: string,\n state: 'submitted' | 'working' | 'completed' | 'failed' | 'canceled',\n eventBus: ExecutionEventBus,\n final: boolean\n ): void {\n const statusUpdate: TaskStatusUpdateEvent = {\n kind: 'status-update',\n taskId,\n contextId,\n status: {\n state,\n timestamp: new Date().toISOString(),\n },\n final,\n };\n eventBus.publish(statusUpdate);\n }\n\n /**\n * Publishes a cancellation status.\n */\n private publishCancellation(taskId: string, contextId: string, eventBus: ExecutionEventBus): void {\n logger.info(`[A2A] Publishing cancellation for task ${taskId}`);\n this.publishStatusUpdate(taskId, contextId, 'canceled', eventBus, true);\n eventBus.finished();\n this.cancelledTasks.delete(taskId);\n }\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport { DefaultRequestHandler, InMemoryTaskStore, JsonRpcTransportHandler } from '@a2a-js/sdk/server';\nimport type { Agent } from '../agent/Agent.js';\nimport { AgentCardBuilder, type A2AConfig } from './AgentCardBuilder.js';\nimport { MoltiumExecutor } from './MoltiumExecutor.js';\nimport { createLogger } from '../logger.js';\nimport type { Request, Response, RequestHandler } from 'express';\n\nconst logger = createLogger('A2AIntegration');\n\nexport interface A2AServerOptions {\n a2aConfig: A2AConfig;\n authToken?: string;\n}\n\n/**\n * Creates A2A-compliant Express routes for a Moltium agent.\n * These routes implement the Agent-to-Agent (A2A) protocol.\n */\nexport class A2AIntegration {\n private agent: Agent;\n private agentCard: AgentCard;\n private requestHandler: DefaultRequestHandler;\n private moltiumExecutor: MoltiumExecutor;\n\n constructor(agent: Agent, options: A2AServerOptions) {\n this.agent = agent;\n\n // Build the A2A agent card\n this.agentCard = AgentCardBuilder.build(agent.config, options.a2aConfig);\n\n // Create the Moltium executor adapter\n this.moltiumExecutor = new MoltiumExecutor(agent);\n\n // Create the A2A request handler\n this.requestHandler = new DefaultRequestHandler(\n this.agentCard,\n new InMemoryTaskStore(),\n this.moltiumExecutor\n );\n\n logger.info('A2A integration initialized', {\n agentName: agent.name,\n baseUrl: options.a2aConfig.baseUrl,\n });\n }\n\n /**\n * Creates Express middleware handlers for A2A endpoints.\n * Returns an object with individual handlers that can be mounted on specific routes.\n */\n getHandlers() {\n return {\n // Agent Card endpoint - serves the static agent card JSON\n agentCard: ((req: Request, res: Response) => {\n res.json(this.agentCard);\n }) as RequestHandler,\n\n // JSON-RPC endpoint - handles A2A protocol requests\n jsonRpc: (async (req: Request, res: Response) => {\n try {\n const jsonRpcHandler = new JsonRpcTransportHandler(this.requestHandler);\n const response = await jsonRpcHandler.handle(req.body);\n res.json(response);\n } catch (error: any) {\n logger.error('JSON-RPC error:', error);\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error',\n data: error.message,\n },\n id: req.body?.id || null,\n });\n }\n }) as RequestHandler,\n\n // REST endpoint - simplified HTTP+JSON interface\n rest: ((req: Request, res: Response) => {\n res.status(501).json({\n error: 'REST transport not implemented in SDK v0.3.0',\n message: 'Please use the JSON-RPC endpoint at /a2a/jsonrpc',\n });\n }) as RequestHandler,\n };\n }\n\n /**\n * Updates the agent card with actual runtime information (host/port).\n */\n updateAgentCard(actualPort: number, actualHost: string = 'localhost'): void {\n this.agentCard = AgentCardBuilder.updateWithRuntime(this.agentCard, actualPort, actualHost);\n \n // Update the request handler with the new card\n this.requestHandler = new DefaultRequestHandler(\n this.agentCard,\n new InMemoryTaskStore(),\n this.moltiumExecutor\n );\n\n logger.info('A2A agent card updated with runtime info', {\n host: actualHost,\n port: actualPort,\n url: this.agentCard.url,\n });\n }\n\n /**\n * Gets the current agent card.\n */\n getAgentCard(): AgentCard {\n return this.agentCard;\n }\n\n /**\n * Logs A2A endpoint information.\n */\n logEndpoints(host: string, port: number): void {\n const protocol = host === 'localhost' || host === '127.0.0.1' ? 'http' : 'https';\n const baseUrl = `${protocol}://${host}:${port}`;\n\n logger.info('A2A endpoints available:');\n logger.info(` Agent Card: ${baseUrl}/.well-known/agent.json`);\n logger.info(` JSON-RPC: ${baseUrl}/a2a/jsonrpc`);\n logger.info(` HTTP+JSON: ${baseUrl}/a2a/rest`);\n }\n}\n\n/**\n * Helper function to create and configure A2A integration for a Moltium agent.\n */\nexport function createA2AIntegration(\n agent: Agent,\n options: Partial<A2AServerOptions> = {}\n): A2AIntegration {\n const a2aConfig: A2AConfig = {\n enabled: true,\n baseUrl: options.a2aConfig?.baseUrl || 'http://localhost:3000',\n pushNotifications: options.a2aConfig?.pushNotifications ?? false,\n streaming: options.a2aConfig?.streaming ?? true,\n stateTransitionHistory: options.a2aConfig?.stateTransitionHistory ?? true,\n };\n\n return new A2AIntegration(agent, { a2aConfig, ...options });\n}\n"],"mappings":"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","names":["label","logger","axios","logger","logger","axios","logger","logger","logger","uuidv4","logger","logger","logger","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/agent/scheduler.ts","../src/actions/registry.ts","../src/actions/ActionHandler.ts","../src/actions/built-in/social.ts","../src/actions/built-in/moltbook.ts","../src/actions/built-in/world.ts","../src/actions/built-in/index.ts","../src/llm/prompt.ts","../src/actions/interpreter.ts","../src/memory/Memory.ts","../src/memory/shortterm.ts","../src/llm/anthropic.ts","../src/llm/Provider.ts","../src/llm/openai.ts","../src/social/moltbook.ts","../src/social/SocialAdapter.ts","../src/social/twitter.ts","../src/a2a/client.ts","../src/a2a/actions.ts","../src/agent/Agent.ts","../src/config/ConfigLoader.ts","../src/config/MarkdownParser.ts","../src/config/types.ts","../src/config/validator.ts","../src/memory/longterm.ts","../src/server/app.ts","../src/server/routes.ts","../src/server/middleware.ts","../src/a2a/AgentCardBuilder.ts","../src/a2a/MoltiumExecutor.ts","../src/a2a/integration.ts"],"sourcesContent":["import { createLogger } from '../logger.js';\n\nconst logger = createLogger('Scheduler');\n\nexport interface ScheduledJob {\n name: string;\n intervalMs: number;\n handler: () => Promise<void>;\n lastRun?: number;\n}\n\nexport class Scheduler {\n private jobs: ScheduledJob[] = [];\n private timers: Map<string, ReturnType<typeof setInterval>> = new Map();\n private running = false;\n\n addJob(job: ScheduledJob): void {\n this.jobs.push(job);\n logger.debug(`Job registered: ${job.name} (every ${job.intervalMs}ms)`);\n }\n\n removeJob(name: string): void {\n this.jobs = this.jobs.filter((j) => j.name !== name);\n const timer = this.timers.get(name);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(name);\n }\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n\n for (const job of this.jobs) {\n const timer = setInterval(async () => {\n try {\n logger.debug(`Running job: ${job.name}`);\n await job.handler();\n job.lastRun = Date.now();\n } catch (error) {\n logger.error(`Job failed: ${job.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }, job.intervalMs);\n\n this.timers.set(job.name, timer);\n }\n\n logger.info(`Scheduler started with ${this.jobs.length} jobs`);\n }\n\n stop(): void {\n this.running = false;\n for (const [name, timer] of this.timers) {\n clearInterval(timer);\n }\n this.timers.clear();\n logger.info('Scheduler stopped');\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getJobs(): ScheduledJob[] {\n return [...this.jobs];\n }\n}\n","\nimport type { Action } from '../config/types.js';\n\nexport class ActionRegistry {\n private actions = new Map<string, Action>();\n\n register(action: Action): void {\n if (this.actions.has(action.name)) {\n throw new Error(`Action \"${action.name}\" is already registered`);\n }\n this.actions.set(action.name, action);\n }\n\n unregister(name: string): void {\n this.actions.delete(name);\n }\n\n get(name: string): Action | undefined {\n return this.actions.get(name);\n }\n\n has(name: string): boolean {\n return this.actions.has(name);\n }\n\n list(): Action[] {\n return Array.from(this.actions.values());\n }\n\n listNames(): string[] {\n return Array.from(this.actions.keys());\n }\n}\n","import { ActionRegistry } from './registry.js';\nimport type { Action, ActionContext, ActionResult } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('ActionHandler');\n\nexport class ActionExecutionError extends Error {\n constructor(\n message: string,\n public actionName: string,\n public recoverable: boolean = true,\n ) {\n super(message);\n this.name = 'ActionExecutionError';\n }\n}\n\nexport class ActionHandler {\n private registry: ActionRegistry;\n\n constructor(registry: ActionRegistry) {\n this.registry = registry;\n }\n\n async execute(actionName: string, context: ActionContext): Promise<ActionResult> {\n const action = this.registry.get(actionName);\n\n if (!action) {\n throw new ActionExecutionError(\n `Action \"${actionName}\" not found in registry`,\n actionName,\n false,\n );\n }\n\n logger.info(`Executing action: ${actionName}`);\n\n try {\n const result = await action.execute(context);\n logger.info(`Action completed: ${actionName}`, { success: result.success });\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Action failed: ${actionName}`, { error: message });\n throw new ActionExecutionError(\n `Action \"${actionName}\" failed: ${message}`,\n actionName,\n );\n }\n }\n\n getAvailableActions(): Array<{ name: string; description: string }> {\n return this.registry.list().map((action) => ({\n name: action.name,\n description: action.description,\n }));\n }\n}\n","import type { Action, ActionContext, ActionResult } from '../../config/types.js';\n\nexport const postSocialUpdateAction: Action = {\n name: 'post_social_update',\n description: 'Post a status update to configured social platforms',\n async execute(context: ActionContext): Promise<ActionResult> {\n const { content, platforms } = context.parameters as {\n content: string;\n platforms?: string[];\n };\n\n if (!content) {\n return { success: false, error: 'Missing required parameter: content' };\n }\n\n const results: Record<string, unknown> = {};\n const socialAdapters = context.agent?.socialAdapters || {};\n const targetPlatforms = platforms || Object.keys(socialAdapters);\n\n for (const platform of targetPlatforms) {\n const adapter = socialAdapters[platform];\n if (!adapter) continue;\n\n try {\n const result = await adapter.post(content);\n results[platform] = result;\n } catch (error) {\n results[platform] = {\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n return { success: true, data: results };\n },\n};\n\nexport const respondToMentionAction: Action = {\n name: 'respond_to_mention',\n description: 'Respond to a social platform mention',\n async execute(context: ActionContext): Promise<ActionResult> {\n const { mentionId, content, platform } = context.parameters as {\n mentionId: string;\n content: string;\n platform: string;\n };\n\n if (!mentionId || !content || !platform) {\n return { success: false, error: 'Missing required parameters: mentionId, content, platform' };\n }\n\n const adapter = context.agent?.socialAdapters?.[platform];\n if (!adapter) {\n return { success: false, error: `No adapter configured for platform: ${platform}` };\n }\n\n const result = await adapter.reply(mentionId, content);\n return { success: true, data: result };\n },\n};\n\nexport const dmUserAction: Action = {\n name: 'dm_user',\n description: 'Send a direct message to a user on a social platform',\n async execute(context: ActionContext): Promise<ActionResult> {\n // DM functionality depends on platform-specific APIs\n // This is a placeholder for the generic interface\n const { userId, content, platform } = context.parameters as {\n userId: string;\n content: string;\n platform: string;\n };\n\n if (!userId || !content || !platform) {\n return { success: false, error: 'Missing required parameters: userId, content, platform' };\n }\n\n return {\n success: false,\n error: `DM not yet implemented for platform: ${platform}`,\n };\n },\n};\n\nexport const scheduleTaskAction: Action = {\n name: 'schedule_task',\n description: 'Schedule a task for later execution',\n async execute(context: ActionContext): Promise<ActionResult> {\n const { taskName, delay, parameters } = context.parameters as {\n taskName: string;\n delay: number;\n parameters?: Record<string, unknown>;\n };\n\n if (!taskName || delay === undefined) {\n return { success: false, error: 'Missing required parameters: taskName, delay' };\n }\n\n // Store scheduled task in memory for the scheduler to pick up\n const scheduledTask = {\n taskName,\n executeAt: Date.now() + delay * 1000,\n parameters: parameters || {},\n };\n\n await context.memory.store(`scheduled:${taskName}:${Date.now()}`, scheduledTask);\n\n return { success: true, data: scheduledTask };\n },\n};\n","import type { Action, ActionContext, ActionResult } from '../../config/types.js';\nimport type { MoltbookAdapter } from '../../social/moltbook.js';\n\n/** Helper: get the moltbook adapter from context or fail gracefully. */\nfunction getMoltbook(context: ActionContext): MoltbookAdapter | null {\n return (context.agent?.socialAdapters?.['moltbook'] as MoltbookAdapter) || null;\n}\n\nexport const checkFeedAction: Action = {\n name: 'check_feed',\n description: 'Browse the moltbook feed (personalized or global) to find posts to engage with',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { sort, limit, global: useGlobal } = context.parameters as {\n sort?: string; limit?: number; global?: boolean;\n };\n\n try {\n const posts = useGlobal\n ? await mb.getGlobalFeed({ sort: (sort as any) || 'hot', limit: limit || 15 })\n : await mb.getFeed({ sort: (sort as any) || 'new', limit: limit || 15 });\n return { success: true, data: { posts, count: posts.length } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const checkDMsAction: Action = {\n name: 'check_dms',\n description: 'Check for new DM requests and unread messages from other agents',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n try {\n const result = await mb.checkDMs();\n return { success: true, data: result };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const searchMoltbookAction: Action = {\n name: 'search_moltbook',\n description: 'Search moltbook for posts and comments by meaning (semantic search). Params: { \"query\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { query, limit } = context.parameters as {\n query: string; limit?: number;\n };\n if (!query) return { success: false, error: 'Missing required parameter: query' };\n\n try {\n const results = await mb.search(query, { limit: limit || 10 });\n return { success: true, data: { results, count: results.length } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const commentOnPostAction: Action = {\n name: 'comment_on_post',\n description: 'Reply to a post with a comment. Params: { \"post_id\": \"...\", \"content\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { post_id, content } = context.parameters as { post_id: string; content: string };\n if (!post_id || !content) return { success: false, error: 'Missing required parameters: post_id, content' };\n\n try {\n const result = await mb.reply(post_id, content);\n return { success: true, data: result };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const upvotePostAction: Action = {\n name: 'upvote_post',\n description: 'Upvote a post you find valuable. Params: { \"post_id\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { post_id } = context.parameters as { post_id: string };\n if (!post_id) return { success: false, error: 'Missing required parameter: post_id' };\n\n try {\n await mb.like(post_id);\n return { success: true, data: { post_id, action: 'upvoted' } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const downvotePostAction: Action = {\n name: 'downvote_post',\n description: 'Downvote a post you disagree with. Params: { \"post_id\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { post_id } = context.parameters as { post_id: string };\n if (!post_id) return { success: false, error: 'Missing required parameter: post_id' };\n\n try {\n await mb.downvote(post_id);\n return { success: true, data: { post_id, action: 'downvoted' } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const browseSubmoltsAction: Action = {\n name: 'browse_submolts',\n description: 'Discover moltbook communities (submolts) to subscribe to',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n try {\n const submolts = await mb.listSubmolts();\n return { success: true, data: { submolts, count: submolts.length } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const followAgentAction: Action = {\n name: 'follow_agent',\n description: 'Follow another agent whose posts you enjoy. Params: { \"agent_name\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { agent_name } = context.parameters as { agent_name: string };\n if (!agent_name) return { success: false, error: 'Missing required parameter: agent_name' };\n\n try {\n await mb.follow(agent_name);\n return { success: true, data: { agent_name, action: 'followed' } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const sendDMRequestAction: Action = {\n name: 'send_dm_request',\n description: 'Request to start a private conversation with another agent. Params: { \"to\": \"...\", \"message\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { to, to_owner, message } = context.parameters as { to?: string; to_owner?: string; message: string };\n if ((!to && !to_owner) || !message) return { success: false, error: 'Missing required parameters: (to or to_owner), message' };\n\n try {\n const target = to || to_owner || '';\n const byOwner = !to && !!to_owner;\n const result = await mb.sendDMRequest(target, message, byOwner);\n return { success: true, data: result };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const sendDMAction: Action = {\n name: 'send_dm',\n description: 'Send a message in an existing DM conversation. Params: { \"conversation_id\": \"...\", \"message\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { conversation_id, message, needs_human_input } = context.parameters as {\n conversation_id: string; message: string; needs_human_input?: boolean;\n };\n if (!conversation_id || !message) return { success: false, error: 'Missing required parameters: conversation_id, message' };\n\n try {\n const result = await mb.sendDM(conversation_id, message, needs_human_input);\n return { success: true, data: result };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const approveDMRequestAction: Action = {\n name: 'approve_dm_request',\n description: 'Approve a pending DM request from another agent. Params: { \"conversation_id\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { conversation_id } = context.parameters as { conversation_id: string };\n if (!conversation_id) return { success: false, error: 'Missing required parameter: conversation_id' };\n\n try {\n await mb.approveDMRequest(conversation_id);\n return { success: true, data: { conversation_id, action: 'approved' } };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\nexport const readConversationAction: Action = {\n name: 'read_conversation',\n description: 'Read messages in a DM conversation (marks as read). Params: { \"conversation_id\": \"...\" }',\n async execute(context: ActionContext): Promise<ActionResult> {\n const mb = getMoltbook(context);\n if (!mb) return { success: false, error: 'Moltbook not connected' };\n\n const { conversation_id } = context.parameters as { conversation_id: string };\n if (!conversation_id) return { success: false, error: 'Missing required parameter: conversation_id' };\n\n try {\n const detail = await mb.readConversation(conversation_id);\n return { success: true, data: detail };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n },\n};\n\n/** All Moltbook-specific actions */\nexport const moltbookActions: Action[] = [\n checkFeedAction,\n checkDMsAction,\n searchMoltbookAction,\n commentOnPostAction,\n upvotePostAction,\n downvotePostAction,\n browseSubmoltsAction,\n followAgentAction,\n sendDMRequestAction,\n sendDMAction,\n approveDMRequestAction,\n readConversationAction,\n];\n","import type { Action, ActionContext, ActionResult } from '../../config/types.js';\nimport { createLogger } from '../../logger.js';\n\nconst logger = createLogger('WorldActions');\n\n/**\n * ============================================================================\n * WORLD SDK BUILT-IN ACTIONS\n * ============================================================================\n *\n * Built-in actions for agents to interact with worlds created using\n * @moltium/world-core. These use plain HTTP to call the world's REST endpoints.\n */\n\n/**\n * Creates a join_world action that queries join requirements, pays entry fee\n * if needed, and POSTs to a world's /world/join endpoint.\n */\nexport function createJoinWorldAction(config?: {\n defaultWorldUrl?: string;\n}): Action {\n return {\n name: 'join_world',\n description:\n `Join a world by URL. The world will fetch this agent's A2A Agent Card and evaluate admission. ` +\n `If the world requires an entry fee, the agent will pay automatically using its wallet. ` +\n `Parameters: worldUrl (string${config?.defaultWorldUrl ? ', optional' : ', required'}) - the world server URL` +\n `${config?.defaultWorldUrl ? ` (defaults to ${config.defaultWorldUrl})` : ''}, ` +\n `walletAddress (string, optional) - wallet address for blockchain worlds.`,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters, agent } = context;\n const worldUrl = (parameters.worldUrl as string) || config?.defaultWorldUrl;\n\n if (!worldUrl) {\n return { success: false, error: 'Parameter \"worldUrl\" is required' };\n }\n\n const agentPort = process.env.PORT || '3000';\n const agentHost = process.env.HOST || 'localhost';\n const agentUrl = `http://${agentHost}:${agentPort}`;\n const walletAddress = parameters.walletAddress || agent?.config?.world?.walletAddress;\n\n try {\n const { default: axios } = await import('axios');\n\n // Step 1: Query world for join requirements\n let paymentTxHash: string | undefined;\n try {\n const infoRes = await axios.get(`${worldUrl}/world/join-info`, { timeout: 5000 });\n const joinInfo = infoRes.data;\n\n // Step 2: Pay entry fee if required\n if (joinInfo.requiresPayment && joinInfo.entryFee && joinInfo.entryFee !== '0') {\n const privateKey = agent?.config?.world?.privateKey;\n if (!privateKey) {\n return {\n success: false,\n error: 'World requires entry fee but agent has no wallet private key configured. Set AGENT_WALLET_PRIVATE_KEY in your .env file.',\n };\n }\n\n logger.info(`World requires entry fee: ${joinInfo.entryFee} wei`);\n\n const { AgentWallet } = await import('../../wallet/AgentWallet.js');\n const wallet = new AgentWallet(privateKey, joinInfo.rpcUrl);\n\n // Check balance\n const balance = await wallet.getBalance();\n if (BigInt(balance) < BigInt(joinInfo.entryFee)) {\n const { formatEther } = await import('ethers');\n return {\n success: false,\n error: `Insufficient balance to pay entry fee. Need ${formatEther(joinInfo.entryFee)} MON, have ${formatEther(balance)} MON`,\n };\n }\n\n // Send payment to world's wallet\n logger.info(`Paying entry fee to ${joinInfo.paymentAddress}...`);\n paymentTxHash = await wallet.sendPayment(joinInfo.paymentAddress, joinInfo.entryFee);\n logger.info(`Entry fee paid. TX: ${paymentTxHash}`);\n }\n } catch (infoError: any) {\n // If /world/join-info doesn't exist (old world), skip payment flow\n if (infoError?.response?.status !== 404) {\n logger.debug(`Could not query join-info: ${infoError.message}`);\n }\n }\n\n // Step 3: Join the world with payment proof\n const response = await axios.post(`${worldUrl}/world/join`, {\n agentUrl,\n walletAddress,\n paymentTxHash,\n }, { timeout: 10000 });\n\n return {\n success: true,\n data: response.data,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || error?.message || String(error);\n return { success: false, error: `Failed to join world: ${msg}` };\n }\n },\n };\n}\n\n/**\n * Creates a leave_world action that DELETEs from a world's /world/agents endpoint\n */\nexport function createLeaveWorldAction(config?: {\n defaultWorldUrl?: string;\n}): Action {\n return {\n name: 'leave_world',\n description:\n `Leave a world. ` +\n `Parameters: worldUrl (string${config?.defaultWorldUrl ? ', optional' : ', required'}) - the world server URL.`,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters } = context;\n const worldUrl = (parameters.worldUrl as string) || config?.defaultWorldUrl;\n\n if (!worldUrl) {\n return { success: false, error: 'Parameter \"worldUrl\" is required' };\n }\n\n const agentPort = process.env.PORT || '3000';\n const agentHost = process.env.HOST || 'localhost';\n const agentUrl = `http://${agentHost}:${agentPort}`;\n\n try {\n const { default: axios } = await import('axios');\n const response = await axios.delete(\n `${worldUrl}/world/agents/${encodeURIComponent(agentUrl)}`,\n { timeout: 10000 }\n );\n\n return {\n success: true,\n data: response.data,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || error?.message || String(error);\n return { success: false, error: `Failed to leave world: ${msg}` };\n }\n },\n };\n}\n\n/**\n * Creates a query_world action that GETs world state and info\n */\nexport function createQueryWorldAction(config?: {\n defaultWorldUrl?: string;\n}): Action {\n return {\n name: 'query_world',\n description:\n `Query a world's state, agents, and available actions. ` +\n `Parameters: worldUrl (string${config?.defaultWorldUrl ? ', optional' : ', required'}) - the world server URL, ` +\n `endpoint (string, optional) - specific endpoint: \"state\", \"agents\", \"actions\", or \"info\" (default: \"info\").`,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters } = context;\n const worldUrl = (parameters.worldUrl as string) || config?.defaultWorldUrl;\n\n if (!worldUrl) {\n return { success: false, error: 'Parameter \"worldUrl\" is required' };\n }\n\n const endpoint = (parameters.endpoint as string) || 'info';\n const pathMap: Record<string, string> = {\n info: '/',\n state: '/world/state',\n agents: '/world/agents',\n actions: '/world/actions',\n };\n\n const path = pathMap[endpoint] || '/';\n\n try {\n const { default: axios } = await import('axios');\n const response = await axios.get(`${worldUrl}${path}`, { timeout: 10000 });\n\n return {\n success: true,\n data: response.data,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || error?.message || String(error);\n return { success: false, error: `Failed to query world: ${msg}` };\n }\n },\n };\n}\n\n/**\n * Creates a send_world_message action for agent-to-agent messaging through a world\n */\nexport function createSendWorldMessageAction(config?: {\n defaultWorldUrl?: string;\n}): Action {\n return {\n name: 'send_world_message',\n description:\n `Send a message to another agent through the world hub. ` +\n `Parameters: worldUrl (string${config?.defaultWorldUrl ? ', optional' : ', required'}) - the world server URL, ` +\n `toAgentUrl (string, optional) - target agent URL (omit to broadcast to all), ` +\n `message (string, required) - the message to send.`,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters } = context;\n const worldUrl = (parameters.worldUrl as string) || config?.defaultWorldUrl;\n\n if (!worldUrl) {\n return { success: false, error: 'Parameter \"worldUrl\" is required' };\n }\n\n if (!parameters.message) {\n return { success: false, error: 'Parameter \"message\" is required' };\n }\n\n const agentPort = process.env.PORT || '3000';\n const agentHost = process.env.HOST || 'localhost';\n const agentUrl = `http://${agentHost}:${agentPort}`;\n\n try {\n const { default: axios } = await import('axios');\n const response = await axios.post(`${worldUrl}/world/message`, {\n fromAgentUrl: agentUrl,\n toAgentUrl: parameters.toAgentUrl,\n message: parameters.message,\n }, { timeout: 15000 });\n\n return {\n success: true,\n data: response.data,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || error?.message || String(error);\n return { success: false, error: `Failed to send world message: ${msg}` };\n }\n },\n };\n}\n\n/**\n * All world actions as a convenience array\n */\nexport const worldActions = {\n createJoinWorldAction,\n createLeaveWorldAction,\n createQueryWorldAction,\n createSendWorldMessageAction,\n};\n","export {\n postSocialUpdateAction,\n respondToMentionAction,\n dmUserAction,\n scheduleTaskAction,\n} from './social.js';\n\nexport {\n checkFeedAction,\n checkDMsAction,\n searchMoltbookAction,\n commentOnPostAction,\n upvotePostAction,\n downvotePostAction,\n browseSubmoltsAction,\n followAgentAction,\n sendDMRequestAction,\n sendDMAction,\n approveDMRequestAction,\n readConversationAction,\n moltbookActions,\n} from './moltbook.js';\n\nexport {\n createJoinWorldAction,\n createLeaveWorldAction,\n createQueryWorldAction,\n createSendWorldMessageAction,\n worldActions,\n} from './world.js';\n\nimport type { Action } from '../../config/types.js';\nimport {\n postSocialUpdateAction,\n respondToMentionAction,\n dmUserAction,\n scheduleTaskAction,\n} from './social.js';\nimport { moltbookActions } from './moltbook.js';\n\nexport const builtInActions: Action[] = [\n postSocialUpdateAction,\n respondToMentionAction,\n dmUserAction,\n scheduleTaskAction,\n ...moltbookActions,\n];\n","import type { AgentConfig, Action } from '../config/types.js';\n\nexport function buildSystemPrompt(config: AgentConfig): string {\n const parts: string[] = [];\n\n parts.push(`You are ${config.name}, an autonomous AI agent.`);\n\n if (config.type) {\n parts.push(`Your role: ${config.type}.`);\n }\n\n if (config.personality.bio) {\n parts.push(`\\nBackground:\\n${config.personality.bio}`);\n }\n\n if (config.personality.traits.length > 0) {\n parts.push(`\\nPersonality traits: ${config.personality.traits.join(', ')}`);\n }\n\n if (config.llm.systemPrompt) {\n parts.push(`\\n${config.llm.systemPrompt}`);\n }\n\n return parts.join('\\n');\n}\n\nexport function buildDecisionPrompt(\n context: Record<string, unknown>,\n availableActions: Array<{ name: string; description: string }>,\n): string {\n const actionList = availableActions\n .map((a) => `- ${a.name}: ${a.description}`)\n .join('\\n');\n\n const actionNames = availableActions.map((a) => a.name);\n\n // Detect capabilities from available actions\n const hasWorldActions = actionNames.some((n) =>\n ['send_world_message', 'query_world', 'join_world', 'leave_world'].includes(n)\n );\n const hasSocialActions = actionNames.some((n) =>\n ['post_social_update', 'respond_to_mention'].includes(n)\n );\n\n // Extract recent actions for variety guidance\n const recent = (context.recentActions as Array<{ action: string }>) || [];\n const recentNames = recent.map((r) => r.action);\n const lastAction = recentNames.length > 0 ? recentNames[recentNames.length - 1] : 'none';\n\n let varietyHint = '';\n if (recentNames.length > 0) {\n const suggestions: string[] = [];\n if (hasWorldActions) {\n suggestions.push('querying the world for agents', 'sending messages to other agents', 'responding to conversations');\n }\n if (hasSocialActions) {\n suggestions.push('posting content', 'responding to mentions');\n }\n const suggestStr = suggestions.length > 0 ? `\\nVary between: ${suggestions.join(', ')}.` : '';\n\n varietyHint = `\\nYour recent actions (most recent last): ${recentNames.join(' → ')}` +\n `\\nIMPORTANT: Do NOT repeat \"${lastAction}\" again. Choose a DIFFERENT action to keep your behavior varied and interesting.` +\n suggestStr;\n }\n\n // Build context-aware preamble\n let preamble = 'You are an autonomous AI agent.';\n if (hasWorldActions) {\n preamble += ' You are connected to a world with other agents.';\n preamble += ' Use send_world_message to communicate with other agents (provide toAgentUrl and message parameters).';\n preamble += ' Use query_world to discover agents and world state.';\n preamble += ' IMPORTANT: Only use actions from the \"Available actions\" list below. Do NOT invent action names.';\n }\n\n return `${preamble}\nDecide what action to take next based on the current context and your personality.\n\nAvailable actions:\n${actionList}\n\nCurrent context:\n${JSON.stringify(context, null, 2)}\n${varietyHint}\n\nThink about what would be most natural and valuable right now.\nChoose ONLY from the available actions listed above.\n\nRespond with a JSON object:\n{\n \"action\": \"<action_name>\",\n \"reasoning\": \"<brief explanation of why you chose this>\",\n \"parameters\": { <any parameters for the action> }\n}`;\n}\n\nexport function buildSkillPrompt(skillName: string, skillDescription: string, parameters: Record<string, unknown>): string {\n return `Execute the following skill: ${skillName}\n\nInstructions:\n${skillDescription}\n\nParameters:\n${JSON.stringify(parameters, null, 2)}\n\nExecute these instructions step by step and return the result as a JSON object:\n{\n \"success\": true/false,\n \"data\": { <result data> },\n \"reasoning\": \"<what you did and why>\"\n}`;\n}\n","import type { LLMProvider } from '../llm/Provider.js';\nimport type { Action, ActionContext, ActionResult } from '../config/types.js';\nimport { buildSkillPrompt } from '../llm/prompt.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('MarkdownInterpreter');\n\nexport class LLMInterpretationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'LLMInterpretationError';\n }\n}\n\n/**\n * Creates an Action from a markdown skill description.\n * The skill's behavior is interpreted by the LLM at runtime.\n */\nexport function createMarkdownAction(\n name: string,\n description: string,\n llmProvider: LLMProvider,\n): Action {\n return {\n name,\n description,\n execute: async (context: ActionContext): Promise<ActionResult> => {\n logger.info(`Interpreting markdown skill: ${name}`);\n\n const prompt = buildSkillPrompt(name, description, context.parameters);\n\n try {\n const response = await llmProvider.generateText(prompt, {\n temperature: 0.7,\n maxTokens: 2048,\n });\n\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new LLMInterpretationError(\n `LLM did not return valid JSON for skill \"${name}\"`,\n );\n }\n\n const result = JSON.parse(jsonMatch[0]);\n return {\n success: result.success ?? true,\n data: result.data || result,\n };\n } catch (error) {\n if (error instanceof LLMInterpretationError) throw error;\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Markdown skill interpretation failed: ${name}`, { error: message });\n throw new LLMInterpretationError(\n `Failed to interpret skill \"${name}\": ${message}`,\n );\n }\n },\n };\n}\n","import type { Experience } from '../config/types.js';\n\nexport abstract class Memory {\n // Short-term (current session)\n abstract remember(key: string, value: unknown, ttl?: number): Promise<void>;\n abstract recall(key: string): Promise<unknown>;\n abstract forget(key: string): Promise<void>;\n\n // Long-term (persistent)\n abstract store(key: string, value: unknown): Promise<void>;\n abstract retrieve(key: string): Promise<unknown>;\n abstract delete(key: string): Promise<void>;\n\n // Semantic memory\n abstract addExperience(experience: Experience): Promise<void>;\n abstract queryExperiences(query: string, limit?: number): Promise<Experience[]>;\n\n // Lifecycle\n abstract clear(): Promise<void>;\n}\n","import { Memory } from './Memory.js';\nimport type { Experience } from '../config/types.js';\n\ninterface CacheEntry {\n value: unknown;\n expiresAt?: number;\n}\n\nexport class ShortTermMemory extends Memory {\n private cache = new Map<string, CacheEntry>();\n private store_ = new Map<string, unknown>();\n private experiences: Experience[] = [];\n\n async remember(key: string, value: unknown, ttl?: number): Promise<void> {\n this.cache.set(key, {\n value,\n expiresAt: ttl ? Date.now() + ttl * 1000 : undefined,\n });\n }\n\n async recall(key: string): Promise<unknown> {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n async forget(key: string): Promise<void> {\n this.cache.delete(key);\n }\n\n async store(key: string, value: unknown): Promise<void> {\n this.store_.set(key, value);\n }\n\n async retrieve(key: string): Promise<unknown> {\n return this.store_.get(key);\n }\n\n async delete(key: string): Promise<void> {\n this.store_.delete(key);\n }\n\n async addExperience(experience: Experience): Promise<void> {\n this.experiences.push(experience);\n }\n\n async queryExperiences(query: string, limit: number = 10): Promise<Experience[]> {\n // Simple keyword matching — will be replaced with vector search in longterm\n const queryLower = query.toLowerCase();\n return this.experiences\n .filter(\n (exp) =>\n exp.type.toLowerCase().includes(queryLower) ||\n exp.action.toLowerCase().includes(queryLower),\n )\n .slice(-limit);\n }\n\n async clear(): Promise<void> {\n this.cache.clear();\n this.store_.clear();\n this.experiences = [];\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport { LLMProvider, type GenerateOptions, type Message, type StructuredSchema } from './Provider.js';\n\nexport class AnthropicProvider extends LLMProvider {\n name = 'anthropic';\n private client: Anthropic;\n private model: string;\n\n constructor(apiKey: string, model: string = 'claude-sonnet-4-20250514') {\n super();\n this.client = new Anthropic({ apiKey });\n this.model = model;\n }\n\n async generateText(prompt: string, options?: GenerateOptions): Promise<string> {\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: options?.maxTokens || 2048,\n messages: [{ role: 'user', content: prompt }],\n ...(options?.systemPrompt ? { system: options.systemPrompt } : {}),\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options?.stopSequences ? { stop_sequences: options.stopSequences } : {}),\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n return textBlock ? textBlock.text : '';\n }\n\n async generateStructured<T>(prompt: string, schema: StructuredSchema, options?: GenerateOptions): Promise<T> {\n const structuredPrompt = `${prompt}\\n\\nRespond with a JSON object matching this schema:\\n${JSON.stringify(schema, null, 2)}\\n\\nRespond with valid JSON only, no other text.`;\n\n const text = await this.generateText(structuredPrompt, options);\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('LLM did not return valid JSON');\n }\n\n return JSON.parse(jsonMatch[0]) as T;\n }\n\n async chat(messages: Message[], options?: GenerateOptions): Promise<Message> {\n const systemMessages = messages.filter((m) => m.role === 'system');\n const chatMessages = messages\n .filter((m) => m.role !== 'system')\n .map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content }));\n\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: options?.maxTokens || 2048,\n messages: chatMessages,\n ...(systemMessages.length > 0 ? { system: systemMessages.map((m) => m.content).join('\\n') } : {}),\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n return { role: 'assistant', content: textBlock ? textBlock.text : '' };\n }\n\n async *streamGenerate(prompt: string, options?: GenerateOptions): AsyncGenerator<string> {\n const stream = this.client.messages.stream({\n model: this.model,\n max_tokens: options?.maxTokens || 2048,\n messages: [{ role: 'user', content: prompt }],\n ...(options?.systemPrompt ? { system: options.systemPrompt } : {}),\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n });\n\n for await (const event of stream) {\n if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {\n yield event.delta.text;\n }\n }\n }\n}\n","export interface GenerateOptions {\n temperature?: number;\n maxTokens?: number;\n stopSequences?: string[];\n systemPrompt?: string;\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport interface StructuredSchema {\n type: string;\n properties?: Record<string, unknown>;\n required?: string[];\n}\n\nexport abstract class LLMProvider {\n abstract name: string;\n\n abstract generateText(prompt: string, options?: GenerateOptions): Promise<string>;\n\n abstract generateStructured<T>(prompt: string, schema: StructuredSchema, options?: GenerateOptions): Promise<T>;\n\n abstract chat(messages: Message[], options?: GenerateOptions): Promise<Message>;\n\n abstract streamGenerate(prompt: string, options?: GenerateOptions): AsyncGenerator<string>;\n}\n","import OpenAI from 'openai';\nimport { LLMProvider, type GenerateOptions, type Message, type StructuredSchema } from './Provider.js';\n\nexport class OpenAIProvider extends LLMProvider {\n name = 'openai';\n private client: OpenAI;\n private model: string;\n\n constructor(apiKey: string, model: string = 'gpt-4o') {\n super();\n this.client = new OpenAI({ apiKey });\n this.model = model;\n }\n\n async generateText(prompt: string, options?: GenerateOptions): Promise<string> {\n const messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [];\n\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n max_tokens: options?.maxTokens || 2048,\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options?.stopSequences ? { stop: options.stopSequences } : {}),\n });\n\n return response.choices[0]?.message?.content || '';\n }\n\n async generateStructured<T>(prompt: string, schema: StructuredSchema, options?: GenerateOptions): Promise<T> {\n const structuredPrompt = `${prompt}\\n\\nRespond with a JSON object matching this schema:\\n${JSON.stringify(schema, null, 2)}\\n\\nRespond with valid JSON only, no other text.`;\n\n const text = await this.generateText(structuredPrompt, options);\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('LLM did not return valid JSON');\n }\n\n return JSON.parse(jsonMatch[0]) as T;\n }\n\n async chat(messages: Message[], options?: GenerateOptions): Promise<Message> {\n const openaiMessages: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = messages.map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages: openaiMessages,\n max_tokens: options?.maxTokens || 2048,\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n });\n\n return { role: 'assistant', content: response.choices[0]?.message?.content || '' };\n }\n\n async *streamGenerate(prompt: string, options?: GenerateOptions): AsyncGenerator<string> {\n const messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [];\n\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n max_tokens: options?.maxTokens || 2048,\n stream: true,\n ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n });\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) yield delta;\n }\n }\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport { SocialAdapter } from './SocialAdapter.js';\nimport type {\n PostResult, ReplyResult, Mention, Profile, Post, FeedOptions,\n Comment, SearchResult, SearchOptions,\n Submolt, SubmoltSettings,\n DMCheckResult, DMRequest, Conversation, ConversationDetail, DirectMessage,\n MoltbookRegistration, MoltbookStatus,\n} from './types.js';\nimport type { MoltbookConfig } from '../config/types.js';\n\nexport class MoltbookAdapter extends SocialAdapter {\n platform = 'moltbook';\n private client: AxiosInstance;\n private config: MoltbookConfig;\n\n constructor(config: MoltbookConfig) {\n super();\n this.config = config;\n this.client = axios.create({\n baseURL: config.baseUrl || 'https://www.moltbook.com/api/v1',\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n }\n\n // ── Connection ──\n\n async connect(): Promise<void> {\n await this.client.get('/agents/me');\n }\n\n async disconnect(): Promise<void> {\n // No persistent connection to close\n }\n\n // ── Registration & Status ──\n\n async register(name: string, description: string): Promise<MoltbookRegistration> {\n const response = await this.client.post('/agents/register', { name, description });\n const agent = response.data.agent || response.data;\n return {\n apiKey: agent.api_key,\n claimUrl: agent.claim_url,\n verificationCode: agent.verification_code,\n };\n }\n\n async getStatus(): Promise<MoltbookStatus> {\n const response = await this.client.get('/agents/status');\n return { status: response.data.status };\n }\n\n // ── Profile ──\n\n async getProfile(agentName: string): Promise<Profile> {\n const response = await this.client.get('/agents/profile', {\n params: { name: agentName },\n });\n const agent = response.data.agent || response.data;\n return {\n id: agent.id || agent.name,\n name: agent.name,\n bio: agent.description,\n followers: agent.follower_count,\n following: agent.following_count,\n platform: 'moltbook',\n };\n }\n\n async getMyProfile(): Promise<any> {\n const response = await this.client.get('/agents/me');\n return response.data;\n }\n\n async updateProfile(data: { description?: string; metadata?: Record<string, unknown> }): Promise<void> {\n await this.client.patch('/agents/me', data);\n }\n\n async uploadAvatar(filePath: string): Promise<void> {\n const fs = await import('node:fs');\n const FormData = (await import('form-data')).default;\n const form = new FormData();\n form.append('file', fs.createReadStream(filePath));\n await this.client.post('/agents/me/avatar', form, {\n headers: { ...form.getHeaders(), Authorization: `Bearer ${this.config.apiKey}` },\n });\n }\n\n async deleteAvatar(): Promise<void> {\n await this.client.delete('/agents/me/avatar');\n }\n\n // ── Posts ──\n\n async post(content: string): Promise<PostResult> {\n const submolt = this.config.defaultSubmolt || 'general';\n const title = extractTitle(content);\n\n const response = await this.client.post('/posts', {\n submolt,\n title,\n content,\n });\n return {\n id: response.data.id,\n url: response.data.url,\n timestamp: new Date(response.data.created_at),\n };\n }\n\n async postLink(submolt: string, title: string, url: string): Promise<PostResult> {\n const response = await this.client.post('/posts', { submolt, title, url });\n return {\n id: response.data.id,\n url: response.data.url,\n timestamp: new Date(response.data.created_at),\n };\n }\n\n async getPost(postId: string): Promise<Post> {\n const response = await this.client.get(`/posts/${postId}`);\n const p = response.data.post || response.data;\n return {\n id: p.id,\n authorId: p.author_id || p.author?.id || '',\n authorName: p.author_name || p.author?.name || '',\n content: p.content,\n title: p.title,\n timestamp: new Date(p.created_at),\n platform: 'moltbook',\n likes: p.upvotes ?? p.likes_count,\n replies: p.comment_count ?? p.replies_count,\n url: p.url,\n submolt: p.submolt?.name || p.submolt,\n };\n }\n\n async deletePost(postId: string): Promise<void> {\n await this.client.delete(`/posts/${postId}`);\n }\n\n // ── Comments ──\n\n async reply(postId: string, content: string): Promise<ReplyResult> {\n const response = await this.client.post(`/posts/${postId}/comments`, { content });\n return {\n id: response.data.id,\n parentId: postId,\n url: response.data.url,\n timestamp: new Date(response.data.created_at),\n };\n }\n\n async replyToComment(postId: string, content: string, parentId: string): Promise<ReplyResult> {\n const response = await this.client.post(`/posts/${postId}/comments`, {\n content,\n parent_id: parentId,\n });\n return {\n id: response.data.id,\n parentId,\n url: response.data.url,\n timestamp: new Date(response.data.created_at),\n };\n }\n\n async getComments(postId: string, sort: string = 'top'): Promise<Comment[]> {\n const response = await this.client.get(`/posts/${postId}/comments`, {\n params: { sort },\n });\n const items = response.data.comments || response.data || [];\n return items.map((c: any) => mapComment(c, postId));\n }\n\n async upvoteComment(commentId: string): Promise<void> {\n await this.client.post(`/comments/${commentId}/upvote`);\n }\n\n // ── Voting ──\n\n async like(postId: string): Promise<void> {\n await this.client.post(`/posts/${postId}/upvote`);\n }\n\n async downvote(postId: string): Promise<void> {\n await this.client.post(`/posts/${postId}/downvote`);\n }\n\n // ── Following ──\n\n async follow(agentName: string): Promise<void> {\n await this.client.post(`/agents/${agentName}/follow`);\n }\n\n async unfollow(agentName: string): Promise<void> {\n await this.client.delete(`/agents/${agentName}/follow`);\n }\n\n // ── Feed ──\n\n async getMentions(): Promise<Mention[]> {\n const response = await this.client.get('/feed', {\n params: { sort: 'new', limit: 20 },\n });\n return (response.data.posts || []).map((m: any) => ({\n id: m.id,\n authorId: m.author_id || m.author?.id || '',\n authorName: m.author_name || m.author?.name || '',\n content: m.content,\n timestamp: new Date(m.created_at),\n platform: 'moltbook',\n }));\n }\n\n async getFeed(options?: FeedOptions): Promise<Post[]> {\n const params: Record<string, unknown> = { sort: options?.sort || 'hot' };\n if (options?.limit) params.limit = options.limit;\n if (options?.cursor) params.cursor = options.cursor;\n if (options?.since) params.since = options.since.toISOString();\n if (options?.submolt) params.submolt = options.submolt;\n\n const response = await this.client.get('/feed', { params });\n return (response.data.posts || []).map((p: any) => mapPost(p));\n }\n\n async getGlobalFeed(options?: FeedOptions): Promise<Post[]> {\n const params: Record<string, unknown> = { sort: options?.sort || 'hot' };\n if (options?.limit) params.limit = options.limit;\n if (options?.submolt) params.submolt = options.submolt;\n\n const response = await this.client.get('/posts', { params });\n return (response.data.posts || []).map((p: any) => mapPost(p));\n }\n\n // ── Search ──\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const params: Record<string, unknown> = { q: query };\n if (options?.type) params.type = options.type;\n if (options?.limit) params.limit = options.limit;\n\n const response = await this.client.get('/search', { params });\n return (response.data.results || []).map((r: any) => ({\n id: r.id,\n type: r.type,\n title: r.title,\n content: r.content,\n upvotes: r.upvotes ?? 0,\n downvotes: r.downvotes ?? 0,\n similarity: r.similarity,\n author: { name: r.author?.name || '' },\n submolt: r.submolt,\n postId: r.post_id || r.id,\n timestamp: new Date(r.created_at),\n }));\n }\n\n // ── Submolts (Communities) ──\n\n async createSubmolt(name: string, displayName: string, description: string): Promise<Submolt> {\n const response = await this.client.post('/submolts', {\n name,\n display_name: displayName,\n description,\n });\n const s = response.data.submolt || response.data;\n return mapSubmolt(s);\n }\n\n async listSubmolts(): Promise<Submolt[]> {\n const response = await this.client.get('/submolts');\n const items = response.data.submolts || response.data || [];\n return items.map((s: any) => mapSubmolt(s));\n }\n\n async getSubmolt(name: string): Promise<Submolt> {\n const response = await this.client.get(`/submolts/${name}`);\n const s = response.data.submolt || response.data;\n return mapSubmolt(s);\n }\n\n async subscribe(submoltName: string): Promise<void> {\n await this.client.post(`/submolts/${submoltName}/subscribe`);\n }\n\n async unsubscribe(submoltName: string): Promise<void> {\n await this.client.delete(`/submolts/${submoltName}/subscribe`);\n }\n\n async getSubmoltFeed(submoltName: string, sort: string = 'hot', limit: number = 25): Promise<Post[]> {\n const response = await this.client.get(`/submolts/${submoltName}/feed`, {\n params: { sort, limit },\n });\n return (response.data.posts || []).map((p: any) => mapPost(p));\n }\n\n // ── Moderation ──\n\n async pinPost(postId: string): Promise<void> {\n await this.client.post(`/posts/${postId}/pin`);\n }\n\n async unpinPost(postId: string): Promise<void> {\n await this.client.delete(`/posts/${postId}/pin`);\n }\n\n async updateSubmoltSettings(submoltName: string, settings: SubmoltSettings): Promise<void> {\n const payload: Record<string, unknown> = {};\n if (settings.description !== undefined) payload.description = settings.description;\n if (settings.bannerColor !== undefined) payload.banner_color = settings.bannerColor;\n if (settings.themeColor !== undefined) payload.theme_color = settings.themeColor;\n await this.client.patch(`/submolts/${submoltName}/settings`, payload);\n }\n\n async uploadSubmoltAvatar(submoltName: string, filePath: string): Promise<void> {\n const fs = await import('node:fs');\n const FormData = (await import('form-data')).default;\n const form = new FormData();\n form.append('file', fs.createReadStream(filePath));\n form.append('type', 'avatar');\n await this.client.post(`/submolts/${submoltName}/settings`, form, {\n headers: { ...form.getHeaders(), Authorization: `Bearer ${this.config.apiKey}` },\n });\n }\n\n async uploadSubmoltBanner(submoltName: string, filePath: string): Promise<void> {\n const fs = await import('node:fs');\n const FormData = (await import('form-data')).default;\n const form = new FormData();\n form.append('file', fs.createReadStream(filePath));\n form.append('type', 'banner');\n await this.client.post(`/submolts/${submoltName}/settings`, form, {\n headers: { ...form.getHeaders(), Authorization: `Bearer ${this.config.apiKey}` },\n });\n }\n\n async addModerator(submoltName: string, agentName: string, role: string = 'moderator'): Promise<void> {\n await this.client.post(`/submolts/${submoltName}/moderators`, {\n agent_name: agentName,\n role,\n });\n }\n\n async removeModerator(submoltName: string, agentName: string): Promise<void> {\n await this.client.delete(`/submolts/${submoltName}/moderators`, {\n data: { agent_name: agentName },\n });\n }\n\n async listModerators(submoltName: string): Promise<Array<{ name: string; role: string }>> {\n const response = await this.client.get(`/submolts/${submoltName}/moderators`);\n return response.data.moderators || response.data || [];\n }\n\n // ── DM / Private Messaging ──\n\n async checkDMs(): Promise<DMCheckResult> {\n const response = await this.client.get('/agents/dm/check');\n const d = response.data;\n return {\n hasActivity: d.has_activity,\n summary: d.summary || '',\n requests: {\n count: d.requests?.count || 0,\n items: (d.requests?.items || []).map((r: any) => ({\n conversationId: r.conversation_id,\n from: {\n name: r.from?.name || '',\n owner: r.from?.owner ? {\n xHandle: r.from.owner.x_handle,\n xName: r.from.owner.x_name,\n } : undefined,\n },\n messagePreview: r.message_preview || '',\n createdAt: new Date(r.created_at),\n })),\n },\n messages: {\n totalUnread: d.messages?.total_unread || 0,\n conversationsWithUnread: d.messages?.conversations_with_unread || 0,\n latest: d.messages?.latest || [],\n },\n };\n }\n\n async sendDMRequest(to: string, message: string, byOwner: boolean = false): Promise<{ conversationId: string }> {\n const payload: Record<string, string> = { message };\n if (byOwner) {\n payload.to_owner = to;\n } else {\n payload.to = to;\n }\n const response = await this.client.post('/agents/dm/request', payload);\n return { conversationId: response.data.conversation_id || response.data.id };\n }\n\n async getDMRequests(): Promise<DMRequest[]> {\n const response = await this.client.get('/agents/dm/requests');\n const items = response.data.requests || response.data || [];\n return items.map((r: any) => ({\n conversationId: r.conversation_id,\n from: {\n name: r.from?.name || '',\n owner: r.from?.owner ? {\n xHandle: r.from.owner.x_handle,\n xName: r.from.owner.x_name,\n } : undefined,\n },\n messagePreview: r.message_preview || r.message || '',\n createdAt: new Date(r.created_at),\n }));\n }\n\n async approveDMRequest(conversationId: string): Promise<void> {\n await this.client.post(`/agents/dm/requests/${conversationId}/approve`);\n }\n\n async rejectDMRequest(conversationId: string, block: boolean = false): Promise<void> {\n const payload = block ? { block: true } : undefined;\n await this.client.post(`/agents/dm/requests/${conversationId}/reject`, payload);\n }\n\n async listConversations(): Promise<Conversation[]> {\n const response = await this.client.get('/agents/dm/conversations');\n const items = response.data.conversations?.items || response.data.conversations || [];\n return items.map((c: any) => ({\n conversationId: c.conversation_id,\n withAgent: {\n name: c.with_agent?.name || '',\n description: c.with_agent?.description,\n karma: c.with_agent?.karma,\n owner: c.with_agent?.owner ? {\n xHandle: c.with_agent.owner.x_handle,\n xName: c.with_agent.owner.x_name,\n } : undefined,\n },\n unreadCount: c.unread_count || 0,\n lastMessageAt: new Date(c.last_message_at),\n youInitiated: c.you_initiated ?? false,\n }));\n }\n\n async readConversation(conversationId: string): Promise<ConversationDetail> {\n const response = await this.client.get(`/agents/dm/conversations/${conversationId}`);\n const d = response.data;\n return {\n conversationId: d.conversation_id || conversationId,\n withAgent: { name: d.with_agent?.name || '' },\n messages: (d.messages || []).map((m: any) => ({\n id: m.id,\n sender: m.sender || m.from || '',\n content: m.content || m.message || '',\n timestamp: new Date(m.created_at || m.timestamp),\n needsHumanInput: m.needs_human_input,\n })),\n };\n }\n\n async sendDM(conversationId: string, message: string, needsHumanInput: boolean = false): Promise<void> {\n const payload: Record<string, unknown> = { message };\n if (needsHumanInput) {\n payload.needs_human_input = true;\n }\n await this.client.post(`/agents/dm/conversations/${conversationId}/send`, payload);\n }\n}\n\n// ── Helpers ──\n\nfunction extractTitle(content: string): string {\n const firstLine = content.split('\\n')[0].trim();\n const sentenceEnd = firstLine.search(/[.!?]/);\n const raw = sentenceEnd > 0 && sentenceEnd <= 80\n ? firstLine.slice(0, sentenceEnd + 1)\n : firstLine;\n\n if (raw.length <= 80) return raw;\n const truncated = raw.slice(0, 80).replace(/\\s+\\S*$/, '');\n return truncated + '...';\n}\n\nfunction mapPost(p: any): Post {\n return {\n id: p.id,\n authorId: p.author_id || p.author?.id || '',\n authorName: p.author_name || p.author?.name || '',\n content: p.content,\n title: p.title,\n timestamp: new Date(p.created_at),\n platform: 'moltbook',\n likes: p.upvotes ?? p.likes_count,\n replies: p.comment_count ?? p.replies_count,\n reposts: p.reposts_count,\n mentions: p.mentions || [],\n url: p.url,\n submolt: p.submolt?.name || p.submolt,\n };\n}\n\nfunction mapComment(c: any, postId: string): Comment {\n return {\n id: c.id,\n postId,\n parentId: c.parent_id,\n authorName: c.author?.name || c.author_name || '',\n content: c.content,\n upvotes: c.upvotes ?? 0,\n downvotes: c.downvotes ?? 0,\n timestamp: new Date(c.created_at),\n replies: c.replies?.map((r: any) => mapComment(r, postId)),\n };\n}\n\nfunction mapSubmolt(s: any): Submolt {\n return {\n name: s.name,\n displayName: s.display_name || s.name,\n description: s.description || '',\n subscriberCount: s.subscriber_count || 0,\n postCount: s.post_count,\n yourRole: s.your_role || null,\n createdAt: new Date(s.created_at),\n };\n}\n","import type { PostResult, ReplyResult, Mention, Profile, Post, FeedOptions, Comment, SearchResult, SearchOptions } from './types.js';\n\nexport abstract class SocialAdapter {\n abstract platform: string;\n\n abstract post(content: string): Promise<PostResult>;\n abstract reply(id: string, content: string): Promise<ReplyResult>;\n abstract like(id: string): Promise<void>;\n abstract follow(userId: string): Promise<void>;\n abstract getMentions(): Promise<Mention[]>;\n abstract getFeed(options?: FeedOptions): Promise<Post[]>;\n abstract getProfile(userId: string): Promise<Profile>;\n\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n\n // Optional methods with defaults — override in platform adapters as needed\n\n async downvote(_id: string): Promise<void> {\n throw new Error(`downvote() is not supported on ${this.platform}`);\n }\n\n async unfollow(_userId: string): Promise<void> {\n throw new Error(`unfollow() is not supported on ${this.platform}`);\n }\n\n async getPost(_id: string): Promise<Post> {\n throw new Error(`getPost() is not supported on ${this.platform}`);\n }\n\n async deletePost(_id: string): Promise<void> {\n throw new Error(`deletePost() is not supported on ${this.platform}`);\n }\n\n async getComments(_postId: string, _sort?: string): Promise<Comment[]> {\n throw new Error(`getComments() is not supported on ${this.platform}`);\n }\n\n async search(_query: string, _options?: SearchOptions): Promise<SearchResult[]> {\n throw new Error(`search() is not supported on ${this.platform}`);\n }\n}\n","import { SocialAdapter } from './SocialAdapter.js';\nimport type { PostResult, ReplyResult, Mention, Profile, Post, FeedOptions } from './types.js';\nimport type { TwitterConfig } from '../config/types.js';\n\nexport class TwitterAdapter extends SocialAdapter {\n platform = 'twitter';\n private config: TwitterConfig;\n private client: any; // twitter-api-v2 client\n\n constructor(config: TwitterConfig) {\n super();\n this.config = config;\n }\n\n async connect(): Promise<void> {\n // Dynamic import to keep twitter-api-v2 optional\n const { TwitterApi } = await import('twitter-api-v2');\n this.client = new TwitterApi({\n appKey: this.config.credentials.apiKey,\n appSecret: this.config.credentials.apiSecret,\n accessToken: this.config.credentials.accessToken,\n accessSecret: this.config.credentials.accessSecret,\n });\n\n // Verify credentials\n await this.client.v2.me();\n }\n\n async disconnect(): Promise<void> {\n this.client = null;\n }\n\n async post(content: string): Promise<PostResult> {\n const tweet = await this.client.v2.tweet(content);\n return {\n id: tweet.data.id,\n url: `https://twitter.com/i/status/${tweet.data.id}`,\n timestamp: new Date(),\n };\n }\n\n async reply(tweetId: string, content: string): Promise<ReplyResult> {\n const tweet = await this.client.v2.reply(content, tweetId);\n return {\n id: tweet.data.id,\n parentId: tweetId,\n url: `https://twitter.com/i/status/${tweet.data.id}`,\n timestamp: new Date(),\n };\n }\n\n async like(tweetId: string): Promise<void> {\n const me = await this.client.v2.me();\n await this.client.v2.like(me.data.id, tweetId);\n }\n\n async follow(userId: string): Promise<void> {\n const me = await this.client.v2.me();\n await this.client.v2.follow(me.data.id, userId);\n }\n\n async getMentions(): Promise<Mention[]> {\n const me = await this.client.v2.me();\n const mentions = await this.client.v2.userMentionTimeline(me.data.id, {\n max_results: 20,\n expansions: ['author_id'],\n 'tweet.fields': ['created_at'],\n 'user.fields': ['name', 'username'],\n });\n\n const users = new Map<string, string>();\n if (mentions.includes?.users) {\n for (const user of mentions.includes.users) {\n users.set(user.id, user.username);\n }\n }\n\n return (mentions.data?.data || []).map((tweet: any) => ({\n id: tweet.id,\n authorId: tweet.author_id,\n authorName: users.get(tweet.author_id) || 'unknown',\n content: tweet.text,\n timestamp: new Date(tweet.created_at),\n platform: 'twitter',\n }));\n }\n\n async getFeed(options?: FeedOptions): Promise<Post[]> {\n const me = await this.client.v2.me();\n const timeline = await this.client.v2.userTimeline(me.data.id, {\n max_results: options?.limit || 20,\n 'tweet.fields': ['created_at', 'public_metrics'],\n });\n\n return (timeline.data?.data || []).map((tweet: any) => ({\n id: tweet.id,\n authorId: me.data.id,\n authorName: me.data.username,\n content: tweet.text,\n timestamp: new Date(tweet.created_at),\n platform: 'twitter',\n likes: tweet.public_metrics?.like_count,\n replies: tweet.public_metrics?.reply_count,\n reposts: tweet.public_metrics?.retweet_count,\n }));\n }\n\n async getProfile(userId: string): Promise<Profile> {\n const user = await this.client.v2.user(userId, {\n 'user.fields': ['description', 'public_metrics'],\n });\n\n return {\n id: user.data.id,\n name: user.data.name,\n bio: user.data.description,\n followers: user.data.public_metrics?.followers_count,\n following: user.data.public_metrics?.following_count,\n platform: 'twitter',\n };\n }\n}\n","import { A2AClient as SDKClient } from '@a2a-js/sdk/client';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Configuration for A2A client operations\n */\nexport interface A2AClientConfig {\n /**\n * The base URL of the target agent\n * @example 'http://localhost:3001'\n */\n agentUrl: string;\n\n /**\n * Path to the agent card (defaults to '.well-known/agent.json')\n */\n agentCardPath?: string;\n\n /**\n * Timeout for requests in milliseconds (optional)\n */\n timeout?: number;\n}\n\n/**\n * Options for sending messages via A2A\n */\nexport interface A2AMessageOptions {\n /**\n * The text message to send\n */\n text: string;\n\n /**\n * Optional context ID to group related messages\n */\n contextId?: string;\n\n /**\n * Optional metadata for extensions\n */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Response from an A2A message\n */\nexport interface A2AMessageResponse {\n /**\n * Whether the message was successfully sent and received\n */\n success: boolean;\n\n /**\n * The reply text from the agent (if successful)\n */\n reply?: string;\n\n /**\n * The agent URL that responded\n */\n agentUrl?: string;\n\n /**\n * Error message (if failed)\n */\n error?: string;\n\n /**\n * Raw response from the A2A protocol (for advanced use)\n */\n raw?: any;\n}\n\n/**\n * Wrapper around A2A Client SDK with improved developer experience\n * \n * @example\n * ```typescript\n * const client = new A2AClient({ agentUrl: 'http://localhost:3001' });\n * const response = await client.sendMessage({ text: 'Hello!' });\n * console.log(response.reply);\n * ```\n */\nexport class A2AClient {\n private sdkClient: SDKClient;\n private config: Required<A2AClientConfig>;\n\n constructor(config: A2AClientConfig) {\n this.config = {\n agentUrl: config.agentUrl,\n agentCardPath: config.agentCardPath || '.well-known/agent.json',\n timeout: config.timeout || 30000,\n };\n\n const agentUrl: string = this.config.agentUrl;\n const agentCardPath: string = this.config.agentCardPath;\n \n this.sdkClient = new SDKClient(agentUrl, agentCardPath);\n }\n\n /**\n * Send a text message to the agent and get a response\n * \n * @param options Message options including text content\n * @returns Promise resolving to the agent's response\n * \n * @example\n * ```typescript\n * const response = await client.sendMessage({\n * text: 'What are your thoughts on AI?',\n * contextId: 'conversation-123'\n * });\n * \n * if (response.success) {\n * console.log('Agent replied:', response.reply);\n * }\n * ```\n */\n async sendMessage(options: A2AMessageOptions): Promise<A2AMessageResponse> {\n try {\n const response = await this.sdkClient.sendMessage({\n message: {\n kind: 'message',\n messageId: uuidv4(),\n role: 'user',\n contextId: options.contextId,\n metadata: options.metadata,\n parts: [\n {\n kind: 'text',\n text: options.text,\n },\n ],\n },\n });\n\n // Extract reply from response\n const reply = this.extractReply(response);\n\n return {\n success: true,\n reply,\n agentUrl: this.config.agentUrl,\n raw: response,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Unknown error occurred',\n agentUrl: this.config.agentUrl,\n };\n }\n }\n\n /**\n * Extract text reply from A2A protocol response\n * Handles both Message and Task response types\n */\n private extractReply(response: any): string {\n if (!('result' in response) || !response.result) {\n return JSON.stringify(response);\n }\n\n const result = response.result;\n\n // Check if it's a Message with parts\n if ('kind' in result && result.kind === 'message' && 'parts' in result) {\n const textParts = result.parts\n .filter((part: any) => part.kind === 'text')\n .map((part: any) => part.text);\n return textParts.join('\\n');\n }\n\n // Task or other response type\n return typeof result === 'string' ? result : JSON.stringify(result);\n }\n\n /**\n * Get the agent card information\n * \n * @returns Promise resolving to the agent card\n */\n async getAgentCard(): Promise<any> {\n return this.sdkClient.getAgentCard();\n }\n\n /**\n * Get the base URL of the agent\n */\n getAgentUrl(): string {\n return this.config.agentUrl;\n }\n}\n\n/**\n * Factory function to create A2A clients easily\n * \n * @example\n * ```typescript\n * const client = createA2AClient('http://localhost:3001');\n * const response = await client.sendMessage({ text: 'Hello!' });\n * ```\n */\nexport function createA2AClient(\n agentUrlOrConfig: string | A2AClientConfig\n): A2AClient {\n const config =\n typeof agentUrlOrConfig === 'string'\n ? { agentUrl: agentUrlOrConfig }\n : agentUrlOrConfig;\n\n return new A2AClient(config);\n}\n","import type { Action, ActionContext, ActionResult } from '../config/types.js';\nimport { A2AClient } from './client.js';\n\n/**\n * Configuration for the built-in A2A communication action\n */\nexport interface A2ACommunicationActionConfig {\n /**\n * Default agent URL to communicate with\n * Can be overridden per-action execution\n */\n defaultAgentUrl?: string;\n\n /**\n * Custom name for the action (defaults to 'talk_to_agent')\n */\n actionName?: string;\n\n /**\n * Custom description for the action\n */\n description?: string;\n\n /**\n * Whether to enable verbose logging\n */\n verbose?: boolean;\n}\n\n/**\n * Creates a ready-to-use A2A communication action\n * \n * @param config Configuration for the A2A action\n * @returns An Action that can be registered with the agent\n * \n * @example\n * ```typescript\n * const a2aAction = createA2ACommunicationAction({\n * defaultAgentUrl: 'http://localhost:3001',\n * actionName: 'talk_to_partner',\n * verbose: true\n * });\n * \n * // Register in agent.config.ts\n * export default {\n * customActions: [a2aAction],\n * actions: ['talk_to_partner']\n * }\n * ```\n */\nexport function createA2ACommunicationAction(\n config: A2ACommunicationActionConfig = {}\n): Action {\n const {\n defaultAgentUrl,\n actionName = 'talk_to_agent',\n description,\n verbose = false,\n } = config;\n\n const defaultDescription =\n description ||\n `Send a message to another A2A-compliant agent and receive their response. ` +\n `Parameters: message (required string) - the message to send, ` +\n `agentUrl (optional string) - target agent URL${defaultAgentUrl ? ` (defaults to ${defaultAgentUrl})` : ''}`;\n\n return {\n name: actionName,\n description: defaultDescription,\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters } = context;\n const message = parameters.message as string;\n const agentUrl = (parameters.agentUrl as string) || defaultAgentUrl;\n\n if (!message) {\n return {\n success: false,\n error: 'Parameter \"message\" is required',\n };\n }\n\n if (!agentUrl) {\n return {\n success: false,\n error: 'Parameter \"agentUrl\" is required or defaultAgentUrl must be configured',\n };\n }\n\n if (verbose) {\n console.log(`[A2A] Sending message to ${agentUrl}:`, message);\n }\n\n try {\n const client = new A2AClient({ agentUrl });\n const response = await client.sendMessage({ text: message });\n\n if (verbose) {\n console.log(`[A2A] Response from ${agentUrl}:`, response.reply);\n }\n\n if (!response.success) {\n return {\n success: false,\n error: response.error || 'Failed to communicate with agent',\n };\n }\n\n return {\n success: true,\n data: {\n reply: response.reply,\n agentUrl: response.agentUrl,\n },\n };\n } catch (error: any) {\n if (verbose) {\n console.error(`[A2A] Error:`, error);\n }\n\n return {\n success: false,\n error: error.message || 'Unknown error occurred',\n };\n }\n },\n };\n}\n\n/**\n * Creates multiple A2A communication actions for different agents\n * \n * @param configs Map of action names to their configurations\n * @returns Array of Actions ready to be registered\n * \n * @example\n * ```typescript\n * const actions = createMultipleA2AActions({\n * talk_to_analyst: {\n * defaultAgentUrl: 'http://localhost:3001',\n * description: 'Communicate with the business analyst agent'\n * },\n * talk_to_engineer: {\n * defaultAgentUrl: 'http://localhost:3002',\n * description: 'Communicate with the engineering agent'\n * }\n * });\n * \n * // In agent.config.ts\n * export default {\n * customActions: actions,\n * actions: ['talk_to_analyst', 'talk_to_engineer']\n * }\n * ```\n */\nexport function createMultipleA2AActions(\n configs: Record<string, A2ACommunicationActionConfig>\n): Action[] {\n return Object.entries(configs).map(([name, config]) =>\n createA2ACommunicationAction({\n ...config,\n actionName: name,\n })\n );\n}\n","import type { AgentConfig, Decision, Experience, ActionResult, Action } from '../config/types.js';\nimport type { LifecycleHooks } from './lifecycle.js';\nimport { Scheduler } from './scheduler.js';\nimport { ActionRegistry } from '../actions/registry.js';\nimport { ActionHandler } from '../actions/ActionHandler.js';\nimport { builtInActions, moltbookActions } from '../actions/built-in/index.js';\nimport { createMarkdownAction } from '../actions/interpreter.js';\nimport { ShortTermMemory } from '../memory/shortterm.js';\nimport type { Memory } from '../memory/Memory.js';\nimport type { LLMProvider } from '../llm/Provider.js';\nimport { AnthropicProvider } from '../llm/anthropic.js';\nimport { OpenAIProvider } from '../llm/openai.js';\nimport { SocialAdapter } from '../social/SocialAdapter.js';\nimport { MoltbookAdapter } from '../social/moltbook.js';\nimport { TwitterAdapter } from '../social/twitter.js';\nimport { buildSystemPrompt, buildDecisionPrompt } from '../llm/prompt.js';\nimport { createLogger } from '../logger.js';\nimport {\n createA2ACommunicationAction,\n createMultipleA2AActions,\n} from '../a2a/actions.js';\nimport {\n createJoinWorldAction,\n createLeaveWorldAction,\n createQueryWorldAction,\n createSendWorldMessageAction,\n} from '../actions/built-in/world.js';\n\nconst logger = createLogger('Agent');\n\n/** Parse a postFrequency string into milliseconds. Supports: 'hourly', 'daily', '30m', '2h', etc. */\nfunction parsePostFrequency(freq: string): number {\n const lower = freq.toLowerCase().trim();\n\n // Named presets\n if (lower === 'realtime') return 5 * 60 * 1000; // 5 minutes\n if (lower === 'hourly') return 60 * 60 * 1000; // 1 hour\n if (lower === 'daily') return 24 * 60 * 60 * 1000; // 24 hours\n\n // Short-form: \"30m\", \"2h\", \"1d\"\n const match = lower.match(/^(\\d+)\\s*(m|min|mins|minutes?|h|hr|hrs|hours?|d|days?)$/);\n if (match) {\n const n = parseInt(match[1], 10);\n const unit = match[2][0]; // 'm', 'h', or 'd'\n if (unit === 'm') return n * 60 * 1000;\n if (unit === 'h') return n * 60 * 60 * 1000;\n if (unit === 'd') return n * 24 * 60 * 60 * 1000;\n }\n\n // Natural language: \"every 30 minutes\", \"every 2 hours\"\n const nlMin = lower.match(/every\\s+(\\d+)\\s+minutes?/);\n if (nlMin) return parseInt(nlMin[1], 10) * 60 * 1000;\n\n const nlHour = lower.match(/every\\s+(\\d+)\\s+hours?/);\n if (nlHour) return parseInt(nlHour[1], 10) * 60 * 60 * 1000;\n\n if (/every\\s+hour/.test(lower)) return 60 * 60 * 1000;\n if (/every\\s+day/.test(lower)) return 24 * 60 * 60 * 1000;\n\n return 0;\n}\n\n/** Format milliseconds into a human-readable string */\nfunction formatInterval(ms: number): string {\n if (ms < 60 * 1000) return `${Math.round(ms / 1000)}s`;\n if (ms < 60 * 60 * 1000) return `${Math.round(ms / 60000)}m`;\n if (ms < 24 * 60 * 60 * 1000) return `${Math.round(ms / 3600000)}h`;\n return `${Math.round(ms / 86400000)}d`;\n}\n\nexport type AgentState = 'idle' | 'initializing' | 'running' | 'stopping' | 'stopped' | 'error';\n\nexport class Agent {\n readonly config: AgentConfig;\n\n private state: AgentState = 'idle';\n private llm!: LLMProvider;\n private memory_: Memory;\n private scheduler: Scheduler;\n private actionRegistry: ActionRegistry;\n private actionHandler: ActionHandler;\n private hooks: LifecycleHooks = {};\n private tickTimer?: ReturnType<typeof setInterval>;\n private systemPrompt: string;\n\n socialAdapters: Record<string, SocialAdapter> = {};\n private recentActions: Array<{ action: string; reasoning: string; time: string }> = [];\n private tickCount = 0;\n\n constructor(config: AgentConfig, hooks?: LifecycleHooks) {\n this.config = config;\n this.hooks = hooks || {};\n this.memory_ = new ShortTermMemory();\n this.scheduler = new Scheduler();\n this.actionRegistry = new ActionRegistry();\n this.actionHandler = new ActionHandler(this.actionRegistry);\n this.systemPrompt = buildSystemPrompt(config);\n }\n\n get name(): string {\n return this.config.name;\n }\n\n getState(): AgentState {\n return this.state;\n }\n\n getMemory(): Memory {\n return this.memory_;\n }\n\n getLLM(): LLMProvider {\n return this.llm;\n }\n\n getActionRegistry(): ActionRegistry {\n return this.actionRegistry;\n }\n\n // ── Configuration Methods ──\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n appendSystemPrompt(additional: string): void {\n this.systemPrompt += '\\n\\n' + additional;\n }\n\n getSystemPrompt(): string {\n return this.systemPrompt;\n }\n\n setHooks(hooks: LifecycleHooks): void {\n this.hooks = hooks;\n }\n\n mergeHooks(hooks: Partial<LifecycleHooks>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n setMemory(memory: Memory): void {\n this.memory_ = memory;\n }\n\n async preloadMemory(entries: Record<string, unknown>): Promise<void> {\n for (const [key, value] of Object.entries(entries)) {\n await this.memory_.remember(key, value);\n }\n }\n\n registerAction(action: Action): void {\n this.actionRegistry.register(action);\n }\n\n // ── Lifecycle ──\n\n async init(): Promise<void> {\n this.state = 'initializing';\n logger.info(`Initializing agent: ${this.config.name}`);\n\n // Derive wallet address from private key if not explicitly set\n if (this.config.world?.privateKey && !this.config.world.walletAddress) {\n try {\n const { AgentWallet } = await import('../wallet/AgentWallet.js');\n const wallet = new AgentWallet(this.config.world.privateKey);\n this.config.world.walletAddress = await wallet.getAddressAsync();\n logger.info(`Wallet address derived: ${this.config.world.walletAddress}`);\n } catch (error: any) {\n logger.warn(`Failed to derive wallet address: ${error.message}`);\n }\n }\n\n this.initLLM();\n this.registerActions();\n await this.initSocialAdapters();\n this.initScheduledJobs();\n\n if (this.hooks.onInit) {\n await this.hooks.onInit(this);\n }\n\n await this.postStartupMessages();\n\n logger.info(`Agent initialized: ${this.config.name}`);\n }\n\n async start(): Promise<void> {\n if (this.state !== 'initializing' && this.state !== 'idle') {\n throw new Error(`Cannot start agent in state: ${this.state}`);\n }\n\n if (this.state === 'idle') {\n await this.init();\n }\n\n this.state = 'running';\n logger.info(`Agent started: ${this.config.name}`);\n\n if (this.hooks.onStart) {\n await this.hooks.onStart(this);\n }\n\n // Auto-join world if configured\n if (this.config.world?.url && this.config.world.autoJoin !== false) {\n await this.autoJoinWorld();\n }\n\n this.scheduler.start();\n\n if (this.config.behaviors.autonomous) {\n this.startAutonomousLoop();\n }\n }\n\n async stop(): Promise<void> {\n this.state = 'stopping';\n logger.info(`Stopping agent: ${this.config.name}`);\n\n if (this.tickTimer) {\n clearInterval(this.tickTimer);\n this.tickTimer = undefined;\n }\n\n this.scheduler.stop();\n\n for (const adapter of Object.values(this.socialAdapters)) {\n await adapter.disconnect();\n }\n\n if (this.hooks.onShutdown) {\n await this.hooks.onShutdown(this);\n }\n\n this.state = 'stopped';\n logger.info(`Agent stopped: ${this.config.name}`);\n }\n\n // ── Decision Loop ──\n\n async think(): Promise<Decision> {\n const context = await this.gatherContext();\n const availableActions = this.actionHandler.getAvailableActions();\n\n const prompt = buildDecisionPrompt(context, availableActions);\n\n const decision = await this.llm.generateStructured<Decision>(\n prompt,\n {\n type: 'object',\n properties: {\n action: { type: 'string' },\n reasoning: { type: 'string' },\n parameters: { type: 'object' },\n },\n required: ['action', 'reasoning', 'parameters'],\n },\n { systemPrompt: this.systemPrompt, temperature: this.config.llm.temperature },\n );\n\n logger.debug(`Decision: ${decision.action} — ${decision.reasoning}`);\n return decision;\n }\n\n async act(actionName: string, parameters: Record<string, unknown> = {}): Promise<ActionResult> {\n const context = {\n agent: this,\n memory: this.memory_,\n llm: this.llm,\n parameters,\n };\n\n return this.actionHandler.execute(actionName, context);\n }\n\n async learn(experience: Experience): Promise<void> {\n await this.memory_.addExperience(experience);\n }\n\n async tick(): Promise<void> {\n if (this.state !== 'running') return;\n\n this.tickCount++;\n\n try {\n if (this.hooks.onTick) {\n await this.hooks.onTick(this);\n }\n\n if (this.isSleeping()) {\n logger.info(`Tick #${this.tickCount}: Sleeping — skipped`);\n return;\n }\n\n logger.info(`Tick #${this.tickCount}: Thinking...`);\n const decision = await this.think();\n\n logger.info(`Tick #${this.tickCount}: Decision → ${decision.action} | Reasoning: ${decision.reasoning}`);\n if (decision.parameters && Object.keys(decision.parameters).length > 0) {\n logger.info(`Tick #${this.tickCount}: Parameters → ${JSON.stringify(decision.parameters)}`);\n }\n\n const result = await this.act(decision.action, decision.parameters);\n\n logger.info(`Tick #${this.tickCount}: Result → success=${result.success}${result.data ? ` data=${JSON.stringify(result.data).slice(0, 200)}` : ''}`);\n\n // Track recent actions for context (keep last 10)\n this.recentActions.push({\n action: decision.action,\n reasoning: decision.reasoning,\n time: new Date().toISOString(),\n });\n if (this.recentActions.length > 10) this.recentActions.shift();\n\n await this.learn({\n type: 'action',\n action: decision.action,\n result,\n timestamp: new Date(),\n context: { reasoning: decision.reasoning },\n });\n\n if (this.config.webhooks?.onAction) {\n await this.fireWebhook('onAction', decision, result);\n }\n } catch (error) {\n logger.error(`Tick #${this.tickCount} error: ${error instanceof Error ? error.message : error}`);\n if (this.hooks.onError && error instanceof Error) {\n await this.hooks.onError(error, this);\n }\n }\n }\n\n // ── Markdown skill registration ──\n\n registerMarkdownSkills(skills: Array<{ name: string; description: string }>): void {\n for (const skill of skills) {\n const action = createMarkdownAction(skill.name, skill.description, this.llm);\n this.actionRegistry.register(action);\n }\n }\n\n // ── Internal ──\n\n private initLLM(): void {\n const { provider, apiKey, model } = this.config.llm;\n\n switch (provider) {\n case 'anthropic':\n this.llm = new AnthropicProvider(apiKey, model);\n break;\n case 'openai':\n this.llm = new OpenAIProvider(apiKey, model);\n break;\n default:\n throw new Error(`Unsupported LLM provider: ${provider}`);\n }\n }\n\n private registerActions(): void {\n // Register built-in generic actions that the config references\n for (const action of builtInActions) {\n if (this.config.actions.includes(action.name)) {\n this.actionRegistry.register(action);\n }\n }\n\n // Auto-register all Moltbook actions when moltbook is configured\n // (these check for the adapter at execution time, not registration time)\n const mb = this.config.social.moltbook;\n if (mb && mb.enabled !== false) {\n for (const action of moltbookActions) {\n if (!this.actionRegistry.has(action.name)) {\n this.actionRegistry.register(action);\n }\n }\n logger.info(`Registered ${moltbookActions.length} Moltbook actions`);\n }\n\n // Auto-register A2A communication actions when A2A is configured\n const a2a = this.config.a2a;\n if (a2a && a2a.enabled !== false) {\n if (a2a.peers && Object.keys(a2a.peers).length > 0) {\n // Create specific actions for each peer\n const peerActions = createMultipleA2AActions(\n Object.entries(a2a.peers).reduce((acc, [actionName, url]) => {\n acc[actionName] = {\n defaultAgentUrl: url,\n verbose: a2a.verbose,\n description: `Communicate with peer agent at ${url}`,\n };\n return acc;\n }, {} as Record<string, any>)\n );\n\n for (const action of peerActions) {\n if (!this.actionRegistry.has(action.name)) {\n this.actionRegistry.register(action);\n }\n }\n logger.info(`Registered ${peerActions.length} A2A peer actions`);\n } else {\n // Create generic A2A action\n const genericAction = createA2ACommunicationAction({\n defaultAgentUrl: a2a.defaultPeerUrl,\n actionName: a2a.genericActionName || 'talk_to_agent',\n verbose: a2a.verbose,\n });\n\n if (!this.actionRegistry.has(genericAction.name)) {\n this.actionRegistry.register(genericAction);\n }\n logger.info(`Registered generic A2A action: ${genericAction.name}`);\n }\n }\n\n // Auto-register world actions when world config is present\n const world = this.config.world;\n if (world?.url) {\n const worldUrl = world.url;\n\n const worldActionsList = [\n createJoinWorldAction({ defaultWorldUrl: worldUrl }),\n createLeaveWorldAction({ defaultWorldUrl: worldUrl }),\n createQueryWorldAction({ defaultWorldUrl: worldUrl }),\n createSendWorldMessageAction({ defaultWorldUrl: worldUrl }),\n ];\n\n for (const action of worldActionsList) {\n if (!this.actionRegistry.has(action.name)) {\n this.actionRegistry.register(action);\n }\n }\n logger.info(`Registered 4 world actions (world: ${worldUrl})`);\n }\n\n // Register custom actions (code-based)\n if (this.config.customActions) {\n for (const action of this.config.customActions) {\n this.actionRegistry.register(action);\n }\n }\n }\n\n private async initSocialAdapters(): Promise<void> {\n const social = this.config.social;\n\n // ── Moltbook: detect from env, merge with config ──\n await this.initMoltbook(social);\n\n // ── Twitter: detect from env, merge with config ──\n await this.initTwitter(social);\n\n if (Object.keys(this.socialAdapters).length === 0) {\n logger.warn('Social: No adapters connected. Set MOLTBOOK_API_KEY or Twitter env vars in your .env to enable.');\n }\n }\n\n private async initMoltbook(social: typeof this.config.social): Promise<void> {\n // Resolve API key: config takes priority, then env\n const envKey = process.env.MOLTBOOK_API_KEY;\n const configMoltbook = social.moltbook;\n const apiKey = configMoltbook?.apiKey || envKey || '';\n const isPlaceholder = !apiKey || apiKey === 'your-moltbook-key-here';\n\n // Determine if moltbook should be active\n // A valid API key (from env or config) always wins over enabled: false in scaffold.\n // The scaffold sets enabled: false as a default — setting the key means the user wants it on.\n const explicitlyDisabled = configMoltbook && configMoltbook.enabled === false && !envKey;\n const shouldConnect = !isPlaceholder && !explicitlyDisabled;\n\n if (explicitlyDisabled) {\n logger.info('Moltbook: Disabled in config and no MOLTBOOK_API_KEY in env — skipping');\n return;\n }\n\n if (isPlaceholder) {\n if (configMoltbook?.enabled || envKey) {\n logger.warn('Moltbook: MOLTBOOK_API_KEY is missing or still a placeholder.');\n logger.warn(' Fix: Set a valid MOLTBOOK_API_KEY in your .env file.');\n }\n // No key at all and not configured — stay silent\n return;\n }\n\n if (!shouldConnect) return;\n\n // Build the effective config by merging env + config\n const source = configMoltbook?.apiKey ? 'config' : 'environment';\n const baseUrl = configMoltbook?.baseUrl || process.env.MOLTBOOK_BASE_URL || 'https://www.moltbook.com/api/v1';\n const defaultSubmolt = configMoltbook?.defaultSubmolt || 'general';\n\n const effectiveConfig = {\n enabled: true as const,\n apiKey,\n baseUrl,\n defaultSubmolt,\n ...configMoltbook,\n // Ensure env-resolved values win when config didn't set them\n ...(configMoltbook?.apiKey ? {} : { apiKey }),\n ...(configMoltbook?.baseUrl ? {} : { baseUrl }),\n };\n\n logger.info(`Moltbook: API key detected from ${source}`);\n logger.info(`Moltbook: Connecting to ${baseUrl} ...`);\n\n const adapter = new MoltbookAdapter(effectiveConfig);\n try {\n await adapter.connect();\n this.socialAdapters['moltbook'] = adapter;\n // Write back so the rest of the system sees the effective config\n social.moltbook = effectiveConfig;\n logger.info(`Moltbook: Connected successfully (submolt: ${defaultSubmolt})`);\n } catch (error: any) {\n logger.error(`Moltbook: Connection FAILED — ${error.message || error}`);\n this.logPlatformError('Moltbook', error);\n }\n }\n\n private async initTwitter(social: typeof this.config.social): Promise<void> {\n const configTwitter = social.twitter;\n const envApiKey = process.env.TWITTER_API_KEY;\n const envApiSecret = process.env.TWITTER_API_SECRET;\n const envAccessToken = process.env.TWITTER_ACCESS_TOKEN;\n const envAccessSecret = process.env.TWITTER_ACCESS_SECRET;\n\n // Resolve credentials: config takes priority, then env\n const creds = (configTwitter as any)?.credentials;\n const apiKey = creds?.apiKey || envApiKey || '';\n const apiSecret = creds?.apiSecret || envApiSecret || '';\n const accessToken = creds?.accessToken || envAccessToken || '';\n const accessSecret = creds?.accessSecret || envAccessSecret || '';\n\n const hasKey = apiKey && apiKey !== 'your-twitter-api-key';\n const hasAllCreds = hasKey && apiSecret && accessToken && accessSecret;\n\n // A valid env key overrides enabled: false from the scaffold\n const explicitlyDisabled = configTwitter && configTwitter.enabled === false && !envApiKey;\n\n if (explicitlyDisabled) {\n logger.info('Twitter: Disabled in config and no TWITTER_API_KEY in env — skipping');\n return;\n }\n\n if (!hasKey) {\n if (configTwitter?.enabled || envApiKey) {\n logger.warn('Twitter: Credentials are missing or still placeholders.');\n logger.warn(' Fix: Set valid Twitter keys in your .env file.');\n }\n return;\n }\n\n if (!hasAllCreds) {\n logger.warn('Twitter: Some credentials are missing. Need: TWITTER_API_KEY, TWITTER_API_SECRET, TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_SECRET');\n return;\n }\n\n const source = creds?.apiKey ? 'config' : 'environment';\n logger.info(`Twitter: Credentials detected from ${source}`);\n logger.info('Twitter: Connecting...');\n\n const effectiveConfig = {\n enabled: true as const,\n ...configTwitter,\n credentials: { apiKey, apiSecret, accessToken, accessSecret },\n };\n\n const adapter = new TwitterAdapter(effectiveConfig as any);\n try {\n await adapter.connect();\n this.socialAdapters['twitter'] = adapter;\n social.twitter = effectiveConfig as any;\n logger.info('Twitter: Connected successfully');\n } catch (error: any) {\n logger.error(`Twitter: Connection FAILED — ${error.message || error}`);\n this.logPlatformError('Twitter', error);\n }\n }\n\n private async postStartupMessages(): Promise<void> {\n const adapters = Object.entries(this.socialAdapters);\n\n if (adapters.length === 0) {\n logger.info('Startup post: No connected social adapters — skipping');\n return;\n }\n\n // Generate a personality-driven startup post via the LLM.\n // The system prompt contains the full personality context (bio.md, traits.md, etc.)\n let content: string;\n try {\n const prompt = `You just came online. Write a short, engaging first post for social media.\\n` +\n `Stay fully in character — your personality, background, and role are defined in the system prompt.\\n` +\n `Do NOT use generic phrases like \"is now online and ready\" or \"Hello, world!\".\\n` +\n `Do NOT describe yourself in third person. Do NOT use emojis unless your personality calls for it.\\n` +\n `Write only the post content, nothing else. Keep it concise and natural.`;\n\n content = (await this.llm.generateText(prompt, {\n systemPrompt: this.systemPrompt,\n temperature: this.config.llm.temperature ?? 0.8,\n maxTokens: 280,\n })).trim();\n\n logger.info(`Startup post: LLM generated content (${content.length} chars)`);\n } catch (error: any) {\n // Fallback to a simple message if LLM fails\n logger.warn(`Startup post: LLM generation failed (${error.message}), using fallback`);\n content = `${this.config.name} is now online and ready.`;\n }\n\n for (const [platform, adapter] of adapters) {\n logger.info(`Startup post: Posting to ${platform}...`);\n try {\n const result = await adapter.post(content);\n logger.info(`Startup post: ${platform} SUCCESS — id=${result.id}${result.url ? ` url=${result.url}` : ''}`);\n } catch (error: any) {\n logger.error(`Startup post: ${platform} FAILED — ${error.message || error}`);\n this.logPlatformError(platform, error);\n }\n }\n }\n\n private initScheduledJobs(): void {\n // ── 1. Wire postFrequency from social platform configs ──\n this.wirePostFrequencyJobs();\n\n // ── 2. Wire scheduling tasks (from markdown ## Scheduling or code config) ──\n this.wireSchedulingTasks();\n }\n\n private wirePostFrequencyJobs(): void {\n const social = this.config.social;\n\n // Moltbook postFrequency\n if (social.moltbook?.enabled !== false && this.socialAdapters['moltbook']) {\n const freq = (social.moltbook as any)?.postFrequency;\n if (freq) {\n const intervalMs = parsePostFrequency(freq);\n if (intervalMs > 0) {\n this.scheduler.addJob({\n name: 'moltbook_scheduled_post',\n intervalMs,\n handler: async () => {\n await this.scheduledPost('moltbook');\n },\n });\n logger.info(`Scheduler: Moltbook posting every ${formatInterval(intervalMs)}`);\n }\n }\n }\n\n // Twitter postFrequency\n if (social.twitter?.enabled !== false && this.socialAdapters['twitter']) {\n const freq = (social.twitter as any)?.postFrequency;\n if (freq) {\n const intervalMs = parsePostFrequency(freq);\n if (intervalMs > 0) {\n this.scheduler.addJob({\n name: 'twitter_scheduled_post',\n intervalMs,\n handler: async () => {\n await this.scheduledPost('twitter');\n },\n });\n logger.info(`Scheduler: Twitter posting every ${formatInterval(intervalMs)}`);\n }\n }\n }\n }\n\n private wireSchedulingTasks(): void {\n const tasks = this.config.scheduling;\n if (!tasks || tasks.length === 0) return;\n\n for (const task of tasks) {\n this.scheduler.addJob({\n name: task.name,\n intervalMs: task.intervalMs,\n handler: async () => {\n await this.executeScheduledTask(task);\n },\n });\n logger.info(`Scheduler: \"${task.name}\" every ${formatInterval(task.intervalMs)}`);\n }\n }\n\n private async scheduledPost(platform: string): Promise<void> {\n const adapter = this.socialAdapters[platform];\n if (!adapter) return;\n\n try {\n // Ask the LLM to generate content — system prompt has full personality context\n const prompt = `Generate a short, engaging social media post for ${platform}.\\n` +\n `Stay fully in character based on your personality in the system prompt.\\n` +\n `Write only the post content, nothing else. Keep it concise and natural.`;\n\n const content = await this.llm.generateText(prompt, {\n systemPrompt: this.systemPrompt,\n temperature: this.config.llm.temperature ?? 0.8,\n maxTokens: 280,\n });\n\n const result = await adapter.post(content.trim());\n logger.info(`Scheduled post: ${platform} SUCCESS — id=${result.id}`);\n } catch (error: any) {\n logger.error(`Scheduled post: ${platform} FAILED — ${error.message || error}`);\n this.logPlatformError(platform, error);\n }\n }\n\n private async executeScheduledTask(task: { name: string; instructions: string }): Promise<void> {\n try {\n logger.info(`Scheduled task: Running \"${task.name}\"`);\n\n const prompt = `You are ${this.config.name}, an autonomous agent. Execute the following scheduled task.\\n\\n` +\n `Task: ${task.name}\\n` +\n `Instructions:\\n${task.instructions}\\n\\n` +\n `Available social platforms: ${Object.keys(this.socialAdapters).join(', ') || 'none'}\\n\\n` +\n `Decide what action to take. Respond with JSON:\\n` +\n `{ \"action\": \"<action_name>\", \"reasoning\": \"<why>\", \"parameters\": { ... } }`;\n\n const decision = await this.llm.generateStructured<Decision>(\n prompt,\n {\n type: 'object',\n properties: {\n action: { type: 'string' },\n reasoning: { type: 'string' },\n parameters: { type: 'object' },\n },\n required: ['action', 'reasoning', 'parameters'],\n },\n { systemPrompt: this.systemPrompt, temperature: this.config.llm.temperature },\n );\n\n const result = await this.act(decision.action, decision.parameters);\n logger.info(`Scheduled task: \"${task.name}\" completed — action=${decision.action}, success=${result.success}`);\n } catch (error: any) {\n logger.error(`Scheduled task: \"${task.name}\" FAILED — ${error.message || error}`);\n }\n }\n\n private logPlatformError(platform: string, error: any): void {\n if (!error.response) {\n // Network-level error (DNS, timeout, connection refused)\n if (error.code === 'ENOTFOUND') {\n logger.error(` ${platform}: DNS lookup failed — check the base URL.`);\n } else if (error.code === 'ECONNREFUSED') {\n logger.error(` ${platform}: Connection refused — is the server running?`);\n } else if (error.code === 'ETIMEDOUT' || error.code === 'ECONNABORTED') {\n logger.error(` ${platform}: Request timed out.`);\n } else {\n logger.error(` ${platform}: Network error (${error.code || 'unknown'})`);\n }\n return;\n }\n\n const status = error.response.status;\n const data = error.response.data;\n logger.error(` ${platform}: HTTP ${status}`);\n\n // Log the API response body\n if (data) {\n if (data.error) logger.error(` ${platform}: API error: ${data.error}`);\n if (data.hint) logger.error(` ${platform}: API hint: ${data.hint}`);\n if (!data.error && !data.hint) logger.error(` ${platform}: Response: ${JSON.stringify(data)}`);\n }\n\n // Actionable hints for common HTTP status codes\n if (status === 401) {\n logger.error(` ${platform}: Your API key was rejected. Verify it is correct and the agent is claimed.`);\n } else if (status === 403) {\n logger.error(` ${platform}: Forbidden — your agent may not be claimed yet or lacks permissions.`);\n } else if (status === 429) {\n const retryMin = data?.retry_after_minutes;\n const retrySec = data?.retry_after_seconds;\n if (retryMin) {\n logger.error(` ${platform}: Rate limited — try again in ${retryMin} minute(s).`);\n } else if (retrySec) {\n logger.error(` ${platform}: Rate limited — try again in ${retrySec} second(s).`);\n } else {\n logger.error(` ${platform}: Rate limited — wait before retrying.`);\n }\n } else if (status === 404) {\n logger.error(` ${platform}: Endpoint not found — check the base URL.`);\n } else if (status >= 500) {\n logger.error(` ${platform}: Server error — the platform may be temporarily down.`);\n }\n }\n\n private async autoJoinWorld(): Promise<void> {\n const worldUrl = this.config.world!.url;\n logger.info(`Auto-joining world: ${worldUrl}`);\n\n try {\n const result = await this.act('join_world', {\n worldUrl,\n walletAddress: this.config.world!.walletAddress,\n });\n\n if (result.success) {\n logger.info(`Successfully joined world: ${worldUrl}`);\n } else {\n logger.warn(`Failed to join world: ${result.error}`);\n }\n } catch (error: any) {\n logger.warn(`Auto-join world failed: ${error?.message || error}`);\n }\n }\n\n private startAutonomousLoop(): void {\n const actionsPerHour = typeof this.config.behaviors.actionsPerHour === 'function'\n ? this.config.behaviors.actionsPerHour({})\n : this.config.behaviors.actionsPerHour || 5;\n\n const intervalMs = Math.floor(3600000 / actionsPerHour);\n\n this.tickTimer = setInterval(() => this.tick(), intervalMs);\n logger.info(`Autonomous loop started: ~${actionsPerHour} actions/hour (every ${intervalMs}ms)`);\n }\n\n private isSleeping(): boolean {\n const schedule = this.config.behaviors.sleepSchedule;\n if (!schedule) return false;\n\n const now = new Date();\n const hour = now.getHours();\n\n if (schedule.start > schedule.end) {\n // Wraps midnight (e.g., 22-6)\n return hour >= schedule.start || hour < schedule.end;\n }\n return hour >= schedule.start && hour < schedule.end;\n }\n\n private async gatherContext(): Promise<Record<string, unknown>> {\n return {\n agentName: this.config.name,\n agentType: this.config.type,\n currentTime: new Date().toISOString(),\n state: this.state,\n tickNumber: this.tickCount,\n personality: this.config.personality.traits,\n connectedPlatforms: Object.keys(this.socialAdapters),\n recentActions: this.recentActions.slice(-5),\n scheduledTasks: (this.config.scheduling || []).map((t) => t.name),\n };\n }\n\n private async fireWebhook(event: string, ...args: unknown[]): Promise<void> {\n try {\n const hook = this.config.webhooks?.[event as keyof typeof this.config.webhooks];\n if (typeof hook === 'function') {\n await (hook as Function)(...args);\n } else if (typeof hook === 'string') {\n const { default: axios } = await import('axios');\n await axios.post(hook, { event, data: args });\n }\n } catch (error) {\n logger.error(`Webhook ${event} failed: ${error}`);\n }\n }\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { MarkdownParser } from './MarkdownParser.js';\nimport { validateConfig } from './validator.js';\nimport type { AgentConfig } from './types.js';\n\nexport type ConfigType = 'code' | 'markdown';\n\nexport class ConfigurationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class ConfigLoader {\n private markdownParser = new MarkdownParser();\n\n async load(directory: string): Promise<{ config: AgentConfig; type: ConfigType }> {\n const codeConfigPath = resolve(directory, 'agent.config.ts');\n const mdConfigPath = resolve(directory, 'agent.md');\n\n if (existsSync(codeConfigPath)) {\n return { config: await this.loadCode(codeConfigPath), type: 'code' };\n }\n\n if (existsSync(mdConfigPath)) {\n return { config: await this.loadMarkdown(mdConfigPath), type: 'markdown' };\n }\n\n throw new ConfigurationError(\n `No agent configuration found in ${directory}. Expected agent.config.ts or agent.md`,\n );\n }\n\n async loadCode(filePath: string): Promise<AgentConfig> {\n try {\n // Use jiti to load TypeScript files at runtime without pre-compilation\n const { createJiti } = await import('jiti');\n const jiti = createJiti(pathToFileURL(filePath).href, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const module = await jiti.import(filePath) as any;\n const config = module.default || module;\n return validateConfig(config);\n } catch (error) {\n if (error instanceof Error && error.name === 'ConfigValidationError') throw error;\n throw new ConfigurationError(`Failed to load code config from ${filePath}: ${error}`);\n }\n }\n\n async loadMarkdown(filePath: string): Promise<AgentConfig> {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const partialConfig = this.markdownParser.parse(content);\n\n // Markdown configs need LLM settings from env or frontmatter\n const config = {\n ...partialConfig,\n llm: partialConfig.llm || {\n provider: (process.env.LLM_PROVIDER as 'anthropic' | 'openai') || 'anthropic',\n model: process.env.LLM_MODEL || 'claude-sonnet-4-20250514',\n apiKey: process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY || '',\n },\n };\n\n return validateConfig(config);\n } catch (error) {\n if (error instanceof Error && error.name === 'ConfigValidationError') throw error;\n throw new ConfigurationError(`Failed to load markdown config from ${filePath}: ${error}`);\n }\n }\n}\n","import matter from 'gray-matter';\nimport type { AgentConfig, ScheduledTask } from './types.js';\n\ninterface ParsedSection {\n title: string;\n level: number;\n content: string;\n children: ParsedSection[];\n}\n\nexport class MarkdownParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MarkdownParseError';\n }\n}\n\nexport class MarkdownParser {\n parse(markdown: string): Partial<AgentConfig> {\n const { data: frontmatter, content } = matter(markdown);\n const sections = this.parseSections(content);\n\n const identity = this.findSection(sections, 'Identity');\n const bio = this.findSection(sections, 'Bio');\n const social = this.findSection(sections, 'Social Platforms');\n const behaviors = this.findSection(sections, 'Behaviors');\n const memory = this.findSection(sections, 'Memory');\n const skills = this.findSection(sections, 'Skills');\n const scheduling = this.findSection(sections, 'Scheduling');\n const world = this.findSection(sections, 'World');\n\n const identityData = this.parseIdentity(identity);\n const bioText = bio ? bio.content.trim() : (identityData?.personality?.bio || '');\n\n const config: Partial<AgentConfig> = {\n ...identityData,\n personality: {\n traits: identityData?.personality?.traits || [],\n bio: bioText,\n },\n ...(social ? { social: this.parseSocial(social) } : {}),\n ...(behaviors ? { behaviors: this.parseBehaviors(behaviors) } : {}),\n ...(memory ? { memory: this.parseMemory(memory) } : {}),\n ...(world ? { world: this.parseWorld(world) } : {}),\n actions: [],\n ...frontmatter,\n };\n\n if (skills) {\n config.actions = skills.children.map((s) => this.toSnakeCase(s.title));\n }\n\n if (scheduling && scheduling.children.length > 0) {\n config.scheduling = this.parseScheduling(scheduling);\n }\n\n return config;\n }\n\n parseSkills(markdown: string): Array<{ name: string; description: string }> {\n const { content } = matter(markdown);\n const sections = this.parseSections(content);\n const skills = this.findSection(sections, 'Skills');\n\n if (!skills) return [];\n\n return skills.children.map((child) => ({\n name: this.toSnakeCase(child.title),\n description: child.content.trim(),\n }));\n }\n\n private parseSections(content: string): ParsedSection[] {\n const lines = content.split('\\n');\n const root: ParsedSection[] = [];\n const stack: Array<{ level: number; section: ParsedSection }> = [];\n\n for (const line of lines) {\n const match = line.match(/^(#{1,6})\\s+(.+)/);\n if (match) {\n const level = match[1].length;\n const title = match[2].trim();\n const section: ParsedSection = { title, level, content: '', children: [] };\n\n while (stack.length > 0 && stack[stack.length - 1].level >= level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(section);\n } else {\n stack[stack.length - 1].section.children.push(section);\n }\n\n stack.push({ level, section });\n } else if (stack.length > 0) {\n stack[stack.length - 1].section.content += line + '\\n';\n }\n }\n\n return root;\n }\n\n private findSection(sections: ParsedSection[], title: string): ParsedSection | undefined {\n for (const section of sections) {\n if (section.title.toLowerCase() === title.toLowerCase()) return section;\n const found = this.findSection(section.children, title);\n if (found) return found;\n }\n return undefined;\n }\n\n private parseIdentity(section?: ParsedSection): Partial<AgentConfig> | undefined {\n if (!section) return undefined;\n const fields = this.parseKeyValueLines(section.content);\n return {\n name: fields['name'] || 'Unnamed Agent',\n type: fields['type'],\n personality: {\n traits: (fields['personality'] || '').split(',').map((t: string) => t.trim()).filter(Boolean),\n bio: '',\n },\n };\n }\n\n private parseSocial(section: ParsedSection): Record<string, any> {\n const social: Record<string, any> = {};\n\n for (const child of section.children) {\n const platform = child.title.toLowerCase();\n const fields = this.parseKeyValueLines(child.content);\n const enabled = fields['enabled'] === 'true';\n delete fields['enabled'];\n\n // Convert snake_case keys to camelCase so they match TypeScript interfaces\n const camelFields: Record<string, string> = {};\n for (const [key, value] of Object.entries(fields)) {\n camelFields[this.toCamelCase(key)] = value;\n }\n\n social[platform] = {\n enabled,\n ...camelFields,\n };\n }\n\n return social;\n }\n\n private parseBehaviors(section: ParsedSection): AgentConfig['behaviors'] {\n const fields = this.parseKeyValueLines(section.content);\n return {\n autonomous: fields['autonomous'] === 'true',\n decisionMaking: (fields['decision_making'] || 'llm-driven') as AgentConfig['behaviors']['decisionMaking'],\n actionsPerHour: fields['actions_per_hour'] ? parseInt(fields['actions_per_hour'], 10) : undefined,\n sleepSchedule: fields['sleep_schedule'] ? this.parseSleepSchedule(fields['sleep_schedule']) : undefined,\n };\n }\n\n private parseMemory(section: ParsedSection): AgentConfig['memory'] {\n const fields = this.parseKeyValueLines(section.content);\n return {\n type: (fields['type'] || 'memory') as AgentConfig['memory']['type'],\n retention: fields['retention'],\n };\n }\n\n private parseWorld(section: ParsedSection): AgentConfig['world'] | undefined {\n const fields = this.parseKeyValueLines(section.content);\n const url = fields['url'];\n if (!url) return undefined;\n\n // Private key: 'env' reads from AGENT_WALLET_PRIVATE_KEY env var (never store in markdown)\n let privateKey: string | undefined;\n const pkField = fields['wallet_private_key'];\n if (pkField === 'env') {\n privateKey = process.env.AGENT_WALLET_PRIVATE_KEY;\n } else if (pkField && pkField.startsWith('0x')) {\n privateKey = pkField;\n }\n\n return {\n url,\n autoJoin: fields['auto_join'] !== 'false',\n ...(fields['wallet_address'] ? { walletAddress: fields['wallet_address'] } : {}),\n ...(privateKey ? { privateKey } : {}),\n };\n }\n\n private parseSleepSchedule(value: string): { start: number; end: number; timezone?: string } {\n const match = value.match(/(\\d{1,2}):?\\d{0,2}\\s*-\\s*(\\d{1,2}):?\\d{0,2}\\s*(.*)?/);\n if (!match) return { start: 22, end: 6 };\n return {\n start: parseInt(match[1], 10),\n end: parseInt(match[2], 10),\n timezone: match[3]?.trim() || undefined,\n };\n }\n\n private parseKeyValueLines(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):\\s*(.+)/);\n if (match) {\n result[match[1].trim()] = match[2].trim();\n }\n }\n return result;\n }\n\n private parseScheduling(section: ParsedSection): ScheduledTask[] {\n const tasks: ScheduledTask[] = [];\n\n for (const child of section.children) {\n const title = child.title.trim();\n\n // Skip \"On Startup\" — startup is handled separately in Agent.init()\n if (/^on\\s+startup$/i.test(title)) continue;\n\n const intervalMs = this.parseIntervalFromTitle(title);\n if (intervalMs <= 0) continue;\n\n const instructions = child.content.trim();\n if (!instructions) continue;\n\n tasks.push({\n name: this.toSnakeCase(title),\n intervalMs,\n instructions,\n });\n }\n\n return tasks;\n }\n\n private parseIntervalFromTitle(title: string): number {\n const lower = title.toLowerCase();\n\n // \"Every 30 Minutes\", \"Every 5 Minutes\"\n const minMatch = lower.match(/every\\s+(\\d+)\\s+minutes?/);\n if (minMatch) return parseInt(minMatch[1], 10) * 60 * 1000;\n\n // \"Every Hour\"\n if (/every\\s+hour$/i.test(lower)) return 60 * 60 * 1000;\n\n // \"Every 2 Hours\", \"Every 6 Hours\"\n const hourMatch = lower.match(/every\\s+(\\d+)\\s+hours?/);\n if (hourMatch) return parseInt(hourMatch[1], 10) * 60 * 60 * 1000;\n\n // \"Every Day\" or \"Every Day at ...\"\n if (/every\\s+day/i.test(lower)) return 24 * 60 * 60 * 1000;\n\n // \"Every Week\"\n if (/every\\s+week/i.test(lower)) return 7 * 24 * 60 * 60 * 1000;\n\n return 0;\n }\n\n private toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n }\n\n private toSnakeCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '');\n }\n}\n","import { z } from 'zod';\n\n// ── Social Platform Configs ──\n\nexport interface MoltbookConfig {\n enabled: boolean;\n apiKey: string;\n baseUrl?: string;\n defaultSubmolt?: string;\n postFrequency?: string; // 'hourly', 'daily', '30m', '2h', etc.\n engagementRate?: 'low' | 'medium' | 'high';\n autoReply?: boolean;\n replyFilter?: (post: any) => boolean;\n}\n\nexport interface TwitterConfig {\n enabled: boolean;\n credentials: {\n apiKey: string;\n apiSecret: string;\n accessToken: string;\n accessSecret: string;\n bearerToken?: string;\n };\n postFrequency?: string; // 'hourly', 'daily', '30m', '2h', etc.\n replyToMentions?: boolean;\n autoRetweet?: boolean;\n maxTweetsPerDay?: number;\n contentStrategy?: {\n threadTopics?: string[];\n hashtagStrategy?: string;\n mentionBehavior?: string;\n };\n}\n\nexport interface SocialPlatformConfig {\n enabled: boolean;\n [key: string]: unknown;\n}\n\nexport type SocialConfig = {\n moltbook?: MoltbookConfig;\n twitter?: TwitterConfig;\n} & Record<string, SocialPlatformConfig | MoltbookConfig | TwitterConfig | undefined>;\n\n// ── Behavior Configs ──\n\nexport interface BehaviorTrigger {\n condition: (context: any) => boolean;\n action: string;\n params?: Record<string, unknown>;\n}\n\n// ── Memory Configs ──\n\nexport interface RedisConfig {\n url: string;\n keyPrefix?: string;\n ttl?: number;\n}\n\nexport interface PostgresConfig {\n url: string;\n schema?: string;\n tableName?: string;\n}\n\n// ── Plugin Interface ──\n\nexport interface Plugin {\n name: string;\n version: string;\n init?: (agent: any) => Promise<void>;\n destroy?: () => Promise<void>;\n}\n\n// ── Scheduling ──\n\nexport interface ScheduledTask {\n name: string;\n intervalMs: number;\n instructions: string; // What to do (natural language or action name)\n}\n\n// ── Main Agent Config ──\n\nexport interface AgentConfig {\n name: string;\n type?: string;\n\n personality: {\n traits: string[];\n bio: string;\n [key: string]: unknown;\n };\n\n llm: {\n provider: 'anthropic' | 'openai';\n model: string;\n apiKey: string;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n };\n\n social: SocialConfig;\n\n /**\n * A2A Protocol Configuration\n * When enabled, automatically registers A2A communication actions\n * @optional\n */\n a2a?: {\n /**\n * Enable A2A protocol support (defaults to true when a2a config exists)\n */\n enabled?: boolean;\n\n /**\n * Peer agents this agent can communicate with\n * Key is the action name, value is the agent URL\n * @example { talk_to_analyst: 'http://localhost:3001' }\n */\n peers?: Record<string, string>;\n\n /**\n * Default peer agent URL (used when peers not specified)\n */\n defaultPeerUrl?: string;\n\n /**\n * Enable verbose A2A logging\n */\n verbose?: boolean;\n\n /**\n * Custom action name for generic A2A communication (defaults to 'talk_to_agent')\n */\n genericActionName?: string;\n };\n\n behaviors: {\n autonomous: boolean;\n decisionMaking: 'llm-driven' | 'rule-based' | 'hybrid';\n actionsPerHour?: number | ((context: any) => number);\n sleepSchedule?: { start: number; end: number; timezone?: string };\n triggers?: BehaviorTrigger[];\n };\n\n memory: {\n type: 'memory' | 'redis' | 'postgres' | 'hybrid';\n retention?: string;\n redis?: RedisConfig;\n postgres?: PostgresConfig;\n };\n\n actions: string[];\n customActions?: Action[];\n scheduling?: ScheduledTask[];\n\n /** World SDK integration — connect this agent to a world */\n world?: {\n /** URL of the world to join */\n url: string;\n /** Wallet address for blockchain-enabled worlds (derived from privateKey if not set) */\n walletAddress?: string;\n /** Private key for signing transactions and paying entry fees (hex with 0x prefix) */\n privateKey?: string;\n /** Auto-join the world when agent starts (default: true) */\n autoJoin?: boolean;\n };\n\n webhooks?: {\n onAction?: string | ((action: any, result: any) => Promise<void>);\n onError?: string;\n };\n\n plugins?: Plugin[];\n}\n\n// ── Action Types ──\n\nexport interface ActionContext {\n agent: any;\n memory: any;\n llm: any;\n parameters: Record<string, unknown>;\n}\n\nexport interface ActionResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\nexport interface Action {\n name: string;\n description: string;\n parameters?: Record<string, unknown>;\n execute: (context: ActionContext) => Promise<ActionResult>;\n}\n\n// ── Decision / Experience Types ──\n\nexport interface Decision {\n action: string;\n reasoning: string;\n parameters: Record<string, unknown>;\n}\n\nexport interface Experience {\n type: string;\n action: string;\n result: ActionResult;\n timestamp: Date;\n context?: Record<string, unknown>;\n}\n\n// ── Deployment Types ──\n\nexport interface DeploymentConfig {\n platform: 'railway' | 'render' | 'aws' | 'digitalocean' | 'custom';\n region?: string;\n instanceType?: string;\n autoScale?: boolean;\n customConfig?: CustomDeploymentConfig;\n}\n\nexport interface DeploymentResult {\n success: boolean;\n url?: string;\n deploymentId?: string;\n logs?: string[];\n error?: string;\n}\n\nexport interface DeploymentStatus {\n state: 'running' | 'stopped' | 'deploying' | 'failed' | 'unknown';\n url?: string;\n uptime?: number;\n lastDeployed?: Date;\n}\n\nexport interface CustomDeploymentConfig {\n deploymentMethod: 'docker' | 'ssh' | 'cli' | 'api';\n buildCommand: string;\n startCommand: string;\n environmentVariables?: Record<string, string>;\n healthCheckUrl?: string;\n port?: number;\n docker?: CustomDockerConfig;\n ssh?: CustomSSHConfig;\n cli?: CustomCLIConfig;\n api?: CustomAPIConfig;\n}\n\nexport interface CustomDockerConfig {\n registry: string;\n imageName: string;\n tag?: string;\n dockerfile?: string;\n buildArgs?: Record<string, string>;\n registryAuth?: {\n username: string;\n password: string;\n };\n hostUrl: string;\n containerPort: number;\n hostPort: number;\n}\n\nexport interface CustomSSHConfig {\n host: string;\n port: number;\n username: string;\n authMethod: 'password' | 'privateKey';\n password?: string;\n privateKeyPath?: string;\n deploymentPath: string;\n preDeployCommands?: string[];\n postDeployCommands?: string[];\n}\n\nexport interface CustomCLIConfig {\n cliName: string;\n installCommand?: string;\n loginCommand?: string;\n deployCommand: string;\n statusCommand?: string;\n logsCommand?: string;\n credentials?: Record<string, string>;\n}\n\nexport interface CustomAPIConfig {\n baseUrl: string;\n authType: 'bearer' | 'apiKey' | 'basic' | 'custom';\n authToken?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n endpoints: {\n deploy: string;\n status?: string;\n logs?: string;\n rollback?: string;\n };\n requestMethod?: 'POST' | 'PUT';\n payloadTemplate?: Record<string, unknown>;\n}\n\n// ── Social Types ──\n\nexport interface PostResult {\n id: string;\n url?: string;\n timestamp: Date;\n}\n\nexport interface ReplyResult {\n id: string;\n parentId: string;\n url?: string;\n timestamp: Date;\n}\n\nexport interface Mention {\n id: string;\n authorId: string;\n authorName: string;\n content: string;\n timestamp: Date;\n platform: string;\n}\n\nexport interface Profile {\n id: string;\n name: string;\n bio?: string;\n followers?: number;\n following?: number;\n platform: string;\n}\n\n// ── Zod Schemas for Runtime Validation (markdown configs) ──\n\nexport const AgentConfigSchema = z.object({\n name: z.string().min(1),\n type: z.string().optional(),\n personality: z.object({\n traits: z.array(z.string()),\n bio: z.string(),\n }).passthrough(),\n llm: z.object({\n provider: z.enum(['anthropic', 'openai']),\n model: z.string(),\n apiKey: z.string(),\n temperature: z.number().min(0).max(2).optional(),\n maxTokens: z.number().positive().optional(),\n systemPrompt: z.string().optional(),\n }),\n social: z.record(z.unknown()).optional(),\n behaviors: z.object({\n autonomous: z.boolean(),\n decisionMaking: z.enum(['llm-driven', 'rule-based', 'hybrid']),\n actionsPerHour: z.number().optional(),\n sleepSchedule: z.object({\n start: z.number(),\n end: z.number(),\n timezone: z.string().optional(),\n }).optional(),\n }),\n memory: z.object({\n type: z.enum(['memory', 'redis', 'postgres', 'hybrid']),\n retention: z.string().optional(),\n }).passthrough(),\n actions: z.array(z.string()),\n}).passthrough();\n","import { AgentConfig, AgentConfigSchema } from './types.js';\n\nexport class ConfigValidationError extends Error {\n constructor(\n message: string,\n public issues: Array<{ path: string; message: string }>,\n ) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\nexport function validateConfig(config: unknown): AgentConfig {\n const result = AgentConfigSchema.safeParse(config);\n\n if (!result.success) {\n const issues = result.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n\n throw new ConfigValidationError(\n `Invalid agent configuration:\\n${issues.map((i) => ` - ${i.path}: ${i.message}`).join('\\n')}`,\n issues,\n );\n }\n\n return result.data as AgentConfig;\n}\n","import { Memory } from './Memory.js';\nimport type { Experience } from '../config/types.js';\nimport type { RedisConfig, PostgresConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('LongTermMemory');\n\nexport class LongTermMemory extends Memory {\n private redisConfig?: RedisConfig;\n private postgresConfig?: PostgresConfig;\n private redis: any = null;\n private pg: any = null;\n private initialized = false;\n\n constructor(options: { redis?: RedisConfig; postgres?: PostgresConfig } = {}) {\n super();\n this.redisConfig = options.redis;\n this.postgresConfig = options.postgres;\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n if (this.redisConfig) {\n await this.initRedis();\n }\n\n if (this.postgresConfig) {\n await this.initPostgres();\n }\n\n this.initialized = true;\n }\n\n // ── Redis: Short-term cache operations ──\n\n async remember(key: string, value: unknown, ttl?: number): Promise<void> {\n await this.ensureRedis();\n const serialized = JSON.stringify(value);\n const prefixedKey = this.redisKey(key);\n\n if (ttl) {\n await this.redis.setex(prefixedKey, ttl, serialized);\n } else {\n const defaultTtl = this.redisConfig?.ttl || 86400; // 24h default\n await this.redis.setex(prefixedKey, defaultTtl, serialized);\n }\n }\n\n async recall(key: string): Promise<unknown> {\n await this.ensureRedis();\n const data = await this.redis.get(this.redisKey(key));\n if (data === null) return undefined;\n try {\n return JSON.parse(data);\n } catch {\n return data;\n }\n }\n\n async forget(key: string): Promise<void> {\n await this.ensureRedis();\n await this.redis.del(this.redisKey(key));\n }\n\n // ── Postgres: Persistent storage operations ──\n\n async store(key: string, value: unknown): Promise<void> {\n await this.ensurePostgres();\n const table = this.pgTable();\n await this.pg.query(\n `INSERT INTO ${table} (key, value, updated_at)\n VALUES ($1, $2, NOW())\n ON CONFLICT (key) DO UPDATE SET value = $2, updated_at = NOW()`,\n [key, JSON.stringify(value)],\n );\n }\n\n async retrieve(key: string): Promise<unknown> {\n await this.ensurePostgres();\n const table = this.pgTable();\n const result = await this.pg.query(\n `SELECT value FROM ${table} WHERE key = $1`,\n [key],\n );\n if (result.rows.length === 0) return undefined;\n try {\n return JSON.parse(result.rows[0].value);\n } catch {\n return result.rows[0].value;\n }\n }\n\n async delete(key: string): Promise<void> {\n await this.ensurePostgres();\n const table = this.pgTable();\n await this.pg.query(`DELETE FROM ${table} WHERE key = $1`, [key]);\n }\n\n // ── Postgres: Experience/semantic storage ──\n\n async addExperience(experience: Experience): Promise<void> {\n await this.ensurePostgres();\n const table = this.pgExperienceTable();\n await this.pg.query(\n `INSERT INTO ${table} (type, action, result, context, timestamp)\n VALUES ($1, $2, $3, $4, $5)`,\n [\n experience.type,\n experience.action,\n JSON.stringify(experience.result),\n JSON.stringify(experience.context || {}),\n experience.timestamp,\n ],\n );\n }\n\n async queryExperiences(query: string, limit = 20): Promise<Experience[]> {\n await this.ensurePostgres();\n const table = this.pgExperienceTable();\n\n // Text search on action and context fields\n const result = await this.pg.query(\n `SELECT type, action, result, context, timestamp FROM ${table}\n WHERE action ILIKE $1 OR context::text ILIKE $1\n ORDER BY timestamp DESC\n LIMIT $2`,\n [`%${query}%`, limit],\n );\n\n return result.rows.map((row: any) => ({\n type: row.type,\n action: row.action,\n result: typeof row.result === 'string' ? JSON.parse(row.result) : row.result,\n context: typeof row.context === 'string' ? JSON.parse(row.context) : row.context,\n timestamp: new Date(row.timestamp),\n }));\n }\n\n async clear(): Promise<void> {\n if (this.redis) {\n const prefix = this.redisConfig?.keyPrefix || 'moltium:';\n const keys = await this.redis.keys(`${prefix}*`);\n if (keys.length > 0) {\n await this.redis.del(...keys);\n }\n }\n\n if (this.pg) {\n await this.pg.query(`DELETE FROM ${this.pgTable()}`);\n await this.pg.query(`DELETE FROM ${this.pgExperienceTable()}`);\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.redis) {\n await this.redis.quit();\n this.redis = null;\n }\n if (this.pg) {\n await this.pg.end();\n this.pg = null;\n }\n this.initialized = false;\n }\n\n // ── Schema setup (call once to create tables) ──\n\n async ensureSchema(): Promise<void> {\n await this.ensurePostgres();\n const table = this.pgTable();\n const expTable = this.pgExperienceTable();\n const schema = this.postgresConfig?.schema || 'public';\n\n await this.pg.query(`CREATE SCHEMA IF NOT EXISTS ${schema}`);\n\n await this.pg.query(`\n CREATE TABLE IF NOT EXISTS ${table} (\n key TEXT PRIMARY KEY,\n value JSONB NOT NULL,\n updated_at TIMESTAMPTZ DEFAULT NOW()\n )\n `);\n\n await this.pg.query(`\n CREATE TABLE IF NOT EXISTS ${expTable} (\n id SERIAL PRIMARY KEY,\n type TEXT NOT NULL,\n action TEXT NOT NULL,\n result JSONB NOT NULL,\n context JSONB DEFAULT '{}',\n timestamp TIMESTAMPTZ NOT NULL,\n created_at TIMESTAMPTZ DEFAULT NOW()\n )\n `);\n\n await this.pg.query(`\n CREATE INDEX IF NOT EXISTS idx_${this.sanitizeName()}_experiences_action\n ON ${expTable} (action)\n `);\n\n await this.pg.query(`\n CREATE INDEX IF NOT EXISTS idx_${this.sanitizeName()}_experiences_timestamp\n ON ${expTable} (timestamp DESC)\n `);\n }\n\n // ── Internal helpers ──\n\n private async initRedis(): Promise<void> {\n if (!this.redisConfig) throw new Error('Redis config not provided');\n\n try {\n const { default: Redis } = await import('ioredis');\n this.redis = new Redis(this.redisConfig.url);\n logger.info('Redis connection established');\n } catch (error) {\n logger.error(`Failed to connect to Redis: ${error}`);\n throw error;\n }\n }\n\n private async initPostgres(): Promise<void> {\n if (!this.postgresConfig) throw new Error('Postgres config not provided');\n\n try {\n const pg = await import('pg');\n const Pool = pg.default?.Pool || pg.Pool;\n this.pg = new Pool({\n connectionString: this.postgresConfig.url,\n });\n // Test the connection\n await this.pg.query('SELECT 1');\n logger.info('Postgres connection established');\n } catch (error) {\n logger.error(`Failed to connect to Postgres: ${error}`);\n throw error;\n }\n }\n\n private async ensureRedis(): Promise<void> {\n if (!this.redis) {\n if (!this.redisConfig) {\n throw new Error('Redis not configured. Provide redis config in memory settings.');\n }\n await this.initRedis();\n }\n }\n\n private async ensurePostgres(): Promise<void> {\n if (!this.pg) {\n if (!this.postgresConfig) {\n throw new Error('Postgres not configured. Provide postgres config in memory settings.');\n }\n await this.initPostgres();\n }\n }\n\n private redisKey(key: string): string {\n const prefix = this.redisConfig?.keyPrefix || 'moltium:';\n return `${prefix}${key}`;\n }\n\n private pgTable(): string {\n const schema = this.postgresConfig?.schema || 'public';\n const table = this.postgresConfig?.tableName || 'moltium_memory';\n return `${schema}.${table}`;\n }\n\n private pgExperienceTable(): string {\n const schema = this.postgresConfig?.schema || 'public';\n const table = this.postgresConfig?.tableName || 'moltium_memory';\n return `${schema}.${table}_experiences`;\n }\n\n private sanitizeName(): string {\n return (this.postgresConfig?.tableName || 'moltium_memory').replace(/[^a-z0-9_]/g, '_');\n }\n}\n","import express from 'express';\nimport { createRoutes } from './routes.js';\nimport { requestLogger, errorHandler, authMiddleware } from './middleware.js';\nimport type { Agent } from '../agent/Agent.js';\nimport { createLogger } from '../logger.js';\nimport { createA2AIntegration, type A2AServerOptions } from '../a2a/index.js';\n\nconst logger = createLogger('Server');\nconst AGENT_CARD_PATH = '.well-known/agent.json';\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n enableA2A?: boolean;\n a2aConfig?: A2AServerOptions['a2aConfig'];\n}\n\nexport function createApp(agent: Agent, options: ServerOptions = {}) {\n const app = express();\n\n app.use(express.json());\n app.use(requestLogger);\n app.use(authMiddleware);\n \n // Mount standard Moltium routes\n app.use(createRoutes(agent));\n\n // Mount A2A protocol endpoints if enabled\n if (options.enableA2A !== false) {\n const port = options.port || parseInt(process.env.PORT || '3000', 10);\n const host = options.host || '0.0.0.0';\n // 0.0.0.0 is a bind address, not reachable — use localhost in the agent card\n const cardHost = host === '0.0.0.0' ? 'localhost' : host;\n const protocol = cardHost === 'localhost' || cardHost === '127.0.0.1' ? 'http' : 'https';\n // Always sanitize 0.0.0.0 — it's a bind address, not reachable by other services\n const rawBaseUrl = options.a2aConfig?.baseUrl || `${protocol}://${cardHost}:${port}`;\n const baseUrl = rawBaseUrl.replace('://0.0.0.0:', '://localhost:');\n\n const a2aIntegration = createA2AIntegration(agent, {\n a2aConfig: {\n enabled: true,\n baseUrl,\n pushNotifications: options.a2aConfig?.pushNotifications ?? false,\n streaming: options.a2aConfig?.streaming ?? true,\n stateTransitionHistory: options.a2aConfig?.stateTransitionHistory ?? true,\n },\n });\n\n const handlers = a2aIntegration.getHandlers();\n\n // Mount A2A endpoints — serve agent card at both paths for compatibility\n // A2A spec standard: /.well-known/agent.json\n // Legacy path: /.well-known/agent-card.json\n app.use(`/${AGENT_CARD_PATH}`, handlers.agentCard);\n app.use('/.well-known/agent-card.json', handlers.agentCard);\n app.use('/a2a/jsonrpc', handlers.jsonRpc);\n app.use('/a2a/rest', handlers.rest);\n\n logger.info('A2A protocol endpoints enabled');\n }\n\n app.use(errorHandler);\n\n return app;\n}\n\nexport async function startServer(agent: Agent, options: ServerOptions = {}): Promise<void> {\n const port = options.port || parseInt(process.env.PORT || '3000', 10);\n const host = options.host || '0.0.0.0';\n\n const app = createApp(agent, options);\n\n // Start HTTP server FIRST so the agent card is servable before auto-join\n await new Promise<void>((resolve) => {\n app.listen(port, host, () => {\n logger.info(`Agent \"${agent.name}\" running at http://${host}:${port}`);\n\n if (options.enableA2A !== false) {\n const logHost = host === '0.0.0.0' ? 'localhost' : host;\n const protocol = logHost === 'localhost' || logHost === '127.0.0.1' ? 'http' : 'https';\n const baseUrl = `${protocol}://${logHost}:${port}`;\n logger.info('A2A Protocol Endpoints:');\n logger.info(` Agent Card: ${baseUrl}/.well-known/agent.json`);\n logger.info(` JSON-RPC: ${baseUrl}/a2a/jsonrpc`);\n logger.info(` HTTP+JSON: ${baseUrl}/a2a/rest`);\n }\n\n resolve();\n });\n });\n\n // Start agent AFTER server is listening (world needs to fetch agent card during auto-join)\n await agent.start();\n\n // Graceful shutdown\n const shutdown = async () => {\n logger.info('Received shutdown signal');\n await agent.stop();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","import { Router, type Request, type Response } from 'express';\nimport type { Agent } from '../agent/Agent.js';\n\nexport function createRoutes(agent: Agent): Router {\n const router = Router();\n\n router.get('/', (_req: Request, res: Response) => {\n res.json({\n agent: agent.name,\n type: agent.config.type || 'general',\n state: agent.getState(),\n endpoints: {\n 'GET /': 'This overview',\n 'GET /health': 'Health check',\n 'GET /status': 'Agent status and uptime',\n 'POST /message': 'Send a message to the agent (body: { message })',\n 'POST /action': 'Trigger a specific action (body: { action, parameters })',\n 'GET /config': 'View agent configuration (redacted)',\n 'POST /shutdown': 'Graceful shutdown',\n },\n });\n });\n\n router.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n });\n\n router.get('/status', (_req: Request, res: Response) => {\n res.json({\n name: agent.name,\n state: agent.getState(),\n type: agent.config.type || 'general',\n uptime: process.uptime(),\n timestamp: new Date().toISOString(),\n });\n });\n\n router.get('/message', (_req: Request, res: Response) => {\n res.status(405).json({\n error: 'Method Not Allowed',\n message: 'Use POST /message to send a message to the agent.',\n expected_body: { message: 'string' },\n });\n });\n\n router.post('/message', async (req: Request, res: Response) => {\n try {\n const { message } = req.body;\n if (!message) {\n res.status(400).json({ error: 'Missing message field' });\n return;\n }\n\n const response = await agent.getLLM().generateText(message, {\n systemPrompt: `You are ${agent.name}. ${agent.config.personality.bio}`,\n temperature: agent.config.llm.temperature,\n });\n\n res.json({ response });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });\n }\n });\n\n router.get('/action', (_req: Request, res: Response) => {\n res.status(405).json({\n error: 'Method Not Allowed',\n message: 'Use POST /action to trigger an action.',\n expected_body: { action: 'string', parameters: '{}' },\n });\n });\n\n router.post('/action', async (req: Request, res: Response) => {\n try {\n const { action, parameters } = req.body;\n if (!action) {\n res.status(400).json({ error: 'Missing action field' });\n return;\n }\n\n const result = await agent.act(action, parameters || {});\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });\n }\n });\n\n router.get('/config', (_req: Request, res: Response) => {\n // Return config without sensitive fields\n const safeConfig = {\n name: agent.config.name,\n type: agent.config.type,\n personality: agent.config.personality,\n behaviors: {\n autonomous: agent.config.behaviors.autonomous,\n decisionMaking: agent.config.behaviors.decisionMaking,\n actionsPerHour: typeof agent.config.behaviors.actionsPerHour === 'function'\n ? '(dynamic)'\n : agent.config.behaviors.actionsPerHour,\n sleepSchedule: agent.config.behaviors.sleepSchedule,\n },\n memory: { type: agent.config.memory.type },\n actions: agent.config.actions,\n };\n\n res.json(safeConfig);\n });\n\n router.post('/shutdown', async (_req: Request, res: Response) => {\n res.json({ message: 'Shutting down...' });\n await agent.stop();\n process.exit(0);\n });\n\n return router;\n}\n","import type { Request, Response, NextFunction } from 'express';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('Server');\n\nexport function requestLogger(req: Request, _res: Response, next: NextFunction): void {\n logger.debug(`${req.method} ${req.path}`);\n next();\n}\n\nexport function errorHandler(err: Error, _req: Request, res: Response, _next: NextFunction): void {\n logger.error(`Server error: ${err.message}`);\n res.status(500).json({ error: err.message });\n}\n\nexport function authMiddleware(req: Request, res: Response, next: NextFunction): void {\n const authToken = process.env.AGENT_AUTH_TOKEN;\n\n // If no auth token is configured, skip authentication\n if (!authToken) {\n next();\n return;\n }\n\n const provided = req.headers.authorization?.replace('Bearer ', '');\n if (provided !== authToken) {\n res.status(401).json({ error: 'Unauthorized' });\n return;\n }\n\n next();\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport type { AgentConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('AgentCardBuilder');\n\nexport interface A2AConfig {\n enabled: boolean;\n baseUrl: string;\n port?: number;\n pushNotifications?: boolean;\n streaming?: boolean;\n stateTransitionHistory?: boolean;\n}\n\n/**\n * Builds an A2A-compliant AgentCard from a Moltium AgentConfig.\n */\nexport class AgentCardBuilder {\n /**\n * Creates an A2A AgentCard from Moltium configuration.\n * @param config The Moltium agent configuration\n * @param a2aConfig A2A-specific configuration (URLs, capabilities)\n * @returns A2A-compliant AgentCard\n */\n static build(config: AgentConfig, a2aConfig: A2AConfig): AgentCard {\n const baseUrl = a2aConfig.baseUrl;\n \n // Convert Moltium actions to A2A skills\n const skills = this.buildSkills(config);\n\n // Build capability flags\n const capabilities = {\n streaming: a2aConfig.streaming ?? true,\n pushNotifications: a2aConfig.pushNotifications ?? false,\n stateTransitionHistory: a2aConfig.stateTransitionHistory ?? true,\n };\n\n // Determine input/output modes from agent configuration\n const defaultInputModes = ['text'];\n const defaultOutputModes = ['text'];\n\n const agentCard: AgentCard = {\n name: config.name,\n description: config.personality.bio || `${config.name} - An autonomous AI agent`,\n protocolVersion: '0.3.0',\n version: '0.1.30',\n url: `${baseUrl}/a2a/jsonrpc`,\n skills,\n capabilities,\n defaultInputModes,\n defaultOutputModes,\n additionalInterfaces: [\n { url: `${baseUrl}/a2a/jsonrpc`, transport: 'JSONRPC' },\n { url: `${baseUrl}/a2a/rest`, transport: 'HTTP+JSON' },\n ],\n };\n\n logger.debug('Built A2A AgentCard', {\n name: agentCard.name,\n skillCount: skills.length,\n baseUrl,\n });\n\n return agentCard;\n }\n\n /**\n * Converts Moltium actions to A2A skills.\n */\n private static buildSkills(config: AgentConfig): AgentCard['skills'] {\n const skills: AgentCard['skills'] = [];\n\n // Add a default \"chat\" skill that encompasses the agent's capabilities\n skills.push({\n id: 'chat',\n name: 'Chat',\n description: `Interact with ${config.name}. ${config.personality.bio || ''}`,\n tags: ['chat', 'conversation'],\n });\n\n // Add skill for each action category\n const hasPosting = config.actions.some((a) => \n a.includes('post') || a.includes('update')\n );\n if (hasPosting) {\n skills.push({\n id: 'social_posting',\n name: 'Social Posting',\n description: 'Post updates and content to social platforms',\n tags: ['social', 'posting'],\n });\n }\n\n const hasEngagement = config.actions.some((a) => \n a.includes('comment') || a.includes('reply') || a.includes('respond')\n );\n if (hasEngagement) {\n skills.push({\n id: 'social_engagement',\n name: 'Social Engagement',\n description: 'Engage with others through comments and replies',\n tags: ['social', 'engagement'],\n });\n }\n\n const hasSearch = config.actions.some((a) => \n a.includes('search') || a.includes('check_feed') || a.includes('browse')\n );\n if (hasSearch) {\n skills.push({\n id: 'content_discovery',\n name: 'Content Discovery',\n description: 'Search and discover relevant content',\n tags: ['search', 'discovery'],\n });\n }\n\n const hasAnalysis = config.actions.some((a) => \n a.includes('analyze') || a.includes('think') || a.includes('research')\n );\n if (hasAnalysis) {\n skills.push({\n id: 'analysis',\n name: 'Analysis & Research',\n description: 'Analyze problems and conduct research',\n tags: ['analysis', 'research', 'thinking'],\n });\n }\n\n return skills;\n }\n\n /**\n * Updates an agent card with runtime information.\n */\n static updateWithRuntime(\n agentCard: AgentCard,\n actualPort: number,\n actualHost: string = 'localhost'\n ): AgentCard {\n const protocol = actualHost === 'localhost' || actualHost === '127.0.0.1' ? 'http' : 'https';\n const baseUrl = `${protocol}://${actualHost}:${actualPort}`;\n\n return {\n ...agentCard,\n url: `${baseUrl}/a2a/jsonrpc`,\n additionalInterfaces: [\n { url: `${baseUrl}/a2a/jsonrpc`, transport: 'JSONRPC' },\n { url: `${baseUrl}/a2a/rest`, transport: 'HTTP+JSON' },\n ],\n };\n }\n}\n","import type { Message, Task, TaskStatusUpdateEvent, TaskArtifactUpdateEvent } from '@a2a-js/sdk';\nimport type { AgentExecutor, RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\nimport type { Agent } from '../agent/Agent.js';\nimport type { ActionResult } from '../config/types.js';\nimport { createLogger } from '../logger.js';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst logger = createLogger('MoltiumExecutor');\n\n/**\n * Adapts a Moltium Agent to the A2A AgentExecutor interface.\n * This allows Moltium agents to respond to A2A protocol requests.\n */\nexport class MoltiumExecutor implements AgentExecutor {\n private agent: Agent;\n private cancelledTasks = new Set<string>();\n\n constructor(agent: Agent) {\n this.agent = agent;\n }\n\n /**\n * Executes an A2A request using the Moltium agent.\n * Converts A2A messages to Moltium actions and publishes results back via the event bus.\n */\n async execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise<void> {\n const { taskId, contextId, userMessage, task } = requestContext;\n\n try {\n logger.info(`[A2A] Executing request for task ${taskId}`);\n\n // 1. Create task if it doesn't exist\n if (!task) {\n const initialTask: Task = {\n kind: 'task',\n id: taskId,\n contextId: contextId,\n status: {\n state: 'submitted',\n timestamp: new Date().toISOString(),\n },\n history: [userMessage],\n };\n eventBus.publish(initialTask);\n }\n\n // 2. Check for cancellation before starting work\n if (this.cancelledTasks.has(taskId)) {\n this.publishCancellation(taskId, contextId, eventBus);\n return;\n }\n\n // 3. Update status to 'working'\n this.publishStatusUpdate(taskId, contextId, 'working', eventBus, false);\n\n // 4. Extract the user's message content\n const userContent = this.extractMessageContent(userMessage);\n\n // 5. Check if this is a simple chat message or an action request\n const isActionRequest = this.isActionRequest(userContent);\n\n let result: ActionResult;\n\n if (isActionRequest) {\n // Execute as a direct action\n result = await this.executeAction(userContent, taskId);\n } else {\n // Execute as a conversational interaction using the LLM\n result = await this.executeChat(userContent, taskId);\n }\n\n // 6. Check for cancellation after execution\n if (this.cancelledTasks.has(taskId)) {\n this.publishCancellation(taskId, contextId, eventBus);\n return;\n }\n\n // 7. Publish the result as an artifact or message\n if (result.success) {\n await this.publishResult(taskId, contextId, result, eventBus);\n } else {\n await this.publishError(taskId, contextId, result.error || 'Unknown error', eventBus);\n }\n\n // 8. Mark task as completed\n this.publishStatusUpdate(taskId, contextId, 'completed', eventBus, true);\n eventBus.finished();\n\n logger.info(`[A2A] Task ${taskId} completed successfully`);\n } catch (error) {\n logger.error(`[A2A] Task ${taskId} failed`, {\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Publish error and mark as failed\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.publishError(taskId, contextId, errorMessage, eventBus);\n this.publishStatusUpdate(taskId, contextId, 'failed', eventBus, true);\n eventBus.finished();\n } finally {\n // Clean up cancelled task tracking\n this.cancelledTasks.delete(taskId);\n }\n }\n\n /**\n * Handles task cancellation requests.\n */\n async cancelTask(taskId: string, eventBus: ExecutionEventBus): Promise<void> {\n logger.info(`[A2A] Cancellation requested for task ${taskId}`);\n this.cancelledTasks.add(taskId);\n // The execute method will handle publishing the cancellation status\n }\n\n /**\n * Extracts text content from an A2A message.\n */\n private extractMessageContent(message: Message): string {\n const textParts = message.parts.filter((part) => part.kind === 'text');\n return textParts.map((part) => part.text).join('\\n');\n }\n\n /**\n * Determines if the user message is requesting a specific action.\n */\n private isActionRequest(content: string): boolean {\n const actionKeywords = [\n 'post',\n 'search',\n 'check feed',\n 'browse',\n 'comment',\n 'upvote',\n 'follow',\n 'send dm',\n ];\n\n const lowerContent = content.toLowerCase();\n return actionKeywords.some((keyword) => lowerContent.includes(keyword));\n }\n\n /**\n * Executes a chat interaction using the agent's LLM.\n */\n private async executeChat(userContent: string, taskId: string): Promise<ActionResult> {\n try {\n const llm = this.agent.getLLM();\n const systemPrompt = this.agent.getSystemPrompt();\n\n const response = await llm.generateText(userContent, {\n systemPrompt,\n temperature: this.agent.config.llm.temperature,\n });\n\n return {\n success: true,\n data: { response, type: 'chat' },\n };\n } catch (error) {\n return {\n success: false,\n error: `Chat execution failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Executes an action based on the user's request.\n */\n private async executeAction(userContent: string, taskId: string): Promise<ActionResult> {\n try {\n // Use the agent's think method to determine the action\n const decision = await this.agent.think();\n\n // Execute the chosen action\n const result = await this.agent.act(decision.action, decision.parameters);\n\n return {\n success: result.success,\n data: {\n action: decision.action,\n reasoning: decision.reasoning,\n result: result.data,\n type: 'action',\n },\n error: result.error,\n };\n } catch (error) {\n return {\n success: false,\n error: `Action execution failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Publishes a successful result as an A2A artifact.\n */\n private async publishResult(\n taskId: string,\n contextId: string,\n result: ActionResult,\n eventBus: ExecutionEventBus\n ): Promise<void> {\n const data = result.data as any;\n\n if (data?.type === 'chat') {\n // Publish chat response as a text artifact\n const artifactUpdate: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId: `response-${uuidv4()}`,\n name: 'response.txt',\n parts: [{ kind: 'text', text: data.response }],\n },\n };\n eventBus.publish(artifactUpdate);\n } else if (data?.type === 'action') {\n // Publish action result as a structured artifact\n const resultText = JSON.stringify(\n {\n action: data.action,\n reasoning: data.reasoning,\n result: data.result,\n },\n null,\n 2\n );\n\n const artifactUpdate: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId: `action-result-${uuidv4()}`,\n name: 'action_result.json',\n parts: [{ kind: 'text', text: resultText }],\n },\n };\n eventBus.publish(artifactUpdate);\n } else {\n // Generic result\n const resultText =\n typeof result.data === 'string' ? result.data : JSON.stringify(result.data, null, 2);\n\n const artifactUpdate: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId: `result-${uuidv4()}`,\n name: 'result.txt',\n parts: [{ kind: 'text', text: resultText }],\n },\n };\n eventBus.publish(artifactUpdate);\n }\n }\n\n /**\n * Publishes an error as an A2A artifact.\n */\n private async publishError(\n taskId: string,\n contextId: string,\n error: string,\n eventBus: ExecutionEventBus\n ): Promise<void> {\n const artifactUpdate: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId: `error-${uuidv4()}`,\n name: 'error.txt',\n parts: [{ kind: 'text', text: `Error: ${error}` }],\n },\n };\n eventBus.publish(artifactUpdate);\n }\n\n /**\n * Publishes a status update event.\n */\n private publishStatusUpdate(\n taskId: string,\n contextId: string,\n state: 'submitted' | 'working' | 'completed' | 'failed' | 'canceled',\n eventBus: ExecutionEventBus,\n final: boolean\n ): void {\n const statusUpdate: TaskStatusUpdateEvent = {\n kind: 'status-update',\n taskId,\n contextId,\n status: {\n state,\n timestamp: new Date().toISOString(),\n },\n final,\n };\n eventBus.publish(statusUpdate);\n }\n\n /**\n * Publishes a cancellation status.\n */\n private publishCancellation(taskId: string, contextId: string, eventBus: ExecutionEventBus): void {\n logger.info(`[A2A] Publishing cancellation for task ${taskId}`);\n this.publishStatusUpdate(taskId, contextId, 'canceled', eventBus, true);\n eventBus.finished();\n this.cancelledTasks.delete(taskId);\n }\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport { DefaultRequestHandler, InMemoryTaskStore, JsonRpcTransportHandler } from '@a2a-js/sdk/server';\nimport type { Agent } from '../agent/Agent.js';\nimport { AgentCardBuilder, type A2AConfig } from './AgentCardBuilder.js';\nimport { MoltiumExecutor } from './MoltiumExecutor.js';\nimport { createLogger } from '../logger.js';\nimport type { Request, Response, RequestHandler } from 'express';\n\nconst logger = createLogger('A2AIntegration');\n\nexport interface A2AServerOptions {\n a2aConfig: A2AConfig;\n authToken?: string;\n}\n\n/**\n * Creates A2A-compliant Express routes for a Moltium agent.\n * These routes implement the Agent-to-Agent (A2A) protocol.\n */\nexport class A2AIntegration {\n private agent: Agent;\n private agentCard: AgentCard;\n private requestHandler: DefaultRequestHandler;\n private moltiumExecutor: MoltiumExecutor;\n\n constructor(agent: Agent, options: A2AServerOptions) {\n this.agent = agent;\n\n // Build the A2A agent card\n this.agentCard = AgentCardBuilder.build(agent.config, options.a2aConfig);\n\n // Create the Moltium executor adapter\n this.moltiumExecutor = new MoltiumExecutor(agent);\n\n // Create the A2A request handler\n this.requestHandler = new DefaultRequestHandler(\n this.agentCard,\n new InMemoryTaskStore(),\n this.moltiumExecutor\n );\n\n logger.info('A2A integration initialized', {\n agentName: agent.name,\n baseUrl: options.a2aConfig.baseUrl,\n });\n }\n\n /**\n * Creates Express middleware handlers for A2A endpoints.\n * Returns an object with individual handlers that can be mounted on specific routes.\n */\n getHandlers() {\n return {\n // Agent Card endpoint - serves the static agent card JSON\n agentCard: ((req: Request, res: Response) => {\n res.json(this.agentCard);\n }) as RequestHandler,\n\n // JSON-RPC endpoint - handles A2A protocol requests\n jsonRpc: (async (req: Request, res: Response) => {\n try {\n const jsonRpcHandler = new JsonRpcTransportHandler(this.requestHandler);\n const response = await jsonRpcHandler.handle(req.body);\n res.json(response);\n } catch (error: any) {\n logger.error('JSON-RPC error:', error);\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error',\n data: error.message,\n },\n id: req.body?.id || null,\n });\n }\n }) as RequestHandler,\n\n // REST endpoint - simplified HTTP+JSON interface\n rest: ((req: Request, res: Response) => {\n res.status(501).json({\n error: 'REST transport not implemented in SDK v0.3.0',\n message: 'Please use the JSON-RPC endpoint at /a2a/jsonrpc',\n });\n }) as RequestHandler,\n };\n }\n\n /**\n * Updates the agent card with actual runtime information (host/port).\n */\n updateAgentCard(actualPort: number, actualHost: string = 'localhost'): void {\n this.agentCard = AgentCardBuilder.updateWithRuntime(this.agentCard, actualPort, actualHost);\n \n // Update the request handler with the new card\n this.requestHandler = new DefaultRequestHandler(\n this.agentCard,\n new InMemoryTaskStore(),\n this.moltiumExecutor\n );\n\n logger.info('A2A agent card updated with runtime info', {\n host: actualHost,\n port: actualPort,\n url: this.agentCard.url,\n });\n }\n\n /**\n * Gets the current agent card.\n */\n getAgentCard(): AgentCard {\n return this.agentCard;\n }\n\n /**\n * Logs A2A endpoint information.\n */\n logEndpoints(host: string, port: number): void {\n const protocol = host === 'localhost' || host === '127.0.0.1' ? 'http' : 'https';\n const baseUrl = `${protocol}://${host}:${port}`;\n\n logger.info('A2A endpoints available:');\n logger.info(` Agent Card: ${baseUrl}/.well-known/agent.json`);\n logger.info(` JSON-RPC: ${baseUrl}/a2a/jsonrpc`);\n logger.info(` HTTP+JSON: ${baseUrl}/a2a/rest`);\n }\n}\n\n/**\n * Helper function to create and configure A2A integration for a Moltium agent.\n */\nexport function createA2AIntegration(\n agent: Agent,\n options: Partial<A2AServerOptions> = {}\n): A2AIntegration {\n const a2aConfig: A2AConfig = {\n enabled: true,\n baseUrl: options.a2aConfig?.baseUrl || 'http://localhost:3000',\n pushNotifications: options.a2aConfig?.pushNotifications ?? false,\n streaming: options.a2aConfig?.streaming ?? true,\n stateTransitionHistory: options.a2aConfig?.stateTransitionHistory ?? true,\n };\n\n return new A2AIntegration(agent, { a2aConfig, ...options });\n}\n"],"mappings":"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","names":["logger","logger","axios","AgentWallet","logger","logger","AgentWallet","axios","logger","logger","logger","uuidv4","logger","logger","logger","resolve"]}
|