1#[derive(Parser, Debug)]
2#[command(name = "market-search", version, about = "Market Search: MCP server for finance data + a terminal coding agent")]
3struct Cli {
4 #[command(subcommand)]
5 cmd: Option<Command>,
6
7 #[arg(long, global = true)]
9 provider: Option<String>,
10
11 #[arg(long, global = true)]
13 model: Option<String>,
14}
15
16#[derive(Subcommand, Debug)]
17enum Command {
18 Setup,
20
21 Init,
23
24 Config {
26 #[arg(long)]
28 set: Option<String>,
29
30 #[arg(long)]
32 value: Option<String>,
33 },
34
35 #[command(hide = true)]
37 ToolInfo {
38 #[arg(value_name = "PATH", num_args = 0..)]
40 path: Vec<String>,
41 },
42
43 Finance {
45 #[command(subcommand)]
46 cmd: FinanceCommand,
47 },
48
49 Web {
51 #[command(subcommand)]
52 cmd: WebCommand,
53 },
54
55 Mcp(McpArgs),
57
58 Picks {
60 #[command(subcommand)]
61 cmd: PicksCommand,
62 },
63}
64
65#[derive(Subcommand, Debug)]
66enum PicksCommand {
67 Log(PicksLogArgs),
69}
70
71#[derive(clap::Args, Debug)]
72struct PicksLogArgs {
73 #[arg(long)]
75 report: String,
76
77 #[arg(long, value_delimiter = ',')]
79 ticker: Vec<String>,
80
81 #[arg(long, value_delimiter = ',')]
83 market: Vec<String>,
84}
85
86#[derive(clap::Args, Debug)]
87struct McpArgs {
88 #[command(subcommand)]
89 cmd: Option<McpSubcommand>,
90
91 #[arg(long, default_value_t = false)]
93 http: bool,
94
95 #[arg(long, default_value = "8484")]
97 port: u16,
98}
99
100#[derive(Subcommand, Debug)]
101enum McpSubcommand {
102 Share(ShareArgs),
104}
105
106#[derive(clap::Args, Debug)]
107struct ShareArgs {
108 #[arg(long, default_value = "tunnelmole")]
110 provider: String,
111
112 #[arg(long, default_value = "8484")]
114 port: u16,
115
116 #[arg(long)]
118 domain: Option<String>,
119
120 #[arg(long)]
122 authtoken: Option<String>,
123}
124
125#[derive(clap::Args, Debug)]
126struct ServeArgs {
127 #[arg(long, default_value = "3333")]
129 port: u16,
130
131 #[arg(long, default_value = "~/Downloads/eli-code/eli_research/reports/html")]
133 reports_dir: String,
134
135 #[arg(long)]
137 sentinel_dir: Option<PathBuf>,
138
139 #[arg(long, default_value_t = false)]
141 open: bool,
142}
143
144#[derive(Subcommand, Debug)]
145enum FinanceCommand {
146 Timeseries(FinanceTimeseriesArgs),
148 Fundamentals(FinanceFundamentalsArgs),
150 Search(FinanceSearchArgs),
152 Filings(FinanceFilingsArgs),
154 Sec(FinanceFilingsArgs),
156 Schedule(FinanceScheduleArgs),
158 RatePath(FinanceRatePathArgs),
160 Odds(FinanceOddsArgs),
162 Options(FinanceOptionsArgs),
164 Sync(FinanceSyncArgs),
166 Paper(FinancePaperArgs),
168 Ibkr(FinanceIbkrArgs),
170 Auctions(FinanceAuctionsArgs),
172 Cot(FinanceCotArgs),
174 Curve(FinanceCurveArgs),
176 Nyfed(FinanceNyfedArgs),
178 #[command(name = "volatility", visible_alias = "volsurface")]
180 Volsurface(FinanceVolsurfaceArgs),
181 Stress(FinanceStressArgs),
183 Fiscal(FinanceFiscalArgs),
185 Ecb(FinanceEcbArgs),
187 Eia(FinanceEiaArgs),
189 Bis(FinanceBisArgs),
191 Boj(FinanceBojArgs),
193 Boe(FinanceBoeArgs),
195}
196
197#[derive(Subcommand, Debug)]
198enum WebCommand {
199 Crawl(WebCrawlArgs),
201 Search(WebSearchArgs),
203 Read(WebReadArgs),
205 Extract(WebExtractArgs),
207}
208
209#[derive(Subcommand, Debug)]
210enum AgentCommand {
211 Report(AgentReportArgs),
213 Run(AgentRunArgs),
215 Fanout(AgentFanoutArgs),
217 Swarm(AgentSwarmArgs),
219 Critique(AgentModeArgs),
221 Evidence(AgentModeArgs),
223 Compete(AgentModeArgs),
225 Debate(AgentModeArgs),
227}
228
229#[derive(Subcommand, Debug)]
230enum SentinelCommand {
231 Start(SentinelStartArgs),
233 Stop(SentinelStopArgs),
235 Status(SentinelStatusArgs),
237 Subscribe(SentinelSubscribeArgs),
239 Unsubscribe(SentinelUnsubscribeArgs),
241 List(SentinelListArgs),
243 Test(SentinelTestArgs),
245 Replay(SentinelReplayArgs),
247 #[command(hide = true)]
249 DaemonRun(SentinelDaemonRunArgs),
250}
251
252#[derive(Debug, Serialize)]
253struct RustFileSummary {
254 items_total: usize,
255 functions: usize,
256 function_names: Vec<String>,
257 function_signatures: Vec<String>,
260 structs: usize,
261 struct_names: Vec<String>,
262 struct_fields: std::collections::BTreeMap<String, Vec<String>>,
264 enums: usize,
265 enum_names: Vec<String>,
266 impls: usize,
267 impl_targets: Vec<String>,
268 impl_methods: std::collections::BTreeMap<String, Vec<String>>,
270 traits: usize,
271 trait_names: Vec<String>,
272 modules: usize,
273 module_names: Vec<String>,
274 uses: usize,
275 use_paths: Vec<String>,
276 consts: usize,
277 const_names: Vec<String>,
278 statics: usize,
279 type_aliases: usize,
280 type_alias_names: Vec<String>,
281 macros: usize,
282 others: usize,
283}
284
285#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
286enum CrawlViewMode {
287 Summary,
288 Raw,
289 Path,
290}
291
292#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
293enum CrawlSaveMode {
294 Auto,
295 Off,
296}
297
298#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
299enum WebSearchModeArg {
300 Auto,
301 News,
302 Finance,
303 Research,
304 Tech,
305 Encyclopedia,
306}
307
308#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
309enum WebSearchRecencyArg {
310 Day,
311 Week,
312 Month,
313 Year,
314}
315
316#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
317enum FinancePaperCommandArg {
318 Trade,
319 Positions,
320 Trades,
321 Mark,
322 Reset,
323}
324
325#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
326enum FinancePaperModeArg {
327 Simulated,
328 #[value(alias = "live_like")]
329 LiveLike,
330 #[value(alias = "kalshi_demo")]
331 KalshiDemo,
332 #[value(alias = "polymarket_demo")]
333 PolymarketDemo,
334}
335
336#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
337enum FinancePaperSideArg {
338 Yes,
339 No,
340}
341
342#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
343enum FinancePaperOrderActionArg {
344 Buy,
345 Sell,
346}
347
348#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
349enum FinanceIbkrCommandArg {
350 Snapshot,
351 Timeseries,
352 AccountSummary,
353 Positions,
354 Portfolio,
355 OpenOrders,
356 PlaceOrder,
357 CancelOrder,
358}
359
360#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
361enum SentinelSeverityArg {
362 Low,
363 Medium,
364 High,
365 Critical,
366}
367
368#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
369enum SentinelSpawnTargetArg {
370 Default,
371 Codex,
372 Claude,
373 Gemini,
374 Both,
375}
376
377#[derive(clap::Args, Debug)]
378struct SentinelPathArgs {
379 #[arg(long = "sentinel-dir")]
381 sentinel_dir: Option<PathBuf>,
382
383 #[arg(long = "queue-file")]
385 queue_file: Option<PathBuf>,
386
387 #[arg(long = "packets-file")]
389 packets_file: Option<PathBuf>,
390}
391
392#[derive(clap::Args, Debug)]
393struct SentinelStartArgs {
394 #[command(flatten)]
395 paths: SentinelPathArgs,
396
397 #[arg(long = "interval-secs", default_value_t = 15)]
399 interval_secs: u64,
400}
401
402#[derive(clap::Args, Debug)]
403struct SentinelStopArgs {
404 #[command(flatten)]
405 paths: SentinelPathArgs,
406}
407
408#[derive(clap::Args, Debug)]
409struct SentinelStatusArgs {
410 #[command(flatten)]
411 paths: SentinelPathArgs,
412}
413
414#[derive(clap::Args, Debug)]
415struct SentinelSubscribeArgs {
416 #[command(flatten)]
417 paths: SentinelPathArgs,
418
419 #[arg(long)]
421 name: String,
422
423 #[arg(long)]
426 title: Option<String>,
427
428 #[arg(long = "source-report")]
430 source_report_title: Option<String>,
431
432 #[arg(long = "source-date")]
434 source_report_date: Option<String>,
435
436 #[arg(long = "source-file")]
438 source_report_file: Option<String>,
439
440 #[arg(long = "source-evidence")]
442 source_evidence: Option<String>,
443
444 #[arg(long)]
447 expr: Option<String>,
448
449 #[arg(long = "var")]
451 vars: Vec<String>,
452
453 #[arg(long = "why")]
455 why: Option<String>,
456
457 #[arg(long = "prompt-template")]
459 prompt_template: Option<String>,
460
461 #[arg(long, value_enum, default_value = "medium")]
463 severity: SentinelSeverityArg,
464
465 #[arg(long = "cooldown-secs", default_value_t = 300)]
467 cooldown_secs: u64,
468
469 #[arg(long, default_value_t = true)]
471 enabled: bool,
472
473 #[arg(long = "spawn-agent", default_value_t = false)]
475 spawn_agent: bool,
476
477 #[arg(long = "spawn-target", value_enum, default_value = "default")]
479 spawn_target: SentinelSpawnTargetArg,
480
481 #[arg(long = "spawn-cooldown-secs", default_value_t = 14400, hide = true)]
484 spawn_cooldown_secs: u64,
485
486 #[arg(long = "prediction")]
489 prediction: Option<String>,
490
491 #[arg(long = "target-var")]
493 target_var: Option<String>,
494
495 #[arg(long = "target-value")]
497 target_value: Option<f64>,
498
499 #[arg(long = "deadline")]
502 deadline: Option<String>,
503
504 #[arg(long = "fire-at")]
508 fire_at: Option<String>,
509}
510
511#[derive(clap::Args, Debug)]
512struct SentinelUnsubscribeArgs {
513 #[command(flatten)]
514 paths: SentinelPathArgs,
515
516 #[arg(long = "id")]
518 id_or_name: String,
519}
520
521#[derive(clap::Args, Debug)]
522struct SentinelListArgs {
523 #[command(flatten)]
524 paths: SentinelPathArgs,
525}
526
527#[derive(clap::Args, Debug)]
528struct SentinelTestArgs {
529 #[command(flatten)]
530 paths: SentinelPathArgs,
531
532 #[arg(long, default_value = "generic")]
534 scenario: String,
535}
536
537#[derive(clap::Args, Debug)]
538struct SentinelReplayArgs {
539 #[command(flatten)]
540 paths: SentinelPathArgs,
541
542 #[arg(long = "max-lines", default_value_t = 50)]
544 max_lines: usize,
545}
546
547#[derive(clap::Args, Debug)]
548struct SentinelDaemonRunArgs {
549 #[command(flatten)]
550 paths: SentinelPathArgs,
551
552 #[arg(long = "interval-secs", default_value_t = 15)]
554 interval_secs: u64,
555}
556
557#[derive(clap::Args, Debug)]
558struct AgentReportArgs {
559 #[arg(long)]
561 prompt: Option<String>,
562
563 #[arg(
565 long,
566 value_delimiter = ',',
567 default_value = "SPY,QQQ,IWM,DIA,^VIX,BTC-USD,ETH-USD,SOL-USD,DX-Y.NYB,GC=F,CL=F"
568 )]
569 tickers: Vec<String>,
570
571 #[arg(long, default_value = "14d")]
573 lookback: String,
574
575 #[arg(long, default_value = "1h")]
577 granularity: String,
578
579 #[arg(long = "lock-minutes", conflicts_with = "as_of")]
581 lock_minutes: Option<u64>,
582
583 #[arg(long = "as-of", conflicts_with = "lock_minutes")]
585 as_of: Option<String>,
586
587 #[arg(
589 long,
590 value_delimiter = ',',
591 default_value = "recession,fed,inflation,iran,oil,china,taiwan"
592 )]
593 odds_queries: Vec<String>,
594
595 #[arg(long, default_value_t = 8)]
597 top: usize,
598
599 #[arg(
601 long,
602 value_delimiter = ',',
603 default_value = "stock market today,treasury yields today,fed policy outlook,oil geopolitical risk"
604 )]
605 web_queries: Vec<String>,
606
607 #[arg(long = "max-ms", default_value_t = 45000)]
609 max_ms: u64,
610
611 #[arg(long = "fallback-models", value_delimiter = ',')]
613 fallback_models: Vec<String>,
614
615 #[arg(long = "html-out")]
617 html_out: Option<PathBuf>,
618
619 #[arg(long)]
621 out: Option<PathBuf>,
622}
623
624#[derive(clap::Args, Debug)]
625struct AgentRunArgs {
626 #[arg(long)]
628 task: String,
629
630 #[arg(long)]
632 out: Option<PathBuf>,
633
634 #[arg(long = "fallback-models", value_delimiter = ',')]
636 fallback_models: Vec<String>,
637
638 #[arg(long = "max-ms", default_value_t = 45000)]
640 max_ms: u64,
641
642 #[arg(long = "max-attempts", default_value_t = 4)]
644 max_attempts: usize,
645
646 #[arg(long = "must-cite", value_delimiter = ',')]
648 must_cite: Vec<String>,
649}
650
651#[derive(clap::Args, Debug)]
652struct AgentFanoutArgs {
653 #[arg(long = "task-template")]
655 task_template: String,
656
657 #[arg(long)]
659 vars: PathBuf,
660
661 #[arg(long = "shared-manifest")]
663 shared_manifest: Option<PathBuf>,
664
665 #[arg(long, default_value = "4")]
667 max_parallel: usize,
668
669 #[arg(long)]
671 out: Option<PathBuf>,
672
673 #[arg(long = "fallback-models", value_delimiter = ',')]
675 fallback_models: Vec<String>,
676
677 #[arg(long = "max-ms", default_value_t = 45000)]
679 max_ms: u64,
680
681 #[arg(long = "max-attempts", default_value_t = 4)]
683 max_attempts: usize,
684
685 #[arg(long = "must-cite", value_delimiter = ',')]
687 must_cite: Vec<String>,
688}
689
690#[derive(clap::Args, Debug)]
691struct AgentSwarmArgs {
692 #[arg(long)]
694 task: String,
695
696 #[arg(long)]
698 input: PathBuf,
699
700 #[arg(long)]
702 chunks: Option<usize>,
703
704 #[arg(long = "chunk-chars", default_value_t = 20_000)]
706 chunk_chars: usize,
707
708 #[arg(long = "overlap-chars", default_value_t = 500)]
710 overlap_chars: usize,
711
712 #[arg(long = "max-chunks", default_value_t = 64)]
714 max_chunks: usize,
715
716 #[arg(long, default_value = "4")]
718 max_parallel: usize,
719
720 #[arg(long)]
722 out: Option<PathBuf>,
723
724 #[arg(long = "fallback-models", value_delimiter = ',')]
726 fallback_models: Vec<String>,
727
728 #[arg(long = "max-ms", default_value_t = 120_000)]
730 max_ms: u64,
731
732 #[arg(long = "max-attempts", default_value_t = 4)]
734 max_attempts: usize,
735
736 #[arg(long = "must-cite", value_delimiter = ',')]
738 must_cite: Vec<String>,
739}
740
741#[derive(clap::Args, Debug)]
742struct AgentModeArgs {
743 #[arg(long)]
745 prompt: String,
746
747 #[arg(long)]
749 lead: Option<PathBuf>,
750
751 #[arg(long)]
753 vars: PathBuf,
754
755 #[arg(long = "shared-manifest")]
757 shared_manifest: Option<PathBuf>,
758
759 #[arg(long, default_value_t = false)]
761 allow_cheat: bool,
762
763 #[arg(long, default_value = "4")]
765 max_parallel: usize,
766
767 #[arg(long)]
769 out: Option<PathBuf>,
770
771 #[arg(long = "fallback-models", value_delimiter = ',')]
773 fallback_models: Vec<String>,
774
775 #[arg(long = "max-ms", default_value_t = 120_000)]
777 max_ms: u64,
778
779 #[arg(long = "max-attempts", default_value_t = 2)]
781 max_attempts: usize,
782
783 #[arg(long = "must-cite", value_delimiter = ',')]
785 must_cite: Vec<String>,
786}
787
788#[derive(clap::Args, Debug)]
789struct CodeArgs {
790 path: PathBuf,
792
793 #[arg(long, default_value_t = false)]
795 generate: bool,
796
797 #[arg(long, default_value_t = 0)]
799 min_loc: usize,
800
801 #[arg(long)]
803 max_files: Option<usize>,
804
805 #[arg(long)]
807 workers: Option<usize>,
808
809 #[arg(long, default_value_t = 20)]
811 top: usize,
812
813 #[arg(long, default_value_t = false)]
815 include_files: bool,
816
817 #[arg(long, value_delimiter = ',')]
821 find: Vec<String>,
822
823 #[arg(long, default_value_t = false)]
828 pub_api: bool,
829
830 #[arg(long)]
832 out: Option<PathBuf>,
833}
834
835#[derive(clap::Args, Debug)]
836struct WebCrawlArgs {
837 #[arg(long)]
839 url: String,
840
841 #[arg(long, default_value = "50")]
843 max_pages: usize,
844
845 #[arg(long, default_value = "true")]
847 respect_robots: bool,
848
849 #[arg(long, default_value = "false")]
851 subdomains: bool,
852
853 #[arg(long, default_value = "false")]
855 sitemap: bool,
856
857 #[arg(long, default_value = "false", conflicts_with = "sitemap")]
859 smart: bool,
860
861 #[arg(long, value_enum, default_value_t = CrawlViewMode::Summary)]
863 view: CrawlViewMode,
864
865 #[arg(long, value_enum, default_value_t = CrawlSaveMode::Auto)]
867 save: CrawlSaveMode,
868
869 #[arg(long)]
871 out: Option<PathBuf>,
872}
873
874#[derive(clap::Args, Debug)]
875struct WebSearchArgs {
876 #[arg(long)]
878 query: String,
879
880 #[arg(long, value_enum, default_value_t = WebSearchModeArg::Auto)]
882 mode: WebSearchModeArg,
883
884 #[arg(long, value_delimiter = ',')]
886 domains: Vec<String>,
887
888 #[arg(long = "exclude-domains", value_delimiter = ',')]
890 exclude_domains: Vec<String>,
891
892 #[arg(long, value_enum)]
894 recency: Option<WebSearchRecencyArg>,
895
896 #[arg(long)]
898 since: Option<String>,
899
900 #[arg(long)]
902 until: Option<String>,
903
904 #[arg(long, default_value_t = 15)]
906 top: usize,
907
908 #[arg(long = "probe-top", default_value_t = 4)]
910 probe_top: usize,
911
912 #[arg(long = "max-parallel", default_value_t = 6)]
914 max_parallel: usize,
915
916 #[arg(long = "track-key")]
918 track_key: Option<String>,
919
920 #[arg(long, default_value_t = false)]
922 full: bool,
923
924 #[arg(long)]
926 out: Option<PathBuf>,
927}
928
929#[derive(clap::Args, Debug)]
930struct WebReadArgs {
931 #[arg(long = "url", value_delimiter = ',')]
933 url: Vec<String>,
934
935 #[arg(long = "urls-file")]
937 urls_file: Option<PathBuf>,
938
939 #[arg(long = "max-parallel", default_value_t = 6)]
941 max_parallel: usize,
942
943 #[arg(long = "max-chars", default_value_t = 2400)]
945 max_chars: usize,
946
947 #[arg(long, default_value_t = false)]
949 full: bool,
950
951 #[arg(long)]
953 out: Option<PathBuf>,
954}
955
956#[derive(clap::Args, Debug)]
957struct WebExtractArgs {
958 #[arg(long)]
960 url: Option<String>,
961
962 #[arg(long)]
964 file: Option<PathBuf>,
965
966 #[arg(long)]
968 text: Option<String>,
969
970 #[arg(long, default_value = "10")]
972 bullets: usize,
973
974 #[arg(long)]
976 focus: Option<String>,
977
978 #[arg(long)]
980 out: Option<PathBuf>,
981}
982
983#[derive(clap::Args, Debug)]
984pub struct FinanceScheduleArgs {
985 #[arg(long, default_value = "all")]
987 pub kind: String,
988 #[arg(long)]
990 pub date: Option<String>,
991 #[arg(long = "from")]
993 pub from: Option<String>,
994 #[arg(long = "to")]
996 pub to: Option<String>,
997 #[arg(long, visible_alias = "tickers", value_delimiter = ',')]
999 pub ticker: Vec<String>,
1000 #[arg(long, default_value_t = false)]
1002 pub major: bool,
1003 #[arg(long = "min-cap")]
1005 pub min_cap: Option<String>,
1006 #[arg(long)]
1008 pub time: Option<String>,
1009 #[arg(long = "macro-profile", default_value = "market")]
1011 pub macro_profile: String,
1012 #[arg(long, default_value = "json")]
1014 pub format: String,
1015 #[arg(long)]
1017 pub out: Option<PathBuf>,
1018}
1019
1020#[derive(clap::Args, Debug)]
1021pub struct FinanceRatePathArgs {
1022 #[arg(long)]
1024 pub cache_dir: Option<PathBuf>,
1025 #[arg(long, default_value = "auto", hide = true)]
1029 pub source_mode: String,
1030 #[arg(long, default_value = "json")]
1032 pub format: String,
1033 #[arg(long)]
1035 pub out: Option<PathBuf>,
1036}
1037
1038#[derive(clap::Args, Debug)]
1039pub struct FinanceAuctionsArgs {
1040 #[arg(long, default_value = "all")]
1042 pub security_type: String,
1043 #[arg(long, default_value_t = 50)]
1045 pub limit: usize,
1046 #[arg(long, default_value = "json")]
1048 pub format: String,
1049 #[arg(long)]
1051 pub out: Option<PathBuf>,
1052}
1053
1054#[derive(clap::Args, Debug)]
1055pub struct FinanceCotArgs {
1056 #[arg(long)]
1058 pub query: Option<String>,
1059 #[arg(long, default_value_t = 12)]
1061 pub weeks: usize,
1062 #[arg(long, default_value = "auto")]
1064 pub report: String,
1065 #[arg(long)]
1067 pub limit: Option<usize>,
1068 #[arg(long, default_value = "json")]
1070 pub format: String,
1071 #[arg(long)]
1073 pub out: Option<PathBuf>,
1074}
1075
1076#[derive(clap::Args, Debug)]
1077pub struct FinanceCurveArgs {
1078 #[arg(long)]
1080 pub commodity: Option<String>,
1081 #[arg(long, default_value_t = 12)]
1083 pub months: usize,
1084 #[arg(long, default_value_t = false)]
1086 pub list: bool,
1087 #[arg(long)]
1089 pub out: Option<PathBuf>,
1090}
1091
1092#[derive(clap::Args, Debug)]
1093pub struct FinanceNyfedArgs {
1094 #[arg(long, default_value = "rates")]
1096 pub kind: String,
1097 #[arg(long, default_value = "json")]
1098 pub format: String,
1099 #[arg(long)]
1100 pub out: Option<PathBuf>,
1101}
1102
1103#[derive(clap::Args, Debug)]
1104pub struct FinanceVolsurfaceArgs {
1105 #[arg(long)]
1107 pub symbols: Option<String>,
1108 #[arg(long)]
1110 pub history: Option<usize>,
1111 #[arg(long, default_value = "json")]
1112 pub format: String,
1113 #[arg(long)]
1114 pub out: Option<PathBuf>,
1115}
1116
1117#[derive(clap::Args, Debug)]
1118pub struct FinanceStressArgs {
1119 #[arg(long, default_value_t = 30)]
1121 pub range: usize,
1122 #[arg(long, default_value = "json")]
1123 pub format: String,
1124 #[arg(long)]
1125 pub out: Option<PathBuf>,
1126}
1127
1128#[derive(clap::Args, Debug)]
1129pub struct FinanceFiscalArgs {
1130 #[arg(long, default_value = "debt")]
1132 pub kind: String,
1133 #[arg(long, default_value = "json")]
1134 pub format: String,
1135 #[arg(long)]
1136 pub out: Option<PathBuf>,
1137}
1138
1139#[derive(clap::Args, Debug)]
1140pub struct FinanceEcbArgs {
1141 #[arg(long)]
1143 pub preset: Option<String>,
1144 #[arg(long)]
1146 pub dataset: Option<String>,
1147 #[arg(long)]
1149 pub key: Option<String>,
1150 #[arg(long, default_value = "2025-01-01")]
1152 pub start: String,
1153 #[arg(long)]
1155 pub end: Option<String>,
1156 #[arg(long, default_value = "json")]
1157 pub format: String,
1158 #[arg(long)]
1159 pub out: Option<PathBuf>,
1160}
1161
1162#[derive(clap::Args, Debug)]
1163pub struct FinanceEiaArgs {
1164 #[arg(long)]
1166 pub preset: Option<String>,
1167 #[arg(long)]
1169 pub route: Option<String>,
1170 #[arg(long)]
1172 pub start: Option<String>,
1173 #[arg(long, default_value = "52")]
1175 pub length: usize,
1176 #[arg(long, default_value = "json")]
1177 pub format: String,
1178 #[arg(long)]
1179 pub out: Option<PathBuf>,
1180}
1181
1182#[derive(clap::Args, Debug)]
1183pub struct FinanceBisArgs {
1184 #[arg(long)]
1186 pub preset: Option<String>,
1187 #[arg(long)]
1189 pub dataset: Option<String>,
1190 #[arg(long)]
1192 pub key: Option<String>,
1193 #[arg(long)]
1195 pub countries: Option<String>,
1196 #[arg(long, default_value = "2020-01")]
1198 pub start: String,
1199 #[arg(long, default_value = "json")]
1200 pub format: String,
1201 #[arg(long)]
1202 pub out: Option<PathBuf>,
1203}
1204
1205#[derive(clap::Args, Debug)]
1206pub struct FinanceBojArgs {
1207 #[arg(long)]
1209 pub preset: Option<String>,
1210 #[arg(long)]
1212 pub db: Option<String>,
1213 #[arg(long)]
1215 pub codes: Option<String>,
1216 #[arg(long, default_value = "202401")]
1218 pub start: String,
1219 #[arg(long, default_value = "json")]
1220 pub format: String,
1221 #[arg(long)]
1222 pub out: Option<PathBuf>,
1223}
1224
1225#[derive(clap::Args, Debug)]
1226pub struct FinanceBoeArgs {
1227 #[arg(long)]
1229 pub preset: Option<String>,
1230 #[arg(long)]
1232 pub codes: Option<String>,
1233 #[arg(long, default_value = "01/Jan/2025")]
1235 pub start: String,
1236 #[arg(long, default_value = "now")]
1238 pub end: String,
1239 #[arg(long, default_value = "json")]
1240 pub format: String,
1241 #[arg(long)]
1242 pub out: Option<PathBuf>,
1243}
1244
1245#[derive(clap::Args, Debug)]
1246struct FinanceFundamentalsArgs {
1247 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1249 tickers: Vec<String>,
1250
1251 #[arg(long, default_value = "json")]
1253 format: String,
1254
1255 #[arg(long)]
1257 out: Option<PathBuf>,
1258}
1259
1260#[derive(clap::Args, Debug)]
1261struct FinanceSearchArgs {
1262 #[arg(long, required = false)]
1264 query: Option<String>,
1265
1266 #[arg(index = 1, required = false)]
1268 query_positional: Option<String>,
1269
1270 #[arg(long, default_value = "yahoo")]
1272 provider: String,
1273
1274 #[arg(long)]
1276 ibkr_account: Option<String>,
1277
1278 #[arg(long)]
1280 ibkr_host: Option<String>,
1281
1282 #[arg(long)]
1284 ibkr_port: Option<u16>,
1285
1286 #[arg(long)]
1288 ibkr_client_id: Option<i32>,
1289
1290 #[arg(long)]
1292 ibkr_market_data_type: Option<i32>,
1293
1294 #[arg(long, default_value = "json")]
1296 format: String,
1297
1298 #[arg(long = "policy-file")]
1300 policy_file: Option<PathBuf>,
1301
1302 #[arg(long = "policy-mode", default_value = "observe")]
1304 policy_mode: String,
1305
1306 #[arg(long)]
1308 out: Option<PathBuf>,
1309}
1310
1311#[derive(clap::Args, Debug)]
1312struct FinanceOddsArgs {
1313 #[command(subcommand)]
1314 action: Option<FinanceOddsAction>,
1315
1316 #[arg(long)]
1318 provider: Option<String>,
1319 #[arg(long)]
1321 series: Option<String>,
1322
1323 #[arg(long)]
1325 event: Option<String>,
1326
1327 #[arg(long)]
1329 market: Option<String>,
1330
1331 #[arg(long)]
1333 status: Option<String>,
1334
1335 #[arg(long)]
1337 limit: Option<usize>,
1338
1339 #[arg(long)]
1341 cursor: Option<String>,
1342
1343 #[arg(long)]
1345 max_pages: Option<usize>,
1346
1347 #[arg(long)]
1349 list_series: bool,
1350
1351 #[arg(long)]
1353 list_events: bool,
1354
1355 #[arg(long)]
1357 list_markets: bool,
1358
1359 #[arg(long)]
1361 list_tags: bool,
1362
1363 #[arg(long)]
1365 category: Option<String>,
1366
1367 #[arg(long, alias = "query")]
1369 search: Option<String>,
1370
1371 #[arg(long)]
1373 country: Option<String>,
1374
1375 #[arg(long = "min-volume")]
1377 min_volume: Option<f64>,
1378
1379 #[arg(long)]
1381 top: Option<usize>,
1382
1383 #[arg(long = "sort-by", default_value = "relevance")]
1386 sort_by: String,
1387 #[arg(long, default_value = "auto")]
1389 profile: String,
1390
1391 #[arg(long = "policy-file")]
1393 policy_file: Option<PathBuf>,
1394
1395 #[arg(long = "policy-mode", default_value = "observe")]
1397 policy_mode: String,
1398
1399 #[arg(long, default_value_t = false)]
1401 deltas_only: bool,
1402
1403 #[arg(long = "min-delta-pp")]
1406 min_delta_pp: Option<f64>,
1407
1408 #[arg(long, default_value_t = false)]
1410 explain: bool,
1411
1412 #[arg(long, default_value_t = false)]
1414 live: bool,
1415
1416 #[arg(long, default_value_t = false)]
1418 include_mentions: bool,
1419
1420 #[arg(long)]
1422 orderbook: bool,
1423
1424 #[arg(long)]
1426 depth: Option<usize>,
1427
1428 #[arg(long, default_value = "json")]
1430 format: String,
1431
1432 #[arg(long)]
1434 out: Option<PathBuf>,
1435}
1436
1437#[derive(Subcommand, Debug)]
1438enum FinanceOddsAction {
1439 Sync(FinanceSyncArgs),
1441
1442 Where(FinanceOddsWhereArgs),
1444}
1445
1446#[derive(clap::Args, Debug)]
1447struct FinanceOddsWhereArgs {
1448 #[arg(long)]
1450 cache_dir: Option<PathBuf>,
1451}
1452
1453#[derive(clap::Args, Debug)]
1454struct FinanceOptionsArgs {
1455 #[arg(long, visible_alias = "tickers")]
1457 ticker: String,
1458
1459 #[arg(long)]
1461 expiry: Option<String>,
1462
1463 #[arg(long = "target-dte")]
1465 target_dte: Option<i64>,
1466
1467 #[arg(long = "type", value_name = "calls|puts|both")]
1469 option_type: Option<String>,
1470
1471 #[arg(long = "near-money")]
1473 near_money: Option<f64>,
1474
1475 #[arg(long)]
1477 summary: bool,
1478
1479 #[arg(long)]
1481 expirations: bool,
1482
1483 #[arg(long)]
1486 all: bool,
1487
1488 #[arg(long, default_value = "yahoo")]
1490 provider: String,
1491
1492 #[arg(long)]
1494 ibkr_account: Option<String>,
1495
1496 #[arg(long)]
1498 ibkr_host: Option<String>,
1499
1500 #[arg(long)]
1502 ibkr_port: Option<u16>,
1503
1504 #[arg(long)]
1506 ibkr_client_id: Option<i32>,
1507
1508 #[arg(long)]
1510 ibkr_market_data_type: Option<i32>,
1511
1512 #[arg(long, default_value = "json")]
1514 format: String,
1515
1516 #[arg(long)]
1518 out: Option<PathBuf>,
1519}
1520
1521#[derive(clap::Args, Debug)]
1522struct FinanceSyncArgs {
1523 #[arg(long, value_delimiter = ',')]
1525 sources: Vec<String>,
1526
1527 #[arg(long)]
1529 max_pages: Option<usize>,
1530
1531 #[arg(long)]
1533 strict: bool,
1534
1535 #[arg(long)]
1537 include_sports: bool,
1538
1539 #[arg(long, hide = true)]
1541 include_historical: bool,
1542
1543 #[arg(long)]
1545 stream_refresh: bool,
1546
1547 #[arg(long, hide = true)]
1549 refresh_heartbeat_hours: Option<u64>,
1550
1551 #[arg(long, hide = true)]
1553 stream_refresh_timeout_secs: Option<u64>,
1554
1555 #[arg(long)]
1557 cache_dir: Option<PathBuf>,
1558
1559 #[arg(long, default_value = "json", hide = true)]
1561 format: String,
1562
1563 #[arg(long, hide = true)]
1565 full: bool,
1566
1567 #[arg(long = "policy-file", hide = true)]
1569 policy_file: Option<PathBuf>,
1570
1571 #[arg(long = "policy-mode", default_value = "observe", hide = true)]
1573 policy_mode: String,
1574
1575 #[arg(long)]
1577 out: Option<PathBuf>,
1578}
1579
1580#[derive(clap::Args, Debug)]
1581struct FinancePaperArgs {
1582 #[arg(long, value_enum, default_value = "trade")]
1584 command: FinancePaperCommandArg,
1585
1586 #[arg(long, value_enum, default_value = "simulated")]
1588 mode: FinancePaperModeArg,
1589
1590 #[arg(long, default_value = "default")]
1592 account: String,
1593
1594 #[arg(long)]
1596 provider: Option<String>,
1597
1598 #[arg(long)]
1600 market: Option<String>,
1601
1602 #[arg(long, value_enum)]
1604 side: Option<FinancePaperSideArg>,
1605
1606 #[arg(long, value_enum)]
1608 action: Option<FinancePaperOrderActionArg>,
1609
1610 #[arg(long)]
1612 qty: Option<f64>,
1613
1614 #[arg(long)]
1616 price: Option<f64>,
1617
1618 #[arg(long)]
1620 starting_cash: Option<f64>,
1621
1622 #[arg(long)]
1624 limit: Option<usize>,
1625
1626 #[arg(long)]
1628 cache_dir: Option<PathBuf>,
1629
1630 #[arg(long, default_value = "json")]
1632 format: String,
1633
1634 #[arg(long)]
1636 out: Option<PathBuf>,
1637}
1638
1639#[derive(clap::Args, Debug)]
1640struct FinanceFilingsArgs {
1641 #[arg(long, visible_alias = "tickers")]
1643 ticker: String,
1644
1645 #[arg(long, value_delimiter = ',')]
1647 forms: Vec<String>,
1648
1649 #[arg(long, default_value_t = 5)]
1651 limit: usize,
1652
1653 #[arg(long)]
1655 include_text: bool,
1656
1657 #[arg(long)]
1659 max_chars: Option<usize>,
1660
1661 #[arg(long)]
1663 cache_dir: Option<PathBuf>,
1664
1665 #[arg(long, default_value = "json")]
1667 format: String,
1668
1669 #[arg(long)]
1671 out: Option<PathBuf>,
1672}
1673
1674#[derive(clap::Args, Debug)]
1675struct FinanceTimeseriesArgs {
1676 #[arg(long)]
1679 preset: Option<String>,
1680
1681 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1683 tickers: Vec<String>,
1684
1685 #[arg(long)]
1687 tickers_file: Option<PathBuf>,
1688
1689 #[arg(long, default_value = "1y")]
1691 range: String,
1692
1693 #[arg(long, default_value = "1d")]
1695 granularity: String,
1696
1697 #[arg(long)]
1699 start: Option<String>,
1700
1701 #[arg(long)]
1703 end: Option<String>,
1704
1705 #[arg(long)]
1707 as_of: Option<String>,
1708
1709 #[arg(long, default_value = "auto")]
1711 provider: String,
1712
1713 #[arg(long)]
1715 ibkr_account: Option<String>,
1716
1717 #[arg(long)]
1719 ibkr_host: Option<String>,
1720
1721 #[arg(long)]
1723 ibkr_port: Option<u16>,
1724
1725 #[arg(long)]
1727 ibkr_client_id: Option<i32>,
1728
1729 #[arg(long)]
1731 ibkr_market_data_type: Option<i32>,
1732
1733 #[arg(long)]
1735 odds_provider: Option<String>,
1736
1737 #[arg(long)]
1739 odds_market: Option<String>,
1740
1741 #[arg(long, default_value = "yes")]
1743 odds_side: String,
1744
1745 #[arg(long)]
1747 max_points_per_ticker: Option<usize>,
1748
1749 #[arg(long)]
1751 cache_dir: Option<PathBuf>,
1752
1753 #[arg(long, default_value = "json")]
1755 format: String,
1756
1757 #[arg(long)]
1759 out: Option<PathBuf>,
1760}
1761
1762#[derive(clap::Args, Debug)]
1763struct FinanceIbkrArgs {
1764 #[arg(long, value_enum)]
1766 command: FinanceIbkrCommandArg,
1767
1768 #[arg(long)]
1770 account: Option<String>,
1771
1772 #[arg(long)]
1774 host: Option<String>,
1775
1776 #[arg(long)]
1778 port: Option<u16>,
1779
1780 #[arg(long)]
1782 client_id: Option<i32>,
1783
1784 #[arg(long)]
1786 market_data_type: Option<i32>,
1787
1788 #[arg(long)]
1790 timeout_secs: Option<u64>,
1791
1792 #[arg(long, value_delimiter = ',')]
1794 tickers: Vec<String>,
1795
1796 #[arg(long, default_value = "1mo")]
1798 range: String,
1799
1800 #[arg(long, default_value = "1day")]
1802 granularity: String,
1803
1804 #[arg(long)]
1806 symbol: Option<String>,
1807
1808 #[arg(long)]
1810 sec_type: Option<String>,
1811
1812 #[arg(long)]
1814 exchange: Option<String>,
1815
1816 #[arg(long)]
1818 primary_exchange: Option<String>,
1819
1820 #[arg(long)]
1822 currency: Option<String>,
1823
1824 #[arg(long)]
1826 expiry: Option<String>,
1827
1828 #[arg(long)]
1830 strike: Option<f64>,
1831
1832 #[arg(long)]
1834 right: Option<String>,
1835
1836 #[arg(long)]
1838 multiplier: Option<String>,
1839
1840 #[arg(long)]
1842 trading_class: Option<String>,
1843
1844 #[arg(long)]
1846 side: Option<String>,
1847
1848 #[arg(long)]
1850 order_type: Option<String>,
1851
1852 #[arg(long)]
1854 quantity: Option<f64>,
1855
1856 #[arg(long)]
1858 limit_price: Option<f64>,
1859
1860 #[arg(long)]
1862 stop_price: Option<f64>,
1863
1864 #[arg(long)]
1866 tif: Option<String>,
1867
1868 #[arg(long)]
1870 order_id: Option<i32>,
1871
1872 #[arg(long)]
1874 tags: Option<String>,
1875
1876 #[arg(long, default_value = "json")]
1878 format: String,
1879
1880 #[arg(long)]
1882 out: Option<PathBuf>,
1883}