mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-17 12:16:21 +02:00
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>
188 lines
4.7 KiB
JavaScript
188 lines
4.7 KiB
JavaScript
/**
|
|
* @import {Info, Join, Options, SafeConfig, State} from 'mdast-util-to-markdown'
|
|
* @import {Nodes} from 'mdast'
|
|
* @import {Enter, FlowParents, PhrasingParents, TrackFields} from './types.js'
|
|
*/
|
|
|
|
import {zwitch} from 'zwitch'
|
|
import {configure} from './configure.js'
|
|
import {handle as handlers} from './handle/index.js'
|
|
import {join} from './join.js'
|
|
import {unsafe} from './unsafe.js'
|
|
import {association} from './util/association.js'
|
|
import {compilePattern} from './util/compile-pattern.js'
|
|
import {containerPhrasing} from './util/container-phrasing.js'
|
|
import {containerFlow} from './util/container-flow.js'
|
|
import {indentLines} from './util/indent-lines.js'
|
|
import {safe} from './util/safe.js'
|
|
import {track} from './util/track.js'
|
|
|
|
/**
|
|
* Turn an mdast syntax tree into markdown.
|
|
*
|
|
* @param {Nodes} tree
|
|
* Tree to serialize.
|
|
* @param {Options | null | undefined} [options]
|
|
* Configuration (optional).
|
|
* @returns {string}
|
|
* Serialized markdown representing `tree`.
|
|
*/
|
|
export function toMarkdown(tree, options) {
|
|
const settings = options || {}
|
|
/** @type {State} */
|
|
const state = {
|
|
associationId: association,
|
|
containerPhrasing: containerPhrasingBound,
|
|
containerFlow: containerFlowBound,
|
|
createTracker: track,
|
|
compilePattern,
|
|
enter,
|
|
// @ts-expect-error: GFM / frontmatter are typed in `mdast` but not defined
|
|
// here.
|
|
handlers: {...handlers},
|
|
// @ts-expect-error: add `handle` in a second.
|
|
handle: undefined,
|
|
indentLines,
|
|
indexStack: [],
|
|
join: [...join],
|
|
options: {},
|
|
safe: safeBound,
|
|
stack: [],
|
|
unsafe: [...unsafe]
|
|
}
|
|
|
|
configure(state, settings)
|
|
|
|
if (state.options.tightDefinitions) {
|
|
state.join.push(joinDefinition)
|
|
}
|
|
|
|
state.handle = zwitch('type', {
|
|
invalid,
|
|
unknown,
|
|
handlers: state.handlers
|
|
})
|
|
|
|
let result = state.handle(tree, undefined, state, {
|
|
before: '\n',
|
|
after: '\n',
|
|
now: {line: 1, column: 1},
|
|
lineShift: 0
|
|
})
|
|
|
|
if (
|
|
result &&
|
|
result.charCodeAt(result.length - 1) !== 10 &&
|
|
result.charCodeAt(result.length - 1) !== 13
|
|
) {
|
|
result += '\n'
|
|
}
|
|
|
|
return result
|
|
|
|
/** @type {Enter} */
|
|
function enter(name) {
|
|
state.stack.push(name)
|
|
return exit
|
|
|
|
/**
|
|
* @returns {undefined}
|
|
*/
|
|
function exit() {
|
|
state.stack.pop()
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {unknown} value
|
|
* @returns {never}
|
|
*/
|
|
function invalid(value) {
|
|
throw new Error('Cannot handle value `' + value + '`, expected node')
|
|
}
|
|
|
|
/**
|
|
* @param {unknown} value
|
|
* @returns {never}
|
|
*/
|
|
function unknown(value) {
|
|
// Always a node.
|
|
const node = /** @type {Nodes} */ (value)
|
|
throw new Error('Cannot handle unknown node `' + node.type + '`')
|
|
}
|
|
|
|
/** @type {Join} */
|
|
function joinDefinition(left, right) {
|
|
// No blank line between adjacent definitions.
|
|
if (left.type === 'definition' && left.type === right.type) {
|
|
return 0
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Serialize the children of a parent that contains phrasing children.
|
|
*
|
|
* These children will be joined flush together.
|
|
*
|
|
* @this {State}
|
|
* Info passed around about the current state.
|
|
* @param {PhrasingParents} parent
|
|
* Parent of flow nodes.
|
|
* @param {Info} info
|
|
* Info on where we are in the document we are generating.
|
|
* @returns {string}
|
|
* Serialized children, joined together.
|
|
*/
|
|
function containerPhrasingBound(parent, info) {
|
|
return containerPhrasing(parent, this, info)
|
|
}
|
|
|
|
/**
|
|
* Serialize the children of a parent that contains flow children.
|
|
*
|
|
* These children will typically be joined by blank lines.
|
|
* What they are joined by exactly is defined by `Join` functions.
|
|
*
|
|
* @this {State}
|
|
* Info passed around about the current state.
|
|
* @param {FlowParents} parent
|
|
* Parent of flow nodes.
|
|
* @param {TrackFields} info
|
|
* Info on where we are in the document we are generating.
|
|
* @returns {string}
|
|
* Serialized children, joined by (blank) lines.
|
|
*/
|
|
function containerFlowBound(parent, info) {
|
|
return containerFlow(parent, this, info)
|
|
}
|
|
|
|
/**
|
|
* Make a string safe for embedding in markdown constructs.
|
|
*
|
|
* In markdown, almost all punctuation characters can, in certain cases,
|
|
* result in something.
|
|
* Whether they do is highly subjective to where they happen and in what
|
|
* they happen.
|
|
*
|
|
* To solve this, `mdast-util-to-markdown` tracks:
|
|
*
|
|
* * Characters before and after something;
|
|
* * What “constructs” we are in.
|
|
*
|
|
* This information is then used by this function to escape or encode
|
|
* special characters.
|
|
*
|
|
* @this {State}
|
|
* Info passed around about the current state.
|
|
* @param {string | null | undefined} value
|
|
* Raw value to make safe.
|
|
* @param {SafeConfig} config
|
|
* Configuration.
|
|
* @returns {string}
|
|
* Serialized markdown safe for embedding.
|
|
*/
|
|
function safeBound(value, config) {
|
|
return safe(this, value, config)
|
|
}
|