agentgui 1.0.128 → 1.0.129
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/package.json +1 -1
- package/static/index.html +2 -0
- package/static/js/streaming-renderer.js +5 -57
package/package.json
CHANGED
package/static/index.html
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
<link href="https://unpkg.com/rippleui@0.14.0/dist/ripple.css" rel="stylesheet">
|
|
10
10
|
<link href="https://unpkg.com/prism@1.29.0/themes/prism-dark.css" rel="stylesheet">
|
|
11
|
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css" rel="stylesheet">
|
|
12
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
|
|
11
13
|
|
|
12
14
|
<style>
|
|
13
15
|
*, *::before, *::after { box-sizing: border-box; }
|
|
@@ -991,64 +991,12 @@ class StreamingRenderer {
|
|
|
991
991
|
* Render code with basic syntax highlighting
|
|
992
992
|
*/
|
|
993
993
|
static renderCodeWithHighlight(code, esc) {
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
const id = `\x00T${tokens.length}\x00`;
|
|
999
|
-
tokens.push({ id, cls, text });
|
|
1000
|
-
return id;
|
|
1001
|
-
};
|
|
1002
|
-
|
|
1003
|
-
let src = code;
|
|
1004
|
-
|
|
1005
|
-
// Detect JSON
|
|
1006
|
-
const isJSON = (code.trim().startsWith('{') || code.trim().startsWith('[')) &&
|
|
1007
|
-
code.includes('"') && (code.includes(':') || code.includes(','));
|
|
1008
|
-
|
|
1009
|
-
if (isJSON) {
|
|
1010
|
-
// JSON keys
|
|
1011
|
-
src = src.replace(/"([^"]+)"\s*:/g, (m, k) => `"${mkToken('jk', k)}":`);
|
|
1012
|
-
// JSON string values
|
|
1013
|
-
src = src.replace(/:\s*"([^"]*)"/g, (m, v) => `: "${mkToken('js', v)}"`);
|
|
1014
|
-
// JSON numbers
|
|
1015
|
-
src = src.replace(/:\s*(\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)/g, (m, n) => `: ${mkToken('jn', n)}`);
|
|
1016
|
-
// JSON booleans/null
|
|
1017
|
-
src = src.replace(/:\s*(true|false|null)/g, (m, b) => `: ${mkToken('jb', b)}`);
|
|
1018
|
-
} else {
|
|
1019
|
-
// Comments
|
|
1020
|
-
src = src.replace(/(\/\/[^\n]*)/g, (m) => mkToken('cm', m));
|
|
1021
|
-
src = src.replace(/(\/\*[\s\S]*?\*\/)/g, (m) => mkToken('cm', m));
|
|
1022
|
-
src = src.replace(/(#[^\n]*)/g, (m) => mkToken('cm', m));
|
|
1023
|
-
// Strings
|
|
1024
|
-
src = src.replace(/(["'])(?:[^\\]|\\.)*?\1/g, (m) => mkToken('st', m));
|
|
1025
|
-
src = src.replace(/`([^`]*)`/g, (m) => mkToken('st', m));
|
|
1026
|
-
// Keywords
|
|
1027
|
-
src = src.replace(/\b(function|const|let|var|class|import|export|async|await|return|if|else|for|while|try|catch|throw|new|typeof|instanceof|this|super|switch|case|default|break|continue|do|def|from|elif|except|raise|with|as|lambda|pass|yield|global|nonlocal|public|private|protected|static|final|abstract|interface|extends|implements|package|void)\b/g, (m) => mkToken('kw', m));
|
|
1028
|
-
// Booleans/null
|
|
1029
|
-
src = src.replace(/\b(true|false|null|undefined|None|True|False|nil)\b/g, (m) => mkToken('bl', m));
|
|
1030
|
-
// Numbers
|
|
1031
|
-
src = src.replace(/\b(\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/g, (m) => mkToken('nu', m));
|
|
1032
|
-
// Functions
|
|
1033
|
-
src = src.replace(/\b([a-zA-Z_][a-zA-Z0-9_]*)(?=\s*\()/g, (m) => mkToken('fn', m));
|
|
1034
|
-
// Operators
|
|
1035
|
-
src = src.replace(/(===|!==|==|!=|<=|>=|&&|\|\||\+=|-=|\*=|\/=|%=|=>|->)/g, (m) => mkToken('op', m));
|
|
1036
|
-
}
|
|
1037
|
-
|
|
1038
|
-
// Now escape HTML on the tokenized source (tokens are safe null-byte markers)
|
|
1039
|
-
let highlighted = esc(src);
|
|
1040
|
-
|
|
1041
|
-
// Replace tokens with actual styled spans
|
|
1042
|
-
const styles = {
|
|
1043
|
-
jk: 'color:#3b82f6;font-weight:600', js: 'color:#10b981', jn: 'color:#f59e0b', jb: 'color:#ef4444',
|
|
1044
|
-
cm: 'color:#6b7280;font-style:italic', st: 'color:#10b981', kw: 'color:#8b5cf6;font-weight:600',
|
|
1045
|
-
bl: 'color:#ef4444', nu: 'color:#f59e0b', fn: 'color:#3b82f6', op: 'color:#a855f7'
|
|
1046
|
-
};
|
|
1047
|
-
for (const { id, cls, text } of tokens) {
|
|
1048
|
-
highlighted = highlighted.replace(id, `<span style="${styles[cls]}">${esc(text)}</span>`);
|
|
994
|
+
const preStyle = "background:#1e293b;padding:1rem;border-radius:0.375rem;overflow-x:auto;font-family:'Monaco','Menlo','Ubuntu Mono',monospace;font-size:0.875rem;line-height:1.6;color:#e2e8f0;border:1px solid #334155";
|
|
995
|
+
if (typeof hljs !== 'undefined') {
|
|
996
|
+
const result = hljs.highlightAuto(code);
|
|
997
|
+
return `<pre style="${preStyle}"><code class="hljs">${result.value}</code></pre>`;
|
|
1049
998
|
}
|
|
1050
|
-
|
|
1051
|
-
return `<pre style="background:#1e293b;padding:1rem;border-radius:0.375rem;overflow-x:auto;font-family:'Monaco','Menlo','Ubuntu Mono',monospace;font-size:0.875rem;line-height:1.6;color:#e2e8f0;border:1px solid #334155">${highlighted}</pre>`;
|
|
999
|
+
return `<pre style="${preStyle}">${esc(code)}</pre>`;
|
|
1052
1000
|
}
|
|
1053
1001
|
|
|
1054
1002
|
/**
|