@songsid/agend 2.1.6-beta.6 → 2.1.6-beta.7
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/channel/adapters/discord.d.ts +14 -0
- package/dist/channel/adapters/discord.js +59 -1
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +6 -0
- package/dist/channel/adapters/telegram.js +36 -0
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/types.d.ts +18 -0
- package/dist/config-validator.js +3 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/connection-secrets.d.ts +96 -0
- package/dist/connection-secrets.js +25 -0
- package/dist/connection-secrets.js.map +1 -0
- package/dist/daemon.d.ts +29 -0
- package/dist/daemon.js +145 -77
- package/dist/daemon.js.map +1 -1
- package/dist/fleet-manager.d.ts +171 -0
- package/dist/fleet-manager.js +954 -5
- package/dist/fleet-manager.js.map +1 -1
- package/dist/provider-probe.d.ts +3 -0
- package/dist/provider-probe.js +12 -2
- package/dist/provider-probe.js.map +1 -1
- package/dist/provider-secret-registry.d.ts +98 -0
- package/dist/provider-secret-registry.js +334 -0
- package/dist/provider-secret-registry.js.map +1 -0
- package/dist/quickstart-api.d.ts +1 -1
- package/dist/quickstart-api.js +14 -4
- package/dist/quickstart-api.js.map +1 -1
- package/dist/secret-store.d.ts +25 -0
- package/dist/secret-store.js +165 -0
- package/dist/secret-store.js.map +1 -0
- package/dist/settings-api.d.ts +101 -0
- package/dist/settings-api.js +404 -4
- package/dist/settings-api.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/ui/settings.html +171 -6
- package/dist/usage/usage-api.d.ts +12 -0
- package/dist/usage/usage-api.js +39 -0
- package/dist/usage/usage-api.js.map +1 -1
- package/package.json +1 -1
package/dist/ui/settings.html
CHANGED
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
button.danger:hover { background: #fef2f2; }
|
|
50
50
|
button.sm { padding: 4px 9px; font-size: 12px; }
|
|
51
51
|
label { display: block; font-size: 12px; font-weight: 500; color: var(--muted); margin: 10px 0 4px; }
|
|
52
|
-
input[type=text], input[type=number], select { width: 100%; font-family: inherit; font-size: 13px; padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: #fff; color: var(--fg); }
|
|
52
|
+
input[type=text], input[type=password], input[type=number], select { width: 100%; font-family: inherit; font-size: 13px; padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: #fff; color: var(--fg); }
|
|
53
53
|
input:focus, select:focus { outline: 2px solid #bfdbfe; border-color: var(--accent); }
|
|
54
54
|
.edit { padding: 14px 16px; background: #fff; border-top: 1px solid var(--border); }
|
|
55
55
|
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
|
|
@@ -193,6 +193,7 @@
|
|
|
193
193
|
<div class="sec-head"><h2>🔌 Connections & Bots</h2><div class="grow"></div><button class="sm" id="newBotBtn" data-i18n="add">+ Add</button></div>
|
|
194
194
|
<div id="newBot"></div>
|
|
195
195
|
<div class="card" id="bots"></div>
|
|
196
|
+
<div class="card" id="providerSecrets" style="margin-top:12px"></div>
|
|
196
197
|
</section>
|
|
197
198
|
|
|
198
199
|
<section>
|
|
@@ -417,7 +418,7 @@
|
|
|
417
418
|
}
|
|
418
419
|
|
|
419
420
|
// ── State ──
|
|
420
|
-
const state = { schema: { impacts: {}, order: ["now", "instance", "fleet"] }, fleet: {}, classic: {}, classicStatus: {}, classicLive: {}, live: {}, fleetUp: false, advFmt: "yaml", advEdit: false, collapsedGroups: new Set(), version: "", newAgentOpen: false, newBotOpen: false, pending: new Map() };
|
|
421
|
+
const state = { schema: { impacts: {}, order: ["now", "instance", "fleet"] }, fleet: {}, classic: {}, classicStatus: {}, classicLive: {}, live: {}, connections: [], providerSecrets: [], fleetUp: false, advFmt: "yaml", advEdit: false, collapsedGroups: new Set(), version: "", newAgentOpen: false, newBotOpen: false, pending: new Map() };
|
|
421
422
|
const channels = () => state.fleet.channels || (state.fleet.channel ? [state.fleet.channel] : []);
|
|
422
423
|
const channelIds = () => channels().map(c => c.id || c.type).filter(Boolean);
|
|
423
424
|
const chLabel = (i) => i === 0 ? "primary" : "persona";
|
|
@@ -707,8 +708,10 @@
|
|
|
707
708
|
catch (error) { result = { ok: false, body: { error: error.message } }; }
|
|
708
709
|
if (!result?.ok) {
|
|
709
710
|
showBanner(`${change.label}: ${result?.body?.error || t("applyFailed")}`, true);
|
|
711
|
+
change.cleanup?.();
|
|
710
712
|
button.disabled = false; return;
|
|
711
713
|
}
|
|
714
|
+
change.cleanup?.();
|
|
712
715
|
state.pending.delete(key); updatePendingBar();
|
|
713
716
|
}
|
|
714
717
|
// The key is generated here, before the first attempt, and reused by every
|
|
@@ -1156,6 +1159,7 @@
|
|
|
1156
1159
|
? (ch.access.allowed_users).slice(0, 3).join(", ") + ((ch.access.allowed_users).length > 3 ? ` +${(ch.access.allowed_users).length - 3}` : "")
|
|
1157
1160
|
: t("noAllowedUsers")),
|
|
1158
1161
|
el("span", { class: "spacer" }),
|
|
1162
|
+
el("span", { class: "tag", title: "secret status" }, state.connections.find(c => (c.id || c.type) === (ch.id || ch.type))?.token_present ? "Token configured" : "Token missing"),
|
|
1159
1163
|
el("span", { style: `color:${state.fleetUp ? "var(--green)" : "var(--red)"};font-size:13px` }, state.fleetUp ? "Connected" : "Problem"),
|
|
1160
1164
|
el("button", { class: "sm ghost", onclick: () => {
|
|
1161
1165
|
const form = botEditForm(ch, i);
|
|
@@ -1166,6 +1170,125 @@
|
|
|
1166
1170
|
});
|
|
1167
1171
|
}
|
|
1168
1172
|
|
|
1173
|
+
// Provider API keys use a separate registry endpoint. Unsupported providers
|
|
1174
|
+
// are intentionally rendered without an input: a key that cannot be
|
|
1175
|
+
// positively verified must never be accepted as an "unverified" write.
|
|
1176
|
+
function providerSecretInputAllowed(spec) { return spec?.verifier === "available"; }
|
|
1177
|
+
function renderProviderSecrets() {
|
|
1178
|
+
const host = $("providerSecrets"); if (!host) return;
|
|
1179
|
+
host.innerHTML = "";
|
|
1180
|
+
const rows = Array.isArray(state.providerSecrets) ? state.providerSecrets : [];
|
|
1181
|
+
if (!rows.length) { host.className = "card empty"; host.textContent = "No provider API-key verifiers available."; return; }
|
|
1182
|
+
host.className = "card";
|
|
1183
|
+
rows.forEach(spec => {
|
|
1184
|
+
const row = el("div", { class: "item" });
|
|
1185
|
+
const feedback = el("div", { class: "feedback" });
|
|
1186
|
+
const present = spec.token_present ? "Key configured" : "Not configured";
|
|
1187
|
+
if (!providerSecretInputAllowed(spec)) {
|
|
1188
|
+
row.append(el("div", { class: "item-row" }, el("span", { class: "name" }, spec.display_name), el("span", { class: "tag" }, "Unsupported verifier")), el("div", { class: "hint" }, "This provider cannot be safely verified here; no key input is offered."));
|
|
1189
|
+
host.append(row); return;
|
|
1190
|
+
}
|
|
1191
|
+
const input = el("input", { type: "password", autocomplete: "new-password", placeholder: present });
|
|
1192
|
+
const button = el("button", { class: "sm primary" }, "Verify & apply");
|
|
1193
|
+
button.onclick = async () => {
|
|
1194
|
+
const secret = input.value;
|
|
1195
|
+
if (!secret) { feedback.className = "feedback error"; feedback.textContent = "Enter a key first."; return; }
|
|
1196
|
+
button.disabled = true; feedback.className = "feedback"; feedback.textContent = "Verifying…";
|
|
1197
|
+
const key = crypto.randomUUID ? crypto.randomUUID() : `provider-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
1198
|
+
try {
|
|
1199
|
+
const verified = await api(`/api/settings/secrets/${encodeURIComponent(spec.id)}/verify`, { method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify({ secret, idempotency_key: key }) });
|
|
1200
|
+
if (!verified.ok) { feedback.className = "feedback error"; feedback.textContent = `✗ ${verified.body?.error || "verification failed"}`; return; }
|
|
1201
|
+
feedback.textContent = "Applying…";
|
|
1202
|
+
let result = await api(`/api/settings/secrets/${encodeURIComponent(spec.id)}/apply`, { method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify({ verification_id: verified.body?.verification_id, idempotency_key: key }) });
|
|
1203
|
+
let body = result.body || {};
|
|
1204
|
+
for (let n = 0; result.ok && body.job_id && body.result === "applying" && n < 60; n++) {
|
|
1205
|
+
await new Promise(resolve => setTimeout(resolve, 250));
|
|
1206
|
+
const status = await api(`/api/settings/secrets/${encodeURIComponent(spec.id)}/apply/${encodeURIComponent(body.job_id)}`);
|
|
1207
|
+
if (status.ok) body = status.body || body;
|
|
1208
|
+
}
|
|
1209
|
+
const labels = { applied_next_use: "✓ Saved — new processes will use it", reloaded: "✓ Applied", rolled_back: "↩ Rolled back", rollback_failed: "✗ Rollback failed" };
|
|
1210
|
+
const ok = body.result === "applied_next_use" || body.result === "reloaded";
|
|
1211
|
+
feedback.className = `feedback ${ok ? "" : "error"}`;
|
|
1212
|
+
feedback.textContent = labels[body.result] || `✗ ${body.error || "Apply failed"}`;
|
|
1213
|
+
if (ok) { input.value = ""; await reload(); }
|
|
1214
|
+
} finally { input.value = ""; button.disabled = false; }
|
|
1215
|
+
};
|
|
1216
|
+
row.append(el("div", { class: "item-row" }, el("span", { class: "name" }, spec.display_name), el("span", { class: "tag" }, present), el("span", { class: "spacer" }, input), button), feedback);
|
|
1217
|
+
host.append(row);
|
|
1218
|
+
});
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
// Secret rotation is staged through the same Apply bar as every other
|
|
1222
|
+
// Settings mutation. The token is held only in this short-lived closure and
|
|
1223
|
+
// is cleared by the caller after the request settles; it never enters
|
|
1224
|
+
// localStorage, the URL, a label, or the staged change's display text.
|
|
1225
|
+
async function applyConnectionSecret(connectionId, secret, feedback) {
|
|
1226
|
+
const key = crypto.randomUUID ? crypto.randomUUID() : `secret-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
1227
|
+
feedback.className = "feedback"; feedback.textContent = "Verifying…";
|
|
1228
|
+
const verified = await api(`/api/settings/connections/${encodeURIComponent(connectionId)}/secret/verify`, {
|
|
1229
|
+
method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify({ secret, idempotency_key: key }),
|
|
1230
|
+
});
|
|
1231
|
+
if (!verified.ok) { feedback.className = "feedback error"; feedback.textContent = `✗ ${verified.body?.error || "verification failed"}`; return verified; }
|
|
1232
|
+
feedback.textContent = "Applying…";
|
|
1233
|
+
const applied = await api(`/api/settings/connections/${encodeURIComponent(connectionId)}/secret/apply`, {
|
|
1234
|
+
method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify({ verification_id: verified.body?.verification_id, idempotency_key: key }),
|
|
1235
|
+
});
|
|
1236
|
+
if (!applied.ok && applied.status !== 409) { feedback.className = "feedback error"; feedback.textContent = `✗ ${applied.body?.error || "apply failed"}`; return applied; }
|
|
1237
|
+
let result = applied.body || {};
|
|
1238
|
+
if (result.job_id && result.result === "applying") {
|
|
1239
|
+
for (let n = 0; n < 60; n++) {
|
|
1240
|
+
await new Promise(resolve => setTimeout(resolve, 250));
|
|
1241
|
+
const status = await api(`/api/settings/connections/${encodeURIComponent(connectionId)}/secret/apply/${encodeURIComponent(result.job_id)}`);
|
|
1242
|
+
if (status.ok) { result = status.body || result; if (result.result !== "applying") break; }
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
const labels = { applying: "…Still applying — check status", applied: "✓ Applied", restart_required: "↻ Saved — restart required", rolled_back: "↩ Rolled back", rollback_failed: "✗ Rollback failed" };
|
|
1246
|
+
feedback.className = `feedback ${result.result === "applied" || result.result === "restart_required" ? "" : "error"}`;
|
|
1247
|
+
feedback.textContent = labels[result.result] || "✗ Unknown apply result";
|
|
1248
|
+
return { ok: result.result === "applied" || result.result === "restart_required", status: result.result === "applied" ? 200 : 409, body: result };
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
// Binding changes use a separate verified challenge. They never go through
|
|
1252
|
+
// PUT /fleet/channels: the provider probe proves the target first, and the
|
|
1253
|
+
// apply job updates only group/general coordinates after the replacement
|
|
1254
|
+
// adapter is ready.
|
|
1255
|
+
async function verifyAndApplyConnectionBinding(connectionId, groupId, generalChannelId, feedback) {
|
|
1256
|
+
const key = crypto.randomUUID ? crypto.randomUUID() : `binding-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
1257
|
+
const binding = { group_id: String(groupId).trim(), general_channel_id: String(generalChannelId || "").trim() || null };
|
|
1258
|
+
feedback.className = "feedback"; feedback.textContent = "Verifying target…";
|
|
1259
|
+
const verified = await api(`/api/settings/connections/${encodeURIComponent(connectionId)}/binding/verify`, {
|
|
1260
|
+
method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify({ ...binding, idempotency_key: key }),
|
|
1261
|
+
});
|
|
1262
|
+
if (!verified.ok) { feedback.className = "feedback error"; feedback.textContent = `✗ ${verified.body?.error || "binding verification failed"}`; return verified; }
|
|
1263
|
+
const probe = verified.body?.probe || {};
|
|
1264
|
+
const target = [probe.group_name || binding.group_id, probe.channel_name || probe.channel_id].filter(Boolean).join(" / ");
|
|
1265
|
+
const perms = [probe.can_view ? "view" : null, probe.can_send ? "send" : null, probe.can_manage_topics ? "topics" : null].filter(Boolean).join(", ");
|
|
1266
|
+
feedback.textContent = `✓ Verified ${target}${perms ? ` (${perms})` : ""}`;
|
|
1267
|
+
if (!window.confirm(`Rebind this connection to ${target || binding.group_id}?`)) {
|
|
1268
|
+
feedback.textContent = "Verified; not applied.";
|
|
1269
|
+
return { ok: false, status: 409, body: { result: "verified" } };
|
|
1270
|
+
}
|
|
1271
|
+
feedback.textContent = "Applying binding…";
|
|
1272
|
+
const applied = await api(`/api/settings/connections/${encodeURIComponent(connectionId)}/binding/apply`, {
|
|
1273
|
+
method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify({ verification_id: verified.body?.verification_id, idempotency_key: key }),
|
|
1274
|
+
});
|
|
1275
|
+
if (!applied.ok && applied.status !== 409) { feedback.className = "feedback error"; feedback.textContent = `✗ ${applied.body?.error || "binding apply failed"}`; return applied; }
|
|
1276
|
+
let result = applied.body || {};
|
|
1277
|
+
if (result.job_id && result.result === "applying") {
|
|
1278
|
+
for (let n = 0; n < 60; n++) {
|
|
1279
|
+
await new Promise(resolve => setTimeout(resolve, 250));
|
|
1280
|
+
const status = await api(`/api/settings/connections/${encodeURIComponent(connectionId)}/binding/apply/${encodeURIComponent(result.job_id)}`);
|
|
1281
|
+
if (status.ok) { result = status.body || result; if (result.result !== "applying") break; }
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
const labels = { applied: "✓ Binding applied", rolled_back: "↩ Binding rolled back", rollback_failed: "✗ Binding rollback failed", applying: "…Still applying — check status" };
|
|
1285
|
+
const ok = result.result === "applied";
|
|
1286
|
+
feedback.className = `feedback ${ok ? "" : "error"}`;
|
|
1287
|
+
feedback.textContent = labels[result.result] || "✗ Unknown binding result";
|
|
1288
|
+
if (ok) await reload();
|
|
1289
|
+
return { ok, status: ok ? 200 : 409, body: result };
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1169
1292
|
function botEditForm(ch, i) {
|
|
1170
1293
|
ch.access = ch.access || { mode: "locked", allowed_users: [] };
|
|
1171
1294
|
ch.access.allowed_users = ch.access.allowed_users || [];
|
|
@@ -1175,18 +1298,54 @@
|
|
|
1175
1298
|
const fMode = select(ch.access.mode || "locked", ["open", "locked", "pairing"]);
|
|
1176
1299
|
const users = [...ch.access.allowed_users];
|
|
1177
1300
|
const accessFeedback = el("div", { class: "feedback" });
|
|
1301
|
+
const tokenInput = el("input", { type: "password", autocomplete: "new-password", placeholder: "Paste a new bot token to rotate it" });
|
|
1302
|
+
const secretFeedback = el("div", { class: "feedback" });
|
|
1303
|
+
const bindingFeedback = el("div", { class: "feedback" });
|
|
1304
|
+
const fGroup = el("input", { type: "text", value: ch.group_id != null ? String(ch.group_id) : "", autocomplete: "off" });
|
|
1305
|
+
const fGeneral = el("input", { type: "text", value: ch.options?.general_channel_id != null ? String(ch.options.general_channel_id) : "", autocomplete: "off", placeholder: type === "discord" ? "General channel id (optional)" : "Forum topic id (optional)" });
|
|
1306
|
+
const bindingVerify = el("button", { class: "sm primary", onclick: async () => {
|
|
1307
|
+
if (!fGroup.value.trim()) { bindingFeedback.className = "feedback error"; bindingFeedback.textContent = "✗ group/guild id required"; return; }
|
|
1308
|
+
await verifyAndApplyConnectionBinding(connectionId, fGroup.value, fGeneral.value, bindingFeedback);
|
|
1309
|
+
} }, "Verify new binding → Confirm rebind");
|
|
1310
|
+
const connectionId = ch.id || ch.type || chLabel(i);
|
|
1311
|
+
let pendingSecret = "";
|
|
1312
|
+
const stageSecret = () => {
|
|
1313
|
+
const secret = tokenInput.value;
|
|
1314
|
+
if (!secret) { secretFeedback.className = "feedback error"; secretFeedback.textContent = "✗ token required"; return; }
|
|
1315
|
+
pendingSecret = secret;
|
|
1316
|
+
tokenInput.value = "";
|
|
1317
|
+
stageChange(`secret:${connectionId}`, {
|
|
1318
|
+
// Secret rotation is an immediate adapter operation. Use the server's
|
|
1319
|
+
// published impact ordering rather than duplicating an impact literal
|
|
1320
|
+
// in this page (hot/cold parity guards reject such copies).
|
|
1321
|
+
label: `Rotate ${type} token`, impact: state.schema.order[0],
|
|
1322
|
+
apply: async () => {
|
|
1323
|
+
const value = pendingSecret; pendingSecret = "";
|
|
1324
|
+
try { return await applyConnectionSecret(connectionId, value, secretFeedback); }
|
|
1325
|
+
finally { pendingSecret = ""; }
|
|
1326
|
+
},
|
|
1327
|
+
cleanup: () => { pendingSecret = ""; },
|
|
1328
|
+
});
|
|
1329
|
+
secretFeedback.className = "feedback"; secretFeedback.textContent = "Queued — click Apply changes.";
|
|
1330
|
+
};
|
|
1178
1331
|
const validateAccess = () => setValidation(fMode, accessFeedback, "", fMode.value === "locked" && users.length === 0 ? t("accessLockedEmpty") : "");
|
|
1179
1332
|
fMode.addEventListener("change", validateAccess);
|
|
1180
1333
|
box.append(
|
|
1181
1334
|
el("div", { class: "grid2" },
|
|
1182
1335
|
el("div", {}, el("label", {}, t("accessMode"), impact("fleet.channel.access.mode")), fMode, accessFeedback),
|
|
1183
1336
|
el("div", {}, el("label", {}, t("allowedUsers"), impact("fleet.channel.access.allowed_users")), chipList(users, validateAccess, "user id"))),
|
|
1184
|
-
// Only the field that platform actually has, the way quickstart asks.
|
|
1185
1337
|
el("div", { class: "field" },
|
|
1186
1338
|
el("label", {}, type === "discord" ? t("guildIdField") : t("groupIdField"), impact("fleet.channels")),
|
|
1187
|
-
|
|
1339
|
+
fGroup,
|
|
1340
|
+
el("label", {}, type === "discord" ? "General channel id" : "Forum topic id"), fGeneral,
|
|
1341
|
+
el("div", { class: "hint" }, "The target is checked with the existing bot token before any binding is changed."),
|
|
1342
|
+
el("div", { class: "actions" }, bindingVerify, bindingFeedback)),
|
|
1188
1343
|
drawer(t("advancedSection"),
|
|
1189
1344
|
el("div", { class: "field" }, el("label", {}, t("tokenEnv")), el("div", { class: "sub" }, ch.bot_token_env || "(no token env)")),
|
|
1345
|
+
el("div", { class: "field" },
|
|
1346
|
+
el("label", {}, "Bot token (never stored in the browser)"), tokenInput,
|
|
1347
|
+
el("div", { class: "hint" }, "The token is verified by AgEnD, then applied by replacing the running adapter. It is never echoed."),
|
|
1348
|
+
el("div", { class: "actions" }, el("button", { class: "sm primary", onclick: stageSecret }, "Verify & apply token"), secretFeedback)),
|
|
1190
1349
|
el("div", { class: "actions" },
|
|
1191
1350
|
el("button", { class: "sm danger", onclick: () => { closeModal(); delBot(i); } }, t("deleteBot")))),
|
|
1192
1351
|
);
|
|
@@ -1639,7 +1798,7 @@
|
|
|
1639
1798
|
}
|
|
1640
1799
|
|
|
1641
1800
|
// ── Load / render ──
|
|
1642
|
-
function renderAll() { renderAgents(); renderClassic(); renderBots(); renderGeneral(); renderAdvanced(); applyStaticI18n(); }
|
|
1801
|
+
function renderAll() { renderAgents(); renderClassic(); renderBots(); renderProviderSecrets(); renderGeneral(); renderAdvanced(); applyStaticI18n(); }
|
|
1643
1802
|
async function reloadLive() {
|
|
1644
1803
|
const f = await api("/api/fleet");
|
|
1645
1804
|
state.fleetUp = f.ok;
|
|
@@ -1671,6 +1830,12 @@
|
|
|
1671
1830
|
if (!f.ok) { $("banner").style.display = "block"; $("banner").style.background = "#fef2f2"; $("banner").style.color = "var(--red)"; $("banner").textContent = t("configLoadFailed"); return; }
|
|
1672
1831
|
state.fleet = f.body || {};
|
|
1673
1832
|
const c = await api("/api/settings/classic"); state.classic = c.body || {};
|
|
1833
|
+
const connections = await api("/api/settings/connections");
|
|
1834
|
+
state.connections = connections.ok && Array.isArray(connections.body) ? connections.body : [];
|
|
1835
|
+
const providerSecrets = await api("/api/settings/provider-secrets");
|
|
1836
|
+
const providerHost = $("providerSecrets");
|
|
1837
|
+
if (providerHost) providerHost.style.display = providerSecrets.ok ? "" : "none";
|
|
1838
|
+
state.providerSecrets = providerSecrets.ok && Array.isArray(providerSecrets.body) ? providerSecrets.body : [];
|
|
1674
1839
|
await reloadLive();
|
|
1675
1840
|
renderAll();
|
|
1676
1841
|
}
|
|
@@ -1692,7 +1857,7 @@
|
|
|
1692
1857
|
document.addEventListener("keydown", e => { if (e.key === "Escape" && modalState) closeModal(); });
|
|
1693
1858
|
$("wizardBtn").onclick = () => openWizard();
|
|
1694
1859
|
$("applyChanges").onclick = applyPendingChanges;
|
|
1695
|
-
$("discardChanges").onclick = async () => { state.pending.clear(); updatePendingBar(); await reload(); };
|
|
1860
|
+
$("discardChanges").onclick = async () => { for (const change of state.pending.values()) change.cleanup?.(); state.pending.clear(); updatePendingBar(); await reload(); };
|
|
1696
1861
|
|
|
1697
1862
|
reload();
|
|
1698
1863
|
})();
|
|
@@ -48,6 +48,18 @@ export declare function getUsageSnapshot(force?: boolean, providerIds?: Iterable
|
|
|
48
48
|
* not logged in" is information, an absent row is a question.
|
|
49
49
|
*/
|
|
50
50
|
export declare function formatUsageSummary(payload: UsagePayload): string;
|
|
51
|
+
/**
|
|
52
|
+
* Render the compact, public Discord activity line for the current usage
|
|
53
|
+
* snapshot. Only a percentage metric is surfaced; raw provider errors and
|
|
54
|
+
* hints are intentionally not copied into a public presence (they may contain
|
|
55
|
+
* URLs or account-specific detail). Error/expired and missing-login states
|
|
56
|
+
* remain explicit instead of displaying a stale percentage.
|
|
57
|
+
*
|
|
58
|
+
* Discord limits activity names to 128 Unicode code points. Keep the leading
|
|
59
|
+
* lightning marker and truncate complete code points so a long profile name or
|
|
60
|
+
* many credential profiles cannot make the update fail.
|
|
61
|
+
*/
|
|
62
|
+
export declare function formatDiscordUsageActivity(payload: UsagePayload): string;
|
|
51
63
|
/** True if the path belongs to the usage feature (so the caller can skip the
|
|
52
64
|
* global web-token gate and let this module answer, like isViewPath). */
|
|
53
65
|
export declare function isUsagePath(path: string): boolean;
|
package/dist/usage/usage-api.js
CHANGED
|
@@ -179,6 +179,45 @@ export function formatUsageSummary(payload) {
|
|
|
179
179
|
}
|
|
180
180
|
return lines.join("\n");
|
|
181
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Render the compact, public Discord activity line for the current usage
|
|
184
|
+
* snapshot. Only a percentage metric is surfaced; raw provider errors and
|
|
185
|
+
* hints are intentionally not copied into a public presence (they may contain
|
|
186
|
+
* URLs or account-specific detail). Error/expired and missing-login states
|
|
187
|
+
* remain explicit instead of displaying a stale percentage.
|
|
188
|
+
*
|
|
189
|
+
* Discord limits activity names to 128 Unicode code points. Keep the leading
|
|
190
|
+
* lightning marker and truncate complete code points so a long profile name or
|
|
191
|
+
* many credential profiles cannot make the update fail.
|
|
192
|
+
*/
|
|
193
|
+
export function formatDiscordUsageActivity(payload) {
|
|
194
|
+
const rows = payload.providers.map(provider => {
|
|
195
|
+
const name = provider.name.trim() || provider.id;
|
|
196
|
+
if (provider.status === "no-credentials")
|
|
197
|
+
return `${name}: not logged in`;
|
|
198
|
+
if (provider.status === "error") {
|
|
199
|
+
const error = `${provider.error ?? ""} ${provider.hint ?? ""}`;
|
|
200
|
+
return `${name}: ${/expired|token rejected|unauthori[sz]ed/i.test(error) ? "expired" : "unavailable"}`;
|
|
201
|
+
}
|
|
202
|
+
// A stale-while-rate-limited row has the old metrics but says so in its
|
|
203
|
+
// hint. Do not turn an old number into a falsely live presence.
|
|
204
|
+
if (/^cached\s+/i.test(provider.hint ?? ""))
|
|
205
|
+
return `${name}: stale`;
|
|
206
|
+
const percent = provider.metrics
|
|
207
|
+
.filter(isVisibleUsageMetric)
|
|
208
|
+
.filter(metric => metric.type === "percent" && typeof metric.used === "number")
|
|
209
|
+
.sort((a, b) => Number(/weekly/i.test(b.label)) - Number(/weekly/i.test(a.label)))[0];
|
|
210
|
+
if (!percent)
|
|
211
|
+
return `${name}: unavailable`;
|
|
212
|
+
const window = /weekly/i.test(percent.label) ? " weekly" : "";
|
|
213
|
+
return `${name} ${Math.round(percent.used ?? 0)}%${window}`;
|
|
214
|
+
});
|
|
215
|
+
const raw = rows.length > 0 ? `⚡ ${rows.join(" | ")}` : "⚡ Usage unavailable";
|
|
216
|
+
const points = Array.from(raw);
|
|
217
|
+
if (points.length <= 128)
|
|
218
|
+
return raw;
|
|
219
|
+
return `${points.slice(0, 127).join("")}…`;
|
|
220
|
+
}
|
|
182
221
|
function formatMetric(m) {
|
|
183
222
|
const label = usageText(m.label, m.labelI18n);
|
|
184
223
|
const note = m.note ? usageText(m.note, m.noteI18n) : "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-api.js","sourceRoot":"","sources":["../../src/usage/usage-api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"usage-api.js","sourceRoot":"","sources":["../../src/usage/usage-api.ts"],"names":[],"mappings":"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"}
|