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 = "cloudflare")]
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(Subcommand, Debug)]
126enum FinanceCommand {
127 Timeseries(FinanceTimeseriesArgs),
129 Movers(FinanceMoversArgs),
131 Fundamentals(FinanceFundamentalsArgs),
133 Search(FinanceSearchArgs),
135 Filings(FinanceFilingsArgs),
137 Sec(FinanceFilingsArgs),
139 Schedule(FinanceScheduleArgs),
141 RatePath(FinanceRatePathArgs),
143 Odds(FinanceOddsArgs),
145 Options(FinanceOptionsArgs),
147 Sync(FinanceSyncArgs),
149 Paper(FinancePaperArgs),
151 Ibkr(FinanceIbkrArgs),
153 Auctions(FinanceAuctionsArgs),
155 Cot(FinanceCotArgs),
157 Curve(FinanceCurveArgs),
159 Nyfed(FinanceNyfedArgs),
161 #[command(name = "volatility", visible_alias = "volsurface")]
163 Volsurface(FinanceVolsurfaceArgs),
164 Stress(FinanceStressArgs),
166 Fiscal(FinanceFiscalArgs),
168 Ecb(FinanceEcbArgs),
170 Eia(FinanceEiaArgs),
172 Bis(FinanceBisArgs),
174 Boj(FinanceBojArgs),
176 Boe(FinanceBoeArgs),
178}
179
180#[derive(Subcommand, Debug)]
181enum WebCommand {
182 Crawl(WebCrawlArgs),
184 Search(WebSearchArgs),
186 Read(WebReadArgs),
188 Extract(WebExtractArgs),
190}
191
192#[derive(Subcommand, Debug)]
193enum AgentCommand {
194 Report(AgentReportArgs),
196 Run(AgentRunArgs),
198 Fanout(AgentFanoutArgs),
200 Swarm(AgentSwarmArgs),
202 Critique(AgentModeArgs),
204 Evidence(AgentModeArgs),
206 Compete(AgentModeArgs),
208 Debate(AgentModeArgs),
210}
211
212#[derive(Subcommand, Debug)]
213enum SentinelCommand {
214 Start(SentinelStartArgs),
216 Stop(SentinelStopArgs),
218 Status(SentinelStatusArgs),
220 Subscribe(SentinelSubscribeArgs),
222 Unsubscribe(SentinelUnsubscribeArgs),
224 List(SentinelListArgs),
226 Test(SentinelTestArgs),
228 Replay(SentinelReplayArgs),
230 #[command(hide = true)]
232 DaemonRun(SentinelDaemonRunArgs),
233}
234
235#[derive(Debug, Serialize)]
236struct RustFileSummary {
237 items_total: usize,
238 functions: usize,
239 function_names: Vec<String>,
240 function_signatures: Vec<String>,
243 structs: usize,
244 struct_names: Vec<String>,
245 struct_fields: std::collections::BTreeMap<String, Vec<String>>,
247 enums: usize,
248 enum_names: Vec<String>,
249 impls: usize,
250 impl_targets: Vec<String>,
251 impl_methods: std::collections::BTreeMap<String, Vec<String>>,
253 traits: usize,
254 trait_names: Vec<String>,
255 modules: usize,
256 module_names: Vec<String>,
257 uses: usize,
258 use_paths: Vec<String>,
259 consts: usize,
260 const_names: Vec<String>,
261 statics: usize,
262 type_aliases: usize,
263 type_alias_names: Vec<String>,
264 macros: usize,
265 others: usize,
266}
267
268#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
269enum CrawlViewMode {
270 Summary,
271 Raw,
272 Path,
273}
274
275#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
276enum CrawlSaveMode {
277 Auto,
278 Off,
279}
280
281#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
282enum WebSearchModeArg {
283 Auto,
284 News,
285 Finance,
286 Research,
287 Tech,
288 Encyclopedia,
289}
290
291#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
292enum WebSearchRecencyArg {
293 Day,
294 Week,
295 Month,
296 Year,
297}
298
299#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
300enum FinancePaperCommandArg {
301 Trade,
302 Positions,
303 Trades,
304 Mark,
305 Reset,
306}
307
308#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
309enum FinancePaperModeArg {
310 Simulated,
311 #[value(alias = "live_like")]
312 LiveLike,
313 #[value(alias = "kalshi_demo")]
314 KalshiDemo,
315 #[value(alias = "polymarket_demo")]
316 PolymarketDemo,
317}
318
319#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
320enum FinancePaperSideArg {
321 Yes,
322 No,
323}
324
325#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
326enum FinancePaperOrderActionArg {
327 Buy,
328 Sell,
329}
330
331#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
332enum FinanceIbkrCommandArg {
333 Snapshot,
334 Timeseries,
335 AccountSummary,
336 Positions,
337 Portfolio,
338 OpenOrders,
339 PlaceOrder,
340 CancelOrder,
341}
342
343#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
344enum SentinelSeverityArg {
345 Low,
346 Medium,
347 High,
348 Critical,
349}
350
351#[derive(Copy, Clone, Debug, ValueEnum, Eq, PartialEq)]
352enum SentinelSpawnTargetArg {
353 Default,
354 Codex,
355 Claude,
356 Gemini,
357 Both,
358}
359
360#[derive(clap::Args, Debug)]
361struct SentinelPathArgs {
362 #[arg(long = "sentinel-dir")]
364 sentinel_dir: Option<PathBuf>,
365
366 #[arg(long = "queue-file")]
368 queue_file: Option<PathBuf>,
369
370 #[arg(long = "packets-file")]
372 packets_file: Option<PathBuf>,
373}
374
375#[derive(clap::Args, Debug)]
376struct SentinelStartArgs {
377 #[command(flatten)]
378 paths: SentinelPathArgs,
379
380 #[arg(long = "interval-secs", default_value_t = 15)]
382 interval_secs: u64,
383}
384
385#[derive(clap::Args, Debug)]
386struct SentinelStopArgs {
387 #[command(flatten)]
388 paths: SentinelPathArgs,
389}
390
391#[derive(clap::Args, Debug)]
392struct SentinelStatusArgs {
393 #[command(flatten)]
394 paths: SentinelPathArgs,
395}
396
397#[derive(clap::Args, Debug)]
398struct SentinelSubscribeArgs {
399 #[command(flatten)]
400 paths: SentinelPathArgs,
401
402 #[arg(long)]
404 name: String,
405
406 #[arg(long)]
409 title: Option<String>,
410
411 #[arg(long = "source-report")]
413 source_report_title: Option<String>,
414
415 #[arg(long = "source-date")]
417 source_report_date: Option<String>,
418
419 #[arg(long = "source-file")]
421 source_report_file: Option<String>,
422
423 #[arg(long = "source-evidence")]
425 source_evidence: Option<String>,
426
427 #[arg(long)]
430 expr: Option<String>,
431
432 #[arg(long = "var")]
434 vars: Vec<String>,
435
436 #[arg(long = "why")]
438 why: Option<String>,
439
440 #[arg(long = "prompt-template")]
442 prompt_template: Option<String>,
443
444 #[arg(long, value_enum, default_value = "medium")]
446 severity: SentinelSeverityArg,
447
448 #[arg(long = "cooldown-secs", default_value_t = 300)]
450 cooldown_secs: u64,
451
452 #[arg(long, default_value_t = true)]
454 enabled: bool,
455
456 #[arg(long = "spawn-agent", default_value_t = false)]
458 spawn_agent: bool,
459
460 #[arg(long = "spawn-target", value_enum, default_value = "default")]
462 spawn_target: SentinelSpawnTargetArg,
463
464 #[arg(long = "spawn-cooldown-secs", default_value_t = 14400, hide = true)]
467 spawn_cooldown_secs: u64,
468
469 #[arg(long = "prediction")]
472 prediction: Option<String>,
473
474 #[arg(long = "target-var")]
476 target_var: Option<String>,
477
478 #[arg(long = "target-value")]
480 target_value: Option<f64>,
481
482 #[arg(long = "deadline")]
485 deadline: Option<String>,
486
487 #[arg(long = "fire-at")]
491 fire_at: Option<String>,
492}
493
494#[derive(clap::Args, Debug)]
495struct SentinelUnsubscribeArgs {
496 #[command(flatten)]
497 paths: SentinelPathArgs,
498
499 #[arg(long = "id")]
501 id_or_name: String,
502}
503
504#[derive(clap::Args, Debug)]
505struct SentinelListArgs {
506 #[command(flatten)]
507 paths: SentinelPathArgs,
508}
509
510#[derive(clap::Args, Debug)]
511struct SentinelTestArgs {
512 #[command(flatten)]
513 paths: SentinelPathArgs,
514
515 #[arg(long, default_value = "generic")]
517 scenario: String,
518}
519
520#[derive(clap::Args, Debug)]
521struct SentinelReplayArgs {
522 #[command(flatten)]
523 paths: SentinelPathArgs,
524
525 #[arg(long = "max-lines", default_value_t = 50)]
527 max_lines: usize,
528}
529
530#[derive(clap::Args, Debug)]
531struct SentinelDaemonRunArgs {
532 #[command(flatten)]
533 paths: SentinelPathArgs,
534
535 #[arg(long = "interval-secs", default_value_t = 15)]
537 interval_secs: u64,
538}
539
540#[derive(clap::Args, Debug)]
541struct AgentReportArgs {
542 #[arg(long)]
544 prompt: Option<String>,
545
546 #[arg(
548 long,
549 value_delimiter = ',',
550 default_value = "SPY,QQQ,IWM,DIA,^VIX,BTC-USD,ETH-USD,SOL-USD,DX-Y.NYB,GC=F,CL=F"
551 )]
552 tickers: Vec<String>,
553
554 #[arg(long, default_value = "14d")]
556 lookback: String,
557
558 #[arg(long, default_value = "1h")]
560 granularity: String,
561
562 #[arg(long = "lock-minutes", conflicts_with = "as_of")]
564 lock_minutes: Option<u64>,
565
566 #[arg(long = "as-of", conflicts_with = "lock_minutes")]
568 as_of: Option<String>,
569
570 #[arg(
572 long,
573 value_delimiter = ',',
574 default_value = "recession,fed,inflation,iran,oil,china,taiwan"
575 )]
576 odds_queries: Vec<String>,
577
578 #[arg(long, default_value_t = 8)]
580 top: usize,
581
582 #[arg(
584 long,
585 value_delimiter = ',',
586 default_value = "stock market today,treasury yields today,fed policy outlook,oil geopolitical risk"
587 )]
588 web_queries: Vec<String>,
589
590 #[arg(long = "max-ms", default_value_t = 45000)]
592 max_ms: u64,
593
594 #[arg(long = "fallback-models", value_delimiter = ',')]
596 fallback_models: Vec<String>,
597
598 #[arg(long = "html-out")]
600 html_out: Option<PathBuf>,
601
602 #[arg(long)]
604 out: Option<PathBuf>,
605}
606
607#[derive(clap::Args, Debug)]
608struct AgentRunArgs {
609 #[arg(long)]
611 task: String,
612
613 #[arg(long)]
615 out: Option<PathBuf>,
616
617 #[arg(long = "fallback-models", value_delimiter = ',')]
619 fallback_models: Vec<String>,
620
621 #[arg(long = "max-ms", default_value_t = 45000)]
623 max_ms: u64,
624
625 #[arg(long = "max-attempts", default_value_t = 4)]
627 max_attempts: usize,
628
629 #[arg(long = "must-cite", value_delimiter = ',')]
631 must_cite: Vec<String>,
632}
633
634#[derive(clap::Args, Debug)]
635struct AgentFanoutArgs {
636 #[arg(long = "task-template")]
638 task_template: String,
639
640 #[arg(long)]
642 vars: PathBuf,
643
644 #[arg(long = "shared-manifest")]
646 shared_manifest: Option<PathBuf>,
647
648 #[arg(long, default_value = "4")]
650 max_parallel: usize,
651
652 #[arg(long)]
654 out: Option<PathBuf>,
655
656 #[arg(long = "fallback-models", value_delimiter = ',')]
658 fallback_models: Vec<String>,
659
660 #[arg(long = "max-ms", default_value_t = 45000)]
662 max_ms: u64,
663
664 #[arg(long = "max-attempts", default_value_t = 4)]
666 max_attempts: usize,
667
668 #[arg(long = "must-cite", value_delimiter = ',')]
670 must_cite: Vec<String>,
671}
672
673#[derive(clap::Args, Debug)]
674struct AgentSwarmArgs {
675 #[arg(long)]
677 task: String,
678
679 #[arg(long)]
681 input: PathBuf,
682
683 #[arg(long)]
685 chunks: Option<usize>,
686
687 #[arg(long = "chunk-chars", default_value_t = 20_000)]
689 chunk_chars: usize,
690
691 #[arg(long = "overlap-chars", default_value_t = 500)]
693 overlap_chars: usize,
694
695 #[arg(long = "max-chunks", default_value_t = 64)]
697 max_chunks: usize,
698
699 #[arg(long, default_value = "4")]
701 max_parallel: usize,
702
703 #[arg(long)]
705 out: Option<PathBuf>,
706
707 #[arg(long = "fallback-models", value_delimiter = ',')]
709 fallback_models: Vec<String>,
710
711 #[arg(long = "max-ms", default_value_t = 120_000)]
713 max_ms: u64,
714
715 #[arg(long = "max-attempts", default_value_t = 4)]
717 max_attempts: usize,
718
719 #[arg(long = "must-cite", value_delimiter = ',')]
721 must_cite: Vec<String>,
722}
723
724#[derive(clap::Args, Debug)]
725struct AgentModeArgs {
726 #[arg(long)]
728 prompt: String,
729
730 #[arg(long)]
732 lead: Option<PathBuf>,
733
734 #[arg(long)]
736 vars: PathBuf,
737
738 #[arg(long = "shared-manifest")]
740 shared_manifest: Option<PathBuf>,
741
742 #[arg(long, default_value_t = false)]
744 allow_cheat: bool,
745
746 #[arg(long, default_value = "4")]
748 max_parallel: usize,
749
750 #[arg(long)]
752 out: Option<PathBuf>,
753
754 #[arg(long = "fallback-models", value_delimiter = ',')]
756 fallback_models: Vec<String>,
757
758 #[arg(long = "max-ms", default_value_t = 120_000)]
760 max_ms: u64,
761
762 #[arg(long = "max-attempts", default_value_t = 2)]
764 max_attempts: usize,
765
766 #[arg(long = "must-cite", value_delimiter = ',')]
768 must_cite: Vec<String>,
769}
770
771#[derive(clap::Args, Debug)]
772struct CodeArgs {
773 path: PathBuf,
775
776 #[arg(long, default_value_t = false)]
778 generate: bool,
779
780 #[arg(long, default_value_t = 0)]
782 min_loc: usize,
783
784 #[arg(long)]
786 max_files: Option<usize>,
787
788 #[arg(long)]
790 workers: Option<usize>,
791
792 #[arg(long, default_value_t = 20)]
794 top: usize,
795
796 #[arg(long, default_value_t = false)]
798 include_files: bool,
799
800 #[arg(long, value_delimiter = ',')]
804 find: Vec<String>,
805
806 #[arg(long, default_value_t = false)]
811 pub_api: bool,
812
813 #[arg(long)]
815 out: Option<PathBuf>,
816}
817
818#[derive(clap::Args, Debug)]
819struct WebCrawlArgs {
820 #[arg(long)]
822 url: String,
823
824 #[arg(long, default_value = "50")]
826 max_pages: usize,
827
828 #[arg(long, default_value = "true")]
830 respect_robots: bool,
831
832 #[arg(long, default_value = "false")]
834 subdomains: bool,
835
836 #[arg(long, default_value = "false")]
838 sitemap: bool,
839
840 #[arg(long, default_value = "false", conflicts_with = "sitemap")]
842 smart: bool,
843
844 #[arg(long, value_enum, default_value_t = CrawlViewMode::Summary)]
846 view: CrawlViewMode,
847
848 #[arg(long, value_enum, default_value_t = CrawlSaveMode::Auto)]
850 save: CrawlSaveMode,
851
852 #[arg(long)]
854 out: Option<PathBuf>,
855}
856
857#[derive(clap::Args, Debug)]
858struct WebSearchArgs {
859 #[arg(long)]
861 query: String,
862
863 #[arg(long, value_enum, default_value_t = WebSearchModeArg::Auto)]
865 mode: WebSearchModeArg,
866
867 #[arg(long, value_delimiter = ',')]
869 domains: Vec<String>,
870
871 #[arg(long = "exclude-domains", value_delimiter = ',')]
873 exclude_domains: Vec<String>,
874
875 #[arg(long, value_enum)]
877 recency: Option<WebSearchRecencyArg>,
878
879 #[arg(long)]
881 since: Option<String>,
882
883 #[arg(long)]
885 until: Option<String>,
886
887 #[arg(long, default_value_t = 15)]
889 top: usize,
890
891 #[arg(long = "probe-top", default_value_t = 4)]
893 probe_top: usize,
894
895 #[arg(long = "max-parallel", default_value_t = 6)]
897 max_parallel: usize,
898
899 #[arg(long = "track-key")]
901 track_key: Option<String>,
902
903 #[arg(long, default_value_t = false)]
905 full: bool,
906
907 #[arg(long)]
909 out: Option<PathBuf>,
910}
911
912#[derive(clap::Args, Debug)]
913struct WebReadArgs {
914 #[arg(long = "url", value_delimiter = ',')]
916 url: Vec<String>,
917
918 #[arg(long = "urls-file")]
920 urls_file: Option<PathBuf>,
921
922 #[arg(long = "max-parallel", default_value_t = 6)]
924 max_parallel: usize,
925
926 #[arg(long = "max-chars", default_value_t = 2400)]
928 max_chars: usize,
929
930 #[arg(long, default_value_t = false)]
932 full: bool,
933
934 #[arg(long)]
936 out: Option<PathBuf>,
937}
938
939#[derive(clap::Args, Debug)]
940struct WebExtractArgs {
941 #[arg(long)]
943 url: Option<String>,
944
945 #[arg(long)]
947 file: Option<PathBuf>,
948
949 #[arg(long)]
951 text: Option<String>,
952
953 #[arg(long, default_value = "10")]
955 bullets: usize,
956
957 #[arg(long)]
959 focus: Option<String>,
960
961 #[arg(long)]
963 out: Option<PathBuf>,
964}
965
966#[derive(clap::Args, Debug)]
967pub struct FinanceScheduleArgs {
968 #[arg(long, default_value = "all")]
970 pub kind: String,
971 #[arg(long)]
973 pub date: Option<String>,
974 #[arg(long = "from")]
976 pub from: Option<String>,
977 #[arg(long = "to")]
979 pub to: Option<String>,
980 #[arg(long, visible_alias = "tickers", value_delimiter = ',')]
982 pub ticker: Vec<String>,
983 #[arg(long, default_value_t = false)]
985 pub major: bool,
986 #[arg(long = "min-cap")]
988 pub min_cap: Option<String>,
989 #[arg(long)]
991 pub time: Option<String>,
992 #[arg(long = "macro-profile", default_value = "market")]
994 pub macro_profile: String,
995 #[arg(long, default_value = "json")]
997 pub format: String,
998 #[arg(long)]
1000 pub out: Option<PathBuf>,
1001}
1002
1003#[derive(clap::Args, Debug)]
1004pub struct FinanceRatePathArgs {
1005 #[arg(long)]
1007 pub cache_dir: Option<PathBuf>,
1008 #[arg(long, default_value = "auto", hide = true)]
1012 pub source_mode: String,
1013 #[arg(long, default_value = "json")]
1015 pub format: String,
1016 #[arg(long)]
1018 pub out: Option<PathBuf>,
1019}
1020
1021#[derive(clap::Args, Debug)]
1022pub struct FinanceAuctionsArgs {
1023 #[arg(long, default_value = "all")]
1025 pub security_type: String,
1026 #[arg(long, default_value_t = 50)]
1028 pub limit: usize,
1029 #[arg(long, default_value = "json")]
1031 pub format: String,
1032 #[arg(long)]
1034 pub out: Option<PathBuf>,
1035}
1036
1037#[derive(clap::Args, Debug)]
1038pub struct FinanceCotArgs {
1039 #[arg(long)]
1041 pub query: Option<String>,
1042 #[arg(long, default_value_t = 12)]
1044 pub weeks: usize,
1045 #[arg(long, default_value = "auto")]
1047 pub report: String,
1048 #[arg(long)]
1050 pub limit: Option<usize>,
1051 #[arg(long, default_value = "json")]
1053 pub format: String,
1054 #[arg(long)]
1056 pub out: Option<PathBuf>,
1057}
1058
1059#[derive(clap::Args, Debug)]
1060pub struct FinanceCurveArgs {
1061 #[arg(long)]
1063 pub commodity: Option<String>,
1064 #[arg(long, default_value_t = 12)]
1066 pub months: usize,
1067 #[arg(long, default_value_t = false)]
1069 pub list: bool,
1070 #[arg(long)]
1072 pub out: Option<PathBuf>,
1073}
1074
1075#[derive(clap::Args, Debug)]
1076pub struct FinanceNyfedArgs {
1077 #[arg(long, default_value = "rates")]
1079 pub kind: String,
1080 #[arg(long, default_value = "json")]
1081 pub format: String,
1082 #[arg(long)]
1083 pub out: Option<PathBuf>,
1084}
1085
1086#[derive(clap::Args, Debug)]
1087pub struct FinanceVolsurfaceArgs {
1088 #[arg(long)]
1090 pub symbols: Option<String>,
1091 #[arg(long)]
1093 pub history: Option<usize>,
1094 #[arg(long, default_value = "json")]
1095 pub format: String,
1096 #[arg(long)]
1097 pub out: Option<PathBuf>,
1098}
1099
1100#[derive(clap::Args, Debug)]
1101pub struct FinanceStressArgs {
1102 #[arg(long, default_value_t = 30)]
1104 pub range: usize,
1105 #[arg(long, default_value = "json")]
1106 pub format: String,
1107 #[arg(long)]
1108 pub out: Option<PathBuf>,
1109}
1110
1111#[derive(clap::Args, Debug)]
1112pub struct FinanceFiscalArgs {
1113 #[arg(long, default_value = "debt")]
1115 pub kind: String,
1116 #[arg(long, default_value = "json")]
1117 pub format: String,
1118 #[arg(long)]
1119 pub out: Option<PathBuf>,
1120}
1121
1122#[derive(clap::Args, Debug)]
1123pub struct FinanceEcbArgs {
1124 #[arg(long)]
1126 pub preset: Option<String>,
1127 #[arg(long)]
1129 pub dataset: Option<String>,
1130 #[arg(long)]
1132 pub key: Option<String>,
1133 #[arg(long, default_value = "2025-01-01")]
1135 pub start: String,
1136 #[arg(long)]
1138 pub end: Option<String>,
1139 #[arg(long, default_value = "json")]
1140 pub format: String,
1141 #[arg(long)]
1142 pub out: Option<PathBuf>,
1143}
1144
1145#[derive(clap::Args, Debug)]
1146pub struct FinanceEiaArgs {
1147 #[arg(long)]
1149 pub preset: Option<String>,
1150 #[arg(long)]
1152 pub route: Option<String>,
1153 #[arg(long)]
1155 pub start: Option<String>,
1156 #[arg(long, default_value = "52")]
1158 pub length: usize,
1159 #[arg(long, default_value = "json")]
1160 pub format: String,
1161 #[arg(long)]
1162 pub out: Option<PathBuf>,
1163}
1164
1165#[derive(clap::Args, Debug)]
1166pub struct FinanceBisArgs {
1167 #[arg(long)]
1169 pub preset: Option<String>,
1170 #[arg(long)]
1172 pub dataset: Option<String>,
1173 #[arg(long)]
1175 pub key: Option<String>,
1176 #[arg(long)]
1178 pub countries: Option<String>,
1179 #[arg(long, default_value = "2020-01")]
1181 pub start: String,
1182 #[arg(long, default_value = "json")]
1183 pub format: String,
1184 #[arg(long)]
1185 pub out: Option<PathBuf>,
1186}
1187
1188#[derive(clap::Args, Debug)]
1189pub struct FinanceBojArgs {
1190 #[arg(long)]
1192 pub preset: Option<String>,
1193 #[arg(long)]
1195 pub db: Option<String>,
1196 #[arg(long)]
1198 pub codes: Option<String>,
1199 #[arg(long, default_value = "202401")]
1201 pub start: String,
1202 #[arg(long, default_value = "json")]
1203 pub format: String,
1204 #[arg(long)]
1205 pub out: Option<PathBuf>,
1206}
1207
1208#[derive(clap::Args, Debug)]
1209pub struct FinanceBoeArgs {
1210 #[arg(long)]
1212 pub preset: Option<String>,
1213 #[arg(long)]
1215 pub codes: Option<String>,
1216 #[arg(long, default_value = "01/Jan/2025")]
1218 pub start: String,
1219 #[arg(long, default_value = "now")]
1221 pub end: String,
1222 #[arg(long, default_value = "json")]
1223 pub format: String,
1224 #[arg(long)]
1225 pub out: Option<PathBuf>,
1226}
1227
1228#[derive(clap::Args, Debug)]
1229struct FinanceFundamentalsArgs {
1230 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1232 tickers: Vec<String>,
1233
1234 #[arg(long, default_value = "json")]
1236 format: String,
1237
1238 #[arg(long)]
1240 out: Option<PathBuf>,
1241}
1242
1243#[derive(clap::Args, Debug)]
1244struct FinanceMoversArgs {
1245 #[arg(long, default_value = "day_movers")]
1248 universe: String,
1249
1250 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1252 tickers: Vec<String>,
1253
1254 #[arg(long, default_value = "both")]
1256 direction: String,
1257
1258 #[arg(long, default_value = "value_change")]
1260 sort_by: String,
1261
1262 #[arg(long, default_value = "auto")]
1264 provider: String,
1265
1266 #[arg(long)]
1268 min_market_cap: Option<String>,
1269
1270 #[arg(long)]
1272 max_market_cap: Option<String>,
1273
1274 #[arg(long, default_value_t = 0.0)]
1276 min_change_pct: f64,
1277
1278 #[arg(long, default_value_t = 5.0)]
1280 min_price: f64,
1281
1282 #[arg(long)]
1284 min_volume: Option<u64>,
1285
1286 #[arg(long)]
1288 sector: Option<String>,
1289
1290 #[arg(long)]
1292 industry: Option<String>,
1293
1294 #[arg(long, default_value_t = 25)]
1296 limit: usize,
1297
1298 #[arg(long, default_value_t = 100)]
1300 scan_limit: usize,
1301
1302 #[arg(long)]
1304 ibkr_account: Option<String>,
1305
1306 #[arg(long)]
1308 ibkr_host: Option<String>,
1309
1310 #[arg(long)]
1312 ibkr_port: Option<u16>,
1313
1314 #[arg(long)]
1316 ibkr_client_id: Option<i32>,
1317
1318 #[arg(long)]
1320 ibkr_market_data_type: Option<i32>,
1321
1322 #[arg(long)]
1324 ibkr_timeout_secs: Option<u64>,
1325
1326 #[arg(long, default_value = "json")]
1328 format: String,
1329
1330 #[arg(long)]
1332 out: Option<PathBuf>,
1333
1334 #[arg(long, default_value_t = false)]
1336 include_extended_hours: bool,
1337}
1338
1339#[derive(clap::Args, Debug)]
1340struct FinanceSearchArgs {
1341 #[arg(long, required = false)]
1343 query: Option<String>,
1344
1345 #[arg(index = 1, required = false)]
1347 query_positional: Option<String>,
1348
1349 #[arg(long, default_value = "yahoo")]
1351 provider: String,
1352
1353 #[arg(long)]
1355 ibkr_account: Option<String>,
1356
1357 #[arg(long)]
1359 ibkr_host: Option<String>,
1360
1361 #[arg(long)]
1363 ibkr_port: Option<u16>,
1364
1365 #[arg(long)]
1367 ibkr_client_id: Option<i32>,
1368
1369 #[arg(long)]
1371 ibkr_market_data_type: Option<i32>,
1372
1373 #[arg(long, default_value = "json")]
1375 format: String,
1376
1377 #[arg(long = "policy-file")]
1379 policy_file: Option<PathBuf>,
1380
1381 #[arg(long = "policy-mode", default_value = "observe")]
1383 policy_mode: String,
1384
1385 #[arg(long)]
1387 out: Option<PathBuf>,
1388}
1389
1390#[derive(clap::Args, Debug)]
1391struct FinanceOddsArgs {
1392 #[command(subcommand)]
1393 action: Option<FinanceOddsAction>,
1394
1395 #[arg(long)]
1397 provider: Option<String>,
1398 #[arg(long)]
1400 series: Option<String>,
1401
1402 #[arg(long)]
1404 event: Option<String>,
1405
1406 #[arg(long)]
1408 market: Option<String>,
1409
1410 #[arg(long)]
1412 status: Option<String>,
1413
1414 #[arg(long)]
1416 limit: Option<usize>,
1417
1418 #[arg(long)]
1420 cursor: Option<String>,
1421
1422 #[arg(long)]
1424 max_pages: Option<usize>,
1425
1426 #[arg(long)]
1428 list_series: bool,
1429
1430 #[arg(long)]
1432 list_events: bool,
1433
1434 #[arg(long)]
1436 list_markets: bool,
1437
1438 #[arg(long)]
1440 list_tags: bool,
1441
1442 #[arg(long)]
1444 category: Option<String>,
1445
1446 #[arg(long, alias = "query")]
1448 search: Option<String>,
1449
1450 #[arg(long)]
1452 country: Option<String>,
1453
1454 #[arg(long = "min-volume")]
1456 min_volume: Option<f64>,
1457
1458 #[arg(long)]
1460 top: Option<usize>,
1461
1462 #[arg(long = "sort-by", default_value = "relevance")]
1465 sort_by: String,
1466 #[arg(long, default_value = "auto")]
1468 profile: String,
1469
1470 #[arg(long = "policy-file")]
1472 policy_file: Option<PathBuf>,
1473
1474 #[arg(long = "policy-mode", default_value = "observe")]
1476 policy_mode: String,
1477
1478 #[arg(long, default_value_t = false)]
1480 deltas_only: bool,
1481
1482 #[arg(long = "min-delta-pp")]
1485 min_delta_pp: Option<f64>,
1486
1487 #[arg(long, default_value_t = false)]
1489 explain: bool,
1490
1491 #[arg(long, default_value_t = false)]
1493 live: bool,
1494
1495 #[arg(long, default_value_t = false)]
1497 include_mentions: bool,
1498
1499 #[arg(long)]
1501 orderbook: bool,
1502
1503 #[arg(long)]
1505 depth: Option<usize>,
1506
1507 #[arg(long, default_value = "json")]
1509 format: String,
1510
1511 #[arg(long)]
1513 out: Option<PathBuf>,
1514}
1515
1516#[derive(Subcommand, Debug)]
1517enum FinanceOddsAction {
1518 Sync(FinanceSyncArgs),
1520
1521 Where(FinanceOddsWhereArgs),
1523}
1524
1525#[derive(clap::Args, Debug)]
1526struct FinanceOddsWhereArgs {
1527 #[arg(long)]
1529 cache_dir: Option<PathBuf>,
1530}
1531
1532#[derive(clap::Args, Debug)]
1533struct FinanceOptionsArgs {
1534 #[arg(long, visible_alias = "tickers")]
1536 ticker: String,
1537
1538 #[arg(long)]
1540 expiry: Option<String>,
1541
1542 #[arg(long = "target-dte")]
1544 target_dte: Option<i64>,
1545
1546 #[arg(long = "type", value_name = "calls|puts|both")]
1548 option_type: Option<String>,
1549
1550 #[arg(long = "near-money")]
1552 near_money: Option<f64>,
1553
1554 #[arg(long)]
1556 summary: bool,
1557
1558 #[arg(long)]
1560 expirations: bool,
1561
1562 #[arg(long)]
1565 all: bool,
1566
1567 #[arg(long, default_value = "yahoo")]
1569 provider: String,
1570
1571 #[arg(long)]
1573 ibkr_account: Option<String>,
1574
1575 #[arg(long)]
1577 ibkr_host: Option<String>,
1578
1579 #[arg(long)]
1581 ibkr_port: Option<u16>,
1582
1583 #[arg(long)]
1585 ibkr_client_id: Option<i32>,
1586
1587 #[arg(long)]
1589 ibkr_market_data_type: Option<i32>,
1590
1591 #[arg(long, default_value = "json")]
1593 format: String,
1594
1595 #[arg(long)]
1597 out: Option<PathBuf>,
1598}
1599
1600#[derive(clap::Args, Debug)]
1601struct FinanceSyncArgs {
1602 #[arg(long, value_delimiter = ',')]
1604 sources: Vec<String>,
1605
1606 #[arg(long)]
1608 max_pages: Option<usize>,
1609
1610 #[arg(long)]
1612 strict: bool,
1613
1614 #[arg(long)]
1616 include_sports: bool,
1617
1618 #[arg(long, hide = true)]
1620 include_historical: bool,
1621
1622 #[arg(long)]
1624 stream_refresh: bool,
1625
1626 #[arg(long, hide = true)]
1628 refresh_heartbeat_hours: Option<u64>,
1629
1630 #[arg(long, hide = true)]
1632 stream_refresh_timeout_secs: Option<u64>,
1633
1634 #[arg(long)]
1636 cache_dir: Option<PathBuf>,
1637
1638 #[arg(long, default_value = "json", hide = true)]
1640 format: String,
1641
1642 #[arg(long, hide = true)]
1644 full: bool,
1645
1646 #[arg(long = "policy-file", hide = true)]
1648 policy_file: Option<PathBuf>,
1649
1650 #[arg(long = "policy-mode", default_value = "observe", hide = true)]
1652 policy_mode: String,
1653
1654 #[arg(long)]
1656 out: Option<PathBuf>,
1657}
1658
1659#[derive(clap::Args, Debug)]
1660struct FinancePaperArgs {
1661 #[arg(long, value_enum, default_value = "trade")]
1663 command: FinancePaperCommandArg,
1664
1665 #[arg(long, value_enum, default_value = "simulated")]
1667 mode: FinancePaperModeArg,
1668
1669 #[arg(long, default_value = "default")]
1671 account: String,
1672
1673 #[arg(long)]
1675 provider: Option<String>,
1676
1677 #[arg(long)]
1679 market: Option<String>,
1680
1681 #[arg(long, value_enum)]
1683 side: Option<FinancePaperSideArg>,
1684
1685 #[arg(long, value_enum)]
1687 action: Option<FinancePaperOrderActionArg>,
1688
1689 #[arg(long)]
1691 qty: Option<f64>,
1692
1693 #[arg(long)]
1695 price: Option<f64>,
1696
1697 #[arg(long)]
1699 starting_cash: Option<f64>,
1700
1701 #[arg(long)]
1703 limit: Option<usize>,
1704
1705 #[arg(long)]
1707 cache_dir: Option<PathBuf>,
1708
1709 #[arg(long, default_value = "json")]
1711 format: String,
1712
1713 #[arg(long)]
1715 out: Option<PathBuf>,
1716}
1717
1718#[derive(clap::Args, Debug)]
1719struct FinanceFilingsArgs {
1720 #[arg(long, visible_alias = "tickers")]
1722 ticker: String,
1723
1724 #[arg(long, value_delimiter = ',')]
1726 forms: Vec<String>,
1727
1728 #[arg(long, default_value_t = 5)]
1730 limit: usize,
1731
1732 #[arg(long)]
1734 no_download: bool,
1735
1736 #[arg(long)]
1738 download_all: bool,
1739
1740 #[arg(long)]
1742 include_text: bool,
1743
1744 #[arg(long)]
1746 max_chars: Option<usize>,
1747
1748 #[arg(long)]
1750 user_agent: Option<String>,
1751
1752 #[arg(long)]
1754 cache_dir: Option<PathBuf>,
1755
1756 #[arg(long, default_value = "json")]
1758 format: String,
1759
1760 #[arg(long)]
1762 out: Option<PathBuf>,
1763}
1764
1765#[derive(clap::Args, Debug)]
1766struct FinanceTimeseriesArgs {
1767 #[arg(long)]
1770 preset: Option<String>,
1771
1772 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1774 tickers: Vec<String>,
1775
1776 #[arg(long)]
1778 tickers_file: Option<PathBuf>,
1779
1780 #[arg(long, default_value = "1y")]
1782 range: String,
1783
1784 #[arg(long, default_value = "1d")]
1786 granularity: String,
1787
1788 #[arg(long)]
1790 start: Option<String>,
1791
1792 #[arg(long)]
1794 end: Option<String>,
1795
1796 #[arg(long)]
1798 as_of: Option<String>,
1799
1800 #[arg(long, default_value = "auto")]
1802 provider: String,
1803
1804 #[arg(long)]
1806 ibkr_account: Option<String>,
1807
1808 #[arg(long)]
1810 ibkr_host: Option<String>,
1811
1812 #[arg(long)]
1814 ibkr_port: Option<u16>,
1815
1816 #[arg(long)]
1818 ibkr_client_id: Option<i32>,
1819
1820 #[arg(long)]
1822 ibkr_market_data_type: Option<i32>,
1823
1824 #[arg(long)]
1826 odds_provider: Option<String>,
1827
1828 #[arg(long)]
1830 odds_market: Option<String>,
1831
1832 #[arg(long, default_value = "yes")]
1834 odds_side: String,
1835
1836 #[arg(long)]
1838 max_points_per_ticker: Option<usize>,
1839
1840 #[arg(long)]
1842 cache_dir: Option<PathBuf>,
1843
1844 #[arg(long, default_value = "json")]
1846 format: String,
1847
1848 #[arg(long)]
1850 out: Option<PathBuf>,
1851}
1852
1853#[derive(clap::Args, Debug)]
1854struct FinanceIbkrArgs {
1855 #[arg(long, value_enum)]
1857 command: FinanceIbkrCommandArg,
1858
1859 #[arg(long)]
1861 account: Option<String>,
1862
1863 #[arg(long)]
1865 host: Option<String>,
1866
1867 #[arg(long)]
1869 port: Option<u16>,
1870
1871 #[arg(long)]
1873 client_id: Option<i32>,
1874
1875 #[arg(long)]
1877 market_data_type: Option<i32>,
1878
1879 #[arg(long)]
1881 timeout_secs: Option<u64>,
1882
1883 #[arg(long, value_delimiter = ',')]
1885 tickers: Vec<String>,
1886
1887 #[arg(long, default_value = "1mo")]
1889 range: String,
1890
1891 #[arg(long, default_value = "1day")]
1893 granularity: String,
1894
1895 #[arg(long)]
1897 symbol: Option<String>,
1898
1899 #[arg(long)]
1901 sec_type: Option<String>,
1902
1903 #[arg(long)]
1905 exchange: Option<String>,
1906
1907 #[arg(long)]
1909 primary_exchange: Option<String>,
1910
1911 #[arg(long)]
1913 currency: Option<String>,
1914
1915 #[arg(long)]
1917 expiry: Option<String>,
1918
1919 #[arg(long)]
1921 strike: Option<f64>,
1922
1923 #[arg(long)]
1925 right: Option<String>,
1926
1927 #[arg(long)]
1929 multiplier: Option<String>,
1930
1931 #[arg(long)]
1933 trading_class: Option<String>,
1934
1935 #[arg(long)]
1937 side: Option<String>,
1938
1939 #[arg(long)]
1941 order_type: Option<String>,
1942
1943 #[arg(long)]
1945 quantity: Option<f64>,
1946
1947 #[arg(long)]
1949 limit_price: Option<f64>,
1950
1951 #[arg(long)]
1953 stop_price: Option<f64>,
1954
1955 #[arg(long)]
1957 tif: Option<String>,
1958
1959 #[arg(long)]
1961 order_id: Option<i32>,
1962
1963 #[arg(long)]
1965 tags: Option<String>,
1966
1967 #[arg(long, default_value = "json")]
1969 format: String,
1970
1971 #[arg(long)]
1973 out: Option<PathBuf>,
1974}