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
@@ -20,6 +20,8 @@ export interface ChatMessageRenderState {
20
20
  replyAuthorColor: string;
21
21
  headerStatus: string;
22
22
  headerStatusColor: string;
23
+ /** The dim "Discord" tag beside the author of a message that came from Discord. */
24
+ originTagColor: string;
23
25
  authorColor: string;
24
26
  authorAttributes: number;
25
27
  bodyColor: string;
@@ -82,6 +84,7 @@ export function getChatMessageRenderState({
82
84
  : hasFailed
83
85
  ? colors.negative
84
86
  : colors.textMuted,
87
+ originTagColor: isSelected ? selectedTextColor : colors.textDim,
85
88
  authorColor: isSelected ? selectedTextColor : hasFailed ? colors.negative : colors.positive,
86
89
  authorAttributes: (isSending ? TextAttributes.DIM : 0) | TextAttributes.BOLD,
87
90
  bodyColor: isSelected ? selectedTextColor : hasFailed ? colors.negative : isSending ? colors.textDim : colors.text,
@@ -0,0 +1,60 @@
1
+ import { useSyncExternalStore } from "react";
2
+
3
+ /**
4
+ * Something a Chat pane should do once it has the keyboard, asked for from
5
+ * outside it: the command bar opens a conversation to write in, or the New DM
6
+ * dialog. The pane that is focused on that conversation takes it.
7
+ */
8
+ export type ChatPaneRequest =
9
+ | { action: "compose"; channelId: string }
10
+ | { action: "new-dm" };
11
+
12
+ interface PendingChatPaneRequest {
13
+ request: ChatPaneRequest;
14
+ at: number;
15
+ }
16
+
17
+ /** A request no pane took by then (the pane never opened) must not fire later. */
18
+ const REQUEST_TTL_MS = 10_000;
19
+
20
+ let pending: PendingChatPaneRequest | null = null;
21
+ const listeners = new Set<() => void>();
22
+
23
+ function emit(): void {
24
+ for (const listener of listeners) listener();
25
+ }
26
+
27
+ export function requestChatPaneAction(request: ChatPaneRequest, now = Date.now()): void {
28
+ pending = { request, at: now };
29
+ emit();
30
+ }
31
+
32
+ /**
33
+ * Hands the request to the pane on `channelId` and clears it. Null when there
34
+ * is none for that pane or it went stale.
35
+ */
36
+ export function takeChatPaneRequest(channelId: string, now = Date.now()): ChatPaneRequest | null {
37
+ if (!pending) return null;
38
+ const { request, at } = pending;
39
+ if (now - at > REQUEST_TTL_MS) {
40
+ pending = null;
41
+ emit();
42
+ return null;
43
+ }
44
+ if (request.action === "compose" && request.channelId !== channelId) return null;
45
+ pending = null;
46
+ emit();
47
+ return request;
48
+ }
49
+
50
+ function subscribe(listener: () => void): () => void {
51
+ listeners.add(listener);
52
+ return () => {
53
+ listeners.delete(listener);
54
+ };
55
+ }
56
+
57
+ /** The request waiting for a pane, so a pane can take it once it has the keyboard. */
58
+ export function usePendingChatPaneRequest(): ChatPaneRequest | null {
59
+ return useSyncExternalStore(subscribe, () => pending?.request ?? null);
60
+ }
@@ -1,6 +1,6 @@
1
1
  import { updatePaneInstance } from "../../../pane-settings";
2
- import { removePane } from "../../../layout/pane-manager";
3
- import type { AppConfig } from "../../../types/config";
2
+ import { isPaneInLayout, removePane } from "../../../layout/pane-manager";
3
+ import type { AppConfig, LayoutConfig, PaneInstanceConfig } from "../../../types/config";
4
4
  import { LAST_VISITED_CHAT_CHANNEL_KEY, normalizeChannelId } from "./channels";
5
5
 
6
6
  type ChatPaneSettings = Record<string, unknown>;
@@ -32,6 +32,36 @@ export function clearChatPaneTargetMessage(
32
32
  return nextSettings;
33
33
  }
34
34
 
35
+ function paneChannelId(instance: PaneInstanceConfig): string | null {
36
+ return typeof instance.settings?.channelId === "string" ? normalizeChannelId(instance.settings.channelId) : null;
37
+ }
38
+
39
+ /**
40
+ * The Chat pane the command bar shows a conversation in: the one already on
41
+ * it, else the focused one, else the one in front. Null when none is open, so
42
+ * the caller opens one.
43
+ */
44
+ export function pickChatPaneToReuse(
45
+ layout: LayoutConfig,
46
+ focusedPaneId: string | null,
47
+ channelId: string | null,
48
+ ): PaneInstanceConfig | null {
49
+ const chatPanes = layout.instances.filter((instance) => (
50
+ instance.paneId === "chat" && isPaneInLayout(layout, instance.instanceId)
51
+ ));
52
+ if (chatPanes.length === 0) return null;
53
+ const onChannel = channelId ? chatPanes.find((instance) => paneChannelId(instance) === channelId) : undefined;
54
+ if (onChannel) return onChannel;
55
+ const focused = chatPanes.find((instance) => instance.instanceId === focusedPaneId);
56
+ if (focused) return focused;
57
+ // A floating pane without a stacking order sits at the default of 50; docked panes sit below every one.
58
+ const zIndexOf = (instance: PaneInstanceConfig) => {
59
+ const entry = layout.floating.find((floating) => floating.instanceId === instance.instanceId);
60
+ return entry ? entry.zIndex ?? 50 : -1;
61
+ };
62
+ return [...chatPanes].sort((left, right) => zIndexOf(right) - zIndexOf(left))[0] ?? null;
63
+ }
64
+
35
65
  function setChatPaneJump(
36
66
  settings: ChatPaneSettings | undefined,
37
67
  channelId: string,
@@ -77,6 +77,14 @@ export function ChatPane({ focused, width, height }: PaneProps) {
77
77
  }, [dispatch, paneId, stateRef]);
78
78
  const [channelId, setLocalChannelId] = useState(initialChannelIdRef.current);
79
79
  const pendingChannelIdRef = useRef<string | null>(null);
80
+ // A channel set from outside the pane (the command bar, the unread list)
81
+ // usually arrives with focus. Taking it in the same render keeps the pane
82
+ // from showing the old channel focused for a frame, which marks it read.
83
+ const [followedChannelId, setFollowedChannelId] = useState(persistedChannelId);
84
+ if (followedChannelId !== persistedChannelId) {
85
+ setFollowedChannelId(persistedChannelId);
86
+ if (!pendingChannelIdRef.current && channelId !== persistedChannelId) setLocalChannelId(persistedChannelId);
87
+ }
80
88
 
81
89
  useEffect(() => {
82
90
  if (rawPaneChannelId) return;
@@ -8,18 +8,23 @@ import type { ASKGToolExecutor } from "./executor";
8
8
  import {
9
9
  activeTurn,
10
10
  askgReducer,
11
+ canRateTurn,
11
12
  EMPTY_ASKG_CONVERSATION,
12
13
  isTurnRunning,
13
14
  requiresLocalConfirmation,
14
15
  type ASKGAction,
15
16
  type ASKGConversationState,
16
17
  type ASKGErrorState,
18
+ type ASKGTurnFeedback,
17
19
  } from "./model";
18
20
  import {
19
21
  ASKG_CLIENT_CAPABILITIES,
20
22
  ASKG_PROTOCOL_VERSION,
21
23
  type ASKGCapabilities,
22
24
  type ASKGClientDescriptor,
25
+ type ASKGFeedbackRating,
26
+ type ASKGFeedbackReason,
27
+ type ASKGFeedbackRequest,
23
28
  type ASKGSessionContext,
24
29
  type ASKGSessionStartResponse,
25
30
  type ASKGSseEvent,
@@ -104,6 +109,16 @@ function turnCapabilities(session: ASKGSessionStartResponse): ASKGCapabilities |
104
109
  return session.capabilities?.scripts === 1 ? { scripts: 1 } : null;
105
110
  }
106
111
 
112
+ /**
113
+ * Refusals that say ratings cannot work from here at all: signed out, no plan
114
+ * that reaches Ask Gloom, or a protocol this build does not speak. The control
115
+ * goes away rather than failing on every click.
116
+ */
117
+ function feedbackUnavailable(error: unknown): boolean {
118
+ return error instanceof ASKGTransportError
119
+ && (error.code === "unauthorized" || error.code === "tier_required" || error.code === "protocol");
120
+ }
121
+
107
122
  function errorState(error: unknown): ASKGErrorState {
108
123
  if (error instanceof ASKGTransportError) {
109
124
  return {
@@ -136,6 +151,10 @@ export class ASKGSessionController {
136
151
  private readonly abandonedCalls = new Set<string>();
137
152
  private readonly toolTasks = new Set<Promise<void>>();
138
153
  private turnAbort: AbortController | null = null;
154
+ /** Ratings of one answer go out in the order they were made. */
155
+ private readonly feedbackQueues = new Map<string, Promise<void>>();
156
+ /** The latest rating request per answer; an older answer never wins. */
157
+ private readonly feedbackVersions = new Map<string, number>();
139
158
  private disposed = false;
140
159
  private readonly now: () => number;
141
160
  private readonly createId: () => string;
@@ -188,6 +207,7 @@ export class ASKGSessionController {
188
207
  model: session.model,
189
208
  limits: session.limits,
190
209
  acceptedTools: session.acceptedTools,
210
+ feedback: session.capabilities?.feedback === 1,
191
211
  });
192
212
  return session;
193
213
  })();
@@ -311,14 +331,14 @@ export class ASKGSessionController {
311
331
  }
312
332
 
313
333
  /**
314
- * Asks a failed question again. The failed turn is dropped rather than kept
315
- * above the retry, so a transcript reads as the conversation the user had
316
- * rather than as a list of attempts.
334
+ * Asks a failed or stopped question again. The attempt is dropped rather
335
+ * than kept above the retry, so a transcript reads as the conversation the
336
+ * user had rather than as a list of attempts.
317
337
  */
318
338
  async retryTurn(turnId: string): Promise<void> {
319
339
  if (this.disposed || isTurnRunning(this.state)) return;
320
340
  const turn = this.state.turns.find((entry) => entry.id === turnId);
321
- if (!turn || turn.status !== "error") return;
341
+ if (!turn || (turn.status !== "error" && turn.status !== "cancelled")) return;
322
342
  this.dispatch({ type: "drop-turn", turnId });
323
343
  await this.ask(turn.prompt);
324
344
  }
@@ -445,6 +465,94 @@ export class ASKGSessionController {
445
465
  this.rejectPendingConfirmations();
446
466
  }
447
467
 
468
+ /**
469
+ * Rates one answer. The control shows the choice at once; a refusal puts the
470
+ * previous one back without a word, because a rating is not worth an error.
471
+ * A thumbs down keeps the reason it already had, a thumbs up drops it.
472
+ */
473
+ rateAnswer(turnId: string, rating: ASKGFeedbackRating): Promise<void> {
474
+ const current = this.state.turns.find((turn) => turn.id === turnId)?.feedback;
475
+ const reason = rating === "down" && current?.rating === "down" ? current.reason : null;
476
+ return this.sendFeedback(turnId, { rating, reason }, {
477
+ rating,
478
+ reason,
479
+ shared: current?.shared ?? false,
480
+ pending: "rating",
481
+ });
482
+ }
483
+
484
+ /** Says why an answer got a thumbs down. */
485
+ chooseFeedbackReason(turnId: string, reason: ASKGFeedbackReason): Promise<void> {
486
+ const current = this.state.turns.find((turn) => turn.id === turnId)?.feedback;
487
+ return this.sendFeedback(turnId, { rating: "down", reason }, {
488
+ rating: "down",
489
+ reason,
490
+ shared: current?.shared ?? false,
491
+ pending: "rating",
492
+ });
493
+ }
494
+
495
+ /**
496
+ * Sends one answer to Gloom with its rating. Only the consent travels: the
497
+ * platform copies the question, the answer and which tools ran from its own
498
+ * transcript, so nothing else on this machine can go with it.
499
+ */
500
+ shareAnswer(turnId: string): Promise<void> {
501
+ const current = this.state.turns.find((turn) => turn.id === turnId)?.feedback;
502
+ if (!current?.rating || current.shared) return Promise.resolve();
503
+ return this.sendFeedback(
504
+ turnId,
505
+ { rating: current.rating, reason: current.reason, share: true },
506
+ { rating: current.rating, reason: current.reason, shared: false, pending: "share" },
507
+ );
508
+ }
509
+
510
+ private sendFeedback(
511
+ turnId: string,
512
+ request: ASKGFeedbackRequest,
513
+ optimistic: ASKGTurnFeedback,
514
+ ): Promise<void> {
515
+ const turn = this.state.turns.find((entry) => entry.id === turnId);
516
+ if (this.disposed || !turn || !canRateTurn(this.state, turn) || !turn.remoteTurnId) {
517
+ return Promise.resolve();
518
+ }
519
+ const remoteTurnId = turn.remoteTurnId;
520
+ const previous = turn.feedback ? { ...turn.feedback, pending: null } : null;
521
+ const version = (this.feedbackVersions.get(turnId) ?? 0) + 1;
522
+ this.feedbackVersions.set(turnId, version);
523
+ this.dispatch({ type: "feedback", turnId, feedback: optimistic });
524
+
525
+ const send = async () => {
526
+ const latest = () => this.feedbackVersions.get(turnId) === version;
527
+ try {
528
+ const stored = await this.options.transport.sendFeedback(remoteTurnId, request);
529
+ if (!latest()) return;
530
+ if (!stored) {
531
+ // No answer of this person's under that id: nothing here can rate it.
532
+ this.dispatch({ type: "feedback", turnId, feedback: previous });
533
+ this.dispatch({ type: "feedback-unavailable" });
534
+ return;
535
+ }
536
+ this.dispatch({
537
+ type: "feedback",
538
+ turnId,
539
+ feedback: {
540
+ ...stored,
541
+ pending: null,
542
+ ...(request.share && !stored.shared ? { shareFailed: true } : {}),
543
+ },
544
+ });
545
+ } catch (error) {
546
+ if (!latest()) return;
547
+ this.dispatch({ type: "feedback", turnId, feedback: previous });
548
+ if (feedbackUnavailable(error)) this.dispatch({ type: "feedback-unavailable" });
549
+ }
550
+ };
551
+ const queued = (this.feedbackQueues.get(turnId) ?? Promise.resolve()).then(send);
552
+ this.feedbackQueues.set(turnId, queued);
553
+ return queued;
554
+ }
555
+
448
556
  setExpanded(toolCallId: string, expanded: boolean): void {
449
557
  this.dispatch({ type: "tool-expanded", toolCallId, expanded });
450
558
  }
@@ -46,6 +46,7 @@ export class ASKGConversationListStore {
46
46
  private persistence: PluginPersistence | null = null;
47
47
  private transport: ASKGTransport | null = null;
48
48
  private inFlight: Promise<void> | null = null;
49
+ private openConversationId: string | null = null;
49
50
 
50
51
  getSnapshot(): ASKGConversationListSnapshot {
51
52
  return this.snapshot;
@@ -126,6 +127,7 @@ export class ASKGConversationListStore {
126
127
  async delete(id: string): Promise<void> {
127
128
  const transport = this.transport;
128
129
  if (!transport) return;
130
+ if (this.openConversationId === id) this.openConversationId = null;
129
131
  const previous = this.snapshot.conversations;
130
132
  this.remove(id);
131
133
  try {
@@ -178,11 +180,30 @@ export class ASKGConversationListStore {
178
180
  this.persistence?.setState(WIDTH_STATE_KEY, width);
179
181
  }
180
182
 
183
+ /**
184
+ * The conversation an Ask Gloom pane last showed. Closing the pane (Esc Esc
185
+ * is two keys) must not lose the answer on screen, so the next pane this
186
+ * app session opens picks it up again. Kept in memory only: a fresh launch
187
+ * starts a fresh conversation, and every older one is in the list.
188
+ */
189
+ rememberOpen(id: string | null): void {
190
+ this.openConversationId = id;
191
+ }
192
+
193
+ rememberedOpen(): string | null {
194
+ const id = this.openConversationId;
195
+ if (!id) return null;
196
+ // A conversation deleted since is not brought back.
197
+ if (this.snapshot.loaded && !this.snapshot.conversations.some((conversation) => conversation.id === id)) return null;
198
+ return id;
199
+ }
200
+
181
201
  /** Test hook: drops the persisted handle, the transport and the rows. */
182
202
  reset(): void {
183
203
  this.persistence = null;
184
204
  this.transport = null;
185
205
  this.inFlight = null;
206
+ this.openConversationId = null;
186
207
  this.snapshot = EMPTY;
187
208
  }
188
209
 
@@ -74,6 +74,7 @@ function projectOptions(options: HeadlessPaneDefinition["options"]): ToolManifes
74
74
  return options.map(({
75
75
  settingKey: _settingKey,
76
76
  pluginState: _pluginState,
77
+ normalize: _normalize,
77
78
  values,
78
79
  aliases,
79
80
  defaultValue,