@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.
- package/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/angular.d.ts +185 -0
- package/dist/angular.d.ts.map +1 -0
- package/dist/angular.js +715 -0
- package/dist/angular.js.map +1 -0
- package/dist/capture.d.ts +24 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +123 -0
- package/dist/capture.js.map +1 -0
- package/dist/client.d.ts +46 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +124 -0
- package/dist/client.js.map +1 -0
- package/dist/controller.d.ts +108 -0
- package/dist/controller.d.ts.map +1 -0
- package/dist/controller.js +341 -0
- package/dist/controller.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/picker.d.ts +14 -0
- package/dist/picker.d.ts.map +1 -0
- package/dist/picker.js +140 -0
- package/dist/picker.js.map +1 -0
- package/dist/settings-web-component.d.ts +57 -0
- package/dist/settings-web-component.d.ts.map +1 -0
- package/dist/settings-web-component.js +352 -0
- package/dist/settings-web-component.js.map +1 -0
- package/dist/settings.d.ts +56 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +164 -0
- package/dist/settings.js.map +1 -0
- package/dist/web-component.d.ts +49 -0
- package/dist/web-component.d.ts.map +1 -0
- package/dist/web-component.js +305 -0
- package/dist/web-component.js.map +1 -0
- package/package.json +89 -0
|
@@ -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
|
+
"&": "&", "<": "<", ">": ">", "\"": """, "'": "'"
|
|
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":"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"}
|
|
@@ -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"}
|
package/dist/settings.js
ADDED
|
@@ -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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"}
|