@hedge-layer/cli 2.1.0 → 3.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/config.ts","../src/client.ts","../src/output.ts","../src/commands/brief.ts","../src/stream.ts","../src/commands/profile.ts","../src/commands/research.ts","../src/feed-display.ts","../src/commands/feed.ts","../src/commands/lp.ts","../src/allocator-display.ts","../src/commands/allocator.ts","../src/lp-display.ts","../src/commands/wallet.ts","../src/commands/signal.ts","../src/signal-display.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerBriefCommands } from \"./commands/brief.js\";\n\nimport { registerProfileCommand } from \"./commands/profile.js\";\nimport { registerResearchCommands } from \"./commands/research.js\";\nimport { registerFeedCommand } from \"./commands/feed.js\";\nimport { registerLpCommands } from \"./commands/lp.js\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerSignalCommands } from \"./commands/signal.js\";\nimport * as out from \"./output.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"hl\")\n .description(\"Hedge Layer CLI — prediction market intelligence from the terminal\")\n .version(__VERSION__)\n .option(\"--json\", \"Output as JSON (machine-readable)\")\n .option(\"--api-url <url>\", \"Override API base URL\")\n .option(\"--token <token>\", \"Override stored API token\")\n .option(\"--verbose\", \"Show HTTP request details\")\n .option(\"--no-color\", \"Disable colored output\");\n\nregisterAuthCommands(program);\nregisterBriefCommands(program);\n\nregisterProfileCommand(program);\nregisterResearchCommands(program);\nregisterFeedCommand(program);\nregisterWalletCommands(program);\nregisterLpCommands(program);\nregisterSignalCommands(program);\n\nprogram.hook(\"preAction\", (_thisCommand, actionCommand) => {\n const opts = program.opts();\n if (opts.color === false) {\n process.env.FORCE_COLOR = \"0\";\n }\n if (opts.verbose) {\n const cmdName = actionCommand.name();\n process.stderr.write(out.dim(`[verbose] Running: hl ${cmdName}\\n`));\n }\n});\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) {\n out.error(e.message);\n } else {\n out.error(`Unexpected error: ${e instanceof Error ? e.message : String(e)}`);\n if (program.opts().verbose) {\n console.error(e);\n }\n }\n process.exit(1);\n }\n}\n\nmain();\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport { loadConfig, saveConfig, clearConfig, configPath, DEFAULT_API_URL } from \"../config.js\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command(\"auth\").description(\"Manage API authentication\");\n\n auth\n .command(\"login\")\n .description(\"Authenticate with a Hedge Layer API token\")\n .option(\"--api-url <url>\", \"API base URL\", DEFAULT_API_URL)\n .action(async (cmdOpts: { apiUrl?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n try {\n out.heading(\"Hedge Layer CLI — Login\");\n process.stderr.write(\n `Create an API token at ${out.bold(\"https://hedgelayer.ai/account/settings\")} → API Tokens\\n\\n`,\n );\n\n const token = (await rl.question(\"Paste your API token: \")).trim();\n\n if (!token.startsWith(\"hl_\") || token.length !== 43) {\n out.error('Invalid token format. Tokens start with \"hl_\" and are 43 characters.');\n process.exit(1);\n }\n\n const apiUrl = globalOpts.apiUrl ?? cmdOpts.apiUrl ?? DEFAULT_API_URL;\n const client = new ApiClient({ token, apiUrl });\n\n process.stderr.write(\"\\nValidating token...\");\n let profile: UserProfile;\n try {\n profile = await client.get<UserProfile>(\"/api/profile\");\n } catch {\n process.stderr.write(\"\\n\");\n out.error(\"Token validation failed. Check your token and try again.\");\n process.exit(1);\n }\n process.stderr.write(\" done\\n\\n\");\n\n saveConfig({ api_url: apiUrl, token });\n\n out.success(`Logged in as ${out.bold(profile.handle || profile.user_id)}`);\n process.stderr.write(` Config saved to ${out.dim(configPath())}\\n`);\n } finally {\n rl.close();\n }\n });\n\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const config = loadConfig();\n const token = globalOpts.token ?? config.token;\n\n if (!token) {\n out.warn(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" to authenticate.\");\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n\n try {\n const profile = await client.get<UserProfile>(\"/api/profile\");\n if (globalOpts.json) {\n out.json({\n authenticated: true,\n handle: profile.handle,\n user_id: profile.user_id,\n api_url: client.apiUrl,\n });\n } else {\n out.heading(\"Auth Status\");\n out.table(\n [\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"API URL\", client.apiUrl],\n [\"Config\", configPath()],\n ],\n );\n }\n } catch {\n out.error(\"Token is invalid or expired. Run \" + out.bold(\"hl auth login\") + \" to re-authenticate.\");\n process.exit(1);\n }\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored API token\")\n .action(() => {\n clearConfig();\n out.success(\"Logged out. Token removed from \" + out.dim(configPath()));\n });\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CONFIG_DIR = join(homedir(), \".hedgelayer\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport const DEFAULT_API_URL = \"https://hedgelayer.ai\";\n\nexport interface Config {\n api_url: string;\n token: string | null;\n}\n\nfunction defaultConfig(): Config {\n return { api_url: DEFAULT_API_URL, token: null };\n}\n\nexport function loadConfig(): Config {\n try {\n if (!existsSync(CONFIG_FILE)) return defaultConfig();\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw);\n return {\n api_url: parsed.api_url ?? DEFAULT_API_URL,\n token: parsed.token ?? null,\n };\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfig(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function clearConfig(): void {\n try {\n if (existsSync(CONFIG_FILE)) unlinkSync(CONFIG_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function configPath(): string {\n return CONFIG_FILE;\n}\n","import type { GlobalOptions } from \"./types.js\";\nimport { loadConfig, DEFAULT_API_URL } from \"./config.js\";\n\nexport class ApiClient {\n private baseUrl: string;\n private token: string | null;\n private verbose: boolean;\n\n constructor(opts: GlobalOptions = {}) {\n const config = loadConfig();\n this.baseUrl = (opts.apiUrl ?? config.api_url ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.token = opts.token ?? config.token ?? null;\n this.verbose = opts.verbose ?? false;\n }\n\n get isAuthenticated(): boolean {\n return this.token !== null;\n }\n\n get apiUrl(): string {\n return this.baseUrl;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n const h: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n if (this.token) {\n h[\"Authorization\"] = `Bearer ${this.token}`;\n }\n return h;\n }\n\n private log(method: string, path: string, status?: number): void {\n if (!this.verbose) return;\n const statusStr = status ? ` → ${status}` : \"\";\n process.stderr.write(`[verbose] ${method} ${this.baseUrl}${path}${statusStr}\\n`);\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== \"\") url.searchParams.set(k, v);\n }\n }\n\n this.log(\"GET\", `${url.pathname}${url.search}`);\n const res = await fetch(url.toString(), { headers: this.headers() });\n this.log(\"GET\", `${url.pathname}${url.search}`, res.status);\n\n if (!res.ok) {\n const body = await res.text();\n throw new ApiError(res.status, body);\n }\n return res.json() as Promise<T>;\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n this.log(\"POST\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n /**\n * POST /api/brief with stream: false — returns the Market Brief JSON body\n * plus optional telemetry from response headers.\n */\n async postBriefSync(query: string): Promise<{\n brief: Record<string, unknown>;\n durationMs: number | null;\n stepsCompleted: number | null;\n toolsUsed: string[];\n }> {\n const path = \"/api/brief\";\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({ query, stream: false }),\n });\n this.log(\"POST\", path, res.status);\n\n const text = await res.text();\n if (!res.ok) {\n throw new ApiError(res.status, text);\n }\n\n let brief: Record<string, unknown>;\n try {\n brief = JSON.parse(text) as Record<string, unknown>;\n } catch {\n throw new ApiError(res.status, text || \"Invalid JSON from /api/brief\");\n }\n\n const dur = res.headers.get(\"X-Duration-Ms\");\n const steps = res.headers.get(\"X-Steps-Completed\");\n const tools = res.headers.get(\"X-Tools-Used\");\n\n return {\n brief,\n durationMs: dur != null ? Number(dur) : null,\n stepsCompleted: steps != null ? Number(steps) : null,\n toolsUsed: tools ? tools.split(\",\").filter(Boolean) : [],\n };\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n this.log(\"PATCH\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n this.log(\"PATCH\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n async delete(path: string): Promise<void> {\n this.log(\"DELETE\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"DELETE\",\n headers: this.headers(),\n });\n this.log(\"DELETE\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n }\n\n async stream(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (stream)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"text/event-stream\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (stream)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n\n async streamNdjson(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (ndjson)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"application/x-ndjson\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (ndjson)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n let msg: string;\n try {\n const parsed = JSON.parse(body);\n msg = parsed.error ?? parsed.message ?? body;\n } catch {\n msg = body;\n }\n super(`API error ${status}: ${msg}`);\n this.name = \"ApiError\";\n }\n}\n","import chalk from \"chalk\";\n\nexport function json(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, stripAnsi(row[i]).length);\n }\n }\n\n for (let r = 0; r < allRows.length; r++) {\n const row = allRows[r];\n const padded = row.map((cell, i) => {\n const bare = stripAnsi(cell);\n const pad = colWidths[i] - bare.length;\n return cell + \" \".repeat(Math.max(0, pad));\n });\n process.stdout.write(\" \" + padded.join(\" \") + \"\\n\");\n\n if (r === 0 && headers) {\n const sep = colWidths.map((w) => \"─\".repeat(w)).join(\"──\");\n process.stdout.write(\" \" + sep + \"\\n\");\n }\n }\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport function heading(text: string): void {\n process.stdout.write(\"\\n\" + chalk.bold(text) + \"\\n\\n\");\n}\n\nexport function success(text: string): void {\n process.stdout.write(chalk.green(\"✓\") + \" \" + text + \"\\n\");\n}\n\nexport function warn(text: string): void {\n process.stdout.write(chalk.yellow(\"⚠\") + \" \" + text + \"\\n\");\n}\n\nexport function error(text: string): void {\n process.stderr.write(chalk.red(\"✗\") + \" \" + text + \"\\n\");\n}\n\nexport function dim(text: string): string {\n return chalk.dim(text);\n}\n\nexport function bold(text: string): string {\n return chalk.bold(text);\n}\n\nexport function currency(n: number): string {\n return \"$\" + n.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n}\n\nexport function compactCurrency(n: number): string {\n if (!n || isNaN(n)) return \"$0\";\n if (n >= 1_000_000) return `$${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `$${(n / 1_000).toFixed(1)}K`;\n return `$${n.toFixed(0)}`;\n}\n\nexport function percent(n: number): string {\n return (n * 100).toFixed(1) + \"%\";\n}\n\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nexport function relativeTime(date: string): string {\n const diff = Date.now() - new Date(date).getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseNdjsonStream } from \"../stream.js\";\nimport type { MarketBrief, BriefRequest, BriefRequestFilters, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerBriefCommands(program: Command): void {\n program\n .command(\"brief <query>\")\n .description(\"Generate a Market Brief for a topic (non-interactive)\")\n .option(\"-l, --location <location>\", \"Geographic context (e.g. 'Middle East', 'US')\")\n .option(\"-t, --time-horizon <horizon>\", \"Time frame (e.g. '3 months', '2026')\")\n .option(\"--tags <tags>\", \"Comma-separated focus area tags (e.g. 'geopolitics,energy')\")\n .option(\"--min-volume <n>\", \"Minimum market volume in USD\", parseFloat)\n .option(\"--max-yes-price <n>\", \"Maximum YES price (0-1)\", parseFloat)\n .action(async (query: string, cmdOpts: BriefCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const filters = buildFilters(cmdOpts);\n const body: BriefRequest = {\n query,\n ...(cmdOpts.location && { location: cmdOpts.location }),\n ...(cmdOpts.timeHorizon && { timeHorizon: cmdOpts.timeHorizon }),\n ...(filters && { filters }),\n stream: true,\n };\n\n await runStreaming(client, body, globalOpts);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Command option types\n// ---------------------------------------------------------------------------\n\ninterface BriefCmdOpts {\n location?: string;\n timeHorizon?: string;\n tags?: string;\n minVolume?: number;\n maxYesPrice?: number;\n}\n\nfunction buildFilters(opts: BriefCmdOpts): BriefRequestFilters | undefined {\n const tags = opts.tags?.split(\",\").map((t) => t.trim()).filter(Boolean);\n const hasFilters = opts.minVolume != null || opts.maxYesPrice != null || (tags && tags.length > 0);\n if (!hasFilters) return undefined;\n return {\n ...(opts.minVolume != null && { minVolume: opts.minVolume }),\n ...(opts.maxYesPrice != null && { maxYesPrice: opts.maxYesPrice }),\n ...(tags && tags.length > 0 && { tags }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming mode (default)\n// ---------------------------------------------------------------------------\n\nasync function runStreaming(client: ApiClient, body: BriefRequest, globalOpts: GlobalOptions): Promise<void> {\n const startTime = Date.now();\n process.stderr.write(chalk.dim(` Generating brief for \"${out.truncate(body.query, 50)}\"...\\n`));\n\n const stream = await client.streamNdjson(\"/api/brief\", body);\n const result = await parseNdjsonStream(stream, {\n onProgress: (step, message) => {\n process.stderr.write(chalk.dim(` [${step}] `) + message + \"\\n\");\n },\n });\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n\n if (result.error) {\n out.error(`Brief failed (${result.error.code}): ${result.error.message}`);\n process.exit(1);\n }\n\n if (!result.brief) {\n out.error(\"No Market Brief was produced.\");\n process.exit(1);\n }\n\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n displayBrief(result.brief as unknown as MarketBrief, globalOpts);\n}\n\n// ---------------------------------------------------------------------------\n// Display\n// ---------------------------------------------------------------------------\n\nfunction displayBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n const marketCount = brief.marketCount ?? brief.markets.length;\n process.stdout.write(\"\\n \" + chalk.dim(`${marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","/**\n * Parses the Vercel AI SDK UI Message Stream protocol (SSE format).\n *\n * The server sends Server-Sent Events where each `data:` line contains\n * a JSON object with a `type` field:\n * text-delta: { type, id, delta }\n * tool-input-start: { type, toolCallId, toolName }\n * tool-input-delta: { type, toolCallId, inputTextDelta }\n * tool-input-available: { type, toolCallId, toolName, input }\n * tool-output-available:{ type, toolCallId, output }\n * error: { type, errorText }\n * [DONE]: stream termination sentinel\n */\n\nexport interface StreamCallbacks {\n onText?: (text: string) => void;\n onToolCall?: (name: string, args: unknown) => void;\n onToolResult?: (name: string, result: unknown) => void;\n}\n\nexport interface StreamResult {\n assistantText: string;\n toolCalls: Array<{ name: string; args: unknown }>;\n marketBrief: Record<string, unknown> | null;\n feedResult: Record<string, unknown> | null;\n}\n\nexport async function parseStream(\n body: ReadableStream<Uint8Array>,\n callbacks: StreamCallbacks = {},\n): Promise<StreamResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let assistantText = \"\";\n const toolCalls: Array<{ name: string; args: unknown }> = [];\n const activeToolCalls = new Map<string, { name: string; argStr: string }>();\n let marketBrief: Record<string, unknown> | null = null;\n let feedResult: Record<string, unknown> | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\":\")) continue;\n\n if (!trimmed.startsWith(\"data:\")) continue;\n const payload = trimmed.slice(5).trim();\n\n if (payload === \"[DONE]\") continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(payload);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"text-delta\": {\n const delta = msg.delta as string;\n if (delta) {\n assistantText += delta;\n callbacks.onText?.(delta);\n }\n break;\n }\n\n case \"tool-input-start\": {\n const id = msg.toolCallId as string;\n const name = msg.toolName as string;\n if (id && name) {\n activeToolCalls.set(id, { name, argStr: \"\" });\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n active.argStr += msg.inputTextDelta as string;\n }\n break;\n }\n\n case \"tool-input-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n const args = msg.input ?? active.argStr;\n toolCalls.push({ name: active.name, args });\n callbacks.onToolCall?.(active.name, args);\n }\n break;\n }\n\n case \"tool-output-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n callbacks.onToolResult?.(active.name, msg.output);\n if (active.name === \"buildMarketBrief\" && isMarketBrief(msg.output)) {\n marketBrief = msg.output as Record<string, unknown>;\n }\n if (active.name === \"getFeed\" && isFeedResult(msg.output)) {\n feedResult = msg.output as Record<string, unknown>;\n }\n activeToolCalls.delete(id);\n }\n break;\n }\n\n case \"error\": {\n throw new Error((msg.errorText as string) ?? \"Unknown stream error\");\n }\n }\n }\n\n if (done) break;\n }\n\n return { assistantText, toolCalls, marketBrief, feedResult };\n}\n\nfunction isMarketBrief(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"title\" in (val as Record<string, unknown>) &&\n \"markets\" in (val as Record<string, unknown>)\n );\n}\n\nfunction isFeedResult(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"markets\" in (val as Record<string, unknown>) &&\n \"sortedBy\" in (val as Record<string, unknown>)\n );\n}\n\n// ---------------------------------------------------------------------------\n// NDJSON stream parser (for POST /api/brief)\n// ---------------------------------------------------------------------------\n\nexport interface NdjsonCallbacks {\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface NdjsonBriefResult {\n brief: Record<string, unknown> | null;\n error: { code: string; message: string } | null;\n}\n\n/**\n * Parses an NDJSON stream from the /api/brief endpoint.\n *\n * Each line is a JSON object with a `type` field:\n * progress: { type, step, message }\n * brief: { type, data: MarketBrief }\n * error: { type, code, message }\n */\nexport async function parseNdjsonStream(\n body: ReadableStream<Uint8Array>,\n callbacks: NdjsonCallbacks = {},\n): Promise<NdjsonBriefResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let brief: Record<string, unknown> | null = null;\n let error: { code: string; message: string } | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(trimmed);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"progress\": {\n callbacks.onProgress?.(msg.step as string, msg.message as string);\n break;\n }\n case \"brief\": {\n brief = msg.data as Record<string, unknown>;\n break;\n }\n case \"error\": {\n error = {\n code: msg.code as string,\n message: msg.message as string,\n };\n break;\n }\n }\n }\n\n if (done) break;\n }\n\n return { brief, error };\n}\n","import { Command } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerProfileCommand(program: Command): void {\n program\n .command(\"profile\")\n .description(\"Show your user profile\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const profile = await client.get<UserProfile>(\"/api/profile\");\n\n if (globalOpts.json) {\n out.json(profile);\n return;\n }\n\n out.heading(\"Profile\");\n out.table([\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"Created\", new Date(profile.created_at).toLocaleDateString()],\n ]);\n });\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseStream } from \"../stream.js\";\nimport type { Assessment, MarketBrief, FeedResult, GlobalOptions } from \"../types.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport * as out from \"../output.js\";\n\nexport function registerResearchCommands(program: Command): void {\n const research = program.command(\"research\").description(\"AI-powered market research\");\n\n research\n .command(\"start\", { isDefault: true })\n .description(\"Start an interactive market research session\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const { id } = await client.post<{ id: string }>(\"/api/assessments\");\n\n out.heading(\"Market Research\");\n process.stderr.write(\n chalk.dim(\" Describe a topic or thesis to explore. Type /quit to exit.\\n\\n\"),\n );\n\n let msgCounter = 0;\n const uiMsg = (role: string, content: string) => ({\n id: `msg-${++msgCounter}`,\n role,\n content,\n parts: [{ type: \"text\" as const, text: content }],\n });\n\n const messages: ReturnType<typeof uiMsg>[] = [];\n let firstMessageTs: number | null = null;\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n\n try {\n while (true) {\n const userInput = await rl.question(chalk.cyan(\"You: \"));\n if (!userInput.trim()) continue;\n if (userInput.trim() === \"/quit\") break;\n\n if (firstMessageTs === null) firstMessageTs = Date.now();\n messages.push(uiMsg(\"user\", userInput));\n\n process.stderr.write(chalk.dim(\"\\nAssistant: \"));\n\n try {\n const body = await client.stream(\"/api/chat\", {\n messages,\n assessmentId: id,\n });\n\n const result = await parseStream(body, {\n onText: (text) => process.stderr.write(text),\n onToolCall: (name) => {\n process.stderr.write(chalk.dim(`\\n [tool: ${name}]\\n`));\n },\n onToolResult: (name, toolResult) => {\n if (globalOpts.verbose) {\n process.stderr.write(chalk.dim(` [result: ${name}] ${JSON.stringify(toolResult).slice(0, 200)}\\n`));\n }\n },\n });\n\n process.stderr.write(\"\\n\\n\");\n\n if (result.assistantText) {\n messages.push(uiMsg(\"assistant\", result.assistantText));\n }\n\n try {\n await persistAssessment(client, id, messages, result.marketBrief, firstMessageTs);\n } catch (persistErr) {\n out.warn(\n `Could not save session: ${persistErr instanceof Error ? persistErr.message : String(persistErr)}`,\n );\n }\n\n if (result.feedResult) {\n displayFeedResult(result.feedResult as unknown as FeedResult, globalOpts);\n }\n\n if (result.marketBrief) {\n displayMarketBrief(result.marketBrief as unknown as MarketBrief, globalOpts);\n break;\n }\n } catch (e) {\n process.stderr.write(\"\\n\");\n out.error(`Chat error: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n } finally {\n rl.close();\n }\n });\n\n research\n .command(\"run <query>\")\n .description(\"Run research on a topic and return the final Market Brief as JSON (via /api/brief)\")\n .action(async (query: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n process.stderr.write(chalk.dim(` Researching \"${out.truncate(query, 60)}\"...\\n`));\n const startTime = Date.now();\n\n const { brief, durationMs, stepsCompleted, toolsUsed } = await client.postBriefSync(query);\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n\n const looksLikeBrief =\n brief &&\n typeof brief === \"object\" &&\n Array.isArray((brief as { markets?: unknown }).markets) &&\n typeof (brief as { title?: unknown }).title === \"string\";\n\n if (looksLikeBrief) {\n out.json(brief as unknown as MarketBrief);\n } else {\n process.stderr.write(chalk.yellow(\"No market brief was produced.\\n\"));\n out.json({\n brief: null,\n text: null,\n metadata: {\n model: \"\",\n stepsUsed: stepsCompleted ?? 0,\n toolsUsed,\n durationMs: durationMs ?? Date.now() - startTime,\n },\n raw: brief,\n });\n }\n });\n\n research\n .command(\"list\")\n .description(\"List past research sessions\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .action(async (cmdOpts: { status?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params: Record<string, string> = { list: \"true\" };\n if (cmdOpts.status) params.status = cmdOpts.status;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", params);\n\n if (globalOpts.json) {\n out.json(data.assessments);\n return;\n }\n\n if (data.assessments.length === 0) {\n out.warn(\"No research sessions found.\");\n return;\n }\n\n out.heading(`Research Sessions (${data.assessments.length})`);\n\n const rows = data.assessments.map((a) => {\n const status = formatStatus(a.status);\n const brief = a.market_brief?.title ?? \"—\";\n const markets = a.market_brief ? String(a.market_brief.marketCount) : \"—\";\n return [a.id.slice(0, 8), status, out.truncate(brief, 30), markets, out.relativeTime(a.created_at)];\n });\n\n out.table(rows, [\"ID\", \"Status\", \"Brief\", \"Markets\", \"Created\"]);\n });\n\n research\n .command(\"show <id>\")\n .description(\"Show research session details (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n const assessment = await client.get<Assessment>(`/api/assessments/${fullId}`);\n\n if (globalOpts.json) {\n out.json(assessment);\n return;\n }\n\n out.heading(\"Research Session \" + out.dim(assessment.id.slice(0, 8)));\n\n out.table([\n [\"Status\", formatStatus(assessment.status)],\n [\"Created\", new Date(assessment.created_at).toLocaleString()],\n [\"Updated\", new Date(assessment.updated_at).toLocaleString()],\n ]);\n\n if (assessment.market_brief) {\n displayMarketBrief(assessment.market_brief, globalOpts);\n }\n });\n\n research\n .command(\"delete <id>\")\n .description(\"Delete a research session (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n await client.delete(`/api/assessments/${fullId}`);\n out.success(\"Research session deleted.\");\n });\n}\n\n/** Matches a full assessment UUID (e.g. 7f4fdace-a4b2-428d-87f1-fbf715165776). */\nconst FULL_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Resolve a user-supplied session identifier (a full UUID or the short 8-char\n * prefix printed by `hl research list`) against a set of known assessment IDs.\n *\n * Pure and synchronous so it can be unit-tested without network access.\n */\nexport function matchAssessmentId(idOrPrefix: string, ids: string[]): string {\n const needle = idOrPrefix.trim().toLowerCase();\n if (!needle) {\n throw new Error(\"No research session ID provided.\");\n }\n\n // Exact match wins outright (covers full UUIDs present in the list).\n const exact = ids.find((id) => id.toLowerCase() === needle);\n if (exact) return exact;\n\n const matches = ids.filter((id) => id.toLowerCase().startsWith(needle));\n if (matches.length === 1) return matches[0];\n\n if (matches.length === 0) {\n throw new Error(\n `No research session found matching \"${idOrPrefix}\". Run \\`hl research list\\` to see available sessions.`,\n );\n }\n\n const shortIds = matches.map((id) => id.slice(0, 8)).join(\", \");\n throw new Error(\n `\"${idOrPrefix}\" matches ${matches.length} research sessions (${shortIds}). Use a longer ID prefix to disambiguate.`,\n );\n}\n\n/**\n * Turn a full UUID or short ID prefix into the full assessment UUID.\n * Full UUIDs are returned directly (no extra API call); short prefixes are\n * resolved by listing the user's sessions and matching.\n */\nexport async function resolveAssessmentId(client: ApiClient, idOrPrefix: string): Promise<string> {\n const trimmed = idOrPrefix.trim();\n if (FULL_UUID.test(trimmed)) return trimmed;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", { list: \"true\" });\n return matchAssessmentId(\n trimmed,\n data.assessments.map((a) => a.id),\n );\n}\n\n/**\n * Resolve a session ID for a CLI action, printing a clean error and exiting on\n * an ambiguous/unknown identifier instead of surfacing it as an unexpected error.\n */\nasync function resolveOrExit(client: ApiClient, idOrPrefix: string): Promise<string> {\n try {\n return await resolveAssessmentId(client, idOrPrefix);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) throw e;\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n\n/** Mirrors web ChatInterface assessment PATCH (simplified metadata without tool-part extraction). */\nfunction buildAssessmentPatch(\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Record<string, unknown> {\n const patch: Record<string, unknown> = { messages };\n const meta: Record<string, unknown> = {\n timeToBriefMs: null,\n searchQueries: [],\n searchResultCounts: [],\n coverageHit: false,\n completedAt: null,\n };\n\n if (\n marketBrief &&\n typeof marketBrief === \"object\" &&\n Array.isArray((marketBrief as { markets?: unknown }).markets)\n ) {\n const markets = (marketBrief as { markets: unknown[] }).markets;\n patch.market_brief = marketBrief;\n patch.status = \"completed\";\n meta.timeToBriefMs = firstMessageTs != null ? Date.now() - firstMessageTs : null;\n meta.coverageHit = markets.length > 0;\n meta.completedAt = new Date().toISOString();\n }\n\n patch.metadata = meta;\n return patch;\n}\n\nasync function persistAssessment(\n client: ApiClient,\n assessmentId: string,\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Promise<void> {\n await client.patch(`/api/assessments/${assessmentId}`, buildAssessmentPatch(messages, marketBrief, firstMessageTs));\n}\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"in_progress\":\n return chalk.yellow(status);\n case \"abandoned\":\n return chalk.red(status);\n default:\n return status;\n }\n}\n\nfunction displayMarketBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n process.stdout.write(\"\\n \" + chalk.dim(`${brief.marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n","import chalk from \"chalk\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"./types.js\";\nimport * as out from \"./output.js\";\n\nconst SORT_LABELS: Record<string, string> = {\n score: \"attention score\",\n volume: \"24h volume\",\n liquidity: \"liquidity\",\n movement: \"price movement\",\n spread: \"spread tightness\",\n recency: \"recency\",\n extremity: \"uncertainty\",\n rewards: \"rewards\",\n rewardYield: \"reward yield (per $ liq)\",\n lpExpectedReturn: \"LP expected return\",\n horizon: \"time to resolution\",\n};\n\nfunction scoreBar(score: number): string {\n const width = 15;\n const filled = Math.round((score / 100) * width);\n const empty = width - filled;\n const color = score >= 70 ? chalk.green : score >= 45 ? chalk.yellow : chalk.dim;\n return color(\"█\".repeat(filled)) + chalk.dim(\"░\".repeat(empty)) + ` ${Math.round(score)}`;\n}\n\nexport function displayFeedResult(feed: FeedResult, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(feed);\n return;\n }\n\n const sortLabel = SORT_LABELS[feed.sortedBy] ?? feed.sortedBy;\n out.heading(`Market Feed — ${feed.marketsReturned} markets by ${sortLabel}`);\n process.stdout.write(\n chalk.dim(\n ` ${feed.totalScanned.toLocaleString()} scanned · ${feed.totalAfterFilter.toLocaleString()} after filters · preset ${feed.preset}\\n\\n`,\n ),\n );\n\n if (feed.markets.length === 0) {\n out.warn(\"No markets matched the criteria.\");\n return;\n }\n\n const rows = feed.markets.map((m: FeedResultMarket) => {\n const prob = out.percent(m.yesPrice);\n const change = m.oneDayPriceChange;\n const changeStr =\n change > 0\n ? chalk.green(`+${(change * 100).toFixed(1)}%`)\n : change < 0\n ? chalk.red(`${(change * 100).toFixed(1)}%`)\n : chalk.dim(\"0.0%\");\n return [\n String(m.rank),\n out.truncate(m.question, 42),\n prob,\n String(Math.round(m.score)),\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n changeStr,\n ];\n });\n\n out.table(rows, [\"#\", \"Market\", \"Prob\", \"Score\", \"24h Vol\", \"Liq\", \"Chg\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of feed.markets.slice(0, 5)) {\n const url = m.polymarketUrl;\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 55) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Score: \") + scoreBar(m.score) + \" \");\n process.stdout.write(chalk.dim(\"Spread: \") + m.spread.toFixed(3) + \" \");\n if (m.rewardsDailyRate > 0) {\n process.stdout.write(chalk.dim(\"Rewards: \") + `$${m.rewardsDailyRate.toFixed(2)}/day`);\n }\n process.stdout.write(\"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + url + \"\\n\");\n }\n\n if (feed.markets.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${feed.markets.length - 5} more\\n`));\n }\n}\n","import { Command } from \"commander\";\nimport { writeFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface FeedCmdOpts {\n profile?: string;\n sortBy?: string;\n preset?: string;\n tag?: string;\n minVolume?: string;\n minLiquidity?: string;\n maxLiquidity?: string;\n minRewardsDailyRate?: string;\n minDaysToEnd?: string;\n maxDaysToEnd?: string;\n maxMarketAgeHours?: string;\n liquidProfile?: string;\n limit?: string;\n}\n\ninterface FeedEnsembleOpts {\n limit?: string;\n output?: string;\n}\n\nexport interface EnsembleCandidate extends FeedResultMarket {\n ensembleScore: number;\n sourceProfiles: string[];\n sourceRanks: Record<string, number>;\n}\n\nexport interface FeedEnsembleResult {\n generatedAt: string;\n outputPath: string;\n totalSources: number;\n totalRawMarkets: number;\n totalCandidates: number;\n marketsReturned: number;\n candidates: EnsembleCandidate[];\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nconst PROFILE_CHOICES = [\"lp-opportunity\", \"liquidity-provider\", \"liquid-new-or-long\"] as const;\n\nfunction isProfile(s: string | undefined): s is (typeof PROFILE_CHOICES)[number] {\n return s !== undefined && (PROFILE_CHOICES as readonly string[]).includes(s);\n}\n\nexport function resolveFeedProfile(\n screening: string | undefined,\n profile: string | undefined,\n warn: (message: string) => void = () => undefined,\n): string | undefined {\n if (profile && !isProfile(profile)) {\n throw new Error(`Unknown feed profile \"${profile}\". Use: ${PROFILE_CHOICES.join(\" or \")}`);\n }\n\n if (!screening) return profile;\n\n if (!isProfile(screening)) {\n throw new Error(`Unknown screening \"${screening}\". Use: ${PROFILE_CHOICES.join(\" or \")}`);\n }\n\n if (profile && profile !== screening) {\n warn(`Both positional and --profile set; using --profile (${profile}).`);\n return profile;\n }\n\n return profile ?? screening;\n}\n\n/**\n * Build query params for GET /api/feed. Omits undefined / empty string.\n */\nfunction feedQueryParams(opts: {\n profile?: string;\n sortBy?: string;\n preset?: string;\n tag?: string;\n minVolume?: string;\n minLiquidity?: string;\n maxLiquidity?: string;\n minRewardsDailyRate?: string;\n minDaysToEnd?: string;\n maxDaysToEnd?: string;\n maxMarketAgeHours?: string;\n liquidProfile?: string;\n limit?: string;\n}): Record<string, string> {\n const entries: [string, string][] = [];\n const add = (k: string, v: string | undefined) => {\n if (v !== undefined && v !== \"\") entries.push([k, v]);\n };\n add(\"profile\", opts.profile);\n add(\"sortBy\", opts.sortBy);\n add(\"preset\", opts.preset);\n add(\"tag\", opts.tag);\n add(\"minVolume\", opts.minVolume);\n add(\"minLiquidity\", opts.minLiquidity);\n add(\"maxLiquidity\", opts.maxLiquidity);\n add(\"minRewardsDailyRate\", opts.minRewardsDailyRate);\n add(\"minDaysToEnd\", opts.minDaysToEnd);\n add(\"maxDaysToEnd\", opts.maxDaysToEnd);\n add(\"maxMarketAgeHours\", opts.maxMarketAgeHours);\n add(\"liquidProfile\", opts.liquidProfile);\n add(\"limit\", opts.limit);\n return Object.fromEntries(entries);\n}\n\nconst ENSEMBLE_SOURCES: Array<{ name: string; params: Record<string, string> }> = [\n { name: \"liquid-new-or-long\", params: { profile: \"liquid-new-or-long\", sortBy: \"liquidity\" } },\n { name: \"liquidity-provider\", params: { profile: \"liquidity-provider\", sortBy: \"lpExpectedReturn\" } },\n { name: \"lp-opportunity\", params: { profile: \"lp-opportunity\", sortBy: \"rewardYield\" } },\n { name: \"movement\", params: { sortBy: \"movement\", preset: \"price-movers\" } },\n { name: \"spread\", params: { sortBy: \"spread\", preset: \"liquidity-provider\" } },\n { name: \"reward-yield\", params: { sortBy: \"rewardYield\", preset: \"rewards-optimizer\", minRewardsDailyRate: \"0.01\" } },\n];\n\nfunction num(value: number | null | undefined): number {\n return Number.isFinite(value) ? Number(value) : 0;\n}\n\nfunction scoreCandidate(candidate: FeedResultMarket, sourceCount: number): number {\n const liquidityScore = Math.min(25, Math.log1p(Math.max(0, candidate.liquidity)) / Math.log1p(1_000_000) * 25);\n const volumeScore = Math.min(25, Math.log1p(Math.max(0, candidate.volume24h)) / Math.log1p(1_000_000) * 25);\n const spreadScore = Math.max(0, Math.min(15, (0.12 - Math.max(0, candidate.spread)) / 0.12 * 15));\n const movementPenalty = Math.min(20, Math.abs(candidate.oneDayPriceChange) * 100);\n const days = candidate.daysToEnd ?? null;\n const horizonScore = days === null\n ? 2\n : days < 3\n ? 0\n : Math.min(10, Math.log1p(days) / Math.log1p(365) * 10);\n const rewardScore = Math.max(\n 0,\n Math.min(20, num(candidate.components?.rewardYield) * 0.1 + Math.max(0, num(candidate.lpExpectedReturnDailyPct)) * 50),\n );\n const sourceScore = Math.min(16, sourceCount * 4);\n return Math.round((liquidityScore + volumeScore + spreadScore + horizonScore + rewardScore + sourceScore - movementPenalty) * 10) / 10;\n}\n\nexport function buildFeedEnsemble(\n sourceResults: Array<{ source: string; result: FeedResult }>,\n limit: number,\n outputPath = \"candidates.json\",\n generatedAt = new Date().toISOString(),\n): FeedEnsembleResult {\n const bySlug = new Map<string, EnsembleCandidate>();\n let totalRawMarkets = 0;\n\n for (const { source, result } of sourceResults) {\n for (const market of result.markets ?? []) {\n totalRawMarkets++;\n const existing = bySlug.get(market.slug);\n if (!existing) {\n bySlug.set(market.slug, {\n ...market,\n ensembleScore: 0,\n sourceProfiles: [source],\n sourceRanks: { [source]: market.rank },\n });\n continue;\n }\n\n existing.sourceProfiles.push(source);\n existing.sourceRanks[source] = market.rank;\n if (market.score > existing.score) existing.score = market.score;\n existing.volume24h = Math.max(existing.volume24h, market.volume24h);\n existing.liquidity = Math.max(existing.liquidity, market.liquidity);\n existing.rewardsDailyRate = Math.max(existing.rewardsDailyRate, market.rewardsDailyRate);\n existing.lpExpectedReturnDailyPct = Math.max(\n num(existing.lpExpectedReturnDailyPct),\n num(market.lpExpectedReturnDailyPct),\n );\n existing.lpRiskFlags = [...new Set([...(existing.lpRiskFlags ?? []), ...(market.lpRiskFlags ?? [])])];\n }\n }\n\n const candidates = [...bySlug.values()]\n .map((candidate) => ({\n ...candidate,\n sourceProfiles: [...new Set(candidate.sourceProfiles)],\n ensembleScore: scoreCandidate(candidate, new Set(candidate.sourceProfiles).size),\n }))\n .sort((a, b) => b.ensembleScore - a.ensembleScore || b.score - a.score)\n .slice(0, limit);\n\n return {\n generatedAt,\n outputPath,\n totalSources: sourceResults.length,\n totalRawMarkets,\n totalCandidates: bySlug.size,\n marketsReturned: candidates.length,\n candidates,\n };\n}\n\nfunction parseLimit(value: string | undefined, fallback: number): number {\n const parsed = Number.parseInt(value ?? \"\", 10);\n if (!Number.isFinite(parsed)) return fallback;\n return Math.max(1, Math.min(100, parsed));\n}\n\nexport function registerFeedCommand(program: Command): void {\n const feed = program\n .command(\"feed\")\n .description(\n \"Rank active Polymarket markets (same engine as chat getFeed / GET /api/feed). \" +\n \"Use --profile for curated screens.\",\n )\n .argument(\n \"[screening]\",\n `Optional screening preset: ${PROFILE_CHOICES.join(\" | \")} (same as --profile)`,\n )\n .option(\n \"--profile <name>\",\n `Screening defaults: ${PROFILE_CHOICES.join(\", \")} — explicit flags override`,\n )\n .option(\"--sort-by <key>\", \"score | volume | liquidity | movement | spread | recency | extremity | rewards | rewardYield | lpExpectedReturn | horizon\")\n .option(\"--preset <name>\", \"Attention weight preset (default, volume-hunter, lp-opportunity, …)\")\n .option(\"--tag <slug>\", \"Polymarket category tag, e.g. crypto, politics\")\n .option(\"--min-volume <usd>\", \"Minimum 24h volume (USD)\")\n .option(\"--min-liquidity <usd>\", \"Minimum displayed liquidity (USD)\")\n .option(\"--max-liquidity <usd>\", \"Maximum displayed liquidity (USD)\")\n .option(\"--min-rewards-daily-rate <usd>\", \"Minimum LP rewards USD/day\")\n .option(\"--min-days-to-end <n>\", \"Min calendar days until resolution\")\n .option(\"--max-days-to-end <n>\", \"Max calendar days until resolution\")\n .option(\"--max-market-age-hours <n>\", \"With liquid-new-or-long: max age (hours) for the \\\"new\\\" branch\")\n .option(\"--liquid-profile <mode>\", \"new-or-long (used by liquid-new-or-long screen)\")\n .option(\"--limit <n>\", \"Max markets to return (1–100, default 15)\", \"15\");\n\n feed\n .command(\"ensemble\")\n .description(\"Run multiple feed screens, merge by slug, and write ranked candidates JSON\")\n .option(\"--limit <n>\", \"Max candidates to return/write (1-100, default 25)\", \"25\")\n .option(\"--output <file>\", \"Output JSON path\", \"candidates.json\")\n .action(async (o: FeedEnsembleOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const perSourceLimit = \"100\";\n const sourceResults: Array<{ source: string; result: FeedResult }> = [];\n try {\n for (const source of ENSEMBLE_SOURCES) {\n const result = await client.get<FeedResult>(\"/api/feed\", {\n ...source.params,\n limit: perSourceLimit,\n });\n if (result.error) {\n throw new Error(result.error);\n }\n sourceResults.push({ source: source.name, result });\n }\n const outputPath = o.output ?? \"candidates.json\";\n const ensemble = buildFeedEnsemble(sourceResults, parseLimit(o.limit, 25), outputPath);\n await writeFile(outputPath, JSON.stringify(ensemble, null, 2) + \"\\n\", \"utf8\");\n if (globalOpts.json) {\n out.json(ensemble);\n return;\n }\n out.heading(`Feed Ensemble — ${ensemble.marketsReturned} candidates`);\n out.table(\n ensemble.candidates.slice(0, 15).map((m) => [\n String(Math.round(m.ensembleScore)),\n out.truncate(m.question, 48),\n `${Math.round(m.yesPrice * 100)}%`,\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n m.sourceProfiles.join(\",\"),\n ]),\n [\"Score\", \"Market\", \"YES\", \"24h Vol\", \"Liq\", \"Sources\"],\n );\n out.success(`Wrote ${outputPath}`);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n\n feed\n .action(async (screening: string | undefined, o: FeedCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n let profile: string | undefined;\n try {\n profile = resolveFeedProfile(screening, o.profile, out.warn);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params = feedQueryParams({\n profile,\n sortBy: o.sortBy,\n preset: o.preset,\n tag: o.tag,\n minVolume: o.minVolume,\n minLiquidity: o.minLiquidity,\n maxLiquidity: o.maxLiquidity,\n minRewardsDailyRate: o.minRewardsDailyRate,\n minDaysToEnd: o.minDaysToEnd,\n maxDaysToEnd: o.maxDaysToEnd,\n maxMarketAgeHours: o.maxMarketAgeHours,\n liquidProfile: o.liquidProfile,\n limit: o.limit,\n });\n\n try {\n const result = await client.get<FeedResult>(\"/api/feed\", params);\n if (result.error) {\n out.error(result.error);\n process.exit(1);\n }\n displayFeedResult(result, globalOpts);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { writeFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport {\n displayAllocatorCycleResult,\n} from \"../allocator-display.js\";\nimport {\n parsePositiveNumber,\n readAllocations,\n readMarketPayload,\n readPnlContext,\n} from \"./allocator.js\";\nimport {\n displayLpEvaluateResult,\n displayLpRecommendResult,\n displayLpScanResult,\n} from \"../lp-display.js\";\nimport type {\n GlobalOptions,\n AllocatorCycleApiResponse,\n AllocatorCycleRequest,\n AllocatorStrategyInput,\n LpEvaluateResponse,\n LpRecommendResponse,\n LpScanResponse,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface LpScanOpts {\n profile?: string;\n sortBy?: string;\n tag?: string;\n minVolume?: number;\n minLiquidity?: number;\n maxLiquidity?: number;\n minRewardsDailyRate?: number;\n minDaysToEnd?: number;\n maxDaysToEnd?: number;\n maxMarketAgeHours?: number;\n liquidProfile?: string;\n limit?: number;\n strategyId?: string;\n output?: string;\n}\n\ninterface LpRecommendOpts {\n strategyId?: string;\n scanId?: string;\n limit?: number;\n syncPnl?: boolean;\n output?: string;\n}\n\ninterface LpEvaluateOpts {\n strategyId?: string;\n walletAddress?: string;\n syncPnl?: boolean;\n limit?: number;\n output?: string;\n}\n\ninterface LpAllocatorOpts {\n markets: string;\n allocations?: string;\n pnl?: string;\n totalHoldings?: number;\n capitalLimitPct?: number;\n perMarketLimitPct?: number;\n capitalLimit: number;\n perMarketLimit: number;\n minExpectedReturnDailyPct: number;\n maxInventoryImbalance: number;\n volatilityFillSpikeThreshold: number;\n eventNoQuoteMinutesBefore: number;\n eventNoQuoteMinutesAfter: number;\n allocatorMinLiquidity: number;\n maxSpread: number;\n allocatorMinDaysToEnd: number;\n maxMarkets: number;\n paused?: boolean;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction parseNonNegative(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0) {\n throw new InvalidArgumentError(\"Expected a non-negative number\");\n }\n return n;\n}\n\nfunction parsePositiveInt(value: string): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) {\n throw new InvalidArgumentError(\"Expected a positive integer\");\n }\n return n;\n}\n\nfunction strategyFromAllocatorOptions(opts: LpAllocatorOpts): AllocatorStrategyInput {\n return {\n id: \"cli-lp-allocator\",\n name: \"CLI LP allocator dry run\",\n status: opts.paused ? \"paused\" : \"dry_run\",\n ...(opts.totalHoldings !== undefined && { total_holdings: opts.totalHoldings }),\n ...(opts.capitalLimitPct !== undefined && { capital_limit_pct: opts.capitalLimitPct }),\n ...(opts.perMarketLimitPct !== undefined && { per_market_limit_pct: opts.perMarketLimitPct }),\n capital_limit: opts.capitalLimit,\n per_market_limit: opts.perMarketLimit,\n min_expected_return_daily_pct: opts.minExpectedReturnDailyPct,\n max_inventory_imbalance: opts.maxInventoryImbalance,\n volatility_fill_spike_threshold: opts.volatilityFillSpikeThreshold,\n event_no_quote_minutes_before: opts.eventNoQuoteMinutesBefore,\n event_no_quote_minutes_after: opts.eventNoQuoteMinutesAfter,\n min_liquidity: opts.allocatorMinLiquidity,\n max_spread: opts.maxSpread,\n min_days_to_end: opts.allocatorMinDaysToEnd,\n max_markets: opts.maxMarkets,\n };\n}\n\nfunction validateAllocatorPercentageSizing(opts: LpAllocatorOpts): void {\n const usesPercentageSizing =\n opts.capitalLimitPct !== undefined || opts.perMarketLimitPct !== undefined;\n if (usesPercentageSizing && opts.totalHoldings === undefined) {\n out.error(\n \"Percentage sizing requires --total-holdings so the allocator can convert percentages into dollar caps.\",\n );\n process.exit(1);\n }\n}\n\nfunction compact<T extends Record<string, unknown>>(payload: T): T {\n return Object.fromEntries(\n Object.entries(payload).filter(([, value]) => value !== undefined && value !== \"\"),\n ) as T;\n}\n\nasync function writeArtifact(path: string | undefined, data: unknown, jsonMode: boolean): Promise<void> {\n if (!path) return;\n await writeFile(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n if (!jsonMode) {\n process.stderr.write(out.dim(` Saved artifact to ${path}\\n`));\n }\n}\n\nexport function buildLpScanPayload(topic: string | undefined, opts: LpScanOpts) {\n return compact({\n topic: topic?.trim() || undefined,\n strategyId: opts.strategyId,\n profile: opts.profile,\n sortBy: opts.sortBy,\n tag: opts.tag,\n minVolume: opts.minVolume,\n minLiquidity: opts.minLiquidity,\n maxLiquidity: opts.maxLiquidity,\n minRewardsDailyRate: opts.minRewardsDailyRate,\n minDaysToEnd: opts.minDaysToEnd,\n maxDaysToEnd: opts.maxDaysToEnd,\n maxMarketAgeHours: opts.maxMarketAgeHours,\n liquidProfile: opts.liquidProfile,\n limit: opts.limit,\n });\n}\n\nexport function buildLpRecommendPayload(opts: LpRecommendOpts) {\n return compact({\n strategyId: opts.strategyId,\n scanId: opts.scanId,\n limit: opts.limit,\n syncPnl: opts.syncPnl,\n });\n}\n\nexport function buildLpEvaluatePayload(opts: LpEvaluateOpts) {\n return compact({\n strategyId: opts.strategyId,\n walletAddress: opts.walletAddress,\n syncPnl: opts.syncPnl,\n limit: opts.limit,\n });\n}\n\nasync function runAllocatorCycle(\n client: ApiClient,\n payload: AllocatorCycleRequest,\n): Promise<AllocatorCycleApiResponse> {\n return client.post<AllocatorCycleApiResponse>(\"/api/lp/allocator\", payload);\n}\n\nexport function registerLpCommands(program: Command): void {\n const lp = program\n .command(\"lp\")\n .description(\"Run persisted liquidity-provider scan, recommendation, and evaluation workflows\");\n\n lp\n .command(\"allocator\")\n .description(\"Run the allocator agent on an explicit market list\")\n .requiredOption(\"--markets <file>\", \"Candidate market JSON array or { markets }; use '-' to read stdin\")\n .option(\"--allocations <file>\", \"Existing allocations JSON array or { allocations }; use '-' to read stdin\")\n .option(\"--pnl <file>\", \"Per-market PnL context JSON array or { pnl_context } (hl-trader pnl --json output); use '-' to read stdin\")\n .option(\"--total-holdings <usd>\", \"Total holdings / portfolio value used for percentage sizing\", parsePositiveNumber)\n .option(\"--capital-limit-pct <pct>\", \"Portfolio-level allocation cap as a percent of total holdings\", parsePositiveNumber)\n .option(\"--per-market-limit-pct <pct>\", \"Per-market target cap as a percent of total holdings\", parsePositiveNumber)\n .option(\"--capital-limit <usd>\", \"Portfolio capital limit for this allocator request\", parseNonNegative, 500)\n .option(\"--per-market-limit <usd>\", \"Per-market target cap\", parseNonNegative, 100)\n .option(\"--min-expected-return-daily-pct <pct>\", \"Minimum expected daily return percent\", parseNonNegative, 0.02)\n .option(\"--max-inventory-imbalance <ratio>\", \"Maximum inventory imbalance\", parseNonNegative, 0.25)\n .option(\"--volatility-fill-spike-threshold <ratio>\", \"Fill-rate imbalance that switches quotes to defensive mode\", parseNonNegative, 0.35)\n .option(\"--event-no-quote-minutes-before <n>\", \"No-quote window before scheduled events\", parseNonNegative, 60)\n .option(\"--event-no-quote-minutes-after <n>\", \"No-quote window after scheduled events\", parseNonNegative, 30)\n .option(\"--allocator-min-liquidity <usd>\", \"Allocator safety gate: minimum market liquidity\", parseNonNegative, 500)\n .option(\"--max-spread <ratio>\", \"Allocator safety gate: maximum spread\", parseNonNegative, 0.12)\n .option(\"--allocator-min-days-to-end <n>\", \"Allocator safety gate: minimum days to resolution\", parseNonNegative, 3)\n .option(\"--max-markets <n>\", \"Maximum markets allocator may target\", parsePositiveInt, 5)\n .option(\"--paused\", \"Send strategy status paused instead of dry_run\")\n .action(async (opts: LpAllocatorOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n validateAllocatorPercentageSizing(opts);\n\n const markets = await readMarketPayload(opts.markets);\n if (!markets || markets.length === 0) {\n out.error(\"Markets JSON must include at least one market.\");\n process.exit(1);\n }\n\n if (opts.allocations === \"-\" && opts.pnl === \"-\") {\n out.error(\"Only one of --allocations and --pnl can read from stdin.\");\n process.exit(1);\n }\n\n const pnlContext = await readPnlContext(opts.pnl);\n const payload: AllocatorCycleRequest = {\n strategy: strategyFromAllocatorOptions(opts),\n markets,\n allocations: await readAllocations(opts.allocations),\n ...(pnlContext.length > 0 && { pnl_context: pnlContext }),\n };\n\n if (!globalOpts.json) {\n process.stderr.write(\n out.dim(` Running allocator dry-run on ${markets.length} provided candidates...\\n`),\n );\n }\n\n const response = await runAllocatorCycle(client, payload);\n if (globalOpts.json) {\n out.json(response);\n } else {\n displayAllocatorCycleResult(response.result ?? {}, globalOpts);\n }\n });\n\n lp\n .command(\"scan\")\n .description(\"Scan LP candidates and persist them as evidence\")\n .argument(\"[topic]\", \"Human label for this scan, e.g. liquidity opportunities\")\n .option(\"--profile <name>\", \"lp-opportunity | liquidity-provider | liquid-new-or-long\", \"liquidity-provider\")\n .option(\"--sort-by <key>\", \"score | volume | liquidity | movement | spread | rewards | rewardYield | lpExpectedReturn | horizon\")\n .option(\"--tag <slug>\", \"Polymarket category tag, e.g. crypto, politics\")\n .option(\"--min-volume <usd>\", \"Minimum 24h volume (USD)\", parseNonNegative)\n .option(\"--min-liquidity <usd>\", \"Minimum displayed liquidity (USD)\", parseNonNegative)\n .option(\"--max-liquidity <usd>\", \"Maximum displayed liquidity (USD)\", parseNonNegative)\n .option(\"--min-rewards-daily-rate <usd>\", \"Minimum LP rewards USD/day\", parseNonNegative)\n .option(\"--min-days-to-end <n>\", \"Minimum days until resolution\", parseNonNegative)\n .option(\"--max-days-to-end <n>\", \"Maximum days until resolution\", parseNonNegative)\n .option(\"--max-market-age-hours <n>\", \"With liquid-new-or-long: max age for the new branch\", parseNonNegative)\n .option(\"--liquid-profile <mode>\", \"new-or-long\")\n .option(\"--limit <n>\", \"Max markets to scan/save (1-100, default 15)\", parsePositiveInt, 15)\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--output <file>\", \"Write the evidence JSON response to a local file\")\n .action(async (topic: string | undefined, opts: LpScanOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpScanResponse>(\n \"/api/lp/scan\",\n buildLpScanPayload(topic, opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpScanResult(result, globalOpts);\n });\n\n lp\n .command(\"recommend\")\n .description(\"Run allocator recommendations from saved LP evidence and current allocations\")\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--scan-id <uuid>\", \"Use candidates from a specific saved scan\")\n .option(\"--limit <n>\", \"Max saved candidates to submit (1-25, default 15)\", parsePositiveInt, 15)\n .option(\"--sync-pnl\", \"Refresh wallet PnL before recommending\")\n .option(\"--output <file>\", \"Write the recommendation JSON response to a local file\")\n .action(async (opts: LpRecommendOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpRecommendResponse>(\n \"/api/lp/recommend\",\n buildLpRecommendPayload(opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpRecommendResult(result, globalOpts);\n });\n\n lp\n .command(\"evaluate\")\n .description(\"Evaluate LP performance and return compact lessons\")\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--wallet-address <address>\", \"Wallet address to sync PnL from\")\n .option(\"--no-sync-pnl\", \"Use existing PnL snapshots without refreshing\")\n .option(\"--limit <n>\", \"Max PnL snapshots to evaluate (1-100, default 50)\", parsePositiveInt, 50)\n .option(\"--output <file>\", \"Write the evaluation JSON response to a local file\")\n .action(async (opts: LpEvaluateOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpEvaluateResponse>(\n \"/api/lp/evaluate\",\n buildLpEvaluatePayload(opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpEvaluateResult(result, globalOpts);\n });\n\n}\n","import chalk from \"chalk\";\nimport type {\n AllocatorCycleResult,\n GlobalOptions,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction actionColor(action: string): string {\n switch (action) {\n case \"ALLOCATE\":\n case \"INCREASE\":\n return chalk.green(action);\n case \"REDUCE\":\n case \"EXIT\":\n return chalk.yellow(action);\n case \"SKIP\":\n return chalk.dim(action);\n case \"WATCH\":\n return chalk.cyan(action);\n default:\n return action;\n }\n}\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function displayAllocatorCycleResult(\n result: AllocatorCycleResult,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n const decisions = Array.isArray(result.decisions) ? result.decisions : [];\n const summary = result.summary ?? {};\n const dryRun = result.dry_run === false ? \"live\" : \"dry run\";\n\n out.heading(`Allocator Cycle — ${dryRun}`);\n process.stdout.write(\n chalk.dim(\n ` ${num(result.total_markets, decisions.length)} markets · ${out.currency(\n num(summary.target_capital),\n )} target capital\\n\\n`,\n ),\n );\n\n if (decisions.length === 0) {\n out.warn(\"No allocator decisions returned.\");\n return;\n }\n\n const rows = decisions.map((d) => {\n const action = String(d.action ?? \"UNKNOWN\");\n const score = num(d.score?.score);\n const expected = num(d.score?.expected_return_daily_pct);\n const failedChecks = Array.isArray(d.safety_checks)\n ? d.safety_checks.filter((check) => check.passed === false).length\n : 0;\n return [\n out.truncate(String(d.question ?? d.market_slug ?? \"—\"), 42),\n actionColor(action),\n out.currency(num(d.target_capital)),\n signedCurrency(num(d.capital_delta)),\n `${expected.toFixed(3)}%`,\n regimeLabel(String(d.quote_regime ?? \"—\")),\n String(Math.round(score)),\n failedChecks === 0 ? chalk.green(\"0\") : chalk.yellow(String(failedChecks)),\n ];\n });\n\n out.table(rows, [\n \"Market\",\n \"Action\",\n \"Target\",\n \"Delta\",\n \"Exp/day\",\n \"Regime\",\n \"Score\",\n \"Fails\",\n ]);\n\n process.stdout.write(\"\\n\");\n for (const decision of decisions.slice(0, 5)) {\n const action = String(decision.action ?? \"UNKNOWN\");\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(String(decision.question ?? decision.market_slug ?? \"—\"), 65) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Action: \") + actionColor(action));\n if (decision.rationale) {\n process.stdout.write(\" \" + chalk.dim(\"Rationale: \") + out.truncate(decision.rationale, 120));\n }\n process.stdout.write(\"\\n\");\n\n const economics = decision.economics ?? {};\n if (\n economics.realized_spread_pnl !== undefined ||\n economics.reward_income !== undefined ||\n economics.net_realized_pnl !== undefined\n ) {\n process.stdout.write(\n \" \" +\n chalk.dim(\"Economics: \") +\n `spread ${signedCurrency(num(economics.realized_spread_pnl))}, ` +\n `rewards ${signedCurrency(num(economics.reward_income))}, ` +\n `net ${signedCurrency(num(economics.net_realized_pnl))}` +\n \"\\n\",\n );\n }\n }\n\n if (decisions.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${decisions.length - 5} more decisions\\n`));\n }\n}\n\nfunction regimeLabel(value: string): string {\n switch (value) {\n case \"reward_optimized\":\n return chalk.green(\"reward\");\n case \"defensive\":\n return chalk.yellow(\"defense\");\n case \"no_quote\":\n return chalk.red(\"no quote\");\n default:\n return chalk.dim(value);\n }\n}\n\nfunction signedCurrency(value: number): string {\n const formatted = out.currency(Math.abs(value));\n if (value > 0) return chalk.green(`+${formatted}`);\n if (value < 0) return chalk.yellow(`-${formatted}`);\n return chalk.dim(\"$0.00\");\n}\n","import { InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport type {\n AllocatorAllocationInput,\n AllocatorMarketInput,\n AllocatorPnlInput,\n} from \"../types.js\";\n\nexport function parsePositiveNumber(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return n;\n}\n\nexport function parseAllocationsInput(parsed: unknown): AllocatorAllocationInput[] {\n const rows = extractArray<AllocatorAllocationInput>(parsed, \"allocations\");\n if (!rows) {\n throw new Error(\"Allocations JSON must be an array or { allocations: [...] }\");\n }\n return rows;\n}\n\nexport function parsePnlContextInput(parsed: unknown): AllocatorPnlInput[] {\n const rows = extractArray<AllocatorPnlInput>(parsed, \"pnl_context\");\n if (!rows) {\n throw new Error(\"PnL JSON must be an array or { pnl_context: [...] }\");\n }\n return rows;\n}\n\nexport async function readAllocations(path: string | undefined): Promise<AllocatorAllocationInput[]> {\n if (!path) return [];\n return parseAllocationsInput(await readJsonInput(path));\n}\n\nexport async function readPnlContext(path: string | undefined): Promise<AllocatorPnlInput[]> {\n if (!path) return [];\n return parsePnlContextInput(await readJsonInput(path));\n}\n\nexport async function readMarketPayload(path: string | undefined): Promise<AllocatorMarketInput[] | undefined> {\n if (!path) return undefined;\n const parsed = await readJsonInput(path);\n const rows = extractArray<AllocatorMarketInput>(parsed, \"markets\");\n if (!rows) {\n throw new Error(\"Markets JSON must be an array or { markets: [...] }\");\n }\n return rows;\n}\n\nfunction extractArray<T>(parsed: unknown, key: string): T[] | undefined {\n if (Array.isArray(parsed)) {\n return parsed as T[];\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as Record<string, unknown>)[key])) {\n return (parsed as Record<string, unknown>)[key] as T[];\n }\n return undefined;\n}\n\nasync function readJsonInput(path: string): Promise<unknown> {\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n return JSON.parse(raw) as unknown;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n","import chalk from \"chalk\";\nimport { displayAllocatorCycleResult } from \"./allocator-display.js\";\nimport type {\n GlobalOptions,\n LpEvaluateResponse,\n LpRecommendResponse,\n LpScanResponse,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction signedCurrency(value: number): string {\n const formatted = out.currency(Math.abs(value));\n if (value > 0) return chalk.green(`+${formatted}`);\n if (value < 0) return chalk.yellow(`-${formatted}`);\n return chalk.dim(\"$0.00\");\n}\n\nfunction actionSummary(actions: Record<string, unknown> | undefined): string {\n if (!actions) return \"none\";\n return Object.entries(actions)\n .filter(([, count]) => num(count) > 0)\n .map(([action, count]) => `${action}:${num(count)}`)\n .join(\" \");\n}\n\nexport function displayLpScanResult(result: LpScanResponse, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Scan\");\n process.stdout.write(\n chalk.dim(\n ` scan ${result.scanId} · strategy ${result.strategyId} · ${result.evidenceSaved} evidence rows saved\\n`,\n ),\n );\n process.stdout.write(\n chalk.dim(\n ` ${result.totalScanned.toLocaleString()} scanned · ${result.totalAfterFilter.toLocaleString()} after filters · profile ${result.profile}\\n\\n`,\n ),\n );\n\n if (result.markets.length === 0) {\n out.warn(\"No markets matched the LP scan.\");\n return;\n }\n\n out.table(\n result.markets.slice(0, 10).map((market) => [\n String(market.rank),\n out.truncate(market.question, 46),\n String(Math.round(num(market.score))),\n out.compactCurrency(num(market.liquidity)),\n out.compactCurrency(num(market.rewardsDailyRate)) + \"/day\",\n `${num(market.lpExpectedReturnDailyPct).toFixed(3)}%`,\n ]),\n [\"#\", \"Market\", \"Score\", \"Liq\", \"Rewards\", \"Exp/day\"],\n );\n}\n\nexport function displayLpRecommendResult(\n result: LpRecommendResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Recommendations\");\n process.stdout.write(\n chalk.dim(\n ` cycle ${result.cycleId} · strategy ${result.strategyId} · ${result.candidatesSubmitted} markets · ${result.allocationsSubmitted} current allocations\\n`,\n ),\n );\n process.stdout.write(\n chalk.dim(\n ` PnL context ${result.pnlContextCount} rows${result.pnlSynced ? \" · synced\" : \"\"} · approvals required\\n\\n`,\n ),\n );\n displayAllocatorCycleResult(result.result ?? { decisions: result.decisions }, globalOpts);\n}\n\nexport function displayLpEvaluateResult(\n result: LpEvaluateResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Evaluation\");\n process.stdout.write(\n chalk.dim(\n ` strategy ${result.strategyId} · ${result.summary.snapshots} snapshots · ${result.summary.markets} markets`,\n ),\n );\n if (result.pnlSynced) process.stdout.write(chalk.dim(\" · synced\"));\n process.stdout.write(\"\\n\\n\");\n if (result.syncError) out.warn(result.syncError);\n\n out.table(\n [\n [\"Realized PnL\", signedCurrency(result.summary.realizedPnl)],\n [\"Unrealized PnL\", signedCurrency(result.summary.unrealizedPnl)],\n [\"Net PnL\", signedCurrency(result.summary.netPnl)],\n [\"Capital locked\", out.currency(result.summary.capitalLocked)],\n [\"Current value\", out.currency(result.summary.currentValue)],\n [\"Outcomes\", actionSummary(result.summary.outcomes)],\n ],\n );\n\n if (result.lessons.length === 0) {\n out.warn(\"No PnL lessons available yet.\");\n return;\n }\n\n process.stdout.write(\"\\n\");\n out.table(\n result.lessons.slice(0, 8).map((lesson) => [\n out.truncate(String(lesson.market_slug ?? \"portfolio\"), 26),\n String(lesson.outcome ?? \"flat\"),\n signedCurrency(num(lesson.net_pnl)),\n out.truncate(String(lesson.lesson ?? \"no lesson\"), 64),\n ]),\n [\"Market\", \"Outcome\", \"Net\", \"Lesson\"],\n );\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { spawn } from \"node:child_process\";\nimport { ApiClient } from \"../client.js\";\nimport type {\n GlobalOptions,\n WalletAssetKey,\n WalletBalanceAsset,\n WalletBalances,\n WalletDepositResponse,\n WalletStatus,\n WalletWithdrawIntent,\n WalletWithdrawIntentResponse,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\nconst NETWORK_NAME = \"Polygon\";\nconst POLYGON_NATIVE_USDC = \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\";\nconst SUPPORTED_ASSETS: WalletAssetKey[] = [\"pUsd\", \"usdcE\", \"matic\"];\nconst POLYGON_NATIVE_ASSET_LABEL = \"POL\";\nconst TERMINAL_WITHDRAWAL_STATUSES = new Set([\"succeeded\", \"failed\", \"cancelled\", \"expired\"]);\n\ninterface DepositInstructions {\n action: \"deposit\";\n publicDepositAddress: string;\n walletAddress: string;\n chainId: number;\n network: string;\n asset: WalletBalanceAsset | null;\n assets: WalletBalanceAsset[];\n warning: string;\n}\n\ninterface DepositOpts {\n asset?: string;\n bridge?: boolean;\n}\n\ninterface WithdrawOpts {\n asset?: string;\n amount: number;\n to: string;\n toChainId?: string;\n toTokenAddress?: string;\n open?: boolean;\n wait?: boolean;\n pollInterval?: number;\n timeout?: number;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction parsePositiveNumber(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return n;\n}\n\nfunction parseWalletAddress(value: string): string {\n const trimmed = value.trim();\n if (!/^0x[a-fA-F0-9]{40}$/.test(trimmed)) {\n throw new InvalidArgumentError(\"Expected a valid EVM wallet address\");\n }\n return trimmed;\n}\n\nexport function normalizeWalletAsset(value: string | undefined): WalletAssetKey | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase().replace(/[._\\s-]/g, \"\");\n if ([\"pusd\", \"polymarketusd\"].includes(normalized)) return \"pUsd\";\n if ([\"usdce\", \"usdcebridged\", \"bridgedusdc\", \"usdc\"].includes(normalized)) return \"usdcE\";\n if ([\"matic\", \"pol\"].includes(normalized)) return \"matic\";\n throw new InvalidArgumentError(\"Unknown wallet asset. Use pUSD, USDC.e, or POL.\");\n}\n\nfunction assetByKey(balances: WalletBalances, key: WalletAssetKey): WalletBalanceAsset {\n return balances.assets[key];\n}\n\nfunction tokenAddress(asset: WalletBalanceAsset): string {\n return asset.address ?? \"native token\";\n}\n\nfunction displayAmount(asset: WalletBalanceAsset): string {\n if (!asset.ok) {\n return `unavailable${asset.error ? ` (${asset.error})` : \"\"}`;\n }\n const numeric = Number(asset.balance);\n if (asset.address === null && asset.decimals === 18) {\n return Number.isFinite(numeric) ? numeric.toLocaleString(\"en-US\", { maximumFractionDigits: 6 }) : asset.balance;\n }\n return Number.isFinite(numeric) ? out.currency(numeric) : asset.balance;\n}\n\nfunction displayAssetSymbol(asset: WalletBalanceAsset): string {\n return asset.address === null && asset.decimals === 18 ? POLYGON_NATIVE_ASSET_LABEL : asset.symbol;\n}\n\nexport function buildDepositInstructions(\n balances: WalletBalances,\n assetKey?: WalletAssetKey,\n): DepositInstructions {\n const assets = assetKey\n ? [assetByKey(balances, assetKey)]\n : SUPPORTED_ASSETS.map((key) => assetByKey(balances, key));\n\n return {\n action: \"deposit\",\n publicDepositAddress: balances.walletAddress,\n walletAddress: balances.walletAddress,\n chainId: balances.chainId,\n network: NETWORK_NAME,\n asset: assetKey ? assetByKey(balances, assetKey) : null,\n assets,\n warning: \"Send only Polygon assets to this address. Hedge Layer cannot reverse external transfers.\",\n };\n}\n\nexport function buildWithdrawRequestPayload(opts: WithdrawOpts) {\n const assetKey = normalizeWalletAsset(opts.asset) ?? \"pUsd\";\n if (assetKey !== \"pUsd\") {\n throw new InvalidArgumentError(\"Bridge withdrawals currently send pUSD. Use --asset pUSD.\");\n }\n return {\n amount: opts.amount,\n recipientAddress: opts.to,\n toChainId: opts.toChainId ?? \"137\",\n toTokenAddress: opts.toTokenAddress ?? POLYGON_NATIVE_USDC,\n };\n}\n\nfunction displayWalletStatus(status: WalletStatus): void {\n const ownerWallet = status.ownerWallet ?? status.wallet;\n const depositWallet = status.depositWallet ?? status.tradingWallet ?? null;\n\n out.heading(\"Wallet\");\n out.table([\n [\"Owner linked\", status.linked ? \"yes\" : \"no\"],\n [\"Provider\", status.provider],\n [\"Owner wallet\", ownerWallet?.wallet_address ?? \"(none)\"],\n [\"Owner chain\", ownerWallet ? `${NETWORK_NAME} (${ownerWallet.chain_id})` : \"(none)\"],\n [\"Owner linked at\", ownerWallet?.linked_at ? new Date(ownerWallet.linked_at).toLocaleString() : \"(none)\"],\n [\"Deposit wallet\", depositWallet?.wallet_address ?? \"(none)\"],\n [\"Deposit deployed\", status.depositWalletDeployed ? \"yes\" : \"no\"],\n [\"Deposit approved\", status.depositWalletApproved ? \"yes\" : \"no\"],\n [\"Deposit ready\", status.depositWalletReady ? \"yes\" : \"no\"],\n [\"Relayer configured\", status.relayerConfigured ? \"yes\" : \"no\"],\n ]);\n}\n\nfunction displayWalletBalances(balances: WalletBalances): void {\n out.heading(\"Wallet Funds\");\n out.table([\n [\"Wallet\", balances.walletAddress],\n [\"Chain\", `${NETWORK_NAME} (${balances.chainId})`],\n [\"Available pUSD\", displayAmount(balances.available)],\n [\"USDC.e\", displayAmount(balances.assets.usdcE)],\n [displayAssetSymbol(balances.assets.matic), displayAmount(balances.assets.matic)],\n [\"Updated\", new Date(balances.updatedAt).toLocaleString()],\n ]);\n}\n\nfunction displayDepositInstructions(instructions: DepositInstructions): void {\n out.heading(\"Deposit\");\n out.table([\n [\"Public deposit address\", instructions.publicDepositAddress],\n [\"Network\", `${instructions.network} (${instructions.chainId})`],\n ]);\n\n process.stdout.write(\"\\n\");\n out.table(\n instructions.assets.map((asset) => [\n displayAssetSymbol(asset),\n tokenAddress(asset),\n displayAmount(asset),\n ]),\n [\"Asset\", \"Token contract\", \"Current balance\"],\n );\n process.stdout.write(\"\\n\");\n out.warn(instructions.warning);\n}\n\nfunction displayBridgeDeposit(result: WalletDepositResponse): void {\n const bridgeAddresses = result.bridge?.address ?? {};\n const rows = Object.entries(bridgeAddresses)\n .filter(([, value]) => typeof value === \"string\" && value.length > 0)\n .map(([network, value]) => [network.toUpperCase(), value]);\n\n if (rows.length === 0) return;\n process.stdout.write(\"\\n\");\n out.table(rows, [\"Bridge network\", \"Bridge deposit address\"]);\n if (result.bridge?.note) {\n process.stdout.write(\"\\n\" + out.dim(` ${result.bridge.note}\\n`));\n }\n for (const warning of result.bridge?.warnings ?? []) {\n if (warning.message) out.warn(warning.message);\n }\n}\n\nfunction displayWithdrawIntent(intent: WalletWithdrawIntent): void {\n out.heading(\"Withdraw\");\n out.table([\n [\"Intent\", intent.id],\n [\"Status\", intent.status],\n [\"Wallet\", intent.walletAddress],\n [\"Amount\", `${intent.amount} pUSD`],\n [\"Recipient\", intent.recipientAddress],\n [\"Destination\", `chain ${intent.toChainId} · ${intent.toTokenAddress}`],\n [\"Bridge address\", intent.bridgeAddresses.evm ?? \"(none)\"],\n [\"Signing URL\", intent.signingUrl],\n ]);\n const quote = intent.quote ?? {};\n if (quote.estOutputUsd !== undefined || quote.estCheckoutTimeMs !== undefined) {\n process.stdout.write(\"\\n\");\n out.table([\n [\"Estimated output\", quote.estOutputUsd !== undefined ? out.currency(Number(quote.estOutputUsd)) : \"-\"],\n [\"Estimated checkout\", quote.estCheckoutTimeMs !== undefined ? `${Math.round(Number(quote.estCheckoutTimeMs) / 1000)}s` : \"-\"],\n ]);\n }\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args =\n process.platform === \"win32\"\n ? [\"/c\", \"start\", \"\", url]\n : [url];\n const child = spawn(command, args, { detached: true, stdio: \"ignore\" });\n child.unref();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function pollWithdrawalIntent(\n client: ApiClient,\n id: string,\n opts: { timeoutSeconds: number; intervalSeconds: number; jsonMode: boolean },\n): Promise<WalletWithdrawIntent> {\n const started = Date.now();\n let lastStatus = \"\";\n while (Date.now() - started <= opts.timeoutSeconds * 1000) {\n const result = await client.get<WalletWithdrawIntentResponse>(\n `/api/wallet/withdraw/intents/${encodeURIComponent(id)}`,\n );\n const intent = result.intent;\n if (!opts.jsonMode && intent.status !== lastStatus) {\n process.stderr.write(out.dim(` Withdrawal status: ${intent.status}\\n`));\n lastStatus = intent.status;\n }\n if (TERMINAL_WITHDRAWAL_STATUSES.has(intent.status)) return intent;\n await sleep(opts.intervalSeconds * 1000);\n }\n throw new Error(`Timed out waiting for withdrawal intent ${id}`);\n}\n\nexport function registerWalletCommands(program: Command): void {\n const wallet = program\n .command(\"wallet\")\n .description(\"Inspect linked wallet funds and funding instructions\");\n\n wallet\n .command(\"status\")\n .description(\"Show linked owner and Polymarket deposit wallet status\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const status = await client.get<WalletStatus>(\"/api/wallet/status\");\n if (globalOpts.json) {\n out.json(status);\n return;\n }\n displayWalletStatus(status);\n });\n\n wallet\n .command(\"balances\")\n .alias(\"funds\")\n .description(\"Show available wallet funds\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const balances = await client.get<WalletBalances>(\"/api/wallet/balances\");\n if (globalOpts.json) {\n out.json(balances);\n return;\n }\n displayWalletBalances(balances);\n });\n\n wallet\n .command(\"deposit\")\n .description(\"Show deposit address and supported Polygon assets\")\n .option(\"--asset <asset>\", \"pUSD | USDC.e | POL\")\n .option(\"--bridge\", \"Also request Polymarket Bridge deposit addresses\")\n .action(async (opts: DepositOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const asset = normalizeWalletAsset(opts.asset);\n const result = await client.post<WalletDepositResponse>(\"/api/wallet/deposit\", {\n bridge: Boolean(opts.bridge),\n });\n const balances: WalletBalances = {\n walletAddress: result.direct.walletAddress,\n chainId: result.direct.chainId,\n updatedAt: new Date().toISOString(),\n available: result.direct.assets.pUsd,\n assets: result.direct.assets,\n };\n const instructions = buildDepositInstructions(balances, asset);\n if (globalOpts.json) {\n out.json({ ...result, instructions });\n return;\n }\n displayDepositInstructions(instructions);\n displayBridgeDeposit(result);\n });\n\n wallet\n .command(\"withdraw\")\n .description(\"Create a browser-signed withdrawal intent and poll for completion\")\n .requiredOption(\"--to <address>\", \"Recipient EVM wallet address\", parseWalletAddress)\n .requiredOption(\"--amount <amount>\", \"Amount to withdraw\", parsePositiveNumber)\n .option(\"--asset <asset>\", \"Source asset; currently only pUSD is supported\", \"pUSD\")\n .option(\"--to-chain-id <id>\", \"Destination chain id\", \"137\")\n .option(\"--to-token-address <address>\", \"Destination token address\", parseWalletAddress, POLYGON_NATIVE_USDC)\n .option(\"--no-open\", \"Do not open the browser signing URL\")\n .option(\"--no-wait\", \"Do not poll for completion after creating the intent\")\n .option(\"--poll-interval <seconds>\", \"Polling interval in seconds\", parsePositiveNumber, 5)\n .option(\"--timeout <seconds>\", \"Maximum seconds to wait for completion\", parsePositiveNumber, 600)\n .action(async (opts: WithdrawOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const created = await client.post<WalletWithdrawIntentResponse>(\n \"/api/wallet/withdraw/intents\",\n buildWithdrawRequestPayload(opts),\n );\n let intent = created.intent;\n if (opts.open !== false) {\n openBrowser(intent.signingUrl);\n }\n if (opts.wait !== false) {\n intent = await pollWithdrawalIntent(client, intent.id, {\n timeoutSeconds: opts.timeout ?? 600,\n intervalSeconds: opts.pollInterval ?? 5,\n jsonMode: Boolean(globalOpts.json),\n });\n }\n if (globalOpts.json) {\n out.json(intent);\n return;\n } else {\n displayWithdrawIntent(intent);\n }\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displaySignalAnalysis } from \"../signal-display.js\";\nimport type {\n GlobalOptions,\n SignalAnalysisApiResponse,\n SignalAnalysisRequest,\n SignalMarketInput,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface SignalAnalyzeOpts {\n url?: string[];\n market?: string;\n context?: string;\n question?: string;\n description?: string;\n yesProb?: number;\n noProb?: number;\n slug?: string;\n link?: string;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction collect(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function parseProbability(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0 || n > 100) {\n throw new InvalidArgumentError(\"Expected a probability between 0 and 100\");\n }\n return n;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nasync function readMarketPayload(path: string | undefined): Promise<{\n market?: SignalMarketInput;\n markets?: SignalMarketInput[];\n}> {\n if (!path) return {};\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) {\n return { markets: parsed as SignalMarketInput[] };\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as { markets?: unknown }).markets)) {\n return { markets: (parsed as { markets: SignalMarketInput[] }).markets };\n }\n if (parsed && typeof parsed === \"object\" && (parsed as { market?: unknown }).market) {\n return { market: (parsed as { market: SignalMarketInput }).market };\n }\n if (parsed && typeof parsed === \"object\") {\n return { market: parsed as SignalMarketInput };\n }\n throw new Error(\"Market JSON must be an object, an array, or { market | markets }\");\n}\n\nfunction inlineMarketFromOptions(opts: SignalAnalyzeOpts): SignalMarketInput | undefined {\n const market: SignalMarketInput = {};\n if (opts.question) market.question = opts.question;\n if (opts.description) market.description = opts.description;\n if (opts.yesProb !== undefined) market.yesPrice = opts.yesProb;\n if (opts.noProb !== undefined) market.noPrice = opts.noProb;\n if (opts.slug) market.slug = opts.slug;\n if (opts.link) market.link = opts.link;\n return Object.keys(market).length > 0 ? market : undefined;\n}\n\nexport async function buildSignalPayload(\n positionalUrl: string | undefined,\n opts: SignalAnalyzeOpts,\n): Promise<SignalAnalysisRequest> {\n const urls = [positionalUrl, ...(opts.url ?? [])].filter(\n (value): value is string => Boolean(value),\n );\n const filePayload = await readMarketPayload(opts.market);\n const inlineMarket = inlineMarketFromOptions(opts);\n const hasMarketInput = Boolean(filePayload.market || filePayload.markets || inlineMarket);\n\n if (urls.length > 0 && hasMarketInput) {\n throw new Error(\"Use either URL input or market JSON/options, not both.\");\n }\n if (filePayload.market && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (filePayload.markets && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (urls.length === 0 && !hasMarketInput) {\n throw new Error(\"Provide a Polymarket URL or a market payload.\");\n }\n\n const payload: SignalAnalysisRequest =\n urls.length === 1\n ? { url: urls[0] }\n : urls.length > 1\n ? { urls }\n : filePayload.market\n ? { market: filePayload.market }\n : filePayload.markets\n ? { markets: filePayload.markets }\n : { market: inlineMarket };\n\n if (opts.context) {\n payload.previous_analysis_context = opts.context;\n }\n return payload;\n}\n\nasync function runSignalAnalysis(\n client: ApiClient,\n payload: SignalAnalysisRequest,\n): Promise<SignalAnalysisApiResponse> {\n return client.post<SignalAnalysisApiResponse>(\"/api/signal/analyze\", payload);\n}\n\nexport function registerSignalCommands(program: Command): void {\n const signal = program\n .command(\"signal\")\n .description(\"Analyze Polymarket probability gaps with the signal agent\");\n\n signal\n .command(\"analyze\")\n .description(\"Estimate true YES probability and compare it with market pricing\")\n .argument(\"[url]\", \"Polymarket market/event URL to analyze\")\n .option(\"--url <url>\", \"Additional Polymarket URL; repeat for multiple markets\", collect, [])\n .option(\"--market <file>\", \"Inline market JSON object/array; use '-' to read stdin\")\n .option(\"--context <text>\", \"Prior search notes or analysis context for the agent\")\n .option(\"--question <text>\", \"Inline market question when not using a URL\")\n .option(\"--description <text>\", \"Inline market description or resolution criteria\")\n .option(\"--yes-prob <prob>\", \"Current YES probability or price, e.g. 0.52 or 52\", parseProbability)\n .option(\"--no-prob <prob>\", \"Current NO probability or price, e.g. 0.48 or 48\", parseProbability)\n .option(\"--slug <slug>\", \"Inline market slug\")\n .option(\"--link <url>\", \"Inline market link\")\n .action(async (url: string | undefined, o: SignalAnalyzeOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n let payload: SignalAnalysisRequest;\n try {\n payload = await buildSignalPayload(url, o);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n if (!globalOpts.json) {\n process.stderr.write(out.dim(\" Running signal analysis...\\n\"));\n }\n\n const result = await runSignalAnalysis(client, payload);\n displaySignalAnalysis(result, globalOpts);\n });\n}\n","import chalk from \"chalk\";\nimport type {\n GlobalOptions,\n SignalAnalysis,\n SignalAnalysisApiResponse,\n SignalAnalysisItem,\n SignalAnalysisResult,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction pctFromSignalValue(value: number | null | undefined): number | null {\n if (value === null || value === undefined || Number.isNaN(value)) return null;\n return Math.abs(value) <= 1 ? value * 100 : value;\n}\n\nfunction formatProbability(value: number | null | undefined): string {\n const pct = pctFromSignalValue(value);\n return pct === null ? \"n/a\" : `${pct.toFixed(1)}%`;\n}\n\nfunction formatGap(value: number | null | undefined): string {\n if (value === null || value === undefined || Number.isNaN(value)) return \"n/a\";\n const points = Math.abs(value) <= 1 ? value * 100 : value;\n const formatted = `${points >= 0 ? \"+\" : \"\"}${points.toFixed(1)}pp`;\n if (points > 0) return chalk.green(formatted);\n if (points < 0) return chalk.red(formatted);\n return chalk.dim(formatted);\n}\n\nfunction formatStrength(value: string | undefined): string {\n if (value === \"strong\") return chalk.green(\"strong\");\n if (value === \"weak\") return chalk.yellow(\"weak\");\n return value ? chalk.dim(value) : \"n/a\";\n}\n\nfunction analysisItems(result: SignalAnalysisResult | undefined): SignalAnalysisItem[] {\n if (!result) return [];\n if (result.analysis) return [result];\n return result.analyses ?? [];\n}\n\nfunction titleFor(analysis: SignalAnalysis): string {\n return analysis.market_name || analysis.market_slug || \"market\";\n}\n\nexport function displaySignalAnalysis(\n response: SignalAnalysisApiResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(response);\n return;\n }\n\n if (response.error) {\n out.error(response.error);\n return;\n }\n\n const result = response.result;\n if (result?.error) {\n out.error(result.error);\n return;\n }\n\n const items = analysisItems(result);\n if (items.length === 0) {\n out.warn(\"No signal analysis returned.\");\n return;\n }\n\n out.heading(\n items.length === 1\n ? \"Signal Analysis\"\n : `Signal Analysis — ${items.length} markets`,\n );\n\n const rows = items.map((item) => {\n const analysis = item.analysis ?? {};\n return [\n out.truncate(titleFor(analysis), 44),\n formatProbability(analysis.current_yes_prob),\n formatProbability(analysis.predicted_prob),\n formatGap(analysis.probability_gap),\n formatStrength(analysis.signal_strength),\n analysis.confidence ?? \"n/a\",\n ];\n });\n out.table(rows, [\"Market\", \"Market YES\", \"Agent YES\", \"Gap\", \"Signal\", \"Conf\"]);\n\n for (const item of items.slice(0, 3)) {\n const analysis = item.analysis;\n if (!analysis) continue;\n process.stdout.write(\"\\n \" + chalk.bold(out.truncate(titleFor(analysis), 76)) + \"\\n\");\n if (analysis.market_link) {\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + analysis.market_link + \"\\n\");\n }\n if (analysis.key_factors && analysis.key_factors.length > 0) {\n process.stdout.write(\" \" + chalk.dim(\"Key factors: \") + analysis.key_factors.slice(0, 4).join(\"; \") + \"\\n\");\n }\n if (analysis.research_findings) {\n process.stdout.write(\n \" \" + chalk.dim(\"Research: \") + out.truncate(analysis.research_findings, 180) + \"\\n\",\n );\n }\n }\n\n if (items.length > 3) {\n process.stdout.write(chalk.dim(`\\n ... and ${items.length - 3} more\\n`));\n }\n\n if (result?.strong_signal_count !== undefined) {\n process.stdout.write(\n chalk.dim(`\\n Strong signals: ${result.strong_signal_count}\\n`),\n );\n }\n}\n"],"mappings":"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","names":["Command","program","chalk","error","program","chalk","program","requireAuth","readline","chalk","chalk","chalk","program","requireAuth","chalk","readline","requireAuth","warn","program","InvalidArgumentError","writeFile","chalk","chalk","num","chalk","num","signedCurrency","chalk","requireAuth","InvalidArgumentError","writeFile","program","InvalidArgumentError","requireAuth","parsePositiveNumber","InvalidArgumentError","program","InvalidArgumentError","readFile","chalk","chalk","requireAuth","InvalidArgumentError","readStdin","readMarketPayload","readFile","program","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/config.ts","../src/client.ts","../src/output.ts","../src/commands/brief.ts","../src/stream.ts","../src/commands/profile.ts","../src/commands/research.ts","../src/feed-display.ts","../src/commands/feed.ts","../src/commands/lp.ts","../src/allocator-display.ts","../src/commands/allocator.ts","../src/commands/signal.ts","../src/signal-display.ts","../src/commands/quote.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerBriefCommands } from \"./commands/brief.js\";\n\nimport { registerProfileCommand } from \"./commands/profile.js\";\nimport { registerResearchCommands } from \"./commands/research.js\";\nimport { registerFeedCommand } from \"./commands/feed.js\";\nimport { registerLpCommands } from \"./commands/lp.js\";\nimport { registerSignalCommands } from \"./commands/signal.js\";\nimport { registerQuoteCommand } from \"./commands/quote.js\";\nimport * as out from \"./output.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"hl\")\n .description(\"Hedge Layer CLI — prediction market intelligence from the terminal\")\n .version(__VERSION__)\n .option(\"--json\", \"Output as JSON (machine-readable)\")\n .option(\"--api-url <url>\", \"Override API base URL\")\n .option(\"--token <token>\", \"Override stored API token\")\n .option(\"--verbose\", \"Show HTTP request details\")\n .option(\"--no-color\", \"Disable colored output\");\n\nregisterAuthCommands(program);\nregisterBriefCommands(program);\n\nregisterProfileCommand(program);\nregisterResearchCommands(program);\nregisterFeedCommand(program);\nregisterLpCommands(program);\nregisterSignalCommands(program);\nregisterQuoteCommand(program);\n\nprogram.hook(\"preAction\", (_thisCommand, actionCommand) => {\n const opts = program.opts();\n if (opts.color === false) {\n process.env.FORCE_COLOR = \"0\";\n }\n if (opts.verbose) {\n const cmdName = actionCommand.name();\n process.stderr.write(out.dim(`[verbose] Running: hl ${cmdName}\\n`));\n }\n});\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) {\n out.error(e.message);\n } else {\n out.error(`Unexpected error: ${e instanceof Error ? e.message : String(e)}`);\n if (program.opts().verbose) {\n console.error(e);\n }\n }\n process.exit(1);\n }\n}\n\nmain();\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport { loadConfig, saveConfig, clearConfig, configPath, DEFAULT_API_URL } from \"../config.js\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command(\"auth\").description(\"Manage API authentication\");\n\n auth\n .command(\"login\")\n .description(\"Authenticate with a Hedge Layer API token\")\n .option(\"--api-url <url>\", \"API base URL\", DEFAULT_API_URL)\n .action(async (cmdOpts: { apiUrl?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n try {\n out.heading(\"Hedge Layer CLI — Login\");\n process.stderr.write(\n `Create an API token at ${out.bold(\"https://hedgelayer.ai/account/settings\")} → API Tokens\\n\\n`,\n );\n\n const token = (await rl.question(\"Paste your API token: \")).trim();\n\n if (!token.startsWith(\"hl_\") || token.length !== 43) {\n out.error('Invalid token format. Tokens start with \"hl_\" and are 43 characters.');\n process.exit(1);\n }\n\n const apiUrl = globalOpts.apiUrl ?? cmdOpts.apiUrl ?? DEFAULT_API_URL;\n const client = new ApiClient({ token, apiUrl });\n\n process.stderr.write(\"\\nValidating token...\");\n let profile: UserProfile;\n try {\n profile = await client.get<UserProfile>(\"/api/profile\");\n } catch {\n process.stderr.write(\"\\n\");\n out.error(\"Token validation failed. Check your token and try again.\");\n process.exit(1);\n }\n process.stderr.write(\" done\\n\\n\");\n\n saveConfig({ api_url: apiUrl, token });\n\n out.success(`Logged in as ${out.bold(profile.handle || profile.user_id)}`);\n process.stderr.write(` Config saved to ${out.dim(configPath())}\\n`);\n } finally {\n rl.close();\n }\n });\n\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const config = loadConfig();\n const token = globalOpts.token ?? config.token;\n\n if (!token) {\n out.warn(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" to authenticate.\");\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n\n try {\n const profile = await client.get<UserProfile>(\"/api/profile\");\n if (globalOpts.json) {\n out.json({\n authenticated: true,\n handle: profile.handle,\n user_id: profile.user_id,\n api_url: client.apiUrl,\n });\n } else {\n out.heading(\"Auth Status\");\n out.table(\n [\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"API URL\", client.apiUrl],\n [\"Config\", configPath()],\n ],\n );\n }\n } catch {\n out.error(\"Token is invalid or expired. Run \" + out.bold(\"hl auth login\") + \" to re-authenticate.\");\n process.exit(1);\n }\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored API token\")\n .action(() => {\n clearConfig();\n out.success(\"Logged out. Token removed from \" + out.dim(configPath()));\n });\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CONFIG_DIR = join(homedir(), \".hedgelayer\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport const DEFAULT_API_URL = \"https://hedgelayer.ai\";\n\nexport interface Config {\n api_url: string;\n token: string | null;\n}\n\nfunction defaultConfig(): Config {\n return { api_url: DEFAULT_API_URL, token: null };\n}\n\nexport function loadConfig(): Config {\n try {\n if (!existsSync(CONFIG_FILE)) return defaultConfig();\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw);\n return {\n api_url: parsed.api_url ?? DEFAULT_API_URL,\n token: parsed.token ?? null,\n };\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfig(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function clearConfig(): void {\n try {\n if (existsSync(CONFIG_FILE)) unlinkSync(CONFIG_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function configPath(): string {\n return CONFIG_FILE;\n}\n","import type { GlobalOptions } from \"./types.js\";\nimport { loadConfig, DEFAULT_API_URL } from \"./config.js\";\n\nexport class ApiClient {\n private baseUrl: string;\n private token: string | null;\n private verbose: boolean;\n\n constructor(opts: GlobalOptions = {}) {\n const config = loadConfig();\n this.baseUrl = (opts.apiUrl ?? config.api_url ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.token = opts.token ?? config.token ?? null;\n this.verbose = opts.verbose ?? false;\n }\n\n get isAuthenticated(): boolean {\n return this.token !== null;\n }\n\n get apiUrl(): string {\n return this.baseUrl;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n const h: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n if (this.token) {\n h[\"Authorization\"] = `Bearer ${this.token}`;\n }\n return h;\n }\n\n private log(method: string, path: string, status?: number): void {\n if (!this.verbose) return;\n const statusStr = status ? ` → ${status}` : \"\";\n process.stderr.write(`[verbose] ${method} ${this.baseUrl}${path}${statusStr}\\n`);\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== \"\") url.searchParams.set(k, v);\n }\n }\n\n this.log(\"GET\", `${url.pathname}${url.search}`);\n const res = await fetch(url.toString(), { headers: this.headers() });\n this.log(\"GET\", `${url.pathname}${url.search}`, res.status);\n\n if (!res.ok) {\n const body = await res.text();\n throw new ApiError(res.status, body);\n }\n return res.json() as Promise<T>;\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n this.log(\"POST\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n /**\n * POST /api/brief with stream: false — returns the Market Brief JSON body\n * plus optional telemetry from response headers.\n */\n async postBriefSync(query: string): Promise<{\n brief: Record<string, unknown>;\n durationMs: number | null;\n stepsCompleted: number | null;\n toolsUsed: string[];\n }> {\n const path = \"/api/brief\";\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({ query, stream: false }),\n });\n this.log(\"POST\", path, res.status);\n\n const text = await res.text();\n if (!res.ok) {\n throw new ApiError(res.status, text);\n }\n\n let brief: Record<string, unknown>;\n try {\n brief = JSON.parse(text) as Record<string, unknown>;\n } catch {\n throw new ApiError(res.status, text || \"Invalid JSON from /api/brief\");\n }\n\n const dur = res.headers.get(\"X-Duration-Ms\");\n const steps = res.headers.get(\"X-Steps-Completed\");\n const tools = res.headers.get(\"X-Tools-Used\");\n\n return {\n brief,\n durationMs: dur != null ? Number(dur) : null,\n stepsCompleted: steps != null ? Number(steps) : null,\n toolsUsed: tools ? tools.split(\",\").filter(Boolean) : [],\n };\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n this.log(\"PATCH\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n this.log(\"PATCH\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n async delete(path: string): Promise<void> {\n this.log(\"DELETE\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"DELETE\",\n headers: this.headers(),\n });\n this.log(\"DELETE\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n }\n\n async stream(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (stream)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"text/event-stream\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (stream)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n\n async streamNdjson(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (ndjson)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"application/x-ndjson\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (ndjson)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n let msg: string;\n try {\n const parsed = JSON.parse(body);\n msg = parsed.error ?? parsed.message ?? body;\n } catch {\n msg = body;\n }\n super(`API error ${status}: ${msg}`);\n this.name = \"ApiError\";\n }\n}\n","import chalk from \"chalk\";\n\nexport function json(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, stripAnsi(row[i]).length);\n }\n }\n\n for (let r = 0; r < allRows.length; r++) {\n const row = allRows[r];\n const padded = row.map((cell, i) => {\n const bare = stripAnsi(cell);\n const pad = colWidths[i] - bare.length;\n return cell + \" \".repeat(Math.max(0, pad));\n });\n process.stdout.write(\" \" + padded.join(\" \") + \"\\n\");\n\n if (r === 0 && headers) {\n const sep = colWidths.map((w) => \"─\".repeat(w)).join(\"──\");\n process.stdout.write(\" \" + sep + \"\\n\");\n }\n }\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport function heading(text: string): void {\n process.stdout.write(\"\\n\" + chalk.bold(text) + \"\\n\\n\");\n}\n\nexport function success(text: string): void {\n process.stdout.write(chalk.green(\"✓\") + \" \" + text + \"\\n\");\n}\n\nexport function warn(text: string): void {\n process.stdout.write(chalk.yellow(\"⚠\") + \" \" + text + \"\\n\");\n}\n\nexport function error(text: string): void {\n process.stderr.write(chalk.red(\"✗\") + \" \" + text + \"\\n\");\n}\n\nexport function dim(text: string): string {\n return chalk.dim(text);\n}\n\nexport function bold(text: string): string {\n return chalk.bold(text);\n}\n\nexport function currency(n: number): string {\n return \"$\" + n.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n}\n\nexport function compactCurrency(n: number): string {\n if (!n || isNaN(n)) return \"$0\";\n if (n >= 1_000_000) return `$${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `$${(n / 1_000).toFixed(1)}K`;\n return `$${n.toFixed(0)}`;\n}\n\nexport function percent(n: number): string {\n return (n * 100).toFixed(1) + \"%\";\n}\n\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nexport function relativeTime(date: string): string {\n const diff = Date.now() - new Date(date).getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseNdjsonStream } from \"../stream.js\";\nimport type { MarketBrief, BriefRequest, BriefRequestFilters, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerBriefCommands(program: Command): void {\n program\n .command(\"brief <query>\")\n .description(\"Generate a Market Brief for a topic (non-interactive)\")\n .option(\"-l, --location <location>\", \"Geographic context (e.g. 'Middle East', 'US')\")\n .option(\"-t, --time-horizon <horizon>\", \"Time frame (e.g. '3 months', '2026')\")\n .option(\"--tags <tags>\", \"Comma-separated focus area tags (e.g. 'geopolitics,energy')\")\n .option(\"--min-volume <n>\", \"Minimum market volume in USD\", parseFloat)\n .option(\"--max-yes-price <n>\", \"Maximum YES price (0-1)\", parseFloat)\n .action(async (query: string, cmdOpts: BriefCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const filters = buildFilters(cmdOpts);\n const body: BriefRequest = {\n query,\n ...(cmdOpts.location && { location: cmdOpts.location }),\n ...(cmdOpts.timeHorizon && { timeHorizon: cmdOpts.timeHorizon }),\n ...(filters && { filters }),\n stream: true,\n };\n\n await runStreaming(client, body, globalOpts);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Command option types\n// ---------------------------------------------------------------------------\n\ninterface BriefCmdOpts {\n location?: string;\n timeHorizon?: string;\n tags?: string;\n minVolume?: number;\n maxYesPrice?: number;\n}\n\nfunction buildFilters(opts: BriefCmdOpts): BriefRequestFilters | undefined {\n const tags = opts.tags?.split(\",\").map((t) => t.trim()).filter(Boolean);\n const hasFilters = opts.minVolume != null || opts.maxYesPrice != null || (tags && tags.length > 0);\n if (!hasFilters) return undefined;\n return {\n ...(opts.minVolume != null && { minVolume: opts.minVolume }),\n ...(opts.maxYesPrice != null && { maxYesPrice: opts.maxYesPrice }),\n ...(tags && tags.length > 0 && { tags }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming mode (default)\n// ---------------------------------------------------------------------------\n\nasync function runStreaming(client: ApiClient, body: BriefRequest, globalOpts: GlobalOptions): Promise<void> {\n const startTime = Date.now();\n process.stderr.write(chalk.dim(` Generating brief for \"${out.truncate(body.query, 50)}\"...\\n`));\n\n const stream = await client.streamNdjson(\"/api/brief\", body);\n const result = await parseNdjsonStream(stream, {\n onProgress: (step, message) => {\n process.stderr.write(chalk.dim(` [${step}] `) + message + \"\\n\");\n },\n });\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n\n if (result.error) {\n out.error(`Brief failed (${result.error.code}): ${result.error.message}`);\n process.exit(1);\n }\n\n if (!result.brief) {\n out.error(\"No Market Brief was produced.\");\n process.exit(1);\n }\n\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n displayBrief(result.brief as unknown as MarketBrief, globalOpts);\n}\n\n// ---------------------------------------------------------------------------\n// Display\n// ---------------------------------------------------------------------------\n\nfunction displayBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n const marketCount = brief.marketCount ?? brief.markets.length;\n process.stdout.write(\"\\n \" + chalk.dim(`${marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","/**\n * Parses the Vercel AI SDK UI Message Stream protocol (SSE format).\n *\n * The server sends Server-Sent Events where each `data:` line contains\n * a JSON object with a `type` field:\n * text-delta: { type, id, delta }\n * tool-input-start: { type, toolCallId, toolName }\n * tool-input-delta: { type, toolCallId, inputTextDelta }\n * tool-input-available: { type, toolCallId, toolName, input }\n * tool-output-available:{ type, toolCallId, output }\n * error: { type, errorText }\n * [DONE]: stream termination sentinel\n */\n\nexport interface StreamCallbacks {\n onText?: (text: string) => void;\n onToolCall?: (name: string, args: unknown) => void;\n onToolResult?: (name: string, result: unknown) => void;\n}\n\nexport interface StreamResult {\n assistantText: string;\n toolCalls: Array<{ name: string; args: unknown }>;\n marketBrief: Record<string, unknown> | null;\n feedResult: Record<string, unknown> | null;\n}\n\nexport async function parseStream(\n body: ReadableStream<Uint8Array>,\n callbacks: StreamCallbacks = {},\n): Promise<StreamResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let assistantText = \"\";\n const toolCalls: Array<{ name: string; args: unknown }> = [];\n const activeToolCalls = new Map<string, { name: string; argStr: string }>();\n let marketBrief: Record<string, unknown> | null = null;\n let feedResult: Record<string, unknown> | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\":\")) continue;\n\n if (!trimmed.startsWith(\"data:\")) continue;\n const payload = trimmed.slice(5).trim();\n\n if (payload === \"[DONE]\") continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(payload);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"text-delta\": {\n const delta = msg.delta as string;\n if (delta) {\n assistantText += delta;\n callbacks.onText?.(delta);\n }\n break;\n }\n\n case \"tool-input-start\": {\n const id = msg.toolCallId as string;\n const name = msg.toolName as string;\n if (id && name) {\n activeToolCalls.set(id, { name, argStr: \"\" });\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n active.argStr += msg.inputTextDelta as string;\n }\n break;\n }\n\n case \"tool-input-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n const args = msg.input ?? active.argStr;\n toolCalls.push({ name: active.name, args });\n callbacks.onToolCall?.(active.name, args);\n }\n break;\n }\n\n case \"tool-output-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n callbacks.onToolResult?.(active.name, msg.output);\n if (active.name === \"buildMarketBrief\" && isMarketBrief(msg.output)) {\n marketBrief = msg.output as Record<string, unknown>;\n }\n if (active.name === \"getFeed\" && isFeedResult(msg.output)) {\n feedResult = msg.output as Record<string, unknown>;\n }\n activeToolCalls.delete(id);\n }\n break;\n }\n\n case \"error\": {\n throw new Error((msg.errorText as string) ?? \"Unknown stream error\");\n }\n }\n }\n\n if (done) break;\n }\n\n return { assistantText, toolCalls, marketBrief, feedResult };\n}\n\nfunction isMarketBrief(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"title\" in (val as Record<string, unknown>) &&\n \"markets\" in (val as Record<string, unknown>)\n );\n}\n\nfunction isFeedResult(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"markets\" in (val as Record<string, unknown>) &&\n \"sortedBy\" in (val as Record<string, unknown>)\n );\n}\n\n// ---------------------------------------------------------------------------\n// NDJSON stream parser (for POST /api/brief)\n// ---------------------------------------------------------------------------\n\nexport interface NdjsonCallbacks {\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface NdjsonBriefResult {\n brief: Record<string, unknown> | null;\n error: { code: string; message: string } | null;\n}\n\n/**\n * Parses an NDJSON stream from the /api/brief endpoint.\n *\n * Each line is a JSON object with a `type` field:\n * progress: { type, step, message }\n * brief: { type, data: MarketBrief }\n * error: { type, code, message }\n */\nexport async function parseNdjsonStream(\n body: ReadableStream<Uint8Array>,\n callbacks: NdjsonCallbacks = {},\n): Promise<NdjsonBriefResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let brief: Record<string, unknown> | null = null;\n let error: { code: string; message: string } | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(trimmed);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"progress\": {\n callbacks.onProgress?.(msg.step as string, msg.message as string);\n break;\n }\n case \"brief\": {\n brief = msg.data as Record<string, unknown>;\n break;\n }\n case \"error\": {\n error = {\n code: msg.code as string,\n message: msg.message as string,\n };\n break;\n }\n }\n }\n\n if (done) break;\n }\n\n return { brief, error };\n}\n","import { Command } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerProfileCommand(program: Command): void {\n program\n .command(\"profile\")\n .description(\"Show your user profile\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const profile = await client.get<UserProfile>(\"/api/profile\");\n\n if (globalOpts.json) {\n out.json(profile);\n return;\n }\n\n out.heading(\"Profile\");\n out.table([\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"Created\", new Date(profile.created_at).toLocaleDateString()],\n ]);\n });\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseStream } from \"../stream.js\";\nimport type { Assessment, MarketBrief, FeedResult, GlobalOptions } from \"../types.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport * as out from \"../output.js\";\n\nexport function registerResearchCommands(program: Command): void {\n const research = program.command(\"research\").description(\"AI-powered market research\");\n\n research\n .command(\"start\", { isDefault: true })\n .description(\"Start an interactive market research session\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const { id } = await client.post<{ id: string }>(\"/api/assessments\");\n\n out.heading(\"Market Research\");\n process.stderr.write(\n chalk.dim(\" Describe a topic or thesis to explore. Type /quit to exit.\\n\\n\"),\n );\n\n let msgCounter = 0;\n const uiMsg = (role: string, content: string) => ({\n id: `msg-${++msgCounter}`,\n role,\n content,\n parts: [{ type: \"text\" as const, text: content }],\n });\n\n const messages: ReturnType<typeof uiMsg>[] = [];\n let firstMessageTs: number | null = null;\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n\n try {\n while (true) {\n const userInput = await rl.question(chalk.cyan(\"You: \"));\n if (!userInput.trim()) continue;\n if (userInput.trim() === \"/quit\") break;\n\n if (firstMessageTs === null) firstMessageTs = Date.now();\n messages.push(uiMsg(\"user\", userInput));\n\n process.stderr.write(chalk.dim(\"\\nAssistant: \"));\n\n try {\n const body = await client.stream(\"/api/chat\", {\n messages,\n assessmentId: id,\n });\n\n const result = await parseStream(body, {\n onText: (text) => process.stderr.write(text),\n onToolCall: (name) => {\n process.stderr.write(chalk.dim(`\\n [tool: ${name}]\\n`));\n },\n onToolResult: (name, toolResult) => {\n if (globalOpts.verbose) {\n process.stderr.write(chalk.dim(` [result: ${name}] ${JSON.stringify(toolResult).slice(0, 200)}\\n`));\n }\n },\n });\n\n process.stderr.write(\"\\n\\n\");\n\n if (result.assistantText) {\n messages.push(uiMsg(\"assistant\", result.assistantText));\n }\n\n try {\n await persistAssessment(client, id, messages, result.marketBrief, firstMessageTs);\n } catch (persistErr) {\n out.warn(\n `Could not save session: ${persistErr instanceof Error ? persistErr.message : String(persistErr)}`,\n );\n }\n\n if (result.feedResult) {\n displayFeedResult(result.feedResult as unknown as FeedResult, globalOpts);\n }\n\n if (result.marketBrief) {\n displayMarketBrief(result.marketBrief as unknown as MarketBrief, globalOpts);\n break;\n }\n } catch (e) {\n process.stderr.write(\"\\n\");\n out.error(`Chat error: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n } finally {\n rl.close();\n }\n });\n\n research\n .command(\"run <query>\")\n .description(\"Run research on a topic and return the final Market Brief as JSON (via /api/brief)\")\n .action(async (query: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n process.stderr.write(chalk.dim(` Researching \"${out.truncate(query, 60)}\"...\\n`));\n const startTime = Date.now();\n\n const { brief, durationMs, stepsCompleted, toolsUsed } = await client.postBriefSync(query);\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n\n const looksLikeBrief =\n brief &&\n typeof brief === \"object\" &&\n Array.isArray((brief as { markets?: unknown }).markets) &&\n typeof (brief as { title?: unknown }).title === \"string\";\n\n if (looksLikeBrief) {\n out.json(brief as unknown as MarketBrief);\n } else {\n process.stderr.write(chalk.yellow(\"No market brief was produced.\\n\"));\n out.json({\n brief: null,\n text: null,\n metadata: {\n model: \"\",\n stepsUsed: stepsCompleted ?? 0,\n toolsUsed,\n durationMs: durationMs ?? Date.now() - startTime,\n },\n raw: brief,\n });\n }\n });\n\n research\n .command(\"list\")\n .description(\"List past research sessions\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .action(async (cmdOpts: { status?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params: Record<string, string> = { list: \"true\" };\n if (cmdOpts.status) params.status = cmdOpts.status;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", params);\n\n if (globalOpts.json) {\n out.json(data.assessments);\n return;\n }\n\n if (data.assessments.length === 0) {\n out.warn(\"No research sessions found.\");\n return;\n }\n\n out.heading(`Research Sessions (${data.assessments.length})`);\n\n const rows = data.assessments.map((a) => {\n const status = formatStatus(a.status);\n const brief = a.market_brief?.title ?? \"—\";\n const markets = a.market_brief ? String(a.market_brief.marketCount) : \"—\";\n return [a.id.slice(0, 8), status, out.truncate(brief, 30), markets, out.relativeTime(a.created_at)];\n });\n\n out.table(rows, [\"ID\", \"Status\", \"Brief\", \"Markets\", \"Created\"]);\n });\n\n research\n .command(\"show <id>\")\n .description(\"Show research session details (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n const assessment = await client.get<Assessment>(`/api/assessments/${fullId}`);\n\n if (globalOpts.json) {\n out.json(assessment);\n return;\n }\n\n out.heading(\"Research Session \" + out.dim(assessment.id.slice(0, 8)));\n\n out.table([\n [\"Status\", formatStatus(assessment.status)],\n [\"Created\", new Date(assessment.created_at).toLocaleString()],\n [\"Updated\", new Date(assessment.updated_at).toLocaleString()],\n ]);\n\n if (assessment.market_brief) {\n displayMarketBrief(assessment.market_brief, globalOpts);\n }\n });\n\n research\n .command(\"delete <id>\")\n .description(\"Delete a research session (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n await client.delete(`/api/assessments/${fullId}`);\n out.success(\"Research session deleted.\");\n });\n}\n\n/** Matches a full assessment UUID (e.g. 7f4fdace-a4b2-428d-87f1-fbf715165776). */\nconst FULL_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Resolve a user-supplied session identifier (a full UUID or the short 8-char\n * prefix printed by `hl research list`) against a set of known assessment IDs.\n *\n * Pure and synchronous so it can be unit-tested without network access.\n */\nexport function matchAssessmentId(idOrPrefix: string, ids: string[]): string {\n const needle = idOrPrefix.trim().toLowerCase();\n if (!needle) {\n throw new Error(\"No research session ID provided.\");\n }\n\n // Exact match wins outright (covers full UUIDs present in the list).\n const exact = ids.find((id) => id.toLowerCase() === needle);\n if (exact) return exact;\n\n const matches = ids.filter((id) => id.toLowerCase().startsWith(needle));\n if (matches.length === 1) return matches[0];\n\n if (matches.length === 0) {\n throw new Error(\n `No research session found matching \"${idOrPrefix}\". Run \\`hl research list\\` to see available sessions.`,\n );\n }\n\n const shortIds = matches.map((id) => id.slice(0, 8)).join(\", \");\n throw new Error(\n `\"${idOrPrefix}\" matches ${matches.length} research sessions (${shortIds}). Use a longer ID prefix to disambiguate.`,\n );\n}\n\n/**\n * Turn a full UUID or short ID prefix into the full assessment UUID.\n * Full UUIDs are returned directly (no extra API call); short prefixes are\n * resolved by listing the user's sessions and matching.\n */\nexport async function resolveAssessmentId(client: ApiClient, idOrPrefix: string): Promise<string> {\n const trimmed = idOrPrefix.trim();\n if (FULL_UUID.test(trimmed)) return trimmed;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", { list: \"true\" });\n return matchAssessmentId(\n trimmed,\n data.assessments.map((a) => a.id),\n );\n}\n\n/**\n * Resolve a session ID for a CLI action, printing a clean error and exiting on\n * an ambiguous/unknown identifier instead of surfacing it as an unexpected error.\n */\nasync function resolveOrExit(client: ApiClient, idOrPrefix: string): Promise<string> {\n try {\n return await resolveAssessmentId(client, idOrPrefix);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) throw e;\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n\n/** Mirrors web ChatInterface assessment PATCH (simplified metadata without tool-part extraction). */\nfunction buildAssessmentPatch(\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Record<string, unknown> {\n const patch: Record<string, unknown> = { messages };\n const meta: Record<string, unknown> = {\n timeToBriefMs: null,\n searchQueries: [],\n searchResultCounts: [],\n coverageHit: false,\n completedAt: null,\n };\n\n if (\n marketBrief &&\n typeof marketBrief === \"object\" &&\n Array.isArray((marketBrief as { markets?: unknown }).markets)\n ) {\n const markets = (marketBrief as { markets: unknown[] }).markets;\n patch.market_brief = marketBrief;\n patch.status = \"completed\";\n meta.timeToBriefMs = firstMessageTs != null ? Date.now() - firstMessageTs : null;\n meta.coverageHit = markets.length > 0;\n meta.completedAt = new Date().toISOString();\n }\n\n patch.metadata = meta;\n return patch;\n}\n\nasync function persistAssessment(\n client: ApiClient,\n assessmentId: string,\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Promise<void> {\n await client.patch(`/api/assessments/${assessmentId}`, buildAssessmentPatch(messages, marketBrief, firstMessageTs));\n}\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"in_progress\":\n return chalk.yellow(status);\n case \"abandoned\":\n return chalk.red(status);\n default:\n return status;\n }\n}\n\nfunction displayMarketBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n process.stdout.write(\"\\n \" + chalk.dim(`${brief.marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n","import chalk from \"chalk\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"./types.js\";\nimport * as out from \"./output.js\";\n\nconst SORT_LABELS: Record<string, string> = {\n score: \"attention score\",\n volume: \"24h volume\",\n liquidity: \"liquidity\",\n movement: \"price movement\",\n spread: \"spread tightness\",\n recency: \"recency\",\n extremity: \"uncertainty\",\n rewards: \"rewards\",\n rewardYield: \"reward yield (per $ liq)\",\n lpExpectedReturn: \"LP expected return\",\n horizon: \"time to resolution\",\n};\n\nfunction scoreBar(score: number): string {\n const width = 15;\n const filled = Math.round((score / 100) * width);\n const empty = width - filled;\n const color = score >= 70 ? chalk.green : score >= 45 ? chalk.yellow : chalk.dim;\n return color(\"█\".repeat(filled)) + chalk.dim(\"░\".repeat(empty)) + ` ${Math.round(score)}`;\n}\n\nexport function displayFeedResult(feed: FeedResult, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(feed);\n return;\n }\n\n const sortLabel = SORT_LABELS[feed.sortedBy] ?? feed.sortedBy;\n out.heading(`Market Feed — ${feed.marketsReturned} markets by ${sortLabel}`);\n process.stdout.write(\n chalk.dim(\n ` ${feed.totalScanned.toLocaleString()} scanned · ${feed.totalAfterFilter.toLocaleString()} after filters · preset ${feed.preset}\\n\\n`,\n ),\n );\n\n if (feed.markets.length === 0) {\n out.warn(\"No markets matched the criteria.\");\n return;\n }\n\n const rows = feed.markets.map((m: FeedResultMarket) => {\n const prob = out.percent(m.yesPrice);\n const change = m.oneDayPriceChange;\n const changeStr =\n change > 0\n ? chalk.green(`+${(change * 100).toFixed(1)}%`)\n : change < 0\n ? chalk.red(`${(change * 100).toFixed(1)}%`)\n : chalk.dim(\"0.0%\");\n return [\n String(m.rank),\n out.truncate(m.question, 42),\n prob,\n String(Math.round(m.score)),\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n changeStr,\n ];\n });\n\n out.table(rows, [\"#\", \"Market\", \"Prob\", \"Score\", \"24h Vol\", \"Liq\", \"Chg\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of feed.markets.slice(0, 5)) {\n const url = m.polymarketUrl;\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 55) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Score: \") + scoreBar(m.score) + \" \");\n process.stdout.write(chalk.dim(\"Spread: \") + m.spread.toFixed(3) + \" \");\n if (m.rewardsDailyRate > 0) {\n process.stdout.write(chalk.dim(\"Rewards: \") + `$${m.rewardsDailyRate.toFixed(2)}/day`);\n }\n process.stdout.write(\"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + url + \"\\n\");\n }\n\n if (feed.markets.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${feed.markets.length - 5} more\\n`));\n }\n}\n","import { Command } from \"commander\";\nimport { writeFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface FeedCmdOpts {\n profile?: string;\n sortBy?: string;\n preset?: string;\n tag?: string;\n minVolume?: string;\n minLiquidity?: string;\n maxLiquidity?: string;\n minRewardsDailyRate?: string;\n minDaysToEnd?: string;\n maxDaysToEnd?: string;\n maxMarketAgeHours?: string;\n liquidProfile?: string;\n limit?: string;\n}\n\ninterface FeedEnsembleOpts {\n limit?: string;\n output?: string;\n}\n\nexport interface EnsembleCandidate extends FeedResultMarket {\n ensembleScore: number;\n sourceProfiles: string[];\n sourceRanks: Record<string, number>;\n}\n\nexport interface FeedEnsembleResult {\n generatedAt: string;\n outputPath: string;\n totalSources: number;\n totalRawMarkets: number;\n totalCandidates: number;\n marketsReturned: number;\n candidates: EnsembleCandidate[];\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nconst PROFILE_CHOICES = [\"lp-opportunity\", \"liquidity-provider\", \"liquid-new-or-long\"] as const;\n\nfunction isProfile(s: string | undefined): s is (typeof PROFILE_CHOICES)[number] {\n return s !== undefined && (PROFILE_CHOICES as readonly string[]).includes(s);\n}\n\nexport function resolveFeedProfile(\n screening: string | undefined,\n profile: string | undefined,\n warn: (message: string) => void = () => undefined,\n): string | undefined {\n if (profile && !isProfile(profile)) {\n throw new Error(`Unknown feed profile \"${profile}\". Use: ${PROFILE_CHOICES.join(\" or \")}`);\n }\n\n if (!screening) return profile;\n\n if (!isProfile(screening)) {\n throw new Error(`Unknown screening \"${screening}\". Use: ${PROFILE_CHOICES.join(\" or \")}`);\n }\n\n if (profile && profile !== screening) {\n warn(`Both positional and --profile set; using --profile (${profile}).`);\n return profile;\n }\n\n return profile ?? screening;\n}\n\n/**\n * Build query params for GET /api/feed. Omits undefined / empty string.\n */\nfunction feedQueryParams(opts: {\n profile?: string;\n sortBy?: string;\n preset?: string;\n tag?: string;\n minVolume?: string;\n minLiquidity?: string;\n maxLiquidity?: string;\n minRewardsDailyRate?: string;\n minDaysToEnd?: string;\n maxDaysToEnd?: string;\n maxMarketAgeHours?: string;\n liquidProfile?: string;\n limit?: string;\n}): Record<string, string> {\n const entries: [string, string][] = [];\n const add = (k: string, v: string | undefined) => {\n if (v !== undefined && v !== \"\") entries.push([k, v]);\n };\n add(\"profile\", opts.profile);\n add(\"sortBy\", opts.sortBy);\n add(\"preset\", opts.preset);\n add(\"tag\", opts.tag);\n add(\"minVolume\", opts.minVolume);\n add(\"minLiquidity\", opts.minLiquidity);\n add(\"maxLiquidity\", opts.maxLiquidity);\n add(\"minRewardsDailyRate\", opts.minRewardsDailyRate);\n add(\"minDaysToEnd\", opts.minDaysToEnd);\n add(\"maxDaysToEnd\", opts.maxDaysToEnd);\n add(\"maxMarketAgeHours\", opts.maxMarketAgeHours);\n add(\"liquidProfile\", opts.liquidProfile);\n add(\"limit\", opts.limit);\n return Object.fromEntries(entries);\n}\n\nconst ENSEMBLE_SOURCES: Array<{ name: string; params: Record<string, string> }> = [\n { name: \"liquid-core\", params: { sortBy: \"liquidity\", preset: \"liquidity-focused\" } },\n { name: \"active-volume\", params: { sortBy: \"volume\", preset: \"volume-hunter\" } },\n { name: \"movers\", params: { sortBy: \"movement\", preset: \"price-movers\" } },\n { name: \"new-markets\", params: { sortBy: \"recency\", preset: \"new-markets\" } },\n { name: \"uncertainty\", params: { sortBy: \"extremity\" } },\n { name: \"lp-quality\", params: { profile: \"liquidity-provider\", sortBy: \"lpExpectedReturn\" } },\n];\n\nconst EXTREME_PROBABILITY_LOW = 0.07;\nconst EXTREME_PROBABILITY_HIGH = 0.93;\nconst EXTREME_PROBABILITY_MAX_PENALTY = 15;\nconst HORIZON_PEAK_DAYS = 365;\nconst HORIZON_LONG_TERM_DECAY_PER_YEAR = 4;\nconst HORIZON_LONG_TERM_FLOOR = 2;\nconst ENSEMBLE_SOURCE_SCORE_PER_SOURCE = 2;\nconst ENSEMBLE_SOURCE_SCORE_MAX = 8;\nconst ENSEMBLE_MAX_CANDIDATES_PER_EVENT = 2;\nconst ENSEMBLE_MAX_SINGLE_SOURCE_CANDIDATES = 5;\n\nfunction num(value: number | null | undefined): number {\n return Number.isFinite(value) ? Number(value) : 0;\n}\n\nfunction extremeProbabilityPenalty(candidate: FeedResultMarket): number {\n const probability = Number.isFinite(candidate.probability) ? Number(candidate.probability) : candidate.yesPrice;\n const boundedProbability = Math.max(0, Math.min(1, probability));\n\n if (boundedProbability < EXTREME_PROBABILITY_LOW) {\n return ((EXTREME_PROBABILITY_LOW - boundedProbability) / EXTREME_PROBABILITY_LOW) *\n EXTREME_PROBABILITY_MAX_PENALTY;\n }\n\n if (boundedProbability > EXTREME_PROBABILITY_HIGH) {\n return ((boundedProbability - EXTREME_PROBABILITY_HIGH) / (1 - EXTREME_PROBABILITY_HIGH)) *\n EXTREME_PROBABILITY_MAX_PENALTY;\n }\n\n return 0;\n}\n\nfunction horizonScore(days: number | null): number {\n if (days === null) return 2;\n if (days < 3) return 0;\n if (days <= HORIZON_PEAK_DAYS) {\n return Math.log1p(days) / Math.log1p(HORIZON_PEAK_DAYS) * 10;\n }\n\n const yearsPastPeak = (days - HORIZON_PEAK_DAYS) / HORIZON_PEAK_DAYS;\n return Math.max(HORIZON_LONG_TERM_FLOOR, 10 - yearsPastPeak * HORIZON_LONG_TERM_DECAY_PER_YEAR);\n}\n\nfunction scoreCandidate(candidate: FeedResultMarket, sourceCount: number): number {\n const liquidityScore = Math.min(25, Math.log1p(Math.max(0, candidate.liquidity)) / Math.log1p(1_000_000) * 25);\n const volumeScore = Math.min(25, Math.log1p(Math.max(0, candidate.volume24h)) / Math.log1p(1_000_000) * 25);\n const spreadScore = Math.max(0, Math.min(15, (0.12 - Math.max(0, candidate.spread)) / 0.12 * 15));\n const movementPenalty = Math.min(20, Math.abs(candidate.oneDayPriceChange) * 100);\n const probabilityPenalty = extremeProbabilityPenalty(candidate);\n const days = candidate.daysToEnd ?? null;\n const horizon = horizonScore(days);\n const rewardScore = Math.max(\n 0,\n Math.min(20, num(candidate.components?.rewardYield) * 0.1 + Math.max(0, num(candidate.lpExpectedReturnDailyPct)) * 50),\n );\n const sourceScore = Math.min(ENSEMBLE_SOURCE_SCORE_MAX, sourceCount * ENSEMBLE_SOURCE_SCORE_PER_SOURCE);\n return Math.round(\n (\n liquidityScore +\n volumeScore +\n spreadScore +\n horizon +\n rewardScore +\n sourceScore -\n movementPenalty -\n probabilityPenalty\n ) * 10,\n ) / 10;\n}\n\nfunction diversifyCandidates(candidates: EnsembleCandidate[], limit: number): EnsembleCandidate[] {\n const eventCounts = new Map<string, number>();\n const singleSourceCounts = new Map<string, number>();\n const diversified: EnsembleCandidate[] = [];\n\n for (const candidate of candidates) {\n const eventKey = candidate.eventSlug || candidate.slug;\n const eventCount = eventCounts.get(eventKey) ?? 0;\n if (eventCount >= ENSEMBLE_MAX_CANDIDATES_PER_EVENT) continue;\n\n const singleSource = candidate.sourceProfiles.length === 1 ? candidate.sourceProfiles[0] : null;\n if (singleSource !== null) {\n const sourceCount = singleSourceCounts.get(singleSource) ?? 0;\n if (sourceCount >= ENSEMBLE_MAX_SINGLE_SOURCE_CANDIDATES) continue;\n singleSourceCounts.set(singleSource, sourceCount + 1);\n }\n\n eventCounts.set(eventKey, eventCount + 1);\n diversified.push(candidate);\n if (diversified.length >= limit) break;\n }\n\n return diversified;\n}\n\nexport function buildFeedEnsemble(\n sourceResults: Array<{ source: string; result: FeedResult }>,\n limit: number,\n outputPath = \"candidates.json\",\n generatedAt = new Date().toISOString(),\n): FeedEnsembleResult {\n const bySlug = new Map<string, EnsembleCandidate>();\n let totalRawMarkets = 0;\n\n for (const { source, result } of sourceResults) {\n for (const market of result.markets ?? []) {\n totalRawMarkets++;\n const existing = bySlug.get(market.slug);\n if (!existing) {\n bySlug.set(market.slug, {\n ...market,\n ensembleScore: 0,\n sourceProfiles: [source],\n sourceRanks: { [source]: market.rank },\n });\n continue;\n }\n\n existing.sourceProfiles.push(source);\n existing.sourceRanks[source] = market.rank;\n if (market.score > existing.score) existing.score = market.score;\n existing.volume24h = Math.max(existing.volume24h, market.volume24h);\n existing.liquidity = Math.max(existing.liquidity, market.liquidity);\n existing.rewardsDailyRate = Math.max(existing.rewardsDailyRate, market.rewardsDailyRate);\n existing.lpExpectedReturnDailyPct = Math.max(\n num(existing.lpExpectedReturnDailyPct),\n num(market.lpExpectedReturnDailyPct),\n );\n existing.lpRiskFlags = [...new Set([...(existing.lpRiskFlags ?? []), ...(market.lpRiskFlags ?? [])])];\n }\n }\n\n const candidates = [...bySlug.values()]\n .map((candidate) => ({\n ...candidate,\n sourceProfiles: [...new Set(candidate.sourceProfiles)],\n ensembleScore: scoreCandidate(candidate, new Set(candidate.sourceProfiles).size),\n }))\n .sort((a, b) => b.ensembleScore - a.ensembleScore || b.score - a.score);\n const diversifiedCandidates = diversifyCandidates(candidates, limit);\n\n return {\n generatedAt,\n outputPath,\n totalSources: sourceResults.length,\n totalRawMarkets,\n totalCandidates: bySlug.size,\n marketsReturned: diversifiedCandidates.length,\n candidates: diversifiedCandidates,\n };\n}\n\nfunction parseLimit(value: string | undefined, fallback: number): number {\n const parsed = Number.parseInt(value ?? \"\", 10);\n if (!Number.isFinite(parsed)) return fallback;\n return Math.max(1, Math.min(100, parsed));\n}\n\nexport function registerFeedCommand(program: Command): void {\n const feed = program\n .command(\"feed\")\n .description(\n \"Rank active Polymarket markets (same engine as chat getFeed / GET /api/feed). \" +\n \"Use --profile for curated screens.\",\n )\n .argument(\n \"[screening]\",\n `Optional screening preset: ${PROFILE_CHOICES.join(\" | \")} (same as --profile)`,\n )\n .option(\n \"--profile <name>\",\n `Screening defaults: ${PROFILE_CHOICES.join(\", \")} — explicit flags override`,\n )\n .option(\"--sort-by <key>\", \"score | volume | liquidity | movement | spread | recency | extremity | rewards | rewardYield | lpExpectedReturn | horizon\")\n .option(\"--preset <name>\", \"Attention weight preset (default, volume-hunter, lp-opportunity, …)\")\n .option(\"--tag <slug>\", \"Polymarket category tag, e.g. crypto, politics\")\n .option(\"--min-volume <usd>\", \"Minimum 24h volume (USD)\")\n .option(\"--min-liquidity <usd>\", \"Minimum displayed liquidity (USD)\")\n .option(\"--max-liquidity <usd>\", \"Maximum displayed liquidity (USD)\")\n .option(\"--min-rewards-daily-rate <usd>\", \"Minimum LP rewards USD/day\")\n .option(\"--min-days-to-end <n>\", \"Min calendar days until resolution\")\n .option(\"--max-days-to-end <n>\", \"Max calendar days until resolution\")\n .option(\"--max-market-age-hours <n>\", \"With liquid-new-or-long: max age (hours) for the \\\"new\\\" branch\")\n .option(\"--liquid-profile <mode>\", \"new-or-long (used by liquid-new-or-long screen)\")\n .option(\"--limit <n>\", \"Max markets to return (1–100, default 15)\", \"15\");\n\n feed\n .command(\"ensemble\")\n .description(\"Run multiple feed screens, merge by slug, and write ranked candidates JSON\")\n .option(\"--limit <n>\", \"Max candidates to return/write (1-100, default 25)\", \"25\")\n .option(\"--output <file>\", \"Output JSON path\", \"candidates.json\")\n .action(async (o: FeedEnsembleOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const perSourceLimit = \"100\";\n const sourceResults: Array<{ source: string; result: FeedResult }> = [];\n try {\n for (const source of ENSEMBLE_SOURCES) {\n const result = await client.get<FeedResult>(\"/api/feed\", {\n ...source.params,\n limit: perSourceLimit,\n });\n if (result.error) {\n throw new Error(result.error);\n }\n sourceResults.push({ source: source.name, result });\n }\n const outputPath = o.output ?? \"candidates.json\";\n const ensemble = buildFeedEnsemble(sourceResults, parseLimit(o.limit, 25), outputPath);\n await writeFile(outputPath, JSON.stringify(ensemble, null, 2) + \"\\n\", \"utf8\");\n if (globalOpts.json) {\n out.json(ensemble);\n return;\n }\n out.heading(`Feed Ensemble — ${ensemble.marketsReturned} candidates`);\n out.table(\n ensemble.candidates.slice(0, 15).map((m) => [\n String(Math.round(m.ensembleScore)),\n out.truncate(m.question, 48),\n `${Math.round(m.yesPrice * 100)}%`,\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n m.sourceProfiles.join(\",\"),\n ]),\n [\"Score\", \"Market\", \"YES\", \"24h Vol\", \"Liq\", \"Sources\"],\n );\n out.success(`Wrote ${outputPath}`);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n\n feed\n .action(async (screening: string | undefined, o: FeedCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n let profile: string | undefined;\n try {\n profile = resolveFeedProfile(screening, o.profile, out.warn);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params = feedQueryParams({\n profile,\n sortBy: o.sortBy,\n preset: o.preset,\n tag: o.tag,\n minVolume: o.minVolume,\n minLiquidity: o.minLiquidity,\n maxLiquidity: o.maxLiquidity,\n minRewardsDailyRate: o.minRewardsDailyRate,\n minDaysToEnd: o.minDaysToEnd,\n maxDaysToEnd: o.maxDaysToEnd,\n maxMarketAgeHours: o.maxMarketAgeHours,\n liquidProfile: o.liquidProfile,\n limit: o.limit,\n });\n\n try {\n const result = await client.get<FeedResult>(\"/api/feed\", params);\n if (result.error) {\n out.error(result.error);\n process.exit(1);\n }\n displayFeedResult(result, globalOpts);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport {\n displayAllocatorCycleResult,\n} from \"../allocator-display.js\";\nimport {\n parsePositiveNumber,\n readAllocations,\n readMarketPayload,\n readPnlContext,\n} from \"./allocator.js\";\nimport type {\n GlobalOptions,\n AllocatorCycleApiResponse,\n AllocatorCycleRequest,\n AllocatorStrategyInput,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface LpAllocatorOpts {\n markets: string;\n allocations?: string;\n pnl?: string;\n totalHoldings?: number;\n capitalLimitPct?: number;\n perMarketLimitPct?: number;\n capitalLimit: number;\n perMarketLimit: number;\n minExpectedReturnDailyPct: number;\n maxInventoryImbalance: number;\n volatilityFillSpikeThreshold: number;\n eventNoQuoteMinutesBefore: number;\n eventNoQuoteMinutesAfter: number;\n allocatorMinLiquidity: number;\n maxSpread: number;\n allocatorMinDaysToEnd: number;\n maxMarkets: number;\n paused?: boolean;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction parseNonNegative(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0) {\n throw new InvalidArgumentError(\"Expected a non-negative number\");\n }\n return n;\n}\n\nfunction parsePositiveInt(value: string): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) {\n throw new InvalidArgumentError(\"Expected a positive integer\");\n }\n return n;\n}\n\nfunction strategyFromAllocatorOptions(opts: LpAllocatorOpts): AllocatorStrategyInput {\n return {\n id: \"cli-lp-allocator\",\n name: \"CLI LP allocator dry run\",\n status: opts.paused ? \"paused\" : \"dry_run\",\n ...(opts.totalHoldings !== undefined && { total_holdings: opts.totalHoldings }),\n ...(opts.capitalLimitPct !== undefined && { capital_limit_pct: opts.capitalLimitPct }),\n ...(opts.perMarketLimitPct !== undefined && { per_market_limit_pct: opts.perMarketLimitPct }),\n capital_limit: opts.capitalLimit,\n per_market_limit: opts.perMarketLimit,\n min_expected_return_daily_pct: opts.minExpectedReturnDailyPct,\n max_inventory_imbalance: opts.maxInventoryImbalance,\n volatility_fill_spike_threshold: opts.volatilityFillSpikeThreshold,\n event_no_quote_minutes_before: opts.eventNoQuoteMinutesBefore,\n event_no_quote_minutes_after: opts.eventNoQuoteMinutesAfter,\n min_liquidity: opts.allocatorMinLiquidity,\n max_spread: opts.maxSpread,\n min_days_to_end: opts.allocatorMinDaysToEnd,\n max_markets: opts.maxMarkets,\n };\n}\n\nfunction validateAllocatorPercentageSizing(opts: LpAllocatorOpts): void {\n const usesPercentageSizing =\n opts.capitalLimitPct !== undefined || opts.perMarketLimitPct !== undefined;\n if (usesPercentageSizing && opts.totalHoldings === undefined) {\n out.error(\n \"Percentage sizing requires --total-holdings so the allocator can convert percentages into dollar caps.\",\n );\n process.exit(1);\n }\n}\n\nasync function runAllocatorCycle(\n client: ApiClient,\n payload: AllocatorCycleRequest,\n): Promise<AllocatorCycleApiResponse> {\n return client.post<AllocatorCycleApiResponse>(\"/api/lp/allocator\", payload);\n}\n\nexport function registerLpCommands(program: Command): void {\n const lp = program\n .command(\"lp\")\n .description(\"Generate dry-run liquidity-provider allocation plans\");\n\n lp\n .command(\"allocator\")\n .description(\"Run the allocator agent on an explicit market list\")\n .requiredOption(\"--markets <file>\", \"Candidate market JSON array or { markets }; use '-' to read stdin\")\n .option(\"--allocations <file>\", \"Existing allocations JSON array or { allocations }; use '-' to read stdin\")\n .option(\"--pnl <file>\", \"Per-market PnL context JSON array or { pnl_context } (external wallet/inventory export); use '-' to read stdin\")\n .option(\"--total-holdings <usd>\", \"Total holdings / portfolio value used for percentage sizing\", parsePositiveNumber)\n .option(\"--capital-limit-pct <pct>\", \"Portfolio-level allocation cap as a percent of total holdings\", parsePositiveNumber)\n .option(\"--per-market-limit-pct <pct>\", \"Per-market target cap as a percent of total holdings\", parsePositiveNumber)\n .option(\"--capital-limit <usd>\", \"Portfolio capital limit for this allocator request\", parseNonNegative, 500)\n .option(\"--per-market-limit <usd>\", \"Per-market target cap\", parseNonNegative, 100)\n .option(\"--min-expected-return-daily-pct <pct>\", \"Minimum expected daily return percent\", parseNonNegative, 0.02)\n .option(\"--max-inventory-imbalance <ratio>\", \"Maximum inventory imbalance\", parseNonNegative, 0.25)\n .option(\"--volatility-fill-spike-threshold <ratio>\", \"Fill-rate imbalance that switches quotes to defensive mode\", parseNonNegative, 0.35)\n .option(\"--event-no-quote-minutes-before <n>\", \"No-quote window before scheduled events\", parseNonNegative, 60)\n .option(\"--event-no-quote-minutes-after <n>\", \"No-quote window after scheduled events\", parseNonNegative, 30)\n .option(\"--allocator-min-liquidity <usd>\", \"Allocator safety gate: minimum market liquidity\", parseNonNegative, 500)\n .option(\"--max-spread <ratio>\", \"Allocator safety gate: maximum spread\", parseNonNegative, 0.12)\n .option(\"--allocator-min-days-to-end <n>\", \"Allocator safety gate: minimum days to resolution\", parseNonNegative, 3)\n .option(\"--max-markets <n>\", \"Maximum markets allocator may target\", parsePositiveInt, 5)\n .option(\"--paused\", \"Send strategy status paused instead of dry_run\")\n .action(async (opts: LpAllocatorOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n validateAllocatorPercentageSizing(opts);\n\n const markets = await readMarketPayload(opts.markets);\n if (!markets || markets.length === 0) {\n out.error(\"Markets JSON must include at least one market.\");\n process.exit(1);\n }\n\n if (opts.allocations === \"-\" && opts.pnl === \"-\") {\n out.error(\"Only one of --allocations and --pnl can read from stdin.\");\n process.exit(1);\n }\n\n const pnlContext = await readPnlContext(opts.pnl);\n const payload: AllocatorCycleRequest = {\n strategy: strategyFromAllocatorOptions(opts),\n markets,\n allocations: await readAllocations(opts.allocations),\n ...(pnlContext.length > 0 && { pnl_context: pnlContext }),\n };\n\n if (!globalOpts.json) {\n process.stderr.write(\n out.dim(` Running allocator dry-run on ${markets.length} provided candidates...\\n`),\n );\n }\n\n const response = await runAllocatorCycle(client, payload);\n if (globalOpts.json) {\n out.json(response);\n } else {\n displayAllocatorCycleResult(response.result ?? {}, globalOpts);\n }\n });\n\n}\n","import chalk from \"chalk\";\nimport type {\n AllocatorCycleResult,\n GlobalOptions,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction actionColor(action: string): string {\n switch (action) {\n case \"ALLOCATE\":\n case \"INCREASE\":\n return chalk.green(action);\n case \"REDUCE\":\n case \"EXIT\":\n return chalk.yellow(action);\n case \"SKIP\":\n return chalk.dim(action);\n case \"WATCH\":\n return chalk.cyan(action);\n default:\n return action;\n }\n}\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function displayAllocatorCycleResult(\n result: AllocatorCycleResult,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n const decisions = Array.isArray(result.decisions) ? result.decisions : [];\n const summary = result.summary ?? {};\n const dryRun = result.dry_run === false ? \"live\" : \"dry run\";\n\n out.heading(`Allocator Cycle — ${dryRun}`);\n process.stdout.write(\n chalk.dim(\n ` ${num(result.total_markets, decisions.length)} markets · ${out.currency(\n num(summary.target_capital),\n )} target capital\\n\\n`,\n ),\n );\n\n if (decisions.length === 0) {\n out.warn(\"No allocator decisions returned.\");\n return;\n }\n\n const rows = decisions.map((d) => {\n const action = String(d.action ?? \"UNKNOWN\");\n const score = num(d.score?.score);\n const expected = num(d.score?.expected_return_daily_pct);\n const failedChecks = Array.isArray(d.safety_checks)\n ? d.safety_checks.filter((check) => check.passed === false).length\n : 0;\n return [\n out.truncate(String(d.question ?? d.market_slug ?? \"—\"), 42),\n actionColor(action),\n out.currency(num(d.target_capital)),\n signedCurrency(num(d.capital_delta)),\n `${expected.toFixed(3)}%`,\n regimeLabel(String(d.quote_regime ?? \"—\")),\n String(Math.round(score)),\n failedChecks === 0 ? chalk.green(\"0\") : chalk.yellow(String(failedChecks)),\n ];\n });\n\n out.table(rows, [\n \"Market\",\n \"Action\",\n \"Target\",\n \"Delta\",\n \"Exp/day\",\n \"Regime\",\n \"Score\",\n \"Fails\",\n ]);\n\n process.stdout.write(\"\\n\");\n for (const decision of decisions.slice(0, 5)) {\n const action = String(decision.action ?? \"UNKNOWN\");\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(String(decision.question ?? decision.market_slug ?? \"—\"), 65) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Action: \") + actionColor(action));\n if (decision.rationale) {\n process.stdout.write(\" \" + chalk.dim(\"Rationale: \") + out.truncate(decision.rationale, 120));\n }\n process.stdout.write(\"\\n\");\n\n const economics = decision.economics ?? {};\n if (\n economics.realized_spread_pnl !== undefined ||\n economics.reward_income !== undefined ||\n economics.net_realized_pnl !== undefined\n ) {\n process.stdout.write(\n \" \" +\n chalk.dim(\"Economics: \") +\n `spread ${signedCurrency(num(economics.realized_spread_pnl))}, ` +\n `rewards ${signedCurrency(num(economics.reward_income))}, ` +\n `net ${signedCurrency(num(economics.net_realized_pnl))}` +\n \"\\n\",\n );\n }\n }\n\n if (decisions.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${decisions.length - 5} more decisions\\n`));\n }\n}\n\nfunction regimeLabel(value: string): string {\n switch (value) {\n case \"reward_optimized\":\n return chalk.green(\"reward\");\n case \"defensive\":\n return chalk.yellow(\"defense\");\n case \"no_quote\":\n return chalk.red(\"no quote\");\n default:\n return chalk.dim(value);\n }\n}\n\nfunction signedCurrency(value: number): string {\n const formatted = out.currency(Math.abs(value));\n if (value > 0) return chalk.green(`+${formatted}`);\n if (value < 0) return chalk.yellow(`-${formatted}`);\n return chalk.dim(\"$0.00\");\n}\n","import { InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport type {\n AllocatorAllocationInput,\n AllocatorMarketInput,\n AllocatorPnlInput,\n} from \"../types.js\";\n\nexport function parsePositiveNumber(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return n;\n}\n\nexport function parseAllocationsInput(parsed: unknown): AllocatorAllocationInput[] {\n const rows = extractArray<AllocatorAllocationInput>(parsed, \"allocations\");\n if (!rows) {\n throw new Error(\"Allocations JSON must be an array or { allocations: [...] }\");\n }\n return rows;\n}\n\nexport function parsePnlContextInput(parsed: unknown): AllocatorPnlInput[] {\n const rows = extractArray<AllocatorPnlInput>(parsed, \"pnl_context\");\n if (!rows) {\n throw new Error(\"PnL JSON must be an array or { pnl_context: [...] }\");\n }\n return rows;\n}\n\nexport async function readAllocations(path: string | undefined): Promise<AllocatorAllocationInput[]> {\n if (!path) return [];\n return parseAllocationsInput(await readJsonInput(path));\n}\n\nexport async function readPnlContext(path: string | undefined): Promise<AllocatorPnlInput[]> {\n if (!path) return [];\n return parsePnlContextInput(await readJsonInput(path));\n}\n\nexport async function readMarketPayload(path: string | undefined): Promise<AllocatorMarketInput[] | undefined> {\n if (!path) return undefined;\n const parsed = await readJsonInput(path);\n const rows = extractArray<AllocatorMarketInput>(parsed, \"markets\");\n if (!rows) {\n throw new Error(\"Markets JSON must be an array or { markets: [...] }\");\n }\n return rows;\n}\n\nfunction extractArray<T>(parsed: unknown, key: string): T[] | undefined {\n if (Array.isArray(parsed)) {\n return parsed as T[];\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as Record<string, unknown>)[key])) {\n return (parsed as Record<string, unknown>)[key] as T[];\n }\n return undefined;\n}\n\nasync function readJsonInput(path: string): Promise<unknown> {\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n return JSON.parse(raw) as unknown;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displaySignalAnalysis } from \"../signal-display.js\";\nimport type {\n GlobalOptions,\n SignalAnalysisApiResponse,\n SignalAnalysisRequest,\n SignalMarketInput,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface SignalAnalyzeOpts {\n url?: string[];\n market?: string;\n context?: string;\n question?: string;\n description?: string;\n yesProb?: number;\n noProb?: number;\n slug?: string;\n link?: string;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction collect(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function parseProbability(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0 || n > 100) {\n throw new InvalidArgumentError(\"Expected a probability between 0 and 100\");\n }\n return n;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nasync function readMarketPayload(path: string | undefined): Promise<{\n market?: SignalMarketInput;\n markets?: SignalMarketInput[];\n}> {\n if (!path) return {};\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) {\n return { markets: parsed as SignalMarketInput[] };\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as { markets?: unknown }).markets)) {\n return { markets: (parsed as { markets: SignalMarketInput[] }).markets };\n }\n if (parsed && typeof parsed === \"object\" && (parsed as { market?: unknown }).market) {\n return { market: (parsed as { market: SignalMarketInput }).market };\n }\n if (parsed && typeof parsed === \"object\") {\n return { market: parsed as SignalMarketInput };\n }\n throw new Error(\"Market JSON must be an object, an array, or { market | markets }\");\n}\n\nfunction inlineMarketFromOptions(opts: SignalAnalyzeOpts): SignalMarketInput | undefined {\n const market: SignalMarketInput = {};\n if (opts.question) market.question = opts.question;\n if (opts.description) market.description = opts.description;\n if (opts.yesProb !== undefined) market.yesPrice = opts.yesProb;\n if (opts.noProb !== undefined) market.noPrice = opts.noProb;\n if (opts.slug) market.slug = opts.slug;\n if (opts.link) market.link = opts.link;\n return Object.keys(market).length > 0 ? market : undefined;\n}\n\nexport async function buildSignalPayload(\n positionalUrl: string | undefined,\n opts: SignalAnalyzeOpts,\n): Promise<SignalAnalysisRequest> {\n const urls = [positionalUrl, ...(opts.url ?? [])].filter(\n (value): value is string => Boolean(value),\n );\n const filePayload = await readMarketPayload(opts.market);\n const inlineMarket = inlineMarketFromOptions(opts);\n const hasMarketInput = Boolean(filePayload.market || filePayload.markets || inlineMarket);\n\n if (urls.length > 0 && hasMarketInput) {\n throw new Error(\"Use either URL input or market JSON/options, not both.\");\n }\n if (filePayload.market && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (filePayload.markets && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (urls.length === 0 && !hasMarketInput) {\n throw new Error(\"Provide a Polymarket URL or a market payload.\");\n }\n\n const payload: SignalAnalysisRequest =\n urls.length === 1\n ? { url: urls[0] }\n : urls.length > 1\n ? { urls }\n : filePayload.market\n ? { market: filePayload.market }\n : filePayload.markets\n ? { markets: filePayload.markets }\n : { market: inlineMarket };\n\n if (opts.context) {\n payload.previous_analysis_context = opts.context;\n }\n return payload;\n}\n\nasync function runSignalAnalysis(\n client: ApiClient,\n payload: SignalAnalysisRequest,\n): Promise<SignalAnalysisApiResponse> {\n return client.post<SignalAnalysisApiResponse>(\"/api/signal/analyze\", payload);\n}\n\nexport function registerSignalCommands(program: Command): void {\n const signal = program\n .command(\"signal\")\n .description(\"Analyze Polymarket probability gaps with the signal agent\");\n\n signal\n .command(\"analyze\")\n .description(\"Estimate true YES probability and compare it with market pricing\")\n .argument(\"[url]\", \"Polymarket market/event URL to analyze\")\n .option(\"--url <url>\", \"Additional Polymarket URL; repeat for multiple markets\", collect, [])\n .option(\"--market <file>\", \"Inline market JSON object/array; use '-' to read stdin\")\n .option(\"--context <text>\", \"Prior search notes or analysis context for the agent\")\n .option(\"--question <text>\", \"Inline market question when not using a URL\")\n .option(\"--description <text>\", \"Inline market description or resolution criteria\")\n .option(\"--yes-prob <prob>\", \"Current YES probability or price, e.g. 0.52 or 52\", parseProbability)\n .option(\"--no-prob <prob>\", \"Current NO probability or price, e.g. 0.48 or 48\", parseProbability)\n .option(\"--slug <slug>\", \"Inline market slug\")\n .option(\"--link <url>\", \"Inline market link\")\n .action(async (url: string | undefined, o: SignalAnalyzeOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n let payload: SignalAnalysisRequest;\n try {\n payload = await buildSignalPayload(url, o);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n if (!globalOpts.json) {\n process.stderr.write(out.dim(\" Running signal analysis...\\n\"));\n }\n\n const result = await runSignalAnalysis(client, payload);\n displaySignalAnalysis(result, globalOpts);\n });\n}\n","import chalk from \"chalk\";\nimport type {\n GlobalOptions,\n SignalAnalysis,\n SignalAnalysisApiResponse,\n SignalAnalysisItem,\n SignalAnalysisResult,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction pctFromSignalValue(value: number | null | undefined): number | null {\n if (value === null || value === undefined || Number.isNaN(value)) return null;\n return Math.abs(value) <= 1 ? value * 100 : value;\n}\n\nfunction formatProbability(value: number | null | undefined): string {\n const pct = pctFromSignalValue(value);\n return pct === null ? \"n/a\" : `${pct.toFixed(1)}%`;\n}\n\nfunction formatGap(value: number | null | undefined): string {\n if (value === null || value === undefined || Number.isNaN(value)) return \"n/a\";\n const points = Math.abs(value) <= 1 ? value * 100 : value;\n const formatted = `${points >= 0 ? \"+\" : \"\"}${points.toFixed(1)}pp`;\n if (points > 0) return chalk.green(formatted);\n if (points < 0) return chalk.red(formatted);\n return chalk.dim(formatted);\n}\n\nfunction formatStrength(value: string | undefined): string {\n if (value === \"strong\") return chalk.green(\"strong\");\n if (value === \"weak\") return chalk.yellow(\"weak\");\n return value ? chalk.dim(value) : \"n/a\";\n}\n\nfunction analysisItems(result: SignalAnalysisResult | undefined): SignalAnalysisItem[] {\n if (!result) return [];\n if (result.analysis) return [result];\n return result.analyses ?? [];\n}\n\nfunction titleFor(analysis: SignalAnalysis): string {\n return analysis.market_name || analysis.market_slug || \"market\";\n}\n\nexport function displaySignalAnalysis(\n response: SignalAnalysisApiResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(response);\n return;\n }\n\n if (response.error) {\n out.error(response.error);\n return;\n }\n\n const result = response.result;\n if (result?.error) {\n out.error(result.error);\n return;\n }\n\n const items = analysisItems(result);\n if (items.length === 0) {\n out.warn(\"No signal analysis returned.\");\n return;\n }\n\n out.heading(\n items.length === 1\n ? \"Signal Analysis\"\n : `Signal Analysis — ${items.length} markets`,\n );\n\n const rows = items.map((item) => {\n const analysis = item.analysis ?? {};\n return [\n out.truncate(titleFor(analysis), 44),\n formatProbability(analysis.current_yes_prob),\n formatProbability(analysis.predicted_prob),\n formatGap(analysis.probability_gap),\n formatStrength(analysis.signal_strength),\n analysis.confidence ?? \"n/a\",\n ];\n });\n out.table(rows, [\"Market\", \"Market YES\", \"Agent YES\", \"Gap\", \"Signal\", \"Conf\"]);\n\n for (const item of items.slice(0, 3)) {\n const analysis = item.analysis;\n if (!analysis) continue;\n process.stdout.write(\"\\n \" + chalk.bold(out.truncate(titleFor(analysis), 76)) + \"\\n\");\n if (analysis.market_link) {\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + analysis.market_link + \"\\n\");\n }\n if (analysis.key_factors && analysis.key_factors.length > 0) {\n process.stdout.write(\" \" + chalk.dim(\"Key factors: \") + analysis.key_factors.slice(0, 4).join(\"; \") + \"\\n\");\n }\n if (analysis.research_findings) {\n process.stdout.write(\n \" \" + chalk.dim(\"Research: \") + out.truncate(analysis.research_findings, 180) + \"\\n\",\n );\n }\n }\n\n if (items.length > 3) {\n process.stdout.write(chalk.dim(`\\n ... and ${items.length - 3} more\\n`));\n }\n\n if (result?.strong_signal_count !== undefined) {\n process.stdout.write(\n chalk.dim(`\\n Strong signals: ${result.strong_signal_count}\\n`),\n );\n }\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport type {\n GlobalOptions,\n QuoteAction,\n QuoteOutcome,\n QuotePreview,\n QuotePreviewRequest,\n QuoteRoute,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport interface QuoteCommandOptions {\n action: QuoteAction;\n outcome: QuoteOutcome;\n cash?: number;\n shares?: number;\n signalId?: string;\n capital?: number;\n route: QuoteRoute;\n save?: boolean;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nexport function parsePositiveNumber(value: string): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return parsed;\n}\n\nexport function parseQuoteAction(value: string): QuoteAction {\n const normalized = value.trim().toUpperCase();\n if (normalized !== \"BUY\" && normalized !== \"SELL\") {\n throw new InvalidArgumentError(\"Expected buy or sell\");\n }\n return normalized;\n}\n\nexport function parseQuoteOutcome(value: string): QuoteOutcome {\n const normalized = value.trim().toUpperCase();\n if (normalized !== \"YES\" && normalized !== \"NO\") {\n throw new InvalidArgumentError(\"Expected yes or no\");\n }\n return normalized;\n}\n\nexport function parseQuoteRoute(value: string): QuoteRoute {\n const normalized = value.trim().toLowerCase();\n if (normalized !== \"auto\" && normalized !== \"aggressive\" && normalized !== \"passive\") {\n throw new InvalidArgumentError(\"Expected auto, aggressive, or passive\");\n }\n return normalized;\n}\n\nexport function buildQuotePayload(\n instrument: string,\n opts: QuoteCommandOptions,\n): QuotePreviewRequest {\n const normalizedInstrument = instrument.trim();\n if (!normalizedInstrument) {\n throw new Error(\"Provide a Polymarket slug or URL.\");\n }\n\n const hasCash = opts.cash !== undefined;\n const hasShares = opts.shares !== undefined;\n if (hasCash === hasShares) {\n throw new Error(\"Provide exactly one of --cash or --shares.\");\n }\n if (opts.action === \"SELL\" && hasCash) {\n throw new Error(\"SELL quotes require --shares; --cash is BUY-only.\");\n }\n\n return {\n instrument: normalizedInstrument,\n action: opts.action,\n outcome: opts.outcome,\n size: hasCash\n ? { type: \"cash\", amount_usd: opts.cash as number }\n : { type: \"shares\", shares: opts.shares as number },\n ...(opts.signalId && { signal_forecast_id: opts.signalId }),\n ...(opts.capital !== undefined && { portfolio_capital_usd: opts.capital }),\n route: opts.route,\n persist: Boolean(opts.save),\n };\n}\n\nfunction formatNumber(value: unknown, digits = 2): string {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value.toLocaleString(\"en-US\", { maximumFractionDigits: digits })\n : \"n/a\";\n}\n\nfunction formatUsd(value: unknown): string {\n return typeof value === \"number\" && Number.isFinite(value)\n ? out.currency(value)\n : \"n/a\";\n}\n\nfunction formatPrice(value: unknown): string {\n return typeof value === \"number\" && Number.isFinite(value)\n ? `$${value.toFixed(4)}`\n : \"n/a\";\n}\n\nfunction formatPercent(value: unknown): string {\n return typeof value === \"number\" && Number.isFinite(value)\n ? out.percent(value)\n : \"n/a\";\n}\n\nexport function displayQuotePreview(preview: QuotePreview, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(preview);\n return;\n }\n if (preview.error) {\n out.error(preview.error);\n return;\n }\n\n const request = preview.request;\n const instrument = preview.instrument;\n const market = preview.market ?? {};\n const fill = preview.fill ?? {};\n const economics = preview.economics ?? {};\n const signal = preview.signal ?? {};\n const sizing = preview.sizing_suggestion ?? {};\n\n out.heading(`Quote Preview — ${preview.status ?? \"UNAVAILABLE\"}`);\n out.table([\n [\"Market\", instrument.question ?? instrument.slug ?? \"n/a\"],\n [\"Venue\", preview.venue ?? \"polymarket\"],\n [\"Action\", `${request.action ?? \"n/a\"} ${request.outcome ?? \"n/a\"}`],\n [\"Route\", `${request.route_selected ?? \"n/a\"} (requested ${request.route_requested ?? \"auto\"})`],\n [\"Observed\", preview.observed_at ? new Date(preview.observed_at).toLocaleString() : \"n/a\"],\n [\"Expires\", preview.expires_at ? new Date(preview.expires_at).toLocaleString() : \"n/a\"],\n ]);\n\n process.stdout.write(\"\\n\");\n out.table([\n [\"Best bid\", formatPrice(market.best_bid)],\n [\"Best ask\", formatPrice(market.best_ask)],\n [\"Spread\", formatPrice(market.spread)],\n [\"Bid depth\", `${formatNumber(market.bid_depth_shares, 4)} shares`],\n [\"Ask depth\", `${formatNumber(market.ask_depth_shares, 4)} shares`],\n [\"Requested cash\", formatUsd(fill.requested_cash_usd)],\n [\"Requested shares\", formatNumber(fill.requested_shares, 4)],\n [\"Fillable shares\", formatNumber(fill.fillable_shares, 4)],\n [\"Safety-capped shares\", formatNumber(fill.safety_capped_shares, 4)],\n [\"Fill ratio\", formatPercent(fill.fill_ratio)],\n [\"Average price\", formatPrice(fill.average_price)],\n [\"Worst price\", formatPrice(fill.worst_price)],\n [\"Passive limit\", formatPrice(fill.passive_limit_price)],\n [\"Slippage\", typeof fill.slippage_bps === \"number\" ? `${formatNumber(fill.slippage_bps)} bps` : \"n/a\"],\n ], [\"Quote\", \"Value\"]);\n\n process.stdout.write(\"\\n\");\n out.table([\n [\"Gross notional\", formatUsd(economics.gross_notional_usd)],\n [\"Venue fee\", formatUsd(economics.venue_fee_usd)],\n [\"Fee source\", economics.fee_source ?? \"unavailable\"],\n [request.action === \"SELL\" ? \"Net proceeds\" : \"All-in cost\", formatUsd(\n request.action === \"SELL\" ? economics.net_proceeds_usd : economics.all_in_cost_usd,\n )],\n [\"Max loss\", formatUsd(economics.max_loss_usd)],\n [\"Max payout\", formatUsd(economics.max_payout_usd)],\n [\"Profit at payout\", formatUsd(economics.max_profit_usd)],\n [\"Foregone payout\", request.action === \"SELL\" ? formatUsd(economics.foregone_payout_usd) : \"n/a\"],\n [\"Break-even probability\", formatPercent(economics.break_even_probability)],\n ], [\"Economics\", \"Value\"]);\n\n if (preview.signal) {\n process.stdout.write(\"\\n\");\n out.table([\n [\"Forecast YES\", formatPercent(signal.forecast_yes)],\n [\"Forecast interval\", `${formatPercent(signal.lower_bound)} – ${formatPercent(signal.upper_bound)}`],\n [\"Midpoint edge\", formatPercent(signal.midpoint_edge)],\n [\"Conservative edge\", formatPercent(signal.conservative_edge)],\n ], [\"Signal\", \"Value\"]);\n }\n\n if (preview.sizing_suggestion) {\n process.stdout.write(\"\\n\");\n out.table([\n [\"Suggested cash\", formatUsd(sizing.suggested_max_spend_usd)],\n [\"Suggested shares\", formatNumber(sizing.suggested_shares, 4)],\n [\"Capital fraction\", formatPercent(sizing.allocation_fraction)],\n ], [\"Non-binding sizing\", \"Value\"]);\n }\n\n if (preview.risks?.length) {\n process.stdout.write(\"\\n\");\n for (const risk of preview.risks) out.warn(risk);\n }\n\n if (preview.id) {\n process.stdout.write(\"\\n\" + out.dim(` Saved preview: ${preview.id}\\n`));\n }\n process.stdout.write(\"\\n\");\n out.warn(\"Preview only — no order was signed or submitted.\");\n const marketUrl = instrument.market_url;\n if (marketUrl) process.stdout.write(out.dim(` Market: ${marketUrl}\\n`));\n}\n\nexport function registerQuoteCommand(program: Command): void {\n program\n .command(\"quote\")\n .description(\"Preview the cost, liquidity, and risk of a Polymarket trade\")\n .argument(\"<slug-or-url>\", \"Polymarket market slug or URL\")\n .requiredOption(\"--action <action>\", \"buy | sell\", parseQuoteAction)\n .requiredOption(\"--outcome <outcome>\", \"yes | no\", parseQuoteOutcome)\n .option(\"--cash <usd>\", \"Maximum cash to spend (BUY only)\", parsePositiveNumber)\n .option(\"--shares <shares>\", \"Number of outcome shares\", parsePositiveNumber)\n .option(\"--signal-id <uuid>\", \"Saved Signal forecast to include in edge calculations\")\n .option(\"--capital <usd>\", \"Manual portfolio capital for non-binding BUY sizing\", parsePositiveNumber)\n .option(\"--route <route>\", \"auto | aggressive | passive\", parseQuoteRoute, \"auto\")\n .option(\"--save\", \"Save a freshly generated preview to quote history\")\n .action(async (instrument: string, opts: QuoteCommandOptions) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n let payload: QuotePreviewRequest;\n try {\n payload = buildQuotePayload(instrument, opts);\n } catch (error) {\n out.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n if (!globalOpts.json) {\n process.stderr.write(out.dim(\" Refreshing public market data and order book...\\n\"));\n }\n const preview = await client.post<QuotePreview>(\"/api/quote\", payload);\n displayQuotePreview(preview, globalOpts);\n });\n}\n"],"mappings":"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","names":["Command","program","chalk","error","program","chalk","program","requireAuth","readline","chalk","chalk","chalk","program","requireAuth","chalk","readline","requireAuth","warn","program","InvalidArgumentError","chalk","chalk","num","requireAuth","InvalidArgumentError","program","InvalidArgumentError","readFile","chalk","chalk","requireAuth","InvalidArgumentError","readStdin","readMarketPayload","readFile","program","InvalidArgumentError","requireAuth","parsePositiveNumber","InvalidArgumentError","program","error","Command"]}