@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.
- package/dist/AdaptiveChatBar.composer.test.d.ts +2 -0
- package/dist/AdaptiveChatBar.composer.test.d.ts.map +1 -0
- package/dist/AdaptiveChatBar.d.ts +248 -0
- package/dist/AdaptiveChatBar.d.ts.map +1 -0
- package/dist/AdaptiveChatBar.interleave.test.d.ts +9 -0
- package/dist/AdaptiveChatBar.interleave.test.d.ts.map +1 -0
- package/dist/AdaptiveChatBar.js +12 -0
- package/dist/AdaptiveChatBar.js.map +7 -0
- package/dist/AdaptiveChatBarMountable.d.ts +93 -0
- package/dist/AdaptiveChatBarMountable.d.ts.map +1 -0
- package/dist/AdaptiveChatTrail.anchor-scroll.test.d.ts +2 -0
- package/dist/AdaptiveChatTrail.anchor-scroll.test.d.ts.map +1 -0
- package/dist/AdaptiveChatTrail.d.ts +539 -0
- package/dist/AdaptiveChatTrail.d.ts.map +1 -0
- package/dist/AdaptiveChatTrail.follow-bottom.test.d.ts +2 -0
- package/dist/AdaptiveChatTrail.follow-bottom.test.d.ts.map +1 -0
- package/dist/AdaptiveChatTrail.js +12 -0
- package/dist/AdaptiveChatTrail.js.map +7 -0
- package/dist/AdaptiveChatTrail.live-region.test.d.ts +2 -0
- package/dist/AdaptiveChatTrail.live-region.test.d.ts.map +1 -0
- package/dist/AdaptiveChatTrail.test.d.ts +2 -0
- package/dist/AdaptiveChatTrail.test.d.ts.map +1 -0
- package/dist/AdaptiveChipsStrip.d.ts +1156 -0
- package/dist/AdaptiveChipsStrip.d.ts.map +1 -0
- package/dist/AdaptiveChipsStrip.js +11 -0
- package/dist/AdaptiveChipsStrip.js.map +7 -0
- package/dist/AdaptiveChipsStripMountable.d.ts +24 -0
- package/dist/AdaptiveChipsStripMountable.d.ts.map +1 -0
- package/dist/ChatAssistantLit.d.ts +64 -0
- package/dist/ChatAssistantLit.d.ts.map +1 -0
- package/dist/ChatAssistantLit.js +14 -0
- package/dist/ChatAssistantLit.js.map +7 -0
- package/dist/ChatSession.d.ts +275 -0
- package/dist/ChatSession.d.ts.map +1 -0
- package/dist/ChatTransport.d.ts +448 -0
- package/dist/ChatTransport.d.ts.map +1 -0
- package/dist/InlineRegistryWidgetMount.test.d.ts +2 -0
- package/dist/InlineRegistryWidgetMount.test.d.ts.map +1 -0
- package/dist/InlineWidgetLiveMount.test.d.ts +2 -0
- package/dist/InlineWidgetLiveMount.test.d.ts.map +1 -0
- package/dist/LeaveAMessage.leadconnector.integration.test.d.ts +2 -0
- package/dist/LeaveAMessage.leadconnector.integration.test.d.ts.map +1 -0
- package/dist/LeaveAMessageLit.d.ts +329 -0
- package/dist/LeaveAMessageLit.d.ts.map +1 -0
- package/dist/LeaveAMessageLit.test.d.ts +2 -0
- package/dist/LeaveAMessageLit.test.d.ts.map +1 -0
- package/dist/LeaveAMessageMountable.test.d.ts +2 -0
- package/dist/LeaveAMessageMountable.test.d.ts.map +1 -0
- package/dist/NavLinkMountable.d.ts +25 -0
- package/dist/NavLinkMountable.d.ts.map +1 -0
- package/dist/NavLinkMountable.test.d.ts +2 -0
- package/dist/NavLinkMountable.test.d.ts.map +1 -0
- package/dist/TextAnswerMountable.d.ts +17 -0
- package/dist/TextAnswerMountable.d.ts.map +1 -0
- package/dist/TextAnswerMountable.test.d.ts +2 -0
- package/dist/TextAnswerMountable.test.d.ts.map +1 -0
- package/dist/Turnstile.d.ts +101 -0
- package/dist/Turnstile.d.ts.map +1 -0
- package/dist/cdn.d.ts +16 -8
- package/dist/cdn.d.ts.map +1 -1
- package/dist/chunk-4V5L7IRV.js +4711 -0
- package/dist/chunk-4V5L7IRV.js.map +7 -0
- package/dist/chunk-EWPPVPJ4.js +14 -0
- package/dist/chunk-EWPPVPJ4.js.map +7 -0
- package/dist/chunk-HD2NXGYO.js +8445 -0
- package/dist/chunk-HD2NXGYO.js.map +7 -0
- package/dist/chunk-HV52LYST.js +641 -0
- package/dist/chunk-HV52LYST.js.map +7 -0
- package/dist/chunk-LY5AGXVD.js +21 -0
- package/dist/chunk-LY5AGXVD.js.map +7 -0
- package/dist/chunk-T6VEDUXD.js +694 -0
- package/dist/chunk-T6VEDUXD.js.map +7 -0
- package/dist/chunk-UFTSEIQP.js +1877 -0
- package/dist/chunk-UFTSEIQP.js.map +7 -0
- package/dist/chunk-VIRIVP7H.js +898 -0
- package/dist/chunk-VIRIVP7H.js.map +7 -0
- package/dist/chunk-YFZCMLV6.js +4078 -0
- package/dist/chunk-YFZCMLV6.js.map +7 -0
- package/dist/editor-lit.d.ts +37 -0
- package/dist/editor-lit.d.ts.map +1 -0
- package/dist/editor-lit.js +134 -0
- package/dist/editor-lit.js.map +7 -0
- package/dist/editorToken.d.ts +23 -0
- package/dist/editorToken.d.ts.map +1 -0
- package/dist/element-session.d.ts +3 -0
- package/dist/element-session.d.ts.map +1 -0
- package/dist/element-session.js +9 -0
- package/dist/element-session.js.map +7 -0
- package/dist/elements/ActionHandler.d.ts +34 -0
- package/dist/elements/ActionHandler.d.ts.map +1 -0
- package/dist/elements/ElementInstanceStore.d.ts +232 -0
- package/dist/elements/ElementInstanceStore.d.ts.map +1 -0
- package/dist/elements/ElementInstanceStore.test.d.ts +2 -0
- package/dist/elements/ElementInstanceStore.test.d.ts.map +1 -0
- package/dist/elements/ElementSessionController.d.ts +37 -0
- package/dist/elements/ElementSessionController.d.ts.map +1 -0
- package/dist/elements/ElementSessionController.test.d.ts +2 -0
- package/dist/elements/ElementSessionController.test.d.ts.map +1 -0
- package/dist/elements/ElementTypeHandler.d.ts +77 -0
- package/dist/elements/ElementTypeHandler.d.ts.map +1 -0
- package/dist/elements/ItemHandler.d.ts +60 -0
- package/dist/elements/ItemHandler.d.ts.map +1 -0
- package/dist/elements/ItemHandler.test.d.ts +2 -0
- package/dist/elements/ItemHandler.test.d.ts.map +1 -0
- package/dist/elements/TileHandler.d.ts +52 -0
- package/dist/elements/TileHandler.d.ts.map +1 -0
- package/dist/elements/TileHandler.test.d.ts +2 -0
- package/dist/elements/TileHandler.test.d.ts.map +1 -0
- package/dist/elements/__tests__/ElementInstanceStore.recall.test.d.ts +2 -0
- package/dist/elements/__tests__/ElementInstanceStore.recall.test.d.ts.map +1 -0
- package/dist/elements/blockRenderer.d.ts +46 -0
- package/dist/elements/blockRenderer.d.ts.map +1 -0
- package/dist/elements/blockRenderer.test.d.ts +13 -0
- package/dist/elements/blockRenderer.test.d.ts.map +1 -0
- package/dist/elements/blocks.d.ts +58 -0
- package/dist/elements/blocks.d.ts.map +1 -0
- package/dist/elements/createElementStore.d.ts +11 -0
- package/dist/elements/createElementStore.d.ts.map +1 -0
- package/dist/elements/envelope.d.ts +24 -0
- package/dist/elements/envelope.d.ts.map +1 -0
- package/dist/elements/fetcher.d.ts +43 -0
- package/dist/elements/fetcher.d.ts.map +1 -0
- package/dist/elements/index.d.ts +33 -0
- package/dist/elements/index.d.ts.map +1 -0
- package/dist/elements/store-singleton.d.ts +4 -0
- package/dist/elements/store-singleton.d.ts.map +1 -0
- package/dist/elements/tileLifecycleProps.d.ts +13 -0
- package/dist/elements/tileLifecycleProps.d.ts.map +1 -0
- package/dist/elements/types.d.ts +117 -0
- package/dist/elements/types.d.ts.map +1 -0
- package/dist/findSmartCanvas.d.ts +19 -0
- package/dist/findSmartCanvas.d.ts.map +1 -0
- package/dist/hostAgentController.d.ts +65 -0
- package/dist/hostAgentController.d.ts.map +1 -0
- package/dist/hostAgentController.test.d.ts +2 -0
- package/dist/hostAgentController.test.d.ts.map +1 -0
- package/dist/observer/__tests__/allowlist.test.d.ts +9 -0
- package/dist/observer/__tests__/allowlist.test.d.ts.map +1 -0
- package/dist/observer/__tests__/bus-translate.test.d.ts +16 -0
- package/dist/observer/__tests__/bus-translate.test.d.ts.map +1 -0
- package/dist/observer/__tests__/detector-observation-contract.test.d.ts +25 -0
- package/dist/observer/__tests__/detector-observation-contract.test.d.ts.map +1 -0
- package/dist/observer/__tests__/lifecycle.test.d.ts +2 -0
- package/dist/observer/__tests__/lifecycle.test.d.ts.map +1 -0
- package/dist/observer/__tests__/observer-enrich.test.d.ts +10 -0
- package/dist/observer/__tests__/observer-enrich.test.d.ts.map +1 -0
- package/dist/observer/__tests__/observer-isolation.test.d.ts +13 -0
- package/dist/observer/__tests__/observer-isolation.test.d.ts.map +1 -0
- package/dist/observer/__tests__/queue.test.d.ts +2 -0
- package/dist/observer/__tests__/queue.test.d.ts.map +1 -0
- package/dist/observer/__tests__/transport.test.d.ts +2 -0
- package/dist/observer/__tests__/transport.test.d.ts.map +1 -0
- package/dist/observer/allowlist.d.ts +32 -0
- package/dist/observer/allowlist.d.ts.map +1 -0
- package/dist/observer/bus-translate.d.ts +33 -0
- package/dist/observer/bus-translate.d.ts.map +1 -0
- package/dist/observer/index.d.ts +44 -0
- package/dist/observer/index.d.ts.map +1 -0
- package/dist/observer/queue.d.ts +63 -0
- package/dist/observer/queue.d.ts.map +1 -0
- package/dist/observer/transport.d.ts +27 -0
- package/dist/observer/transport.d.ts.map +1 -0
- package/dist/observer/wire.d.ts +54 -0
- package/dist/observer/wire.d.ts.map +1 -0
- package/dist/observer/wire.test.d.ts +2 -0
- package/dist/observer/wire.test.d.ts.map +1 -0
- package/dist/personas.d.ts +30 -0
- package/dist/personas.d.ts.map +1 -0
- package/dist/runtime-lit.d.ts +8 -0
- package/dist/runtime-lit.d.ts.map +1 -0
- package/dist/runtime.d.ts +63 -5
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +4439 -28
- package/dist/runtime.js.map +7 -0
- package/dist/schema.d.ts +3688 -11
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +578 -30
- package/dist/schema.js.map +7 -0
- package/dist/support-chat/__tests__/lc-fetch-stub.d.ts +52 -0
- package/dist/support-chat/__tests__/lc-fetch-stub.d.ts.map +1 -0
- package/dist/support-chat/boot.d.ts +47 -0
- package/dist/support-chat/boot.d.ts.map +1 -0
- package/dist/support-chat/boot.test.d.ts +2 -0
- package/dist/support-chat/boot.test.d.ts.map +1 -0
- package/dist/support-chat/crisp.d.ts +4 -0
- package/dist/support-chat/crisp.d.ts.map +1 -0
- package/dist/support-chat/crisp.test.d.ts +2 -0
- package/dist/support-chat/crisp.test.d.ts.map +1 -0
- package/dist/support-chat/inbox.d.ts +57 -0
- package/dist/support-chat/inbox.d.ts.map +1 -0
- package/dist/support-chat/inbox.test.d.ts +2 -0
- package/dist/support-chat/inbox.test.d.ts.map +1 -0
- package/dist/support-chat/leadconnector.d.ts +13 -0
- package/dist/support-chat/leadconnector.d.ts.map +1 -0
- package/dist/support-chat/leadconnector.test.d.ts +2 -0
- package/dist/support-chat/leadconnector.test.d.ts.map +1 -0
- package/dist/support-chat/registry.d.ts +5 -0
- package/dist/support-chat/registry.d.ts.map +1 -0
- package/dist/support-chat/registry.test.d.ts +2 -0
- package/dist/support-chat/registry.test.d.ts.map +1 -0
- package/dist/support-chat/schema-widgetid.test.d.ts +2 -0
- package/dist/support-chat/schema-widgetid.test.d.ts.map +1 -0
- package/dist/support-chat/types.d.ts +19 -0
- package/dist/support-chat/types.d.ts.map +1 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/types.d.ts +89 -40
- package/dist/types.d.ts.map +1 -1
- package/package.json +49 -24
- package/dist/ChatAssistant.d.ts +0 -18
- package/dist/ChatAssistant.d.ts.map +0 -1
- package/dist/ChatAssistant.js +0 -178
- package/dist/SyntroChatbot.d.ts +0 -14
- package/dist/SyntroChatbot.d.ts.map +0 -1
- package/dist/SyntroChatbot.js +0 -56
- package/dist/actionParser.d.ts +0 -15
- package/dist/actionParser.d.ts.map +0 -1
- package/dist/actionParser.js +0 -52
- package/dist/apiClient.d.ts +0 -23
- package/dist/apiClient.d.ts.map +0 -1
- package/dist/apiClient.js +0 -51
- package/dist/cdn.js +0 -37
- package/dist/editor.d.ts +0 -17
- package/dist/editor.d.ts.map +0 -1
- package/dist/editor.js +0 -36
- package/dist/tools/bridge.d.ts +0 -26
- package/dist/tools/bridge.d.ts.map +0 -1
- package/dist/tools/bridge.js +0 -25
- package/dist/tools/expanders.d.ts +0 -17
- package/dist/tools/expanders.d.ts.map +0 -1
- package/dist/tools/expanders.js +0 -41
- package/dist/tools/index.d.ts +0 -14
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -11
- package/dist/tools/registrations/GetContextTool.d.ts +0 -7
- package/dist/tools/registrations/GetContextTool.d.ts.map +0 -1
- package/dist/tools/registrations/GetContextTool.js +0 -18
- package/dist/tools/registrations/ScrollToTool.d.ts +0 -7
- package/dist/tools/registrations/ScrollToTool.d.ts.map +0 -1
- package/dist/tools/registrations/ScrollToTool.js +0 -38
- package/dist/tools/registrations/ShowOverlayTool.d.ts +0 -7
- package/dist/tools/registrations/ShowOverlayTool.d.ts.map +0 -1
- package/dist/tools/registrations/ShowOverlayTool.js +0 -47
- package/dist/tools/registrations/index.d.ts +0 -19
- package/dist/tools/registrations/index.d.ts.map +0 -1
- package/dist/tools/registrations/index.js +0 -7
- package/dist/types.js +0 -6
- package/dist/useChat.d.ts +0 -25
- package/dist/useChat.d.ts.map +0 -1
- 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 @@
|
|
|
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,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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAyB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK/D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAE9C,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ;;mDAE+C;IAC/C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;sDACkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;iFAC6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,YAAY,CAAC;IACtB;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QACjE;;;;;;WAMG;QACH,SAAS,CAAC,EAAE;YACV,CACE,MAAM,EAAE;gBAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;aAAE,EAC5B,OAAO,EAAE,CAAC,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;aAAE,KAAK,IAAI,GAC1E,MAAM,IAAI,CAAC;YACd,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;aAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;SAC3F,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAChC,iEAAiE;IACjE,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAClD;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAChE;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAwDD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0C;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IACnE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAA6C;IACjF,yEAAyE;IACzE,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,kBAAkB,CAAC,CAAa;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B;4EACwE;IACxE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;gBAE5C,OAAO,EAAE,2BAA2B;IAYhD;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAqChC,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,YAAY;IAepB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAIlD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIxC,eAAe,IAAI,WAAW,CAAC,MAAM,CAAC;IAItC,iFAAiF;IACjF,gBAAgB,IAAI,KAAK,CACrB;QACE,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GACD;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAC7F;IA8DD;;;;;;OAMG;IACH,iBAAiB,IAAI,YAAY,EAAE;IAkBnC,sFAAsF;IACtF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAoBlC;;;;;;;;OAQG;IACG,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAI1C,kBAAkB;IAkEhC;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;OAIG;IACG,KAAK,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,eAAe,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;YAI3D,gBAAgB;IAsB9B,uDAAuD;IACvD,YAAY,IAAI,cAAc,EAAE;IAIhC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI5D,qFAAqF;IAC/E,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAuDzE,6EAA6E;IAC7E,OAAO,CAAC,OAAO,UAAQ,GAAG,IAAI;IAqB9B;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;YAwB5C,oBAAoB;YAkBpB,SAAS;YA6IT,MAAM;IAyBpB,OAAO,CAAC,IAAI;CAUb"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"ElementSessionController.test.d.ts","sourceRoot":"","sources":["../../src/elements/ElementSessionController.test.ts"],"names":[],"mappings":""}
|