@ulearning/ai-generative-frame 0.0.0-stage → 1.0.0-next.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 (323) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -2
  3. package/dist/assistant-ui/entry.d.ts +34 -0
  4. package/dist/assistant-ui/entry.d.ts.map +1 -0
  5. package/dist/assistant-ui/entry.js +50 -0
  6. package/dist/assistant-ui/entry.js.map +1 -0
  7. package/dist/assistant-ui/extension.d.ts +18 -0
  8. package/dist/assistant-ui/extension.d.ts.map +1 -0
  9. package/dist/assistant-ui/extension.js +0 -0
  10. package/dist/assistant-ui/history.d.ts +15 -0
  11. package/dist/assistant-ui/history.d.ts.map +1 -0
  12. package/dist/assistant-ui/history.js +39 -0
  13. package/dist/assistant-ui/history.js.map +1 -0
  14. package/dist/assistant-ui/modelContext.d.ts +45 -0
  15. package/dist/assistant-ui/modelContext.d.ts.map +1 -0
  16. package/dist/assistant-ui/modelContext.js +88 -0
  17. package/dist/assistant-ui/modelContext.js.map +1 -0
  18. package/dist/assistant-ui/snapshotSaver.d.ts +11 -0
  19. package/dist/assistant-ui/snapshotSaver.d.ts.map +1 -0
  20. package/dist/assistant-ui/snapshotSaver.js +83 -0
  21. package/dist/assistant-ui/snapshotSaver.js.map +1 -0
  22. package/dist/assistant-ui/tool-calls.d.ts +21 -0
  23. package/dist/assistant-ui/tool-calls.d.ts.map +1 -0
  24. package/dist/assistant-ui/tool-calls.js +65 -0
  25. package/dist/assistant-ui/tool-calls.js.map +1 -0
  26. package/dist/assistant-ui/toolkit.d.ts +96 -0
  27. package/dist/assistant-ui/toolkit.d.ts.map +1 -0
  28. package/dist/assistant-ui/toolkit.js +456 -0
  29. package/dist/assistant-ui/toolkit.js.map +1 -0
  30. package/dist/assistant-ui/useSharedContext.d.ts +14 -0
  31. package/dist/assistant-ui/useSharedContext.d.ts.map +1 -0
  32. package/dist/assistant-ui/useSharedContext.js +27 -0
  33. package/dist/assistant-ui/useSharedContext.js.map +1 -0
  34. package/dist/assistant-ui.d.ts +3 -0
  35. package/dist/assistant-ui.d.ts.map +1 -0
  36. package/dist/assistant-ui.js +1 -0
  37. package/dist/bootstrap.d.ts +23 -0
  38. package/dist/bootstrap.d.ts.map +1 -0
  39. package/dist/bootstrap.js +78 -0
  40. package/dist/bootstrap.js.map +1 -0
  41. package/dist/csp.d.ts +25 -0
  42. package/dist/csp.d.ts.map +1 -0
  43. package/dist/csp.js +78 -0
  44. package/dist/csp.js.map +1 -0
  45. package/dist/index.d.ts +6 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +5 -0
  48. package/dist/json-schema.d.ts +70 -0
  49. package/dist/json-schema.d.ts.map +1 -0
  50. package/dist/json-schema.js +163 -0
  51. package/dist/json-schema.js.map +1 -0
  52. package/dist/preview.d.ts +30 -0
  53. package/dist/preview.d.ts.map +1 -0
  54. package/dist/preview.js +60 -0
  55. package/dist/preview.js.map +1 -0
  56. package/dist/prompts/guidance.d.ts +41 -0
  57. package/dist/prompts/guidance.d.ts.map +1 -0
  58. package/dist/prompts/guidance.js +268 -0
  59. package/dist/prompts/guidance.js.map +1 -0
  60. package/dist/prompts.d.ts +2 -0
  61. package/dist/prompts.d.ts.map +1 -0
  62. package/dist/prompts.js +1 -0
  63. package/dist/protocol.d.ts +114 -0
  64. package/dist/protocol.d.ts.map +1 -0
  65. package/dist/protocol.js +49 -0
  66. package/dist/protocol.js.map +1 -0
  67. package/dist/repair/repair.d.ts +72 -0
  68. package/dist/repair/repair.d.ts.map +1 -0
  69. package/dist/repair/repair.js +103 -0
  70. package/dist/repair/repair.js.map +1 -0
  71. package/dist/repair.d.ts +2 -0
  72. package/dist/repair.d.ts.map +1 -0
  73. package/dist/repair.js +1 -0
  74. package/dist/rpc.d.ts +60 -0
  75. package/dist/rpc.d.ts.map +1 -0
  76. package/dist/rpc.js +127 -0
  77. package/dist/rpc.js.map +1 -0
  78. package/dist/runtime/diagnostics.d.ts +17 -0
  79. package/dist/runtime/diagnostics.d.ts.map +1 -0
  80. package/dist/runtime/diagnostics.js +128 -0
  81. package/dist/runtime/diagnostics.js.map +1 -0
  82. package/dist/runtime/generated.d.ts +2 -0
  83. package/dist/runtime/generated.d.ts.map +1 -0
  84. package/dist/runtime/generated.js +5 -0
  85. package/dist/runtime/generated.js.map +1 -0
  86. package/dist/runtime/index.d.ts +7 -0
  87. package/dist/runtime/index.d.ts.map +1 -0
  88. package/dist/runtime/index.js +264 -0
  89. package/dist/runtime/index.js.map +1 -0
  90. package/dist/runtime/morph.d.ts +51 -0
  91. package/dist/runtime/morph.d.ts.map +1 -0
  92. package/dist/runtime/morph.js +251 -0
  93. package/dist/runtime/morph.js.map +1 -0
  94. package/dist/runtime/screenshot.d.ts +23 -0
  95. package/dist/runtime/screenshot.d.ts.map +1 -0
  96. package/dist/runtime/screenshot.js +188 -0
  97. package/dist/runtime/screenshot.js.map +1 -0
  98. package/dist/runtime/size.d.ts +10 -0
  99. package/dist/runtime/size.d.ts.map +1 -0
  100. package/dist/runtime/size.js +21 -0
  101. package/dist/runtime/size.js.map +1 -0
  102. package/dist/runtime/storage.d.ts +4 -0
  103. package/dist/runtime/storage.d.ts.map +1 -0
  104. package/dist/runtime/storage.js +38 -0
  105. package/dist/runtime/storage.js.map +1 -0
  106. package/dist/spec/actions.d.ts +40 -0
  107. package/dist/spec/actions.d.ts.map +1 -0
  108. package/dist/spec/actions.js +53 -0
  109. package/dist/spec/actions.js.map +1 -0
  110. package/dist/spec/assistant-ui/thread.d.ts +66 -0
  111. package/dist/spec/assistant-ui/thread.d.ts.map +1 -0
  112. package/dist/spec/assistant-ui/thread.js +252 -0
  113. package/dist/spec/assistant-ui/thread.js.map +1 -0
  114. package/dist/spec/assistant-ui/toolkit.d.ts +33 -0
  115. package/dist/spec/assistant-ui/toolkit.d.ts.map +1 -0
  116. package/dist/spec/assistant-ui/toolkit.js +142 -0
  117. package/dist/spec/assistant-ui/toolkit.js.map +1 -0
  118. package/dist/spec/assistant-ui/web.d.ts +6 -0
  119. package/dist/spec/assistant-ui/web.d.ts.map +1 -0
  120. package/dist/spec/assistant-ui/web.js +48 -0
  121. package/dist/spec/assistant-ui/web.js.map +1 -0
  122. package/dist/spec/assistant-ui.d.ts +3 -0
  123. package/dist/spec/assistant-ui.d.ts.map +1 -0
  124. package/dist/spec/assistant-ui.js +1 -0
  125. package/dist/spec/calc.d.ts +8 -0
  126. package/dist/spec/calc.d.ts.map +1 -0
  127. package/dist/spec/calc.js +498 -0
  128. package/dist/spec/calc.js.map +1 -0
  129. package/dist/spec/catalog.d.ts +52 -0
  130. package/dist/spec/catalog.d.ts.map +1 -0
  131. package/dist/spec/catalog.js +104 -0
  132. package/dist/spec/catalog.js.map +1 -0
  133. package/dist/spec/expressions.d.ts +45 -0
  134. package/dist/spec/expressions.d.ts.map +1 -0
  135. package/dist/spec/expressions.js +199 -0
  136. package/dist/spec/expressions.js.map +1 -0
  137. package/dist/spec/patch.d.ts +20 -0
  138. package/dist/spec/patch.d.ts.map +1 -0
  139. package/dist/spec/patch.js +77 -0
  140. package/dist/spec/patch.js.map +1 -0
  141. package/dist/spec/pending.d.ts +15 -0
  142. package/dist/spec/pending.d.ts.map +1 -0
  143. package/dist/spec/pending.js +33 -0
  144. package/dist/spec/pending.js.map +1 -0
  145. package/dist/spec/pointer.d.ts +17 -0
  146. package/dist/spec/pointer.d.ts.map +1 -0
  147. package/dist/spec/pointer.js +88 -0
  148. package/dist/spec/pointer.js.map +1 -0
  149. package/dist/spec/prompt.d.ts +29 -0
  150. package/dist/spec/prompt.d.ts.map +1 -0
  151. package/dist/spec/prompt.js +145 -0
  152. package/dist/spec/prompt.js.map +1 -0
  153. package/dist/spec/render-spec.d.ts +50 -0
  154. package/dist/spec/render-spec.d.ts.map +1 -0
  155. package/dist/spec/render-spec.js +104 -0
  156. package/dist/spec/render-spec.js.map +1 -0
  157. package/dist/spec/resolve.d.ts +39 -0
  158. package/dist/spec/resolve.d.ts.map +1 -0
  159. package/dist/spec/resolve.js +51 -0
  160. package/dist/spec/resolve.js.map +1 -0
  161. package/dist/spec/resolved.d.ts +3 -0
  162. package/dist/spec/resolved.d.ts.map +1 -0
  163. package/dist/spec/resolved.js +36 -0
  164. package/dist/spec/resolved.js.map +1 -0
  165. package/dist/spec/state.d.ts +34 -0
  166. package/dist/spec/state.d.ts.map +1 -0
  167. package/dist/spec/state.js +111 -0
  168. package/dist/spec/state.js.map +1 -0
  169. package/dist/spec/stream.d.ts +50 -0
  170. package/dist/spec/stream.d.ts.map +1 -0
  171. package/dist/spec/stream.js +168 -0
  172. package/dist/spec/stream.js.map +1 -0
  173. package/dist/spec/tools.d.ts +3 -0
  174. package/dist/spec/tools.d.ts.map +1 -0
  175. package/dist/spec/tools.js +3 -0
  176. package/dist/spec/tree.d.ts +21 -0
  177. package/dist/spec/tree.d.ts.map +1 -0
  178. package/dist/spec/tree.js +27 -0
  179. package/dist/spec/tree.js.map +1 -0
  180. package/dist/spec/types.d.ts +66 -0
  181. package/dist/spec/types.d.ts.map +1 -0
  182. package/dist/spec/types.js +9 -0
  183. package/dist/spec/types.js.map +1 -0
  184. package/dist/spec/validate.d.ts +32 -0
  185. package/dist/spec/validate.d.ts.map +1 -0
  186. package/dist/spec/validate.js +264 -0
  187. package/dist/spec/validate.js.map +1 -0
  188. package/dist/spec/vue/SpecRenderer.d.ts +43 -0
  189. package/dist/spec/vue/SpecRenderer.d.ts.map +1 -0
  190. package/dist/spec/vue/SpecRenderer.js +357 -0
  191. package/dist/spec/vue/SpecRenderer.js.map +1 -0
  192. package/dist/spec/vue/useSpecStream.d.ts +19 -0
  193. package/dist/spec/vue/useSpecStream.d.ts.map +1 -0
  194. package/dist/spec/vue/useSpecStream.js +115 -0
  195. package/dist/spec/vue/useSpecStream.js.map +1 -0
  196. package/dist/spec/vue.d.ts +3 -0
  197. package/dist/spec/vue.d.ts.map +1 -0
  198. package/dist/spec/vue.js +3 -0
  199. package/dist/spec.d.ts +12 -0
  200. package/dist/spec.d.ts.map +1 -0
  201. package/dist/spec.js +8 -0
  202. package/dist/theme.d.ts +38 -0
  203. package/dist/theme.d.ts.map +1 -0
  204. package/dist/theme.js +370 -0
  205. package/dist/theme.js.map +1 -0
  206. package/dist/tools/define.d.ts +43 -0
  207. package/dist/tools/define.d.ts.map +1 -0
  208. package/dist/tools/define.js +31 -0
  209. package/dist/tools/define.js.map +1 -0
  210. package/dist/tools/edits.d.ts +19 -0
  211. package/dist/tools/edits.d.ts.map +1 -0
  212. package/dist/tools/edits.js +55 -0
  213. package/dist/tools/edits.js.map +1 -0
  214. package/dist/tools/registry.d.ts +19 -0
  215. package/dist/tools/registry.d.ts.map +1 -0
  216. package/dist/tools/registry.js +33 -0
  217. package/dist/tools/registry.js.map +1 -0
  218. package/dist/tools/tools.d.ts +88 -0
  219. package/dist/tools/tools.d.ts.map +1 -0
  220. package/dist/tools/tools.js +235 -0
  221. package/dist/tools/tools.js.map +1 -0
  222. package/dist/tools.d.ts +5 -0
  223. package/dist/tools.d.ts.map +1 -0
  224. package/dist/tools.js +5 -0
  225. package/dist/version.d.ts +2 -0
  226. package/dist/version.d.ts.map +1 -0
  227. package/dist/version.js +5 -0
  228. package/dist/version.js.map +1 -0
  229. package/dist/vue/Widget.d.ts +16 -0
  230. package/dist/vue/Widget.d.ts.map +1 -0
  231. package/dist/vue/Widget.js +58 -0
  232. package/dist/vue/Widget.js.map +1 -0
  233. package/dist/vue/sync.d.ts +19 -0
  234. package/dist/vue/sync.d.ts.map +1 -0
  235. package/dist/vue/sync.js +31 -0
  236. package/dist/vue/sync.js.map +1 -0
  237. package/dist/vue/themeStore.d.ts +23 -0
  238. package/dist/vue/themeStore.d.ts.map +1 -0
  239. package/dist/vue/themeStore.js +115 -0
  240. package/dist/vue/themeStore.js.map +1 -0
  241. package/dist/vue/useThemeTokens.d.ts +6 -0
  242. package/dist/vue/useThemeTokens.d.ts.map +1 -0
  243. package/dist/vue/useThemeTokens.js +49 -0
  244. package/dist/vue/useThemeTokens.js.map +1 -0
  245. package/dist/vue/useWidget.d.ts +10 -0
  246. package/dist/vue/useWidget.d.ts.map +1 -0
  247. package/dist/vue/useWidget.js +81 -0
  248. package/dist/vue/useWidget.js.map +1 -0
  249. package/dist/vue.d.ts +5 -0
  250. package/dist/vue.d.ts.map +1 -0
  251. package/dist/vue.js +4 -0
  252. package/dist/widget.d.ts +129 -0
  253. package/dist/widget.d.ts.map +1 -0
  254. package/dist/widget.js +655 -0
  255. package/dist/widget.js.map +1 -0
  256. package/package.json +125 -3
  257. package/src/assistant-ui/entry.ts +124 -0
  258. package/src/assistant-ui/extension.ts +19 -0
  259. package/src/assistant-ui/history.ts +63 -0
  260. package/src/assistant-ui/modelContext.ts +162 -0
  261. package/src/assistant-ui/snapshotSaver.ts +116 -0
  262. package/src/assistant-ui/tool-calls.ts +115 -0
  263. package/src/assistant-ui/toolkit.tsx +747 -0
  264. package/src/assistant-ui/useSharedContext.ts +40 -0
  265. package/src/assistant-ui.ts +14 -0
  266. package/src/bootstrap.ts +112 -0
  267. package/src/csp.ts +96 -0
  268. package/src/index.ts +44 -0
  269. package/src/json-schema.ts +353 -0
  270. package/src/preview.ts +120 -0
  271. package/src/prompts/guidance.ts +369 -0
  272. package/src/prompts.ts +8 -0
  273. package/src/protocol.ts +141 -0
  274. package/src/repair/repair.ts +202 -0
  275. package/src/repair.ts +11 -0
  276. package/src/rpc.ts +228 -0
  277. package/src/runtime/diagnostics.ts +165 -0
  278. package/src/runtime/generated.ts +2 -0
  279. package/src/runtime/index.ts +343 -0
  280. package/src/runtime/morph.ts +352 -0
  281. package/src/runtime/screenshot.ts +288 -0
  282. package/src/runtime/size.ts +17 -0
  283. package/src/runtime/storage.ts +49 -0
  284. package/src/spec/actions.ts +111 -0
  285. package/src/spec/assistant-ui/thread.ts +381 -0
  286. package/src/spec/assistant-ui/toolkit.tsx +295 -0
  287. package/src/spec/assistant-ui/web.tsx +63 -0
  288. package/src/spec/assistant-ui.ts +2 -0
  289. package/src/spec/calc.ts +598 -0
  290. package/src/spec/catalog.ts +196 -0
  291. package/src/spec/expressions.ts +301 -0
  292. package/src/spec/patch.ts +112 -0
  293. package/src/spec/pending.ts +36 -0
  294. package/src/spec/pointer.ts +170 -0
  295. package/src/spec/prompt.ts +243 -0
  296. package/src/spec/render-spec.ts +144 -0
  297. package/src/spec/resolve.ts +123 -0
  298. package/src/spec/resolved.ts +53 -0
  299. package/src/spec/state.ts +193 -0
  300. package/src/spec/stream.ts +230 -0
  301. package/src/spec/tools.ts +17 -0
  302. package/src/spec/tree.ts +37 -0
  303. package/src/spec/types.ts +51 -0
  304. package/src/spec/validate.ts +429 -0
  305. package/src/spec/vue/SpecRenderer.tsx +544 -0
  306. package/src/spec/vue/__tests__/harness.ts +50 -0
  307. package/src/spec/vue/useSpecStream.ts +162 -0
  308. package/src/spec/vue.ts +13 -0
  309. package/src/spec.ts +55 -0
  310. package/src/theme.ts +423 -0
  311. package/src/tools/define.ts +65 -0
  312. package/src/tools/edits.ts +73 -0
  313. package/src/tools/registry.ts +44 -0
  314. package/src/tools/tools.ts +361 -0
  315. package/src/tools.ts +32 -0
  316. package/src/version.ts +4 -0
  317. package/src/vue/Widget.tsx +74 -0
  318. package/src/vue/sync.ts +36 -0
  319. package/src/vue/themeStore.ts +157 -0
  320. package/src/vue/useThemeTokens.ts +71 -0
  321. package/src/vue/useWidget.ts +117 -0
  322. package/src/vue.ts +8 -0
  323. package/src/widget.ts +1080 -0
@@ -0,0 +1,456 @@
1
+ import { previewWidget } from "../preview.js";
2
+ import { buildRepairFeedback } from "../repair/repair.js";
3
+ import { useThemeTokens } from "../vue/useThemeTokens.js";
4
+ import { syncWidgetCode } from "../vue/sync.js";
5
+ import { useWidget } from "../vue/useWidget.js";
6
+ import { createWidgetRegistry } from "../tools/registry.js";
7
+ import { buildWidgetInstructions, createWidgetTools } from "../tools/tools.js";
8
+ import { hasLaterToolCallInMessage } from "./tool-calls.js";
9
+ import { toolkitEntry } from "./entry.js";
10
+ import { resolveWidgetCode, resolveWidgetOrigin } from "./history.js";
11
+ import { frameContext, savedContext } from "./modelContext.js";
12
+ import { createSnapshotSaver } from "./snapshotSaver.js";
13
+ import { useSharedContext } from "./useSharedContext.js";
14
+ import { useAssistantInstructions, useAui, useAuiState, useToolArgsStatus } from "@ulearning/ai-sdk";
15
+ import { computed, defineComponent, h, onDeactivated, onScopeDispose, shallowRef, toValue, watch, watchEffect } from "vue";
16
+ import { useIsomorphicLayoutEffect } from "@ulearning/ai-store/internal";
17
+ // src/assistant-ui/toolkit.tsx
18
+ /**
19
+ * Where theme tokens come from in an assistant-ui app: shadcn/ui variables
20
+ * first, because Tailwind v4 aliases `--color-accent` to shadcn's muted
21
+ * `--accent` rather than the primary color.
22
+ */
23
+ const ASSISTANT_UI_TOKEN_SOURCES = {
24
+ "--color-background": ["--background"],
25
+ "--color-surface": ["--card", "--background"],
26
+ "--color-surface-muted": ["--muted", "--secondary"],
27
+ "--color-text": ["--foreground"],
28
+ "--color-text-muted": ["--muted-foreground"],
29
+ "--color-text-subtle": ["--muted-foreground"],
30
+ "--color-border": ["--border"],
31
+ "--color-border-strong": ["--input", "--border"],
32
+ "--color-accent": ["--primary"],
33
+ "--color-accent-text": ["--primary-foreground"],
34
+ "--color-danger": ["--destructive"],
35
+ "--color-success": ["--aui-success", "--color-success"],
36
+ "--color-warning": ["--aui-warning", "--color-warning"],
37
+ "--color-info": ["--color-info"]
38
+ };
39
+ /** The app's assistant-ui (shadcn/ui) theme as widget tokens, kept in sync. */
40
+ function useAssistantUiThemeTokens(element) {
41
+ return useThemeTokens(element, ASSISTANT_UI_TOKEN_SOURCES);
42
+ }
43
+ const REPORT_BACKLOG = 50;
44
+ /** A later show takes over once it has code to show; a later edit only once its arguments are settled and its edits apply, so the widget stays while a show has no code or an edit streams or fails. */
45
+ const takesOverWidget = (messages, call) => call.name === "show_widget" && typeof call.args["widget_code"] === "string" && call.args["widget_code"].trim() !== "" || call.name === "edit_widget" && call.settled && resolveWidgetCode(messages, call.id) !== void 0;
46
+ /** Hands render reports from the thread's widgets to the tool calls waiting for them. */
47
+ function createRenderReports() {
48
+ const early = /* @__PURE__ */ new Map();
49
+ const waiters = /* @__PURE__ */ new Map();
50
+ return {
51
+ report(toolCallId, report) {
52
+ const waiter = waiters.get(toolCallId);
53
+ if (waiter) {
54
+ waiters.delete(toolCallId);
55
+ waiter(report);
56
+ return;
57
+ }
58
+ early.set(toolCallId, report);
59
+ if (early.size > REPORT_BACKLOG) early.delete(early.keys().next().value);
60
+ },
61
+ wait(toolCallId, timeoutMs, signal) {
62
+ const ready = early.get(toolCallId);
63
+ if (ready) {
64
+ early.delete(toolCallId);
65
+ return Promise.resolve(ready);
66
+ }
67
+ return new Promise((resolve) => {
68
+ const finish = (report) => {
69
+ clearTimeout(timer);
70
+ signal?.removeEventListener("abort", onAbort);
71
+ waiters.delete(toolCallId);
72
+ resolve(report);
73
+ };
74
+ const timedOut = () => finish({
75
+ status: "timeout",
76
+ feedback: `The widget had not finished rendering after ${timeoutMs} ms, so no render errors are known.`
77
+ });
78
+ const onAbort = timedOut;
79
+ const timer = setTimeout(timedOut, timeoutMs);
80
+ signal?.addEventListener("abort", onAbort, { once: true });
81
+ waiters.set(toolCallId, finish);
82
+ });
83
+ }
84
+ };
85
+ }
86
+ const visuallyHidden = {
87
+ position: "absolute",
88
+ width: 1,
89
+ height: 1,
90
+ overflow: "hidden",
91
+ clip: "rect(0 0 0 0)",
92
+ whiteSpace: "nowrap"
93
+ };
94
+ const previewFrameOptions = (widget) => ({
95
+ ...widget?.product !== void 0 ? { product: widget.product } : {},
96
+ ...widget?.frame !== void 0 ? { frame: widget.frame } : {},
97
+ ...widget?.unsafeShimDomain !== void 0 ? { unsafeShimDomain: widget.unsafeShimDomain } : {},
98
+ ...widget?.opaqueOrigin !== void 0 ? { opaqueOrigin: widget.opaqueOrigin } : {}
99
+ });
100
+ function savedWidgetState(log, toolCallId) {
101
+ const entries = log?.entries ?? [];
102
+ for (let index = entries.length - 1; index >= 0; index--) {
103
+ const { type, payload } = entries[index];
104
+ if (type === "action" && payload["type"] === "widgetState" && payload["toolCallId"] === toolCallId) return payload["state"] ?? null;
105
+ }
106
+ return null;
107
+ }
108
+ function useWidgetModelContext(source) {
109
+ const aui = useAui();
110
+ useIsomorphicLayoutEffect(() => aui.modelContext.register({
111
+ getModelContext: () => {
112
+ const system = source.read();
113
+ return system ? { system } : {};
114
+ },
115
+ subscribe: source.subscribe
116
+ }), []);
117
+ }
118
+ /**
119
+ * Renders `show_widget`, `edit_widget`, and `render_spec` tool calls in an
120
+ * assistant-ui thread: widget code streams into a frame from the partial
121
+ * tool arguments, `sendPrompt` adds its text to the thread composer, and the
122
+ * frame follows the app's theme. With `execution: "frontend"` the tools run
123
+ * in the browser too, so the server only forwards their schemas.
124
+ */
125
+ function createWidgetToolkit(options = {}) {
126
+ const registry = options.registry ?? createWidgetRegistry();
127
+ const tools = createWidgetTools({
128
+ ...options,
129
+ guidance: {
130
+ ...options.guidance,
131
+ hostApi: {
132
+ modelContext: true,
133
+ clipboard: options.widget?.onCopyText !== void 0,
134
+ ...options.guidance?.hostApi
135
+ }
136
+ },
137
+ preview: options.preview ?? ((code, previewOptions) => previewWidget(code, {
138
+ ...previewFrameOptions(options.widget),
139
+ ...previewOptions
140
+ })),
141
+ registry,
142
+ modules: [...options.modules ?? [], ...options.spec?.modules ?? []],
143
+ extraTools: {
144
+ ...options.extraTools,
145
+ ...options.spec?.tools
146
+ }
147
+ });
148
+ const display = options.display ?? "standalone";
149
+ const execution = options.execution ?? "frontend";
150
+ const reports = createRenderReports();
151
+ const reportOptions = options.renderReport === false ? void 0 : options.renderReport ?? {};
152
+ const settleMs = reportOptions?.settleMs ?? 300;
153
+ const timeoutMs = reportOptions?.timeoutMs ?? 1e4;
154
+ function useWidgetProps() {
155
+ const aui = useAui();
156
+ const tokens = useAssistantUiThemeTokens(options.themeElement);
157
+ return computed(() => ({
158
+ ...options.widget,
159
+ tokens: tokens.value,
160
+ onPrompt: options.widget?.onPrompt ?? ((text) => {
161
+ const composer = aui.thread.composer();
162
+ composer.setText([composer.getState().text, text].filter((part) => part.trim()).join(" "));
163
+ })
164
+ }));
165
+ }
166
+ function useStorageId(origin) {
167
+ const threadId = useAuiState((state) => state.threadListItem?.remoteId);
168
+ return computed(() => {
169
+ const toolCallId = toValue(origin);
170
+ if (options.widgetId === false || !toolCallId) return void 0;
171
+ if (options.widgetId) return options.widgetId({
172
+ toolCallId,
173
+ threadId: threadId.value
174
+ });
175
+ return `${threadId.value ?? "aui"}:${toolCallId}`;
176
+ });
177
+ }
178
+ const ToolWidget = defineComponent((props) => {
179
+ const widgetProps = useWidgetProps();
180
+ const initialState = savedWidgetState(props.unstable_interactions, props.toolCallId);
181
+ const initialContext = savedContext(props.unstable_interactions, props.toolCallId, "widgetState");
182
+ const latest = {
183
+ state: initialState,
184
+ context: initialContext
185
+ };
186
+ const snapshot = () => latest.context ? {
187
+ state: latest.state,
188
+ context: latest.context
189
+ } : latest.state === null ? null : { state: latest.state };
190
+ let disposed = false;
191
+ const saver = createSnapshotSaver(snapshot(), (saved) => props.unstable_recordInteraction?.({
192
+ type: "action",
193
+ payload: {
194
+ type: "widgetState",
195
+ toolCallId: props.toolCallId,
196
+ state: saved ? saved.state : null,
197
+ ...saved?.context ? { context: saved.context } : {}
198
+ }
199
+ }));
200
+ onDeactivated(() => saver.flush());
201
+ onScopeDispose(() => {
202
+ disposed = true;
203
+ saver.flush();
204
+ });
205
+ const share = useSharedContext(() => ({
206
+ title: props.title,
207
+ toolCallId: props.toolCallId,
208
+ initial: widgetProps.value.onUpdateModelContext ? void 0 : initialContext,
209
+ useModelContext: useWidgetModelContext,
210
+ onShare(context) {
211
+ latest.context = context;
212
+ saver.schedule(snapshot);
213
+ }
214
+ }));
215
+ const { ref, widget } = useWidget(() => {
216
+ const current = widgetProps.value;
217
+ return {
218
+ ...current,
219
+ initialState,
220
+ ...props.storageId !== void 0 && !current.frame && !current.opaqueOrigin ? { id: props.storageId } : {},
221
+ onWidgetState(state) {
222
+ if (disposed) return;
223
+ latest.state = state;
224
+ saver.schedule(snapshot);
225
+ current.onWidgetState?.(state);
226
+ },
227
+ onUpdateModelContext: current.onUpdateModelContext ?? ((params) => {
228
+ share(frameContext(params));
229
+ return {};
230
+ })
231
+ };
232
+ });
233
+ watch([widget, () => props.toolCallId], ([handle, toolCallId], _previous, cleanup) => {
234
+ if (!handle || !reportOptions) return;
235
+ let valid = true;
236
+ let timer;
237
+ const off = handle.on("end", () => {
238
+ off();
239
+ timer = setTimeout(() => {
240
+ handle.inspect().then((inspection) => {
241
+ if (!valid || disposed || widget.value !== handle) return;
242
+ const feedback = buildRepairFeedback({
243
+ errors: inspection.errors,
244
+ console: inspection.console,
245
+ blank: inspection.blank,
246
+ height: inspection.size.height
247
+ });
248
+ reports.report(toolCallId, {
249
+ status: "rendered",
250
+ ok: feedback.ok,
251
+ blank: feedback.blank,
252
+ height: inspection.size.height,
253
+ errors: feedback.errors,
254
+ console: feedback.console,
255
+ feedback: feedback.text
256
+ });
257
+ }).catch(() => {});
258
+ }, settleMs);
259
+ });
260
+ cleanup(() => {
261
+ valid = false;
262
+ off();
263
+ clearTimeout(timer);
264
+ });
265
+ }, {
266
+ immediate: true,
267
+ flush: "sync"
268
+ });
269
+ watchEffect(() => {
270
+ if (widget.value) syncWidgetCode(widget.value, props.code, props.streaming);
271
+ }, { flush: "post" });
272
+ return () => h("div", { ref });
273
+ }, {
274
+ name: "ToolWidget",
275
+ props: [
276
+ "code",
277
+ "streaming",
278
+ "title",
279
+ "toolCallId",
280
+ "storageId",
281
+ "unstable_interactions",
282
+ "unstable_recordInteraction"
283
+ ]
284
+ });
285
+ function useWidgetCallSuperseded(messages, toolCallId, title) {
286
+ const superseded = computed(() => {
287
+ const current = toValue(messages);
288
+ return hasLaterToolCallInMessage(current, toolCallId(), title(), (call) => takesOverWidget(current, call));
289
+ });
290
+ watch([superseded, toolCallId], ([replaced, id]) => {
291
+ if (replaced && reportOptions) reports.report(id, {
292
+ status: "timeout",
293
+ feedback: "This widget was superseded by a later call with the same title in this message and was not rendered."
294
+ });
295
+ }, {
296
+ immediate: true,
297
+ flush: "sync"
298
+ });
299
+ return superseded;
300
+ }
301
+ const partProps = [
302
+ "args",
303
+ "toolCallId",
304
+ "unstable_interactions",
305
+ "unstable_recordInteraction"
306
+ ];
307
+ const ShowWidgetUI = defineComponent((props) => {
308
+ const status = useToolArgsStatus();
309
+ const messages = useAuiState((state) => state.thread.messages);
310
+ const streaming = computed(() => status.value.propStatus.widget_code !== "complete");
311
+ const code = computed(() => typeof props.args.widget_code === "string" ? props.args.widget_code : "");
312
+ const title = computed(() => typeof props.args.title === "string" ? props.args.title : "");
313
+ const storageId = useStorageId(() => props.toolCallId);
314
+ const superseded = useWidgetCallSuperseded(messages, () => props.toolCallId, () => title.value);
315
+ watch([
316
+ streaming,
317
+ title,
318
+ code
319
+ ], ([running, name, source]) => {
320
+ if (!running && name && source && registry.get(name)?.code !== source) registry.set(name, source);
321
+ }, {
322
+ immediate: true,
323
+ flush: "sync"
324
+ });
325
+ return () => {
326
+ if (superseded.value) return null;
327
+ const loading = props.args.loading_messages?.[0];
328
+ return h("div", { "data-gf-widget": title.value || void 0 }, [...streaming.value && !code.value && loading ? [h("p", {
329
+ role: "status",
330
+ style: {
331
+ margin: "4px 0",
332
+ opacity: .7
333
+ }
334
+ }, loading)] : [], h(ToolWidget, {
335
+ code: code.value,
336
+ streaming: streaming.value,
337
+ title: title.value,
338
+ toolCallId: props.toolCallId,
339
+ storageId: storageId.value,
340
+ unstable_interactions: props.unstable_interactions,
341
+ unstable_recordInteraction: props.unstable_recordInteraction
342
+ })]);
343
+ };
344
+ }, {
345
+ name: "ShowWidgetUI",
346
+ inheritAttrs: false,
347
+ props: partProps
348
+ });
349
+ const EditWidgetUI = defineComponent((props) => {
350
+ const status = useToolArgsStatus();
351
+ const messages = useAuiState((state) => state.thread.messages);
352
+ const title = computed(() => typeof props.args.title === "string" ? props.args.title : "");
353
+ const complete = computed(() => status.value.argsStatus === "complete");
354
+ const superseded = useWidgetCallSuperseded(messages, () => props.toolCallId, () => title.value);
355
+ const code = computed(() => complete.value ? resolveWidgetCode(messages.value, props.toolCallId) : void 0);
356
+ const storageId = useStorageId(computed(() => complete.value ? resolveWidgetOrigin(messages.value, props.toolCallId) : void 0));
357
+ watch([title, code], ([name, source]) => {
358
+ if (name && source !== void 0 && registry.get(name)?.code !== source) registry.set(name, source);
359
+ }, {
360
+ immediate: true,
361
+ flush: "sync"
362
+ });
363
+ return () => {
364
+ if (superseded.value) return null;
365
+ if (!complete.value) return h("p", {
366
+ role: "status",
367
+ style: {
368
+ margin: "4px 0",
369
+ opacity: .7
370
+ }
371
+ }, `Updating ${title.value || "widget"}…`);
372
+ if (code.value === void 0) return h("p", {
373
+ role: "note",
374
+ style: {
375
+ margin: "4px 0",
376
+ opacity: .7
377
+ }
378
+ }, `${title.value || "The widget"} could not be updated.`);
379
+ return h("div", { "data-gf-widget": title.value || void 0 }, [h("span", { style: visuallyHidden }, `Updated ${title.value}`), h(ToolWidget, {
380
+ code: code.value,
381
+ streaming: false,
382
+ title: title.value,
383
+ toolCallId: props.toolCallId,
384
+ storageId: storageId.value,
385
+ unstable_interactions: props.unstable_interactions,
386
+ unstable_recordInteraction: props.unstable_recordInteraction
387
+ })]);
388
+ };
389
+ }, {
390
+ name: "EditWidgetUI",
391
+ inheritAttrs: false,
392
+ props: partProps
393
+ });
394
+ const Silent = () => null;
395
+ const entry = (tool, render, entryDisplay, execute) => toolkitEntry(tool, render, {
396
+ execution,
397
+ display: entryDisplay
398
+ }, execute);
399
+ const withRenderReport = (tool) => async (input, context) => {
400
+ const result = await tool.execute(input);
401
+ if (!result.ok || !reportOptions) return result;
402
+ const render = await reports.wait(context.toolCallId, timeoutMs, context.abortSignal);
403
+ return {
404
+ ...result,
405
+ render
406
+ };
407
+ };
408
+ const preview = async (input) => {
409
+ const { screenshot, ...result } = await tools.preview_widget.execute(input);
410
+ const feedback = buildRepairFeedback(result).text;
411
+ return options.previewScreenshot && screenshot !== void 0 ? {
412
+ ...result,
413
+ screenshot,
414
+ feedback
415
+ } : {
416
+ ...result,
417
+ feedback
418
+ };
419
+ };
420
+ return {
421
+ toolkit: {
422
+ read_me: entry(tools.read_me, Silent, "inline"),
423
+ show_widget: entry(tools.show_widget, ShowWidgetUI, display, withRenderReport(tools.show_widget)),
424
+ edit_widget: entry(tools.edit_widget, EditWidgetUI, display, withRenderReport(tools.edit_widget)),
425
+ preview_widget: entry(tools.preview_widget, Silent, "inline", preview),
426
+ ...Object.fromEntries(Object.entries(options.extraTools ?? {}).map(([name, tool]) => [name, entry(tool, Silent, "inline")])),
427
+ ...options.spec?.entries({
428
+ execution,
429
+ display
430
+ })
431
+ },
432
+ tools,
433
+ registry
434
+ };
435
+ }
436
+ /** Adds the widget guidance to the model while this Vue scope is active. */
437
+ function useWidgetInstructions(tools, options = {}) {
438
+ const instruction = shallowRef("");
439
+ useIsomorphicLayoutEffect(() => watch([() => toValue(tools), () => JSON.stringify(toValue(options).preload ?? null)], ([currentTools, preloadKey], _previous, cleanup) => {
440
+ let cancelled = false;
441
+ cleanup(() => {
442
+ cancelled = true;
443
+ });
444
+ const preload = JSON.parse(preloadKey);
445
+ buildWidgetInstructions(currentTools, preload ? { preload } : {}).then((text) => {
446
+ if (!cancelled) instruction.value = text;
447
+ });
448
+ }, { immediate: true }), []);
449
+ useAssistantInstructions(() => ({
450
+ instruction: instruction.value,
451
+ disabled: !instruction.value
452
+ }));
453
+ }
454
+ export { ASSISTANT_UI_TOKEN_SOURCES, createWidgetToolkit, useAssistantUiThemeTokens, useWidgetInstructions };
455
+
456
+ //# sourceMappingURL=toolkit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolkit.js","names":["useAssistantInstructions","useAui","useAuiState","useToolArgsStatus","Toolkit","ToolCallMessagePartProps","computed","defineComponent","h","onDeactivated","onScopeDispose","shallowRef","toValue","watch","watchEffect","Component","MaybeRefOrGetter","useIsomorphicLayoutEffect","previewWidget","PreviewOptions","ConsoleEntry","WidgetError","buildRepairFeedback","useThemeTokens","syncWidgetCode","useWidget","UseWidgetOptions","ThemeTokenSources","createWidgetRegistry","WidgetRegistry","buildWidgetInstructions","createWidgetTools","CreateWidgetToolsOptions","EditWidgetInput","PreviewWidgetInput","ShowWidgetInput","WidgetInstructionsOptions","WidgetTools","AnyTool","ToolDefinition","hasLaterToolCallInMessage","MessageLike","ToolCall","toolkitEntry","ToolkitDisplay","WidgetToolkitExtension","resolveWidgetCode","resolveWidgetOrigin","frameContext","savedContext","ModelContextSource","SharedContext","createSnapshotSaver","useSharedContext","ASSISTANT_UI_TOKEN_SOURCES","useAssistantUiThemeTokens","element","Element","WidgetToolkitOptions","Omit","registry","execution","widget","spec","extraTools","Record","themeElement","display","renderReport","RenderReportOptions","previewScreenshot","widgetId","call","toolCallId","threadId","timeoutMs","settleMs","WidgetRenderReport","status","ok","blank","height","errors","console","feedback","WidgetToolkit","toolkit","tools","ShowArgs","Partial","EditArgs","REPORT_BACKLOG","takesOverWidget","messages","name","args","trim","settled","id","undefined","createRenderReports","early","Map","waiters","report","waiter","get","delete","set","size","keys","next","value","wait","signal","AbortSignal","Promise","ready","resolve","finish","clearTimeout","timer","removeEventListener","onAbort","timedOut","setTimeout","addEventListener","once","visuallyHidden","position","width","overflow","clip","whiteSpace","const","previewFrameOptions","product","frame","unsafeShimDomain","opaqueOrigin","savedWidgetState","log","entries","index","length","type","payload","useWidgetModelContext","source","aui","modelContext","register","getModelContext","system","read","subscribe","createWidgetToolkit","options","guidance","hostApi","clipboard","onCopyText","preview","code","previewOptions","modules","reports","reportOptions","useWidgetProps","tokens","onPrompt","text","composer","thread","setText","getState","filter","part","join","useStorageId","origin","state","threadListItem","remoteId","ToolWidgetProps","streaming","title","storageId","unstable_interactions","unstable_recordInteraction","ToolWidget","props","widgetProps","initialState","initialContext","latest","context","snapshot","disposed","saver","saved","flush","share","initial","onUpdateModelContext","useModelContext","onShare","schedule","ref","current","onWidgetState","params","handle","_previous","cleanup","valid","ReturnType","off","on","inspect","then","inspection","catch","immediate","useWidgetCallSuperseded","superseded","replaced","partProps","ShowWidgetUI","propStatus","widget_code","running","loading","loading_messages","role","style","margin","opacity","inheritAttrs","EditWidgetUI","complete","argsStatus","Silent","ExecuteContext","abortSignal","entry","tool","I","O","render","entryDisplay","execute","input","withRenderReport","result","screenshot","preview_widget","read_me","show_widget","edit_widget","Object","fromEntries","map","useWidgetInstructions","instruction","JSON","stringify","preload","currentTools","preloadKey","cancelled","parse","disabled"],"sources":["../../src/assistant-ui/toolkit.tsx"],"sourcesContent":["import {\n useAssistantInstructions,\n useAui,\n useAuiState,\n useToolArgsStatus,\n type Toolkit,\n type ToolCallMessagePartProps,\n} from \"@ulearning/ai-sdk\";\nimport {\n computed,\n defineComponent,\n h,\n onDeactivated,\n onScopeDispose,\n shallowRef,\n toValue,\n watch,\n watchEffect,\n type Component,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport { useIsomorphicLayoutEffect } from \"@ulearning/ai-store/internal\";\nimport { previewWidget, type PreviewOptions } from \"../preview\";\nimport type { ConsoleEntry, WidgetError } from \"../protocol\";\nimport { buildRepairFeedback } from \"../repair/repair\";\nimport { useThemeTokens } from \"../vue/useThemeTokens\";\nimport { syncWidgetCode } from \"../vue/sync\";\nimport { useWidget, type UseWidgetOptions } from \"../vue/useWidget\";\nimport type { ThemeTokenSources } from \"../theme\";\nimport { createWidgetRegistry, type WidgetRegistry } from \"../tools/registry\";\nimport {\n buildWidgetInstructions,\n createWidgetTools,\n type CreateWidgetToolsOptions,\n type EditWidgetInput,\n type PreviewWidgetInput,\n type ShowWidgetInput,\n type WidgetInstructionsOptions,\n type WidgetTools,\n} from \"../tools/tools\";\nimport type { AnyTool, ToolDefinition } from \"../tools/define\";\nimport {\n hasLaterToolCallInMessage,\n type MessageLike,\n type ToolCall,\n} from \"./tool-calls\";\nimport { toolkitEntry } from \"./entry\";\nimport type { ToolkitDisplay, WidgetToolkitExtension } from \"./extension\";\nimport { resolveWidgetCode, resolveWidgetOrigin } from \"./history\";\nimport {\n frameContext,\n savedContext,\n type ModelContextSource,\n type SharedContext,\n} from \"./modelContext\";\nimport { createSnapshotSaver } from \"./snapshotSaver\";\nimport { useSharedContext } from \"./useSharedContext\";\n\n/**\n * Where theme tokens come from in an assistant-ui app: shadcn/ui variables\n * first, because Tailwind v4 aliases `--color-accent` to shadcn's muted\n * `--accent` rather than the primary color.\n */\nexport const ASSISTANT_UI_TOKEN_SOURCES: ThemeTokenSources = {\n \"--color-background\": [\"--background\"],\n \"--color-surface\": [\"--card\", \"--background\"],\n \"--color-surface-muted\": [\"--muted\", \"--secondary\"],\n \"--color-text\": [\"--foreground\"],\n \"--color-text-muted\": [\"--muted-foreground\"],\n \"--color-text-subtle\": [\"--muted-foreground\"],\n \"--color-border\": [\"--border\"],\n \"--color-border-strong\": [\"--input\", \"--border\"],\n \"--color-accent\": [\"--primary\"],\n \"--color-accent-text\": [\"--primary-foreground\"],\n \"--color-danger\": [\"--destructive\"],\n \"--color-success\": [\"--aui-success\", \"--color-success\"],\n \"--color-warning\": [\"--aui-warning\", \"--color-warning\"],\n \"--color-info\": [\"--color-info\"],\n};\n\n/** The app's assistant-ui (shadcn/ui) theme as widget tokens, kept in sync. */\nexport function useAssistantUiThemeTokens(element?: Element | null) {\n return useThemeTokens(element, ASSISTANT_UI_TOKEN_SOURCES);\n}\n\nexport type WidgetToolkitOptions = Omit<\n CreateWidgetToolsOptions,\n \"registry\"\n> & {\n registry?: WidgetRegistry;\n /**\n * `frontend` (default): the tools execute in the browser and the server\n * forwards their schemas (`frontendTools` from `@ulearning/ai-sdk-adapter`).\n * `backend`: the server executes `createWidgetTools()` and the toolkit\n * only renders.\n */\n execution?: \"frontend\" | \"backend\";\n /** Options for every widget frame (csp, product, maxHeight, handlers, …). */\n widget?: Omit<UseWidgetOptions, \"tokens\" | \"initialState\">;\n /** Spec mode: `createSpecToolkit(catalog, { components })` from `generative-frame/spec/assistant-ui`. */\n spec?: WidgetToolkitExtension;\n /** More tools for the model, such as data lookups. They execute like the widget tools and render nothing in the thread. */\n extraTools?: Record<string, AnyTool>;\n /** Where the theme is read from. Defaults to the document root. */\n themeElement?: Element | null;\n /** How the widget tools are presented relative to the reasoning trace. Defaults to `standalone`. */\n display?: ToolkitDisplay;\n /**\n * With frontend execution, `show_widget` and `edit_widget` wait for the\n * frame to finish rendering and return its errors as `render`. `false`\n * returns as soon as the code is stored.\n */\n renderReport?: RenderReportOptions | false;\n /** Keep the PNG in `preview_widget` results. Defaults to false. */\n previewScreenshot?: boolean;\n /**\n * The storage id of a widget's frame, from the thread's persisted id and\n * the `toolCallId` of the `show_widget` call that created it, so a widget\n * keeps its localStorage across reloads and edits. Defaults to\n * `<remoteId>:<toolCallId>`, or `aui:<toolCallId>` while the thread has no\n * remote id; `false` gives every frame a fresh origin. Derive it from host\n * data only, never from tool arguments the model wrote.\n */\n widgetId?:\n | false\n | ((call: { toolCallId: string; threadId: string | undefined }) => string);\n};\n\nexport type RenderReportOptions = {\n /** How long a tool result waits for the frame. Defaults to 10000 ms. */\n timeoutMs?: number;\n /** Wait after the code ends so late script errors are caught. Defaults to 300 ms. */\n settleMs?: number;\n};\n\n/** How a widget rendered in the thread, attached to tool results as `render`. */\nexport type WidgetRenderReport =\n | {\n status: \"rendered\";\n ok: boolean;\n blank: boolean;\n height: number;\n errors: WidgetError[];\n /** Console warnings and errors, most recent last. */\n console: ConsoleEntry[];\n feedback: string;\n }\n | { status: \"timeout\"; feedback: string };\n\nexport type WidgetToolkit = {\n /** Pass to `Tools({ toolkit })`, or spread into your own toolkit. */\n toolkit: Toolkit;\n /** The tool definitions behind the toolkit, for instructions or the server. */\n tools: WidgetTools & Record<string, AnyTool>;\n /** Latest code per widget title. */\n registry: WidgetRegistry;\n};\n\ntype ShowArgs = Partial<ShowWidgetInput>;\ntype EditArgs = Partial<EditWidgetInput>;\n\nconst REPORT_BACKLOG = 50;\n/** A later show takes over once it has code to show; a later edit only once its arguments are settled and its edits apply, so the widget stays while a show has no code or an edit streams or fails. */\nconst takesOverWidget = (messages: readonly MessageLike[], call: ToolCall) =>\n (call.name === \"show_widget\" &&\n typeof call.args[\"widget_code\"] === \"string\" &&\n call.args[\"widget_code\"].trim() !== \"\") ||\n (call.name === \"edit_widget\" &&\n call.settled &&\n resolveWidgetCode(messages, call.id) !== undefined);\n\n/** Hands render reports from the thread's widgets to the tool calls waiting for them. */\nfunction createRenderReports() {\n const early = new Map<string, WidgetRenderReport>();\n const waiters = new Map<string, (report: WidgetRenderReport) => void>();\n return {\n report(toolCallId: string, report: WidgetRenderReport) {\n const waiter = waiters.get(toolCallId);\n if (waiter) {\n waiters.delete(toolCallId);\n waiter(report);\n return;\n }\n early.set(toolCallId, report);\n // Calls rendered from history never execute, so their reports are dropped.\n if (early.size > REPORT_BACKLOG) {\n early.delete(early.keys().next().value as string);\n }\n },\n wait(\n toolCallId: string,\n timeoutMs: number,\n signal?: AbortSignal,\n ): Promise<WidgetRenderReport> {\n const ready = early.get(toolCallId);\n if (ready) {\n early.delete(toolCallId);\n return Promise.resolve(ready);\n }\n return new Promise((resolve) => {\n const finish = (report: WidgetRenderReport) => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n waiters.delete(toolCallId);\n resolve(report);\n };\n const timedOut = () =>\n finish({\n status: \"timeout\",\n feedback: `The widget had not finished rendering after ${timeoutMs} ms, so no render errors are known.`,\n });\n const onAbort = timedOut;\n const timer = setTimeout(timedOut, timeoutMs);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n waiters.set(toolCallId, finish);\n });\n },\n };\n}\n\nconst visuallyHidden = {\n position: \"absolute\",\n width: 1,\n height: 1,\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n whiteSpace: \"nowrap\",\n} as const;\n\nconst previewFrameOptions = (\n widget: WidgetToolkitOptions[\"widget\"],\n): PreviewOptions => ({\n ...(widget?.product !== undefined ? { product: widget.product } : {}),\n ...(widget?.frame !== undefined ? { frame: widget.frame } : {}),\n ...(widget?.unsafeShimDomain !== undefined\n ? { unsafeShimDomain: widget.unsafeShimDomain }\n : {}),\n ...(widget?.opaqueOrigin !== undefined\n ? { opaqueOrigin: widget.opaqueOrigin }\n : {}),\n});\n\nfunction savedWidgetState(\n log: ToolCallMessagePartProps<ShowArgs>[\"unstable_interactions\"],\n toolCallId: string,\n): unknown {\n const entries = log?.entries ?? [];\n for (let index = entries.length - 1; index >= 0; index--) {\n const { type, payload } = entries[index]!;\n if (\n type === \"action\" &&\n payload[\"type\"] === \"widgetState\" &&\n payload[\"toolCallId\"] === toolCallId\n ) {\n return payload[\"state\"] ?? null;\n }\n }\n return null;\n}\n\nfunction useWidgetModelContext(source: ModelContextSource) {\n const aui = useAui();\n useIsomorphicLayoutEffect(\n () =>\n aui.modelContext.register({\n getModelContext: () => {\n const system = source.read();\n return system ? { system } : {};\n },\n subscribe: source.subscribe,\n }),\n [],\n );\n}\n\n/**\n * Renders `show_widget`, `edit_widget`, and `render_spec` tool calls in an\n * assistant-ui thread: widget code streams into a frame from the partial\n * tool arguments, `sendPrompt` adds its text to the thread composer, and the\n * frame follows the app's theme. With `execution: \"frontend\"` the tools run\n * in the browser too, so the server only forwards their schemas.\n */\nexport function createWidgetToolkit(\n options: WidgetToolkitOptions = {},\n): WidgetToolkit {\n const registry = options.registry ?? createWidgetRegistry();\n const tools: WidgetTools & Record<string, AnyTool> = createWidgetTools({\n ...options,\n guidance: {\n ...options.guidance,\n hostApi: {\n modelContext: true,\n clipboard: options.widget?.onCopyText !== undefined,\n ...options.guidance?.hostApi,\n },\n },\n preview:\n options.preview ??\n ((code, previewOptions) =>\n previewWidget(code, {\n ...previewFrameOptions(options.widget),\n ...previewOptions,\n })),\n registry,\n modules: [...(options.modules ?? []), ...(options.spec?.modules ?? [])],\n extraTools: { ...options.extraTools, ...options.spec?.tools },\n });\n const display = options.display ?? \"standalone\";\n const execution = options.execution ?? \"frontend\";\n const reports = createRenderReports();\n const reportOptions =\n options.renderReport === false ? undefined : (options.renderReport ?? {});\n const settleMs = reportOptions?.settleMs ?? 300;\n const timeoutMs = reportOptions?.timeoutMs ?? 10_000;\n\n function useWidgetProps() {\n const aui = useAui();\n const tokens = useAssistantUiThemeTokens(options.themeElement);\n return computed(() => ({\n ...options.widget,\n tokens: tokens.value,\n onPrompt:\n options.widget?.onPrompt ??\n ((text: string) => {\n const composer = aui.thread.composer();\n composer.setText(\n [composer.getState().text, text]\n .filter((part) => part.trim())\n .join(\" \"),\n );\n }),\n }));\n }\n\n function useStorageId(origin: MaybeRefOrGetter<string | undefined>) {\n const threadId = useAuiState((state) => state.threadListItem?.remoteId);\n return computed(() => {\n const toolCallId = toValue(origin);\n if (options.widgetId === false || !toolCallId) return undefined;\n if (options.widgetId)\n return options.widgetId({ toolCallId, threadId: threadId.value });\n return `${threadId.value ?? \"aui\"}:${toolCallId}`;\n });\n }\n\n type ToolWidgetProps = {\n code: string;\n streaming: boolean;\n title: string;\n toolCallId: string;\n storageId: string | undefined;\n unstable_interactions: ToolCallMessagePartProps<ShowArgs>[\"unstable_interactions\"];\n unstable_recordInteraction: ToolCallMessagePartProps<ShowArgs>[\"unstable_recordInteraction\"];\n };\n const ToolWidget = defineComponent(\n (props: ToolWidgetProps) => {\n const widgetProps = useWidgetProps();\n const initialState = savedWidgetState(\n props.unstable_interactions,\n props.toolCallId,\n );\n const initialContext = savedContext(\n props.unstable_interactions,\n props.toolCallId,\n \"widgetState\",\n );\n const latest = { state: initialState, context: initialContext };\n const snapshot = () =>\n latest.context\n ? { state: latest.state, context: latest.context }\n : latest.state === null\n ? null\n : { state: latest.state };\n let disposed = false;\n const saver = createSnapshotSaver<{\n state: unknown;\n context?: SharedContext;\n } | null>(snapshot(), (saved) =>\n props.unstable_recordInteraction?.({\n type: \"action\",\n payload: {\n type: \"widgetState\",\n toolCallId: props.toolCallId,\n state: saved ? saved.state : null,\n ...(saved?.context ? { context: saved.context } : {}),\n },\n }),\n );\n onDeactivated(() => saver.flush());\n onScopeDispose(() => {\n disposed = true;\n saver.flush();\n });\n const share = useSharedContext(() => ({\n title: props.title,\n toolCallId: props.toolCallId,\n initial: widgetProps.value.onUpdateModelContext\n ? undefined\n : initialContext,\n useModelContext: useWidgetModelContext,\n onShare(context) {\n latest.context = context;\n saver.schedule(snapshot);\n },\n }));\n const { ref, widget } = useWidget(() => {\n const current = widgetProps.value;\n return {\n ...current,\n initialState,\n ...(props.storageId !== undefined &&\n !current.frame &&\n !current.opaqueOrigin\n ? { id: props.storageId }\n : {}),\n onWidgetState(state: unknown) {\n if (disposed) return;\n latest.state = state;\n saver.schedule(snapshot);\n current.onWidgetState?.(state);\n },\n onUpdateModelContext:\n current.onUpdateModelContext ??\n ((params: unknown) => {\n share(frameContext(params));\n return {};\n }),\n };\n });\n watch(\n [widget, () => props.toolCallId],\n ([handle, toolCallId], _previous, cleanup) => {\n if (!handle || !reportOptions) return;\n let valid = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const off = handle.on(\"end\", () => {\n off();\n timer = setTimeout(() => {\n void handle\n .inspect()\n .then((inspection) => {\n if (!valid || disposed || widget.value !== handle) return;\n const feedback = buildRepairFeedback({\n errors: inspection.errors,\n console: inspection.console,\n blank: inspection.blank,\n height: inspection.size.height,\n });\n reports.report(toolCallId, {\n status: \"rendered\",\n ok: feedback.ok,\n blank: feedback.blank,\n height: inspection.size.height,\n errors: feedback.errors,\n console: feedback.console,\n feedback: feedback.text,\n });\n })\n .catch(() => {});\n }, settleMs);\n });\n cleanup(() => {\n valid = false;\n off();\n clearTimeout(timer);\n });\n },\n { immediate: true, flush: \"sync\" },\n );\n watchEffect(\n () => {\n if (widget.value)\n syncWidgetCode(widget.value, props.code, props.streaming);\n },\n { flush: \"post\" },\n );\n return () => h(\"div\", { ref });\n },\n {\n name: \"ToolWidget\",\n props: [\n \"code\",\n \"streaming\",\n \"title\",\n \"toolCallId\",\n \"storageId\",\n \"unstable_interactions\",\n \"unstable_recordInteraction\",\n ],\n },\n );\n\n function useWidgetCallSuperseded(\n messages: MaybeRefOrGetter<readonly MessageLike[]>,\n toolCallId: () => string,\n title: () => string,\n ) {\n const superseded = computed(() => {\n const current = toValue(messages);\n return hasLaterToolCallInMessage(current, toolCallId(), title(), (call) =>\n takesOverWidget(current, call),\n );\n });\n watch(\n [superseded, toolCallId],\n ([replaced, id]) => {\n if (replaced && reportOptions)\n reports.report(id, {\n status: \"timeout\",\n feedback:\n \"This widget was superseded by a later call with the same title in this message and was not rendered.\",\n });\n },\n { immediate: true, flush: \"sync\" },\n );\n return superseded;\n }\n const partProps: (\n | \"args\"\n | \"toolCallId\"\n | \"unstable_interactions\"\n | \"unstable_recordInteraction\"\n )[] = [\n \"args\",\n \"toolCallId\",\n \"unstable_interactions\",\n \"unstable_recordInteraction\",\n ];\n const ShowWidgetUI = defineComponent(\n (props: ToolCallMessagePartProps<ShowArgs>) => {\n const status = useToolArgsStatus<ShowWidgetInput>();\n const messages = useAuiState((state) => state.thread.messages);\n const streaming = computed(\n () => status.value.propStatus.widget_code !== \"complete\",\n );\n const code = computed(() =>\n typeof props.args.widget_code === \"string\"\n ? props.args.widget_code\n : \"\",\n );\n const title = computed(() =>\n typeof props.args.title === \"string\" ? props.args.title : \"\",\n );\n const storageId = useStorageId(() => props.toolCallId);\n const superseded = useWidgetCallSuperseded(\n messages,\n () => props.toolCallId,\n () => title.value,\n );\n watch(\n [streaming, title, code],\n ([running, name, source]) => {\n if (!running && name && source && registry.get(name)?.code !== source)\n registry.set(name, source);\n },\n { immediate: true, flush: \"sync\" },\n );\n return () => {\n if (superseded.value) return null;\n const loading = props.args.loading_messages?.[0];\n return h(\"div\", { \"data-gf-widget\": title.value || undefined }, [\n ...(streaming.value && !code.value && loading\n ? [\n h(\n \"p\",\n { role: \"status\", style: { margin: \"4px 0\", opacity: 0.7 } },\n loading,\n ),\n ]\n : []),\n h(ToolWidget, {\n code: code.value,\n streaming: streaming.value,\n title: title.value,\n toolCallId: props.toolCallId,\n storageId: storageId.value,\n unstable_interactions: props.unstable_interactions,\n unstable_recordInteraction: props.unstable_recordInteraction,\n }),\n ]);\n };\n },\n { name: \"ShowWidgetUI\", inheritAttrs: false, props: partProps },\n );\n\n const EditWidgetUI = defineComponent(\n (props: ToolCallMessagePartProps<EditArgs>) => {\n const status = useToolArgsStatus<EditWidgetInput>();\n const messages = useAuiState((state) => state.thread.messages);\n const title = computed(() =>\n typeof props.args.title === \"string\" ? props.args.title : \"\",\n );\n const complete = computed(() => status.value.argsStatus === \"complete\");\n const superseded = useWidgetCallSuperseded(\n messages,\n () => props.toolCallId,\n () => title.value,\n );\n const code = computed(() =>\n complete.value\n ? resolveWidgetCode(messages.value, props.toolCallId)\n : undefined,\n );\n const origin = computed(() =>\n complete.value\n ? resolveWidgetOrigin(messages.value, props.toolCallId)\n : undefined,\n );\n const storageId = useStorageId(origin);\n watch(\n [title, code],\n ([name, source]) => {\n if (\n name &&\n source !== undefined &&\n registry.get(name)?.code !== source\n )\n registry.set(name, source);\n },\n { immediate: true, flush: \"sync\" },\n );\n return () => {\n if (superseded.value) return null;\n if (!complete.value)\n return h(\n \"p\",\n { role: \"status\", style: { margin: \"4px 0\", opacity: 0.7 } },\n `Updating ${title.value || \"widget\"}…`,\n );\n if (code.value === undefined)\n return h(\n \"p\",\n { role: \"note\", style: { margin: \"4px 0\", opacity: 0.7 } },\n `${title.value || \"The widget\"} could not be updated.`,\n );\n return h(\"div\", { \"data-gf-widget\": title.value || undefined }, [\n h(\"span\", { style: visuallyHidden }, `Updated ${title.value}`),\n h(ToolWidget, {\n code: code.value,\n streaming: false,\n title: title.value,\n toolCallId: props.toolCallId,\n storageId: storageId.value,\n unstable_interactions: props.unstable_interactions,\n unstable_recordInteraction: props.unstable_recordInteraction,\n }),\n ]);\n };\n },\n { name: \"EditWidgetUI\", inheritAttrs: false, props: partProps },\n );\n const Silent = () => null;\n\n type ExecuteContext = { toolCallId: string; abortSignal?: AbortSignal };\n\n const entry = <I, O>(\n tool: ToolDefinition<I, O>,\n render: Component,\n entryDisplay: ToolkitDisplay,\n execute?: (input: I, context: ExecuteContext) => Promise<unknown>,\n ) =>\n toolkitEntry(tool, render, { execution, display: entryDisplay }, execute);\n\n const withRenderReport =\n <I,>(tool: ToolDefinition<I, { ok: boolean }>) =>\n async (input: I, context: ExecuteContext) => {\n const result = await tool.execute(input);\n if (!result.ok || !reportOptions) return result;\n const render = await reports.wait(\n context.toolCallId,\n timeoutMs,\n context.abortSignal,\n );\n return { ...result, render };\n };\n\n const preview = async (input: PreviewWidgetInput) => {\n const { screenshot, ...result } = await tools.preview_widget.execute(input);\n const feedback = buildRepairFeedback(result).text;\n return options.previewScreenshot && screenshot !== undefined\n ? { ...result, screenshot, feedback }\n : { ...result, feedback };\n };\n\n const toolkit: Toolkit = {\n read_me: entry(tools.read_me, Silent, \"inline\"),\n show_widget: entry(\n tools.show_widget,\n ShowWidgetUI,\n display,\n withRenderReport(tools.show_widget),\n ),\n edit_widget: entry(\n tools.edit_widget,\n EditWidgetUI,\n display,\n withRenderReport(tools.edit_widget),\n ),\n preview_widget: entry(tools.preview_widget, Silent, \"inline\", preview),\n ...Object.fromEntries(\n Object.entries(options.extraTools ?? {}).map(([name, tool]) => [\n name,\n entry(tool, Silent, \"inline\"),\n ]),\n ),\n ...options.spec?.entries({ execution, display }),\n };\n\n return { toolkit, tools, registry };\n}\n\n/** Adds the widget guidance to the model while this Vue scope is active. */\nexport function useWidgetInstructions(\n tools: MaybeRefOrGetter<WidgetTools & Record<string, AnyTool>>,\n options: MaybeRefOrGetter<WidgetInstructionsOptions> = {},\n): void {\n const instruction = shallowRef(\"\");\n useIsomorphicLayoutEffect(\n () =>\n watch(\n [\n () => toValue(tools),\n () => JSON.stringify(toValue(options).preload ?? null),\n ],\n ([currentTools, preloadKey], _previous, cleanup) => {\n let cancelled = false;\n cleanup(() => {\n cancelled = true;\n });\n const preload: WidgetInstructionsOptions[\"preload\"] | null =\n JSON.parse(preloadKey);\n void buildWidgetInstructions(\n currentTools,\n preload ? { preload } : {},\n ).then((text) => {\n if (!cancelled) instruction.value = text;\n });\n },\n { immediate: true },\n ),\n [],\n );\n useAssistantInstructions(() => ({\n instruction: instruction.value,\n disabled: !instruction.value,\n }));\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type MaybeRefOrGetter } from "vue";
2
+ import { type ModelContextSource, type SharedContext } from "./modelContext.js";
3
+ type SharedContextOptions = {
4
+ title: string;
5
+ toolCallId: string;
6
+ initial: SharedContext | undefined;
7
+ useModelContext: (source: ModelContextSource) => void;
8
+ onShare: (context: SharedContext | undefined) => void;
9
+ muted?: boolean;
10
+ };
11
+ /** One persistent context per mounted call; reactive options supply the current title and callback. */
12
+ export declare function useSharedContext(options: MaybeRefOrGetter<SharedContextOptions>): (context: SharedContext | undefined) => void;
13
+ export {};
14
+ //# sourceMappingURL=useSharedContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSharedContext.d.ts","mappings":"AAAA,OAAO,EAAkC,KAAK,gBAAgB,EAAE,MAAM,KAAK;AAC3E,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,mBAAgB;AACvB,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,aAAa,GAAG,SAAS;IAClC,eAAe,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI;IACrD,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,KAAK,IAAI;IACrD,KAAK,CAAC,EAAE,OAAO;CAChB;AACD;AACA,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,GAC9C,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,KAAK,IAAI","names":[],"ignoreList":[],"sources":["../../src/assistant-ui/useSharedContext.ts"],"sourcesContent":[null]}
@@ -0,0 +1,27 @@
1
+ import { createSharedContext } from "./modelContext.js";
2
+ import { onScopeDispose, toValue, watch } from "vue";
3
+ // src/assistant-ui/useSharedContext.ts
4
+ /** One persistent context per mounted call; reactive options supply the current title and callback. */
5
+ function useSharedContext(options) {
6
+ const initial = toValue(options);
7
+ let disposed = false;
8
+ const shared = createSharedContext(initial.initial, {
9
+ name: () => {
10
+ const value = toValue(options);
11
+ return value.title || value.toolCallId;
12
+ },
13
+ muted: () => toValue(options).muted ?? false,
14
+ onShare: (context) => toValue(options).onShare(context)
15
+ });
16
+ initial.useModelContext(shared.source);
17
+ watch(() => toValue(options).muted ?? false, () => shared.notify());
18
+ onScopeDispose(() => {
19
+ disposed = true;
20
+ });
21
+ return (context) => {
22
+ if (!disposed) shared.share(context);
23
+ };
24
+ }
25
+ export { useSharedContext };
26
+
27
+ //# sourceMappingURL=useSharedContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSharedContext.js","names":[],"sources":["../../src/assistant-ui/useSharedContext.ts"],"sourcesContent":["import { onScopeDispose, toValue, watch, type MaybeRefOrGetter } from \"vue\";\nimport {\n createSharedContext,\n type ModelContextSource,\n type SharedContext,\n} from \"./modelContext\";\ntype SharedContextOptions = {\n title: string;\n toolCallId: string;\n initial: SharedContext | undefined;\n useModelContext: (source: ModelContextSource) => void;\n onShare: (context: SharedContext | undefined) => void;\n muted?: boolean;\n};\n/** One persistent context per mounted call; reactive options supply the current title and callback. */\nexport function useSharedContext(\n options: MaybeRefOrGetter<SharedContextOptions>,\n): (context: SharedContext | undefined) => void {\n const initial = toValue(options);\n let disposed = false;\n const shared = createSharedContext(initial.initial, {\n name: () => {\n const value = toValue(options);\n return value.title || value.toolCallId;\n },\n muted: () => toValue(options).muted ?? false,\n onShare: (context) => toValue(options).onShare(context),\n });\n initial.useModelContext(shared.source);\n watch(\n () => toValue(options).muted ?? false,\n () => shared.notify(),\n );\n onScopeDispose(() => {\n disposed = true;\n });\n return (context) => {\n if (!disposed) shared.share(context);\n };\n}\n"],"mappings":";;;;AAeA,SAAgB,iBACd,SAC8C;CAC9C,MAAM,UAAU,QAAQ,OAAO;CAC/B,IAAI,WAAW;CACf,MAAM,SAAS,oBAAoB,QAAQ,SAAS;EAClD,YAAY;GACV,MAAM,QAAQ,QAAQ,OAAO;GAC7B,OAAO,MAAM,SAAS,MAAM;EAC9B;EACA,aAAa,QAAQ,OAAO,CAAC,CAAC,SAAS;EACvC,UAAU,YAAY,QAAQ,OAAO,CAAC,CAAC,QAAQ,OAAO;CACxD,CAAC;CACD,QAAQ,gBAAgB,OAAO,MAAM;CACrC,YACQ,QAAQ,OAAO,CAAC,CAAC,SAAS,aAC1B,OAAO,OAAO,CACtB;CACA,qBAAqB;EACnB,WAAW;CACb,CAAC;CACD,QAAQ,YAAY;EAClB,IAAI,CAAC,UAAU,OAAO,MAAM,OAAO;CACrC;AACF"}
@@ -0,0 +1,3 @@
1
+ export { createWidgetToolkit, useAssistantUiThemeTokens, useWidgetInstructions, type RenderReportOptions, type WidgetRenderReport, type WidgetToolkit, type WidgetToolkitOptions, } from "./assistant-ui/toolkit.js";
2
+ export type { ToolkitDisplay, ToolkitExecution, WidgetToolkitExtension, } from "./assistant-ui/extension.js";
3
+ //# sourceMappingURL=assistant-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-ui.d.ts","mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,2BAAwB;AAC/B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,6BAA0B","names":[],"ignoreList":[],"sources":["../src/assistant-ui.ts"],"sourcesContent":[null]}
@@ -0,0 +1 @@
1
+ export { createWidgetToolkit, useAssistantUiThemeTokens, useWidgetInstructions } from "./assistant-ui/toolkit.js";
@@ -0,0 +1,23 @@
1
+ import { type CspOptions } from "./csp.js";
2
+ import type { HostContext } from "./protocol.js";
3
+ import { type ThemeTokens } from "./theme.js";
4
+ export type BootstrapOptions = {
5
+ /** The embedding page's origin; the frame only talks to this origin. */
6
+ hostOrigin: string;
7
+ csp?: CspOptions | string;
8
+ tokens?: ThemeTokens;
9
+ /** Fade in elements as they stream in. Always off under reduced motion. */
10
+ animate?: boolean;
11
+ /** Extra CSS appended after the base styles. */
12
+ css?: string;
13
+ /** Overrides the bundled runtime, mainly for tests. */
14
+ runtime?: string;
15
+ };
16
+ /**
17
+ * The document every widget frame loads once. It carries the CSP, the theme,
18
+ * and the runtime; widget code arrives later over the private port.
19
+ */
20
+ export declare function buildBootstrapHtml(options: BootstrapOptions): string;
21
+ /** Host context sent with init and on every theme change. */
22
+ export declare function themeContext(tokens: ThemeTokens): HostContext;
23
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","mappings":"AAAA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,UAAO;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAY;AAE7C,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,YAAS;AAqDhB,MAAM,MAAM,gBAAgB,GAAG;IAC7B;IACA,UAAU,EAAE,MAAM;IAClB,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM;IACzB,MAAM,CAAC,EAAE,WAAW;IACpB;IACA,OAAO,CAAC,EAAE,OAAO;IACjB;IACA,GAAG,CAAC,EAAE,MAAM;IACZ;IACA,OAAO,CAAC,EAAE,MAAM;CACjB;AAED;;;;AAIA,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM;AA4BrE;AACA,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW","names":[],"ignoreList":[],"sources":["../src/bootstrap.ts"],"sourcesContent":[null]}