@syntrologie/adapt-chatbot 2.8.0-canary.62 → 2.8.0-canary.621

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 (250) hide show
  1. package/dist/AdaptiveChatBar.composer.test.d.ts +2 -0
  2. package/dist/AdaptiveChatBar.composer.test.d.ts.map +1 -0
  3. package/dist/AdaptiveChatBar.d.ts +248 -0
  4. package/dist/AdaptiveChatBar.d.ts.map +1 -0
  5. package/dist/AdaptiveChatBar.interleave.test.d.ts +9 -0
  6. package/dist/AdaptiveChatBar.interleave.test.d.ts.map +1 -0
  7. package/dist/AdaptiveChatBar.js +12 -0
  8. package/dist/AdaptiveChatBar.js.map +7 -0
  9. package/dist/AdaptiveChatBarMountable.d.ts +93 -0
  10. package/dist/AdaptiveChatBarMountable.d.ts.map +1 -0
  11. package/dist/AdaptiveChatTrail.anchor-scroll.test.d.ts +2 -0
  12. package/dist/AdaptiveChatTrail.anchor-scroll.test.d.ts.map +1 -0
  13. package/dist/AdaptiveChatTrail.d.ts +539 -0
  14. package/dist/AdaptiveChatTrail.d.ts.map +1 -0
  15. package/dist/AdaptiveChatTrail.follow-bottom.test.d.ts +2 -0
  16. package/dist/AdaptiveChatTrail.follow-bottom.test.d.ts.map +1 -0
  17. package/dist/AdaptiveChatTrail.js +12 -0
  18. package/dist/AdaptiveChatTrail.js.map +7 -0
  19. package/dist/AdaptiveChatTrail.live-region.test.d.ts +2 -0
  20. package/dist/AdaptiveChatTrail.live-region.test.d.ts.map +1 -0
  21. package/dist/AdaptiveChatTrail.test.d.ts +2 -0
  22. package/dist/AdaptiveChatTrail.test.d.ts.map +1 -0
  23. package/dist/AdaptiveChipsStrip.d.ts +1156 -0
  24. package/dist/AdaptiveChipsStrip.d.ts.map +1 -0
  25. package/dist/AdaptiveChipsStrip.js +11 -0
  26. package/dist/AdaptiveChipsStrip.js.map +7 -0
  27. package/dist/AdaptiveChipsStripMountable.d.ts +24 -0
  28. package/dist/AdaptiveChipsStripMountable.d.ts.map +1 -0
  29. package/dist/ChatAssistantLit.d.ts +64 -0
  30. package/dist/ChatAssistantLit.d.ts.map +1 -0
  31. package/dist/ChatAssistantLit.js +14 -0
  32. package/dist/ChatAssistantLit.js.map +7 -0
  33. package/dist/ChatSession.d.ts +275 -0
  34. package/dist/ChatSession.d.ts.map +1 -0
  35. package/dist/ChatTransport.d.ts +448 -0
  36. package/dist/ChatTransport.d.ts.map +1 -0
  37. package/dist/InlineRegistryWidgetMount.test.d.ts +2 -0
  38. package/dist/InlineRegistryWidgetMount.test.d.ts.map +1 -0
  39. package/dist/InlineWidgetLiveMount.test.d.ts +2 -0
  40. package/dist/InlineWidgetLiveMount.test.d.ts.map +1 -0
  41. package/dist/LeaveAMessage.leadconnector.integration.test.d.ts +2 -0
  42. package/dist/LeaveAMessage.leadconnector.integration.test.d.ts.map +1 -0
  43. package/dist/LeaveAMessageLit.d.ts +329 -0
  44. package/dist/LeaveAMessageLit.d.ts.map +1 -0
  45. package/dist/LeaveAMessageLit.test.d.ts +2 -0
  46. package/dist/LeaveAMessageLit.test.d.ts.map +1 -0
  47. package/dist/LeaveAMessageMountable.test.d.ts +2 -0
  48. package/dist/LeaveAMessageMountable.test.d.ts.map +1 -0
  49. package/dist/NavLinkMountable.d.ts +25 -0
  50. package/dist/NavLinkMountable.d.ts.map +1 -0
  51. package/dist/NavLinkMountable.test.d.ts +2 -0
  52. package/dist/NavLinkMountable.test.d.ts.map +1 -0
  53. package/dist/TextAnswerMountable.d.ts +17 -0
  54. package/dist/TextAnswerMountable.d.ts.map +1 -0
  55. package/dist/TextAnswerMountable.test.d.ts +2 -0
  56. package/dist/TextAnswerMountable.test.d.ts.map +1 -0
  57. package/dist/Turnstile.d.ts +101 -0
  58. package/dist/Turnstile.d.ts.map +1 -0
  59. package/dist/cdn.d.ts +16 -8
  60. package/dist/cdn.d.ts.map +1 -1
  61. package/dist/chunk-4V5L7IRV.js +4711 -0
  62. package/dist/chunk-4V5L7IRV.js.map +7 -0
  63. package/dist/chunk-EWPPVPJ4.js +14 -0
  64. package/dist/chunk-EWPPVPJ4.js.map +7 -0
  65. package/dist/chunk-HD2NXGYO.js +8445 -0
  66. package/dist/chunk-HD2NXGYO.js.map +7 -0
  67. package/dist/chunk-HV52LYST.js +641 -0
  68. package/dist/chunk-HV52LYST.js.map +7 -0
  69. package/dist/chunk-LY5AGXVD.js +21 -0
  70. package/dist/chunk-LY5AGXVD.js.map +7 -0
  71. package/dist/chunk-T6VEDUXD.js +694 -0
  72. package/dist/chunk-T6VEDUXD.js.map +7 -0
  73. package/dist/chunk-UFTSEIQP.js +1877 -0
  74. package/dist/chunk-UFTSEIQP.js.map +7 -0
  75. package/dist/chunk-VIRIVP7H.js +898 -0
  76. package/dist/chunk-VIRIVP7H.js.map +7 -0
  77. package/dist/chunk-YFZCMLV6.js +4078 -0
  78. package/dist/chunk-YFZCMLV6.js.map +7 -0
  79. package/dist/editor-lit.d.ts +37 -0
  80. package/dist/editor-lit.d.ts.map +1 -0
  81. package/dist/editor-lit.js +134 -0
  82. package/dist/editor-lit.js.map +7 -0
  83. package/dist/editorToken.d.ts +23 -0
  84. package/dist/editorToken.d.ts.map +1 -0
  85. package/dist/element-session.d.ts +3 -0
  86. package/dist/element-session.d.ts.map +1 -0
  87. package/dist/element-session.js +9 -0
  88. package/dist/element-session.js.map +7 -0
  89. package/dist/elements/ActionHandler.d.ts +34 -0
  90. package/dist/elements/ActionHandler.d.ts.map +1 -0
  91. package/dist/elements/ElementInstanceStore.d.ts +232 -0
  92. package/dist/elements/ElementInstanceStore.d.ts.map +1 -0
  93. package/dist/elements/ElementInstanceStore.test.d.ts +2 -0
  94. package/dist/elements/ElementInstanceStore.test.d.ts.map +1 -0
  95. package/dist/elements/ElementSessionController.d.ts +37 -0
  96. package/dist/elements/ElementSessionController.d.ts.map +1 -0
  97. package/dist/elements/ElementSessionController.test.d.ts +2 -0
  98. package/dist/elements/ElementSessionController.test.d.ts.map +1 -0
  99. package/dist/elements/ElementTypeHandler.d.ts +77 -0
  100. package/dist/elements/ElementTypeHandler.d.ts.map +1 -0
  101. package/dist/elements/ItemHandler.d.ts +60 -0
  102. package/dist/elements/ItemHandler.d.ts.map +1 -0
  103. package/dist/elements/ItemHandler.test.d.ts +2 -0
  104. package/dist/elements/ItemHandler.test.d.ts.map +1 -0
  105. package/dist/elements/TileHandler.d.ts +52 -0
  106. package/dist/elements/TileHandler.d.ts.map +1 -0
  107. package/dist/elements/TileHandler.test.d.ts +2 -0
  108. package/dist/elements/TileHandler.test.d.ts.map +1 -0
  109. package/dist/elements/__tests__/ElementInstanceStore.recall.test.d.ts +2 -0
  110. package/dist/elements/__tests__/ElementInstanceStore.recall.test.d.ts.map +1 -0
  111. package/dist/elements/blockRenderer.d.ts +46 -0
  112. package/dist/elements/blockRenderer.d.ts.map +1 -0
  113. package/dist/elements/blockRenderer.test.d.ts +13 -0
  114. package/dist/elements/blockRenderer.test.d.ts.map +1 -0
  115. package/dist/elements/blocks.d.ts +58 -0
  116. package/dist/elements/blocks.d.ts.map +1 -0
  117. package/dist/elements/createElementStore.d.ts +11 -0
  118. package/dist/elements/createElementStore.d.ts.map +1 -0
  119. package/dist/elements/envelope.d.ts +24 -0
  120. package/dist/elements/envelope.d.ts.map +1 -0
  121. package/dist/elements/fetcher.d.ts +43 -0
  122. package/dist/elements/fetcher.d.ts.map +1 -0
  123. package/dist/elements/index.d.ts +33 -0
  124. package/dist/elements/index.d.ts.map +1 -0
  125. package/dist/elements/store-singleton.d.ts +4 -0
  126. package/dist/elements/store-singleton.d.ts.map +1 -0
  127. package/dist/elements/tileLifecycleProps.d.ts +13 -0
  128. package/dist/elements/tileLifecycleProps.d.ts.map +1 -0
  129. package/dist/elements/types.d.ts +117 -0
  130. package/dist/elements/types.d.ts.map +1 -0
  131. package/dist/findSmartCanvas.d.ts +19 -0
  132. package/dist/findSmartCanvas.d.ts.map +1 -0
  133. package/dist/hostAgentController.d.ts +65 -0
  134. package/dist/hostAgentController.d.ts.map +1 -0
  135. package/dist/hostAgentController.test.d.ts +2 -0
  136. package/dist/hostAgentController.test.d.ts.map +1 -0
  137. package/dist/observer/__tests__/allowlist.test.d.ts +9 -0
  138. package/dist/observer/__tests__/allowlist.test.d.ts.map +1 -0
  139. package/dist/observer/__tests__/bus-translate.test.d.ts +16 -0
  140. package/dist/observer/__tests__/bus-translate.test.d.ts.map +1 -0
  141. package/dist/observer/__tests__/detector-observation-contract.test.d.ts +25 -0
  142. package/dist/observer/__tests__/detector-observation-contract.test.d.ts.map +1 -0
  143. package/dist/observer/__tests__/lifecycle.test.d.ts +2 -0
  144. package/dist/observer/__tests__/lifecycle.test.d.ts.map +1 -0
  145. package/dist/observer/__tests__/observer-enrich.test.d.ts +10 -0
  146. package/dist/observer/__tests__/observer-enrich.test.d.ts.map +1 -0
  147. package/dist/observer/__tests__/observer-isolation.test.d.ts +13 -0
  148. package/dist/observer/__tests__/observer-isolation.test.d.ts.map +1 -0
  149. package/dist/observer/__tests__/queue.test.d.ts +2 -0
  150. package/dist/observer/__tests__/queue.test.d.ts.map +1 -0
  151. package/dist/observer/__tests__/transport.test.d.ts +2 -0
  152. package/dist/observer/__tests__/transport.test.d.ts.map +1 -0
  153. package/dist/observer/allowlist.d.ts +32 -0
  154. package/dist/observer/allowlist.d.ts.map +1 -0
  155. package/dist/observer/bus-translate.d.ts +33 -0
  156. package/dist/observer/bus-translate.d.ts.map +1 -0
  157. package/dist/observer/index.d.ts +44 -0
  158. package/dist/observer/index.d.ts.map +1 -0
  159. package/dist/observer/queue.d.ts +63 -0
  160. package/dist/observer/queue.d.ts.map +1 -0
  161. package/dist/observer/transport.d.ts +27 -0
  162. package/dist/observer/transport.d.ts.map +1 -0
  163. package/dist/observer/wire.d.ts +54 -0
  164. package/dist/observer/wire.d.ts.map +1 -0
  165. package/dist/observer/wire.test.d.ts +2 -0
  166. package/dist/observer/wire.test.d.ts.map +1 -0
  167. package/dist/personas.d.ts +30 -0
  168. package/dist/personas.d.ts.map +1 -0
  169. package/dist/runtime-lit.d.ts +8 -0
  170. package/dist/runtime-lit.d.ts.map +1 -0
  171. package/dist/runtime.d.ts +63 -5
  172. package/dist/runtime.d.ts.map +1 -1
  173. package/dist/runtime.js +4439 -28
  174. package/dist/runtime.js.map +7 -0
  175. package/dist/schema.d.ts +3688 -11
  176. package/dist/schema.d.ts.map +1 -1
  177. package/dist/schema.js +578 -30
  178. package/dist/schema.js.map +7 -0
  179. package/dist/support-chat/__tests__/lc-fetch-stub.d.ts +52 -0
  180. package/dist/support-chat/__tests__/lc-fetch-stub.d.ts.map +1 -0
  181. package/dist/support-chat/boot.d.ts +47 -0
  182. package/dist/support-chat/boot.d.ts.map +1 -0
  183. package/dist/support-chat/boot.test.d.ts +2 -0
  184. package/dist/support-chat/boot.test.d.ts.map +1 -0
  185. package/dist/support-chat/crisp.d.ts +4 -0
  186. package/dist/support-chat/crisp.d.ts.map +1 -0
  187. package/dist/support-chat/crisp.test.d.ts +2 -0
  188. package/dist/support-chat/crisp.test.d.ts.map +1 -0
  189. package/dist/support-chat/inbox.d.ts +57 -0
  190. package/dist/support-chat/inbox.d.ts.map +1 -0
  191. package/dist/support-chat/inbox.test.d.ts +2 -0
  192. package/dist/support-chat/inbox.test.d.ts.map +1 -0
  193. package/dist/support-chat/leadconnector.d.ts +13 -0
  194. package/dist/support-chat/leadconnector.d.ts.map +1 -0
  195. package/dist/support-chat/leadconnector.test.d.ts +2 -0
  196. package/dist/support-chat/leadconnector.test.d.ts.map +1 -0
  197. package/dist/support-chat/registry.d.ts +5 -0
  198. package/dist/support-chat/registry.d.ts.map +1 -0
  199. package/dist/support-chat/registry.test.d.ts +2 -0
  200. package/dist/support-chat/registry.test.d.ts.map +1 -0
  201. package/dist/support-chat/schema-widgetid.test.d.ts +2 -0
  202. package/dist/support-chat/schema-widgetid.test.d.ts.map +1 -0
  203. package/dist/support-chat/types.d.ts +19 -0
  204. package/dist/support-chat/types.d.ts.map +1 -0
  205. package/dist/test/setup.d.ts +1 -0
  206. package/dist/test/setup.d.ts.map +1 -0
  207. package/dist/types.d.ts +89 -40
  208. package/dist/types.d.ts.map +1 -1
  209. package/package.json +49 -24
  210. package/dist/ChatAssistant.d.ts +0 -18
  211. package/dist/ChatAssistant.d.ts.map +0 -1
  212. package/dist/ChatAssistant.js +0 -178
  213. package/dist/SyntroChatbot.d.ts +0 -14
  214. package/dist/SyntroChatbot.d.ts.map +0 -1
  215. package/dist/SyntroChatbot.js +0 -56
  216. package/dist/actionParser.d.ts +0 -15
  217. package/dist/actionParser.d.ts.map +0 -1
  218. package/dist/actionParser.js +0 -52
  219. package/dist/apiClient.d.ts +0 -23
  220. package/dist/apiClient.d.ts.map +0 -1
  221. package/dist/apiClient.js +0 -51
  222. package/dist/cdn.js +0 -37
  223. package/dist/editor.d.ts +0 -17
  224. package/dist/editor.d.ts.map +0 -1
  225. package/dist/editor.js +0 -36
  226. package/dist/tools/bridge.d.ts +0 -26
  227. package/dist/tools/bridge.d.ts.map +0 -1
  228. package/dist/tools/bridge.js +0 -25
  229. package/dist/tools/expanders.d.ts +0 -17
  230. package/dist/tools/expanders.d.ts.map +0 -1
  231. package/dist/tools/expanders.js +0 -41
  232. package/dist/tools/index.d.ts +0 -14
  233. package/dist/tools/index.d.ts.map +0 -1
  234. package/dist/tools/index.js +0 -11
  235. package/dist/tools/registrations/GetContextTool.d.ts +0 -7
  236. package/dist/tools/registrations/GetContextTool.d.ts.map +0 -1
  237. package/dist/tools/registrations/GetContextTool.js +0 -18
  238. package/dist/tools/registrations/ScrollToTool.d.ts +0 -7
  239. package/dist/tools/registrations/ScrollToTool.d.ts.map +0 -1
  240. package/dist/tools/registrations/ScrollToTool.js +0 -38
  241. package/dist/tools/registrations/ShowOverlayTool.d.ts +0 -7
  242. package/dist/tools/registrations/ShowOverlayTool.d.ts.map +0 -1
  243. package/dist/tools/registrations/ShowOverlayTool.js +0 -47
  244. package/dist/tools/registrations/index.d.ts +0 -19
  245. package/dist/tools/registrations/index.d.ts.map +0 -1
  246. package/dist/tools/registrations/index.js +0 -7
  247. package/dist/types.js +0 -6
  248. package/dist/useChat.d.ts +0 -25
  249. package/dist/useChat.d.ts.map +0 -1
  250. package/dist/useChat.js +0 -106
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Adaptive Chatbot — Editor (Lit web component).
3
+ *
4
+ * Custom element: <se-chatbot-editor>
5
+ *
6
+ * Lit port of editor.tsx. Form-based: edits backendUrl, mlflowRunId,
7
+ * greeting, maxHistory and emits change events. No sub-items, no list view.
8
+ *
9
+ * Properties:
10
+ * - `config: ChatbotConfig | undefined` — current chatbot tile props
11
+ * - `onChange: (updatedAppConfig) => void` — callback fired when a field changes
12
+ *
13
+ * Events (bubbling, composed):
14
+ * - `navigate-home` — back button
15
+ * - `dirty-change` (detail: { dirty: boolean }) — emit dirty=true on first edit
16
+ */
17
+ import { LitElement } from 'lit';
18
+ type AppConfig = Record<string, unknown>;
19
+ export declare class ChatbotEditorLit extends LitElement {
20
+ static properties: {
21
+ config: {
22
+ attribute: boolean;
23
+ };
24
+ onChange: {
25
+ attribute: boolean;
26
+ };
27
+ };
28
+ config: AppConfig | undefined;
29
+ onChange: ((updated: AppConfig) => void) | undefined;
30
+ private _emittedDirty;
31
+ createRenderRoot(): this;
32
+ private _handleField;
33
+ private _navigateHome;
34
+ render(): import("lit-html").TemplateResult<1>;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=editor-lit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-lit.d.ts","sourceRoot":"","sources":["../src/editor-lit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAIvC,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzC,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,OAAgB,UAAU;;;;;;;MAGxB;IAEF,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAErD,OAAO,CAAC,aAAa,CAAS;IAErB,gBAAgB;IAIzB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,aAAa;IAIZ,MAAM;CAkGhB"}
@@ -0,0 +1,134 @@
1
+ import "./chunk-LY5AGXVD.js";
2
+
3
+ // src/editor-lit.ts
4
+ import { html, LitElement } from "lit";
5
+ var ChatbotEditorLit = class extends LitElement {
6
+ constructor() {
7
+ super(...arguments);
8
+ this._emittedDirty = false;
9
+ }
10
+ createRenderRoot() {
11
+ return this;
12
+ }
13
+ _handleField(field, value) {
14
+ if (!this.config) return;
15
+ const next = { ...this.config, [field]: value };
16
+ this.onChange?.(next);
17
+ if (!this._emittedDirty) {
18
+ this._emittedDirty = true;
19
+ this.dispatchEvent(
20
+ new CustomEvent("dirty-change", {
21
+ detail: { dirty: true },
22
+ bubbles: true,
23
+ composed: true
24
+ })
25
+ );
26
+ }
27
+ }
28
+ _navigateHome() {
29
+ this.dispatchEvent(new CustomEvent("navigate-home", { bubbles: true, composed: true }));
30
+ }
31
+ render() {
32
+ const cfg = this.config ?? {};
33
+ return html`
34
+ <div class="se-flex se-flex-col se-h-full se-font-sans">
35
+ <!-- Header -->
36
+ <div class="se-px-4 se-pt-3 se-pb-1 se-flex se-items-center se-gap-3">
37
+ <button
38
+ type="button"
39
+ @click=${() => this._navigateHome()}
40
+ class="se-py-1.5 se-px-3 se-rounded-md se-border-none se-bg-card-bg se-text-text-primary se-text-sm se-cursor-pointer"
41
+ >← Back</button>
42
+ <div class="se-flex se-flex-col">
43
+ <h2 class="se-m-0 se-text-base se-font-semibold se-text-text-primary">Chat Assistant</h2>
44
+ <p class="se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary">
45
+ Configure AI chat assistant
46
+ </p>
47
+ </div>
48
+ </div>
49
+
50
+ <div class="se-flex-1 se-overflow-auto se-px-4 se-py-3">
51
+ <!-- API Configuration -->
52
+ <div class="se-mb-6">
53
+ <div
54
+ class="se-text-xs se-font-semibold se-text-text-secondary se-uppercase se-tracking-wide se-mb-3"
55
+ >
56
+ API Configuration
57
+ </div>
58
+
59
+ <label class="se-block se-mb-3">
60
+ <span class="se-block se-text-xs se-text-text-secondary se-mb-1">Backend URL</span>
61
+ <input
62
+ type="text"
63
+ .value=${cfg.backendUrl ?? ""}
64
+ placeholder="/api/chat/message"
65
+ class="se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm focus:se-outline-none focus:se-border-input-field-border-selected"
66
+ @input=${(e) => this._handleField("backendUrl", e.target.value)}
67
+ />
68
+ </label>
69
+
70
+ <label class="se-block se-mb-3">
71
+ <span class="se-block se-text-xs se-text-text-secondary se-mb-1">
72
+ MLflow Run ID (optional)
73
+ </span>
74
+ <input
75
+ type="text"
76
+ .value=${cfg.mlflowRunId ?? ""}
77
+ placeholder="e.g., abc123"
78
+ class="se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm focus:se-outline-none focus:se-border-input-field-border-selected"
79
+ @input=${(e) => this._handleField("mlflowRunId", e.target.value)}
80
+ />
81
+ </label>
82
+ </div>
83
+
84
+ <!-- Chat Settings -->
85
+ <div class="se-mb-6">
86
+ <div
87
+ class="se-text-xs se-font-semibold se-text-text-secondary se-uppercase se-tracking-wide se-mb-3"
88
+ >
89
+ Chat Settings
90
+ </div>
91
+
92
+ <label class="se-block se-mb-3">
93
+ <span class="se-block se-text-xs se-text-text-secondary se-mb-1">Greeting Message</span>
94
+ <textarea
95
+ aria-label="Greeting Message"
96
+ .value=${cfg.greeting ?? ""}
97
+ placeholder="Hi! How can I help?"
98
+ rows="2"
99
+ class="se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-resize-none focus:se-outline-none focus:se-border-input-field-border-selected"
100
+ @input=${(e) => this._handleField("greeting", e.target.value)}
101
+ ></textarea>
102
+ </label>
103
+
104
+ <label class="se-block se-mb-3">
105
+ <span class="se-block se-text-xs se-text-text-secondary se-mb-1">
106
+ Max History (messages sent to backend)
107
+ </span>
108
+ <input
109
+ type="number"
110
+ .value=${String(cfg.maxHistory ?? 20)}
111
+ min="1"
112
+ max="100"
113
+ class="se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm focus:se-outline-none focus:se-border-input-field-border-selected"
114
+ @input=${(e) => {
115
+ const n = parseInt(e.target.value, 10);
116
+ if (!Number.isNaN(n)) this._handleField("maxHistory", n);
117
+ }}
118
+ />
119
+ </label>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ `;
124
+ }
125
+ };
126
+ ChatbotEditorLit.properties = {
127
+ config: { attribute: false },
128
+ onChange: { attribute: false }
129
+ };
130
+ customElements.define("se-chatbot-editor", ChatbotEditorLit);
131
+ export {
132
+ ChatbotEditorLit
133
+ };
134
+ //# sourceMappingURL=editor-lit.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/editor-lit.ts"],
4
+ "sourcesContent": ["/**\n * Adaptive Chatbot \u2014 Editor (Lit web component).\n *\n * Custom element: <se-chatbot-editor>\n *\n * Lit port of editor.tsx. Form-based: edits backendUrl, mlflowRunId,\n * greeting, maxHistory and emits change events. No sub-items, no list view.\n *\n * Properties:\n * - `config: ChatbotConfig | undefined` \u2014 current chatbot tile props\n * - `onChange: (updatedAppConfig) => void` \u2014 callback fired when a field changes\n *\n * Events (bubbling, composed):\n * - `navigate-home` \u2014 back button\n * - `dirty-change` (detail: { dirty: boolean }) \u2014 emit dirty=true on first edit\n */\n\nimport { html, LitElement } from 'lit';\n\nimport type { ChatbotConfig } from './types';\n\ntype AppConfig = Record<string, unknown>;\n\nexport class ChatbotEditorLit extends LitElement {\n static override properties = {\n config: { attribute: false },\n onChange: { attribute: false },\n };\n\n config: AppConfig | undefined;\n onChange: ((updated: AppConfig) => void) | undefined;\n\n private _emittedDirty = false;\n\n override createRenderRoot() {\n return this;\n }\n\n private _handleField(field: keyof ChatbotConfig, value: string | number) {\n if (!this.config) return;\n const next = { ...(this.config as Partial<ChatbotConfig>), [field]: value };\n this.onChange?.(next as AppConfig);\n\n if (!this._emittedDirty) {\n this._emittedDirty = true;\n this.dispatchEvent(\n new CustomEvent('dirty-change', {\n detail: { dirty: true },\n bubbles: true,\n composed: true,\n })\n );\n }\n }\n\n private _navigateHome() {\n this.dispatchEvent(new CustomEvent('navigate-home', { bubbles: true, composed: true }));\n }\n\n override render() {\n const cfg = (this.config ?? {}) as Partial<ChatbotConfig>;\n\n return html`\n <div class=\"se-flex se-flex-col se-h-full se-font-sans\">\n <!-- Header -->\n <div class=\"se-px-4 se-pt-3 se-pb-1 se-flex se-items-center se-gap-3\">\n <button\n type=\"button\"\n @click=${() => this._navigateHome()}\n class=\"se-py-1.5 se-px-3 se-rounded-md se-border-none se-bg-card-bg se-text-text-primary se-text-sm se-cursor-pointer\"\n >\u2190 Back</button>\n <div class=\"se-flex se-flex-col\">\n <h2 class=\"se-m-0 se-text-base se-font-semibold se-text-text-primary\">Chat Assistant</h2>\n <p class=\"se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary\">\n Configure AI chat assistant\n </p>\n </div>\n </div>\n\n <div class=\"se-flex-1 se-overflow-auto se-px-4 se-py-3\">\n <!-- API Configuration -->\n <div class=\"se-mb-6\">\n <div\n class=\"se-text-xs se-font-semibold se-text-text-secondary se-uppercase se-tracking-wide se-mb-3\"\n >\n API Configuration\n </div>\n\n <label class=\"se-block se-mb-3\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">Backend URL</span>\n <input\n type=\"text\"\n .value=${cfg.backendUrl ?? ''}\n placeholder=\"/api/chat/message\"\n class=\"se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm focus:se-outline-none focus:se-border-input-field-border-selected\"\n @input=${(e: Event) =>\n this._handleField('backendUrl', (e.target as HTMLInputElement).value)}\n />\n </label>\n\n <label class=\"se-block se-mb-3\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">\n MLflow Run ID (optional)\n </span>\n <input\n type=\"text\"\n .value=${cfg.mlflowRunId ?? ''}\n placeholder=\"e.g., abc123\"\n class=\"se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm focus:se-outline-none focus:se-border-input-field-border-selected\"\n @input=${(e: Event) =>\n this._handleField('mlflowRunId', (e.target as HTMLInputElement).value)}\n />\n </label>\n </div>\n\n <!-- Chat Settings -->\n <div class=\"se-mb-6\">\n <div\n class=\"se-text-xs se-font-semibold se-text-text-secondary se-uppercase se-tracking-wide se-mb-3\"\n >\n Chat Settings\n </div>\n\n <label class=\"se-block se-mb-3\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">Greeting Message</span>\n <textarea\n aria-label=\"Greeting Message\"\n .value=${cfg.greeting ?? ''}\n placeholder=\"Hi! How can I help?\"\n rows=\"2\"\n class=\"se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-resize-none focus:se-outline-none focus:se-border-input-field-border-selected\"\n @input=${(e: Event) =>\n this._handleField('greeting', (e.target as HTMLTextAreaElement).value)}\n ></textarea>\n </label>\n\n <label class=\"se-block se-mb-3\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">\n Max History (messages sent to backend)\n </span>\n <input\n type=\"number\"\n .value=${String(cfg.maxHistory ?? 20)}\n min=\"1\"\n max=\"100\"\n class=\"se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm focus:se-outline-none focus:se-border-input-field-border-selected\"\n @input=${(e: Event) => {\n const n = parseInt((e.target as HTMLInputElement).value, 10);\n if (!Number.isNaN(n)) this._handleField('maxHistory', n);\n }}\n />\n </label>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ncustomElements.define('se-chatbot-editor', ChatbotEditorLit);\n"],
5
+ "mappings": ";;;AAiBA,SAAS,MAAM,kBAAkB;AAM1B,IAAM,mBAAN,cAA+B,WAAW;AAAA,EAA1C;AAAA;AASL,SAAQ,gBAAgB;AAAA;AAAA,EAEf,mBAAmB;AAC1B,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,OAA4B,OAAwB;AACvE,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM,OAAO,EAAE,GAAI,KAAK,QAAmC,CAAC,KAAK,GAAG,MAAM;AAC1E,SAAK,WAAW,IAAiB;AAEjC,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,gBAAgB;AACrB,WAAK;AAAA,QACH,IAAI,YAAY,gBAAgB;AAAA,UAC9B,QAAQ,EAAE,OAAO,KAAK;AAAA,UACtB,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,SAAK,cAAc,IAAI,YAAY,iBAAiB,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC;AAAA,EACxF;AAAA,EAES,SAAS;AAChB,UAAM,MAAO,KAAK,UAAU,CAAC;AAE7B,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAMU,MAAM,KAAK,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAwBtB,IAAI,cAAc,EAAE;AAAA;AAAA;AAAA,yBAGpB,CAAC,MACR,KAAK,aAAa,cAAe,EAAE,OAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAU9D,IAAI,eAAe,EAAE;AAAA;AAAA;AAAA,yBAGrB,CAAC,MACR,KAAK,aAAa,eAAgB,EAAE,OAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAiB/D,IAAI,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA,yBAIlB,CAAC,MACR,KAAK,aAAa,YAAa,EAAE,OAA+B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAU/D,OAAO,IAAI,cAAc,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,yBAI5B,CAAC,MAAa;AACrB,YAAM,IAAI,SAAU,EAAE,OAA4B,OAAO,EAAE;AAC3D,UAAI,CAAC,OAAO,MAAM,CAAC,EAAG,MAAK,aAAa,cAAc,CAAC;AAAA,IACzD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AACF;AAtIa,iBACK,aAAa;AAAA,EAC3B,QAAQ,EAAE,WAAW,MAAM;AAAA,EAC3B,UAAU,EAAE,WAAW,MAAM;AAC/B;AAoIF,eAAe,OAAO,qBAAqB,gBAAgB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Editor-session token for draft template verification.
3
+ *
4
+ * In editor mode the backend can verify submitted uiTemplates against the
5
+ * SERVER-SIDE draft of the plan an editor token is bound to (runtime-backend
6
+ * `config_verify/draft.py`) instead of requiring a released GrowthBook
7
+ * config. The chat surfaces attach the token as `X-Syntro-Editor-Token` on
8
+ * the /templates boot publish and every /stream turn; outside editor mode
9
+ * no header is sent and the release-only contract stands.
10
+ *
11
+ * Token source, in order:
12
+ * 1. The page's `editor_source` URL param — the same base64url payload the
13
+ * editor-sdk boots from ({token, api_base}). Read lazily per request so
14
+ * there is no load-order dependency on the editor bundle.
15
+ * 2. `window.__SYNTRO_EDITOR_PARAMS__` — the editor-sdk's injected params,
16
+ * which survive SPA navigations that drop the query string.
17
+ *
18
+ * This is deliberately NOT a workspace-auth channel (that is `runtime.token`,
19
+ * BUG-1785360157). The editor token is an ADDITIVE capability the server
20
+ * validates independently; sending a stale/invalid one is harmless.
21
+ */
22
+ export declare function readEditorToken(): string | undefined;
23
+ //# sourceMappingURL=editorToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorToken.d.ts","sourceRoot":"","sources":["../src/editorToken.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAoBpD"}
@@ -0,0 +1,3 @@
1
+ export type { ApplyOutcome, ElementSessionController, ElementSessionOptions, } from './elements/ElementSessionController';
2
+ export { createElementSessionController } from './elements/ElementSessionController';
3
+ //# sourceMappingURL=element-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-session.d.ts","sourceRoot":"","sources":["../src/element-session.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import {
2
+ createElementSessionController
3
+ } from "./chunk-VIRIVP7H.js";
4
+ import "./chunk-4V5L7IRV.js";
5
+ import "./chunk-LY5AGXVD.js";
6
+ export {
7
+ createElementSessionController
8
+ };
9
+ //# sourceMappingURL=element-session.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Action element handler — dispatches an ActionStep through
3
+ * `ActionEngine.applyBatch`.
4
+ *
5
+ * The `content` field of an action `MountedElement` carries the action's
6
+ * params; the executor `kind` comes from the template (which the SDK
7
+ * doesn't have locally yet — for v1 the template's `kind` is encoded
8
+ * into `content.__kind`, set by the backend tool). When proper
9
+ * template loading lands on the SDK side, this handler resolves the
10
+ * kind from the loaded template instead.
11
+ *
12
+ * **Imperative actions never re-fire on boot.** The `lifecycle` field
13
+ * here is `imperative` — `ElementInstanceStore` skips boot rehydrate
14
+ * for imperative instances with `state === 'applied'`. The backend
15
+ * record exists for audit; replaying a scroll/navigate on every page
16
+ * load would be visibly wrong.
17
+ *
18
+ * Stateful actions (e.g. `content:insertHtml`, `content:setText`,
19
+ * `content:addClass` once Phase 7's renderer lands) ARE re-applied on
20
+ * boot. v1 supports the imperative shape; stateful action handling
21
+ * waits on the Portable Text renderer.
22
+ */
23
+ import type { ElementHandlerContext, ElementTypeHandler, ValidateResult } from './ElementTypeHandler';
24
+ import type { MountedElement } from './types';
25
+ export declare class ActionHandler implements ElementTypeHandler {
26
+ readonly typeName: "action";
27
+ readonly lifecycle: "imperative";
28
+ validate(instance: MountedElement, _ctx: ElementHandlerContext): ValidateResult;
29
+ mount(instance: MountedElement, ctx: ElementHandlerContext): Promise<void>;
30
+ patch(_instance: MountedElement, _ctx: ElementHandlerContext): Promise<void>;
31
+ unmount(_instance: MountedElement, _ctx: ElementHandlerContext): Promise<void>;
32
+ private _actionFromInstance;
33
+ }
34
+ //# sourceMappingURL=ActionHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionHandler.d.ts","sourceRoot":"","sources":["../../src/elements/ActionHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,qBAAa,aAAc,YAAW,kBAAkB;IACtD,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAGtC,QAAQ,CAAC,SAAS,EAAG,YAAY,CAAU;IAE3C,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,GAAG,cAAc;IAWzE,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1E,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,OAAO,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpF,OAAO,CAAC,mBAAmB;CAiC5B"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Type-neutral store for LLM-authored UI element instances — Phase 6.
3
+ *
4
+ * On SDK boot:
5
+ * 1. Caller fetches `/api/adaptive/mounted_elements` (see `fetcher.ts`).
6
+ * 2. Calls `store.hydrate(response.mounted_elements)`.
7
+ * 3. The store iterates each instance, looks up its handler, and
8
+ * either mounts (stateful) or skips (imperative already-applied).
9
+ *
10
+ * During chat turns:
11
+ * - AGUI `syntro.element.mutation` envelopes arrive via
12
+ * `AgUiTransport.onA2UIEvent`. The transport caller decodes the
13
+ * envelope and invokes `store.apply(envelope.mutations)`.
14
+ *
15
+ * Concurrency / dedup:
16
+ * - Per-instance `version` is the dedup key. A mutation whose version
17
+ * is `<= currentVersion` is treated as already-applied and silently
18
+ * dropped — handles the SSE-during-boot-fetch race per the design
19
+ * doc (the live mutation might arrive before the boot snapshot does,
20
+ * and the snapshot is then a no-op).
21
+ * - The store is single-threaded by Node/browser convention; no
22
+ * cross-tab sync in v1.
23
+ *
24
+ * The store delegates all DOM work to per-type handlers
25
+ * (`ElementTypeHandler`). It owns the registry, the in-memory state,
26
+ * and the dispatch logic.
27
+ */
28
+ import type { ActionEngine } from '../types';
29
+ import type { ElementTypeHandler } from './ElementTypeHandler';
30
+ import type { ElementMutation, MountedElement } from './types';
31
+ /**
32
+ * Slot name reserved for tiles the backend wants rendered INLINE IN THE
33
+ * CHAT TRAIL (in the conversation flow, like a rich message) rather than
34
+ * in the canvas deck. The reco carousel uses this: the deck tile mounts
35
+ * BEHIND the open chat panel, so the visitor never sees it. The backend
36
+ * owns the placement decision — `adaptive_agent.py` emits
37
+ * `SlotPlacement(slot="chat-inline")` for the reco mount. On the chat
38
+ * side these tiles:
39
+ * - surface via {@link ElementInstanceStore.listInlineWidgets} so the
40
+ * trail can mount the widget element inline; and
41
+ * - are SUPPRESSED from {@link ElementInstanceStore.listTileReceipts}
42
+ * (a receipt chip would be a redundant, weaker affordance for a
43
+ * widget already visible in the trail).
44
+ * Every other slot keeps its existing deck + receipt-chip behavior.
45
+ */
46
+ export declare const CHAT_INLINE_SLOT = "chat-inline";
47
+ /** One inline-rendered widget for the chat trail — a `chat-inline` tile. */
48
+ export interface InlineWidget {
49
+ instanceId: string;
50
+ /** Custom-element tag to mount (e.g. `syntro-product-reco-carousel`). */
51
+ tag: string;
52
+ /** Payload assigned to the mounted element as ONE `props` object property
53
+ * (`el.props = props` — the standard tile-widget mount contract; never
54
+ * spread as individual per-key properties). */
55
+ props: Record<string, unknown>;
56
+ /** `mounted_by.turn_id` — lets the chat trail restore the widget to its
57
+ * original transcript position after a reload. */
58
+ turnId?: string;
59
+ /** `tool_call_id` of the mount call — pins the restored widget to the exact
60
+ * transcript message hosting that call; `turnId` is the coarser fallback. */
61
+ toolCallId?: string;
62
+ }
63
+ export interface ElementInstanceStoreOptions {
64
+ actions: ActionEngine;
65
+ /** Runtime's event bus. ItemHandler publishes
66
+ * `element.compositional_append` events here so container widgets
67
+ * (chips strip, FAQ accordion, nav tips) can subscribe and inject
68
+ * LLM-authored items into their compositional-actions lists.
69
+ *
70
+ * When `subscribe` is also provided, the store listens for
71
+ * `element.compositional_replay_request` events. A container widget
72
+ * publishes this event with its `tile_id` whenever it subscribes
73
+ * (e.g. on first mount AND on SPA-navigation remount); the store
74
+ * responds by re-publishing `element.compositional_append` for every
75
+ * matching item still in its in-memory map. This is what makes
76
+ * LLM-authored items persist across navigations within the page
77
+ * session — the store survives chat-bar unmount/remount, container
78
+ * widgets re-pull on each fresh mount.
79
+ */
80
+ events?: {
81
+ publish: (name: string, props?: Record<string, unknown>) => void;
82
+ /**
83
+ * Overloaded to match the runtime SDK's `EventBus.subscribe`:
84
+ * pass `{names:[...]}` to filter, or a callback to receive every
85
+ * event. The store uses the filtered form so it doesn't fan
86
+ * unrelated traffic (PostHog autocapture, every action lifecycle
87
+ * event) into a string-compare on each delivery.
88
+ */
89
+ subscribe?: {
90
+ (filter: {
91
+ names?: string[];
92
+ }, handler: (event: {
93
+ name: string;
94
+ props?: Record<string, unknown>;
95
+ }) => void): () => void;
96
+ (handler: (event: {
97
+ name: string;
98
+ props?: Record<string, unknown>;
99
+ }) => void): () => void;
100
+ };
101
+ };
102
+ handlers?: ElementTypeHandler[];
103
+ /** Override the logger — used by tests to capture log output. */
104
+ logger?: Pick<Console, 'info' | 'warn' | 'error'>;
105
+ /**
106
+ * Optional template→widget resolver used by the rehydrate replay.
107
+ * Without this, replayed tile mounts emit ``widget: template_id``,
108
+ * which only works when the admin's template ids match the widget
109
+ * registry (e.g. ``adaptive-faq:accordion``). When an admin uses a
110
+ * friendly id like ``product-card`` mapping to widget
111
+ * ``adaptive-product:card``, the rehydrate path needs the resolver
112
+ * to match the live mount path.
113
+ *
114
+ * Same shape as ``TileHandler``'s resolver — pass the same function
115
+ * to both so live mounts and replays agree on the widget id.
116
+ */
117
+ resolveTileWidget?: (templateId: string) => string | undefined;
118
+ }
119
+ export interface ApplyReport {
120
+ ok: boolean;
121
+ rejectedInstanceIds: string[];
122
+ }
123
+ export declare class ElementInstanceStore {
124
+ private readonly _actions;
125
+ private readonly _events;
126
+ private readonly _handlers;
127
+ private readonly _instances;
128
+ private readonly _logger;
129
+ private readonly _resolveTileWidget?;
130
+ /** Active TTL timeout — replaced on each call to `scheduleClientTtl`. */
131
+ private _ttlTimer;
132
+ private _unsubscribeReplay?;
133
+ private _disposed;
134
+ private _disposing;
135
+ /** Instance IDs the client has dismissed. Persists across canvas remounts
136
+ * so a dismissed tile never silently reappears on replay/broadcast. */
137
+ private readonly _dismissedIds;
138
+ constructor(options: ElementInstanceStoreOptions);
139
+ /**
140
+ * Listen for `element.compositional_replay_request` from container
141
+ * widgets and re-publish `element.compositional_append` for every
142
+ * matching item still tracked in `_instances`. This keeps LLM-authored
143
+ * items visible across SPA navigations: the store is a module-level
144
+ * singleton that survives chat-bar unmount/remount, so when a fresh
145
+ * chips-strip mounts and subscribes, asking for a replay re-populates
146
+ * its chip array.
147
+ */
148
+ private _subscribeReplayRequests;
149
+ private _replayItems;
150
+ private _replayTiles;
151
+ registerHandler(handler: ElementTypeHandler): void;
152
+ isDismissed(instanceId: string): boolean;
153
+ getDismissedIds(): ReadonlySet<string>;
154
+ /** Store-driven receipt source for the chat trail (one per active slot-tile). */
155
+ listTileReceipts(): Array<{
156
+ kind: 'tile';
157
+ instanceId: string;
158
+ title: string;
159
+ dismissed: boolean;
160
+ turnId?: string;
161
+ toolCallId?: string;
162
+ imageUrl?: string;
163
+ } | {
164
+ kind: 'alert';
165
+ instanceId: string;
166
+ title: string;
167
+ turnId?: string;
168
+ toolCallId?: string;
169
+ }>;
170
+ /**
171
+ * Store-driven inline-widget source for the chat trail — one entry per
172
+ * active `chat-inline` slot-tile. The trail mounts each entry's widget
173
+ * element (by tag name, via `document.createElement`) inline in the
174
+ * conversation flow. Distinct from {@link listTileReceipts}: those are
175
+ * chips that recall a deck tile; these ARE the rendered widget.
176
+ */
177
+ listInlineWidgets(): InlineWidget[];
178
+ /** Clear a client dismissal and re-publish the tile's mount from retained content. */
179
+ recreate(instanceId: string): void;
180
+ /**
181
+ * Apply the server-provided boot snapshot. For each instance:
182
+ * - stateful: validated + mounted via the type handler;
183
+ * - imperative + already-applied: recorded only (no DOM action);
184
+ * - any: tracked in the in-memory map for future patches.
185
+ *
186
+ * Safe to call once on SDK init. Calling again would re-mount
187
+ * stateful instances; callers should not.
188
+ */
189
+ hydrate(snapshot: MountedElement[]): Promise<void>;
190
+ private _hydrateWithReport;
191
+ /**
192
+ * Re-publish `element.tile_mounted` / `element.compositional_append`
193
+ * for every active LLM-authored instance in the store. Idempotent —
194
+ * receivers key by `instance_id` (tiles) or by widget identity
195
+ * (items via tile_id filter).
196
+ */
197
+ private _broadcastActive;
198
+ /**
199
+ * Apply a batch of mutations, atomically per-batch. Each mutation is
200
+ * version-checked (mount: must not conflict with existing instance;
201
+ * patch: resulting_version must be > current; unmount: idempotent).
202
+ */
203
+ apply(mutations: ElementMutation[]): Promise<void>;
204
+ applyWithReport(mutations: ElementMutation[]): Promise<ApplyReport>;
205
+ private _applyWithReport;
206
+ /** Read-only snapshot of currently-known instances. */
207
+ getInstances(): MountedElement[];
208
+ getInstance(instance_id: string): MountedElement | undefined;
209
+ /** Replace a host-provided complete UI snapshot; never replay imperative actions. */
210
+ reconcileSnapshot(snapshot: MountedElement[]): Promise<ApplyReport>;
211
+ /** Release page-lifetime listeners and timers; queued work becomes inert. */
212
+ dispose(unmount?: boolean): void;
213
+ /**
214
+ * Schedule a client-side TTL that unmounts every active stateful
215
+ * instance when the server-side session expires. Replaces any
216
+ * previously-scheduled TTL.
217
+ *
218
+ * Avoids the orphan-window where session-expired tiles linger on the
219
+ * page until manual refresh — the server forgets at the 24h mark and
220
+ * the SDK tears down concurrently. Re-schedule on each boot fetch /
221
+ * mutation event that carries a refreshed `session_expires_at`.
222
+ *
223
+ * Pass `null` to clear the existing timer without scheduling a new one.
224
+ * Pass a past timestamp to trigger cleanup immediately.
225
+ */
226
+ scheduleClientTtl(session_expires_at: string | null): void;
227
+ private _handleSessionExpiry;
228
+ private _applyOne;
229
+ private _mount;
230
+ private _ctx;
231
+ }
232
+ //# sourceMappingURL=ElementInstanceStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElementInstanceStore.d.ts","sourceRoot":"","sources":["../../src/elements/ElementInstanceStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ElementInstanceStore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElementInstanceStore.test.d.ts","sourceRoot":"","sources":["../../src/elements/ElementInstanceStore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import type { ChatbotWidgetRuntime } from '../types';
2
+ import type { ElementInstanceStore } from './ElementInstanceStore';
3
+ import type { MountedElement, MountedElementsResponse, MutationEnvelope } from './types';
4
+ export type ApplyOutcome = {
5
+ status: 'applied' | 'duplicate';
6
+ resultId: string;
7
+ } | {
8
+ status: 'rejected';
9
+ reason: 'invalid' | 'wrong_scope' | 'disposed' | 'projection_failed';
10
+ };
11
+ export interface ElementSessionController {
12
+ configureTemplates(templates: Record<string, unknown> | undefined): void;
13
+ acceptHostFrame(payload: unknown): Promise<ApplyOutcome>;
14
+ applyLegacyEnvelope(envelope: MutationEnvelope): Promise<void>;
15
+ hydrateLegacy(instances: MountedElement[], expiresAt: string | null): Promise<void>;
16
+ dispose(): Promise<void>;
17
+ }
18
+ export interface ElementSessionOptions extends Pick<ChatbotWidgetRuntime, 'actions' | 'events'> {
19
+ templates?: Record<string, unknown>;
20
+ /** The older standalone assistant accepted template IDs as widget IDs. */
21
+ legacyTemplateFallback?: boolean;
22
+ /** The one conversation this owner renders. A frame for any other is refused. */
23
+ hostScope?: {
24
+ sessionRef: string;
25
+ };
26
+ }
27
+ /** Compatibility accessors belong to this owner, never a module-wide store. */
28
+ export interface OwnedElementSession extends ElementSessionController {
29
+ readonly store: ElementInstanceStore;
30
+ resolveTileWidget(templateId: string): string | undefined;
31
+ whenIdle(): Promise<void>;
32
+ hydrateOnce(load: () => Promise<MountedElementsResponse | null>): void;
33
+ listen(target: EventTarget, name: string, listener: EventListener): () => void;
34
+ }
35
+ /** The UI-independent owner for ordered projection, replay and teardown. */
36
+ export declare function createElementSessionController(options: ElementSessionOptions): OwnedElementSession;
37
+ //# sourceMappingURL=ElementSessionController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElementSessionController.d.ts","sourceRoot":"","sources":["../../src/elements/ElementSessionController.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEzF,MAAM,MAAM,YAAY,GACpB;IAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,mBAAmB,CAAA;CAAE,CAAC;AAEjG,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;IACzE,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iFAAiF;IACjF,SAAS,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC;AAED,+EAA+E;AAC/E,MAAM,WAAW,mBAAoB,SAAQ,wBAAwB;IACnE,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,WAAW,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACvE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAAC;CAChF;AAoFD,4EAA4E;AAC5E,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,qBAAqB,GAC7B,mBAAmB,CA8GrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ElementSessionController.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElementSessionController.test.d.ts","sourceRoot":"","sources":["../../src/elements/ElementSessionController.test.ts"],"names":[],"mappings":""}