@hedge-layer/cli 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -5,6 +5,7 @@ import { Command as Command3 } from "commander";
5
5
 
6
6
  // src/commands/auth.ts
7
7
  import readline from "readline/promises";
8
+ import { Writable } from "stream";
8
9
 
9
10
  // src/config.ts
10
11
  import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from "fs";
@@ -292,42 +293,59 @@ function relativeTime(date) {
292
293
  }
293
294
 
294
295
  // src/commands/auth.ts
296
+ async function promptHidden(prompt, options = {}) {
297
+ const input = options.input ?? process.stdin;
298
+ const output = options.output ?? process.stderr;
299
+ const createInterface = options.createInterface ?? readline.createInterface;
300
+ const mutedOutput = new Writable({
301
+ write(_chunk, _encoding, callback) {
302
+ callback();
303
+ }
304
+ });
305
+ const rl = createInterface({
306
+ input,
307
+ output: mutedOutput,
308
+ terminal: Boolean(input.isTTY)
309
+ });
310
+ output.write(prompt);
311
+ try {
312
+ return (await rl.question("")).trim();
313
+ } finally {
314
+ output.write("\n");
315
+ rl.close();
316
+ }
317
+ }
295
318
  function registerAuthCommands(program2) {
296
319
  const auth = program2.command("auth").description("Manage API authentication");
297
320
  auth.command("login").description("Authenticate with a Hedge Layer API token").option("--api-url <url>", "API base URL", DEFAULT_API_URL).action(async (cmdOpts) => {
298
321
  const globalOpts = program2.opts();
299
- const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
300
- try {
301
- heading("Hedge Layer CLI \u2014 Login");
302
- process.stderr.write(
303
- `Create an API token at ${bold("https://hedgelayer.ai/account/settings")} \u2192 API Tokens
322
+ heading("Hedge Layer CLI \u2014 Login");
323
+ process.stderr.write(
324
+ `Create an API token at ${bold("https://hedgelayer.ai/account/settings")} \u2192 API Tokens
304
325
 
305
326
  `
306
- );
307
- const token = (await rl.question("Paste your API token: ")).trim();
308
- if (!token.startsWith("hl_") || token.length !== 43) {
309
- error('Invalid token format. Tokens start with "hl_" and are 43 characters.');
310
- process.exit(1);
311
- }
312
- const apiUrl = globalOpts.apiUrl ?? cmdOpts.apiUrl ?? DEFAULT_API_URL;
313
- const client = new ApiClient({ token, apiUrl });
314
- process.stderr.write("\nValidating token...");
315
- let profile;
316
- try {
317
- profile = await client.get("/api/profile");
318
- } catch {
319
- process.stderr.write("\n");
320
- error("Token validation failed. Check your token and try again.");
321
- process.exit(1);
322
- }
323
- process.stderr.write(" done\n\n");
324
- saveConfig({ api_url: apiUrl, token });
325
- success(`Logged in as ${bold(profile.handle || profile.user_id)}`);
326
- process.stderr.write(` Config saved to ${dim(configPath())}
327
- `);
328
- } finally {
329
- rl.close();
327
+ );
328
+ const token = await promptHidden("Paste your API token: ");
329
+ if (!token.startsWith("hl_") || token.length !== 43) {
330
+ error('Invalid token format. Tokens start with "hl_" and are 43 characters.');
331
+ process.exit(1);
330
332
  }
333
+ const apiUrl = globalOpts.apiUrl ?? cmdOpts.apiUrl ?? DEFAULT_API_URL;
334
+ const client = new ApiClient({ token, apiUrl });
335
+ process.stderr.write("\nValidating token...");
336
+ let profile;
337
+ try {
338
+ profile = await client.get("/api/profile");
339
+ } catch {
340
+ process.stderr.write("\n");
341
+ error("Token validation failed. Check your token and try again.");
342
+ process.exit(1);
343
+ }
344
+ process.stderr.write(" done\n\n");
345
+ saveConfig({ api_url: apiUrl, token });
346
+ success(`Logged in as ${bold(profile.handle || profile.user_id)}`);
347
+ process.stderr.write(` Config saved to ${dim(configPath())}
348
+ `);
331
349
  });
332
350
  auth.command("status").description("Show current authentication status").action(async () => {
333
351
  const globalOpts = program2.opts();
@@ -1626,7 +1644,7 @@ function registerQuoteCommand(program2) {
1626
1644
 
1627
1645
  // src/index.ts
1628
1646
  var program = new Command3();
1629
- program.name("hl").description("Hedge Layer CLI \u2014 prediction market intelligence from the terminal").version("4.0.0").option("--json", "Output as JSON (machine-readable)").option("--api-url <url>", "Override API base URL").option("--token <token>", "Override stored API token").option("--verbose", "Show HTTP request details").option("--no-color", "Disable colored output");
1647
+ program.name("hl").description("Hedge Layer CLI \u2014 prediction market intelligence from the terminal").version("4.0.1").option("--json", "Output as JSON (machine-readable)").option("--api-url <url>", "Override API base URL").option("--token <token>", "Override stored API token").option("--verbose", "Show HTTP request details").option("--no-color", "Disable colored output");
1630
1648
  registerAuthCommands(program);
1631
1649
  registerBriefCommands(program);
1632
1650
  registerProfileCommand(program);
@@ -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/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\";\nimport { registerProfileCommand } from \"./commands/profile.js\";\nimport { registerResearchCommands } from \"./commands/research.js\";\nimport { registerFeedCommand } from \"./commands/feed.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);\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 { 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","chalk","chalk","requireAuth","program","InvalidArgumentError","requireAuth","InvalidArgumentError","program","error","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/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\";\nimport { registerProfileCommand } from \"./commands/profile.js\";\nimport { registerResearchCommands } from \"./commands/research.js\";\nimport { registerFeedCommand } from \"./commands/feed.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);\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 { Writable } from \"node:stream\";\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\ninterface HiddenPromptOptions {\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n createInterface?: typeof readline.createInterface;\n}\n\nexport async function promptHidden(\n prompt: string,\n options: HiddenPromptOptions = {},\n): Promise<string> {\n const input = options.input ?? process.stdin;\n const output = options.output ?? process.stderr;\n const createInterface = options.createInterface ?? readline.createInterface;\n const mutedOutput = new Writable({\n write(_chunk, _encoding, callback) {\n callback();\n },\n });\n const rl = createInterface({\n input,\n output: mutedOutput,\n terminal: Boolean((input as NodeJS.ReadStream).isTTY),\n });\n\n output.write(prompt);\n try {\n return (await rl.question(\"\")).trim();\n } finally {\n output.write(\"\\n\");\n rl.close();\n }\n}\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 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 promptHidden(\"Paste your API token: \");\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 });\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 { 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","chalk","chalk","requireAuth","program","InvalidArgumentError","requireAuth","InvalidArgumentError","program","error","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hedge-layer/cli",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "CLI for Hedge Layer — prediction market intelligence from the terminal",
5
5
  "type": "module",
6
6
  "bin": {