agentgui 1.0.128 → 1.0.130

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/database.js CHANGED
@@ -253,9 +253,9 @@ export const queries = {
253
253
  const id = generateId('conv');
254
254
  const now = Date.now();
255
255
  const stmt = db.prepare(
256
- `INSERT INTO conversations (id, agentType, title, created_at, updated_at, status, workingDirectory) VALUES (?, ?, ?, ?, ?, ?, ?)`
256
+ `INSERT INTO conversations (id, agentId, agentType, title, created_at, updated_at, status, workingDirectory) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
257
257
  );
258
- stmt.run(id, agentType, title, now, now, 'active', workingDirectory);
258
+ stmt.run(id, agentType, agentType, title, now, now, 'active', workingDirectory);
259
259
 
260
260
  return {
261
261
  id,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentgui",
3
- "version": "1.0.128",
3
+ "version": "1.0.130",
4
4
  "description": "Multi-agent ACP client with real-time communication",
5
5
  "type": "module",
6
6
  "main": "server.js",
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
- // Tokenize-then-replace approach: collect spans as tokens so regexes
995
- // never see previously-injected HTML, preventing cascading corruption.
996
- const tokens = [];
997
- const mkToken = (cls, text) => {
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
  /**