@hedge-layer/cli 3.0.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -63,12 +63,7 @@ hl quote "example-market" --action buy --outcome yes --cash 25
63
63
  hl quote "example-market" --action buy --outcome yes --cash 25 \
64
64
  --signal-id <forecast-id> --capital 1000 --save
65
65
 
66
- # 7. Run the advanced dry-run liquidity-provider planner
67
- hl --json feed liquidity-provider --limit 15 | jq '{ markets: .markets }' > markets.json
68
- hl lp allocator --markets markets.json
69
- your execution workflow
70
-
71
- # 8. Analyze a market probability edge
66
+ # 7. Analyze a market probability edge
72
67
  hl signal analyze "https://polymarket.com/event/example-market"
73
68
  ```
74
69
 
@@ -91,35 +86,17 @@ estimated fill, slippage, fees, cost or proceeds, payout risk, and optional
91
86
  Signal edge. It never signs or submits an order. `--cash` is BUY-only; SELL
92
87
  quotes require `--shares`.
93
88
 
94
- Advanced liquidity-provider planning remains available under `hl lp` as a
95
- dry-run-only API client:
96
-
97
- ```bash
98
- hl lp allocator --markets markets.json
99
- ```
89
+ Liquidity allocation, wallet management, and trade execution are outside the
90
+ official `hl` CLI.
100
91
 
101
- The lightweight LP planning loop is:
92
+ For a broader discovery screen, `hl feed ensemble` runs several feed lenses
93
+ (liquid core, active volume, movers, new markets, uncertainty, and LP quality),
94
+ de-duplicates by slug, and writes a ranked candidate file:
102
95
 
103
96
  ```bash
104
97
  hl feed ensemble --limit 25 --output candidates.json
105
- # or: hl --json feed lp-opportunity --limit 15 > markets.json
106
- external-pnl-export --json > pnl.json # optional: wallet PnL + live inventory
107
- hl lp allocator --markets candidates.json --pnl pnl.json --allocations pnl.json
108
- your execution workflow ...
109
98
  ```
110
99
 
111
- `hl feed ensemble` runs several feed lenses (liquid core, active volume, movers, new markets, uncertainty, and LP quality), de-duplicates by slug, and writes a daily candidate file.
112
-
113
- `hl lp allocator` submits the candidate market list through the web API to the
114
- allocator agent. Allocator output shows target capital, quote regime, failed
115
- safety checks, and split spread/reward economics. Trade execution stays outside
116
- the `hl` CLI.
117
-
118
- `--allocations` tells the allocator what you already hold (enabling HOLD,
119
- REDUCE, and EXIT decisions), and `--pnl` feeds per-market PnL into its caution
120
- overlay so borderline allocations on losing markets are downgraded to WATCH or
121
- HOLD. Both flags accept the same external wallet/inventory export shape.
122
-
123
100
  Signal-agent analysis is available under `hl signal`:
124
101
 
125
102
  ```bash
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/index.ts
4
- import { Command as Command4 } from "commander";
4
+ import { Command as Command3 } from "commander";
5
5
 
6
6
  // src/commands/auth.ts
7
7
  import readline from "readline/promises";
@@ -1245,281 +1245,12 @@ function registerFeedCommand(program2) {
1245
1245
  });
1246
1246
  }
1247
1247
 
1248
- // src/commands/lp.ts
1249
- import { InvalidArgumentError as InvalidArgumentError2 } from "commander";
1250
-
1251
- // src/allocator-display.ts
1252
- import chalk5 from "chalk";
1253
- function actionColor(action) {
1254
- switch (action) {
1255
- case "ALLOCATE":
1256
- case "INCREASE":
1257
- return chalk5.green(action);
1258
- case "REDUCE":
1259
- case "EXIT":
1260
- return chalk5.yellow(action);
1261
- case "SKIP":
1262
- return chalk5.dim(action);
1263
- case "WATCH":
1264
- return chalk5.cyan(action);
1265
- default:
1266
- return action;
1267
- }
1268
- }
1269
- function num2(value, fallback = 0) {
1270
- const n = Number(value);
1271
- return Number.isFinite(n) ? n : fallback;
1272
- }
1273
- function displayAllocatorCycleResult(result, globalOpts) {
1274
- if (globalOpts.json) {
1275
- json(result);
1276
- return;
1277
- }
1278
- const decisions = Array.isArray(result.decisions) ? result.decisions : [];
1279
- const summary = result.summary ?? {};
1280
- const dryRun = result.dry_run === false ? "live" : "dry run";
1281
- heading(`Allocator Cycle \u2014 ${dryRun}`);
1282
- process.stdout.write(
1283
- chalk5.dim(
1284
- ` ${num2(result.total_markets, decisions.length)} markets \xB7 ${currency(
1285
- num2(summary.target_capital)
1286
- )} target capital
1287
-
1288
- `
1289
- )
1290
- );
1291
- if (decisions.length === 0) {
1292
- warn("No allocator decisions returned.");
1293
- return;
1294
- }
1295
- const rows = decisions.map((d) => {
1296
- const action = String(d.action ?? "UNKNOWN");
1297
- const score = num2(d.score?.score);
1298
- const expected = num2(d.score?.expected_return_daily_pct);
1299
- const failedChecks = Array.isArray(d.safety_checks) ? d.safety_checks.filter((check) => check.passed === false).length : 0;
1300
- return [
1301
- truncate(String(d.question ?? d.market_slug ?? "\u2014"), 42),
1302
- actionColor(action),
1303
- currency(num2(d.target_capital)),
1304
- signedCurrency(num2(d.capital_delta)),
1305
- `${expected.toFixed(3)}%`,
1306
- regimeLabel(String(d.quote_regime ?? "\u2014")),
1307
- String(Math.round(score)),
1308
- failedChecks === 0 ? chalk5.green("0") : chalk5.yellow(String(failedChecks))
1309
- ];
1310
- });
1311
- table(rows, [
1312
- "Market",
1313
- "Action",
1314
- "Target",
1315
- "Delta",
1316
- "Exp/day",
1317
- "Regime",
1318
- "Score",
1319
- "Fails"
1320
- ]);
1321
- process.stdout.write("\n");
1322
- for (const decision of decisions.slice(0, 5)) {
1323
- const action = String(decision.action ?? "UNKNOWN");
1324
- process.stdout.write(" " + chalk5.dim("\u25B8 ") + truncate(String(decision.question ?? decision.market_slug ?? "\u2014"), 65) + "\n");
1325
- process.stdout.write(" " + chalk5.dim("Action: ") + actionColor(action));
1326
- if (decision.rationale) {
1327
- process.stdout.write(" " + chalk5.dim("Rationale: ") + truncate(decision.rationale, 120));
1328
- }
1329
- process.stdout.write("\n");
1330
- const economics = decision.economics ?? {};
1331
- if (economics.realized_spread_pnl !== void 0 || economics.reward_income !== void 0 || economics.net_realized_pnl !== void 0) {
1332
- process.stdout.write(
1333
- " " + chalk5.dim("Economics: ") + `spread ${signedCurrency(num2(economics.realized_spread_pnl))}, rewards ${signedCurrency(num2(economics.reward_income))}, net ${signedCurrency(num2(economics.net_realized_pnl))}
1334
- `
1335
- );
1336
- }
1337
- }
1338
- if (decisions.length > 5) {
1339
- process.stdout.write(chalk5.dim(`
1340
- \u2026 and ${decisions.length - 5} more decisions
1341
- `));
1342
- }
1343
- }
1344
- function regimeLabel(value) {
1345
- switch (value) {
1346
- case "reward_optimized":
1347
- return chalk5.green("reward");
1348
- case "defensive":
1349
- return chalk5.yellow("defense");
1350
- case "no_quote":
1351
- return chalk5.red("no quote");
1352
- default:
1353
- return chalk5.dim(value);
1354
- }
1355
- }
1356
- function signedCurrency(value) {
1357
- const formatted = currency(Math.abs(value));
1358
- if (value > 0) return chalk5.green(`+${formatted}`);
1359
- if (value < 0) return chalk5.yellow(`-${formatted}`);
1360
- return chalk5.dim("$0.00");
1361
- }
1362
-
1363
- // src/commands/allocator.ts
1248
+ // src/commands/signal.ts
1364
1249
  import { InvalidArgumentError } from "commander";
1365
1250
  import { readFile } from "fs/promises";
1366
- function parsePositiveNumber(value) {
1367
- const n = Number(value);
1368
- if (!Number.isFinite(n) || n <= 0) {
1369
- throw new InvalidArgumentError("Expected a positive number");
1370
- }
1371
- return n;
1372
- }
1373
- function parseAllocationsInput(parsed) {
1374
- const rows = extractArray(parsed, "allocations");
1375
- if (!rows) {
1376
- throw new Error("Allocations JSON must be an array or { allocations: [...] }");
1377
- }
1378
- return rows;
1379
- }
1380
- function parsePnlContextInput(parsed) {
1381
- const rows = extractArray(parsed, "pnl_context");
1382
- if (!rows) {
1383
- throw new Error("PnL JSON must be an array or { pnl_context: [...] }");
1384
- }
1385
- return rows;
1386
- }
1387
- async function readAllocations(path) {
1388
- if (!path) return [];
1389
- return parseAllocationsInput(await readJsonInput(path));
1390
- }
1391
- async function readPnlContext(path) {
1392
- if (!path) return [];
1393
- return parsePnlContextInput(await readJsonInput(path));
1394
- }
1395
- async function readMarketPayload(path) {
1396
- if (!path) return void 0;
1397
- const parsed = await readJsonInput(path);
1398
- const rows = extractArray(parsed, "markets");
1399
- if (!rows) {
1400
- throw new Error("Markets JSON must be an array or { markets: [...] }");
1401
- }
1402
- return rows;
1403
- }
1404
- function extractArray(parsed, key) {
1405
- if (Array.isArray(parsed)) {
1406
- return parsed;
1407
- }
1408
- if (parsed && typeof parsed === "object" && Array.isArray(parsed[key])) {
1409
- return parsed[key];
1410
- }
1411
- return void 0;
1412
- }
1413
- async function readJsonInput(path) {
1414
- const raw = path === "-" ? await readStdin() : await readFile(path, "utf8");
1415
- return JSON.parse(raw);
1416
- }
1417
- async function readStdin() {
1418
- const chunks = [];
1419
- for await (const chunk of process.stdin) {
1420
- chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
1421
- }
1422
- return Buffer.concat(chunks).toString("utf8");
1423
- }
1424
-
1425
- // src/commands/lp.ts
1426
- function requireAuth5(client) {
1427
- if (!client.isAuthenticated) {
1428
- error("Not authenticated. Run `hl auth login` first.");
1429
- process.exit(1);
1430
- }
1431
- }
1432
- function parseNonNegative(value) {
1433
- const n = Number(value);
1434
- if (!Number.isFinite(n) || n < 0) {
1435
- throw new InvalidArgumentError2("Expected a non-negative number");
1436
- }
1437
- return n;
1438
- }
1439
- function parsePositiveInt(value) {
1440
- const n = Number(value);
1441
- if (!Number.isInteger(n) || n < 1) {
1442
- throw new InvalidArgumentError2("Expected a positive integer");
1443
- }
1444
- return n;
1445
- }
1446
- function strategyFromAllocatorOptions(opts) {
1447
- return {
1448
- id: "cli-lp-allocator",
1449
- name: "CLI LP allocator dry run",
1450
- status: opts.paused ? "paused" : "dry_run",
1451
- ...opts.totalHoldings !== void 0 && { total_holdings: opts.totalHoldings },
1452
- ...opts.capitalLimitPct !== void 0 && { capital_limit_pct: opts.capitalLimitPct },
1453
- ...opts.perMarketLimitPct !== void 0 && { per_market_limit_pct: opts.perMarketLimitPct },
1454
- capital_limit: opts.capitalLimit,
1455
- per_market_limit: opts.perMarketLimit,
1456
- min_expected_return_daily_pct: opts.minExpectedReturnDailyPct,
1457
- max_inventory_imbalance: opts.maxInventoryImbalance,
1458
- volatility_fill_spike_threshold: opts.volatilityFillSpikeThreshold,
1459
- event_no_quote_minutes_before: opts.eventNoQuoteMinutesBefore,
1460
- event_no_quote_minutes_after: opts.eventNoQuoteMinutesAfter,
1461
- min_liquidity: opts.allocatorMinLiquidity,
1462
- max_spread: opts.maxSpread,
1463
- min_days_to_end: opts.allocatorMinDaysToEnd,
1464
- max_markets: opts.maxMarkets
1465
- };
1466
- }
1467
- function validateAllocatorPercentageSizing(opts) {
1468
- const usesPercentageSizing = opts.capitalLimitPct !== void 0 || opts.perMarketLimitPct !== void 0;
1469
- if (usesPercentageSizing && opts.totalHoldings === void 0) {
1470
- error(
1471
- "Percentage sizing requires --total-holdings so the allocator can convert percentages into dollar caps."
1472
- );
1473
- process.exit(1);
1474
- }
1475
- }
1476
- async function runAllocatorCycle(client, payload) {
1477
- return client.post("/api/lp/allocator", payload);
1478
- }
1479
- function registerLpCommands(program2) {
1480
- const lp = program2.command("lp").description("Generate dry-run liquidity-provider allocation plans");
1481
- lp.command("allocator").description("Run the allocator agent on an explicit market list").requiredOption("--markets <file>", "Candidate market JSON array or { markets }; use '-' to read stdin").option("--allocations <file>", "Existing allocations JSON array or { allocations }; use '-' to read stdin").option("--pnl <file>", "Per-market PnL context JSON array or { pnl_context } (external wallet/inventory export); use '-' to read stdin").option("--total-holdings <usd>", "Total holdings / portfolio value used for percentage sizing", parsePositiveNumber).option("--capital-limit-pct <pct>", "Portfolio-level allocation cap as a percent of total holdings", parsePositiveNumber).option("--per-market-limit-pct <pct>", "Per-market target cap as a percent of total holdings", parsePositiveNumber).option("--capital-limit <usd>", "Portfolio capital limit for this allocator request", parseNonNegative, 500).option("--per-market-limit <usd>", "Per-market target cap", parseNonNegative, 100).option("--min-expected-return-daily-pct <pct>", "Minimum expected daily return percent", parseNonNegative, 0.02).option("--max-inventory-imbalance <ratio>", "Maximum inventory imbalance", parseNonNegative, 0.25).option("--volatility-fill-spike-threshold <ratio>", "Fill-rate imbalance that switches quotes to defensive mode", parseNonNegative, 0.35).option("--event-no-quote-minutes-before <n>", "No-quote window before scheduled events", parseNonNegative, 60).option("--event-no-quote-minutes-after <n>", "No-quote window after scheduled events", parseNonNegative, 30).option("--allocator-min-liquidity <usd>", "Allocator safety gate: minimum market liquidity", parseNonNegative, 500).option("--max-spread <ratio>", "Allocator safety gate: maximum spread", parseNonNegative, 0.12).option("--allocator-min-days-to-end <n>", "Allocator safety gate: minimum days to resolution", parseNonNegative, 3).option("--max-markets <n>", "Maximum markets allocator may target", parsePositiveInt, 5).option("--paused", "Send strategy status paused instead of dry_run").action(async (opts) => {
1482
- const globalOpts = program2.opts();
1483
- const client = new ApiClient(globalOpts);
1484
- requireAuth5(client);
1485
- validateAllocatorPercentageSizing(opts);
1486
- const markets = await readMarketPayload(opts.markets);
1487
- if (!markets || markets.length === 0) {
1488
- error("Markets JSON must include at least one market.");
1489
- process.exit(1);
1490
- }
1491
- if (opts.allocations === "-" && opts.pnl === "-") {
1492
- error("Only one of --allocations and --pnl can read from stdin.");
1493
- process.exit(1);
1494
- }
1495
- const pnlContext = await readPnlContext(opts.pnl);
1496
- const payload = {
1497
- strategy: strategyFromAllocatorOptions(opts),
1498
- markets,
1499
- allocations: await readAllocations(opts.allocations),
1500
- ...pnlContext.length > 0 && { pnl_context: pnlContext }
1501
- };
1502
- if (!globalOpts.json) {
1503
- process.stderr.write(
1504
- dim(` Running allocator dry-run on ${markets.length} provided candidates...
1505
- `)
1506
- );
1507
- }
1508
- const response = await runAllocatorCycle(client, payload);
1509
- if (globalOpts.json) {
1510
- json(response);
1511
- } else {
1512
- displayAllocatorCycleResult(response.result ?? {}, globalOpts);
1513
- }
1514
- });
1515
- }
1516
-
1517
- // src/commands/signal.ts
1518
- import { InvalidArgumentError as InvalidArgumentError3 } from "commander";
1519
- import { readFile as readFile2 } from "fs/promises";
1520
1251
 
1521
1252
  // src/signal-display.ts
1522
- import chalk6 from "chalk";
1253
+ import chalk5 from "chalk";
1523
1254
  function pctFromSignalValue(value) {
1524
1255
  if (value === null || value === void 0 || Number.isNaN(value)) return null;
1525
1256
  return Math.abs(value) <= 1 ? value * 100 : value;
@@ -1532,14 +1263,14 @@ function formatGap(value) {
1532
1263
  if (value === null || value === void 0 || Number.isNaN(value)) return "n/a";
1533
1264
  const points = Math.abs(value) <= 1 ? value * 100 : value;
1534
1265
  const formatted = `${points >= 0 ? "+" : ""}${points.toFixed(1)}pp`;
1535
- if (points > 0) return chalk6.green(formatted);
1536
- if (points < 0) return chalk6.red(formatted);
1537
- return chalk6.dim(formatted);
1266
+ if (points > 0) return chalk5.green(formatted);
1267
+ if (points < 0) return chalk5.red(formatted);
1268
+ return chalk5.dim(formatted);
1538
1269
  }
1539
1270
  function formatStrength(value) {
1540
- if (value === "strong") return chalk6.green("strong");
1541
- if (value === "weak") return chalk6.yellow("weak");
1542
- return value ? chalk6.dim(value) : "n/a";
1271
+ if (value === "strong") return chalk5.green("strong");
1272
+ if (value === "weak") return chalk5.yellow("weak");
1273
+ return value ? chalk5.dim(value) : "n/a";
1543
1274
  }
1544
1275
  function analysisItems(result) {
1545
1276
  if (!result) return [];
@@ -1586,27 +1317,27 @@ function displaySignalAnalysis(response, globalOpts) {
1586
1317
  for (const item of items.slice(0, 3)) {
1587
1318
  const analysis = item.analysis;
1588
1319
  if (!analysis) continue;
1589
- process.stdout.write("\n " + chalk6.bold(truncate(titleFor(analysis), 76)) + "\n");
1320
+ process.stdout.write("\n " + chalk5.bold(truncate(titleFor(analysis), 76)) + "\n");
1590
1321
  if (analysis.market_link) {
1591
- process.stdout.write(" " + chalk6.dim("Polymarket: ") + analysis.market_link + "\n");
1322
+ process.stdout.write(" " + chalk5.dim("Polymarket: ") + analysis.market_link + "\n");
1592
1323
  }
1593
1324
  if (analysis.key_factors && analysis.key_factors.length > 0) {
1594
- process.stdout.write(" " + chalk6.dim("Key factors: ") + analysis.key_factors.slice(0, 4).join("; ") + "\n");
1325
+ process.stdout.write(" " + chalk5.dim("Key factors: ") + analysis.key_factors.slice(0, 4).join("; ") + "\n");
1595
1326
  }
1596
1327
  if (analysis.research_findings) {
1597
1328
  process.stdout.write(
1598
- " " + chalk6.dim("Research: ") + truncate(analysis.research_findings, 180) + "\n"
1329
+ " " + chalk5.dim("Research: ") + truncate(analysis.research_findings, 180) + "\n"
1599
1330
  );
1600
1331
  }
1601
1332
  }
1602
1333
  if (items.length > 3) {
1603
- process.stdout.write(chalk6.dim(`
1334
+ process.stdout.write(chalk5.dim(`
1604
1335
  ... and ${items.length - 3} more
1605
1336
  `));
1606
1337
  }
1607
1338
  if (result?.strong_signal_count !== void 0) {
1608
1339
  process.stdout.write(
1609
- chalk6.dim(`
1340
+ chalk5.dim(`
1610
1341
  Strong signals: ${result.strong_signal_count}
1611
1342
  `)
1612
1343
  );
@@ -1614,7 +1345,7 @@ function displaySignalAnalysis(response, globalOpts) {
1614
1345
  }
1615
1346
 
1616
1347
  // src/commands/signal.ts
1617
- function requireAuth6(client) {
1348
+ function requireAuth5(client) {
1618
1349
  if (!client.isAuthenticated) {
1619
1350
  error("Not authenticated. Run `hl auth login` first.");
1620
1351
  process.exit(1);
@@ -1626,20 +1357,20 @@ function collect(value, previous = []) {
1626
1357
  function parseProbability(value) {
1627
1358
  const n = Number(value);
1628
1359
  if (!Number.isFinite(n) || n < 0 || n > 100) {
1629
- throw new InvalidArgumentError3("Expected a probability between 0 and 100");
1360
+ throw new InvalidArgumentError("Expected a probability between 0 and 100");
1630
1361
  }
1631
1362
  return n;
1632
1363
  }
1633
- async function readStdin2() {
1364
+ async function readStdin() {
1634
1365
  const chunks = [];
1635
1366
  for await (const chunk of process.stdin) {
1636
1367
  chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
1637
1368
  }
1638
1369
  return Buffer.concat(chunks).toString("utf8");
1639
1370
  }
1640
- async function readMarketPayload2(path) {
1371
+ async function readMarketPayload(path) {
1641
1372
  if (!path) return {};
1642
- const raw = path === "-" ? await readStdin2() : await readFile2(path, "utf8");
1373
+ const raw = path === "-" ? await readStdin() : await readFile(path, "utf8");
1643
1374
  const parsed = JSON.parse(raw);
1644
1375
  if (Array.isArray(parsed)) {
1645
1376
  return { markets: parsed };
@@ -1669,7 +1400,7 @@ async function buildSignalPayload(positionalUrl, opts) {
1669
1400
  const urls = [positionalUrl, ...opts.url ?? []].filter(
1670
1401
  (value) => Boolean(value)
1671
1402
  );
1672
- const filePayload = await readMarketPayload2(opts.market);
1403
+ const filePayload = await readMarketPayload(opts.market);
1673
1404
  const inlineMarket = inlineMarketFromOptions(opts);
1674
1405
  const hasMarketInput = Boolean(filePayload.market || filePayload.markets || inlineMarket);
1675
1406
  if (urls.length > 0 && hasMarketInput) {
@@ -1698,7 +1429,7 @@ function registerSignalCommands(program2) {
1698
1429
  signal.command("analyze").description("Estimate true YES probability and compare it with market pricing").argument("[url]", "Polymarket market/event URL to analyze").option("--url <url>", "Additional Polymarket URL; repeat for multiple markets", collect, []).option("--market <file>", "Inline market JSON object/array; use '-' to read stdin").option("--context <text>", "Prior search notes or analysis context for the agent").option("--question <text>", "Inline market question when not using a URL").option("--description <text>", "Inline market description or resolution criteria").option("--yes-prob <prob>", "Current YES probability or price, e.g. 0.52 or 52", parseProbability).option("--no-prob <prob>", "Current NO probability or price, e.g. 0.48 or 48", parseProbability).option("--slug <slug>", "Inline market slug").option("--link <url>", "Inline market link").action(async (url, o) => {
1699
1430
  const globalOpts = program2.opts();
1700
1431
  const client = new ApiClient(globalOpts);
1701
- requireAuth6(client);
1432
+ requireAuth5(client);
1702
1433
  let payload;
1703
1434
  try {
1704
1435
  payload = await buildSignalPayload(url, o);
@@ -1715,38 +1446,38 @@ function registerSignalCommands(program2) {
1715
1446
  }
1716
1447
 
1717
1448
  // src/commands/quote.ts
1718
- import { InvalidArgumentError as InvalidArgumentError4 } from "commander";
1719
- function requireAuth7(client) {
1449
+ import { InvalidArgumentError as InvalidArgumentError2 } from "commander";
1450
+ function requireAuth6(client) {
1720
1451
  if (!client.isAuthenticated) {
1721
1452
  error("Not authenticated. Run `hl auth login` first.");
1722
1453
  process.exit(1);
1723
1454
  }
1724
1455
  }
1725
- function parsePositiveNumber2(value) {
1456
+ function parsePositiveNumber(value) {
1726
1457
  const parsed = Number(value);
1727
1458
  if (!Number.isFinite(parsed) || parsed <= 0) {
1728
- throw new InvalidArgumentError4("Expected a positive number");
1459
+ throw new InvalidArgumentError2("Expected a positive number");
1729
1460
  }
1730
1461
  return parsed;
1731
1462
  }
1732
1463
  function parseQuoteAction(value) {
1733
1464
  const normalized = value.trim().toUpperCase();
1734
1465
  if (normalized !== "BUY" && normalized !== "SELL") {
1735
- throw new InvalidArgumentError4("Expected buy or sell");
1466
+ throw new InvalidArgumentError2("Expected buy or sell");
1736
1467
  }
1737
1468
  return normalized;
1738
1469
  }
1739
1470
  function parseQuoteOutcome(value) {
1740
1471
  const normalized = value.trim().toUpperCase();
1741
1472
  if (normalized !== "YES" && normalized !== "NO") {
1742
- throw new InvalidArgumentError4("Expected yes or no");
1473
+ throw new InvalidArgumentError2("Expected yes or no");
1743
1474
  }
1744
1475
  return normalized;
1745
1476
  }
1746
1477
  function parseQuoteRoute(value) {
1747
1478
  const normalized = value.trim().toLowerCase();
1748
1479
  if (normalized !== "auto" && normalized !== "aggressive" && normalized !== "passive") {
1749
- throw new InvalidArgumentError4("Expected auto, aggressive, or passive");
1480
+ throw new InvalidArgumentError2("Expected auto, aggressive, or passive");
1750
1481
  }
1751
1482
  return normalized;
1752
1483
  }
@@ -1874,10 +1605,10 @@ function displayQuotePreview(preview, globalOpts) {
1874
1605
  `));
1875
1606
  }
1876
1607
  function registerQuoteCommand(program2) {
1877
- program2.command("quote").description("Preview the cost, liquidity, and risk of a Polymarket trade").argument("<slug-or-url>", "Polymarket market slug or URL").requiredOption("--action <action>", "buy | sell", parseQuoteAction).requiredOption("--outcome <outcome>", "yes | no", parseQuoteOutcome).option("--cash <usd>", "Maximum cash to spend (BUY only)", parsePositiveNumber2).option("--shares <shares>", "Number of outcome shares", parsePositiveNumber2).option("--signal-id <uuid>", "Saved Signal forecast to include in edge calculations").option("--capital <usd>", "Manual portfolio capital for non-binding BUY sizing", parsePositiveNumber2).option("--route <route>", "auto | aggressive | passive", parseQuoteRoute, "auto").option("--save", "Save a freshly generated preview to quote history").action(async (instrument, opts) => {
1608
+ program2.command("quote").description("Preview the cost, liquidity, and risk of a Polymarket trade").argument("<slug-or-url>", "Polymarket market slug or URL").requiredOption("--action <action>", "buy | sell", parseQuoteAction).requiredOption("--outcome <outcome>", "yes | no", parseQuoteOutcome).option("--cash <usd>", "Maximum cash to spend (BUY only)", parsePositiveNumber).option("--shares <shares>", "Number of outcome shares", parsePositiveNumber).option("--signal-id <uuid>", "Saved Signal forecast to include in edge calculations").option("--capital <usd>", "Manual portfolio capital for non-binding BUY sizing", parsePositiveNumber).option("--route <route>", "auto | aggressive | passive", parseQuoteRoute, "auto").option("--save", "Save a freshly generated preview to quote history").action(async (instrument, opts) => {
1878
1609
  const globalOpts = program2.opts();
1879
1610
  const client = new ApiClient(globalOpts);
1880
- requireAuth7(client);
1611
+ requireAuth6(client);
1881
1612
  let payload;
1882
1613
  try {
1883
1614
  payload = buildQuotePayload(instrument, opts);
@@ -1894,14 +1625,13 @@ function registerQuoteCommand(program2) {
1894
1625
  }
1895
1626
 
1896
1627
  // src/index.ts
1897
- var program = new Command4();
1898
- program.name("hl").description("Hedge Layer CLI \u2014 prediction market intelligence from the terminal").version("3.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");
1628
+ 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");
1899
1630
  registerAuthCommands(program);
1900
1631
  registerBriefCommands(program);
1901
1632
  registerProfileCommand(program);
1902
1633
  registerResearchCommands(program);
1903
1634
  registerFeedCommand(program);
1904
- registerLpCommands(program);
1905
1635
  registerSignalCommands(program);
1906
1636
  registerQuoteCommand(program);
1907
1637
  program.hook("preAction", (_thisCommand, actionCommand) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/config.ts","../src/client.ts","../src/output.ts","../src/commands/brief.ts","../src/stream.ts","../src/commands/profile.ts","../src/commands/research.ts","../src/feed-display.ts","../src/commands/feed.ts","../src/commands/lp.ts","../src/allocator-display.ts","../src/commands/allocator.ts","../src/commands/signal.ts","../src/signal-display.ts","../src/commands/quote.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerBriefCommands } from \"./commands/brief.js\";\n\nimport { registerProfileCommand } from \"./commands/profile.js\";\nimport { registerResearchCommands } from \"./commands/research.js\";\nimport { registerFeedCommand } from \"./commands/feed.js\";\nimport { registerLpCommands } from \"./commands/lp.js\";\nimport { registerSignalCommands } from \"./commands/signal.js\";\nimport { registerQuoteCommand } from \"./commands/quote.js\";\nimport * as out from \"./output.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"hl\")\n .description(\"Hedge Layer CLI — prediction market intelligence from the terminal\")\n .version(__VERSION__)\n .option(\"--json\", \"Output as JSON (machine-readable)\")\n .option(\"--api-url <url>\", \"Override API base URL\")\n .option(\"--token <token>\", \"Override stored API token\")\n .option(\"--verbose\", \"Show HTTP request details\")\n .option(\"--no-color\", \"Disable colored output\");\n\nregisterAuthCommands(program);\nregisterBriefCommands(program);\n\nregisterProfileCommand(program);\nregisterResearchCommands(program);\nregisterFeedCommand(program);\nregisterLpCommands(program);\nregisterSignalCommands(program);\nregisterQuoteCommand(program);\n\nprogram.hook(\"preAction\", (_thisCommand, actionCommand) => {\n const opts = program.opts();\n if (opts.color === false) {\n process.env.FORCE_COLOR = \"0\";\n }\n if (opts.verbose) {\n const cmdName = actionCommand.name();\n process.stderr.write(out.dim(`[verbose] Running: hl ${cmdName}\\n`));\n }\n});\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) {\n out.error(e.message);\n } else {\n out.error(`Unexpected error: ${e instanceof Error ? e.message : String(e)}`);\n if (program.opts().verbose) {\n console.error(e);\n }\n }\n process.exit(1);\n }\n}\n\nmain();\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport { loadConfig, saveConfig, clearConfig, configPath, DEFAULT_API_URL } from \"../config.js\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command(\"auth\").description(\"Manage API authentication\");\n\n auth\n .command(\"login\")\n .description(\"Authenticate with a Hedge Layer API token\")\n .option(\"--api-url <url>\", \"API base URL\", DEFAULT_API_URL)\n .action(async (cmdOpts: { apiUrl?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n try {\n out.heading(\"Hedge Layer CLI — Login\");\n process.stderr.write(\n `Create an API token at ${out.bold(\"https://hedgelayer.ai/account/settings\")} → API Tokens\\n\\n`,\n );\n\n const token = (await rl.question(\"Paste your API token: \")).trim();\n\n if (!token.startsWith(\"hl_\") || token.length !== 43) {\n out.error('Invalid token format. Tokens start with \"hl_\" and are 43 characters.');\n process.exit(1);\n }\n\n const apiUrl = globalOpts.apiUrl ?? cmdOpts.apiUrl ?? DEFAULT_API_URL;\n const client = new ApiClient({ token, apiUrl });\n\n process.stderr.write(\"\\nValidating token...\");\n let profile: UserProfile;\n try {\n profile = await client.get<UserProfile>(\"/api/profile\");\n } catch {\n process.stderr.write(\"\\n\");\n out.error(\"Token validation failed. Check your token and try again.\");\n process.exit(1);\n }\n process.stderr.write(\" done\\n\\n\");\n\n saveConfig({ api_url: apiUrl, token });\n\n out.success(`Logged in as ${out.bold(profile.handle || profile.user_id)}`);\n process.stderr.write(` Config saved to ${out.dim(configPath())}\\n`);\n } finally {\n rl.close();\n }\n });\n\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const config = loadConfig();\n const token = globalOpts.token ?? config.token;\n\n if (!token) {\n out.warn(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" to authenticate.\");\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n\n try {\n const profile = await client.get<UserProfile>(\"/api/profile\");\n if (globalOpts.json) {\n out.json({\n authenticated: true,\n handle: profile.handle,\n user_id: profile.user_id,\n api_url: client.apiUrl,\n });\n } else {\n out.heading(\"Auth Status\");\n out.table(\n [\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"API URL\", client.apiUrl],\n [\"Config\", configPath()],\n ],\n );\n }\n } catch {\n out.error(\"Token is invalid or expired. Run \" + out.bold(\"hl auth login\") + \" to re-authenticate.\");\n process.exit(1);\n }\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored API token\")\n .action(() => {\n clearConfig();\n out.success(\"Logged out. Token removed from \" + out.dim(configPath()));\n });\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CONFIG_DIR = join(homedir(), \".hedgelayer\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport const DEFAULT_API_URL = \"https://hedgelayer.ai\";\n\nexport interface Config {\n api_url: string;\n token: string | null;\n}\n\nfunction defaultConfig(): Config {\n return { api_url: DEFAULT_API_URL, token: null };\n}\n\nexport function loadConfig(): Config {\n try {\n if (!existsSync(CONFIG_FILE)) return defaultConfig();\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw);\n return {\n api_url: parsed.api_url ?? DEFAULT_API_URL,\n token: parsed.token ?? null,\n };\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfig(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function clearConfig(): void {\n try {\n if (existsSync(CONFIG_FILE)) unlinkSync(CONFIG_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function configPath(): string {\n return CONFIG_FILE;\n}\n","import type { GlobalOptions } from \"./types.js\";\nimport { loadConfig, DEFAULT_API_URL } from \"./config.js\";\n\nexport class ApiClient {\n private baseUrl: string;\n private token: string | null;\n private verbose: boolean;\n\n constructor(opts: GlobalOptions = {}) {\n const config = loadConfig();\n this.baseUrl = (opts.apiUrl ?? config.api_url ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.token = opts.token ?? config.token ?? null;\n this.verbose = opts.verbose ?? false;\n }\n\n get isAuthenticated(): boolean {\n return this.token !== null;\n }\n\n get apiUrl(): string {\n return this.baseUrl;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n const h: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n if (this.token) {\n h[\"Authorization\"] = `Bearer ${this.token}`;\n }\n return h;\n }\n\n private log(method: string, path: string, status?: number): void {\n if (!this.verbose) return;\n const statusStr = status ? ` → ${status}` : \"\";\n process.stderr.write(`[verbose] ${method} ${this.baseUrl}${path}${statusStr}\\n`);\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== \"\") url.searchParams.set(k, v);\n }\n }\n\n this.log(\"GET\", `${url.pathname}${url.search}`);\n const res = await fetch(url.toString(), { headers: this.headers() });\n this.log(\"GET\", `${url.pathname}${url.search}`, res.status);\n\n if (!res.ok) {\n const body = await res.text();\n throw new ApiError(res.status, body);\n }\n return res.json() as Promise<T>;\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n this.log(\"POST\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n /**\n * POST /api/brief with stream: false — returns the Market Brief JSON body\n * plus optional telemetry from response headers.\n */\n async postBriefSync(query: string): Promise<{\n brief: Record<string, unknown>;\n durationMs: number | null;\n stepsCompleted: number | null;\n toolsUsed: string[];\n }> {\n const path = \"/api/brief\";\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({ query, stream: false }),\n });\n this.log(\"POST\", path, res.status);\n\n const text = await res.text();\n if (!res.ok) {\n throw new ApiError(res.status, text);\n }\n\n let brief: Record<string, unknown>;\n try {\n brief = JSON.parse(text) as Record<string, unknown>;\n } catch {\n throw new ApiError(res.status, text || \"Invalid JSON from /api/brief\");\n }\n\n const dur = res.headers.get(\"X-Duration-Ms\");\n const steps = res.headers.get(\"X-Steps-Completed\");\n const tools = res.headers.get(\"X-Tools-Used\");\n\n return {\n brief,\n durationMs: dur != null ? Number(dur) : null,\n stepsCompleted: steps != null ? Number(steps) : null,\n toolsUsed: tools ? tools.split(\",\").filter(Boolean) : [],\n };\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n this.log(\"PATCH\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n this.log(\"PATCH\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n async delete(path: string): Promise<void> {\n this.log(\"DELETE\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"DELETE\",\n headers: this.headers(),\n });\n this.log(\"DELETE\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n }\n\n async stream(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (stream)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"text/event-stream\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (stream)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n\n async streamNdjson(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (ndjson)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"application/x-ndjson\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (ndjson)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n let msg: string;\n try {\n const parsed = JSON.parse(body);\n msg = parsed.error ?? parsed.message ?? body;\n } catch {\n msg = body;\n }\n super(`API error ${status}: ${msg}`);\n this.name = \"ApiError\";\n }\n}\n","import chalk from \"chalk\";\n\nexport function json(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, stripAnsi(row[i]).length);\n }\n }\n\n for (let r = 0; r < allRows.length; r++) {\n const row = allRows[r];\n const padded = row.map((cell, i) => {\n const bare = stripAnsi(cell);\n const pad = colWidths[i] - bare.length;\n return cell + \" \".repeat(Math.max(0, pad));\n });\n process.stdout.write(\" \" + padded.join(\" \") + \"\\n\");\n\n if (r === 0 && headers) {\n const sep = colWidths.map((w) => \"─\".repeat(w)).join(\"──\");\n process.stdout.write(\" \" + sep + \"\\n\");\n }\n }\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport function heading(text: string): void {\n process.stdout.write(\"\\n\" + chalk.bold(text) + \"\\n\\n\");\n}\n\nexport function success(text: string): void {\n process.stdout.write(chalk.green(\"✓\") + \" \" + text + \"\\n\");\n}\n\nexport function warn(text: string): void {\n process.stdout.write(chalk.yellow(\"⚠\") + \" \" + text + \"\\n\");\n}\n\nexport function error(text: string): void {\n process.stderr.write(chalk.red(\"✗\") + \" \" + text + \"\\n\");\n}\n\nexport function dim(text: string): string {\n return chalk.dim(text);\n}\n\nexport function bold(text: string): string {\n return chalk.bold(text);\n}\n\nexport function currency(n: number): string {\n return \"$\" + n.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n}\n\nexport function compactCurrency(n: number): string {\n if (!n || isNaN(n)) return \"$0\";\n if (n >= 1_000_000) return `$${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `$${(n / 1_000).toFixed(1)}K`;\n return `$${n.toFixed(0)}`;\n}\n\nexport function percent(n: number): string {\n return (n * 100).toFixed(1) + \"%\";\n}\n\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nexport function relativeTime(date: string): string {\n const diff = Date.now() - new Date(date).getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseNdjsonStream } from \"../stream.js\";\nimport type { MarketBrief, BriefRequest, BriefRequestFilters, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerBriefCommands(program: Command): void {\n program\n .command(\"brief <query>\")\n .description(\"Generate a Market Brief for a topic (non-interactive)\")\n .option(\"-l, --location <location>\", \"Geographic context (e.g. 'Middle East', 'US')\")\n .option(\"-t, --time-horizon <horizon>\", \"Time frame (e.g. '3 months', '2026')\")\n .option(\"--tags <tags>\", \"Comma-separated focus area tags (e.g. 'geopolitics,energy')\")\n .option(\"--min-volume <n>\", \"Minimum market volume in USD\", parseFloat)\n .option(\"--max-yes-price <n>\", \"Maximum YES price (0-1)\", parseFloat)\n .action(async (query: string, cmdOpts: BriefCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const filters = buildFilters(cmdOpts);\n const body: BriefRequest = {\n query,\n ...(cmdOpts.location && { location: cmdOpts.location }),\n ...(cmdOpts.timeHorizon && { timeHorizon: cmdOpts.timeHorizon }),\n ...(filters && { filters }),\n stream: true,\n };\n\n await runStreaming(client, body, globalOpts);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Command option types\n// ---------------------------------------------------------------------------\n\ninterface BriefCmdOpts {\n location?: string;\n timeHorizon?: string;\n tags?: string;\n minVolume?: number;\n maxYesPrice?: number;\n}\n\nfunction buildFilters(opts: BriefCmdOpts): BriefRequestFilters | undefined {\n const tags = opts.tags?.split(\",\").map((t) => t.trim()).filter(Boolean);\n const hasFilters = opts.minVolume != null || opts.maxYesPrice != null || (tags && tags.length > 0);\n if (!hasFilters) return undefined;\n return {\n ...(opts.minVolume != null && { minVolume: opts.minVolume }),\n ...(opts.maxYesPrice != null && { maxYesPrice: opts.maxYesPrice }),\n ...(tags && tags.length > 0 && { tags }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming mode (default)\n// ---------------------------------------------------------------------------\n\nasync function runStreaming(client: ApiClient, body: BriefRequest, globalOpts: GlobalOptions): Promise<void> {\n const startTime = Date.now();\n process.stderr.write(chalk.dim(` Generating brief for \"${out.truncate(body.query, 50)}\"...\\n`));\n\n const stream = await client.streamNdjson(\"/api/brief\", body);\n const result = await parseNdjsonStream(stream, {\n onProgress: (step, message) => {\n process.stderr.write(chalk.dim(` [${step}] `) + message + \"\\n\");\n },\n });\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n\n if (result.error) {\n out.error(`Brief failed (${result.error.code}): ${result.error.message}`);\n process.exit(1);\n }\n\n if (!result.brief) {\n out.error(\"No Market Brief was produced.\");\n process.exit(1);\n }\n\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n displayBrief(result.brief as unknown as MarketBrief, globalOpts);\n}\n\n// ---------------------------------------------------------------------------\n// Display\n// ---------------------------------------------------------------------------\n\nfunction displayBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n const marketCount = brief.marketCount ?? brief.markets.length;\n process.stdout.write(\"\\n \" + chalk.dim(`${marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","/**\n * Parses the Vercel AI SDK UI Message Stream protocol (SSE format).\n *\n * The server sends Server-Sent Events where each `data:` line contains\n * a JSON object with a `type` field:\n * text-delta: { type, id, delta }\n * tool-input-start: { type, toolCallId, toolName }\n * tool-input-delta: { type, toolCallId, inputTextDelta }\n * tool-input-available: { type, toolCallId, toolName, input }\n * tool-output-available:{ type, toolCallId, output }\n * error: { type, errorText }\n * [DONE]: stream termination sentinel\n */\n\nexport interface StreamCallbacks {\n onText?: (text: string) => void;\n onToolCall?: (name: string, args: unknown) => void;\n onToolResult?: (name: string, result: unknown) => void;\n}\n\nexport interface StreamResult {\n assistantText: string;\n toolCalls: Array<{ name: string; args: unknown }>;\n marketBrief: Record<string, unknown> | null;\n feedResult: Record<string, unknown> | null;\n}\n\nexport async function parseStream(\n body: ReadableStream<Uint8Array>,\n callbacks: StreamCallbacks = {},\n): Promise<StreamResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let assistantText = \"\";\n const toolCalls: Array<{ name: string; args: unknown }> = [];\n const activeToolCalls = new Map<string, { name: string; argStr: string }>();\n let marketBrief: Record<string, unknown> | null = null;\n let feedResult: Record<string, unknown> | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\":\")) continue;\n\n if (!trimmed.startsWith(\"data:\")) continue;\n const payload = trimmed.slice(5).trim();\n\n if (payload === \"[DONE]\") continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(payload);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"text-delta\": {\n const delta = msg.delta as string;\n if (delta) {\n assistantText += delta;\n callbacks.onText?.(delta);\n }\n break;\n }\n\n case \"tool-input-start\": {\n const id = msg.toolCallId as string;\n const name = msg.toolName as string;\n if (id && name) {\n activeToolCalls.set(id, { name, argStr: \"\" });\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n active.argStr += msg.inputTextDelta as string;\n }\n break;\n }\n\n case \"tool-input-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n const args = msg.input ?? active.argStr;\n toolCalls.push({ name: active.name, args });\n callbacks.onToolCall?.(active.name, args);\n }\n break;\n }\n\n case \"tool-output-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n callbacks.onToolResult?.(active.name, msg.output);\n if (active.name === \"buildMarketBrief\" && isMarketBrief(msg.output)) {\n marketBrief = msg.output as Record<string, unknown>;\n }\n if (active.name === \"getFeed\" && isFeedResult(msg.output)) {\n feedResult = msg.output as Record<string, unknown>;\n }\n activeToolCalls.delete(id);\n }\n break;\n }\n\n case \"error\": {\n throw new Error((msg.errorText as string) ?? \"Unknown stream error\");\n }\n }\n }\n\n if (done) break;\n }\n\n return { assistantText, toolCalls, marketBrief, feedResult };\n}\n\nfunction isMarketBrief(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"title\" in (val as Record<string, unknown>) &&\n \"markets\" in (val as Record<string, unknown>)\n );\n}\n\nfunction isFeedResult(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"markets\" in (val as Record<string, unknown>) &&\n \"sortedBy\" in (val as Record<string, unknown>)\n );\n}\n\n// ---------------------------------------------------------------------------\n// NDJSON stream parser (for POST /api/brief)\n// ---------------------------------------------------------------------------\n\nexport interface NdjsonCallbacks {\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface NdjsonBriefResult {\n brief: Record<string, unknown> | null;\n error: { code: string; message: string } | null;\n}\n\n/**\n * Parses an NDJSON stream from the /api/brief endpoint.\n *\n * Each line is a JSON object with a `type` field:\n * progress: { type, step, message }\n * brief: { type, data: MarketBrief }\n * error: { type, code, message }\n */\nexport async function parseNdjsonStream(\n body: ReadableStream<Uint8Array>,\n callbacks: NdjsonCallbacks = {},\n): Promise<NdjsonBriefResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let brief: Record<string, unknown> | null = null;\n let error: { code: string; message: string } | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(trimmed);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"progress\": {\n callbacks.onProgress?.(msg.step as string, msg.message as string);\n break;\n }\n case \"brief\": {\n brief = msg.data as Record<string, unknown>;\n break;\n }\n case \"error\": {\n error = {\n code: msg.code as string,\n message: msg.message as string,\n };\n break;\n }\n }\n }\n\n if (done) break;\n }\n\n return { brief, error };\n}\n","import { Command } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerProfileCommand(program: Command): void {\n program\n .command(\"profile\")\n .description(\"Show your user profile\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const profile = await client.get<UserProfile>(\"/api/profile\");\n\n if (globalOpts.json) {\n out.json(profile);\n return;\n }\n\n out.heading(\"Profile\");\n out.table([\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"Created\", new Date(profile.created_at).toLocaleDateString()],\n ]);\n });\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseStream } from \"../stream.js\";\nimport type { Assessment, MarketBrief, FeedResult, GlobalOptions } from \"../types.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport * as out from \"../output.js\";\n\nexport function registerResearchCommands(program: Command): void {\n const research = program.command(\"research\").description(\"AI-powered market research\");\n\n research\n .command(\"start\", { isDefault: true })\n .description(\"Start an interactive market research session\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const { id } = await client.post<{ id: string }>(\"/api/assessments\");\n\n out.heading(\"Market Research\");\n process.stderr.write(\n chalk.dim(\" Describe a topic or thesis to explore. Type /quit to exit.\\n\\n\"),\n );\n\n let msgCounter = 0;\n const uiMsg = (role: string, content: string) => ({\n id: `msg-${++msgCounter}`,\n role,\n content,\n parts: [{ type: \"text\" as const, text: content }],\n });\n\n const messages: ReturnType<typeof uiMsg>[] = [];\n let firstMessageTs: number | null = null;\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n\n try {\n while (true) {\n const userInput = await rl.question(chalk.cyan(\"You: \"));\n if (!userInput.trim()) continue;\n if (userInput.trim() === \"/quit\") break;\n\n if (firstMessageTs === null) firstMessageTs = Date.now();\n messages.push(uiMsg(\"user\", userInput));\n\n process.stderr.write(chalk.dim(\"\\nAssistant: \"));\n\n try {\n const body = await client.stream(\"/api/chat\", {\n messages,\n assessmentId: id,\n });\n\n const result = await parseStream(body, {\n onText: (text) => process.stderr.write(text),\n onToolCall: (name) => {\n process.stderr.write(chalk.dim(`\\n [tool: ${name}]\\n`));\n },\n onToolResult: (name, toolResult) => {\n if (globalOpts.verbose) {\n process.stderr.write(chalk.dim(` [result: ${name}] ${JSON.stringify(toolResult).slice(0, 200)}\\n`));\n }\n },\n });\n\n process.stderr.write(\"\\n\\n\");\n\n if (result.assistantText) {\n messages.push(uiMsg(\"assistant\", result.assistantText));\n }\n\n try {\n await persistAssessment(client, id, messages, result.marketBrief, firstMessageTs);\n } catch (persistErr) {\n out.warn(\n `Could not save session: ${persistErr instanceof Error ? persistErr.message : String(persistErr)}`,\n );\n }\n\n if (result.feedResult) {\n displayFeedResult(result.feedResult as unknown as FeedResult, globalOpts);\n }\n\n if (result.marketBrief) {\n displayMarketBrief(result.marketBrief as unknown as MarketBrief, globalOpts);\n break;\n }\n } catch (e) {\n process.stderr.write(\"\\n\");\n out.error(`Chat error: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n } finally {\n rl.close();\n }\n });\n\n research\n .command(\"run <query>\")\n .description(\"Run research on a topic and return the final Market Brief as JSON (via /api/brief)\")\n .action(async (query: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n process.stderr.write(chalk.dim(` Researching \"${out.truncate(query, 60)}\"...\\n`));\n const startTime = Date.now();\n\n const { brief, durationMs, stepsCompleted, toolsUsed } = await client.postBriefSync(query);\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n\n const looksLikeBrief =\n brief &&\n typeof brief === \"object\" &&\n Array.isArray((brief as { markets?: unknown }).markets) &&\n typeof (brief as { title?: unknown }).title === \"string\";\n\n if (looksLikeBrief) {\n out.json(brief as unknown as MarketBrief);\n } else {\n process.stderr.write(chalk.yellow(\"No market brief was produced.\\n\"));\n out.json({\n brief: null,\n text: null,\n metadata: {\n model: \"\",\n stepsUsed: stepsCompleted ?? 0,\n toolsUsed,\n durationMs: durationMs ?? Date.now() - startTime,\n },\n raw: brief,\n });\n }\n });\n\n research\n .command(\"list\")\n .description(\"List past research sessions\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .action(async (cmdOpts: { status?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params: Record<string, string> = { list: \"true\" };\n if (cmdOpts.status) params.status = cmdOpts.status;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", params);\n\n if (globalOpts.json) {\n out.json(data.assessments);\n return;\n }\n\n if (data.assessments.length === 0) {\n out.warn(\"No research sessions found.\");\n return;\n }\n\n out.heading(`Research Sessions (${data.assessments.length})`);\n\n const rows = data.assessments.map((a) => {\n const status = formatStatus(a.status);\n const brief = a.market_brief?.title ?? \"—\";\n const markets = a.market_brief ? String(a.market_brief.marketCount) : \"—\";\n return [a.id.slice(0, 8), status, out.truncate(brief, 30), markets, out.relativeTime(a.created_at)];\n });\n\n out.table(rows, [\"ID\", \"Status\", \"Brief\", \"Markets\", \"Created\"]);\n });\n\n research\n .command(\"show <id>\")\n .description(\"Show research session details (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n const assessment = await client.get<Assessment>(`/api/assessments/${fullId}`);\n\n if (globalOpts.json) {\n out.json(assessment);\n return;\n }\n\n out.heading(\"Research Session \" + out.dim(assessment.id.slice(0, 8)));\n\n out.table([\n [\"Status\", formatStatus(assessment.status)],\n [\"Created\", new Date(assessment.created_at).toLocaleString()],\n [\"Updated\", new Date(assessment.updated_at).toLocaleString()],\n ]);\n\n if (assessment.market_brief) {\n displayMarketBrief(assessment.market_brief, globalOpts);\n }\n });\n\n research\n .command(\"delete <id>\")\n .description(\"Delete a research session (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n await client.delete(`/api/assessments/${fullId}`);\n out.success(\"Research session deleted.\");\n });\n}\n\n/** Matches a full assessment UUID (e.g. 7f4fdace-a4b2-428d-87f1-fbf715165776). */\nconst FULL_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Resolve a user-supplied session identifier (a full UUID or the short 8-char\n * prefix printed by `hl research list`) against a set of known assessment IDs.\n *\n * Pure and synchronous so it can be unit-tested without network access.\n */\nexport function matchAssessmentId(idOrPrefix: string, ids: string[]): string {\n const needle = idOrPrefix.trim().toLowerCase();\n if (!needle) {\n throw new Error(\"No research session ID provided.\");\n }\n\n // Exact match wins outright (covers full UUIDs present in the list).\n const exact = ids.find((id) => id.toLowerCase() === needle);\n if (exact) return exact;\n\n const matches = ids.filter((id) => id.toLowerCase().startsWith(needle));\n if (matches.length === 1) return matches[0];\n\n if (matches.length === 0) {\n throw new Error(\n `No research session found matching \"${idOrPrefix}\". Run \\`hl research list\\` to see available sessions.`,\n );\n }\n\n const shortIds = matches.map((id) => id.slice(0, 8)).join(\", \");\n throw new Error(\n `\"${idOrPrefix}\" matches ${matches.length} research sessions (${shortIds}). Use a longer ID prefix to disambiguate.`,\n );\n}\n\n/**\n * Turn a full UUID or short ID prefix into the full assessment UUID.\n * Full UUIDs are returned directly (no extra API call); short prefixes are\n * resolved by listing the user's sessions and matching.\n */\nexport async function resolveAssessmentId(client: ApiClient, idOrPrefix: string): Promise<string> {\n const trimmed = idOrPrefix.trim();\n if (FULL_UUID.test(trimmed)) return trimmed;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", { list: \"true\" });\n return matchAssessmentId(\n trimmed,\n data.assessments.map((a) => a.id),\n );\n}\n\n/**\n * Resolve a session ID for a CLI action, printing a clean error and exiting on\n * an ambiguous/unknown identifier instead of surfacing it as an unexpected error.\n */\nasync function resolveOrExit(client: ApiClient, idOrPrefix: string): Promise<string> {\n try {\n return await resolveAssessmentId(client, idOrPrefix);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) throw e;\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n\n/** Mirrors web ChatInterface assessment PATCH (simplified metadata without tool-part extraction). */\nfunction buildAssessmentPatch(\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Record<string, unknown> {\n const patch: Record<string, unknown> = { messages };\n const meta: Record<string, unknown> = {\n timeToBriefMs: null,\n searchQueries: [],\n searchResultCounts: [],\n coverageHit: false,\n completedAt: null,\n };\n\n if (\n marketBrief &&\n typeof marketBrief === \"object\" &&\n Array.isArray((marketBrief as { markets?: unknown }).markets)\n ) {\n const markets = (marketBrief as { markets: unknown[] }).markets;\n patch.market_brief = marketBrief;\n patch.status = \"completed\";\n meta.timeToBriefMs = firstMessageTs != null ? Date.now() - firstMessageTs : null;\n meta.coverageHit = markets.length > 0;\n meta.completedAt = new Date().toISOString();\n }\n\n patch.metadata = meta;\n return patch;\n}\n\nasync function persistAssessment(\n client: ApiClient,\n assessmentId: string,\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Promise<void> {\n await client.patch(`/api/assessments/${assessmentId}`, buildAssessmentPatch(messages, marketBrief, firstMessageTs));\n}\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"in_progress\":\n return chalk.yellow(status);\n case \"abandoned\":\n return chalk.red(status);\n default:\n return status;\n }\n}\n\nfunction displayMarketBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n process.stdout.write(\"\\n \" + chalk.dim(`${brief.marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n","import chalk from \"chalk\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"./types.js\";\nimport * as out from \"./output.js\";\n\nconst SORT_LABELS: Record<string, string> = {\n score: \"attention score\",\n volume: \"24h volume\",\n liquidity: \"liquidity\",\n movement: \"price movement\",\n spread: \"spread tightness\",\n recency: \"recency\",\n extremity: \"uncertainty\",\n rewards: \"rewards\",\n rewardYield: \"reward yield (per $ liq)\",\n lpExpectedReturn: \"LP expected return\",\n horizon: \"time to resolution\",\n};\n\nfunction scoreBar(score: number): string {\n const width = 15;\n const filled = Math.round((score / 100) * width);\n const empty = width - filled;\n const color = score >= 70 ? chalk.green : score >= 45 ? chalk.yellow : chalk.dim;\n return color(\"█\".repeat(filled)) + chalk.dim(\"░\".repeat(empty)) + ` ${Math.round(score)}`;\n}\n\nexport function displayFeedResult(feed: FeedResult, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(feed);\n return;\n }\n\n const sortLabel = SORT_LABELS[feed.sortedBy] ?? feed.sortedBy;\n out.heading(`Market Feed — ${feed.marketsReturned} markets by ${sortLabel}`);\n process.stdout.write(\n chalk.dim(\n ` ${feed.totalScanned.toLocaleString()} scanned · ${feed.totalAfterFilter.toLocaleString()} after filters · preset ${feed.preset}\\n\\n`,\n ),\n );\n\n if (feed.markets.length === 0) {\n out.warn(\"No markets matched the criteria.\");\n return;\n }\n\n const rows = feed.markets.map((m: FeedResultMarket) => {\n const prob = out.percent(m.yesPrice);\n const change = m.oneDayPriceChange;\n const changeStr =\n change > 0\n ? chalk.green(`+${(change * 100).toFixed(1)}%`)\n : change < 0\n ? chalk.red(`${(change * 100).toFixed(1)}%`)\n : chalk.dim(\"0.0%\");\n return [\n String(m.rank),\n out.truncate(m.question, 42),\n prob,\n String(Math.round(m.score)),\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n changeStr,\n ];\n });\n\n out.table(rows, [\"#\", \"Market\", \"Prob\", \"Score\", \"24h Vol\", \"Liq\", \"Chg\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of feed.markets.slice(0, 5)) {\n const url = m.polymarketUrl;\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 55) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Score: \") + scoreBar(m.score) + \" \");\n process.stdout.write(chalk.dim(\"Spread: \") + m.spread.toFixed(3) + \" \");\n if (m.rewardsDailyRate > 0) {\n process.stdout.write(chalk.dim(\"Rewards: \") + `$${m.rewardsDailyRate.toFixed(2)}/day`);\n }\n process.stdout.write(\"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + url + \"\\n\");\n }\n\n if (feed.markets.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${feed.markets.length - 5} more\\n`));\n }\n}\n","import { Command } from \"commander\";\nimport { writeFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface FeedCmdOpts {\n profile?: string;\n sortBy?: string;\n preset?: string;\n tag?: string;\n minVolume?: string;\n minLiquidity?: string;\n maxLiquidity?: string;\n minRewardsDailyRate?: string;\n minDaysToEnd?: string;\n maxDaysToEnd?: string;\n maxMarketAgeHours?: string;\n liquidProfile?: string;\n limit?: string;\n}\n\ninterface FeedEnsembleOpts {\n limit?: string;\n output?: string;\n}\n\nexport interface EnsembleCandidate extends FeedResultMarket {\n ensembleScore: number;\n sourceProfiles: string[];\n sourceRanks: Record<string, number>;\n}\n\nexport interface FeedEnsembleResult {\n generatedAt: string;\n outputPath: string;\n totalSources: number;\n totalRawMarkets: number;\n totalCandidates: number;\n marketsReturned: number;\n candidates: EnsembleCandidate[];\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nconst PROFILE_CHOICES = [\"lp-opportunity\", \"liquidity-provider\", \"liquid-new-or-long\"] as const;\n\nfunction isProfile(s: string | undefined): s is (typeof PROFILE_CHOICES)[number] {\n return s !== undefined && (PROFILE_CHOICES as readonly string[]).includes(s);\n}\n\nexport function resolveFeedProfile(\n screening: string | undefined,\n profile: string | undefined,\n warn: (message: string) => void = () => undefined,\n): string | undefined {\n if (profile && !isProfile(profile)) {\n throw new Error(`Unknown feed profile \"${profile}\". Use: ${PROFILE_CHOICES.join(\" or \")}`);\n }\n\n if (!screening) return profile;\n\n if (!isProfile(screening)) {\n throw new Error(`Unknown screening \"${screening}\". Use: ${PROFILE_CHOICES.join(\" or \")}`);\n }\n\n if (profile && profile !== screening) {\n warn(`Both positional and --profile set; using --profile (${profile}).`);\n return profile;\n }\n\n return profile ?? screening;\n}\n\n/**\n * Build query params for GET /api/feed. Omits undefined / empty string.\n */\nfunction feedQueryParams(opts: {\n profile?: string;\n sortBy?: string;\n preset?: string;\n tag?: string;\n minVolume?: string;\n minLiquidity?: string;\n maxLiquidity?: string;\n minRewardsDailyRate?: string;\n minDaysToEnd?: string;\n maxDaysToEnd?: string;\n maxMarketAgeHours?: string;\n liquidProfile?: string;\n limit?: string;\n}): Record<string, string> {\n const entries: [string, string][] = [];\n const add = (k: string, v: string | undefined) => {\n if (v !== undefined && v !== \"\") entries.push([k, v]);\n };\n add(\"profile\", opts.profile);\n add(\"sortBy\", opts.sortBy);\n add(\"preset\", opts.preset);\n add(\"tag\", opts.tag);\n add(\"minVolume\", opts.minVolume);\n add(\"minLiquidity\", opts.minLiquidity);\n add(\"maxLiquidity\", opts.maxLiquidity);\n add(\"minRewardsDailyRate\", opts.minRewardsDailyRate);\n add(\"minDaysToEnd\", opts.minDaysToEnd);\n add(\"maxDaysToEnd\", opts.maxDaysToEnd);\n add(\"maxMarketAgeHours\", opts.maxMarketAgeHours);\n add(\"liquidProfile\", opts.liquidProfile);\n add(\"limit\", opts.limit);\n return Object.fromEntries(entries);\n}\n\nconst ENSEMBLE_SOURCES: Array<{ name: string; params: Record<string, string> }> = [\n { name: \"liquid-core\", params: { sortBy: \"liquidity\", preset: \"liquidity-focused\" } },\n { name: \"active-volume\", params: { sortBy: \"volume\", preset: \"volume-hunter\" } },\n { name: \"movers\", params: { sortBy: \"movement\", preset: \"price-movers\" } },\n { name: \"new-markets\", params: { sortBy: \"recency\", preset: \"new-markets\" } },\n { name: \"uncertainty\", params: { sortBy: \"extremity\" } },\n { name: \"lp-quality\", params: { profile: \"liquidity-provider\", sortBy: \"lpExpectedReturn\" } },\n];\n\nconst EXTREME_PROBABILITY_LOW = 0.07;\nconst EXTREME_PROBABILITY_HIGH = 0.93;\nconst EXTREME_PROBABILITY_MAX_PENALTY = 15;\nconst HORIZON_PEAK_DAYS = 365;\nconst HORIZON_LONG_TERM_DECAY_PER_YEAR = 4;\nconst HORIZON_LONG_TERM_FLOOR = 2;\nconst ENSEMBLE_SOURCE_SCORE_PER_SOURCE = 2;\nconst ENSEMBLE_SOURCE_SCORE_MAX = 8;\nconst ENSEMBLE_MAX_CANDIDATES_PER_EVENT = 2;\nconst ENSEMBLE_MAX_SINGLE_SOURCE_CANDIDATES = 5;\n\nfunction num(value: number | null | undefined): number {\n return Number.isFinite(value) ? Number(value) : 0;\n}\n\nfunction extremeProbabilityPenalty(candidate: FeedResultMarket): number {\n const probability = Number.isFinite(candidate.probability) ? Number(candidate.probability) : candidate.yesPrice;\n const boundedProbability = Math.max(0, Math.min(1, probability));\n\n if (boundedProbability < EXTREME_PROBABILITY_LOW) {\n return ((EXTREME_PROBABILITY_LOW - boundedProbability) / EXTREME_PROBABILITY_LOW) *\n EXTREME_PROBABILITY_MAX_PENALTY;\n }\n\n if (boundedProbability > EXTREME_PROBABILITY_HIGH) {\n return ((boundedProbability - EXTREME_PROBABILITY_HIGH) / (1 - EXTREME_PROBABILITY_HIGH)) *\n EXTREME_PROBABILITY_MAX_PENALTY;\n }\n\n return 0;\n}\n\nfunction horizonScore(days: number | null): number {\n if (days === null) return 2;\n if (days < 3) return 0;\n if (days <= HORIZON_PEAK_DAYS) {\n return Math.log1p(days) / Math.log1p(HORIZON_PEAK_DAYS) * 10;\n }\n\n const yearsPastPeak = (days - HORIZON_PEAK_DAYS) / HORIZON_PEAK_DAYS;\n return Math.max(HORIZON_LONG_TERM_FLOOR, 10 - yearsPastPeak * HORIZON_LONG_TERM_DECAY_PER_YEAR);\n}\n\nfunction scoreCandidate(candidate: FeedResultMarket, sourceCount: number): number {\n const liquidityScore = Math.min(25, Math.log1p(Math.max(0, candidate.liquidity)) / Math.log1p(1_000_000) * 25);\n const volumeScore = Math.min(25, Math.log1p(Math.max(0, candidate.volume24h)) / Math.log1p(1_000_000) * 25);\n const spreadScore = Math.max(0, Math.min(15, (0.12 - Math.max(0, candidate.spread)) / 0.12 * 15));\n const movementPenalty = Math.min(20, Math.abs(candidate.oneDayPriceChange) * 100);\n const probabilityPenalty = extremeProbabilityPenalty(candidate);\n const days = candidate.daysToEnd ?? null;\n const horizon = horizonScore(days);\n const rewardScore = Math.max(\n 0,\n Math.min(20, num(candidate.components?.rewardYield) * 0.1 + Math.max(0, num(candidate.lpExpectedReturnDailyPct)) * 50),\n );\n const sourceScore = Math.min(ENSEMBLE_SOURCE_SCORE_MAX, sourceCount * ENSEMBLE_SOURCE_SCORE_PER_SOURCE);\n return Math.round(\n (\n liquidityScore +\n volumeScore +\n spreadScore +\n horizon +\n rewardScore +\n sourceScore -\n movementPenalty -\n probabilityPenalty\n ) * 10,\n ) / 10;\n}\n\nfunction diversifyCandidates(candidates: EnsembleCandidate[], limit: number): EnsembleCandidate[] {\n const eventCounts = new Map<string, number>();\n const singleSourceCounts = new Map<string, number>();\n const diversified: EnsembleCandidate[] = [];\n\n for (const candidate of candidates) {\n const eventKey = candidate.eventSlug || candidate.slug;\n const eventCount = eventCounts.get(eventKey) ?? 0;\n if (eventCount >= ENSEMBLE_MAX_CANDIDATES_PER_EVENT) continue;\n\n const singleSource = candidate.sourceProfiles.length === 1 ? candidate.sourceProfiles[0] : null;\n if (singleSource !== null) {\n const sourceCount = singleSourceCounts.get(singleSource) ?? 0;\n if (sourceCount >= ENSEMBLE_MAX_SINGLE_SOURCE_CANDIDATES) continue;\n singleSourceCounts.set(singleSource, sourceCount + 1);\n }\n\n eventCounts.set(eventKey, eventCount + 1);\n diversified.push(candidate);\n if (diversified.length >= limit) break;\n }\n\n return diversified;\n}\n\nexport function buildFeedEnsemble(\n sourceResults: Array<{ source: string; result: FeedResult }>,\n limit: number,\n outputPath = \"candidates.json\",\n generatedAt = new Date().toISOString(),\n): FeedEnsembleResult {\n const bySlug = new Map<string, EnsembleCandidate>();\n let totalRawMarkets = 0;\n\n for (const { source, result } of sourceResults) {\n for (const market of result.markets ?? []) {\n totalRawMarkets++;\n const existing = bySlug.get(market.slug);\n if (!existing) {\n bySlug.set(market.slug, {\n ...market,\n ensembleScore: 0,\n sourceProfiles: [source],\n sourceRanks: { [source]: market.rank },\n });\n continue;\n }\n\n existing.sourceProfiles.push(source);\n existing.sourceRanks[source] = market.rank;\n if (market.score > existing.score) existing.score = market.score;\n existing.volume24h = Math.max(existing.volume24h, market.volume24h);\n existing.liquidity = Math.max(existing.liquidity, market.liquidity);\n existing.rewardsDailyRate = Math.max(existing.rewardsDailyRate, market.rewardsDailyRate);\n existing.lpExpectedReturnDailyPct = Math.max(\n num(existing.lpExpectedReturnDailyPct),\n num(market.lpExpectedReturnDailyPct),\n );\n existing.lpRiskFlags = [...new Set([...(existing.lpRiskFlags ?? []), ...(market.lpRiskFlags ?? [])])];\n }\n }\n\n const candidates = [...bySlug.values()]\n .map((candidate) => ({\n ...candidate,\n sourceProfiles: [...new Set(candidate.sourceProfiles)],\n ensembleScore: scoreCandidate(candidate, new Set(candidate.sourceProfiles).size),\n }))\n .sort((a, b) => b.ensembleScore - a.ensembleScore || b.score - a.score);\n const diversifiedCandidates = diversifyCandidates(candidates, limit);\n\n return {\n generatedAt,\n outputPath,\n totalSources: sourceResults.length,\n totalRawMarkets,\n totalCandidates: bySlug.size,\n marketsReturned: diversifiedCandidates.length,\n candidates: diversifiedCandidates,\n };\n}\n\nfunction parseLimit(value: string | undefined, fallback: number): number {\n const parsed = Number.parseInt(value ?? \"\", 10);\n if (!Number.isFinite(parsed)) return fallback;\n return Math.max(1, Math.min(100, parsed));\n}\n\nexport function registerFeedCommand(program: Command): void {\n const feed = program\n .command(\"feed\")\n .description(\n \"Rank active Polymarket markets (same engine as chat getFeed / GET /api/feed). \" +\n \"Use --profile for curated screens.\",\n )\n .argument(\n \"[screening]\",\n `Optional screening preset: ${PROFILE_CHOICES.join(\" | \")} (same as --profile)`,\n )\n .option(\n \"--profile <name>\",\n `Screening defaults: ${PROFILE_CHOICES.join(\", \")} — explicit flags override`,\n )\n .option(\"--sort-by <key>\", \"score | volume | liquidity | movement | spread | recency | extremity | rewards | rewardYield | lpExpectedReturn | horizon\")\n .option(\"--preset <name>\", \"Attention weight preset (default, volume-hunter, lp-opportunity, …)\")\n .option(\"--tag <slug>\", \"Polymarket category tag, e.g. crypto, politics\")\n .option(\"--min-volume <usd>\", \"Minimum 24h volume (USD)\")\n .option(\"--min-liquidity <usd>\", \"Minimum displayed liquidity (USD)\")\n .option(\"--max-liquidity <usd>\", \"Maximum displayed liquidity (USD)\")\n .option(\"--min-rewards-daily-rate <usd>\", \"Minimum LP rewards USD/day\")\n .option(\"--min-days-to-end <n>\", \"Min calendar days until resolution\")\n .option(\"--max-days-to-end <n>\", \"Max calendar days until resolution\")\n .option(\"--max-market-age-hours <n>\", \"With liquid-new-or-long: max age (hours) for the \\\"new\\\" branch\")\n .option(\"--liquid-profile <mode>\", \"new-or-long (used by liquid-new-or-long screen)\")\n .option(\"--limit <n>\", \"Max markets to return (1–100, default 15)\", \"15\");\n\n feed\n .command(\"ensemble\")\n .description(\"Run multiple feed screens, merge by slug, and write ranked candidates JSON\")\n .option(\"--limit <n>\", \"Max candidates to return/write (1-100, default 25)\", \"25\")\n .option(\"--output <file>\", \"Output JSON path\", \"candidates.json\")\n .action(async (o: FeedEnsembleOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const perSourceLimit = \"100\";\n const sourceResults: Array<{ source: string; result: FeedResult }> = [];\n try {\n for (const source of ENSEMBLE_SOURCES) {\n const result = await client.get<FeedResult>(\"/api/feed\", {\n ...source.params,\n limit: perSourceLimit,\n });\n if (result.error) {\n throw new Error(result.error);\n }\n sourceResults.push({ source: source.name, result });\n }\n const outputPath = o.output ?? \"candidates.json\";\n const ensemble = buildFeedEnsemble(sourceResults, parseLimit(o.limit, 25), outputPath);\n await writeFile(outputPath, JSON.stringify(ensemble, null, 2) + \"\\n\", \"utf8\");\n if (globalOpts.json) {\n out.json(ensemble);\n return;\n }\n out.heading(`Feed Ensemble — ${ensemble.marketsReturned} candidates`);\n out.table(\n ensemble.candidates.slice(0, 15).map((m) => [\n String(Math.round(m.ensembleScore)),\n out.truncate(m.question, 48),\n `${Math.round(m.yesPrice * 100)}%`,\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n m.sourceProfiles.join(\",\"),\n ]),\n [\"Score\", \"Market\", \"YES\", \"24h Vol\", \"Liq\", \"Sources\"],\n );\n out.success(`Wrote ${outputPath}`);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n\n feed\n .action(async (screening: string | undefined, o: FeedCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n let profile: string | undefined;\n try {\n profile = resolveFeedProfile(screening, o.profile, out.warn);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params = feedQueryParams({\n profile,\n sortBy: o.sortBy,\n preset: o.preset,\n tag: o.tag,\n minVolume: o.minVolume,\n minLiquidity: o.minLiquidity,\n maxLiquidity: o.maxLiquidity,\n minRewardsDailyRate: o.minRewardsDailyRate,\n minDaysToEnd: o.minDaysToEnd,\n maxDaysToEnd: o.maxDaysToEnd,\n maxMarketAgeHours: o.maxMarketAgeHours,\n liquidProfile: o.liquidProfile,\n limit: o.limit,\n });\n\n try {\n const result = await client.get<FeedResult>(\"/api/feed\", params);\n if (result.error) {\n out.error(result.error);\n process.exit(1);\n }\n displayFeedResult(result, globalOpts);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport {\n displayAllocatorCycleResult,\n} from \"../allocator-display.js\";\nimport {\n parsePositiveNumber,\n readAllocations,\n readMarketPayload,\n readPnlContext,\n} from \"./allocator.js\";\nimport type {\n GlobalOptions,\n AllocatorCycleApiResponse,\n AllocatorCycleRequest,\n AllocatorStrategyInput,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface LpAllocatorOpts {\n markets: string;\n allocations?: string;\n pnl?: string;\n totalHoldings?: number;\n capitalLimitPct?: number;\n perMarketLimitPct?: number;\n capitalLimit: number;\n perMarketLimit: number;\n minExpectedReturnDailyPct: number;\n maxInventoryImbalance: number;\n volatilityFillSpikeThreshold: number;\n eventNoQuoteMinutesBefore: number;\n eventNoQuoteMinutesAfter: number;\n allocatorMinLiquidity: number;\n maxSpread: number;\n allocatorMinDaysToEnd: number;\n maxMarkets: number;\n paused?: boolean;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction parseNonNegative(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0) {\n throw new InvalidArgumentError(\"Expected a non-negative number\");\n }\n return n;\n}\n\nfunction parsePositiveInt(value: string): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) {\n throw new InvalidArgumentError(\"Expected a positive integer\");\n }\n return n;\n}\n\nfunction strategyFromAllocatorOptions(opts: LpAllocatorOpts): AllocatorStrategyInput {\n return {\n id: \"cli-lp-allocator\",\n name: \"CLI LP allocator dry run\",\n status: opts.paused ? \"paused\" : \"dry_run\",\n ...(opts.totalHoldings !== undefined && { total_holdings: opts.totalHoldings }),\n ...(opts.capitalLimitPct !== undefined && { capital_limit_pct: opts.capitalLimitPct }),\n ...(opts.perMarketLimitPct !== undefined && { per_market_limit_pct: opts.perMarketLimitPct }),\n capital_limit: opts.capitalLimit,\n per_market_limit: opts.perMarketLimit,\n min_expected_return_daily_pct: opts.minExpectedReturnDailyPct,\n max_inventory_imbalance: opts.maxInventoryImbalance,\n volatility_fill_spike_threshold: opts.volatilityFillSpikeThreshold,\n event_no_quote_minutes_before: opts.eventNoQuoteMinutesBefore,\n event_no_quote_minutes_after: opts.eventNoQuoteMinutesAfter,\n min_liquidity: opts.allocatorMinLiquidity,\n max_spread: opts.maxSpread,\n min_days_to_end: opts.allocatorMinDaysToEnd,\n max_markets: opts.maxMarkets,\n };\n}\n\nfunction validateAllocatorPercentageSizing(opts: LpAllocatorOpts): void {\n const usesPercentageSizing =\n opts.capitalLimitPct !== undefined || opts.perMarketLimitPct !== undefined;\n if (usesPercentageSizing && opts.totalHoldings === undefined) {\n out.error(\n \"Percentage sizing requires --total-holdings so the allocator can convert percentages into dollar caps.\",\n );\n process.exit(1);\n }\n}\n\nasync function runAllocatorCycle(\n client: ApiClient,\n payload: AllocatorCycleRequest,\n): Promise<AllocatorCycleApiResponse> {\n return client.post<AllocatorCycleApiResponse>(\"/api/lp/allocator\", payload);\n}\n\nexport function registerLpCommands(program: Command): void {\n const lp = program\n .command(\"lp\")\n .description(\"Generate dry-run liquidity-provider allocation plans\");\n\n lp\n .command(\"allocator\")\n .description(\"Run the allocator agent on an explicit market list\")\n .requiredOption(\"--markets <file>\", \"Candidate market JSON array or { markets }; use '-' to read stdin\")\n .option(\"--allocations <file>\", \"Existing allocations JSON array or { allocations }; use '-' to read stdin\")\n .option(\"--pnl <file>\", \"Per-market PnL context JSON array or { pnl_context } (external wallet/inventory export); use '-' to read stdin\")\n .option(\"--total-holdings <usd>\", \"Total holdings / portfolio value used for percentage sizing\", parsePositiveNumber)\n .option(\"--capital-limit-pct <pct>\", \"Portfolio-level allocation cap as a percent of total holdings\", parsePositiveNumber)\n .option(\"--per-market-limit-pct <pct>\", \"Per-market target cap as a percent of total holdings\", parsePositiveNumber)\n .option(\"--capital-limit <usd>\", \"Portfolio capital limit for this allocator request\", parseNonNegative, 500)\n .option(\"--per-market-limit <usd>\", \"Per-market target cap\", parseNonNegative, 100)\n .option(\"--min-expected-return-daily-pct <pct>\", \"Minimum expected daily return percent\", parseNonNegative, 0.02)\n .option(\"--max-inventory-imbalance <ratio>\", \"Maximum inventory imbalance\", parseNonNegative, 0.25)\n .option(\"--volatility-fill-spike-threshold <ratio>\", \"Fill-rate imbalance that switches quotes to defensive mode\", parseNonNegative, 0.35)\n .option(\"--event-no-quote-minutes-before <n>\", \"No-quote window before scheduled events\", parseNonNegative, 60)\n .option(\"--event-no-quote-minutes-after <n>\", \"No-quote window after scheduled events\", parseNonNegative, 30)\n .option(\"--allocator-min-liquidity <usd>\", \"Allocator safety gate: minimum market liquidity\", parseNonNegative, 500)\n .option(\"--max-spread <ratio>\", \"Allocator safety gate: maximum spread\", parseNonNegative, 0.12)\n .option(\"--allocator-min-days-to-end <n>\", \"Allocator safety gate: minimum days to resolution\", parseNonNegative, 3)\n .option(\"--max-markets <n>\", \"Maximum markets allocator may target\", parsePositiveInt, 5)\n .option(\"--paused\", \"Send strategy status paused instead of dry_run\")\n .action(async (opts: LpAllocatorOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n validateAllocatorPercentageSizing(opts);\n\n const markets = await readMarketPayload(opts.markets);\n if (!markets || markets.length === 0) {\n out.error(\"Markets JSON must include at least one market.\");\n process.exit(1);\n }\n\n if (opts.allocations === \"-\" && opts.pnl === \"-\") {\n out.error(\"Only one of --allocations and --pnl can read from stdin.\");\n process.exit(1);\n }\n\n const pnlContext = await readPnlContext(opts.pnl);\n const payload: AllocatorCycleRequest = {\n strategy: strategyFromAllocatorOptions(opts),\n markets,\n allocations: await readAllocations(opts.allocations),\n ...(pnlContext.length > 0 && { pnl_context: pnlContext }),\n };\n\n if (!globalOpts.json) {\n process.stderr.write(\n out.dim(` Running allocator dry-run on ${markets.length} provided candidates...\\n`),\n );\n }\n\n const response = await runAllocatorCycle(client, payload);\n if (globalOpts.json) {\n out.json(response);\n } else {\n displayAllocatorCycleResult(response.result ?? {}, globalOpts);\n }\n });\n\n}\n","import chalk from \"chalk\";\nimport type {\n AllocatorCycleResult,\n GlobalOptions,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction actionColor(action: string): string {\n switch (action) {\n case \"ALLOCATE\":\n case \"INCREASE\":\n return chalk.green(action);\n case \"REDUCE\":\n case \"EXIT\":\n return chalk.yellow(action);\n case \"SKIP\":\n return chalk.dim(action);\n case \"WATCH\":\n return chalk.cyan(action);\n default:\n return action;\n }\n}\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function displayAllocatorCycleResult(\n result: AllocatorCycleResult,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n const decisions = Array.isArray(result.decisions) ? result.decisions : [];\n const summary = result.summary ?? {};\n const dryRun = result.dry_run === false ? \"live\" : \"dry run\";\n\n out.heading(`Allocator Cycle — ${dryRun}`);\n process.stdout.write(\n chalk.dim(\n ` ${num(result.total_markets, decisions.length)} markets · ${out.currency(\n num(summary.target_capital),\n )} target capital\\n\\n`,\n ),\n );\n\n if (decisions.length === 0) {\n out.warn(\"No allocator decisions returned.\");\n return;\n }\n\n const rows = decisions.map((d) => {\n const action = String(d.action ?? \"UNKNOWN\");\n const score = num(d.score?.score);\n const expected = num(d.score?.expected_return_daily_pct);\n const failedChecks = Array.isArray(d.safety_checks)\n ? d.safety_checks.filter((check) => check.passed === false).length\n : 0;\n return [\n out.truncate(String(d.question ?? d.market_slug ?? \"—\"), 42),\n actionColor(action),\n out.currency(num(d.target_capital)),\n signedCurrency(num(d.capital_delta)),\n `${expected.toFixed(3)}%`,\n regimeLabel(String(d.quote_regime ?? \"—\")),\n String(Math.round(score)),\n failedChecks === 0 ? chalk.green(\"0\") : chalk.yellow(String(failedChecks)),\n ];\n });\n\n out.table(rows, [\n \"Market\",\n \"Action\",\n \"Target\",\n \"Delta\",\n \"Exp/day\",\n \"Regime\",\n \"Score\",\n \"Fails\",\n ]);\n\n process.stdout.write(\"\\n\");\n for (const decision of decisions.slice(0, 5)) {\n const action = String(decision.action ?? \"UNKNOWN\");\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(String(decision.question ?? decision.market_slug ?? \"—\"), 65) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Action: \") + actionColor(action));\n if (decision.rationale) {\n process.stdout.write(\" \" + chalk.dim(\"Rationale: \") + out.truncate(decision.rationale, 120));\n }\n process.stdout.write(\"\\n\");\n\n const economics = decision.economics ?? {};\n if (\n economics.realized_spread_pnl !== undefined ||\n economics.reward_income !== undefined ||\n economics.net_realized_pnl !== undefined\n ) {\n process.stdout.write(\n \" \" +\n chalk.dim(\"Economics: \") +\n `spread ${signedCurrency(num(economics.realized_spread_pnl))}, ` +\n `rewards ${signedCurrency(num(economics.reward_income))}, ` +\n `net ${signedCurrency(num(economics.net_realized_pnl))}` +\n \"\\n\",\n );\n }\n }\n\n if (decisions.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${decisions.length - 5} more decisions\\n`));\n }\n}\n\nfunction regimeLabel(value: string): string {\n switch (value) {\n case \"reward_optimized\":\n return chalk.green(\"reward\");\n case \"defensive\":\n return chalk.yellow(\"defense\");\n case \"no_quote\":\n return chalk.red(\"no quote\");\n default:\n return chalk.dim(value);\n }\n}\n\nfunction signedCurrency(value: number): string {\n const formatted = out.currency(Math.abs(value));\n if (value > 0) return chalk.green(`+${formatted}`);\n if (value < 0) return chalk.yellow(`-${formatted}`);\n return chalk.dim(\"$0.00\");\n}\n","import { InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport type {\n AllocatorAllocationInput,\n AllocatorMarketInput,\n AllocatorPnlInput,\n} from \"../types.js\";\n\nexport function parsePositiveNumber(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return n;\n}\n\nexport function parseAllocationsInput(parsed: unknown): AllocatorAllocationInput[] {\n const rows = extractArray<AllocatorAllocationInput>(parsed, \"allocations\");\n if (!rows) {\n throw new Error(\"Allocations JSON must be an array or { allocations: [...] }\");\n }\n return rows;\n}\n\nexport function parsePnlContextInput(parsed: unknown): AllocatorPnlInput[] {\n const rows = extractArray<AllocatorPnlInput>(parsed, \"pnl_context\");\n if (!rows) {\n throw new Error(\"PnL JSON must be an array or { pnl_context: [...] }\");\n }\n return rows;\n}\n\nexport async function readAllocations(path: string | undefined): Promise<AllocatorAllocationInput[]> {\n if (!path) return [];\n return parseAllocationsInput(await readJsonInput(path));\n}\n\nexport async function readPnlContext(path: string | undefined): Promise<AllocatorPnlInput[]> {\n if (!path) return [];\n return parsePnlContextInput(await readJsonInput(path));\n}\n\nexport async function readMarketPayload(path: string | undefined): Promise<AllocatorMarketInput[] | undefined> {\n if (!path) return undefined;\n const parsed = await readJsonInput(path);\n const rows = extractArray<AllocatorMarketInput>(parsed, \"markets\");\n if (!rows) {\n throw new Error(\"Markets JSON must be an array or { markets: [...] }\");\n }\n return rows;\n}\n\nfunction extractArray<T>(parsed: unknown, key: string): T[] | undefined {\n if (Array.isArray(parsed)) {\n return parsed as T[];\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as Record<string, unknown>)[key])) {\n return (parsed as Record<string, unknown>)[key] as T[];\n }\n return undefined;\n}\n\nasync function readJsonInput(path: string): Promise<unknown> {\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n return JSON.parse(raw) as unknown;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displaySignalAnalysis } from \"../signal-display.js\";\nimport type {\n GlobalOptions,\n SignalAnalysisApiResponse,\n SignalAnalysisRequest,\n SignalMarketInput,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface SignalAnalyzeOpts {\n url?: string[];\n market?: string;\n context?: string;\n question?: string;\n description?: string;\n yesProb?: number;\n noProb?: number;\n slug?: string;\n link?: string;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction collect(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function parseProbability(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0 || n > 100) {\n throw new InvalidArgumentError(\"Expected a probability between 0 and 100\");\n }\n return n;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nasync function readMarketPayload(path: string | undefined): Promise<{\n market?: SignalMarketInput;\n markets?: SignalMarketInput[];\n}> {\n if (!path) return {};\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) {\n return { markets: parsed as SignalMarketInput[] };\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as { markets?: unknown }).markets)) {\n return { markets: (parsed as { markets: SignalMarketInput[] }).markets };\n }\n if (parsed && typeof parsed === \"object\" && (parsed as { market?: unknown }).market) {\n return { market: (parsed as { market: SignalMarketInput }).market };\n }\n if (parsed && typeof parsed === \"object\") {\n return { market: parsed as SignalMarketInput };\n }\n throw new Error(\"Market JSON must be an object, an array, or { market | markets }\");\n}\n\nfunction inlineMarketFromOptions(opts: SignalAnalyzeOpts): SignalMarketInput | undefined {\n const market: SignalMarketInput = {};\n if (opts.question) market.question = opts.question;\n if (opts.description) market.description = opts.description;\n if (opts.yesProb !== undefined) market.yesPrice = opts.yesProb;\n if (opts.noProb !== undefined) market.noPrice = opts.noProb;\n if (opts.slug) market.slug = opts.slug;\n if (opts.link) market.link = opts.link;\n return Object.keys(market).length > 0 ? market : undefined;\n}\n\nexport async function buildSignalPayload(\n positionalUrl: string | undefined,\n opts: SignalAnalyzeOpts,\n): Promise<SignalAnalysisRequest> {\n const urls = [positionalUrl, ...(opts.url ?? [])].filter(\n (value): value is string => Boolean(value),\n );\n const filePayload = await readMarketPayload(opts.market);\n const inlineMarket = inlineMarketFromOptions(opts);\n const hasMarketInput = Boolean(filePayload.market || filePayload.markets || inlineMarket);\n\n if (urls.length > 0 && hasMarketInput) {\n throw new Error(\"Use either URL input or market JSON/options, not both.\");\n }\n if (filePayload.market && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (filePayload.markets && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (urls.length === 0 && !hasMarketInput) {\n throw new Error(\"Provide a Polymarket URL or a market payload.\");\n }\n\n const payload: SignalAnalysisRequest =\n urls.length === 1\n ? { url: urls[0] }\n : urls.length > 1\n ? { urls }\n : filePayload.market\n ? { market: filePayload.market }\n : filePayload.markets\n ? { markets: filePayload.markets }\n : { market: inlineMarket };\n\n if (opts.context) {\n payload.previous_analysis_context = opts.context;\n }\n return payload;\n}\n\nasync function runSignalAnalysis(\n client: ApiClient,\n payload: SignalAnalysisRequest,\n): Promise<SignalAnalysisApiResponse> {\n return client.post<SignalAnalysisApiResponse>(\"/api/signal/analyze\", payload);\n}\n\nexport function registerSignalCommands(program: Command): void {\n const signal = program\n .command(\"signal\")\n .description(\"Analyze Polymarket probability gaps with the signal agent\");\n\n signal\n .command(\"analyze\")\n .description(\"Estimate true YES probability and compare it with market pricing\")\n .argument(\"[url]\", \"Polymarket market/event URL to analyze\")\n .option(\"--url <url>\", \"Additional Polymarket URL; repeat for multiple markets\", collect, [])\n .option(\"--market <file>\", \"Inline market JSON object/array; use '-' to read stdin\")\n .option(\"--context <text>\", \"Prior search notes or analysis context for the agent\")\n .option(\"--question <text>\", \"Inline market question when not using a URL\")\n .option(\"--description <text>\", \"Inline market description or resolution criteria\")\n .option(\"--yes-prob <prob>\", \"Current YES probability or price, e.g. 0.52 or 52\", parseProbability)\n .option(\"--no-prob <prob>\", \"Current NO probability or price, e.g. 0.48 or 48\", parseProbability)\n .option(\"--slug <slug>\", \"Inline market slug\")\n .option(\"--link <url>\", \"Inline market link\")\n .action(async (url: string | undefined, o: SignalAnalyzeOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n let payload: SignalAnalysisRequest;\n try {\n payload = await buildSignalPayload(url, o);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n if (!globalOpts.json) {\n process.stderr.write(out.dim(\" Running signal analysis...\\n\"));\n }\n\n const result = await runSignalAnalysis(client, payload);\n displaySignalAnalysis(result, globalOpts);\n });\n}\n","import chalk from \"chalk\";\nimport type {\n GlobalOptions,\n SignalAnalysis,\n SignalAnalysisApiResponse,\n SignalAnalysisItem,\n SignalAnalysisResult,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction pctFromSignalValue(value: number | null | undefined): number | null {\n if (value === null || value === undefined || Number.isNaN(value)) return null;\n return Math.abs(value) <= 1 ? value * 100 : value;\n}\n\nfunction formatProbability(value: number | null | undefined): string {\n const pct = pctFromSignalValue(value);\n return pct === null ? \"n/a\" : `${pct.toFixed(1)}%`;\n}\n\nfunction formatGap(value: number | null | undefined): string {\n if (value === null || value === undefined || Number.isNaN(value)) return \"n/a\";\n const points = Math.abs(value) <= 1 ? value * 100 : value;\n const formatted = `${points >= 0 ? \"+\" : \"\"}${points.toFixed(1)}pp`;\n if (points > 0) return chalk.green(formatted);\n if (points < 0) return chalk.red(formatted);\n return chalk.dim(formatted);\n}\n\nfunction formatStrength(value: string | undefined): string {\n if (value === \"strong\") return chalk.green(\"strong\");\n if (value === \"weak\") return chalk.yellow(\"weak\");\n return value ? chalk.dim(value) : \"n/a\";\n}\n\nfunction analysisItems(result: SignalAnalysisResult | undefined): SignalAnalysisItem[] {\n if (!result) return [];\n if (result.analysis) return [result];\n return result.analyses ?? [];\n}\n\nfunction titleFor(analysis: SignalAnalysis): string {\n return analysis.market_name || analysis.market_slug || \"market\";\n}\n\nexport function displaySignalAnalysis(\n response: SignalAnalysisApiResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(response);\n return;\n }\n\n if (response.error) {\n out.error(response.error);\n return;\n }\n\n const result = response.result;\n if (result?.error) {\n out.error(result.error);\n return;\n }\n\n const items = analysisItems(result);\n if (items.length === 0) {\n out.warn(\"No signal analysis returned.\");\n return;\n }\n\n out.heading(\n items.length === 1\n ? \"Signal Analysis\"\n : `Signal Analysis — ${items.length} markets`,\n );\n\n const rows = items.map((item) => {\n const analysis = item.analysis ?? {};\n return [\n out.truncate(titleFor(analysis), 44),\n formatProbability(analysis.current_yes_prob),\n formatProbability(analysis.predicted_prob),\n formatGap(analysis.probability_gap),\n formatStrength(analysis.signal_strength),\n analysis.confidence ?? \"n/a\",\n ];\n });\n out.table(rows, [\"Market\", \"Market YES\", \"Agent YES\", \"Gap\", \"Signal\", \"Conf\"]);\n\n for (const item of items.slice(0, 3)) {\n const analysis = item.analysis;\n if (!analysis) continue;\n process.stdout.write(\"\\n \" + chalk.bold(out.truncate(titleFor(analysis), 76)) + \"\\n\");\n if (analysis.market_link) {\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + analysis.market_link + \"\\n\");\n }\n if (analysis.key_factors && analysis.key_factors.length > 0) {\n process.stdout.write(\" \" + chalk.dim(\"Key factors: \") + analysis.key_factors.slice(0, 4).join(\"; \") + \"\\n\");\n }\n if (analysis.research_findings) {\n process.stdout.write(\n \" \" + chalk.dim(\"Research: \") + out.truncate(analysis.research_findings, 180) + \"\\n\",\n );\n }\n }\n\n if (items.length > 3) {\n process.stdout.write(chalk.dim(`\\n ... and ${items.length - 3} more\\n`));\n }\n\n if (result?.strong_signal_count !== undefined) {\n process.stdout.write(\n chalk.dim(`\\n Strong signals: ${result.strong_signal_count}\\n`),\n );\n }\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport type {\n GlobalOptions,\n QuoteAction,\n QuoteOutcome,\n QuotePreview,\n QuotePreviewRequest,\n QuoteRoute,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport interface QuoteCommandOptions {\n action: QuoteAction;\n outcome: QuoteOutcome;\n cash?: number;\n shares?: number;\n signalId?: string;\n capital?: number;\n route: QuoteRoute;\n save?: boolean;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nexport function parsePositiveNumber(value: string): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return parsed;\n}\n\nexport function parseQuoteAction(value: string): QuoteAction {\n const normalized = value.trim().toUpperCase();\n if (normalized !== \"BUY\" && normalized !== \"SELL\") {\n throw new InvalidArgumentError(\"Expected buy or sell\");\n }\n return normalized;\n}\n\nexport function parseQuoteOutcome(value: string): QuoteOutcome {\n const normalized = value.trim().toUpperCase();\n if (normalized !== \"YES\" && normalized !== \"NO\") {\n throw new InvalidArgumentError(\"Expected yes or no\");\n }\n return normalized;\n}\n\nexport function parseQuoteRoute(value: string): QuoteRoute {\n const normalized = value.trim().toLowerCase();\n if (normalized !== \"auto\" && normalized !== \"aggressive\" && normalized !== \"passive\") {\n throw new InvalidArgumentError(\"Expected auto, aggressive, or passive\");\n }\n return normalized;\n}\n\nexport function buildQuotePayload(\n instrument: string,\n opts: QuoteCommandOptions,\n): QuotePreviewRequest {\n const normalizedInstrument = instrument.trim();\n if (!normalizedInstrument) {\n throw new Error(\"Provide a Polymarket slug or URL.\");\n }\n\n const hasCash = opts.cash !== undefined;\n const hasShares = opts.shares !== undefined;\n if (hasCash === hasShares) {\n throw new Error(\"Provide exactly one of --cash or --shares.\");\n }\n if (opts.action === \"SELL\" && hasCash) {\n throw new Error(\"SELL quotes require --shares; --cash is BUY-only.\");\n }\n\n return {\n instrument: normalizedInstrument,\n action: opts.action,\n outcome: opts.outcome,\n size: hasCash\n ? { type: \"cash\", amount_usd: opts.cash as number }\n : { type: \"shares\", shares: opts.shares as number },\n ...(opts.signalId && { signal_forecast_id: opts.signalId }),\n ...(opts.capital !== undefined && { portfolio_capital_usd: opts.capital }),\n route: opts.route,\n persist: Boolean(opts.save),\n };\n}\n\nfunction formatNumber(value: unknown, digits = 2): string {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value.toLocaleString(\"en-US\", { maximumFractionDigits: digits })\n : \"n/a\";\n}\n\nfunction formatUsd(value: unknown): string {\n return typeof value === \"number\" && Number.isFinite(value)\n ? out.currency(value)\n : \"n/a\";\n}\n\nfunction formatPrice(value: unknown): string {\n return typeof value === \"number\" && Number.isFinite(value)\n ? `$${value.toFixed(4)}`\n : \"n/a\";\n}\n\nfunction formatPercent(value: unknown): string {\n return typeof value === \"number\" && Number.isFinite(value)\n ? out.percent(value)\n : \"n/a\";\n}\n\nexport function displayQuotePreview(preview: QuotePreview, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(preview);\n return;\n }\n if (preview.error) {\n out.error(preview.error);\n return;\n }\n\n const request = preview.request;\n const instrument = preview.instrument;\n const market = preview.market ?? {};\n const fill = preview.fill ?? {};\n const economics = preview.economics ?? {};\n const signal = preview.signal ?? {};\n const sizing = preview.sizing_suggestion ?? {};\n\n out.heading(`Quote Preview — ${preview.status ?? \"UNAVAILABLE\"}`);\n out.table([\n [\"Market\", instrument.question ?? instrument.slug ?? \"n/a\"],\n [\"Venue\", preview.venue ?? \"polymarket\"],\n [\"Action\", `${request.action ?? \"n/a\"} ${request.outcome ?? \"n/a\"}`],\n [\"Route\", `${request.route_selected ?? \"n/a\"} (requested ${request.route_requested ?? \"auto\"})`],\n [\"Observed\", preview.observed_at ? new Date(preview.observed_at).toLocaleString() : \"n/a\"],\n [\"Expires\", preview.expires_at ? new Date(preview.expires_at).toLocaleString() : \"n/a\"],\n ]);\n\n process.stdout.write(\"\\n\");\n out.table([\n [\"Best bid\", formatPrice(market.best_bid)],\n [\"Best ask\", formatPrice(market.best_ask)],\n [\"Spread\", formatPrice(market.spread)],\n [\"Bid depth\", `${formatNumber(market.bid_depth_shares, 4)} shares`],\n [\"Ask depth\", `${formatNumber(market.ask_depth_shares, 4)} shares`],\n [\"Requested cash\", formatUsd(fill.requested_cash_usd)],\n [\"Requested shares\", formatNumber(fill.requested_shares, 4)],\n [\"Fillable shares\", formatNumber(fill.fillable_shares, 4)],\n [\"Safety-capped shares\", formatNumber(fill.safety_capped_shares, 4)],\n [\"Fill ratio\", formatPercent(fill.fill_ratio)],\n [\"Average price\", formatPrice(fill.average_price)],\n [\"Worst price\", formatPrice(fill.worst_price)],\n [\"Passive limit\", formatPrice(fill.passive_limit_price)],\n [\"Slippage\", typeof fill.slippage_bps === \"number\" ? `${formatNumber(fill.slippage_bps)} bps` : \"n/a\"],\n ], [\"Quote\", \"Value\"]);\n\n process.stdout.write(\"\\n\");\n out.table([\n [\"Gross notional\", formatUsd(economics.gross_notional_usd)],\n [\"Venue fee\", formatUsd(economics.venue_fee_usd)],\n [\"Fee source\", economics.fee_source ?? \"unavailable\"],\n [request.action === \"SELL\" ? \"Net proceeds\" : \"All-in cost\", formatUsd(\n request.action === \"SELL\" ? economics.net_proceeds_usd : economics.all_in_cost_usd,\n )],\n [\"Max loss\", formatUsd(economics.max_loss_usd)],\n [\"Max payout\", formatUsd(economics.max_payout_usd)],\n [\"Profit at payout\", formatUsd(economics.max_profit_usd)],\n [\"Foregone payout\", request.action === \"SELL\" ? formatUsd(economics.foregone_payout_usd) : \"n/a\"],\n [\"Break-even probability\", formatPercent(economics.break_even_probability)],\n ], [\"Economics\", \"Value\"]);\n\n if (preview.signal) {\n process.stdout.write(\"\\n\");\n out.table([\n [\"Forecast YES\", formatPercent(signal.forecast_yes)],\n [\"Forecast interval\", `${formatPercent(signal.lower_bound)} – ${formatPercent(signal.upper_bound)}`],\n [\"Midpoint edge\", formatPercent(signal.midpoint_edge)],\n [\"Conservative edge\", formatPercent(signal.conservative_edge)],\n ], [\"Signal\", \"Value\"]);\n }\n\n if (preview.sizing_suggestion) {\n process.stdout.write(\"\\n\");\n out.table([\n [\"Suggested cash\", formatUsd(sizing.suggested_max_spend_usd)],\n [\"Suggested shares\", formatNumber(sizing.suggested_shares, 4)],\n [\"Capital fraction\", formatPercent(sizing.allocation_fraction)],\n ], [\"Non-binding sizing\", \"Value\"]);\n }\n\n if (preview.risks?.length) {\n process.stdout.write(\"\\n\");\n for (const risk of preview.risks) out.warn(risk);\n }\n\n if (preview.id) {\n process.stdout.write(\"\\n\" + out.dim(` Saved preview: ${preview.id}\\n`));\n }\n process.stdout.write(\"\\n\");\n out.warn(\"Preview only — no order was signed or submitted.\");\n const marketUrl = instrument.market_url;\n if (marketUrl) process.stdout.write(out.dim(` Market: ${marketUrl}\\n`));\n}\n\nexport function registerQuoteCommand(program: Command): void {\n program\n .command(\"quote\")\n .description(\"Preview the cost, liquidity, and risk of a Polymarket trade\")\n .argument(\"<slug-or-url>\", \"Polymarket market slug or URL\")\n .requiredOption(\"--action <action>\", \"buy | sell\", parseQuoteAction)\n .requiredOption(\"--outcome <outcome>\", \"yes | no\", parseQuoteOutcome)\n .option(\"--cash <usd>\", \"Maximum cash to spend (BUY only)\", parsePositiveNumber)\n .option(\"--shares <shares>\", \"Number of outcome shares\", parsePositiveNumber)\n .option(\"--signal-id <uuid>\", \"Saved Signal forecast to include in edge calculations\")\n .option(\"--capital <usd>\", \"Manual portfolio capital for non-binding BUY sizing\", parsePositiveNumber)\n .option(\"--route <route>\", \"auto | aggressive | passive\", parseQuoteRoute, \"auto\")\n .option(\"--save\", \"Save a freshly generated preview to quote history\")\n .action(async (instrument: string, opts: QuoteCommandOptions) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n let payload: QuotePreviewRequest;\n try {\n payload = buildQuotePayload(instrument, opts);\n } catch (error) {\n out.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n if (!globalOpts.json) {\n process.stderr.write(out.dim(\" Refreshing public market data and order book...\\n\"));\n }\n const preview = await client.post<QuotePreview>(\"/api/quote\", payload);\n displayQuotePreview(preview, globalOpts);\n });\n}\n"],"mappings":"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","names":["Command","program","chalk","error","program","chalk","program","requireAuth","readline","chalk","chalk","chalk","program","requireAuth","chalk","readline","requireAuth","warn","program","InvalidArgumentError","chalk","chalk","num","requireAuth","InvalidArgumentError","program","InvalidArgumentError","readFile","chalk","chalk","requireAuth","InvalidArgumentError","readStdin","readMarketPayload","readFile","program","InvalidArgumentError","requireAuth","parsePositiveNumber","InvalidArgumentError","program","error","Command"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hedge-layer/cli",
3
- "version": "3.0.1",
3
+ "version": "4.0.0",
4
4
  "description": "CLI for Hedge Layer — prediction market intelligence from the terminal",
5
5
  "type": "module",
6
6
  "bin": {