gloomberb 0.16.3 → 0.16.4

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 (451) hide show
  1. package/package.json +4 -1
  2. package/src/api-client/askg.ts +43 -0
  3. package/src/api-client/auth.ts +15 -0
  4. package/src/api-client/beneficial-owners.ts +4 -0
  5. package/src/api-client/chat.ts +19 -0
  6. package/src/api-client/company-kpis.ts +14 -2
  7. package/src/api-client/data.ts +34 -16
  8. package/src/api-client/index.ts +12 -0
  9. package/src/api-client/normalizers.ts +27 -0
  10. package/src/api-client/paths.ts +88 -23
  11. package/src/api-client/request.ts +2 -1
  12. package/src/api-client/research-activity.ts +31 -0
  13. package/src/api-client/socket.ts +39 -8
  14. package/src/api-client/types.ts +57 -1
  15. package/src/api-client/upgrade-experiment.ts +90 -0
  16. package/src/app/global-shortcuts.ts +11 -1
  17. package/src/app/keybindings/actions.ts +10 -0
  18. package/src/app/pane-runtime/index.tsx +8 -0
  19. package/src/app/pane-runtime/pane-template-runtime.ts +5 -0
  20. package/src/app/pane-runtime/plugin-bindings.ts +65 -25
  21. package/src/app/pane-runtime/ticker-inspector-runtime.ts +12 -0
  22. package/src/app/pane-runtime/ticker-open-runtime.ts +18 -1
  23. package/src/app/runtime/desktop-deeplink.ts +5 -0
  24. package/src/app/star-prompt/model.ts +98 -0
  25. package/src/app/star-prompt/runtime.ts +41 -0
  26. package/src/app/star-prompt/status-line.tsx +190 -0
  27. package/src/app.tsx +13 -7
  28. package/src/architecture/core-builtin-allowlist.json +70 -0
  29. package/src/brokers/signed-in/adapter.ts +33 -2
  30. package/src/brokers/signed-in/client.ts +10 -0
  31. package/src/brokers/signed-in/sign-in-dialog.tsx +23 -9
  32. package/src/brokers/signed-in/sign-in.ts +62 -5
  33. package/src/capabilities/registry.ts +8 -1
  34. package/src/capabilities/types.ts +2 -0
  35. package/src/cli/commands/crypto-hints.ts +12 -4
  36. package/src/cli/commands/market.ts +359 -99
  37. package/src/cli/commands/options-chain.ts +172 -0
  38. package/src/cli/commands/options-leaps.ts +422 -0
  39. package/src/cli/commands/overview.ts +164 -26
  40. package/src/cli/commands/search.ts +29 -8
  41. package/src/cli/commands/system.ts +99 -19
  42. package/src/cli/commands/themes.ts +64 -0
  43. package/src/cli/commands/ticker.ts +62 -30
  44. package/src/cli/desktop-pane-shot.ts +97 -16
  45. package/src/cli/errors.ts +25 -2
  46. package/src/cli/freshness.ts +7 -4
  47. package/src/cli/fx-pair.ts +57 -0
  48. package/src/cli/help.ts +14 -1
  49. package/src/cli/index-roots.ts +51 -0
  50. package/src/cli/index.ts +9 -6
  51. package/src/cli/listing-arg.ts +211 -3
  52. package/src/cli/not-a-ticker.ts +37 -0
  53. package/src/cli/options.ts +50 -6
  54. package/src/cli/pane-functions/capabilities.ts +8 -2
  55. package/src/cli/pane-functions/catalog.ts +13 -2
  56. package/src/cli/pane-functions/data.ts +36 -5
  57. package/src/cli/pane-functions/dom.ts +21 -13
  58. package/src/cli/pane-functions/freshness.ts +205 -26
  59. package/src/cli/pane-functions/function-help.ts +67 -22
  60. package/src/cli/pane-functions/headless.ts +5 -4
  61. package/src/cli/pane-functions/index.ts +3 -0
  62. package/src/cli/pane-functions/market-session.ts +133 -0
  63. package/src/cli/pane-functions/options.ts +15 -4
  64. package/src/cli/pane-functions/report-notices.ts +63 -0
  65. package/src/cli/pane-functions/report.ts +4 -0
  66. package/src/cli/pane-functions/resolver.ts +4 -6
  67. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  68. package/src/cli/pane-functions/screenshot.ts +105 -23
  69. package/src/cli/registry.ts +2 -1
  70. package/src/cli/result.ts +50 -13
  71. package/src/cli/row-window.ts +76 -0
  72. package/src/cli/scroll-truncation.ts +34 -0
  73. package/src/components/chart/composite/composite-chart.tsx +43 -4
  74. package/src/components/chart/composite/legend.tsx +39 -6
  75. package/src/components/chart/composite/rasterizer.ts +64 -4
  76. package/src/components/chart/composite/series-cues.ts +71 -0
  77. package/src/components/chart/composite/text-renderer.ts +16 -8
  78. package/src/components/chart/composite/types.ts +3 -0
  79. package/src/components/command-bar/commands/direct/index.ts +9 -1
  80. package/src/components/command-bar/commands/plugin/items.ts +3 -1
  81. package/src/components/command-bar/commands/registry.ts +7 -0
  82. package/src/components/command-bar/layout-items/focused-pane.ts +38 -0
  83. package/src/components/command-bar/pane-templates/workflow.ts +5 -0
  84. package/src/components/command-bar/routes/root/command-items.ts +2 -0
  85. package/src/components/command-bar/routes/root/plugin-turn-on.ts +92 -0
  86. package/src/components/command-bar/routes/root/results.ts +40 -10
  87. package/src/components/command-bar/routes/root/runtime.ts +8 -0
  88. package/src/components/command-bar/routes/root/search-providers.ts +97 -14
  89. package/src/components/command-bar/surface/index.tsx +18 -4
  90. package/src/components/command-bar/theme-picker.tsx +48 -13
  91. package/src/components/command-bar/workflow/ops.ts +5 -3
  92. package/src/components/data-table/view.tsx +28 -9
  93. package/src/components/layout/floating-pane.tsx +6 -2
  94. package/src/components/layout/market-summary.ts +23 -9
  95. package/src/components/layout/pane/content.tsx +46 -29
  96. package/src/components/layout/pane/cycle-order.ts +2 -11
  97. package/src/components/layout/pane/header.tsx +2 -1
  98. package/src/components/layout/pane/title.ts +1 -1
  99. package/src/components/layout/presentation.ts +22 -0
  100. package/src/components/layout/shell/active-drag.ts +1 -1
  101. package/src/components/layout/shell/drag/index.ts +4 -0
  102. package/src/components/layout/shell/drag/live.ts +76 -5
  103. package/src/components/layout/shell/drag/runtime.ts +8 -8
  104. package/src/components/layout/shell/index.tsx +47 -6
  105. package/src/components/layout/shell/layout-state.ts +5 -11
  106. package/src/components/layout/shell/menu.ts +28 -1
  107. package/src/components/layout/shell/pane/actions.ts +2 -1
  108. package/src/components/layout/shell/pane/layers.tsx +51 -10
  109. package/src/components/layout/shell/pane/management-shortcuts.ts +5 -0
  110. package/src/components/layout/shell/pane/new-layout.ts +116 -0
  111. package/src/components/layout/shell/shortcuts.ts +5 -2
  112. package/src/components/layout/shell/visible-layout.ts +44 -1
  113. package/src/components/layout/status-bar.tsx +4 -1
  114. package/src/components/markdown-text.tsx +9 -5
  115. package/src/components/metric-treemap/heat-surface.tsx +27 -8
  116. package/src/components/metric-treemap/heat-tiles.ts +48 -17
  117. package/src/components/onboarding/onboarding-frame.tsx +33 -10
  118. package/src/components/onboarding/onboarding-wizard.tsx +49 -40
  119. package/src/components/onboarding/portfolio-step/positions-panel.tsx +5 -2
  120. package/src/components/onboarding/pro-step-layout.ts +86 -0
  121. package/src/components/onboarding/use-onboarding-upgrade.ts +6 -2
  122. package/src/components/ui/button.tsx +10 -0
  123. package/src/components/ui/data-table/index.tsx +38 -0
  124. package/src/components/ui/data-table/types.ts +8 -1
  125. package/src/components/ui/data-table/visible-range.ts +2 -0
  126. package/src/components/ui/icon.tsx +11 -2
  127. package/src/components/ui/index.ts +1 -1
  128. package/src/core/connection-health.ts +1 -1
  129. package/src/core/state/app/layout-reducer.ts +89 -3
  130. package/src/core/state/app/state.ts +8 -5
  131. package/src/core/state/app/types.ts +13 -2
  132. package/src/data/config/layout.ts +55 -21
  133. package/src/data/config/store/fold-panes.ts +149 -0
  134. package/src/data/config/store/migrations.ts +7 -0
  135. package/src/data/config/store/node.ts +27 -6
  136. package/src/data/config/store/normalize.ts +37 -3
  137. package/src/i18n/es.ts +14 -1
  138. package/src/i18n/ja.ts +14 -1
  139. package/src/i18n/ko.ts +14 -1
  140. package/src/i18n/zh-cn.ts +14 -1
  141. package/src/i18n/zh-tw.ts +14 -1
  142. package/src/layout/desks.ts +1 -2
  143. package/src/layout/pane-layout-move.ts +264 -0
  144. package/src/layout/pane-manager/hidden-panes.ts +160 -0
  145. package/src/layout/pane-manager/index.ts +1 -0
  146. package/src/market-data/coordinator/entries.ts +7 -1
  147. package/src/market-data/coordinator/quotes.ts +2 -2
  148. package/src/market-data/market/freshness.ts +118 -18
  149. package/src/market-data/market/status.ts +40 -0
  150. package/src/market-data/options-alternatives.ts +69 -0
  151. package/src/market-data/quotes/contributions.ts +19 -2
  152. package/src/market-data/quotes/metadata.ts +16 -0
  153. package/src/market-data/quotes/screener-live-quotes.ts +56 -5
  154. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  155. package/src/plugins/builtin/account-management/model.ts +1 -0
  156. package/src/plugins/builtin/account-management/navigation.ts +1 -1
  157. package/src/plugins/builtin/account-management/pane.tsx +31 -4
  158. package/src/plugins/builtin/alerts/quotes.ts +3 -0
  159. package/src/plugins/builtin/analytics/risk-headless.ts +3 -1
  160. package/src/plugins/builtin/analytics/risk-model.ts +37 -8
  161. package/src/plugins/builtin/analytics/risk-pane.tsx +8 -4
  162. package/src/plugins/builtin/backtest/pane.tsx +1 -1
  163. package/src/plugins/builtin/broker-manager/detail.tsx +4 -0
  164. package/src/plugins/builtin/broker-manager/index.tsx +7 -3
  165. package/src/plugins/builtin/broker-manager/model.ts +8 -0
  166. package/src/plugins/builtin/broker-manager/pane-actions.tsx +8 -2
  167. package/src/plugins/builtin/broker-manager/sign-in-end.ts +82 -0
  168. package/src/plugins/builtin/broker-manager/table.ts +5 -0
  169. package/src/plugins/builtin/builtin-plugin-meta.ts +121 -11
  170. package/src/plugins/builtin/chart-composer/pane.tsx +1 -1
  171. package/src/plugins/builtin/chat/channels.ts +34 -36
  172. package/src/plugins/builtin/chat/command-bar.ts +138 -0
  173. package/src/plugins/builtin/chat/composer-commands.ts +21 -1
  174. package/src/plugins/builtin/chat/content/composer-runtime.ts +11 -1
  175. package/src/plugins/builtin/chat/content/footer.tsx +5 -3
  176. package/src/plugins/builtin/chat/content/index.tsx +21 -1
  177. package/src/plugins/builtin/chat/content/mentions.ts +2 -1
  178. package/src/plugins/builtin/chat/content/user-map.ts +3 -1
  179. package/src/plugins/builtin/chat/controller/index.ts +48 -0
  180. package/src/plugins/builtin/chat/conversations.ts +256 -0
  181. package/src/plugins/builtin/chat/discord-command.ts +91 -0
  182. package/src/plugins/builtin/chat/edit-window.ts +12 -6
  183. package/src/plugins/builtin/chat/ghost-user.ts +14 -0
  184. package/src/plugins/builtin/chat/index.tsx +40 -2
  185. package/src/plugins/builtin/chat/layout.ts +2 -0
  186. package/src/plugins/builtin/chat/message/desktop.tsx +2 -1
  187. package/src/plugins/builtin/chat/message/header.tsx +24 -15
  188. package/src/plugins/builtin/chat/message/profile-popover.tsx +2 -1
  189. package/src/plugins/builtin/chat/message/render-state.ts +3 -0
  190. package/src/plugins/builtin/chat/pane-requests.ts +60 -0
  191. package/src/plugins/builtin/chat/pane-state.ts +32 -2
  192. package/src/plugins/builtin/chat/pane.tsx +8 -0
  193. package/src/plugins/builtin/cloud/askg/controller.ts +112 -4
  194. package/src/plugins/builtin/cloud/askg/conversation-store.ts +21 -0
  195. package/src/plugins/builtin/cloud/askg/manifest.ts +1 -0
  196. package/src/plugins/builtin/cloud/askg/model.ts +129 -70
  197. package/src/plugins/builtin/cloud/askg/pane.tsx +772 -377
  198. package/src/plugins/builtin/cloud/askg/protocol.ts +40 -2
  199. package/src/plugins/builtin/cloud/askg/tool-display.ts +437 -0
  200. package/src/plugins/builtin/cloud/askg/tool-timeline.tsx +403 -0
  201. package/src/plugins/builtin/cloud/company-picker.tsx +1 -9
  202. package/src/plugins/builtin/cloud/mcp-connect/command.ts +24 -0
  203. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +360 -0
  204. package/src/plugins/builtin/cloud/mcp-connect/model.ts +135 -0
  205. package/src/plugins/builtin/cloud/mcp-connect/sections.ts +62 -0
  206. package/src/plugins/builtin/cloud/plugin.tsx +36 -1
  207. package/src/plugins/builtin/cloud/starter-symbols.ts +8 -0
  208. package/src/plugins/builtin/cloud/terminal-relay/acm-tab.tsx +89 -0
  209. package/src/plugins/builtin/cloud/terminal-relay/client.ts +97 -0
  210. package/src/plugins/builtin/cloud/terminal-relay/connect-section.tsx +57 -0
  211. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +666 -0
  212. package/src/plugins/builtin/cloud/terminal-relay/grants.ts +137 -0
  213. package/src/plugins/builtin/cloud/terminal-relay/host.tsx +81 -0
  214. package/src/plugins/builtin/cloud/terminal-relay/indicator.tsx +82 -0
  215. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +234 -0
  216. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +153 -0
  217. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +168 -0
  218. package/src/plugins/builtin/cloud/terminal-relay/redact.ts +73 -0
  219. package/src/plugins/builtin/cloud/terminal-relay/summary.ts +62 -0
  220. package/src/plugins/builtin/cloud/upgrade-dialog.tsx +26 -2
  221. package/src/plugins/builtin/cloud/upgrade-personalization.ts +57 -0
  222. package/src/plugins/builtin/cloud/upgrade-tickers.ts +124 -0
  223. package/src/plugins/builtin/comment-letters/client.ts +1 -3
  224. package/src/plugins/builtin/company-kpis/client.ts +23 -8
  225. package/src/plugins/builtin/company-kpis/headless.ts +3 -1
  226. package/src/plugins/builtin/company-kpis/pane.tsx +15 -7
  227. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +10 -3
  228. package/src/plugins/builtin/composite-plugins.ts +107 -64
  229. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +4 -4
  230. package/src/plugins/builtin/credit-boards/index.tsx +21 -21
  231. package/src/plugins/builtin/credit-boards/model.ts +0 -1
  232. package/src/plugins/builtin/credit-boards/pane.tsx +30 -0
  233. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +4 -4
  234. package/src/plugins/builtin/debt-maturities/client.ts +37 -9
  235. package/src/plugins/builtin/debt-maturities/headless.ts +3 -1
  236. package/src/plugins/builtin/debt-maturities/pane.tsx +5 -4
  237. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  238. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  239. package/src/plugins/builtin/earnings-calls/data.ts +28 -7
  240. package/src/plugins/builtin/earnings-calls/headless.ts +3 -2
  241. package/src/plugins/builtin/earnings-calls/pane.tsx +10 -5
  242. package/src/plugins/builtin/econ/calendar-model.ts +42 -17
  243. package/src/plugins/builtin/econ/detail-view.tsx +2 -2
  244. package/src/plugins/builtin/econ/index.tsx +68 -22
  245. package/src/plugins/builtin/econ-statistics/headless.ts +12 -2
  246. package/src/plugins/builtin/econ-statistics/pane.tsx +1 -1
  247. package/src/plugins/builtin/econ-statistics/view.ts +17 -0
  248. package/src/plugins/builtin/executives/data.ts +17 -6
  249. package/src/plugins/builtin/executives/pane.tsx +16 -7
  250. package/src/plugins/builtin/filing-events/pane.tsx +22 -5
  251. package/src/plugins/builtin/fx-matrix/freshness.ts +65 -0
  252. package/src/plugins/builtin/fx-matrix/index.tsx +22 -1
  253. package/src/plugins/builtin/fx-matrix/pairs.ts +1 -1
  254. package/src/plugins/builtin/fx-matrix/settings.ts +42 -2
  255. package/src/plugins/builtin/gpu/headless.ts +9 -3
  256. package/src/plugins/builtin/gpu/model.ts +14 -5
  257. package/src/plugins/builtin/help/index.tsx +1 -0
  258. package/src/plugins/builtin/holders/beneficial-client.ts +29 -7
  259. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  260. package/src/plugins/builtin/holders/headless.ts +6 -1
  261. package/src/plugins/builtin/holders/pane.tsx +3 -0
  262. package/src/plugins/builtin/insider/index.tsx +4 -4
  263. package/src/plugins/builtin/iv-history/charts.tsx +21 -7
  264. package/src/plugins/builtin/iv-history/client.ts +12 -2
  265. package/src/plugins/builtin/iv-history/format.ts +33 -2
  266. package/src/plugins/builtin/iv-history/headless.ts +22 -10
  267. package/src/plugins/builtin/iv-history/index.tsx +3 -3
  268. package/src/plugins/builtin/iv-history/model.ts +61 -13
  269. package/src/plugins/builtin/iv-history/pane.tsx +11 -3
  270. package/src/plugins/builtin/iv-history/screen-pane.tsx +42 -18
  271. package/src/plugins/builtin/jobs/pane.tsx +1 -1
  272. package/src/plugins/builtin/kelly-sizer/headless.ts +149 -0
  273. package/src/plugins/builtin/kelly-sizer/history.ts +80 -0
  274. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  275. package/src/plugins/builtin/kelly-sizer/pane.tsx +109 -39
  276. package/src/plugins/builtin/kelly-sizer/sections.tsx +14 -0
  277. package/src/plugins/builtin/kelly-sizer/types.ts +9 -1
  278. package/src/plugins/builtin/layout-manager/index.tsx +9 -1
  279. package/src/plugins/builtin/macro-day/client.ts +24 -0
  280. package/src/plugins/builtin/macro-day/headless.ts +11 -8
  281. package/src/plugins/builtin/macro-day/index.tsx +3 -0
  282. package/src/plugins/builtin/macro-day/model.ts +11 -6
  283. package/src/plugins/builtin/macro-day/pane.tsx +12 -8
  284. package/src/plugins/builtin/macro-day/release-table.ts +40 -0
  285. package/src/plugins/builtin/macro-day/releases.ts +62 -44
  286. package/src/plugins/builtin/market-heatmap/data.ts +25 -5
  287. package/src/plugins/builtin/market-heatmap/evidence.ts +90 -0
  288. package/src/plugins/builtin/market-heatmap/index.tsx +144 -63
  289. package/src/plugins/builtin/market-heatmap/model.ts +94 -3
  290. package/src/plugins/builtin/market-heatmap/portfolio.ts +12 -2
  291. package/src/plugins/builtin/market-movers/headless.ts +31 -4
  292. package/src/plugins/builtin/market-movers/index.tsx +8 -1
  293. package/src/plugins/builtin/market-movers/model.ts +71 -17
  294. package/src/plugins/builtin/market-movers/table.ts +50 -23
  295. package/src/plugins/builtin/news/headless.ts +9 -2
  296. package/src/plugins/builtin/news/wire/news/footer.ts +10 -0
  297. package/src/plugins/builtin/openfda/client.ts +1 -1
  298. package/src/plugins/builtin/options/carry.ts +95 -0
  299. package/src/plugins/builtin/options/index.tsx +58 -5
  300. package/src/plugins/builtin/options/strike-window.ts +183 -0
  301. package/src/plugins/builtin/options/table.ts +55 -3
  302. package/src/plugins/builtin/options/types.ts +8 -1
  303. package/src/plugins/builtin/options/view.tsx +161 -12
  304. package/src/plugins/builtin/options-positioning/headless.ts +4 -2
  305. package/src/plugins/builtin/options-scenario/charts.tsx +2 -2
  306. package/src/plugins/builtin/options-scenario/client.ts +73 -17
  307. package/src/plugins/builtin/options-scenario/headless.ts +71 -24
  308. package/src/plugins/builtin/options-scenario/hedge.ts +284 -0
  309. package/src/plugins/builtin/options-scenario/index.tsx +9 -2
  310. package/src/plugins/builtin/options-scenario/model.ts +33 -0
  311. package/src/plugins/builtin/options-scenario/pane.tsx +40 -16
  312. package/src/plugins/builtin/pe-band/model.ts +2 -2
  313. package/src/plugins/builtin/pe-band/report-dates.ts +11 -7
  314. package/src/plugins/builtin/perps/equity-row.tsx +8 -5
  315. package/src/plugins/builtin/perps/model.ts +16 -5
  316. package/src/plugins/builtin/plugin-marketplace/model.ts +64 -21
  317. package/src/plugins/builtin/plugin-marketplace/packs.ts +118 -0
  318. package/src/plugins/builtin/plugin-marketplace/pane.tsx +344 -32
  319. package/src/plugins/builtin/plugin-marketplace/store.ts +7 -1
  320. package/src/plugins/builtin/plugin-module.ts +87 -4
  321. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +71 -36
  322. package/src/plugins/builtin/portfolio-list/cli/render.ts +87 -18
  323. package/src/plugins/builtin/portfolio-list/cli/shared.ts +2 -16
  324. package/src/plugins/builtin/portfolio-list/headless.ts +38 -7
  325. package/src/plugins/builtin/realized-vol/headless.ts +3 -0
  326. package/src/plugins/builtin/realized-vol/pane.tsx +1 -1
  327. package/src/plugins/builtin/research/corporate-actions-pane.tsx +2 -2
  328. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +1 -1
  329. package/src/plugins/builtin/revenue-breakdown/client.ts +13 -6
  330. package/src/plugins/builtin/revenue-breakdown/headless.ts +4 -1
  331. package/src/plugins/builtin/revenue-breakdown/pane.tsx +7 -4
  332. package/src/plugins/builtin/reverse-dcf/headless.ts +5 -1
  333. package/src/plugins/builtin/reverse-dcf/pane.tsx +1 -1
  334. package/src/plugins/builtin/risk-factors/data.ts +23 -9
  335. package/src/plugins/builtin/risk-factors/headless.ts +5 -2
  336. package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
  337. package/src/plugins/builtin/seasonality/pane.tsx +1 -1
  338. package/src/plugins/builtin/sec/index.tsx +5 -5
  339. package/src/plugins/builtin/sectors/client.ts +10 -2
  340. package/src/plugins/builtin/sectors/headless.ts +35 -6
  341. package/src/plugins/builtin/sectors/index.tsx +18 -1
  342. package/src/plugins/builtin/sectors/sector-model.ts +150 -41
  343. package/src/plugins/builtin/shared/command-tab.ts +51 -0
  344. package/src/plugins/builtin/shared/headless-market-data.ts +33 -1
  345. package/src/plugins/builtin/shared/members-menu.tsx +4 -4
  346. package/src/plugins/builtin/shared/report-freshness.ts +50 -2
  347. package/src/plugins/builtin/shared/ticker-request.ts +25 -1
  348. package/src/plugins/builtin/shared/use-quote-board.ts +25 -5
  349. package/src/plugins/builtin/shared/volatility/options.ts +1 -46
  350. package/src/plugins/builtin/short-interest/index.tsx +19 -4
  351. package/src/plugins/builtin/short-interest/surface.tsx +4 -4
  352. package/src/plugins/builtin/short-volume/index.tsx +1 -10
  353. package/src/plugins/builtin/supply-chain/model.ts +1 -1
  354. package/src/plugins/builtin/ticker-detail/headless.ts +43 -21
  355. package/src/plugins/builtin/ticker-detail/pane.tsx +4 -5
  356. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +94 -6
  357. package/src/plugins/builtin/treasury-auctions/cache.ts +5 -2
  358. package/src/plugins/builtin/treasury-auctions/client.ts +22 -8
  359. package/src/plugins/builtin/treasury-auctions/headless.ts +40 -4
  360. package/src/plugins/builtin/treasury-auctions/index.tsx +11 -9
  361. package/src/plugins/builtin/treasury-auctions/model.ts +197 -30
  362. package/src/plugins/builtin/treasury-auctions/pane.tsx +35 -11
  363. package/src/plugins/builtin/treasury-auctions/types.ts +11 -1
  364. package/src/plugins/builtin/vol-surface/charts.tsx +1 -3
  365. package/src/plugins/builtin/vol-surface/client.ts +6 -2
  366. package/src/plugins/builtin/vol-surface/evidence.ts +11 -6
  367. package/src/plugins/builtin/vol-surface/headless.ts +124 -20
  368. package/src/plugins/builtin/vol-surface/model.ts +23 -11
  369. package/src/plugins/builtin/vol-surface/pane.tsx +38 -27
  370. package/src/plugins/builtin/vol-surface/tables.ts +124 -0
  371. package/src/plugins/builtin/world-indices/client.ts +22 -4
  372. package/src/plugins/builtin/world-indices/headless.ts +54 -27
  373. package/src/plugins/builtin/world-indices/model.ts +4 -2
  374. package/src/plugins/builtin/world-indices/table.tsx +13 -2
  375. package/src/plugins/builtin/world-venue-map/geo-series.ts +1 -1
  376. package/src/plugins/builtin/world-venue-map/index.ts +1 -1
  377. package/src/plugins/builtin/yield-curve/index.tsx +1 -1
  378. package/src/plugins/builtin-editorial.ts +126 -0
  379. package/src/plugins/catalog-backend.ts +16 -9
  380. package/src/plugins/catalog-browser.ts +127 -63
  381. package/src/plugins/catalog-manifest.ts +73 -40
  382. package/src/plugins/catalog-ui.ts +26 -6
  383. package/src/plugins/extracted-plugins.ts +7 -1
  384. package/src/plugins/ownership.ts +150 -7
  385. package/src/plugins/plugin-functions.ts +54 -0
  386. package/src/plugins/plugin-off.ts +36 -0
  387. package/src/plugins/registry/host-actions.ts +16 -0
  388. package/src/plugins/registry/index.ts +84 -24
  389. package/src/plugins/registry/plugin-state.ts +25 -1
  390. package/src/plugins/runtime/context.tsx +29 -0
  391. package/src/react/input.ts +48 -1
  392. package/src/remote/app-host.tsx +5 -0
  393. package/src/remote/controller.ts +3 -53
  394. package/src/remote/matching.ts +69 -0
  395. package/src/remote/schema.ts +1 -1
  396. package/src/remote/semantic-tree.tsx +14 -0
  397. package/src/remote/types.ts +2 -0
  398. package/src/renderers/dom/desktop/icons.tsx +14 -0
  399. package/src/renderers/dom/desktop/query-bar.tsx +59 -32
  400. package/src/renderers/dom/host/box.tsx +1 -1
  401. package/src/renderers/dom/host/drag-shield.ts +17 -6
  402. package/src/renderers/dom/host/live-frame.ts +10 -2
  403. package/src/renderers/dom/input-host.tsx +6 -1
  404. package/src/renderers/dom/styles.css +13 -0
  405. package/src/renderers/electrobun/bun/desktop/backend.ts +5 -1
  406. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +12 -1
  407. package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -1
  408. package/src/renderers/electrobun/shared/protocol.ts +2 -0
  409. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  410. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +101 -5
  411. package/src/renderers/electrobun/view/main.tsx +4 -1
  412. package/src/renderers/opentui/input-host.tsx +6 -1
  413. package/src/renderers/opentui/start.tsx +9 -0
  414. package/src/shares/portable-layout.ts +16 -6
  415. package/src/sources/gloomberb-cloud/index.ts +19 -10
  416. package/src/sources/gloomberb-cloud/normalizers.ts +4 -1
  417. package/src/sources/listing-symbols.ts +11 -5
  418. package/src/sources/provider-errors.ts +88 -3
  419. package/src/sources/provider-router/cached-routes.ts +8 -4
  420. package/src/sources/provider-router/financial-routes.ts +11 -5
  421. package/src/sources/provider-router/financials.ts +42 -15
  422. package/src/sources/provider-router/history.ts +27 -11
  423. package/src/sources/provider-router/index.ts +1 -1
  424. package/src/sources/provider-router/primary.ts +23 -5
  425. package/src/sources/sec-edgar.ts +68 -8
  426. package/src/sync/core-contributors.ts +4 -3
  427. package/src/test-support/cli-context.ts +2 -1
  428. package/src/test-support/data-provider.ts +34 -0
  429. package/src/test-support/shell-pane-keys.tsx +1 -0
  430. package/src/theme/series-colors.ts +46 -0
  431. package/src/theme/themes.ts +149 -0
  432. package/src/tickers/search/index.ts +22 -2
  433. package/src/tickers/search/ranking.ts +45 -1
  434. package/src/tickers/search/types.ts +3 -1
  435. package/src/time-series/resolve.ts +1 -14
  436. package/src/types/config.ts +61 -1
  437. package/src/types/headless.ts +11 -0
  438. package/src/types/instrument.ts +8 -0
  439. package/src/types/plugin.ts +49 -3
  440. package/src/ui/host.tsx +8 -4
  441. package/src/ui/index.tsx +2 -0
  442. package/src/utils/cli-output.ts +14 -1
  443. package/src/utils/exchanges.ts +13 -0
  444. package/src/utils/format.ts +2 -1
  445. package/src/utils/fx-market-hours.ts +34 -0
  446. package/src/utils/option-expiry.ts +126 -0
  447. package/src/utils/price-history.ts +39 -6
  448. package/src/utils/rpc-timeout-error.ts +6 -2
  449. package/src/utils/sec-eps-basis.ts +159 -30
  450. package/src/utils/sec.ts +38 -34
  451. package/src/utils/throttled-fetch.ts +51 -22
@@ -3,16 +3,16 @@ import type {
3
3
  ASKGConversationDetail,
4
4
  ASKGConversationTool,
5
5
  } from "../../../../api-client/askg";
6
- import {
7
- SCRIPT_TOOL_NAME,
8
- type ASKGLimits,
9
- type ASKGSseEvent,
10
- type ASKGToolCallEvent,
11
- type JsonValue,
12
- type ToolManifestSource,
13
- type ToolResultPayload,
14
- type ToolResultStatus,
15
- type WriteTier,
6
+ import type {
7
+ ASKGFeedback,
8
+ ASKGLimits,
9
+ ASKGSseEvent,
10
+ ASKGToolCallEvent,
11
+ JsonValue,
12
+ ToolManifestSource,
13
+ ToolResultPayload,
14
+ ToolResultStatus,
15
+ WriteTier,
16
16
  } from "./protocol";
17
17
  import { capToolNote } from "./notes";
18
18
 
@@ -35,6 +35,8 @@ export interface ASKGToolRow {
35
35
  name: string;
36
36
  /** One line rendering of the call arguments, e.g. `NVDA · range=5Y`. */
37
37
  argumentSummary: string;
38
+ /** The arguments themselves, when known, so the row can name what it read. */
39
+ args?: Record<string, JsonValue>;
38
40
  writeTier: WriteTier;
39
41
  /** Server tools are executed by the platform and marked as run by Gloom. */
40
42
  origin: "client" | "server";
@@ -67,6 +69,14 @@ export interface ASKGErrorState {
67
69
  retryAfterMs?: number;
68
70
  }
69
71
 
72
+ /** The person's rating of one answer, as the control shows it. */
73
+ export interface ASKGTurnFeedback extends ASKGFeedback {
74
+ /** A request is out: the control already shows the choice it carries. */
75
+ pending: "rating" | "share" | null;
76
+ /** Asked to send, and the server had no answer left to send. */
77
+ shareFailed?: boolean;
78
+ }
79
+
70
80
  export interface ASKGTurn {
71
81
  id: string;
72
82
  /** Server turn id, known once the stream announces itself. */
@@ -77,6 +87,8 @@ export interface ASKGTurn {
77
87
  status: ASKGTurnStatus;
78
88
  error: ASKGErrorState | null;
79
89
  startedAt: number;
90
+ /** Absent until rated, here or on a stored conversation. */
91
+ feedback?: ASKGTurnFeedback;
80
92
  }
81
93
 
82
94
  export interface ASKGConversationState {
@@ -90,6 +102,11 @@ export interface ASKGConversationState {
90
102
  turns: ASKGTurn[];
91
103
  /** Highest applied `seq`, so a resumed stream skips replayed events. */
92
104
  lastSeq: number;
105
+ /**
106
+ * The server takes answer ratings: a session or a reopened conversation
107
+ * said so. Until then, and on an older server, no answer shows the control.
108
+ */
109
+ feedbackAvailable: boolean;
93
110
  }
94
111
 
95
112
  export const EMPTY_ASKG_CONVERSATION: ASKGConversationState = {
@@ -100,6 +117,7 @@ export const EMPTY_ASKG_CONVERSATION: ASKGConversationState = {
100
117
  acceptedTools: [],
101
118
  turns: [],
102
119
  lastSeq: 0,
120
+ feedbackAvailable: false,
103
121
  };
104
122
 
105
123
  export type ASKGAction =
@@ -109,8 +127,12 @@ export type ASKGAction =
109
127
  model: string;
110
128
  limits: ASKGLimits;
111
129
  acceptedTools: string[];
130
+ /** The session accepted answer ratings. */
131
+ feedback: boolean;
112
132
  }
113
133
  | { type: "prompt"; turnId: string; prompt: string; at: number }
134
+ | { type: "feedback"; turnId: string; feedback: ASKGTurnFeedback | null }
135
+ | { type: "feedback-unavailable" }
114
136
  | { type: "event"; event: ASKGSseEvent }
115
137
  | { type: "tool-awaiting-confirmation"; toolCallId: string }
116
138
  | { type: "tool-running"; toolCallId: string }
@@ -170,6 +192,7 @@ function rowFromToolCall(event: ASKGToolCallEvent): ASKGToolRow {
170
192
  toolCallId: event.toolCallId,
171
193
  name: event.name,
172
194
  argumentSummary: summarizeToolArguments(event.args),
195
+ args: event.args,
173
196
  writeTier: event.writeTier,
174
197
  origin: "client",
175
198
  status: requiresLocalConfirmation(event) ? "awaiting-confirmation" : "pending",
@@ -230,6 +253,12 @@ function appendToolRow(turn: ASKGTurn, row: ASKGToolRow): ASKGTurn {
230
253
  return { ...turn, tools };
231
254
  }
232
255
 
256
+ /** A refusal at the daily cap means none are left, whatever the count read earlier. */
257
+ function withQuotaSpent(state: ASKGConversationState, code: ASKGClientErrorCode): ASKGConversationState {
258
+ if (code !== "daily_turn_cap" || !state.limits) return state;
259
+ return { ...state, limits: { ...state.limits, turnsRemainingToday: 0 } };
260
+ }
261
+
233
262
  function applyEvent(
234
263
  state: ASKGConversationState,
235
264
  event: ASKGSseEvent,
@@ -239,7 +268,11 @@ function applyEvent(
239
268
  const next = { ...state, lastSeq: event.seq };
240
269
 
241
270
  switch (event.type) {
242
- case "session":
271
+ case "session": {
272
+ const turn = next.turns[next.turns.length - 1];
273
+ // The limits were read when the session opened; every turn the platform
274
+ // admits since then uses one of the questions they counted.
275
+ const admitted = !!turn && !turn.remoteTurnId && !!next.limits;
243
276
  return patchTurn(
244
277
  {
245
278
  ...next,
@@ -247,10 +280,17 @@ function applyEvent(
247
280
  model: event.model,
248
281
  // A turn that named no conversation learns here where it was filed.
249
282
  conversationId: event.conversationId ?? next.conversationId,
283
+ ...(admitted && next.limits ? {
284
+ limits: {
285
+ ...next.limits,
286
+ turnsRemainingToday: Math.max(0, next.limits.turnsRemainingToday - 1),
287
+ },
288
+ } : {}),
250
289
  },
251
290
  null,
252
- (turn) => (turn.remoteTurnId ? turn : { ...turn, remoteTurnId: event.turnId }),
291
+ (current) => (current.remoteTurnId ? current : { ...current, remoteTurnId: event.turnId }),
253
292
  );
293
+ }
254
294
  case "text-delta":
255
295
  return patchTurn(next, event.turnId, (turn) => ({
256
296
  ...turn,
@@ -263,10 +303,13 @@ function applyEvent(
263
303
  // A call this client ran keeps its own row whatever the echo says it
264
304
  // was: replacing it would drop its write tier, result and undo.
265
305
  if (event.source === "server" && !hasClientRow(next, event.toolCallId)) {
306
+ // A server older than the field sends none, like a stored call that kept none.
307
+ const args = isRecord(event.args) ? event.args : undefined;
266
308
  return patchTurn(next, event.turnId, (turn) => appendToolRow(turn, {
267
309
  toolCallId: event.toolCallId,
268
310
  name: event.name,
269
- argumentSummary: event.summary.note ?? "",
311
+ argumentSummary: args ? summarizeToolArguments(args) : (event.summary.note ?? ""),
312
+ ...(args ? { args } : {}),
270
313
  writeTier: "read",
271
314
  origin: "server",
272
315
  source: event.source,
@@ -292,7 +335,7 @@ function applyEvent(
292
335
  case "tool-result-ack":
293
336
  return next;
294
337
  case "error":
295
- return patchTurn(next, event.turnId ?? null, (turn) => ({
338
+ return patchTurn(withQuotaSpent(next, event.code), event.turnId ?? null, (turn) => ({
296
339
  ...turn,
297
340
  status: "error",
298
341
  error: {
@@ -345,7 +388,21 @@ export function askgReducer(
345
388
  model: action.model,
346
389
  limits: action.limits,
347
390
  acceptedTools: action.acceptedTools,
391
+ feedbackAvailable: action.feedback,
348
392
  };
393
+ case "feedback": {
394
+ const index = state.turns.findIndex((turn) => turn.id === action.turnId);
395
+ const turn = state.turns[index];
396
+ if (!turn) return state;
397
+ const next: ASKGTurn = { ...turn };
398
+ if (action.feedback) next.feedback = action.feedback;
399
+ else delete next.feedback;
400
+ const turns = [...state.turns];
401
+ turns[index] = next;
402
+ return { ...state, turns };
403
+ }
404
+ case "feedback-unavailable":
405
+ return state.feedbackAvailable ? { ...state, feedbackAvailable: false } : state;
349
406
  case "prompt":
350
407
  return {
351
408
  ...state,
@@ -392,7 +449,7 @@ export function askgReducer(
392
449
  case "undo":
393
450
  return patchToolRow(state, action.toolCallId, (row) => ({ ...row, undo: action.undo }));
394
451
  case "turn-failed":
395
- return patchTurn(state, action.turnId, (turn) => ({
452
+ return patchTurn(withQuotaSpent(state, action.error.code), action.turnId, (turn) => ({
396
453
  ...turn,
397
454
  status: "error",
398
455
  error: action.error,
@@ -423,6 +480,9 @@ export function askgReducer(
423
480
  conversationId: action.conversation.id,
424
481
  turns: turnsFromConversation(action.conversation),
425
482
  lastSeq: 0,
483
+ // No session may be open yet, so the stored conversation says it too.
484
+ feedbackAvailable: state.feedbackAvailable
485
+ || action.conversation.capabilities?.feedback === 1,
426
486
  };
427
487
  case "conversation-started":
428
488
  return { ...state, conversationId: null, turns: [], lastSeq: 0 };
@@ -433,6 +493,7 @@ export function askgReducer(
433
493
  model: state.model,
434
494
  limits: state.limits,
435
495
  acceptedTools: state.acceptedTools,
496
+ feedbackAvailable: state.feedbackAvailable,
436
497
  };
437
498
  }
438
499
  }
@@ -449,6 +510,7 @@ function rowFromStoredTool(tool: ASKGConversationTool): ASKGToolRow {
449
510
  argumentSummary: tool.args
450
511
  ? summarizeToolArguments(tool.args as Record<string, JsonValue>)
451
512
  : (tool.note ?? ""),
513
+ ...(tool.args ? { args: tool.args as Record<string, JsonValue> } : {}),
452
514
  writeTier: "read",
453
515
  origin: tool.origin,
454
516
  status: (tool.status as ASKGToolRowStatus) ?? "ok",
@@ -460,6 +522,31 @@ function rowFromStoredTool(tool: ASKGConversationTool): ASKGToolRow {
460
522
  };
461
523
  }
462
524
 
525
+ /** A stored rating, read defensively: an unknown thumb is no rating. */
526
+ function storedFeedback(
527
+ feedback: ASKGFeedback | null | undefined,
528
+ ): ASKGTurnFeedback | null {
529
+ if (!feedback || (feedback.rating !== "up" && feedback.rating !== "down")) return null;
530
+ return {
531
+ rating: feedback.rating,
532
+ reason: feedback.rating === "down" ? feedback.reason ?? null : null,
533
+ shared: feedback.shared === true,
534
+ pending: null,
535
+ };
536
+ }
537
+
538
+ /**
539
+ * Whether an answer shows the rating control: a finished answer with text,
540
+ * filed under a server turn id, on a server that takes ratings. A failed,
541
+ * cancelled or still streaming turn has nothing to rate.
542
+ */
543
+ export function canRateTurn(state: ASKGConversationState, turn: ASKGTurn): boolean {
544
+ return state.feedbackAvailable
545
+ && turn.status === "complete"
546
+ && !!turn.remoteTurnId
547
+ && turn.answer.trim().length > 0;
548
+ }
549
+
463
550
  /**
464
551
  * Rebuilds the transcript of a reopened conversation. Messages arrive oldest
465
552
  * first as alternating question and answer, and each pair becomes one turn, so
@@ -489,6 +576,7 @@ export function turnsFromConversation(
489
576
  // still shows rather than being dropped on the floor.
490
577
  const turn = turns[turns.length - 1];
491
578
  const tools = message.tools.map(rowFromStoredTool);
579
+ const feedback = storedFeedback(message.feedback);
492
580
  if (!turn || turn.answer) {
493
581
  turns.push({
494
582
  id: `stored:${conversation.id}:${message.seq}`,
@@ -499,10 +587,18 @@ export function turnsFromConversation(
499
587
  status: "complete",
500
588
  error: null,
501
589
  startedAt,
590
+ ...(feedback ? { feedback } : {}),
502
591
  });
503
592
  continue;
504
593
  }
505
- turns[turns.length - 1] = { ...turn, answer: message.text, tools };
594
+ turns[turns.length - 1] = {
595
+ ...turn,
596
+ // The answer's id is the one the rating was filed under.
597
+ remoteTurnId: message.turnId ?? turn.remoteTurnId,
598
+ answer: message.text,
599
+ tools,
600
+ ...(feedback ? { feedback } : {}),
601
+ };
506
602
  }
507
603
  return turns;
508
604
  }
@@ -713,64 +809,27 @@ export function canRetryASKGError(error: ASKGErrorState): boolean {
713
809
  return !UNRETRYABLE_ERROR_CODES.has(error.code);
714
810
  }
715
811
 
812
+ /** "12s", "8 min", "22 h": a wait a person can picture. */
813
+ function waitText(ms: number): string {
814
+ const seconds = Math.max(1, Math.round(ms / 1000));
815
+ if (seconds < 90) return `${seconds}s`;
816
+ const minutes = Math.round(seconds / 60);
817
+ if (minutes < 90) return `${minutes} min`;
818
+ return `${Math.round(minutes / 60)} h`;
819
+ }
820
+
716
821
  /** Specific, actionable one line description of a failure. */
717
822
  export function describeASKGError(error: ASKGErrorState): string {
718
823
  const title = ERROR_TITLES[error.code] ?? "Ask Gloom failed";
719
- const retry = error.retryAfterMs && error.retryAfterMs > 0
720
- ? ` Try again in ${Math.max(1, Math.round(error.retryAfterMs / 1000))}s.`
721
- : "";
722
- const detail = error.message.trim();
824
+ const wait = error.retryAfterMs && error.retryAfterMs > 0 ? waitText(error.retryAfterMs) : null;
825
+ // The cap has one thing to say: none left, and when there will be more.
826
+ if (error.code === "daily_turn_cap") {
827
+ return `No questions left today.${wait ? ` More in ${wait}.` : ""}`;
828
+ }
829
+ const retry = wait ? ` Try again in ${wait}.` : "";
830
+ // A machine code the platform appends ("daily_turn_cap") is not for people.
831
+ const detail = error.message.replace(/\s*\b[a-z]+(?:_[a-z]+)+\b\.?/g, "").trim();
723
832
  return detail && detail.toLowerCase() !== title.toLowerCase()
724
833
  ? `${title}: ${detail}${retry}`
725
834
  : `${title}.${retry}`;
726
835
  }
727
-
728
- /**
729
- * The server running a script of tool calls in one step. Each call it made
730
- * has its own row above it, so this row only reports how the script ended.
731
- */
732
- function isScriptRow(row: Pick<ASKGToolRow, "name" | "origin">): boolean {
733
- return row.origin === "server" && row.name === SCRIPT_TOOL_NAME;
734
- }
735
-
736
- /**
737
- * The label and one-line summary a timeline row leads with. A script has no
738
- * arguments worth showing: a clean run puts its note ("3 calls, 1.2 s") on
739
- * the line, and any other outcome leaves the note to the line below, which
740
- * wraps, so it is said once and in full.
741
- */
742
- export function toolRowHeadline(row: ASKGToolRow): { label: string; summary: string } {
743
- if (!isScriptRow(row)) return { label: row.name, summary: row.argumentSummary };
744
- return { label: "Script", summary: row.status === "ok" ? row.note ?? "" : "" };
745
- }
746
-
747
- /** Wording for the tool row status column. */
748
- export function describeToolStatus(row: ASKGToolRow): string {
749
- // A script counts calls, not rows, and its note already says how many.
750
- if (isScriptRow(row)) {
751
- if (row.status === "ok") return "done";
752
- if (row.status === "partial") return "partial";
753
- }
754
- switch (row.status) {
755
- case "pending":
756
- return "queued";
757
- case "awaiting-confirmation":
758
- return "needs approval";
759
- case "running":
760
- return "running";
761
- case "ok":
762
- return row.rowCount === undefined
763
- ? "done"
764
- : `${row.rowCount} ${row.rowCount === 1 ? "row" : "rows"}`;
765
- case "partial":
766
- return row.rowCount === undefined ? "partial" : `${row.rowCount} rows · partial`;
767
- case "denied":
768
- return "declined";
769
- case "timeout":
770
- return "timed out";
771
- case "cancelled":
772
- return "cancelled";
773
- case "error":
774
- return "failed";
775
- }
776
- }