zframes 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +30 -18
  2. package/dist/index.js +170 -10
  3. package/package.json +4 -4
  4. package/runtime/assets/{bitcoin-dominance-BHcykQ8j.js → bitcoin-dominance-DoQXKqiB.js} +1 -1
  5. package/runtime/assets/{breakeven-PNgn_Prq.js → breakeven-C-RPYpuB.js} +1 -1
  6. package/runtime/assets/{breathing-DrPgIS4r.js → breathing-y5-8SC9y.js} +1 -1
  7. package/runtime/assets/{btc-blocks-mJPjO7gs.js → btc-blocks-Sw7Iyo4-.js} +1 -1
  8. package/runtime/assets/{btc-difficulty-D8kmEyQb.js → btc-difficulty-BYmWqBxZ.js} +1 -1
  9. package/runtime/assets/{btc-fees-Cv6K9S1L.js → btc-fees-D8mISVeZ.js} +1 -1
  10. package/runtime/assets/{btc-hashrate-DT6qyeME.js → btc-hashrate-BEJQmdg9.js} +1 -1
  11. package/runtime/assets/{btc-mempool-ftlit90k.js → btc-mempool-1XmL6cRJ.js} +1 -1
  12. package/runtime/assets/{calculator-CYNDBlrv.js → calculator-DXo_2gkF.js} +1 -1
  13. package/runtime/assets/{checklist-DygbP4AG.js → checklist-BdYa9ZOP.js} +1 -1
  14. package/runtime/assets/{clock-D2rGZ-yo.js → clock-D-I4lQmb.js} +1 -1
  15. package/runtime/assets/{coin-movers-DpHOtUMJ.js → coin-movers-DOacvI6E.js} +1 -1
  16. package/runtime/assets/{countdown-DcbUf2-f.js → countdown-BUHtC8Ve.js} +1 -1
  17. package/runtime/assets/{daily-analysis-D3g2BXJd.js → daily-analysis-CfKUC2nL.js} +1 -1
  18. package/runtime/assets/{day-meter-CDmmKsh5.js → day-meter-Bf2cGHVR.js} +1 -1
  19. package/runtime/assets/dex-volume-chart-61eDevFa.js +1 -0
  20. package/runtime/assets/dex-volume-treemap-DlwxBY_b.js +1 -0
  21. package/runtime/assets/{dice-B7dy1iZP.js → dice-Dl2uLedD.js} +1 -1
  22. package/runtime/assets/{dino-game-DLEtJMnt.js → dino-game-Cx4Nc7AZ.js} +1 -1
  23. package/runtime/assets/{divider-CVjQeL0n.js → divider-HYdZwv9D.js} +1 -1
  24. package/runtime/assets/{drawdy-DoJeRpgi.js → drawdy-C42tJRAO.js} +1 -1
  25. package/runtime/assets/editor-BMMobjrE.css +1 -0
  26. package/runtime/assets/editor-COIEaoVd.js +68 -0
  27. package/runtime/assets/{fear-greed-zPvN2LSi.js → fear-greed-BkmVWoHA.js} +1 -1
  28. package/runtime/assets/{filings-feed-CWAGVlAW.js → filings-feed-ChiZiKYE.js} +1 -1
  29. package/runtime/assets/{financial-stress-C5-XFPqY.js → financial-stress-BQJoviQU.js} +1 -1
  30. package/runtime/assets/{flappy-bird-CoKOL9Ib.js → flappy-bird-DphWPPwp.js} +1 -1
  31. package/runtime/assets/{fundamentals-BYjofvJi.js → fundamentals-D20TvQN_.js} +1 -1
  32. package/runtime/assets/funding-heatmap-DxH9NYjL.js +1 -0
  33. package/runtime/assets/{funding-rate-chart-CxBH7hVe.js → funding-rate-chart-BJ2jiIb4.js} +1 -1
  34. package/runtime/assets/fx-board-DXTpvuXF.js +1 -0
  35. package/runtime/assets/{heading-gFm9ZDY1.js → heading-Cr4OaUt7.js} +1 -1
  36. package/runtime/assets/{holiday-calendar-ffNyuPje.js → holiday-calendar-DHK0jzQc.js} +1 -1
  37. package/runtime/assets/{image-D3DwdoU8.js → image-DVddTOkv.js} +1 -1
  38. package/runtime/assets/{index-DRTPEQtR.css → index-BqHx9BjX.css} +1 -1
  39. package/runtime/assets/index-DK7jWlTL.js +1 -0
  40. package/runtime/assets/index-DNLPQoS7.js +936 -0
  41. package/runtime/assets/inflation-pulse-NCyRMTQV.js +1 -0
  42. package/runtime/assets/{journal-log-CcLb4w4A.js → journal-log-C_W9xs_w.js} +1 -1
  43. package/runtime/assets/{journal-open-C0BKFgMk.js → journal-open-CVlbbryx.js} +1 -1
  44. package/runtime/assets/{journal-results-Bpzb4REp.js → journal-results-Bsk6nwKi.js} +1 -1
  45. package/runtime/assets/{journal-score-BUDUgceb.js → journal-score-C6Aj9hWs.js} +1 -1
  46. package/runtime/assets/{journal-ui-CJIuEcIa.js → journal-ui-DgGd2Foc.js} +1 -1
  47. package/runtime/assets/{labor-market-DJihF3Mk.js → labor-market-BvFWS_YO.js} +1 -1
  48. package/runtime/assets/{lightning-stats-BV14FfAY.js → lightning-stats-DyRwU2-5.js} +1 -1
  49. package/runtime/assets/{link-grid-DK3kGS1q.js → link-grid-DxPMWWbo.js} +1 -1
  50. package/runtime/assets/live-tick-9Q3ubPF9.js +1 -0
  51. package/runtime/assets/liveline-bcaEuskN.js +1 -0
  52. package/runtime/assets/market-cap-treemap-LEDlsNnm.js +1 -0
  53. package/runtime/assets/{market-hours-D89LjpUm.js → market-hours-DlTlbyBC.js} +1 -1
  54. package/runtime/assets/{marquee-ByOQSr9Q.js → marquee-Ds-0N_-6.js} +1 -1
  55. package/runtime/assets/mini-line-chart-CHM5UBjJ.js +1 -0
  56. package/runtime/assets/{mining-pools-D6AnoVnf.js → mining-pools-Dg55Tg1-.js} +1 -1
  57. package/runtime/assets/{mover-row-BTeXB98H.js → mover-row-CunANlxa.js} +1 -1
  58. package/runtime/assets/{national-debt-CgI8LSK6.js → national-debt-G2V6-Lef.js} +1 -1
  59. package/runtime/assets/news-feed-RKSA0wsz.js +1 -0
  60. package/runtime/assets/note-CDlwRqhL.js +1 -0
  61. package/runtime/assets/{open-interest-DgDfcYh5.js → open-interest-Bs6LXeca.js} +1 -1
  62. package/runtime/assets/{options-iv-CqDfM4IA.js → options-iv-BClv6xRB.js} +1 -1
  63. package/runtime/assets/{options-oi-strike-CrIT5WTU.js → options-oi-strike-DbhE95-7.js} +1 -1
  64. package/runtime/assets/{options-put-call--RXL3vTA.js → options-put-call-C7tt191v.js} +1 -1
  65. package/runtime/assets/{pomodoro-DZEEQU2X.js → pomodoro-DpIO5pex.js} +1 -1
  66. package/runtime/assets/{portfolio-allocation-DKf6H-m6.js → portfolio-allocation-DqSXNMYF.js} +1 -1
  67. package/runtime/assets/{portfolio-common-CVt117Oi.js → portfolio-common-CCGvaNdA.js} +1 -1
  68. package/runtime/assets/{portfolio-holdings-CHtvm8aL.js → portfolio-holdings-Bxvf91Yo.js} +1 -1
  69. package/runtime/assets/portfolio-value-C6TFZyPZ.js +1 -0
  70. package/runtime/assets/price-chart-D4wf9Yju.js +1 -0
  71. package/runtime/assets/price-compare-B-mjV1jP.js +1 -0
  72. package/runtime/assets/price-liveline-K4S4XpSX.js +1 -0
  73. package/runtime/assets/{price-ticker-BmfARqHc.js → price-ticker-BNDRtpS8.js} +1 -1
  74. package/runtime/assets/protocol-fees-treemap-vjLiXJ6x.js +1 -0
  75. package/runtime/assets/{protocol-tvl-chart-Dl_MwJdU.js → protocol-tvl-chart-Dz8JtyuD.js} +1 -1
  76. package/runtime/assets/protocol-tvl-treemap-BrA0oXqV.js +1 -0
  77. package/runtime/assets/{quote-BjjZrPpM.js → quote-PcP5IX9V.js} +1 -1
  78. package/runtime/assets/{rates-board-B_OYdW_u.js → rates-board-BNAw2Iei.js} +1 -1
  79. package/runtime/assets/{returns-projector-EA7LLxnL.js → returns-projector-BSTPBgMR.js} +1 -1
  80. package/runtime/assets/{risk-reward-xhKH6ouR.js → risk-reward-Dnp2JQr7.js} +1 -1
  81. package/runtime/assets/{rules-card-CrDquc56.js → rules-card-BNInaYxt.js} +1 -1
  82. package/runtime/assets/{session-progress-BquR98Sm.js → session-progress-D1mhPWWM.js} +1 -1
  83. package/runtime/assets/{short-volume-CYxTQG8H.js → short-volume-Dsm5jHLL.js} +1 -1
  84. package/runtime/assets/{snake-9JevhL1w.js → snake-CyxVfmbr.js} +1 -1
  85. package/runtime/assets/{spotify-embed-CNEzG2xL.js → spotify-embed-DcnZGDEz.js} +1 -1
  86. package/runtime/assets/{stopwatch-BuN_qlhH.js → stopwatch-ggIRtWfw.js} +1 -1
  87. package/runtime/assets/top-movers-CanKFls6.js +1 -0
  88. package/runtime/assets/{treasury-auctions-bA-385ON.js → treasury-auctions-BBHz7Mbe.js} +1 -1
  89. package/runtime/assets/treemap-leaf-DNIoJEK-.js +1 -0
  90. package/runtime/assets/tvl-treemap-D-LqgfI7.js +1 -0
  91. package/runtime/assets/{video-CUWN4TBo.js → video-DqWW_aoH.js} +1 -1
  92. package/runtime/assets/{yield-curve-BOvLIfWe.js → yield-curve-Dpm8XDwi.js} +1 -1
  93. package/runtime/index.html +2 -2
  94. package/runtime/assets/dex-volume-chart-C3KHEnoK.js +0 -1
  95. package/runtime/assets/dex-volume-treemap-C-hqWu6U.js +0 -1
  96. package/runtime/assets/editor-CHAAJRb1.css +0 -1
  97. package/runtime/assets/editor-UP2LBUZ9.js +0 -68
  98. package/runtime/assets/funding-heatmap-BhL0jjq8.js +0 -1
  99. package/runtime/assets/fx-board-Cm0_zK03.js +0 -1
  100. package/runtime/assets/index-DbboK5sz.js +0 -820
  101. package/runtime/assets/index-jnySFpSv.js +0 -1
  102. package/runtime/assets/inflation-pulse-GrBWa9Z6.js +0 -1
  103. package/runtime/assets/liveline-C5zt2WuS.js +0 -1
  104. package/runtime/assets/market-cap-treemap-DpuSjWWe.js +0 -1
  105. package/runtime/assets/mini-line-chart-D-i1QqSe.js +0 -1
  106. package/runtime/assets/news-feed-CA8M5V3K.js +0 -1
  107. package/runtime/assets/note-Biu6llug.js +0 -1
  108. package/runtime/assets/portfolio-value-Dj37WMRc.js +0 -1
  109. package/runtime/assets/price-chart-hgZApQaG.js +0 -1
  110. package/runtime/assets/price-compare-BczbPKy-.js +0 -1
  111. package/runtime/assets/price-liveline-Cbor-Nv_.js +0 -1
  112. package/runtime/assets/protocol-fees-treemap-DeSBgGJ9.js +0 -1
  113. package/runtime/assets/protocol-tvl-treemap-Bvgp0EHh.js +0 -1
  114. package/runtime/assets/top-movers-D7sBm6jo.js +0 -1
  115. package/runtime/assets/treemap-leaf-DLQawrx4.js +0 -1
  116. package/runtime/assets/tvl-treemap-jrgafmGj.js +0 -1
package/dist/index.js CHANGED
@@ -9,6 +9,10 @@ function catalogueForAI(input) {
9
9
  const metas = input instanceof Map ? [...input.values()] : [...input];
10
10
  return metas.map((meta) => ({
11
11
  name: meta.name,
12
+ // The frame's default card title. An instance that omits `title` renders
13
+ // this, so the agent should leave `title` unset unless it wants a custom
14
+ // label — never re-state the default or hand-author an abbreviation.
15
+ label: meta.label,
12
16
  category: meta.category,
13
17
  description: meta.description,
14
18
  iconUrl: meta.iconUrl,
@@ -55,7 +59,7 @@ var FrameInstanceSchema = z2.object({
55
59
  id: z2.string().describe("Unique instance id within the dashboard"),
56
60
  frame: z2.string().describe("Name of a registered frame"),
57
61
  title: z2.string().optional().describe(
58
- `Card title shown in the frame's chrome. Overrides the default (the frame type name) \u2014 set a meaningful per-instance label, e.g. the ticker on a price-chart ("TSLA"). Ignored by chrome-less frames like heading.`
62
+ 'Optional custom card title. Omit it to use the frame\'s own polished default label (its catalogue `label`, e.g. "OI by Strike") \u2014 that is the norm. Only set this for a genuinely instance-specific label the default can\'t know, e.g. the ticker on a price-chart ("TSLA") or which outlet a news-feed shows. Never abbreviate. Ignored by chrome-less frames like heading.'
59
63
  ),
60
64
  position: GridPositionSchema,
61
65
  layouts: z2.record(z2.string(), GridPositionSchema).optional().describe(
@@ -426,6 +430,7 @@ var SOURCES = {
426
430
  };
427
431
  var clockMeta = defineFrameMeta({
428
432
  name: "clock",
433
+ label: "Clock",
429
434
  category: "tools",
430
435
  iconUrl: widgetIcon("clock"),
431
436
  layout: { w: 3, h: 2, minW: 2, minH: 1 },
@@ -451,6 +456,7 @@ var clockMeta = defineFrameMeta({
451
456
  });
452
457
  var marketHoursMeta = defineFrameMeta({
453
458
  name: "market-hours",
459
+ label: "Market Hours",
454
460
  category: "tools",
455
461
  iconUrl: widgetIcon("market-hours"),
456
462
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -467,6 +473,7 @@ var marketHoursMeta = defineFrameMeta({
467
473
  });
468
474
  var fearGreedMeta = defineFrameMeta({
469
475
  name: "fear-greed",
476
+ label: "Fear & Greed",
470
477
  category: "sentiment",
471
478
  iconUrl: widgetIcon("fear-greed"),
472
479
  layout: { w: 3, h: 3, minW: 2, minH: 2 },
@@ -479,6 +486,7 @@ var fearGreedMeta = defineFrameMeta({
479
486
  });
480
487
  var fundingRateChartMeta = defineFrameMeta({
481
488
  name: "funding-rate-chart",
489
+ label: "Funding Rate Chart",
482
490
  category: "derivatives",
483
491
  iconUrl: widgetIcon("funding-rate-chart"),
484
492
  layout: { w: 6, h: 3, minW: 3, minH: 2 },
@@ -494,6 +502,7 @@ var fundingRateChartMeta = defineFrameMeta({
494
502
  });
495
503
  var noteMeta = defineFrameMeta({
496
504
  name: "note",
505
+ label: "Note",
497
506
  category: "layout",
498
507
  iconUrl: widgetIcon("note"),
499
508
  layout: { w: 4, h: 3, minW: 2, minH: 2 },
@@ -506,6 +515,7 @@ var noteMeta = defineFrameMeta({
506
515
  });
507
516
  var priceChartMeta = defineFrameMeta({
508
517
  name: "price-chart",
518
+ label: "Price Chart",
509
519
  category: "markets",
510
520
  iconUrl: widgetIcon("price-chart"),
511
521
  layout: { w: 6, h: 3, minW: 3, minH: 2 },
@@ -523,6 +533,7 @@ var priceChartMeta = defineFrameMeta({
523
533
  });
524
534
  var priceLivelineMeta = defineFrameMeta({
525
535
  name: "price-liveline",
536
+ label: "Price Liveline",
526
537
  category: "markets",
527
538
  iconUrl: widgetIcon("price-liveline"),
528
539
  layout: { w: 6, h: 3, minW: 4, minH: 2 },
@@ -543,6 +554,7 @@ var priceLivelineMeta = defineFrameMeta({
543
554
  });
544
555
  var priceTickerMeta = defineFrameMeta({
545
556
  name: "price-ticker",
557
+ label: "Price Ticker",
546
558
  category: "markets",
547
559
  iconUrl: widgetIcon("price-ticker"),
548
560
  layout: { w: 3, h: 3, minW: 2, minH: 2 },
@@ -557,6 +569,7 @@ var priceTickerMeta = defineFrameMeta({
557
569
  });
558
570
  var topMoversMeta = defineFrameMeta({
559
571
  name: "top-movers",
572
+ label: "Top Movers",
560
573
  category: "markets",
561
574
  iconUrl: widgetIcon("top-movers"),
562
575
  layout: { w: 5, h: 3, minW: 3, minH: 3 },
@@ -569,6 +582,7 @@ var topMoversMeta = defineFrameMeta({
569
582
  });
570
583
  var tvlTreemapMeta = defineFrameMeta({
571
584
  name: "tvl-treemap",
585
+ label: "TVL Treemap",
572
586
  category: "crypto",
573
587
  iconUrl: widgetIcon("tvl-treemap"),
574
588
  layout: { w: 6, h: 4, minW: 3, minH: 3 },
@@ -581,6 +595,7 @@ var tvlTreemapMeta = defineFrameMeta({
581
595
  });
582
596
  var bitcoinDominanceMeta = defineFrameMeta({
583
597
  name: "bitcoin-dominance",
598
+ label: "Bitcoin Dominance",
584
599
  category: "crypto",
585
600
  iconUrl: widgetIcon("bitcoin-dominance"),
586
601
  layout: { w: 4, h: 2, minW: 3, minH: 2 },
@@ -595,6 +610,7 @@ var bitcoinDominanceMeta = defineFrameMeta({
595
610
  });
596
611
  var ratesBoardMeta = defineFrameMeta({
597
612
  name: "rates-board",
613
+ label: "Rates Board",
598
614
  category: "macro",
599
615
  iconUrl: widgetIcon("rates-board"),
600
616
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -611,6 +627,7 @@ var ratesBoardMeta = defineFrameMeta({
611
627
  });
612
628
  var fxBoardMeta = defineFrameMeta({
613
629
  name: "fx-board",
630
+ label: "FX Board",
614
631
  category: "macro",
615
632
  iconUrl: widgetIcon("fx-board"),
616
633
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -629,6 +646,7 @@ var fxBoardMeta = defineFrameMeta({
629
646
  });
630
647
  var inflationPulseMeta = defineFrameMeta({
631
648
  name: "inflation-pulse",
649
+ label: "Inflation Pulse",
632
650
  category: "macro",
633
651
  iconUrl: widgetIcon("inflation-pulse"),
634
652
  layout: { w: 4, h: 3, minW: 3, minH: 2 },
@@ -641,6 +659,7 @@ var inflationPulseMeta = defineFrameMeta({
641
659
  });
642
660
  var financialStressMeta = defineFrameMeta({
643
661
  name: "financial-stress",
662
+ label: "Financial Stress",
644
663
  category: "macro",
645
664
  iconUrl: widgetIcon("financial-stress"),
646
665
  layout: { w: 4, h: 3, minW: 3, minH: 2 },
@@ -656,6 +675,7 @@ var financialStressMeta = defineFrameMeta({
656
675
  });
657
676
  var nationalDebtMeta = defineFrameMeta({
658
677
  name: "national-debt",
678
+ label: "National Debt",
659
679
  category: "macro",
660
680
  iconUrl: widgetIcon("national-debt"),
661
681
  layout: { w: 4, h: 3, minW: 3, minH: 2 },
@@ -673,6 +693,7 @@ var nationalDebtMeta = defineFrameMeta({
673
693
  });
674
694
  var laborMarketMeta = defineFrameMeta({
675
695
  name: "labor-market",
696
+ label: "Labor Market",
676
697
  category: "macro",
677
698
  iconUrl: widgetIcon("labor-market"),
678
699
  layout: { w: 4, h: 3, minW: 3, minH: 2 },
@@ -685,6 +706,7 @@ var laborMarketMeta = defineFrameMeta({
685
706
  });
686
707
  var treasuryAuctionsMeta = defineFrameMeta({
687
708
  name: "treasury-auctions",
709
+ label: "Treasury Auctions",
688
710
  category: "macro",
689
711
  iconUrl: widgetIcon("treasury-auctions"),
690
712
  layout: { w: 5, h: 4, minW: 3, minH: 3 },
@@ -697,6 +719,7 @@ var treasuryAuctionsMeta = defineFrameMeta({
697
719
  });
698
720
  var filingsFeedMeta = defineFrameMeta({
699
721
  name: "filings-feed",
722
+ label: "Filings Feed",
700
723
  category: "equities",
701
724
  iconUrl: widgetIcon("filings-feed"),
702
725
  layout: { w: 5, h: 4, minW: 3, minH: 3 },
@@ -715,6 +738,7 @@ var filingsFeedMeta = defineFrameMeta({
715
738
  });
716
739
  var yieldCurveMeta = defineFrameMeta({
717
740
  name: "yield-curve",
741
+ label: "Yield Curve",
718
742
  category: "macro",
719
743
  iconUrl: widgetIcon("yield-curve"),
720
744
  layout: { w: 4, h: 3, minW: 3, minH: 3 },
@@ -745,6 +769,7 @@ var yieldCurveMeta = defineFrameMeta({
745
769
  });
746
770
  var fundamentalsMeta = defineFrameMeta({
747
771
  name: "fundamentals",
772
+ label: "Fundamentals",
748
773
  category: "equities",
749
774
  iconUrl: widgetIcon("fundamentals"),
750
775
  layout: { w: 4, h: 3, minW: 3, minH: 3 },
@@ -759,6 +784,7 @@ var fundamentalsMeta = defineFrameMeta({
759
784
  });
760
785
  var shortVolumeMeta = defineFrameMeta({
761
786
  name: "short-volume",
787
+ label: "Short Volume",
762
788
  category: "equities",
763
789
  iconUrl: widgetIcon("short-volume"),
764
790
  layout: { w: 5, h: 4, minW: 3, minH: 3 },
@@ -776,6 +802,7 @@ var shortVolumeMeta = defineFrameMeta({
776
802
  });
777
803
  var fundingHeatmapMeta = defineFrameMeta({
778
804
  name: "funding-heatmap",
805
+ label: "Funding Heatmap",
779
806
  category: "derivatives",
780
807
  iconUrl: widgetIcon("funding-heatmap"),
781
808
  layout: { w: 6, h: 3, minW: 4, minH: 3 },
@@ -790,6 +817,7 @@ var fundingHeatmapMeta = defineFrameMeta({
790
817
  });
791
818
  var dinoGameMeta = defineFrameMeta({
792
819
  name: "dino-game",
820
+ label: "Dino Game",
793
821
  category: "games",
794
822
  iconUrl: widgetIcon("dino-game"),
795
823
  layout: { w: 4, h: 3, minW: 3, minH: 3 },
@@ -799,6 +827,7 @@ var dinoGameMeta = defineFrameMeta({
799
827
  });
800
828
  var imageMeta = defineFrameMeta({
801
829
  name: "image",
830
+ label: "Image",
802
831
  category: "layout",
803
832
  iconUrl: widgetIcon("image"),
804
833
  layout: { w: 3, h: 3, minW: 1, minH: 1 },
@@ -814,6 +843,7 @@ var imageMeta = defineFrameMeta({
814
843
  });
815
844
  var headingMeta = defineFrameMeta({
816
845
  name: "heading",
846
+ label: "Heading",
817
847
  category: "layout",
818
848
  iconUrl: widgetIcon("heading"),
819
849
  layout: { w: 12, h: 1, minW: 2, minH: 1, maxH: 1 },
@@ -827,6 +857,7 @@ var headingMeta = defineFrameMeta({
827
857
  });
828
858
  var dailyAnalysisMeta = defineFrameMeta({
829
859
  name: "daily-analysis",
860
+ label: "Daily Analysis",
830
861
  category: "tools",
831
862
  iconUrl: widgetIcon("daily-analysis"),
832
863
  layout: { w: 6, h: 3, minW: 3, minH: 2 },
@@ -846,6 +877,7 @@ var dailyAnalysisMeta = defineFrameMeta({
846
877
  });
847
878
  var journalLogMeta = defineFrameMeta({
848
879
  name: "journal-log",
880
+ label: "Journal \xB7 Log",
849
881
  category: "journal",
850
882
  iconUrl: widgetIcon("journal-log"),
851
883
  layout: { w: 4, h: 5, minW: 3, minH: 4 },
@@ -856,6 +888,7 @@ var journalLogMeta = defineFrameMeta({
856
888
  });
857
889
  var journalOpenMeta = defineFrameMeta({
858
890
  name: "journal-open",
891
+ label: "Journal \xB7 Open",
859
892
  category: "journal",
860
893
  iconUrl: widgetIcon("journal-open"),
861
894
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -868,6 +901,7 @@ var journalOpenMeta = defineFrameMeta({
868
901
  });
869
902
  var journalResultsMeta = defineFrameMeta({
870
903
  name: "journal-results",
904
+ label: "Journal \xB7 Results",
871
905
  category: "journal",
872
906
  iconUrl: widgetIcon("journal-results"),
873
907
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -879,6 +913,7 @@ var journalResultsMeta = defineFrameMeta({
879
913
  });
880
914
  var journalScoreMeta = defineFrameMeta({
881
915
  name: "journal-score",
916
+ label: "Journal \xB7 Scoreboard",
882
917
  category: "journal",
883
918
  iconUrl: widgetIcon("journal-score"),
884
919
  layout: { w: 4, h: 2, minW: 3, minH: 2 },
@@ -888,6 +923,7 @@ var journalScoreMeta = defineFrameMeta({
888
923
  });
889
924
  var priceCompareMeta = defineFrameMeta({
890
925
  name: "price-compare",
926
+ label: "Price Compare",
891
927
  category: "markets",
892
928
  iconUrl: widgetIcon("price-compare"),
893
929
  layout: { w: 6, h: 3, minW: 3, minH: 2 },
@@ -914,6 +950,7 @@ var portfolioConfigShape = {
914
950
  };
915
951
  var portfolioValueMeta = defineFrameMeta({
916
952
  name: "portfolio-value",
953
+ label: "Portfolio Value",
917
954
  category: "portfolio",
918
955
  iconUrl: widgetIcon("portfolio-value"),
919
956
  layout: { w: 5, h: 4, minW: 3, minH: 3 },
@@ -929,6 +966,7 @@ var portfolioValueMeta = defineFrameMeta({
929
966
  });
930
967
  var portfolioAllocationMeta = defineFrameMeta({
931
968
  name: "portfolio-allocation",
969
+ label: "Portfolio Allocation",
932
970
  category: "portfolio",
933
971
  iconUrl: widgetIcon("portfolio-allocation"),
934
972
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -939,6 +977,7 @@ var portfolioAllocationMeta = defineFrameMeta({
939
977
  });
940
978
  var portfolioHoldingsMeta = defineFrameMeta({
941
979
  name: "portfolio-holdings",
980
+ label: "Portfolio Holdings",
942
981
  category: "portfolio",
943
982
  iconUrl: widgetIcon("portfolio-holdings"),
944
983
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -949,6 +988,7 @@ var portfolioHoldingsMeta = defineFrameMeta({
949
988
  });
950
989
  var newsFeedMeta = defineFrameMeta({
951
990
  name: "news-feed",
991
+ label: "News Feed",
952
992
  category: "sentiment",
953
993
  iconUrl: widgetIcon("news-feed"),
954
994
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -973,6 +1013,7 @@ var newsFeedMeta = defineFrameMeta({
973
1013
  });
974
1014
  var dexVolumeTreemapMeta = defineFrameMeta({
975
1015
  name: "dex-volume-treemap",
1016
+ label: "DEX Volume Treemap",
976
1017
  category: "crypto",
977
1018
  iconUrl: widgetIcon("dex-volume-treemap"),
978
1019
  layout: { w: 6, h: 4, minW: 3, minH: 3 },
@@ -985,6 +1026,7 @@ var dexVolumeTreemapMeta = defineFrameMeta({
985
1026
  });
986
1027
  var dexVolumeChartMeta = defineFrameMeta({
987
1028
  name: "dex-volume-chart",
1029
+ label: "DEX Volume Chart",
988
1030
  category: "crypto",
989
1031
  iconUrl: widgetIcon("dex-volume-chart"),
990
1032
  layout: { w: 6, h: 3, minW: 3, minH: 2 },
@@ -1000,6 +1042,7 @@ var dexVolumeChartMeta = defineFrameMeta({
1000
1042
  });
1001
1043
  var protocolTvlTreemapMeta = defineFrameMeta({
1002
1044
  name: "protocol-tvl-treemap",
1045
+ label: "Protocol TVL Treemap",
1003
1046
  category: "crypto",
1004
1047
  iconUrl: widgetIcon("protocol-tvl-treemap"),
1005
1048
  layout: { w: 6, h: 4, minW: 3, minH: 3 },
@@ -1012,6 +1055,7 @@ var protocolTvlTreemapMeta = defineFrameMeta({
1012
1055
  });
1013
1056
  var protocolTvlChartMeta = defineFrameMeta({
1014
1057
  name: "protocol-tvl-chart",
1058
+ label: "Protocol TVL Chart",
1015
1059
  category: "crypto",
1016
1060
  iconUrl: widgetIcon("protocol-tvl-chart"),
1017
1061
  layout: { w: 6, h: 3, minW: 3, minH: 2 },
@@ -1027,6 +1071,7 @@ var protocolTvlChartMeta = defineFrameMeta({
1027
1071
  });
1028
1072
  var protocolFeesTreemapMeta = defineFrameMeta({
1029
1073
  name: "protocol-fees-treemap",
1074
+ label: "Protocol Fees Treemap",
1030
1075
  category: "crypto",
1031
1076
  iconUrl: widgetIcon("protocol-fees-treemap"),
1032
1077
  layout: { w: 6, h: 4, minW: 3, minH: 3 },
@@ -1039,6 +1084,7 @@ var protocolFeesTreemapMeta = defineFrameMeta({
1039
1084
  });
1040
1085
  var marketCapTreemapMeta = defineFrameMeta({
1041
1086
  name: "market-cap-treemap",
1087
+ label: "Market Cap Treemap",
1042
1088
  category: "crypto",
1043
1089
  iconUrl: widgetIcon("market-cap-treemap"),
1044
1090
  layout: { w: 6, h: 4, minW: 3, minH: 3 },
@@ -1053,6 +1099,7 @@ var marketCapTreemapMeta = defineFrameMeta({
1053
1099
  });
1054
1100
  var openInterestMeta = defineFrameMeta({
1055
1101
  name: "open-interest",
1102
+ label: "Open Interest",
1056
1103
  category: "derivatives",
1057
1104
  iconUrl: widgetIcon("open-interest"),
1058
1105
  layout: { w: 4, h: 3, minW: 3, minH: 2 },
@@ -1067,6 +1114,7 @@ var openInterestMeta = defineFrameMeta({
1067
1114
  });
1068
1115
  var snakeMeta = defineFrameMeta({
1069
1116
  name: "snake",
1117
+ label: "Snake",
1070
1118
  category: "games",
1071
1119
  iconUrl: widgetIcon("snake"),
1072
1120
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -1076,6 +1124,7 @@ var snakeMeta = defineFrameMeta({
1076
1124
  });
1077
1125
  var flappyBirdMeta = defineFrameMeta({
1078
1126
  name: "flappy-bird",
1127
+ label: "Flappy Bird",
1079
1128
  category: "games",
1080
1129
  iconUrl: widgetIcon("flappy-bird"),
1081
1130
  layout: { w: 4, h: 4, minW: 3, minH: 3 },
@@ -1085,6 +1134,7 @@ var flappyBirdMeta = defineFrameMeta({
1085
1134
  });
1086
1135
  var videoMeta = defineFrameMeta({
1087
1136
  name: "video",
1137
+ label: "Video",
1088
1138
  category: "layout",
1089
1139
  iconUrl: widgetIcon("video"),
1090
1140
  layout: { w: 4, h: 3, minW: 2, minH: 2 },
@@ -1099,6 +1149,7 @@ var videoMeta = defineFrameMeta({
1099
1149
  });
1100
1150
  var drawdyMeta = defineFrameMeta({
1101
1151
  name: "drawdy",
1152
+ label: "Drawdy",
1102
1153
  category: "layout",
1103
1154
  iconUrl: widgetIcon("drawdy"),
1104
1155
  layout: { w: 8, h: 6, minW: 2, minH: 2 },
@@ -1108,6 +1159,7 @@ var drawdyMeta = defineFrameMeta({
1108
1159
  });
1109
1160
  var countdownMeta = defineFrameMeta({
1110
1161
  name: "countdown",
1162
+ label: "Countdown",
1111
1163
  category: "tools",
1112
1164
  iconUrl: widgetIcon("countdown"),
1113
1165
  layout: { w: 3, h: 2, minW: 2, minH: 1 },
@@ -1125,6 +1177,7 @@ var countdownMeta = defineFrameMeta({
1125
1177
  });
1126
1178
  var linkGridMeta = defineFrameMeta({
1127
1179
  name: "link-grid",
1180
+ label: "Quick Links",
1128
1181
  category: "tools",
1129
1182
  iconUrl: widgetIcon("link-grid"),
1130
1183
  layout: { w: 3, h: 2, minW: 2, minH: 1 },
@@ -1156,6 +1209,7 @@ var linkGridMeta = defineFrameMeta({
1156
1209
  });
1157
1210
  var calculatorMeta = defineFrameMeta({
1158
1211
  name: "calculator",
1212
+ label: "Position Calculator",
1159
1213
  category: "tools",
1160
1214
  iconUrl: widgetIcon("calculator"),
1161
1215
  layout: { w: 3, h: 3, minW: 2, minH: 2 },
@@ -1173,6 +1227,7 @@ var calculatorMeta = defineFrameMeta({
1173
1227
  });
1174
1228
  var quoteMeta = defineFrameMeta({
1175
1229
  name: "quote",
1230
+ label: "Quote",
1176
1231
  category: "layout",
1177
1232
  iconUrl: widgetIcon("quote"),
1178
1233
  layout: { w: 4, h: 2, minW: 2, minH: 1 },
@@ -1193,6 +1248,7 @@ var quoteMeta = defineFrameMeta({
1193
1248
  });
1194
1249
  var dividerMeta = defineFrameMeta({
1195
1250
  name: "divider",
1251
+ label: "Divider",
1196
1252
  category: "layout",
1197
1253
  iconUrl: widgetIcon("divider"),
1198
1254
  layout: { w: 12, h: 1, minW: 1, minH: 1 },
@@ -1211,6 +1267,7 @@ var dividerMeta = defineFrameMeta({
1211
1267
  });
1212
1268
  var diceMeta = defineFrameMeta({
1213
1269
  name: "dice",
1270
+ label: "Dice",
1214
1271
  category: "tools",
1215
1272
  iconUrl: widgetIcon("dice"),
1216
1273
  layout: { w: 2, h: 2, minW: 1, minH: 1 },
@@ -1226,6 +1283,7 @@ var diceMeta = defineFrameMeta({
1226
1283
  });
1227
1284
  var riskRewardMeta = defineFrameMeta({
1228
1285
  name: "risk-reward",
1286
+ label: "Risk / Reward",
1229
1287
  category: "tools",
1230
1288
  iconUrl: widgetIcon("risk-reward"),
1231
1289
  layout: { w: 3, h: 3, minW: 2, minH: 2 },
@@ -1243,6 +1301,7 @@ var riskRewardMeta = defineFrameMeta({
1243
1301
  });
1244
1302
  var marqueeMeta = defineFrameMeta({
1245
1303
  name: "marquee",
1304
+ label: "Marquee",
1246
1305
  category: "layout",
1247
1306
  iconUrl: widgetIcon("marquee"),
1248
1307
  layout: { w: 6, h: 1, minW: 2, minH: 1 },
@@ -1257,6 +1316,7 @@ var marqueeMeta = defineFrameMeta({
1257
1316
  });
1258
1317
  var stopwatchMeta = defineFrameMeta({
1259
1318
  name: "stopwatch",
1319
+ label: "Stopwatch",
1260
1320
  layout: { w: 3, h: 2, minW: 2, minH: 1 },
1261
1321
  category: "tools",
1262
1322
  iconUrl: widgetIcon("stopwatch"),
@@ -1274,6 +1334,7 @@ var stopwatchMeta = defineFrameMeta({
1274
1334
  });
1275
1335
  var sessionProgressMeta = defineFrameMeta({
1276
1336
  name: "session-progress",
1337
+ label: "Session Progress",
1277
1338
  category: "tools",
1278
1339
  iconUrl: widgetIcon("session-progress"),
1279
1340
  layout: { w: 3, h: 2, minW: 2, minH: 1 },
@@ -1287,6 +1348,7 @@ var sessionProgressMeta = defineFrameMeta({
1287
1348
  });
1288
1349
  var holidayCalendarMeta = defineFrameMeta({
1289
1350
  name: "holiday-calendar",
1351
+ label: "Holiday Calendar",
1290
1352
  category: "tools",
1291
1353
  iconUrl: widgetIcon("holiday-calendar"),
1292
1354
  layout: { w: 3, h: 4, minW: 2, minH: 2 },
@@ -1300,6 +1362,7 @@ var holidayCalendarMeta = defineFrameMeta({
1300
1362
  });
1301
1363
  var dayMeterMeta = defineFrameMeta({
1302
1364
  name: "day-meter",
1365
+ label: "Day Meter",
1303
1366
  category: "tools",
1304
1367
  iconUrl: widgetIcon("day-meter"),
1305
1368
  layout: { w: 4, h: 2, minW: 2, minH: 1 },
@@ -1315,6 +1378,7 @@ var dayMeterMeta = defineFrameMeta({
1315
1378
  });
1316
1379
  var returnsProjectorMeta = defineFrameMeta({
1317
1380
  name: "returns-projector",
1381
+ label: "Returns Projector",
1318
1382
  category: "tools",
1319
1383
  iconUrl: widgetIcon("returns-projector"),
1320
1384
  layout: { w: 3, h: 4, minW: 2, minH: 3 },
@@ -1330,6 +1394,7 @@ var returnsProjectorMeta = defineFrameMeta({
1330
1394
  });
1331
1395
  var breakevenMeta = defineFrameMeta({
1332
1396
  name: "breakeven",
1397
+ label: "Break-even",
1333
1398
  category: "tools",
1334
1399
  iconUrl: widgetIcon("breakeven"),
1335
1400
  layout: { w: 3, h: 4, minW: 2, minH: 2 },
@@ -1352,6 +1417,7 @@ var breakevenMeta = defineFrameMeta({
1352
1417
  });
1353
1418
  var checklistMeta = defineFrameMeta({
1354
1419
  name: "checklist",
1420
+ label: "Checklist",
1355
1421
  category: "tools",
1356
1422
  iconUrl: widgetIcon("checklist"),
1357
1423
  layout: { w: 3, h: 3, minW: 2, minH: 2 },
@@ -1371,6 +1437,7 @@ var checklistMeta = defineFrameMeta({
1371
1437
  });
1372
1438
  var pomodoroMeta = defineFrameMeta({
1373
1439
  name: "pomodoro",
1440
+ label: "Pomodoro",
1374
1441
  category: "tools",
1375
1442
  iconUrl: widgetIcon("pomodoro"),
1376
1443
  layout: { w: 3, h: 3, minW: 2, minH: 2 },
@@ -1385,6 +1452,7 @@ var pomodoroMeta = defineFrameMeta({
1385
1452
  });
1386
1453
  var rulesCardMeta = defineFrameMeta({
1387
1454
  name: "rules-card",
1455
+ label: "Rules",
1388
1456
  category: "layout",
1389
1457
  iconUrl: widgetIcon("rules-card"),
1390
1458
  layout: { w: 3, h: 3, minW: 2, minH: 2 },
@@ -1401,6 +1469,7 @@ var rulesCardMeta = defineFrameMeta({
1401
1469
  });
1402
1470
  var breathingMeta = defineFrameMeta({
1403
1471
  name: "breathing",
1472
+ label: "Breathing",
1404
1473
  category: "layout",
1405
1474
  iconUrl: widgetIcon("breathing"),
1406
1475
  chrome: "bare",
@@ -1416,6 +1485,7 @@ var breathingMeta = defineFrameMeta({
1416
1485
  });
1417
1486
  var spotifyEmbedMeta = defineFrameMeta({
1418
1487
  name: "spotify-embed",
1488
+ label: "Spotify",
1419
1489
  category: "layout",
1420
1490
  iconUrl: widgetIcon("spotify-embed"),
1421
1491
  layout: { w: 3, h: 4, minW: 2, minH: 2 },
@@ -1430,6 +1500,7 @@ var spotifyEmbedMeta = defineFrameMeta({
1430
1500
  });
1431
1501
  var btcFeesMeta = defineFrameMeta({
1432
1502
  name: "btc-fees",
1503
+ label: "BTC Fees",
1433
1504
  category: "bitcoin",
1434
1505
  iconUrl: widgetIcon("btc-fees"),
1435
1506
  layout: { w: 3, h: 2, minW: 2, minH: 2 },
@@ -1444,6 +1515,7 @@ var btcFeesMeta = defineFrameMeta({
1444
1515
  });
1445
1516
  var btcMempoolMeta = defineFrameMeta({
1446
1517
  name: "btc-mempool",
1518
+ label: "BTC Mempool",
1447
1519
  category: "bitcoin",
1448
1520
  iconUrl: widgetIcon("btc-mempool"),
1449
1521
  layout: { w: 5, h: 3, minW: 3, minH: 2 },
@@ -1458,6 +1530,7 @@ var btcMempoolMeta = defineFrameMeta({
1458
1530
  });
1459
1531
  var btcBlocksMeta = defineFrameMeta({
1460
1532
  name: "btc-blocks",
1533
+ label: "BTC Blocks",
1461
1534
  category: "bitcoin",
1462
1535
  iconUrl: widgetIcon("btc-blocks"),
1463
1536
  layout: { w: 5, h: 4, minW: 3, minH: 3 },
@@ -1470,6 +1543,7 @@ var btcBlocksMeta = defineFrameMeta({
1470
1543
  });
1471
1544
  var btcHashrateMeta = defineFrameMeta({
1472
1545
  name: "btc-hashrate",
1546
+ label: "BTC Hashrate",
1473
1547
  category: "bitcoin",
1474
1548
  iconUrl: widgetIcon("btc-hashrate"),
1475
1549
  layout: { w: 6, h: 3, minW: 3, minH: 2 },
@@ -1482,6 +1556,7 @@ var btcHashrateMeta = defineFrameMeta({
1482
1556
  });
1483
1557
  var btcDifficultyMeta = defineFrameMeta({
1484
1558
  name: "btc-difficulty",
1559
+ label: "BTC Difficulty",
1485
1560
  category: "bitcoin",
1486
1561
  iconUrl: widgetIcon("btc-difficulty"),
1487
1562
  layout: { w: 4, h: 3, minW: 3, minH: 2 },
@@ -1496,6 +1571,7 @@ var btcDifficultyMeta = defineFrameMeta({
1496
1571
  });
1497
1572
  var miningPoolsMeta = defineFrameMeta({
1498
1573
  name: "mining-pools",
1574
+ label: "Mining Pools",
1499
1575
  category: "bitcoin",
1500
1576
  iconUrl: widgetIcon("mining-pools"),
1501
1577
  layout: { w: 6, h: 4, minW: 3, minH: 3 },
@@ -1511,6 +1587,7 @@ var miningPoolsMeta = defineFrameMeta({
1511
1587
  });
1512
1588
  var lightningStatsMeta = defineFrameMeta({
1513
1589
  name: "lightning-stats",
1590
+ label: "Lightning Network",
1514
1591
  category: "bitcoin",
1515
1592
  iconUrl: widgetIcon("lightning-stats"),
1516
1593
  layout: { w: 4, h: 3, minW: 3, minH: 2 },
@@ -1525,6 +1602,7 @@ var lightningStatsMeta = defineFrameMeta({
1525
1602
  });
1526
1603
  var optionsPutCallMeta = defineFrameMeta({
1527
1604
  name: "options-put-call",
1605
+ label: "Put / Call Ratio",
1528
1606
  category: "derivatives",
1529
1607
  iconUrl: widgetIcon("options-put-call"),
1530
1608
  layout: { w: 4, h: 3, minW: 3, minH: 2 },
@@ -1542,6 +1620,7 @@ var optionsPutCallMeta = defineFrameMeta({
1542
1620
  });
1543
1621
  var optionsIvMeta = defineFrameMeta({
1544
1622
  name: "options-iv",
1623
+ label: "Implied Volatility",
1545
1624
  category: "derivatives",
1546
1625
  iconUrl: widgetIcon("options-iv"),
1547
1626
  layout: { w: 6, h: 3, minW: 3, minH: 2 },
@@ -1555,6 +1634,7 @@ var optionsIvMeta = defineFrameMeta({
1555
1634
  });
1556
1635
  var optionsOiStrikeMeta = defineFrameMeta({
1557
1636
  name: "options-oi-strike",
1637
+ label: "OI by Strike",
1558
1638
  category: "derivatives",
1559
1639
  iconUrl: widgetIcon("options-oi-strike"),
1560
1640
  layout: { w: 6, h: 4, minW: 4, minH: 3 },
@@ -1570,6 +1650,7 @@ var optionsOiStrikeMeta = defineFrameMeta({
1570
1650
  });
1571
1651
  var coinMoversMeta = defineFrameMeta({
1572
1652
  name: "coin-movers",
1653
+ label: "Coin Movers",
1573
1654
  category: "markets",
1574
1655
  iconUrl: widgetIcon("coin-movers"),
1575
1656
  layout: { w: 5, h: 4, minW: 3, minH: 3 },
@@ -2093,6 +2174,21 @@ function claudeDelta(line) {
2093
2174
  const delta = o.event?.type === "content_block_delta" ? o.event.delta : void 0;
2094
2175
  return delta?.type === "text_delta" && typeof delta.text === "string" ? delta.text : null;
2095
2176
  }
2177
+ function claudeStatus(line) {
2178
+ const o = tryParse(line);
2179
+ if (o?.type !== "stream_event") return null;
2180
+ if (o.event?.type !== "content_block_start") return null;
2181
+ const block = o.event.content_block;
2182
+ if (block?.type !== "tool_use") return null;
2183
+ switch (block.name) {
2184
+ case "WebSearch":
2185
+ return "searching the web\u2026";
2186
+ case "WebFetch":
2187
+ return "reading a page\u2026";
2188
+ default:
2189
+ return null;
2190
+ }
2191
+ }
2096
2192
  function claudeResult(stdout) {
2097
2193
  let result = null;
2098
2194
  let deltas = "";
@@ -2118,15 +2214,24 @@ var RUNNERS = [
2118
2214
  // answer is generated; --verbose is required alongside it under -p, and
2119
2215
  // --include-partial-messages adds the token-level `content_block_delta`
2120
2216
  // events we relay live. The canonical answer is the closing `result` event.
2217
+ // --allowedTools whitelists WebSearch/WebFetch so zAI can look up news +
2218
+ // context; in headless -p that also KEEPS Bash/Write/Edit blocked (only
2219
+ // allowlisted tools auto-approve), so it can search the web but can't wander
2220
+ // the dashboard folder we run it in. Search results interleave as tool
2221
+ // events the delta parser ignores, then the text answer streams as usual.
2121
2222
  buildArgs: (prompt) => [
2122
2223
  "-p",
2123
2224
  prompt,
2124
2225
  "--output-format",
2125
2226
  "stream-json",
2126
2227
  "--verbose",
2127
- "--include-partial-messages"
2228
+ "--include-partial-messages",
2229
+ "--allowedTools",
2230
+ "WebSearch",
2231
+ "WebFetch"
2128
2232
  ],
2129
2233
  parseDelta: claudeDelta,
2234
+ parseStatus: claudeStatus,
2130
2235
  readResult: async (stdout) => claudeResult(stdout)
2131
2236
  },
2132
2237
  {
@@ -2136,7 +2241,12 @@ var RUNNERS = [
2136
2241
  // `exec` is non-interactive; read-only sandbox so a Q&A can't mutate
2137
2242
  // anything, and -o writes ONLY the final message to a file (stdout carries
2138
2243
  // session noise). --skip-git-repo-check so it runs outside a repo too.
2244
+ // --search enables the native web_search tool for news + context (a network
2245
+ // read, orthogonal to the read-only filesystem sandbox). It's a TOP-LEVEL
2246
+ // codex flag, so it must precede the `exec` subcommand — after it, exec's
2247
+ // parser rejects it as an unknown argument.
2139
2248
  buildArgs: (prompt, outFile) => [
2249
+ "--search",
2140
2250
  "exec",
2141
2251
  "--skip-git-repo-check",
2142
2252
  "-s",
@@ -2228,13 +2338,15 @@ ${frameCatalogue}${grounding}
2228
2338
 
2229
2339
  ${transcript}Stay strictly on topic. Only answer questions about zframes itself (its frames, data, dashboard, and how to use it) and about markets and finance \u2014 stocks, crypto, prices, funding, market caps, on-chain and macro data, and the symbols on screen. If the question is about anything else (general knowledge, coding, personal advice, writing, other software, etc.), do not answer it: reply in one sentence that you only cover zframes and the markets it tracks, and invite a market or dashboard question instead.
2230
2340
 
2231
- Answer the user's question in 2\u20134 sentences of plain text \u2014 no markdown headings, no preamble, no tool use, just the answer.
2341
+ You may use web search when it helps \u2014 for news, catalysts, or context not in the live readings above. Be explicit in your answer about where each fact comes from: say when a number or fact is from the live dashboard readings above versus from the web, and name the web source (e.g. "per Reuters"). For anything shown on the dashboard, treat the live readings above as the source of truth \u2014 don't override them with a web figure.
2342
+
2343
+ Answer the user's question in 2\u20134 sentences of plain text \u2014 no markdown headings, no preamble.
2232
2344
 
2233
2345
  Question: ${question}`
2234
2346
  );
2235
2347
  }
2236
2348
  var askCounter = 0;
2237
- function runAgent(runner, prompt, cwd, onDelta) {
2349
+ function runAgent(runner, prompt, cwd, onDelta, onStatus) {
2238
2350
  const outFile = join2(
2239
2351
  tmpdir(),
2240
2352
  `zframes-ask-${process.pid}-${++askCounter}.txt`
@@ -2264,10 +2376,14 @@ function runAgent(runner, prompt, cwd, onDelta) {
2264
2376
  child.kill("SIGKILL");
2265
2377
  finish({ ok: false, error: `${runner.label} timed out` });
2266
2378
  }, RUN_TIMEOUT_MS);
2267
- const streaming = Boolean(onDelta && runner.parseDelta);
2379
+ const streaming = Boolean(
2380
+ onDelta && runner.parseDelta || onStatus && runner.parseStatus
2381
+ );
2268
2382
  const emit = (line) => {
2269
2383
  const delta = runner.parseDelta?.(line);
2270
2384
  if (delta) onDelta?.(delta);
2385
+ const status = runner.parseStatus?.(line);
2386
+ if (status) onStatus?.(status);
2271
2387
  };
2272
2388
  child.stdout?.on("data", (d) => {
2273
2389
  stdout += d;
@@ -2390,7 +2506,8 @@ function handleAsk(req, res, specFile, catalogue) {
2390
2506
  runner,
2391
2507
  prompt,
2392
2508
  dirname2(specFile),
2393
- (text) => send({ type: "delta", text })
2509
+ (text) => send({ type: "delta", text }),
2510
+ (text) => send({ type: "status", text })
2394
2511
  );
2395
2512
  if (result.ok)
2396
2513
  send({ type: "done", agent: runner.id, answer: result.answer });
@@ -3185,6 +3302,25 @@ async function info(body) {
3185
3302
  }
3186
3303
  });
3187
3304
  }
3305
+ var dayStatsCache = new TtlCache({
3306
+ namespace: "zframes:hyperliquid:daystats",
3307
+ ttlMs: 25e3
3308
+ });
3309
+ var openInterestCache = new TtlCache({
3310
+ namespace: "zframes:hyperliquid:oi",
3311
+ ttlMs: 25e3
3312
+ });
3313
+ var candlesCache = new TtlCache({
3314
+ namespace: "zframes:hyperliquid:candles",
3315
+ ttlMs: 55e3,
3316
+ persist: true
3317
+ });
3318
+ var fundingCache = new TtlCache({
3319
+ namespace: "zframes:hyperliquid:funding",
3320
+ ttlMs: 4.5 * 6e4,
3321
+ persist: true
3322
+ });
3323
+ var sortedKey = (symbols) => symbols ? [...symbols].sort().join(",") : "*";
3188
3324
  var HyperliquidProvider = class {
3189
3325
  name = "hyperliquid";
3190
3326
  capabilities = [
@@ -3214,7 +3350,13 @@ var HyperliquidProvider = class {
3214
3350
  if (this.listeners.size === 0) this.teardown();
3215
3351
  };
3216
3352
  }
3217
- async getDayStats(symbols) {
3353
+ getDayStats(symbols) {
3354
+ return dayStatsCache.get(
3355
+ sortedKey(symbols),
3356
+ () => this.fetchDayStats(symbols)
3357
+ );
3358
+ }
3359
+ async fetchDayStats(symbols) {
3218
3360
  const wholeDexes = /* @__PURE__ */ new Set();
3219
3361
  const concrete = /* @__PURE__ */ new Set();
3220
3362
  if (!symbols) {
@@ -3251,7 +3393,13 @@ var HyperliquidProvider = class {
3251
3393
  );
3252
3394
  return out;
3253
3395
  }
3254
- async getOpenInterest(symbols) {
3396
+ getOpenInterest(symbols) {
3397
+ return openInterestCache.get(
3398
+ sortedKey(symbols),
3399
+ () => this.fetchOpenInterest(symbols)
3400
+ );
3401
+ }
3402
+ async fetchOpenInterest(symbols) {
3255
3403
  const wholeDexes = /* @__PURE__ */ new Set();
3256
3404
  const concrete = /* @__PURE__ */ new Set();
3257
3405
  if (!symbols) {
@@ -3284,7 +3432,13 @@ var HyperliquidProvider = class {
3284
3432
  );
3285
3433
  return out.sort((a, b) => b.openInterestUsd - a.openInterestUsd);
3286
3434
  }
3287
- async getFundingHistory(symbols, startTimeMs) {
3435
+ getFundingHistory(symbols, startTimeMs) {
3436
+ return fundingCache.get(
3437
+ `${[...symbols].sort().join(",")}|${startTimeMs}`,
3438
+ () => this.fetchFundingHistory(symbols, startTimeMs)
3439
+ );
3440
+ }
3441
+ async fetchFundingHistory(symbols, startTimeMs) {
3288
3442
  const results = await Promise.all(
3289
3443
  symbols.map(async (coin) => {
3290
3444
  const entries = await info({
@@ -3303,7 +3457,13 @@ var HyperliquidProvider = class {
3303
3457
  );
3304
3458
  return Object.fromEntries(results);
3305
3459
  }
3306
- async getCandles(symbol, interval, startTimeMs) {
3460
+ getCandles(symbol, interval, startTimeMs) {
3461
+ return candlesCache.get(
3462
+ `${symbol}|${interval}|${startTimeMs}`,
3463
+ () => this.fetchCandles(symbol, interval, startTimeMs)
3464
+ );
3465
+ }
3466
+ async fetchCandles(symbol, interval, startTimeMs) {
3307
3467
  const entries = await info({
3308
3468
  type: "candleSnapshot",
3309
3469
  req: { coin: symbol, interval, startTime: startTimeMs }