@123toto/ai-app-assistant-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,352 @@
1
+ import { AiDocsSettingsController, createAiDocsSettingsClient } from "./settings.js";
2
+ const HTMLElementBase = typeof HTMLElement === "undefined"
3
+ ? class {
4
+ }
5
+ : HTMLElement;
6
+ /** Optional framework-independent settings screen for the managed server API. */
7
+ export class AiDocsSettingsElement extends HTMLElementBase {
8
+ static observedAttributes = ["endpoint", "open", "title"];
9
+ #root = this.attachShadow({ mode: "open" });
10
+ #config = {};
11
+ #controller;
12
+ #unsubscribe;
13
+ #snapshot;
14
+ #initializedEndpoint = "";
15
+ #configurationIdentity;
16
+ #draft;
17
+ #hasOpened = false;
18
+ connectedCallback() {
19
+ this.setAttribute("data-ai-docs-ui", "");
20
+ this.applyTheme();
21
+ this.#root.addEventListener("click", this.onClick);
22
+ this.#root.addEventListener("submit", this.onSubmit);
23
+ this.#root.addEventListener("change", this.onChange);
24
+ void this.initialize();
25
+ }
26
+ disconnectedCallback() {
27
+ this.#root.removeEventListener("click", this.onClick);
28
+ this.#root.removeEventListener("submit", this.onSubmit);
29
+ this.#root.removeEventListener("change", this.onChange);
30
+ this.#unsubscribe?.();
31
+ }
32
+ attributeChangedCallback() {
33
+ if (this.isConnected)
34
+ void this.initialize();
35
+ }
36
+ /** Supplies dynamic authorization headers without coupling to a framework. */
37
+ configure(config) {
38
+ this.#config = { ...this.#config, ...config };
39
+ this.applyTheme();
40
+ if (this.isConnected)
41
+ void this.initialize(true);
42
+ }
43
+ show() {
44
+ const refresh = this.#hasOpened;
45
+ this.#hasOpened = true;
46
+ this.setAttribute("open", "");
47
+ // Administration data may have changed since the previous opening.
48
+ if (refresh)
49
+ void this.initialize(true);
50
+ }
51
+ close() { this.removeAttribute("open"); }
52
+ /** Rebuilds transport only when needed, then reloads the safe admin snapshot. */
53
+ async initialize(force = false) {
54
+ const endpoint = this.#config.endpoint ?? this.getAttribute("endpoint") ?? "";
55
+ if (!endpoint) {
56
+ this.#root.innerHTML = `<style>${STYLES}</style><p class="error">Missing AI Docs endpoint.</p>`;
57
+ return;
58
+ }
59
+ if (!force && endpoint === this.#initializedEndpoint && this.#controller) {
60
+ this.render();
61
+ return;
62
+ }
63
+ this.#initializedEndpoint = endpoint;
64
+ this.#unsubscribe?.();
65
+ this.#controller = new AiDocsSettingsController(this.#config.client ?? createAiDocsSettingsClient({
66
+ endpoint,
67
+ ...(this.#config.headers ? { headers: this.#config.headers } : {})
68
+ }));
69
+ this.#unsubscribe = this.#controller.subscribe((snapshot) => {
70
+ this.#snapshot = snapshot;
71
+ this.render();
72
+ });
73
+ try {
74
+ const snapshot = await this.#controller.initialize();
75
+ const configuration = snapshot.configuration;
76
+ const provider = snapshot.providers.find((candidate) => candidate.id === configuration?.provider);
77
+ if (configuration?.provider && provider?.supportsModelDiscovery
78
+ && (!provider.requiresApiKey || configuration.apiKeyConfigured)) {
79
+ await this.#controller.loadModels({
80
+ provider: configuration.provider,
81
+ ...(configuration.baseURL ? { baseURL: configuration.baseURL } : {})
82
+ });
83
+ }
84
+ }
85
+ catch { /* Rendered by the controller. */ }
86
+ }
87
+ render() {
88
+ this.captureDraft();
89
+ if (!this.hasAttribute("open")) {
90
+ this.#root.innerHTML = `<style>${STYLES}</style>`;
91
+ return;
92
+ }
93
+ const snapshot = this.#snapshot;
94
+ const configuration = snapshot?.configuration;
95
+ if (configuration && configuration !== this.#configurationIdentity) {
96
+ this.#configurationIdentity = configuration;
97
+ this.#draft = draftFrom(configuration);
98
+ }
99
+ const busy = snapshot ? !["idle", "ready", "error"].includes(snapshot.status) : true;
100
+ const connectionStatus = configuration?.connection.status;
101
+ const connectionBadge = !configuration || snapshot?.status === "loading" || connectionStatus === "unchecked"
102
+ ? "<b class=checking>Checking…</b>"
103
+ : connectionStatus === "connected"
104
+ ? "<b class=connected>Connected</b>"
105
+ : "<b class=disconnected>Not connected</b>";
106
+ const manual = configuration && ["provider", "model", "apiKey", "baseURL"]
107
+ .some((field) => configuration.fieldSources[field] === "override");
108
+ this.#root.innerHTML = `<style>${STYLES}</style><div class="backdrop" data-action="close"></div>
109
+ <section class="modal" role="dialog" aria-modal="true" aria-label="${escapeHtml(this.resolvedTitle)}">
110
+ <header><div><h2>${escapeHtml(this.resolvedTitle)}</h2><span class="badges">${manual ? "<b class=manual>Manual</b>" : configuration?.configured ? "<b class=auto>Auto</b>" : ""}${connectionBadge}</span></div><button data-action="close" aria-label="Close">×</button></header>
111
+ ${snapshot?.error ? `<p class="error">${escapeHtml(snapshot.error.message)}</p>` : ""}
112
+ ${configuration ? this.renderForm(snapshot, configuration, busy) : `<div class="loading">Loading…</div>`}
113
+ </section>`;
114
+ }
115
+ renderForm(snapshot, configuration, busy) {
116
+ const draft = this.#draft ?? draftFrom(configuration);
117
+ const providerOptions = snapshot.providers.map((provider) => `<option value="${provider.id}" ${provider.id === draft.provider ? "selected" : ""}>${escapeHtml(provider.label)}</option>`).join("");
118
+ const modelOptions = snapshot.models.map((model) => `<option value="${escapeHtml(model.id)}"></option>`).join("");
119
+ const credentialsDisabled = !configuration.canManageCredentials;
120
+ const modelDisabled = !configuration.canChangeModel;
121
+ const roleOptions = includeSelectedChoices(snapshot.options.roles, draft.roleIds);
122
+ const userOptions = includeSelectedChoices(snapshot.options.users, draft.userIds);
123
+ const history = configuration.administration?.history.slice().reverse().map((entry) => `<li><strong>${escapeHtml(entry.actor.label)}</strong><time>${escapeHtml(new Date(entry.changedAt).toLocaleString())}</time><span>${entry.changes.map(describeAuditChange).map(escapeHtml).join(" · ")}</span></li>`).join("") ?? "";
124
+ return `<form>
125
+ <fieldset ${busy ? "disabled" : ""}><legend>Connection</legend>
126
+ <label>Provider<select name="provider" required ${credentialsDisabled ? "disabled" : ""}><option value="">Select…</option>${providerOptions}</select></label>
127
+ <label>API key<input name="apiKey" type="password" autocomplete="new-password" value="${escapeHtml(draft.apiKey)}" placeholder="${configuration.apiKeyConfigured ? "Already provided — enter a new key to replace it" : "Enter API key"}" ${credentialsDisabled ? "disabled" : ""}></label>
128
+ <label>Model<input name="model" required list="ai-docs-models" value="${escapeHtml(draft.model)}" autocomplete="off" ${modelDisabled ? "disabled" : ""}><datalist id="ai-docs-models">${modelOptions}</datalist></label>
129
+ <label>Base URL (optional)<input name="baseURL" type="url" value="${escapeHtml(draft.baseURL)}" placeholder="https://…" ${credentialsDisabled ? "disabled" : ""}></label>
130
+ <button type="button" data-action="models" ${modelDisabled ? "disabled" : ""}>Load models</button>
131
+ <button type="button" data-action="test" ${credentialsDisabled && modelDisabled ? "disabled" : ""}>Test connection</button>
132
+ ${snapshot.connectionTest ? `<small class="test ${snapshot.connectionTest.success ? "ok" : "ko"}">${snapshot.connectionTest.success ? "Connection successful" : escapeHtml(snapshot.connectionTest.error.message)}</small>` : ""}
133
+ </fieldset>
134
+ <fieldset ${busy ? "disabled" : ""}><legend>Usage</legend>
135
+ <label>Who can use it?<select name="accessMode" ${snapshot.optionsAvailable ? "" : "disabled"}><option value="all" ${draft.accessMode === "all" ? "selected" : ""}>Everyone</option><option value="roles" ${draft.accessMode === "roles" ? "selected" : ""}>Selected roles</option><option value="users" ${draft.accessMode === "users" ? "selected" : ""}>Selected users</option></select></label>
136
+ <label data-access-values="roles" ${draft.accessMode === "roles" ? "" : "hidden"}>Allowed roles<select name="roleIds" multiple ${snapshot.optionsAvailable ? "" : "disabled"}>${roleOptions.map((choice) => `<option value="${escapeHtml(choice.id)}" ${draft.roleIds.includes(choice.id) ? "selected" : ""}>${escapeHtml(choice.label)}</option>`).join("")}</select></label>
137
+ <label data-access-values="users" ${draft.accessMode === "users" ? "" : "hidden"}>Allowed users<select name="userIds" multiple ${snapshot.optionsAvailable ? "" : "disabled"}>${userOptions.map((choice) => `<option value="${escapeHtml(choice.id)}" ${draft.userIds.includes(choice.id) ? "selected" : ""}>${escapeHtml(choice.label)}</option>`).join("")}</select></label>
138
+ ${snapshot.optionsAvailable ? "" : "<small class=hint>Access rules are managed by the host application.</small>"}
139
+ <div class="row"><label>Questions / period<input name="maxRequests" type="number" min="1" max="10000" value="${draft.maxRequests}"></label><label>Period (hours)<input name="windowHours" type="number" min="1" max="8760" value="${draft.windowHours}"></label></div>
140
+ <label>Questions / conversation<input name="maxConversationTurns" type="number" min="1" max="10" value="${draft.maxConversationTurns}"></label>
141
+ ${configuration.canManageModelPolicy ? `<label class="check"><input name="allowModelChangesByOthers" type="checkbox" ${draft.allowModelChangesByOthers ? "checked" : ""}>Allow other administrators to change the model</label>` : ""}
142
+ </fieldset>
143
+ ${history ? `<details><summary>Change history</summary><ol class="history">${history}</ol></details>` : ""}
144
+ <footer>${configuration.canRevokeApiKey ? `<button type="button" class="danger" data-action="revoke">Revoke API key</button>` : "<span></span>"}<button type="submit" class="primary" ${busy ? "disabled" : ""}>Save</button></footer>
145
+ </form>`;
146
+ }
147
+ get resolvedTitle() {
148
+ return this.#config.title ?? this.getAttribute("title") ?? "AI assistant settings";
149
+ }
150
+ onClick = (event) => {
151
+ const action = event.target?.closest("[data-action]")?.dataset["action"];
152
+ if (action === "close")
153
+ this.close();
154
+ else if (action === "models")
155
+ void this.loadModels();
156
+ else if (action === "test")
157
+ void this.testConnection();
158
+ else if (action === "revoke")
159
+ void this.revoke();
160
+ };
161
+ onSubmit = (event) => {
162
+ event.preventDefault();
163
+ void this.save();
164
+ };
165
+ onChange = (event) => {
166
+ const select = event.target;
167
+ if (!(select instanceof HTMLSelectElement) || select.name !== "accessMode")
168
+ return;
169
+ for (const element of this.#root.querySelectorAll("[data-access-values]")) {
170
+ element.hidden = element.dataset["accessValues"] !== select.value;
171
+ }
172
+ };
173
+ form() { return this.#root.querySelector("form"); }
174
+ /** Keeps unsaved values across controller status renders. */
175
+ captureDraft() {
176
+ const form = this.form();
177
+ if (!form || !this.#draft)
178
+ return;
179
+ const data = new FormData(form);
180
+ this.#draft = {
181
+ provider: valueOrDisabled(form, data, "provider", this.#draft.provider),
182
+ apiKey: valueOrDisabled(form, data, "apiKey", this.#draft.apiKey),
183
+ model: valueOrDisabled(form, data, "model", this.#draft.model),
184
+ baseURL: valueOrDisabled(form, data, "baseURL", this.#draft.baseURL),
185
+ accessMode: valueOrDisabled(form, data, "accessMode", this.#draft.accessMode),
186
+ roleIds: data.has("roleIds") ? data.getAll("roleIds").map(String) : this.#draft.roleIds,
187
+ userIds: data.has("userIds") ? data.getAll("userIds").map(String) : this.#draft.userIds,
188
+ maxRequests: Number(data.get("maxRequests") ?? this.#draft.maxRequests),
189
+ windowHours: Number(data.get("windowHours") ?? this.#draft.windowHours),
190
+ maxConversationTurns: Number(data.get("maxConversationTurns") ?? this.#draft.maxConversationTurns),
191
+ allowModelChangesByOthers: form.elements.namedItem("allowModelChangesByOthers")
192
+ ? data.get("allowModelChangesByOthers") === "on"
193
+ : this.#draft.allowModelChangesByOthers
194
+ };
195
+ }
196
+ connectionInput() {
197
+ const form = this.form();
198
+ const provider = formValue(form, "provider");
199
+ const model = formValue(form, "model");
200
+ const apiKey = formValue(form, "apiKey");
201
+ const baseURL = formValue(form, "baseURL");
202
+ // Omitting an empty key lets the backend reuse the protected stored key.
203
+ return { provider, model, ...(apiKey ? { apiKey } : {}), ...(baseURL ? { baseURL } : {}) };
204
+ }
205
+ async loadModels() {
206
+ try {
207
+ const { model: _model, ...credentials } = this.connectionInput();
208
+ await this.#controller?.loadModels(credentials);
209
+ }
210
+ catch { /* Rendered by controller. */ }
211
+ }
212
+ async testConnection() {
213
+ try {
214
+ await this.#controller?.test(this.connectionInput());
215
+ }
216
+ catch { /* Rendered by controller. */ }
217
+ }
218
+ async save() {
219
+ const form = this.form();
220
+ if (!form?.reportValidity())
221
+ return;
222
+ const data = new FormData(form);
223
+ const connection = this.connectionInput();
224
+ const accessMode = String(data.get("accessMode"));
225
+ const access = !this.#snapshot?.optionsAvailable && this.#snapshot?.configuration
226
+ ? this.#snapshot.configuration.access
227
+ : accessMode === "roles"
228
+ ? { mode: "roles", roles: data.getAll("roleIds").map(String) }
229
+ : accessMode === "users"
230
+ ? { mode: "users", userIds: data.getAll("userIds").map(String) }
231
+ : { mode: "all" };
232
+ const input = {
233
+ ...connection,
234
+ access,
235
+ quota: {
236
+ maxRequests: Number(data.get("maxRequests")),
237
+ windowSeconds: Number(data.get("windowHours")) * 3_600
238
+ },
239
+ maxConversationTurns: Number(data.get("maxConversationTurns")),
240
+ ...(this.#snapshot?.configuration?.canManageModelPolicy
241
+ ? { allowModelChangesByOthers: data.get("allowModelChangesByOthers") === "on" }
242
+ : {})
243
+ };
244
+ // The server reuses a recent successful test and skips provider validation
245
+ // entirely when only access, quotas or conversation limits changed.
246
+ try {
247
+ const saved = await this.#controller?.save(input);
248
+ if (saved)
249
+ this.dispatchEvent(new CustomEvent("ai-docs-settings-saved", { bubbles: true, composed: true }));
250
+ }
251
+ catch { /* Rendered by controller. */ }
252
+ }
253
+ async revoke() {
254
+ const confirmed = await (this.#config.confirmRevoke?.() ??
255
+ (typeof globalThis.confirm === "function"
256
+ ? globalThis.confirm("Revoke the current API key?")
257
+ : false));
258
+ if (!confirmed)
259
+ return;
260
+ try {
261
+ await this.#controller?.revokeApiKey();
262
+ this.dispatchEvent(new CustomEvent("ai-docs-key-revoked", { bubbles: true, composed: true }));
263
+ }
264
+ catch { /* Rendered by controller. */ }
265
+ }
266
+ applyTheme() {
267
+ const theme = this.#config.theme;
268
+ if (!theme)
269
+ return;
270
+ // Variables on the custom-element host remain visible inside Shadow DOM.
271
+ const properties = {
272
+ accent: "--ai-accent",
273
+ surface: "--ai-surface",
274
+ surfaceMuted: "--ai-muted",
275
+ text: "--ai-text",
276
+ textMuted: "--ai-text-muted",
277
+ border: "--ai-border",
278
+ danger: "--ai-danger"
279
+ };
280
+ for (const [key, property] of Object.entries(properties)) {
281
+ const value = theme[key];
282
+ if (value)
283
+ this.style.setProperty(property, value);
284
+ }
285
+ }
286
+ }
287
+ function draftFrom(configuration) {
288
+ return {
289
+ provider: configuration.provider ?? "",
290
+ apiKey: "",
291
+ model: configuration.model,
292
+ baseURL: configuration.baseURL ?? "",
293
+ accessMode: configuration.access.mode,
294
+ roleIds: configuration.access.mode === "roles" ? [...configuration.access.roles] : [],
295
+ userIds: configuration.access.mode === "users" ? [...configuration.access.userIds] : [],
296
+ maxRequests: configuration.quota?.maxRequests ?? 20,
297
+ windowHours: Math.max(1, Math.round((configuration.quota?.windowSeconds ?? 3_600) / 3_600)),
298
+ maxConversationTurns: configuration.maxConversationTurns,
299
+ allowModelChangesByOthers: configuration.allowModelChangesByOthers
300
+ };
301
+ }
302
+ function valueOrDisabled(form, data, name, fallback) {
303
+ return form.elements.namedItem(name) && !data.has(name) ? fallback : String(data.get(name) ?? fallback).trim();
304
+ }
305
+ function formValue(form, name) {
306
+ const control = form?.elements.namedItem(name);
307
+ return control && "value" in control ? String(control.value).trim() : "";
308
+ }
309
+ function includeSelectedChoices(choices, selected) {
310
+ const known = new Set(choices.map(({ id }) => id));
311
+ return [...choices, ...selected.filter((id) => !known.has(id)).map((id) => ({ id, label: id }))];
312
+ }
313
+ function describeAuditChange(change) {
314
+ if (change.field === "provider")
315
+ return change.from
316
+ ? `Provider: ${change.from} → ${change.to ?? ""}`
317
+ : `Provider set to ${change.to ?? ""}`;
318
+ if (change.field === "model")
319
+ return change.from
320
+ ? `Model: ${change.from} → ${change.to ?? ""}`
321
+ : `Model set to ${change.to ?? ""}`;
322
+ if (change.field === "apiKey")
323
+ return change.to === "revoked"
324
+ ? "API key revoked"
325
+ : change.to === "replaced" ? "API key replaced" : "API key added";
326
+ if (change.field === "access")
327
+ return "Access rules changed";
328
+ if (change.field === "quota")
329
+ return "Quota changed";
330
+ if (change.field === "conversation")
331
+ return `Questions per conversation: ${change.from ?? ""} → ${change.to ?? ""}`;
332
+ return change.to === "true"
333
+ ? "Model changes enabled for other administrators"
334
+ : "Model changes restricted to the key owner";
335
+ }
336
+ export function defineAiDocsSettingsElement(tagName = "ai-docs-settings") {
337
+ if (!customElements.get(tagName))
338
+ customElements.define(tagName, AiDocsSettingsElement);
339
+ return AiDocsSettingsElement;
340
+ }
341
+ function escapeHtml(value) {
342
+ return value.replace(/[&<>"']/g, (character) => ({
343
+ "&": "&amp;", "<": "&lt;", ">": "&gt;", "\"": "&quot;", "'": "&#039;"
344
+ })[character] ?? character);
345
+ }
346
+ const STYLES = `
347
+ :host{--ai-accent:#14745b;--ai-surface:#fff;--ai-muted:#f5f7f6;--ai-text:#1d2522;--ai-text-muted:#66716c;--ai-border:#d8e0dc;--ai-danger:#a52b2b;font:14px/1.4 system-ui,sans-serif;color:var(--ai-text)}*{box-sizing:border-box}[hidden]{display:none!important}.backdrop{position:fixed;inset:0;z-index:9100;background:#0007}.modal{position:fixed;top:50%;left:50%;z-index:9101;width:min(650px,calc(100vw - 24px));max-height:calc(100vh - 36px);overflow:auto;transform:translate(-50%,-50%);background:var(--ai-surface);border:1px solid var(--ai-border);border-radius:16px;box-shadow:0 24px 80px #0005}.modal>header{position:sticky;top:0;z-index:1;display:flex;align-items:flex-start;justify-content:space-between;padding:18px;background:var(--ai-surface);border-bottom:1px solid var(--ai-border)}h2{margin:0 0 6px;font-size:20px}button,input,select{font:inherit}.modal>header button{font-size:24px;color:var(--ai-text);background:none;border:0;cursor:pointer}.badges{display:flex;gap:6px}.badges b{padding:2px 7px;border-radius:99px;font-size:11px}.manual{color:#6335a6;background:#eee4ff}.auto{color:#176278;background:#ddf4fa}.connected{color:#196c36;background:#daf5e3}.disconnected{color:#9b2f2f;background:#ffe0df}form{padding:18px}fieldset{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:0 0 16px;padding:14px;border:1px solid var(--ai-border);border-radius:12px}legend{padding:0 6px;font-weight:700}label{display:flex;flex-direction:column;gap:5px}input,select{width:100%;min-height:38px;padding:7px 9px;color:var(--ai-text);background:var(--ai-muted);border:1px solid var(--ai-border);border-radius:8px}.check{grid-column:1/-1;flex-direction:row;align-items:center}.check input{width:auto}.row{display:grid;grid-template-columns:1fr 1fr;gap:10px}fieldset button{align-self:end;min-height:38px;color:var(--ai-accent);background:var(--ai-surface);border:1px solid var(--ai-border);border-radius:8px}.test{grid-column:1/-1}.ok{color:#196c36}.ko,.error{color:var(--ai-danger)}.error{margin:14px 18px 0;padding:10px;background:color-mix(in srgb,var(--ai-danger) 10%,var(--ai-surface));border-radius:8px}.loading{padding:30px}.history{max-height:160px;margin:10px 0;overflow:auto}.history li{display:grid;grid-template-columns:1fr auto;gap:2px 10px;padding:7px 0;border-bottom:1px solid var(--ai-border)}.history span{grid-column:1/-1;color:var(--ai-text-muted);font-size:12px}form>footer{display:flex;justify-content:space-between;margin-top:18px}.primary,.danger{padding:9px 14px;border-radius:8px}.primary{color:#fff;background:var(--ai-accent);border:0}.danger{color:var(--ai-danger);background:transparent;border:1px solid color-mix(in srgb,var(--ai-danger) 55%,var(--ai-border))}@media(max-width:580px){fieldset{grid-template-columns:1fr}}@media(prefers-color-scheme:dark){:host{--ai-surface:#1d2321;--ai-muted:#151a18;--ai-text:#edf2ef;--ai-text-muted:#aab5b0;--ai-border:#39443f}}
348
+ .checking{color:var(--ai-text-muted);background:var(--ai-muted)}
349
+ `;
350
+ if (typeof customElements !== "undefined")
351
+ defineAiDocsSettingsElement();
352
+ //# sourceMappingURL=settings-web-component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-web-component.js","sourceRoot":"","sources":["../src/settings-web-component.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAI3B,MAAM,eAAe,CAAC;AAoCvB,MAAM,eAAe,GAAuB,OAAO,WAAW,KAAK,WAAW;IAC5E,CAAC,CAAC;KAA8B;IAChC,CAAC,CAAC,WAAW,CAAC;AAEhB,iFAAiF;AACjF,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IACxD,MAAM,CAAU,kBAAkB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1D,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,OAAO,GAAyC,EAAE,CAAC;IACnD,WAAW,CAAuC;IAClD,YAAY,CAA2B;IACvC,SAAS,CAAqC;IAC9C,oBAAoB,GAAG,EAAE,CAAC;IAC1B,sBAAsB,CAA6C;IACnE,MAAM,CAAkC;IACxC,UAAU,GAAG,KAAK,CAAC;IAEZ,iBAAiB;QACtB,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;IAEM,oBAAoB;QACzB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;IACxB,CAAC;IAEM,wBAAwB;QAC7B,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;IAC/C,CAAC;IAED,8EAA8E;IACvE,SAAS,CAAC,MAAmC;QAClD,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAEM,IAAI;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,mEAAmE;QACnE,IAAI,OAAO;YAAE,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACM,KAAK,KAAW,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEtD,iFAAiF;IACzE,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,MAAM,wDAAwD,CAAC;YAChG,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACzE,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACrC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,0BAA0B,CAAC;YAChG,QAAQ;YACR,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC1D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;YAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,aAAa,EAAE,QAAQ,CAAC,CAAC;YAClG,IAAI,aAAa,EAAE,QAAQ,IAAI,QAAQ,EAAE,sBAAsB;mBAC1D,CAAC,CAAC,QAAQ,CAAC,cAAc,IAAI,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;oBAChC,QAAQ,EAAE,aAAa,CAAC,QAAQ;oBAChC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;IAC/C,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,MAAM,UAAU,CAAC;YAClD,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,MAAM,aAAa,GAAG,QAAQ,EAAE,aAAa,CAAC;QAC9C,IAAI,aAAa,IAAI,aAAa,KAAK,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACnE,IAAI,CAAC,sBAAsB,GAAG,aAAa,CAAC;YAC5C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrF,MAAM,gBAAgB,GAAG,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC;QAC1D,MAAM,eAAe,GAAG,CAAC,aAAa,IAAI,QAAQ,EAAE,MAAM,KAAK,SAAS,IAAI,gBAAgB,KAAK,WAAW;YAC1G,CAAC,CAAC,iCAAiC;YACnC,CAAC,CAAC,gBAAgB,KAAK,WAAW;gBAChC,CAAC,CAAC,kCAAkC;gBACpC,CAAC,CAAC,yCAAyC,CAAC;QAChD,MAAM,MAAM,GAAG,aAAa,IAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAW;aAClF,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,MAAM;2EACgC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;2BAC9E,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,6BAA6B,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,GAAG,eAAe;UAC/L,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,oBAAoB,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;UACnF,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,qCAAqC;iBAC/F,CAAC;IAChB,CAAC;IAEO,UAAU,CAChB,QAAgC,EAChC,aAA6C,EAC7C,IAAa;QAEb,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,eAAe,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1D,kBAAkB,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAC5H,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClH,MAAM,mBAAmB,GAAG,CAAC,aAAa,CAAC,oBAAoB,CAAC;QAChE,MAAM,aAAa,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC;QACpD,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClF,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACpF,eAAe,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,gBAAgB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CACrN,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO;kBACO,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;0DACkB,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,qCAAqC,eAAe;gGACnD,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,eAAe,KAAK,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;gFACzM,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,kCAAkC,YAAY;4EAChI,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,6BAA6B,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;qDAClH,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;mDACjC,mBAAmB,IAAI,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;UAC/F,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;kBAEtN,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;0DACkB,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,wBAAwB,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,2CAA2C,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,iDAAiD,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;4CACrT,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,iDAAiD,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;4CACxT,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,iDAAiD,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;UAC1V,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,6EAA6E;uHACD,KAAK,CAAC,WAAW,oGAAoG,KAAK,CAAC,WAAW;kHAC3I,KAAK,CAAC,oBAAoB;UAClI,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,gFAAgF,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,yDAAyD,CAAC,CAAC,CAAC,EAAE;;QAErO,OAAO,CAAC,CAAC,CAAC,iEAAiE,OAAO,iBAAiB,CAAC,CAAC,CAAC,EAAE;gBAChG,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,mFAAmF,CAAC,CAAC,CAAC,eAAe,yCAAyC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;YACxM,CAAC;IACX,CAAC;IAED,IAAY,aAAa;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,uBAAuB,CAAC;IACrF,CAAC;IAEgB,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;QAChD,MAAM,MAAM,GAAI,KAAK,CAAC,MAAyB,EAAE,OAAO,CAAc,eAAe,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1G,IAAI,MAAM,KAAK,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;aAChC,IAAI,MAAM,KAAK,QAAQ;YAAE,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;aAChD,IAAI,MAAM,KAAK,MAAM;YAAE,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;aAClD,IAAI,MAAM,KAAK,QAAQ;YAAE,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC,CAAC;IAEe,QAAQ,GAAG,CAAC,KAAY,EAAQ,EAAE;QACjD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC,CAAC;IAEe,QAAQ,GAAG,CAAC,KAAY,EAAQ,EAAE;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,CAAC,MAAM,YAAY,iBAAiB,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO;QACnF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAc,sBAAsB,CAAC,EAAE,CAAC;YACvF,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;QACpE,CAAC;IACH,CAAC,CAAC;IAEM,IAAI,KAA6B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEnF,6DAA6D;IACrD,YAAY;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAClC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQ,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACvE,MAAM,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACjE,KAAK,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAC9D,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YACpE,UAAU,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAA6B;YACzG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YACvF,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YACvF,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YACvE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YACvE,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAClG,yBAAyB,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,2BAA2B,CAAC;gBAC7E,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,KAAK,IAAI;gBAChD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB;SAC1C,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,UAAU,CAAmB,CAAC;QAC/D,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3C,yEAAyE;QACzE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC7F,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACjE,MAAM,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IACvG,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE;YAAE,OAAO;QACpC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,IAAI,IAAI,CAAC,SAAS,EAAE,aAAa;YACjG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM;YACrC,CAAC,CAAC,UAAU,KAAK,OAAO;gBACtB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBAC9D,CAAC,CAAC,UAAU,KAAK,OAAO;oBACtB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;oBAChE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACxB,MAAM,KAAK,GAA6B;YACtC,GAAG,UAAU;YACb,MAAM;YACN,KAAK,EAAE;gBACL,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBAC5C,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,KAAK;aACvD;YACD,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAC9D,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,oBAAoB;gBACrD,CAAC,CAAC,EAAE,yBAAyB,EAAE,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,KAAK,IAAI,EAAE;gBAC/E,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QACF,2EAA2E;QAC3E,oEAAoE;QACpE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,KAAK;gBAAE,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9G,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE;YACrD,CAAC,OAAO,UAAU,CAAC,OAAO,KAAK,UAAU;gBACvC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,6BAA6B,CAAC;gBACnD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACd,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChG,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IAC3C,CAAC;IAEO,UAAU;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,yEAAyE;QACzE,MAAM,UAAU,GAA8C;YAC5D,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,cAAc;YACvB,YAAY,EAAE,YAAY;YAC1B,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,aAAa;SACtB,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAA+C,EAAE,CAAC;YACvG,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,KAAK;gBAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;;AAGH,SAAS,SAAS,CAAC,aAA6C;IAC9D,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,QAAQ,IAAI,EAAE;QACtC,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,aAAa,CAAC,KAAK;QAC1B,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,EAAE;QACpC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI;QACrC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QACrF,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACvF,WAAW,EAAE,aAAa,CAAC,KAAK,EAAE,WAAW,IAAI,EAAE;QACnD,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;QAC3F,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;QACxD,yBAAyB,EAAE,aAAa,CAAC,yBAAyB;KACnE,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,IAAqB,EACrB,IAAc,EACd,IAAY,EACZ,QAAgB;IAEhB,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AACjH,CAAC;AAED,SAAS,SAAS,CAAC,IAA4B,EAAE,IAAY;IAC3D,MAAM,OAAO,GAAG,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAA6C,EAC7C,QAAkB;IAElB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,mBAAmB,CAAC,MAI5B;IACC,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC,IAAI;YACjD,CAAC,CAAC,aAAa,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;YACjD,CAAC,CAAC,mBAAmB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;IACzC,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC,IAAI;YAC9C,CAAC,CAAC,UAAU,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;YAC9C,CAAC,CAAC,gBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;IACtC,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,EAAE,KAAK,SAAS;YAC3D,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC;IACpE,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,sBAAsB,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,eAAe,CAAC;IACrD,IAAI,MAAM,CAAC,KAAK,KAAK,cAAc;QAAE,OAAO,+BAA+B,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;IACpH,OAAO,MAAM,CAAC,EAAE,KAAK,MAAM;QACzB,CAAC,CAAC,gDAAgD;QAClD,CAAC,CAAC,2CAA2C,CAAC;AAClD,CAAC;AAMD,MAAM,UAAU,2BAA2B,CAAC,OAAO,GAAG,kBAAkB;IACtE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACxF,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ;KACtE,CAAC,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,MAAM,GAAG;;;CAGd,CAAC;AAEF,IAAI,OAAO,cAAc,KAAK,WAAW;IAAE,2BAA2B,EAAE,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { AiDocsConfigurationInput, AiDocsConfigurationOptions, AiDocsAccessView, AiDocsConnectionResult, AiDocsConnectionTestInput, AiDocsCredentials, AiDocsManagedConfigurationView, AiDocsModelInfoContract, AiDocsProviderInfoContract } from "@123toto/ai-app-assistant-contracts";
2
+ export interface AiDocsSettingsClientOptions {
3
+ /** Base endpoint, for example `/api/ai-docs`. */
4
+ endpoint: string;
5
+ fetch?: typeof globalThis.fetch;
6
+ headers?: () => HeadersInit | Promise<HeadersInit>;
7
+ }
8
+ export interface AiDocsSettingsClient {
9
+ getAccess(): Promise<AiDocsAccessView>;
10
+ getConfiguration(): Promise<AiDocsManagedConfigurationView>;
11
+ getOptions(): Promise<AiDocsConfigurationOptions>;
12
+ listProviders(): Promise<AiDocsProviderInfoContract[]>;
13
+ listModels(input: AiDocsCredentials): Promise<AiDocsModelInfoContract[]>;
14
+ testConnection(input: AiDocsConnectionTestInput): Promise<AiDocsConnectionResult>;
15
+ save(input: AiDocsConfigurationInput): Promise<{
16
+ saved: boolean;
17
+ connection: AiDocsConnectionResult;
18
+ configuration?: AiDocsManagedConfigurationView | undefined;
19
+ }>;
20
+ revokeApiKey(): Promise<AiDocsManagedConfigurationView>;
21
+ }
22
+ /** Small framework-neutral client for the optional managed settings API. */
23
+ export declare function createAiDocsSettingsClient(options: AiDocsSettingsClientOptions): AiDocsSettingsClient;
24
+ export interface AiDocsSettingsSnapshot {
25
+ status: "idle" | "loading" | "ready" | "saving" | "testing" | "loading-models" | "error";
26
+ configuration?: AiDocsManagedConfigurationView;
27
+ providers: readonly AiDocsProviderInfoContract[];
28
+ models: readonly AiDocsModelInfoContract[];
29
+ options: AiDocsConfigurationOptions;
30
+ /** False when the host deliberately exposes no role/user directory adapter. */
31
+ optionsAvailable: boolean;
32
+ connectionTest?: AiDocsConnectionResult;
33
+ error?: Error | undefined;
34
+ }
35
+ export type AiDocsSettingsListener = (snapshot: AiDocsSettingsSnapshot) => void;
36
+ /** Reusable state controller for Angular, React, Vue or a custom settings page. */
37
+ export declare class AiDocsSettingsController {
38
+ #private;
39
+ readonly client: AiDocsSettingsClient;
40
+ constructor(client: AiDocsSettingsClient);
41
+ get snapshot(): AiDocsSettingsSnapshot;
42
+ subscribe(listener: AiDocsSettingsListener): () => void;
43
+ /** Loads all non-secret values required by a settings screen. */
44
+ initialize(): Promise<AiDocsSettingsSnapshot>;
45
+ /** Loads provider models; the configured secret can stay server-side. */
46
+ loadModels(input: AiDocsCredentials): Promise<readonly AiDocsModelInfoContract[]>;
47
+ /** Tests a draft connection without persisting it. */
48
+ test(input: AiDocsConnectionTestInput): Promise<AiDocsConnectionResult>;
49
+ /** Persists only when the server accepts any connection-sensitive changes. */
50
+ save(input: AiDocsConfigurationInput): Promise<boolean>;
51
+ /** Revokes the stored secret and refreshes the safe configuration snapshot. */
52
+ revokeApiKey(): Promise<void>;
53
+ private update;
54
+ private fail;
55
+ }
56
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,iBAAiB,EACjB,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,qCAAqC,CAAC;AAY7C,MAAM,WAAW,2BAA2B;IAC1C,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC,gBAAgB,IAAI,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC5D,UAAU,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAClD,aAAa,IAAI,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAAC;IACvD,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;IACzE,cAAc,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClF,IAAI,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC;QAC7C,KAAK,EAAE,OAAO,CAAC;QACf,UAAU,EAAE,sBAAsB,CAAC;QACnC,aAAa,CAAC,EAAE,8BAA8B,GAAG,SAAS,CAAC;KAC5D,CAAC,CAAC;IACH,YAAY,IAAI,OAAO,CAAC,8BAA8B,CAAC,CAAC;CACzD;AAED,4EAA4E;AAC5E,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,2BAA2B,GAAG,oBAAoB,CA4CrG;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzF,aAAa,CAAC,EAAE,8BAA8B,CAAC;IAC/C,SAAS,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACjD,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC3C,OAAO,EAAE,0BAA0B,CAAC;IACpC,+EAA+E;IAC/E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;AAEhF,mFAAmF;AACnF,qBAAa,wBAAwB;;IAUhB,QAAQ,CAAC,MAAM,EAAE,oBAAoB;gBAA5B,MAAM,EAAE,oBAAoB;IAExD,IAAW,QAAQ,IAAI,sBAAsB,CAU5C;IAEM,SAAS,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAM9D,iEAAiE;IACpD,UAAU,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAwB1D,yEAAyE;IAC5D,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC;IAW9F,sDAAsD;IACzC,IAAI,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAWpF,8EAA8E;IACjE,IAAI,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBpE,+EAA+E;IAClE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAU1C,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,IAAI;CAKb"}
@@ -0,0 +1,164 @@
1
+ import { aiDocsConfigurationOptionsSchema, aiDocsAccessViewSchema, aiDocsConfigurationSaveResultSchema, aiDocsConnectionResultSchema, aiDocsManagedConfigurationViewSchema, aiDocsModelInfoSchema, aiDocsProviderInfoSchema } from "@123toto/ai-app-assistant-contracts";
2
+ import { AiDocsHttpError } from "./client.js";
3
+ /** Small framework-neutral client for the optional managed settings API. */
4
+ export function createAiDocsSettingsClient(options) {
5
+ const fetchImplementation = options.fetch ?? globalThis.fetch;
6
+ if (!fetchImplementation)
7
+ throw new Error("A fetch implementation is required.");
8
+ const endpoint = options.endpoint.replace(/\/+$/, "");
9
+ const request = async (path, schema, init = {}) => {
10
+ const headers = await options.headers?.();
11
+ const response = await fetchImplementation(`${endpoint}${path}`, {
12
+ credentials: "same-origin",
13
+ ...init,
14
+ headers: {
15
+ ...(init.body ? { "content-type": "application/json" } : {}),
16
+ ...headers,
17
+ ...init.headers
18
+ }
19
+ });
20
+ if (!response.ok)
21
+ throw new AiDocsHttpError(response.status, await response.text());
22
+ return schema.parse(await response.json());
23
+ };
24
+ return {
25
+ getAccess: () => request("/access", aiDocsAccessViewSchema),
26
+ getConfiguration: () => request("/configuration", aiDocsManagedConfigurationViewSchema),
27
+ getOptions: () => request("/configuration/options", aiDocsConfigurationOptionsSchema),
28
+ listProviders: () => request("/providers", aiDocsProviderInfoSchema.array()),
29
+ listModels: (input) => request("/models", aiDocsModelInfoSchema.array(), {
30
+ method: "POST",
31
+ body: JSON.stringify(input)
32
+ }),
33
+ testConnection: (input) => request("/configuration/test", aiDocsConnectionResultSchema, {
34
+ method: "POST",
35
+ body: JSON.stringify(input)
36
+ }),
37
+ save: (input) => request("/configuration", aiDocsConfigurationSaveResultSchema, {
38
+ method: "PUT",
39
+ body: JSON.stringify(input)
40
+ }),
41
+ revokeApiKey: () => request("/configuration/api-key", aiDocsManagedConfigurationViewSchema, {
42
+ method: "DELETE"
43
+ })
44
+ };
45
+ }
46
+ /** Reusable state controller for Angular, React, Vue or a custom settings page. */
47
+ export class AiDocsSettingsController {
48
+ client;
49
+ #snapshot = {
50
+ status: "idle",
51
+ providers: [],
52
+ models: [],
53
+ options: { roles: [], users: [] },
54
+ optionsAvailable: false
55
+ };
56
+ #listeners = new Set();
57
+ constructor(client) {
58
+ this.client = client;
59
+ }
60
+ get snapshot() {
61
+ return {
62
+ ...this.#snapshot,
63
+ providers: [...this.#snapshot.providers],
64
+ models: [...this.#snapshot.models],
65
+ options: {
66
+ roles: [...this.#snapshot.options.roles],
67
+ users: [...this.#snapshot.options.users]
68
+ }
69
+ };
70
+ }
71
+ subscribe(listener) {
72
+ this.#listeners.add(listener);
73
+ listener(this.snapshot);
74
+ return () => this.#listeners.delete(listener);
75
+ }
76
+ /** Loads all non-secret values required by a settings screen. */
77
+ async initialize() {
78
+ this.update({ status: "loading", error: undefined });
79
+ try {
80
+ const [configuration, providers, directory] = await Promise.all([
81
+ this.client.getConfiguration(),
82
+ this.client.listProviders(),
83
+ this.client.getOptions()
84
+ .then((value) => ({ value, available: true }))
85
+ .catch(() => ({ value: { roles: [], users: [] }, available: false }))
86
+ ]);
87
+ this.update({
88
+ status: "ready",
89
+ configuration,
90
+ providers,
91
+ options: directory.value,
92
+ optionsAvailable: directory.available,
93
+ error: undefined
94
+ });
95
+ return this.snapshot;
96
+ }
97
+ catch (error) {
98
+ throw this.fail(error);
99
+ }
100
+ }
101
+ /** Loads provider models; the configured secret can stay server-side. */
102
+ async loadModels(input) {
103
+ this.update({ status: "loading-models", error: undefined });
104
+ try {
105
+ const models = await this.client.listModels(input);
106
+ this.update({ status: "ready", models, error: undefined });
107
+ return models;
108
+ }
109
+ catch (error) {
110
+ throw this.fail(error);
111
+ }
112
+ }
113
+ /** Tests a draft connection without persisting it. */
114
+ async test(input) {
115
+ this.update({ status: "testing", error: undefined });
116
+ try {
117
+ const connectionTest = await this.client.testConnection(input);
118
+ this.update({ status: "ready", connectionTest, error: undefined });
119
+ return connectionTest;
120
+ }
121
+ catch (error) {
122
+ throw this.fail(error);
123
+ }
124
+ }
125
+ /** Persists only when the server accepts any connection-sensitive changes. */
126
+ async save(input) {
127
+ this.update({ status: "saving", error: undefined });
128
+ try {
129
+ const result = await this.client.save(input);
130
+ this.update({
131
+ status: "ready",
132
+ ...(result.configuration ? { configuration: result.configuration } : {}),
133
+ connectionTest: result.connection,
134
+ error: undefined
135
+ });
136
+ return result.saved;
137
+ }
138
+ catch (error) {
139
+ throw this.fail(error);
140
+ }
141
+ }
142
+ /** Revokes the stored secret and refreshes the safe configuration snapshot. */
143
+ async revokeApiKey() {
144
+ this.update({ status: "saving", error: undefined });
145
+ try {
146
+ const configuration = await this.client.revokeApiKey();
147
+ this.update({ status: "ready", configuration, models: [], error: undefined });
148
+ }
149
+ catch (error) {
150
+ throw this.fail(error);
151
+ }
152
+ }
153
+ update(patch) {
154
+ this.#snapshot = { ...this.#snapshot, ...patch };
155
+ for (const listener of this.#listeners)
156
+ listener(this.snapshot);
157
+ }
158
+ fail(error) {
159
+ const normalized = error instanceof Error ? error : new Error(String(error));
160
+ this.update({ status: "error", error: normalized });
161
+ return normalized;
162
+ }
163
+ }
164
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}