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 Chat,
45
46 Debug,
48
49 Raw,
51
52 Research {
54 query: String,
56 },
57
58 Tui,
60
61 Finance {
63 #[command(subcommand)]
64 cmd: FinanceCommand,
65 },
66
67 Web {
69 #[command(subcommand)]
70 cmd: WebCommand,
71 },
72
73 Agent {
75 #[command(subcommand)]
76 cmd: AgentCommand,
77 },
78
79 Code(CodeArgs),
81
82 Sentinel {
84 #[command(subcommand)]
85 cmd: SentinelCommand,
86 },
87
88 Mcp(McpArgs),
90
91 Picks {
93 #[command(subcommand)]
94 cmd: PicksCommand,
95 },
96
97 Serve(ServeArgs),
99}
100
101#[derive(Subcommand, Debug)]
102enum PicksCommand {
103 Log(PicksLogArgs),
105}
106
107#[derive(clap::Args, Debug)]
108struct PicksLogArgs {
109 #[arg(long)]
111 report: String,
112
113 #[arg(long, value_delimiter = ',')]
115 ticker: Vec<String>,
116
117 #[arg(long, value_delimiter = ',')]
119 market: Vec<String>,
120}
121
122#[derive(clap::Args, Debug)]
123struct McpArgs {
124 #[command(subcommand)]
125 cmd: Option<McpSubcommand>,
126
127 #[arg(long, default_value_t = false)]
129 http: bool,
130
131 #[arg(long, default_value = "8484")]
133 port: u16,
134}
135
136#[derive(Subcommand, Debug)]
137enum McpSubcommand {
138 Share(ShareArgs),
140}
141
142#[derive(clap::Args, Debug)]
143struct ShareArgs {
144 #[arg(long, default_value = "tunnelmole")]
146 provider: String,
147
148 #[arg(long, default_value = "8484")]
150 port: u16,
151
152 #[arg(long)]
154 domain: Option<String>,
155
156 #[arg(long)]
158 authtoken: Option<String>,
159}
160
161#[derive(clap::Args, Debug)]
162struct ServeArgs {
163 #[arg(long, default_value = "3333")]
165 port: u16,
166
167 #[arg(long, default_value = "~/Downloads/eli-code/eli_research/reports/html")]
169 reports_dir: String,
170
171 #[arg(long)]
173 sentinel_dir: Option<PathBuf>,
174
175 #[arg(long, default_value_t = false)]
177 open: bool,
178}
179
180#[derive(Subcommand, Debug)]
181enum FinanceCommand {
182 Timeseries(FinanceTimeseriesArgs),
184 Fundamentals(FinanceFundamentalsArgs),
186 Search(FinanceSearchArgs),
188 Filings(FinanceFilingsArgs),
190 Sec(FinanceFilingsArgs),
192 Schedule(FinanceScheduleArgs),
194 RatePath(FinanceRatePathArgs),
196 Odds(FinanceOddsArgs),
198 Options(FinanceOptionsArgs),
200 Sync(FinanceSyncArgs),
202 Paper(FinancePaperArgs),
204 Ibkr(FinanceIbkrArgs),
206 Auctions(FinanceAuctionsArgs),
208 Cot(FinanceCotArgs),
210 Curve(FinanceCurveArgs),
212 Nyfed(FinanceNyfedArgs),
214 #[command(name = "volatility", visible_alias = "volsurface")]
216 Volsurface(FinanceVolsurfaceArgs),
217 Stress(FinanceStressArgs),
219 Fiscal(FinanceFiscalArgs),
221 Ecb(FinanceEcbArgs),
223 Eia(FinanceEiaArgs),
225 Bis(FinanceBisArgs),
227 Boj(FinanceBojArgs),
229 Boe(FinanceBoeArgs),
231}
232
233#[derive(Subcommand, Debug)]
234enum WebCommand {
235 Crawl(WebCrawlArgs),
237 Search(WebSearchArgs),
239 Read(WebReadArgs),
241 Extract(WebExtractArgs),
243}
244
245#[derive(Subcommand, Debug)]
246enum AgentCommand {
247 Report(AgentReportArgs),
249 Run(AgentRunArgs),
251 Fanout(AgentFanoutArgs),
253 Swarm(AgentSwarmArgs),
255 Critique(AgentModeArgs),
257 Evidence(AgentModeArgs),
259 Compete(AgentModeArgs),
261 Debate(AgentModeArgs),
263}
264
265#[derive(Subcommand, Debug)]
266enum SentinelCommand {
267 Start(SentinelStartArgs),
269 Stop(SentinelStopArgs),
271 Status(SentinelStatusArgs),
273 Subscribe(SentinelSubscribeArgs),
275 Unsubscribe(SentinelUnsubscribeArgs),
277 List(SentinelListArgs),
279 Test(SentinelTestArgs),
281 Replay(SentinelReplayArgs),
283 #[command(hide = true)]
285 DaemonRun(SentinelDaemonRunArgs),
286}
287
288#[derive(Debug, Serialize)]
289struct RustFileSummary {
290 items_total: usize,
291 functions: usize,
292 function_names: Vec<String>,
293 function_signatures: Vec<String>,
296 structs: usize,
297 struct_names: Vec<String>,
298 struct_fields: std::collections::BTreeMap<String, Vec<String>>,
300 enums: usize,
301 enum_names: Vec<String>,
302 impls: usize,
303 impl_targets: Vec<String>,
304 impl_methods: std::collections::BTreeMap<String, Vec<String>>,
306 traits: usize,
307 trait_names: Vec<String>,
308 modules: usize,
309 module_names: Vec<String>,
310 uses: usize,
311 use_paths: Vec<String>,
312 consts: usize,
313 const_names: Vec<String>,
314 statics: usize,
315 type_aliases: usize,
316 type_alias_names: Vec<String>,
317 macros: usize,
318 others: usize,
319}
320
321#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
322enum CrawlViewMode {
323 Summary,
324 Raw,
325 Path,
326}
327
328#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
329enum CrawlSaveMode {
330 Auto,
331 Off,
332}
333
334#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
335enum WebSearchModeArg {
336 Auto,
337 News,
338 Finance,
339 Research,
340 Tech,
341 Encyclopedia,
342}
343
344#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
345enum WebSearchRecencyArg {
346 Day,
347 Week,
348 Month,
349 Year,
350}
351
352#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
353enum FinancePaperCommandArg {
354 Trade,
355 Positions,
356 Trades,
357 Mark,
358 Reset,
359}
360
361#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
362enum FinancePaperModeArg {
363 Simulated,
364 #[value(alias = "live_like")]
365 LiveLike,
366 #[value(alias = "kalshi_demo")]
367 KalshiDemo,
368 #[value(alias = "polymarket_demo")]
369 PolymarketDemo,
370}
371
372#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
373enum FinancePaperSideArg {
374 Yes,
375 No,
376}
377
378#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
379enum FinancePaperOrderActionArg {
380 Buy,
381 Sell,
382}
383
384#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
385enum FinanceIbkrCommandArg {
386 Snapshot,
387 Timeseries,
388 AccountSummary,
389 Positions,
390 Portfolio,
391 OpenOrders,
392 PlaceOrder,
393 CancelOrder,
394}
395
396#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
397enum SentinelSeverityArg {
398 Low,
399 Medium,
400 High,
401 Critical,
402}
403
404#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
405enum SentinelSpawnTargetArg {
406 Default,
407 Codex,
408 Claude,
409 Gemini,
410 Both,
411}
412
413#[derive(clap::Args, Debug)]
414struct SentinelPathArgs {
415 #[arg(long = "sentinel-dir")]
417 sentinel_dir: Option<PathBuf>,
418
419 #[arg(long = "queue-file")]
421 queue_file: Option<PathBuf>,
422
423 #[arg(long = "packets-file")]
425 packets_file: Option<PathBuf>,
426}
427
428#[derive(clap::Args, Debug)]
429struct SentinelStartArgs {
430 #[command(flatten)]
431 paths: SentinelPathArgs,
432
433 #[arg(long = "interval-secs", default_value_t = 15)]
435 interval_secs: u64,
436}
437
438#[derive(clap::Args, Debug)]
439struct SentinelStopArgs {
440 #[command(flatten)]
441 paths: SentinelPathArgs,
442}
443
444#[derive(clap::Args, Debug)]
445struct SentinelStatusArgs {
446 #[command(flatten)]
447 paths: SentinelPathArgs,
448}
449
450#[derive(clap::Args, Debug)]
451struct SentinelSubscribeArgs {
452 #[command(flatten)]
453 paths: SentinelPathArgs,
454
455 #[arg(long)]
457 name: String,
458
459 #[arg(long)]
462 title: Option<String>,
463
464 #[arg(long = "source-report")]
466 source_report_title: Option<String>,
467
468 #[arg(long = "source-date")]
470 source_report_date: Option<String>,
471
472 #[arg(long = "source-file")]
474 source_report_file: Option<String>,
475
476 #[arg(long = "source-evidence")]
478 source_evidence: Option<String>,
479
480 #[arg(long)]
483 expr: Option<String>,
484
485 #[arg(long = "var")]
487 vars: Vec<String>,
488
489 #[arg(long = "why")]
491 why: Option<String>,
492
493 #[arg(long = "prompt-template")]
495 prompt_template: Option<String>,
496
497 #[arg(long, value_enum, default_value = "medium")]
499 severity: SentinelSeverityArg,
500
501 #[arg(long = "cooldown-secs", default_value_t = 300)]
503 cooldown_secs: u64,
504
505 #[arg(long, default_value_t = true)]
507 enabled: bool,
508
509 #[arg(long = "spawn-agent", default_value_t = false)]
511 spawn_agent: bool,
512
513 #[arg(long = "spawn-target", value_enum, default_value = "default")]
515 spawn_target: SentinelSpawnTargetArg,
516
517 #[arg(long = "spawn-cooldown-secs", default_value_t = 14400, hide = true)]
520 spawn_cooldown_secs: u64,
521
522 #[arg(long = "prediction")]
525 prediction: Option<String>,
526
527 #[arg(long = "target-var")]
529 target_var: Option<String>,
530
531 #[arg(long = "target-value")]
533 target_value: Option<f64>,
534
535 #[arg(long = "deadline")]
538 deadline: Option<String>,
539
540 #[arg(long = "fire-at")]
544 fire_at: Option<String>,
545}
546
547#[derive(clap::Args, Debug)]
548struct SentinelUnsubscribeArgs {
549 #[command(flatten)]
550 paths: SentinelPathArgs,
551
552 #[arg(long = "id")]
554 id_or_name: String,
555}
556
557#[derive(clap::Args, Debug)]
558struct SentinelListArgs {
559 #[command(flatten)]
560 paths: SentinelPathArgs,
561}
562
563#[derive(clap::Args, Debug)]
564struct SentinelTestArgs {
565 #[command(flatten)]
566 paths: SentinelPathArgs,
567
568 #[arg(long, default_value = "generic")]
570 scenario: String,
571}
572
573#[derive(clap::Args, Debug)]
574struct SentinelReplayArgs {
575 #[command(flatten)]
576 paths: SentinelPathArgs,
577
578 #[arg(long = "max-lines", default_value_t = 50)]
580 max_lines: usize,
581}
582
583#[derive(clap::Args, Debug)]
584struct SentinelDaemonRunArgs {
585 #[command(flatten)]
586 paths: SentinelPathArgs,
587
588 #[arg(long = "interval-secs", default_value_t = 15)]
590 interval_secs: u64,
591}
592
593#[derive(clap::Args, Debug)]
594struct AgentReportArgs {
595 #[arg(long)]
597 prompt: Option<String>,
598
599 #[arg(
601 long,
602 value_delimiter = ',',
603 default_value = "SPY,QQQ,IWM,DIA,^VIX,BTC-USD,ETH-USD,SOL-USD,DX-Y.NYB,GC=F,CL=F"
604 )]
605 tickers: Vec<String>,
606
607 #[arg(long, default_value = "14d")]
609 lookback: String,
610
611 #[arg(long, default_value = "1h")]
613 granularity: String,
614
615 #[arg(long = "lock-minutes", conflicts_with = "as_of")]
617 lock_minutes: Option<u64>,
618
619 #[arg(long = "as-of", conflicts_with = "lock_minutes")]
621 as_of: Option<String>,
622
623 #[arg(
625 long,
626 value_delimiter = ',',
627 default_value = "recession,fed,inflation,iran,oil,china,taiwan"
628 )]
629 odds_queries: Vec<String>,
630
631 #[arg(long, default_value_t = 8)]
633 top: usize,
634
635 #[arg(
637 long,
638 value_delimiter = ',',
639 default_value = "stock market today,treasury yields today,fed policy outlook,oil geopolitical risk"
640 )]
641 web_queries: Vec<String>,
642
643 #[arg(long = "max-ms", default_value_t = 45000)]
645 max_ms: u64,
646
647 #[arg(long = "fallback-models", value_delimiter = ',')]
649 fallback_models: Vec<String>,
650
651 #[arg(long = "html-out")]
653 html_out: Option<PathBuf>,
654
655 #[arg(long)]
657 out: Option<PathBuf>,
658}
659
660#[derive(clap::Args, Debug)]
661struct AgentRunArgs {
662 #[arg(long)]
664 task: String,
665
666 #[arg(long)]
668 out: Option<PathBuf>,
669
670 #[arg(long = "fallback-models", value_delimiter = ',')]
672 fallback_models: Vec<String>,
673
674 #[arg(long = "max-ms", default_value_t = 45000)]
676 max_ms: u64,
677
678 #[arg(long = "max-attempts", default_value_t = 4)]
680 max_attempts: usize,
681
682 #[arg(long = "must-cite", value_delimiter = ',')]
684 must_cite: Vec<String>,
685}
686
687#[derive(clap::Args, Debug)]
688struct AgentFanoutArgs {
689 #[arg(long = "task-template")]
691 task_template: String,
692
693 #[arg(long)]
695 vars: PathBuf,
696
697 #[arg(long = "shared-manifest")]
699 shared_manifest: Option<PathBuf>,
700
701 #[arg(long, default_value = "4")]
703 max_parallel: usize,
704
705 #[arg(long)]
707 out: Option<PathBuf>,
708
709 #[arg(long = "fallback-models", value_delimiter = ',')]
711 fallback_models: Vec<String>,
712
713 #[arg(long = "max-ms", default_value_t = 45000)]
715 max_ms: u64,
716
717 #[arg(long = "max-attempts", default_value_t = 4)]
719 max_attempts: usize,
720
721 #[arg(long = "must-cite", value_delimiter = ',')]
723 must_cite: Vec<String>,
724}
725
726#[derive(clap::Args, Debug)]
727struct AgentSwarmArgs {
728 #[arg(long)]
730 task: String,
731
732 #[arg(long)]
734 input: PathBuf,
735
736 #[arg(long)]
738 chunks: Option<usize>,
739
740 #[arg(long = "chunk-chars", default_value_t = 20_000)]
742 chunk_chars: usize,
743
744 #[arg(long = "overlap-chars", default_value_t = 500)]
746 overlap_chars: usize,
747
748 #[arg(long = "max-chunks", default_value_t = 64)]
750 max_chunks: usize,
751
752 #[arg(long, default_value = "4")]
754 max_parallel: usize,
755
756 #[arg(long)]
758 out: Option<PathBuf>,
759
760 #[arg(long = "fallback-models", value_delimiter = ',')]
762 fallback_models: Vec<String>,
763
764 #[arg(long = "max-ms", default_value_t = 120_000)]
766 max_ms: u64,
767
768 #[arg(long = "max-attempts", default_value_t = 4)]
770 max_attempts: usize,
771
772 #[arg(long = "must-cite", value_delimiter = ',')]
774 must_cite: Vec<String>,
775}
776
777#[derive(clap::Args, Debug)]
778struct AgentModeArgs {
779 #[arg(long)]
781 prompt: String,
782
783 #[arg(long)]
785 lead: Option<PathBuf>,
786
787 #[arg(long)]
789 vars: PathBuf,
790
791 #[arg(long = "shared-manifest")]
793 shared_manifest: Option<PathBuf>,
794
795 #[arg(long, default_value_t = false)]
797 allow_cheat: bool,
798
799 #[arg(long, default_value = "4")]
801 max_parallel: usize,
802
803 #[arg(long)]
805 out: Option<PathBuf>,
806
807 #[arg(long = "fallback-models", value_delimiter = ',')]
809 fallback_models: Vec<String>,
810
811 #[arg(long = "max-ms", default_value_t = 120_000)]
813 max_ms: u64,
814
815 #[arg(long = "max-attempts", default_value_t = 2)]
817 max_attempts: usize,
818
819 #[arg(long = "must-cite", value_delimiter = ',')]
821 must_cite: Vec<String>,
822}
823
824#[derive(clap::Args, Debug)]
825struct CodeArgs {
826 path: PathBuf,
828
829 #[arg(long, default_value_t = false)]
831 generate: bool,
832
833 #[arg(long, default_value_t = 0)]
835 min_loc: usize,
836
837 #[arg(long)]
839 max_files: Option<usize>,
840
841 #[arg(long)]
843 workers: Option<usize>,
844
845 #[arg(long, default_value_t = 20)]
847 top: usize,
848
849 #[arg(long, default_value_t = false)]
851 include_files: bool,
852
853 #[arg(long, value_delimiter = ',')]
857 find: Vec<String>,
858
859 #[arg(long, default_value_t = false)]
864 pub_api: bool,
865
866 #[arg(long)]
868 out: Option<PathBuf>,
869}
870
871#[derive(clap::Args, Debug)]
872struct WebCrawlArgs {
873 #[arg(long)]
875 url: String,
876
877 #[arg(long, default_value = "50")]
879 max_pages: usize,
880
881 #[arg(long, default_value = "true")]
883 respect_robots: bool,
884
885 #[arg(long, default_value = "false")]
887 subdomains: bool,
888
889 #[arg(long, default_value = "false")]
891 sitemap: bool,
892
893 #[arg(long, default_value = "false", conflicts_with = "sitemap")]
895 smart: bool,
896
897 #[arg(long, value_enum, default_value_t = CrawlViewMode::Summary)]
899 view: CrawlViewMode,
900
901 #[arg(long, value_enum, default_value_t = CrawlSaveMode::Auto)]
903 save: CrawlSaveMode,
904
905 #[arg(long)]
907 out: Option<PathBuf>,
908}
909
910#[derive(clap::Args, Debug)]
911struct WebSearchArgs {
912 #[arg(long)]
914 query: String,
915
916 #[arg(long, value_enum, default_value_t = WebSearchModeArg::Auto)]
918 mode: WebSearchModeArg,
919
920 #[arg(long, value_delimiter = ',')]
922 domains: Vec<String>,
923
924 #[arg(long = "exclude-domains", value_delimiter = ',')]
926 exclude_domains: Vec<String>,
927
928 #[arg(long, value_enum)]
930 recency: Option<WebSearchRecencyArg>,
931
932 #[arg(long)]
934 since: Option<String>,
935
936 #[arg(long)]
938 until: Option<String>,
939
940 #[arg(long, default_value_t = 15)]
942 top: usize,
943
944 #[arg(long = "probe-top", default_value_t = 4)]
946 probe_top: usize,
947
948 #[arg(long = "max-parallel", default_value_t = 6)]
950 max_parallel: usize,
951
952 #[arg(long = "track-key")]
954 track_key: Option<String>,
955
956 #[arg(long, default_value_t = false)]
958 full: bool,
959
960 #[arg(long)]
962 out: Option<PathBuf>,
963}
964
965#[derive(clap::Args, Debug)]
966struct WebReadArgs {
967 #[arg(long = "url", value_delimiter = ',')]
969 url: Vec<String>,
970
971 #[arg(long = "urls-file")]
973 urls_file: Option<PathBuf>,
974
975 #[arg(long = "max-parallel", default_value_t = 6)]
977 max_parallel: usize,
978
979 #[arg(long = "max-chars", default_value_t = 2400)]
981 max_chars: usize,
982
983 #[arg(long, default_value_t = false)]
985 full: bool,
986
987 #[arg(long)]
989 out: Option<PathBuf>,
990}
991
992#[derive(clap::Args, Debug)]
993struct WebExtractArgs {
994 #[arg(long)]
996 url: Option<String>,
997
998 #[arg(long)]
1000 file: Option<PathBuf>,
1001
1002 #[arg(long)]
1004 text: Option<String>,
1005
1006 #[arg(long, default_value = "10")]
1008 bullets: usize,
1009
1010 #[arg(long)]
1012 focus: Option<String>,
1013
1014 #[arg(long)]
1016 out: Option<PathBuf>,
1017}
1018
1019#[derive(clap::Args, Debug)]
1020pub struct FinanceScheduleArgs {
1021 #[arg(long, default_value = "all")]
1023 pub kind: String,
1024 #[arg(long)]
1026 pub date: Option<String>,
1027 #[arg(long = "from")]
1029 pub from: Option<String>,
1030 #[arg(long = "to")]
1032 pub to: Option<String>,
1033 #[arg(long, visible_alias = "tickers", value_delimiter = ',')]
1035 pub ticker: Vec<String>,
1036 #[arg(long, default_value_t = false)]
1038 pub major: bool,
1039 #[arg(long = "min-cap")]
1041 pub min_cap: Option<String>,
1042 #[arg(long)]
1044 pub time: Option<String>,
1045 #[arg(long = "macro-profile", default_value = "market")]
1047 pub macro_profile: String,
1048 #[arg(long, default_value = "json")]
1050 pub format: String,
1051 #[arg(long)]
1053 pub out: Option<PathBuf>,
1054}
1055
1056#[derive(clap::Args, Debug)]
1057pub struct FinanceRatePathArgs {
1058 #[arg(long)]
1060 pub cache_dir: Option<PathBuf>,
1061 #[arg(long, default_value = "auto", hide = true)]
1065 pub source_mode: String,
1066 #[arg(long, default_value = "json")]
1068 pub format: String,
1069 #[arg(long)]
1071 pub out: Option<PathBuf>,
1072}
1073
1074#[derive(clap::Args, Debug)]
1075pub struct FinanceAuctionsArgs {
1076 #[arg(long, default_value = "all")]
1078 pub security_type: String,
1079 #[arg(long, default_value_t = 50)]
1081 pub limit: usize,
1082 #[arg(long, default_value = "json")]
1084 pub format: String,
1085 #[arg(long)]
1087 pub out: Option<PathBuf>,
1088}
1089
1090#[derive(clap::Args, Debug)]
1091pub struct FinanceCotArgs {
1092 #[arg(long)]
1094 pub query: Option<String>,
1095 #[arg(long, default_value_t = 12)]
1097 pub weeks: usize,
1098 #[arg(long, default_value = "auto")]
1100 pub report: String,
1101 #[arg(long)]
1103 pub limit: Option<usize>,
1104 #[arg(long, default_value = "json")]
1106 pub format: String,
1107 #[arg(long)]
1109 pub out: Option<PathBuf>,
1110}
1111
1112#[derive(clap::Args, Debug)]
1113pub struct FinanceCurveArgs {
1114 #[arg(long)]
1116 pub commodity: Option<String>,
1117 #[arg(long, default_value_t = 12)]
1119 pub months: usize,
1120 #[arg(long, default_value_t = false)]
1122 pub list: bool,
1123 #[arg(long)]
1125 pub out: Option<PathBuf>,
1126}
1127
1128#[derive(clap::Args, Debug)]
1129pub struct FinanceNyfedArgs {
1130 #[arg(long, default_value = "rates")]
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 FinanceVolsurfaceArgs {
1141 #[arg(long)]
1143 pub symbols: Option<String>,
1144 #[arg(long)]
1146 pub history: Option<usize>,
1147 #[arg(long, default_value = "json")]
1148 pub format: String,
1149 #[arg(long)]
1150 pub out: Option<PathBuf>,
1151}
1152
1153#[derive(clap::Args, Debug)]
1154pub struct FinanceStressArgs {
1155 #[arg(long, default_value_t = 30)]
1157 pub range: usize,
1158 #[arg(long, default_value = "json")]
1159 pub format: String,
1160 #[arg(long)]
1161 pub out: Option<PathBuf>,
1162}
1163
1164#[derive(clap::Args, Debug)]
1165pub struct FinanceFiscalArgs {
1166 #[arg(long, default_value = "debt")]
1168 pub kind: String,
1169 #[arg(long, default_value = "json")]
1170 pub format: String,
1171 #[arg(long)]
1172 pub out: Option<PathBuf>,
1173}
1174
1175#[derive(clap::Args, Debug)]
1176pub struct FinanceEcbArgs {
1177 #[arg(long)]
1179 pub preset: Option<String>,
1180 #[arg(long)]
1182 pub dataset: Option<String>,
1183 #[arg(long)]
1185 pub key: Option<String>,
1186 #[arg(long, default_value = "2025-01-01")]
1188 pub start: String,
1189 #[arg(long)]
1191 pub end: Option<String>,
1192 #[arg(long, default_value = "json")]
1193 pub format: String,
1194 #[arg(long)]
1195 pub out: Option<PathBuf>,
1196}
1197
1198#[derive(clap::Args, Debug)]
1199pub struct FinanceEiaArgs {
1200 #[arg(long)]
1202 pub preset: Option<String>,
1203 #[arg(long)]
1205 pub route: Option<String>,
1206 #[arg(long)]
1208 pub start: Option<String>,
1209 #[arg(long, default_value = "52")]
1211 pub length: usize,
1212 #[arg(long, default_value = "json")]
1213 pub format: String,
1214 #[arg(long)]
1215 pub out: Option<PathBuf>,
1216}
1217
1218#[derive(clap::Args, Debug)]
1219pub struct FinanceBisArgs {
1220 #[arg(long)]
1222 pub preset: Option<String>,
1223 #[arg(long)]
1225 pub dataset: Option<String>,
1226 #[arg(long)]
1228 pub key: Option<String>,
1229 #[arg(long)]
1231 pub countries: Option<String>,
1232 #[arg(long, default_value = "2020-01")]
1234 pub start: String,
1235 #[arg(long, default_value = "json")]
1236 pub format: String,
1237 #[arg(long)]
1238 pub out: Option<PathBuf>,
1239}
1240
1241#[derive(clap::Args, Debug)]
1242pub struct FinanceBojArgs {
1243 #[arg(long)]
1245 pub preset: Option<String>,
1246 #[arg(long)]
1248 pub db: Option<String>,
1249 #[arg(long)]
1251 pub codes: Option<String>,
1252 #[arg(long, default_value = "202401")]
1254 pub start: String,
1255 #[arg(long, default_value = "json")]
1256 pub format: String,
1257 #[arg(long)]
1258 pub out: Option<PathBuf>,
1259}
1260
1261#[derive(clap::Args, Debug)]
1262pub struct FinanceBoeArgs {
1263 #[arg(long)]
1265 pub preset: Option<String>,
1266 #[arg(long)]
1268 pub codes: Option<String>,
1269 #[arg(long, default_value = "01/Jan/2025")]
1271 pub start: String,
1272 #[arg(long, default_value = "now")]
1274 pub end: String,
1275 #[arg(long, default_value = "json")]
1276 pub format: String,
1277 #[arg(long)]
1278 pub out: Option<PathBuf>,
1279}
1280
1281#[derive(clap::Args, Debug)]
1282struct FinanceFundamentalsArgs {
1283 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1285 tickers: Vec<String>,
1286
1287 #[arg(long, default_value = "json")]
1289 format: String,
1290
1291 #[arg(long)]
1293 out: Option<PathBuf>,
1294}
1295
1296#[derive(clap::Args, Debug)]
1297struct FinanceSearchArgs {
1298 #[arg(long, required = false)]
1300 query: Option<String>,
1301
1302 #[arg(index = 1, required = false)]
1304 query_positional: Option<String>,
1305
1306 #[arg(long, default_value = "yahoo")]
1308 provider: String,
1309
1310 #[arg(long)]
1312 ibkr_account: Option<String>,
1313
1314 #[arg(long)]
1316 ibkr_host: Option<String>,
1317
1318 #[arg(long)]
1320 ibkr_port: Option<u16>,
1321
1322 #[arg(long)]
1324 ibkr_client_id: Option<i32>,
1325
1326 #[arg(long)]
1328 ibkr_market_data_type: Option<i32>,
1329
1330 #[arg(long, default_value = "json")]
1332 format: String,
1333
1334 #[arg(long = "policy-file")]
1336 policy_file: Option<PathBuf>,
1337
1338 #[arg(long = "policy-mode", default_value = "observe")]
1340 policy_mode: String,
1341
1342 #[arg(long)]
1344 out: Option<PathBuf>,
1345}
1346
1347#[derive(clap::Args, Debug)]
1348struct FinanceOddsArgs {
1349 #[command(subcommand)]
1350 action: Option<FinanceOddsAction>,
1351
1352 #[arg(long)]
1354 provider: Option<String>,
1355 #[arg(long)]
1357 series: Option<String>,
1358
1359 #[arg(long)]
1361 event: Option<String>,
1362
1363 #[arg(long)]
1365 market: Option<String>,
1366
1367 #[arg(long)]
1369 status: Option<String>,
1370
1371 #[arg(long)]
1373 limit: Option<usize>,
1374
1375 #[arg(long)]
1377 cursor: Option<String>,
1378
1379 #[arg(long)]
1381 max_pages: Option<usize>,
1382
1383 #[arg(long)]
1385 list_series: bool,
1386
1387 #[arg(long)]
1389 list_events: bool,
1390
1391 #[arg(long)]
1393 list_markets: bool,
1394
1395 #[arg(long)]
1397 list_tags: bool,
1398
1399 #[arg(long)]
1401 category: Option<String>,
1402
1403 #[arg(long, alias = "query")]
1405 search: Option<String>,
1406
1407 #[arg(long)]
1409 country: Option<String>,
1410
1411 #[arg(long = "min-volume")]
1413 min_volume: Option<f64>,
1414
1415 #[arg(long)]
1417 top: Option<usize>,
1418
1419 #[arg(long = "sort-by", default_value = "relevance")]
1422 sort_by: String,
1423 #[arg(long, default_value = "auto")]
1425 profile: String,
1426
1427 #[arg(long = "policy-file")]
1429 policy_file: Option<PathBuf>,
1430
1431 #[arg(long = "policy-mode", default_value = "observe")]
1433 policy_mode: String,
1434
1435 #[arg(long, default_value_t = false)]
1437 deltas_only: bool,
1438
1439 #[arg(long = "min-delta-pp")]
1442 min_delta_pp: Option<f64>,
1443
1444 #[arg(long, default_value_t = false)]
1446 explain: bool,
1447
1448 #[arg(long, default_value_t = false)]
1450 live: bool,
1451
1452 #[arg(long, default_value_t = false)]
1454 include_mentions: bool,
1455
1456 #[arg(long)]
1458 orderbook: bool,
1459
1460 #[arg(long)]
1462 depth: Option<usize>,
1463
1464 #[arg(long, default_value = "json")]
1466 format: String,
1467
1468 #[arg(long)]
1470 out: Option<PathBuf>,
1471}
1472
1473#[derive(Subcommand, Debug)]
1474enum FinanceOddsAction {
1475 Sync(FinanceSyncArgs),
1477
1478 Where(FinanceOddsWhereArgs),
1480}
1481
1482#[derive(clap::Args, Debug)]
1483struct FinanceOddsWhereArgs {
1484 #[arg(long)]
1486 cache_dir: Option<PathBuf>,
1487}
1488
1489#[derive(clap::Args, Debug)]
1490struct FinanceOptionsArgs {
1491 #[arg(long, visible_alias = "tickers")]
1493 ticker: String,
1494
1495 #[arg(long)]
1497 expiry: Option<String>,
1498
1499 #[arg(long = "target-dte")]
1501 target_dte: Option<i64>,
1502
1503 #[arg(long = "type", value_name = "calls|puts|both")]
1505 option_type: Option<String>,
1506
1507 #[arg(long = "near-money")]
1509 near_money: Option<f64>,
1510
1511 #[arg(long)]
1513 summary: bool,
1514
1515 #[arg(long)]
1517 expirations: bool,
1518
1519 #[arg(long)]
1522 all: bool,
1523
1524 #[arg(long, default_value = "yahoo")]
1526 provider: String,
1527
1528 #[arg(long)]
1530 ibkr_account: Option<String>,
1531
1532 #[arg(long)]
1534 ibkr_host: Option<String>,
1535
1536 #[arg(long)]
1538 ibkr_port: Option<u16>,
1539
1540 #[arg(long)]
1542 ibkr_client_id: Option<i32>,
1543
1544 #[arg(long)]
1546 ibkr_market_data_type: Option<i32>,
1547
1548 #[arg(long, default_value = "json")]
1550 format: String,
1551
1552 #[arg(long)]
1554 out: Option<PathBuf>,
1555}
1556
1557#[derive(clap::Args, Debug)]
1558struct FinanceSyncArgs {
1559 #[arg(long, value_delimiter = ',')]
1561 sources: Vec<String>,
1562
1563 #[arg(long)]
1565 max_pages: Option<usize>,
1566
1567 #[arg(long)]
1569 strict: bool,
1570
1571 #[arg(long)]
1573 include_sports: bool,
1574
1575 #[arg(long, hide = true)]
1577 include_historical: bool,
1578
1579 #[arg(long)]
1581 stream_refresh: bool,
1582
1583 #[arg(long, hide = true)]
1585 refresh_heartbeat_hours: Option<u64>,
1586
1587 #[arg(long, hide = true)]
1589 stream_refresh_timeout_secs: Option<u64>,
1590
1591 #[arg(long)]
1593 cache_dir: Option<PathBuf>,
1594
1595 #[arg(long, default_value = "json", hide = true)]
1597 format: String,
1598
1599 #[arg(long, hide = true)]
1601 full: bool,
1602
1603 #[arg(long = "policy-file", hide = true)]
1605 policy_file: Option<PathBuf>,
1606
1607 #[arg(long = "policy-mode", default_value = "observe", hide = true)]
1609 policy_mode: String,
1610
1611 #[arg(long)]
1613 out: Option<PathBuf>,
1614}
1615
1616#[derive(clap::Args, Debug)]
1617struct FinancePaperArgs {
1618 #[arg(long, value_enum, default_value = "trade")]
1620 command: FinancePaperCommandArg,
1621
1622 #[arg(long, value_enum, default_value = "simulated")]
1624 mode: FinancePaperModeArg,
1625
1626 #[arg(long, default_value = "default")]
1628 account: String,
1629
1630 #[arg(long)]
1632 provider: Option<String>,
1633
1634 #[arg(long)]
1636 market: Option<String>,
1637
1638 #[arg(long, value_enum)]
1640 side: Option<FinancePaperSideArg>,
1641
1642 #[arg(long, value_enum)]
1644 action: Option<FinancePaperOrderActionArg>,
1645
1646 #[arg(long)]
1648 qty: Option<f64>,
1649
1650 #[arg(long)]
1652 price: Option<f64>,
1653
1654 #[arg(long)]
1656 starting_cash: Option<f64>,
1657
1658 #[arg(long)]
1660 limit: Option<usize>,
1661
1662 #[arg(long)]
1664 cache_dir: Option<PathBuf>,
1665
1666 #[arg(long, default_value = "json")]
1668 format: String,
1669
1670 #[arg(long)]
1672 out: Option<PathBuf>,
1673}
1674
1675#[derive(clap::Args, Debug)]
1676struct FinanceFilingsArgs {
1677 #[arg(long, visible_alias = "tickers")]
1679 ticker: String,
1680
1681 #[arg(long, value_delimiter = ',')]
1683 forms: Vec<String>,
1684
1685 #[arg(long, default_value_t = 5)]
1687 limit: usize,
1688
1689 #[arg(long)]
1691 include_text: bool,
1692
1693 #[arg(long)]
1695 max_chars: Option<usize>,
1696
1697 #[arg(long)]
1699 cache_dir: Option<PathBuf>,
1700
1701 #[arg(long, default_value = "json")]
1703 format: String,
1704
1705 #[arg(long)]
1707 out: Option<PathBuf>,
1708}
1709
1710#[derive(clap::Args, Debug)]
1711struct FinanceTimeseriesArgs {
1712 #[arg(long)]
1715 preset: Option<String>,
1716
1717 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1719 tickers: Vec<String>,
1720
1721 #[arg(long)]
1723 tickers_file: Option<PathBuf>,
1724
1725 #[arg(long, default_value = "1y")]
1727 range: String,
1728
1729 #[arg(long, default_value = "1d")]
1731 granularity: String,
1732
1733 #[arg(long)]
1735 start: Option<String>,
1736
1737 #[arg(long)]
1739 end: Option<String>,
1740
1741 #[arg(long)]
1743 as_of: Option<String>,
1744
1745 #[arg(long, default_value = "auto")]
1747 provider: String,
1748
1749 #[arg(long)]
1751 ibkr_account: Option<String>,
1752
1753 #[arg(long)]
1755 ibkr_host: Option<String>,
1756
1757 #[arg(long)]
1759 ibkr_port: Option<u16>,
1760
1761 #[arg(long)]
1763 ibkr_client_id: Option<i32>,
1764
1765 #[arg(long)]
1767 ibkr_market_data_type: Option<i32>,
1768
1769 #[arg(long)]
1771 odds_provider: Option<String>,
1772
1773 #[arg(long)]
1775 odds_market: Option<String>,
1776
1777 #[arg(long, default_value = "yes")]
1779 odds_side: String,
1780
1781 #[arg(long)]
1783 max_points_per_ticker: Option<usize>,
1784
1785 #[arg(long)]
1787 cache_dir: Option<PathBuf>,
1788
1789 #[arg(long, default_value = "json")]
1791 format: String,
1792
1793 #[arg(long)]
1795 out: Option<PathBuf>,
1796}
1797
1798#[derive(clap::Args, Debug)]
1799struct FinanceIbkrArgs {
1800 #[arg(long, value_enum)]
1802 command: FinanceIbkrCommandArg,
1803
1804 #[arg(long)]
1806 account: Option<String>,
1807
1808 #[arg(long)]
1810 host: Option<String>,
1811
1812 #[arg(long)]
1814 port: Option<u16>,
1815
1816 #[arg(long)]
1818 client_id: Option<i32>,
1819
1820 #[arg(long)]
1822 market_data_type: Option<i32>,
1823
1824 #[arg(long)]
1826 timeout_secs: Option<u64>,
1827
1828 #[arg(long, value_delimiter = ',')]
1830 tickers: Vec<String>,
1831
1832 #[arg(long, default_value = "1mo")]
1834 range: String,
1835
1836 #[arg(long, default_value = "1day")]
1838 granularity: String,
1839
1840 #[arg(long)]
1842 symbol: Option<String>,
1843
1844 #[arg(long)]
1846 sec_type: Option<String>,
1847
1848 #[arg(long)]
1850 exchange: Option<String>,
1851
1852 #[arg(long)]
1854 primary_exchange: Option<String>,
1855
1856 #[arg(long)]
1858 currency: Option<String>,
1859
1860 #[arg(long)]
1862 expiry: Option<String>,
1863
1864 #[arg(long)]
1866 strike: Option<f64>,
1867
1868 #[arg(long)]
1870 right: Option<String>,
1871
1872 #[arg(long)]
1874 multiplier: Option<String>,
1875
1876 #[arg(long)]
1878 trading_class: Option<String>,
1879
1880 #[arg(long)]
1882 side: Option<String>,
1883
1884 #[arg(long)]
1886 order_type: Option<String>,
1887
1888 #[arg(long)]
1890 quantity: Option<f64>,
1891
1892 #[arg(long)]
1894 limit_price: Option<f64>,
1895
1896 #[arg(long)]
1898 stop_price: Option<f64>,
1899
1900 #[arg(long)]
1902 tif: Option<String>,
1903
1904 #[arg(long)]
1906 order_id: Option<i32>,
1907
1908 #[arg(long)]
1910 tags: Option<String>,
1911
1912 #[arg(long, default_value = "json")]
1914 format: String,
1915
1916 #[arg(long)]
1918 out: Option<PathBuf>,
1919}