UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

114 lines (113 loc) 3.01 kB
//#region extensions/imessage/src/cli-output.ts const IMESSAGE_CLI_STDOUT_MAX_CHARS = 8 * 1024 * 1024; const IMESSAGE_CLI_STDERR_TAIL_CHARS = 64 * 1024; function chunkToString(chunk) { return typeof chunk === "string" ? chunk : chunk.toString("utf8"); } function appendIMessageCliStdout(current, chunk, maxChars = IMESSAGE_CLI_STDOUT_MAX_CHARS) { const next = current + chunkToString(chunk); if (next.length > maxChars) return { ok: false, message: `imsg stdout exceeded ${maxChars} characters` }; return { ok: true, value: next }; } function appendIMessageCliStderrTail(current, chunk, maxChars = IMESSAGE_CLI_STDERR_TAIL_CHARS) { const next = current + chunkToString(chunk); return next.length > maxChars ? next.slice(-maxChars) : next; } //#endregion //#region extensions/imessage/src/markdown-format.ts const MARKERS = [ { marker: "***", styles: ["bold", "italic"], requireWordBoundary: false }, { marker: "___", styles: ["underline", "italic"], requireWordBoundary: true }, { marker: "~~", styles: ["strikethrough"], requireWordBoundary: false }, { marker: "**", styles: ["bold"], requireWordBoundary: false }, { marker: "__", styles: ["underline"], requireWordBoundary: true }, { marker: "*", styles: ["italic"], requireWordBoundary: false }, { marker: "_", styles: ["italic"], requireWordBoundary: true } ]; function tryConsumeMarker(input, i, m) { if (!input.startsWith(m.marker, i)) return null; if (m.marker.length === 1 && input[i + 1] === m.marker) return null; if (m.marker.length === 2 && input[i + 2] === m.marker[0]) return null; const isAtBoundary = (ch) => ch === void 0 || /\s/.test(ch); if (m.requireWordBoundary && i > 0 && !isAtBoundary(input[i - 1])) return null; const startInner = i + m.marker.length; const close = input.indexOf(m.marker, startInner); if (close === -1 || close === startInner) return null; if (m.requireWordBoundary && !isAtBoundary(input[close + m.marker.length])) return null; const inner = input.slice(startInner, close); if (!inner.trim()) return null; return { close, inner }; } function parseInternal(input, baseOffset, sink) { let out = ""; let i = 0; while (i < input.length) { let consumed = false; for (const m of MARKERS) { const hit = tryConsumeMarker(input, i, m); if (!hit) continue; const innerOffset = baseOffset + out.length; const innerStripped = parseInternal(hit.inner, innerOffset, sink); for (const style of m.styles) sink.push({ start: innerOffset, length: innerStripped.length, styles: [style] }); out += innerStripped; i = hit.close + m.marker.length; consumed = true; break; } if (!consumed) { out += input[i]; i += 1; } } return out; } function extractMarkdownFormatRuns(input) { const ranges = []; return { text: parseInternal(input, 0, ranges), ranges }; } //#endregion export { appendIMessageCliStderrTail as n, appendIMessageCliStdout as r, extractMarkdownFormatRuns as t };