@hedge-layer/cli 2.0.0 → 2.1.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
@@ -86,7 +86,8 @@ The lightweight manual loop is:
86
86
 
87
87
  ```bash
88
88
  hl --json feed lp-opportunity --limit 15 > markets.json
89
- hl lp allocator --markets markets.json
89
+ hl-trader pnl --json > pnl.json # optional: wallet PnL + live inventory
90
+ hl lp allocator --markets markets.json --pnl pnl.json --allocations pnl.json
90
91
  hl-trader buy ...
91
92
  ```
92
93
 
@@ -95,6 +96,11 @@ allocator agent. Allocator output shows target capital, quote regime, failed
95
96
  safety checks, and split spread/reward economics. Trade execution stays outside
96
97
  the `hl` allocator command.
97
98
 
99
+ `--allocations` tells the allocator what you already hold (enabling HOLD,
100
+ REDUCE, and EXIT decisions), and `--pnl` feeds per-market PnL into its caution
101
+ overlay so borderline allocations on losing markets are downgraded to WATCH or
102
+ HOLD. Both flags accept the `hl-trader pnl --json` output file directly.
103
+
98
104
  Wallet commands are available under `hl wallet`:
99
105
 
100
106
  ```bash
package/dist/index.mjs CHANGED
@@ -980,6 +980,7 @@ function displayMarketBrief(brief, globalOpts) {
980
980
  }
981
981
 
982
982
  // src/commands/feed.ts
983
+ import { writeFile } from "fs/promises";
983
984
  function requireAuth4(client) {
984
985
  if (!client.isAuthenticated) {
985
986
  error("Not authenticated. Run `hl auth login` first.");
@@ -1024,8 +1025,82 @@ function feedQueryParams(opts) {
1024
1025
  add("limit", opts.limit);
1025
1026
  return Object.fromEntries(entries);
1026
1027
  }
1028
+ var ENSEMBLE_SOURCES = [
1029
+ { name: "liquid-new-or-long", params: { profile: "liquid-new-or-long", sortBy: "liquidity" } },
1030
+ { name: "liquidity-provider", params: { profile: "liquidity-provider", sortBy: "lpExpectedReturn" } },
1031
+ { name: "lp-opportunity", params: { profile: "lp-opportunity", sortBy: "rewardYield" } },
1032
+ { name: "movement", params: { sortBy: "movement", preset: "price-movers" } },
1033
+ { name: "spread", params: { sortBy: "spread", preset: "liquidity-provider" } },
1034
+ { name: "reward-yield", params: { sortBy: "rewardYield", preset: "rewards-optimizer", minRewardsDailyRate: "0.01" } }
1035
+ ];
1036
+ function num(value) {
1037
+ return Number.isFinite(value) ? Number(value) : 0;
1038
+ }
1039
+ function scoreCandidate(candidate, sourceCount) {
1040
+ const liquidityScore = Math.min(25, Math.log1p(Math.max(0, candidate.liquidity)) / Math.log1p(1e6) * 25);
1041
+ const volumeScore = Math.min(25, Math.log1p(Math.max(0, candidate.volume24h)) / Math.log1p(1e6) * 25);
1042
+ const spreadScore = Math.max(0, Math.min(15, (0.12 - Math.max(0, candidate.spread)) / 0.12 * 15));
1043
+ const movementPenalty = Math.min(20, Math.abs(candidate.oneDayPriceChange) * 100);
1044
+ const days = candidate.daysToEnd ?? null;
1045
+ const horizonScore = days === null ? 2 : days < 3 ? 0 : Math.min(10, Math.log1p(days) / Math.log1p(365) * 10);
1046
+ const rewardScore = Math.max(
1047
+ 0,
1048
+ Math.min(20, num(candidate.components?.rewardYield) * 0.1 + Math.max(0, num(candidate.lpExpectedReturnDailyPct)) * 50)
1049
+ );
1050
+ const sourceScore = Math.min(16, sourceCount * 4);
1051
+ return Math.round((liquidityScore + volumeScore + spreadScore + horizonScore + rewardScore + sourceScore - movementPenalty) * 10) / 10;
1052
+ }
1053
+ function buildFeedEnsemble(sourceResults, limit, outputPath = "candidates.json", generatedAt = (/* @__PURE__ */ new Date()).toISOString()) {
1054
+ const bySlug = /* @__PURE__ */ new Map();
1055
+ let totalRawMarkets = 0;
1056
+ for (const { source, result } of sourceResults) {
1057
+ for (const market of result.markets ?? []) {
1058
+ totalRawMarkets++;
1059
+ const existing = bySlug.get(market.slug);
1060
+ if (!existing) {
1061
+ bySlug.set(market.slug, {
1062
+ ...market,
1063
+ ensembleScore: 0,
1064
+ sourceProfiles: [source],
1065
+ sourceRanks: { [source]: market.rank }
1066
+ });
1067
+ continue;
1068
+ }
1069
+ existing.sourceProfiles.push(source);
1070
+ existing.sourceRanks[source] = market.rank;
1071
+ if (market.score > existing.score) existing.score = market.score;
1072
+ existing.volume24h = Math.max(existing.volume24h, market.volume24h);
1073
+ existing.liquidity = Math.max(existing.liquidity, market.liquidity);
1074
+ existing.rewardsDailyRate = Math.max(existing.rewardsDailyRate, market.rewardsDailyRate);
1075
+ existing.lpExpectedReturnDailyPct = Math.max(
1076
+ num(existing.lpExpectedReturnDailyPct),
1077
+ num(market.lpExpectedReturnDailyPct)
1078
+ );
1079
+ existing.lpRiskFlags = [.../* @__PURE__ */ new Set([...existing.lpRiskFlags ?? [], ...market.lpRiskFlags ?? []])];
1080
+ }
1081
+ }
1082
+ const candidates = [...bySlug.values()].map((candidate) => ({
1083
+ ...candidate,
1084
+ sourceProfiles: [...new Set(candidate.sourceProfiles)],
1085
+ ensembleScore: scoreCandidate(candidate, new Set(candidate.sourceProfiles).size)
1086
+ })).sort((a, b) => b.ensembleScore - a.ensembleScore || b.score - a.score).slice(0, limit);
1087
+ return {
1088
+ generatedAt,
1089
+ outputPath,
1090
+ totalSources: sourceResults.length,
1091
+ totalRawMarkets,
1092
+ totalCandidates: bySlug.size,
1093
+ marketsReturned: candidates.length,
1094
+ candidates
1095
+ };
1096
+ }
1097
+ function parseLimit(value, fallback) {
1098
+ const parsed = Number.parseInt(value ?? "", 10);
1099
+ if (!Number.isFinite(parsed)) return fallback;
1100
+ return Math.max(1, Math.min(100, parsed));
1101
+ }
1027
1102
  function registerFeedCommand(program2) {
1028
- program2.command("feed").description(
1103
+ const feed = program2.command("feed").description(
1029
1104
  "Rank active Polymarket markets (same engine as chat getFeed / GET /api/feed). Use --profile for curated screens."
1030
1105
  ).argument(
1031
1106
  "[screening]",
@@ -1033,7 +1108,50 @@ function registerFeedCommand(program2) {
1033
1108
  ).option(
1034
1109
  "--profile <name>",
1035
1110
  `Screening defaults: ${PROFILE_CHOICES.join(", ")} \u2014 explicit flags override`
1036
- ).option("--sort-by <key>", "score | volume | liquidity | movement | spread | recency | extremity | rewards | rewardYield | lpExpectedReturn | horizon").option("--preset <name>", "Attention weight preset (default, volume-hunter, lp-opportunity, \u2026)").option("--tag <slug>", "Polymarket category tag, e.g. crypto, politics").option("--min-volume <usd>", "Minimum 24h volume (USD)").option("--min-liquidity <usd>", "Minimum displayed liquidity (USD)").option("--max-liquidity <usd>", "Maximum displayed liquidity (USD)").option("--min-rewards-daily-rate <usd>", "Minimum LP rewards USD/day").option("--min-days-to-end <n>", "Min calendar days until resolution").option("--max-days-to-end <n>", "Max calendar days until resolution").option("--max-market-age-hours <n>", 'With liquid-new-or-long: max age (hours) for the "new" branch').option("--liquid-profile <mode>", "new-or-long (used by liquid-new-or-long screen)").option("--limit <n>", "Max markets to return (1\u2013100, default 15)", "15").action(async (screening, o) => {
1111
+ ).option("--sort-by <key>", "score | volume | liquidity | movement | spread | recency | extremity | rewards | rewardYield | lpExpectedReturn | horizon").option("--preset <name>", "Attention weight preset (default, volume-hunter, lp-opportunity, \u2026)").option("--tag <slug>", "Polymarket category tag, e.g. crypto, politics").option("--min-volume <usd>", "Minimum 24h volume (USD)").option("--min-liquidity <usd>", "Minimum displayed liquidity (USD)").option("--max-liquidity <usd>", "Maximum displayed liquidity (USD)").option("--min-rewards-daily-rate <usd>", "Minimum LP rewards USD/day").option("--min-days-to-end <n>", "Min calendar days until resolution").option("--max-days-to-end <n>", "Max calendar days until resolution").option("--max-market-age-hours <n>", 'With liquid-new-or-long: max age (hours) for the "new" branch').option("--liquid-profile <mode>", "new-or-long (used by liquid-new-or-long screen)").option("--limit <n>", "Max markets to return (1\u2013100, default 15)", "15");
1112
+ feed.command("ensemble").description("Run multiple feed screens, merge by slug, and write ranked candidates JSON").option("--limit <n>", "Max candidates to return/write (1-100, default 25)", "25").option("--output <file>", "Output JSON path", "candidates.json").action(async (o) => {
1113
+ const globalOpts = program2.opts();
1114
+ const client = new ApiClient(globalOpts);
1115
+ requireAuth4(client);
1116
+ const perSourceLimit = "100";
1117
+ const sourceResults = [];
1118
+ try {
1119
+ for (const source of ENSEMBLE_SOURCES) {
1120
+ const result = await client.get("/api/feed", {
1121
+ ...source.params,
1122
+ limit: perSourceLimit
1123
+ });
1124
+ if (result.error) {
1125
+ throw new Error(result.error);
1126
+ }
1127
+ sourceResults.push({ source: source.name, result });
1128
+ }
1129
+ const outputPath = o.output ?? "candidates.json";
1130
+ const ensemble = buildFeedEnsemble(sourceResults, parseLimit(o.limit, 25), outputPath);
1131
+ await writeFile(outputPath, JSON.stringify(ensemble, null, 2) + "\n", "utf8");
1132
+ if (globalOpts.json) {
1133
+ json(ensemble);
1134
+ return;
1135
+ }
1136
+ heading(`Feed Ensemble \u2014 ${ensemble.marketsReturned} candidates`);
1137
+ table(
1138
+ ensemble.candidates.slice(0, 15).map((m) => [
1139
+ String(Math.round(m.ensembleScore)),
1140
+ truncate(m.question, 48),
1141
+ `${Math.round(m.yesPrice * 100)}%`,
1142
+ compactCurrency(m.volume24h),
1143
+ compactCurrency(m.liquidity),
1144
+ m.sourceProfiles.join(",")
1145
+ ]),
1146
+ ["Score", "Market", "YES", "24h Vol", "Liq", "Sources"]
1147
+ );
1148
+ success(`Wrote ${outputPath}`);
1149
+ } catch (e) {
1150
+ error(e instanceof Error ? e.message : String(e));
1151
+ process.exit(1);
1152
+ }
1153
+ });
1154
+ feed.action(async (screening, o) => {
1037
1155
  const globalOpts = program2.opts();
1038
1156
  let profile;
1039
1157
  try {
@@ -1075,7 +1193,7 @@ function registerFeedCommand(program2) {
1075
1193
 
1076
1194
  // src/commands/lp.ts
1077
1195
  import { InvalidArgumentError as InvalidArgumentError2 } from "commander";
1078
- import { writeFile } from "fs/promises";
1196
+ import { writeFile as writeFile2 } from "fs/promises";
1079
1197
 
1080
1198
  // src/allocator-display.ts
1081
1199
  import chalk5 from "chalk";
@@ -1095,7 +1213,7 @@ function actionColor(action) {
1095
1213
  return action;
1096
1214
  }
1097
1215
  }
1098
- function num(value, fallback = 0) {
1216
+ function num2(value, fallback = 0) {
1099
1217
  const n = Number(value);
1100
1218
  return Number.isFinite(n) ? n : fallback;
1101
1219
  }
@@ -1110,8 +1228,8 @@ function displayAllocatorCycleResult(result, globalOpts) {
1110
1228
  heading(`Allocator Cycle \u2014 ${dryRun}`);
1111
1229
  process.stdout.write(
1112
1230
  chalk5.dim(
1113
- ` ${num(result.total_markets, decisions.length)} markets \xB7 ${currency(
1114
- num(summary.target_capital)
1231
+ ` ${num2(result.total_markets, decisions.length)} markets \xB7 ${currency(
1232
+ num2(summary.target_capital)
1115
1233
  )} target capital
1116
1234
 
1117
1235
  `
@@ -1123,14 +1241,14 @@ function displayAllocatorCycleResult(result, globalOpts) {
1123
1241
  }
1124
1242
  const rows = decisions.map((d) => {
1125
1243
  const action = String(d.action ?? "UNKNOWN");
1126
- const score = num(d.score?.score);
1127
- const expected = num(d.score?.expected_return_daily_pct);
1244
+ const score = num2(d.score?.score);
1245
+ const expected = num2(d.score?.expected_return_daily_pct);
1128
1246
  const failedChecks = Array.isArray(d.safety_checks) ? d.safety_checks.filter((check) => check.passed === false).length : 0;
1129
1247
  return [
1130
1248
  truncate(String(d.question ?? d.market_slug ?? "\u2014"), 42),
1131
1249
  actionColor(action),
1132
- currency(num(d.target_capital)),
1133
- signedCurrency(num(d.capital_delta)),
1250
+ currency(num2(d.target_capital)),
1251
+ signedCurrency(num2(d.capital_delta)),
1134
1252
  `${expected.toFixed(3)}%`,
1135
1253
  regimeLabel(String(d.quote_regime ?? "\u2014")),
1136
1254
  String(Math.round(score)),
@@ -1159,7 +1277,7 @@ function displayAllocatorCycleResult(result, globalOpts) {
1159
1277
  const economics = decision.economics ?? {};
1160
1278
  if (economics.realized_spread_pnl !== void 0 || economics.reward_income !== void 0 || economics.net_realized_pnl !== void 0) {
1161
1279
  process.stdout.write(
1162
- " " + chalk5.dim("Economics: ") + `spread ${signedCurrency(num(economics.realized_spread_pnl))}, rewards ${signedCurrency(num(economics.reward_income))}, net ${signedCurrency(num(economics.net_realized_pnl))}
1280
+ " " + chalk5.dim("Economics: ") + `spread ${signedCurrency(num2(economics.realized_spread_pnl))}, rewards ${signedCurrency(num2(economics.reward_income))}, net ${signedCurrency(num2(economics.net_realized_pnl))}
1163
1281
  `
1164
1282
  );
1165
1283
  }
@@ -1199,26 +1317,49 @@ function parsePositiveNumber(value) {
1199
1317
  }
1200
1318
  return n;
1201
1319
  }
1320
+ function parseAllocationsInput(parsed) {
1321
+ const rows = extractArray(parsed, "allocations");
1322
+ if (!rows) {
1323
+ throw new Error("Allocations JSON must be an array or { allocations: [...] }");
1324
+ }
1325
+ return rows;
1326
+ }
1327
+ function parsePnlContextInput(parsed) {
1328
+ const rows = extractArray(parsed, "pnl_context");
1329
+ if (!rows) {
1330
+ throw new Error("PnL JSON must be an array or { pnl_context: [...] }");
1331
+ }
1332
+ return rows;
1333
+ }
1202
1334
  async function readAllocations(path) {
1203
1335
  if (!path) return [];
1204
- const raw = path === "-" ? await readStdin() : await readFile(path, "utf8");
1205
- const parsed = JSON.parse(raw);
1206
- if (!Array.isArray(parsed)) {
1207
- throw new Error("Allocations JSON must be an array");
1208
- }
1209
- return parsed;
1336
+ return parseAllocationsInput(await readJsonInput(path));
1337
+ }
1338
+ async function readPnlContext(path) {
1339
+ if (!path) return [];
1340
+ return parsePnlContextInput(await readJsonInput(path));
1210
1341
  }
1211
1342
  async function readMarketPayload(path) {
1212
1343
  if (!path) return void 0;
1213
- const raw = path === "-" ? await readStdin() : await readFile(path, "utf8");
1214
- const parsed = JSON.parse(raw);
1344
+ const parsed = await readJsonInput(path);
1345
+ const rows = extractArray(parsed, "markets");
1346
+ if (!rows) {
1347
+ throw new Error("Markets JSON must be an array or { markets: [...] }");
1348
+ }
1349
+ return rows;
1350
+ }
1351
+ function extractArray(parsed, key) {
1215
1352
  if (Array.isArray(parsed)) {
1216
1353
  return parsed;
1217
1354
  }
1218
- if (parsed && typeof parsed === "object" && Array.isArray(parsed.markets)) {
1219
- return parsed.markets;
1355
+ if (parsed && typeof parsed === "object" && Array.isArray(parsed[key])) {
1356
+ return parsed[key];
1220
1357
  }
1221
- throw new Error("Markets JSON must be an array or { markets: [...] }");
1358
+ return void 0;
1359
+ }
1360
+ async function readJsonInput(path) {
1361
+ const raw = path === "-" ? await readStdin() : await readFile(path, "utf8");
1362
+ return JSON.parse(raw);
1222
1363
  }
1223
1364
  async function readStdin() {
1224
1365
  const chunks = [];
@@ -1230,7 +1371,7 @@ async function readStdin() {
1230
1371
 
1231
1372
  // src/lp-display.ts
1232
1373
  import chalk6 from "chalk";
1233
- function num2(value, fallback = 0) {
1374
+ function num3(value, fallback = 0) {
1234
1375
  const n = Number(value);
1235
1376
  return Number.isFinite(n) ? n : fallback;
1236
1377
  }
@@ -1242,7 +1383,7 @@ function signedCurrency2(value) {
1242
1383
  }
1243
1384
  function actionSummary(actions) {
1244
1385
  if (!actions) return "none";
1245
- return Object.entries(actions).filter(([, count]) => num2(count) > 0).map(([action, count]) => `${action}:${num2(count)}`).join(" ");
1386
+ return Object.entries(actions).filter(([, count]) => num3(count) > 0).map(([action, count]) => `${action}:${num3(count)}`).join(" ");
1246
1387
  }
1247
1388
  function displayLpScanResult(result, globalOpts) {
1248
1389
  if (globalOpts.json) {
@@ -1271,10 +1412,10 @@ function displayLpScanResult(result, globalOpts) {
1271
1412
  result.markets.slice(0, 10).map((market) => [
1272
1413
  String(market.rank),
1273
1414
  truncate(market.question, 46),
1274
- String(Math.round(num2(market.score))),
1275
- compactCurrency(num2(market.liquidity)),
1276
- compactCurrency(num2(market.rewardsDailyRate)) + "/day",
1277
- `${num2(market.lpExpectedReturnDailyPct).toFixed(3)}%`
1415
+ String(Math.round(num3(market.score))),
1416
+ compactCurrency(num3(market.liquidity)),
1417
+ compactCurrency(num3(market.rewardsDailyRate)) + "/day",
1418
+ `${num3(market.lpExpectedReturnDailyPct).toFixed(3)}%`
1278
1419
  ]),
1279
1420
  ["#", "Market", "Score", "Liq", "Rewards", "Exp/day"]
1280
1421
  );
@@ -1333,7 +1474,7 @@ function displayLpEvaluateResult(result, globalOpts) {
1333
1474
  result.lessons.slice(0, 8).map((lesson) => [
1334
1475
  truncate(String(lesson.market_slug ?? "portfolio"), 26),
1335
1476
  String(lesson.outcome ?? "flat"),
1336
- signedCurrency2(num2(lesson.net_pnl)),
1477
+ signedCurrency2(num3(lesson.net_pnl)),
1337
1478
  truncate(String(lesson.lesson ?? "no lesson"), 64)
1338
1479
  ]),
1339
1480
  ["Market", "Outcome", "Net", "Lesson"]
@@ -1398,7 +1539,7 @@ function compact(payload) {
1398
1539
  }
1399
1540
  async function writeArtifact(path, data, jsonMode) {
1400
1541
  if (!path) return;
1401
- await writeFile(path, JSON.stringify(data, null, 2) + "\n", "utf8");
1542
+ await writeFile2(path, JSON.stringify(data, null, 2) + "\n", "utf8");
1402
1543
  if (!jsonMode) {
1403
1544
  process.stderr.write(dim(` Saved artifact to ${path}
1404
1545
  `));
@@ -1443,7 +1584,7 @@ async function runAllocatorCycle(client, payload) {
1443
1584
  }
1444
1585
  function registerLpCommands(program2) {
1445
1586
  const lp = program2.command("lp").description("Run persisted liquidity-provider scan, recommendation, and evaluation workflows");
1446
- 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; 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) => {
1587
+ 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 } (hl-trader pnl --json output); 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) => {
1447
1588
  const globalOpts = program2.opts();
1448
1589
  const client = new ApiClient(globalOpts);
1449
1590
  requireAuth5(client);
@@ -1453,10 +1594,16 @@ function registerLpCommands(program2) {
1453
1594
  error("Markets JSON must include at least one market.");
1454
1595
  process.exit(1);
1455
1596
  }
1597
+ if (opts.allocations === "-" && opts.pnl === "-") {
1598
+ error("Only one of --allocations and --pnl can read from stdin.");
1599
+ process.exit(1);
1600
+ }
1601
+ const pnlContext = await readPnlContext(opts.pnl);
1456
1602
  const payload = {
1457
1603
  strategy: strategyFromAllocatorOptions(opts),
1458
1604
  markets,
1459
- allocations: await readAllocations(opts.allocations)
1605
+ allocations: await readAllocations(opts.allocations),
1606
+ ...pnlContext.length > 0 && { pnl_context: pnlContext }
1460
1607
  };
1461
1608
  if (!globalOpts.json) {
1462
1609
  process.stderr.write(
@@ -1971,7 +2118,7 @@ function registerSignalCommands(program2) {
1971
2118
 
1972
2119
  // src/index.ts
1973
2120
  var program = new Command4();
1974
- program.name("hl").description("Hedge Layer CLI \u2014 prediction market intelligence from the terminal").version("2.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");
2121
+ program.name("hl").description("Hedge Layer CLI \u2014 prediction market intelligence from the terminal").version("2.1.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");
1975
2122
  registerAuthCommands(program);
1976
2123
  registerBriefCommands(program);
1977
2124
  registerProfileCommand(program);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/config.ts","../src/client.ts","../src/output.ts","../src/commands/brief.ts","../src/stream.ts","../src/commands/profile.ts","../src/commands/research.ts","../src/feed-display.ts","../src/commands/feed.ts","../src/commands/lp.ts","../src/allocator-display.ts","../src/commands/allocator.ts","../src/lp-display.ts","../src/commands/wallet.ts","../src/commands/signal.ts","../src/signal-display.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerBriefCommands } from \"./commands/brief.js\";\n\nimport { registerProfileCommand } from \"./commands/profile.js\";\nimport { registerResearchCommands } from \"./commands/research.js\";\nimport { registerFeedCommand } from \"./commands/feed.js\";\nimport { registerLpCommands } from \"./commands/lp.js\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerSignalCommands } from \"./commands/signal.js\";\nimport * as out from \"./output.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"hl\")\n .description(\"Hedge Layer CLI — prediction market intelligence from the terminal\")\n .version(__VERSION__)\n .option(\"--json\", \"Output as JSON (machine-readable)\")\n .option(\"--api-url <url>\", \"Override API base URL\")\n .option(\"--token <token>\", \"Override stored API token\")\n .option(\"--verbose\", \"Show HTTP request details\")\n .option(\"--no-color\", \"Disable colored output\");\n\nregisterAuthCommands(program);\nregisterBriefCommands(program);\n\nregisterProfileCommand(program);\nregisterResearchCommands(program);\nregisterFeedCommand(program);\nregisterWalletCommands(program);\nregisterLpCommands(program);\nregisterSignalCommands(program);\n\nprogram.hook(\"preAction\", (_thisCommand, actionCommand) => {\n const opts = program.opts();\n if (opts.color === false) {\n process.env.FORCE_COLOR = \"0\";\n }\n if (opts.verbose) {\n const cmdName = actionCommand.name();\n process.stderr.write(out.dim(`[verbose] Running: hl ${cmdName}\\n`));\n }\n});\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) {\n out.error(e.message);\n } else {\n out.error(`Unexpected error: ${e instanceof Error ? e.message : String(e)}`);\n if (program.opts().verbose) {\n console.error(e);\n }\n }\n process.exit(1);\n }\n}\n\nmain();\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport { loadConfig, saveConfig, clearConfig, configPath, DEFAULT_API_URL } from \"../config.js\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command(\"auth\").description(\"Manage API authentication\");\n\n auth\n .command(\"login\")\n .description(\"Authenticate with a Hedge Layer API token\")\n .option(\"--api-url <url>\", \"API base URL\", DEFAULT_API_URL)\n .action(async (cmdOpts: { apiUrl?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n try {\n out.heading(\"Hedge Layer CLI — Login\");\n process.stderr.write(\n `Create an API token at ${out.bold(\"https://hedgelayer.ai/account/settings\")} → API Tokens\\n\\n`,\n );\n\n const token = (await rl.question(\"Paste your API token: \")).trim();\n\n if (!token.startsWith(\"hl_\") || token.length !== 43) {\n out.error('Invalid token format. Tokens start with \"hl_\" and are 43 characters.');\n process.exit(1);\n }\n\n const apiUrl = globalOpts.apiUrl ?? cmdOpts.apiUrl ?? DEFAULT_API_URL;\n const client = new ApiClient({ token, apiUrl });\n\n process.stderr.write(\"\\nValidating token...\");\n let profile: UserProfile;\n try {\n profile = await client.get<UserProfile>(\"/api/profile\");\n } catch {\n process.stderr.write(\"\\n\");\n out.error(\"Token validation failed. Check your token and try again.\");\n process.exit(1);\n }\n process.stderr.write(\" done\\n\\n\");\n\n saveConfig({ api_url: apiUrl, token });\n\n out.success(`Logged in as ${out.bold(profile.handle || profile.user_id)}`);\n process.stderr.write(` Config saved to ${out.dim(configPath())}\\n`);\n } finally {\n rl.close();\n }\n });\n\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const config = loadConfig();\n const token = globalOpts.token ?? config.token;\n\n if (!token) {\n out.warn(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" to authenticate.\");\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n\n try {\n const profile = await client.get<UserProfile>(\"/api/profile\");\n if (globalOpts.json) {\n out.json({\n authenticated: true,\n handle: profile.handle,\n user_id: profile.user_id,\n api_url: client.apiUrl,\n });\n } else {\n out.heading(\"Auth Status\");\n out.table(\n [\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"API URL\", client.apiUrl],\n [\"Config\", configPath()],\n ],\n );\n }\n } catch {\n out.error(\"Token is invalid or expired. Run \" + out.bold(\"hl auth login\") + \" to re-authenticate.\");\n process.exit(1);\n }\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored API token\")\n .action(() => {\n clearConfig();\n out.success(\"Logged out. Token removed from \" + out.dim(configPath()));\n });\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CONFIG_DIR = join(homedir(), \".hedgelayer\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport const DEFAULT_API_URL = \"https://hedgelayer.ai\";\n\nexport interface Config {\n api_url: string;\n token: string | null;\n}\n\nfunction defaultConfig(): Config {\n return { api_url: DEFAULT_API_URL, token: null };\n}\n\nexport function loadConfig(): Config {\n try {\n if (!existsSync(CONFIG_FILE)) return defaultConfig();\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw);\n return {\n api_url: parsed.api_url ?? DEFAULT_API_URL,\n token: parsed.token ?? null,\n };\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfig(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function clearConfig(): void {\n try {\n if (existsSync(CONFIG_FILE)) unlinkSync(CONFIG_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function configPath(): string {\n return CONFIG_FILE;\n}\n","import type { GlobalOptions } from \"./types.js\";\nimport { loadConfig, DEFAULT_API_URL } from \"./config.js\";\n\nexport class ApiClient {\n private baseUrl: string;\n private token: string | null;\n private verbose: boolean;\n\n constructor(opts: GlobalOptions = {}) {\n const config = loadConfig();\n this.baseUrl = (opts.apiUrl ?? config.api_url ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.token = opts.token ?? config.token ?? null;\n this.verbose = opts.verbose ?? false;\n }\n\n get isAuthenticated(): boolean {\n return this.token !== null;\n }\n\n get apiUrl(): string {\n return this.baseUrl;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n const h: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n if (this.token) {\n h[\"Authorization\"] = `Bearer ${this.token}`;\n }\n return h;\n }\n\n private log(method: string, path: string, status?: number): void {\n if (!this.verbose) return;\n const statusStr = status ? ` → ${status}` : \"\";\n process.stderr.write(`[verbose] ${method} ${this.baseUrl}${path}${statusStr}\\n`);\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== \"\") url.searchParams.set(k, v);\n }\n }\n\n this.log(\"GET\", `${url.pathname}${url.search}`);\n const res = await fetch(url.toString(), { headers: this.headers() });\n this.log(\"GET\", `${url.pathname}${url.search}`, res.status);\n\n if (!res.ok) {\n const body = await res.text();\n throw new ApiError(res.status, body);\n }\n return res.json() as Promise<T>;\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n this.log(\"POST\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n /**\n * POST /api/brief with stream: false — returns the Market Brief JSON body\n * plus optional telemetry from response headers.\n */\n async postBriefSync(query: string): Promise<{\n brief: Record<string, unknown>;\n durationMs: number | null;\n stepsCompleted: number | null;\n toolsUsed: string[];\n }> {\n const path = \"/api/brief\";\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({ query, stream: false }),\n });\n this.log(\"POST\", path, res.status);\n\n const text = await res.text();\n if (!res.ok) {\n throw new ApiError(res.status, text);\n }\n\n let brief: Record<string, unknown>;\n try {\n brief = JSON.parse(text) as Record<string, unknown>;\n } catch {\n throw new ApiError(res.status, text || \"Invalid JSON from /api/brief\");\n }\n\n const dur = res.headers.get(\"X-Duration-Ms\");\n const steps = res.headers.get(\"X-Steps-Completed\");\n const tools = res.headers.get(\"X-Tools-Used\");\n\n return {\n brief,\n durationMs: dur != null ? Number(dur) : null,\n stepsCompleted: steps != null ? Number(steps) : null,\n toolsUsed: tools ? tools.split(\",\").filter(Boolean) : [],\n };\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n this.log(\"PATCH\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n this.log(\"PATCH\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n async delete(path: string): Promise<void> {\n this.log(\"DELETE\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"DELETE\",\n headers: this.headers(),\n });\n this.log(\"DELETE\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n }\n\n async stream(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (stream)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"text/event-stream\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (stream)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n\n async streamNdjson(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (ndjson)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"application/x-ndjson\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (ndjson)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n let msg: string;\n try {\n const parsed = JSON.parse(body);\n msg = parsed.error ?? parsed.message ?? body;\n } catch {\n msg = body;\n }\n super(`API error ${status}: ${msg}`);\n this.name = \"ApiError\";\n }\n}\n","import chalk from \"chalk\";\n\nexport function json(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, stripAnsi(row[i]).length);\n }\n }\n\n for (let r = 0; r < allRows.length; r++) {\n const row = allRows[r];\n const padded = row.map((cell, i) => {\n const bare = stripAnsi(cell);\n const pad = colWidths[i] - bare.length;\n return cell + \" \".repeat(Math.max(0, pad));\n });\n process.stdout.write(\" \" + padded.join(\" \") + \"\\n\");\n\n if (r === 0 && headers) {\n const sep = colWidths.map((w) => \"─\".repeat(w)).join(\"──\");\n process.stdout.write(\" \" + sep + \"\\n\");\n }\n }\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport function heading(text: string): void {\n process.stdout.write(\"\\n\" + chalk.bold(text) + \"\\n\\n\");\n}\n\nexport function success(text: string): void {\n process.stdout.write(chalk.green(\"✓\") + \" \" + text + \"\\n\");\n}\n\nexport function warn(text: string): void {\n process.stdout.write(chalk.yellow(\"⚠\") + \" \" + text + \"\\n\");\n}\n\nexport function error(text: string): void {\n process.stderr.write(chalk.red(\"✗\") + \" \" + text + \"\\n\");\n}\n\nexport function dim(text: string): string {\n return chalk.dim(text);\n}\n\nexport function bold(text: string): string {\n return chalk.bold(text);\n}\n\nexport function currency(n: number): string {\n return \"$\" + n.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n}\n\nexport function compactCurrency(n: number): string {\n if (!n || isNaN(n)) return \"$0\";\n if (n >= 1_000_000) return `$${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `$${(n / 1_000).toFixed(1)}K`;\n return `$${n.toFixed(0)}`;\n}\n\nexport function percent(n: number): string {\n return (n * 100).toFixed(1) + \"%\";\n}\n\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nexport function relativeTime(date: string): string {\n const diff = Date.now() - new Date(date).getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseNdjsonStream } from \"../stream.js\";\nimport type { MarketBrief, BriefRequest, BriefRequestFilters, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerBriefCommands(program: Command): void {\n program\n .command(\"brief <query>\")\n .description(\"Generate a Market Brief for a topic (non-interactive)\")\n .option(\"-l, --location <location>\", \"Geographic context (e.g. 'Middle East', 'US')\")\n .option(\"-t, --time-horizon <horizon>\", \"Time frame (e.g. '3 months', '2026')\")\n .option(\"--tags <tags>\", \"Comma-separated focus area tags (e.g. 'geopolitics,energy')\")\n .option(\"--min-volume <n>\", \"Minimum market volume in USD\", parseFloat)\n .option(\"--max-yes-price <n>\", \"Maximum YES price (0-1)\", parseFloat)\n .action(async (query: string, cmdOpts: BriefCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const filters = buildFilters(cmdOpts);\n const body: BriefRequest = {\n query,\n ...(cmdOpts.location && { location: cmdOpts.location }),\n ...(cmdOpts.timeHorizon && { timeHorizon: cmdOpts.timeHorizon }),\n ...(filters && { filters }),\n stream: true,\n };\n\n await runStreaming(client, body, globalOpts);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Command option types\n// ---------------------------------------------------------------------------\n\ninterface BriefCmdOpts {\n location?: string;\n timeHorizon?: string;\n tags?: string;\n minVolume?: number;\n maxYesPrice?: number;\n}\n\nfunction buildFilters(opts: BriefCmdOpts): BriefRequestFilters | undefined {\n const tags = opts.tags?.split(\",\").map((t) => t.trim()).filter(Boolean);\n const hasFilters = opts.minVolume != null || opts.maxYesPrice != null || (tags && tags.length > 0);\n if (!hasFilters) return undefined;\n return {\n ...(opts.minVolume != null && { minVolume: opts.minVolume }),\n ...(opts.maxYesPrice != null && { maxYesPrice: opts.maxYesPrice }),\n ...(tags && tags.length > 0 && { tags }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming mode (default)\n// ---------------------------------------------------------------------------\n\nasync function runStreaming(client: ApiClient, body: BriefRequest, globalOpts: GlobalOptions): Promise<void> {\n const startTime = Date.now();\n process.stderr.write(chalk.dim(` Generating brief for \"${out.truncate(body.query, 50)}\"...\\n`));\n\n const stream = await client.streamNdjson(\"/api/brief\", body);\n const result = await parseNdjsonStream(stream, {\n onProgress: (step, message) => {\n process.stderr.write(chalk.dim(` [${step}] `) + message + \"\\n\");\n },\n });\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n\n if (result.error) {\n out.error(`Brief failed (${result.error.code}): ${result.error.message}`);\n process.exit(1);\n }\n\n if (!result.brief) {\n out.error(\"No Market Brief was produced.\");\n process.exit(1);\n }\n\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n displayBrief(result.brief as unknown as MarketBrief, globalOpts);\n}\n\n// ---------------------------------------------------------------------------\n// Display\n// ---------------------------------------------------------------------------\n\nfunction displayBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n const marketCount = brief.marketCount ?? brief.markets.length;\n process.stdout.write(\"\\n \" + chalk.dim(`${marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","/**\n * Parses the Vercel AI SDK UI Message Stream protocol (SSE format).\n *\n * The server sends Server-Sent Events where each `data:` line contains\n * a JSON object with a `type` field:\n * text-delta: { type, id, delta }\n * tool-input-start: { type, toolCallId, toolName }\n * tool-input-delta: { type, toolCallId, inputTextDelta }\n * tool-input-available: { type, toolCallId, toolName, input }\n * tool-output-available:{ type, toolCallId, output }\n * error: { type, errorText }\n * [DONE]: stream termination sentinel\n */\n\nexport interface StreamCallbacks {\n onText?: (text: string) => void;\n onToolCall?: (name: string, args: unknown) => void;\n onToolResult?: (name: string, result: unknown) => void;\n}\n\nexport interface StreamResult {\n assistantText: string;\n toolCalls: Array<{ name: string; args: unknown }>;\n marketBrief: Record<string, unknown> | null;\n feedResult: Record<string, unknown> | null;\n}\n\nexport async function parseStream(\n body: ReadableStream<Uint8Array>,\n callbacks: StreamCallbacks = {},\n): Promise<StreamResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let assistantText = \"\";\n const toolCalls: Array<{ name: string; args: unknown }> = [];\n const activeToolCalls = new Map<string, { name: string; argStr: string }>();\n let marketBrief: Record<string, unknown> | null = null;\n let feedResult: Record<string, unknown> | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\":\")) continue;\n\n if (!trimmed.startsWith(\"data:\")) continue;\n const payload = trimmed.slice(5).trim();\n\n if (payload === \"[DONE]\") continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(payload);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"text-delta\": {\n const delta = msg.delta as string;\n if (delta) {\n assistantText += delta;\n callbacks.onText?.(delta);\n }\n break;\n }\n\n case \"tool-input-start\": {\n const id = msg.toolCallId as string;\n const name = msg.toolName as string;\n if (id && name) {\n activeToolCalls.set(id, { name, argStr: \"\" });\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n active.argStr += msg.inputTextDelta as string;\n }\n break;\n }\n\n case \"tool-input-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n const args = msg.input ?? active.argStr;\n toolCalls.push({ name: active.name, args });\n callbacks.onToolCall?.(active.name, args);\n }\n break;\n }\n\n case \"tool-output-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n callbacks.onToolResult?.(active.name, msg.output);\n if (active.name === \"buildMarketBrief\" && isMarketBrief(msg.output)) {\n marketBrief = msg.output as Record<string, unknown>;\n }\n if (active.name === \"getFeed\" && isFeedResult(msg.output)) {\n feedResult = msg.output as Record<string, unknown>;\n }\n activeToolCalls.delete(id);\n }\n break;\n }\n\n case \"error\": {\n throw new Error((msg.errorText as string) ?? \"Unknown stream error\");\n }\n }\n }\n\n if (done) break;\n }\n\n return { assistantText, toolCalls, marketBrief, feedResult };\n}\n\nfunction isMarketBrief(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"title\" in (val as Record<string, unknown>) &&\n \"markets\" in (val as Record<string, unknown>)\n );\n}\n\nfunction isFeedResult(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"markets\" in (val as Record<string, unknown>) &&\n \"sortedBy\" in (val as Record<string, unknown>)\n );\n}\n\n// ---------------------------------------------------------------------------\n// NDJSON stream parser (for POST /api/brief)\n// ---------------------------------------------------------------------------\n\nexport interface NdjsonCallbacks {\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface NdjsonBriefResult {\n brief: Record<string, unknown> | null;\n error: { code: string; message: string } | null;\n}\n\n/**\n * Parses an NDJSON stream from the /api/brief endpoint.\n *\n * Each line is a JSON object with a `type` field:\n * progress: { type, step, message }\n * brief: { type, data: MarketBrief }\n * error: { type, code, message }\n */\nexport async function parseNdjsonStream(\n body: ReadableStream<Uint8Array>,\n callbacks: NdjsonCallbacks = {},\n): Promise<NdjsonBriefResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let brief: Record<string, unknown> | null = null;\n let error: { code: string; message: string } | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(trimmed);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"progress\": {\n callbacks.onProgress?.(msg.step as string, msg.message as string);\n break;\n }\n case \"brief\": {\n brief = msg.data as Record<string, unknown>;\n break;\n }\n case \"error\": {\n error = {\n code: msg.code as string,\n message: msg.message as string,\n };\n break;\n }\n }\n }\n\n if (done) break;\n }\n\n return { brief, error };\n}\n","import { Command } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerProfileCommand(program: Command): void {\n program\n .command(\"profile\")\n .description(\"Show your user profile\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const profile = await client.get<UserProfile>(\"/api/profile\");\n\n if (globalOpts.json) {\n out.json(profile);\n return;\n }\n\n out.heading(\"Profile\");\n out.table([\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"Created\", new Date(profile.created_at).toLocaleDateString()],\n ]);\n });\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseStream } from \"../stream.js\";\nimport type { Assessment, MarketBrief, FeedResult, GlobalOptions } from \"../types.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport * as out from \"../output.js\";\n\nexport function registerResearchCommands(program: Command): void {\n const research = program.command(\"research\").description(\"AI-powered market research\");\n\n research\n .command(\"start\", { isDefault: true })\n .description(\"Start an interactive market research session\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const { id } = await client.post<{ id: string }>(\"/api/assessments\");\n\n out.heading(\"Market Research\");\n process.stderr.write(\n chalk.dim(\" Describe a topic or thesis to explore. Type /quit to exit.\\n\\n\"),\n );\n\n let msgCounter = 0;\n const uiMsg = (role: string, content: string) => ({\n id: `msg-${++msgCounter}`,\n role,\n content,\n parts: [{ type: \"text\" as const, text: content }],\n });\n\n const messages: ReturnType<typeof uiMsg>[] = [];\n let firstMessageTs: number | null = null;\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n\n try {\n while (true) {\n const userInput = await rl.question(chalk.cyan(\"You: \"));\n if (!userInput.trim()) continue;\n if (userInput.trim() === \"/quit\") break;\n\n if (firstMessageTs === null) firstMessageTs = Date.now();\n messages.push(uiMsg(\"user\", userInput));\n\n process.stderr.write(chalk.dim(\"\\nAssistant: \"));\n\n try {\n const body = await client.stream(\"/api/chat\", {\n messages,\n assessmentId: id,\n });\n\n const result = await parseStream(body, {\n onText: (text) => process.stderr.write(text),\n onToolCall: (name) => {\n process.stderr.write(chalk.dim(`\\n [tool: ${name}]\\n`));\n },\n onToolResult: (name, toolResult) => {\n if (globalOpts.verbose) {\n process.stderr.write(chalk.dim(` [result: ${name}] ${JSON.stringify(toolResult).slice(0, 200)}\\n`));\n }\n },\n });\n\n process.stderr.write(\"\\n\\n\");\n\n if (result.assistantText) {\n messages.push(uiMsg(\"assistant\", result.assistantText));\n }\n\n try {\n await persistAssessment(client, id, messages, result.marketBrief, firstMessageTs);\n } catch (persistErr) {\n out.warn(\n `Could not save session: ${persistErr instanceof Error ? persistErr.message : String(persistErr)}`,\n );\n }\n\n if (result.feedResult) {\n displayFeedResult(result.feedResult as unknown as FeedResult, globalOpts);\n }\n\n if (result.marketBrief) {\n displayMarketBrief(result.marketBrief as unknown as MarketBrief, globalOpts);\n break;\n }\n } catch (e) {\n process.stderr.write(\"\\n\");\n out.error(`Chat error: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n } finally {\n rl.close();\n }\n });\n\n research\n .command(\"run <query>\")\n .description(\"Run research on a topic and return the final Market Brief as JSON (via /api/brief)\")\n .action(async (query: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n process.stderr.write(chalk.dim(` Researching \"${out.truncate(query, 60)}\"...\\n`));\n const startTime = Date.now();\n\n const { brief, durationMs, stepsCompleted, toolsUsed } = await client.postBriefSync(query);\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n\n const looksLikeBrief =\n brief &&\n typeof brief === \"object\" &&\n Array.isArray((brief as { markets?: unknown }).markets) &&\n typeof (brief as { title?: unknown }).title === \"string\";\n\n if (looksLikeBrief) {\n out.json(brief as unknown as MarketBrief);\n } else {\n process.stderr.write(chalk.yellow(\"No market brief was produced.\\n\"));\n out.json({\n brief: null,\n text: null,\n metadata: {\n model: \"\",\n stepsUsed: stepsCompleted ?? 0,\n toolsUsed,\n durationMs: durationMs ?? Date.now() - startTime,\n },\n raw: brief,\n });\n }\n });\n\n research\n .command(\"list\")\n .description(\"List past research sessions\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .action(async (cmdOpts: { status?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params: Record<string, string> = { list: \"true\" };\n if (cmdOpts.status) params.status = cmdOpts.status;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", params);\n\n if (globalOpts.json) {\n out.json(data.assessments);\n return;\n }\n\n if (data.assessments.length === 0) {\n out.warn(\"No research sessions found.\");\n return;\n }\n\n out.heading(`Research Sessions (${data.assessments.length})`);\n\n const rows = data.assessments.map((a) => {\n const status = formatStatus(a.status);\n const brief = a.market_brief?.title ?? \"—\";\n const markets = a.market_brief ? String(a.market_brief.marketCount) : \"—\";\n return [a.id.slice(0, 8), status, out.truncate(brief, 30), markets, out.relativeTime(a.created_at)];\n });\n\n out.table(rows, [\"ID\", \"Status\", \"Brief\", \"Markets\", \"Created\"]);\n });\n\n research\n .command(\"show <id>\")\n .description(\"Show research session details (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n const assessment = await client.get<Assessment>(`/api/assessments/${fullId}`);\n\n if (globalOpts.json) {\n out.json(assessment);\n return;\n }\n\n out.heading(\"Research Session \" + out.dim(assessment.id.slice(0, 8)));\n\n out.table([\n [\"Status\", formatStatus(assessment.status)],\n [\"Created\", new Date(assessment.created_at).toLocaleString()],\n [\"Updated\", new Date(assessment.updated_at).toLocaleString()],\n ]);\n\n if (assessment.market_brief) {\n displayMarketBrief(assessment.market_brief, globalOpts);\n }\n });\n\n research\n .command(\"delete <id>\")\n .description(\"Delete a research session (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n await client.delete(`/api/assessments/${fullId}`);\n out.success(\"Research session deleted.\");\n });\n}\n\n/** Matches a full assessment UUID (e.g. 7f4fdace-a4b2-428d-87f1-fbf715165776). */\nconst FULL_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Resolve a user-supplied session identifier (a full UUID or the short 8-char\n * prefix printed by `hl research list`) against a set of known assessment IDs.\n *\n * Pure and synchronous so it can be unit-tested without network access.\n */\nexport function matchAssessmentId(idOrPrefix: string, ids: string[]): string {\n const needle = idOrPrefix.trim().toLowerCase();\n if (!needle) {\n throw new Error(\"No research session ID provided.\");\n }\n\n // Exact match wins outright (covers full UUIDs present in the list).\n const exact = ids.find((id) => id.toLowerCase() === needle);\n if (exact) return exact;\n\n const matches = ids.filter((id) => id.toLowerCase().startsWith(needle));\n if (matches.length === 1) return matches[0];\n\n if (matches.length === 0) {\n throw new Error(\n `No research session found matching \"${idOrPrefix}\". Run \\`hl research list\\` to see available sessions.`,\n );\n }\n\n const shortIds = matches.map((id) => id.slice(0, 8)).join(\", \");\n throw new Error(\n `\"${idOrPrefix}\" matches ${matches.length} research sessions (${shortIds}). Use a longer ID prefix to disambiguate.`,\n );\n}\n\n/**\n * Turn a full UUID or short ID prefix into the full assessment UUID.\n * Full UUIDs are returned directly (no extra API call); short prefixes are\n * resolved by listing the user's sessions and matching.\n */\nexport async function resolveAssessmentId(client: ApiClient, idOrPrefix: string): Promise<string> {\n const trimmed = idOrPrefix.trim();\n if (FULL_UUID.test(trimmed)) return trimmed;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", { list: \"true\" });\n return matchAssessmentId(\n trimmed,\n data.assessments.map((a) => a.id),\n );\n}\n\n/**\n * Resolve a session ID for a CLI action, printing a clean error and exiting on\n * an ambiguous/unknown identifier instead of surfacing it as an unexpected error.\n */\nasync function resolveOrExit(client: ApiClient, idOrPrefix: string): Promise<string> {\n try {\n return await resolveAssessmentId(client, idOrPrefix);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) throw e;\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n\n/** Mirrors web ChatInterface assessment PATCH (simplified metadata without tool-part extraction). */\nfunction buildAssessmentPatch(\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Record<string, unknown> {\n const patch: Record<string, unknown> = { messages };\n const meta: Record<string, unknown> = {\n timeToBriefMs: null,\n searchQueries: [],\n searchResultCounts: [],\n coverageHit: false,\n completedAt: null,\n };\n\n if (\n marketBrief &&\n typeof marketBrief === \"object\" &&\n Array.isArray((marketBrief as { markets?: unknown }).markets)\n ) {\n const markets = (marketBrief as { markets: unknown[] }).markets;\n patch.market_brief = marketBrief;\n patch.status = \"completed\";\n meta.timeToBriefMs = firstMessageTs != null ? Date.now() - firstMessageTs : null;\n meta.coverageHit = markets.length > 0;\n meta.completedAt = new Date().toISOString();\n }\n\n patch.metadata = meta;\n return patch;\n}\n\nasync function persistAssessment(\n client: ApiClient,\n assessmentId: string,\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Promise<void> {\n await client.patch(`/api/assessments/${assessmentId}`, buildAssessmentPatch(messages, marketBrief, firstMessageTs));\n}\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"in_progress\":\n return chalk.yellow(status);\n case \"abandoned\":\n return chalk.red(status);\n default:\n return status;\n }\n}\n\nfunction displayMarketBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n process.stdout.write(\"\\n \" + chalk.dim(`${brief.marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n","import chalk from \"chalk\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"./types.js\";\nimport * as out from \"./output.js\";\n\nconst SORT_LABELS: Record<string, string> = {\n score: \"attention score\",\n volume: \"24h volume\",\n liquidity: \"liquidity\",\n movement: \"price movement\",\n spread: \"spread tightness\",\n recency: \"recency\",\n extremity: \"uncertainty\",\n rewards: \"rewards\",\n rewardYield: \"reward yield (per $ liq)\",\n lpExpectedReturn: \"LP expected return\",\n horizon: \"time to resolution\",\n};\n\nfunction scoreBar(score: number): string {\n const width = 15;\n const filled = Math.round((score / 100) * width);\n const empty = width - filled;\n const color = score >= 70 ? chalk.green : score >= 45 ? chalk.yellow : chalk.dim;\n return color(\"█\".repeat(filled)) + chalk.dim(\"░\".repeat(empty)) + ` ${Math.round(score)}`;\n}\n\nexport function displayFeedResult(feed: FeedResult, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(feed);\n return;\n }\n\n const sortLabel = SORT_LABELS[feed.sortedBy] ?? feed.sortedBy;\n out.heading(`Market Feed — ${feed.marketsReturned} markets by ${sortLabel}`);\n process.stdout.write(\n chalk.dim(\n ` ${feed.totalScanned.toLocaleString()} scanned · ${feed.totalAfterFilter.toLocaleString()} after filters · preset ${feed.preset}\\n\\n`,\n ),\n );\n\n if (feed.markets.length === 0) {\n out.warn(\"No markets matched the criteria.\");\n return;\n }\n\n const rows = feed.markets.map((m: FeedResultMarket) => {\n const prob = out.percent(m.yesPrice);\n const change = m.oneDayPriceChange;\n const changeStr =\n change > 0\n ? chalk.green(`+${(change * 100).toFixed(1)}%`)\n : change < 0\n ? chalk.red(`${(change * 100).toFixed(1)}%`)\n : chalk.dim(\"0.0%\");\n return [\n String(m.rank),\n out.truncate(m.question, 42),\n prob,\n String(Math.round(m.score)),\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n changeStr,\n ];\n });\n\n out.table(rows, [\"#\", \"Market\", \"Prob\", \"Score\", \"24h Vol\", \"Liq\", \"Chg\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of feed.markets.slice(0, 5)) {\n const url = m.polymarketUrl;\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 55) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Score: \") + scoreBar(m.score) + \" \");\n process.stdout.write(chalk.dim(\"Spread: \") + m.spread.toFixed(3) + \" \");\n if (m.rewardsDailyRate > 0) {\n process.stdout.write(chalk.dim(\"Rewards: \") + `$${m.rewardsDailyRate.toFixed(2)}/day`);\n }\n process.stdout.write(\"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + url + \"\\n\");\n }\n\n if (feed.markets.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${feed.markets.length - 5} more\\n`));\n }\n}\n","import { Command } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport type { FeedResult, 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\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\nexport function registerFeedCommand(program: Command): void {\n 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 .action(async (screening: string | undefined, o: FeedCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n let profile: string | undefined;\n try {\n profile = resolveFeedProfile(screening, o.profile, out.warn);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params = feedQueryParams({\n profile,\n sortBy: o.sortBy,\n preset: o.preset,\n tag: o.tag,\n minVolume: o.minVolume,\n minLiquidity: o.minLiquidity,\n maxLiquidity: o.maxLiquidity,\n minRewardsDailyRate: o.minRewardsDailyRate,\n minDaysToEnd: o.minDaysToEnd,\n maxDaysToEnd: o.maxDaysToEnd,\n maxMarketAgeHours: o.maxMarketAgeHours,\n liquidProfile: o.liquidProfile,\n limit: o.limit,\n });\n\n try {\n const result = await client.get<FeedResult>(\"/api/feed\", params);\n if (result.error) {\n out.error(result.error);\n process.exit(1);\n }\n displayFeedResult(result, globalOpts);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { writeFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport {\n displayAllocatorCycleResult,\n} from \"../allocator-display.js\";\nimport {\n parsePositiveNumber,\n readAllocations,\n readMarketPayload,\n} from \"./allocator.js\";\nimport {\n displayLpEvaluateResult,\n displayLpRecommendResult,\n displayLpScanResult,\n} from \"../lp-display.js\";\nimport type {\n GlobalOptions,\n AllocatorCycleApiResponse,\n AllocatorCycleRequest,\n AllocatorStrategyInput,\n LpEvaluateResponse,\n LpRecommendResponse,\n LpScanResponse,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface LpScanOpts {\n profile?: string;\n sortBy?: string;\n tag?: string;\n minVolume?: number;\n minLiquidity?: number;\n maxLiquidity?: number;\n minRewardsDailyRate?: number;\n minDaysToEnd?: number;\n maxDaysToEnd?: number;\n maxMarketAgeHours?: number;\n liquidProfile?: string;\n limit?: number;\n strategyId?: string;\n output?: string;\n}\n\ninterface LpRecommendOpts {\n strategyId?: string;\n scanId?: string;\n limit?: number;\n syncPnl?: boolean;\n output?: string;\n}\n\ninterface LpEvaluateOpts {\n strategyId?: string;\n walletAddress?: string;\n syncPnl?: boolean;\n limit?: number;\n output?: string;\n}\n\ninterface LpAllocatorOpts {\n markets: string;\n allocations?: string;\n totalHoldings?: number;\n capitalLimitPct?: number;\n perMarketLimitPct?: number;\n capitalLimit: number;\n perMarketLimit: number;\n minExpectedReturnDailyPct: number;\n maxInventoryImbalance: number;\n volatilityFillSpikeThreshold: number;\n eventNoQuoteMinutesBefore: number;\n eventNoQuoteMinutesAfter: number;\n allocatorMinLiquidity: number;\n maxSpread: number;\n allocatorMinDaysToEnd: number;\n maxMarkets: number;\n paused?: boolean;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction parseNonNegative(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0) {\n throw new InvalidArgumentError(\"Expected a non-negative number\");\n }\n return n;\n}\n\nfunction parsePositiveInt(value: string): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) {\n throw new InvalidArgumentError(\"Expected a positive integer\");\n }\n return n;\n}\n\nfunction strategyFromAllocatorOptions(opts: LpAllocatorOpts): AllocatorStrategyInput {\n return {\n id: \"cli-lp-allocator\",\n name: \"CLI LP allocator dry run\",\n status: opts.paused ? \"paused\" : \"dry_run\",\n ...(opts.totalHoldings !== undefined && { total_holdings: opts.totalHoldings }),\n ...(opts.capitalLimitPct !== undefined && { capital_limit_pct: opts.capitalLimitPct }),\n ...(opts.perMarketLimitPct !== undefined && { per_market_limit_pct: opts.perMarketLimitPct }),\n capital_limit: opts.capitalLimit,\n per_market_limit: opts.perMarketLimit,\n min_expected_return_daily_pct: opts.minExpectedReturnDailyPct,\n max_inventory_imbalance: opts.maxInventoryImbalance,\n volatility_fill_spike_threshold: opts.volatilityFillSpikeThreshold,\n event_no_quote_minutes_before: opts.eventNoQuoteMinutesBefore,\n event_no_quote_minutes_after: opts.eventNoQuoteMinutesAfter,\n min_liquidity: opts.allocatorMinLiquidity,\n max_spread: opts.maxSpread,\n min_days_to_end: opts.allocatorMinDaysToEnd,\n max_markets: opts.maxMarkets,\n };\n}\n\nfunction validateAllocatorPercentageSizing(opts: LpAllocatorOpts): void {\n const usesPercentageSizing =\n opts.capitalLimitPct !== undefined || opts.perMarketLimitPct !== undefined;\n if (usesPercentageSizing && opts.totalHoldings === undefined) {\n out.error(\n \"Percentage sizing requires --total-holdings so the allocator can convert percentages into dollar caps.\",\n );\n process.exit(1);\n }\n}\n\nfunction compact<T extends Record<string, unknown>>(payload: T): T {\n return Object.fromEntries(\n Object.entries(payload).filter(([, value]) => value !== undefined && value !== \"\"),\n ) as T;\n}\n\nasync function writeArtifact(path: string | undefined, data: unknown, jsonMode: boolean): Promise<void> {\n if (!path) return;\n await writeFile(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n if (!jsonMode) {\n process.stderr.write(out.dim(` Saved artifact to ${path}\\n`));\n }\n}\n\nexport function buildLpScanPayload(topic: string | undefined, opts: LpScanOpts) {\n return compact({\n topic: topic?.trim() || undefined,\n strategyId: opts.strategyId,\n profile: opts.profile,\n sortBy: opts.sortBy,\n tag: opts.tag,\n minVolume: opts.minVolume,\n minLiquidity: opts.minLiquidity,\n maxLiquidity: opts.maxLiquidity,\n minRewardsDailyRate: opts.minRewardsDailyRate,\n minDaysToEnd: opts.minDaysToEnd,\n maxDaysToEnd: opts.maxDaysToEnd,\n maxMarketAgeHours: opts.maxMarketAgeHours,\n liquidProfile: opts.liquidProfile,\n limit: opts.limit,\n });\n}\n\nexport function buildLpRecommendPayload(opts: LpRecommendOpts) {\n return compact({\n strategyId: opts.strategyId,\n scanId: opts.scanId,\n limit: opts.limit,\n syncPnl: opts.syncPnl,\n });\n}\n\nexport function buildLpEvaluatePayload(opts: LpEvaluateOpts) {\n return compact({\n strategyId: opts.strategyId,\n walletAddress: opts.walletAddress,\n syncPnl: opts.syncPnl,\n limit: opts.limit,\n });\n}\n\nasync function runAllocatorCycle(\n client: ApiClient,\n payload: AllocatorCycleRequest,\n): Promise<AllocatorCycleApiResponse> {\n return client.post<AllocatorCycleApiResponse>(\"/api/lp/allocator\", payload);\n}\n\nexport function registerLpCommands(program: Command): void {\n const lp = program\n .command(\"lp\")\n .description(\"Run persisted liquidity-provider scan, recommendation, and evaluation workflows\");\n\n lp\n .command(\"allocator\")\n .description(\"Run the allocator agent on an explicit market list\")\n .requiredOption(\"--markets <file>\", \"Candidate market JSON array or { markets }; use '-' to read stdin\")\n .option(\"--allocations <file>\", \"Existing allocations JSON array; 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 const payload: AllocatorCycleRequest = {\n strategy: strategyFromAllocatorOptions(opts),\n markets,\n allocations: await readAllocations(opts.allocations),\n };\n\n if (!globalOpts.json) {\n process.stderr.write(\n out.dim(` Running allocator dry-run on ${markets.length} provided candidates...\\n`),\n );\n }\n\n const response = await runAllocatorCycle(client, payload);\n if (globalOpts.json) {\n out.json(response);\n } else {\n displayAllocatorCycleResult(response.result ?? {}, globalOpts);\n }\n });\n\n lp\n .command(\"scan\")\n .description(\"Scan LP candidates and persist them as evidence\")\n .argument(\"[topic]\", \"Human label for this scan, e.g. liquidity opportunities\")\n .option(\"--profile <name>\", \"lp-opportunity | liquidity-provider | liquid-new-or-long\", \"liquidity-provider\")\n .option(\"--sort-by <key>\", \"score | volume | liquidity | movement | spread | rewards | rewardYield | lpExpectedReturn | horizon\")\n .option(\"--tag <slug>\", \"Polymarket category tag, e.g. crypto, politics\")\n .option(\"--min-volume <usd>\", \"Minimum 24h volume (USD)\", parseNonNegative)\n .option(\"--min-liquidity <usd>\", \"Minimum displayed liquidity (USD)\", parseNonNegative)\n .option(\"--max-liquidity <usd>\", \"Maximum displayed liquidity (USD)\", parseNonNegative)\n .option(\"--min-rewards-daily-rate <usd>\", \"Minimum LP rewards USD/day\", parseNonNegative)\n .option(\"--min-days-to-end <n>\", \"Minimum days until resolution\", parseNonNegative)\n .option(\"--max-days-to-end <n>\", \"Maximum days until resolution\", parseNonNegative)\n .option(\"--max-market-age-hours <n>\", \"With liquid-new-or-long: max age for the new branch\", parseNonNegative)\n .option(\"--liquid-profile <mode>\", \"new-or-long\")\n .option(\"--limit <n>\", \"Max markets to scan/save (1-100, default 15)\", parsePositiveInt, 15)\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--output <file>\", \"Write the evidence JSON response to a local file\")\n .action(async (topic: string | undefined, opts: LpScanOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpScanResponse>(\n \"/api/lp/scan\",\n buildLpScanPayload(topic, opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpScanResult(result, globalOpts);\n });\n\n lp\n .command(\"recommend\")\n .description(\"Run allocator recommendations from saved LP evidence and current allocations\")\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--scan-id <uuid>\", \"Use candidates from a specific saved scan\")\n .option(\"--limit <n>\", \"Max saved candidates to submit (1-25, default 15)\", parsePositiveInt, 15)\n .option(\"--sync-pnl\", \"Refresh wallet PnL before recommending\")\n .option(\"--output <file>\", \"Write the recommendation JSON response to a local file\")\n .action(async (opts: LpRecommendOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpRecommendResponse>(\n \"/api/lp/recommend\",\n buildLpRecommendPayload(opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpRecommendResult(result, globalOpts);\n });\n\n lp\n .command(\"evaluate\")\n .description(\"Evaluate LP performance and return compact lessons\")\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--wallet-address <address>\", \"Wallet address to sync PnL from\")\n .option(\"--no-sync-pnl\", \"Use existing PnL snapshots without refreshing\")\n .option(\"--limit <n>\", \"Max PnL snapshots to evaluate (1-100, default 50)\", parsePositiveInt, 50)\n .option(\"--output <file>\", \"Write the evaluation JSON response to a local file\")\n .action(async (opts: LpEvaluateOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpEvaluateResponse>(\n \"/api/lp/evaluate\",\n buildLpEvaluatePayload(opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpEvaluateResult(result, globalOpts);\n });\n\n}\n","import chalk from \"chalk\";\nimport type {\n AllocatorCycleResult,\n GlobalOptions,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction actionColor(action: string): string {\n switch (action) {\n case \"ALLOCATE\":\n case \"INCREASE\":\n return chalk.green(action);\n case \"REDUCE\":\n case \"EXIT\":\n return chalk.yellow(action);\n case \"SKIP\":\n return chalk.dim(action);\n case \"WATCH\":\n return chalk.cyan(action);\n default:\n return action;\n }\n}\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function displayAllocatorCycleResult(\n result: AllocatorCycleResult,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n const decisions = Array.isArray(result.decisions) ? result.decisions : [];\n const summary = result.summary ?? {};\n const dryRun = result.dry_run === false ? \"live\" : \"dry run\";\n\n out.heading(`Allocator Cycle — ${dryRun}`);\n process.stdout.write(\n chalk.dim(\n ` ${num(result.total_markets, decisions.length)} markets · ${out.currency(\n num(summary.target_capital),\n )} target capital\\n\\n`,\n ),\n );\n\n if (decisions.length === 0) {\n out.warn(\"No allocator decisions returned.\");\n return;\n }\n\n const rows = decisions.map((d) => {\n const action = String(d.action ?? \"UNKNOWN\");\n const score = num(d.score?.score);\n const expected = num(d.score?.expected_return_daily_pct);\n const failedChecks = Array.isArray(d.safety_checks)\n ? d.safety_checks.filter((check) => check.passed === false).length\n : 0;\n return [\n out.truncate(String(d.question ?? d.market_slug ?? \"—\"), 42),\n actionColor(action),\n out.currency(num(d.target_capital)),\n signedCurrency(num(d.capital_delta)),\n `${expected.toFixed(3)}%`,\n regimeLabel(String(d.quote_regime ?? \"—\")),\n String(Math.round(score)),\n failedChecks === 0 ? chalk.green(\"0\") : chalk.yellow(String(failedChecks)),\n ];\n });\n\n out.table(rows, [\n \"Market\",\n \"Action\",\n \"Target\",\n \"Delta\",\n \"Exp/day\",\n \"Regime\",\n \"Score\",\n \"Fails\",\n ]);\n\n process.stdout.write(\"\\n\");\n for (const decision of decisions.slice(0, 5)) {\n const action = String(decision.action ?? \"UNKNOWN\");\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(String(decision.question ?? decision.market_slug ?? \"—\"), 65) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Action: \") + actionColor(action));\n if (decision.rationale) {\n process.stdout.write(\" \" + chalk.dim(\"Rationale: \") + out.truncate(decision.rationale, 120));\n }\n process.stdout.write(\"\\n\");\n\n const economics = decision.economics ?? {};\n if (\n economics.realized_spread_pnl !== undefined ||\n economics.reward_income !== undefined ||\n economics.net_realized_pnl !== undefined\n ) {\n process.stdout.write(\n \" \" +\n chalk.dim(\"Economics: \") +\n `spread ${signedCurrency(num(economics.realized_spread_pnl))}, ` +\n `rewards ${signedCurrency(num(economics.reward_income))}, ` +\n `net ${signedCurrency(num(economics.net_realized_pnl))}` +\n \"\\n\",\n );\n }\n }\n\n if (decisions.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${decisions.length - 5} more decisions\\n`));\n }\n}\n\nfunction regimeLabel(value: string): string {\n switch (value) {\n case \"reward_optimized\":\n return chalk.green(\"reward\");\n case \"defensive\":\n return chalk.yellow(\"defense\");\n case \"no_quote\":\n return chalk.red(\"no quote\");\n default:\n return chalk.dim(value);\n }\n}\n\nfunction signedCurrency(value: number): string {\n const formatted = out.currency(Math.abs(value));\n if (value > 0) return chalk.green(`+${formatted}`);\n if (value < 0) return chalk.yellow(`-${formatted}`);\n return chalk.dim(\"$0.00\");\n}\n","import { InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport type {\n AllocatorAllocationInput,\n AllocatorMarketInput,\n} 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 async function readAllocations(path: string | undefined): Promise<AllocatorAllocationInput[]> {\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 throw new Error(\"Allocations JSON must be an array\");\n }\n return parsed as AllocatorAllocationInput[];\n}\n\nexport async function readMarketPayload(path: string | undefined): Promise<AllocatorMarketInput[] | undefined> {\n if (!path) return undefined;\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 parsed as AllocatorMarketInput[];\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as { markets?: unknown }).markets)) {\n return (parsed as { markets: AllocatorMarketInput[] }).markets;\n }\n throw new Error(\"Markets JSON must be an array or { markets: [...] }\");\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n","import chalk from \"chalk\";\nimport { displayAllocatorCycleResult } from \"./allocator-display.js\";\nimport type {\n GlobalOptions,\n LpEvaluateResponse,\n LpRecommendResponse,\n LpScanResponse,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction signedCurrency(value: number): string {\n const formatted = out.currency(Math.abs(value));\n if (value > 0) return chalk.green(`+${formatted}`);\n if (value < 0) return chalk.yellow(`-${formatted}`);\n return chalk.dim(\"$0.00\");\n}\n\nfunction actionSummary(actions: Record<string, unknown> | undefined): string {\n if (!actions) return \"none\";\n return Object.entries(actions)\n .filter(([, count]) => num(count) > 0)\n .map(([action, count]) => `${action}:${num(count)}`)\n .join(\" \");\n}\n\nexport function displayLpScanResult(result: LpScanResponse, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Scan\");\n process.stdout.write(\n chalk.dim(\n ` scan ${result.scanId} · strategy ${result.strategyId} · ${result.evidenceSaved} evidence rows saved\\n`,\n ),\n );\n process.stdout.write(\n chalk.dim(\n ` ${result.totalScanned.toLocaleString()} scanned · ${result.totalAfterFilter.toLocaleString()} after filters · profile ${result.profile}\\n\\n`,\n ),\n );\n\n if (result.markets.length === 0) {\n out.warn(\"No markets matched the LP scan.\");\n return;\n }\n\n out.table(\n result.markets.slice(0, 10).map((market) => [\n String(market.rank),\n out.truncate(market.question, 46),\n String(Math.round(num(market.score))),\n out.compactCurrency(num(market.liquidity)),\n out.compactCurrency(num(market.rewardsDailyRate)) + \"/day\",\n `${num(market.lpExpectedReturnDailyPct).toFixed(3)}%`,\n ]),\n [\"#\", \"Market\", \"Score\", \"Liq\", \"Rewards\", \"Exp/day\"],\n );\n}\n\nexport function displayLpRecommendResult(\n result: LpRecommendResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Recommendations\");\n process.stdout.write(\n chalk.dim(\n ` cycle ${result.cycleId} · strategy ${result.strategyId} · ${result.candidatesSubmitted} markets · ${result.allocationsSubmitted} current allocations\\n`,\n ),\n );\n process.stdout.write(\n chalk.dim(\n ` PnL context ${result.pnlContextCount} rows${result.pnlSynced ? \" · synced\" : \"\"} · approvals required\\n\\n`,\n ),\n );\n displayAllocatorCycleResult(result.result ?? { decisions: result.decisions }, globalOpts);\n}\n\nexport function displayLpEvaluateResult(\n result: LpEvaluateResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Evaluation\");\n process.stdout.write(\n chalk.dim(\n ` strategy ${result.strategyId} · ${result.summary.snapshots} snapshots · ${result.summary.markets} markets`,\n ),\n );\n if (result.pnlSynced) process.stdout.write(chalk.dim(\" · synced\"));\n process.stdout.write(\"\\n\\n\");\n if (result.syncError) out.warn(result.syncError);\n\n out.table(\n [\n [\"Realized PnL\", signedCurrency(result.summary.realizedPnl)],\n [\"Unrealized PnL\", signedCurrency(result.summary.unrealizedPnl)],\n [\"Net PnL\", signedCurrency(result.summary.netPnl)],\n [\"Capital locked\", out.currency(result.summary.capitalLocked)],\n [\"Current value\", out.currency(result.summary.currentValue)],\n [\"Outcomes\", actionSummary(result.summary.outcomes)],\n ],\n );\n\n if (result.lessons.length === 0) {\n out.warn(\"No PnL lessons available yet.\");\n return;\n }\n\n process.stdout.write(\"\\n\");\n out.table(\n result.lessons.slice(0, 8).map((lesson) => [\n out.truncate(String(lesson.market_slug ?? \"portfolio\"), 26),\n String(lesson.outcome ?? \"flat\"),\n signedCurrency(num(lesson.net_pnl)),\n out.truncate(String(lesson.lesson ?? \"no lesson\"), 64),\n ]),\n [\"Market\", \"Outcome\", \"Net\", \"Lesson\"],\n );\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { spawn } from \"node:child_process\";\nimport { ApiClient } from \"../client.js\";\nimport type {\n GlobalOptions,\n WalletAssetKey,\n WalletBalanceAsset,\n WalletBalances,\n WalletDepositResponse,\n WalletStatus,\n WalletWithdrawIntent,\n WalletWithdrawIntentResponse,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\nconst NETWORK_NAME = \"Polygon\";\nconst POLYGON_NATIVE_USDC = \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\";\nconst SUPPORTED_ASSETS: WalletAssetKey[] = [\"pUsd\", \"usdcE\", \"matic\"];\nconst POLYGON_NATIVE_ASSET_LABEL = \"POL\";\nconst TERMINAL_WITHDRAWAL_STATUSES = new Set([\"succeeded\", \"failed\", \"cancelled\", \"expired\"]);\n\ninterface DepositInstructions {\n action: \"deposit\";\n publicDepositAddress: string;\n walletAddress: string;\n chainId: number;\n network: string;\n asset: WalletBalanceAsset | null;\n assets: WalletBalanceAsset[];\n warning: string;\n}\n\ninterface DepositOpts {\n asset?: string;\n bridge?: boolean;\n}\n\ninterface WithdrawOpts {\n asset?: string;\n amount: number;\n to: string;\n toChainId?: string;\n toTokenAddress?: string;\n open?: boolean;\n wait?: boolean;\n pollInterval?: number;\n timeout?: number;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction parsePositiveNumber(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return n;\n}\n\nfunction parseWalletAddress(value: string): string {\n const trimmed = value.trim();\n if (!/^0x[a-fA-F0-9]{40}$/.test(trimmed)) {\n throw new InvalidArgumentError(\"Expected a valid EVM wallet address\");\n }\n return trimmed;\n}\n\nexport function normalizeWalletAsset(value: string | undefined): WalletAssetKey | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase().replace(/[._\\s-]/g, \"\");\n if ([\"pusd\", \"polymarketusd\"].includes(normalized)) return \"pUsd\";\n if ([\"usdce\", \"usdcebridged\", \"bridgedusdc\", \"usdc\"].includes(normalized)) return \"usdcE\";\n if ([\"matic\", \"pol\"].includes(normalized)) return \"matic\";\n throw new InvalidArgumentError(\"Unknown wallet asset. Use pUSD, USDC.e, or POL.\");\n}\n\nfunction assetByKey(balances: WalletBalances, key: WalletAssetKey): WalletBalanceAsset {\n return balances.assets[key];\n}\n\nfunction tokenAddress(asset: WalletBalanceAsset): string {\n return asset.address ?? \"native token\";\n}\n\nfunction displayAmount(asset: WalletBalanceAsset): string {\n if (!asset.ok) {\n return `unavailable${asset.error ? ` (${asset.error})` : \"\"}`;\n }\n const numeric = Number(asset.balance);\n if (asset.address === null && asset.decimals === 18) {\n return Number.isFinite(numeric) ? numeric.toLocaleString(\"en-US\", { maximumFractionDigits: 6 }) : asset.balance;\n }\n return Number.isFinite(numeric) ? out.currency(numeric) : asset.balance;\n}\n\nfunction displayAssetSymbol(asset: WalletBalanceAsset): string {\n return asset.address === null && asset.decimals === 18 ? POLYGON_NATIVE_ASSET_LABEL : asset.symbol;\n}\n\nexport function buildDepositInstructions(\n balances: WalletBalances,\n assetKey?: WalletAssetKey,\n): DepositInstructions {\n const assets = assetKey\n ? [assetByKey(balances, assetKey)]\n : SUPPORTED_ASSETS.map((key) => assetByKey(balances, key));\n\n return {\n action: \"deposit\",\n publicDepositAddress: balances.walletAddress,\n walletAddress: balances.walletAddress,\n chainId: balances.chainId,\n network: NETWORK_NAME,\n asset: assetKey ? assetByKey(balances, assetKey) : null,\n assets,\n warning: \"Send only Polygon assets to this address. Hedge Layer cannot reverse external transfers.\",\n };\n}\n\nexport function buildWithdrawRequestPayload(opts: WithdrawOpts) {\n const assetKey = normalizeWalletAsset(opts.asset) ?? \"pUsd\";\n if (assetKey !== \"pUsd\") {\n throw new InvalidArgumentError(\"Bridge withdrawals currently send pUSD. Use --asset pUSD.\");\n }\n return {\n amount: opts.amount,\n recipientAddress: opts.to,\n toChainId: opts.toChainId ?? \"137\",\n toTokenAddress: opts.toTokenAddress ?? POLYGON_NATIVE_USDC,\n };\n}\n\nfunction displayWalletStatus(status: WalletStatus): void {\n const ownerWallet = status.ownerWallet ?? status.wallet;\n const depositWallet = status.depositWallet ?? status.tradingWallet ?? null;\n\n out.heading(\"Wallet\");\n out.table([\n [\"Owner linked\", status.linked ? \"yes\" : \"no\"],\n [\"Provider\", status.provider],\n [\"Owner wallet\", ownerWallet?.wallet_address ?? \"(none)\"],\n [\"Owner chain\", ownerWallet ? `${NETWORK_NAME} (${ownerWallet.chain_id})` : \"(none)\"],\n [\"Owner linked at\", ownerWallet?.linked_at ? new Date(ownerWallet.linked_at).toLocaleString() : \"(none)\"],\n [\"Deposit wallet\", depositWallet?.wallet_address ?? \"(none)\"],\n [\"Deposit deployed\", status.depositWalletDeployed ? \"yes\" : \"no\"],\n [\"Deposit approved\", status.depositWalletApproved ? \"yes\" : \"no\"],\n [\"Deposit ready\", status.depositWalletReady ? \"yes\" : \"no\"],\n [\"Relayer configured\", status.relayerConfigured ? \"yes\" : \"no\"],\n ]);\n}\n\nfunction displayWalletBalances(balances: WalletBalances): void {\n out.heading(\"Wallet Funds\");\n out.table([\n [\"Wallet\", balances.walletAddress],\n [\"Chain\", `${NETWORK_NAME} (${balances.chainId})`],\n [\"Available pUSD\", displayAmount(balances.available)],\n [\"USDC.e\", displayAmount(balances.assets.usdcE)],\n [displayAssetSymbol(balances.assets.matic), displayAmount(balances.assets.matic)],\n [\"Updated\", new Date(balances.updatedAt).toLocaleString()],\n ]);\n}\n\nfunction displayDepositInstructions(instructions: DepositInstructions): void {\n out.heading(\"Deposit\");\n out.table([\n [\"Public deposit address\", instructions.publicDepositAddress],\n [\"Network\", `${instructions.network} (${instructions.chainId})`],\n ]);\n\n process.stdout.write(\"\\n\");\n out.table(\n instructions.assets.map((asset) => [\n displayAssetSymbol(asset),\n tokenAddress(asset),\n displayAmount(asset),\n ]),\n [\"Asset\", \"Token contract\", \"Current balance\"],\n );\n process.stdout.write(\"\\n\");\n out.warn(instructions.warning);\n}\n\nfunction displayBridgeDeposit(result: WalletDepositResponse): void {\n const bridgeAddresses = result.bridge?.address ?? {};\n const rows = Object.entries(bridgeAddresses)\n .filter(([, value]) => typeof value === \"string\" && value.length > 0)\n .map(([network, value]) => [network.toUpperCase(), value]);\n\n if (rows.length === 0) return;\n process.stdout.write(\"\\n\");\n out.table(rows, [\"Bridge network\", \"Bridge deposit address\"]);\n if (result.bridge?.note) {\n process.stdout.write(\"\\n\" + out.dim(` ${result.bridge.note}\\n`));\n }\n for (const warning of result.bridge?.warnings ?? []) {\n if (warning.message) out.warn(warning.message);\n }\n}\n\nfunction displayWithdrawIntent(intent: WalletWithdrawIntent): void {\n out.heading(\"Withdraw\");\n out.table([\n [\"Intent\", intent.id],\n [\"Status\", intent.status],\n [\"Wallet\", intent.walletAddress],\n [\"Amount\", `${intent.amount} pUSD`],\n [\"Recipient\", intent.recipientAddress],\n [\"Destination\", `chain ${intent.toChainId} · ${intent.toTokenAddress}`],\n [\"Bridge address\", intent.bridgeAddresses.evm ?? \"(none)\"],\n [\"Signing URL\", intent.signingUrl],\n ]);\n const quote = intent.quote ?? {};\n if (quote.estOutputUsd !== undefined || quote.estCheckoutTimeMs !== undefined) {\n process.stdout.write(\"\\n\");\n out.table([\n [\"Estimated output\", quote.estOutputUsd !== undefined ? out.currency(Number(quote.estOutputUsd)) : \"-\"],\n [\"Estimated checkout\", quote.estCheckoutTimeMs !== undefined ? `${Math.round(Number(quote.estCheckoutTimeMs) / 1000)}s` : \"-\"],\n ]);\n }\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args =\n process.platform === \"win32\"\n ? [\"/c\", \"start\", \"\", url]\n : [url];\n const child = spawn(command, args, { detached: true, stdio: \"ignore\" });\n child.unref();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function pollWithdrawalIntent(\n client: ApiClient,\n id: string,\n opts: { timeoutSeconds: number; intervalSeconds: number; jsonMode: boolean },\n): Promise<WalletWithdrawIntent> {\n const started = Date.now();\n let lastStatus = \"\";\n while (Date.now() - started <= opts.timeoutSeconds * 1000) {\n const result = await client.get<WalletWithdrawIntentResponse>(\n `/api/wallet/withdraw/intents/${encodeURIComponent(id)}`,\n );\n const intent = result.intent;\n if (!opts.jsonMode && intent.status !== lastStatus) {\n process.stderr.write(out.dim(` Withdrawal status: ${intent.status}\\n`));\n lastStatus = intent.status;\n }\n if (TERMINAL_WITHDRAWAL_STATUSES.has(intent.status)) return intent;\n await sleep(opts.intervalSeconds * 1000);\n }\n throw new Error(`Timed out waiting for withdrawal intent ${id}`);\n}\n\nexport function registerWalletCommands(program: Command): void {\n const wallet = program\n .command(\"wallet\")\n .description(\"Inspect linked wallet funds and funding instructions\");\n\n wallet\n .command(\"status\")\n .description(\"Show linked owner and Polymarket deposit wallet status\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const status = await client.get<WalletStatus>(\"/api/wallet/status\");\n if (globalOpts.json) {\n out.json(status);\n return;\n }\n displayWalletStatus(status);\n });\n\n wallet\n .command(\"balances\")\n .alias(\"funds\")\n .description(\"Show available wallet funds\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const balances = await client.get<WalletBalances>(\"/api/wallet/balances\");\n if (globalOpts.json) {\n out.json(balances);\n return;\n }\n displayWalletBalances(balances);\n });\n\n wallet\n .command(\"deposit\")\n .description(\"Show deposit address and supported Polygon assets\")\n .option(\"--asset <asset>\", \"pUSD | USDC.e | POL\")\n .option(\"--bridge\", \"Also request Polymarket Bridge deposit addresses\")\n .action(async (opts: DepositOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const asset = normalizeWalletAsset(opts.asset);\n const result = await client.post<WalletDepositResponse>(\"/api/wallet/deposit\", {\n bridge: Boolean(opts.bridge),\n });\n const balances: WalletBalances = {\n walletAddress: result.direct.walletAddress,\n chainId: result.direct.chainId,\n updatedAt: new Date().toISOString(),\n available: result.direct.assets.pUsd,\n assets: result.direct.assets,\n };\n const instructions = buildDepositInstructions(balances, asset);\n if (globalOpts.json) {\n out.json({ ...result, instructions });\n return;\n }\n displayDepositInstructions(instructions);\n displayBridgeDeposit(result);\n });\n\n wallet\n .command(\"withdraw\")\n .description(\"Create a browser-signed withdrawal intent and poll for completion\")\n .requiredOption(\"--to <address>\", \"Recipient EVM wallet address\", parseWalletAddress)\n .requiredOption(\"--amount <amount>\", \"Amount to withdraw\", parsePositiveNumber)\n .option(\"--asset <asset>\", \"Source asset; currently only pUSD is supported\", \"pUSD\")\n .option(\"--to-chain-id <id>\", \"Destination chain id\", \"137\")\n .option(\"--to-token-address <address>\", \"Destination token address\", parseWalletAddress, POLYGON_NATIVE_USDC)\n .option(\"--no-open\", \"Do not open the browser signing URL\")\n .option(\"--no-wait\", \"Do not poll for completion after creating the intent\")\n .option(\"--poll-interval <seconds>\", \"Polling interval in seconds\", parsePositiveNumber, 5)\n .option(\"--timeout <seconds>\", \"Maximum seconds to wait for completion\", parsePositiveNumber, 600)\n .action(async (opts: WithdrawOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const created = await client.post<WalletWithdrawIntentResponse>(\n \"/api/wallet/withdraw/intents\",\n buildWithdrawRequestPayload(opts),\n );\n let intent = created.intent;\n if (opts.open !== false) {\n openBrowser(intent.signingUrl);\n }\n if (opts.wait !== false) {\n intent = await pollWithdrawalIntent(client, intent.id, {\n timeoutSeconds: opts.timeout ?? 600,\n intervalSeconds: opts.pollInterval ?? 5,\n jsonMode: Boolean(globalOpts.json),\n });\n }\n if (globalOpts.json) {\n out.json(intent);\n return;\n } else {\n displayWithdrawIntent(intent);\n }\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displaySignalAnalysis } from \"../signal-display.js\";\nimport type {\n GlobalOptions,\n SignalAnalysisApiResponse,\n SignalAnalysisRequest,\n SignalMarketInput,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface SignalAnalyzeOpts {\n url?: string[];\n market?: string;\n context?: string;\n question?: string;\n description?: string;\n yesProb?: number;\n noProb?: number;\n slug?: string;\n link?: string;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction collect(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function parseProbability(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0 || n > 100) {\n throw new InvalidArgumentError(\"Expected a probability between 0 and 100\");\n }\n return n;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nasync function readMarketPayload(path: string | undefined): Promise<{\n market?: SignalMarketInput;\n markets?: SignalMarketInput[];\n}> {\n if (!path) return {};\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) {\n return { markets: parsed as SignalMarketInput[] };\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as { markets?: unknown }).markets)) {\n return { markets: (parsed as { markets: SignalMarketInput[] }).markets };\n }\n if (parsed && typeof parsed === \"object\" && (parsed as { market?: unknown }).market) {\n return { market: (parsed as { market: SignalMarketInput }).market };\n }\n if (parsed && typeof parsed === \"object\") {\n return { market: parsed as SignalMarketInput };\n }\n throw new Error(\"Market JSON must be an object, an array, or { market | markets }\");\n}\n\nfunction inlineMarketFromOptions(opts: SignalAnalyzeOpts): SignalMarketInput | undefined {\n const market: SignalMarketInput = {};\n if (opts.question) market.question = opts.question;\n if (opts.description) market.description = opts.description;\n if (opts.yesProb !== undefined) market.yesPrice = opts.yesProb;\n if (opts.noProb !== undefined) market.noPrice = opts.noProb;\n if (opts.slug) market.slug = opts.slug;\n if (opts.link) market.link = opts.link;\n return Object.keys(market).length > 0 ? market : undefined;\n}\n\nexport async function buildSignalPayload(\n positionalUrl: string | undefined,\n opts: SignalAnalyzeOpts,\n): Promise<SignalAnalysisRequest> {\n const urls = [positionalUrl, ...(opts.url ?? [])].filter(\n (value): value is string => Boolean(value),\n );\n const filePayload = await readMarketPayload(opts.market);\n const inlineMarket = inlineMarketFromOptions(opts);\n const hasMarketInput = Boolean(filePayload.market || filePayload.markets || inlineMarket);\n\n if (urls.length > 0 && hasMarketInput) {\n throw new Error(\"Use either URL input or market JSON/options, not both.\");\n }\n if (filePayload.market && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (filePayload.markets && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (urls.length === 0 && !hasMarketInput) {\n throw new Error(\"Provide a Polymarket URL or a market payload.\");\n }\n\n const payload: SignalAnalysisRequest =\n urls.length === 1\n ? { url: urls[0] }\n : urls.length > 1\n ? { urls }\n : filePayload.market\n ? { market: filePayload.market }\n : filePayload.markets\n ? { markets: filePayload.markets }\n : { market: inlineMarket };\n\n if (opts.context) {\n payload.previous_analysis_context = opts.context;\n }\n return payload;\n}\n\nasync function runSignalAnalysis(\n client: ApiClient,\n payload: SignalAnalysisRequest,\n): Promise<SignalAnalysisApiResponse> {\n return client.post<SignalAnalysisApiResponse>(\"/api/signal/analyze\", payload);\n}\n\nexport function registerSignalCommands(program: Command): void {\n const signal = program\n .command(\"signal\")\n .description(\"Analyze Polymarket probability gaps with the signal agent\");\n\n signal\n .command(\"analyze\")\n .description(\"Estimate true YES probability and compare it with market pricing\")\n .argument(\"[url]\", \"Polymarket market/event URL to analyze\")\n .option(\"--url <url>\", \"Additional Polymarket URL; repeat for multiple markets\", collect, [])\n .option(\"--market <file>\", \"Inline market JSON object/array; use '-' to read stdin\")\n .option(\"--context <text>\", \"Prior search notes or analysis context for the agent\")\n .option(\"--question <text>\", \"Inline market question when not using a URL\")\n .option(\"--description <text>\", \"Inline market description or resolution criteria\")\n .option(\"--yes-prob <prob>\", \"Current YES probability or price, e.g. 0.52 or 52\", parseProbability)\n .option(\"--no-prob <prob>\", \"Current NO probability or price, e.g. 0.48 or 48\", parseProbability)\n .option(\"--slug <slug>\", \"Inline market slug\")\n .option(\"--link <url>\", \"Inline market link\")\n .action(async (url: string | undefined, o: SignalAnalyzeOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n let payload: SignalAnalysisRequest;\n try {\n payload = await buildSignalPayload(url, o);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n if (!globalOpts.json) {\n process.stderr.write(out.dim(\" Running signal analysis...\\n\"));\n }\n\n const result = await runSignalAnalysis(client, payload);\n displaySignalAnalysis(result, globalOpts);\n });\n}\n","import chalk from \"chalk\";\nimport type {\n GlobalOptions,\n SignalAnalysis,\n SignalAnalysisApiResponse,\n SignalAnalysisItem,\n SignalAnalysisResult,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction pctFromSignalValue(value: number | null | undefined): number | null {\n if (value === null || value === undefined || Number.isNaN(value)) return null;\n return Math.abs(value) <= 1 ? value * 100 : value;\n}\n\nfunction formatProbability(value: number | null | undefined): string {\n const pct = pctFromSignalValue(value);\n return pct === null ? \"n/a\" : `${pct.toFixed(1)}%`;\n}\n\nfunction formatGap(value: number | null | undefined): string {\n if (value === null || value === undefined || Number.isNaN(value)) return \"n/a\";\n const points = Math.abs(value) <= 1 ? value * 100 : value;\n const formatted = `${points >= 0 ? \"+\" : \"\"}${points.toFixed(1)}pp`;\n if (points > 0) return chalk.green(formatted);\n if (points < 0) return chalk.red(formatted);\n return chalk.dim(formatted);\n}\n\nfunction formatStrength(value: string | undefined): string {\n if (value === \"strong\") return chalk.green(\"strong\");\n if (value === \"weak\") return chalk.yellow(\"weak\");\n return value ? chalk.dim(value) : \"n/a\";\n}\n\nfunction analysisItems(result: SignalAnalysisResult | undefined): SignalAnalysisItem[] {\n if (!result) return [];\n if (result.analysis) return [result];\n return result.analyses ?? [];\n}\n\nfunction titleFor(analysis: SignalAnalysis): string {\n return analysis.market_name || analysis.market_slug || \"market\";\n}\n\nexport function displaySignalAnalysis(\n response: SignalAnalysisApiResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(response);\n return;\n }\n\n if (response.error) {\n out.error(response.error);\n return;\n }\n\n const result = response.result;\n if (result?.error) {\n out.error(result.error);\n return;\n }\n\n const items = analysisItems(result);\n if (items.length === 0) {\n out.warn(\"No signal analysis returned.\");\n return;\n }\n\n out.heading(\n items.length === 1\n ? \"Signal Analysis\"\n : `Signal Analysis — ${items.length} markets`,\n );\n\n const rows = items.map((item) => {\n const analysis = item.analysis ?? {};\n return [\n out.truncate(titleFor(analysis), 44),\n formatProbability(analysis.current_yes_prob),\n formatProbability(analysis.predicted_prob),\n formatGap(analysis.probability_gap),\n formatStrength(analysis.signal_strength),\n analysis.confidence ?? \"n/a\",\n ];\n });\n out.table(rows, [\"Market\", \"Market YES\", \"Agent YES\", \"Gap\", \"Signal\", \"Conf\"]);\n\n for (const item of items.slice(0, 3)) {\n const analysis = item.analysis;\n if (!analysis) continue;\n process.stdout.write(\"\\n \" + chalk.bold(out.truncate(titleFor(analysis), 76)) + \"\\n\");\n if (analysis.market_link) {\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + analysis.market_link + \"\\n\");\n }\n if (analysis.key_factors && analysis.key_factors.length > 0) {\n process.stdout.write(\" \" + chalk.dim(\"Key factors: \") + analysis.key_factors.slice(0, 4).join(\"; \") + \"\\n\");\n }\n if (analysis.research_findings) {\n process.stdout.write(\n \" \" + chalk.dim(\"Research: \") + out.truncate(analysis.research_findings, 180) + \"\\n\",\n );\n }\n }\n\n if (items.length > 3) {\n process.stdout.write(chalk.dim(`\\n ... and ${items.length - 3} more\\n`));\n }\n\n if (result?.strong_signal_count !== undefined) {\n process.stdout.write(\n chalk.dim(`\\n Strong signals: ${result.strong_signal_count}\\n`),\n );\n }\n}\n"],"mappings":"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","names":["Command","program","chalk","error","program","chalk","program","requireAuth","readline","chalk","chalk","chalk","program","requireAuth","chalk","readline","requireAuth","warn","program","InvalidArgumentError","chalk","chalk","chalk","num","signedCurrency","chalk","requireAuth","InvalidArgumentError","program","InvalidArgumentError","requireAuth","parsePositiveNumber","InvalidArgumentError","program","InvalidArgumentError","readFile","chalk","chalk","requireAuth","InvalidArgumentError","readStdin","readMarketPayload","readFile","program","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/config.ts","../src/client.ts","../src/output.ts","../src/commands/brief.ts","../src/stream.ts","../src/commands/profile.ts","../src/commands/research.ts","../src/feed-display.ts","../src/commands/feed.ts","../src/commands/lp.ts","../src/allocator-display.ts","../src/commands/allocator.ts","../src/lp-display.ts","../src/commands/wallet.ts","../src/commands/signal.ts","../src/signal-display.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerBriefCommands } from \"./commands/brief.js\";\n\nimport { registerProfileCommand } from \"./commands/profile.js\";\nimport { registerResearchCommands } from \"./commands/research.js\";\nimport { registerFeedCommand } from \"./commands/feed.js\";\nimport { registerLpCommands } from \"./commands/lp.js\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerSignalCommands } from \"./commands/signal.js\";\nimport * as out from \"./output.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"hl\")\n .description(\"Hedge Layer CLI — prediction market intelligence from the terminal\")\n .version(__VERSION__)\n .option(\"--json\", \"Output as JSON (machine-readable)\")\n .option(\"--api-url <url>\", \"Override API base URL\")\n .option(\"--token <token>\", \"Override stored API token\")\n .option(\"--verbose\", \"Show HTTP request details\")\n .option(\"--no-color\", \"Disable colored output\");\n\nregisterAuthCommands(program);\nregisterBriefCommands(program);\n\nregisterProfileCommand(program);\nregisterResearchCommands(program);\nregisterFeedCommand(program);\nregisterWalletCommands(program);\nregisterLpCommands(program);\nregisterSignalCommands(program);\n\nprogram.hook(\"preAction\", (_thisCommand, actionCommand) => {\n const opts = program.opts();\n if (opts.color === false) {\n process.env.FORCE_COLOR = \"0\";\n }\n if (opts.verbose) {\n const cmdName = actionCommand.name();\n process.stderr.write(out.dim(`[verbose] Running: hl ${cmdName}\\n`));\n }\n});\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) {\n out.error(e.message);\n } else {\n out.error(`Unexpected error: ${e instanceof Error ? e.message : String(e)}`);\n if (program.opts().verbose) {\n console.error(e);\n }\n }\n process.exit(1);\n }\n}\n\nmain();\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport { loadConfig, saveConfig, clearConfig, configPath, DEFAULT_API_URL } from \"../config.js\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command(\"auth\").description(\"Manage API authentication\");\n\n auth\n .command(\"login\")\n .description(\"Authenticate with a Hedge Layer API token\")\n .option(\"--api-url <url>\", \"API base URL\", DEFAULT_API_URL)\n .action(async (cmdOpts: { apiUrl?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n try {\n out.heading(\"Hedge Layer CLI — Login\");\n process.stderr.write(\n `Create an API token at ${out.bold(\"https://hedgelayer.ai/account/settings\")} → API Tokens\\n\\n`,\n );\n\n const token = (await rl.question(\"Paste your API token: \")).trim();\n\n if (!token.startsWith(\"hl_\") || token.length !== 43) {\n out.error('Invalid token format. Tokens start with \"hl_\" and are 43 characters.');\n process.exit(1);\n }\n\n const apiUrl = globalOpts.apiUrl ?? cmdOpts.apiUrl ?? DEFAULT_API_URL;\n const client = new ApiClient({ token, apiUrl });\n\n process.stderr.write(\"\\nValidating token...\");\n let profile: UserProfile;\n try {\n profile = await client.get<UserProfile>(\"/api/profile\");\n } catch {\n process.stderr.write(\"\\n\");\n out.error(\"Token validation failed. Check your token and try again.\");\n process.exit(1);\n }\n process.stderr.write(\" done\\n\\n\");\n\n saveConfig({ api_url: apiUrl, token });\n\n out.success(`Logged in as ${out.bold(profile.handle || profile.user_id)}`);\n process.stderr.write(` Config saved to ${out.dim(configPath())}\\n`);\n } finally {\n rl.close();\n }\n });\n\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const config = loadConfig();\n const token = globalOpts.token ?? config.token;\n\n if (!token) {\n out.warn(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" to authenticate.\");\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n\n try {\n const profile = await client.get<UserProfile>(\"/api/profile\");\n if (globalOpts.json) {\n out.json({\n authenticated: true,\n handle: profile.handle,\n user_id: profile.user_id,\n api_url: client.apiUrl,\n });\n } else {\n out.heading(\"Auth Status\");\n out.table(\n [\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"API URL\", client.apiUrl],\n [\"Config\", configPath()],\n ],\n );\n }\n } catch {\n out.error(\"Token is invalid or expired. Run \" + out.bold(\"hl auth login\") + \" to re-authenticate.\");\n process.exit(1);\n }\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored API token\")\n .action(() => {\n clearConfig();\n out.success(\"Logged out. Token removed from \" + out.dim(configPath()));\n });\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CONFIG_DIR = join(homedir(), \".hedgelayer\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport const DEFAULT_API_URL = \"https://hedgelayer.ai\";\n\nexport interface Config {\n api_url: string;\n token: string | null;\n}\n\nfunction defaultConfig(): Config {\n return { api_url: DEFAULT_API_URL, token: null };\n}\n\nexport function loadConfig(): Config {\n try {\n if (!existsSync(CONFIG_FILE)) return defaultConfig();\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw);\n return {\n api_url: parsed.api_url ?? DEFAULT_API_URL,\n token: parsed.token ?? null,\n };\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfig(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function clearConfig(): void {\n try {\n if (existsSync(CONFIG_FILE)) unlinkSync(CONFIG_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function configPath(): string {\n return CONFIG_FILE;\n}\n","import type { GlobalOptions } from \"./types.js\";\nimport { loadConfig, DEFAULT_API_URL } from \"./config.js\";\n\nexport class ApiClient {\n private baseUrl: string;\n private token: string | null;\n private verbose: boolean;\n\n constructor(opts: GlobalOptions = {}) {\n const config = loadConfig();\n this.baseUrl = (opts.apiUrl ?? config.api_url ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.token = opts.token ?? config.token ?? null;\n this.verbose = opts.verbose ?? false;\n }\n\n get isAuthenticated(): boolean {\n return this.token !== null;\n }\n\n get apiUrl(): string {\n return this.baseUrl;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n const h: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n if (this.token) {\n h[\"Authorization\"] = `Bearer ${this.token}`;\n }\n return h;\n }\n\n private log(method: string, path: string, status?: number): void {\n if (!this.verbose) return;\n const statusStr = status ? ` → ${status}` : \"\";\n process.stderr.write(`[verbose] ${method} ${this.baseUrl}${path}${statusStr}\\n`);\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== \"\") url.searchParams.set(k, v);\n }\n }\n\n this.log(\"GET\", `${url.pathname}${url.search}`);\n const res = await fetch(url.toString(), { headers: this.headers() });\n this.log(\"GET\", `${url.pathname}${url.search}`, res.status);\n\n if (!res.ok) {\n const body = await res.text();\n throw new ApiError(res.status, body);\n }\n return res.json() as Promise<T>;\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n this.log(\"POST\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n /**\n * POST /api/brief with stream: false — returns the Market Brief JSON body\n * plus optional telemetry from response headers.\n */\n async postBriefSync(query: string): Promise<{\n brief: Record<string, unknown>;\n durationMs: number | null;\n stepsCompleted: number | null;\n toolsUsed: string[];\n }> {\n const path = \"/api/brief\";\n this.log(\"POST\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({ query, stream: false }),\n });\n this.log(\"POST\", path, res.status);\n\n const text = await res.text();\n if (!res.ok) {\n throw new ApiError(res.status, text);\n }\n\n let brief: Record<string, unknown>;\n try {\n brief = JSON.parse(text) as Record<string, unknown>;\n } catch {\n throw new ApiError(res.status, text || \"Invalid JSON from /api/brief\");\n }\n\n const dur = res.headers.get(\"X-Duration-Ms\");\n const steps = res.headers.get(\"X-Steps-Completed\");\n const tools = res.headers.get(\"X-Tools-Used\");\n\n return {\n brief,\n durationMs: dur != null ? Number(dur) : null,\n stepsCompleted: steps != null ? Number(steps) : null,\n toolsUsed: tools ? tools.split(\",\").filter(Boolean) : [],\n };\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n this.log(\"PATCH\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n this.log(\"PATCH\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n return res.json() as Promise<T>;\n }\n\n async delete(path: string): Promise<void> {\n this.log(\"DELETE\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"DELETE\",\n headers: this.headers(),\n });\n this.log(\"DELETE\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n }\n\n async stream(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (stream)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"text/event-stream\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (stream)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n\n async streamNdjson(path: string, body: unknown): Promise<ReadableStream<Uint8Array>> {\n this.log(\"POST (ndjson)\", path);\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers({ Accept: \"application/x-ndjson\" }),\n body: JSON.stringify(body),\n });\n this.log(\"POST (ndjson)\", path, res.status);\n\n if (!res.ok) {\n const text = await res.text();\n throw new ApiError(res.status, text);\n }\n if (!res.body) {\n throw new ApiError(0, \"No response body for stream\");\n }\n return res.body;\n }\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n let msg: string;\n try {\n const parsed = JSON.parse(body);\n msg = parsed.error ?? parsed.message ?? body;\n } catch {\n msg = body;\n }\n super(`API error ${status}: ${msg}`);\n this.name = \"ApiError\";\n }\n}\n","import chalk from \"chalk\";\n\nexport function json(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, stripAnsi(row[i]).length);\n }\n }\n\n for (let r = 0; r < allRows.length; r++) {\n const row = allRows[r];\n const padded = row.map((cell, i) => {\n const bare = stripAnsi(cell);\n const pad = colWidths[i] - bare.length;\n return cell + \" \".repeat(Math.max(0, pad));\n });\n process.stdout.write(\" \" + padded.join(\" \") + \"\\n\");\n\n if (r === 0 && headers) {\n const sep = colWidths.map((w) => \"─\".repeat(w)).join(\"──\");\n process.stdout.write(\" \" + sep + \"\\n\");\n }\n }\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport function heading(text: string): void {\n process.stdout.write(\"\\n\" + chalk.bold(text) + \"\\n\\n\");\n}\n\nexport function success(text: string): void {\n process.stdout.write(chalk.green(\"✓\") + \" \" + text + \"\\n\");\n}\n\nexport function warn(text: string): void {\n process.stdout.write(chalk.yellow(\"⚠\") + \" \" + text + \"\\n\");\n}\n\nexport function error(text: string): void {\n process.stderr.write(chalk.red(\"✗\") + \" \" + text + \"\\n\");\n}\n\nexport function dim(text: string): string {\n return chalk.dim(text);\n}\n\nexport function bold(text: string): string {\n return chalk.bold(text);\n}\n\nexport function currency(n: number): string {\n return \"$\" + n.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n}\n\nexport function compactCurrency(n: number): string {\n if (!n || isNaN(n)) return \"$0\";\n if (n >= 1_000_000) return `$${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `$${(n / 1_000).toFixed(1)}K`;\n return `$${n.toFixed(0)}`;\n}\n\nexport function percent(n: number): string {\n return (n * 100).toFixed(1) + \"%\";\n}\n\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nexport function relativeTime(date: string): string {\n const diff = Date.now() - new Date(date).getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseNdjsonStream } from \"../stream.js\";\nimport type { MarketBrief, BriefRequest, BriefRequestFilters, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerBriefCommands(program: Command): void {\n program\n .command(\"brief <query>\")\n .description(\"Generate a Market Brief for a topic (non-interactive)\")\n .option(\"-l, --location <location>\", \"Geographic context (e.g. 'Middle East', 'US')\")\n .option(\"-t, --time-horizon <horizon>\", \"Time frame (e.g. '3 months', '2026')\")\n .option(\"--tags <tags>\", \"Comma-separated focus area tags (e.g. 'geopolitics,energy')\")\n .option(\"--min-volume <n>\", \"Minimum market volume in USD\", parseFloat)\n .option(\"--max-yes-price <n>\", \"Maximum YES price (0-1)\", parseFloat)\n .action(async (query: string, cmdOpts: BriefCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const filters = buildFilters(cmdOpts);\n const body: BriefRequest = {\n query,\n ...(cmdOpts.location && { location: cmdOpts.location }),\n ...(cmdOpts.timeHorizon && { timeHorizon: cmdOpts.timeHorizon }),\n ...(filters && { filters }),\n stream: true,\n };\n\n await runStreaming(client, body, globalOpts);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Command option types\n// ---------------------------------------------------------------------------\n\ninterface BriefCmdOpts {\n location?: string;\n timeHorizon?: string;\n tags?: string;\n minVolume?: number;\n maxYesPrice?: number;\n}\n\nfunction buildFilters(opts: BriefCmdOpts): BriefRequestFilters | undefined {\n const tags = opts.tags?.split(\",\").map((t) => t.trim()).filter(Boolean);\n const hasFilters = opts.minVolume != null || opts.maxYesPrice != null || (tags && tags.length > 0);\n if (!hasFilters) return undefined;\n return {\n ...(opts.minVolume != null && { minVolume: opts.minVolume }),\n ...(opts.maxYesPrice != null && { maxYesPrice: opts.maxYesPrice }),\n ...(tags && tags.length > 0 && { tags }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming mode (default)\n// ---------------------------------------------------------------------------\n\nasync function runStreaming(client: ApiClient, body: BriefRequest, globalOpts: GlobalOptions): Promise<void> {\n const startTime = Date.now();\n process.stderr.write(chalk.dim(` Generating brief for \"${out.truncate(body.query, 50)}\"...\\n`));\n\n const stream = await client.streamNdjson(\"/api/brief\", body);\n const result = await parseNdjsonStream(stream, {\n onProgress: (step, message) => {\n process.stderr.write(chalk.dim(` [${step}] `) + message + \"\\n\");\n },\n });\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n\n if (result.error) {\n out.error(`Brief failed (${result.error.code}): ${result.error.message}`);\n process.exit(1);\n }\n\n if (!result.brief) {\n out.error(\"No Market Brief was produced.\");\n process.exit(1);\n }\n\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n displayBrief(result.brief as unknown as MarketBrief, globalOpts);\n}\n\n// ---------------------------------------------------------------------------\n// Display\n// ---------------------------------------------------------------------------\n\nfunction displayBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n const marketCount = brief.marketCount ?? brief.markets.length;\n process.stdout.write(\"\\n \" + chalk.dim(`${marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","/**\n * Parses the Vercel AI SDK UI Message Stream protocol (SSE format).\n *\n * The server sends Server-Sent Events where each `data:` line contains\n * a JSON object with a `type` field:\n * text-delta: { type, id, delta }\n * tool-input-start: { type, toolCallId, toolName }\n * tool-input-delta: { type, toolCallId, inputTextDelta }\n * tool-input-available: { type, toolCallId, toolName, input }\n * tool-output-available:{ type, toolCallId, output }\n * error: { type, errorText }\n * [DONE]: stream termination sentinel\n */\n\nexport interface StreamCallbacks {\n onText?: (text: string) => void;\n onToolCall?: (name: string, args: unknown) => void;\n onToolResult?: (name: string, result: unknown) => void;\n}\n\nexport interface StreamResult {\n assistantText: string;\n toolCalls: Array<{ name: string; args: unknown }>;\n marketBrief: Record<string, unknown> | null;\n feedResult: Record<string, unknown> | null;\n}\n\nexport async function parseStream(\n body: ReadableStream<Uint8Array>,\n callbacks: StreamCallbacks = {},\n): Promise<StreamResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let assistantText = \"\";\n const toolCalls: Array<{ name: string; args: unknown }> = [];\n const activeToolCalls = new Map<string, { name: string; argStr: string }>();\n let marketBrief: Record<string, unknown> | null = null;\n let feedResult: Record<string, unknown> | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\":\")) continue;\n\n if (!trimmed.startsWith(\"data:\")) continue;\n const payload = trimmed.slice(5).trim();\n\n if (payload === \"[DONE]\") continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(payload);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"text-delta\": {\n const delta = msg.delta as string;\n if (delta) {\n assistantText += delta;\n callbacks.onText?.(delta);\n }\n break;\n }\n\n case \"tool-input-start\": {\n const id = msg.toolCallId as string;\n const name = msg.toolName as string;\n if (id && name) {\n activeToolCalls.set(id, { name, argStr: \"\" });\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n active.argStr += msg.inputTextDelta as string;\n }\n break;\n }\n\n case \"tool-input-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n const args = msg.input ?? active.argStr;\n toolCalls.push({ name: active.name, args });\n callbacks.onToolCall?.(active.name, args);\n }\n break;\n }\n\n case \"tool-output-available\": {\n const id = msg.toolCallId as string;\n const active = activeToolCalls.get(id);\n if (active) {\n callbacks.onToolResult?.(active.name, msg.output);\n if (active.name === \"buildMarketBrief\" && isMarketBrief(msg.output)) {\n marketBrief = msg.output as Record<string, unknown>;\n }\n if (active.name === \"getFeed\" && isFeedResult(msg.output)) {\n feedResult = msg.output as Record<string, unknown>;\n }\n activeToolCalls.delete(id);\n }\n break;\n }\n\n case \"error\": {\n throw new Error((msg.errorText as string) ?? \"Unknown stream error\");\n }\n }\n }\n\n if (done) break;\n }\n\n return { assistantText, toolCalls, marketBrief, feedResult };\n}\n\nfunction isMarketBrief(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"title\" in (val as Record<string, unknown>) &&\n \"markets\" in (val as Record<string, unknown>)\n );\n}\n\nfunction isFeedResult(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === \"object\" &&\n \"markets\" in (val as Record<string, unknown>) &&\n \"sortedBy\" in (val as Record<string, unknown>)\n );\n}\n\n// ---------------------------------------------------------------------------\n// NDJSON stream parser (for POST /api/brief)\n// ---------------------------------------------------------------------------\n\nexport interface NdjsonCallbacks {\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface NdjsonBriefResult {\n brief: Record<string, unknown> | null;\n error: { code: string; message: string } | null;\n}\n\n/**\n * Parses an NDJSON stream from the /api/brief endpoint.\n *\n * Each line is a JSON object with a `type` field:\n * progress: { type, step, message }\n * brief: { type, data: MarketBrief }\n * error: { type, code, message }\n */\nexport async function parseNdjsonStream(\n body: ReadableStream<Uint8Array>,\n callbacks: NdjsonCallbacks = {},\n): Promise<NdjsonBriefResult> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n\n let buffer = \"\";\n let brief: Record<string, unknown> | null = null;\n let error: { code: string; message: string } | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (!done) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : (lines.pop() ?? \"\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(trimmed);\n } catch {\n continue;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case \"progress\": {\n callbacks.onProgress?.(msg.step as string, msg.message as string);\n break;\n }\n case \"brief\": {\n brief = msg.data as Record<string, unknown>;\n break;\n }\n case \"error\": {\n error = {\n code: msg.code as string,\n message: msg.message as string,\n };\n break;\n }\n }\n }\n\n if (done) break;\n }\n\n return { brief, error };\n}\n","import { Command } from \"commander\";\nimport { ApiClient } from \"../client.js\";\nimport type { UserProfile, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\nexport function registerProfileCommand(program: Command): void {\n program\n .command(\"profile\")\n .description(\"Show your user profile\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const profile = await client.get<UserProfile>(\"/api/profile\");\n\n if (globalOpts.json) {\n out.json(profile);\n return;\n }\n\n out.heading(\"Profile\");\n out.table([\n [\"Handle\", out.bold(profile.handle || \"(none)\")],\n [\"User ID\", profile.user_id],\n [\"Created\", new Date(profile.created_at).toLocaleDateString()],\n ]);\n });\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport readline from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport { ApiClient } from \"../client.js\";\nimport { parseStream } from \"../stream.js\";\nimport type { Assessment, MarketBrief, FeedResult, GlobalOptions } from \"../types.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport * as out from \"../output.js\";\n\nexport function registerResearchCommands(program: Command): void {\n const research = program.command(\"research\").description(\"AI-powered market research\");\n\n research\n .command(\"start\", { isDefault: true })\n .description(\"Start an interactive market research session\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const { id } = await client.post<{ id: string }>(\"/api/assessments\");\n\n out.heading(\"Market Research\");\n process.stderr.write(\n chalk.dim(\" Describe a topic or thesis to explore. Type /quit to exit.\\n\\n\"),\n );\n\n let msgCounter = 0;\n const uiMsg = (role: string, content: string) => ({\n id: `msg-${++msgCounter}`,\n role,\n content,\n parts: [{ type: \"text\" as const, text: content }],\n });\n\n const messages: ReturnType<typeof uiMsg>[] = [];\n let firstMessageTs: number | null = null;\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n\n try {\n while (true) {\n const userInput = await rl.question(chalk.cyan(\"You: \"));\n if (!userInput.trim()) continue;\n if (userInput.trim() === \"/quit\") break;\n\n if (firstMessageTs === null) firstMessageTs = Date.now();\n messages.push(uiMsg(\"user\", userInput));\n\n process.stderr.write(chalk.dim(\"\\nAssistant: \"));\n\n try {\n const body = await client.stream(\"/api/chat\", {\n messages,\n assessmentId: id,\n });\n\n const result = await parseStream(body, {\n onText: (text) => process.stderr.write(text),\n onToolCall: (name) => {\n process.stderr.write(chalk.dim(`\\n [tool: ${name}]\\n`));\n },\n onToolResult: (name, toolResult) => {\n if (globalOpts.verbose) {\n process.stderr.write(chalk.dim(` [result: ${name}] ${JSON.stringify(toolResult).slice(0, 200)}\\n`));\n }\n },\n });\n\n process.stderr.write(\"\\n\\n\");\n\n if (result.assistantText) {\n messages.push(uiMsg(\"assistant\", result.assistantText));\n }\n\n try {\n await persistAssessment(client, id, messages, result.marketBrief, firstMessageTs);\n } catch (persistErr) {\n out.warn(\n `Could not save session: ${persistErr instanceof Error ? persistErr.message : String(persistErr)}`,\n );\n }\n\n if (result.feedResult) {\n displayFeedResult(result.feedResult as unknown as FeedResult, globalOpts);\n }\n\n if (result.marketBrief) {\n displayMarketBrief(result.marketBrief as unknown as MarketBrief, globalOpts);\n break;\n }\n } catch (e) {\n process.stderr.write(\"\\n\");\n out.error(`Chat error: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n } finally {\n rl.close();\n }\n });\n\n research\n .command(\"run <query>\")\n .description(\"Run research on a topic and return the final Market Brief as JSON (via /api/brief)\")\n .action(async (query: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n process.stderr.write(chalk.dim(` Researching \"${out.truncate(query, 60)}\"...\\n`));\n const startTime = Date.now();\n\n const { brief, durationMs, stepsCompleted, toolsUsed } = await client.postBriefSync(query);\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n process.stderr.write(chalk.dim(` Done (${elapsed}s)\\n\\n`));\n\n const looksLikeBrief =\n brief &&\n typeof brief === \"object\" &&\n Array.isArray((brief as { markets?: unknown }).markets) &&\n typeof (brief as { title?: unknown }).title === \"string\";\n\n if (looksLikeBrief) {\n out.json(brief as unknown as MarketBrief);\n } else {\n process.stderr.write(chalk.yellow(\"No market brief was produced.\\n\"));\n out.json({\n brief: null,\n text: null,\n metadata: {\n model: \"\",\n stepsUsed: stepsCompleted ?? 0,\n toolsUsed,\n durationMs: durationMs ?? Date.now() - startTime,\n },\n raw: brief,\n });\n }\n });\n\n research\n .command(\"list\")\n .description(\"List past research sessions\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .action(async (cmdOpts: { status?: string }) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params: Record<string, string> = { list: \"true\" };\n if (cmdOpts.status) params.status = cmdOpts.status;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", params);\n\n if (globalOpts.json) {\n out.json(data.assessments);\n return;\n }\n\n if (data.assessments.length === 0) {\n out.warn(\"No research sessions found.\");\n return;\n }\n\n out.heading(`Research Sessions (${data.assessments.length})`);\n\n const rows = data.assessments.map((a) => {\n const status = formatStatus(a.status);\n const brief = a.market_brief?.title ?? \"—\";\n const markets = a.market_brief ? String(a.market_brief.marketCount) : \"—\";\n return [a.id.slice(0, 8), status, out.truncate(brief, 30), markets, out.relativeTime(a.created_at)];\n });\n\n out.table(rows, [\"ID\", \"Status\", \"Brief\", \"Markets\", \"Created\"]);\n });\n\n research\n .command(\"show <id>\")\n .description(\"Show research session details (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n const assessment = await client.get<Assessment>(`/api/assessments/${fullId}`);\n\n if (globalOpts.json) {\n out.json(assessment);\n return;\n }\n\n out.heading(\"Research Session \" + out.dim(assessment.id.slice(0, 8)));\n\n out.table([\n [\"Status\", formatStatus(assessment.status)],\n [\"Created\", new Date(assessment.created_at).toLocaleString()],\n [\"Updated\", new Date(assessment.updated_at).toLocaleString()],\n ]);\n\n if (assessment.market_brief) {\n displayMarketBrief(assessment.market_brief, globalOpts);\n }\n });\n\n research\n .command(\"delete <id>\")\n .description(\"Delete a research session (accepts the short ID shown by `hl research list`)\")\n .action(async (id: string) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const fullId = await resolveOrExit(client, id);\n await client.delete(`/api/assessments/${fullId}`);\n out.success(\"Research session deleted.\");\n });\n}\n\n/** Matches a full assessment UUID (e.g. 7f4fdace-a4b2-428d-87f1-fbf715165776). */\nconst FULL_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Resolve a user-supplied session identifier (a full UUID or the short 8-char\n * prefix printed by `hl research list`) against a set of known assessment IDs.\n *\n * Pure and synchronous so it can be unit-tested without network access.\n */\nexport function matchAssessmentId(idOrPrefix: string, ids: string[]): string {\n const needle = idOrPrefix.trim().toLowerCase();\n if (!needle) {\n throw new Error(\"No research session ID provided.\");\n }\n\n // Exact match wins outright (covers full UUIDs present in the list).\n const exact = ids.find((id) => id.toLowerCase() === needle);\n if (exact) return exact;\n\n const matches = ids.filter((id) => id.toLowerCase().startsWith(needle));\n if (matches.length === 1) return matches[0];\n\n if (matches.length === 0) {\n throw new Error(\n `No research session found matching \"${idOrPrefix}\". Run \\`hl research list\\` to see available sessions.`,\n );\n }\n\n const shortIds = matches.map((id) => id.slice(0, 8)).join(\", \");\n throw new Error(\n `\"${idOrPrefix}\" matches ${matches.length} research sessions (${shortIds}). Use a longer ID prefix to disambiguate.`,\n );\n}\n\n/**\n * Turn a full UUID or short ID prefix into the full assessment UUID.\n * Full UUIDs are returned directly (no extra API call); short prefixes are\n * resolved by listing the user's sessions and matching.\n */\nexport async function resolveAssessmentId(client: ApiClient, idOrPrefix: string): Promise<string> {\n const trimmed = idOrPrefix.trim();\n if (FULL_UUID.test(trimmed)) return trimmed;\n\n const data = await client.get<{ assessments: Assessment[] }>(\"/api/assessments\", { list: \"true\" });\n return matchAssessmentId(\n trimmed,\n data.assessments.map((a) => a.id),\n );\n}\n\n/**\n * Resolve a session ID for a CLI action, printing a clean error and exiting on\n * an ambiguous/unknown identifier instead of surfacing it as an unexpected error.\n */\nasync function resolveOrExit(client: ApiClient, idOrPrefix: string): Promise<string> {\n try {\n return await resolveAssessmentId(client, idOrPrefix);\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"API error\")) throw e;\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not logged in. Run \" + out.bold(\"hl auth login\") + \" first.\");\n process.exit(1);\n }\n}\n\n/** Mirrors web ChatInterface assessment PATCH (simplified metadata without tool-part extraction). */\nfunction buildAssessmentPatch(\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Record<string, unknown> {\n const patch: Record<string, unknown> = { messages };\n const meta: Record<string, unknown> = {\n timeToBriefMs: null,\n searchQueries: [],\n searchResultCounts: [],\n coverageHit: false,\n completedAt: null,\n };\n\n if (\n marketBrief &&\n typeof marketBrief === \"object\" &&\n Array.isArray((marketBrief as { markets?: unknown }).markets)\n ) {\n const markets = (marketBrief as { markets: unknown[] }).markets;\n patch.market_brief = marketBrief;\n patch.status = \"completed\";\n meta.timeToBriefMs = firstMessageTs != null ? Date.now() - firstMessageTs : null;\n meta.coverageHit = markets.length > 0;\n meta.completedAt = new Date().toISOString();\n }\n\n patch.metadata = meta;\n return patch;\n}\n\nasync function persistAssessment(\n client: ApiClient,\n assessmentId: string,\n messages: unknown[],\n marketBrief: Record<string, unknown> | null,\n firstMessageTs: number | null,\n): Promise<void> {\n await client.patch(`/api/assessments/${assessmentId}`, buildAssessmentPatch(messages, marketBrief, firstMessageTs));\n}\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"in_progress\":\n return chalk.yellow(status);\n case \"abandoned\":\n return chalk.red(status);\n default:\n return status;\n }\n}\n\nfunction displayMarketBrief(brief: MarketBrief, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(brief);\n return;\n }\n\n out.heading(\"Market Brief\");\n\n process.stdout.write(\" \" + chalk.bold(brief.title) + \"\\n\\n\");\n process.stdout.write(\" \" + chalk.italic(brief.thesis) + \"\\n\");\n\n if (brief.markets.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Markets\") + \"\\n\\n\");\n const rows = brief.markets.map((m) => {\n const prob = out.percent(m.yesPrice);\n const signals = m.signals.length > 0 ? m.signals.join(\", \") : \"—\";\n const liq = m.liquidity ? out.currency(m.liquidity) : \"—\";\n return [out.truncate(m.question, 40), prob, signals, liq];\n });\n out.table(rows, [\"Market\", \"Prob\", \"Signals\", \"Liq\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of brief.markets) {\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 50) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Causal link: \") + m.causalLink + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + m.polymarketUrl + \"\\n\");\n }\n }\n\n if (brief.gaps.length > 0) {\n process.stdout.write(\"\\n\" + chalk.bold(\" Coverage Gaps\") + \"\\n\\n\");\n for (const gap of brief.gaps) {\n process.stdout.write(\" \" + chalk.yellow(\"▸\") + \" \" + gap + \"\\n\");\n }\n }\n\n process.stdout.write(\"\\n \" + chalk.dim(`${brief.marketCount} markets · ${brief.gaps.length} coverage gaps`) + \"\\n\");\n}\n","import chalk from \"chalk\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"./types.js\";\nimport * as out from \"./output.js\";\n\nconst SORT_LABELS: Record<string, string> = {\n score: \"attention score\",\n volume: \"24h volume\",\n liquidity: \"liquidity\",\n movement: \"price movement\",\n spread: \"spread tightness\",\n recency: \"recency\",\n extremity: \"uncertainty\",\n rewards: \"rewards\",\n rewardYield: \"reward yield (per $ liq)\",\n lpExpectedReturn: \"LP expected return\",\n horizon: \"time to resolution\",\n};\n\nfunction scoreBar(score: number): string {\n const width = 15;\n const filled = Math.round((score / 100) * width);\n const empty = width - filled;\n const color = score >= 70 ? chalk.green : score >= 45 ? chalk.yellow : chalk.dim;\n return color(\"█\".repeat(filled)) + chalk.dim(\"░\".repeat(empty)) + ` ${Math.round(score)}`;\n}\n\nexport function displayFeedResult(feed: FeedResult, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(feed);\n return;\n }\n\n const sortLabel = SORT_LABELS[feed.sortedBy] ?? feed.sortedBy;\n out.heading(`Market Feed — ${feed.marketsReturned} markets by ${sortLabel}`);\n process.stdout.write(\n chalk.dim(\n ` ${feed.totalScanned.toLocaleString()} scanned · ${feed.totalAfterFilter.toLocaleString()} after filters · preset ${feed.preset}\\n\\n`,\n ),\n );\n\n if (feed.markets.length === 0) {\n out.warn(\"No markets matched the criteria.\");\n return;\n }\n\n const rows = feed.markets.map((m: FeedResultMarket) => {\n const prob = out.percent(m.yesPrice);\n const change = m.oneDayPriceChange;\n const changeStr =\n change > 0\n ? chalk.green(`+${(change * 100).toFixed(1)}%`)\n : change < 0\n ? chalk.red(`${(change * 100).toFixed(1)}%`)\n : chalk.dim(\"0.0%\");\n return [\n String(m.rank),\n out.truncate(m.question, 42),\n prob,\n String(Math.round(m.score)),\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n changeStr,\n ];\n });\n\n out.table(rows, [\"#\", \"Market\", \"Prob\", \"Score\", \"24h Vol\", \"Liq\", \"Chg\"]);\n\n process.stdout.write(\"\\n\");\n for (const m of feed.markets.slice(0, 5)) {\n const url = m.polymarketUrl;\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(m.question, 55) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Score: \") + scoreBar(m.score) + \" \");\n process.stdout.write(chalk.dim(\"Spread: \") + m.spread.toFixed(3) + \" \");\n if (m.rewardsDailyRate > 0) {\n process.stdout.write(chalk.dim(\"Rewards: \") + `$${m.rewardsDailyRate.toFixed(2)}/day`);\n }\n process.stdout.write(\"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + url + \"\\n\");\n }\n\n if (feed.markets.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${feed.markets.length - 5} more\\n`));\n }\n}\n","import { Command } from \"commander\";\nimport { writeFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displayFeedResult } from \"../feed-display.js\";\nimport type { FeedResult, FeedResultMarket, GlobalOptions } from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface FeedCmdOpts {\n profile?: string;\n sortBy?: string;\n preset?: string;\n tag?: string;\n minVolume?: string;\n minLiquidity?: string;\n maxLiquidity?: string;\n minRewardsDailyRate?: string;\n minDaysToEnd?: string;\n maxDaysToEnd?: string;\n maxMarketAgeHours?: string;\n liquidProfile?: string;\n limit?: string;\n}\n\ninterface FeedEnsembleOpts {\n limit?: string;\n output?: string;\n}\n\nexport interface EnsembleCandidate extends FeedResultMarket {\n ensembleScore: number;\n sourceProfiles: string[];\n sourceRanks: Record<string, number>;\n}\n\nexport interface FeedEnsembleResult {\n generatedAt: string;\n outputPath: string;\n totalSources: number;\n totalRawMarkets: number;\n totalCandidates: number;\n marketsReturned: number;\n candidates: EnsembleCandidate[];\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nconst PROFILE_CHOICES = [\"lp-opportunity\", \"liquidity-provider\", \"liquid-new-or-long\"] as const;\n\nfunction isProfile(s: string | undefined): s is (typeof PROFILE_CHOICES)[number] {\n return s !== undefined && (PROFILE_CHOICES as readonly string[]).includes(s);\n}\n\nexport function resolveFeedProfile(\n screening: string | undefined,\n profile: string | undefined,\n warn: (message: string) => void = () => undefined,\n): string | undefined {\n if (profile && !isProfile(profile)) {\n throw new Error(`Unknown feed profile \"${profile}\". Use: ${PROFILE_CHOICES.join(\" or \")}`);\n }\n\n if (!screening) return profile;\n\n if (!isProfile(screening)) {\n throw new Error(`Unknown screening \"${screening}\". Use: ${PROFILE_CHOICES.join(\" or \")}`);\n }\n\n if (profile && profile !== screening) {\n warn(`Both positional and --profile set; using --profile (${profile}).`);\n return profile;\n }\n\n return profile ?? screening;\n}\n\n/**\n * Build query params for GET /api/feed. Omits undefined / empty string.\n */\nfunction feedQueryParams(opts: {\n profile?: string;\n sortBy?: string;\n preset?: string;\n tag?: string;\n minVolume?: string;\n minLiquidity?: string;\n maxLiquidity?: string;\n minRewardsDailyRate?: string;\n minDaysToEnd?: string;\n maxDaysToEnd?: string;\n maxMarketAgeHours?: string;\n liquidProfile?: string;\n limit?: string;\n}): Record<string, string> {\n const entries: [string, string][] = [];\n const add = (k: string, v: string | undefined) => {\n if (v !== undefined && v !== \"\") entries.push([k, v]);\n };\n add(\"profile\", opts.profile);\n add(\"sortBy\", opts.sortBy);\n add(\"preset\", opts.preset);\n add(\"tag\", opts.tag);\n add(\"minVolume\", opts.minVolume);\n add(\"minLiquidity\", opts.minLiquidity);\n add(\"maxLiquidity\", opts.maxLiquidity);\n add(\"minRewardsDailyRate\", opts.minRewardsDailyRate);\n add(\"minDaysToEnd\", opts.minDaysToEnd);\n add(\"maxDaysToEnd\", opts.maxDaysToEnd);\n add(\"maxMarketAgeHours\", opts.maxMarketAgeHours);\n add(\"liquidProfile\", opts.liquidProfile);\n add(\"limit\", opts.limit);\n return Object.fromEntries(entries);\n}\n\nconst ENSEMBLE_SOURCES: Array<{ name: string; params: Record<string, string> }> = [\n { name: \"liquid-new-or-long\", params: { profile: \"liquid-new-or-long\", sortBy: \"liquidity\" } },\n { name: \"liquidity-provider\", params: { profile: \"liquidity-provider\", sortBy: \"lpExpectedReturn\" } },\n { name: \"lp-opportunity\", params: { profile: \"lp-opportunity\", sortBy: \"rewardYield\" } },\n { name: \"movement\", params: { sortBy: \"movement\", preset: \"price-movers\" } },\n { name: \"spread\", params: { sortBy: \"spread\", preset: \"liquidity-provider\" } },\n { name: \"reward-yield\", params: { sortBy: \"rewardYield\", preset: \"rewards-optimizer\", minRewardsDailyRate: \"0.01\" } },\n];\n\nfunction num(value: number | null | undefined): number {\n return Number.isFinite(value) ? Number(value) : 0;\n}\n\nfunction scoreCandidate(candidate: FeedResultMarket, sourceCount: number): number {\n const liquidityScore = Math.min(25, Math.log1p(Math.max(0, candidate.liquidity)) / Math.log1p(1_000_000) * 25);\n const volumeScore = Math.min(25, Math.log1p(Math.max(0, candidate.volume24h)) / Math.log1p(1_000_000) * 25);\n const spreadScore = Math.max(0, Math.min(15, (0.12 - Math.max(0, candidate.spread)) / 0.12 * 15));\n const movementPenalty = Math.min(20, Math.abs(candidate.oneDayPriceChange) * 100);\n const days = candidate.daysToEnd ?? null;\n const horizonScore = days === null\n ? 2\n : days < 3\n ? 0\n : Math.min(10, Math.log1p(days) / Math.log1p(365) * 10);\n const rewardScore = Math.max(\n 0,\n Math.min(20, num(candidate.components?.rewardYield) * 0.1 + Math.max(0, num(candidate.lpExpectedReturnDailyPct)) * 50),\n );\n const sourceScore = Math.min(16, sourceCount * 4);\n return Math.round((liquidityScore + volumeScore + spreadScore + horizonScore + rewardScore + sourceScore - movementPenalty) * 10) / 10;\n}\n\nexport function buildFeedEnsemble(\n sourceResults: Array<{ source: string; result: FeedResult }>,\n limit: number,\n outputPath = \"candidates.json\",\n generatedAt = new Date().toISOString(),\n): FeedEnsembleResult {\n const bySlug = new Map<string, EnsembleCandidate>();\n let totalRawMarkets = 0;\n\n for (const { source, result } of sourceResults) {\n for (const market of result.markets ?? []) {\n totalRawMarkets++;\n const existing = bySlug.get(market.slug);\n if (!existing) {\n bySlug.set(market.slug, {\n ...market,\n ensembleScore: 0,\n sourceProfiles: [source],\n sourceRanks: { [source]: market.rank },\n });\n continue;\n }\n\n existing.sourceProfiles.push(source);\n existing.sourceRanks[source] = market.rank;\n if (market.score > existing.score) existing.score = market.score;\n existing.volume24h = Math.max(existing.volume24h, market.volume24h);\n existing.liquidity = Math.max(existing.liquidity, market.liquidity);\n existing.rewardsDailyRate = Math.max(existing.rewardsDailyRate, market.rewardsDailyRate);\n existing.lpExpectedReturnDailyPct = Math.max(\n num(existing.lpExpectedReturnDailyPct),\n num(market.lpExpectedReturnDailyPct),\n );\n existing.lpRiskFlags = [...new Set([...(existing.lpRiskFlags ?? []), ...(market.lpRiskFlags ?? [])])];\n }\n }\n\n const candidates = [...bySlug.values()]\n .map((candidate) => ({\n ...candidate,\n sourceProfiles: [...new Set(candidate.sourceProfiles)],\n ensembleScore: scoreCandidate(candidate, new Set(candidate.sourceProfiles).size),\n }))\n .sort((a, b) => b.ensembleScore - a.ensembleScore || b.score - a.score)\n .slice(0, limit);\n\n return {\n generatedAt,\n outputPath,\n totalSources: sourceResults.length,\n totalRawMarkets,\n totalCandidates: bySlug.size,\n marketsReturned: candidates.length,\n candidates,\n };\n}\n\nfunction parseLimit(value: string | undefined, fallback: number): number {\n const parsed = Number.parseInt(value ?? \"\", 10);\n if (!Number.isFinite(parsed)) return fallback;\n return Math.max(1, Math.min(100, parsed));\n}\n\nexport function registerFeedCommand(program: Command): void {\n const feed = program\n .command(\"feed\")\n .description(\n \"Rank active Polymarket markets (same engine as chat getFeed / GET /api/feed). \" +\n \"Use --profile for curated screens.\",\n )\n .argument(\n \"[screening]\",\n `Optional screening preset: ${PROFILE_CHOICES.join(\" | \")} (same as --profile)`,\n )\n .option(\n \"--profile <name>\",\n `Screening defaults: ${PROFILE_CHOICES.join(\", \")} — explicit flags override`,\n )\n .option(\"--sort-by <key>\", \"score | volume | liquidity | movement | spread | recency | extremity | rewards | rewardYield | lpExpectedReturn | horizon\")\n .option(\"--preset <name>\", \"Attention weight preset (default, volume-hunter, lp-opportunity, …)\")\n .option(\"--tag <slug>\", \"Polymarket category tag, e.g. crypto, politics\")\n .option(\"--min-volume <usd>\", \"Minimum 24h volume (USD)\")\n .option(\"--min-liquidity <usd>\", \"Minimum displayed liquidity (USD)\")\n .option(\"--max-liquidity <usd>\", \"Maximum displayed liquidity (USD)\")\n .option(\"--min-rewards-daily-rate <usd>\", \"Minimum LP rewards USD/day\")\n .option(\"--min-days-to-end <n>\", \"Min calendar days until resolution\")\n .option(\"--max-days-to-end <n>\", \"Max calendar days until resolution\")\n .option(\"--max-market-age-hours <n>\", \"With liquid-new-or-long: max age (hours) for the \\\"new\\\" branch\")\n .option(\"--liquid-profile <mode>\", \"new-or-long (used by liquid-new-or-long screen)\")\n .option(\"--limit <n>\", \"Max markets to return (1–100, default 15)\", \"15\");\n\n feed\n .command(\"ensemble\")\n .description(\"Run multiple feed screens, merge by slug, and write ranked candidates JSON\")\n .option(\"--limit <n>\", \"Max candidates to return/write (1-100, default 25)\", \"25\")\n .option(\"--output <file>\", \"Output JSON path\", \"candidates.json\")\n .action(async (o: FeedEnsembleOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const perSourceLimit = \"100\";\n const sourceResults: Array<{ source: string; result: FeedResult }> = [];\n try {\n for (const source of ENSEMBLE_SOURCES) {\n const result = await client.get<FeedResult>(\"/api/feed\", {\n ...source.params,\n limit: perSourceLimit,\n });\n if (result.error) {\n throw new Error(result.error);\n }\n sourceResults.push({ source: source.name, result });\n }\n const outputPath = o.output ?? \"candidates.json\";\n const ensemble = buildFeedEnsemble(sourceResults, parseLimit(o.limit, 25), outputPath);\n await writeFile(outputPath, JSON.stringify(ensemble, null, 2) + \"\\n\", \"utf8\");\n if (globalOpts.json) {\n out.json(ensemble);\n return;\n }\n out.heading(`Feed Ensemble — ${ensemble.marketsReturned} candidates`);\n out.table(\n ensemble.candidates.slice(0, 15).map((m) => [\n String(Math.round(m.ensembleScore)),\n out.truncate(m.question, 48),\n `${Math.round(m.yesPrice * 100)}%`,\n out.compactCurrency(m.volume24h),\n out.compactCurrency(m.liquidity),\n m.sourceProfiles.join(\",\"),\n ]),\n [\"Score\", \"Market\", \"YES\", \"24h Vol\", \"Liq\", \"Sources\"],\n );\n out.success(`Wrote ${outputPath}`);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n\n feed\n .action(async (screening: string | undefined, o: FeedCmdOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n\n let profile: string | undefined;\n try {\n profile = resolveFeedProfile(screening, o.profile, out.warn);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const params = feedQueryParams({\n profile,\n sortBy: o.sortBy,\n preset: o.preset,\n tag: o.tag,\n minVolume: o.minVolume,\n minLiquidity: o.minLiquidity,\n maxLiquidity: o.maxLiquidity,\n minRewardsDailyRate: o.minRewardsDailyRate,\n minDaysToEnd: o.minDaysToEnd,\n maxDaysToEnd: o.maxDaysToEnd,\n maxMarketAgeHours: o.maxMarketAgeHours,\n liquidProfile: o.liquidProfile,\n limit: o.limit,\n });\n\n try {\n const result = await client.get<FeedResult>(\"/api/feed\", params);\n if (result.error) {\n out.error(result.error);\n process.exit(1);\n }\n displayFeedResult(result, globalOpts);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { writeFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport {\n displayAllocatorCycleResult,\n} from \"../allocator-display.js\";\nimport {\n parsePositiveNumber,\n readAllocations,\n readMarketPayload,\n readPnlContext,\n} from \"./allocator.js\";\nimport {\n displayLpEvaluateResult,\n displayLpRecommendResult,\n displayLpScanResult,\n} from \"../lp-display.js\";\nimport type {\n GlobalOptions,\n AllocatorCycleApiResponse,\n AllocatorCycleRequest,\n AllocatorStrategyInput,\n LpEvaluateResponse,\n LpRecommendResponse,\n LpScanResponse,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface LpScanOpts {\n profile?: string;\n sortBy?: string;\n tag?: string;\n minVolume?: number;\n minLiquidity?: number;\n maxLiquidity?: number;\n minRewardsDailyRate?: number;\n minDaysToEnd?: number;\n maxDaysToEnd?: number;\n maxMarketAgeHours?: number;\n liquidProfile?: string;\n limit?: number;\n strategyId?: string;\n output?: string;\n}\n\ninterface LpRecommendOpts {\n strategyId?: string;\n scanId?: string;\n limit?: number;\n syncPnl?: boolean;\n output?: string;\n}\n\ninterface LpEvaluateOpts {\n strategyId?: string;\n walletAddress?: string;\n syncPnl?: boolean;\n limit?: number;\n output?: string;\n}\n\ninterface LpAllocatorOpts {\n markets: string;\n allocations?: string;\n pnl?: string;\n totalHoldings?: number;\n capitalLimitPct?: number;\n perMarketLimitPct?: number;\n capitalLimit: number;\n perMarketLimit: number;\n minExpectedReturnDailyPct: number;\n maxInventoryImbalance: number;\n volatilityFillSpikeThreshold: number;\n eventNoQuoteMinutesBefore: number;\n eventNoQuoteMinutesAfter: number;\n allocatorMinLiquidity: number;\n maxSpread: number;\n allocatorMinDaysToEnd: number;\n maxMarkets: number;\n paused?: boolean;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction parseNonNegative(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0) {\n throw new InvalidArgumentError(\"Expected a non-negative number\");\n }\n return n;\n}\n\nfunction parsePositiveInt(value: string): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) {\n throw new InvalidArgumentError(\"Expected a positive integer\");\n }\n return n;\n}\n\nfunction strategyFromAllocatorOptions(opts: LpAllocatorOpts): AllocatorStrategyInput {\n return {\n id: \"cli-lp-allocator\",\n name: \"CLI LP allocator dry run\",\n status: opts.paused ? \"paused\" : \"dry_run\",\n ...(opts.totalHoldings !== undefined && { total_holdings: opts.totalHoldings }),\n ...(opts.capitalLimitPct !== undefined && { capital_limit_pct: opts.capitalLimitPct }),\n ...(opts.perMarketLimitPct !== undefined && { per_market_limit_pct: opts.perMarketLimitPct }),\n capital_limit: opts.capitalLimit,\n per_market_limit: opts.perMarketLimit,\n min_expected_return_daily_pct: opts.minExpectedReturnDailyPct,\n max_inventory_imbalance: opts.maxInventoryImbalance,\n volatility_fill_spike_threshold: opts.volatilityFillSpikeThreshold,\n event_no_quote_minutes_before: opts.eventNoQuoteMinutesBefore,\n event_no_quote_minutes_after: opts.eventNoQuoteMinutesAfter,\n min_liquidity: opts.allocatorMinLiquidity,\n max_spread: opts.maxSpread,\n min_days_to_end: opts.allocatorMinDaysToEnd,\n max_markets: opts.maxMarkets,\n };\n}\n\nfunction validateAllocatorPercentageSizing(opts: LpAllocatorOpts): void {\n const usesPercentageSizing =\n opts.capitalLimitPct !== undefined || opts.perMarketLimitPct !== undefined;\n if (usesPercentageSizing && opts.totalHoldings === undefined) {\n out.error(\n \"Percentage sizing requires --total-holdings so the allocator can convert percentages into dollar caps.\",\n );\n process.exit(1);\n }\n}\n\nfunction compact<T extends Record<string, unknown>>(payload: T): T {\n return Object.fromEntries(\n Object.entries(payload).filter(([, value]) => value !== undefined && value !== \"\"),\n ) as T;\n}\n\nasync function writeArtifact(path: string | undefined, data: unknown, jsonMode: boolean): Promise<void> {\n if (!path) return;\n await writeFile(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n if (!jsonMode) {\n process.stderr.write(out.dim(` Saved artifact to ${path}\\n`));\n }\n}\n\nexport function buildLpScanPayload(topic: string | undefined, opts: LpScanOpts) {\n return compact({\n topic: topic?.trim() || undefined,\n strategyId: opts.strategyId,\n profile: opts.profile,\n sortBy: opts.sortBy,\n tag: opts.tag,\n minVolume: opts.minVolume,\n minLiquidity: opts.minLiquidity,\n maxLiquidity: opts.maxLiquidity,\n minRewardsDailyRate: opts.minRewardsDailyRate,\n minDaysToEnd: opts.minDaysToEnd,\n maxDaysToEnd: opts.maxDaysToEnd,\n maxMarketAgeHours: opts.maxMarketAgeHours,\n liquidProfile: opts.liquidProfile,\n limit: opts.limit,\n });\n}\n\nexport function buildLpRecommendPayload(opts: LpRecommendOpts) {\n return compact({\n strategyId: opts.strategyId,\n scanId: opts.scanId,\n limit: opts.limit,\n syncPnl: opts.syncPnl,\n });\n}\n\nexport function buildLpEvaluatePayload(opts: LpEvaluateOpts) {\n return compact({\n strategyId: opts.strategyId,\n walletAddress: opts.walletAddress,\n syncPnl: opts.syncPnl,\n limit: opts.limit,\n });\n}\n\nasync function runAllocatorCycle(\n client: ApiClient,\n payload: AllocatorCycleRequest,\n): Promise<AllocatorCycleApiResponse> {\n return client.post<AllocatorCycleApiResponse>(\"/api/lp/allocator\", payload);\n}\n\nexport function registerLpCommands(program: Command): void {\n const lp = program\n .command(\"lp\")\n .description(\"Run persisted liquidity-provider scan, recommendation, and evaluation workflows\");\n\n lp\n .command(\"allocator\")\n .description(\"Run the allocator agent on an explicit market list\")\n .requiredOption(\"--markets <file>\", \"Candidate market JSON array or { markets }; use '-' to read stdin\")\n .option(\"--allocations <file>\", \"Existing allocations JSON array or { allocations }; use '-' to read stdin\")\n .option(\"--pnl <file>\", \"Per-market PnL context JSON array or { pnl_context } (hl-trader pnl --json output); use '-' to read stdin\")\n .option(\"--total-holdings <usd>\", \"Total holdings / portfolio value used for percentage sizing\", parsePositiveNumber)\n .option(\"--capital-limit-pct <pct>\", \"Portfolio-level allocation cap as a percent of total holdings\", parsePositiveNumber)\n .option(\"--per-market-limit-pct <pct>\", \"Per-market target cap as a percent of total holdings\", parsePositiveNumber)\n .option(\"--capital-limit <usd>\", \"Portfolio capital limit for this allocator request\", parseNonNegative, 500)\n .option(\"--per-market-limit <usd>\", \"Per-market target cap\", parseNonNegative, 100)\n .option(\"--min-expected-return-daily-pct <pct>\", \"Minimum expected daily return percent\", parseNonNegative, 0.02)\n .option(\"--max-inventory-imbalance <ratio>\", \"Maximum inventory imbalance\", parseNonNegative, 0.25)\n .option(\"--volatility-fill-spike-threshold <ratio>\", \"Fill-rate imbalance that switches quotes to defensive mode\", parseNonNegative, 0.35)\n .option(\"--event-no-quote-minutes-before <n>\", \"No-quote window before scheduled events\", parseNonNegative, 60)\n .option(\"--event-no-quote-minutes-after <n>\", \"No-quote window after scheduled events\", parseNonNegative, 30)\n .option(\"--allocator-min-liquidity <usd>\", \"Allocator safety gate: minimum market liquidity\", parseNonNegative, 500)\n .option(\"--max-spread <ratio>\", \"Allocator safety gate: maximum spread\", parseNonNegative, 0.12)\n .option(\"--allocator-min-days-to-end <n>\", \"Allocator safety gate: minimum days to resolution\", parseNonNegative, 3)\n .option(\"--max-markets <n>\", \"Maximum markets allocator may target\", parsePositiveInt, 5)\n .option(\"--paused\", \"Send strategy status paused instead of dry_run\")\n .action(async (opts: LpAllocatorOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n validateAllocatorPercentageSizing(opts);\n\n const markets = await readMarketPayload(opts.markets);\n if (!markets || markets.length === 0) {\n out.error(\"Markets JSON must include at least one market.\");\n process.exit(1);\n }\n\n if (opts.allocations === \"-\" && opts.pnl === \"-\") {\n out.error(\"Only one of --allocations and --pnl can read from stdin.\");\n process.exit(1);\n }\n\n const pnlContext = await readPnlContext(opts.pnl);\n const payload: AllocatorCycleRequest = {\n strategy: strategyFromAllocatorOptions(opts),\n markets,\n allocations: await readAllocations(opts.allocations),\n ...(pnlContext.length > 0 && { pnl_context: pnlContext }),\n };\n\n if (!globalOpts.json) {\n process.stderr.write(\n out.dim(` Running allocator dry-run on ${markets.length} provided candidates...\\n`),\n );\n }\n\n const response = await runAllocatorCycle(client, payload);\n if (globalOpts.json) {\n out.json(response);\n } else {\n displayAllocatorCycleResult(response.result ?? {}, globalOpts);\n }\n });\n\n lp\n .command(\"scan\")\n .description(\"Scan LP candidates and persist them as evidence\")\n .argument(\"[topic]\", \"Human label for this scan, e.g. liquidity opportunities\")\n .option(\"--profile <name>\", \"lp-opportunity | liquidity-provider | liquid-new-or-long\", \"liquidity-provider\")\n .option(\"--sort-by <key>\", \"score | volume | liquidity | movement | spread | rewards | rewardYield | lpExpectedReturn | horizon\")\n .option(\"--tag <slug>\", \"Polymarket category tag, e.g. crypto, politics\")\n .option(\"--min-volume <usd>\", \"Minimum 24h volume (USD)\", parseNonNegative)\n .option(\"--min-liquidity <usd>\", \"Minimum displayed liquidity (USD)\", parseNonNegative)\n .option(\"--max-liquidity <usd>\", \"Maximum displayed liquidity (USD)\", parseNonNegative)\n .option(\"--min-rewards-daily-rate <usd>\", \"Minimum LP rewards USD/day\", parseNonNegative)\n .option(\"--min-days-to-end <n>\", \"Minimum days until resolution\", parseNonNegative)\n .option(\"--max-days-to-end <n>\", \"Maximum days until resolution\", parseNonNegative)\n .option(\"--max-market-age-hours <n>\", \"With liquid-new-or-long: max age for the new branch\", parseNonNegative)\n .option(\"--liquid-profile <mode>\", \"new-or-long\")\n .option(\"--limit <n>\", \"Max markets to scan/save (1-100, default 15)\", parsePositiveInt, 15)\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--output <file>\", \"Write the evidence JSON response to a local file\")\n .action(async (topic: string | undefined, opts: LpScanOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpScanResponse>(\n \"/api/lp/scan\",\n buildLpScanPayload(topic, opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpScanResult(result, globalOpts);\n });\n\n lp\n .command(\"recommend\")\n .description(\"Run allocator recommendations from saved LP evidence and current allocations\")\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--scan-id <uuid>\", \"Use candidates from a specific saved scan\")\n .option(\"--limit <n>\", \"Max saved candidates to submit (1-25, default 15)\", parsePositiveInt, 15)\n .option(\"--sync-pnl\", \"Refresh wallet PnL before recommending\")\n .option(\"--output <file>\", \"Write the recommendation JSON response to a local file\")\n .action(async (opts: LpRecommendOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpRecommendResponse>(\n \"/api/lp/recommend\",\n buildLpRecommendPayload(opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpRecommendResult(result, globalOpts);\n });\n\n lp\n .command(\"evaluate\")\n .description(\"Evaluate LP performance and return compact lessons\")\n .option(\"--strategy-id <uuid>\", \"LP strategy id\")\n .option(\"--wallet-address <address>\", \"Wallet address to sync PnL from\")\n .option(\"--no-sync-pnl\", \"Use existing PnL snapshots without refreshing\")\n .option(\"--limit <n>\", \"Max PnL snapshots to evaluate (1-100, default 50)\", parsePositiveInt, 50)\n .option(\"--output <file>\", \"Write the evaluation JSON response to a local file\")\n .action(async (opts: LpEvaluateOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const result = await client.post<LpEvaluateResponse>(\n \"/api/lp/evaluate\",\n buildLpEvaluatePayload(opts),\n );\n await writeArtifact(opts.output, result, Boolean(globalOpts.json));\n displayLpEvaluateResult(result, globalOpts);\n });\n\n}\n","import chalk from \"chalk\";\nimport type {\n AllocatorCycleResult,\n GlobalOptions,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction actionColor(action: string): string {\n switch (action) {\n case \"ALLOCATE\":\n case \"INCREASE\":\n return chalk.green(action);\n case \"REDUCE\":\n case \"EXIT\":\n return chalk.yellow(action);\n case \"SKIP\":\n return chalk.dim(action);\n case \"WATCH\":\n return chalk.cyan(action);\n default:\n return action;\n }\n}\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function displayAllocatorCycleResult(\n result: AllocatorCycleResult,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n const decisions = Array.isArray(result.decisions) ? result.decisions : [];\n const summary = result.summary ?? {};\n const dryRun = result.dry_run === false ? \"live\" : \"dry run\";\n\n out.heading(`Allocator Cycle — ${dryRun}`);\n process.stdout.write(\n chalk.dim(\n ` ${num(result.total_markets, decisions.length)} markets · ${out.currency(\n num(summary.target_capital),\n )} target capital\\n\\n`,\n ),\n );\n\n if (decisions.length === 0) {\n out.warn(\"No allocator decisions returned.\");\n return;\n }\n\n const rows = decisions.map((d) => {\n const action = String(d.action ?? \"UNKNOWN\");\n const score = num(d.score?.score);\n const expected = num(d.score?.expected_return_daily_pct);\n const failedChecks = Array.isArray(d.safety_checks)\n ? d.safety_checks.filter((check) => check.passed === false).length\n : 0;\n return [\n out.truncate(String(d.question ?? d.market_slug ?? \"—\"), 42),\n actionColor(action),\n out.currency(num(d.target_capital)),\n signedCurrency(num(d.capital_delta)),\n `${expected.toFixed(3)}%`,\n regimeLabel(String(d.quote_regime ?? \"—\")),\n String(Math.round(score)),\n failedChecks === 0 ? chalk.green(\"0\") : chalk.yellow(String(failedChecks)),\n ];\n });\n\n out.table(rows, [\n \"Market\",\n \"Action\",\n \"Target\",\n \"Delta\",\n \"Exp/day\",\n \"Regime\",\n \"Score\",\n \"Fails\",\n ]);\n\n process.stdout.write(\"\\n\");\n for (const decision of decisions.slice(0, 5)) {\n const action = String(decision.action ?? \"UNKNOWN\");\n process.stdout.write(\" \" + chalk.dim(\"▸ \") + out.truncate(String(decision.question ?? decision.market_slug ?? \"—\"), 65) + \"\\n\");\n process.stdout.write(\" \" + chalk.dim(\"Action: \") + actionColor(action));\n if (decision.rationale) {\n process.stdout.write(\" \" + chalk.dim(\"Rationale: \") + out.truncate(decision.rationale, 120));\n }\n process.stdout.write(\"\\n\");\n\n const economics = decision.economics ?? {};\n if (\n economics.realized_spread_pnl !== undefined ||\n economics.reward_income !== undefined ||\n economics.net_realized_pnl !== undefined\n ) {\n process.stdout.write(\n \" \" +\n chalk.dim(\"Economics: \") +\n `spread ${signedCurrency(num(economics.realized_spread_pnl))}, ` +\n `rewards ${signedCurrency(num(economics.reward_income))}, ` +\n `net ${signedCurrency(num(economics.net_realized_pnl))}` +\n \"\\n\",\n );\n }\n }\n\n if (decisions.length > 5) {\n process.stdout.write(chalk.dim(`\\n … and ${decisions.length - 5} more decisions\\n`));\n }\n}\n\nfunction regimeLabel(value: string): string {\n switch (value) {\n case \"reward_optimized\":\n return chalk.green(\"reward\");\n case \"defensive\":\n return chalk.yellow(\"defense\");\n case \"no_quote\":\n return chalk.red(\"no quote\");\n default:\n return chalk.dim(value);\n }\n}\n\nfunction signedCurrency(value: number): string {\n const formatted = out.currency(Math.abs(value));\n if (value > 0) return chalk.green(`+${formatted}`);\n if (value < 0) return chalk.yellow(`-${formatted}`);\n return chalk.dim(\"$0.00\");\n}\n","import { InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport type {\n AllocatorAllocationInput,\n AllocatorMarketInput,\n AllocatorPnlInput,\n} from \"../types.js\";\n\nexport function parsePositiveNumber(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return n;\n}\n\nexport function parseAllocationsInput(parsed: unknown): AllocatorAllocationInput[] {\n const rows = extractArray<AllocatorAllocationInput>(parsed, \"allocations\");\n if (!rows) {\n throw new Error(\"Allocations JSON must be an array or { allocations: [...] }\");\n }\n return rows;\n}\n\nexport function parsePnlContextInput(parsed: unknown): AllocatorPnlInput[] {\n const rows = extractArray<AllocatorPnlInput>(parsed, \"pnl_context\");\n if (!rows) {\n throw new Error(\"PnL JSON must be an array or { pnl_context: [...] }\");\n }\n return rows;\n}\n\nexport async function readAllocations(path: string | undefined): Promise<AllocatorAllocationInput[]> {\n if (!path) return [];\n return parseAllocationsInput(await readJsonInput(path));\n}\n\nexport async function readPnlContext(path: string | undefined): Promise<AllocatorPnlInput[]> {\n if (!path) return [];\n return parsePnlContextInput(await readJsonInput(path));\n}\n\nexport async function readMarketPayload(path: string | undefined): Promise<AllocatorMarketInput[] | undefined> {\n if (!path) return undefined;\n const parsed = await readJsonInput(path);\n const rows = extractArray<AllocatorMarketInput>(parsed, \"markets\");\n if (!rows) {\n throw new Error(\"Markets JSON must be an array or { markets: [...] }\");\n }\n return rows;\n}\n\nfunction extractArray<T>(parsed: unknown, key: string): T[] | undefined {\n if (Array.isArray(parsed)) {\n return parsed as T[];\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as Record<string, unknown>)[key])) {\n return (parsed as Record<string, unknown>)[key] as T[];\n }\n return undefined;\n}\n\nasync function readJsonInput(path: string): Promise<unknown> {\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n return JSON.parse(raw) as unknown;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n","import chalk from \"chalk\";\nimport { displayAllocatorCycleResult } from \"./allocator-display.js\";\nimport type {\n GlobalOptions,\n LpEvaluateResponse,\n LpRecommendResponse,\n LpScanResponse,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction signedCurrency(value: number): string {\n const formatted = out.currency(Math.abs(value));\n if (value > 0) return chalk.green(`+${formatted}`);\n if (value < 0) return chalk.yellow(`-${formatted}`);\n return chalk.dim(\"$0.00\");\n}\n\nfunction actionSummary(actions: Record<string, unknown> | undefined): string {\n if (!actions) return \"none\";\n return Object.entries(actions)\n .filter(([, count]) => num(count) > 0)\n .map(([action, count]) => `${action}:${num(count)}`)\n .join(\" \");\n}\n\nexport function displayLpScanResult(result: LpScanResponse, globalOpts: GlobalOptions): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Scan\");\n process.stdout.write(\n chalk.dim(\n ` scan ${result.scanId} · strategy ${result.strategyId} · ${result.evidenceSaved} evidence rows saved\\n`,\n ),\n );\n process.stdout.write(\n chalk.dim(\n ` ${result.totalScanned.toLocaleString()} scanned · ${result.totalAfterFilter.toLocaleString()} after filters · profile ${result.profile}\\n\\n`,\n ),\n );\n\n if (result.markets.length === 0) {\n out.warn(\"No markets matched the LP scan.\");\n return;\n }\n\n out.table(\n result.markets.slice(0, 10).map((market) => [\n String(market.rank),\n out.truncate(market.question, 46),\n String(Math.round(num(market.score))),\n out.compactCurrency(num(market.liquidity)),\n out.compactCurrency(num(market.rewardsDailyRate)) + \"/day\",\n `${num(market.lpExpectedReturnDailyPct).toFixed(3)}%`,\n ]),\n [\"#\", \"Market\", \"Score\", \"Liq\", \"Rewards\", \"Exp/day\"],\n );\n}\n\nexport function displayLpRecommendResult(\n result: LpRecommendResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Recommendations\");\n process.stdout.write(\n chalk.dim(\n ` cycle ${result.cycleId} · strategy ${result.strategyId} · ${result.candidatesSubmitted} markets · ${result.allocationsSubmitted} current allocations\\n`,\n ),\n );\n process.stdout.write(\n chalk.dim(\n ` PnL context ${result.pnlContextCount} rows${result.pnlSynced ? \" · synced\" : \"\"} · approvals required\\n\\n`,\n ),\n );\n displayAllocatorCycleResult(result.result ?? { decisions: result.decisions }, globalOpts);\n}\n\nexport function displayLpEvaluateResult(\n result: LpEvaluateResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(result);\n return;\n }\n\n out.heading(\"LP Evaluation\");\n process.stdout.write(\n chalk.dim(\n ` strategy ${result.strategyId} · ${result.summary.snapshots} snapshots · ${result.summary.markets} markets`,\n ),\n );\n if (result.pnlSynced) process.stdout.write(chalk.dim(\" · synced\"));\n process.stdout.write(\"\\n\\n\");\n if (result.syncError) out.warn(result.syncError);\n\n out.table(\n [\n [\"Realized PnL\", signedCurrency(result.summary.realizedPnl)],\n [\"Unrealized PnL\", signedCurrency(result.summary.unrealizedPnl)],\n [\"Net PnL\", signedCurrency(result.summary.netPnl)],\n [\"Capital locked\", out.currency(result.summary.capitalLocked)],\n [\"Current value\", out.currency(result.summary.currentValue)],\n [\"Outcomes\", actionSummary(result.summary.outcomes)],\n ],\n );\n\n if (result.lessons.length === 0) {\n out.warn(\"No PnL lessons available yet.\");\n return;\n }\n\n process.stdout.write(\"\\n\");\n out.table(\n result.lessons.slice(0, 8).map((lesson) => [\n out.truncate(String(lesson.market_slug ?? \"portfolio\"), 26),\n String(lesson.outcome ?? \"flat\"),\n signedCurrency(num(lesson.net_pnl)),\n out.truncate(String(lesson.lesson ?? \"no lesson\"), 64),\n ]),\n [\"Market\", \"Outcome\", \"Net\", \"Lesson\"],\n );\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { spawn } from \"node:child_process\";\nimport { ApiClient } from \"../client.js\";\nimport type {\n GlobalOptions,\n WalletAssetKey,\n WalletBalanceAsset,\n WalletBalances,\n WalletDepositResponse,\n WalletStatus,\n WalletWithdrawIntent,\n WalletWithdrawIntentResponse,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\nconst NETWORK_NAME = \"Polygon\";\nconst POLYGON_NATIVE_USDC = \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\";\nconst SUPPORTED_ASSETS: WalletAssetKey[] = [\"pUsd\", \"usdcE\", \"matic\"];\nconst POLYGON_NATIVE_ASSET_LABEL = \"POL\";\nconst TERMINAL_WITHDRAWAL_STATUSES = new Set([\"succeeded\", \"failed\", \"cancelled\", \"expired\"]);\n\ninterface DepositInstructions {\n action: \"deposit\";\n publicDepositAddress: string;\n walletAddress: string;\n chainId: number;\n network: string;\n asset: WalletBalanceAsset | null;\n assets: WalletBalanceAsset[];\n warning: string;\n}\n\ninterface DepositOpts {\n asset?: string;\n bridge?: boolean;\n}\n\ninterface WithdrawOpts {\n asset?: string;\n amount: number;\n to: string;\n toChainId?: string;\n toTokenAddress?: string;\n open?: boolean;\n wait?: boolean;\n pollInterval?: number;\n timeout?: number;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction parsePositiveNumber(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new InvalidArgumentError(\"Expected a positive number\");\n }\n return n;\n}\n\nfunction parseWalletAddress(value: string): string {\n const trimmed = value.trim();\n if (!/^0x[a-fA-F0-9]{40}$/.test(trimmed)) {\n throw new InvalidArgumentError(\"Expected a valid EVM wallet address\");\n }\n return trimmed;\n}\n\nexport function normalizeWalletAsset(value: string | undefined): WalletAssetKey | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase().replace(/[._\\s-]/g, \"\");\n if ([\"pusd\", \"polymarketusd\"].includes(normalized)) return \"pUsd\";\n if ([\"usdce\", \"usdcebridged\", \"bridgedusdc\", \"usdc\"].includes(normalized)) return \"usdcE\";\n if ([\"matic\", \"pol\"].includes(normalized)) return \"matic\";\n throw new InvalidArgumentError(\"Unknown wallet asset. Use pUSD, USDC.e, or POL.\");\n}\n\nfunction assetByKey(balances: WalletBalances, key: WalletAssetKey): WalletBalanceAsset {\n return balances.assets[key];\n}\n\nfunction tokenAddress(asset: WalletBalanceAsset): string {\n return asset.address ?? \"native token\";\n}\n\nfunction displayAmount(asset: WalletBalanceAsset): string {\n if (!asset.ok) {\n return `unavailable${asset.error ? ` (${asset.error})` : \"\"}`;\n }\n const numeric = Number(asset.balance);\n if (asset.address === null && asset.decimals === 18) {\n return Number.isFinite(numeric) ? numeric.toLocaleString(\"en-US\", { maximumFractionDigits: 6 }) : asset.balance;\n }\n return Number.isFinite(numeric) ? out.currency(numeric) : asset.balance;\n}\n\nfunction displayAssetSymbol(asset: WalletBalanceAsset): string {\n return asset.address === null && asset.decimals === 18 ? POLYGON_NATIVE_ASSET_LABEL : asset.symbol;\n}\n\nexport function buildDepositInstructions(\n balances: WalletBalances,\n assetKey?: WalletAssetKey,\n): DepositInstructions {\n const assets = assetKey\n ? [assetByKey(balances, assetKey)]\n : SUPPORTED_ASSETS.map((key) => assetByKey(balances, key));\n\n return {\n action: \"deposit\",\n publicDepositAddress: balances.walletAddress,\n walletAddress: balances.walletAddress,\n chainId: balances.chainId,\n network: NETWORK_NAME,\n asset: assetKey ? assetByKey(balances, assetKey) : null,\n assets,\n warning: \"Send only Polygon assets to this address. Hedge Layer cannot reverse external transfers.\",\n };\n}\n\nexport function buildWithdrawRequestPayload(opts: WithdrawOpts) {\n const assetKey = normalizeWalletAsset(opts.asset) ?? \"pUsd\";\n if (assetKey !== \"pUsd\") {\n throw new InvalidArgumentError(\"Bridge withdrawals currently send pUSD. Use --asset pUSD.\");\n }\n return {\n amount: opts.amount,\n recipientAddress: opts.to,\n toChainId: opts.toChainId ?? \"137\",\n toTokenAddress: opts.toTokenAddress ?? POLYGON_NATIVE_USDC,\n };\n}\n\nfunction displayWalletStatus(status: WalletStatus): void {\n const ownerWallet = status.ownerWallet ?? status.wallet;\n const depositWallet = status.depositWallet ?? status.tradingWallet ?? null;\n\n out.heading(\"Wallet\");\n out.table([\n [\"Owner linked\", status.linked ? \"yes\" : \"no\"],\n [\"Provider\", status.provider],\n [\"Owner wallet\", ownerWallet?.wallet_address ?? \"(none)\"],\n [\"Owner chain\", ownerWallet ? `${NETWORK_NAME} (${ownerWallet.chain_id})` : \"(none)\"],\n [\"Owner linked at\", ownerWallet?.linked_at ? new Date(ownerWallet.linked_at).toLocaleString() : \"(none)\"],\n [\"Deposit wallet\", depositWallet?.wallet_address ?? \"(none)\"],\n [\"Deposit deployed\", status.depositWalletDeployed ? \"yes\" : \"no\"],\n [\"Deposit approved\", status.depositWalletApproved ? \"yes\" : \"no\"],\n [\"Deposit ready\", status.depositWalletReady ? \"yes\" : \"no\"],\n [\"Relayer configured\", status.relayerConfigured ? \"yes\" : \"no\"],\n ]);\n}\n\nfunction displayWalletBalances(balances: WalletBalances): void {\n out.heading(\"Wallet Funds\");\n out.table([\n [\"Wallet\", balances.walletAddress],\n [\"Chain\", `${NETWORK_NAME} (${balances.chainId})`],\n [\"Available pUSD\", displayAmount(balances.available)],\n [\"USDC.e\", displayAmount(balances.assets.usdcE)],\n [displayAssetSymbol(balances.assets.matic), displayAmount(balances.assets.matic)],\n [\"Updated\", new Date(balances.updatedAt).toLocaleString()],\n ]);\n}\n\nfunction displayDepositInstructions(instructions: DepositInstructions): void {\n out.heading(\"Deposit\");\n out.table([\n [\"Public deposit address\", instructions.publicDepositAddress],\n [\"Network\", `${instructions.network} (${instructions.chainId})`],\n ]);\n\n process.stdout.write(\"\\n\");\n out.table(\n instructions.assets.map((asset) => [\n displayAssetSymbol(asset),\n tokenAddress(asset),\n displayAmount(asset),\n ]),\n [\"Asset\", \"Token contract\", \"Current balance\"],\n );\n process.stdout.write(\"\\n\");\n out.warn(instructions.warning);\n}\n\nfunction displayBridgeDeposit(result: WalletDepositResponse): void {\n const bridgeAddresses = result.bridge?.address ?? {};\n const rows = Object.entries(bridgeAddresses)\n .filter(([, value]) => typeof value === \"string\" && value.length > 0)\n .map(([network, value]) => [network.toUpperCase(), value]);\n\n if (rows.length === 0) return;\n process.stdout.write(\"\\n\");\n out.table(rows, [\"Bridge network\", \"Bridge deposit address\"]);\n if (result.bridge?.note) {\n process.stdout.write(\"\\n\" + out.dim(` ${result.bridge.note}\\n`));\n }\n for (const warning of result.bridge?.warnings ?? []) {\n if (warning.message) out.warn(warning.message);\n }\n}\n\nfunction displayWithdrawIntent(intent: WalletWithdrawIntent): void {\n out.heading(\"Withdraw\");\n out.table([\n [\"Intent\", intent.id],\n [\"Status\", intent.status],\n [\"Wallet\", intent.walletAddress],\n [\"Amount\", `${intent.amount} pUSD`],\n [\"Recipient\", intent.recipientAddress],\n [\"Destination\", `chain ${intent.toChainId} · ${intent.toTokenAddress}`],\n [\"Bridge address\", intent.bridgeAddresses.evm ?? \"(none)\"],\n [\"Signing URL\", intent.signingUrl],\n ]);\n const quote = intent.quote ?? {};\n if (quote.estOutputUsd !== undefined || quote.estCheckoutTimeMs !== undefined) {\n process.stdout.write(\"\\n\");\n out.table([\n [\"Estimated output\", quote.estOutputUsd !== undefined ? out.currency(Number(quote.estOutputUsd)) : \"-\"],\n [\"Estimated checkout\", quote.estCheckoutTimeMs !== undefined ? `${Math.round(Number(quote.estCheckoutTimeMs) / 1000)}s` : \"-\"],\n ]);\n }\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args =\n process.platform === \"win32\"\n ? [\"/c\", \"start\", \"\", url]\n : [url];\n const child = spawn(command, args, { detached: true, stdio: \"ignore\" });\n child.unref();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function pollWithdrawalIntent(\n client: ApiClient,\n id: string,\n opts: { timeoutSeconds: number; intervalSeconds: number; jsonMode: boolean },\n): Promise<WalletWithdrawIntent> {\n const started = Date.now();\n let lastStatus = \"\";\n while (Date.now() - started <= opts.timeoutSeconds * 1000) {\n const result = await client.get<WalletWithdrawIntentResponse>(\n `/api/wallet/withdraw/intents/${encodeURIComponent(id)}`,\n );\n const intent = result.intent;\n if (!opts.jsonMode && intent.status !== lastStatus) {\n process.stderr.write(out.dim(` Withdrawal status: ${intent.status}\\n`));\n lastStatus = intent.status;\n }\n if (TERMINAL_WITHDRAWAL_STATUSES.has(intent.status)) return intent;\n await sleep(opts.intervalSeconds * 1000);\n }\n throw new Error(`Timed out waiting for withdrawal intent ${id}`);\n}\n\nexport function registerWalletCommands(program: Command): void {\n const wallet = program\n .command(\"wallet\")\n .description(\"Inspect linked wallet funds and funding instructions\");\n\n wallet\n .command(\"status\")\n .description(\"Show linked owner and Polymarket deposit wallet status\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const status = await client.get<WalletStatus>(\"/api/wallet/status\");\n if (globalOpts.json) {\n out.json(status);\n return;\n }\n displayWalletStatus(status);\n });\n\n wallet\n .command(\"balances\")\n .alias(\"funds\")\n .description(\"Show available wallet funds\")\n .action(async () => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const balances = await client.get<WalletBalances>(\"/api/wallet/balances\");\n if (globalOpts.json) {\n out.json(balances);\n return;\n }\n displayWalletBalances(balances);\n });\n\n wallet\n .command(\"deposit\")\n .description(\"Show deposit address and supported Polygon assets\")\n .option(\"--asset <asset>\", \"pUSD | USDC.e | POL\")\n .option(\"--bridge\", \"Also request Polymarket Bridge deposit addresses\")\n .action(async (opts: DepositOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const asset = normalizeWalletAsset(opts.asset);\n const result = await client.post<WalletDepositResponse>(\"/api/wallet/deposit\", {\n bridge: Boolean(opts.bridge),\n });\n const balances: WalletBalances = {\n walletAddress: result.direct.walletAddress,\n chainId: result.direct.chainId,\n updatedAt: new Date().toISOString(),\n available: result.direct.assets.pUsd,\n assets: result.direct.assets,\n };\n const instructions = buildDepositInstructions(balances, asset);\n if (globalOpts.json) {\n out.json({ ...result, instructions });\n return;\n }\n displayDepositInstructions(instructions);\n displayBridgeDeposit(result);\n });\n\n wallet\n .command(\"withdraw\")\n .description(\"Create a browser-signed withdrawal intent and poll for completion\")\n .requiredOption(\"--to <address>\", \"Recipient EVM wallet address\", parseWalletAddress)\n .requiredOption(\"--amount <amount>\", \"Amount to withdraw\", parsePositiveNumber)\n .option(\"--asset <asset>\", \"Source asset; currently only pUSD is supported\", \"pUSD\")\n .option(\"--to-chain-id <id>\", \"Destination chain id\", \"137\")\n .option(\"--to-token-address <address>\", \"Destination token address\", parseWalletAddress, POLYGON_NATIVE_USDC)\n .option(\"--no-open\", \"Do not open the browser signing URL\")\n .option(\"--no-wait\", \"Do not poll for completion after creating the intent\")\n .option(\"--poll-interval <seconds>\", \"Polling interval in seconds\", parsePositiveNumber, 5)\n .option(\"--timeout <seconds>\", \"Maximum seconds to wait for completion\", parsePositiveNumber, 600)\n .action(async (opts: WithdrawOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n const created = await client.post<WalletWithdrawIntentResponse>(\n \"/api/wallet/withdraw/intents\",\n buildWithdrawRequestPayload(opts),\n );\n let intent = created.intent;\n if (opts.open !== false) {\n openBrowser(intent.signingUrl);\n }\n if (opts.wait !== false) {\n intent = await pollWithdrawalIntent(client, intent.id, {\n timeoutSeconds: opts.timeout ?? 600,\n intervalSeconds: opts.pollInterval ?? 5,\n jsonMode: Boolean(globalOpts.json),\n });\n }\n if (globalOpts.json) {\n out.json(intent);\n return;\n } else {\n displayWithdrawIntent(intent);\n }\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { ApiClient } from \"../client.js\";\nimport { displaySignalAnalysis } from \"../signal-display.js\";\nimport type {\n GlobalOptions,\n SignalAnalysisApiResponse,\n SignalAnalysisRequest,\n SignalMarketInput,\n} from \"../types.js\";\nimport * as out from \"../output.js\";\n\ninterface SignalAnalyzeOpts {\n url?: string[];\n market?: string;\n context?: string;\n question?: string;\n description?: string;\n yesProb?: number;\n noProb?: number;\n slug?: string;\n link?: string;\n}\n\nfunction requireAuth(client: ApiClient): void {\n if (!client.isAuthenticated) {\n out.error(\"Not authenticated. Run `hl auth login` first.\");\n process.exit(1);\n }\n}\n\nfunction collect(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function parseProbability(value: string): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 0 || n > 100) {\n throw new InvalidArgumentError(\"Expected a probability between 0 and 100\");\n }\n return n;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nasync function readMarketPayload(path: string | undefined): Promise<{\n market?: SignalMarketInput;\n markets?: SignalMarketInput[];\n}> {\n if (!path) return {};\n const raw = path === \"-\" ? await readStdin() : await readFile(path, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) {\n return { markets: parsed as SignalMarketInput[] };\n }\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as { markets?: unknown }).markets)) {\n return { markets: (parsed as { markets: SignalMarketInput[] }).markets };\n }\n if (parsed && typeof parsed === \"object\" && (parsed as { market?: unknown }).market) {\n return { market: (parsed as { market: SignalMarketInput }).market };\n }\n if (parsed && typeof parsed === \"object\") {\n return { market: parsed as SignalMarketInput };\n }\n throw new Error(\"Market JSON must be an object, an array, or { market | markets }\");\n}\n\nfunction inlineMarketFromOptions(opts: SignalAnalyzeOpts): SignalMarketInput | undefined {\n const market: SignalMarketInput = {};\n if (opts.question) market.question = opts.question;\n if (opts.description) market.description = opts.description;\n if (opts.yesProb !== undefined) market.yesPrice = opts.yesProb;\n if (opts.noProb !== undefined) market.noPrice = opts.noProb;\n if (opts.slug) market.slug = opts.slug;\n if (opts.link) market.link = opts.link;\n return Object.keys(market).length > 0 ? market : undefined;\n}\n\nexport async function buildSignalPayload(\n positionalUrl: string | undefined,\n opts: SignalAnalyzeOpts,\n): Promise<SignalAnalysisRequest> {\n const urls = [positionalUrl, ...(opts.url ?? [])].filter(\n (value): value is string => Boolean(value),\n );\n const filePayload = await readMarketPayload(opts.market);\n const inlineMarket = inlineMarketFromOptions(opts);\n const hasMarketInput = Boolean(filePayload.market || filePayload.markets || inlineMarket);\n\n if (urls.length > 0 && hasMarketInput) {\n throw new Error(\"Use either URL input or market JSON/options, not both.\");\n }\n if (filePayload.market && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (filePayload.markets && inlineMarket) {\n throw new Error(\"Use either --market or inline market options, not both.\");\n }\n if (urls.length === 0 && !hasMarketInput) {\n throw new Error(\"Provide a Polymarket URL or a market payload.\");\n }\n\n const payload: SignalAnalysisRequest =\n urls.length === 1\n ? { url: urls[0] }\n : urls.length > 1\n ? { urls }\n : filePayload.market\n ? { market: filePayload.market }\n : filePayload.markets\n ? { markets: filePayload.markets }\n : { market: inlineMarket };\n\n if (opts.context) {\n payload.previous_analysis_context = opts.context;\n }\n return payload;\n}\n\nasync function runSignalAnalysis(\n client: ApiClient,\n payload: SignalAnalysisRequest,\n): Promise<SignalAnalysisApiResponse> {\n return client.post<SignalAnalysisApiResponse>(\"/api/signal/analyze\", payload);\n}\n\nexport function registerSignalCommands(program: Command): void {\n const signal = program\n .command(\"signal\")\n .description(\"Analyze Polymarket probability gaps with the signal agent\");\n\n signal\n .command(\"analyze\")\n .description(\"Estimate true YES probability and compare it with market pricing\")\n .argument(\"[url]\", \"Polymarket market/event URL to analyze\")\n .option(\"--url <url>\", \"Additional Polymarket URL; repeat for multiple markets\", collect, [])\n .option(\"--market <file>\", \"Inline market JSON object/array; use '-' to read stdin\")\n .option(\"--context <text>\", \"Prior search notes or analysis context for the agent\")\n .option(\"--question <text>\", \"Inline market question when not using a URL\")\n .option(\"--description <text>\", \"Inline market description or resolution criteria\")\n .option(\"--yes-prob <prob>\", \"Current YES probability or price, e.g. 0.52 or 52\", parseProbability)\n .option(\"--no-prob <prob>\", \"Current NO probability or price, e.g. 0.48 or 48\", parseProbability)\n .option(\"--slug <slug>\", \"Inline market slug\")\n .option(\"--link <url>\", \"Inline market link\")\n .action(async (url: string | undefined, o: SignalAnalyzeOpts) => {\n const globalOpts = program.opts<GlobalOptions>();\n const client = new ApiClient(globalOpts);\n requireAuth(client);\n\n let payload: SignalAnalysisRequest;\n try {\n payload = await buildSignalPayload(url, o);\n } catch (e) {\n out.error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n if (!globalOpts.json) {\n process.stderr.write(out.dim(\" Running signal analysis...\\n\"));\n }\n\n const result = await runSignalAnalysis(client, payload);\n displaySignalAnalysis(result, globalOpts);\n });\n}\n","import chalk from \"chalk\";\nimport type {\n GlobalOptions,\n SignalAnalysis,\n SignalAnalysisApiResponse,\n SignalAnalysisItem,\n SignalAnalysisResult,\n} from \"./types.js\";\nimport * as out from \"./output.js\";\n\nfunction pctFromSignalValue(value: number | null | undefined): number | null {\n if (value === null || value === undefined || Number.isNaN(value)) return null;\n return Math.abs(value) <= 1 ? value * 100 : value;\n}\n\nfunction formatProbability(value: number | null | undefined): string {\n const pct = pctFromSignalValue(value);\n return pct === null ? \"n/a\" : `${pct.toFixed(1)}%`;\n}\n\nfunction formatGap(value: number | null | undefined): string {\n if (value === null || value === undefined || Number.isNaN(value)) return \"n/a\";\n const points = Math.abs(value) <= 1 ? value * 100 : value;\n const formatted = `${points >= 0 ? \"+\" : \"\"}${points.toFixed(1)}pp`;\n if (points > 0) return chalk.green(formatted);\n if (points < 0) return chalk.red(formatted);\n return chalk.dim(formatted);\n}\n\nfunction formatStrength(value: string | undefined): string {\n if (value === \"strong\") return chalk.green(\"strong\");\n if (value === \"weak\") return chalk.yellow(\"weak\");\n return value ? chalk.dim(value) : \"n/a\";\n}\n\nfunction analysisItems(result: SignalAnalysisResult | undefined): SignalAnalysisItem[] {\n if (!result) return [];\n if (result.analysis) return [result];\n return result.analyses ?? [];\n}\n\nfunction titleFor(analysis: SignalAnalysis): string {\n return analysis.market_name || analysis.market_slug || \"market\";\n}\n\nexport function displaySignalAnalysis(\n response: SignalAnalysisApiResponse,\n globalOpts: GlobalOptions,\n): void {\n if (globalOpts.json) {\n out.json(response);\n return;\n }\n\n if (response.error) {\n out.error(response.error);\n return;\n }\n\n const result = response.result;\n if (result?.error) {\n out.error(result.error);\n return;\n }\n\n const items = analysisItems(result);\n if (items.length === 0) {\n out.warn(\"No signal analysis returned.\");\n return;\n }\n\n out.heading(\n items.length === 1\n ? \"Signal Analysis\"\n : `Signal Analysis — ${items.length} markets`,\n );\n\n const rows = items.map((item) => {\n const analysis = item.analysis ?? {};\n return [\n out.truncate(titleFor(analysis), 44),\n formatProbability(analysis.current_yes_prob),\n formatProbability(analysis.predicted_prob),\n formatGap(analysis.probability_gap),\n formatStrength(analysis.signal_strength),\n analysis.confidence ?? \"n/a\",\n ];\n });\n out.table(rows, [\"Market\", \"Market YES\", \"Agent YES\", \"Gap\", \"Signal\", \"Conf\"]);\n\n for (const item of items.slice(0, 3)) {\n const analysis = item.analysis;\n if (!analysis) continue;\n process.stdout.write(\"\\n \" + chalk.bold(out.truncate(titleFor(analysis), 76)) + \"\\n\");\n if (analysis.market_link) {\n process.stdout.write(\" \" + chalk.dim(\"Polymarket: \") + analysis.market_link + \"\\n\");\n }\n if (analysis.key_factors && analysis.key_factors.length > 0) {\n process.stdout.write(\" \" + chalk.dim(\"Key factors: \") + analysis.key_factors.slice(0, 4).join(\"; \") + \"\\n\");\n }\n if (analysis.research_findings) {\n process.stdout.write(\n \" \" + chalk.dim(\"Research: \") + out.truncate(analysis.research_findings, 180) + \"\\n\",\n );\n }\n }\n\n if (items.length > 3) {\n process.stdout.write(chalk.dim(`\\n ... and ${items.length - 3} more\\n`));\n }\n\n if (result?.strong_signal_count !== undefined) {\n process.stdout.write(\n chalk.dim(`\\n Strong signals: ${result.strong_signal_count}\\n`),\n );\n }\n}\n"],"mappings":"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","names":["Command","program","chalk","error","program","chalk","program","requireAuth","readline","chalk","chalk","chalk","program","requireAuth","chalk","readline","requireAuth","warn","program","InvalidArgumentError","writeFile","chalk","chalk","num","chalk","num","signedCurrency","chalk","requireAuth","InvalidArgumentError","writeFile","program","InvalidArgumentError","requireAuth","parsePositiveNumber","InvalidArgumentError","program","InvalidArgumentError","readFile","chalk","chalk","requireAuth","InvalidArgumentError","readStdin","readMarketPayload","readFile","program","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hedge-layer/cli",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "CLI for Hedge Layer — prediction market intelligence from the terminal",
5
5
  "type": "module",
6
6
  "bin": {