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")]
1247 universe: String,
1248
1249 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1251 tickers: Vec<String>,
1252
1253 #[arg(long, default_value = "both")]
1255 direction: String,
1256
1257 #[arg(long, default_value = "value_change")]
1259 sort_by: String,
1260
1261 #[arg(long, default_value = "auto")]
1263 provider: String,
1264
1265 #[arg(long)]
1267 min_market_cap: Option<String>,
1268
1269 #[arg(long)]
1271 max_market_cap: Option<String>,
1272
1273 #[arg(long, default_value_t = 0.0)]
1275 min_change_pct: f64,
1276
1277 #[arg(long, default_value_t = 5.0)]
1279 min_price: f64,
1280
1281 #[arg(long)]
1283 min_volume: Option<u64>,
1284
1285 #[arg(long, default_value_t = 25)]
1287 limit: usize,
1288
1289 #[arg(long, default_value_t = 100)]
1291 scan_limit: usize,
1292
1293 #[arg(long)]
1295 ibkr_account: Option<String>,
1296
1297 #[arg(long)]
1299 ibkr_host: Option<String>,
1300
1301 #[arg(long)]
1303 ibkr_port: Option<u16>,
1304
1305 #[arg(long)]
1307 ibkr_client_id: Option<i32>,
1308
1309 #[arg(long)]
1311 ibkr_market_data_type: Option<i32>,
1312
1313 #[arg(long)]
1315 ibkr_timeout_secs: Option<u64>,
1316
1317 #[arg(long, default_value = "json")]
1319 format: String,
1320
1321 #[arg(long)]
1323 out: Option<PathBuf>,
1324}
1325
1326#[derive(clap::Args, Debug)]
1327struct FinanceSearchArgs {
1328 #[arg(long, required = false)]
1330 query: Option<String>,
1331
1332 #[arg(index = 1, required = false)]
1334 query_positional: Option<String>,
1335
1336 #[arg(long, default_value = "yahoo")]
1338 provider: String,
1339
1340 #[arg(long)]
1342 ibkr_account: Option<String>,
1343
1344 #[arg(long)]
1346 ibkr_host: Option<String>,
1347
1348 #[arg(long)]
1350 ibkr_port: Option<u16>,
1351
1352 #[arg(long)]
1354 ibkr_client_id: Option<i32>,
1355
1356 #[arg(long)]
1358 ibkr_market_data_type: Option<i32>,
1359
1360 #[arg(long, default_value = "json")]
1362 format: String,
1363
1364 #[arg(long = "policy-file")]
1366 policy_file: Option<PathBuf>,
1367
1368 #[arg(long = "policy-mode", default_value = "observe")]
1370 policy_mode: String,
1371
1372 #[arg(long)]
1374 out: Option<PathBuf>,
1375}
1376
1377#[derive(clap::Args, Debug)]
1378struct FinanceOddsArgs {
1379 #[command(subcommand)]
1380 action: Option<FinanceOddsAction>,
1381
1382 #[arg(long)]
1384 provider: Option<String>,
1385 #[arg(long)]
1387 series: Option<String>,
1388
1389 #[arg(long)]
1391 event: Option<String>,
1392
1393 #[arg(long)]
1395 market: Option<String>,
1396
1397 #[arg(long)]
1399 status: Option<String>,
1400
1401 #[arg(long)]
1403 limit: Option<usize>,
1404
1405 #[arg(long)]
1407 cursor: Option<String>,
1408
1409 #[arg(long)]
1411 max_pages: Option<usize>,
1412
1413 #[arg(long)]
1415 list_series: bool,
1416
1417 #[arg(long)]
1419 list_events: bool,
1420
1421 #[arg(long)]
1423 list_markets: bool,
1424
1425 #[arg(long)]
1427 list_tags: bool,
1428
1429 #[arg(long)]
1431 category: Option<String>,
1432
1433 #[arg(long, alias = "query")]
1435 search: Option<String>,
1436
1437 #[arg(long)]
1439 country: Option<String>,
1440
1441 #[arg(long = "min-volume")]
1443 min_volume: Option<f64>,
1444
1445 #[arg(long)]
1447 top: Option<usize>,
1448
1449 #[arg(long = "sort-by", default_value = "relevance")]
1452 sort_by: String,
1453 #[arg(long, default_value = "auto")]
1455 profile: String,
1456
1457 #[arg(long = "policy-file")]
1459 policy_file: Option<PathBuf>,
1460
1461 #[arg(long = "policy-mode", default_value = "observe")]
1463 policy_mode: String,
1464
1465 #[arg(long, default_value_t = false)]
1467 deltas_only: bool,
1468
1469 #[arg(long = "min-delta-pp")]
1472 min_delta_pp: Option<f64>,
1473
1474 #[arg(long, default_value_t = false)]
1476 explain: bool,
1477
1478 #[arg(long, default_value_t = false)]
1480 live: bool,
1481
1482 #[arg(long, default_value_t = false)]
1484 include_mentions: bool,
1485
1486 #[arg(long)]
1488 orderbook: bool,
1489
1490 #[arg(long)]
1492 depth: Option<usize>,
1493
1494 #[arg(long, default_value = "json")]
1496 format: String,
1497
1498 #[arg(long)]
1500 out: Option<PathBuf>,
1501}
1502
1503#[derive(Subcommand, Debug)]
1504enum FinanceOddsAction {
1505 Sync(FinanceSyncArgs),
1507
1508 Where(FinanceOddsWhereArgs),
1510}
1511
1512#[derive(clap::Args, Debug)]
1513struct FinanceOddsWhereArgs {
1514 #[arg(long)]
1516 cache_dir: Option<PathBuf>,
1517}
1518
1519#[derive(clap::Args, Debug)]
1520struct FinanceOptionsArgs {
1521 #[arg(long, visible_alias = "tickers")]
1523 ticker: String,
1524
1525 #[arg(long)]
1527 expiry: Option<String>,
1528
1529 #[arg(long = "target-dte")]
1531 target_dte: Option<i64>,
1532
1533 #[arg(long = "type", value_name = "calls|puts|both")]
1535 option_type: Option<String>,
1536
1537 #[arg(long = "near-money")]
1539 near_money: Option<f64>,
1540
1541 #[arg(long)]
1543 summary: bool,
1544
1545 #[arg(long)]
1547 expirations: bool,
1548
1549 #[arg(long)]
1552 all: bool,
1553
1554 #[arg(long, default_value = "yahoo")]
1556 provider: String,
1557
1558 #[arg(long)]
1560 ibkr_account: Option<String>,
1561
1562 #[arg(long)]
1564 ibkr_host: Option<String>,
1565
1566 #[arg(long)]
1568 ibkr_port: Option<u16>,
1569
1570 #[arg(long)]
1572 ibkr_client_id: Option<i32>,
1573
1574 #[arg(long)]
1576 ibkr_market_data_type: Option<i32>,
1577
1578 #[arg(long, default_value = "json")]
1580 format: String,
1581
1582 #[arg(long)]
1584 out: Option<PathBuf>,
1585}
1586
1587#[derive(clap::Args, Debug)]
1588struct FinanceSyncArgs {
1589 #[arg(long, value_delimiter = ',')]
1591 sources: Vec<String>,
1592
1593 #[arg(long)]
1595 max_pages: Option<usize>,
1596
1597 #[arg(long)]
1599 strict: bool,
1600
1601 #[arg(long)]
1603 include_sports: bool,
1604
1605 #[arg(long, hide = true)]
1607 include_historical: bool,
1608
1609 #[arg(long)]
1611 stream_refresh: bool,
1612
1613 #[arg(long, hide = true)]
1615 refresh_heartbeat_hours: Option<u64>,
1616
1617 #[arg(long, hide = true)]
1619 stream_refresh_timeout_secs: Option<u64>,
1620
1621 #[arg(long)]
1623 cache_dir: Option<PathBuf>,
1624
1625 #[arg(long, default_value = "json", hide = true)]
1627 format: String,
1628
1629 #[arg(long, hide = true)]
1631 full: bool,
1632
1633 #[arg(long = "policy-file", hide = true)]
1635 policy_file: Option<PathBuf>,
1636
1637 #[arg(long = "policy-mode", default_value = "observe", hide = true)]
1639 policy_mode: String,
1640
1641 #[arg(long)]
1643 out: Option<PathBuf>,
1644}
1645
1646#[derive(clap::Args, Debug)]
1647struct FinancePaperArgs {
1648 #[arg(long, value_enum, default_value = "trade")]
1650 command: FinancePaperCommandArg,
1651
1652 #[arg(long, value_enum, default_value = "simulated")]
1654 mode: FinancePaperModeArg,
1655
1656 #[arg(long, default_value = "default")]
1658 account: String,
1659
1660 #[arg(long)]
1662 provider: Option<String>,
1663
1664 #[arg(long)]
1666 market: Option<String>,
1667
1668 #[arg(long, value_enum)]
1670 side: Option<FinancePaperSideArg>,
1671
1672 #[arg(long, value_enum)]
1674 action: Option<FinancePaperOrderActionArg>,
1675
1676 #[arg(long)]
1678 qty: Option<f64>,
1679
1680 #[arg(long)]
1682 price: Option<f64>,
1683
1684 #[arg(long)]
1686 starting_cash: Option<f64>,
1687
1688 #[arg(long)]
1690 limit: Option<usize>,
1691
1692 #[arg(long)]
1694 cache_dir: Option<PathBuf>,
1695
1696 #[arg(long, default_value = "json")]
1698 format: String,
1699
1700 #[arg(long)]
1702 out: Option<PathBuf>,
1703}
1704
1705#[derive(clap::Args, Debug)]
1706struct FinanceFilingsArgs {
1707 #[arg(long, visible_alias = "tickers")]
1709 ticker: String,
1710
1711 #[arg(long, value_delimiter = ',')]
1713 forms: Vec<String>,
1714
1715 #[arg(long, default_value_t = 5)]
1717 limit: usize,
1718
1719 #[arg(long)]
1721 include_text: bool,
1722
1723 #[arg(long)]
1725 max_chars: Option<usize>,
1726
1727 #[arg(long)]
1729 cache_dir: Option<PathBuf>,
1730
1731 #[arg(long, default_value = "json")]
1733 format: String,
1734
1735 #[arg(long)]
1737 out: Option<PathBuf>,
1738}
1739
1740#[derive(clap::Args, Debug)]
1741struct FinanceTimeseriesArgs {
1742 #[arg(long)]
1745 preset: Option<String>,
1746
1747 #[arg(long, visible_alias = "ticker", value_delimiter = ',')]
1749 tickers: Vec<String>,
1750
1751 #[arg(long)]
1753 tickers_file: Option<PathBuf>,
1754
1755 #[arg(long, default_value = "1y")]
1757 range: String,
1758
1759 #[arg(long, default_value = "1d")]
1761 granularity: String,
1762
1763 #[arg(long)]
1765 start: Option<String>,
1766
1767 #[arg(long)]
1769 end: Option<String>,
1770
1771 #[arg(long)]
1773 as_of: Option<String>,
1774
1775 #[arg(long, default_value = "auto")]
1777 provider: String,
1778
1779 #[arg(long)]
1781 ibkr_account: Option<String>,
1782
1783 #[arg(long)]
1785 ibkr_host: Option<String>,
1786
1787 #[arg(long)]
1789 ibkr_port: Option<u16>,
1790
1791 #[arg(long)]
1793 ibkr_client_id: Option<i32>,
1794
1795 #[arg(long)]
1797 ibkr_market_data_type: Option<i32>,
1798
1799 #[arg(long)]
1801 odds_provider: Option<String>,
1802
1803 #[arg(long)]
1805 odds_market: Option<String>,
1806
1807 #[arg(long, default_value = "yes")]
1809 odds_side: String,
1810
1811 #[arg(long)]
1813 max_points_per_ticker: Option<usize>,
1814
1815 #[arg(long)]
1817 cache_dir: Option<PathBuf>,
1818
1819 #[arg(long, default_value = "json")]
1821 format: String,
1822
1823 #[arg(long)]
1825 out: Option<PathBuf>,
1826}
1827
1828#[derive(clap::Args, Debug)]
1829struct FinanceIbkrArgs {
1830 #[arg(long, value_enum)]
1832 command: FinanceIbkrCommandArg,
1833
1834 #[arg(long)]
1836 account: Option<String>,
1837
1838 #[arg(long)]
1840 host: Option<String>,
1841
1842 #[arg(long)]
1844 port: Option<u16>,
1845
1846 #[arg(long)]
1848 client_id: Option<i32>,
1849
1850 #[arg(long)]
1852 market_data_type: Option<i32>,
1853
1854 #[arg(long)]
1856 timeout_secs: Option<u64>,
1857
1858 #[arg(long, value_delimiter = ',')]
1860 tickers: Vec<String>,
1861
1862 #[arg(long, default_value = "1mo")]
1864 range: String,
1865
1866 #[arg(long, default_value = "1day")]
1868 granularity: String,
1869
1870 #[arg(long)]
1872 symbol: Option<String>,
1873
1874 #[arg(long)]
1876 sec_type: Option<String>,
1877
1878 #[arg(long)]
1880 exchange: Option<String>,
1881
1882 #[arg(long)]
1884 primary_exchange: Option<String>,
1885
1886 #[arg(long)]
1888 currency: Option<String>,
1889
1890 #[arg(long)]
1892 expiry: Option<String>,
1893
1894 #[arg(long)]
1896 strike: Option<f64>,
1897
1898 #[arg(long)]
1900 right: Option<String>,
1901
1902 #[arg(long)]
1904 multiplier: Option<String>,
1905
1906 #[arg(long)]
1908 trading_class: Option<String>,
1909
1910 #[arg(long)]
1912 side: Option<String>,
1913
1914 #[arg(long)]
1916 order_type: Option<String>,
1917
1918 #[arg(long)]
1920 quantity: Option<f64>,
1921
1922 #[arg(long)]
1924 limit_price: Option<f64>,
1925
1926 #[arg(long)]
1928 stop_price: Option<f64>,
1929
1930 #[arg(long)]
1932 tif: Option<String>,
1933
1934 #[arg(long)]
1936 order_id: Option<i32>,
1937
1938 #[arg(long)]
1940 tags: Option<String>,
1941
1942 #[arg(long, default_value = "json")]
1944 format: String,
1945
1946 #[arg(long)]
1948 out: Option<PathBuf>,
1949}