mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 15:08:16 +02:00
Jauge de contexte, espace disque sur partage agrégé, panneau Fichiers
Trois défauts sans rapport entre eux, tous visibles à l'écran. Jauge de contexte bloquée à « 0 / N (0 %) » : le comptage exact vient de usage.prompt_tokens (include_usage), qu'un llama-server récent a cessé de renvoyer. On note désormais si l'usage est arrivé ; sinon la fin de tour publie l'estimation qui pilote déjà la compaction — approximative, mais jamais absente. Et la souscription envoie la valeur courante juste après le rattrapage : une page rechargée affichait zéro sur une discussion pourtant pleine, faute d'événement ctx_used dans la fenêtre rejouée. Espace disque : « il ne reste que 11,9 Go » sur un partage Unraid qui en a des centaines. /mnt/user est servi par shfs, un FUSE qui agrège plusieurs disques — statfs y renvoie l'espace d'un seul, et ce chiffre REFUSAIT l'installation du modèle. Les systèmes de fichiers qui approximent (FUSE, overlay, NFS, CIFS, Ceph, Gluster) sont reconnus par leur magie : leur chiffre reste affiché, précédé d'un « ~ », mais ne bloque plus rien. Panneau Fichiers : le panneau entier défilait, emportant vers le haut l'en-tête, le fil d'Ariane et le pied (occupation disque, bouton .zip) dès qu'il y avait quelques fichiers. Seule la liste défile maintenant ; le pied reste en bas et l'état vide se centre. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
895ff92ed8
commit
b405adea6c
5118 files changed
+1264007
-23
No files matched your search
+107
@@ -0,0 +1,107 @@
|
||||
import { asciiAlphanumeric } from 'micromark-util-character';
|
||||
import { encode } from 'micromark-util-encode';
|
||||
/**
|
||||
* Make a value safe for injection as a URL.
|
||||
*
|
||||
* This encodes unsafe characters with percent-encoding and skips already
|
||||
* encoded sequences (see `normalizeUri`).
|
||||
* Further unsafe characters are encoded as character references (see
|
||||
* `micromark-util-encode`).
|
||||
*
|
||||
* A regex of allowed protocols can be given, in which case the URL is
|
||||
* sanitized.
|
||||
* For example, `/^(https?|ircs?|mailto|xmpp)$/i` can be used for `a[href]`, or
|
||||
* `/^https?$/i` for `img[src]` (this is what `github.com` allows).
|
||||
* If the URL includes an unknown protocol (one not matched by `protocol`, such
|
||||
* as a dangerous example, `javascript:`), the value is ignored.
|
||||
*
|
||||
* @param {string | null | undefined} url
|
||||
* URI to sanitize.
|
||||
* @param {RegExp | null | undefined} [protocol]
|
||||
* Allowed protocols.
|
||||
* @returns {string}
|
||||
* Sanitized URI.
|
||||
*/
|
||||
export function sanitizeUri(url, protocol) {
|
||||
const value = encode(normalizeUri(url || ''));
|
||||
if (!protocol) {
|
||||
return value;
|
||||
}
|
||||
const colon = value.indexOf(':');
|
||||
const questionMark = value.indexOf('?');
|
||||
const numberSign = value.indexOf('#');
|
||||
const slash = value.indexOf('/');
|
||||
if (
|
||||
// If there is no protocol, it’s relative.
|
||||
colon < 0 ||
|
||||
// If the first colon is after a `?`, `#`, or `/`, it’s not a protocol.
|
||||
slash > -1 && colon > slash || questionMark > -1 && colon > questionMark || numberSign > -1 && colon > numberSign ||
|
||||
// It is a protocol, it should be allowed.
|
||||
protocol.test(value.slice(0, colon))) {
|
||||
return value;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize a URL.
|
||||
*
|
||||
* Encode unsafe characters with percent-encoding, skipping already encoded
|
||||
* sequences.
|
||||
*
|
||||
* @param {string} value
|
||||
* URI to normalize.
|
||||
* @returns {string}
|
||||
* Normalized URI.
|
||||
*/
|
||||
export function normalizeUri(value) {
|
||||
/** @type {Array<string>} */
|
||||
const result = [];
|
||||
let index = -1;
|
||||
let start = 0;
|
||||
let skip = 0;
|
||||
while (++index < value.length) {
|
||||
const code = value.charCodeAt(index);
|
||||
/** @type {string} */
|
||||
let replace = '';
|
||||
|
||||
// A correct percent encoded value.
|
||||
if (code === 37 && asciiAlphanumeric(value.charCodeAt(index + 1)) && asciiAlphanumeric(value.charCodeAt(index + 2))) {
|
||||
skip = 2;
|
||||
}
|
||||
// ASCII.
|
||||
else if (code < 128) {
|
||||
if (!/[!#$&-;=?-Z_a-z~]/.test(String.fromCharCode(code))) {
|
||||
replace = String.fromCharCode(code);
|
||||
}
|
||||
}
|
||||
// Astral.
|
||||
else if (code > 55_295 && code < 57_344) {
|
||||
const next = value.charCodeAt(index + 1);
|
||||
|
||||
// A correct surrogate pair.
|
||||
if (code < 56_320 && next > 56_319 && next < 57_344) {
|
||||
replace = String.fromCharCode(code, next);
|
||||
skip = 1;
|
||||
}
|
||||
// Lone surrogate.
|
||||
else {
|
||||
replace = "\uFFFD";
|
||||
}
|
||||
}
|
||||
// Unicode.
|
||||
else {
|
||||
replace = String.fromCharCode(code);
|
||||
}
|
||||
if (replace) {
|
||||
result.push(value.slice(start, index), encodeURIComponent(replace));
|
||||
start = index + skip + 1;
|
||||
replace = '';
|
||||
}
|
||||
if (skip) {
|
||||
index += skip;
|
||||
skip = 0;
|
||||
}
|
||||
}
|
||||
return result.join('') + value.slice(start);
|
||||
}
|
||||
Reference in new issue
Block a user