@opengeni/react 0.15.0 → 0.23.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 (103) hide show
  1. package/README.md +110 -10
  2. package/dist/{chunk-TOJR776I.js → chunk-6XUS5VFM.js} +45 -369
  3. package/dist/chunk-6XUS5VFM.js.map +1 -0
  4. package/dist/chunk-CATATY77.js +2393 -0
  5. package/dist/chunk-CATATY77.js.map +1 -0
  6. package/dist/chunk-I3BJZIG5.js +439 -0
  7. package/dist/chunk-I3BJZIG5.js.map +1 -0
  8. package/dist/chunk-TK7G6XLT.js +18 -0
  9. package/dist/chunk-TK7G6XLT.js.map +1 -0
  10. package/dist/chunk-UAHPKLB6.js +2237 -0
  11. package/dist/chunk-UAHPKLB6.js.map +1 -0
  12. package/dist/chunk-UQS7OQDE.js +591 -0
  13. package/dist/chunk-UQS7OQDE.js.map +1 -0
  14. package/dist/chunk-YDNWMKXO.js +102 -0
  15. package/dist/chunk-YDNWMKXO.js.map +1 -0
  16. package/dist/composer-CVm5uoUI.d.ts +585 -0
  17. package/dist/composer.d.ts +6 -0
  18. package/dist/composer.js +56 -0
  19. package/dist/composer.js.map +1 -0
  20. package/dist/index.d.ts +1288 -1785
  21. package/dist/index.js +7140 -8817
  22. package/dist/index.js.map +1 -1
  23. package/dist/machines.d.ts +412 -3
  24. package/dist/machines.js +3 -1
  25. package/dist/noto-sans-arabic-loader-IA2T4X2A.js +21 -0
  26. package/dist/noto-sans-arabic-loader-IA2T4X2A.js.map +1 -0
  27. package/dist/noto-sans-jp-loader.generated-HFGLYBR3.js +292 -0
  28. package/dist/noto-sans-jp-loader.generated-HFGLYBR3.js.map +1 -0
  29. package/dist/queue-surface-implementation-3UW3MIIR.js +890 -0
  30. package/dist/queue-surface-implementation-3UW3MIIR.js.map +1 -0
  31. package/dist/session-Db00TRwl.d.ts +446 -0
  32. package/dist/session-context-rgrfElMl.d.ts +58 -0
  33. package/dist/session.d.ts +4 -0
  34. package/dist/session.js +54 -0
  35. package/dist/session.js.map +1 -0
  36. package/dist/use-composer-By1wn3MM.d.ts +99 -0
  37. package/package.json +20 -4
  38. package/src/approvals.ts +5 -3
  39. package/src/client.ts +44 -0
  40. package/src/components/approval-surface.tsx +198 -0
  41. package/src/components/chat-composer.tsx +94 -993
  42. package/src/components/code-editor.tsx +104 -26
  43. package/src/components/command-palette.tsx +8 -2
  44. package/src/components/composer-transcription-control.tsx +211 -0
  45. package/src/components/composer.tsx +1536 -0
  46. package/src/components/desktop-viewer.tsx +3 -3
  47. package/src/components/enrollment-consent.tsx +2 -2
  48. package/src/components/file-browser.tsx +367 -29
  49. package/src/components/human-input-form.tsx +417 -0
  50. package/src/components/machine-card.tsx +1 -1
  51. package/src/components/machines-dashboard.tsx +3 -3
  52. package/src/components/message-timeline.tsx +205 -25
  53. package/src/components/model-picker.tsx +12 -3
  54. package/src/components/pierre-diff.tsx +32 -6
  55. package/src/components/queue-draft-policy.ts +18 -0
  56. package/src/components/queue-surface-implementation.tsx +1037 -0
  57. package/src/components/queue-surface-state.tsx +94 -0
  58. package/src/components/queue-surface.tsx +42 -559
  59. package/src/components/sandbox-files.tsx +138 -14
  60. package/src/components/sandbox-terminal.tsx +8 -2
  61. package/src/components/sandbox-workspace.tsx +339 -119
  62. package/src/components/workbench-changes.tsx +84 -33
  63. package/src/components/workspace-dock.tsx +188 -18
  64. package/src/composer.ts +60 -0
  65. package/src/hooks/internal.ts +115 -34
  66. package/src/hooks/use-composer.ts +385 -104
  67. package/src/hooks/use-human-input.ts +131 -0
  68. package/src/hooks/use-machine-chip.ts +2 -2
  69. package/src/hooks/use-machines.ts +27 -11
  70. package/src/hooks/use-sandbox-files.ts +310 -62
  71. package/src/hooks/use-sandbox-git.ts +154 -40
  72. package/src/hooks/use-sandbox-terminal.ts +28 -6
  73. package/src/hooks/use-session-capabilities.ts +38 -9
  74. package/src/hooks/use-session-control.ts +37 -8
  75. package/src/hooks/use-session-events.ts +522 -48
  76. package/src/hooks/use-session-mcp-approval-policy.ts +161 -0
  77. package/src/hooks/use-slash-commands.ts +38 -38
  78. package/src/hooks/use-transcription.ts +757 -0
  79. package/src/hooks/use-turn-queue.ts +134 -66
  80. package/src/hooks/use-windowed-sections.ts +2 -2
  81. package/src/hooks/use-workspace-capture.ts +146 -40
  82. package/src/hooks/use-workspace-edit.ts +50 -14
  83. package/src/hooks/use-workspace-sessions.ts +3 -0
  84. package/src/human-input.ts +72 -0
  85. package/src/index.ts +85 -6
  86. package/src/lib/noto-sans-arabic-loader.ts +21 -0
  87. package/src/lib/noto-sans-jp-loader.generated.ts +295 -0
  88. package/src/lib/use-portal-token-style.ts +51 -0
  89. package/src/lib/use-unicode-fonts.ts +57 -0
  90. package/src/provider.tsx +4 -69
  91. package/src/session-context.ts +160 -0
  92. package/src/session.ts +89 -0
  93. package/src/timeline/parsers.ts +35 -0
  94. package/src/timeline/projection.ts +12 -4
  95. package/src/timeline/tool-renderers.tsx +41 -0
  96. package/src/timeline/turn-summary.tsx +2 -2
  97. package/src/timeline/types.ts +10 -9
  98. package/styles/index.css +56 -0
  99. package/styles/index.d.ts +2 -0
  100. package/styles/tokens.css +11 -6
  101. package/styles/tokens.d.ts +2 -0
  102. package/dist/chunk-TOJR776I.js.map +0 -1
  103. package/dist/machines-BpdwuQcD.d.ts +0 -449
@@ -0,0 +1,295 @@
1
+ /* This file is generated by scripts/generate-noto-jp-loader.ts. */
2
+ import unicodeRanges from "@fontsource-variable/noto-sans-jp/unicode.json";
3
+ import font0 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-0-wght-normal.woff2";
4
+ import font1 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-1-wght-normal.woff2";
5
+ import font2 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-2-wght-normal.woff2";
6
+ import font3 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-3-wght-normal.woff2";
7
+ import font4 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-4-wght-normal.woff2";
8
+ import font5 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-5-wght-normal.woff2";
9
+ import font6 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-6-wght-normal.woff2";
10
+ import font7 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-7-wght-normal.woff2";
11
+ import font8 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-8-wght-normal.woff2";
12
+ import font9 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-9-wght-normal.woff2";
13
+ import font10 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-10-wght-normal.woff2";
14
+ import font11 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-11-wght-normal.woff2";
15
+ import font12 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-12-wght-normal.woff2";
16
+ import font13 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-13-wght-normal.woff2";
17
+ import font14 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-14-wght-normal.woff2";
18
+ import font15 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-15-wght-normal.woff2";
19
+ import font16 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-16-wght-normal.woff2";
20
+ import font17 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-17-wght-normal.woff2";
21
+ import font18 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-18-wght-normal.woff2";
22
+ import font19 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-19-wght-normal.woff2";
23
+ import font20 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-20-wght-normal.woff2";
24
+ import font21 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-21-wght-normal.woff2";
25
+ import font22 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-22-wght-normal.woff2";
26
+ import font23 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-23-wght-normal.woff2";
27
+ import font24 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-24-wght-normal.woff2";
28
+ import font25 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-25-wght-normal.woff2";
29
+ import font26 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-26-wght-normal.woff2";
30
+ import font27 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-27-wght-normal.woff2";
31
+ import font28 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-28-wght-normal.woff2";
32
+ import font29 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-29-wght-normal.woff2";
33
+ import font30 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-30-wght-normal.woff2";
34
+ import font31 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-31-wght-normal.woff2";
35
+ import font32 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-32-wght-normal.woff2";
36
+ import font33 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-33-wght-normal.woff2";
37
+ import font34 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-34-wght-normal.woff2";
38
+ import font35 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-35-wght-normal.woff2";
39
+ import font36 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-36-wght-normal.woff2";
40
+ import font37 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-37-wght-normal.woff2";
41
+ import font38 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-38-wght-normal.woff2";
42
+ import font39 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-39-wght-normal.woff2";
43
+ import font40 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-40-wght-normal.woff2";
44
+ import font41 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-41-wght-normal.woff2";
45
+ import font42 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-42-wght-normal.woff2";
46
+ import font43 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-43-wght-normal.woff2";
47
+ import font44 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-44-wght-normal.woff2";
48
+ import font45 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-45-wght-normal.woff2";
49
+ import font46 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-46-wght-normal.woff2";
50
+ import font47 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-47-wght-normal.woff2";
51
+ import font48 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-48-wght-normal.woff2";
52
+ import font49 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-49-wght-normal.woff2";
53
+ import font50 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-50-wght-normal.woff2";
54
+ import font51 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-51-wght-normal.woff2";
55
+ import font52 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-52-wght-normal.woff2";
56
+ import font53 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-53-wght-normal.woff2";
57
+ import font54 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-54-wght-normal.woff2";
58
+ import font55 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-55-wght-normal.woff2";
59
+ import font56 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-56-wght-normal.woff2";
60
+ import font57 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-57-wght-normal.woff2";
61
+ import font58 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-58-wght-normal.woff2";
62
+ import font59 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-59-wght-normal.woff2";
63
+ import font60 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-60-wght-normal.woff2";
64
+ import font61 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-61-wght-normal.woff2";
65
+ import font62 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-62-wght-normal.woff2";
66
+ import font63 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-63-wght-normal.woff2";
67
+ import font64 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-64-wght-normal.woff2";
68
+ import font65 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-65-wght-normal.woff2";
69
+ import font66 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-66-wght-normal.woff2";
70
+ import font67 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-67-wght-normal.woff2";
71
+ import font68 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-68-wght-normal.woff2";
72
+ import font69 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-69-wght-normal.woff2";
73
+ import font70 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-70-wght-normal.woff2";
74
+ import font71 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-71-wght-normal.woff2";
75
+ import font72 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-72-wght-normal.woff2";
76
+ import font73 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-73-wght-normal.woff2";
77
+ import font74 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-74-wght-normal.woff2";
78
+ import font75 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-75-wght-normal.woff2";
79
+ import font76 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-76-wght-normal.woff2";
80
+ import font77 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-77-wght-normal.woff2";
81
+ import font78 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-78-wght-normal.woff2";
82
+ import font79 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-79-wght-normal.woff2";
83
+ import font80 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-80-wght-normal.woff2";
84
+ import font81 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-81-wght-normal.woff2";
85
+ import font82 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-82-wght-normal.woff2";
86
+ import font83 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-83-wght-normal.woff2";
87
+ import font84 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-84-wght-normal.woff2";
88
+ import font85 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-85-wght-normal.woff2";
89
+ import font86 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-86-wght-normal.woff2";
90
+ import font87 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-87-wght-normal.woff2";
91
+ import font88 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-88-wght-normal.woff2";
92
+ import font89 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-89-wght-normal.woff2";
93
+ import font90 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-90-wght-normal.woff2";
94
+ import font91 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-91-wght-normal.woff2";
95
+ import font92 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-92-wght-normal.woff2";
96
+ import font93 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-93-wght-normal.woff2";
97
+ import font94 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-94-wght-normal.woff2";
98
+ import font95 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-95-wght-normal.woff2";
99
+ import font96 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-96-wght-normal.woff2";
100
+ import font97 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-97-wght-normal.woff2";
101
+ import font98 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-98-wght-normal.woff2";
102
+ import font99 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-99-wght-normal.woff2";
103
+ import font100 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-100-wght-normal.woff2";
104
+ import font101 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-101-wght-normal.woff2";
105
+ import font102 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-102-wght-normal.woff2";
106
+ import font103 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-103-wght-normal.woff2";
107
+ import font104 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-104-wght-normal.woff2";
108
+ import font105 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-105-wght-normal.woff2";
109
+ import font106 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-106-wght-normal.woff2";
110
+ import font107 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-107-wght-normal.woff2";
111
+ import font108 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-108-wght-normal.woff2";
112
+ import font109 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-109-wght-normal.woff2";
113
+ import font110 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-110-wght-normal.woff2";
114
+ import font111 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-111-wght-normal.woff2";
115
+ import font112 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-112-wght-normal.woff2";
116
+ import font113 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-113-wght-normal.woff2";
117
+ import font114 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-114-wght-normal.woff2";
118
+ import font115 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-115-wght-normal.woff2";
119
+ import font116 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-116-wght-normal.woff2";
120
+ import font117 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-117-wght-normal.woff2";
121
+ import font118 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-118-wght-normal.woff2";
122
+ import font119 from "@fontsource-variable/noto-sans-jp/files/noto-sans-jp-119-wght-normal.woff2";
123
+
124
+ const fontUrls: Record<string, string> = {
125
+ "[0]": font0,
126
+ "[1]": font1,
127
+ "[2]": font2,
128
+ "[3]": font3,
129
+ "[4]": font4,
130
+ "[5]": font5,
131
+ "[6]": font6,
132
+ "[7]": font7,
133
+ "[8]": font8,
134
+ "[9]": font9,
135
+ "[10]": font10,
136
+ "[11]": font11,
137
+ "[12]": font12,
138
+ "[13]": font13,
139
+ "[14]": font14,
140
+ "[15]": font15,
141
+ "[16]": font16,
142
+ "[17]": font17,
143
+ "[18]": font18,
144
+ "[19]": font19,
145
+ "[20]": font20,
146
+ "[21]": font21,
147
+ "[22]": font22,
148
+ "[23]": font23,
149
+ "[24]": font24,
150
+ "[25]": font25,
151
+ "[26]": font26,
152
+ "[27]": font27,
153
+ "[28]": font28,
154
+ "[29]": font29,
155
+ "[30]": font30,
156
+ "[31]": font31,
157
+ "[32]": font32,
158
+ "[33]": font33,
159
+ "[34]": font34,
160
+ "[35]": font35,
161
+ "[36]": font36,
162
+ "[37]": font37,
163
+ "[38]": font38,
164
+ "[39]": font39,
165
+ "[40]": font40,
166
+ "[41]": font41,
167
+ "[42]": font42,
168
+ "[43]": font43,
169
+ "[44]": font44,
170
+ "[45]": font45,
171
+ "[46]": font46,
172
+ "[47]": font47,
173
+ "[48]": font48,
174
+ "[49]": font49,
175
+ "[50]": font50,
176
+ "[51]": font51,
177
+ "[52]": font52,
178
+ "[53]": font53,
179
+ "[54]": font54,
180
+ "[55]": font55,
181
+ "[56]": font56,
182
+ "[57]": font57,
183
+ "[58]": font58,
184
+ "[59]": font59,
185
+ "[60]": font60,
186
+ "[61]": font61,
187
+ "[62]": font62,
188
+ "[63]": font63,
189
+ "[64]": font64,
190
+ "[65]": font65,
191
+ "[66]": font66,
192
+ "[67]": font67,
193
+ "[68]": font68,
194
+ "[69]": font69,
195
+ "[70]": font70,
196
+ "[71]": font71,
197
+ "[72]": font72,
198
+ "[73]": font73,
199
+ "[74]": font74,
200
+ "[75]": font75,
201
+ "[76]": font76,
202
+ "[77]": font77,
203
+ "[78]": font78,
204
+ "[79]": font79,
205
+ "[80]": font80,
206
+ "[81]": font81,
207
+ "[82]": font82,
208
+ "[83]": font83,
209
+ "[84]": font84,
210
+ "[85]": font85,
211
+ "[86]": font86,
212
+ "[87]": font87,
213
+ "[88]": font88,
214
+ "[89]": font89,
215
+ "[90]": font90,
216
+ "[91]": font91,
217
+ "[92]": font92,
218
+ "[93]": font93,
219
+ "[94]": font94,
220
+ "[95]": font95,
221
+ "[96]": font96,
222
+ "[97]": font97,
223
+ "[98]": font98,
224
+ "[99]": font99,
225
+ "[100]": font100,
226
+ "[101]": font101,
227
+ "[102]": font102,
228
+ "[103]": font103,
229
+ "[104]": font104,
230
+ "[105]": font105,
231
+ "[106]": font106,
232
+ "[107]": font107,
233
+ "[108]": font108,
234
+ "[109]": font109,
235
+ "[110]": font110,
236
+ "[111]": font111,
237
+ "[112]": font112,
238
+ "[113]": font113,
239
+ "[114]": font114,
240
+ "[115]": font115,
241
+ "[116]": font116,
242
+ "[117]": font117,
243
+ "[118]": font118,
244
+ "[119]": font119,
245
+ };
246
+ const loads = new Map<string, Promise<void>>();
247
+
248
+ export async function loadNotoSansJp(text: string): Promise<void> {
249
+ const required = new Set<string>();
250
+ for (const character of text) {
251
+ const codePoint = character.codePointAt(0);
252
+ if (codePoint === undefined) continue;
253
+ for (const [key, range] of Object.entries(unicodeRanges)) {
254
+ if (!fontUrls[key]) continue;
255
+ if (rangeContains(range, codePoint)) {
256
+ required.add(key);
257
+ break;
258
+ }
259
+ }
260
+ }
261
+ await Promise.all([...required].map(loadShard));
262
+ }
263
+
264
+ function loadShard(key: string): Promise<void> {
265
+ const existing = loads.get(key);
266
+ if (existing) return existing;
267
+ const url = fontUrls[key];
268
+ const unicodeRange = (unicodeRanges as Record<string, string>)[key];
269
+ if (!url || !unicodeRange) throw new Error(`Missing Noto Sans JP shard ${key}`);
270
+ const loading = new FontFace(
271
+ "Noto Sans JP Variable",
272
+ `url("${url}") format("woff2-variations")`,
273
+ { style: "normal", weight: "100 900", unicodeRange },
274
+ )
275
+ .load()
276
+ .then((font) => {
277
+ document.fonts.add(font);
278
+ })
279
+ .catch((error: unknown) => {
280
+ loads.delete(key);
281
+ throw error;
282
+ });
283
+ loads.set(key, loading);
284
+ return loading;
285
+ }
286
+
287
+ function rangeContains(range: string, codePoint: number): boolean {
288
+ for (const token of range.split(",")) {
289
+ const [startText, endText = startText] = token.trim().slice(2).split("-");
290
+ const start = Number.parseInt(startText ?? "", 16);
291
+ const end = Number.parseInt(endText ?? "", 16);
292
+ if (Number.isFinite(start) && codePoint >= start && codePoint <= end) return true;
293
+ }
294
+ return false;
295
+ }
@@ -0,0 +1,51 @@
1
+ import { type CSSProperties, type RefObject, useEffect, useState } from "react";
2
+
3
+ export type PortalTokenStyle = CSSProperties & Record<`--${string}`, string>;
4
+
5
+ /**
6
+ * Copy the effective SDK tokens across a portal boundary. A locally themed or
7
+ * rebranded embed cannot rely on CSS inheritance once a portal mounts under
8
+ * `<body>`. Ancestor theme/class/style mutations and OS color-scheme changes
9
+ * keep the copied values live.
10
+ */
11
+ export function usePortalTokenStyle(sourceRef: RefObject<HTMLElement | null>): PortalTokenStyle {
12
+ const [style, setStyle] = useState<PortalTokenStyle>({});
13
+ useEffect(() => {
14
+ const source = sourceRef.current;
15
+ if (!source || typeof MutationObserver === "undefined") return;
16
+ let signature = "";
17
+ const sync = () => {
18
+ const computed = getComputedStyle(source);
19
+ const next: PortalTokenStyle = { colorScheme: computed.colorScheme };
20
+ for (let index = 0; index < computed.length; index += 1) {
21
+ const property = computed.item(index);
22
+ if (!property.startsWith("--og-")) continue;
23
+ next[property as `--${string}`] = computed.getPropertyValue(property);
24
+ }
25
+ const nextSignature = JSON.stringify(next);
26
+ if (nextSignature !== signature) {
27
+ signature = nextSignature;
28
+ setStyle(next);
29
+ }
30
+ };
31
+ const observers: MutationObserver[] = [];
32
+ let ancestor: HTMLElement | null = source;
33
+ while (ancestor) {
34
+ const observer = new MutationObserver(sync);
35
+ observer.observe(ancestor, {
36
+ attributes: true,
37
+ attributeFilter: ["class", "data-og-theme", "style"],
38
+ });
39
+ observers.push(observer);
40
+ ancestor = ancestor.parentElement;
41
+ }
42
+ const colorScheme = window.matchMedia?.("(prefers-color-scheme: dark)");
43
+ colorScheme?.addEventListener?.("change", sync);
44
+ sync();
45
+ return () => {
46
+ for (const observer of observers) observer.disconnect();
47
+ colorScheme?.removeEventListener?.("change", sync);
48
+ };
49
+ }, [sourceRef]);
50
+ return style;
51
+ }
@@ -0,0 +1,57 @@
1
+ import { useEffect, useMemo } from "react";
2
+
3
+ export type UnicodeFontNeeds = {
4
+ japanese: boolean;
5
+ arabic: boolean;
6
+ };
7
+
8
+ const japaneseScript = /[\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff]/u;
9
+ const arabicScript = /[\u0600-\u06ff\u0750-\u077f\u0870-\u08ff\ufb50-\ufdff\ufe70-\ufefc]/u;
10
+
11
+ export function detectUnicodeFontNeeds(values: Iterable<string>): UnicodeFontNeeds {
12
+ let japanese = false;
13
+ let arabic = false;
14
+ for (const value of values) {
15
+ japanese ||= japaneseScript.test(value);
16
+ arabic ||= arabicScript.test(value);
17
+ if (japanese && arabic) break;
18
+ }
19
+ return { japanese, arabic };
20
+ }
21
+
22
+ /**
23
+ * Load large script-specific font manifests only when visible workspace content
24
+ * needs them. Fontsource splits the actual glyphs by unicode-range, so Chromium
25
+ * then fetches only the small shards used by the path instead of charging every
26
+ * Latin-only session for the complete font.
27
+ */
28
+ export function useUnicodeFallbackFonts(values: readonly string[]): void {
29
+ const content = useMemo(() => collectUnicodeContent(values), [values]);
30
+ useEffect(() => {
31
+ if (content.japanese) {
32
+ void import("./noto-sans-jp-loader.generated")
33
+ .then(({ loadNotoSansJp }) => loadNotoSansJp(content.japanese))
34
+ .catch(() => undefined);
35
+ }
36
+ if (content.arabic) {
37
+ void import("./noto-sans-arabic-loader")
38
+ .then(({ loadNotoSansArabic }) => loadNotoSansArabic())
39
+ .catch(() => undefined);
40
+ }
41
+ }, [content.arabic, content.japanese]);
42
+ }
43
+
44
+ function collectUnicodeContent(values: Iterable<string>): {
45
+ japanese: string;
46
+ arabic: string;
47
+ } {
48
+ const japanese = new Set<string>();
49
+ const arabic = new Set<string>();
50
+ for (const value of values) {
51
+ for (const character of value) {
52
+ if (japaneseScript.test(character)) japanese.add(character);
53
+ if (arabicScript.test(character)) arabic.add(character);
54
+ }
55
+ }
56
+ return { japanese: [...japanese].join(""), arabic: [...arabic].join("") };
57
+ }
package/src/provider.tsx CHANGED
@@ -4,35 +4,12 @@ import {
4
4
  type StreamConnectionState,
5
5
  type WorkspaceControlEvent,
6
6
  } from "@opengeni/sdk";
7
- import {
8
- createContext,
9
- useCallback,
10
- useContext,
11
- useEffect,
12
- useMemo,
13
- useRef,
14
- useState,
15
- type ReactNode,
16
- } from "react";
7
+ import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from "react";
17
8
  import type { SessionClientLike } from "./client";
9
+ import { OpenGeniContext } from "./session-context";
18
10
 
19
- export type OpenGeniContextValue = {
20
- client: SessionClientLike;
21
- workspaceId: string;
22
- workspaceControlEvent: WorkspaceControlEvent | null;
23
- workspaceControlConnectionState: StreamConnectionState | "idle" | "error";
24
- registerSessionReconciler: (
25
- sessionId: string,
26
- key: string,
27
- reconcile: () => Promise<void>,
28
- ) => () => void;
29
- reconcileSession: (sessionId: string) => Promise<void>;
30
- };
31
-
32
- const OpenGeniContext = createContext<OpenGeniContextValue | null>(null);
33
- const NOOP_REGISTER_RECONCILER: OpenGeniContextValue["registerSessionReconciler"] = () => () =>
34
- undefined;
35
- const NOOP_RECONCILE_SESSION: OpenGeniContextValue["reconcileSession"] = async () => undefined;
11
+ export { useOpenGeni, useOpenGeniClient } from "./session-context";
12
+ export type { ClientOverride, OpenGeniContextValue } from "./session-context";
36
13
  const CONTRACT_RELOAD_STORAGE_PREFIX = "opengeni.reloadForApiContract:";
37
14
 
38
15
  export type OpenGeniProviderProps = {
@@ -202,45 +179,3 @@ function reloadForContractMismatchOnce(mismatch: OpenGeniApiContractMismatchErro
202
179
  sessionStorage.setItem(key, OPENGENI_API_CONTRACT_REVISION);
203
180
  window.setTimeout(() => window.location.reload(), 150);
204
181
  }
205
-
206
- export type ClientOverride = {
207
- client?: SessionClientLike | undefined;
208
- workspaceId?: string | undefined;
209
- };
210
-
211
- /** Resolve client + workspace from explicit overrides or the provider. */
212
- export function useOpenGeni(override: ClientOverride = {}): OpenGeniContextValue {
213
- const context = useContext(OpenGeniContext);
214
- const client = override.client ?? context?.client;
215
- const workspaceId = override.workspaceId ?? context?.workspaceId;
216
- if (!client || !workspaceId) {
217
- throw new Error(
218
- "@opengeni/react: no OpenGeni client/workspace available. Wrap the tree in <OpenGeniProvider> or pass { client, workspaceId } to the hook.",
219
- );
220
- }
221
- return {
222
- client,
223
- workspaceId,
224
- workspaceControlEvent: context?.workspaceControlEvent ?? null,
225
- workspaceControlConnectionState: context?.workspaceControlConnectionState ?? "idle",
226
- registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,
227
- reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION,
228
- };
229
- }
230
-
231
- /**
232
- * Resolve the client only — for hooks that are not workspace-scoped
233
- * (`useWorkspaces`, `useBillingUsage`).
234
- */
235
- export function useOpenGeniClient(
236
- override: Pick<ClientOverride, "client"> = {},
237
- ): SessionClientLike {
238
- const context = useContext(OpenGeniContext);
239
- const client = override.client ?? context?.client;
240
- if (!client) {
241
- throw new Error(
242
- "@opengeni/react: no OpenGeni client available. Wrap the tree in <OpenGeniProvider> or pass { client } to the hook.",
243
- );
244
- }
245
- return client;
246
- }
@@ -0,0 +1,160 @@
1
+ import type { StreamConnectionState, WorkspaceControlEvent } from "@opengeni/sdk";
2
+ import { createContext, useContext } from "react";
3
+ import type {
4
+ EmbeddedHumanInputSessionClientLike,
5
+ EmbeddedSessionMcpApprovalPolicyClientLike,
6
+ EmbeddedSessionClientLike,
7
+ SessionClientLike,
8
+ } from "./client";
9
+
10
+ export type OpenGeniContextValue = {
11
+ client: SessionClientLike;
12
+ workspaceId: string;
13
+ workspaceControlEvent: WorkspaceControlEvent | null;
14
+ workspaceControlConnectionState: StreamConnectionState | "idle" | "error";
15
+ registerSessionReconciler: (
16
+ sessionId: string,
17
+ key: string,
18
+ reconcile: () => Promise<void>,
19
+ ) => () => void;
20
+ reconcileSession: (sessionId: string) => Promise<void>;
21
+ };
22
+
23
+ export const OpenGeniContext = createContext<OpenGeniContextValue | null>(null);
24
+
25
+ const NOOP_REGISTER_RECONCILER: OpenGeniContextValue["registerSessionReconciler"] = () => () =>
26
+ undefined;
27
+ const NOOP_RECONCILE_SESSION: OpenGeniContextValue["reconcileSession"] = async () => undefined;
28
+
29
+ export type ClientOverride = {
30
+ client?: SessionClientLike | undefined;
31
+ workspaceId?: string | undefined;
32
+ };
33
+
34
+ export type EmbeddedSessionClientOverride = {
35
+ client?: EmbeddedSessionClientLike | undefined;
36
+ workspaceId?: string | undefined;
37
+ };
38
+
39
+ export type EmbeddedHumanInputClientOverride = {
40
+ client?: EmbeddedHumanInputSessionClientLike | undefined;
41
+ workspaceId?: string | undefined;
42
+ };
43
+
44
+ export type EmbeddedSessionMcpApprovalPolicyClientOverride = {
45
+ client?: EmbeddedSessionMcpApprovalPolicyClientLike | undefined;
46
+ workspaceId?: string | undefined;
47
+ };
48
+
49
+ export type EmbeddedSessionContextValue = Omit<OpenGeniContextValue, "client"> & {
50
+ client: EmbeddedSessionClientLike;
51
+ };
52
+
53
+ /** Resolve client + workspace from explicit overrides or the provider. */
54
+ export function useOpenGeni(override: ClientOverride = {}): OpenGeniContextValue {
55
+ const context = useContext(OpenGeniContext);
56
+ const client = override.client ?? context?.client;
57
+ const workspaceId = override.workspaceId ?? context?.workspaceId;
58
+ if (!client || !workspaceId) {
59
+ throw new Error(
60
+ "@opengeni/react: no OpenGeni client/workspace available. Wrap the tree in <OpenGeniProvider> or pass { client, workspaceId } to the hook.",
61
+ );
62
+ }
63
+ return {
64
+ client,
65
+ workspaceId,
66
+ workspaceControlEvent: context?.workspaceControlEvent ?? null,
67
+ workspaceControlConnectionState: context?.workspaceControlConnectionState ?? "idle",
68
+ registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,
69
+ reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION,
70
+ };
71
+ }
72
+
73
+ /**
74
+ * Resolve the narrow client required by the session-only hooks. The full
75
+ * provider client is structurally compatible, while an explicit host proxy
76
+ * only needs to expose session/event/composer/queue/control operations.
77
+ */
78
+ export function useEmbeddedSession(
79
+ override: EmbeddedSessionClientOverride = {},
80
+ ): EmbeddedSessionContextValue {
81
+ const context = useContext(OpenGeniContext);
82
+ const client = override.client ?? context?.client;
83
+ const workspaceId = override.workspaceId ?? context?.workspaceId;
84
+ if (!client || !workspaceId) {
85
+ throw new Error(
86
+ "@opengeni/react: no OpenGeni client/workspace available. Wrap the tree in <OpenGeniProvider> or pass { client, workspaceId } to the hook.",
87
+ );
88
+ }
89
+ return {
90
+ client,
91
+ workspaceId,
92
+ workspaceControlEvent: context?.workspaceControlEvent ?? null,
93
+ workspaceControlConnectionState: context?.workspaceControlConnectionState ?? "idle",
94
+ registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,
95
+ reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION,
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Resolve the structured-input refinement without widening the baseline
101
+ * session-only proxy contract.
102
+ */
103
+ export function useEmbeddedHumanInputSession(override: EmbeddedHumanInputClientOverride = {}): Omit<
104
+ EmbeddedSessionContextValue,
105
+ "client"
106
+ > & {
107
+ client: EmbeddedHumanInputSessionClientLike;
108
+ } {
109
+ const embedded = useEmbeddedSession(override);
110
+ const client = embedded.client as Partial<EmbeddedHumanInputSessionClientLike>;
111
+ if (
112
+ typeof client.listHumanInputRequests !== "function" ||
113
+ typeof client.getHumanInputRequest !== "function" ||
114
+ typeof client.submitHumanInputResponse !== "function"
115
+ ) {
116
+ throw new Error(
117
+ "@opengeni/react: useHumanInputRequests requires listHumanInputRequests, getHumanInputRequest, and submitHumanInputResponse.",
118
+ );
119
+ }
120
+ return {
121
+ ...embedded,
122
+ client: client as EmbeddedHumanInputSessionClientLike,
123
+ };
124
+ }
125
+
126
+ /** Resolve the approval-policy refinement without widening session-only hosts. */
127
+ export function useEmbeddedSessionMcpApprovalPolicy(
128
+ override: EmbeddedSessionMcpApprovalPolicyClientOverride = {},
129
+ ): Omit<EmbeddedSessionContextValue, "client"> & {
130
+ client: EmbeddedSessionMcpApprovalPolicyClientLike;
131
+ } {
132
+ const embedded = useEmbeddedSession(override);
133
+ const client = embedded.client as Partial<EmbeddedSessionMcpApprovalPolicyClientLike>;
134
+ if (typeof client.updateSessionMcpApprovalPolicy !== "function") {
135
+ throw new Error(
136
+ "@opengeni/react: useSessionMcpApprovalPolicy requires updateSessionMcpApprovalPolicy.",
137
+ );
138
+ }
139
+ return {
140
+ ...embedded,
141
+ client: client as EmbeddedSessionMcpApprovalPolicyClientLike,
142
+ };
143
+ }
144
+
145
+ /**
146
+ * Resolve the client only — for hooks that are not workspace-scoped
147
+ * (`useWorkspaces`, `useBillingUsage`).
148
+ */
149
+ export function useOpenGeniClient(
150
+ override: Pick<ClientOverride, "client"> = {},
151
+ ): SessionClientLike {
152
+ const context = useContext(OpenGeniContext);
153
+ const client = override.client ?? context?.client;
154
+ if (!client) {
155
+ throw new Error(
156
+ "@opengeni/react: no OpenGeni client available. Wrap the tree in <OpenGeniProvider> or pass { client } to the hook.",
157
+ );
158
+ }
159
+ return client;
160
+ }