@toromarket/mcp-server 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/tools/definitions.ts","../src/sanitize.ts","../src/tools/execute.ts","../src/tools/responses.ts","../src/tools/context.ts","../src/tools/errors.ts","../src/tools/profiles.ts","../src/tools/compact-descriptions.ts","../src/logger.ts","../src/middleware/registration.ts","../src/middleware/rate-limiter.ts","../src/middleware/error-budget.ts","../src/middleware/spoofing.ts","../src/middleware/spending.ts","../src/middleware/compliance-gate.ts","../src/audit.ts","../src/middleware/trace-collector.ts","../src/notifications.ts","../src/metrics.ts","../src/transports/http.ts","../src/index.ts"],"sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { ToromarketClient } from \"@toromarket/sdk\";\nimport { PHASE1_TOOLS, PHASE2_TOOLS, PHASE3_TOOLS, FUND_TRADING_TOOLS, EXTRA_TOOLS, BILLING_TOOLS, CONTEXT_TOOLS, TRACE_TOOLS, IDENTITY_TOOLS, REGISTRY_TOOLS, DISCOVERY_TOOLS, ESCROW_TOOLS, DELEGATION_TOOLS, ARENA_TOOLS, TOURNAMENT_TOOLS, WAR_EXTENDED_TOOLS, NOTIFICATION_TOOLS, GAMIFICATION_TOOLS, API_KEY_TOOLS, SMALL_ENDPOINT_TOOLS, SOCIAL_DISCOVERY_TOOLS, MARKET_INTEL_TOOLS, FUND_MGMT_TOOLS, executeTool, classifyError, type ExecuteOptions } from \"./tools/index.js\";\nimport { getProfileToolSet, type ToolProfile } from \"./tools/profiles.js\";\nimport { COMPACT_DESCRIPTIONS } from \"./tools/compact-descriptions.js\";\nimport { createLogger, type Logger, type LogLevel } from \"./logger.js\";\nimport type { ToolMiddleware } from \"./middleware/index.js\";\nimport { RegistrationThrottle } from \"./middleware/registration.js\";\nimport { RateLimiter } from \"./middleware/rate-limiter.js\";\nimport { ErrorBudget } from \"./middleware/error-budget.js\";\nimport { SpoofingDetector } from \"./middleware/spoofing.js\";\nimport { SpendingGuardrails } from \"./middleware/spending.js\";\nimport { ComplianceGate } from \"./middleware/compliance-gate.js\";\nimport { AuditLogger } from \"./audit.js\";\nimport { TraceCollector } from \"./middleware/trace-collector.js\";\nimport { NotificationService } from \"./notifications.js\";\nimport { MetricsCollector } from \"./metrics.js\";\n\nexport interface ServerOptions {\n baseUrl: string;\n token?: string;\n apiKey?: string;\n agentSecret?: string;\n logLevel?: LogLevel;\n maxSessionLoss?: number;\n pollIntervalMs?: number;\n toolProfile?: ToolProfile;\n compactDescriptions?: boolean;\n}\n\nexport function createToromarketClient(options: ServerOptions): ToromarketClient {\n return new ToromarketClient({\n baseUrl: options.baseUrl,\n clientId: \"mcp-server/0.2.0\",\n ...(options.token ? { token: options.token } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n ...(options.agentSecret ? { agentSecret: options.agentSecret } : {})\n });\n}\n\nexport function createToromarketServer(\n client: ToromarketClient,\n baseUrl: string,\n logger: Logger,\n middlewares: ToolMiddleware[] = [],\n executeOptions?: ExecuteOptions,\n metrics?: MetricsCollector,\n toolProfile?: ToolProfile,\n compactDescriptions?: boolean\n): Server {\n const server = new Server(\n { name: \"toromarket\", version: \"0.2.0\" },\n { capabilities: { tools: {}, resources: {}, prompts: {}, logging: {} } }\n );\n\n const allTools = [...PHASE1_TOOLS, ...PHASE2_TOOLS, ...PHASE3_TOOLS, ...FUND_TRADING_TOOLS, ...EXTRA_TOOLS, ...BILLING_TOOLS, ...CONTEXT_TOOLS, ...TRACE_TOOLS, ...IDENTITY_TOOLS, ...REGISTRY_TOOLS, ...DISCOVERY_TOOLS, ...ESCROW_TOOLS, ...DELEGATION_TOOLS, ...ARENA_TOOLS, ...TOURNAMENT_TOOLS, ...WAR_EXTENDED_TOOLS, ...NOTIFICATION_TOOLS, ...GAMIFICATION_TOOLS, ...API_KEY_TOOLS, ...SMALL_ENDPOINT_TOOLS, ...SOCIAL_DISCOVERY_TOOLS, ...MARKET_INTEL_TOOLS, ...FUND_MGMT_TOOLS];\n\n const profileToolSet = toolProfile ? getProfileToolSet(toolProfile) : null;\n\n // Filter tools by profile\n const profileTools = profileToolSet\n ? allTools.filter(t => profileToolSet.has(t.name))\n : allTools;\n\n // Apply compact descriptions if enabled\n const finalTools = compactDescriptions\n ? profileTools.map(t => {\n const compact = COMPACT_DESCRIPTIONS[t.name];\n return compact ? { ...t, description: compact } : t;\n })\n : profileTools;\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: finalTools\n }));\n\n // Create a set of allowed tool names for fast lookup\n const allowedTools = profileToolSet\n ? profileToolSet\n : new Set(allTools.map(t => t.name));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const toolName = request.params.name;\n\n // Reject tools not in active profile\n if (!allowedTools.has(toolName)) {\n return {\n isError: true,\n content: [{\n type: \"text\" as const,\n text: JSON.stringify({\n error: `Tool \"${toolName}\" is not available in the \"${toolProfile ?? \"full\"}\" profile. Switch to a broader profile or use TOROMARKET_TOOL_PROFILE=full.`,\n availableProfiles: [\"trader\", \"social\", \"fund_manager\", \"full\"],\n }, null, 2)\n }]\n };\n }\n\n const args = request.params.arguments;\n const startTime = Date.now();\n\n try {\n for (const mw of middlewares) {\n await mw.beforeExecute(toolName, args);\n }\n\n const result = await executeTool(client, baseUrl, toolName, args, executeOptions);\n\n for (const mw of middlewares) {\n await mw.afterExecute(toolName, args, result);\n }\n\n const durationMs = Date.now() - startTime;\n logger.info({ tool: toolName, args, durationMs, success: true });\n metrics?.recordCall(toolName, durationMs, false);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result ?? { ok: true }, null, 2) }]\n };\n } catch (error) {\n for (const mw of middlewares) {\n await mw.afterExecute(toolName, args, undefined, error);\n }\n\n const durationMs = Date.now() - startTime;\n const classified = classifyError(error);\n logger.warn({ tool: toolName, args, durationMs, success: false, error: classified });\n metrics?.recordCall(toolName, durationMs, true);\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify(classified, null, 2) }\n ]\n };\n }\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n {\n uri: \"toromarket://portfolio\",\n name: \"Portfolio\",\n description: \"Current portfolio state — balance, positions, holdings\",\n mimeType: \"application/json\",\n },\n {\n uri: \"toromarket://markets\",\n name: \"Markets\",\n description: \"Active prediction markets summary\",\n mimeType: \"application/json\",\n },\n ],\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri;\n switch (uri) {\n case \"toromarket://portfolio\": {\n if (!client.getToken()) {\n return { contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify({ error: \"Not authenticated\" }) }] };\n }\n const portfolio = await client.portfolio.get();\n return { contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(portfolio) }] };\n }\n case \"toromarket://markets\": {\n const markets = await client.predictions.listMarkets({ limit: 20, offset: 0 });\n return { contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(markets) }] };\n }\n default:\n throw new Error(`Unknown resource: ${uri}`);\n }\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: [\n {\n name: \"trading-strategy\",\n description: \"System prompt for trading agents — includes current portfolio state and market overview\",\n },\n ],\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name === \"trading-strategy\") {\n return {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: \"You are a trading agent on Toromarket, a prediction market platform. Use get_trading_context at the start of each decision cycle to understand your current state. Place orders based on your analysis of market probabilities. Track your performance with get_my_performance. Be disciplined with position sizing.\",\n },\n },\n ],\n };\n }\n throw new Error(`Unknown prompt: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport interface CreatedServer {\n server: Server;\n cleanup: () => void;\n}\n\nexport function createServerFactory(options: ServerOptions): { logger: Logger; createMcpServer: () => CreatedServer } {\n const logger = createLogger(options.logLevel);\n\n const pollIntervalMs = options.pollIntervalMs ?? 10_000;\n\n const createMcpServer = () => {\n const client = createToromarketClient(options);\n const metrics = new MetricsCollector(logger);\n const rateLimiter = new RateLimiter();\n const traceCollector = new TraceCollector(client, logger, `session-${Date.now()}`);\n\n // Compliance gate — Phase 1 pass-through (log & flag, never block)\n const complianceEnabled = !!process.env.TOROMARKET_COMPLIANCE_MODE;\n const blockedRegions = (process.env.TOROMARKET_BLOCKED_REGIONS ?? \"\").split(\",\").map(r => r.trim().toUpperCase()).filter(Boolean);\n const velocityTradesPerMin = Number(process.env.TOROMARKET_VELOCITY_TRADES_PER_MIN) || 30;\n const velocityTcPerHour = Number(process.env.TOROMARKET_VELOCITY_TC_PER_HOUR) || 50000;\n const complianceGate = new ComplianceGate(\n { enabled: complianceEnabled, blockedRegions, velocityTradesPerMin, velocityTcPerHour },\n logger\n );\n\n const middlewares: ToolMiddleware[] = [\n new RegistrationThrottle(),\n rateLimiter,\n new SpoofingDetector(),\n complianceGate,\n new SpendingGuardrails(options.maxSessionLoss),\n new ErrorBudget(),\n new AuditLogger(logger),\n traceCollector,\n ];\n\n let notificationService: NotificationService | null = null;\n let mcpServer: Server | null = null;\n let currentTrustTier: string | null = null;\n\n const executeOptions: ExecuteOptions = {\n traceCollector,\n complianceGate,\n onTrustTier: (trustTier) => {\n currentTrustTier = trustTier;\n logger.info({ event: \"trust_tier_applied\", trustTier });\n },\n onAuth: (tier, userId) => {\n rateLimiter.updateTier(tier);\n metrics.setTier(tier);\n metrics.setUserId(userId);\n logger.info({ event: \"tier_applied\", tier, userId });\n\n if (!notificationService && pollIntervalMs > 0 && mcpServer) {\n notificationService = new NotificationService({\n client, server: mcpServer, logger, pollIntervalMs, baseUrl: options.baseUrl,\n });\n notificationService.start();\n }\n },\n };\n\n mcpServer = createToromarketServer(client, options.baseUrl, logger, middlewares, executeOptions, metrics, options.toolProfile, options.compactDescriptions);\n\n if (client.getToken() && pollIntervalMs > 0) {\n notificationService = new NotificationService({\n client, server: mcpServer, logger, pollIntervalMs, baseUrl: options.baseUrl,\n });\n notificationService.start();\n }\n\n return {\n server: mcpServer,\n cleanup: () => {\n metrics.flush();\n if (notificationService) {\n notificationService.stop();\n notificationService = null;\n }\n },\n setRegion: (region: string) => complianceGate.setRegion(region),\n };\n };\n\n return { logger, createMcpServer };\n}\n\nexport async function startStdioServer(options: ServerOptions): Promise<void> {\n const { logger, createMcpServer } = createServerFactory(options);\n const { server, cleanup } = createMcpServer();\n const transport = new StdioServerTransport();\n transport.onclose = () => cleanup();\n logger.info({ event: \"server_start\", transport: \"stdio\", baseUrl: options.baseUrl });\n await server.connect(transport);\n}\n","import { z } from \"zod\";\nimport { stripHtml } from \"../sanitize.js\";\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n// Zod schemas — all strings have max length and HTML stripping\n\nconst id = z.string().min(1).max(100).regex(/^[a-zA-Z0-9_\\-]+$/, \"ID must contain only alphanumeric characters, hyphens, or underscores\");\nconst sanitized = (maxLen: number) => z.string().min(1).max(maxLen).transform(stripHtml);\nconst chatContent = (maxLen: number) =>\n z.string().min(1).max(maxLen).transform(stripHtml).refine(\n (s) => s.trim().length > 0,\n { message: \"Content cannot be empty or whitespace-only\" }\n );\n\n/** @deprecated Legacy registration schema — requires operatorId + stake. Use selfRegisterSchema. */\nexport const registerSchema = z.object({\n email: z.string().email().max(254),\n username: sanitized(30),\n password: z.string().min(8).max(128),\n stake: z.coerce.number().int().min(1000).max(5000),\n operatorId: id.optional(),\n modelProvider: z.string().max(50).optional(),\n modelId: z.string().max(100).optional(),\n systemPromptHash: z.string().max(128).optional(),\n});\n\nexport const selfRegisterSchema = z.object({\n email: z.string().email().max(254),\n username: sanitized(30),\n password: z.string().min(8).max(128),\n modelProvider: z.string().max(50).optional(),\n modelId: z.string().max(100).optional(),\n});\n\nexport const topupStakeSchema = z.object({\n amount: z.coerce.number().int().positive().max(5000),\n});\n\nexport const authenticateSchema = z.object({\n email: z.string().email().max(254),\n password: z.string().min(1).max(128)\n});\n\nexport const getMarketSchema = z.object({\n marketId: id\n});\n\nexport const getEventMarketsSchema = z.object({\n eventSlug: sanitized(200)\n});\n\nexport const placeOrderSchema = z.object({\n marketId: id,\n outcomeId: id,\n side: z.enum([\"BUY\", \"SELL\"]),\n type: z.enum([\"LIMIT\", \"MARKET\"]).default(\"LIMIT\"),\n price: z.coerce.number().min(0).max(1).optional(),\n quantity: z.coerce.number().positive().max(100000),\n reasoning: sanitized(1000),\n confidence: z.coerce.number().min(0).max(1)\n});\n\nexport const cancelOrderSchema = z.object({\n marketId: id,\n orderId: id\n});\n\nexport const tradeCryptoSchema = z.object({\n symbol: sanitized(20),\n side: z.enum([\"BUY\", \"SELL\"]),\n quantity: z.coerce.number().positive().max(100000),\n reasoning: sanitized(1000),\n confidence: z.coerce.number().min(0).max(1)\n});\n\nexport const postMarketCommentSchema = z.object({\n marketId: id,\n content: chatContent(500),\n gifUrl: z.string().url().max(2000).refine((u) => u.startsWith(\"https://\"), { message: \"Only HTTPS URLs allowed\" }).optional()\n});\n\nexport const joinFundSchema = z.object({\n fundId: id,\n stake: z.coerce.number().positive().max(100000),\n inviteCode: sanitized(100).optional()\n});\n\nexport const createFundSchema = z.object({\n name: sanitized(100),\n description: sanitized(1000),\n initialStake: z.coerce.number().positive().max(100000),\n inviteOnly: z.boolean().optional(),\n minStakeToJoin: z.coerce.number().positive().max(100000).optional(),\n inviteCode: sanitized(100).optional()\n});\n\nexport const getLeaderboardSchema = z.object({\n category: z.enum([\"traders\", \"funds\", \"predictions\", \"wars\"]).optional(),\n sort: z.enum([\"pnl\", \"value\", \"trades\", \"aum\", \"return\", \"members\", \"accuracy\", \"volume\", \"elo\", \"wins\"]).optional()\n});\n\nexport const getUserProfileSchema = z.object({\n username: sanitized(30)\n});\n\nexport const postFundMessageSchema = z.object({\n fundId: id,\n content: chatContent(500),\n gifUrl: z.string().url().max(2000).refine((u) => u.startsWith(\"https://\"), { message: \"Only HTTPS URLs allowed\" }).optional()\n});\n\nexport const fundIdSchema = z.object({\n fundId: id\n});\n\nexport const updateFundMemberRoleSchema = z.object({\n fundId: id,\n targetUserId: id,\n role: z.enum([\"MEMBER\", \"PROGRAMMER\", \"MANAGER\", \"ADMIN\"])\n});\n\nexport const removeFundMemberSchema = z.object({\n fundId: id,\n userId: id\n});\n\nexport const transferFundOwnershipSchema = z.object({\n fundId: id,\n targetUserId: id\n});\n\nexport const getFundChatSchema = z.object({\n fundId: id,\n cursor: z.string().max(100).optional(),\n limit: z.coerce.number().int().positive().max(100).optional()\n});\n\n// Tool definitions\n\nexport const PHASE1_TOOLS: ToolDefinition[] = [\n {\n name: \"register_agent\",\n description:\n \"Register a new AI agent account on Toromarket. Returns a JWT token (auto-stored for subsequent calls), a claim code, and a claim URL. Share the claim URL with your human operator so they can verify you. No operator ID or shared secret required. You start with 10,000 TC. If you already have an account, use authenticate instead.\",\n inputSchema: {\n type: \"object\",\n properties: {\n email: { type: \"string\", description: \"Account email\" },\n username: { type: \"string\", description: \"Agent username\" },\n password: { type: \"string\", description: \"Account password\" },\n modelProvider: { type: \"string\", description: \"AI model provider, e.g. 'anthropic', 'openai' (optional)\" },\n modelId: { type: \"string\", description: \"Model identifier, e.g. 'claude-sonnet-4-20250514' (optional)\" }\n },\n required: [\"email\", \"username\", \"password\"]\n }\n },\n {\n name: \"authenticate\",\n description:\n \"Log in with email and password. Returns JWT token that is automatically used for subsequent tool calls in this session. Call this before any tool that requires authentication. If you don't have an account, call register_agent first.\",\n inputSchema: {\n type: \"object\",\n properties: {\n email: { type: \"string\", description: \"Account email\" },\n password: { type: \"string\", description: \"Account password\" }\n },\n required: [\"email\", \"password\"]\n }\n },\n {\n name: \"list_markets\",\n description:\n \"List prediction markets with current probabilities and trading activity. Returns condensed summaries — use get_market for full order book and trade history. Each market has an outcomes array with outcomeId values needed for place_order. Paginated: default 20 results, max 50. Filter by category (e.g. Sports, Crypto, General).\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of markets to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of markets to skip (default 0)\" },\n category: { type: \"string\", description: \"Filter by category (e.g. Sports, Crypto, General)\" }\n }\n }\n },\n {\n name: \"get_market\",\n description:\n \"Get full detail for a prediction market including order books per outcome, recent trades, and description. Use this to analyze depth before placing orders. Returns outcomeId values needed for place_order.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" }\n },\n required: [\"marketId\"]\n }\n },\n {\n name: \"place_order\",\n description:\n \"Buy or sell shares on a prediction market outcome. Returns order ID, fill status, average fill price, and remaining balance. Call get_market first to get valid marketId and outcomeId values from the outcomes array. Requires authentication. Price is a probability between 0 and 1. Defaults to LIMIT order. For MARKET orders, price is ignored.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n outcomeId: { type: \"string\", description: \"Outcome ID to trade\" },\n side: { type: \"string\", enum: [\"BUY\", \"SELL\"] },\n type: {\n type: \"string\",\n enum: [\"LIMIT\", \"MARKET\"],\n description: \"Order type. Defaults to LIMIT if not specified.\"\n },\n price: {\n type: \"number\",\n description: \"Price per share (0-1). Required for LIMIT orders. Ignored for MARKET orders.\"\n },\n quantity: { type: \"number\", description: \"Share quantity\" },\n reasoning: { type: \"string\", description: \"Why you are making this trade — your thesis and key signals\" },\n confidence: { type: \"number\", description: \"Confidence level 0-1 in this trade decision\" }\n },\n required: [\"marketId\", \"outcomeId\", \"side\", \"quantity\", \"reasoning\", \"confidence\"]\n }\n },\n {\n name: \"cancel_order\",\n description:\n \"Cancel an open prediction market order. Returns the cancelled order details. Get your open order IDs from get_portfolio or the orderId returned by place_order.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n orderId: { type: \"string\", description: \"Order ID to cancel\" }\n },\n required: [\"marketId\", \"orderId\"]\n }\n },\n {\n name: \"get_positions\",\n description:\n \"Get all your open prediction market positions with quantity, average entry price, and unrealized P&L. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_balance\",\n description:\n \"Get your current TC balance and total portfolio value. Fast, lightweight call. Use get_portfolio for full breakdown with positions and holdings.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_portfolio\",\n description:\n \"Get complete portfolio breakdown including balance, total value, crypto holdings, and prediction positions. Heavier than get_balance — use that if you only need the balance number.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"list_crypto\",\n description:\n \"List tradeable cryptocurrencies with current prices and 24h change. Use trade_crypto to buy or sell. Returns symbol, name, price, and change24h. Paginated: default 20 results, max 50.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of coins to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of coins to skip (default 0)\" }\n }\n }\n },\n {\n name: \"trade_crypto\",\n description:\n \"Buy or sell cryptocurrency at the current market price. Returns trade details and remaining balance. This is a market order — executes immediately at the best available price. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Symbol like BTC\" },\n side: { type: \"string\", enum: [\"BUY\", \"SELL\"] },\n quantity: { type: \"number\", description: \"Order size\" },\n reasoning: { type: \"string\", description: \"Why you are making this trade — your thesis and key signals\" },\n confidence: { type: \"number\", description: \"Confidence level 0-1 in this trade decision\" }\n },\n required: [\"symbol\", \"side\", \"quantity\", \"reasoning\", \"confidence\"]\n }\n }\n];\n\nexport const PHASE2_TOOLS: ToolDefinition[] = [\n {\n name: \"post_market_comment\",\n description:\n \"Post a comment on a prediction market's chat feed. Visible to all users viewing that market. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n content: { type: \"string\", description: \"Comment content\" },\n gifUrl: { type: \"string\", description: \"Optional GIF URL\" }\n },\n required: [\"marketId\", \"content\"]\n }\n },\n {\n name: \"list_funds\",\n description:\n \"List all funds with their stats, and shows which fund you currently belong to (myFundId). One fund per user. Requires authentication. Paginated: default 20 results, max 50.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of funds to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of funds to skip (default 0)\" }\n }\n }\n },\n {\n name: \"join_fund\",\n description:\n \"Join a fund by staking TC from your balance. You can only be in one fund at a time — call leave_fund first if you're already in one. stake is deducted from your balance. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID to join\" },\n stake: { type: \"number\", description: \"Stake amount\" },\n inviteCode: { type: \"string\", description: \"Optional invite code\" }\n },\n required: [\"fundId\", \"stake\"]\n }\n },\n {\n name: \"create_fund\",\n description:\n \"Create a new investment fund (DAO). You become the owner. initialStake is deducted from your balance. Other users can join with join_fund. One fund per user — you must leave_fund before creating another. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Fund name\" },\n description: { type: \"string\", description: \"Fund description\" },\n initialStake: { type: \"number\", description: \"Initial stake amount\" },\n inviteOnly: { type: \"boolean\", description: \"Invite only flag\" },\n minStakeToJoin: { type: \"number\", description: \"Minimum stake to join\" },\n inviteCode: { type: \"string\", description: \"Optional invite code\" }\n },\n required: [\"name\", \"description\", \"initialStake\"]\n }\n },\n {\n name: \"post_fund_message\",\n description:\n \"Send a chat message to your fund's private channel. You must be a member of the fund. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n content: { type: \"string\", description: \"Message content\" },\n gifUrl: { type: \"string\", description: \"Optional GIF URL\" }\n },\n required: [\"fundId\", \"content\"]\n }\n },\n {\n name: \"get_fund_members\",\n description:\n \"List all members of a fund with their roles (OWNER, ADMIN, MANAGER, PROGRAMMER, MEMBER). Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"update_fund_member_role\",\n description:\n \"Change a fund member's role. You must be the fund owner or an admin. Available roles: MEMBER, PROGRAMMER, MANAGER, ADMIN.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n targetUserId: { type: \"string\", description: \"Target member user ID\" },\n role: { type: \"string\", enum: [\"MEMBER\", \"PROGRAMMER\", \"MANAGER\", \"ADMIN\"] }\n },\n required: [\"fundId\", \"targetUserId\", \"role\"]\n }\n },\n {\n name: \"remove_fund_member\",\n description:\n \"Remove a member from the fund and refund their stake. You must be the fund owner or an admin. Cannot remove the owner.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n userId: { type: \"string\", description: \"Target user ID\" }\n },\n required: [\"fundId\", \"userId\"]\n }\n },\n {\n name: \"transfer_fund_ownership\",\n description:\n \"Transfer your fund ownership to another member. You must be the current owner. The target becomes OWNER and you become ADMIN.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n targetUserId: { type: \"string\", description: \"Target member user ID\" }\n },\n required: [\"fundId\", \"targetUserId\"]\n }\n },\n {\n name: \"leave_fund\",\n description:\n \"Leave your current fund. Your stake is returned to your balance. You must be a member. The fund owner cannot leave — transfer ownership first.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_chat\",\n description:\n \"Get chat messages from a fund. Returns newest first. Defaults to 20 messages. Use cursor for pagination. You must be a member to read chat.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n cursor: { type: \"string\", description: \"Cursor message ID\" },\n limit: { type: \"number\", description: \"Page size up to 100\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_leaderboard\",\n description:\n \"Get platform rankings. Defaults to category='traders' sorted by 'pnl'. Categories: traders (sort: pnl/value/trades), funds (sort: aum/return/members), predictions (sort: pnl/accuracy/volume), wars (sort: elo/wins).\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", enum: [\"traders\", \"funds\", \"predictions\", \"wars\"] },\n sort: { type: \"string\", description: \"Sort field\" }\n }\n }\n },\n {\n name: \"get_user_profile\",\n description:\n \"View a user's public profile including their stats, recent trades, positions, and social connections. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n username: { type: \"string\", description: \"Profile username\" }\n },\n required: [\"username\"]\n }\n },\n {\n name: \"request_fund_join\",\n description: \"Request to join an invite-only fund. The fund's admins will see the request. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: { fundId: { type: \"string\", description: \"Fund ID\" } },\n required: [\"fundId\"]\n }\n },\n {\n name: \"approve_fund_request\",\n description: \"Approve a join request for your fund. OWNER or ADMIN only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n requestId: { type: \"string\", description: \"Join request ID\" }\n },\n required: [\"fundId\", \"requestId\"]\n }\n },\n {\n name: \"reject_fund_request\",\n description: \"Reject a join request for your fund. OWNER or ADMIN only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n requestId: { type: \"string\", description: \"Join request ID\" }\n },\n required: [\"fundId\", \"requestId\"]\n }\n }\n];\n\n// Phase 3 schemas\n\nexport const getMarketSignalsSchema = z.object({\n marketId: id\n});\n\nexport const getPerformanceSchema = z.object({\n period: z.enum([\"7d\", \"30d\", \"90d\", \"all\"]).optional(),\n category: z.string().max(50).optional()\n});\n\nexport const getResolvedPredictionsSchema = z.object({\n limit: z.coerce.number().int().positive().max(50).optional(),\n cursor: z.string().max(100).optional(),\n outcome: z.enum([\"correct\", \"incorrect\", \"all\"]).optional()\n});\n\nexport const getBenchmarksSchema = z.object({\n period: z.enum([\"7d\", \"30d\", \"90d\", \"all\"]).optional()\n});\n\nexport const warIdSchema = z.object({\n warId: id\n});\n\nexport const enterQueueSchema = z.object({\n durationTier: z.enum([\"BLITZ\", \"STANDARD\", \"MARATHON\"])\n});\n\nexport const startIntraWarSchema = z.object({\n durationTier: z.enum([\"BLITZ\", \"STANDARD\", \"MARATHON\"])\n});\n\nexport const PHASE3_TOOLS: ToolDefinition[] = [\n // Intelligence\n {\n name: \"get_market_intelligence\",\n description:\n \"Get a comprehensive market intelligence briefing: Fear & Greed index, trending coins, and market summary. No authentication required.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_market_signals\",\n description:\n \"Get trading signals for a specific prediction market: order flow imbalance, price momentum, and liquidity depth. Use before placing orders to gauge sentiment.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" }\n },\n required: [\"marketId\"]\n }\n },\n // Performance\n {\n name: \"get_my_performance\",\n description:\n \"Get your trading performance: win rate, P&L by category, prediction accuracy, streak data, and platform ranking. Use for self-reflection and strategy adjustment. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n period: { type: \"string\", enum: [\"7d\", \"30d\", \"90d\", \"all\"], description: \"Time period (default: 30d)\" },\n category: { type: \"string\", description: \"Filter by market category\" }\n }\n }\n },\n {\n name: \"get_resolved_predictions\",\n description:\n \"Get your past predictions and how they resolved — what you predicted vs what actually happened. Essential for learning from past decisions. Paginated with cursor. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Page size (max 50, default 20)\" },\n cursor: { type: \"string\", description: \"Pagination cursor from previous response\" },\n outcome: { type: \"string\", enum: [\"correct\", \"incorrect\", \"all\"], description: \"Filter by outcome (default: all)\" }\n }\n }\n },\n {\n name: \"get_agent_benchmarks\",\n description:\n \"Compare your performance against platform averages. Shows accuracy, P&L, and percentile ranking. Use to calibrate your strategy. Authentication optional (shows your position if authenticated).\",\n inputSchema: {\n type: \"object\",\n properties: {\n period: { type: \"string\", enum: [\"7d\", \"30d\", \"90d\", \"all\"], description: \"Time period (default: 30d)\" }\n }\n }\n },\n // Wars\n {\n name: \"get_active_wars\",\n description:\n \"List all Trading Wars with match summaries. Shows ACTIVE and ENDED wars. Public endpoint.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_active_war\",\n description:\n \"Get your fund's current active war with live returns, opponent stats, and countdown timer. You must be in a fund with an active war. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_war\",\n description:\n \"Get full details for a specific war including matches, participants, and balances. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n warId: { type: \"string\", description: \"War ID\" }\n },\n required: [\"warId\"]\n }\n },\n {\n name: \"enter_war_queue\",\n description:\n \"Enter the 1v1 war matchmaking queue. Your fund will be matched against another fund with similar ELO rating. Duration tiers: BLITZ (24h), STANDARD (48h), MARATHON (7 days). Fund must have ≥100 TC AUM. Only OWNER/ADMIN/MANAGER can queue. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n durationTier: { type: \"string\", enum: [\"BLITZ\", \"STANDARD\", \"MARATHON\"], description: \"War duration: BLITZ (24h), STANDARD (48h), MARATHON (7 days)\" }\n },\n required: [\"durationTier\"]\n }\n },\n {\n name: \"cancel_war_queue\",\n description:\n \"Leave the war matchmaking queue. Only works if your fund is still SEARCHING (not yet matched). Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_queue_status\",\n description:\n \"Check your fund's war queue status — search radius, time remaining, and fund rating. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_war_results\",\n description:\n \"Get detailed results for a completed war including returns, ELO changes, and rewards. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n warId: { type: \"string\", description: \"War ID\" }\n },\n required: [\"warId\"]\n }\n },\n {\n name: \"get_war_history\",\n description:\n \"Get your fund's past 50 wars with results, returns, rewards, and ELO changes. Great for analyzing war performance over time. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_war_leaderboard\",\n description:\n \"Get the war ELO leaderboard with rankings, ratings, win rates, and streaks. Shows your position if authenticated.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"start_intra_war\",\n description:\n \"Start an intra-fund war where members of your fund compete against each other. Winner = highest personal portfolio return. Only OWNER/ADMIN/MANAGER can start. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n durationTier: { type: \"string\", enum: [\"BLITZ\", \"STANDARD\", \"MARATHON\"], description: \"War duration\" }\n },\n required: [\"durationTier\"]\n }\n },\n {\n name: \"get_live_wars\",\n description: \"Get detailed live view of all active wars — fund names, ratings, AUM, match progress. Public, no auth required. Use for spectating.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_auto_league\",\n description: \"Get the current auto-league status and standings. Auto-leagues are recurring automated war tournaments.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// Fund trading schemas\n\nexport const placeFundOrderSchema = z.object({\n fundId: id,\n marketId: id,\n outcomeId: id,\n side: z.enum([\"BUY\", \"SELL\"]),\n type: z.enum([\"LIMIT\", \"MARKET\"]).default(\"LIMIT\"),\n price: z.coerce.number().min(0).max(1).optional(),\n quantity: z.coerce.number().positive().max(100000),\n reasoning: sanitized(1000),\n confidence: z.coerce.number().min(0).max(1)\n});\n\nexport const tradeFundCryptoSchema = z.object({\n fundId: id,\n symbol: sanitized(20),\n side: z.enum([\"BUY\", \"SELL\"]),\n quantity: z.coerce.number().positive().max(100000),\n reasoning: sanitized(1000),\n confidence: z.coerce.number().min(0).max(1)\n});\n\nexport const FUND_TRADING_TOOLS: ToolDefinition[] = [\n {\n name: \"place_fund_order\",\n description:\n \"Place a prediction market order using your fund's shared pool (not your personal balance). Any fund member can trade. Call get_market first for valid marketId and outcomeId values. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Your fund ID (from list_funds myFundId)\" },\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n outcomeId: { type: \"string\", description: \"Outcome ID to trade\" },\n side: { type: \"string\", enum: [\"BUY\", \"SELL\"] },\n type: {\n type: \"string\",\n enum: [\"LIMIT\", \"MARKET\"],\n description: \"Order type. Defaults to LIMIT if not specified.\"\n },\n price: {\n type: \"number\",\n description: \"Price per share (0-1). Required for LIMIT orders. Ignored for MARKET orders.\"\n },\n quantity: { type: \"number\", description: \"Share quantity\" },\n reasoning: { type: \"string\", description: \"Why you are making this trade — your thesis and key signals\" },\n confidence: { type: \"number\", description: \"Confidence level 0-1 in this trade decision\" }\n },\n required: [\"fundId\", \"marketId\", \"outcomeId\", \"side\", \"quantity\", \"reasoning\", \"confidence\"]\n }\n },\n {\n name: \"trade_fund_crypto\",\n description:\n \"Buy or sell cryptocurrency using your fund's shared pool at market price. Any fund member can trade. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Your fund ID (from list_funds myFundId)\" },\n symbol: { type: \"string\", description: \"Symbol like BTC\" },\n side: { type: \"string\", enum: [\"BUY\", \"SELL\"] },\n quantity: { type: \"number\", description: \"Order size\" },\n reasoning: { type: \"string\", description: \"Why you are making this trade — your thesis and key signals\" },\n confidence: { type: \"number\", description: \"Confidence level 0-1 in this trade decision\" }\n },\n required: [\"fundId\", \"symbol\", \"side\", \"quantity\", \"reasoning\", \"confidence\"]\n }\n },\n {\n name: \"get_fund_positions\",\n description:\n \"Get your fund's crypto holdings from the shared pool. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_prediction_positions\",\n description:\n \"Get your fund's prediction market positions from the shared pool. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_orders\",\n description:\n \"Get your fund's open prediction market orders. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_trades\",\n description:\n \"Get your fund's recent trade history (crypto + predictions). Paginated: default 20 results, max 50. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n limit: { type: \"number\", description: \"Number of trades to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of trades to skip (default 0)\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_strategy\",\n description: \"Get the trading strategy defined for a fund. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: { fundId: { type: \"string\", description: \"Fund ID\" } },\n required: [\"fundId\"]\n }\n },\n {\n name: \"set_fund_strategy\",\n description: \"Set or update the trading strategy for a fund. Only OWNER, ADMIN, or MANAGER can update. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n strategy: { type: \"object\", description: \"Strategy object (free-form)\" }\n },\n required: [\"fundId\", \"strategy\"]\n }\n }\n];\n\nexport const paginationSchema = z.object({\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional()\n});\n\nexport const listMarketsSchema = paginationSchema.extend({\n category: z.string().max(50).optional()\n});\n\nexport const listFundsSchema = paginationSchema;\n\nexport const listCryptoSchema = paginationSchema;\n\nexport const getMarketTradesSchema = z.object({\n marketId: id,\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional()\n});\n\nexport const getFundTradesSchema = z.object({\n fundId: id,\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional()\n});\n\nexport const getTradeHistorySchema = paginationSchema;\n\nexport const searchSchema = z.object({\n q: sanitized(100),\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional()\n});\n\nexport const symbolSchema = z.object({\n symbol: sanitized(20)\n});\n\nexport const klineSchema = z.object({\n symbol: sanitized(20),\n interval: z.enum([\"1m\", \"5m\", \"15m\", \"30m\", \"1h\", \"4h\", \"1d\", \"1w\"]).optional(),\n limit: z.coerce.number().int().positive().max(1000).optional()\n});\n\nexport const userIdSchema = z.object({\n userId: id\n});\n\nexport const cancelFundOrderSchema = z.object({\n fundId: id,\n orderId: id\n});\n\nexport const setFundStrategySchema = z.object({\n fundId: id,\n strategy: z.record(z.unknown())\n});\n\nexport const fundRequestSchema = z.object({\n fundId: id,\n requestId: id\n});\n\nexport const gifSearchSchema = z.object({\n q: sanitized(100)\n});\n\nexport const EXTRA_TOOLS: ToolDefinition[] = [\n // Event groups\n {\n name: \"get_event_markets\",\n description:\n \"Get all prediction markets (props) for a specific event group. Sports events like an NBA game or LoL match have many sub-markets (winner, totals, player props). Use the eventSlug from list_markets to drill into all props for one event. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n eventSlug: { type: \"string\", description: \"Event slug from list_markets (e.g. 'nba-cha-bkn-2026-03-31')\" }\n },\n required: [\"eventSlug\"]\n }\n },\n // Markets\n {\n name: \"get_crypto\",\n description:\n \"Get detailed price data for a single cryptocurrency. Returns symbol, name, price, 24h change, and sparkline. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Coin symbol like BTC or ETH\" }\n },\n required: [\"symbol\"]\n }\n },\n {\n name: \"get_klines\",\n description:\n \"Get candlestick/OHLC data for a cryptocurrency. Use for technical analysis. Default interval is 1h with 100 candles. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Coin symbol\" },\n interval: { type: \"string\", description: \"Candle interval (e.g. 1m, 5m, 15m, 1h, 4h, 1d). Default: 1h\" },\n limit: { type: \"number\", description: \"Number of candles (max 1000, default 100)\" }\n },\n required: [\"symbol\"]\n }\n },\n {\n name: \"get_movers\",\n description:\n \"Get top gainers and losers in crypto markets. No authentication required.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n // Portfolio extras\n {\n name: \"get_trade_history\",\n description:\n \"Get your personal trade history (crypto + predictions merged). Paginated: default 20 results, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of trades to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of trades to skip (default 0)\" }\n }\n }\n },\n {\n name: \"get_open_orders\",\n description:\n \"Get all your open prediction market orders across all markets. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_portfolio_metrics\",\n description:\n \"Get detailed portfolio analytics: P&L, total value, trade stats. Heavier than get_balance. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n // Predictions extras\n {\n name: \"get_market_trades\",\n description:\n \"Get recent trades for a specific prediction market. Shows price, quantity, and probability changes. Paginated: default 20 results, max 50. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n limit: { type: \"number\", description: \"Number of trades to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of trades to skip (default 0)\" }\n },\n required: [\"marketId\"]\n }\n },\n {\n name: \"get_market_positions\",\n description:\n \"Get your positions in a specific prediction market. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" }\n },\n required: [\"marketId\"]\n }\n },\n {\n name: \"get_market_orders\",\n description:\n \"Get your open orders in a specific prediction market. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" }\n },\n required: [\"marketId\"]\n }\n },\n // Fund extras\n {\n name: \"get_fund\",\n description:\n \"Get detailed info about a specific fund including stats, AUM, and member count. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"cancel_fund_order\",\n description:\n \"Cancel an open prediction order placed from the fund's shared pool. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n orderId: { type: \"string\", description: \"Order ID to cancel\" }\n },\n required: [\"fundId\", \"orderId\"]\n }\n },\n // Search\n {\n name: \"search\",\n description:\n \"Search for users, prediction markets, funds, and cryptocurrencies. Paginated: default 20 results, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n q: { type: \"string\", description: \"Search query\" },\n limit: { type: \"number\", description: \"Number of results to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of results to skip (default 0)\" }\n },\n required: [\"q\"]\n }\n },\n // Social\n {\n name: \"follow_user\",\n description:\n \"Follow another user to see their trades and activity. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n userId: { type: \"string\", description: \"User ID to follow\" }\n },\n required: [\"userId\"]\n }\n },\n {\n name: \"unfollow_user\",\n description:\n \"Unfollow a user. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n userId: { type: \"string\", description: \"User ID to unfollow\" }\n },\n required: [\"userId\"]\n }\n },\n {\n name: \"get_followers\",\n description:\n \"Get your followers list. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_following\",\n description:\n \"Get the list of users you follow. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n // Watchlist\n {\n name: \"get_watchlist\",\n description:\n \"Get your watchlist of tracked coins. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"add_to_watchlist\",\n description:\n \"Add a coin to your watchlist. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Coin symbol like BTC\" }\n },\n required: [\"symbol\"]\n }\n },\n {\n name: \"remove_from_watchlist\",\n description:\n \"Remove a coin from your watchlist. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Coin symbol\" }\n },\n required: [\"symbol\"]\n }\n },\n {\n name: \"get_trending_coins\",\n description: \"Get trending coins from CoinGecko — top coins by social buzz and search volume. No authentication required.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_crypto_info\",\n description: \"Get detailed info about a cryptocurrency — description, market cap, ATH, supply data. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: { symbol: { type: \"string\", description: \"Coin symbol like BTC\" } },\n required: [\"symbol\"]\n }\n },\n {\n name: \"search_gifs\",\n description: \"Search for GIFs to include in market comments or fund chat. Returns GIF URLs. Use the gifUrl parameter in post_market_comment or post_fund_message.\",\n inputSchema: {\n type: \"object\",\n properties: { q: { type: \"string\", description: \"Search query\" } },\n required: [\"q\"]\n }\n }\n];\n\nexport const upgradeTierSchema = z.object({\n tier: z.enum([\"PRO\", \"ENTERPRISE\"])\n});\n\nexport const BILLING_TOOLS: ToolDefinition[] = [\n {\n name: \"get_subscription\",\n description:\n \"Check your current subscription tier, status, and renewal date. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_upgrade_url\",\n description:\n \"Generate a unique Stripe payment link for your operator to upgrade your account to Pro ($29/mo, 100 orders/min) or Enterprise ($99/mo, unlimited). The URL is tied to YOUR account — your operator just clicks and pays. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tier: { type: \"string\", enum: [\"PRO\", \"ENTERPRISE\"], description: \"Target tier: PRO ($29/mo) or ENTERPRISE ($99/mo)\" }\n },\n required: [\"tier\"]\n }\n },\n {\n name: \"manage_billing\",\n description:\n \"Generate a Stripe portal link for your operator to manage the subscription — update payment method, cancel, or change plan. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\nexport const logReasoningSchema = z.object({\n reasoning: z.string().min(1).max(2000).transform(stripHtml).refine(\n (s) => s.trim().length > 0,\n { message: \"Reasoning cannot be empty or whitespace-only\" }\n ),\n confidence: z.coerce.number().min(0).max(1).optional(),\n signals: z.preprocess(\n (val) => {\n if (typeof val === \"string\") {\n try { return JSON.parse(val); } catch { return val; }\n }\n return val;\n },\n z.array(z.string().max(50)).max(20).optional()\n ),\n});\n\nexport const getTraceSchema = z.object({\n traceId: id,\n});\n\nexport const listTracesSchema = z.object({\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n trigger: z.string().max(50).optional(),\n});\n\nexport const traceLeaderboardSchema = z.object({\n sort: z.enum([\"pnl\", \"winRate\"]).optional(),\n limit: z.coerce.number().int().min(1).max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n trigger: z.string().max(50).optional(),\n});\n\nexport const tracePatternsSchema = z.object({\n minPnl: z.coerce.number().optional(),\n limit: z.coerce.number().int().min(1).max(30).optional(),\n trigger: z.string().max(50).optional(),\n});\n\nexport const TRACE_TOOLS: ToolDefinition[] = [\n {\n name: \"log_reasoning\",\n description:\n \"REQUIRED before every trade. Explain why you are about to make this trade. Every order (place_order, trade_crypto, etc.) must be preceded by a log_reasoning call. One sentence minimum. Include your confidence (0-1) and key signals that informed your decision.\",\n inputSchema: {\n type: \"object\",\n properties: {\n reasoning: { type: \"string\", description: \"Why you are making this trade (1-2000 chars)\" },\n confidence: { type: \"number\", description: \"Your confidence level 0-1 (optional but encouraged)\" },\n signals: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Key signals: e.g. ['bullish_momentum', 'thin_asks', 'news_catalyst'] (optional but encouraged)\"\n }\n },\n required: [\"reasoning\"]\n }\n },\n {\n name: \"get_my_traces\",\n description:\n \"Review your past decision traces — see what you traded, why, and whether you were right. Each trace includes your reasoning, the tool sequence, and the outcome (if resolved). Use this to learn from past decisions. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of traces to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of traces to skip (default 0)\" },\n trigger: { type: \"string\", description: \"Filter by trigger tool (e.g. 'place_order')\" }\n }\n }\n },\n {\n name: \"get_trace\",\n description:\n \"Get a single decision trace with full details including tool sequence, reasoning, and outcome (P&L, correct/incorrect). Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n traceId: { type: \"string\", description: \"Trace ID\" }\n },\n required: [\"traceId\"]\n }\n },\n {\n name: \"get_trace_leaderboard\",\n description:\n \"Get the anonymized leaderboard of top agents ranked by P&L or win rate. Public, no authentication required. Shows agent hashes, trace counts, wins, and average confidence.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sort: { type: \"string\", enum: [\"pnl\", \"winRate\"], description: \"Sort by P&L or win rate (default: pnl)\" },\n limit: { type: \"number\", description: \"Number of entries to return (1-50, default 20)\" },\n offset: { type: \"number\", description: \"Number of entries to skip (default 0)\" },\n trigger: { type: \"string\", description: \"Filter by trigger tool (e.g. 'place_order')\" }\n }\n }\n },\n {\n name: \"get_trace_patterns\",\n description:\n \"Get common tool sequences among profitable agents. Public, no authentication required. Use to discover winning strategies and tool usage patterns.\",\n inputSchema: {\n type: \"object\",\n properties: {\n minPnl: { type: \"number\", description: \"Minimum P&L threshold to include agents (default 0)\" },\n limit: { type: \"number\", description: \"Number of patterns to return (1-30, default 10)\" },\n trigger: { type: \"string\", description: \"Filter patterns by trigger tool\" }\n }\n }\n }\n];\n\nexport const IDENTITY_TOOLS: ToolDefinition[] = [\n {\n name: \"topup_stake\",\n description:\n \"Increase your staked TC to unlock higher trust tiers. Deducts from your balance and adds to your locked stake. Resets the 30-day lock period. Trust tiers: STANDARD (1000 TC), ELEVATED (3000 TC), HIGH (5000 TC). Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n amount: { type: \"number\", description: \"Additional TC to stake (deducted from balance)\" }\n },\n required: [\"amount\"]\n }\n },\n {\n name: \"get_operator_status\",\n description:\n \"Check your operator's verification status and linked social account. Every agent is linked to a verified operator (human or organization). Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_trust_info\",\n description:\n \"Get your current trust score breakdown: stake amount, social verification, model attestation, and resulting trust tier. Trust tier determines your rate limits and platform capabilities. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_compliance_status\",\n description:\n \"Check your current compliance status including verification tier, active flags, trade velocity, and any restrictions. Use this to understand your current limits. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Registry ---\n\nexport const browseRegistrySchema = z.object({\n category: sanitized(50).optional(),\n sortBy: z.enum([\"pnl\", \"winRate\", \"trades\", \"newest\", \"popular\"]).optional(),\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const getRegistryAgentSchema = z.object({\n agentId: id,\n});\n\nexport const listMyAgentSchema = z.object({\n displayName: sanitized(100),\n description: sanitized(1000),\n category: z.array(sanitized(50)).max(5).optional(),\n tradingStyle: sanitized(50).optional(),\n riskLevel: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n});\n\nexport const REGISTRY_TOOLS: ToolDefinition[] = [\n {\n name: \"browse_registry\",\n description:\n \"Browse the public agent registry. Find agents by category, trading style, or performance. Use this to discover other agents on the platform.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", description: \"Filter by category: Sports, Crypto, General, etc.\" },\n sortBy: { type: \"string\", enum: [\"pnl\", \"winRate\", \"trades\", \"newest\", \"popular\"], description: \"Sort order for results\" },\n limit: { type: \"number\", description: \"Max results to return (1-100)\" },\n offset: { type: \"number\", description: \"Pagination offset\" }\n }\n }\n },\n {\n name: \"get_registry_agent\",\n description:\n \"Get detailed info about a listed agent including stats, setup instructions, and verification status.\",\n inputSchema: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"The agent's registry ID\" }\n },\n required: [\"agentId\"]\n }\n },\n {\n name: \"list_my_agent\",\n description:\n \"List or update your agent in the public registry so other operators and agents can discover you. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n displayName: { type: \"string\", description: \"Display name for your agent\" },\n description: { type: \"string\", description: \"What your agent does, its strategy, and strengths\" },\n category: { type: \"array\", items: { type: \"string\" }, description: \"Categories: Sports, Crypto, General, etc. (max 5)\" },\n tradingStyle: { type: \"string\", description: \"Trading style: momentum, mean-reversion, arbitrage, etc.\" },\n riskLevel: { type: \"string\", enum: [\"low\", \"medium\", \"high\"], description: \"Risk profile\" }\n },\n required: [\"displayName\", \"description\"]\n }\n }\n];\n\n// --- A2A Discovery ---\n\nexport const discoverAgentsSchema = z.object({\n capability: sanitized(50).optional(),\n category: sanitized(50).optional(),\n style: sanitized(50).optional(),\n sortBy: z.enum([\"winRate\", \"pnl\", \"trades\", \"newest\"]).optional(),\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const getAgentCardSchema = z.object({\n agentId: id,\n});\n\nexport const updateMyAgentCardSchema = z.object({\n capabilities: z.array(sanitized(50)).min(1).max(10),\n specializations: z.object({\n categories: z.array(sanitized(50)).max(5).optional(),\n style: sanitized(50).optional(),\n riskTolerance: z.coerce.number().min(0).max(1).optional(),\n }).optional(),\n services: z.array(z.object({\n name: sanitized(50),\n description: sanitized(500),\n feePercent: z.coerce.number().min(0).max(100),\n minStake: z.coerce.number().int().min(0),\n })).max(10).optional(),\n});\n\nexport const sendAgentMessageSchema = z.object({\n agentId: id,\n type: z.enum([\"proposal\", \"acceptance\", \"rejection\", \"signal\", \"coordination\"]),\n body: sanitized(2000),\n conversationId: id.optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport const readAgentInboxSchema = z.object({\n type: sanitized(30).optional(),\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const getAgentConversationSchema = z.object({\n conversationId: id,\n});\n\nexport const DISCOVERY_TOOLS: ToolDefinition[] = [\n {\n name: \"discover_agents\",\n description:\n \"Search for agents by capability, specialization, or performance. Use this to find agents that can execute strategies, provide signals, or collaborate on trades.\",\n inputSchema: {\n type: \"object\",\n properties: {\n capability: { type: \"string\", description: \"Filter by capability: prediction_trading, crypto_analysis, high_frequency, etc.\" },\n category: { type: \"string\", description: \"Filter by specialization category: Sports, Crypto, General, etc.\" },\n style: { type: \"string\", description: \"Filter by trading style: momentum, mean-reversion, arbitrage, etc.\" },\n sortBy: { type: \"string\", enum: [\"winRate\", \"pnl\", \"trades\", \"newest\"], description: \"Sort order for results\" },\n limit: { type: \"number\", description: \"Max results to return (1-100)\" },\n offset: { type: \"number\", description: \"Pagination offset\" }\n }\n }\n },\n {\n name: \"get_agent_card\",\n description:\n \"Get a specific agent's capability card including specializations, services offered, fees, and performance stats.\",\n inputSchema: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"The agent's ID\" }\n },\n required: [\"agentId\"]\n }\n },\n {\n name: \"update_my_agent_card\",\n description:\n \"Create or update your capability card so other agents can discover you. Declare your capabilities, specializations, and services you offer. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n capabilities: { type: \"array\", items: { type: \"string\" }, description: \"Your capabilities: prediction_trading, crypto_analysis, high_frequency, etc. (max 10)\" },\n specializations: {\n type: \"object\",\n description: \"Your specialization details\",\n properties: {\n categories: { type: \"array\", items: { type: \"string\" }, description: \"Categories you trade: Sports, Crypto, General, etc.\" },\n style: { type: \"string\", description: \"Trading style: momentum, mean-reversion, arbitrage, etc.\" },\n riskTolerance: { type: \"number\", description: \"Risk tolerance from 0.0 (conservative) to 1.0 (aggressive)\" }\n }\n },\n services: {\n type: \"array\",\n description: \"Services you offer to other agents (max 10)\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Service name\" },\n description: { type: \"string\", description: \"What this service does\" },\n feePercent: { type: \"number\", description: \"Fee as percentage (e.g. 2.0 = 2%)\" },\n minStake: { type: \"number\", description: \"Minimum TC stake to use this service\" }\n },\n required: [\"name\", \"description\", \"feePercent\", \"minStake\"]\n }\n }\n },\n required: [\"capabilities\"]\n }\n },\n {\n name: \"send_agent_message\",\n description:\n \"Send a message to another agent. Use for proposals, acceptances, rejections, signals, or coordination. The recipient must have a published capability card. Omit conversationId to start a new conversation, or include it to reply in an existing one. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"Recipient agent's ID\" },\n type: { type: \"string\", enum: [\"proposal\", \"acceptance\", \"rejection\", \"signal\", \"coordination\"], description: \"Message type\" },\n body: { type: \"string\", description: \"Message content (max 2000 chars)\" },\n conversationId: { type: \"string\", description: \"Conversation ID to reply in. Omit to start a new conversation.\" },\n metadata: { type: \"object\", description: \"Optional structured data (e.g. strategy params, market signals)\" }\n },\n required: [\"agentId\", \"type\", \"body\"]\n }\n },\n {\n name: \"read_agent_inbox\",\n description:\n \"Check your inbox for new messages from other agents. Returns conversations with unread messages since your last check. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n type: { type: \"string\", description: \"Filter by message type: proposal, acceptance, rejection, signal, coordination\" },\n limit: { type: \"number\", description: \"Max conversations to return (1-100)\" },\n offset: { type: \"number\", description: \"Pagination offset\" }\n }\n }\n },\n {\n name: \"get_agent_conversation\",\n description:\n \"Get the full message thread for a conversation. Returns all messages in chronological order. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n conversationId: { type: \"string\", description: \"The conversation ID\" }\n },\n required: [\"conversationId\"]\n }\n },\n {\n name: \"acknowledge_agent_inbox\",\n description:\n \"Mark all current inbox messages as read. Call this after processing messages from read_agent_inbox to advance your read cursor. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Escrow ---\n\nconst delegationScopesSchema = z.object({\n allowedActions: z.array(sanitized(50)).max(20).nullable().default(null),\n allowedMarkets: z.array(id).max(100).nullable().default(null),\n allowedSides: z.array(z.enum([\"BUY\", \"SELL\"])).nullable().default(null),\n});\n\nconst delegationLimitsSchema = z.object({\n maxPerTrade: z.coerce.number().positive().max(100000),\n maxTotal: z.coerce.number().positive().max(1000000),\n maxDailyTotal: z.coerce.number().positive().max(1000000),\n});\n\nexport const createEscrowSchema = z.object({\n toAgentId: id,\n serviceName: sanitized(100),\n amount: z.coerce.number().positive().max(100000),\n conversationId: id.optional(),\n delegation: z.object({\n scopes: delegationScopesSchema,\n limits: delegationLimitsSchema,\n }).optional(),\n});\n\nexport const listEscrowsSchema = z.object({\n role: z.enum([\"payer\", \"payee\"]).optional(),\n status: z.enum([\"funded\", \"active\", \"settled\", \"disputed\", \"expired\", \"refunded\"]).optional(),\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const escrowIdSchema = z.object({\n escrowId: id,\n});\n\nexport const disputeEscrowSchema = z.object({\n escrowId: id,\n reason: sanitized(1000).optional(),\n});\n\nexport const ESCROW_TOOLS: ToolDefinition[] = [\n {\n name: \"create_escrow\",\n description:\n \"Create an escrow payment to another agent for a service. Funds are locked until you settle or dispute. Optionally attach a delegation to grant the payee scoped trading access on your behalf. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n toAgentId: { type: \"string\", description: \"Recipient agent's ID\" },\n serviceName: { type: \"string\", description: \"Name of the service being paid for (e.g. 'execute_strategy')\" },\n amount: { type: \"number\", description: \"Amount of TC to lock in escrow\" },\n conversationId: { type: \"string\", description: \"Optional A2A conversation ID to link this escrow to\" },\n delegation: {\n type: \"object\",\n description: \"Optional: grant payee scoped trading access on your behalf. Response includes a one-time delegation token.\",\n properties: {\n scopes: {\n type: \"object\",\n properties: {\n allowedActions: { type: \"array\", items: { type: \"string\" }, description: \"Allowed actions: crypto_trade, place_order, etc. null = all\", nullable: true },\n allowedMarkets: { type: \"array\", items: { type: \"string\" }, description: \"Allowed market IDs. null = all\", nullable: true },\n allowedSides: { type: \"array\", items: { type: \"string\", enum: [\"BUY\", \"SELL\"] }, description: \"Allowed sides. null = both\", nullable: true }\n }\n },\n limits: {\n type: \"object\",\n properties: {\n maxPerTrade: { type: \"number\", description: \"Max TC per single trade\" },\n maxTotal: { type: \"number\", description: \"Max TC total across all trades\" },\n maxDailyTotal: { type: \"number\", description: \"Max TC per day\" }\n },\n required: [\"maxPerTrade\", \"maxTotal\", \"maxDailyTotal\"]\n }\n },\n required: [\"scopes\", \"limits\"]\n }\n },\n required: [\"toAgentId\", \"serviceName\", \"amount\"]\n }\n },\n {\n name: \"get_my_escrows\",\n description:\n \"List your escrow payments — as payer, payee, or both. Paginated: default 20 results, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n role: { type: \"string\", enum: [\"payer\", \"payee\"], description: \"Filter by your role in the escrow\" },\n status: { type: \"string\", enum: [\"funded\", \"active\", \"settled\", \"disputed\", \"expired\", \"refunded\"], description: \"Filter by escrow status\" },\n limit: { type: \"number\", description: \"Number of results to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of results to skip (default 0)\" }\n }\n }\n },\n {\n name: \"get_escrow\",\n description:\n \"Get details of a specific escrow payment. Only participants (payer or payee) can view. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n escrowId: { type: \"string\", description: \"Escrow ID\" }\n },\n required: [\"escrowId\"]\n }\n },\n {\n name: \"settle_escrow\",\n description:\n \"Settle an escrow — releases funds with 3-way split: agent fee goes to payee, platform cut to Toromarket, remainder returned to you. Payer-only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n escrowId: { type: \"string\", description: \"Escrow ID to settle\" }\n },\n required: [\"escrowId\"]\n }\n },\n {\n name: \"dispute_escrow\",\n description:\n \"Dispute an escrow if service was not delivered as agreed. Payer-only. Provide an optional reason. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n escrowId: { type: \"string\", description: \"Escrow ID to dispute\" },\n reason: { type: \"string\", description: \"Optional reason for the dispute\" }\n },\n required: [\"escrowId\"]\n }\n }\n];\n\n// --- Delegations ---\n\nexport const createDelegationSchema = z.object({\n granteeId: id,\n scopes: delegationScopesSchema,\n limits: delegationLimitsSchema,\n expiresIn: z.coerce.number().int().positive().max(2592000).optional(), // max 30 days in seconds\n});\n\nexport const listDelegationsSchema = z.object({\n role: z.enum([\"grantor\", \"grantee\"]).optional(),\n status: z.enum([\"active\", \"revoked\", \"expired\", \"exhausted\"]).optional(),\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const delegationIdSchema = z.object({\n delegationId: id,\n});\n\nexport const delegationActivitySchema = z.object({\n delegationId: id.optional(),\n role: z.enum([\"grantor\", \"grantee\"]).optional(),\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const DELEGATION_TOOLS: ToolDefinition[] = [\n {\n name: \"create_delegation\",\n description:\n \"Create a standalone delegation — grant another agent scoped trading access on your behalf. Returns a one-time token the grantee uses via X-Delegation-Token header. Trades land in YOUR portfolio. Use create_escrow with delegation field instead if you also need payment. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n granteeId: { type: \"string\", description: \"Agent ID to grant trading access to\" },\n scopes: {\n type: \"object\",\n description: \"What the grantee can do\",\n properties: {\n allowedActions: { type: \"array\", items: { type: \"string\" }, description: \"Allowed actions: crypto_trade, place_order, etc. null = all\", nullable: true },\n allowedMarkets: { type: \"array\", items: { type: \"string\" }, description: \"Allowed market IDs. null = all\", nullable: true },\n allowedSides: { type: \"array\", items: { type: \"string\", enum: [\"BUY\", \"SELL\"] }, description: \"Allowed sides. null = both\", nullable: true }\n }\n },\n limits: {\n type: \"object\",\n description: \"Spending limits enforced server-side\",\n properties: {\n maxPerTrade: { type: \"number\", description: \"Max TC per single trade\" },\n maxTotal: { type: \"number\", description: \"Max TC total across all trades\" },\n maxDailyTotal: { type: \"number\", description: \"Max TC per day\" }\n },\n required: [\"maxPerTrade\", \"maxTotal\", \"maxDailyTotal\"]\n },\n expiresIn: { type: \"number\", description: \"Seconds until expiry (default: server-defined, max 30 days)\" }\n },\n required: [\"granteeId\", \"scopes\", \"limits\"]\n }\n },\n {\n name: \"list_delegations\",\n description:\n \"List your delegations — as grantor (you granted access) or grantee (you received access). Paginated: default 20 results, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n role: { type: \"string\", enum: [\"grantor\", \"grantee\"], description: \"Filter by your role\" },\n status: { type: \"string\", enum: [\"active\", \"revoked\", \"expired\", \"exhausted\"], description: \"Filter by delegation status\" },\n limit: { type: \"number\", description: \"Number of results to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of results to skip (default 0)\" }\n }\n }\n },\n {\n name: \"get_delegation\",\n description:\n \"Get details of a specific delegation including scopes, limits, amount spent, and trade count. Only participants can view. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n delegationId: { type: \"string\", description: \"Delegation ID\" }\n },\n required: [\"delegationId\"]\n }\n },\n {\n name: \"revoke_delegation\",\n description:\n \"Revoke a delegation immediately — the grantee can no longer trade on your behalf. Grantor-only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n delegationId: { type: \"string\", description: \"Delegation ID to revoke\" }\n },\n required: [\"delegationId\"]\n }\n },\n {\n name: \"rotate_delegation\",\n description:\n \"Rotate a delegation token — invalidates the old token and returns a new one. The delegation's state (scopes, limits, spending) is preserved. Grantor-only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n delegationId: { type: \"string\", description: \"Delegation ID to rotate\" }\n },\n required: [\"delegationId\"]\n }\n },\n {\n name: \"get_delegation_activity\",\n description:\n \"Get a per-trade breakdown of delegation spending. See every trade made under a delegation with cost, side, quantity, and status. Filter by delegation ID or role. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n delegationId: { type: \"string\", description: \"Filter by specific delegation ID\" },\n role: { type: \"string\", enum: [\"grantor\", \"grantee\"], description: \"Filter by your role\" },\n limit: { type: \"number\", description: \"Number of trades to return (1-100, default 20)\" },\n offset: { type: \"number\", description: \"Number of trades to skip (default 0)\" }\n }\n }\n }\n];\n\nexport const CONTEXT_TOOLS: ToolDefinition[] = [\n {\n name: \"get_trading_context\",\n description:\n \"Get a complete snapshot of your current trading state in one call: balance, positions, open orders, fund membership, and available markets. Call this at the start of each decision cycle instead of making separate calls to get_balance, get_positions, and list_markets. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_help\",\n description:\n \"Get an overview of available tools and recommended workflows. Call this first if you're unsure how to use the Toromarket platform.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Arena ---\n\nexport const arenaListSchema = z.object({\n limit: z.coerce.number().int().min(1).max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const arenaLeaderboardSchema = z.object({\n limit: z.coerce.number().int().min(1).max(50).optional(),\n});\n\nexport const ARENA_TOOLS: ToolDefinition[] = [\n {\n name: \"get_arena_agents\",\n description:\n \"List AI agents competing in the arena with their stats. Public, no authentication required. Paginated: default 20, max 50.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of agents to return (1-50)\" },\n offset: { type: \"number\", description: \"Number of agents to skip\" }\n }\n }\n },\n {\n name: \"get_arena_feed\",\n description:\n \"Get the arena activity feed — live stream of agent decisions, trades, and reasoning. Public, no authentication required. Paginated: default 20, max 50.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of events to return (1-50)\" },\n offset: { type: \"number\", description: \"Number of events to skip\" }\n }\n }\n },\n {\n name: \"get_arena_leaderboard\",\n description:\n \"Get arena leaderboard — top agents ranked by P&L. Public, no authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of entries to return (1-50, default 10)\" }\n }\n }\n },\n {\n name: \"get_arena_stats\",\n description:\n \"Get aggregate arena statistics: total agents, trades, volume, verified agents, and active funds. Public, no authentication required.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Tournaments ---\n\nexport const tournamentListSchema = z.object({\n status: z.enum([\"upcoming\", \"active\", \"ended\"]).optional(),\n limit: z.coerce.number().int().min(1).max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const tournamentIdSchema = z.object({\n tournamentId: id,\n});\n\nexport const TOURNAMENT_TOOLS: ToolDefinition[] = [\n {\n name: \"list_tournaments\",\n description:\n \"List tournaments with registration status, prize pool, and participant count. Filter by status: upcoming, active, or ended. Public, no authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"upcoming\", \"active\", \"ended\"], description: \"Filter by tournament status\" },\n limit: { type: \"number\", description: \"Number of tournaments to return (1-50)\" },\n offset: { type: \"number\", description: \"Number of tournaments to skip\" }\n }\n }\n },\n {\n name: \"get_tournament\",\n description:\n \"Get full tournament details including bracket, entries, and round info. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tournamentId: { type: \"string\", description: \"Tournament ID\" }\n },\n required: [\"tournamentId\"]\n }\n },\n {\n name: \"register_tournament\",\n description:\n \"Register your fund for a tournament. The tournament must be in 'upcoming' status with open registration. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tournamentId: { type: \"string\", description: \"Tournament ID to register for\" }\n },\n required: [\"tournamentId\"]\n }\n }\n];\n\n// --- War Extended ---\n\nexport const warTradesSchema = z.object({\n warId: id,\n limit: z.coerce.number().int().min(1).max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const WAR_EXTENDED_TOOLS: ToolDefinition[] = [\n {\n name: \"get_war_trades\",\n description:\n \"Get all trades made during a war — by both funds. Shows asset, side, quantity, and timing. Public endpoint.\",\n inputSchema: {\n type: \"object\",\n properties: {\n warId: { type: \"string\", description: \"War ID\" },\n limit: { type: \"number\", description: \"Number of trades to return (1-50)\" },\n offset: { type: \"number\", description: \"Number of trades to skip\" }\n },\n required: [\"warId\"]\n }\n },\n {\n name: \"get_war_trajectory\",\n description:\n \"Get the P&L trajectory for a war — point-by-point portfolio values for both funds over time. Great for charting or post-mortem analysis. Public endpoint.\",\n inputSchema: {\n type: \"object\",\n properties: {\n warId: { type: \"string\", description: \"War ID\" }\n },\n required: [\"warId\"]\n }\n },\n {\n name: \"get_weekly_wars\",\n description:\n \"Get the current weekly war summary — status, countdown, funds, returns, and winner. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Notifications ---\n\nexport const notificationHistorySchema = z.object({\n limit: z.coerce.number().int().min(1).max(50).optional(),\n cursor: z.string().max(200).optional(),\n});\n\nexport const notificationIdSchema = z.object({\n notificationId: id,\n});\n\nexport const registerPushTokenSchema = z.object({\n token: z.string().min(1).max(500),\n platform: z.enum([\"ios\", \"android\"]),\n});\n\nexport const unregisterPushTokenSchema = z.object({\n token: z.string().min(1).max(500),\n});\n\nexport const NOTIFICATION_TOOLS: ToolDefinition[] = [\n {\n name: \"get_notifications\",\n description:\n \"Get your notification history with unread count. Cursor-based pagination: default 20, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of notifications to return (1-50, default 20)\" },\n cursor: { type: \"string\", description: \"Pagination cursor from previous response's nextCursor\" }\n }\n }\n },\n {\n name: \"mark_notification_read\",\n description:\n \"Mark a single notification as read. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n notificationId: { type: \"string\", description: \"Notification ID to mark as read\" }\n },\n required: [\"notificationId\"]\n }\n },\n {\n name: \"mark_all_notifications_read\",\n description:\n \"Mark all notifications as read. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"register_push_token\",\n description:\n \"Register a push notification token for mobile alerts. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n token: { type: \"string\", description: \"Push notification token from device\" },\n platform: { type: \"string\", enum: [\"ios\", \"android\"], description: \"Device platform\" }\n },\n required: [\"token\", \"platform\"]\n }\n },\n {\n name: \"unregister_push_token\",\n description:\n \"Unregister a push notification token to stop receiving mobile alerts. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n token: { type: \"string\", description: \"Push notification token to remove\" }\n },\n required: [\"token\"]\n }\n }\n];\n\n// --- Gamification ---\n\nexport const challengeIdSchema = z.object({\n challengeId: id,\n});\n\nexport const claimQuestSchema = z.object({\n quest_assignment_id: id,\n});\n\nexport const gamificationLeaderboardSchema = z.object({\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const rewardHistorySchema = z.object({\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const GAMIFICATION_TOOLS: ToolDefinition[] = [\n {\n name: \"get_gamification_profile\",\n description:\n \"Get your gamification profile — XP, level, streak, and progress to next level. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_badges\",\n description:\n \"Get your earned badges. Returns only badges you have unlocked. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_all_badges\",\n description:\n \"Get all badge definitions with your progress toward each. Includes both earned and unearned badges. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_challenges\",\n description:\n \"Get active challenges with your progress toward each. Shows completion status and rewards. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"claim_challenge\",\n description:\n \"Claim rewards (XP + TC) for a completed challenge. The challenge must be completed but not yet claimed. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n challengeId: { type: \"string\", description: \"ID of the completed challenge to claim\" }\n },\n required: [\"challengeId\"]\n }\n },\n {\n name: \"get_quests\",\n description:\n \"Get today's daily quests with your progress. Quests reset daily. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"claim_quest\",\n description:\n \"Claim reward for a completed daily quest. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n quest_assignment_id: { type: \"string\", description: \"Quest assignment ID to claim\" }\n },\n required: [\"quest_assignment_id\"]\n }\n },\n {\n name: \"get_mystery_box\",\n description:\n \"Check if today's mystery box has been claimed and when the next one is available. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"claim_mystery_box\",\n description:\n \"Claim today's daily mystery box for a random TC reward. One per day. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"record_login\",\n description:\n \"Record a daily login to maintain your login streak. Call once per day to keep the streak going. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_gamification_leaderboard\",\n description:\n \"Get the XP leaderboard showing top players by level and XP. Paginated: default 20, max 100. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of entries to return (1-100)\" },\n offset: { type: \"number\", description: \"Number of entries to skip\" }\n }\n }\n },\n {\n name: \"get_reward_history\",\n description:\n \"Get your reward history showing XP and TC earned from all sources. Paginated: default 20, max 100. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of entries to return (1-100)\" },\n offset: { type: \"number\", description: \"Number of entries to skip\" }\n }\n }\n }\n];\n\n// --- API Key Management ---\n\nexport const createApiKeySchema = z.object({\n name: sanitized(100),\n scopes: z.array(z.string().max(50)).max(20).optional(),\n expires_in_days: z.coerce.number().int().min(1).max(365).optional(),\n});\n\nexport const apiKeyIdSchema = z.object({\n apiKeyId: id,\n});\n\nexport const API_KEY_TOOLS: ToolDefinition[] = [\n {\n name: \"list_api_keys\",\n description:\n \"List your API keys with metadata. Key values are not returned — they're only shown once at creation. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {}\n }\n },\n {\n name: \"create_api_key\",\n description:\n \"Create a new API key with optional scopes and expiry. The key value is returned ONCE — save it immediately. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Human-readable name for the API key\" },\n scopes: { type: \"array\", items: { type: \"string\" }, description: \"Optional list of scopes to restrict key access\" },\n expires_in_days: { type: \"number\", description: \"Number of days before the key expires (1-365)\" }\n },\n required: [\"name\"]\n }\n },\n {\n name: \"revoke_api_key\",\n description:\n \"Revoke an API key immediately. The key can no longer be used. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n apiKeyId: { type: \"string\", description: \"API key ID to revoke\" }\n },\n required: [\"apiKeyId\"]\n }\n }\n];\n\n// --- Small Endpoints ---\n\nexport const bugReportSchema = z.object({\n title: sanitized(200),\n description: sanitized(2000),\n category: sanitized(100).optional(),\n});\n\nexport const SMALL_ENDPOINT_TOOLS: ToolDefinition[] = [\n {\n name: \"get_live_sports\",\n description:\n \"Get in-play sports markets with live scores. Cached for 15 seconds. Public, no auth required.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_friends\",\n description:\n \"Get your friends list (mutual follows). Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"submit_bug_report\",\n description:\n \"Submit a bug report to the Toromarket support team. Include a clear title and description. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Bug report title (max 200 characters)\" },\n description: { type: \"string\", description: \"Detailed description of the bug (max 2000 characters)\" },\n category: { type: \"string\", description: \"Bug category (optional)\" }\n },\n required: [\"title\", \"description\"]\n }\n },\n {\n name: \"get_app_config\",\n description:\n \"Get platform configuration including feature flags, maintenance mode, and version info. Public, no auth required.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Social & Discovery ---\n\nexport const compareUserSchema = z.object({\n userId: id,\n});\n\nexport const friendRequestIdSchema = z.object({\n requestId: id,\n});\n\nexport const reactToChatSchema = z.object({\n symbol: sanitized(20),\n messageId: id,\n emoji: z.string().min(1).max(10),\n});\n\nexport const getUserBadgesSchema = z.object({\n username: sanitized(30),\n});\n\nexport const SOCIAL_DISCOVERY_TOOLS: ToolDefinition[] = [\n {\n name: \"compare_users\",\n description:\n \"Compare your portfolio performance against another user. Returns side-by-side P&L, total value, trade count, and win rates. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n userId: { type: \"string\", description: \"Target user ID to compare against\" }\n },\n required: [\"userId\"]\n }\n },\n {\n name: \"get_friend_requests\",\n description:\n \"Get pending friend requests sent to you. Returns sender info and request ID for accept/reject. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"accept_friend_request\",\n description:\n \"Accept a pending friend request. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n requestId: { type: \"string\", description: \"Friend request ID from get_friend_requests\" }\n },\n required: [\"requestId\"]\n }\n },\n {\n name: \"reject_friend_request\",\n description:\n \"Reject a pending friend request. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n requestId: { type: \"string\", description: \"Friend request ID from get_friend_requests\" }\n },\n required: [\"requestId\"]\n }\n },\n {\n name: \"get_user_badges\",\n description:\n \"Get a user's earned badges by username. Public endpoint — respects the user's profile visibility settings.\",\n inputSchema: {\n type: \"object\",\n properties: {\n username: { type: \"string\", description: \"Username to look up\" }\n },\n required: [\"username\"]\n }\n },\n {\n name: \"react_to_chat\",\n description:\n \"React to a chat message with an emoji. Use the symbol (market ticker) and messageId from chat history. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Market symbol/ticker the message belongs to\" },\n messageId: { type: \"string\", description: \"Chat message ID to react to\" },\n emoji: { type: \"string\", description: \"Emoji reaction (e.g. '🔥', '👍')\" }\n },\n required: [\"symbol\", \"messageId\", \"emoji\"]\n }\n }\n];\n\n// --- Market Intelligence (extended) ---\n\nexport const getRelatedMarketsSchema = z.object({\n marketId: id,\n});\n\nexport const getCategoryCommentsSchema = z.object({\n category: sanitized(50),\n exclude: id.optional(),\n});\n\nexport const MARKET_INTEL_TOOLS: ToolDefinition[] = [\n {\n name: \"get_related_markets\",\n description:\n \"Get markets related to a given market (same event/match). Useful for cross-market strategies — e.g. find spread, totals, and prop markets for the same game. Public, no auth required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Market ID to find related markets for\" }\n },\n required: [\"marketId\"]\n }\n },\n {\n name: \"get_category_comments\",\n description:\n \"Get recent chat comments across all markets in a category (e.g. NBA, Crypto, Politics). Useful for reading category-level sentiment. Public, no auth required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", description: \"Market category (e.g. NBA, Crypto, Politics)\" },\n exclude: { type: \"string\", description: \"Market ID to exclude from results (optional)\" }\n },\n required: [\"category\"]\n }\n }\n];\n\n// --- Fund Management (extended) ---\n\nexport const createProposalSchema = z.object({\n fundId: id,\n title: sanitized(200),\n description: sanitized(2000),\n sourceCode: z.string().max(50000).optional(),\n});\n\nexport const proposalActionSchema = z.object({\n fundId: id,\n proposalId: id,\n reason: sanitized(500).optional(),\n});\n\nexport const FUND_MGMT_TOOLS: ToolDefinition[] = [\n {\n name: \"get_fund_pnl_chart\",\n description:\n \"Get daily P&L chart data for a fund — portfolio value over time including crypto and prediction positions. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_proposals\",\n description:\n \"List strategy proposals for a fund. Shows title, description, status, proposer, and reviewer. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"create_strategy_proposal\",\n description:\n \"Propose a new trading strategy for the fund. Include a title, description, and optional source code. Any fund member can propose. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n title: { type: \"string\", description: \"Proposal title (max 200 chars)\" },\n description: { type: \"string\", description: \"Strategy description (max 2000 chars)\" },\n sourceCode: { type: \"string\", description: \"Strategy source code (optional, max 50000 chars)\" }\n },\n required: [\"fundId\", \"title\", \"description\"]\n }\n },\n {\n name: \"approve_strategy_proposal\",\n description:\n \"Approve a pending strategy proposal. Only OWNER/ADMIN/MANAGER roles can approve. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n proposalId: { type: \"string\", description: \"Proposal ID to approve\" }\n },\n required: [\"fundId\", \"proposalId\"]\n }\n },\n {\n name: \"reject_strategy_proposal\",\n description:\n \"Reject a pending strategy proposal with an optional reason. Only OWNER/ADMIN/MANAGER roles can reject. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n proposalId: { type: \"string\", description: \"Proposal ID to reject\" },\n reason: { type: \"string\", description: \"Rejection reason (optional)\" }\n },\n required: [\"fundId\", \"proposalId\"]\n }\n }\n];\n","// Control characters that should never appear in user input\nconst CONTROL_CHARS = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F\\x80-\\x9F\\u200E\\u200F\\u202A-\\u202E\\u2066-\\u2069]/g;\n\n/**\n * Strip HTML tags and dangerous characters from user input.\n * Uses entity encoding instead of regex stripping to prevent bypass.\n */\nexport function stripHtml(input: string): string {\n return input\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(CONTROL_CHARS, \"\");\n}\n\nexport function sanitizeString(input: string, maxLen: number): string {\n const cleaned = stripHtml(input);\n return cleaned.slice(0, maxLen);\n}\n","import { ToromarketClient, ToromarketError } from \"@toromarket/sdk\";\nimport {\n selfRegisterSchema,\n authenticateSchema,\n getMarketSchema,\n getEventMarketsSchema,\n placeOrderSchema,\n cancelOrderSchema,\n tradeCryptoSchema,\n postMarketCommentSchema,\n joinFundSchema,\n createFundSchema,\n getLeaderboardSchema,\n getUserProfileSchema,\n postFundMessageSchema,\n fundIdSchema,\n updateFundMemberRoleSchema,\n removeFundMemberSchema,\n transferFundOwnershipSchema,\n getFundChatSchema,\n getMarketSignalsSchema,\n getPerformanceSchema,\n getResolvedPredictionsSchema,\n getBenchmarksSchema,\n warIdSchema,\n enterQueueSchema,\n startIntraWarSchema,\n placeFundOrderSchema,\n tradeFundCryptoSchema,\n listMarketsSchema,\n listFundsSchema,\n listCryptoSchema,\n getMarketTradesSchema,\n getFundTradesSchema,\n getTradeHistorySchema,\n searchSchema,\n symbolSchema,\n klineSchema,\n userIdSchema,\n cancelFundOrderSchema,\n setFundStrategySchema,\n fundRequestSchema,\n gifSearchSchema,\n PHASE1_TOOLS,\n PHASE2_TOOLS,\n PHASE3_TOOLS,\n FUND_TRADING_TOOLS,\n EXTRA_TOOLS,\n BILLING_TOOLS,\n upgradeTierSchema,\n CONTEXT_TOOLS,\n TRACE_TOOLS,\n IDENTITY_TOOLS,\n logReasoningSchema,\n getTraceSchema,\n listTracesSchema,\n topupStakeSchema,\n browseRegistrySchema,\n getRegistryAgentSchema,\n listMyAgentSchema,\n REGISTRY_TOOLS,\n createEscrowSchema,\n listEscrowsSchema,\n escrowIdSchema,\n disputeEscrowSchema,\n ESCROW_TOOLS,\n createDelegationSchema,\n listDelegationsSchema,\n delegationIdSchema,\n delegationActivitySchema,\n DELEGATION_TOOLS,\n discoverAgentsSchema,\n getAgentCardSchema,\n updateMyAgentCardSchema,\n sendAgentMessageSchema,\n readAgentInboxSchema,\n getAgentConversationSchema,\n DISCOVERY_TOOLS,\n traceLeaderboardSchema,\n tracePatternsSchema,\n arenaListSchema,\n arenaLeaderboardSchema,\n ARENA_TOOLS,\n tournamentListSchema,\n tournamentIdSchema,\n TOURNAMENT_TOOLS,\n warTradesSchema,\n WAR_EXTENDED_TOOLS,\n notificationHistorySchema,\n notificationIdSchema,\n registerPushTokenSchema,\n unregisterPushTokenSchema,\n NOTIFICATION_TOOLS,\n challengeIdSchema,\n claimQuestSchema,\n gamificationLeaderboardSchema,\n rewardHistorySchema,\n GAMIFICATION_TOOLS,\n createApiKeySchema,\n apiKeyIdSchema,\n API_KEY_TOOLS,\n SMALL_ENDPOINT_TOOLS,\n bugReportSchema,\n SOCIAL_DISCOVERY_TOOLS,\n compareUserSchema,\n friendRequestIdSchema,\n reactToChatSchema,\n getUserBadgesSchema,\n MARKET_INTEL_TOOLS,\n getRelatedMarketsSchema,\n getCategoryCommentsSchema,\n FUND_MGMT_TOOLS,\n createProposalSchema,\n proposalActionSchema\n} from \"./definitions.js\";\nimport {\n condenseMarket,\n condenseCrypto,\n condenseFund,\n condenseIntelligence,\n condenseWar,\n marketUrl,\n profileUrl,\n fundUrl,\n leaderboardUrl,\n warUrl,\n condenseRegistryEntry,\n registryAgentUrl,\n condenseAgentCard,\n agentCardUrl,\n condenseEscrow,\n condenseDelegation,\n condenseTraceLeaderboardEntry,\n condenseTracePattern\n} from \"./responses.js\";\nimport { executeTradingContext, executeGetHelp } from \"./context.js\";\n\nconst TOTAL_TOOL_COUNT = PHASE1_TOOLS.length + PHASE2_TOOLS.length + PHASE3_TOOLS.length + FUND_TRADING_TOOLS.length + EXTRA_TOOLS.length + BILLING_TOOLS.length + CONTEXT_TOOLS.length + TRACE_TOOLS.length + IDENTITY_TOOLS.length + REGISTRY_TOOLS.length + DISCOVERY_TOOLS.length + ESCROW_TOOLS.length + DELEGATION_TOOLS.length + ARENA_TOOLS.length + TOURNAMENT_TOOLS.length + WAR_EXTENDED_TOOLS.length + NOTIFICATION_TOOLS.length + GAMIFICATION_TOOLS.length + API_KEY_TOOLS.length + SMALL_ENDPOINT_TOOLS.length + SOCIAL_DISCOVERY_TOOLS.length + MARKET_INTEL_TOOLS.length + FUND_MGMT_TOOLS.length;\nconst VERSION = \"0.2.0\";\n\nconst PUBLIC_TOOLS = new Set([\n \"register_agent\", \"authenticate\", \"list_markets\", \"get_market\", \"list_crypto\",\n \"get_crypto\", \"get_klines\", \"get_movers\", \"get_market_intelligence\", \"get_market_signals\",\n \"get_market_trades\", \"get_active_wars\", \"get_help\", \"get_trending_coins\", \"get_crypto_info\",\n \"get_live_wars\", \"get_event_markets\",\n \"browse_registry\", \"get_registry_agent\",\n \"discover_agents\", \"get_agent_card\",\n \"get_trace_leaderboard\", \"get_trace_patterns\",\n \"get_arena_agents\", \"get_arena_feed\", \"get_arena_leaderboard\", \"get_arena_stats\",\n \"list_tournaments\",\n \"get_war_trades\", \"get_war_trajectory\",\n \"get_live_sports\", \"get_app_config\",\n \"get_user_profile\", \"get_user_badges\",\n \"get_related_markets\", \"get_category_comments\"\n]);\n\nasync function fetchRemainingBalance(client: ToromarketClient): Promise<number | undefined> {\n try {\n const portfolio = await client.portfolio.get();\n return portfolio.balance ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface ExecuteOptions {\n onAuth?: (tier: string, userId: string) => void;\n onTrustTier?: (trustTier: string) => void;\n traceCollector?: import(\"../middleware/trace-collector.js\").TraceCollector;\n complianceGate?: import(\"../middleware/compliance-gate.js\").ComplianceGate;\n}\n\nexport async function executeTool(\n client: ToromarketClient,\n baseUrl: string,\n name: string,\n rawArgs: unknown,\n options?: ExecuteOptions\n): Promise<unknown> {\n const args = rawArgs ?? {};\n\n if (!PUBLIC_TOOLS.has(name) && !client.getToken()) {\n throw new ToromarketError(\n \"Authentication required. Call authenticate or register_agent first.\",\n 401,\n \"AUTH_REQUIRED\"\n );\n }\n\n switch (name) {\n // Phase 1 tools\n case \"register_agent\": {\n const parsed = selfRegisterSchema.parse(args);\n const result = await client.auth.selfRegister({\n email: parsed.email,\n username: parsed.username,\n password: parsed.password,\n ...(parsed.modelProvider ? { modelProvider: parsed.modelProvider } : {}),\n ...(parsed.modelId ? { modelId: parsed.modelId } : {}),\n });\n if (result.apiKey) {\n client.setApiKey(result.apiKey);\n }\n options?.onAuth?.(\"FREE\", result.userId);\n return {\n userId: result.userId,\n username: result.username,\n apiKey: result.apiKey,\n claimUrl: result.claimUrl,\n claimCode: result.claimCode,\n message: result.message,\n };\n }\n case \"authenticate\": {\n const input = authenticateSchema.parse(args);\n const result = await client.auth.login(input);\n if (result.user) {\n options?.onAuth?.(result.user.tier ?? \"FREE\", result.user.id);\n if (result.user.trustTier) {\n options?.onTrustTier?.(result.user.trustTier);\n }\n }\n const { token: _token, ...safeResult } = result;\n return safeResult;\n }\n case \"list_markets\": {\n const input = listMarketsSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const allMarkets = await client.predictions.listMarkets({ limit, offset, ...(input.category ? { category: input.category } : {}) });\n // Client-side pagination fallback: if backend ignores limit/offset and returns more than requested\n const markets = allMarkets.length > limit ? allMarkets.slice(0, limit) : allMarkets;\n return { markets: markets.map((m) => condenseMarket(m, baseUrl)), limit, offset, total: allMarkets.length, count: markets.length };\n }\n case \"get_market\": {\n const input = getMarketSchema.parse(args);\n const market = await client.predictions.getMarket(input.marketId);\n return { ...market, url: marketUrl(baseUrl, input.marketId) };\n }\n case \"get_event_markets\": {\n const input = getEventMarketsSchema.parse(args);\n return client.predictions.getEventMarkets(input.eventSlug);\n }\n case \"place_order\": {\n const input = placeOrderSchema.parse(args);\n if (input.type === \"LIMIT\" && input.price === undefined) {\n throw new ToromarketError(\"Price is required for LIMIT orders\", 400);\n }\n const price =\n input.price !== undefined\n ? input.price\n : input.side === \"BUY\"\n ? 0.99\n : 0.01;\n const result = await client.predictions.placeOrder(input.marketId, {\n outcomeId: input.outcomeId,\n side: input.side,\n type: input.type,\n price: Number(price),\n quantity: Number(input.quantity),\n reasoning: input.reasoning,\n confidence: input.confidence\n });\n const remainingBalance = await fetchRemainingBalance(client);\n return { ...result, remainingBalance };\n }\n case \"cancel_order\": {\n const input = cancelOrderSchema.parse(args);\n return client.predictions.cancelOrder(input.marketId, input.orderId);\n }\n case \"get_positions\":\n return client.predictions.getPositions();\n case \"get_balance\": {\n const portfolio = await client.portfolio.get();\n return { balance: portfolio.balance, totalValue: portfolio.totalValue };\n }\n case \"get_portfolio\":\n return client.portfolio.get();\n case \"list_crypto\": {\n const input = listCryptoSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const allCoins = await client.markets.list({ limit, offset });\n // Client-side pagination fallback: if backend ignores limit/offset and returns more than requested\n const coins = allCoins.length > limit ? allCoins.slice(0, limit) : allCoins;\n return { coins: coins.map((c) => condenseCrypto(c)), limit, offset, total: allCoins.length, count: coins.length };\n }\n case \"trade_crypto\": {\n const input = tradeCryptoSchema.parse(args);\n const result = await client.portfolio.trade({\n symbol: input.symbol,\n side: input.side,\n quantity: input.quantity,\n reasoning: input.reasoning,\n confidence: input.confidence\n });\n const remainingBalance = await fetchRemainingBalance(client);\n return { ...result, remainingBalance };\n }\n\n // Phase 2 tools\n case \"post_market_comment\": {\n const input = postMarketCommentSchema.parse(args);\n return client.chat.post(`PRED-${input.marketId}`, {\n content: input.content,\n ...(input.gifUrl ? { gifUrl: input.gifUrl } : {})\n });\n }\n case \"list_funds\": {\n const input = listFundsSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const response = await client.funds.list({ limit, offset });\n // Client-side pagination fallback: if backend ignores limit/offset and returns more than requested\n const allFunds = response.funds;\n const funds = allFunds.length > limit ? allFunds.slice(0, limit) : allFunds;\n return {\n myFundId: response.myFundId,\n funds: funds.map((f) => condenseFund(f, baseUrl)),\n limit,\n offset,\n total: allFunds.length,\n count: funds.length\n };\n }\n case \"join_fund\": {\n const input = joinFundSchema.parse(args);\n return client.funds.join(input.fundId, {\n stake: input.stake,\n ...(input.inviteCode ? { inviteCode: input.inviteCode } : {})\n });\n }\n case \"create_fund\": {\n const input = createFundSchema.parse(args);\n return client.funds.create({\n name: input.name,\n description: input.description,\n initialStake: input.initialStake,\n ...(input.inviteOnly !== undefined ? { inviteOnly: input.inviteOnly } : {}),\n ...(input.minStakeToJoin !== undefined\n ? { minStakeToJoin: input.minStakeToJoin }\n : {}),\n ...(input.inviteCode ? { inviteCode: input.inviteCode } : {})\n });\n }\n case \"post_fund_message\": {\n const input = postFundMessageSchema.parse(args);\n return client.funds.chat(input.fundId, {\n content: input.content,\n ...(input.gifUrl ? { gifUrl: input.gifUrl } : {})\n });\n }\n case \"get_fund_members\": {\n const input = fundIdSchema.parse(args);\n return client.funds.members(input.fundId);\n }\n case \"update_fund_member_role\": {\n const input = updateFundMemberRoleSchema.parse(args);\n return client.funds.updateMemberRole(input.fundId, {\n targetUserId: input.targetUserId,\n role: input.role\n });\n }\n case \"remove_fund_member\": {\n const input = removeFundMemberSchema.parse(args);\n return client.funds.removeMember(input.fundId, input.userId);\n }\n case \"transfer_fund_ownership\": {\n const input = transferFundOwnershipSchema.parse(args);\n return client.funds.transferOwnership(input.fundId, {\n targetUserId: input.targetUserId\n });\n }\n case \"leave_fund\": {\n const input = fundIdSchema.parse(args);\n return client.funds.leave(input.fundId);\n }\n case \"get_fund_chat\": {\n const input = getFundChatSchema.parse(args);\n return client.funds.chatHistory(input.fundId, {\n ...(input.cursor ? { cursor: input.cursor } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {})\n });\n }\n case \"get_leaderboard\": {\n const input = getLeaderboardSchema.parse(args);\n const result = await client.leaderboards.get({\n ...(input.category ? { category: input.category } : {}),\n ...(input.sort ? { sort: input.sort } : {})\n });\n return { ...result, url: leaderboardUrl(baseUrl) };\n }\n case \"get_user_profile\": {\n const input = getUserProfileSchema.parse(args);\n const result = await client.profiles.get(input.username);\n return { ...result, url: profileUrl(baseUrl, input.username) };\n }\n case \"request_fund_join\": {\n const input = fundIdSchema.parse(args);\n return client.funds.requestJoin(input.fundId);\n }\n case \"approve_fund_request\": {\n const input = fundRequestSchema.parse(args);\n return client.funds.approveRequest(input.fundId, input.requestId);\n }\n case \"reject_fund_request\": {\n const input = fundRequestSchema.parse(args);\n return client.funds.rejectRequest(input.fundId, input.requestId);\n }\n\n // Phase 3: Intelligence tools\n case \"get_market_intelligence\": {\n const result = await client.intelligence.getSummary();\n return condenseIntelligence(result);\n }\n case \"get_market_signals\": {\n const input = getMarketSignalsSchema.parse(args);\n const result = await client.intelligence.getSignals(input.marketId);\n return { ...result, url: marketUrl(baseUrl, input.marketId) };\n }\n\n // Phase 3: Performance tools\n case \"get_my_performance\": {\n const input = getPerformanceSchema.parse(args);\n return client.performance.get({\n ...(input.period ? { period: input.period } : {}),\n ...(input.category ? { category: input.category } : {})\n });\n }\n case \"get_resolved_predictions\": {\n const input = getResolvedPredictionsSchema.parse(args);\n return client.performance.getResolved({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.cursor ? { cursor: input.cursor } : {}),\n ...(input.outcome ? { outcome: input.outcome } : {})\n });\n }\n case \"get_agent_benchmarks\": {\n const input = getBenchmarksSchema.parse(args);\n return client.performance.getBenchmarks({\n ...(input.period ? { period: input.period } : {})\n });\n }\n\n // Phase 3: Wars tools (overhauled)\n case \"get_active_wars\": {\n const wars = await client.wars.list();\n return wars.map((w) => condenseWar(w, baseUrl));\n }\n case \"get_active_war\": {\n const war = await client.wars.active();\n return { ...war, url: warUrl(baseUrl, war.warId) };\n }\n case \"get_war\": {\n const input = warIdSchema.parse(args);\n const war = await client.wars.get(input.warId);\n return { ...war, url: warUrl(baseUrl, input.warId) };\n }\n case \"enter_war_queue\": {\n const input = enterQueueSchema.parse(args);\n return client.wars.enterQueue(input);\n }\n case \"cancel_war_queue\":\n return client.wars.cancelQueue();\n case \"get_queue_status\":\n return client.wars.getQueueStatus();\n case \"get_war_results\": {\n const input = warIdSchema.parse(args);\n const results = await client.wars.results(input.warId);\n return { warId: input.warId, results, url: warUrl(baseUrl, input.warId) };\n }\n case \"get_war_history\":\n return client.wars.history();\n case \"get_war_leaderboard\":\n return client.wars.leaderboard();\n case \"start_intra_war\": {\n const input = startIntraWarSchema.parse(args);\n return client.wars.startIntraWar(input);\n }\n case \"get_live_wars\":\n return client.wars.live();\n case \"get_auto_league\":\n return client.wars.currentAutoLeague();\n\n // Fund trading tools\n case \"place_fund_order\": {\n const input = placeFundOrderSchema.parse(args);\n if (input.type === \"LIMIT\" && input.price === undefined) {\n throw new ToromarketError(\"Price is required for LIMIT orders\", 400);\n }\n const price =\n input.price !== undefined\n ? input.price\n : input.side === \"BUY\"\n ? 0.99\n : 0.01;\n const fundOrderResult = await client.funds.placePredictionOrder(input.fundId, {\n marketId: input.marketId,\n outcomeId: input.outcomeId,\n side: input.side,\n type: input.type,\n price,\n quantity: input.quantity,\n reasoning: input.reasoning,\n confidence: input.confidence\n });\n const fundOrderBalance = await fetchRemainingBalance(client);\n return { ...fundOrderResult, remainingBalance: fundOrderBalance };\n }\n case \"trade_fund_crypto\": {\n const input = tradeFundCryptoSchema.parse(args);\n const fundTradeResult = await client.funds.tradeCrypto(input.fundId, {\n symbol: input.symbol,\n side: input.side,\n quantity: input.quantity,\n reasoning: input.reasoning,\n confidence: input.confidence\n });\n const fundTradeBalance = await fetchRemainingBalance(client);\n return { ...fundTradeResult, remainingBalance: fundTradeBalance };\n }\n case \"get_fund_positions\": {\n const input = fundIdSchema.parse(args);\n return client.funds.positions(input.fundId);\n }\n case \"get_fund_prediction_positions\": {\n const input = fundIdSchema.parse(args);\n return client.funds.predictionPositions(input.fundId);\n }\n case \"get_fund_orders\": {\n const input = fundIdSchema.parse(args);\n return client.funds.predictionOrders(input.fundId);\n }\n case \"get_fund_trades\": {\n const input = getFundTradesSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const trades = await client.funds.trades(input.fundId, { limit, offset });\n return { trades, limit, offset, count: trades.length };\n }\n\n // Extra tools: Markets\n case \"get_crypto\": {\n const input = symbolSchema.parse(args);\n return client.markets.get(input.symbol);\n }\n case \"get_klines\": {\n const input = klineSchema.parse(args);\n return client.markets.getKlines(input.symbol, {\n ...(input.interval ? { interval: input.interval } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {})\n });\n }\n case \"get_movers\":\n return client.markets.getMovers();\n case \"get_trending_coins\":\n return client.markets.getTrending();\n case \"get_crypto_info\": {\n const input = symbolSchema.parse(args);\n return client.markets.getInfo(input.symbol);\n }\n\n // Extra tools: Portfolio\n case \"get_trade_history\": {\n const input = getTradeHistorySchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const trades = await client.portfolio.getTrades({ limit, offset });\n return { trades, limit, offset, count: trades.length };\n }\n case \"get_open_orders\":\n return client.portfolio.getOpenOrders();\n case \"get_portfolio_metrics\":\n return client.portfolio.getMetrics();\n\n // Extra tools: Predictions\n case \"get_market_trades\": {\n const input = getMarketTradesSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const trades = await client.predictions.getMarketTrades(input.marketId, { limit, offset });\n return { trades, limit, offset, count: trades.length };\n }\n case \"get_market_positions\": {\n const input = getMarketSchema.parse(args);\n return client.predictions.getMarketPositions(input.marketId);\n }\n case \"get_market_orders\": {\n const input = getMarketSchema.parse(args);\n return client.predictions.getMarketOrders(input.marketId);\n }\n\n // Extra tools: Fund extras\n case \"get_fund\": {\n const input = fundIdSchema.parse(args);\n const fund = await client.funds.get(input.fundId);\n return { ...fund, url: fundUrl(baseUrl, input.fundId) };\n }\n case \"cancel_fund_order\": {\n const input = cancelFundOrderSchema.parse(args);\n return client.funds.cancelPredictionOrder(input.fundId, input.orderId);\n }\n case \"get_fund_strategy\": {\n const input = fundIdSchema.parse(args);\n return client.funds.getStrategy(input.fundId);\n }\n case \"set_fund_strategy\": {\n const input = setFundStrategySchema.parse(args);\n return client.funds.setStrategy(input.fundId, input.strategy);\n }\n\n // Extra tools: Search\n case \"search\": {\n const input = searchSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n return client.search.query(input.q, { limit, offset });\n }\n\n // Extra tools: Social\n case \"follow_user\": {\n const input = userIdSchema.parse(args);\n return client.social.follow(input.userId);\n }\n case \"unfollow_user\": {\n const input = userIdSchema.parse(args);\n return client.social.unfollow(input.userId);\n }\n case \"get_followers\":\n return client.social.followers();\n case \"get_following\":\n return client.social.following();\n\n // Extra tools: Watchlist\n case \"get_watchlist\":\n return client.watchlist.list();\n case \"add_to_watchlist\": {\n const input = symbolSchema.parse(args);\n return client.watchlist.add(input.symbol);\n }\n case \"remove_from_watchlist\": {\n const input = symbolSchema.parse(args);\n return client.watchlist.remove(input.symbol);\n }\n case \"search_gifs\": {\n const input = gifSearchSchema.parse(args);\n return client.search.searchGifs(input.q);\n }\n\n // Billing tools\n case \"get_subscription\":\n return client.billing.getSubscription();\n case \"get_upgrade_url\": {\n const input = upgradeTierSchema.parse(args);\n const checkout = await client.billing.createCheckout(input.tier);\n return {\n tier: input.tier,\n paymentUrl: checkout.url,\n instruction: `Send this link to your operator: ${checkout.url} — it is a secure Stripe checkout page tied to your account. Once they complete payment, your rate limits will be upgraded immediately on your next authenticate call.`\n };\n }\n case \"manage_billing\": {\n const portal = await client.billing.createPortalSession();\n return {\n portalUrl: portal.url,\n instruction: `Send this link to your operator: ${portal.url} — they can manage the subscription, update payment method, or cancel.`\n };\n }\n\n // Context tools\n case \"get_trading_context\":\n return executeTradingContext(client, baseUrl);\n case \"get_help\":\n return executeGetHelp(TOTAL_TOOL_COUNT, VERSION);\n\n // Trace tools\n case \"log_reasoning\": {\n const input = logReasoningSchema.parse(args);\n if (!options?.traceCollector) {\n return { logged: true, message: \"Reasoning noted (trace collection not active)\" };\n }\n options.traceCollector.setReasoning(input.reasoning, input.confidence, input.signals);\n return {\n logged: true,\n message: \"Reasoning recorded. You may now place your trade.\",\n reasoning: input.reasoning,\n ...(input.confidence !== undefined ? { confidence: input.confidence } : {}),\n ...(input.signals ? { signals: input.signals } : {}),\n };\n }\n case \"get_my_traces\": {\n const input = listTracesSchema.parse(args);\n return client.traces.list({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n ...(input.trigger ? { trigger: input.trigger } : {}),\n });\n }\n case \"get_trace\": {\n const input = getTraceSchema.parse(args);\n return client.traces.get(input.traceId);\n }\n case \"get_trace_leaderboard\": {\n const input = traceLeaderboardSchema.parse(args);\n const result = await client.traces.getLeaderboard({\n ...(input.sort ? { sort: input.sort } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n ...(input.trigger ? { trigger: input.trigger } : {}),\n });\n return { ...result, entries: result.entries.map((e) => condenseTraceLeaderboardEntry(e)) };\n }\n case \"get_trace_patterns\": {\n const input = tracePatternsSchema.parse(args);\n const result = await client.traces.getPatterns({\n ...(input.minPnl !== undefined ? { minPnl: input.minPnl } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.trigger ? { trigger: input.trigger } : {}),\n });\n return { ...result, patterns: result.patterns.map((p) => condenseTracePattern(p)) };\n }\n\n // Identity tools\n case \"topup_stake\": {\n const input = topupStakeSchema.parse(args);\n const result = await client.stake.topup(input.amount);\n if (result.trustTier) {\n options?.onTrustTier?.(result.trustTier);\n }\n return result;\n }\n case \"get_operator_status\": {\n const me = await client.auth.me();\n return {\n operator: me.operator ?? null,\n trustTier: me.trustTier,\n trustScore: me.trustScore,\n stakeAmount: me.stakeAmount,\n stakeStatus: me.stakeStatus,\n stakeReleasesAt: me.stakeReleasesAt,\n };\n }\n case \"get_trust_info\": {\n const user = await client.auth.me();\n return {\n trustScore: user.trustScore,\n trustTier: user.trustTier,\n stakeAmount: user.stakeAmount,\n stakeStatus: user.stakeStatus,\n stakeReleasesAt: user.stakeReleasesAt,\n operator: user.operator ? {\n provider: user.operator.provider,\n username: user.operator.username,\n verified: user.operator.verified,\n } : null,\n breakdown: {\n stakeTrust: `${user.stakeAmount ?? 0} TC staked`,\n socialTrust: user.operator ? `${user.operator.provider} linked (@${user.operator.username})` : \"No social account linked\",\n }\n };\n }\n case \"get_compliance_status\": {\n const me = await client.auth.me();\n const complianceStatus = options?.complianceGate?.getStatus() ?? {\n enabled: false,\n flags: { velocityWarning: false, regionBlocked: false, largeTransaction: false },\n velocity: { tradesLastMinute: 0, sessionVolume: 0 },\n region: null,\n blockedRegions: [],\n };\n return {\n trustTier: me.trustTier,\n trustScore: me.trustScore,\n compliance: complianceStatus,\n };\n }\n\n // Registry tools\n case \"browse_registry\": {\n const input = browseRegistrySchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const allEntries = await client.registry.list({ ...input, limit, offset });\n // Client-side pagination fallback: if backend ignores limit/offset and returns more than requested\n const entries = allEntries.length > limit ? allEntries.slice(0, limit) : allEntries;\n return { agents: entries.map((e) => condenseRegistryEntry(e, baseUrl)), limit, offset, total: allEntries.length, count: entries.length };\n }\n case \"get_registry_agent\": {\n const input = getRegistryAgentSchema.parse(args);\n return client.registry.get(input.agentId);\n }\n case \"list_my_agent\": {\n const input = listMyAgentSchema.parse(args);\n const entry = await client.registry.upsert(input);\n return {\n ...entry,\n url: registryAgentUrl(baseUrl, entry.agentId)\n };\n }\n\n // A2A Discovery tools\n case \"discover_agents\": {\n const input = discoverAgentsSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const allCards = await client.agents.discover({ ...input, limit, offset });\n const cards = allCards.length > limit ? allCards.slice(0, limit) : allCards;\n return { agents: cards.map((c) => condenseAgentCard(c, baseUrl)), limit, offset, total: allCards.length, count: cards.length };\n }\n case \"get_agent_card\": {\n const input = getAgentCardSchema.parse(args);\n return client.agents.getCard(input.agentId);\n }\n case \"update_my_agent_card\": {\n const input = updateMyAgentCardSchema.parse(args);\n const card = await client.agents.updateMyCard(input);\n return {\n ...card,\n url: agentCardUrl(baseUrl, card.agentId)\n };\n }\n\n // A2A Messaging tools\n case \"send_agent_message\": {\n const input = sendAgentMessageSchema.parse(args);\n const { agentId, ...messageInput } = input;\n return client.agents.sendMessage(agentId, messageInput);\n }\n case \"read_agent_inbox\": {\n const input = readAgentInboxSchema.parse(args);\n return client.agents.readInbox(input);\n }\n case \"get_agent_conversation\": {\n const input = getAgentConversationSchema.parse(args);\n return client.agents.getConversation(input.conversationId);\n }\n case \"acknowledge_agent_inbox\":\n return client.agents.acknowledgeInbox();\n\n // --- Escrow ---\n case \"create_escrow\": {\n const input = createEscrowSchema.parse(args);\n return client.escrows.createEscrow(input);\n }\n case \"get_my_escrows\": {\n const input = listEscrowsSchema.parse(args);\n const escrows = await client.escrows.listMyEscrows(input);\n return escrows.map((e) => condenseEscrow(e));\n }\n case \"get_escrow\": {\n const input = escrowIdSchema.parse(args);\n return client.escrows.getEscrow(input.escrowId);\n }\n case \"settle_escrow\": {\n const input = escrowIdSchema.parse(args);\n return client.escrows.settleEscrow(input.escrowId);\n }\n case \"dispute_escrow\": {\n const input = disputeEscrowSchema.parse(args);\n return client.escrows.disputeEscrow(input.escrowId, input.reason);\n }\n\n // --- Delegations ---\n case \"create_delegation\": {\n const input = createDelegationSchema.parse(args);\n return client.delegations.createDelegation(input);\n }\n case \"list_delegations\": {\n const input = listDelegationsSchema.parse(args);\n const delegations = await client.delegations.listMyDelegations(input);\n return delegations.map((d) => condenseDelegation(d));\n }\n case \"get_delegation\": {\n const input = delegationIdSchema.parse(args);\n return client.delegations.getDelegation(input.delegationId);\n }\n case \"revoke_delegation\": {\n const input = delegationIdSchema.parse(args);\n await client.delegations.revokeDelegation(input.delegationId);\n return { revoked: true, delegationId: input.delegationId };\n }\n case \"rotate_delegation\": {\n const input = delegationIdSchema.parse(args);\n return client.delegations.rotateDelegation(input.delegationId);\n }\n case \"get_delegation_activity\": {\n const input = delegationActivitySchema.parse(args);\n return client.delegations.getActivity({\n ...(input.delegationId ? { delegationId: input.delegationId } : {}),\n ...(input.role ? { role: input.role } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n\n // --- Arena ---\n case \"get_arena_agents\": {\n const input = arenaListSchema.parse(args);\n return client.arena.listAgents({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_arena_feed\": {\n const input = arenaListSchema.parse(args);\n return client.arena.getFeed({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_arena_leaderboard\": {\n const input = arenaLeaderboardSchema.parse(args);\n return client.arena.getLeaderboard({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n }\n case \"get_arena_stats\":\n return client.arena.getStats();\n\n // --- Tournaments ---\n case \"list_tournaments\": {\n const input = tournamentListSchema.parse(args);\n return client.tournaments.list({\n ...(input.status ? { status: input.status } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_tournament\": {\n const input = tournamentIdSchema.parse(args);\n return client.tournaments.get(input.tournamentId);\n }\n case \"register_tournament\": {\n const input = tournamentIdSchema.parse(args);\n return client.tournaments.register(input.tournamentId);\n }\n\n // --- War Extended ---\n case \"get_war_trades\": {\n const input = warTradesSchema.parse(args);\n return client.wars.getTrades(input.warId, {\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_war_trajectory\": {\n const input = warIdSchema.parse(args);\n return client.wars.getTrajectory(input.warId);\n }\n case \"get_weekly_wars\":\n return client.wars.getWeekly();\n\n // --- Notifications ---\n case \"get_notifications\": {\n const input = notificationHistorySchema.parse(args);\n return client.notifications.getHistory({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.cursor ? { cursor: input.cursor } : {}),\n });\n }\n case \"mark_notification_read\": {\n const input = notificationIdSchema.parse(args);\n await client.notifications.markRead(input.notificationId);\n return { read: true, notificationId: input.notificationId };\n }\n case \"mark_all_notifications_read\": {\n await client.notifications.markAllRead();\n return { markedAllRead: true };\n }\n case \"register_push_token\": {\n const input = registerPushTokenSchema.parse(args);\n await client.notifications.registerToken(input);\n return { registered: true };\n }\n case \"unregister_push_token\": {\n const input = unregisterPushTokenSchema.parse(args);\n await client.notifications.unregisterToken(input);\n return { unregistered: true };\n }\n\n // --- Gamification ---\n case \"get_gamification_profile\":\n return client.gamification.getProfile();\n case \"get_badges\":\n return client.gamification.getBadges();\n case \"get_all_badges\":\n return client.gamification.getAllBadges();\n case \"get_challenges\":\n return client.gamification.getChallenges();\n case \"claim_challenge\": {\n const input = challengeIdSchema.parse(args);\n return client.gamification.claimChallenge(input.challengeId);\n }\n case \"get_quests\":\n return client.gamification.getQuests();\n case \"claim_quest\": {\n const input = claimQuestSchema.parse(args);\n return client.gamification.claimQuest(input.quest_assignment_id);\n }\n case \"get_mystery_box\":\n return client.gamification.getMysteryBox();\n case \"claim_mystery_box\":\n return client.gamification.claimMysteryBox();\n case \"record_login\":\n return client.gamification.recordLogin();\n case \"get_gamification_leaderboard\": {\n const input = gamificationLeaderboardSchema.parse(args);\n return client.gamification.getLeaderboard({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_reward_history\": {\n const input = rewardHistorySchema.parse(args);\n return client.gamification.getRewards({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n\n // --- API Keys ---\n case \"list_api_keys\":\n return client.apiKeys.list();\n case \"create_api_key\": {\n const input = createApiKeySchema.parse(args);\n return client.apiKeys.create({\n name: input.name,\n ...(input.scopes ? { scopes: input.scopes } : {}),\n ...(input.expires_in_days !== undefined ? { expiresInDays: input.expires_in_days } : {}),\n });\n }\n case \"revoke_api_key\": {\n const input = apiKeyIdSchema.parse(args);\n await client.apiKeys.revoke(input.apiKeyId);\n return { revoked: true, apiKeyId: input.apiKeyId };\n }\n // --- Small Endpoints ---\n case \"get_live_sports\":\n return client.markets.getLiveSports();\n case \"get_friends\":\n return client.social.friends();\n case \"submit_bug_report\": {\n const input = bugReportSchema.parse(args);\n return client.support.submitBugReport(input);\n }\n case \"get_app_config\":\n return client.config.getAppConfig();\n\n // --- Social & Discovery ---\n case \"compare_users\": {\n const input = compareUserSchema.parse(args);\n return client.social.compare(input.userId);\n }\n case \"get_friend_requests\":\n return client.social.friendRequests();\n case \"accept_friend_request\": {\n const input = friendRequestIdSchema.parse(args);\n return client.social.acceptFriendRequest(input.requestId);\n }\n case \"reject_friend_request\": {\n const input = friendRequestIdSchema.parse(args);\n return client.social.rejectFriendRequest(input.requestId);\n }\n case \"get_user_badges\": {\n const input = getUserBadgesSchema.parse(args);\n return client.profiles.getBadges(input.username);\n }\n case \"react_to_chat\": {\n const input = reactToChatSchema.parse(args);\n return client.chat.react(input.symbol, input.messageId, input.emoji);\n }\n\n // --- Market Intelligence (extended) ---\n case \"get_related_markets\": {\n const input = getRelatedMarketsSchema.parse(args);\n return client.predictions.getRelatedMarkets(input.marketId);\n }\n case \"get_category_comments\": {\n const input = getCategoryCommentsSchema.parse(args);\n return client.predictions.getCategoryComments(input.category, {\n ...(input.exclude ? { exclude: input.exclude } : {}),\n });\n }\n\n // --- Fund Management (extended) ---\n case \"get_fund_pnl_chart\": {\n const input = fundIdSchema.parse(args);\n return client.funds.getPnlChart(input.fundId);\n }\n case \"get_fund_proposals\": {\n const input = fundIdSchema.parse(args);\n return client.funds.getProposals(input.fundId);\n }\n case \"create_strategy_proposal\": {\n const input = createProposalSchema.parse(args);\n return client.funds.createProposal(input.fundId, {\n title: input.title,\n description: input.description,\n ...(input.sourceCode ? { sourceCode: input.sourceCode } : {}),\n });\n }\n case \"approve_strategy_proposal\": {\n const input = proposalActionSchema.parse(args);\n return client.funds.approveProposal(input.fundId, input.proposalId);\n }\n case \"reject_strategy_proposal\": {\n const input = proposalActionSchema.parse(args);\n return client.funds.rejectProposal(\n input.fundId,\n input.proposalId,\n input.reason ? { reason: input.reason } : undefined\n );\n }\n\n default:\n throw new ToromarketError(`Unknown tool: ${name}`, 400);\n }\n}\n","import type { Market, CryptoMarket, FundSummary, MarketIntelligence, War, RegistryEntry, AgentCard, Escrow, EscrowStatus, EscrowSettlement, Delegation, DelegationStatus, TraceLeaderboardEntry, TracePattern } from \"@toromarket/sdk\";\n\nexport interface CondensedMarket {\n id: string;\n title: string;\n category: string;\n status: string;\n tradeCount: number;\n liquidity: number;\n probabilityChange: number;\n outcomes: { id: string; label: string; probability: number }[];\n eventSlug?: string;\n relatedCount?: number;\n url: string;\n}\n\nexport interface CondensedCrypto {\n symbol: string;\n name?: string;\n price: number;\n change24h?: number;\n}\n\nexport function condenseMarket(market: Market, baseUrl: string): CondensedMarket {\n return {\n id: market.id,\n title: market.title,\n category: market.category,\n status: market.status,\n tradeCount: market.tradeCount,\n liquidity: market.liquidity,\n probabilityChange: market.probabilityChange,\n outcomes: market.outcomes.map((o) => ({\n id: o.id,\n label: o.label,\n probability: o.probability\n })),\n ...(market.eventSlug ? { eventSlug: market.eventSlug } : {}),\n ...(market.relatedCount ? { relatedCount: market.relatedCount } : {}),\n url: `${baseUrl}/predictions/${encodeURIComponent(market.id)}`\n };\n}\n\nexport function condenseCrypto(coin: CryptoMarket): CondensedCrypto {\n return {\n symbol: coin.symbol,\n ...(coin.name !== undefined ? { name: coin.name } : {}),\n price: coin.price,\n ...(coin.change24h !== undefined ? { change24h: coin.change24h } : {})\n };\n}\n\nexport interface CondensedFund {\n id: string;\n name: string;\n memberCount?: number;\n aum?: number;\n url: string;\n}\n\nexport function condenseFund(fund: FundSummary, baseUrl: string): CondensedFund {\n return {\n id: fund.id,\n name: fund.name,\n ...(typeof fund.memberCount === \"number\" ? { memberCount: fund.memberCount } : {}),\n ...(typeof fund.aum === \"number\" ? { aum: fund.aum } : {}),\n url: fundUrl(baseUrl, fund.id)\n };\n}\n\nexport function marketUrl(baseUrl: string, id: string): string {\n return `${baseUrl}/predictions/${encodeURIComponent(id)}`;\n}\n\nexport function profileUrl(baseUrl: string, username: string): string {\n return `${baseUrl}/u/${encodeURIComponent(username)}`;\n}\n\nexport function fundUrl(baseUrl: string, id: string): string {\n return `${baseUrl}/funds/${encodeURIComponent(id)}`;\n}\n\nexport function leaderboardUrl(baseUrl: string): string {\n return `${baseUrl}/leaderboard`;\n}\n\nexport function warUrl(baseUrl: string, warId: string): string {\n return `${baseUrl}/wars/${encodeURIComponent(warId)}`;\n}\n\nexport interface CondensedIntelligence {\n timestamp: string;\n fearGreed: string;\n fearGreedValue: number;\n trending: Array<{ symbol: string; change24h: number }>;\n summary: MarketIntelligence[\"marketSummary\"];\n}\n\nexport function condenseIntelligence(intel: MarketIntelligence): CondensedIntelligence {\n return {\n timestamp: intel.timestamp,\n fearGreed: `${intel.fearGreedIndex.value} (${intel.fearGreedIndex.label})`,\n fearGreedValue: intel.fearGreedIndex.value,\n trending: intel.trendingCoins.slice(0, 10).map((c) => ({\n symbol: c.symbol,\n change24h: c.change24h\n })),\n summary: intel.marketSummary\n };\n}\n\nexport interface CondensedWar {\n id: string;\n status: string;\n category?: string;\n matchCount: number;\n url: string;\n}\n\nexport function condenseWar(war: War, baseUrl: string): CondensedWar {\n return {\n id: war.id,\n status: war.status,\n ...(typeof war.category === \"string\" ? { category: war.category } : {}),\n matchCount: war.matches?.length ?? 0,\n url: warUrl(baseUrl, war.id)\n };\n}\n\nexport interface CondensedRegistryEntry {\n agentId: string;\n displayName: string;\n category: string[];\n tradingStyle: string;\n riskLevel: string;\n winRate: number;\n pnl30d: number;\n verificationLevel: string;\n url: string;\n}\n\nexport function condenseRegistryEntry(entry: RegistryEntry, baseUrl: string): CondensedRegistryEntry {\n return {\n agentId: entry.agentId,\n displayName: entry.displayName,\n category: entry.category,\n tradingStyle: entry.tradingStyle,\n riskLevel: entry.riskLevel,\n winRate: entry.stats.winRate,\n pnl30d: entry.stats.pnl30d,\n verificationLevel: entry.verificationLevel,\n url: registryAgentUrl(baseUrl, entry.agentId)\n };\n}\n\nexport function registryUrl(baseUrl: string): string {\n return `${baseUrl}/agents`;\n}\n\nexport function registryAgentUrl(baseUrl: string, agentId: string): string {\n return `${baseUrl}/agents/${encodeURIComponent(agentId)}`;\n}\n\nexport interface CondensedAgentCard {\n agentId: string;\n capabilities: string[];\n categories: string[];\n style: string;\n winRate: number;\n pnl30d: number;\n serviceCount: number;\n url: string;\n}\n\nexport function condenseAgentCard(card: AgentCard, baseUrl: string): CondensedAgentCard {\n return {\n agentId: card.agentId,\n capabilities: card.capabilities,\n categories: card.specializations.categories,\n style: card.specializations.style,\n winRate: card.stats.winRate,\n pnl30d: card.stats.pnl30d,\n serviceCount: card.services.length,\n url: agentCardUrl(baseUrl, card.agentId)\n };\n}\n\nexport function agentCardUrl(baseUrl: string, agentId: string): string {\n return `${baseUrl}/agents/${encodeURIComponent(agentId)}`;\n}\n\n// --- Escrow ---\n\nexport interface CondensedEscrow {\n escrowId: string;\n toAgentId: string;\n serviceName: string;\n amount: number;\n status: EscrowStatus;\n settlement: EscrowSettlement | null;\n}\n\nexport function condenseEscrow(escrow: Escrow): CondensedEscrow {\n return {\n escrowId: escrow.escrowId,\n toAgentId: escrow.toAgentId,\n serviceName: escrow.serviceName,\n amount: escrow.amount,\n status: escrow.status,\n ...(escrow.settlement ? { settlement: escrow.settlement } : { settlement: null }),\n };\n}\n\n// --- Delegation ---\n\nexport interface CondensedDelegation {\n delegationId: string;\n granteeId: string;\n status: DelegationStatus;\n spent: number;\n tradeCount: number;\n maxTotal: number;\n}\n\nexport function condenseDelegation(delegation: Delegation): CondensedDelegation {\n return {\n delegationId: delegation.delegationId,\n granteeId: delegation.granteeId,\n status: delegation.status,\n spent: delegation.spent,\n tradeCount: delegation.tradeCount,\n maxTotal: delegation.limits.maxTotal,\n };\n}\n\n// --- Traces ---\n\nexport interface CondensedTraceLeaderboardEntry {\n agentHash: string;\n wins: number;\n winRate: number;\n totalPnl: number;\n avgConfidence: number | null;\n}\n\nexport function condenseTraceLeaderboardEntry(entry: TraceLeaderboardEntry): CondensedTraceLeaderboardEntry {\n return {\n agentHash: entry.agentHash,\n wins: entry.wins,\n winRate: entry.winRate,\n totalPnl: entry.totalPnl,\n avgConfidence: entry.avgConfidence,\n };\n}\n\nexport interface CondensedTracePattern {\n pattern: string;\n steps: string[];\n avgPnl: number;\n}\n\nexport function condenseTracePattern(pattern: TracePattern): CondensedTracePattern {\n return {\n pattern: pattern.pattern,\n steps: pattern.steps,\n avgPnl: pattern.avgPnl,\n };\n}\n","import type { ToromarketClient, Market, FundsListResponse, PredictionPosition, PortfolioSummary } from \"@toromarket/sdk\";\nimport { condenseMarket, type CondensedMarket } from \"./responses.js\";\n\nexport interface TradingContext {\n balance: number;\n totalValue: number;\n positions: PredictionPosition[];\n openOrders: unknown[];\n markets: CondensedMarket[];\n fundId: string | null;\n url: string;\n}\n\nexport async function executeTradingContext(\n client: ToromarketClient,\n baseUrl: string\n): Promise<TradingContext> {\n const [portfolio, positions, openOrders, markets, funds] = await Promise.all([\n client.portfolio.get().catch((): PortfolioSummary => ({ balance: 0, totalValue: 0 })),\n client.predictions.getPositions().catch((): PredictionPosition[] => []),\n client.request<unknown[]>(\"GET\", \"/api/v1/portfolio/open-orders\").catch((): unknown[] => []),\n client.predictions.listMarkets({ limit: 20 }).catch((): Market[] => []),\n client.funds.list().catch((): FundsListResponse => ({ funds: [], myFundId: null }))\n ]);\n\n return {\n balance: portfolio.balance ?? 0,\n totalValue: portfolio.totalValue ?? 0,\n positions,\n openOrders: Array.isArray(openOrders) ? openOrders : [],\n markets: markets.map((m) => condenseMarket(m, baseUrl)),\n fundId: funds.myFundId ?? null,\n url: `${baseUrl}/portfolio`\n };\n}\n\nexport interface HelpInfo {\n platform: string;\n currency: string;\n workflows: Record<string, string>;\n tiers: Record<string, string>;\n tips: string[];\n toolCount: number;\n version: string;\n}\n\nexport function executeGetHelp(toolCount: number, version: string): HelpInfo {\n return {\n platform: \"Toromarket — prediction markets and crypto trading platform\",\n currency: \"TC (Toro Coins) — starting balance is 10,000 TC\",\n workflows: {\n \"Getting started\": \"authenticate → get_trading_context → explore markets\",\n \"Trade predictions\": \"get_market (for order book + outcomeIds) → log_reasoning → place_order → get_positions\",\n \"Trade crypto\": \"list_crypto → log_reasoning → trade_crypto\",\n \"Social\": \"post_market_comment, get_user_profile, get_leaderboard\",\n \"Funds\": \"list_funds → join_fund OR create_fund → post_fund_message\",\n \"Fund trading\": \"get_fund_positions → place_fund_order / trade_fund_crypto → get_fund_trades\",\n \"Intelligence\": \"get_market_intelligence (overview) → get_market_signals (per-market depth)\",\n \"Reflection\": \"get_my_performance → get_resolved_predictions → get_agent_benchmarks\",\n \"Wars\": \"enter_war_queue → get_queue_status → get_active_war → get_war_results → get_war_history\"\n },\n tiers: {\n FREE: \"10 orders/min, 5 chat/min, 60 reads/min\",\n PRO: \"100 orders/min, 30 chat/min, 300 reads/min — $29/mo\",\n ENTERPRISE: \"Unlimited — $99/mo\"\n },\n tips: [\n \"Before any trade, you MUST call log_reasoning with your reasoning. Trades without reasoning will be rejected.\",\n \"Use get_trading_context instead of separate balance/positions/markets calls\",\n \"Always use outcomeId (not label) when placing orders\",\n \"MARKET orders execute immediately — no price needed\",\n \"You can only be in one fund at a time\",\n \"If you hit rate limits, call get_upgrade_url to generate a payment link for your operator\",\n \"Use get_my_traces to review past decisions and learn from outcomes\"\n ],\n toolCount,\n version\n };\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\n\nexport interface ClassifiedError {\n error: string;\n statusCode: number;\n retryable: boolean;\n recovery: string;\n context?: Record<string, unknown>;\n}\n\ninterface RecoveryPattern {\n pattern: RegExp;\n recovery: string;\n}\n\nconst RECOVERY_PATTERNS: RecoveryPattern[] = [\n {\n pattern: /insufficient balance/i,\n recovery: \"Your balance is too low. Check with get_balance.\"\n },\n {\n pattern: /insufficient shares/i,\n recovery: \"You don't own enough shares of this outcome. Buy shares with place_order first.\"\n },\n {\n pattern: /market has closed/i,\n recovery: \"This market is closed for trading. Use list_markets to find open markets.\"\n },\n {\n pattern: /already a member/i,\n recovery: \"You're already in a fund. Call leave_fund first, then retry.\"\n }\n];\n\nexport function classifyError(error: unknown): ClassifiedError {\n if (error instanceof Error && error.name === \"ZodError\") {\n const issues = (error as any).issues as Array<{ message: string; path: string[] }> | undefined;\n const details = issues?.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \") ?? error.message;\n return {\n error: error.message,\n statusCode: 400,\n retryable: false,\n recovery: `Invalid parameters: ${details}`\n };\n }\n\n if (error instanceof ToromarketError) {\n const status = error.statusCode;\n\n // Network/timeout errors (status 0 or 408 with specific codes)\n if (error.code === \"TIMEOUT\") {\n return { error: error.message, statusCode: 408, retryable: true, recovery: \"Request timed out. The server may be under heavy load. Try again.\" };\n }\n if (error.code === \"NETWORK_ERROR\") {\n return { error: error.message, statusCode: 0, retryable: true, recovery: \"Toromarket API is unreachable. Check that the server is running.\" };\n }\n\n if (status >= 500) {\n return { error: error.message, statusCode: status, retryable: true, recovery: \"Server error. Try again in a few seconds.\" };\n }\n if (status === 429) {\n return { error: error.message, statusCode: 429, retryable: true, recovery: \"Rate limited. Wait a moment and try again.\" };\n }\n if (status === 401) {\n return { error: error.message, statusCode: 401, retryable: false, recovery: \"Not authenticated. Call authenticate with your credentials.\" };\n }\n if (status === 403) {\n return { error: error.message, statusCode: 403, retryable: false, recovery: \"Not authorized. You may not have the required role or permissions.\" };\n }\n if (status === 404) {\n return { error: error.message, statusCode: 404, retryable: false, recovery: \"Resource not found. Check the ID and try again.\" };\n }\n\n for (const { pattern, recovery } of RECOVERY_PATTERNS) {\n if (pattern.test(error.message)) {\n return { error: error.message, statusCode: 400, retryable: false, recovery };\n }\n }\n\n return { error: error.message, statusCode: status, retryable: false, recovery: error.message };\n }\n\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { error: message, statusCode: 500, retryable: false, recovery: message };\n}\n","/**\n * Tool profiles for different agent types.\n * Smaller profiles reduce context window usage for Small Language Models.\n *\n * - trader: ~32 tools — core trading loop + market intel + public endpoints\n * - social: ~50 tools — trading + social features + gamification\n * - fund_manager: ~60 tools — social + fund operations + wars + strategy proposals\n * - full: all tools (default)\n */\n\n// Minimal set for SLMs or single-purpose trading bots\nconst TRADER_TOOLS = new Set([\n // Auth\n \"register_agent\", \"authenticate\",\n // Market research\n \"list_markets\", \"get_market\", \"get_event_markets\", \"list_crypto\", \"get_crypto\",\n // Trading\n \"log_reasoning\", \"place_order\", \"cancel_order\", \"trade_crypto\",\n // Portfolio\n \"get_positions\", \"get_balance\", \"get_portfolio\",\n // Identity\n \"topup_stake\", \"get_trust_info\", \"get_compliance_status\",\n // Traces (public)\n \"get_trace_leaderboard\", \"get_trace_patterns\",\n // Arena (public)\n \"get_arena_agents\", \"get_arena_feed\", \"get_arena_leaderboard\", \"get_arena_stats\",\n // Tournaments (public read)\n \"list_tournaments\", \"get_tournament\",\n // War extended\n \"get_war_trades\", \"get_war_trajectory\",\n // Context\n \"get_help\",\n // Small endpoints (public)\n \"get_live_sports\", \"get_app_config\",\n // Market intelligence (public)\n \"get_related_markets\", \"get_category_comments\",\n]);\n\n// Trading + social for multi-purpose agents\nconst SOCIAL_TOOLS = new Set([\n ...TRADER_TOOLS,\n // Social\n \"post_market_comment\", \"get_leaderboard\", \"get_user_profile\",\n \"follow_user\", \"unfollow_user\", \"get_followers\", \"get_following\",\n // Watchlist\n \"get_watchlist\", \"add_to_watchlist\", \"remove_from_watchlist\",\n // Search\n \"search\",\n // Identity\n \"get_operator_status\",\n // Traces\n \"get_my_traces\", \"get_trace\",\n // Registry\n \"browse_registry\", \"get_registry_agent\", \"list_my_agent\",\n // A2A Discovery\n \"discover_agents\", \"get_agent_card\", \"update_my_agent_card\",\n // A2A Messaging\n \"send_agent_message\", \"read_agent_inbox\", \"get_agent_conversation\", \"acknowledge_agent_inbox\",\n // Escrow\n \"create_escrow\", \"get_my_escrows\", \"get_escrow\", \"settle_escrow\", \"dispute_escrow\",\n // Delegations\n \"create_delegation\", \"list_delegations\", \"get_delegation\", \"revoke_delegation\",\n \"rotate_delegation\", \"get_delegation_activity\",\n // Notifications\n \"get_notifications\", \"mark_notification_read\", \"mark_all_notifications_read\",\n \"register_push_token\", \"unregister_push_token\",\n // API Keys\n \"list_api_keys\", \"create_api_key\", \"revoke_api_key\",\n // Tournaments (register)\n \"register_tournament\",\n // War extended (public)\n \"get_weekly_wars\",\n // Gamification\n \"get_gamification_profile\", \"get_badges\", \"get_all_badges\",\n \"get_challenges\", \"claim_challenge\",\n \"get_quests\", \"claim_quest\",\n \"get_mystery_box\", \"claim_mystery_box\",\n \"record_login\",\n \"get_gamification_leaderboard\", \"get_reward_history\",\n // Small endpoints (auth-required)\n \"get_friends\", \"submit_bug_report\",\n // Social & Discovery\n \"compare_users\", \"get_friend_requests\", \"accept_friend_request\", \"reject_friend_request\",\n \"get_user_badges\", \"react_to_chat\",\n]);\n\n// Fund manager: social + fund ops + wars\nconst FUND_MANAGER_TOOLS = new Set([\n ...SOCIAL_TOOLS,\n // Fund management\n \"list_funds\", \"join_fund\", \"create_fund\", \"leave_fund\", \"get_fund\",\n \"get_fund_members\", \"update_fund_member_role\", \"remove_fund_member\",\n \"post_fund_message\", \"get_fund_chat\",\n // Fund trading\n \"place_fund_order\", \"trade_fund_crypto\", \"get_fund_positions\",\n \"get_fund_prediction_positions\", \"get_fund_orders\", \"get_fund_trades\",\n \"cancel_fund_order\", \"get_fund_strategy\", \"set_fund_strategy\",\n // Fund management (extended)\n \"get_fund_pnl_chart\", \"get_fund_proposals\",\n \"create_strategy_proposal\", \"approve_strategy_proposal\", \"reject_strategy_proposal\",\n // Wars\n \"get_active_wars\", \"get_active_war\", \"enter_war_queue\",\n \"cancel_war_queue\", \"get_queue_status\", \"get_war_results\",\n // Performance\n \"get_my_performance\", \"get_agent_benchmarks\",\n // Context\n \"get_trading_context\",\n]);\n\nexport type ToolProfile = \"trader\" | \"social\" | \"fund_manager\" | \"full\";\n\nconst PROFILE_TOOL_SETS: Record<string, Set<string> | null> = {\n trader: TRADER_TOOLS,\n social: SOCIAL_TOOLS,\n fund_manager: FUND_MANAGER_TOOLS,\n full: null, // null = all tools\n};\n\nexport function getProfileToolSet(profile: ToolProfile): Set<string> | null {\n return PROFILE_TOOL_SETS[profile] ?? null;\n}\n\nexport function isValidProfile(value: string): value is ToolProfile {\n return value in PROFILE_TOOL_SETS;\n}\n\nexport interface ToolProfileInfo {\n name: string;\n toolCount: number;\n description: string;\n}\n\nexport function getAvailableProfiles(totalToolCount: number): ToolProfileInfo[] {\n return [\n { name: \"trader\", toolCount: TRADER_TOOLS.size, description: \"Core trading loop — research, reason, trade, review\" },\n { name: \"social\", toolCount: SOCIAL_TOOLS.size, description: \"Trading + social features, watchlist, search\" },\n { name: \"fund_manager\", toolCount: FUND_MANAGER_TOOLS.size, description: \"Social + fund operations, wars, performance\" },\n { name: \"full\", toolCount: totalToolCount, description: \"All tools — recommended for frontier models\" },\n ];\n}\n","/**\n * Compact tool descriptions for Small Language Models.\n * Reduces token usage by ~60-70% compared to full descriptions.\n * Activated via TOROMARKET_TOOL_DESCRIPTIONS=compact\n */\nexport const COMPACT_DESCRIPTIONS: Record<string, string> = {\n // Auth\n register_agent: \"Create agent account. Requires: email, username, password. Token auto-stored; returns claim URL for operator verification.\",\n authenticate: \"Log in. Returns token. Params: email, password.\",\n\n // Markets\n list_markets: \"List prediction markets. Returns id, title, outcomes[{id, probability}]. Use outcomeId with place_order.\",\n get_market: \"Get market detail + order book. Returns outcomeId values for place_order.\",\n get_event_markets: \"Get all props for an event (e.g. all NBA game markets). Params: eventSlug from list_markets.\",\n list_crypto: \"List crypto coins with prices. Use symbol with trade_crypto.\",\n get_crypto: \"Get single coin price data.\",\n\n // Trading\n log_reasoning: \"REQUIRED before every trade. Explain why you're trading. Params: reasoning (string), confidence (0-1), signals (array).\",\n place_order: \"Buy/sell prediction shares. Call log_reasoning first. Params: marketId, outcomeId, side, quantity, price (0-1).\",\n cancel_order: \"Cancel open order. Params: marketId, orderId.\",\n trade_crypto: \"Buy/sell crypto at market price. Call log_reasoning first. Params: symbol, side, quantity.\",\n\n // Portfolio\n get_positions: \"Get your prediction positions.\",\n get_balance: \"Get TC balance and total value.\",\n get_portfolio: \"Full portfolio: balance, positions, holdings.\",\n get_trading_context: \"Snapshot: balance + positions + orders + markets in one call.\",\n\n // Social\n post_market_comment: \"Comment on a market. Params: marketId, content.\",\n get_leaderboard: \"Platform rankings. Params: category (traders/funds/predictions/wars), sort.\",\n get_user_profile: \"Public profile. Params: username.\",\n search: \"Search users, markets, funds. Params: q.\",\n\n // Funds\n list_funds: \"List all funds + your myFundId.\",\n join_fund: \"Join fund with stake. Params: fundId, stake.\",\n create_fund: \"Create fund. Params: name, description, initialStake.\",\n\n // Traces\n get_my_traces: \"Review past decisions with outcomes. Params: limit, offset, trigger.\",\n get_trace: \"Single decision trace with P&L. Params: traceId.\",\n\n // Identity\n topup_stake: \"Increase stake to upgrade trust tier. Params: amount (TC to add).\",\n get_trust_info: \"Get your trust score, tier, stake status, and operator info.\",\n get_operator_status: \"Check your operator's social verification status.\",\n\n // Help\n get_help: \"Overview of tools and workflows.\",\n\n // Escrow\n create_escrow: \"Lock TC in escrow for agent service. Params: toAgentId, serviceName, amount, conversationId?.\",\n get_my_escrows: \"List your escrows. Params: role (payer/payee), status, limit, offset.\",\n get_escrow: \"Get escrow details. Params: escrowId.\",\n settle_escrow: \"Settle escrow (3-way split). Payer-only. Params: escrowId.\",\n dispute_escrow: \"Dispute escrow. Payer-only. Params: escrowId, reason?.\",\n\n // Delegations\n create_delegation: \"Grant agent scoped trading access. Returns one-time token. Params: granteeId, scopes, limits, expiresIn?.\",\n list_delegations: \"List your delegations. Params: role (grantor/grantee), status, limit, offset.\",\n get_delegation: \"Get delegation details + spend/trade count. Params: delegationId.\",\n revoke_delegation: \"Revoke delegation immediately. Grantor-only. Params: delegationId.\",\n\n // Social & Discovery\n compare_users: \"Compare your portfolio vs another user. Params: userId.\",\n get_friend_requests: \"List pending friend requests sent to you.\",\n accept_friend_request: \"Accept friend request. Params: requestId.\",\n reject_friend_request: \"Reject friend request. Params: requestId.\",\n get_user_badges: \"Get user's badges. Public. Params: username.\",\n react_to_chat: \"React to chat message. Params: symbol, messageId, emoji.\",\n\n // Market Intelligence (extended)\n get_related_markets: \"Get markets for same event. Public. Params: marketId.\",\n get_category_comments: \"Get comments across category markets. Public. Params: category, exclude?.\",\n\n // Fund Management (extended)\n get_fund_pnl_chart: \"Get daily P&L chart for fund. Params: fundId.\",\n get_fund_proposals: \"List strategy proposals. Params: fundId.\",\n create_strategy_proposal: \"Propose strategy. Params: fundId, title, description, sourceCode?.\",\n approve_strategy_proposal: \"Approve proposal (MANAGER+). Params: fundId, proposalId.\",\n reject_strategy_proposal: \"Reject proposal (MANAGER+). Params: fundId, proposalId, reason?.\",\n};\n","export type LogLevel = \"none\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n none: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4\n};\n\nconst SENSITIVE_KEYS = new Set([\"password\", \"token\", \"secret\", \"apiKey\"]);\n\nexport interface Logger {\n error(data: Record<string, unknown>): void;\n warn(data: Record<string, unknown>): void;\n info(data: Record<string, unknown>): void;\n debug(data: Record<string, unknown>): void;\n}\n\nfunction redact(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(redact);\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (SENSITIVE_KEYS.has(key)) {\n result[key] = \"[REDACTED]\";\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = redact(value);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction emit(level: string, data: Record<string, unknown>): void {\n const entry = {\n timestamp: new Date().toISOString(),\n level,\n ...data\n };\n process.stderr.write(JSON.stringify(entry) + \"\\n\");\n}\n\nexport function createLogger(level: LogLevel = \"info\"): Logger {\n const threshold = LEVEL_ORDER[level];\n\n return {\n error(data) {\n if (threshold >= LEVEL_ORDER.error) emit(\"error\", redact(data) as Record<string, unknown>);\n },\n warn(data) {\n if (threshold >= LEVEL_ORDER.warn) emit(\"warn\", redact(data) as Record<string, unknown>);\n },\n info(data) {\n if (threshold >= LEVEL_ORDER.info) emit(\"info\", redact(data) as Record<string, unknown>);\n },\n debug(data) {\n if (threshold >= LEVEL_ORDER.debug) emit(\"debug\", redact(data) as Record<string, unknown>);\n }\n };\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\n\nexport class RegistrationThrottle implements ToolMiddleware {\n private hasRegistered = false;\n\n async beforeExecute(toolName: string, _args?: unknown): Promise<void> {\n if (toolName === \"register_agent\" && this.hasRegistered) {\n throw new ToromarketError(\n \"Only one account can be registered per session. Use authenticate to log in to an existing account.\",\n 403,\n \"REGISTRATION_THROTTLE\"\n );\n }\n }\n\n async afterExecute(toolName: string, _args: unknown, _result: unknown, error?: unknown): Promise<void> {\n if (toolName === \"register_agent\" && !error) {\n this.hasRegistered = true;\n }\n }\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\n\nexport interface RateLimiterConfig {\n ordersPerMinute?: number;\n chatPerMinute?: number;\n readsPerMinute?: number;\n}\n\ninterface CategoryConfig {\n limit: number;\n windowMs: number;\n}\n\nconst ORDER_TOOLS = new Set([\"place_order\", \"cancel_order\", \"trade_crypto\", \"place_fund_order\", \"trade_fund_crypto\", \"cancel_fund_order\"]);\nconst CHAT_TOOLS = new Set([\"post_market_comment\", \"post_fund_message\", \"react_to_chat\"]);\nconst HEAVY_TOOLS = new Set([\"get_trading_context\"]);\n\nconst TIER_LIMITS: Record<string, RateLimiterConfig> = {\n FREE: { ordersPerMinute: 10, chatPerMinute: 5, readsPerMinute: 60 },\n PRO: { ordersPerMinute: 100, chatPerMinute: 30, readsPerMinute: 300 },\n ENTERPRISE: { ordersPerMinute: 0, chatPerMinute: 0, readsPerMinute: 0 }, // 0 = unlimited\n};\n\n/**\n * Client-side rate limiter. Limits are per-session, not per-user.\n *\n * A user opening multiple MCP sessions gets independent rate limits.\n * This is intentional: the backend API enforces the authoritative per-user\n * rate limits. This middleware provides better error messages than raw 429s\n * and prevents agents from unnecessarily hammering the API.\n */\nexport class RateLimiter implements ToolMiddleware {\n private readonly windows = new Map<string, number[]>();\n private categories: Record<string, CategoryConfig>;\n private currentTier = \"FREE\";\n\n constructor(config: RateLimiterConfig = {}) {\n this.categories = buildCategories(config);\n }\n\n updateTier(tier: string): void {\n this.currentTier = tier;\n const tierConfig = TIER_LIMITS[tier] ?? TIER_LIMITS.FREE!;\n this.categories = buildCategories(tierConfig);\n }\n\n private getCategory(toolName: string): string {\n if (ORDER_TOOLS.has(toolName)) return \"orders\";\n if (CHAT_TOOLS.has(toolName)) return \"chat\";\n return \"reads\";\n }\n\n async beforeExecute(toolName: string, _args?: unknown): Promise<void> {\n const category = this.getCategory(toolName);\n const config = this.categories[category];\n if (!config || config.limit === 0) return; // 0 = unlimited\n\n const now = Date.now();\n const cutoff = now - config.windowMs;\n\n let timestamps = this.windows.get(category);\n if (!timestamps) {\n timestamps = [];\n this.windows.set(category, timestamps);\n }\n\n while (timestamps.length > 0 && timestamps[0]! < cutoff) {\n timestamps.shift();\n }\n\n const weight = HEAVY_TOOLS.has(toolName) ? 5 : 1;\n\n if (timestamps.length + weight - 1 >= config.limit) {\n const oldestInWindow = timestamps[0]!;\n const waitSec = Math.ceil((oldestInWindow + config.windowMs - now) / 1000);\n const proLimits: Record<string, string> = { orders: \"100 orders/min\", chat: \"30 messages/min\", reads: \"300 reads/min\" };\n const upgradeHint = this.currentTier === \"FREE\"\n ? ` To increase your ${category} limit to ${proLimits[category] ?? \"higher\"}, call get_upgrade_url with tier PRO ($29/mo) or ENTERPRISE ($99/mo, unlimited). It will generate a payment link for your operator.`\n : this.currentTier === \"PRO\"\n ? ` To remove all ${category} limits, call get_upgrade_url with tier ENTERPRISE ($99/mo, unlimited). It will generate a payment link for your operator.`\n : \"\";\n throw new ToromarketError(\n `Rate limit exceeded for ${category}. Limit: ${config.limit} per minute. Wait ${waitSec}s.${upgradeHint}`,\n 429,\n \"RATE_LIMITED\"\n );\n }\n\n for (let i = 0; i < weight; i++) {\n timestamps.push(now);\n }\n }\n\n async afterExecute(): Promise<void> {\n // No-op\n }\n}\n\nfunction buildCategories(config: RateLimiterConfig): Record<string, CategoryConfig> {\n return {\n orders: { limit: config.ordersPerMinute ?? 10, windowMs: 60_000 },\n chat: { limit: config.chatPerMinute ?? 5, windowMs: 60_000 },\n reads: { limit: config.readsPerMinute ?? 60, windowMs: 60_000 },\n };\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\n\nexport interface ErrorBudgetConfig {\n threshold?: number;\n maxCooldownMs?: number;\n}\n\nexport class ErrorBudget implements ToolMiddleware {\n private consecutiveErrors = 0;\n private cooldownUntil = 0;\n private readonly threshold: number;\n private readonly maxCooldownMs: number;\n\n constructor(config: ErrorBudgetConfig = {}) {\n this.threshold = config.threshold ?? 5;\n this.maxCooldownMs = config.maxCooldownMs ?? 60_000;\n }\n\n async beforeExecute(_toolName?: string, _args?: unknown): Promise<void> {\n const now = Date.now();\n if (now < this.cooldownUntil) {\n const waitSec = Math.ceil((this.cooldownUntil - now) / 1000);\n throw new ToromarketError(\n `Too many consecutive errors. Automatic backoff for ${waitSec}s.`,\n 429,\n \"ERROR_BUDGET_EXCEEDED\"\n );\n }\n }\n\n async afterExecute(_toolName: string, _args: unknown, _result: unknown, error?: unknown): Promise<void> {\n // Don't count middleware rejections as real errors\n if (error instanceof ToromarketError) {\n const middlewareCodes = new Set([\n \"ERROR_BUDGET_EXCEEDED\",\n \"RATE_LIMITED\",\n \"REGISTRATION_THROTTLE\",\n \"SPOOFING_DETECTED\",\n \"SPENDING_LIMIT\",\n ]);\n if (error.code && middlewareCodes.has(error.code)) {\n return;\n }\n }\n if (error) {\n // Only count server errors (5xx) and unknown errors toward the budget.\n // Client errors (4xx) are the agent's fault and shouldn't trigger backoff.\n const statusCode = error instanceof ToromarketError ? error.statusCode : undefined;\n if (statusCode !== undefined && statusCode < 500) {\n return;\n }\n\n this.consecutiveErrors++;\n if (this.consecutiveErrors >= this.threshold) {\n const delayMs = Math.min(\n 2 ** (this.consecutiveErrors - this.threshold) * 1000,\n this.maxCooldownMs\n );\n this.cooldownUntil = Date.now() + delayMs;\n }\n } else {\n this.consecutiveErrors = 0;\n this.cooldownUntil = 0;\n }\n }\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\n\nexport interface SpoofingDetectorConfig {\n windowMs?: number;\n maxCancelRatio?: number;\n minActions?: number;\n}\n\nexport class SpoofingDetector implements ToolMiddleware {\n private events: Array<{ type: \"place\" | \"cancel\"; time: number }> = [];\n private readonly windowMs: number;\n private readonly maxCancelRatio: number;\n private readonly minActions: number;\n\n constructor(config: SpoofingDetectorConfig = {}) {\n this.windowMs = config.windowMs ?? 30_000;\n this.maxCancelRatio = config.maxCancelRatio ?? 0.8;\n this.minActions = config.minActions ?? 5;\n }\n\n private pruneExpired(): void {\n const cutoff = Date.now() - this.windowMs;\n while (this.events.length > 0 && this.events[0]!.time < cutoff) {\n this.events.shift();\n }\n }\n\n async beforeExecute(toolName: string, _args?: unknown): Promise<void> {\n if (toolName !== \"place_order\" && toolName !== \"place_fund_order\") return;\n\n this.pruneExpired();\n\n if (this.events.length < this.minActions) return;\n\n const cancels = this.events.filter((e) => e.type === \"cancel\").length;\n const ratio = cancels / this.events.length;\n\n if (ratio > this.maxCancelRatio) {\n throw new ToromarketError(\n `Suspicious trading pattern detected: ${Math.round(ratio * 100)}% of recent orders were cancelled. Slow down.`,\n 403,\n \"SPOOFING_DETECTED\"\n );\n }\n }\n\n async afterExecute(toolName: string, _args: unknown, _result: unknown, error?: unknown): Promise<void> {\n if (error) return;\n\n this.pruneExpired();\n\n if (toolName === \"place_order\" || toolName === \"place_fund_order\") {\n this.events.push({ type: \"place\", time: Date.now() });\n } else if (toolName === \"cancel_order\" || toolName === \"cancel_fund_order\") {\n this.events.push({ type: \"cancel\", time: Date.now() });\n }\n }\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\n\nconst TRADE_TOOLS = new Set([\"place_order\", \"trade_crypto\", \"place_fund_order\", \"trade_fund_crypto\"]);\n\n/**\n * Client-side spending guardrail. Tracks TC loss within a single MCP session\n * and blocks trades when the configured limit is reached.\n *\n * LIMITATION: This is session-scoped. An agent that reconnects gets a fresh\n * limit. For authoritative loss limits, the backend should enforce daily/rolling\n * caps per user. This middleware is defense-in-depth, not a security boundary.\n */\nexport class SpendingGuardrails implements ToolMiddleware {\n private startingBalance: number | null = null;\n private blocked = false;\n private readonly maxLoss: number | null;\n\n constructor(maxSessionLoss?: number) {\n this.maxLoss = maxSessionLoss ?? 5000;\n }\n\n async beforeExecute(toolName: string, _args?: unknown): Promise<void> {\n if (!TRADE_TOOLS.has(toolName)) return;\n\n if (this.blocked) {\n throw new ToromarketError(\n `Session spending limit reached (${this.maxLoss} TC). No further trades allowed. Read-only tools still work.`,\n 403,\n \"SPENDING_LIMIT\"\n );\n }\n\n if (this.startingBalance === null) {\n throw new ToromarketError(\n \"Call get_balance or get_portfolio before your first trade so spending limits can be tracked.\",\n 400,\n \"BALANCE_REQUIRED\"\n );\n }\n }\n\n async afterExecute(toolName: string, _args: unknown, result: unknown, error?: unknown): Promise<void> {\n if (error) return;\n if (this.maxLoss === null) return;\n\n // Capture starting balance from first response that contains a balance\n if (this.startingBalance === null) {\n const bal = extractBalance(result);\n if (bal !== null) {\n this.startingBalance = bal;\n return;\n }\n }\n\n // After a trade, check if loss exceeds limit\n if (TRADE_TOOLS.has(toolName) && result) {\n const remaining = extractRemainingBalance(result);\n if (remaining !== null && this.startingBalance !== null) {\n const loss = this.startingBalance - remaining;\n if (loss >= this.maxLoss) {\n this.blocked = true;\n }\n }\n }\n }\n}\n\nfunction extractBalance(result: unknown): number | null {\n if (typeof result !== \"object\" || result === null) return null;\n const r = result as Record<string, unknown>;\n if (typeof r.balance === \"number\") return r.balance;\n if (typeof r.totalValue === \"number\") return r.totalValue;\n return null;\n}\n\nfunction extractRemainingBalance(result: unknown): number | null {\n if (typeof result !== \"object\" || result === null) return null;\n const r = result as Record<string, unknown>;\n if (typeof r.remainingBalance === \"number\") return r.remainingBalance;\n return null;\n}\n","import type { ToolMiddleware } from \"./index.js\";\n\n/**\n * ComplianceGate middleware — Phase 1 (pass-through).\n *\n * Logs financial tool calls, flags velocity anomalies and large transactions,\n * but never blocks. Controlled by TOROMARKET_COMPLIANCE_MODE env var.\n *\n * Environment variables:\n * - TOROMARKET_COMPLIANCE_MODE — any truthy value enables the gate (default: disabled)\n * - TOROMARKET_BLOCKED_REGIONS — comma-separated region codes (default: empty)\n * - TOROMARKET_VELOCITY_TRADES_PER_MIN — flag threshold (default: 30)\n * - TOROMARKET_VELOCITY_TC_PER_HOUR — flag threshold (default: 50000)\n */\n\nconst FINANCIAL_TOOLS = new Set([\n \"place_order\", \"cancel_order\", \"trade_crypto\",\n \"place_fund_order\", \"trade_fund_crypto\", \"cancel_fund_order\",\n \"create_escrow\", \"settle_escrow\",\n \"create_delegation\", \"topup_stake\",\n \"claim_challenge\", \"claim_quest\", \"claim_mystery_box\",\n]);\n\nexport interface ComplianceConfig {\n enabled: boolean;\n blockedRegions: string[];\n velocityTradesPerMin: number;\n velocityTcPerHour: number;\n}\n\nexport interface ComplianceFlags {\n velocityWarning: boolean;\n regionBlocked: boolean;\n largeTransaction: boolean;\n}\n\nexport class ComplianceGate implements ToolMiddleware {\n private tradeTimestamps: number[] = [];\n private sessionTcVolume = 0;\n private region: string | null = null;\n private flags: ComplianceFlags = {\n velocityWarning: false,\n regionBlocked: false,\n largeTransaction: false,\n };\n\n constructor(\n private readonly config: ComplianceConfig,\n private readonly logger: {\n info: (data: Record<string, unknown>) => void;\n warn: (data: Record<string, unknown>) => void;\n }\n ) {}\n\n /**\n * Set the session's region for geographic restriction checks.\n * Call this when region info is available (e.g., from HTTP transport\n * X-Forwarded-For / CF-IPCountry headers, or operator-provided region).\n */\n setRegion(region: string): void {\n this.region = region.toUpperCase();\n if (\n this.config.blockedRegions.length > 0 &&\n this.config.blockedRegions.includes(this.region)\n ) {\n this.flags.regionBlocked = true;\n this.logger.warn({\n event: \"compliance:region_blocked\",\n region: this.region,\n blockedRegions: this.config.blockedRegions,\n });\n }\n }\n\n async beforeExecute(toolName: string, args: unknown): Promise<void> {\n if (!this.config.enabled) return;\n if (!FINANCIAL_TOOLS.has(toolName)) return;\n\n const now = Date.now();\n\n // Track velocity\n this.tradeTimestamps.push(now);\n const oneMinAgo = now - 60_000;\n this.tradeTimestamps = this.tradeTimestamps.filter((t) => t > oneMinAgo);\n\n // Parse amount from args if available\n const amount = this.parseAmount(args);\n if (amount > 0) {\n this.sessionTcVolume += amount;\n }\n\n // Velocity check (flag, don't block in Phase 1)\n if (this.tradeTimestamps.length > this.config.velocityTradesPerMin) {\n this.flags.velocityWarning = true;\n this.logger.warn({\n event: \"compliance:velocity_warning\",\n tradesInLastMinute: this.tradeTimestamps.length,\n threshold: this.config.velocityTradesPerMin,\n tool: toolName,\n });\n }\n\n // TC volume check (flag, don't block)\n if (this.sessionTcVolume > this.config.velocityTcPerHour) {\n this.flags.velocityWarning = true;\n this.logger.warn({\n event: \"compliance:volume_warning\",\n sessionVolume: this.sessionTcVolume,\n threshold: this.config.velocityTcPerHour,\n tool: toolName,\n });\n }\n\n // Large transaction check (flag, don't block in Phase 1)\n if (amount > 10_000) {\n this.flags.largeTransaction = true;\n this.logger.warn({\n event: \"compliance:large_transaction\",\n amount,\n tool: toolName,\n });\n }\n\n // Region check (flag, don't block in Phase 1)\n if (this.flags.regionBlocked) {\n this.logger.warn({\n event: \"compliance:region_blocked_trade_attempt\",\n region: this.region,\n tool: toolName,\n });\n }\n\n // Log all financial tool calls\n this.logger.info({\n event: \"compliance:financial_tool\",\n tool: toolName,\n amount: amount > 0 ? amount : undefined,\n sessionVolume: this.sessionTcVolume,\n tradesInLastMinute: this.tradeTimestamps.length,\n region: this.region,\n regionBlocked: this.flags.regionBlocked,\n });\n }\n\n async afterExecute(\n _toolName: string,\n _args: unknown,\n _result: unknown,\n _error?: unknown\n ): Promise<void> {\n // No-op in Phase 1\n }\n\n getStatus(): {\n enabled: boolean;\n flags: ComplianceFlags;\n velocity: { tradesLastMinute: number; sessionVolume: number };\n region: string | null;\n blockedRegions: string[];\n } {\n const now = Date.now();\n const oneMinAgo = now - 60_000;\n const recentTrades = this.tradeTimestamps.filter((t) => t > oneMinAgo);\n\n return {\n enabled: this.config.enabled,\n flags: { ...this.flags },\n velocity: {\n tradesLastMinute: recentTrades.length,\n sessionVolume: this.sessionTcVolume,\n },\n region: this.region,\n blockedRegions: this.config.blockedRegions,\n };\n }\n\n private parseAmount(args: unknown): number {\n if (typeof args !== \"object\" || args === null) return 0;\n const a = args as Record<string, unknown>;\n\n // Different tools store amount in different fields\n if (typeof a.quantity === \"number\" && typeof a.price === \"number\") {\n return a.quantity * a.price;\n }\n if (typeof a.quantity === \"number\") return a.quantity;\n if (typeof a.amount === \"number\") return a.amount;\n if (typeof a.stake === \"number\") return a.stake;\n if (typeof a.initialStake === \"number\") return a.initialStake;\n return 0;\n }\n}\n","import type { Logger } from \"./logger.js\";\nimport type { ToolMiddleware } from \"./middleware/index.js\";\n\nexport const AUDITED_TOOLS = new Set([\n \"place_order\", \"cancel_order\", \"trade_crypto\",\n \"place_fund_order\", \"trade_fund_crypto\", \"cancel_fund_order\",\n \"join_fund\", \"leave_fund\", \"create_fund\",\n \"update_fund_member_role\", \"remove_fund_member\", \"transfer_fund_ownership\",\n]);\n\nexport class AuditLogger implements ToolMiddleware {\n private readonly logger: Logger;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n async beforeExecute(): Promise<void> {}\n\n async afterExecute(toolName: string, args: unknown, result?: unknown, error?: unknown): Promise<void> {\n if (!AUDITED_TOOLS.has(toolName)) return;\n\n this.logger.info({\n event: \"audit\",\n tool: toolName,\n args: sanitizeArgs(args),\n success: !error,\n ...(error ? { error: error instanceof Error ? error.message : String(error) } : {}),\n ...(result && !error ? { resultSummary: summarizeResult(result) } : {}),\n timestamp: new Date().toISOString(),\n });\n }\n}\n\nfunction sanitizeArgs(args: unknown): unknown {\n if (typeof args !== \"object\" || args === null) return args;\n const sanitized = { ...args as Record<string, unknown> };\n delete sanitized.password;\n return sanitized;\n}\n\nfunction summarizeResult(result: unknown): string {\n if (typeof result !== \"object\" || result === null) return String(result);\n const r = result as Record<string, unknown>;\n if (r.orderId) return `orderId=${r.orderId}`;\n if (r.fundId) return `fundId=${r.fundId}`;\n return \"ok\";\n}\n","import type { ToromarketClient, TraceStep, TradeContext } from \"@toromarket/sdk\";\nimport { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\nimport type { Logger } from \"../logger.js\";\n\nconst STATE_CHANGING_TOOLS = new Set([\n \"place_order\", \"cancel_order\", \"trade_crypto\",\n \"place_fund_order\", \"trade_fund_crypto\", \"cancel_fund_order\",\n \"join_fund\", \"leave_fund\", \"create_fund\",\n \"update_fund_member_role\", \"remove_fund_member\", \"transfer_fund_ownership\",\n]);\n\n// Tools that are just submitting reasoning — don't track in sequence\nconst META_TOOLS = new Set([\"log_reasoning\"]);\n\nexport class TraceCollector implements ToolMiddleware {\n private sequence: TraceStep[] = [];\n private pendingReasoning: { reasoning: string; confidence?: number; signals?: string[] } | null = null;\n private decisionCount = 0;\n private traceStartTime: number = Date.now();\n private readonly client: ToromarketClient;\n private readonly logger: Logger;\n private readonly sessionId: string;\n\n constructor(client: ToromarketClient, logger: Logger, sessionId: string) {\n this.client = client;\n this.logger = logger;\n this.sessionId = sessionId;\n }\n\n /** Called by the log_reasoning tool handler to store pending reasoning */\n setReasoning(reasoning: string, confidence?: number, signals?: string[]): void {\n this.pendingReasoning = {\n reasoning,\n ...(confidence !== undefined ? { confidence } : {}),\n ...(signals !== undefined ? { signals } : {}),\n };\n }\n\n async beforeExecute(toolName: string, args?: unknown): Promise<void> {\n if (!STATE_CHANGING_TOOLS.has(toolName)) return;\n\n // Accept inline reasoning/confidence from tool args (new flow)\n if (!this.pendingReasoning && args && typeof args === \"object\") {\n const a = args as Record<string, unknown>;\n if (typeof a.reasoning === \"string\" && a.reasoning.length > 0) {\n this.setReasoning(\n a.reasoning,\n typeof a.confidence === \"number\" ? a.confidence : undefined\n );\n }\n }\n\n // Enforce reasoning before state-changing tools\n if (!this.pendingReasoning) {\n throw new ToromarketError(\n \"Call log_reasoning before trading. Every trade requires a reasoning explanation.\",\n 400,\n \"REASONING_REQUIRED\"\n );\n }\n }\n\n async afterExecute(toolName: string, args: unknown, result?: unknown, error?: unknown): Promise<void> {\n // Don't track meta tools in the sequence\n if (META_TOOLS.has(toolName)) return;\n\n // Record this tool call in the sequence\n this.sequence.push({\n tool: toolName,\n timestamp: new Date().toISOString(),\n ...(args && typeof args === \"object\" && Object.keys(args as object).length > 0\n ? { args: sanitizeArgs(args) as Record<string, unknown> }\n : {}),\n ...(result && !error ? { resultSummary: summarizeResult(result) } : {}),\n });\n\n // If a state-changing tool failed, remove it from the sequence so a\n // retry doesn't produce a contaminated trace with both attempts.\n if (STATE_CHANGING_TOOLS.has(toolName) && error) {\n this.sequence.pop();\n return;\n }\n\n // If this was a state-changing tool and it succeeded, submit the trace\n if (STATE_CHANGING_TOOLS.has(toolName) && !error && this.pendingReasoning) {\n await this.submitTrace(toolName, args);\n }\n }\n\n private async submitTrace(trigger: string, args: unknown): Promise<void> {\n if (!this.pendingReasoning) return;\n if (!this.client.getToken()) return; // Not authenticated, can't submit\n\n this.decisionCount++;\n const durationMs = Date.now() - this.traceStartTime;\n\n const tradeContext = extractTradeContext(trigger, args);\n\n try {\n await this.client.traces.create({\n sessionId: this.sessionId,\n decisionNumber: this.decisionCount,\n trigger,\n reasoning: this.pendingReasoning.reasoning,\n ...(this.pendingReasoning.confidence !== undefined ? { confidence: this.pendingReasoning.confidence } : {}),\n ...(this.pendingReasoning.signals !== undefined ? { signals: this.pendingReasoning.signals } : {}),\n sequence: this.sequence,\n stepCount: this.sequence.length,\n durationMs,\n tradeContext,\n });\n this.logger.info({ event: \"trace_submitted\", trigger, decisionNumber: this.decisionCount });\n } catch (err) {\n // Don't fail the trade if trace submission fails\n this.logger.warn({\n event: \"trace_submit_failed\",\n trigger,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Reset state for next decision\n this.pendingReasoning = null;\n this.sequence = [];\n this.traceStartTime = Date.now();\n }\n}\n\nfunction sanitizeArgs(args: unknown): unknown {\n if (typeof args !== \"object\" || args === null) return args;\n const sanitized = { ...args as Record<string, unknown> };\n delete sanitized.password;\n return sanitized;\n}\n\nfunction summarizeResult(result: unknown): string {\n if (typeof result !== \"object\" || result === null) return String(result);\n const r = result as Record<string, unknown>;\n if (typeof r.balance === \"number\") return `balance=${r.balance}`;\n if (r.orderId) return `orderId=${String(r.orderId)}`;\n if (r.fundId) return `fundId=${String(r.fundId)}`;\n if (Array.isArray(result)) return `[${result.length} items]`;\n // For markets/positions, summarize key fields\n if (r.title) return String(r.title);\n if (r.markets && Array.isArray(r.markets)) return `${(r.markets as unknown[]).length} markets`;\n return \"ok\";\n}\n\nfunction extractTradeContext(trigger: string, args: unknown): TradeContext {\n const a = (args ?? {}) as Record<string, unknown>;\n\n return {\n ...(a.marketId ? { marketId: String(a.marketId) } : {}),\n ...(a.symbol ? { symbol: String(a.symbol) } : {}),\n ...(a.outcomeId ? { outcomeId: String(a.outcomeId) } : {}),\n side: String(a.side ?? \"UNKNOWN\"),\n price: Number(a.price ?? 0),\n quantity: Number(a.quantity ?? 0),\n } as TradeContext;\n}\n","import WebSocket from \"ws\";\nimport type { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport type { ToromarketClient } from \"@toromarket/sdk\";\nimport type { Logger } from \"./logger.js\";\n\nexport interface NotificationServiceOptions {\n client: ToromarketClient;\n server: Server;\n logger: Logger;\n baseUrl: string;\n pollIntervalMs: number;\n}\n\ninterface WsEvent {\n event: string;\n data: Record<string, unknown>;\n timestamp: string;\n}\n\nconst MAX_RECONNECT_DELAY_MS = 30_000;\nconst INITIAL_RECONNECT_DELAY_MS = 1_000;\nconst MIN_POLL_INTERVAL_MS = 5000;\n\nexport class NotificationService {\n private ws: WebSocket | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectDelay = INITIAL_RECONNECT_DELAY_MS;\n private stopped = false;\n private usingWebSocket = false;\n\n // Polling fallback state\n private pollIntervalId: ReturnType<typeof setInterval> | null = null;\n private isPolling = false;\n private previousOrders = new Map<string, TrackedOrder>();\n\n private readonly client: ToromarketClient;\n private readonly server: Server;\n private readonly logger: Logger;\n private readonly baseUrl: string;\n private readonly pollIntervalMs: number;\n\n constructor(options: NotificationServiceOptions) {\n this.client = options.client;\n this.server = options.server;\n this.logger = options.logger;\n this.baseUrl = options.baseUrl;\n this.pollIntervalMs = Math.max(options.pollIntervalMs, MIN_POLL_INTERVAL_MS);\n }\n\n start(): void {\n if (this.stopped) return;\n\n const token = this.client.getToken();\n if (!token) return;\n\n // Try WebSocket first\n const wsUrl = this.buildWsUrl(token);\n if (wsUrl) {\n this.connectWebSocket(wsUrl);\n } else {\n // No valid WS URL — fall back to polling\n this.startPolling();\n }\n }\n\n stop(): void {\n this.stopped = true;\n\n if (this.ws) {\n this.ws.removeAllListeners();\n this.ws.close();\n this.ws = null;\n }\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n this.stopPolling();\n\n this.logger.info({ event: \"notifications_stop\" });\n }\n\n private buildWsUrl(token: string): string | null {\n try {\n const url = new URL(this.baseUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/ws\";\n url.searchParams.set(\"token\", token);\n return url.toString();\n } catch {\n return null;\n }\n }\n\n // --- WebSocket transport ---\n\n private connectWebSocket(wsUrl: string): void {\n if (this.stopped) return;\n\n this.logger.info({ event: \"ws_connecting\", url: wsUrl.replace(/token=[^&]+/, \"token=***\") });\n\n try {\n this.ws = new WebSocket(wsUrl);\n } catch (err) {\n this.logger.warn({ event: \"ws_create_failed\", error: err instanceof Error ? err.message : String(err) });\n this.scheduleReconnect();\n return;\n }\n\n this.ws.on(\"open\", () => {\n this.usingWebSocket = true;\n this.reconnectDelay = INITIAL_RECONNECT_DELAY_MS;\n this.stopPolling(); // Stop polling if we were falling back\n this.logger.info({ event: \"ws_connected\" });\n });\n\n this.ws.on(\"message\", (data: WebSocket.Data) => {\n try {\n const event = JSON.parse(data.toString()) as WsEvent;\n this.handleWsEvent(event);\n } catch {\n this.logger.warn({ event: \"ws_invalid_message\", raw: data.toString().slice(0, 200) });\n }\n });\n\n this.ws.on(\"close\", (code: number, reason: Buffer) => {\n this.logger.info({ event: \"ws_disconnected\", code, reason: reason.toString() });\n this.ws = null;\n this.usingWebSocket = false;\n\n if (!this.stopped) {\n this.scheduleReconnect();\n }\n });\n\n this.ws.on(\"error\", (err: Error) => {\n this.logger.warn({ event: \"ws_error\", error: err.message });\n // 'close' event will fire after this — reconnect handled there\n });\n\n this.ws.on(\"ping\", () => {\n // ws library auto-responds with pong by default\n });\n }\n\n private handleWsEvent(event: WsEvent): void {\n // Map backend event names to our notification format\n switch (event.event) {\n case \"connected\":\n this.logger.info({ event: \"ws_authenticated\", userId: event.data.userId });\n break;\n\n case \"order.filled\":\n this.notify(\"order_filled\", {\n orderId: event.data.orderId,\n marketId: event.data.marketId,\n side: event.data.side,\n quantity: event.data.quantity,\n filledPrice: event.data.filledPrice,\n message: `Order ${String(event.data.orderId).slice(0, 8)} filled (${event.data.side} ${event.data.quantity} shares @ ${event.data.filledPrice})`,\n });\n break;\n\n case \"order.partial_fill\":\n this.notify(\"order_partial_fill\", {\n orderId: event.data.orderId,\n marketId: event.data.marketId,\n side: event.data.side,\n filledNow: event.data.filledQuantity,\n totalFilled: event.data.totalFilled,\n totalQuantity: event.data.totalQuantity,\n message: `Order ${String(event.data.orderId).slice(0, 8)} partially filled: ${event.data.filledQuantity} more shares (${event.data.totalFilled}/${event.data.totalQuantity} total)`,\n });\n break;\n\n case \"order.cancelled\":\n this.notify(\"order_cancelled\", {\n orderId: event.data.orderId,\n marketId: event.data.marketId,\n reason: event.data.reason,\n message: `Order ${String(event.data.orderId).slice(0, 8)} cancelled: ${event.data.reason}`,\n });\n break;\n\n default:\n // Forward unknown events as-is (future-proofing for war/fund events)\n this.notify(event.event, event.data);\n break;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.stopped) return;\n if (this.reconnectTimer) return;\n\n this.logger.info({ event: \"ws_reconnect_scheduled\", delayMs: this.reconnectDelay });\n\n // Start polling while we wait to reconnect\n this.startPolling();\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (this.stopped) return;\n\n const token = this.client.getToken();\n if (!token) {\n // Token expired during backoff — keep retrying, it may be refreshed by a re-auth\n this.logger.warn({ event: \"ws_reconnect_no_token\", message: \"No auth token during reconnect. Will retry.\" });\n this.scheduleReconnect();\n return;\n }\n\n const wsUrl = this.buildWsUrl(token);\n if (wsUrl) {\n this.connectWebSocket(wsUrl);\n }\n }, this.reconnectDelay);\n\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s, 30s (capped)\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, MAX_RECONNECT_DELAY_MS);\n }\n\n private fallbackToPolling(): void {\n this.logger.info({ event: \"ws_fallback_to_polling\" });\n this.startPolling();\n }\n\n // --- Polling fallback (kept from original implementation) ---\n\n private startPolling(): void {\n if (this.pollIntervalId) return;\n if (this.pollIntervalMs <= 0) return;\n\n this.logger.info({ event: \"notifications_polling_start\", pollIntervalMs: this.pollIntervalMs });\n\n this.pollIntervalId = setInterval(() => {\n this.poll().catch((err) => {\n this.logger.error({ event: \"notification_poll_error\", error: err instanceof Error ? err.message : String(err) });\n });\n }, this.pollIntervalMs);\n }\n\n private stopPolling(): void {\n if (this.pollIntervalId) {\n clearInterval(this.pollIntervalId);\n this.pollIntervalId = null;\n }\n }\n\n private async poll(): Promise<void> {\n if (this.isPolling) return;\n if (!this.client.getToken()) return;\n if (this.usingWebSocket) return; // Don't poll if WS is active\n this.isPolling = true;\n\n try {\n let currentOrders: TrackedOrder[];\n try {\n const raw = await this.client.request<unknown[]>(\"GET\", \"/api/v1/portfolio/open-orders\");\n currentOrders = Array.isArray(raw) ? raw.map(normalizeOrder) : [];\n } catch (pollErr) {\n const message = pollErr instanceof Error ? pollErr.message : String(pollErr);\n const isAuthError = message.includes(\"401\") || message.includes(\"Unauthorized\") || message.includes(\"AUTH\");\n if (isAuthError) {\n this.logger.warn({\n event: \"notification_poll_auth_failure\",\n message: \"Notification polling failed due to expired or invalid token. Re-authenticate to restore order notifications.\",\n });\n }\n return;\n }\n\n const currentMap = new Map<string, TrackedOrder>();\n for (const order of currentOrders) {\n currentMap.set(order.id, order);\n }\n\n for (const [id, prev] of this.previousOrders) {\n const current = currentMap.get(id);\n\n if (!current) {\n if (prev.filled > 0) {\n this.notify(\"order_filled\", {\n orderId: id,\n marketId: prev.marketId,\n side: prev.side,\n quantity: prev.quantity,\n filled: prev.filled,\n message: `Order ${id.slice(0, 8)} completed (${prev.side} ${prev.filled}/${prev.quantity} shares filled)`,\n });\n }\n } else if (current.filled > prev.filled) {\n const newFills = current.filled - prev.filled;\n this.notify(\"order_partial_fill\", {\n orderId: id,\n marketId: current.marketId,\n side: current.side,\n filledNow: newFills,\n totalFilled: current.filled,\n totalQuantity: current.quantity,\n message: `Order ${id.slice(0, 8)} partially filled: ${newFills} more shares (${current.filled}/${current.quantity} total)`,\n });\n }\n }\n\n this.previousOrders = currentMap;\n } finally {\n this.isPolling = false;\n }\n }\n\n // --- Shared notification dispatch ---\n\n private async notify(event: string, data: Record<string, unknown>): Promise<void> {\n this.logger.info({ event: `notification:${event}`, ...data });\n\n try {\n await this.server.sendLoggingMessage({\n level: \"info\",\n data: { event, ...data },\n });\n } catch {\n // Client may not support logging notifications or may have disconnected\n }\n }\n}\n\n// --- Polling helpers ---\n\ninterface TrackedOrder {\n id: string;\n marketId: string;\n outcomeId: string | undefined;\n side: string;\n quantity: number;\n filled: number;\n status: string;\n}\n\nfunction normalizeOrder(raw: unknown): TrackedOrder {\n const o = raw as Record<string, unknown>;\n return {\n id: String(o.id ?? \"\"),\n marketId: String(o.marketId ?? \"\"),\n outcomeId: o.outcomeId ? String(o.outcomeId) : undefined,\n side: String(o.side ?? \"\"),\n quantity: Number(o.quantity ?? 0),\n filled: Number(o.filled ?? 0),\n status: String(o.status ?? \"OPEN\"),\n };\n}\n","import type { Logger } from \"./logger.js\";\n\nexport interface ToolMetric {\n count: number;\n errors: number;\n totalDurationMs: number;\n}\n\nexport interface SessionMetrics {\n sessionId: string;\n userId: string | null;\n tier: string;\n startedAt: string;\n toolCalls: Record<string, ToolMetric>;\n totalTrades: number;\n totalErrors: number;\n}\n\nconst TRADE_TOOLS = new Set([\"place_order\", \"cancel_order\", \"trade_crypto\"]);\n\nexport class MetricsCollector {\n private readonly metrics: SessionMetrics;\n private readonly logger: Logger;\n\n constructor(logger: Logger, sessionId?: string) {\n this.logger = logger;\n this.metrics = {\n sessionId: sessionId ?? \"stdio\",\n userId: null,\n tier: \"FREE\",\n startedAt: new Date().toISOString(),\n toolCalls: {},\n totalTrades: 0,\n totalErrors: 0,\n };\n }\n\n setUserId(userId: string): void {\n this.metrics.userId = userId;\n }\n\n setTier(tier: string): void {\n this.metrics.tier = tier;\n }\n\n recordCall(toolName: string, durationMs: number, error: boolean): void {\n let metric = this.metrics.toolCalls[toolName];\n if (!metric) {\n metric = { count: 0, errors: 0, totalDurationMs: 0 };\n this.metrics.toolCalls[toolName] = metric;\n }\n\n metric.count++;\n metric.totalDurationMs += durationMs;\n\n if (error) {\n metric.errors++;\n this.metrics.totalErrors++;\n }\n\n if (TRADE_TOOLS.has(toolName) && !error) {\n this.metrics.totalTrades++;\n }\n }\n\n getSnapshot(): SessionMetrics {\n return { ...this.metrics, toolCalls: { ...this.metrics.toolCalls } };\n }\n\n flush(): void {\n const snapshot = this.getSnapshot();\n const totalCalls = Object.values(snapshot.toolCalls).reduce((sum, m) => sum + m.count, 0);\n\n if (totalCalls === 0) return;\n\n this.logger.info({\n event: \"session_metrics\",\n ...snapshot,\n summary: {\n totalCalls,\n totalTrades: snapshot.totalTrades,\n totalErrors: snapshot.totalErrors,\n durationMs: Date.now() - new Date(snapshot.startedAt).getTime(),\n topTools: Object.entries(snapshot.toolCalls)\n .sort(([, a], [, b]) => b.count - a.count)\n .slice(0, 5)\n .map(([name, m]) => ({ name, count: m.count })),\n },\n });\n }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { randomUUID } from \"node:crypto\";\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport type { Logger } from \"../logger.js\";\n\nexport interface CreatedServer {\n server: Server;\n cleanup: () => void;\n setRegion?: (region: string) => void;\n}\n\ninterface SessionEntry {\n transport: StreamableHTTPServerTransport;\n server: CreatedServer;\n lastActivity: number;\n}\n\nconst MAX_SESSIONS = 100;\nconst MAX_BODY_SIZE = 1_048_576; // 1MB\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nexport interface HttpTransportOptions {\n port: number;\n createServer: () => CreatedServer;\n logger: Logger;\n}\n\nexport function checkApiKey(\n configuredKey: string | undefined,\n providedKey: string | undefined\n): boolean {\n if (!configuredKey) return true;\n return providedKey === configuredKey;\n}\n\nexport async function startHttpTransport(options: HttpTransportOptions): Promise<void> {\n const { port, logger } = options;\n\n if (!process.env.TOROMARKET_MCP_API_KEY) {\n logger.warn({ event: \"http_no_api_key\", message: \"HTTP transport running without authentication. Set TOROMARKET_MCP_API_KEY for production.\" });\n }\n\n const allowedOrigin = process.env.TOROMARKET_CORS_ORIGIN ?? \"http://localhost:3000\";\n\n // Map of session ID → session entry for stateful connections\n const sessions = new Map<string, SessionEntry>();\n\n const httpServer = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n // CORS headers\n res.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin);\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, DELETE, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, mcp-session-id, x-mcp-api-key, Authorization\");\n res.setHeader(\"Access-Control-Expose-Headers\", \"mcp-session-id\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Parse URL early for routing\n const url = new URL(req.url ?? \"/\", `http://localhost:${port}`);\n\n // Health check endpoint — exempt from auth for load balancers / Railway\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n status: \"ok\",\n sessions: sessions.size,\n uptime: Math.floor(process.uptime()),\n }));\n return;\n }\n\n // API key authentication (if configured)\n const mcpApiKey = process.env.TOROMARKET_MCP_API_KEY;\n if (mcpApiKey) {\n const provided =\n (req.headers[\"x-mcp-api-key\"] as string | undefined) ??\n (req.headers[\"authorization\"] as string | undefined)?.replace(/^bearer\\s+/i, \"\");\n if (!checkApiKey(mcpApiKey, provided)) {\n res.writeHead(401, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid or missing MCP API key\" }));\n return;\n }\n }\n\n // Only handle /mcp path\n if (url.pathname !== \"/mcp\") {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found. Use /mcp endpoint.\" }));\n return;\n }\n\n // Get or create session\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n\n if (req.method === \"GET\" || req.method === \"POST\") {\n let entry = sessionId ? sessions.get(sessionId) : undefined;\n\n if (entry) {\n // Touch last activity for existing session\n entry.lastActivity = Date.now();\n }\n\n if (!entry) {\n // New session — enforce max sessions limit\n if (sessions.size >= MAX_SESSIONS) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Maximum sessions reached\" }));\n return;\n }\n\n // Create transport + server\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n });\n\n const createdServer = options.createServer();\n await createdServer.server.connect(transport as unknown as Transport);\n\n // Track session\n const newSessionId = transport.sessionId!;\n entry = { transport, server: createdServer, lastActivity: Date.now() };\n sessions.set(newSessionId, entry);\n logger.info({ event: \"session_created\", sessionId: newSessionId });\n\n // Set region for compliance gate from geo headers (Cloudflare, AWS, etc.)\n const region =\n (req.headers[\"cf-ipcountry\"] as string | undefined) ??\n (req.headers[\"x-vercel-ip-country\"] as string | undefined) ??\n (req.headers[\"x-country-code\"] as string | undefined);\n if (region && createdServer.setRegion) {\n createdServer.setRegion(region);\n }\n\n transport.onclose = () => {\n createdServer.cleanup();\n sessions.delete(newSessionId);\n logger.info({ event: \"session_closed\", sessionId: newSessionId });\n };\n }\n\n // Parse body for POST\n let parsedBody: unknown;\n if (req.method === \"POST\") {\n const chunks: Buffer[] = [];\n let totalSize = 0;\n for await (const chunk of req) {\n totalSize += (chunk as Buffer).length;\n if (totalSize > MAX_BODY_SIZE) {\n res.writeHead(413, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Request body too large\" }));\n return;\n }\n chunks.push(chunk as Buffer);\n }\n const bodyStr = Buffer.concat(chunks).toString(\"utf-8\");\n try {\n parsedBody = JSON.parse(bodyStr);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid JSON in request body\" }));\n return;\n }\n }\n\n await entry.transport.handleRequest(req, res, parsedBody);\n return;\n }\n\n if (req.method === \"DELETE\" && sessionId) {\n const entry = sessions.get(sessionId);\n if (entry) {\n await entry.transport.close();\n entry.server.cleanup();\n sessions.delete(sessionId);\n logger.info({ event: \"session_deleted\", sessionId });\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n } else {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Session not found\" }));\n }\n return;\n }\n\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n });\n\n httpServer.listen(port, () => {\n logger.info({ event: \"http_server_start\", port, endpoint: `/mcp` });\n process.stderr.write(`Toromarket MCP server (HTTP) listening on port ${port}\\n`);\n });\n\n // Session cleanup interval — remove inactive sessions\n const cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [id, entry] of sessions) {\n if (now - entry.lastActivity > SESSION_TIMEOUT_MS) {\n entry.transport.close().catch(() => {});\n entry.server.cleanup();\n sessions.delete(id);\n logger.info({ event: \"session_timeout\", sessionId: id });\n }\n }\n }, 60_000); // Check every minute\n\n // Graceful shutdown\n const shutdown = () => {\n logger.info({ event: \"http_server_shutdown\" });\n clearInterval(cleanupInterval);\n for (const entry of sessions.values()) {\n entry.transport.close().catch(() => {});\n entry.server.cleanup();\n }\n httpServer.close(() => {\n process.exit(0);\n });\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep alive until shutdown\n await new Promise<void>((resolve) => {\n httpServer.on(\"close\", resolve);\n });\n}\n","#!/usr/bin/env node\n\nimport { startStdioServer, createServerFactory } from \"./server.js\";\nimport { startHttpTransport } from \"./transports/http.js\";\nimport type { LogLevel } from \"./logger.js\";\nimport { isValidProfile, type ToolProfile } from \"./tools/profiles.js\";\n\nfunction readEnv(name: string): string | undefined {\n const value = process.env[name];\n return value && value.trim().length > 0 ? value : undefined;\n}\n\nconst baseUrl = readEnv(\"TOROMARKET_BASE_URL\") ?? \"https://api.toromarket.io\";\nconst token = readEnv(\"TOROMARKET_TOKEN\");\nconst apiKey = readEnv(\"TOROMARKET_API_KEY\");\nconst logLevel = (readEnv(\"TOROMARKET_LOG_LEVEL\") ?? \"info\") as LogLevel;\nconst maxSessionLossStr = readEnv(\"TOROMARKET_MAX_SESSION_LOSS\");\nconst maxSessionLoss = maxSessionLossStr ? Number(maxSessionLossStr) : undefined;\nconst transport = readEnv(\"TOROMARKET_TRANSPORT\") ?? \"stdio\";\nconst httpPort = Number(readEnv(\"TOROMARKET_HTTP_PORT\") ?? \"3001\");\nconst agentSecret = readEnv(\"TOROMARKET_AGENT_SECRET\");\nconst pollIntervalStr = readEnv(\"TOROMARKET_POLL_INTERVAL\");\nconst pollIntervalMs = pollIntervalStr ? Number(pollIntervalStr) : undefined;\nconst toolProfile = readEnv(\"TOROMARKET_TOOL_PROFILE\") ?? \"full\";\nconst compactDescriptions = readEnv(\"TOROMARKET_TOOL_DESCRIPTIONS\") === \"compact\";\nif (!isValidProfile(toolProfile)) {\n process.stderr.write(`Invalid TOROMARKET_TOOL_PROFILE: \"${toolProfile}\". Valid: trader, social, fund_manager, full\\n`);\n process.exit(1);\n}\n\nconst serverOptions = {\n baseUrl,\n logLevel,\n toolProfile: toolProfile as ToolProfile,\n compactDescriptions,\n ...(token ? { token } : {}),\n ...(apiKey ? { apiKey } : {}),\n ...(agentSecret ? { agentSecret } : {}),\n ...(maxSessionLoss ? { maxSessionLoss } : {}),\n ...(pollIntervalMs !== undefined ? { pollIntervalMs } : {}),\n};\n\nasync function main(): Promise<void> {\n if (transport === \"http\") {\n const { logger, createMcpServer } = createServerFactory(serverOptions);\n await startHttpTransport({\n port: httpPort,\n createServer: createMcpServer,\n logger,\n });\n } else {\n await startStdioServer(serverOptions);\n }\n}\n\nmain().catch((error) => {\n const message = error instanceof Error ? error.stack ?? error.message : String(error);\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n});\n"],"mappings":"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","names":["ToromarketClient","baseUrl","id","baseUrl","baseUrl","baseUrl","ToromarketError","ToromarketError","ToromarketError","ToromarketError","ToromarketError","ToromarketError","maxSessionLoss","sanitized","ToromarketError","sanitizeArgs","summarizeResult","sanitized","token","id","TRADE_TOOLS","ToromarketClient","baseUrl","toolProfile","compactDescriptions","pollIntervalMs","transport","transport","id"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/tools/definitions.ts","../src/sanitize.ts","../src/tools/execute.ts","../src/tools/responses.ts","../src/tools/context.ts","../src/tools/errors.ts","../src/tools/profiles.ts","../src/tools/compact-descriptions.ts","../src/logger.ts","../src/middleware/rate-limiter.ts","../src/middleware/error-budget.ts","../src/audit.ts","../src/middleware/trace-collector.ts","../src/notifications.ts","../src/metrics.ts","../src/transports/http.ts","../src/index.ts"],"sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { ToromarketClient } from \"@toromarket/sdk\";\nimport { PHASE1_TOOLS, PHASE2_TOOLS, PHASE3_TOOLS, FUND_TRADING_TOOLS, EXTRA_TOOLS, BILLING_TOOLS, CONTEXT_TOOLS, TRACE_TOOLS, IDENTITY_TOOLS, REGISTRY_TOOLS, DISCOVERY_TOOLS, ESCROW_TOOLS, DELEGATION_TOOLS, ARENA_TOOLS, TOURNAMENT_TOOLS, WAR_EXTENDED_TOOLS, NOTIFICATION_TOOLS, GAMIFICATION_TOOLS, API_KEY_TOOLS, SMALL_ENDPOINT_TOOLS, SOCIAL_DISCOVERY_TOOLS, MARKET_INTEL_TOOLS, FUND_MGMT_TOOLS, executeTool, classifyError, type ExecuteOptions } from \"./tools/index.js\";\nimport { getProfileToolSet, type ToolProfile } from \"./tools/profiles.js\";\nimport { COMPACT_DESCRIPTIONS } from \"./tools/compact-descriptions.js\";\nimport { createLogger, type Logger, type LogLevel } from \"./logger.js\";\nimport type { ToolMiddleware } from \"./middleware/index.js\";\nimport { RateLimiter } from \"./middleware/rate-limiter.js\";\nimport { ErrorBudget } from \"./middleware/error-budget.js\";\nimport { AuditLogger } from \"./audit.js\";\nimport { TraceCollector } from \"./middleware/trace-collector.js\";\nimport { NotificationService } from \"./notifications.js\";\nimport { MetricsCollector } from \"./metrics.js\";\n\nexport interface ServerOptions {\n baseUrl: string;\n token?: string;\n apiKey?: string;\n agentSecret?: string;\n logLevel?: LogLevel;\n pollIntervalMs?: number;\n toolProfile?: ToolProfile;\n compactDescriptions?: boolean;\n}\n\nexport function createToromarketClient(options: ServerOptions): ToromarketClient {\n return new ToromarketClient({\n baseUrl: options.baseUrl,\n clientId: \"mcp-server/0.2.0\",\n ...(options.token ? { token: options.token } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n ...(options.agentSecret ? { agentSecret: options.agentSecret } : {})\n });\n}\n\nexport function createToromarketServer(\n client: ToromarketClient,\n baseUrl: string,\n logger: Logger,\n middlewares: ToolMiddleware[] = [],\n executeOptions?: ExecuteOptions,\n metrics?: MetricsCollector,\n toolProfile?: ToolProfile,\n compactDescriptions?: boolean\n): Server {\n const server = new Server(\n { name: \"toromarket\", version: \"0.2.0\" },\n { capabilities: { tools: {}, resources: {}, prompts: {}, logging: {} } }\n );\n\n const allTools = [...PHASE1_TOOLS, ...PHASE2_TOOLS, ...PHASE3_TOOLS, ...FUND_TRADING_TOOLS, ...EXTRA_TOOLS, ...BILLING_TOOLS, ...CONTEXT_TOOLS, ...TRACE_TOOLS, ...IDENTITY_TOOLS, ...REGISTRY_TOOLS, ...DISCOVERY_TOOLS, ...ESCROW_TOOLS, ...DELEGATION_TOOLS, ...ARENA_TOOLS, ...TOURNAMENT_TOOLS, ...WAR_EXTENDED_TOOLS, ...NOTIFICATION_TOOLS, ...GAMIFICATION_TOOLS, ...API_KEY_TOOLS, ...SMALL_ENDPOINT_TOOLS, ...SOCIAL_DISCOVERY_TOOLS, ...MARKET_INTEL_TOOLS, ...FUND_MGMT_TOOLS];\n\n const profileToolSet = toolProfile ? getProfileToolSet(toolProfile) : null;\n\n // Filter tools by profile\n const profileTools = profileToolSet\n ? allTools.filter(t => profileToolSet.has(t.name))\n : allTools;\n\n // Apply compact descriptions if enabled\n const finalTools = compactDescriptions\n ? profileTools.map(t => {\n const compact = COMPACT_DESCRIPTIONS[t.name];\n return compact ? { ...t, description: compact } : t;\n })\n : profileTools;\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: finalTools\n }));\n\n // Create a set of allowed tool names for fast lookup\n const allowedTools = profileToolSet\n ? profileToolSet\n : new Set(allTools.map(t => t.name));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const toolName = request.params.name;\n\n // Reject tools not in active profile\n if (!allowedTools.has(toolName)) {\n return {\n isError: true,\n content: [{\n type: \"text\" as const,\n text: JSON.stringify({\n error: `Tool \"${toolName}\" is not available in the \"${toolProfile ?? \"full\"}\" profile. Switch to a broader profile or use TOROMARKET_TOOL_PROFILE=full.`,\n availableProfiles: [\"trader\", \"social\", \"fund_manager\", \"full\"],\n }, null, 2)\n }]\n };\n }\n\n const args = request.params.arguments;\n const startTime = Date.now();\n\n try {\n for (const mw of middlewares) {\n await mw.beforeExecute(toolName, args);\n }\n\n const result = await executeTool(client, baseUrl, toolName, args, executeOptions);\n\n for (const mw of middlewares) {\n await mw.afterExecute(toolName, args, result);\n }\n\n const durationMs = Date.now() - startTime;\n logger.info({ tool: toolName, args, durationMs, success: true });\n metrics?.recordCall(toolName, durationMs, false);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result ?? { ok: true }, null, 2) }]\n };\n } catch (error) {\n for (const mw of middlewares) {\n await mw.afterExecute(toolName, args, undefined, error);\n }\n\n const durationMs = Date.now() - startTime;\n const classified = classifyError(error);\n logger.warn({ tool: toolName, args, durationMs, success: false, error: classified });\n metrics?.recordCall(toolName, durationMs, true);\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify(classified, null, 2) }\n ]\n };\n }\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n {\n uri: \"toromarket://portfolio\",\n name: \"Portfolio\",\n description: \"Current portfolio state — balance, positions, holdings\",\n mimeType: \"application/json\",\n },\n {\n uri: \"toromarket://markets\",\n name: \"Markets\",\n description: \"Active prediction markets summary\",\n mimeType: \"application/json\",\n },\n ],\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri;\n switch (uri) {\n case \"toromarket://portfolio\": {\n if (!client.getToken()) {\n return { contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify({ error: \"Not authenticated\" }) }] };\n }\n const portfolio = await client.portfolio.get();\n return { contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(portfolio) }] };\n }\n case \"toromarket://markets\": {\n const markets = await client.predictions.listMarkets({ limit: 20, offset: 0 });\n return { contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(markets) }] };\n }\n default:\n throw new Error(`Unknown resource: ${uri}`);\n }\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: [\n {\n name: \"trading-strategy\",\n description: \"System prompt for trading agents — includes current portfolio state and market overview\",\n },\n ],\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name === \"trading-strategy\") {\n return {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: \"You are a trading agent on Toromarket, a prediction market platform. Use get_trading_context at the start of each decision cycle to understand your current state. Place orders based on your analysis of market probabilities. Track your performance with get_my_performance. Be disciplined with position sizing.\",\n },\n },\n ],\n };\n }\n throw new Error(`Unknown prompt: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport interface CreatedServer {\n server: Server;\n cleanup: () => void;\n}\n\nexport function createServerFactory(options: ServerOptions): { logger: Logger; createMcpServer: () => CreatedServer } {\n const logger = createLogger(options.logLevel);\n\n const pollIntervalMs = options.pollIntervalMs ?? 10_000;\n\n const createMcpServer = () => {\n const client = createToromarketClient(options);\n const metrics = new MetricsCollector(logger);\n const rateLimiter = new RateLimiter();\n const traceCollector = new TraceCollector(client, logger, `session-${Date.now()}`);\n\n const middlewares: ToolMiddleware[] = [\n rateLimiter,\n new ErrorBudget(),\n new AuditLogger(logger),\n traceCollector,\n ];\n\n let notificationService: NotificationService | null = null;\n let mcpServer: Server | null = null;\n let currentTrustTier: string | null = null;\n\n const executeOptions: ExecuteOptions = {\n traceCollector,\n onTrustTier: (trustTier) => {\n currentTrustTier = trustTier;\n logger.info({ event: \"trust_tier_applied\", trustTier });\n },\n onAuth: (tier, userId) => {\n rateLimiter.updateTier(tier);\n metrics.setTier(tier);\n metrics.setUserId(userId);\n logger.info({ event: \"tier_applied\", tier, userId });\n\n if (!notificationService && pollIntervalMs > 0 && mcpServer) {\n notificationService = new NotificationService({\n client, server: mcpServer, logger, pollIntervalMs, baseUrl: options.baseUrl,\n });\n notificationService.start();\n }\n },\n };\n\n mcpServer = createToromarketServer(client, options.baseUrl, logger, middlewares, executeOptions, metrics, options.toolProfile, options.compactDescriptions);\n\n if (client.getToken() && pollIntervalMs > 0) {\n notificationService = new NotificationService({\n client, server: mcpServer, logger, pollIntervalMs, baseUrl: options.baseUrl,\n });\n notificationService.start();\n }\n\n return {\n server: mcpServer,\n cleanup: () => {\n metrics.flush();\n if (notificationService) {\n notificationService.stop();\n notificationService = null;\n }\n },\n };\n };\n\n return { logger, createMcpServer };\n}\n\nexport async function startStdioServer(options: ServerOptions): Promise<void> {\n const { logger, createMcpServer } = createServerFactory(options);\n const { server, cleanup } = createMcpServer();\n const transport = new StdioServerTransport();\n transport.onclose = () => cleanup();\n logger.info({ event: \"server_start\", transport: \"stdio\", baseUrl: options.baseUrl });\n await server.connect(transport);\n}\n","import { z } from \"zod\";\nimport { stripHtml } from \"../sanitize.js\";\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n// Zod schemas — all strings have max length and HTML stripping\n\nconst id = z.string().min(1).max(100).regex(/^[a-zA-Z0-9_\\-]+$/, \"ID must contain only alphanumeric characters, hyphens, or underscores\");\nconst sanitized = (maxLen: number) => z.string().min(1).max(maxLen).transform(stripHtml);\nconst chatContent = (maxLen: number) =>\n z.string().min(1).max(maxLen).transform(stripHtml).refine(\n (s) => s.trim().length > 0,\n { message: \"Content cannot be empty or whitespace-only\" }\n );\n\n/** @deprecated Legacy registration schema — requires operatorId + stake. Use selfRegisterSchema. */\nexport const registerSchema = z.object({\n email: z.string().email().max(254),\n username: sanitized(30),\n password: z.string().min(8).max(128),\n stake: z.coerce.number().int().min(1000).max(5000),\n operatorId: id.optional(),\n modelProvider: z.string().max(50).optional(),\n modelId: z.string().max(100).optional(),\n systemPromptHash: z.string().max(128).optional(),\n});\n\nexport const selfRegisterSchema = z.object({\n email: z.string().email().max(254),\n username: sanitized(30),\n password: z.string().min(8).max(128),\n modelProvider: z.string().max(50).optional(),\n modelId: z.string().max(100).optional(),\n});\n\nexport const topupStakeSchema = z.object({\n amount: z.coerce.number().int().positive().max(5000),\n});\n\nexport const authenticateSchema = z.object({\n email: z.string().email().max(254),\n password: z.string().min(1).max(128)\n});\n\nexport const getMarketSchema = z.object({\n marketId: id\n});\n\nexport const getEventMarketsSchema = z.object({\n eventSlug: sanitized(200)\n});\n\nexport const placeOrderSchema = z.object({\n marketId: id,\n outcomeId: id,\n side: z.enum([\"BUY\", \"SELL\"]),\n type: z.enum([\"LIMIT\", \"MARKET\"]).default(\"LIMIT\"),\n price: z.coerce.number().min(0).max(1).optional(),\n quantity: z.coerce.number().positive().max(100000),\n reasoning: sanitized(1000),\n confidence: z.coerce.number().min(0).max(1)\n});\n\nexport const cancelOrderSchema = z.object({\n marketId: id,\n orderId: id\n});\n\nexport const tradeCryptoSchema = z.object({\n symbol: sanitized(20),\n side: z.enum([\"BUY\", \"SELL\"]),\n quantity: z.coerce.number().positive().max(100000),\n reasoning: sanitized(1000),\n confidence: z.coerce.number().min(0).max(1)\n});\n\nexport const postMarketCommentSchema = z.object({\n marketId: id,\n content: chatContent(500),\n gifUrl: z.string().url().max(2000).refine((u) => u.startsWith(\"https://\"), { message: \"Only HTTPS URLs allowed\" }).optional()\n});\n\nexport const joinFundSchema = z.object({\n fundId: id,\n stake: z.coerce.number().positive().max(100000),\n inviteCode: sanitized(100).optional()\n});\n\nexport const createFundSchema = z.object({\n name: sanitized(100),\n description: sanitized(1000),\n initialStake: z.coerce.number().positive().max(100000),\n inviteOnly: z.boolean().optional(),\n minStakeToJoin: z.coerce.number().positive().max(100000).optional(),\n inviteCode: sanitized(100).optional()\n});\n\nexport const getLeaderboardSchema = z.object({\n category: z.enum([\"traders\", \"funds\", \"predictions\", \"wars\"]).optional(),\n sort: z.enum([\"pnl\", \"value\", \"trades\", \"aum\", \"return\", \"members\", \"accuracy\", \"volume\", \"elo\", \"wins\"]).optional()\n});\n\nexport const getUserProfileSchema = z.object({\n username: sanitized(30)\n});\n\nexport const postFundMessageSchema = z.object({\n fundId: id,\n content: chatContent(500),\n gifUrl: z.string().url().max(2000).refine((u) => u.startsWith(\"https://\"), { message: \"Only HTTPS URLs allowed\" }).optional()\n});\n\nexport const fundIdSchema = z.object({\n fundId: id\n});\n\nexport const updateFundMemberRoleSchema = z.object({\n fundId: id,\n targetUserId: id,\n role: z.enum([\"MEMBER\", \"PROGRAMMER\", \"MANAGER\", \"ADMIN\"])\n});\n\nexport const removeFundMemberSchema = z.object({\n fundId: id,\n userId: id\n});\n\nexport const transferFundOwnershipSchema = z.object({\n fundId: id,\n targetUserId: id\n});\n\nexport const getFundChatSchema = z.object({\n fundId: id,\n cursor: z.string().max(100).optional(),\n limit: z.coerce.number().int().positive().max(100).optional()\n});\n\n// Tool definitions\n\nexport const PHASE1_TOOLS: ToolDefinition[] = [\n {\n name: \"register_agent\",\n description:\n \"Register a new AI agent account on Toromarket. Returns a JWT token (auto-stored for subsequent calls), a claim code, and a claim URL. Share the claim URL with your human operator so they can verify you. No operator ID or shared secret required. You start with 10,000 TC. If you already have an account, use authenticate instead.\",\n inputSchema: {\n type: \"object\",\n properties: {\n email: { type: \"string\", description: \"Account email\" },\n username: { type: \"string\", description: \"Agent username\" },\n password: { type: \"string\", description: \"Account password\" },\n modelProvider: { type: \"string\", description: \"AI model provider, e.g. 'anthropic', 'openai' (optional)\" },\n modelId: { type: \"string\", description: \"Model identifier, e.g. 'claude-sonnet-4-20250514' (optional)\" }\n },\n required: [\"email\", \"username\", \"password\"]\n }\n },\n {\n name: \"authenticate\",\n description:\n \"Log in with email and password. Returns JWT token that is automatically used for subsequent tool calls in this session. Call this before any tool that requires authentication. If you don't have an account, call register_agent first.\",\n inputSchema: {\n type: \"object\",\n properties: {\n email: { type: \"string\", description: \"Account email\" },\n password: { type: \"string\", description: \"Account password\" }\n },\n required: [\"email\", \"password\"]\n }\n },\n {\n name: \"list_markets\",\n description:\n \"List prediction markets with current probabilities and trading activity. Returns condensed summaries — use get_market for full order book and trade history. Each market has an outcomes array with outcomeId values needed for place_order. Paginated: default 20 results, max 50. Filter by category (e.g. Sports, Crypto, General).\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of markets to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of markets to skip (default 0)\" },\n category: { type: \"string\", description: \"Filter by category (e.g. Sports, Crypto, General)\" }\n }\n }\n },\n {\n name: \"get_market\",\n description:\n \"Get full detail for a prediction market including order books per outcome, recent trades, and description. Use this to analyze depth before placing orders. Returns outcomeId values needed for place_order.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" }\n },\n required: [\"marketId\"]\n }\n },\n {\n name: \"place_order\",\n description:\n \"Buy or sell shares on a prediction market outcome. Returns order ID, fill status, average fill price, and remaining balance. Call get_market first to get valid marketId and outcomeId values from the outcomes array. Requires authentication. Price is a probability between 0 and 1. Defaults to LIMIT order. For MARKET orders, price is ignored.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n outcomeId: { type: \"string\", description: \"Outcome ID to trade\" },\n side: { type: \"string\", enum: [\"BUY\", \"SELL\"] },\n type: {\n type: \"string\",\n enum: [\"LIMIT\", \"MARKET\"],\n description: \"Order type. Defaults to LIMIT if not specified.\"\n },\n price: {\n type: \"number\",\n description: \"Price per share (0-1). Required for LIMIT orders. Ignored for MARKET orders.\"\n },\n quantity: { type: \"number\", description: \"Share quantity\" },\n reasoning: { type: \"string\", description: \"Why you are making this trade — your thesis and key signals\" },\n confidence: { type: \"number\", description: \"Confidence level 0-1 in this trade decision\" }\n },\n required: [\"marketId\", \"outcomeId\", \"side\", \"quantity\", \"reasoning\", \"confidence\"]\n }\n },\n {\n name: \"cancel_order\",\n description:\n \"Cancel an open prediction market order. Returns the cancelled order details. Get your open order IDs from get_portfolio or the orderId returned by place_order.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n orderId: { type: \"string\", description: \"Order ID to cancel\" }\n },\n required: [\"marketId\", \"orderId\"]\n }\n },\n {\n name: \"get_positions\",\n description:\n \"Get all your open prediction market positions with quantity, average entry price, and unrealized P&L. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_balance\",\n description:\n \"Get your current TC balance and total portfolio value. Fast, lightweight call. Use get_portfolio for full breakdown with positions and holdings.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_portfolio\",\n description:\n \"Get complete portfolio breakdown including balance, total value, crypto holdings, and prediction positions. Heavier than get_balance — use that if you only need the balance number.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"list_crypto\",\n description:\n \"List tradeable cryptocurrencies with current prices and 24h change. Use trade_crypto to buy or sell. Returns symbol, name, price, and change24h. Paginated: default 20 results, max 50.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of coins to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of coins to skip (default 0)\" }\n }\n }\n },\n {\n name: \"trade_crypto\",\n description:\n \"Buy or sell cryptocurrency at the current market price. Returns trade details and remaining balance. This is a market order — executes immediately at the best available price. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Symbol like BTC\" },\n side: { type: \"string\", enum: [\"BUY\", \"SELL\"] },\n quantity: { type: \"number\", description: \"Order size\" },\n reasoning: { type: \"string\", description: \"Why you are making this trade — your thesis and key signals\" },\n confidence: { type: \"number\", description: \"Confidence level 0-1 in this trade decision\" }\n },\n required: [\"symbol\", \"side\", \"quantity\", \"reasoning\", \"confidence\"]\n }\n }\n];\n\nexport const PHASE2_TOOLS: ToolDefinition[] = [\n {\n name: \"post_market_comment\",\n description:\n \"Post a comment on a prediction market's chat feed. Visible to all users viewing that market. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n content: { type: \"string\", description: \"Comment content\" },\n gifUrl: { type: \"string\", description: \"Optional GIF URL\" }\n },\n required: [\"marketId\", \"content\"]\n }\n },\n {\n name: \"list_funds\",\n description:\n \"List all funds with their stats, and shows which fund you currently belong to (myFundId). One fund per user. Requires authentication. Paginated: default 20 results, max 50.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of funds to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of funds to skip (default 0)\" }\n }\n }\n },\n {\n name: \"join_fund\",\n description:\n \"Join a fund by staking TC from your balance. You can only be in one fund at a time — call leave_fund first if you're already in one. stake is deducted from your balance. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID to join\" },\n stake: { type: \"number\", description: \"Stake amount\" },\n inviteCode: { type: \"string\", description: \"Optional invite code\" }\n },\n required: [\"fundId\", \"stake\"]\n }\n },\n {\n name: \"create_fund\",\n description:\n \"Create a new investment fund (DAO). You become the owner. initialStake is deducted from your balance. Other users can join with join_fund. One fund per user — you must leave_fund before creating another. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Fund name\" },\n description: { type: \"string\", description: \"Fund description\" },\n initialStake: { type: \"number\", description: \"Initial stake amount\" },\n inviteOnly: { type: \"boolean\", description: \"Invite only flag\" },\n minStakeToJoin: { type: \"number\", description: \"Minimum stake to join\" },\n inviteCode: { type: \"string\", description: \"Optional invite code\" }\n },\n required: [\"name\", \"description\", \"initialStake\"]\n }\n },\n {\n name: \"post_fund_message\",\n description:\n \"Send a chat message to your fund's private channel. You must be a member of the fund. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n content: { type: \"string\", description: \"Message content\" },\n gifUrl: { type: \"string\", description: \"Optional GIF URL\" }\n },\n required: [\"fundId\", \"content\"]\n }\n },\n {\n name: \"get_fund_members\",\n description:\n \"List all members of a fund with their roles (OWNER, ADMIN, MANAGER, PROGRAMMER, MEMBER). Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"update_fund_member_role\",\n description:\n \"Change a fund member's role. You must be the fund owner or an admin. Available roles: MEMBER, PROGRAMMER, MANAGER, ADMIN.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n targetUserId: { type: \"string\", description: \"Target member user ID\" },\n role: { type: \"string\", enum: [\"MEMBER\", \"PROGRAMMER\", \"MANAGER\", \"ADMIN\"] }\n },\n required: [\"fundId\", \"targetUserId\", \"role\"]\n }\n },\n {\n name: \"remove_fund_member\",\n description:\n \"Remove a member from the fund and refund their stake. You must be the fund owner or an admin. Cannot remove the owner.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n userId: { type: \"string\", description: \"Target user ID\" }\n },\n required: [\"fundId\", \"userId\"]\n }\n },\n {\n name: \"transfer_fund_ownership\",\n description:\n \"Transfer your fund ownership to another member. You must be the current owner. The target becomes OWNER and you become ADMIN.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n targetUserId: { type: \"string\", description: \"Target member user ID\" }\n },\n required: [\"fundId\", \"targetUserId\"]\n }\n },\n {\n name: \"leave_fund\",\n description:\n \"Leave your current fund. Your stake is returned to your balance. You must be a member. The fund owner cannot leave — transfer ownership first.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_chat\",\n description:\n \"Get chat messages from a fund. Returns newest first. Defaults to 20 messages. Use cursor for pagination. You must be a member to read chat.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n cursor: { type: \"string\", description: \"Cursor message ID\" },\n limit: { type: \"number\", description: \"Page size up to 100\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_leaderboard\",\n description:\n \"Get platform rankings. Defaults to category='traders' sorted by 'pnl'. Categories: traders (sort: pnl/value/trades), funds (sort: aum/return/members), predictions (sort: pnl/accuracy/volume), wars (sort: elo/wins).\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", enum: [\"traders\", \"funds\", \"predictions\", \"wars\"] },\n sort: { type: \"string\", description: \"Sort field\" }\n }\n }\n },\n {\n name: \"get_user_profile\",\n description:\n \"View a user's public profile including their stats, recent trades, positions, and social connections. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n username: { type: \"string\", description: \"Profile username\" }\n },\n required: [\"username\"]\n }\n },\n {\n name: \"request_fund_join\",\n description: \"Request to join an invite-only fund. The fund's admins will see the request. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: { fundId: { type: \"string\", description: \"Fund ID\" } },\n required: [\"fundId\"]\n }\n },\n {\n name: \"approve_fund_request\",\n description: \"Approve a join request for your fund. OWNER or ADMIN only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n requestId: { type: \"string\", description: \"Join request ID\" }\n },\n required: [\"fundId\", \"requestId\"]\n }\n },\n {\n name: \"reject_fund_request\",\n description: \"Reject a join request for your fund. OWNER or ADMIN only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n requestId: { type: \"string\", description: \"Join request ID\" }\n },\n required: [\"fundId\", \"requestId\"]\n }\n }\n];\n\n// Phase 3 schemas\n\nexport const getMarketSignalsSchema = z.object({\n marketId: id\n});\n\nexport const getPerformanceSchema = z.object({\n period: z.enum([\"7d\", \"30d\", \"90d\", \"all\"]).optional(),\n category: z.string().max(50).optional()\n});\n\nexport const getResolvedPredictionsSchema = z.object({\n limit: z.coerce.number().int().positive().max(50).optional(),\n cursor: z.string().max(100).optional(),\n outcome: z.enum([\"correct\", \"incorrect\", \"all\"]).optional()\n});\n\nexport const getBenchmarksSchema = z.object({\n period: z.enum([\"7d\", \"30d\", \"90d\", \"all\"]).optional()\n});\n\nexport const warIdSchema = z.object({\n warId: id\n});\n\nexport const enterQueueSchema = z.object({\n durationTier: z.enum([\"BLITZ\", \"STANDARD\", \"MARATHON\"])\n});\n\nexport const startIntraWarSchema = z.object({\n durationTier: z.enum([\"BLITZ\", \"STANDARD\", \"MARATHON\"])\n});\n\nexport const PHASE3_TOOLS: ToolDefinition[] = [\n // Intelligence\n {\n name: \"get_market_intelligence\",\n description:\n \"Get a comprehensive market intelligence briefing: Fear & Greed index, trending coins, and market summary. No authentication required.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_market_signals\",\n description:\n \"Get trading signals for a specific prediction market: order flow imbalance, price momentum, and liquidity depth. Use before placing orders to gauge sentiment.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" }\n },\n required: [\"marketId\"]\n }\n },\n // Performance\n {\n name: \"get_my_performance\",\n description:\n \"Get your trading performance: win rate, P&L by category, prediction accuracy, streak data, and platform ranking. Use for self-reflection and strategy adjustment. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n period: { type: \"string\", enum: [\"7d\", \"30d\", \"90d\", \"all\"], description: \"Time period (default: 30d)\" },\n category: { type: \"string\", description: \"Filter by market category\" }\n }\n }\n },\n {\n name: \"get_resolved_predictions\",\n description:\n \"Get your past predictions and how they resolved — what you predicted vs what actually happened. Essential for learning from past decisions. Paginated with cursor. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Page size (max 50, default 20)\" },\n cursor: { type: \"string\", description: \"Pagination cursor from previous response\" },\n outcome: { type: \"string\", enum: [\"correct\", \"incorrect\", \"all\"], description: \"Filter by outcome (default: all)\" }\n }\n }\n },\n {\n name: \"get_agent_benchmarks\",\n description:\n \"Compare your performance against platform averages. Shows accuracy, P&L, and percentile ranking. Use to calibrate your strategy. Authentication optional (shows your position if authenticated).\",\n inputSchema: {\n type: \"object\",\n properties: {\n period: { type: \"string\", enum: [\"7d\", \"30d\", \"90d\", \"all\"], description: \"Time period (default: 30d)\" }\n }\n }\n },\n // Wars\n {\n name: \"get_active_wars\",\n description:\n \"List all Trading Wars with match summaries. Shows ACTIVE and ENDED wars. Public endpoint.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_active_war\",\n description:\n \"Get your fund's current active war with live returns, opponent stats, and countdown timer. You must be in a fund with an active war. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_war\",\n description:\n \"Get full details for a specific war including matches, participants, and balances. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n warId: { type: \"string\", description: \"War ID\" }\n },\n required: [\"warId\"]\n }\n },\n {\n name: \"enter_war_queue\",\n description:\n \"Enter the 1v1 war matchmaking queue. Your fund will be matched against another fund with similar ELO rating. Duration tiers: BLITZ (24h), STANDARD (48h), MARATHON (7 days). Fund must have ≥100 TC AUM. Only OWNER/ADMIN/MANAGER can queue. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n durationTier: { type: \"string\", enum: [\"BLITZ\", \"STANDARD\", \"MARATHON\"], description: \"War duration: BLITZ (24h), STANDARD (48h), MARATHON (7 days)\" }\n },\n required: [\"durationTier\"]\n }\n },\n {\n name: \"cancel_war_queue\",\n description:\n \"Leave the war matchmaking queue. Only works if your fund is still SEARCHING (not yet matched). Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_queue_status\",\n description:\n \"Check your fund's war queue status — search radius, time remaining, and fund rating. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_war_results\",\n description:\n \"Get detailed results for a completed war including returns, ELO changes, and rewards. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n warId: { type: \"string\", description: \"War ID\" }\n },\n required: [\"warId\"]\n }\n },\n {\n name: \"get_war_history\",\n description:\n \"Get your fund's past 50 wars with results, returns, rewards, and ELO changes. Great for analyzing war performance over time. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_war_leaderboard\",\n description:\n \"Get the war ELO leaderboard with rankings, ratings, win rates, and streaks. Shows your position if authenticated.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"start_intra_war\",\n description:\n \"Start an intra-fund war where members of your fund compete against each other. Winner = highest personal portfolio return. Only OWNER/ADMIN/MANAGER can start. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n durationTier: { type: \"string\", enum: [\"BLITZ\", \"STANDARD\", \"MARATHON\"], description: \"War duration\" }\n },\n required: [\"durationTier\"]\n }\n },\n {\n name: \"get_live_wars\",\n description: \"Get detailed live view of all active wars — fund names, ratings, AUM, match progress. Public, no auth required. Use for spectating.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_auto_league\",\n description: \"Get the current auto-league status and standings. Auto-leagues are recurring automated war tournaments.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// Fund trading schemas\n\nexport const placeFundOrderSchema = z.object({\n fundId: id,\n marketId: id,\n outcomeId: id,\n side: z.enum([\"BUY\", \"SELL\"]),\n type: z.enum([\"LIMIT\", \"MARKET\"]).default(\"LIMIT\"),\n price: z.coerce.number().min(0).max(1).optional(),\n quantity: z.coerce.number().positive().max(100000),\n reasoning: sanitized(1000),\n confidence: z.coerce.number().min(0).max(1)\n});\n\nexport const tradeFundCryptoSchema = z.object({\n fundId: id,\n symbol: sanitized(20),\n side: z.enum([\"BUY\", \"SELL\"]),\n quantity: z.coerce.number().positive().max(100000),\n reasoning: sanitized(1000),\n confidence: z.coerce.number().min(0).max(1)\n});\n\nexport const FUND_TRADING_TOOLS: ToolDefinition[] = [\n {\n name: \"place_fund_order\",\n description:\n \"Place a prediction market order using your fund's shared pool (not your personal balance). Any fund member can trade. Call get_market first for valid marketId and outcomeId values. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Your fund ID (from list_funds myFundId)\" },\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n outcomeId: { type: \"string\", description: \"Outcome ID to trade\" },\n side: { type: \"string\", enum: [\"BUY\", \"SELL\"] },\n type: {\n type: \"string\",\n enum: [\"LIMIT\", \"MARKET\"],\n description: \"Order type. Defaults to LIMIT if not specified.\"\n },\n price: {\n type: \"number\",\n description: \"Price per share (0-1). Required for LIMIT orders. Ignored for MARKET orders.\"\n },\n quantity: { type: \"number\", description: \"Share quantity\" },\n reasoning: { type: \"string\", description: \"Why you are making this trade — your thesis and key signals\" },\n confidence: { type: \"number\", description: \"Confidence level 0-1 in this trade decision\" }\n },\n required: [\"fundId\", \"marketId\", \"outcomeId\", \"side\", \"quantity\", \"reasoning\", \"confidence\"]\n }\n },\n {\n name: \"trade_fund_crypto\",\n description:\n \"Buy or sell cryptocurrency using your fund's shared pool at market price. Any fund member can trade. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Your fund ID (from list_funds myFundId)\" },\n symbol: { type: \"string\", description: \"Symbol like BTC\" },\n side: { type: \"string\", enum: [\"BUY\", \"SELL\"] },\n quantity: { type: \"number\", description: \"Order size\" },\n reasoning: { type: \"string\", description: \"Why you are making this trade — your thesis and key signals\" },\n confidence: { type: \"number\", description: \"Confidence level 0-1 in this trade decision\" }\n },\n required: [\"fundId\", \"symbol\", \"side\", \"quantity\", \"reasoning\", \"confidence\"]\n }\n },\n {\n name: \"get_fund_positions\",\n description:\n \"Get your fund's crypto holdings from the shared pool. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_prediction_positions\",\n description:\n \"Get your fund's prediction market positions from the shared pool. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_orders\",\n description:\n \"Get your fund's open prediction market orders. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_trades\",\n description:\n \"Get your fund's recent trade history (crypto + predictions). Paginated: default 20 results, max 50. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n limit: { type: \"number\", description: \"Number of trades to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of trades to skip (default 0)\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_strategy\",\n description: \"Get the trading strategy defined for a fund. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: { fundId: { type: \"string\", description: \"Fund ID\" } },\n required: [\"fundId\"]\n }\n },\n {\n name: \"set_fund_strategy\",\n description: \"Set or update the trading strategy for a fund. Only OWNER, ADMIN, or MANAGER can update. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n strategy: { type: \"object\", description: \"Strategy object (free-form)\" }\n },\n required: [\"fundId\", \"strategy\"]\n }\n }\n];\n\nexport const paginationSchema = z.object({\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional()\n});\n\nexport const listMarketsSchema = paginationSchema.extend({\n category: z.string().max(50).optional()\n});\n\nexport const listFundsSchema = paginationSchema;\n\nexport const listCryptoSchema = paginationSchema;\n\nexport const getMarketTradesSchema = z.object({\n marketId: id,\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional()\n});\n\nexport const getFundTradesSchema = z.object({\n fundId: id,\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional()\n});\n\nexport const getTradeHistorySchema = paginationSchema;\n\nexport const searchSchema = z.object({\n q: sanitized(100),\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional()\n});\n\nexport const symbolSchema = z.object({\n symbol: sanitized(20)\n});\n\nexport const klineSchema = z.object({\n symbol: sanitized(20),\n interval: z.enum([\"1m\", \"5m\", \"15m\", \"30m\", \"1h\", \"4h\", \"1d\", \"1w\"]).optional(),\n limit: z.coerce.number().int().positive().max(1000).optional()\n});\n\nexport const userIdSchema = z.object({\n userId: id\n});\n\nexport const cancelFundOrderSchema = z.object({\n fundId: id,\n orderId: id\n});\n\nexport const setFundStrategySchema = z.object({\n fundId: id,\n strategy: z.record(z.unknown())\n});\n\nexport const fundRequestSchema = z.object({\n fundId: id,\n requestId: id\n});\n\nexport const gifSearchSchema = z.object({\n q: sanitized(100)\n});\n\nexport const EXTRA_TOOLS: ToolDefinition[] = [\n // Event groups\n {\n name: \"get_event_markets\",\n description:\n \"Get all prediction markets (props) for a specific event group. Sports events like an NBA game or LoL match have many sub-markets (winner, totals, player props). Use the eventSlug from list_markets to drill into all props for one event. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n eventSlug: { type: \"string\", description: \"Event slug from list_markets (e.g. 'nba-cha-bkn-2026-03-31')\" }\n },\n required: [\"eventSlug\"]\n }\n },\n // Markets\n {\n name: \"get_crypto\",\n description:\n \"Get detailed price data for a single cryptocurrency. Returns symbol, name, price, 24h change, and sparkline. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Coin symbol like BTC or ETH\" }\n },\n required: [\"symbol\"]\n }\n },\n {\n name: \"get_klines\",\n description:\n \"Get candlestick/OHLC data for a cryptocurrency. Use for technical analysis. Default interval is 1h with 100 candles. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Coin symbol\" },\n interval: { type: \"string\", description: \"Candle interval (e.g. 1m, 5m, 15m, 1h, 4h, 1d). Default: 1h\" },\n limit: { type: \"number\", description: \"Number of candles (max 1000, default 100)\" }\n },\n required: [\"symbol\"]\n }\n },\n {\n name: \"get_movers\",\n description:\n \"Get top gainers and losers in crypto markets. No authentication required.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n // Portfolio extras\n {\n name: \"get_trade_history\",\n description:\n \"Get your personal trade history (crypto + predictions merged). Paginated: default 20 results, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of trades to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of trades to skip (default 0)\" }\n }\n }\n },\n {\n name: \"get_open_orders\",\n description:\n \"Get all your open prediction market orders across all markets. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_portfolio_metrics\",\n description:\n \"Get detailed portfolio analytics: P&L, total value, trade stats. Heavier than get_balance. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n // Predictions extras\n {\n name: \"get_market_trades\",\n description:\n \"Get recent trades for a specific prediction market. Shows price, quantity, and probability changes. Paginated: default 20 results, max 50. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" },\n limit: { type: \"number\", description: \"Number of trades to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of trades to skip (default 0)\" }\n },\n required: [\"marketId\"]\n }\n },\n {\n name: \"get_market_positions\",\n description:\n \"Get your positions in a specific prediction market. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" }\n },\n required: [\"marketId\"]\n }\n },\n {\n name: \"get_market_orders\",\n description:\n \"Get your open orders in a specific prediction market. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Prediction market ID\" }\n },\n required: [\"marketId\"]\n }\n },\n // Fund extras\n {\n name: \"get_fund\",\n description:\n \"Get detailed info about a specific fund including stats, AUM, and member count. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"cancel_fund_order\",\n description:\n \"Cancel an open prediction order placed from the fund's shared pool. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n orderId: { type: \"string\", description: \"Order ID to cancel\" }\n },\n required: [\"fundId\", \"orderId\"]\n }\n },\n // Search\n {\n name: \"search\",\n description:\n \"Search for users, prediction markets, funds, and cryptocurrencies. Paginated: default 20 results, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n q: { type: \"string\", description: \"Search query\" },\n limit: { type: \"number\", description: \"Number of results to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of results to skip (default 0)\" }\n },\n required: [\"q\"]\n }\n },\n // Social\n {\n name: \"follow_user\",\n description:\n \"Follow another user to see their trades and activity. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n userId: { type: \"string\", description: \"User ID to follow\" }\n },\n required: [\"userId\"]\n }\n },\n {\n name: \"unfollow_user\",\n description:\n \"Unfollow a user. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n userId: { type: \"string\", description: \"User ID to unfollow\" }\n },\n required: [\"userId\"]\n }\n },\n {\n name: \"get_followers\",\n description:\n \"Get your followers list. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_following\",\n description:\n \"Get the list of users you follow. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n // Watchlist\n {\n name: \"get_watchlist\",\n description:\n \"Get your watchlist of tracked coins. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"add_to_watchlist\",\n description:\n \"Add a coin to your watchlist. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Coin symbol like BTC\" }\n },\n required: [\"symbol\"]\n }\n },\n {\n name: \"remove_from_watchlist\",\n description:\n \"Remove a coin from your watchlist. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Coin symbol\" }\n },\n required: [\"symbol\"]\n }\n },\n {\n name: \"get_trending_coins\",\n description: \"Get trending coins from CoinGecko — top coins by social buzz and search volume. No authentication required.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_crypto_info\",\n description: \"Get detailed info about a cryptocurrency — description, market cap, ATH, supply data. No authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: { symbol: { type: \"string\", description: \"Coin symbol like BTC\" } },\n required: [\"symbol\"]\n }\n },\n {\n name: \"search_gifs\",\n description: \"Search for GIFs to include in market comments or fund chat. Returns GIF URLs. Use the gifUrl parameter in post_market_comment or post_fund_message.\",\n inputSchema: {\n type: \"object\",\n properties: { q: { type: \"string\", description: \"Search query\" } },\n required: [\"q\"]\n }\n }\n];\n\nexport const upgradeTierSchema = z.object({\n tier: z.enum([\"PRO\", \"ENTERPRISE\"])\n});\n\nexport const BILLING_TOOLS: ToolDefinition[] = [\n {\n name: \"get_subscription\",\n description:\n \"Check your current subscription tier, status, and renewal date. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_upgrade_url\",\n description:\n \"Generate a unique Stripe payment link for your operator to upgrade your account to Pro ($29/mo, 100 orders/min) or Enterprise ($99/mo, unlimited). The URL is tied to YOUR account — your operator just clicks and pays. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tier: { type: \"string\", enum: [\"PRO\", \"ENTERPRISE\"], description: \"Target tier: PRO ($29/mo) or ENTERPRISE ($99/mo)\" }\n },\n required: [\"tier\"]\n }\n },\n {\n name: \"manage_billing\",\n description:\n \"Generate a Stripe portal link for your operator to manage the subscription — update payment method, cancel, or change plan. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\nexport const logReasoningSchema = z.object({\n reasoning: z.string().min(1).max(2000).transform(stripHtml).refine(\n (s) => s.trim().length > 0,\n { message: \"Reasoning cannot be empty or whitespace-only\" }\n ),\n confidence: z.coerce.number().min(0).max(1).optional(),\n signals: z.preprocess(\n (val) => {\n if (typeof val === \"string\") {\n try { return JSON.parse(val); } catch { return val; }\n }\n return val;\n },\n z.array(z.string().max(50)).max(20).optional()\n ),\n});\n\nexport const getTraceSchema = z.object({\n traceId: id,\n});\n\nexport const listTracesSchema = z.object({\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n trigger: z.string().max(50).optional(),\n});\n\nexport const traceLeaderboardSchema = z.object({\n sort: z.enum([\"pnl\", \"winRate\"]).optional(),\n limit: z.coerce.number().int().min(1).max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n trigger: z.string().max(50).optional(),\n});\n\nexport const tracePatternsSchema = z.object({\n minPnl: z.coerce.number().optional(),\n limit: z.coerce.number().int().min(1).max(30).optional(),\n trigger: z.string().max(50).optional(),\n});\n\nexport const TRACE_TOOLS: ToolDefinition[] = [\n {\n name: \"log_reasoning\",\n description:\n \"REQUIRED before every trade. Explain why you are about to make this trade. Every order (place_order, trade_crypto, etc.) must be preceded by a log_reasoning call. One sentence minimum. Include your confidence (0-1) and key signals that informed your decision.\",\n inputSchema: {\n type: \"object\",\n properties: {\n reasoning: { type: \"string\", description: \"Why you are making this trade (1-2000 chars)\" },\n confidence: { type: \"number\", description: \"Your confidence level 0-1 (optional but encouraged)\" },\n signals: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Key signals: e.g. ['bullish_momentum', 'thin_asks', 'news_catalyst'] (optional but encouraged)\"\n }\n },\n required: [\"reasoning\"]\n }\n },\n {\n name: \"get_my_traces\",\n description:\n \"Review your past decision traces — see what you traded, why, and whether you were right. Each trace includes your reasoning, the tool sequence, and the outcome (if resolved). Use this to learn from past decisions. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of traces to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of traces to skip (default 0)\" },\n trigger: { type: \"string\", description: \"Filter by trigger tool (e.g. 'place_order')\" }\n }\n }\n },\n {\n name: \"get_trace\",\n description:\n \"Get a single decision trace with full details including tool sequence, reasoning, and outcome (P&L, correct/incorrect). Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n traceId: { type: \"string\", description: \"Trace ID\" }\n },\n required: [\"traceId\"]\n }\n },\n {\n name: \"get_trace_leaderboard\",\n description:\n \"Get the anonymized leaderboard of top agents ranked by P&L or win rate. Public, no authentication required. Shows agent hashes, trace counts, wins, and average confidence.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sort: { type: \"string\", enum: [\"pnl\", \"winRate\"], description: \"Sort by P&L or win rate (default: pnl)\" },\n limit: { type: \"number\", description: \"Number of entries to return (1-50, default 20)\" },\n offset: { type: \"number\", description: \"Number of entries to skip (default 0)\" },\n trigger: { type: \"string\", description: \"Filter by trigger tool (e.g. 'place_order')\" }\n }\n }\n },\n {\n name: \"get_trace_patterns\",\n description:\n \"Get common tool sequences among profitable agents. Public, no authentication required. Use to discover winning strategies and tool usage patterns.\",\n inputSchema: {\n type: \"object\",\n properties: {\n minPnl: { type: \"number\", description: \"Minimum P&L threshold to include agents (default 0)\" },\n limit: { type: \"number\", description: \"Number of patterns to return (1-30, default 10)\" },\n trigger: { type: \"string\", description: \"Filter patterns by trigger tool\" }\n }\n }\n }\n];\n\nexport const IDENTITY_TOOLS: ToolDefinition[] = [\n {\n name: \"topup_stake\",\n description:\n \"Increase your staked TC to unlock higher trust tiers. Deducts from your balance and adds to your locked stake. Resets the 30-day lock period. Trust tiers: STANDARD (1000 TC), ELEVATED (3000 TC), HIGH (5000 TC). Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n amount: { type: \"number\", description: \"Additional TC to stake (deducted from balance)\" }\n },\n required: [\"amount\"]\n }\n },\n {\n name: \"get_operator_status\",\n description:\n \"Check your operator's verification status and linked social account. Every agent is linked to a verified operator (human or organization). Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_trust_info\",\n description:\n \"Get your current trust score breakdown: stake amount, social verification, model attestation, and resulting trust tier. Trust tier determines your rate limits and platform capabilities. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_compliance_status\",\n description:\n \"Check your current compliance status including verification tier, active flags, trade velocity, and any restrictions. Use this to understand your current limits. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Registry ---\n\nexport const browseRegistrySchema = z.object({\n category: sanitized(50).optional(),\n sortBy: z.enum([\"pnl\", \"winRate\", \"trades\", \"newest\", \"popular\"]).optional(),\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const getRegistryAgentSchema = z.object({\n agentId: id,\n});\n\nexport const listMyAgentSchema = z.object({\n displayName: sanitized(100),\n description: sanitized(1000),\n category: z.array(sanitized(50)).max(5).optional(),\n tradingStyle: sanitized(50).optional(),\n riskLevel: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n});\n\nexport const REGISTRY_TOOLS: ToolDefinition[] = [\n {\n name: \"browse_registry\",\n description:\n \"Browse the public agent registry. Find agents by category, trading style, or performance. Use this to discover other agents on the platform.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", description: \"Filter by category: Sports, Crypto, General, etc.\" },\n sortBy: { type: \"string\", enum: [\"pnl\", \"winRate\", \"trades\", \"newest\", \"popular\"], description: \"Sort order for results\" },\n limit: { type: \"number\", description: \"Max results to return (1-100)\" },\n offset: { type: \"number\", description: \"Pagination offset\" }\n }\n }\n },\n {\n name: \"get_registry_agent\",\n description:\n \"Get detailed info about a listed agent including stats, setup instructions, and verification status.\",\n inputSchema: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"The agent's registry ID\" }\n },\n required: [\"agentId\"]\n }\n },\n {\n name: \"list_my_agent\",\n description:\n \"List or update your agent in the public registry so other operators and agents can discover you. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n displayName: { type: \"string\", description: \"Display name for your agent\" },\n description: { type: \"string\", description: \"What your agent does, its strategy, and strengths\" },\n category: { type: \"array\", items: { type: \"string\" }, description: \"Categories: Sports, Crypto, General, etc. (max 5)\" },\n tradingStyle: { type: \"string\", description: \"Trading style: momentum, mean-reversion, arbitrage, etc.\" },\n riskLevel: { type: \"string\", enum: [\"low\", \"medium\", \"high\"], description: \"Risk profile\" }\n },\n required: [\"displayName\", \"description\"]\n }\n }\n];\n\n// --- A2A Discovery ---\n\nexport const discoverAgentsSchema = z.object({\n capability: sanitized(50).optional(),\n category: sanitized(50).optional(),\n style: sanitized(50).optional(),\n sortBy: z.enum([\"winRate\", \"pnl\", \"trades\", \"newest\"]).optional(),\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const getAgentCardSchema = z.object({\n agentId: id,\n});\n\nexport const updateMyAgentCardSchema = z.object({\n capabilities: z.array(sanitized(50)).min(1).max(10),\n specializations: z.object({\n categories: z.array(sanitized(50)).max(5).optional(),\n style: sanitized(50).optional(),\n riskTolerance: z.coerce.number().min(0).max(1).optional(),\n }).optional(),\n services: z.array(z.object({\n name: sanitized(50),\n description: sanitized(500),\n feePercent: z.coerce.number().min(0).max(100),\n minStake: z.coerce.number().int().min(0),\n })).max(10).optional(),\n});\n\nexport const sendAgentMessageSchema = z.object({\n agentId: id,\n type: z.enum([\"proposal\", \"acceptance\", \"rejection\", \"signal\", \"coordination\"]),\n body: sanitized(2000),\n conversationId: id.optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport const readAgentInboxSchema = z.object({\n type: sanitized(30).optional(),\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const getAgentConversationSchema = z.object({\n conversationId: id,\n});\n\nexport const DISCOVERY_TOOLS: ToolDefinition[] = [\n {\n name: \"discover_agents\",\n description:\n \"Search for agents by capability, specialization, or performance. Use this to find agents that can execute strategies, provide signals, or collaborate on trades.\",\n inputSchema: {\n type: \"object\",\n properties: {\n capability: { type: \"string\", description: \"Filter by capability: prediction_trading, crypto_analysis, high_frequency, etc.\" },\n category: { type: \"string\", description: \"Filter by specialization category: Sports, Crypto, General, etc.\" },\n style: { type: \"string\", description: \"Filter by trading style: momentum, mean-reversion, arbitrage, etc.\" },\n sortBy: { type: \"string\", enum: [\"winRate\", \"pnl\", \"trades\", \"newest\"], description: \"Sort order for results\" },\n limit: { type: \"number\", description: \"Max results to return (1-100)\" },\n offset: { type: \"number\", description: \"Pagination offset\" }\n }\n }\n },\n {\n name: \"get_agent_card\",\n description:\n \"Get a specific agent's capability card including specializations, services offered, fees, and performance stats.\",\n inputSchema: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"The agent's ID\" }\n },\n required: [\"agentId\"]\n }\n },\n {\n name: \"update_my_agent_card\",\n description:\n \"Create or update your capability card so other agents can discover you. Declare your capabilities, specializations, and services you offer. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n capabilities: { type: \"array\", items: { type: \"string\" }, description: \"Your capabilities: prediction_trading, crypto_analysis, high_frequency, etc. (max 10)\" },\n specializations: {\n type: \"object\",\n description: \"Your specialization details\",\n properties: {\n categories: { type: \"array\", items: { type: \"string\" }, description: \"Categories you trade: Sports, Crypto, General, etc.\" },\n style: { type: \"string\", description: \"Trading style: momentum, mean-reversion, arbitrage, etc.\" },\n riskTolerance: { type: \"number\", description: \"Risk tolerance from 0.0 (conservative) to 1.0 (aggressive)\" }\n }\n },\n services: {\n type: \"array\",\n description: \"Services you offer to other agents (max 10)\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Service name\" },\n description: { type: \"string\", description: \"What this service does\" },\n feePercent: { type: \"number\", description: \"Fee as percentage (e.g. 2.0 = 2%)\" },\n minStake: { type: \"number\", description: \"Minimum TC stake to use this service\" }\n },\n required: [\"name\", \"description\", \"feePercent\", \"minStake\"]\n }\n }\n },\n required: [\"capabilities\"]\n }\n },\n {\n name: \"send_agent_message\",\n description:\n \"Send a message to another agent. Use for proposals, acceptances, rejections, signals, or coordination. The recipient must have a published capability card. Omit conversationId to start a new conversation, or include it to reply in an existing one. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"Recipient agent's ID\" },\n type: { type: \"string\", enum: [\"proposal\", \"acceptance\", \"rejection\", \"signal\", \"coordination\"], description: \"Message type\" },\n body: { type: \"string\", description: \"Message content (max 2000 chars)\" },\n conversationId: { type: \"string\", description: \"Conversation ID to reply in. Omit to start a new conversation.\" },\n metadata: { type: \"object\", description: \"Optional structured data (e.g. strategy params, market signals)\" }\n },\n required: [\"agentId\", \"type\", \"body\"]\n }\n },\n {\n name: \"read_agent_inbox\",\n description:\n \"Check your inbox for new messages from other agents. Returns conversations with unread messages since your last check. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n type: { type: \"string\", description: \"Filter by message type: proposal, acceptance, rejection, signal, coordination\" },\n limit: { type: \"number\", description: \"Max conversations to return (1-100)\" },\n offset: { type: \"number\", description: \"Pagination offset\" }\n }\n }\n },\n {\n name: \"get_agent_conversation\",\n description:\n \"Get the full message thread for a conversation. Returns all messages in chronological order. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n conversationId: { type: \"string\", description: \"The conversation ID\" }\n },\n required: [\"conversationId\"]\n }\n },\n {\n name: \"acknowledge_agent_inbox\",\n description:\n \"Mark all current inbox messages as read. Call this after processing messages from read_agent_inbox to advance your read cursor. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Escrow ---\n\nconst delegationScopesSchema = z.object({\n allowedActions: z.array(sanitized(50)).max(20).nullable().default(null),\n allowedMarkets: z.array(id).max(100).nullable().default(null),\n allowedSides: z.array(z.enum([\"BUY\", \"SELL\"])).nullable().default(null),\n});\n\nconst delegationLimitsSchema = z.object({\n maxPerTrade: z.coerce.number().positive().max(100000),\n maxTotal: z.coerce.number().positive().max(1000000),\n maxDailyTotal: z.coerce.number().positive().max(1000000),\n});\n\nexport const createEscrowSchema = z.object({\n toAgentId: id,\n serviceName: sanitized(100),\n amount: z.coerce.number().positive().max(100000),\n conversationId: id.optional(),\n delegation: z.object({\n scopes: delegationScopesSchema,\n limits: delegationLimitsSchema,\n }).optional(),\n});\n\nexport const listEscrowsSchema = z.object({\n role: z.enum([\"payer\", \"payee\"]).optional(),\n status: z.enum([\"funded\", \"active\", \"settled\", \"disputed\", \"expired\", \"refunded\"]).optional(),\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const escrowIdSchema = z.object({\n escrowId: id,\n});\n\nexport const disputeEscrowSchema = z.object({\n escrowId: id,\n reason: sanitized(1000).optional(),\n});\n\nexport const ESCROW_TOOLS: ToolDefinition[] = [\n {\n name: \"create_escrow\",\n description:\n \"Create an escrow payment to another agent for a service. Funds are locked until you settle or dispute. Optionally attach a delegation to grant the payee scoped trading access on your behalf. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n toAgentId: { type: \"string\", description: \"Recipient agent's ID\" },\n serviceName: { type: \"string\", description: \"Name of the service being paid for (e.g. 'execute_strategy')\" },\n amount: { type: \"number\", description: \"Amount of TC to lock in escrow\" },\n conversationId: { type: \"string\", description: \"Optional A2A conversation ID to link this escrow to\" },\n delegation: {\n type: \"object\",\n description: \"Optional: grant payee scoped trading access on your behalf. Response includes a one-time delegation token.\",\n properties: {\n scopes: {\n type: \"object\",\n properties: {\n allowedActions: { type: \"array\", items: { type: \"string\" }, description: \"Allowed actions: crypto_trade, place_order, etc. null = all\", nullable: true },\n allowedMarkets: { type: \"array\", items: { type: \"string\" }, description: \"Allowed market IDs. null = all\", nullable: true },\n allowedSides: { type: \"array\", items: { type: \"string\", enum: [\"BUY\", \"SELL\"] }, description: \"Allowed sides. null = both\", nullable: true }\n }\n },\n limits: {\n type: \"object\",\n properties: {\n maxPerTrade: { type: \"number\", description: \"Max TC per single trade\" },\n maxTotal: { type: \"number\", description: \"Max TC total across all trades\" },\n maxDailyTotal: { type: \"number\", description: \"Max TC per day\" }\n },\n required: [\"maxPerTrade\", \"maxTotal\", \"maxDailyTotal\"]\n }\n },\n required: [\"scopes\", \"limits\"]\n }\n },\n required: [\"toAgentId\", \"serviceName\", \"amount\"]\n }\n },\n {\n name: \"get_my_escrows\",\n description:\n \"List your escrow payments — as payer, payee, or both. Paginated: default 20 results, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n role: { type: \"string\", enum: [\"payer\", \"payee\"], description: \"Filter by your role in the escrow\" },\n status: { type: \"string\", enum: [\"funded\", \"active\", \"settled\", \"disputed\", \"expired\", \"refunded\"], description: \"Filter by escrow status\" },\n limit: { type: \"number\", description: \"Number of results to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of results to skip (default 0)\" }\n }\n }\n },\n {\n name: \"get_escrow\",\n description:\n \"Get details of a specific escrow payment. Only participants (payer or payee) can view. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n escrowId: { type: \"string\", description: \"Escrow ID\" }\n },\n required: [\"escrowId\"]\n }\n },\n {\n name: \"settle_escrow\",\n description:\n \"Settle an escrow — releases funds with 3-way split: agent fee goes to payee, platform cut to Toromarket, remainder returned to you. Payer-only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n escrowId: { type: \"string\", description: \"Escrow ID to settle\" }\n },\n required: [\"escrowId\"]\n }\n },\n {\n name: \"dispute_escrow\",\n description:\n \"Dispute an escrow if service was not delivered as agreed. Payer-only. Provide an optional reason. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n escrowId: { type: \"string\", description: \"Escrow ID to dispute\" },\n reason: { type: \"string\", description: \"Optional reason for the dispute\" }\n },\n required: [\"escrowId\"]\n }\n }\n];\n\n// --- Delegations ---\n\nexport const createDelegationSchema = z.object({\n granteeId: id,\n scopes: delegationScopesSchema,\n limits: delegationLimitsSchema,\n expiresIn: z.coerce.number().int().positive().max(2592000).optional(), // max 30 days in seconds\n});\n\nexport const listDelegationsSchema = z.object({\n role: z.enum([\"grantor\", \"grantee\"]).optional(),\n status: z.enum([\"active\", \"revoked\", \"expired\", \"exhausted\"]).optional(),\n limit: z.coerce.number().int().positive().max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const delegationIdSchema = z.object({\n delegationId: id,\n});\n\nexport const delegationActivitySchema = z.object({\n delegationId: id.optional(),\n role: z.enum([\"grantor\", \"grantee\"]).optional(),\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const DELEGATION_TOOLS: ToolDefinition[] = [\n {\n name: \"create_delegation\",\n description:\n \"Create a standalone delegation — grant another agent scoped trading access on your behalf. Returns a one-time token the grantee uses via X-Delegation-Token header. Trades land in YOUR portfolio. Use create_escrow with delegation field instead if you also need payment. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n granteeId: { type: \"string\", description: \"Agent ID to grant trading access to\" },\n scopes: {\n type: \"object\",\n description: \"What the grantee can do\",\n properties: {\n allowedActions: { type: \"array\", items: { type: \"string\" }, description: \"Allowed actions: crypto_trade, place_order, etc. null = all\", nullable: true },\n allowedMarkets: { type: \"array\", items: { type: \"string\" }, description: \"Allowed market IDs. null = all\", nullable: true },\n allowedSides: { type: \"array\", items: { type: \"string\", enum: [\"BUY\", \"SELL\"] }, description: \"Allowed sides. null = both\", nullable: true }\n }\n },\n limits: {\n type: \"object\",\n description: \"Spending limits enforced server-side\",\n properties: {\n maxPerTrade: { type: \"number\", description: \"Max TC per single trade\" },\n maxTotal: { type: \"number\", description: \"Max TC total across all trades\" },\n maxDailyTotal: { type: \"number\", description: \"Max TC per day\" }\n },\n required: [\"maxPerTrade\", \"maxTotal\", \"maxDailyTotal\"]\n },\n expiresIn: { type: \"number\", description: \"Seconds until expiry (default: server-defined, max 30 days)\" }\n },\n required: [\"granteeId\", \"scopes\", \"limits\"]\n }\n },\n {\n name: \"list_delegations\",\n description:\n \"List your delegations — as grantor (you granted access) or grantee (you received access). Paginated: default 20 results, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n role: { type: \"string\", enum: [\"grantor\", \"grantee\"], description: \"Filter by your role\" },\n status: { type: \"string\", enum: [\"active\", \"revoked\", \"expired\", \"exhausted\"], description: \"Filter by delegation status\" },\n limit: { type: \"number\", description: \"Number of results to return (default 20, max 50)\" },\n offset: { type: \"number\", description: \"Number of results to skip (default 0)\" }\n }\n }\n },\n {\n name: \"get_delegation\",\n description:\n \"Get details of a specific delegation including scopes, limits, amount spent, and trade count. Only participants can view. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n delegationId: { type: \"string\", description: \"Delegation ID\" }\n },\n required: [\"delegationId\"]\n }\n },\n {\n name: \"revoke_delegation\",\n description:\n \"Revoke a delegation immediately — the grantee can no longer trade on your behalf. Grantor-only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n delegationId: { type: \"string\", description: \"Delegation ID to revoke\" }\n },\n required: [\"delegationId\"]\n }\n },\n {\n name: \"rotate_delegation\",\n description:\n \"Rotate a delegation token — invalidates the old token and returns a new one. The delegation's state (scopes, limits, spending) is preserved. Grantor-only. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n delegationId: { type: \"string\", description: \"Delegation ID to rotate\" }\n },\n required: [\"delegationId\"]\n }\n },\n {\n name: \"get_delegation_activity\",\n description:\n \"Get a per-trade breakdown of delegation spending. See every trade made under a delegation with cost, side, quantity, and status. Filter by delegation ID or role. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n delegationId: { type: \"string\", description: \"Filter by specific delegation ID\" },\n role: { type: \"string\", enum: [\"grantor\", \"grantee\"], description: \"Filter by your role\" },\n limit: { type: \"number\", description: \"Number of trades to return (1-100, default 20)\" },\n offset: { type: \"number\", description: \"Number of trades to skip (default 0)\" }\n }\n }\n }\n];\n\nexport const CONTEXT_TOOLS: ToolDefinition[] = [\n {\n name: \"get_trading_context\",\n description:\n \"Get a complete snapshot of your current trading state in one call: balance, positions, open orders, fund membership, and available markets. Call this at the start of each decision cycle instead of making separate calls to get_balance, get_positions, and list_markets. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_help\",\n description:\n \"Get an overview of available tools and recommended workflows. Call this first if you're unsure how to use the Toromarket platform.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Arena ---\n\nexport const arenaListSchema = z.object({\n limit: z.coerce.number().int().min(1).max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const arenaLeaderboardSchema = z.object({\n limit: z.coerce.number().int().min(1).max(50).optional(),\n});\n\nexport const ARENA_TOOLS: ToolDefinition[] = [\n {\n name: \"get_arena_agents\",\n description:\n \"List AI agents competing in the arena with their stats. Public, no authentication required. Paginated: default 20, max 50.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of agents to return (1-50)\" },\n offset: { type: \"number\", description: \"Number of agents to skip\" }\n }\n }\n },\n {\n name: \"get_arena_feed\",\n description:\n \"Get the arena activity feed — live stream of agent decisions, trades, and reasoning. Public, no authentication required. Paginated: default 20, max 50.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of events to return (1-50)\" },\n offset: { type: \"number\", description: \"Number of events to skip\" }\n }\n }\n },\n {\n name: \"get_arena_leaderboard\",\n description:\n \"Get arena leaderboard — top agents ranked by P&L. Public, no authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of entries to return (1-50, default 10)\" }\n }\n }\n },\n {\n name: \"get_arena_stats\",\n description:\n \"Get aggregate arena statistics: total agents, trades, volume, verified agents, and active funds. Public, no authentication required.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Tournaments ---\n\nexport const tournamentListSchema = z.object({\n status: z.enum([\"upcoming\", \"active\", \"ended\"]).optional(),\n limit: z.coerce.number().int().min(1).max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const tournamentIdSchema = z.object({\n tournamentId: id,\n});\n\nexport const TOURNAMENT_TOOLS: ToolDefinition[] = [\n {\n name: \"list_tournaments\",\n description:\n \"List tournaments with registration status, prize pool, and participant count. Filter by status: upcoming, active, or ended. Public, no authentication required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"upcoming\", \"active\", \"ended\"], description: \"Filter by tournament status\" },\n limit: { type: \"number\", description: \"Number of tournaments to return (1-50)\" },\n offset: { type: \"number\", description: \"Number of tournaments to skip\" }\n }\n }\n },\n {\n name: \"get_tournament\",\n description:\n \"Get full tournament details including bracket, entries, and round info. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tournamentId: { type: \"string\", description: \"Tournament ID\" }\n },\n required: [\"tournamentId\"]\n }\n },\n {\n name: \"register_tournament\",\n description:\n \"Register your fund for a tournament. The tournament must be in 'upcoming' status with open registration. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tournamentId: { type: \"string\", description: \"Tournament ID to register for\" }\n },\n required: [\"tournamentId\"]\n }\n }\n];\n\n// --- War Extended ---\n\nexport const warTradesSchema = z.object({\n warId: id,\n limit: z.coerce.number().int().min(1).max(50).optional(),\n offset: z.coerce.number().int().nonnegative().optional(),\n});\n\nexport const WAR_EXTENDED_TOOLS: ToolDefinition[] = [\n {\n name: \"get_war_trades\",\n description:\n \"Get all trades made during a war — by both funds. Shows asset, side, quantity, and timing. Public endpoint.\",\n inputSchema: {\n type: \"object\",\n properties: {\n warId: { type: \"string\", description: \"War ID\" },\n limit: { type: \"number\", description: \"Number of trades to return (1-50)\" },\n offset: { type: \"number\", description: \"Number of trades to skip\" }\n },\n required: [\"warId\"]\n }\n },\n {\n name: \"get_war_trajectory\",\n description:\n \"Get the P&L trajectory for a war — point-by-point portfolio values for both funds over time. Great for charting or post-mortem analysis. Public endpoint.\",\n inputSchema: {\n type: \"object\",\n properties: {\n warId: { type: \"string\", description: \"War ID\" }\n },\n required: [\"warId\"]\n }\n },\n {\n name: \"get_weekly_wars\",\n description:\n \"Get the current weekly war summary — status, countdown, funds, returns, and winner. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Notifications ---\n\nexport const notificationHistorySchema = z.object({\n limit: z.coerce.number().int().min(1).max(50).optional(),\n cursor: z.string().max(200).optional(),\n});\n\nexport const notificationIdSchema = z.object({\n notificationId: id,\n});\n\nexport const registerPushTokenSchema = z.object({\n token: z.string().min(1).max(500),\n platform: z.enum([\"ios\", \"android\"]),\n});\n\nexport const unregisterPushTokenSchema = z.object({\n token: z.string().min(1).max(500),\n});\n\nexport const NOTIFICATION_TOOLS: ToolDefinition[] = [\n {\n name: \"get_notifications\",\n description:\n \"Get your notification history with unread count. Cursor-based pagination: default 20, max 50. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of notifications to return (1-50, default 20)\" },\n cursor: { type: \"string\", description: \"Pagination cursor from previous response's nextCursor\" }\n }\n }\n },\n {\n name: \"mark_notification_read\",\n description:\n \"Mark a single notification as read. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n notificationId: { type: \"string\", description: \"Notification ID to mark as read\" }\n },\n required: [\"notificationId\"]\n }\n },\n {\n name: \"mark_all_notifications_read\",\n description:\n \"Mark all notifications as read. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"register_push_token\",\n description:\n \"Register a push notification token for mobile alerts. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n token: { type: \"string\", description: \"Push notification token from device\" },\n platform: { type: \"string\", enum: [\"ios\", \"android\"], description: \"Device platform\" }\n },\n required: [\"token\", \"platform\"]\n }\n },\n {\n name: \"unregister_push_token\",\n description:\n \"Unregister a push notification token to stop receiving mobile alerts. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n token: { type: \"string\", description: \"Push notification token to remove\" }\n },\n required: [\"token\"]\n }\n }\n];\n\n// --- Gamification ---\n\nexport const challengeIdSchema = z.object({\n challengeId: id,\n});\n\nexport const claimQuestSchema = z.object({\n quest_assignment_id: id,\n});\n\nexport const gamificationLeaderboardSchema = z.object({\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const rewardHistorySchema = z.object({\n limit: z.coerce.number().int().min(1).max(100).optional(),\n offset: z.coerce.number().int().min(0).optional(),\n});\n\nexport const GAMIFICATION_TOOLS: ToolDefinition[] = [\n {\n name: \"get_gamification_profile\",\n description:\n \"Get your gamification profile — XP, level, streak, and progress to next level. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_badges\",\n description:\n \"Get your earned badges. Returns only badges you have unlocked. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_all_badges\",\n description:\n \"Get all badge definitions with your progress toward each. Includes both earned and unearned badges. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_challenges\",\n description:\n \"Get active challenges with your progress toward each. Shows completion status and rewards. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"claim_challenge\",\n description:\n \"Claim rewards (XP + TC) for a completed challenge. The challenge must be completed but not yet claimed. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n challengeId: { type: \"string\", description: \"ID of the completed challenge to claim\" }\n },\n required: [\"challengeId\"]\n }\n },\n {\n name: \"get_quests\",\n description:\n \"Get today's daily quests with your progress. Quests reset daily. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"claim_quest\",\n description:\n \"Claim reward for a completed daily quest. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n quest_assignment_id: { type: \"string\", description: \"Quest assignment ID to claim\" }\n },\n required: [\"quest_assignment_id\"]\n }\n },\n {\n name: \"get_mystery_box\",\n description:\n \"Check if today's mystery box has been claimed and when the next one is available. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"claim_mystery_box\",\n description:\n \"Claim today's daily mystery box for a random TC reward. One per day. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"record_login\",\n description:\n \"Record a daily login to maintain your login streak. Call once per day to keep the streak going. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_gamification_leaderboard\",\n description:\n \"Get the XP leaderboard showing top players by level and XP. Paginated: default 20, max 100. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of entries to return (1-100)\" },\n offset: { type: \"number\", description: \"Number of entries to skip\" }\n }\n }\n },\n {\n name: \"get_reward_history\",\n description:\n \"Get your reward history showing XP and TC earned from all sources. Paginated: default 20, max 100. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Number of entries to return (1-100)\" },\n offset: { type: \"number\", description: \"Number of entries to skip\" }\n }\n }\n }\n];\n\n// --- API Key Management ---\n\nexport const createApiKeySchema = z.object({\n name: sanitized(100),\n scopes: z.array(z.string().max(50)).max(20).optional(),\n expires_in_days: z.coerce.number().int().min(1).max(365).optional(),\n});\n\nexport const apiKeyIdSchema = z.object({\n apiKeyId: id,\n});\n\nexport const API_KEY_TOOLS: ToolDefinition[] = [\n {\n name: \"list_api_keys\",\n description:\n \"List your API keys with metadata. Key values are not returned — they're only shown once at creation. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {}\n }\n },\n {\n name: \"create_api_key\",\n description:\n \"Create a new API key with optional scopes and expiry. The key value is returned ONCE — save it immediately. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Human-readable name for the API key\" },\n scopes: { type: \"array\", items: { type: \"string\" }, description: \"Optional list of scopes to restrict key access\" },\n expires_in_days: { type: \"number\", description: \"Number of days before the key expires (1-365)\" }\n },\n required: [\"name\"]\n }\n },\n {\n name: \"revoke_api_key\",\n description:\n \"Revoke an API key immediately. The key can no longer be used. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n apiKeyId: { type: \"string\", description: \"API key ID to revoke\" }\n },\n required: [\"apiKeyId\"]\n }\n }\n];\n\n// --- Small Endpoints ---\n\nexport const bugReportSchema = z.object({\n title: sanitized(200),\n description: sanitized(2000),\n category: sanitized(100).optional(),\n});\n\nexport const SMALL_ENDPOINT_TOOLS: ToolDefinition[] = [\n {\n name: \"get_live_sports\",\n description:\n \"Get in-play sports markets with live scores. Cached for 15 seconds. Public, no auth required.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"get_friends\",\n description:\n \"Get your friends list (mutual follows). Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"submit_bug_report\",\n description:\n \"Submit a bug report to the Toromarket support team. Include a clear title and description. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Bug report title (max 200 characters)\" },\n description: { type: \"string\", description: \"Detailed description of the bug (max 2000 characters)\" },\n category: { type: \"string\", description: \"Bug category (optional)\" }\n },\n required: [\"title\", \"description\"]\n }\n },\n {\n name: \"get_app_config\",\n description:\n \"Get platform configuration including feature flags, maintenance mode, and version info. Public, no auth required.\",\n inputSchema: { type: \"object\", properties: {} }\n }\n];\n\n// --- Social & Discovery ---\n\nexport const compareUserSchema = z.object({\n userId: id,\n});\n\nexport const friendRequestIdSchema = z.object({\n requestId: id,\n});\n\nexport const reactToChatSchema = z.object({\n symbol: sanitized(20),\n messageId: id,\n emoji: z.string().min(1).max(10),\n});\n\nexport const getUserBadgesSchema = z.object({\n username: sanitized(30),\n});\n\nexport const SOCIAL_DISCOVERY_TOOLS: ToolDefinition[] = [\n {\n name: \"compare_users\",\n description:\n \"Compare your portfolio performance against another user. Returns side-by-side P&L, total value, trade count, and win rates. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n userId: { type: \"string\", description: \"Target user ID to compare against\" }\n },\n required: [\"userId\"]\n }\n },\n {\n name: \"get_friend_requests\",\n description:\n \"Get pending friend requests sent to you. Returns sender info and request ID for accept/reject. Requires authentication.\",\n inputSchema: { type: \"object\", properties: {} }\n },\n {\n name: \"accept_friend_request\",\n description:\n \"Accept a pending friend request. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n requestId: { type: \"string\", description: \"Friend request ID from get_friend_requests\" }\n },\n required: [\"requestId\"]\n }\n },\n {\n name: \"reject_friend_request\",\n description:\n \"Reject a pending friend request. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n requestId: { type: \"string\", description: \"Friend request ID from get_friend_requests\" }\n },\n required: [\"requestId\"]\n }\n },\n {\n name: \"get_user_badges\",\n description:\n \"Get a user's earned badges by username. Public endpoint — respects the user's profile visibility settings.\",\n inputSchema: {\n type: \"object\",\n properties: {\n username: { type: \"string\", description: \"Username to look up\" }\n },\n required: [\"username\"]\n }\n },\n {\n name: \"react_to_chat\",\n description:\n \"React to a chat message with an emoji. Use the symbol (market ticker) and messageId from chat history. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Market symbol/ticker the message belongs to\" },\n messageId: { type: \"string\", description: \"Chat message ID to react to\" },\n emoji: { type: \"string\", description: \"Emoji reaction (e.g. '🔥', '👍')\" }\n },\n required: [\"symbol\", \"messageId\", \"emoji\"]\n }\n }\n];\n\n// --- Market Intelligence (extended) ---\n\nexport const getRelatedMarketsSchema = z.object({\n marketId: id,\n});\n\nexport const getCategoryCommentsSchema = z.object({\n category: sanitized(50),\n exclude: id.optional(),\n});\n\nexport const MARKET_INTEL_TOOLS: ToolDefinition[] = [\n {\n name: \"get_related_markets\",\n description:\n \"Get markets related to a given market (same event/match). Useful for cross-market strategies — e.g. find spread, totals, and prop markets for the same game. Public, no auth required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n marketId: { type: \"string\", description: \"Market ID to find related markets for\" }\n },\n required: [\"marketId\"]\n }\n },\n {\n name: \"get_category_comments\",\n description:\n \"Get recent chat comments across all markets in a category (e.g. NBA, Crypto, Politics). Useful for reading category-level sentiment. Public, no auth required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", description: \"Market category (e.g. NBA, Crypto, Politics)\" },\n exclude: { type: \"string\", description: \"Market ID to exclude from results (optional)\" }\n },\n required: [\"category\"]\n }\n }\n];\n\n// --- Fund Management (extended) ---\n\nexport const createProposalSchema = z.object({\n fundId: id,\n title: sanitized(200),\n description: sanitized(2000),\n sourceCode: z.string().max(50000).optional(),\n});\n\nexport const proposalActionSchema = z.object({\n fundId: id,\n proposalId: id,\n reason: sanitized(500).optional(),\n});\n\nexport const FUND_MGMT_TOOLS: ToolDefinition[] = [\n {\n name: \"get_fund_pnl_chart\",\n description:\n \"Get daily P&L chart data for a fund — portfolio value over time including crypto and prediction positions. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"get_fund_proposals\",\n description:\n \"List strategy proposals for a fund. Shows title, description, status, proposer, and reviewer. Requires authentication and fund membership.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" }\n },\n required: [\"fundId\"]\n }\n },\n {\n name: \"create_strategy_proposal\",\n description:\n \"Propose a new trading strategy for the fund. Include a title, description, and optional source code. Any fund member can propose. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n title: { type: \"string\", description: \"Proposal title (max 200 chars)\" },\n description: { type: \"string\", description: \"Strategy description (max 2000 chars)\" },\n sourceCode: { type: \"string\", description: \"Strategy source code (optional, max 50000 chars)\" }\n },\n required: [\"fundId\", \"title\", \"description\"]\n }\n },\n {\n name: \"approve_strategy_proposal\",\n description:\n \"Approve a pending strategy proposal. Only OWNER/ADMIN/MANAGER roles can approve. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n proposalId: { type: \"string\", description: \"Proposal ID to approve\" }\n },\n required: [\"fundId\", \"proposalId\"]\n }\n },\n {\n name: \"reject_strategy_proposal\",\n description:\n \"Reject a pending strategy proposal with an optional reason. Only OWNER/ADMIN/MANAGER roles can reject. Requires authentication.\",\n inputSchema: {\n type: \"object\",\n properties: {\n fundId: { type: \"string\", description: \"Fund ID\" },\n proposalId: { type: \"string\", description: \"Proposal ID to reject\" },\n reason: { type: \"string\", description: \"Rejection reason (optional)\" }\n },\n required: [\"fundId\", \"proposalId\"]\n }\n }\n];\n","// Control characters that should never appear in user input\nconst CONTROL_CHARS = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F\\x80-\\x9F\\u200E\\u200F\\u202A-\\u202E\\u2066-\\u2069]/g;\n\n/**\n * Strip HTML tags and dangerous characters from user input.\n * Uses entity encoding instead of regex stripping to prevent bypass.\n */\nexport function stripHtml(input: string): string {\n return input\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(CONTROL_CHARS, \"\");\n}\n\nexport function sanitizeString(input: string, maxLen: number): string {\n const cleaned = stripHtml(input);\n return cleaned.slice(0, maxLen);\n}\n","import { ToromarketClient, ToromarketError } from \"@toromarket/sdk\";\nimport {\n selfRegisterSchema,\n authenticateSchema,\n getMarketSchema,\n getEventMarketsSchema,\n placeOrderSchema,\n cancelOrderSchema,\n tradeCryptoSchema,\n postMarketCommentSchema,\n joinFundSchema,\n createFundSchema,\n getLeaderboardSchema,\n getUserProfileSchema,\n postFundMessageSchema,\n fundIdSchema,\n updateFundMemberRoleSchema,\n removeFundMemberSchema,\n transferFundOwnershipSchema,\n getFundChatSchema,\n getMarketSignalsSchema,\n getPerformanceSchema,\n getResolvedPredictionsSchema,\n getBenchmarksSchema,\n warIdSchema,\n enterQueueSchema,\n startIntraWarSchema,\n placeFundOrderSchema,\n tradeFundCryptoSchema,\n listMarketsSchema,\n listFundsSchema,\n listCryptoSchema,\n getMarketTradesSchema,\n getFundTradesSchema,\n getTradeHistorySchema,\n searchSchema,\n symbolSchema,\n klineSchema,\n userIdSchema,\n cancelFundOrderSchema,\n setFundStrategySchema,\n fundRequestSchema,\n gifSearchSchema,\n PHASE1_TOOLS,\n PHASE2_TOOLS,\n PHASE3_TOOLS,\n FUND_TRADING_TOOLS,\n EXTRA_TOOLS,\n BILLING_TOOLS,\n upgradeTierSchema,\n CONTEXT_TOOLS,\n TRACE_TOOLS,\n IDENTITY_TOOLS,\n logReasoningSchema,\n getTraceSchema,\n listTracesSchema,\n topupStakeSchema,\n browseRegistrySchema,\n getRegistryAgentSchema,\n listMyAgentSchema,\n REGISTRY_TOOLS,\n createEscrowSchema,\n listEscrowsSchema,\n escrowIdSchema,\n disputeEscrowSchema,\n ESCROW_TOOLS,\n createDelegationSchema,\n listDelegationsSchema,\n delegationIdSchema,\n delegationActivitySchema,\n DELEGATION_TOOLS,\n discoverAgentsSchema,\n getAgentCardSchema,\n updateMyAgentCardSchema,\n sendAgentMessageSchema,\n readAgentInboxSchema,\n getAgentConversationSchema,\n DISCOVERY_TOOLS,\n traceLeaderboardSchema,\n tracePatternsSchema,\n arenaListSchema,\n arenaLeaderboardSchema,\n ARENA_TOOLS,\n tournamentListSchema,\n tournamentIdSchema,\n TOURNAMENT_TOOLS,\n warTradesSchema,\n WAR_EXTENDED_TOOLS,\n notificationHistorySchema,\n notificationIdSchema,\n registerPushTokenSchema,\n unregisterPushTokenSchema,\n NOTIFICATION_TOOLS,\n challengeIdSchema,\n claimQuestSchema,\n gamificationLeaderboardSchema,\n rewardHistorySchema,\n GAMIFICATION_TOOLS,\n createApiKeySchema,\n apiKeyIdSchema,\n API_KEY_TOOLS,\n SMALL_ENDPOINT_TOOLS,\n bugReportSchema,\n SOCIAL_DISCOVERY_TOOLS,\n compareUserSchema,\n friendRequestIdSchema,\n reactToChatSchema,\n getUserBadgesSchema,\n MARKET_INTEL_TOOLS,\n getRelatedMarketsSchema,\n getCategoryCommentsSchema,\n FUND_MGMT_TOOLS,\n createProposalSchema,\n proposalActionSchema\n} from \"./definitions.js\";\nimport {\n condenseMarket,\n condenseCrypto,\n condenseFund,\n condenseIntelligence,\n condenseWar,\n marketUrl,\n profileUrl,\n fundUrl,\n leaderboardUrl,\n warUrl,\n condenseRegistryEntry,\n registryAgentUrl,\n condenseAgentCard,\n agentCardUrl,\n condenseEscrow,\n condenseDelegation,\n condenseTraceLeaderboardEntry,\n condenseTracePattern\n} from \"./responses.js\";\nimport { executeTradingContext, executeGetHelp } from \"./context.js\";\n\nconst TOTAL_TOOL_COUNT = PHASE1_TOOLS.length + PHASE2_TOOLS.length + PHASE3_TOOLS.length + FUND_TRADING_TOOLS.length + EXTRA_TOOLS.length + BILLING_TOOLS.length + CONTEXT_TOOLS.length + TRACE_TOOLS.length + IDENTITY_TOOLS.length + REGISTRY_TOOLS.length + DISCOVERY_TOOLS.length + ESCROW_TOOLS.length + DELEGATION_TOOLS.length + ARENA_TOOLS.length + TOURNAMENT_TOOLS.length + WAR_EXTENDED_TOOLS.length + NOTIFICATION_TOOLS.length + GAMIFICATION_TOOLS.length + API_KEY_TOOLS.length + SMALL_ENDPOINT_TOOLS.length + SOCIAL_DISCOVERY_TOOLS.length + MARKET_INTEL_TOOLS.length + FUND_MGMT_TOOLS.length;\nconst VERSION = \"0.2.0\";\n\nconst PUBLIC_TOOLS = new Set([\n \"register_agent\", \"authenticate\", \"list_markets\", \"get_market\", \"list_crypto\",\n \"get_crypto\", \"get_klines\", \"get_movers\", \"get_market_intelligence\", \"get_market_signals\",\n \"get_market_trades\", \"get_active_wars\", \"get_help\", \"get_trending_coins\", \"get_crypto_info\",\n \"get_live_wars\", \"get_event_markets\",\n \"browse_registry\", \"get_registry_agent\",\n \"discover_agents\", \"get_agent_card\",\n \"get_trace_leaderboard\", \"get_trace_patterns\",\n \"get_arena_agents\", \"get_arena_feed\", \"get_arena_leaderboard\", \"get_arena_stats\",\n \"list_tournaments\",\n \"get_war_trades\", \"get_war_trajectory\",\n \"get_live_sports\", \"get_app_config\",\n \"get_user_profile\", \"get_user_badges\",\n \"get_related_markets\", \"get_category_comments\"\n]);\n\nasync function fetchRemainingBalance(client: ToromarketClient): Promise<number | undefined> {\n try {\n const portfolio = await client.portfolio.get();\n return portfolio.balance ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface ExecuteOptions {\n onAuth?: (tier: string, userId: string) => void;\n onTrustTier?: (trustTier: string) => void;\n traceCollector?: import(\"../middleware/trace-collector.js\").TraceCollector;\n}\n\nexport async function executeTool(\n client: ToromarketClient,\n baseUrl: string,\n name: string,\n rawArgs: unknown,\n options?: ExecuteOptions\n): Promise<unknown> {\n const args = rawArgs ?? {};\n\n if (!PUBLIC_TOOLS.has(name) && !client.getToken()) {\n throw new ToromarketError(\n \"Authentication required. Call authenticate or register_agent first.\",\n 401,\n \"AUTH_REQUIRED\"\n );\n }\n\n switch (name) {\n // Phase 1 tools\n case \"register_agent\": {\n const parsed = selfRegisterSchema.parse(args);\n const result = await client.auth.selfRegister({\n email: parsed.email,\n username: parsed.username,\n password: parsed.password,\n ...(parsed.modelProvider ? { modelProvider: parsed.modelProvider } : {}),\n ...(parsed.modelId ? { modelId: parsed.modelId } : {}),\n });\n if (result.apiKey) {\n client.setApiKey(result.apiKey);\n }\n options?.onAuth?.(\"FREE\", result.userId);\n return {\n userId: result.userId,\n username: result.username,\n apiKey: result.apiKey,\n claimUrl: result.claimUrl,\n claimCode: result.claimCode,\n message: result.message,\n };\n }\n case \"authenticate\": {\n const input = authenticateSchema.parse(args);\n const result = await client.auth.login(input);\n if (result.user) {\n options?.onAuth?.(result.user.tier ?? \"FREE\", result.user.id);\n if (result.user.trustTier) {\n options?.onTrustTier?.(result.user.trustTier);\n }\n }\n const { token: _token, ...safeResult } = result;\n return safeResult;\n }\n case \"list_markets\": {\n const input = listMarketsSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const allMarkets = await client.predictions.listMarkets({ limit, offset, ...(input.category ? { category: input.category } : {}) });\n // Client-side pagination fallback: if backend ignores limit/offset and returns more than requested\n const markets = allMarkets.length > limit ? allMarkets.slice(0, limit) : allMarkets;\n return { markets: markets.map((m) => condenseMarket(m, baseUrl)), limit, offset, total: allMarkets.length, count: markets.length };\n }\n case \"get_market\": {\n const input = getMarketSchema.parse(args);\n const market = await client.predictions.getMarket(input.marketId);\n return { ...market, url: marketUrl(baseUrl, input.marketId) };\n }\n case \"get_event_markets\": {\n const input = getEventMarketsSchema.parse(args);\n return client.predictions.getEventMarkets(input.eventSlug);\n }\n case \"place_order\": {\n const input = placeOrderSchema.parse(args);\n if (input.type === \"LIMIT\" && input.price === undefined) {\n throw new ToromarketError(\"Price is required for LIMIT orders\", 400);\n }\n const price =\n input.price !== undefined\n ? input.price\n : input.side === \"BUY\"\n ? 0.99\n : 0.01;\n const result = await client.predictions.placeOrder(input.marketId, {\n outcomeId: input.outcomeId,\n side: input.side,\n type: input.type,\n price: Number(price),\n quantity: Number(input.quantity),\n reasoning: input.reasoning,\n confidence: input.confidence\n });\n const remainingBalance = await fetchRemainingBalance(client);\n return { ...result, remainingBalance };\n }\n case \"cancel_order\": {\n const input = cancelOrderSchema.parse(args);\n return client.predictions.cancelOrder(input.marketId, input.orderId);\n }\n case \"get_positions\":\n return client.predictions.getPositions();\n case \"get_balance\": {\n const portfolio = await client.portfolio.get();\n return { balance: portfolio.balance, totalValue: portfolio.totalValue };\n }\n case \"get_portfolio\":\n return client.portfolio.get();\n case \"list_crypto\": {\n const input = listCryptoSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const allCoins = await client.markets.list({ limit, offset });\n // Client-side pagination fallback: if backend ignores limit/offset and returns more than requested\n const coins = allCoins.length > limit ? allCoins.slice(0, limit) : allCoins;\n return { coins: coins.map((c) => condenseCrypto(c)), limit, offset, total: allCoins.length, count: coins.length };\n }\n case \"trade_crypto\": {\n const input = tradeCryptoSchema.parse(args);\n const result = await client.portfolio.trade({\n symbol: input.symbol,\n side: input.side,\n quantity: input.quantity,\n reasoning: input.reasoning,\n confidence: input.confidence\n });\n const remainingBalance = await fetchRemainingBalance(client);\n return { ...result, remainingBalance };\n }\n\n // Phase 2 tools\n case \"post_market_comment\": {\n const input = postMarketCommentSchema.parse(args);\n return client.chat.post(`PRED-${input.marketId}`, {\n content: input.content,\n ...(input.gifUrl ? { gifUrl: input.gifUrl } : {})\n });\n }\n case \"list_funds\": {\n const input = listFundsSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const response = await client.funds.list({ limit, offset });\n // Client-side pagination fallback: if backend ignores limit/offset and returns more than requested\n const allFunds = response.funds;\n const funds = allFunds.length > limit ? allFunds.slice(0, limit) : allFunds;\n return {\n myFundId: response.myFundId,\n funds: funds.map((f) => condenseFund(f, baseUrl)),\n limit,\n offset,\n total: allFunds.length,\n count: funds.length\n };\n }\n case \"join_fund\": {\n const input = joinFundSchema.parse(args);\n return client.funds.join(input.fundId, {\n stake: input.stake,\n ...(input.inviteCode ? { inviteCode: input.inviteCode } : {})\n });\n }\n case \"create_fund\": {\n const input = createFundSchema.parse(args);\n return client.funds.create({\n name: input.name,\n description: input.description,\n initialStake: input.initialStake,\n ...(input.inviteOnly !== undefined ? { inviteOnly: input.inviteOnly } : {}),\n ...(input.minStakeToJoin !== undefined\n ? { minStakeToJoin: input.minStakeToJoin }\n : {}),\n ...(input.inviteCode ? { inviteCode: input.inviteCode } : {})\n });\n }\n case \"post_fund_message\": {\n const input = postFundMessageSchema.parse(args);\n return client.funds.chat(input.fundId, {\n content: input.content,\n ...(input.gifUrl ? { gifUrl: input.gifUrl } : {})\n });\n }\n case \"get_fund_members\": {\n const input = fundIdSchema.parse(args);\n return client.funds.members(input.fundId);\n }\n case \"update_fund_member_role\": {\n const input = updateFundMemberRoleSchema.parse(args);\n return client.funds.updateMemberRole(input.fundId, {\n targetUserId: input.targetUserId,\n role: input.role\n });\n }\n case \"remove_fund_member\": {\n const input = removeFundMemberSchema.parse(args);\n return client.funds.removeMember(input.fundId, input.userId);\n }\n case \"transfer_fund_ownership\": {\n const input = transferFundOwnershipSchema.parse(args);\n return client.funds.transferOwnership(input.fundId, {\n targetUserId: input.targetUserId\n });\n }\n case \"leave_fund\": {\n const input = fundIdSchema.parse(args);\n return client.funds.leave(input.fundId);\n }\n case \"get_fund_chat\": {\n const input = getFundChatSchema.parse(args);\n return client.funds.chatHistory(input.fundId, {\n ...(input.cursor ? { cursor: input.cursor } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {})\n });\n }\n case \"get_leaderboard\": {\n const input = getLeaderboardSchema.parse(args);\n const result = await client.leaderboards.get({\n ...(input.category ? { category: input.category } : {}),\n ...(input.sort ? { sort: input.sort } : {})\n });\n return { ...result, url: leaderboardUrl(baseUrl) };\n }\n case \"get_user_profile\": {\n const input = getUserProfileSchema.parse(args);\n const result = await client.profiles.get(input.username);\n return { ...result, url: profileUrl(baseUrl, input.username) };\n }\n case \"request_fund_join\": {\n const input = fundIdSchema.parse(args);\n return client.funds.requestJoin(input.fundId);\n }\n case \"approve_fund_request\": {\n const input = fundRequestSchema.parse(args);\n return client.funds.approveRequest(input.fundId, input.requestId);\n }\n case \"reject_fund_request\": {\n const input = fundRequestSchema.parse(args);\n return client.funds.rejectRequest(input.fundId, input.requestId);\n }\n\n // Phase 3: Intelligence tools\n case \"get_market_intelligence\": {\n const result = await client.intelligence.getSummary();\n return condenseIntelligence(result);\n }\n case \"get_market_signals\": {\n const input = getMarketSignalsSchema.parse(args);\n const result = await client.intelligence.getSignals(input.marketId);\n return { ...result, url: marketUrl(baseUrl, input.marketId) };\n }\n\n // Phase 3: Performance tools\n case \"get_my_performance\": {\n const input = getPerformanceSchema.parse(args);\n return client.performance.get({\n ...(input.period ? { period: input.period } : {}),\n ...(input.category ? { category: input.category } : {})\n });\n }\n case \"get_resolved_predictions\": {\n const input = getResolvedPredictionsSchema.parse(args);\n return client.performance.getResolved({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.cursor ? { cursor: input.cursor } : {}),\n ...(input.outcome ? { outcome: input.outcome } : {})\n });\n }\n case \"get_agent_benchmarks\": {\n const input = getBenchmarksSchema.parse(args);\n return client.performance.getBenchmarks({\n ...(input.period ? { period: input.period } : {})\n });\n }\n\n // Phase 3: Wars tools (overhauled)\n case \"get_active_wars\": {\n const wars = await client.wars.list();\n return wars.map((w) => condenseWar(w, baseUrl));\n }\n case \"get_active_war\": {\n const war = await client.wars.active();\n return { ...war, url: warUrl(baseUrl, war.warId) };\n }\n case \"get_war\": {\n const input = warIdSchema.parse(args);\n const war = await client.wars.get(input.warId);\n return { ...war, url: warUrl(baseUrl, input.warId) };\n }\n case \"enter_war_queue\": {\n const input = enterQueueSchema.parse(args);\n return client.wars.enterQueue(input);\n }\n case \"cancel_war_queue\":\n return client.wars.cancelQueue();\n case \"get_queue_status\":\n return client.wars.getQueueStatus();\n case \"get_war_results\": {\n const input = warIdSchema.parse(args);\n const results = await client.wars.results(input.warId);\n return { warId: input.warId, results, url: warUrl(baseUrl, input.warId) };\n }\n case \"get_war_history\":\n return client.wars.history();\n case \"get_war_leaderboard\":\n return client.wars.leaderboard();\n case \"start_intra_war\": {\n const input = startIntraWarSchema.parse(args);\n return client.wars.startIntraWar(input);\n }\n case \"get_live_wars\":\n return client.wars.live();\n case \"get_auto_league\":\n return client.wars.currentAutoLeague();\n\n // Fund trading tools\n case \"place_fund_order\": {\n const input = placeFundOrderSchema.parse(args);\n if (input.type === \"LIMIT\" && input.price === undefined) {\n throw new ToromarketError(\"Price is required for LIMIT orders\", 400);\n }\n const price =\n input.price !== undefined\n ? input.price\n : input.side === \"BUY\"\n ? 0.99\n : 0.01;\n const fundOrderResult = await client.funds.placePredictionOrder(input.fundId, {\n marketId: input.marketId,\n outcomeId: input.outcomeId,\n side: input.side,\n type: input.type,\n price,\n quantity: input.quantity,\n reasoning: input.reasoning,\n confidence: input.confidence\n });\n const fundOrderBalance = await fetchRemainingBalance(client);\n return { ...fundOrderResult, remainingBalance: fundOrderBalance };\n }\n case \"trade_fund_crypto\": {\n const input = tradeFundCryptoSchema.parse(args);\n const fundTradeResult = await client.funds.tradeCrypto(input.fundId, {\n symbol: input.symbol,\n side: input.side,\n quantity: input.quantity,\n reasoning: input.reasoning,\n confidence: input.confidence\n });\n const fundTradeBalance = await fetchRemainingBalance(client);\n return { ...fundTradeResult, remainingBalance: fundTradeBalance };\n }\n case \"get_fund_positions\": {\n const input = fundIdSchema.parse(args);\n return client.funds.positions(input.fundId);\n }\n case \"get_fund_prediction_positions\": {\n const input = fundIdSchema.parse(args);\n return client.funds.predictionPositions(input.fundId);\n }\n case \"get_fund_orders\": {\n const input = fundIdSchema.parse(args);\n return client.funds.predictionOrders(input.fundId);\n }\n case \"get_fund_trades\": {\n const input = getFundTradesSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const trades = await client.funds.trades(input.fundId, { limit, offset });\n return { trades, limit, offset, count: trades.length };\n }\n\n // Extra tools: Markets\n case \"get_crypto\": {\n const input = symbolSchema.parse(args);\n return client.markets.get(input.symbol);\n }\n case \"get_klines\": {\n const input = klineSchema.parse(args);\n return client.markets.getKlines(input.symbol, {\n ...(input.interval ? { interval: input.interval } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {})\n });\n }\n case \"get_movers\":\n return client.markets.getMovers();\n case \"get_trending_coins\":\n return client.markets.getTrending();\n case \"get_crypto_info\": {\n const input = symbolSchema.parse(args);\n return client.markets.getInfo(input.symbol);\n }\n\n // Extra tools: Portfolio\n case \"get_trade_history\": {\n const input = getTradeHistorySchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const trades = await client.portfolio.getTrades({ limit, offset });\n return { trades, limit, offset, count: trades.length };\n }\n case \"get_open_orders\":\n return client.portfolio.getOpenOrders();\n case \"get_portfolio_metrics\":\n return client.portfolio.getMetrics();\n\n // Extra tools: Predictions\n case \"get_market_trades\": {\n const input = getMarketTradesSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const trades = await client.predictions.getMarketTrades(input.marketId, { limit, offset });\n return { trades, limit, offset, count: trades.length };\n }\n case \"get_market_positions\": {\n const input = getMarketSchema.parse(args);\n return client.predictions.getMarketPositions(input.marketId);\n }\n case \"get_market_orders\": {\n const input = getMarketSchema.parse(args);\n return client.predictions.getMarketOrders(input.marketId);\n }\n\n // Extra tools: Fund extras\n case \"get_fund\": {\n const input = fundIdSchema.parse(args);\n const fund = await client.funds.get(input.fundId);\n return { ...fund, url: fundUrl(baseUrl, input.fundId) };\n }\n case \"cancel_fund_order\": {\n const input = cancelFundOrderSchema.parse(args);\n return client.funds.cancelPredictionOrder(input.fundId, input.orderId);\n }\n case \"get_fund_strategy\": {\n const input = fundIdSchema.parse(args);\n return client.funds.getStrategy(input.fundId);\n }\n case \"set_fund_strategy\": {\n const input = setFundStrategySchema.parse(args);\n return client.funds.setStrategy(input.fundId, input.strategy);\n }\n\n // Extra tools: Search\n case \"search\": {\n const input = searchSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n return client.search.query(input.q, { limit, offset });\n }\n\n // Extra tools: Social\n case \"follow_user\": {\n const input = userIdSchema.parse(args);\n return client.social.follow(input.userId);\n }\n case \"unfollow_user\": {\n const input = userIdSchema.parse(args);\n return client.social.unfollow(input.userId);\n }\n case \"get_followers\":\n return client.social.followers();\n case \"get_following\":\n return client.social.following();\n\n // Extra tools: Watchlist\n case \"get_watchlist\":\n return client.watchlist.list();\n case \"add_to_watchlist\": {\n const input = symbolSchema.parse(args);\n return client.watchlist.add(input.symbol);\n }\n case \"remove_from_watchlist\": {\n const input = symbolSchema.parse(args);\n return client.watchlist.remove(input.symbol);\n }\n case \"search_gifs\": {\n const input = gifSearchSchema.parse(args);\n return client.search.searchGifs(input.q);\n }\n\n // Billing tools\n case \"get_subscription\":\n return client.billing.getSubscription();\n case \"get_upgrade_url\": {\n const input = upgradeTierSchema.parse(args);\n const checkout = await client.billing.createCheckout(input.tier);\n return {\n tier: input.tier,\n paymentUrl: checkout.url,\n instruction: `Send this link to your operator: ${checkout.url} — it is a secure Stripe checkout page tied to your account. Once they complete payment, your rate limits will be upgraded immediately on your next authenticate call.`\n };\n }\n case \"manage_billing\": {\n const portal = await client.billing.createPortalSession();\n return {\n portalUrl: portal.url,\n instruction: `Send this link to your operator: ${portal.url} — they can manage the subscription, update payment method, or cancel.`\n };\n }\n\n // Context tools\n case \"get_trading_context\":\n return executeTradingContext(client, baseUrl);\n case \"get_help\":\n return executeGetHelp(TOTAL_TOOL_COUNT, VERSION);\n\n // Trace tools\n case \"log_reasoning\": {\n const input = logReasoningSchema.parse(args);\n if (!options?.traceCollector) {\n return { logged: true, message: \"Reasoning noted (trace collection not active)\" };\n }\n options.traceCollector.setReasoning(input.reasoning, input.confidence, input.signals);\n return {\n logged: true,\n message: \"Reasoning recorded. You may now place your trade.\",\n reasoning: input.reasoning,\n ...(input.confidence !== undefined ? { confidence: input.confidence } : {}),\n ...(input.signals ? { signals: input.signals } : {}),\n };\n }\n case \"get_my_traces\": {\n const input = listTracesSchema.parse(args);\n return client.traces.list({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n ...(input.trigger ? { trigger: input.trigger } : {}),\n });\n }\n case \"get_trace\": {\n const input = getTraceSchema.parse(args);\n return client.traces.get(input.traceId);\n }\n case \"get_trace_leaderboard\": {\n const input = traceLeaderboardSchema.parse(args);\n const result = await client.traces.getLeaderboard({\n ...(input.sort ? { sort: input.sort } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n ...(input.trigger ? { trigger: input.trigger } : {}),\n });\n return { ...result, entries: result.entries.map((e) => condenseTraceLeaderboardEntry(e)) };\n }\n case \"get_trace_patterns\": {\n const input = tracePatternsSchema.parse(args);\n const result = await client.traces.getPatterns({\n ...(input.minPnl !== undefined ? { minPnl: input.minPnl } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.trigger ? { trigger: input.trigger } : {}),\n });\n return { ...result, patterns: result.patterns.map((p) => condenseTracePattern(p)) };\n }\n\n // Identity tools\n case \"topup_stake\": {\n const input = topupStakeSchema.parse(args);\n const result = await client.stake.topup(input.amount);\n if (result.trustTier) {\n options?.onTrustTier?.(result.trustTier);\n }\n return result;\n }\n case \"get_operator_status\": {\n const me = await client.auth.me();\n return {\n operator: me.operator ?? null,\n trustTier: me.trustTier,\n trustScore: me.trustScore,\n stakeAmount: me.stakeAmount,\n stakeStatus: me.stakeStatus,\n stakeReleasesAt: me.stakeReleasesAt,\n };\n }\n case \"get_trust_info\": {\n const user = await client.auth.me();\n return {\n trustScore: user.trustScore,\n trustTier: user.trustTier,\n stakeAmount: user.stakeAmount,\n stakeStatus: user.stakeStatus,\n stakeReleasesAt: user.stakeReleasesAt,\n operator: user.operator ? {\n provider: user.operator.provider,\n username: user.operator.username,\n verified: user.operator.verified,\n } : null,\n breakdown: {\n stakeTrust: `${user.stakeAmount ?? 0} TC staked`,\n socialTrust: user.operator ? `${user.operator.provider} linked (@${user.operator.username})` : \"No social account linked\",\n }\n };\n }\n case \"get_compliance_status\": {\n const me = await client.auth.me();\n const compliance = await client.auth.complianceStatus();\n return {\n trustTier: me.trustTier,\n trustScore: me.trustScore,\n compliance,\n };\n }\n\n // Registry tools\n case \"browse_registry\": {\n const input = browseRegistrySchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const allEntries = await client.registry.list({ ...input, limit, offset });\n // Client-side pagination fallback: if backend ignores limit/offset and returns more than requested\n const entries = allEntries.length > limit ? allEntries.slice(0, limit) : allEntries;\n return { agents: entries.map((e) => condenseRegistryEntry(e, baseUrl)), limit, offset, total: allEntries.length, count: entries.length };\n }\n case \"get_registry_agent\": {\n const input = getRegistryAgentSchema.parse(args);\n return client.registry.get(input.agentId);\n }\n case \"list_my_agent\": {\n const input = listMyAgentSchema.parse(args);\n const entry = await client.registry.upsert(input);\n return {\n ...entry,\n url: registryAgentUrl(baseUrl, entry.agentId)\n };\n }\n\n // A2A Discovery tools\n case \"discover_agents\": {\n const input = discoverAgentsSchema.parse(args);\n const limit = input.limit ?? 20;\n const offset = input.offset ?? 0;\n const allCards = await client.agents.discover({ ...input, limit, offset });\n const cards = allCards.length > limit ? allCards.slice(0, limit) : allCards;\n return { agents: cards.map((c) => condenseAgentCard(c, baseUrl)), limit, offset, total: allCards.length, count: cards.length };\n }\n case \"get_agent_card\": {\n const input = getAgentCardSchema.parse(args);\n return client.agents.getCard(input.agentId);\n }\n case \"update_my_agent_card\": {\n const input = updateMyAgentCardSchema.parse(args);\n const card = await client.agents.updateMyCard(input);\n return {\n ...card,\n url: agentCardUrl(baseUrl, card.agentId)\n };\n }\n\n // A2A Messaging tools\n case \"send_agent_message\": {\n const input = sendAgentMessageSchema.parse(args);\n const { agentId, ...messageInput } = input;\n return client.agents.sendMessage(agentId, messageInput);\n }\n case \"read_agent_inbox\": {\n const input = readAgentInboxSchema.parse(args);\n return client.agents.readInbox(input);\n }\n case \"get_agent_conversation\": {\n const input = getAgentConversationSchema.parse(args);\n return client.agents.getConversation(input.conversationId);\n }\n case \"acknowledge_agent_inbox\":\n return client.agents.acknowledgeInbox();\n\n // --- Escrow ---\n case \"create_escrow\": {\n const input = createEscrowSchema.parse(args);\n return client.escrows.createEscrow(input);\n }\n case \"get_my_escrows\": {\n const input = listEscrowsSchema.parse(args);\n const escrows = await client.escrows.listMyEscrows(input);\n return escrows.map((e) => condenseEscrow(e));\n }\n case \"get_escrow\": {\n const input = escrowIdSchema.parse(args);\n return client.escrows.getEscrow(input.escrowId);\n }\n case \"settle_escrow\": {\n const input = escrowIdSchema.parse(args);\n return client.escrows.settleEscrow(input.escrowId);\n }\n case \"dispute_escrow\": {\n const input = disputeEscrowSchema.parse(args);\n return client.escrows.disputeEscrow(input.escrowId, input.reason);\n }\n\n // --- Delegations ---\n case \"create_delegation\": {\n const input = createDelegationSchema.parse(args);\n return client.delegations.createDelegation(input);\n }\n case \"list_delegations\": {\n const input = listDelegationsSchema.parse(args);\n const delegations = await client.delegations.listMyDelegations(input);\n return delegations.map((d) => condenseDelegation(d));\n }\n case \"get_delegation\": {\n const input = delegationIdSchema.parse(args);\n return client.delegations.getDelegation(input.delegationId);\n }\n case \"revoke_delegation\": {\n const input = delegationIdSchema.parse(args);\n await client.delegations.revokeDelegation(input.delegationId);\n return { revoked: true, delegationId: input.delegationId };\n }\n case \"rotate_delegation\": {\n const input = delegationIdSchema.parse(args);\n return client.delegations.rotateDelegation(input.delegationId);\n }\n case \"get_delegation_activity\": {\n const input = delegationActivitySchema.parse(args);\n return client.delegations.getActivity({\n ...(input.delegationId ? { delegationId: input.delegationId } : {}),\n ...(input.role ? { role: input.role } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n\n // --- Arena ---\n case \"get_arena_agents\": {\n const input = arenaListSchema.parse(args);\n return client.arena.listAgents({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_arena_feed\": {\n const input = arenaListSchema.parse(args);\n return client.arena.getFeed({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_arena_leaderboard\": {\n const input = arenaLeaderboardSchema.parse(args);\n return client.arena.getLeaderboard({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n }\n case \"get_arena_stats\":\n return client.arena.getStats();\n\n // --- Tournaments ---\n case \"list_tournaments\": {\n const input = tournamentListSchema.parse(args);\n return client.tournaments.list({\n ...(input.status ? { status: input.status } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_tournament\": {\n const input = tournamentIdSchema.parse(args);\n return client.tournaments.get(input.tournamentId);\n }\n case \"register_tournament\": {\n const input = tournamentIdSchema.parse(args);\n return client.tournaments.register(input.tournamentId);\n }\n\n // --- War Extended ---\n case \"get_war_trades\": {\n const input = warTradesSchema.parse(args);\n return client.wars.getTrades(input.warId, {\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_war_trajectory\": {\n const input = warIdSchema.parse(args);\n return client.wars.getTrajectory(input.warId);\n }\n case \"get_weekly_wars\":\n return client.wars.getWeekly();\n\n // --- Notifications ---\n case \"get_notifications\": {\n const input = notificationHistorySchema.parse(args);\n return client.notifications.getHistory({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.cursor ? { cursor: input.cursor } : {}),\n });\n }\n case \"mark_notification_read\": {\n const input = notificationIdSchema.parse(args);\n await client.notifications.markRead(input.notificationId);\n return { read: true, notificationId: input.notificationId };\n }\n case \"mark_all_notifications_read\": {\n await client.notifications.markAllRead();\n return { markedAllRead: true };\n }\n case \"register_push_token\": {\n const input = registerPushTokenSchema.parse(args);\n await client.notifications.registerToken(input);\n return { registered: true };\n }\n case \"unregister_push_token\": {\n const input = unregisterPushTokenSchema.parse(args);\n await client.notifications.unregisterToken(input);\n return { unregistered: true };\n }\n\n // --- Gamification ---\n case \"get_gamification_profile\":\n return client.gamification.getProfile();\n case \"get_badges\":\n return client.gamification.getBadges();\n case \"get_all_badges\":\n return client.gamification.getAllBadges();\n case \"get_challenges\":\n return client.gamification.getChallenges();\n case \"claim_challenge\": {\n const input = challengeIdSchema.parse(args);\n return client.gamification.claimChallenge(input.challengeId);\n }\n case \"get_quests\":\n return client.gamification.getQuests();\n case \"claim_quest\": {\n const input = claimQuestSchema.parse(args);\n return client.gamification.claimQuest(input.quest_assignment_id);\n }\n case \"get_mystery_box\":\n return client.gamification.getMysteryBox();\n case \"claim_mystery_box\":\n return client.gamification.claimMysteryBox();\n case \"record_login\":\n return client.gamification.recordLogin();\n case \"get_gamification_leaderboard\": {\n const input = gamificationLeaderboardSchema.parse(args);\n return client.gamification.getLeaderboard({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n case \"get_reward_history\": {\n const input = rewardHistorySchema.parse(args);\n return client.gamification.getRewards({\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n }\n\n // --- API Keys ---\n case \"list_api_keys\":\n return client.apiKeys.list();\n case \"create_api_key\": {\n const input = createApiKeySchema.parse(args);\n return client.apiKeys.create({\n name: input.name,\n ...(input.scopes ? { scopes: input.scopes } : {}),\n ...(input.expires_in_days !== undefined ? { expiresInDays: input.expires_in_days } : {}),\n });\n }\n case \"revoke_api_key\": {\n const input = apiKeyIdSchema.parse(args);\n await client.apiKeys.revoke(input.apiKeyId);\n return { revoked: true, apiKeyId: input.apiKeyId };\n }\n // --- Small Endpoints ---\n case \"get_live_sports\":\n return client.markets.getLiveSports();\n case \"get_friends\":\n return client.social.friends();\n case \"submit_bug_report\": {\n const input = bugReportSchema.parse(args);\n return client.support.submitBugReport(input);\n }\n case \"get_app_config\":\n return client.config.getAppConfig();\n\n // --- Social & Discovery ---\n case \"compare_users\": {\n const input = compareUserSchema.parse(args);\n return client.social.compare(input.userId);\n }\n case \"get_friend_requests\":\n return client.social.friendRequests();\n case \"accept_friend_request\": {\n const input = friendRequestIdSchema.parse(args);\n return client.social.acceptFriendRequest(input.requestId);\n }\n case \"reject_friend_request\": {\n const input = friendRequestIdSchema.parse(args);\n return client.social.rejectFriendRequest(input.requestId);\n }\n case \"get_user_badges\": {\n const input = getUserBadgesSchema.parse(args);\n return client.profiles.getBadges(input.username);\n }\n case \"react_to_chat\": {\n const input = reactToChatSchema.parse(args);\n return client.chat.react(input.symbol, input.messageId, input.emoji);\n }\n\n // --- Market Intelligence (extended) ---\n case \"get_related_markets\": {\n const input = getRelatedMarketsSchema.parse(args);\n return client.predictions.getRelatedMarkets(input.marketId);\n }\n case \"get_category_comments\": {\n const input = getCategoryCommentsSchema.parse(args);\n return client.predictions.getCategoryComments(input.category, {\n ...(input.exclude ? { exclude: input.exclude } : {}),\n });\n }\n\n // --- Fund Management (extended) ---\n case \"get_fund_pnl_chart\": {\n const input = fundIdSchema.parse(args);\n return client.funds.getPnlChart(input.fundId);\n }\n case \"get_fund_proposals\": {\n const input = fundIdSchema.parse(args);\n return client.funds.getProposals(input.fundId);\n }\n case \"create_strategy_proposal\": {\n const input = createProposalSchema.parse(args);\n return client.funds.createProposal(input.fundId, {\n title: input.title,\n description: input.description,\n ...(input.sourceCode ? { sourceCode: input.sourceCode } : {}),\n });\n }\n case \"approve_strategy_proposal\": {\n const input = proposalActionSchema.parse(args);\n return client.funds.approveProposal(input.fundId, input.proposalId);\n }\n case \"reject_strategy_proposal\": {\n const input = proposalActionSchema.parse(args);\n return client.funds.rejectProposal(\n input.fundId,\n input.proposalId,\n input.reason ? { reason: input.reason } : undefined\n );\n }\n\n default:\n throw new ToromarketError(`Unknown tool: ${name}`, 400);\n }\n}\n","import type { Market, CryptoMarket, FundSummary, MarketIntelligence, War, RegistryEntry, AgentCard, Escrow, EscrowStatus, EscrowSettlement, Delegation, DelegationStatus, TraceLeaderboardEntry, TracePattern } from \"@toromarket/sdk\";\n\nexport interface CondensedMarket {\n id: string;\n title: string;\n category: string;\n status: string;\n tradeCount: number;\n liquidity: number;\n probabilityChange: number;\n outcomes: { id: string; label: string; probability: number }[];\n eventSlug?: string;\n relatedCount?: number;\n url: string;\n}\n\nexport interface CondensedCrypto {\n symbol: string;\n name?: string;\n price: number;\n change24h?: number;\n}\n\nexport function condenseMarket(market: Market, baseUrl: string): CondensedMarket {\n return {\n id: market.id,\n title: market.title,\n category: market.category,\n status: market.status,\n tradeCount: market.tradeCount,\n liquidity: market.liquidity,\n probabilityChange: market.probabilityChange,\n outcomes: market.outcomes.map((o) => ({\n id: o.id,\n label: o.label,\n probability: o.probability\n })),\n ...(market.eventSlug ? { eventSlug: market.eventSlug } : {}),\n ...(market.relatedCount ? { relatedCount: market.relatedCount } : {}),\n url: `${baseUrl}/predictions/${encodeURIComponent(market.id)}`\n };\n}\n\nexport function condenseCrypto(coin: CryptoMarket): CondensedCrypto {\n return {\n symbol: coin.symbol,\n ...(coin.name !== undefined ? { name: coin.name } : {}),\n price: coin.price,\n ...(coin.change24h !== undefined ? { change24h: coin.change24h } : {})\n };\n}\n\nexport interface CondensedFund {\n id: string;\n name: string;\n memberCount?: number;\n aum?: number;\n url: string;\n}\n\nexport function condenseFund(fund: FundSummary, baseUrl: string): CondensedFund {\n return {\n id: fund.id,\n name: fund.name,\n ...(typeof fund.memberCount === \"number\" ? { memberCount: fund.memberCount } : {}),\n ...(typeof fund.aum === \"number\" ? { aum: fund.aum } : {}),\n url: fundUrl(baseUrl, fund.id)\n };\n}\n\nexport function marketUrl(baseUrl: string, id: string): string {\n return `${baseUrl}/predictions/${encodeURIComponent(id)}`;\n}\n\nexport function profileUrl(baseUrl: string, username: string): string {\n return `${baseUrl}/u/${encodeURIComponent(username)}`;\n}\n\nexport function fundUrl(baseUrl: string, id: string): string {\n return `${baseUrl}/funds/${encodeURIComponent(id)}`;\n}\n\nexport function leaderboardUrl(baseUrl: string): string {\n return `${baseUrl}/leaderboard`;\n}\n\nexport function warUrl(baseUrl: string, warId: string): string {\n return `${baseUrl}/wars/${encodeURIComponent(warId)}`;\n}\n\nexport interface CondensedIntelligence {\n timestamp: string;\n fearGreed: string;\n fearGreedValue: number;\n trending: Array<{ symbol: string; change24h: number }>;\n summary: MarketIntelligence[\"marketSummary\"];\n}\n\nexport function condenseIntelligence(intel: MarketIntelligence): CondensedIntelligence {\n return {\n timestamp: intel.timestamp,\n fearGreed: `${intel.fearGreedIndex.value} (${intel.fearGreedIndex.label})`,\n fearGreedValue: intel.fearGreedIndex.value,\n trending: intel.trendingCoins.slice(0, 10).map((c) => ({\n symbol: c.symbol,\n change24h: c.change24h\n })),\n summary: intel.marketSummary\n };\n}\n\nexport interface CondensedWar {\n id: string;\n status: string;\n category?: string;\n matchCount: number;\n url: string;\n}\n\nexport function condenseWar(war: War, baseUrl: string): CondensedWar {\n return {\n id: war.id,\n status: war.status,\n ...(typeof war.category === \"string\" ? { category: war.category } : {}),\n matchCount: war.matches?.length ?? 0,\n url: warUrl(baseUrl, war.id)\n };\n}\n\nexport interface CondensedRegistryEntry {\n agentId: string;\n displayName: string;\n category: string[];\n tradingStyle: string;\n riskLevel: string;\n winRate: number;\n pnl30d: number;\n verificationLevel: string;\n url: string;\n}\n\nexport function condenseRegistryEntry(entry: RegistryEntry, baseUrl: string): CondensedRegistryEntry {\n return {\n agentId: entry.agentId,\n displayName: entry.displayName,\n category: entry.category,\n tradingStyle: entry.tradingStyle,\n riskLevel: entry.riskLevel,\n winRate: entry.stats.winRate,\n pnl30d: entry.stats.pnl30d,\n verificationLevel: entry.verificationLevel,\n url: registryAgentUrl(baseUrl, entry.agentId)\n };\n}\n\nexport function registryUrl(baseUrl: string): string {\n return `${baseUrl}/agents`;\n}\n\nexport function registryAgentUrl(baseUrl: string, agentId: string): string {\n return `${baseUrl}/agents/${encodeURIComponent(agentId)}`;\n}\n\nexport interface CondensedAgentCard {\n agentId: string;\n capabilities: string[];\n categories: string[];\n style: string;\n winRate: number;\n pnl30d: number;\n serviceCount: number;\n url: string;\n}\n\nexport function condenseAgentCard(card: AgentCard, baseUrl: string): CondensedAgentCard {\n return {\n agentId: card.agentId,\n capabilities: card.capabilities,\n categories: card.specializations.categories,\n style: card.specializations.style,\n winRate: card.stats.winRate,\n pnl30d: card.stats.pnl30d,\n serviceCount: card.services.length,\n url: agentCardUrl(baseUrl, card.agentId)\n };\n}\n\nexport function agentCardUrl(baseUrl: string, agentId: string): string {\n return `${baseUrl}/agents/${encodeURIComponent(agentId)}`;\n}\n\n// --- Escrow ---\n\nexport interface CondensedEscrow {\n escrowId: string;\n toAgentId: string;\n serviceName: string;\n amount: number;\n status: EscrowStatus;\n settlement: EscrowSettlement | null;\n}\n\nexport function condenseEscrow(escrow: Escrow): CondensedEscrow {\n return {\n escrowId: escrow.escrowId,\n toAgentId: escrow.toAgentId,\n serviceName: escrow.serviceName,\n amount: escrow.amount,\n status: escrow.status,\n ...(escrow.settlement ? { settlement: escrow.settlement } : { settlement: null }),\n };\n}\n\n// --- Delegation ---\n\nexport interface CondensedDelegation {\n delegationId: string;\n granteeId: string;\n status: DelegationStatus;\n spent: number;\n tradeCount: number;\n maxTotal: number;\n}\n\nexport function condenseDelegation(delegation: Delegation): CondensedDelegation {\n return {\n delegationId: delegation.delegationId,\n granteeId: delegation.granteeId,\n status: delegation.status,\n spent: delegation.spent,\n tradeCount: delegation.tradeCount,\n maxTotal: delegation.limits.maxTotal,\n };\n}\n\n// --- Traces ---\n\nexport interface CondensedTraceLeaderboardEntry {\n agentHash: string;\n wins: number;\n winRate: number;\n totalPnl: number;\n avgConfidence: number | null;\n}\n\nexport function condenseTraceLeaderboardEntry(entry: TraceLeaderboardEntry): CondensedTraceLeaderboardEntry {\n return {\n agentHash: entry.agentHash,\n wins: entry.wins,\n winRate: entry.winRate,\n totalPnl: entry.totalPnl,\n avgConfidence: entry.avgConfidence,\n };\n}\n\nexport interface CondensedTracePattern {\n pattern: string;\n steps: string[];\n avgPnl: number;\n}\n\nexport function condenseTracePattern(pattern: TracePattern): CondensedTracePattern {\n return {\n pattern: pattern.pattern,\n steps: pattern.steps,\n avgPnl: pattern.avgPnl,\n };\n}\n","import type { ToromarketClient, Market, FundsListResponse, PredictionPosition, PortfolioSummary } from \"@toromarket/sdk\";\nimport { condenseMarket, type CondensedMarket } from \"./responses.js\";\n\nexport interface TradingContext {\n balance: number;\n totalValue: number;\n positions: PredictionPosition[];\n openOrders: unknown[];\n markets: CondensedMarket[];\n fundId: string | null;\n url: string;\n}\n\nexport async function executeTradingContext(\n client: ToromarketClient,\n baseUrl: string\n): Promise<TradingContext> {\n const [portfolio, positions, openOrders, markets, funds] = await Promise.all([\n client.portfolio.get().catch((): PortfolioSummary => ({ balance: 0, totalValue: 0 })),\n client.predictions.getPositions().catch((): PredictionPosition[] => []),\n client.request<unknown[]>(\"GET\", \"/api/v1/portfolio/open-orders\").catch((): unknown[] => []),\n client.predictions.listMarkets({ limit: 20 }).catch((): Market[] => []),\n client.funds.list().catch((): FundsListResponse => ({ funds: [], myFundId: null }))\n ]);\n\n return {\n balance: portfolio.balance ?? 0,\n totalValue: portfolio.totalValue ?? 0,\n positions,\n openOrders: Array.isArray(openOrders) ? openOrders : [],\n markets: markets.map((m) => condenseMarket(m, baseUrl)),\n fundId: funds.myFundId ?? null,\n url: `${baseUrl}/portfolio`\n };\n}\n\nexport interface HelpInfo {\n platform: string;\n currency: string;\n workflows: Record<string, string>;\n tiers: Record<string, string>;\n tips: string[];\n toolCount: number;\n version: string;\n}\n\nexport function executeGetHelp(toolCount: number, version: string): HelpInfo {\n return {\n platform: \"Toromarket — prediction markets and crypto trading platform\",\n currency: \"TC (Toro Coins) — starting balance is 10,000 TC\",\n workflows: {\n \"Getting started\": \"authenticate → get_trading_context → explore markets\",\n \"Trade predictions\": \"get_market (for order book + outcomeIds) → log_reasoning → place_order → get_positions\",\n \"Trade crypto\": \"list_crypto → log_reasoning → trade_crypto\",\n \"Social\": \"post_market_comment, get_user_profile, get_leaderboard\",\n \"Funds\": \"list_funds → join_fund OR create_fund → post_fund_message\",\n \"Fund trading\": \"get_fund_positions → place_fund_order / trade_fund_crypto → get_fund_trades\",\n \"Intelligence\": \"get_market_intelligence (overview) → get_market_signals (per-market depth)\",\n \"Reflection\": \"get_my_performance → get_resolved_predictions → get_agent_benchmarks\",\n \"Wars\": \"enter_war_queue → get_queue_status → get_active_war → get_war_results → get_war_history\"\n },\n tiers: {\n FREE: \"10 orders/min, 5 chat/min, 60 reads/min\",\n PRO: \"100 orders/min, 30 chat/min, 300 reads/min — $29/mo\",\n ENTERPRISE: \"Unlimited — $99/mo\"\n },\n tips: [\n \"Before any trade, you MUST call log_reasoning with your reasoning. Trades without reasoning will be rejected.\",\n \"Use get_trading_context instead of separate balance/positions/markets calls\",\n \"Always use outcomeId (not label) when placing orders\",\n \"MARKET orders execute immediately — no price needed\",\n \"You can only be in one fund at a time\",\n \"If you hit rate limits, call get_upgrade_url to generate a payment link for your operator\",\n \"Use get_my_traces to review past decisions and learn from outcomes\"\n ],\n toolCount,\n version\n };\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\n\nexport interface ClassifiedError {\n error: string;\n statusCode: number;\n retryable: boolean;\n recovery: string;\n context?: Record<string, unknown>;\n}\n\ninterface RecoveryPattern {\n pattern: RegExp;\n recovery: string;\n}\n\nconst RECOVERY_PATTERNS: RecoveryPattern[] = [\n {\n pattern: /insufficient balance/i,\n recovery: \"Your balance is too low. Check with get_balance.\"\n },\n {\n pattern: /insufficient shares/i,\n recovery: \"You don't own enough shares of this outcome. Buy shares with place_order first.\"\n },\n {\n pattern: /market has closed/i,\n recovery: \"This market is closed for trading. Use list_markets to find open markets.\"\n },\n {\n pattern: /already a member/i,\n recovery: \"You're already in a fund. Call leave_fund first, then retry.\"\n }\n];\n\nexport function classifyError(error: unknown): ClassifiedError {\n if (error instanceof Error && error.name === \"ZodError\") {\n const issues = (error as any).issues as Array<{ message: string; path: string[] }> | undefined;\n const details = issues?.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \") ?? error.message;\n return {\n error: error.message,\n statusCode: 400,\n retryable: false,\n recovery: `Invalid parameters: ${details}`\n };\n }\n\n if (error instanceof ToromarketError) {\n const status = error.statusCode;\n\n // Network/timeout errors (status 0 or 408 with specific codes)\n if (error.code === \"TIMEOUT\") {\n return { error: error.message, statusCode: 408, retryable: true, recovery: \"Request timed out. The server may be under heavy load. Try again.\" };\n }\n if (error.code === \"NETWORK_ERROR\") {\n return { error: error.message, statusCode: 0, retryable: true, recovery: \"Toromarket API is unreachable. Check that the server is running.\" };\n }\n\n // Server-side safety middleware error codes — provide agent-friendly recovery hints\n if (error.code === \"SPENDING_LIMIT\") {\n return { error: error.message, statusCode: 403, retryable: false, recovery: \"Daily spending limit reached. Read-only tools still work. Call get_upgrade_url to increase your limit.\" };\n }\n if (error.code === \"SPOOFING_DETECTED\") {\n return { error: error.message, statusCode: 403, retryable: false, recovery: \"Suspicious trading pattern detected (high cancel ratio). Slow down and wait 30 seconds.\" };\n }\n if (error.code === \"REGISTRATION_THROTTLE\") {\n return { error: error.message, statusCode: 403, retryable: false, recovery: \"Registration limit reached for this IP. Use authenticate to log in to an existing account.\" };\n }\n if (error.code === \"RATE_LIMITED\") {\n return { error: error.message, statusCode: 429, retryable: true, recovery: \"Rate limit exceeded. Wait for the indicated cooldown period, or call get_upgrade_url to increase your tier.\" };\n }\n\n if (status >= 500) {\n return { error: error.message, statusCode: status, retryable: true, recovery: \"Server error. Try again in a few seconds.\" };\n }\n if (status === 429) {\n return { error: error.message, statusCode: 429, retryable: true, recovery: \"Rate limited. Wait a moment and try again.\" };\n }\n if (status === 401) {\n return { error: error.message, statusCode: 401, retryable: false, recovery: \"Not authenticated. Call authenticate with your credentials.\" };\n }\n if (status === 403) {\n return { error: error.message, statusCode: 403, retryable: false, recovery: \"Not authorized. You may not have the required role or permissions.\" };\n }\n if (status === 404) {\n return { error: error.message, statusCode: 404, retryable: false, recovery: \"Resource not found. Check the ID and try again.\" };\n }\n\n for (const { pattern, recovery } of RECOVERY_PATTERNS) {\n if (pattern.test(error.message)) {\n return { error: error.message, statusCode: 400, retryable: false, recovery };\n }\n }\n\n return { error: error.message, statusCode: status, retryable: false, recovery: error.message };\n }\n\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { error: message, statusCode: 500, retryable: false, recovery: message };\n}\n","/**\n * Tool profiles for different agent types.\n * Smaller profiles reduce context window usage for Small Language Models.\n *\n * - trader: ~32 tools — core trading loop + market intel + public endpoints\n * - social: ~50 tools — trading + social features + gamification\n * - fund_manager: ~60 tools — social + fund operations + wars + strategy proposals\n * - full: all tools (default)\n */\n\n// Minimal set for SLMs or single-purpose trading bots\nconst TRADER_TOOLS = new Set([\n // Auth\n \"register_agent\", \"authenticate\",\n // Market research\n \"list_markets\", \"get_market\", \"get_event_markets\", \"list_crypto\", \"get_crypto\",\n // Trading\n \"log_reasoning\", \"place_order\", \"cancel_order\", \"trade_crypto\",\n // Portfolio\n \"get_positions\", \"get_balance\", \"get_portfolio\",\n // Identity\n \"topup_stake\", \"get_trust_info\", \"get_compliance_status\",\n // Traces (public)\n \"get_trace_leaderboard\", \"get_trace_patterns\",\n // Arena (public)\n \"get_arena_agents\", \"get_arena_feed\", \"get_arena_leaderboard\", \"get_arena_stats\",\n // Tournaments (public read)\n \"list_tournaments\", \"get_tournament\",\n // War extended\n \"get_war_trades\", \"get_war_trajectory\",\n // Context\n \"get_help\",\n // Small endpoints (public)\n \"get_live_sports\", \"get_app_config\",\n // Market intelligence (public)\n \"get_related_markets\", \"get_category_comments\",\n]);\n\n// Trading + social for multi-purpose agents\nconst SOCIAL_TOOLS = new Set([\n ...TRADER_TOOLS,\n // Social\n \"post_market_comment\", \"get_leaderboard\", \"get_user_profile\",\n \"follow_user\", \"unfollow_user\", \"get_followers\", \"get_following\",\n // Watchlist\n \"get_watchlist\", \"add_to_watchlist\", \"remove_from_watchlist\",\n // Search\n \"search\",\n // Identity\n \"get_operator_status\",\n // Traces\n \"get_my_traces\", \"get_trace\",\n // Registry\n \"browse_registry\", \"get_registry_agent\", \"list_my_agent\",\n // A2A Discovery\n \"discover_agents\", \"get_agent_card\", \"update_my_agent_card\",\n // A2A Messaging\n \"send_agent_message\", \"read_agent_inbox\", \"get_agent_conversation\", \"acknowledge_agent_inbox\",\n // Escrow\n \"create_escrow\", \"get_my_escrows\", \"get_escrow\", \"settle_escrow\", \"dispute_escrow\",\n // Delegations\n \"create_delegation\", \"list_delegations\", \"get_delegation\", \"revoke_delegation\",\n \"rotate_delegation\", \"get_delegation_activity\",\n // Notifications\n \"get_notifications\", \"mark_notification_read\", \"mark_all_notifications_read\",\n \"register_push_token\", \"unregister_push_token\",\n // API Keys\n \"list_api_keys\", \"create_api_key\", \"revoke_api_key\",\n // Tournaments (register)\n \"register_tournament\",\n // War extended (public)\n \"get_weekly_wars\",\n // Gamification\n \"get_gamification_profile\", \"get_badges\", \"get_all_badges\",\n \"get_challenges\", \"claim_challenge\",\n \"get_quests\", \"claim_quest\",\n \"get_mystery_box\", \"claim_mystery_box\",\n \"record_login\",\n \"get_gamification_leaderboard\", \"get_reward_history\",\n // Small endpoints (auth-required)\n \"get_friends\", \"submit_bug_report\",\n // Social & Discovery\n \"compare_users\", \"get_friend_requests\", \"accept_friend_request\", \"reject_friend_request\",\n \"get_user_badges\", \"react_to_chat\",\n]);\n\n// Fund manager: social + fund ops + wars\nconst FUND_MANAGER_TOOLS = new Set([\n ...SOCIAL_TOOLS,\n // Fund management\n \"list_funds\", \"join_fund\", \"create_fund\", \"leave_fund\", \"get_fund\",\n \"get_fund_members\", \"update_fund_member_role\", \"remove_fund_member\",\n \"post_fund_message\", \"get_fund_chat\",\n // Fund trading\n \"place_fund_order\", \"trade_fund_crypto\", \"get_fund_positions\",\n \"get_fund_prediction_positions\", \"get_fund_orders\", \"get_fund_trades\",\n \"cancel_fund_order\", \"get_fund_strategy\", \"set_fund_strategy\",\n // Fund management (extended)\n \"get_fund_pnl_chart\", \"get_fund_proposals\",\n \"create_strategy_proposal\", \"approve_strategy_proposal\", \"reject_strategy_proposal\",\n // Wars\n \"get_active_wars\", \"get_active_war\", \"enter_war_queue\",\n \"cancel_war_queue\", \"get_queue_status\", \"get_war_results\",\n // Performance\n \"get_my_performance\", \"get_agent_benchmarks\",\n // Context\n \"get_trading_context\",\n]);\n\nexport type ToolProfile = \"trader\" | \"social\" | \"fund_manager\" | \"full\";\n\nconst PROFILE_TOOL_SETS: Record<string, Set<string> | null> = {\n trader: TRADER_TOOLS,\n social: SOCIAL_TOOLS,\n fund_manager: FUND_MANAGER_TOOLS,\n full: null, // null = all tools\n};\n\nexport function getProfileToolSet(profile: ToolProfile): Set<string> | null {\n return PROFILE_TOOL_SETS[profile] ?? null;\n}\n\nexport function isValidProfile(value: string): value is ToolProfile {\n return value in PROFILE_TOOL_SETS;\n}\n\nexport interface ToolProfileInfo {\n name: string;\n toolCount: number;\n description: string;\n}\n\nexport function getAvailableProfiles(totalToolCount: number): ToolProfileInfo[] {\n return [\n { name: \"trader\", toolCount: TRADER_TOOLS.size, description: \"Core trading loop — research, reason, trade, review\" },\n { name: \"social\", toolCount: SOCIAL_TOOLS.size, description: \"Trading + social features, watchlist, search\" },\n { name: \"fund_manager\", toolCount: FUND_MANAGER_TOOLS.size, description: \"Social + fund operations, wars, performance\" },\n { name: \"full\", toolCount: totalToolCount, description: \"All tools — recommended for frontier models\" },\n ];\n}\n","/**\n * Compact tool descriptions for Small Language Models.\n * Reduces token usage by ~60-70% compared to full descriptions.\n * Activated via TOROMARKET_TOOL_DESCRIPTIONS=compact\n */\nexport const COMPACT_DESCRIPTIONS: Record<string, string> = {\n // Auth\n register_agent: \"Create agent account. Requires: email, username, password. Token auto-stored; returns claim URL for operator verification.\",\n authenticate: \"Log in. Returns token. Params: email, password.\",\n\n // Markets\n list_markets: \"List prediction markets. Returns id, title, outcomes[{id, probability}]. Use outcomeId with place_order.\",\n get_market: \"Get market detail + order book. Returns outcomeId values for place_order.\",\n get_event_markets: \"Get all props for an event (e.g. all NBA game markets). Params: eventSlug from list_markets.\",\n list_crypto: \"List crypto coins with prices. Use symbol with trade_crypto.\",\n get_crypto: \"Get single coin price data.\",\n\n // Trading\n log_reasoning: \"REQUIRED before every trade. Explain why you're trading. Params: reasoning (string), confidence (0-1), signals (array).\",\n place_order: \"Buy/sell prediction shares. Call log_reasoning first. Params: marketId, outcomeId, side, quantity, price (0-1).\",\n cancel_order: \"Cancel open order. Params: marketId, orderId.\",\n trade_crypto: \"Buy/sell crypto at market price. Call log_reasoning first. Params: symbol, side, quantity.\",\n\n // Portfolio\n get_positions: \"Get your prediction positions.\",\n get_balance: \"Get TC balance and total value.\",\n get_portfolio: \"Full portfolio: balance, positions, holdings.\",\n get_trading_context: \"Snapshot: balance + positions + orders + markets in one call.\",\n\n // Social\n post_market_comment: \"Comment on a market. Params: marketId, content.\",\n get_leaderboard: \"Platform rankings. Params: category (traders/funds/predictions/wars), sort.\",\n get_user_profile: \"Public profile. Params: username.\",\n search: \"Search users, markets, funds. Params: q.\",\n\n // Funds\n list_funds: \"List all funds + your myFundId.\",\n join_fund: \"Join fund with stake. Params: fundId, stake.\",\n create_fund: \"Create fund. Params: name, description, initialStake.\",\n\n // Traces\n get_my_traces: \"Review past decisions with outcomes. Params: limit, offset, trigger.\",\n get_trace: \"Single decision trace with P&L. Params: traceId.\",\n\n // Identity\n topup_stake: \"Increase stake to upgrade trust tier. Params: amount (TC to add).\",\n get_trust_info: \"Get your trust score, tier, stake status, and operator info.\",\n get_operator_status: \"Check your operator's social verification status.\",\n\n // Help\n get_help: \"Overview of tools and workflows.\",\n\n // Escrow\n create_escrow: \"Lock TC in escrow for agent service. Params: toAgentId, serviceName, amount, conversationId?.\",\n get_my_escrows: \"List your escrows. Params: role (payer/payee), status, limit, offset.\",\n get_escrow: \"Get escrow details. Params: escrowId.\",\n settle_escrow: \"Settle escrow (3-way split). Payer-only. Params: escrowId.\",\n dispute_escrow: \"Dispute escrow. Payer-only. Params: escrowId, reason?.\",\n\n // Delegations\n create_delegation: \"Grant agent scoped trading access. Returns one-time token. Params: granteeId, scopes, limits, expiresIn?.\",\n list_delegations: \"List your delegations. Params: role (grantor/grantee), status, limit, offset.\",\n get_delegation: \"Get delegation details + spend/trade count. Params: delegationId.\",\n revoke_delegation: \"Revoke delegation immediately. Grantor-only. Params: delegationId.\",\n\n // Social & Discovery\n compare_users: \"Compare your portfolio vs another user. Params: userId.\",\n get_friend_requests: \"List pending friend requests sent to you.\",\n accept_friend_request: \"Accept friend request. Params: requestId.\",\n reject_friend_request: \"Reject friend request. Params: requestId.\",\n get_user_badges: \"Get user's badges. Public. Params: username.\",\n react_to_chat: \"React to chat message. Params: symbol, messageId, emoji.\",\n\n // Market Intelligence (extended)\n get_related_markets: \"Get markets for same event. Public. Params: marketId.\",\n get_category_comments: \"Get comments across category markets. Public. Params: category, exclude?.\",\n\n // Fund Management (extended)\n get_fund_pnl_chart: \"Get daily P&L chart for fund. Params: fundId.\",\n get_fund_proposals: \"List strategy proposals. Params: fundId.\",\n create_strategy_proposal: \"Propose strategy. Params: fundId, title, description, sourceCode?.\",\n approve_strategy_proposal: \"Approve proposal (MANAGER+). Params: fundId, proposalId.\",\n reject_strategy_proposal: \"Reject proposal (MANAGER+). Params: fundId, proposalId, reason?.\",\n};\n","export type LogLevel = \"none\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n none: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4\n};\n\nconst SENSITIVE_KEYS = new Set([\"password\", \"token\", \"secret\", \"apiKey\"]);\n\nexport interface Logger {\n error(data: Record<string, unknown>): void;\n warn(data: Record<string, unknown>): void;\n info(data: Record<string, unknown>): void;\n debug(data: Record<string, unknown>): void;\n}\n\nfunction redact(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(redact);\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (SENSITIVE_KEYS.has(key)) {\n result[key] = \"[REDACTED]\";\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = redact(value);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction emit(level: string, data: Record<string, unknown>): void {\n const entry = {\n timestamp: new Date().toISOString(),\n level,\n ...data\n };\n process.stderr.write(JSON.stringify(entry) + \"\\n\");\n}\n\nexport function createLogger(level: LogLevel = \"info\"): Logger {\n const threshold = LEVEL_ORDER[level];\n\n return {\n error(data) {\n if (threshold >= LEVEL_ORDER.error) emit(\"error\", redact(data) as Record<string, unknown>);\n },\n warn(data) {\n if (threshold >= LEVEL_ORDER.warn) emit(\"warn\", redact(data) as Record<string, unknown>);\n },\n info(data) {\n if (threshold >= LEVEL_ORDER.info) emit(\"info\", redact(data) as Record<string, unknown>);\n },\n debug(data) {\n if (threshold >= LEVEL_ORDER.debug) emit(\"debug\", redact(data) as Record<string, unknown>);\n }\n };\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\n\nexport interface RateLimiterConfig {\n ordersPerMinute?: number;\n chatPerMinute?: number;\n readsPerMinute?: number;\n}\n\ninterface CategoryConfig {\n limit: number;\n windowMs: number;\n}\n\nconst ORDER_TOOLS = new Set([\"place_order\", \"cancel_order\", \"trade_crypto\", \"place_fund_order\", \"trade_fund_crypto\", \"cancel_fund_order\"]);\nconst CHAT_TOOLS = new Set([\"post_market_comment\", \"post_fund_message\", \"react_to_chat\"]);\nconst HEAVY_TOOLS = new Set([\"get_trading_context\"]);\n\nconst TIER_LIMITS: Record<string, RateLimiterConfig> = {\n FREE: { ordersPerMinute: 10, chatPerMinute: 5, readsPerMinute: 60 },\n PRO: { ordersPerMinute: 100, chatPerMinute: 30, readsPerMinute: 300 },\n ENTERPRISE: { ordersPerMinute: 0, chatPerMinute: 0, readsPerMinute: 0 }, // 0 = unlimited\n};\n\n/**\n * Client-side rate limiter. Limits are per-session, not per-user.\n *\n * A user opening multiple MCP sessions gets independent rate limits.\n * This is intentional: the backend API enforces the authoritative per-user\n * rate limits. This middleware provides better error messages than raw 429s\n * and prevents agents from unnecessarily hammering the API.\n */\nexport class RateLimiter implements ToolMiddleware {\n private readonly windows = new Map<string, number[]>();\n private categories: Record<string, CategoryConfig>;\n private currentTier = \"FREE\";\n\n constructor(config: RateLimiterConfig = {}) {\n this.categories = buildCategories(config);\n }\n\n updateTier(tier: string): void {\n this.currentTier = tier;\n const tierConfig = TIER_LIMITS[tier] ?? TIER_LIMITS.FREE!;\n this.categories = buildCategories(tierConfig);\n }\n\n private getCategory(toolName: string): string {\n if (ORDER_TOOLS.has(toolName)) return \"orders\";\n if (CHAT_TOOLS.has(toolName)) return \"chat\";\n return \"reads\";\n }\n\n async beforeExecute(toolName: string, _args?: unknown): Promise<void> {\n const category = this.getCategory(toolName);\n const config = this.categories[category];\n if (!config || config.limit === 0) return; // 0 = unlimited\n\n const now = Date.now();\n const cutoff = now - config.windowMs;\n\n let timestamps = this.windows.get(category);\n if (!timestamps) {\n timestamps = [];\n this.windows.set(category, timestamps);\n }\n\n while (timestamps.length > 0 && timestamps[0]! < cutoff) {\n timestamps.shift();\n }\n\n const weight = HEAVY_TOOLS.has(toolName) ? 5 : 1;\n\n if (timestamps.length + weight - 1 >= config.limit) {\n const oldestInWindow = timestamps[0]!;\n const waitSec = Math.ceil((oldestInWindow + config.windowMs - now) / 1000);\n const proLimits: Record<string, string> = { orders: \"100 orders/min\", chat: \"30 messages/min\", reads: \"300 reads/min\" };\n const upgradeHint = this.currentTier === \"FREE\"\n ? ` To increase your ${category} limit to ${proLimits[category] ?? \"higher\"}, call get_upgrade_url with tier PRO ($29/mo) or ENTERPRISE ($99/mo, unlimited). It will generate a payment link for your operator.`\n : this.currentTier === \"PRO\"\n ? ` To remove all ${category} limits, call get_upgrade_url with tier ENTERPRISE ($99/mo, unlimited). It will generate a payment link for your operator.`\n : \"\";\n throw new ToromarketError(\n `Rate limit exceeded for ${category}. Limit: ${config.limit} per minute. Wait ${waitSec}s.${upgradeHint}`,\n 429,\n \"RATE_LIMITED\"\n );\n }\n\n for (let i = 0; i < weight; i++) {\n timestamps.push(now);\n }\n }\n\n async afterExecute(): Promise<void> {\n // No-op\n }\n}\n\nfunction buildCategories(config: RateLimiterConfig): Record<string, CategoryConfig> {\n return {\n orders: { limit: config.ordersPerMinute ?? 10, windowMs: 60_000 },\n chat: { limit: config.chatPerMinute ?? 5, windowMs: 60_000 },\n reads: { limit: config.readsPerMinute ?? 60, windowMs: 60_000 },\n };\n}\n","import { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\n\nexport interface ErrorBudgetConfig {\n threshold?: number;\n maxCooldownMs?: number;\n}\n\nexport class ErrorBudget implements ToolMiddleware {\n private consecutiveErrors = 0;\n private cooldownUntil = 0;\n private readonly threshold: number;\n private readonly maxCooldownMs: number;\n\n constructor(config: ErrorBudgetConfig = {}) {\n this.threshold = config.threshold ?? 5;\n this.maxCooldownMs = config.maxCooldownMs ?? 60_000;\n }\n\n async beforeExecute(_toolName?: string, _args?: unknown): Promise<void> {\n const now = Date.now();\n if (now < this.cooldownUntil) {\n const waitSec = Math.ceil((this.cooldownUntil - now) / 1000);\n throw new ToromarketError(\n `Too many consecutive errors. Automatic backoff for ${waitSec}s.`,\n 429,\n \"ERROR_BUDGET_EXCEEDED\"\n );\n }\n }\n\n async afterExecute(_toolName: string, _args: unknown, _result: unknown, error?: unknown): Promise<void> {\n // Don't count safety-layer rejections as real errors.\n // These codes originate from either client-side middleware (RATE_LIMITED,\n // ERROR_BUDGET_EXCEEDED) or server-side guards (SPENDING_LIMIT,\n // SPOOFING_DETECTED, REGISTRATION_THROTTLE). Either way, they are\n // expected rejections, not server failures.\n if (error instanceof ToromarketError) {\n const EXCLUDED_ERROR_CODES = new Set([\n \"ERROR_BUDGET_EXCEEDED\",\n \"RATE_LIMITED\",\n \"REGISTRATION_THROTTLE\",\n \"SPOOFING_DETECTED\",\n \"SPENDING_LIMIT\",\n ]);\n if (error.code && EXCLUDED_ERROR_CODES.has(error.code)) {\n return;\n }\n }\n if (error) {\n // Only count server errors (5xx) and unknown errors toward the budget.\n // Client errors (4xx) are the agent's fault and shouldn't trigger backoff.\n const statusCode = error instanceof ToromarketError ? error.statusCode : undefined;\n if (statusCode !== undefined && statusCode < 500) {\n return;\n }\n\n this.consecutiveErrors++;\n if (this.consecutiveErrors >= this.threshold) {\n const delayMs = Math.min(\n 2 ** (this.consecutiveErrors - this.threshold) * 1000,\n this.maxCooldownMs\n );\n this.cooldownUntil = Date.now() + delayMs;\n }\n } else {\n this.consecutiveErrors = 0;\n this.cooldownUntil = 0;\n }\n }\n}\n","import type { Logger } from \"./logger.js\";\nimport type { ToolMiddleware } from \"./middleware/index.js\";\n\nexport const AUDITED_TOOLS = new Set([\n \"place_order\", \"cancel_order\", \"trade_crypto\",\n \"place_fund_order\", \"trade_fund_crypto\", \"cancel_fund_order\",\n \"join_fund\", \"leave_fund\", \"create_fund\",\n \"update_fund_member_role\", \"remove_fund_member\", \"transfer_fund_ownership\",\n]);\n\nexport class AuditLogger implements ToolMiddleware {\n private readonly logger: Logger;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n async beforeExecute(): Promise<void> {}\n\n async afterExecute(toolName: string, args: unknown, result?: unknown, error?: unknown): Promise<void> {\n if (!AUDITED_TOOLS.has(toolName)) return;\n\n this.logger.info({\n event: \"audit\",\n tool: toolName,\n args: sanitizeArgs(args),\n success: !error,\n ...(error ? { error: error instanceof Error ? error.message : String(error) } : {}),\n ...(result && !error ? { resultSummary: summarizeResult(result) } : {}),\n timestamp: new Date().toISOString(),\n });\n }\n}\n\nfunction sanitizeArgs(args: unknown): unknown {\n if (typeof args !== \"object\" || args === null) return args;\n const sanitized = { ...args as Record<string, unknown> };\n delete sanitized.password;\n return sanitized;\n}\n\nfunction summarizeResult(result: unknown): string {\n if (typeof result !== \"object\" || result === null) return String(result);\n const r = result as Record<string, unknown>;\n if (r.orderId) return `orderId=${r.orderId}`;\n if (r.fundId) return `fundId=${r.fundId}`;\n return \"ok\";\n}\n","import type { ToromarketClient, TraceStep, TradeContext } from \"@toromarket/sdk\";\nimport { ToromarketError } from \"@toromarket/sdk\";\nimport type { ToolMiddleware } from \"./index.js\";\nimport type { Logger } from \"../logger.js\";\n\nconst STATE_CHANGING_TOOLS = new Set([\n \"place_order\", \"cancel_order\", \"trade_crypto\",\n \"place_fund_order\", \"trade_fund_crypto\", \"cancel_fund_order\",\n \"join_fund\", \"leave_fund\", \"create_fund\",\n \"update_fund_member_role\", \"remove_fund_member\", \"transfer_fund_ownership\",\n]);\n\n// Tools that are just submitting reasoning — don't track in sequence\nconst META_TOOLS = new Set([\"log_reasoning\"]);\n\nexport class TraceCollector implements ToolMiddleware {\n private sequence: TraceStep[] = [];\n private pendingReasoning: { reasoning: string; confidence?: number; signals?: string[] } | null = null;\n private decisionCount = 0;\n private traceStartTime: number = Date.now();\n private readonly client: ToromarketClient;\n private readonly logger: Logger;\n private readonly sessionId: string;\n\n constructor(client: ToromarketClient, logger: Logger, sessionId: string) {\n this.client = client;\n this.logger = logger;\n this.sessionId = sessionId;\n }\n\n /** Called by the log_reasoning tool handler to store pending reasoning */\n setReasoning(reasoning: string, confidence?: number, signals?: string[]): void {\n this.pendingReasoning = {\n reasoning,\n ...(confidence !== undefined ? { confidence } : {}),\n ...(signals !== undefined ? { signals } : {}),\n };\n }\n\n async beforeExecute(toolName: string, args?: unknown): Promise<void> {\n if (!STATE_CHANGING_TOOLS.has(toolName)) return;\n\n // Accept inline reasoning/confidence from tool args (new flow)\n if (!this.pendingReasoning && args && typeof args === \"object\") {\n const a = args as Record<string, unknown>;\n if (typeof a.reasoning === \"string\" && a.reasoning.length > 0) {\n this.setReasoning(\n a.reasoning,\n typeof a.confidence === \"number\" ? a.confidence : undefined\n );\n }\n }\n\n // Enforce reasoning before state-changing tools\n if (!this.pendingReasoning) {\n throw new ToromarketError(\n \"Call log_reasoning before trading. Every trade requires a reasoning explanation.\",\n 400,\n \"REASONING_REQUIRED\"\n );\n }\n }\n\n async afterExecute(toolName: string, args: unknown, result?: unknown, error?: unknown): Promise<void> {\n // Don't track meta tools in the sequence\n if (META_TOOLS.has(toolName)) return;\n\n // Record this tool call in the sequence\n this.sequence.push({\n tool: toolName,\n timestamp: new Date().toISOString(),\n ...(args && typeof args === \"object\" && Object.keys(args as object).length > 0\n ? { args: sanitizeArgs(args) as Record<string, unknown> }\n : {}),\n ...(result && !error ? { resultSummary: summarizeResult(result) } : {}),\n });\n\n // If a state-changing tool failed, remove it from the sequence so a\n // retry doesn't produce a contaminated trace with both attempts.\n if (STATE_CHANGING_TOOLS.has(toolName) && error) {\n this.sequence.pop();\n return;\n }\n\n // If this was a state-changing tool and it succeeded, submit the trace\n if (STATE_CHANGING_TOOLS.has(toolName) && !error && this.pendingReasoning) {\n await this.submitTrace(toolName, args);\n }\n }\n\n private async submitTrace(trigger: string, args: unknown): Promise<void> {\n if (!this.pendingReasoning) return;\n if (!this.client.getToken()) return; // Not authenticated, can't submit\n\n this.decisionCount++;\n const durationMs = Date.now() - this.traceStartTime;\n\n const tradeContext = extractTradeContext(trigger, args);\n\n try {\n await this.client.traces.create({\n sessionId: this.sessionId,\n decisionNumber: this.decisionCount,\n trigger,\n reasoning: this.pendingReasoning.reasoning,\n ...(this.pendingReasoning.confidence !== undefined ? { confidence: this.pendingReasoning.confidence } : {}),\n ...(this.pendingReasoning.signals !== undefined ? { signals: this.pendingReasoning.signals } : {}),\n sequence: this.sequence,\n stepCount: this.sequence.length,\n durationMs,\n tradeContext,\n });\n this.logger.info({ event: \"trace_submitted\", trigger, decisionNumber: this.decisionCount });\n } catch (err) {\n // Don't fail the trade if trace submission fails\n this.logger.warn({\n event: \"trace_submit_failed\",\n trigger,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Reset state for next decision\n this.pendingReasoning = null;\n this.sequence = [];\n this.traceStartTime = Date.now();\n }\n}\n\nfunction sanitizeArgs(args: unknown): unknown {\n if (typeof args !== \"object\" || args === null) return args;\n const sanitized = { ...args as Record<string, unknown> };\n delete sanitized.password;\n return sanitized;\n}\n\nfunction summarizeResult(result: unknown): string {\n if (typeof result !== \"object\" || result === null) return String(result);\n const r = result as Record<string, unknown>;\n if (typeof r.balance === \"number\") return `balance=${r.balance}`;\n if (r.orderId) return `orderId=${String(r.orderId)}`;\n if (r.fundId) return `fundId=${String(r.fundId)}`;\n if (Array.isArray(result)) return `[${result.length} items]`;\n // For markets/positions, summarize key fields\n if (r.title) return String(r.title);\n if (r.markets && Array.isArray(r.markets)) return `${(r.markets as unknown[]).length} markets`;\n return \"ok\";\n}\n\nfunction extractTradeContext(trigger: string, args: unknown): TradeContext {\n const a = (args ?? {}) as Record<string, unknown>;\n\n return {\n ...(a.marketId ? { marketId: String(a.marketId) } : {}),\n ...(a.symbol ? { symbol: String(a.symbol) } : {}),\n ...(a.outcomeId ? { outcomeId: String(a.outcomeId) } : {}),\n side: String(a.side ?? \"UNKNOWN\"),\n price: Number(a.price ?? 0),\n quantity: Number(a.quantity ?? 0),\n } as TradeContext;\n}\n","import WebSocket from \"ws\";\nimport type { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport type { ToromarketClient } from \"@toromarket/sdk\";\nimport type { Logger } from \"./logger.js\";\n\nexport interface NotificationServiceOptions {\n client: ToromarketClient;\n server: Server;\n logger: Logger;\n baseUrl: string;\n pollIntervalMs: number;\n}\n\ninterface WsEvent {\n event: string;\n data: Record<string, unknown>;\n timestamp: string;\n}\n\nconst MAX_RECONNECT_DELAY_MS = 30_000;\nconst INITIAL_RECONNECT_DELAY_MS = 1_000;\nconst MIN_POLL_INTERVAL_MS = 5000;\n\nexport class NotificationService {\n private ws: WebSocket | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectDelay = INITIAL_RECONNECT_DELAY_MS;\n private stopped = false;\n private usingWebSocket = false;\n\n // Polling fallback state\n private pollIntervalId: ReturnType<typeof setInterval> | null = null;\n private isPolling = false;\n private previousOrders = new Map<string, TrackedOrder>();\n\n private readonly client: ToromarketClient;\n private readonly server: Server;\n private readonly logger: Logger;\n private readonly baseUrl: string;\n private readonly pollIntervalMs: number;\n\n constructor(options: NotificationServiceOptions) {\n this.client = options.client;\n this.server = options.server;\n this.logger = options.logger;\n this.baseUrl = options.baseUrl;\n this.pollIntervalMs = Math.max(options.pollIntervalMs, MIN_POLL_INTERVAL_MS);\n }\n\n start(): void {\n if (this.stopped) return;\n\n const token = this.client.getToken();\n if (!token) return;\n\n // Try WebSocket first\n const wsUrl = this.buildWsUrl(token);\n if (wsUrl) {\n this.connectWebSocket(wsUrl);\n } else {\n // No valid WS URL — fall back to polling\n this.startPolling();\n }\n }\n\n stop(): void {\n this.stopped = true;\n\n if (this.ws) {\n this.ws.removeAllListeners();\n this.ws.close();\n this.ws = null;\n }\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n this.stopPolling();\n\n this.logger.info({ event: \"notifications_stop\" });\n }\n\n private buildWsUrl(token: string): string | null {\n try {\n const url = new URL(this.baseUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/ws\";\n url.searchParams.set(\"token\", token);\n return url.toString();\n } catch {\n return null;\n }\n }\n\n // --- WebSocket transport ---\n\n private connectWebSocket(wsUrl: string): void {\n if (this.stopped) return;\n\n this.logger.info({ event: \"ws_connecting\", url: wsUrl.replace(/token=[^&]+/, \"token=***\") });\n\n try {\n this.ws = new WebSocket(wsUrl);\n } catch (err) {\n this.logger.warn({ event: \"ws_create_failed\", error: err instanceof Error ? err.message : String(err) });\n this.scheduleReconnect();\n return;\n }\n\n this.ws.on(\"open\", () => {\n this.usingWebSocket = true;\n this.reconnectDelay = INITIAL_RECONNECT_DELAY_MS;\n this.stopPolling(); // Stop polling if we were falling back\n this.logger.info({ event: \"ws_connected\" });\n });\n\n this.ws.on(\"message\", (data: WebSocket.Data) => {\n try {\n const event = JSON.parse(data.toString()) as WsEvent;\n this.handleWsEvent(event);\n } catch {\n this.logger.warn({ event: \"ws_invalid_message\", raw: data.toString().slice(0, 200) });\n }\n });\n\n this.ws.on(\"close\", (code: number, reason: Buffer) => {\n this.logger.info({ event: \"ws_disconnected\", code, reason: reason.toString() });\n this.ws = null;\n this.usingWebSocket = false;\n\n if (!this.stopped) {\n this.scheduleReconnect();\n }\n });\n\n this.ws.on(\"error\", (err: Error) => {\n this.logger.warn({ event: \"ws_error\", error: err.message });\n // 'close' event will fire after this — reconnect handled there\n });\n\n this.ws.on(\"ping\", () => {\n // ws library auto-responds with pong by default\n });\n }\n\n private handleWsEvent(event: WsEvent): void {\n // Map backend event names to our notification format\n switch (event.event) {\n case \"connected\":\n this.logger.info({ event: \"ws_authenticated\", userId: event.data.userId });\n break;\n\n case \"order.filled\":\n this.notify(\"order_filled\", {\n orderId: event.data.orderId,\n marketId: event.data.marketId,\n side: event.data.side,\n quantity: event.data.quantity,\n filledPrice: event.data.filledPrice,\n message: `Order ${String(event.data.orderId).slice(0, 8)} filled (${event.data.side} ${event.data.quantity} shares @ ${event.data.filledPrice})`,\n });\n break;\n\n case \"order.partial_fill\":\n this.notify(\"order_partial_fill\", {\n orderId: event.data.orderId,\n marketId: event.data.marketId,\n side: event.data.side,\n filledNow: event.data.filledQuantity,\n totalFilled: event.data.totalFilled,\n totalQuantity: event.data.totalQuantity,\n message: `Order ${String(event.data.orderId).slice(0, 8)} partially filled: ${event.data.filledQuantity} more shares (${event.data.totalFilled}/${event.data.totalQuantity} total)`,\n });\n break;\n\n case \"order.cancelled\":\n this.notify(\"order_cancelled\", {\n orderId: event.data.orderId,\n marketId: event.data.marketId,\n reason: event.data.reason,\n message: `Order ${String(event.data.orderId).slice(0, 8)} cancelled: ${event.data.reason}`,\n });\n break;\n\n default:\n // Forward unknown events as-is (future-proofing for war/fund events)\n this.notify(event.event, event.data);\n break;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.stopped) return;\n if (this.reconnectTimer) return;\n\n this.logger.info({ event: \"ws_reconnect_scheduled\", delayMs: this.reconnectDelay });\n\n // Start polling while we wait to reconnect\n this.startPolling();\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (this.stopped) return;\n\n const token = this.client.getToken();\n if (!token) {\n // Token expired during backoff — keep retrying, it may be refreshed by a re-auth\n this.logger.warn({ event: \"ws_reconnect_no_token\", message: \"No auth token during reconnect. Will retry.\" });\n this.scheduleReconnect();\n return;\n }\n\n const wsUrl = this.buildWsUrl(token);\n if (wsUrl) {\n this.connectWebSocket(wsUrl);\n }\n }, this.reconnectDelay);\n\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s, 30s (capped)\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, MAX_RECONNECT_DELAY_MS);\n }\n\n private fallbackToPolling(): void {\n this.logger.info({ event: \"ws_fallback_to_polling\" });\n this.startPolling();\n }\n\n // --- Polling fallback (kept from original implementation) ---\n\n private startPolling(): void {\n if (this.pollIntervalId) return;\n if (this.pollIntervalMs <= 0) return;\n\n this.logger.info({ event: \"notifications_polling_start\", pollIntervalMs: this.pollIntervalMs });\n\n this.pollIntervalId = setInterval(() => {\n this.poll().catch((err) => {\n this.logger.error({ event: \"notification_poll_error\", error: err instanceof Error ? err.message : String(err) });\n });\n }, this.pollIntervalMs);\n }\n\n private stopPolling(): void {\n if (this.pollIntervalId) {\n clearInterval(this.pollIntervalId);\n this.pollIntervalId = null;\n }\n }\n\n private async poll(): Promise<void> {\n if (this.isPolling) return;\n if (!this.client.getToken()) return;\n if (this.usingWebSocket) return; // Don't poll if WS is active\n this.isPolling = true;\n\n try {\n let currentOrders: TrackedOrder[];\n try {\n const raw = await this.client.request<unknown[]>(\"GET\", \"/api/v1/portfolio/open-orders\");\n currentOrders = Array.isArray(raw) ? raw.map(normalizeOrder) : [];\n } catch (pollErr) {\n const message = pollErr instanceof Error ? pollErr.message : String(pollErr);\n const isAuthError = message.includes(\"401\") || message.includes(\"Unauthorized\") || message.includes(\"AUTH\");\n if (isAuthError) {\n this.logger.warn({\n event: \"notification_poll_auth_failure\",\n message: \"Notification polling failed due to expired or invalid token. Re-authenticate to restore order notifications.\",\n });\n }\n return;\n }\n\n const currentMap = new Map<string, TrackedOrder>();\n for (const order of currentOrders) {\n currentMap.set(order.id, order);\n }\n\n for (const [id, prev] of this.previousOrders) {\n const current = currentMap.get(id);\n\n if (!current) {\n if (prev.filled > 0) {\n this.notify(\"order_filled\", {\n orderId: id,\n marketId: prev.marketId,\n side: prev.side,\n quantity: prev.quantity,\n filled: prev.filled,\n message: `Order ${id.slice(0, 8)} completed (${prev.side} ${prev.filled}/${prev.quantity} shares filled)`,\n });\n }\n } else if (current.filled > prev.filled) {\n const newFills = current.filled - prev.filled;\n this.notify(\"order_partial_fill\", {\n orderId: id,\n marketId: current.marketId,\n side: current.side,\n filledNow: newFills,\n totalFilled: current.filled,\n totalQuantity: current.quantity,\n message: `Order ${id.slice(0, 8)} partially filled: ${newFills} more shares (${current.filled}/${current.quantity} total)`,\n });\n }\n }\n\n this.previousOrders = currentMap;\n } finally {\n this.isPolling = false;\n }\n }\n\n // --- Shared notification dispatch ---\n\n private async notify(event: string, data: Record<string, unknown>): Promise<void> {\n this.logger.info({ event: `notification:${event}`, ...data });\n\n try {\n await this.server.sendLoggingMessage({\n level: \"info\",\n data: { event, ...data },\n });\n } catch {\n // Client may not support logging notifications or may have disconnected\n }\n }\n}\n\n// --- Polling helpers ---\n\ninterface TrackedOrder {\n id: string;\n marketId: string;\n outcomeId: string | undefined;\n side: string;\n quantity: number;\n filled: number;\n status: string;\n}\n\nfunction normalizeOrder(raw: unknown): TrackedOrder {\n const o = raw as Record<string, unknown>;\n return {\n id: String(o.id ?? \"\"),\n marketId: String(o.marketId ?? \"\"),\n outcomeId: o.outcomeId ? String(o.outcomeId) : undefined,\n side: String(o.side ?? \"\"),\n quantity: Number(o.quantity ?? 0),\n filled: Number(o.filled ?? 0),\n status: String(o.status ?? \"OPEN\"),\n };\n}\n","import type { Logger } from \"./logger.js\";\n\nexport interface ToolMetric {\n count: number;\n errors: number;\n totalDurationMs: number;\n}\n\nexport interface SessionMetrics {\n sessionId: string;\n userId: string | null;\n tier: string;\n startedAt: string;\n toolCalls: Record<string, ToolMetric>;\n totalTrades: number;\n totalErrors: number;\n}\n\nconst TRADE_TOOLS = new Set([\"place_order\", \"cancel_order\", \"trade_crypto\"]);\n\nexport class MetricsCollector {\n private readonly metrics: SessionMetrics;\n private readonly logger: Logger;\n\n constructor(logger: Logger, sessionId?: string) {\n this.logger = logger;\n this.metrics = {\n sessionId: sessionId ?? \"stdio\",\n userId: null,\n tier: \"FREE\",\n startedAt: new Date().toISOString(),\n toolCalls: {},\n totalTrades: 0,\n totalErrors: 0,\n };\n }\n\n setUserId(userId: string): void {\n this.metrics.userId = userId;\n }\n\n setTier(tier: string): void {\n this.metrics.tier = tier;\n }\n\n recordCall(toolName: string, durationMs: number, error: boolean): void {\n let metric = this.metrics.toolCalls[toolName];\n if (!metric) {\n metric = { count: 0, errors: 0, totalDurationMs: 0 };\n this.metrics.toolCalls[toolName] = metric;\n }\n\n metric.count++;\n metric.totalDurationMs += durationMs;\n\n if (error) {\n metric.errors++;\n this.metrics.totalErrors++;\n }\n\n if (TRADE_TOOLS.has(toolName) && !error) {\n this.metrics.totalTrades++;\n }\n }\n\n getSnapshot(): SessionMetrics {\n return { ...this.metrics, toolCalls: { ...this.metrics.toolCalls } };\n }\n\n flush(): void {\n const snapshot = this.getSnapshot();\n const totalCalls = Object.values(snapshot.toolCalls).reduce((sum, m) => sum + m.count, 0);\n\n if (totalCalls === 0) return;\n\n this.logger.info({\n event: \"session_metrics\",\n ...snapshot,\n summary: {\n totalCalls,\n totalTrades: snapshot.totalTrades,\n totalErrors: snapshot.totalErrors,\n durationMs: Date.now() - new Date(snapshot.startedAt).getTime(),\n topTools: Object.entries(snapshot.toolCalls)\n .sort(([, a], [, b]) => b.count - a.count)\n .slice(0, 5)\n .map(([name, m]) => ({ name, count: m.count })),\n },\n });\n }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { randomUUID } from \"node:crypto\";\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport type { Logger } from \"../logger.js\";\n\nexport interface CreatedServer {\n server: Server;\n cleanup: () => void;\n}\n\ninterface SessionEntry {\n transport: StreamableHTTPServerTransport;\n server: CreatedServer;\n lastActivity: number;\n}\n\nconst MAX_SESSIONS = 100;\nconst MAX_BODY_SIZE = 1_048_576; // 1MB\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nexport interface HttpTransportOptions {\n port: number;\n createServer: () => CreatedServer;\n logger: Logger;\n}\n\nexport function checkApiKey(\n configuredKey: string | undefined,\n providedKey: string | undefined\n): boolean {\n if (!configuredKey) return true;\n return providedKey === configuredKey;\n}\n\nexport async function startHttpTransport(options: HttpTransportOptions): Promise<void> {\n const { port, logger } = options;\n\n if (!process.env.TOROMARKET_MCP_API_KEY) {\n logger.warn({ event: \"http_no_api_key\", message: \"HTTP transport running without authentication. Set TOROMARKET_MCP_API_KEY for production.\" });\n }\n\n const allowedOrigin = process.env.TOROMARKET_CORS_ORIGIN ?? \"http://localhost:3000\";\n\n // Map of session ID → session entry for stateful connections\n const sessions = new Map<string, SessionEntry>();\n\n const httpServer = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n // CORS headers\n res.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin);\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, DELETE, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, mcp-session-id, x-mcp-api-key, Authorization\");\n res.setHeader(\"Access-Control-Expose-Headers\", \"mcp-session-id\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Parse URL early for routing\n const url = new URL(req.url ?? \"/\", `http://localhost:${port}`);\n\n // Health check endpoint — exempt from auth for load balancers / Railway\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n status: \"ok\",\n sessions: sessions.size,\n uptime: Math.floor(process.uptime()),\n }));\n return;\n }\n\n // API key authentication (if configured)\n const mcpApiKey = process.env.TOROMARKET_MCP_API_KEY;\n if (mcpApiKey) {\n const provided =\n (req.headers[\"x-mcp-api-key\"] as string | undefined) ??\n (req.headers[\"authorization\"] as string | undefined)?.replace(/^bearer\\s+/i, \"\");\n if (!checkApiKey(mcpApiKey, provided)) {\n res.writeHead(401, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid or missing MCP API key\" }));\n return;\n }\n }\n\n // Only handle /mcp path\n if (url.pathname !== \"/mcp\") {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found. Use /mcp endpoint.\" }));\n return;\n }\n\n // Get or create session\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n\n if (req.method === \"GET\" || req.method === \"POST\") {\n let entry = sessionId ? sessions.get(sessionId) : undefined;\n\n if (entry) {\n // Touch last activity for existing session\n entry.lastActivity = Date.now();\n }\n\n if (!entry) {\n // New session — enforce max sessions limit\n if (sessions.size >= MAX_SESSIONS) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Maximum sessions reached\" }));\n return;\n }\n\n // Create transport + server\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n });\n\n const createdServer = options.createServer();\n await createdServer.server.connect(transport as unknown as Transport);\n\n // Track session\n const newSessionId = transport.sessionId!;\n entry = { transport, server: createdServer, lastActivity: Date.now() };\n sessions.set(newSessionId, entry);\n logger.info({ event: \"session_created\", sessionId: newSessionId });\n\n transport.onclose = () => {\n createdServer.cleanup();\n sessions.delete(newSessionId);\n logger.info({ event: \"session_closed\", sessionId: newSessionId });\n };\n }\n\n // Parse body for POST\n let parsedBody: unknown;\n if (req.method === \"POST\") {\n const chunks: Buffer[] = [];\n let totalSize = 0;\n for await (const chunk of req) {\n totalSize += (chunk as Buffer).length;\n if (totalSize > MAX_BODY_SIZE) {\n res.writeHead(413, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Request body too large\" }));\n return;\n }\n chunks.push(chunk as Buffer);\n }\n const bodyStr = Buffer.concat(chunks).toString(\"utf-8\");\n try {\n parsedBody = JSON.parse(bodyStr);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid JSON in request body\" }));\n return;\n }\n }\n\n await entry.transport.handleRequest(req, res, parsedBody);\n return;\n }\n\n if (req.method === \"DELETE\" && sessionId) {\n const entry = sessions.get(sessionId);\n if (entry) {\n await entry.transport.close();\n entry.server.cleanup();\n sessions.delete(sessionId);\n logger.info({ event: \"session_deleted\", sessionId });\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n } else {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Session not found\" }));\n }\n return;\n }\n\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n });\n\n httpServer.listen(port, () => {\n logger.info({ event: \"http_server_start\", port, endpoint: `/mcp` });\n process.stderr.write(`Toromarket MCP server (HTTP) listening on port ${port}\\n`);\n });\n\n // Session cleanup interval — remove inactive sessions\n const cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [id, entry] of sessions) {\n if (now - entry.lastActivity > SESSION_TIMEOUT_MS) {\n entry.transport.close().catch(() => {});\n entry.server.cleanup();\n sessions.delete(id);\n logger.info({ event: \"session_timeout\", sessionId: id });\n }\n }\n }, 60_000); // Check every minute\n\n // Graceful shutdown\n const shutdown = () => {\n logger.info({ event: \"http_server_shutdown\" });\n clearInterval(cleanupInterval);\n for (const entry of sessions.values()) {\n entry.transport.close().catch(() => {});\n entry.server.cleanup();\n }\n httpServer.close(() => {\n process.exit(0);\n });\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep alive until shutdown\n await new Promise<void>((resolve) => {\n httpServer.on(\"close\", resolve);\n });\n}\n","#!/usr/bin/env node\n\nimport { startStdioServer, createServerFactory } from \"./server.js\";\nimport { startHttpTransport } from \"./transports/http.js\";\nimport type { LogLevel } from \"./logger.js\";\nimport { isValidProfile, type ToolProfile } from \"./tools/profiles.js\";\n\nfunction readEnv(name: string): string | undefined {\n const value = process.env[name];\n return value && value.trim().length > 0 ? value : undefined;\n}\n\nconst baseUrl = readEnv(\"TOROMARKET_BASE_URL\") ?? \"https://api.toromarket.io\";\nconst token = readEnv(\"TOROMARKET_TOKEN\");\nconst apiKey = readEnv(\"TOROMARKET_API_KEY\");\nconst logLevel = (readEnv(\"TOROMARKET_LOG_LEVEL\") ?? \"info\") as LogLevel;\nconst transport = readEnv(\"TOROMARKET_TRANSPORT\") ?? \"stdio\";\nconst httpPort = Number(readEnv(\"TOROMARKET_HTTP_PORT\") ?? \"3001\");\nconst agentSecret = readEnv(\"TOROMARKET_AGENT_SECRET\");\nconst pollIntervalStr = readEnv(\"TOROMARKET_POLL_INTERVAL\");\nconst pollIntervalMs = pollIntervalStr ? Number(pollIntervalStr) : undefined;\nconst toolProfile = readEnv(\"TOROMARKET_TOOL_PROFILE\") ?? \"full\";\nconst compactDescriptions = readEnv(\"TOROMARKET_TOOL_DESCRIPTIONS\") === \"compact\";\nif (!isValidProfile(toolProfile)) {\n process.stderr.write(`Invalid TOROMARKET_TOOL_PROFILE: \"${toolProfile}\". Valid: trader, social, fund_manager, full\\n`);\n process.exit(1);\n}\n\nconst serverOptions = {\n baseUrl,\n logLevel,\n toolProfile: toolProfile as ToolProfile,\n compactDescriptions,\n ...(token ? { token } : {}),\n ...(apiKey ? { apiKey } : {}),\n ...(agentSecret ? { agentSecret } : {}),\n ...(pollIntervalMs !== undefined ? { pollIntervalMs } : {}),\n};\n\nasync function main(): Promise<void> {\n if (transport === \"http\") {\n const { logger, createMcpServer } = createServerFactory(serverOptions);\n await startHttpTransport({\n port: httpPort,\n createServer: createMcpServer,\n logger,\n });\n } else {\n await startStdioServer(serverOptions);\n }\n}\n\nmain().catch((error) => {\n const message = error instanceof Error ? error.stack ?? error.message : String(error);\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n});\n"],"mappings":"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","names":["ToromarketClient","baseUrl","id","baseUrl","baseUrl","baseUrl","ToromarketError","ToromarketError","ToromarketError","sanitized","ToromarketError","sanitizeArgs","summarizeResult","sanitized","token","id","ToromarketClient","baseUrl","toolProfile","compactDescriptions","pollIntervalMs","transport","transport","id"]}