@tai42/studio-sdk 15.0.0 → 16.0.1

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 (322) hide show
  1. package/dist/components/explorer-body.d.ts +49 -0
  2. package/dist/components/explorer-body.d.ts.map +1 -0
  3. package/dist/components/explorer-body.js +67 -0
  4. package/dist/components/explorer-body.js.map +1 -0
  5. package/dist/components/explorer-page-size.d.ts +4 -0
  6. package/dist/components/explorer-page-size.d.ts.map +1 -0
  7. package/dist/components/explorer-page-size.js +36 -0
  8. package/dist/components/explorer-page-size.js.map +1 -0
  9. package/dist/components/explorer-tag-filter.d.ts +17 -0
  10. package/dist/components/explorer-tag-filter.d.ts.map +1 -0
  11. package/dist/components/explorer-tag-filter.js +29 -0
  12. package/dist/components/explorer-tag-filter.js.map +1 -0
  13. package/dist/components/explorer-tags.d.ts +22 -0
  14. package/dist/components/explorer-tags.d.ts.map +1 -0
  15. package/dist/components/explorer-tags.js +51 -0
  16. package/dist/components/explorer-tags.js.map +1 -0
  17. package/dist/components/explorer-view.d.ts +3 -17
  18. package/dist/components/explorer-view.d.ts.map +1 -1
  19. package/dist/components/explorer-view.js +53 -170
  20. package/dist/components/explorer-view.js.map +1 -1
  21. package/dist/components/extension-combo-builder.d.ts +0 -5
  22. package/dist/components/extension-combo-builder.d.ts.map +1 -1
  23. package/dist/components/extension-combo-builder.js +4 -42
  24. package/dist/components/extension-combo-builder.js.map +1 -1
  25. package/dist/components/extension-combo-parts.d.ts +44 -0
  26. package/dist/components/extension-combo-parts.d.ts.map +1 -0
  27. package/dist/components/extension-combo-parts.js +57 -0
  28. package/dist/components/extension-combo-parts.js.map +1 -0
  29. package/dist/components/fleet-report.d.ts.map +1 -1
  30. package/dist/components/fleet-report.js +51 -37
  31. package/dist/components/fleet-report.js.map +1 -1
  32. package/dist/components/icons/chrome-marks.d.ts +50 -0
  33. package/dist/components/icons/chrome-marks.d.ts.map +1 -0
  34. package/dist/components/icons/chrome-marks.js +51 -0
  35. package/dist/components/icons/chrome-marks.js.map +1 -0
  36. package/dist/components/icons/icon-frame.d.ts +29 -0
  37. package/dist/components/icons/icon-frame.d.ts.map +1 -0
  38. package/dist/components/icons/icon-frame.js +19 -0
  39. package/dist/components/icons/icon-frame.js.map +1 -0
  40. package/dist/components/icons/index.d.ts +40 -0
  41. package/dist/components/icons/index.d.ts.map +1 -0
  42. package/dist/components/icons/index.js +6 -0
  43. package/dist/components/icons/index.js.map +1 -0
  44. package/dist/components/icons/nav-map.d.ts +14 -0
  45. package/dist/components/icons/nav-map.d.ts.map +1 -0
  46. package/dist/components/icons/nav-map.js +28 -0
  47. package/dist/components/icons/nav-map.js.map +1 -0
  48. package/dist/components/icons/nav-marks.d.ts +44 -0
  49. package/dist/components/icons/nav-marks.d.ts.map +1 -0
  50. package/dist/components/icons/nav-marks.js +45 -0
  51. package/dist/components/icons/nav-marks.js.map +1 -0
  52. package/dist/components/icons/status-marks.d.ts +21 -0
  53. package/dist/components/icons/status-marks.d.ts.map +1 -0
  54. package/dist/components/icons/status-marks.js +22 -0
  55. package/dist/components/icons/status-marks.js.map +1 -0
  56. package/dist/components/icons/theme-marks.d.ts +9 -0
  57. package/dist/components/icons/theme-marks.d.ts.map +1 -0
  58. package/dist/components/icons/theme-marks.js +10 -0
  59. package/dist/components/icons/theme-marks.js.map +1 -0
  60. package/dist/components/json-diff.d.ts.map +1 -1
  61. package/dist/components/json-diff.js +1 -3
  62. package/dist/components/json-diff.js.map +1 -1
  63. package/dist/components/json-tree-context.d.ts +13 -0
  64. package/dist/components/json-tree-context.d.ts.map +1 -0
  65. package/dist/components/json-tree-context.js +15 -0
  66. package/dist/components/json-tree-context.js.map +1 -0
  67. package/dist/components/json-tree-model.d.ts +56 -0
  68. package/dist/components/json-tree-model.d.ts.map +1 -0
  69. package/dist/components/json-tree-model.js +125 -0
  70. package/dist/components/json-tree-model.js.map +1 -0
  71. package/dist/components/json-tree-nodes.d.ts +30 -0
  72. package/dist/components/json-tree-nodes.d.ts.map +1 -0
  73. package/dist/components/json-tree-nodes.js +118 -0
  74. package/dist/components/json-tree-nodes.js.map +1 -0
  75. package/dist/components/json-tree.d.ts.map +1 -1
  76. package/dist/components/json-tree.js +7 -295
  77. package/dist/components/json-tree.js.map +1 -1
  78. package/dist/components/json-value-format.d.ts +20 -0
  79. package/dist/components/json-value-format.d.ts.map +1 -0
  80. package/dist/components/json-value-format.js +63 -0
  81. package/dist/components/json-value-format.js.map +1 -0
  82. package/dist/components/markdown-blocks.d.ts +38 -0
  83. package/dist/components/markdown-blocks.d.ts.map +1 -0
  84. package/dist/components/markdown-blocks.js +168 -0
  85. package/dist/components/markdown-blocks.js.map +1 -0
  86. package/dist/components/markdown-inline.d.ts +24 -0
  87. package/dist/components/markdown-inline.d.ts.map +1 -0
  88. package/dist/components/markdown-inline.js +257 -0
  89. package/dist/components/markdown-inline.js.map +1 -0
  90. package/dist/components/markdown.d.ts +3 -52
  91. package/dist/components/markdown.d.ts.map +1 -1
  92. package/dist/components/markdown.js +4 -376
  93. package/dist/components/markdown.js.map +1 -1
  94. package/dist/components/observer-registry.d.ts +38 -0
  95. package/dist/components/observer-registry.d.ts.map +1 -0
  96. package/dist/components/observer-registry.js +131 -0
  97. package/dist/components/observer-registry.js.map +1 -0
  98. package/dist/components/overflow-measure.d.ts +38 -0
  99. package/dist/components/overflow-measure.d.ts.map +1 -0
  100. package/dist/components/overflow-measure.js +54 -0
  101. package/dist/components/overflow-measure.js.map +1 -0
  102. package/dist/components/prose-regions.d.ts +81 -0
  103. package/dist/components/prose-regions.d.ts.map +1 -0
  104. package/dist/components/prose-regions.js +128 -0
  105. package/dist/components/prose-regions.js.map +1 -0
  106. package/dist/components/scroll-region.d.ts.map +1 -1
  107. package/dist/components/scroll-region.js +3 -298
  108. package/dist/components/scroll-region.js.map +1 -1
  109. package/dist/components/tab-stop-parse.d.ts +53 -0
  110. package/dist/components/tab-stop-parse.d.ts.map +1 -0
  111. package/dist/components/tab-stop-parse.js +202 -0
  112. package/dist/components/tab-stop-parse.js.map +1 -0
  113. package/dist/components/templated-text-field.d.ts.map +1 -1
  114. package/dist/components/templated-text-field.js +10 -148
  115. package/dist/components/templated-text-field.js.map +1 -1
  116. package/dist/components/templated-text-kwargs-editor.d.ts +24 -0
  117. package/dist/components/templated-text-kwargs-editor.d.ts.map +1 -0
  118. package/dist/components/templated-text-kwargs-editor.js +48 -0
  119. package/dist/components/templated-text-kwargs-editor.js.map +1 -0
  120. package/dist/components/templated-text-kwargs.d.ts +37 -0
  121. package/dist/components/templated-text-kwargs.d.ts.map +1 -0
  122. package/dist/components/templated-text-kwargs.js +66 -0
  123. package/dist/components/templated-text-kwargs.js.map +1 -0
  124. package/dist/components/templated-text-source.d.ts +33 -0
  125. package/dist/components/templated-text-source.d.ts.map +1 -0
  126. package/dist/components/templated-text-source.js +53 -0
  127. package/dist/components/templated-text-source.js.map +1 -0
  128. package/dist/components/tool-picker-parts.d.ts +39 -0
  129. package/dist/components/tool-picker-parts.d.ts.map +1 -0
  130. package/dist/components/tool-picker-parts.js +87 -0
  131. package/dist/components/tool-picker-parts.js.map +1 -0
  132. package/dist/components/tool-picker.d.ts +1 -2
  133. package/dist/components/tool-picker.d.ts.map +1 -1
  134. package/dist/components/tool-picker.js +4 -66
  135. package/dist/components/tool-picker.js.map +1 -1
  136. package/dist/components/version-history-panel.d.ts.map +1 -1
  137. package/dist/components/version-history-panel.js +7 -34
  138. package/dist/components/version-history-panel.js.map +1 -1
  139. package/dist/components/version-history-rows.d.ts +48 -0
  140. package/dist/components/version-history-rows.d.ts.map +1 -0
  141. package/dist/components/version-history-rows.js +51 -0
  142. package/dist/components/version-history-rows.js.map +1 -0
  143. package/dist/guards.d.ts +6 -0
  144. package/dist/guards.d.ts.map +1 -0
  145. package/dist/guards.js +8 -0
  146. package/dist/guards.js.map +1 -0
  147. package/dist/hooks/interactions-connection.d.ts +43 -0
  148. package/dist/hooks/interactions-connection.d.ts.map +1 -0
  149. package/dist/hooks/interactions-connection.js +171 -0
  150. package/dist/hooks/interactions-connection.js.map +1 -0
  151. package/dist/hooks/interactions-stream.d.ts +80 -0
  152. package/dist/hooks/interactions-stream.d.ts.map +1 -0
  153. package/dist/hooks/interactions-stream.js +233 -0
  154. package/dist/hooks/interactions-stream.js.map +1 -0
  155. package/dist/hooks/useApi.d.ts +2409 -2293
  156. package/dist/hooks/useApi.d.ts.map +1 -1
  157. package/dist/hooks/useSse.d.ts +3 -6
  158. package/dist/hooks/useSse.d.ts.map +1 -1
  159. package/dist/hooks/useSse.js +38 -451
  160. package/dist/hooks/useSse.js.map +1 -1
  161. package/dist/navigation/app-link.d.ts +25 -0
  162. package/dist/navigation/app-link.d.ts.map +1 -0
  163. package/dist/navigation/app-link.js +33 -0
  164. package/dist/navigation/app-link.js.map +1 -0
  165. package/dist/navigation/context.d.ts +3 -20
  166. package/dist/navigation/context.d.ts.map +1 -1
  167. package/dist/navigation/context.js +7 -267
  168. package/dist/navigation/context.js.map +1 -1
  169. package/dist/navigation/entry-state.d.ts +23 -0
  170. package/dist/navigation/entry-state.d.ts.map +1 -0
  171. package/dist/navigation/entry-state.js +39 -0
  172. package/dist/navigation/entry-state.js.map +1 -0
  173. package/dist/navigation/guard-registry.d.ts +30 -0
  174. package/dist/navigation/guard-registry.d.ts.map +1 -0
  175. package/dist/navigation/guard-registry.js +46 -0
  176. package/dist/navigation/guard-registry.js.map +1 -0
  177. package/dist/navigation/guarded-navigation.d.ts +24 -0
  178. package/dist/navigation/guarded-navigation.d.ts.map +1 -0
  179. package/dist/navigation/guarded-navigation.js +102 -0
  180. package/dist/navigation/guarded-navigation.js.map +1 -0
  181. package/dist/navigation/index.d.ts +3 -2
  182. package/dist/navigation/index.d.ts.map +1 -1
  183. package/dist/navigation/index.js +2 -1
  184. package/dist/navigation/index.js.map +1 -1
  185. package/dist/navigation/types.d.ts +8 -11
  186. package/dist/navigation/types.d.ts.map +1 -1
  187. package/dist/navigation/use-back-forward-guard.d.ts +5 -0
  188. package/dist/navigation/use-back-forward-guard.d.ts.map +1 -0
  189. package/dist/navigation/use-back-forward-guard.js +82 -0
  190. package/dist/navigation/use-back-forward-guard.js.map +1 -0
  191. package/dist/plugin/registry.d.ts +6 -15
  192. package/dist/plugin/registry.d.ts.map +1 -1
  193. package/dist/plugin/registry.js +83 -75
  194. package/dist/plugin/registry.js.map +1 -1
  195. package/dist/schema-editor/SchemaEditor.d.ts +8 -1
  196. package/dist/schema-editor/SchemaEditor.d.ts.map +1 -1
  197. package/dist/schema-editor/SchemaEditor.js +2 -2
  198. package/dist/schema-editor/SchemaEditor.js.map +1 -1
  199. package/dist/schema-form/SecretRefField.d.ts +2 -3
  200. package/dist/schema-form/SecretRefField.d.ts.map +1 -1
  201. package/dist/schema-form/SecretRefField.js +23 -12
  202. package/dist/schema-form/SecretRefField.js.map +1 -1
  203. package/dist/schema-form/classify.d.ts +1 -122
  204. package/dist/schema-form/classify.d.ts.map +1 -1
  205. package/dist/schema-form/classify.js +174 -237
  206. package/dist/schema-form/classify.js.map +1 -1
  207. package/dist/schema-form/default-value.d.ts.map +1 -1
  208. package/dist/schema-form/default-value.js +42 -19
  209. package/dist/schema-form/default-value.js.map +1 -1
  210. package/dist/schema-form/enum-field.d.ts +1 -1
  211. package/dist/schema-form/enum-field.d.ts.map +1 -1
  212. package/dist/schema-form/field-model.d.ts +121 -0
  213. package/dist/schema-form/field-model.d.ts.map +1 -0
  214. package/dist/schema-form/field-model.js +2 -0
  215. package/dist/schema-form/field-model.js.map +1 -0
  216. package/dist/schema-form/field-node.d.ts.map +1 -1
  217. package/dist/schema-form/field-node.js +25 -14
  218. package/dist/schema-form/field-node.js.map +1 -1
  219. package/dist/schema-form/media-field.d.ts +1 -1
  220. package/dist/schema-form/media-field.d.ts.map +1 -1
  221. package/dist/schema-form/media-field.js +47 -28
  222. package/dist/schema-form/media-field.js.map +1 -1
  223. package/dist/schema-form/string-annotations.d.ts +20 -0
  224. package/dist/schema-form/string-annotations.d.ts.map +1 -0
  225. package/dist/schema-form/string-annotations.js +105 -0
  226. package/dist/schema-form/string-annotations.js.map +1 -0
  227. package/dist/schema-form/string-field.d.ts +1 -1
  228. package/dist/schema-form/string-field.d.ts.map +1 -1
  229. package/dist/schema-form/union-field.d.ts +1 -1
  230. package/dist/schema-form/union-field.d.ts.map +1 -1
  231. package/dist/schema-form/union-field.js.map +1 -1
  232. package/dist/schema-form/union.d.ts +1 -1
  233. package/dist/schema-form/union.d.ts.map +1 -1
  234. package/dist/schema-form/validate.d.ts.map +1 -1
  235. package/dist/schema-form/validate.js +126 -105
  236. package/dist/schema-form/validate.js.map +1 -1
  237. package/dist/state-binding/AdapterMapping.d.ts.map +1 -1
  238. package/dist/state-binding/AdapterMapping.js +0 -0
  239. package/dist/state-binding/AdapterMapping.js.map +1 -1
  240. package/dist/state-binding/StateAttachRow.d.ts.map +1 -1
  241. package/dist/state-binding/StateAttachRow.js +52 -36
  242. package/dist/state-binding/StateAttachRow.js.map +1 -1
  243. package/dist/state-binding/adapter-mapping-row.d.ts +17 -0
  244. package/dist/state-binding/adapter-mapping-row.d.ts.map +1 -0
  245. package/dist/state-binding/adapter-mapping-row.js +87 -0
  246. package/dist/state-binding/adapter-mapping-row.js.map +1 -0
  247. package/dist/structured-output/StructuredOutput.d.ts.map +1 -1
  248. package/dist/structured-output/StructuredOutput.js +1 -3
  249. package/dist/structured-output/StructuredOutput.js.map +1 -1
  250. package/package.json +2 -2
  251. package/src/components/explorer-body.tsx +239 -0
  252. package/src/components/explorer-page-size.ts +39 -0
  253. package/src/components/explorer-tag-filter.tsx +80 -0
  254. package/src/components/explorer-tags.ts +64 -0
  255. package/src/components/explorer-view.tsx +114 -366
  256. package/src/components/extension-combo-builder.tsx +35 -152
  257. package/src/components/extension-combo-parts.tsx +237 -0
  258. package/src/components/fleet-report.tsx +97 -54
  259. package/src/components/icons/chrome-marks.tsx +195 -0
  260. package/src/components/icons/icon-frame.tsx +50 -0
  261. package/src/components/icons/index.ts +84 -0
  262. package/src/components/icons/nav-map.ts +55 -0
  263. package/src/components/icons/nav-marks.tsx +205 -0
  264. package/src/components/icons/status-marks.tsx +46 -0
  265. package/src/components/icons/theme-marks.tsx +33 -0
  266. package/src/components/json-diff.tsx +1 -4
  267. package/src/components/json-tree-context.ts +26 -0
  268. package/src/components/json-tree-model.ts +139 -0
  269. package/src/components/json-tree-nodes.tsx +224 -0
  270. package/src/components/json-tree.tsx +15 -434
  271. package/src/components/json-value-format.ts +64 -0
  272. package/src/components/markdown-blocks.ts +198 -0
  273. package/src/components/markdown-inline.tsx +365 -0
  274. package/src/components/markdown.tsx +5 -471
  275. package/src/components/observer-registry.ts +139 -0
  276. package/src/components/overflow-measure.ts +69 -0
  277. package/src/components/prose-regions.ts +153 -0
  278. package/src/components/scroll-region.tsx +20 -360
  279. package/src/components/tab-stop-parse.ts +217 -0
  280. package/src/components/templated-text-field.tsx +38 -330
  281. package/src/components/templated-text-kwargs-editor.tsx +147 -0
  282. package/src/components/templated-text-kwargs.ts +92 -0
  283. package/src/components/templated-text-source.tsx +226 -0
  284. package/src/components/tool-picker-parts.tsx +184 -0
  285. package/src/components/tool-picker.tsx +22 -114
  286. package/src/components/version-history-panel.tsx +38 -142
  287. package/src/components/version-history-rows.tsx +220 -0
  288. package/src/guards.ts +7 -0
  289. package/src/hooks/interactions-connection.ts +227 -0
  290. package/src/hooks/interactions-stream.ts +274 -0
  291. package/src/hooks/useSse.ts +50 -477
  292. package/src/navigation/app-link.tsx +70 -0
  293. package/src/navigation/context.tsx +11 -330
  294. package/src/navigation/entry-state.ts +42 -0
  295. package/src/navigation/guard-registry.ts +65 -0
  296. package/src/navigation/guarded-navigation.ts +147 -0
  297. package/src/navigation/index.ts +2 -2
  298. package/src/navigation/types.ts +8 -11
  299. package/src/navigation/use-back-forward-guard.ts +90 -0
  300. package/src/plugin/registry.ts +111 -90
  301. package/src/schema-editor/SchemaEditor.tsx +9 -1
  302. package/src/schema-form/SecretRefField.tsx +121 -71
  303. package/src/schema-form/classify.ts +244 -395
  304. package/src/schema-form/default-value.ts +48 -17
  305. package/src/schema-form/enum-field.tsx +1 -1
  306. package/src/schema-form/field-model.ts +133 -0
  307. package/src/schema-form/field-node.tsx +94 -38
  308. package/src/schema-form/media-field.tsx +134 -65
  309. package/src/schema-form/string-annotations.ts +111 -0
  310. package/src/schema-form/string-field.tsx +1 -1
  311. package/src/schema-form/union-field.tsx +2 -1
  312. package/src/schema-form/union.ts +1 -1
  313. package/src/schema-form/validate.ts +184 -103
  314. package/src/state-binding/AdapterMapping.tsx +0 -0
  315. package/src/state-binding/StateAttachRow.tsx +222 -147
  316. package/src/state-binding/adapter-mapping-row.tsx +232 -0
  317. package/src/structured-output/StructuredOutput.tsx +1 -4
  318. package/dist/components/icons.d.ts +0 -160
  319. package/dist/components/icons.d.ts.map +0 -1
  320. package/dist/components/icons.js +0 -160
  321. package/dist/components/icons.js.map +0 -1
  322. package/src/components/icons.tsx +0 -586
@@ -0,0 +1,102 @@
1
+ import { mergeEntryState, reconstructEntryState } from './entry-state';
2
+ // navigate: forwarded as a REST tuple so the shell's `navigate` is called with
3
+ // exactly the arguments the caller passed — a caller wanting the default history
4
+ // behaviour never turns into one that passed an explicit `undefined` for it.
5
+ function buildNavigate(value, registry, committedRef) {
6
+ return (...args) => {
7
+ const [token, search] = args;
8
+ if (!registry.hasArmedGuards()) {
9
+ value.navigate(...args);
10
+ return;
11
+ }
12
+ void registry.run().then((allowed) => {
13
+ if (!allowed)
14
+ return;
15
+ value.navigate(...args);
16
+ // Advance the committed entry to the resolved destination (the router may commit
17
+ // async, so `window.location` would be stale). Router state is unobservable here.
18
+ if (committedRef.current !== null) {
19
+ committedRef.current = { href: value.resolvePath(token, search), state: null };
20
+ }
21
+ });
22
+ };
23
+ }
24
+ function buildNavigatePlugin(value, registry, committedRef) {
25
+ return (pluginId, pagePath, params, search) => {
26
+ if (!registry.hasArmedGuards()) {
27
+ value.navigatePlugin(pluginId, pagePath, params, search);
28
+ return;
29
+ }
30
+ void registry.run().then((allowed) => {
31
+ if (!allowed)
32
+ return;
33
+ value.navigatePlugin(pluginId, pagePath, params, search);
34
+ if (committedRef.current !== null) {
35
+ committedRef.current = {
36
+ href: value.resolvePluginPath(pluginId, pagePath, params, search),
37
+ state: null,
38
+ };
39
+ }
40
+ });
41
+ };
42
+ }
43
+ // navigatePluginWithOptions: guard-gated exactly like navigatePlugin (a veto never
44
+ // reaches the host member). On approval, refresh the committed entry with the
45
+ // reconstructed state bag so a subsequent vetoed Back restores the slot this
46
+ // navigation just wrote, not null.
47
+ function buildNavigateWithOptions(hostNavigateWithOptions, value, registry, committedRef) {
48
+ return (pluginId, pagePath, params, search, options) => {
49
+ if (!registry.hasArmedGuards()) {
50
+ hostNavigateWithOptions(pluginId, pagePath, params, search, options);
51
+ return;
52
+ }
53
+ void registry.run().then((allowed) => {
54
+ if (!allowed)
55
+ return;
56
+ hostNavigateWithOptions(pluginId, pagePath, params, search, options);
57
+ if (committedRef.current !== null) {
58
+ committedRef.current = {
59
+ href: value.resolvePluginPath(pluginId, pagePath, params, search),
60
+ state: options?.state !== undefined ? reconstructEntryState(pluginId, options.state) : null,
61
+ };
62
+ }
63
+ });
64
+ };
65
+ }
66
+ // updatePluginEntryState: guard-FREE — rewriting the current entry's state is not a
67
+ // navigation away. The SDK still wraps it to refresh the committed entry with the
68
+ // merged slot, so a later vetoed Back restores the UPDATED state. URL is unchanged.
69
+ function buildUpdateEntryState(hostUpdateEntryState, committedRef) {
70
+ return (pluginId, state) => {
71
+ hostUpdateEntryState(pluginId, state);
72
+ if (committedRef.current !== null) {
73
+ committedRef.current = {
74
+ href: committedRef.current.href,
75
+ state: mergeEntryState(committedRef.current.state, pluginId, state),
76
+ };
77
+ }
78
+ };
79
+ }
80
+ /**
81
+ * Build the guarded navigation value. The two host-optional members
82
+ * (`navigatePluginWithOptions`, `updatePluginEntryState`) are wrapped only when the
83
+ * host provides them; an older host leaves them undefined and the plugin-facing hook
84
+ * throws loudly.
85
+ */
86
+ export function buildGuardedNavigation(value, registry, committedRef) {
87
+ const result = {
88
+ ...value,
89
+ navigate: buildNavigate(value, registry, committedRef),
90
+ navigatePlugin: buildNavigatePlugin(value, registry, committedRef),
91
+ };
92
+ const hostNavigateWithOptions = value.navigatePluginWithOptions;
93
+ if (hostNavigateWithOptions !== undefined) {
94
+ result.navigatePluginWithOptions = buildNavigateWithOptions(hostNavigateWithOptions, value, registry, committedRef);
95
+ }
96
+ const hostUpdateEntryState = value.updatePluginEntryState;
97
+ if (hostUpdateEntryState !== undefined) {
98
+ result.updatePluginEntryState = buildUpdateEntryState(hostUpdateEntryState, committedRef);
99
+ }
100
+ return result;
101
+ }
102
+ //# sourceMappingURL=guarded-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guarded-navigation.js","sourceRoot":"","sources":["../../src/navigation/guarded-navigation.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- export { NavigationProvider, AppLink, useAppNavigate, useResolvePath, usePluginNavigation, usePluginEntryNavigation, useNavigationGuard, useNavigationGate, } from './context';
2
- export type { AppLinkProps } from './context';
1
+ export { NavigationProvider, useAppNavigate, useResolvePath, usePluginNavigation, usePluginEntryNavigation, useNavigationGuard, useNavigationGate, } from './context';
2
+ export { AppLink } from './app-link';
3
+ export type { AppLinkProps } from './app-link';
3
4
  export { useSearchCommit } from './use-search-commit';
4
5
  export type { SearchCommitParams } from './use-search-commit';
5
6
  export type { RouteToken, RouteSearch, RouteSearchByToken, PageProps, NavigationContextValue, NavigateOptions, PluginNavigateOptions, PluginSearch, NavigationGuardHandler, } from './types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,YAAY,EACV,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,sBAAsB,GACvB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,YAAY,EACV,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,sBAAsB,GACvB,MAAM,SAAS,CAAC"}
@@ -1,3 +1,4 @@
1
- export { NavigationProvider, AppLink, useAppNavigate, useResolvePath, usePluginNavigation, usePluginEntryNavigation, useNavigationGuard, useNavigationGate, } from './context';
1
+ export { NavigationProvider, useAppNavigate, useResolvePath, usePluginNavigation, usePluginEntryNavigation, useNavigationGuard, useNavigationGate, } from './context';
2
+ export { AppLink } from './app-link';
2
3
  export { useSearchCommit } from './use-search-commit';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -170,21 +170,18 @@ export interface NavigationContextValue {
170
170
  resolvePluginPath: (pluginId: string, pagePath: string, params?: string, search?: PluginSearch) => string;
171
171
  /**
172
172
  * ADDITIVE plugin-page navigation that also carries per-history-entry
173
- * {@link PluginNavigateOptions}. OPTIONAL because a Studio host built before this
174
- * feature does not provide it; plugins reach it — and require a host that does —
175
- * through {@link usePluginEntryNavigation}, which throws loudly on an older host.
173
+ * {@link PluginNavigateOptions}. OPTIONAL because a host that does not implement it
174
+ * leaves it undefined; plugins reach it — and require a host that provides it —
175
+ * through {@link usePluginEntryNavigation}, which throws loudly when it is absent.
176
176
  * It behaves exactly like {@link navigatePlugin} for path / params / search, and in
177
177
  * addition writes `options.state` onto the DESTINATION entry under the plugin's own
178
178
  * namespace slot (see {@link PluginPageProps.entryState}).
179
179
  *
180
- * NEXT-MAJOR (9.0) CONSOLIDATION NOTE: fold `options` into {@link navigatePlugin}'s
181
- * own signature and RETIRE this sibling. It exists as a separate optional member
182
- * ONLY to stay additive under the plugin-API equality gate — a new optional member
183
- * does not move {@link STUDIO_PLUGIN_API_VERSION}, so every existing plugin keeps
184
- * loading. Cutting a MAJOR now purely to rename one method onto another is the
185
- * disproportion anti-pattern: a breaking change for a cosmetic merge. The merge
186
- * therefore waits for the next major that carries real breaks; until then both
187
- * coexist and {@link navigatePlugin} stays byte-for-byte stable.
180
+ * It is a separate optional member rather than an extra parameter on
181
+ * {@link navigatePlugin} so it stays additive under the plugin-API equality gate: a
182
+ * new optional member does not move {@link STUDIO_PLUGIN_API_VERSION}, so every
183
+ * existing plugin keeps loading and {@link navigatePlugin}'s own signature stays
184
+ * stable.
188
185
  */
189
186
  navigatePluginWithOptions?: (pluginId: string, pagePath: string, params?: string, search?: PluginSearch, options?: PluginNavigateOptions) => void;
190
187
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { RefObject } from 'react';
2
+ import type { NavigationGuardRegistry } from './guard-registry';
3
+ import type { CommittedEntry } from './guarded-navigation';
4
+ export declare function useBackForwardGuard(registry: NavigationGuardRegistry, committedRef: RefObject<CommittedEntry | null>): void;
5
+ //# sourceMappingURL=use-back-forward-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-back-forward-guard.d.ts","sourceRoot":"","sources":["../../src/navigation/use-back-forward-guard.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,uBAAuB,EACjC,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,GAC7C,IAAI,CAyEN"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * The browser back/forward and full-unload arm of the navigation guard. While any
3
+ * guard is armed it intercepts `popstate` — canceling the move by re-pushing the
4
+ * committed entry, consulting the guards once, and replaying the move on approval —
5
+ * and installs a `beforeunload` prompt. It attaches the listeners only while armed,
6
+ * mirroring the registry's armed state into React.
7
+ */
8
+ import { useEffect, useState } from 'react';
9
+ export function useBackForwardGuard(registry, committedRef) {
10
+ // Mirror the registry's armed state into React so the browser listeners attach only
11
+ // while at least one guard is armed.
12
+ const [armed, setArmed] = useState(false);
13
+ useEffect(() => {
14
+ setArmed(registry.hasArmedGuards());
15
+ return registry.subscribe(() => {
16
+ setArmed(registry.hasArmedGuards());
17
+ });
18
+ }, [registry]);
19
+ useEffect(() => {
20
+ if (!armed)
21
+ return;
22
+ // The protected entry (URL + state); a back/forward landing elsewhere is first
23
+ // canceled back to here while the guard is consulted.
24
+ committedRef.current = { href: window.location.href, state: window.history.state };
25
+ // Set while replaying a guard-approved back/forward, so its `popstate` passes
26
+ // through instead of being re-intercepted.
27
+ let bypass = false;
28
+ // Latched while a decision is pending, so a second Back mid-decision keeps canceling
29
+ // without starting a concurrent `registry.run()` — one gesture, one dialog.
30
+ let pending = false;
31
+ // Restore pushes stacked for the pending decision, so an approved replay unwinds
32
+ // exactly that far in one `go(-depth)`. Reset per decision.
33
+ let restores = 0;
34
+ const onPopState = () => {
35
+ if (bypass) {
36
+ bypass = false;
37
+ committedRef.current = { href: window.location.href, state: window.history.state };
38
+ return;
39
+ }
40
+ if (!registry.hasArmedGuards()) {
41
+ committedRef.current = { href: window.location.href, state: window.history.state };
42
+ return;
43
+ }
44
+ const committed = committedRef.current;
45
+ if (committed === null)
46
+ return;
47
+ // Cancel the browser's move by pushing the committed entry on top of wherever it
48
+ // landed. popstate exposes no direction/distance and the router owns
49
+ // `history.state`, so restore can only push, not delete. A vetoed forward thus
50
+ // strands a stub entry — an accepted limit the next pushState truncates.
51
+ window.history.pushState(committed.state, '', committed.href);
52
+ restores += 1;
53
+ if (pending)
54
+ return;
55
+ pending = true;
56
+ void registry.run().then((allowed) => {
57
+ pending = false;
58
+ const depth = restores;
59
+ restores = 0;
60
+ if (!allowed)
61
+ return;
62
+ bypass = true;
63
+ window.history.go(-depth);
64
+ });
65
+ };
66
+ const onBeforeUnload = (event) => {
67
+ event.preventDefault();
68
+ // Browsers below the floor (Chrome 108) gate the prompt on a set `returnValue`,
69
+ // not `preventDefault` alone; the string is ignored. Typed deprecated, still required.
70
+ // eslint-disable-next-line @typescript-eslint/no-deprecated -- required beforeunload trigger for the supported browser range.
71
+ event.returnValue = '';
72
+ };
73
+ window.addEventListener('popstate', onPopState);
74
+ window.addEventListener('beforeunload', onBeforeUnload);
75
+ return () => {
76
+ committedRef.current = null;
77
+ window.removeEventListener('popstate', onPopState);
78
+ window.removeEventListener('beforeunload', onBeforeUnload);
79
+ };
80
+ }, [armed, registry, committedRef]);
81
+ }
82
+ //# sourceMappingURL=use-back-forward-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-back-forward-guard.js","sourceRoot":"","sources":["../../src/navigation/use-back-forward-guard.ts"],"names":[],"mappings":"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"}
@@ -11,21 +11,12 @@ import type { PluginContributions, PluginEntry } from './types';
11
11
  * Load one plugin: call its `register` entry with a context bound to `pluginId`,
12
12
  * then commit everything it staged into the global registry.
13
13
  *
14
- * Contributions are STAGED into local arrays (identity captured in the closure,
15
- * never read from ambient state) and only committed after `entry` settles
16
- * successfully. `entry` is AWAITED before commit, so a synchronous or an `async`
17
- * entry is fully done first: a post-`await` throw skips the commit (atomicity
18
- * holds for async too) and a post-`await` registration cannot slip past the batch.
19
- * The seal is set after `entry` has SETTLED — for a sync entry, after it returns
20
- * and the `await` continuation runs; for an async entry, after its returned promise
21
- * resolves. A registration attempted from that point on (a deferred timer, a
22
- * callback scheduled after settle) throws loudly instead of pushing into an
23
- * orphaned staged array that never commits. Registrations made during `entry`'s
24
- * synchronous body — including a microtask it enqueues then, which runs before the
25
- * `await` continuation — are still captured and committed with the batch. A
26
- * `register` that throws commits nothing and leaves the registry untouched.
27
- * Duplicate guards run against BOTH the staged contributions and what is already
28
- * committed, and fail loudly.
14
+ * `entry` is AWAITED before commit, so a synchronous or an `async` entry is fully
15
+ * done first: a post-`await` throw skips the commit (atomicity holds for async too)
16
+ * and a post-`await` registration cannot slip past the batch. The seal is set after
17
+ * `entry` has SETTLED, so a later registration throws loudly; registrations made
18
+ * during `entry`'s synchronous body — including a microtask it enqueues then — are
19
+ * still captured and committed. A `register` that throws commits nothing.
29
20
  */
30
21
  export declare function loadPlugin(pluginId: string, entry: PluginEntry): Promise<void>;
31
22
  /** The shell reads this after loading every installed plugin bundle. */
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAIV,mBAAmB,EACnB,WAAW,EAMZ,MAAM,SAAS,CAAC;AAOjB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHpF;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI,mBAAmB,CAEtD;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAIV,mBAAmB,EACnB,WAAW,EAMZ,MAAM,SAAS,CAAC;AAwIjB;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAepF;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI,mBAAmB,CAEtD;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
@@ -2,118 +2,126 @@ const toolPanels = new Map();
2
2
  const pages = [];
3
3
  const settingsTabs = [];
4
4
  const navEntries = [];
5
+ function emptyStaged() {
6
+ return {
7
+ pages: [],
8
+ toolPanels: new Map(),
9
+ settingsTabs: [],
10
+ tabIds: new Set(),
11
+ navEntries: [],
12
+ };
13
+ }
5
14
  /**
6
- * Load one plugin: call its `register` entry with a context bound to `pluginId`,
7
- * then commit everything it staged into the global registry.
8
- *
9
- * Contributions are STAGED into local arrays (identity captured in the closure,
10
- * never read from ambient state) and only committed after `entry` settles
11
- * successfully. `entry` is AWAITED before commit, so a synchronous or an `async`
12
- * entry is fully done first: a post-`await` throw skips the commit (atomicity
13
- * holds for async too) and a post-`await` registration cannot slip past the batch.
14
- * The seal is set after `entry` has SETTLED — for a sync entry, after it returns
15
- * and the `await` continuation runs; for an async entry, after its returned promise
16
- * resolves. A registration attempted from that point on (a deferred timer, a
17
- * callback scheduled after settle) throws loudly instead of pushing into an
18
- * orphaned staged array that never commits. Registrations made during `entry`'s
19
- * synchronous body — including a microtask it enqueues then, which runs before the
20
- * `await` continuation — are still captured and committed with the batch. A
21
- * `register` that throws commits nothing and leaves the registry untouched.
22
- * Duplicate guards run against BOTH the staged contributions and what is already
15
+ * Build the {@link PluginContext} a plugin's `register` entry contributes through.
16
+ * Every method stages into `staged` (never ambient state) and refuses once `seal` is
17
+ * closed — a registration after `entry` settles (a deferred timer, a post-settle
18
+ * callback) throws loudly rather than pushing into an orphaned array that never
19
+ * commits. Duplicate guards run against BOTH the staged set and what is already
23
20
  * committed, and fail loudly.
24
21
  */
25
- export async function loadPlugin(pluginId, entry) {
26
- const stagedPages = [];
27
- const stagedToolPanels = new Map();
28
- const stagedSettingsTabs = [];
29
- const stagedTabIds = new Set();
30
- const stagedNavEntries = [];
31
- let sealed = false;
32
- const context = {
22
+ function makeStagingContext(pluginId, staged, seal) {
23
+ const assertOpen = () => {
24
+ if (seal.closed) {
25
+ throw new Error('registration is closed: a plugin must register during register(), not after it resolves');
26
+ }
27
+ };
28
+ return {
33
29
  registerPage(contribution) {
34
- if (sealed) {
35
- throw new Error('registration is closed: a plugin must register during register(), not after it resolves');
36
- }
37
- const staged = stagedPages.some((p) => p.path === contribution.path);
38
- const committed = pages.some((p) => p.pluginId === pluginId && p.path === contribution.path);
39
- if (staged || committed) {
30
+ assertOpen();
31
+ const duplicate = staged.pages.some((p) => p.path === contribution.path) ||
32
+ pages.some((p) => p.pluginId === pluginId && p.path === contribution.path);
33
+ if (duplicate) {
40
34
  // A duplicate path within one plugin is an author mistake that would
41
35
  // leave one page unreachable — fail loudly, as registerToolPanel does.
42
36
  throw new Error(`plugin “${pluginId}” already registered a page at “${contribution.path}”`);
43
37
  }
44
- stagedPages.push({ ...contribution, pluginId });
38
+ staged.pages.push({ ...contribution, pluginId });
45
39
  },
46
40
  registerToolPanel(contribution) {
47
- if (sealed) {
48
- throw new Error('registration is closed: a plugin must register during register(), not after it resolves');
49
- }
50
- if (stagedToolPanels.has(contribution.toolName) || toolPanels.has(contribution.toolName)) {
41
+ assertOpen();
42
+ if (staged.toolPanels.has(contribution.toolName) || toolPanels.has(contribution.toolName)) {
51
43
  throw new Error(`a tool panel is already registered for ${contribution.toolName}`);
52
44
  }
53
- stagedToolPanels.set(contribution.toolName, contribution);
45
+ staged.toolPanels.set(contribution.toolName, contribution);
54
46
  },
55
47
  registerSettingsTab(contribution) {
56
- if (sealed) {
57
- throw new Error('registration is closed: a plugin must register during register(), not after it resolves');
58
- }
48
+ assertOpen();
59
49
  const committed = settingsTabs.some((t) => t.pluginId === pluginId && t.id === contribution.id);
60
- if (stagedTabIds.has(contribution.id) || committed) {
50
+ if (staged.tabIds.has(contribution.id) || committed) {
61
51
  // A duplicate tab id within one plugin would leave one tab unreachable —
62
52
  // fail loudly, mirroring the page-path guard.
63
53
  throw new Error(`plugin “${pluginId}” already registered a settings tab “${contribution.id}”`);
64
54
  }
65
- stagedTabIds.add(contribution.id);
66
- stagedSettingsTabs.push({ ...contribution, pluginId });
55
+ staged.tabIds.add(contribution.id);
56
+ staged.settingsTabs.push({ ...contribution, pluginId });
67
57
  },
68
58
  registerNavEntry(contribution) {
69
- if (sealed) {
70
- throw new Error('registration is closed: a plugin must register during register(), not after it resolves');
71
- }
72
- const staged = stagedNavEntries.some((e) => e.path === contribution.path);
73
- const committed = navEntries.some((e) => e.pluginId === pluginId && e.path === contribution.path);
74
- if (staged || committed) {
59
+ assertOpen();
60
+ const duplicate = staged.navEntries.some((e) => e.path === contribution.path) ||
61
+ navEntries.some((e) => e.pluginId === pluginId && e.path === contribution.path);
62
+ if (duplicate) {
75
63
  // A duplicate nav path within one plugin is an author mistake — two
76
64
  // entries pointing at the same page — so fail loudly like the page guard.
77
65
  throw new Error(`plugin “${pluginId}” already registered a nav entry at “${contribution.path}”`);
78
66
  }
79
- stagedNavEntries.push({ ...contribution, pluginId });
67
+ staged.navEntries.push({ ...contribution, pluginId });
80
68
  },
81
69
  };
82
- try {
83
- await entry(context);
84
- }
85
- finally {
86
- // Whether `entry` resolved or threw, no further registration is valid — seal
87
- // so a deferred call fails loudly rather than pushing into an orphaned array.
88
- sealed = true;
89
- }
90
- // Every nav entry must link to a page THIS plugin registers — staged in this
91
- // call or already committed. A nav entry with no matching page is a guaranteed
92
- // dead link (the plugin page surface renders "Page not found"), so reject it
93
- // loudly. This throws BEFORE the commit loops, so it propagates out of
94
- // `loadPlugin` and NOTHING (pages, panels, tabs, nav) commits — atomicity holds.
95
- for (const navEntry of stagedNavEntries) {
96
- const hasPage = stagedPages.some((p) => p.path === navEntry.path) ||
70
+ }
71
+ /**
72
+ * Every nav entry must link to a page THIS plugin registers — staged in this call or
73
+ * already committed. A nav entry with no matching page is a guaranteed dead link (the
74
+ * plugin page surface renders "Page not found"), so reject it loudly. Throwing here —
75
+ * BEFORE any commit — keeps atomicity: nothing (pages, panels, tabs, nav) commits.
76
+ */
77
+ function assertNavEntriesHavePages(pluginId, staged) {
78
+ for (const navEntry of staged.navEntries) {
79
+ const hasPage = staged.pages.some((p) => p.path === navEntry.path) ||
97
80
  pages.some((p) => p.pluginId === pluginId && p.path === navEntry.path);
98
81
  if (!hasPage) {
99
82
  throw new Error(`plugin “${pluginId}” registered a nav entry at “${navEntry.path}” but no page at that path`);
100
83
  }
101
84
  }
102
- // `entry` resolved without throwing: commit the staged contributions as one
103
- // batch, so the registry only ever holds a plugin's complete set — never a
104
- // partial set left behind by a mid-registration failure.
105
- for (const page of stagedPages) {
85
+ }
86
+ /**
87
+ * Commit the staged contributions as one batch, so the registry only ever holds a
88
+ * plugin's complete set — never a partial set left behind by a mid-registration failure.
89
+ */
90
+ function commitStaged(staged) {
91
+ for (const page of staged.pages)
106
92
  pages.push(page);
107
- }
108
- for (const [toolName, contribution] of stagedToolPanels) {
93
+ for (const [toolName, contribution] of staged.toolPanels)
109
94
  toolPanels.set(toolName, contribution);
110
- }
111
- for (const tab of stagedSettingsTabs) {
95
+ for (const tab of staged.settingsTabs)
112
96
  settingsTabs.push(tab);
113
- }
114
- for (const navEntry of stagedNavEntries) {
97
+ for (const navEntry of staged.navEntries)
115
98
  navEntries.push(navEntry);
99
+ }
100
+ /**
101
+ * Load one plugin: call its `register` entry with a context bound to `pluginId`,
102
+ * then commit everything it staged into the global registry.
103
+ *
104
+ * `entry` is AWAITED before commit, so a synchronous or an `async` entry is fully
105
+ * done first: a post-`await` throw skips the commit (atomicity holds for async too)
106
+ * and a post-`await` registration cannot slip past the batch. The seal is set after
107
+ * `entry` has SETTLED, so a later registration throws loudly; registrations made
108
+ * during `entry`'s synchronous body — including a microtask it enqueues then — are
109
+ * still captured and committed. A `register` that throws commits nothing.
110
+ */
111
+ export async function loadPlugin(pluginId, entry) {
112
+ const staged = emptyStaged();
113
+ const seal = { closed: false };
114
+ const context = makeStagingContext(pluginId, staged, seal);
115
+ try {
116
+ await entry(context);
117
+ }
118
+ finally {
119
+ // Whether `entry` resolved or threw, no further registration is valid — seal
120
+ // so a deferred call fails loudly rather than pushing into an orphaned array.
121
+ seal.closed = true;
116
122
  }
123
+ assertNavEntriesHavePages(pluginId, staged);
124
+ commitStaged(staged);
117
125
  }
118
126
  /** The shell reads this after loading every installed plugin bundle. */
119
127
  export function getContributions() {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,13 @@ export interface SchemaEditorProps {
38
38
  readonly description?: string;
39
39
  readonly disabled?: boolean;
40
40
  readonly idPrefix?: string;
41
+ /**
42
+ * Render the field label for ASSISTIVE TECH ONLY — visually hidden but still the editor's
43
+ * accessible name. Used when a host control already draws the visible label above this
44
+ * editor (e.g. an authored-body control whose inline editor this is), so the heading is not
45
+ * drawn twice. Forwarded to the underlying {@link Field}.
46
+ */
47
+ readonly hideLabel?: boolean;
41
48
  }
42
- export declare function SchemaEditor({ value, onChange, requireTitle, label, description, disabled, idPrefix, }: SchemaEditorProps): ReactNode;
49
+ export declare function SchemaEditor({ value, onChange, requireTitle, label, description, disabled, idPrefix, hideLabel, }: SchemaEditorProps): ReactNode;
43
50
  //# sourceMappingURL=SchemaEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaEditor.d.ts","sourceRoot":"","sources":["../../src/schema-editor/SchemaEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAYrE,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/C,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACxD,qFAAqF;IACrF,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAsFD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,KAAgB,EAChB,WAAW,EACX,QAAQ,EACR,QAA0B,GAC3B,EAAE,iBAAiB,GAAG,SAAS,CA2C/B"}
1
+ {"version":3,"file":"SchemaEditor.d.ts","sourceRoot":"","sources":["../../src/schema-editor/SchemaEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAYrE,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/C,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACxD,qFAAqF;IACrF,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAsFD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,KAAgB,EAChB,WAAW,EACX,QAAQ,EACR,QAA0B,EAC1B,SAAiB,GAClB,EAAE,iBAAiB,GAAG,SAAS,CA2C/B"}
@@ -90,7 +90,7 @@ function SchemaPreview({ schema, testId, }) {
90
90
  return jsonFallback;
91
91
  return (_jsx(PreviewBoundary, { fallback: jsonFallback, children: _jsx(ScrollRegion, { label: PREVIEW_LABEL, className: "tai-card", "data-testid": testId, children: _jsx(PreviewForm, { schema: schema }) }) }));
92
92
  }
93
- export function SchemaEditor({ value, onChange, requireTitle, label = 'Schema', description, disabled, idPrefix = 'schema-editor', }) {
93
+ export function SchemaEditor({ value, onChange, requireTitle, label = 'Schema', description, disabled, idPrefix = 'schema-editor', hideLabel = false, }) {
94
94
  const [text, setText] = useState(() => seedText(value));
95
95
  // Recomputed for display (inline error + preview) on every render; the change
96
96
  // handler lints the NEXT text independently so `onChange` and the view agree.
@@ -100,7 +100,7 @@ export function SchemaEditor({ value, onChange, requireTitle, label = 'Schema',
100
100
  const next = lintSchemaText(nextText, requireTitle);
101
101
  onChange({ schema: next.valid ? next.schema : null, valid: next.valid });
102
102
  };
103
- return (_jsxs("div", { "data-testid": idPrefix, className: "tai-stack tai-stack-3", children: [_jsx(Field, { label: label, description: description, error: result.error, children: _jsx(Textarea, { value: text, disabled: disabled, onChange: (event) => {
103
+ return (_jsxs("div", { "data-testid": idPrefix, className: "tai-stack tai-stack-3", children: [_jsx(Field, { label: label, description: description, hideLabel: hideLabel, error: result.error, children: _jsx(Textarea, { value: text, disabled: disabled, onChange: (event) => {
104
104
  emit(event.target.value);
105
105
  }, rows: 10, "aria-label": `${label} JSON`, className: "tai-textarea-mono", spellCheck: false }) }), result.schema !== null ? (_jsxs("div", { className: "tai-stack tai-stack-2", children: [_jsx("span", { className: "tai-label", children: "Preview" }), _jsx(SchemaPreview
106
106
  // Re-seed the preview (and reset its error boundary) whenever the