viberoom 0.6.0 → 0.7.0

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.
Files changed (110) hide show
  1. package/NOTICE +14 -0
  2. package/dist/hub.js +45 -4
  3. package/dist/main.js +1 -1
  4. package/dist/recipes.js +2 -1
  5. package/dist/shortcuts.js +1 -1
  6. package/package.json +1 -1
  7. package/ui/app.css +131 -107
  8. package/ui/app.js +334 -87
  9. package/ui/avatars.js +7 -14
  10. package/ui/components.css +116 -21
  11. package/ui/components.js +202 -1
  12. package/ui/fonts/anonymous-pro-cyrillic-400.woff2 +0 -0
  13. package/ui/fonts/anonymous-pro-cyrillic-700.woff2 +0 -0
  14. package/ui/fonts/anonymous-pro-latin-400.woff2 +0 -0
  15. package/ui/fonts/anonymous-pro-latin-700.woff2 +0 -0
  16. package/ui/fonts/anonymous-pro-latin-ext-400.woff2 +0 -0
  17. package/ui/fonts/anonymous-pro-latin-ext-700.woff2 +0 -0
  18. package/ui/fonts/anonymous-pro.css +7 -0
  19. package/ui/fonts/cascadia-code-cyrillic-ext.woff2 +0 -0
  20. package/ui/fonts/cascadia-code-cyrillic.woff2 +0 -0
  21. package/ui/fonts/cascadia-code-latin-ext.woff2 +0 -0
  22. package/ui/fonts/cascadia-code-latin.woff2 +0 -0
  23. package/ui/fonts/cascadia-code.css +5 -0
  24. package/ui/fonts/comfortaa-cyrillic-ext.woff2 +0 -0
  25. package/ui/fonts/comfortaa-cyrillic.woff2 +0 -0
  26. package/ui/fonts/comfortaa-latin-ext.woff2 +0 -0
  27. package/ui/fonts/comfortaa-latin.woff2 +0 -0
  28. package/ui/fonts/comfortaa.css +5 -0
  29. package/ui/fonts/exo-2-cyrillic-ext.woff2 +0 -0
  30. package/ui/fonts/exo-2-cyrillic.woff2 +0 -0
  31. package/ui/fonts/exo-2-latin-ext.woff2 +0 -0
  32. package/ui/fonts/exo-2-latin.woff2 +0 -0
  33. package/ui/fonts/exo-2.css +5 -0
  34. package/ui/fonts/golos-text-cyrillic-ext.woff2 +0 -0
  35. package/ui/fonts/golos-text-cyrillic.woff2 +0 -0
  36. package/ui/fonts/golos-text-latin-ext.woff2 +0 -0
  37. package/ui/fonts/golos-text-latin.woff2 +0 -0
  38. package/ui/fonts/golos-text.css +5 -0
  39. package/ui/fonts/ibm-plex-mono-cyrillic-400.woff2 +0 -0
  40. package/ui/fonts/ibm-plex-mono-cyrillic-600.woff2 +0 -0
  41. package/ui/fonts/ibm-plex-mono-cyrillic-700.woff2 +0 -0
  42. package/ui/fonts/ibm-plex-mono-cyrillic-ext-400.woff2 +0 -0
  43. package/ui/fonts/ibm-plex-mono-cyrillic-ext-600.woff2 +0 -0
  44. package/ui/fonts/ibm-plex-mono-cyrillic-ext-700.woff2 +0 -0
  45. package/ui/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
  46. package/ui/fonts/ibm-plex-mono-latin-600.woff2 +0 -0
  47. package/ui/fonts/ibm-plex-mono-latin-700.woff2 +0 -0
  48. package/ui/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
  49. package/ui/fonts/ibm-plex-mono-latin-ext-600.woff2 +0 -0
  50. package/ui/fonts/ibm-plex-mono-latin-ext-700.woff2 +0 -0
  51. package/ui/fonts/ibm-plex-mono.css +13 -0
  52. package/ui/fonts/ibm-plex-sans-cyrillic-400.woff2 +0 -0
  53. package/ui/fonts/ibm-plex-sans-cyrillic-600.woff2 +0 -0
  54. package/ui/fonts/ibm-plex-sans-cyrillic-700.woff2 +0 -0
  55. package/ui/fonts/ibm-plex-sans-cyrillic-ext-400.woff2 +0 -0
  56. package/ui/fonts/ibm-plex-sans-cyrillic-ext-600.woff2 +0 -0
  57. package/ui/fonts/ibm-plex-sans-cyrillic-ext-700.woff2 +0 -0
  58. package/ui/fonts/ibm-plex-sans-latin-400.woff2 +0 -0
  59. package/ui/fonts/ibm-plex-sans-latin-600.woff2 +0 -0
  60. package/ui/fonts/ibm-plex-sans-latin-700.woff2 +0 -0
  61. package/ui/fonts/ibm-plex-sans-latin-ext-400.woff2 +0 -0
  62. package/ui/fonts/ibm-plex-sans-latin-ext-600.woff2 +0 -0
  63. package/ui/fonts/ibm-plex-sans-latin-ext-700.woff2 +0 -0
  64. package/ui/fonts/ibm-plex-sans.css +13 -0
  65. package/ui/fonts/manrope-cyrillic-ext.woff2 +0 -0
  66. package/ui/fonts/manrope-cyrillic.woff2 +0 -0
  67. package/ui/fonts/manrope-latin-ext.woff2 +0 -0
  68. package/ui/fonts/manrope-latin.woff2 +0 -0
  69. package/ui/fonts/manrope.css +5 -0
  70. package/ui/fonts/montserrat-cyrillic-ext.woff2 +0 -0
  71. package/ui/fonts/montserrat-cyrillic.woff2 +0 -0
  72. package/ui/fonts/montserrat-latin-ext.woff2 +0 -0
  73. package/ui/fonts/montserrat-latin.woff2 +0 -0
  74. package/ui/fonts/montserrat.css +5 -0
  75. package/ui/fonts/open-sans-cyrillic-ext.woff2 +0 -0
  76. package/ui/fonts/open-sans-cyrillic.woff2 +0 -0
  77. package/ui/fonts/open-sans-latin-ext.woff2 +0 -0
  78. package/ui/fonts/open-sans-latin.woff2 +0 -0
  79. package/ui/fonts/open-sans.css +5 -0
  80. package/ui/fonts/pt-mono-cyrillic-ext.woff2 +0 -0
  81. package/ui/fonts/pt-mono-cyrillic.woff2 +0 -0
  82. package/ui/fonts/pt-mono-latin-ext.woff2 +0 -0
  83. package/ui/fonts/pt-mono-latin.woff2 +0 -0
  84. package/ui/fonts/pt-mono.css +5 -0
  85. package/ui/fonts/rubik-cyrillic-ext.woff2 +0 -0
  86. package/ui/fonts/rubik-cyrillic.woff2 +0 -0
  87. package/ui/fonts/rubik-latin-ext.woff2 +0 -0
  88. package/ui/fonts/rubik-latin.woff2 +0 -0
  89. package/ui/fonts/rubik.css +5 -0
  90. package/ui/fonts/source-sans-3-cyrillic-ext.woff2 +0 -0
  91. package/ui/fonts/source-sans-3-cyrillic.woff2 +0 -0
  92. package/ui/fonts/source-sans-3-latin-ext.woff2 +0 -0
  93. package/ui/fonts/source-sans-3-latin.woff2 +0 -0
  94. package/ui/fonts/source-sans-3.css +5 -0
  95. package/ui/fonts/ubuntu-sans-cyrillic-ext.woff2 +0 -0
  96. package/ui/fonts/ubuntu-sans-cyrillic.woff2 +0 -0
  97. package/ui/fonts/ubuntu-sans-latin-ext.woff2 +0 -0
  98. package/ui/fonts/ubuntu-sans-latin.woff2 +0 -0
  99. package/ui/fonts/ubuntu-sans.css +5 -0
  100. package/ui/fonts/victor-mono-cyrillic-ext.woff2 +0 -0
  101. package/ui/fonts/victor-mono-cyrillic.woff2 +0 -0
  102. package/ui/fonts/victor-mono-latin-ext.woff2 +0 -0
  103. package/ui/fonts/victor-mono-latin.woff2 +0 -0
  104. package/ui/fonts/victor-mono.css +5 -0
  105. package/ui/index.html +15 -6
  106. package/ui/looks.css +2446 -0
  107. package/ui/manifest.json +3 -3
  108. package/ui/theme.css +114 -84
  109. package/ui/tokens.js +315 -29
  110. package/ui/ui.js +2 -0
package/NOTICE CHANGED
@@ -11,6 +11,20 @@ This product bundles the following third-party material:
11
11
  - JetBrains Mono: Copyright 2020 The JetBrains Mono Project Authors.
12
12
  - Fira Code: Copyright 2014-2020 The Fira Code Project Authors.
13
13
  - Source Code Pro: Copyright 2010-2019 Adobe (http://www.adobe.com/).
14
+ - Open Sans: Copyright 2020 The Open Sans Project Authors.
15
+ - Source Sans 3: Copyright 2010-2020 Adobe (http://www.adobe.com/).
16
+ - IBM Plex Sans, IBM Plex Mono: Copyright 2017 IBM Corp.
17
+ - Manrope: Copyright 2018 The Manrope Project Authors.
18
+ - Rubik: Copyright 2015 The Rubik Project Authors.
19
+ - Montserrat: Copyright 2011 The Montserrat Project Authors.
20
+ - Golos Text: Copyright 2023 The Golos Text Project Authors.
21
+ - Exo 2: Copyright 2013 The Exo 2 Project Authors.
22
+ - Comfortaa: Copyright 2011 The Comfortaa Project Authors.
23
+ - Ubuntu Sans: Copyright 2022 The Ubuntu Sans Project Authors.
24
+ - PT Mono: Copyright 2011 ParaType Ltd.
25
+ - Victor Mono: Copyright 2019 The Victor Mono Project Authors.
26
+ - Anonymous Pro: Copyright 2009 The Anonymous Pro Project Authors.
27
+ - Cascadia Code: Copyright 2019 Microsoft Corporation.
14
28
 
15
29
  - Vendor icons (assets/vendors/): the logos of Claude, Codex, Gemini, Cursor,
16
30
  OpenCode and GitHub Copilot, as published in the Agent Client Protocol
package/dist/hub.js CHANGED
@@ -11,9 +11,13 @@ import { DEFAULT_ROOM_SETTINGS } from "./persona.js";
11
11
  import { Room } from "./room.js";
12
12
  import { SkillLibrary } from "./skills.js";
13
13
  import { TemplateLibrary, roomSettingsFromTemplate } from "./templates.js";
14
- export const TEXT_FONTS = ["nunito", "inter", "noto-sans", "arial", "system"];
15
- export const MONO_FONTS = ["jetbrains-mono", "fira-code", "source-code-pro", "system"];
16
- export const DEFAULT_APPEARANCE = { chatFontSize: 14.5, font: "nunito", mono: "jetbrains-mono" };
14
+ export const ADJUSTABLE = {
15
+ canvas: "colour", panel: "colour", bubble: "colour", mine: "colour", ring: "colour", ink: "colour", muted: "colour", accent: "colour",
16
+ face: "colour", logo: "colour", logoInk: "colour", corners: "scale",
17
+ };
18
+ export const TEXT_FONTS = ["nunito", "inter", "noto-sans", "open-sans", "source-sans-3", "ibm-plex-sans", "manrope", "rubik", "montserrat", "golos-text", "exo-2", "comfortaa", "ubuntu-sans", "arial", "system"];
19
+ export const MONO_FONTS = ["jetbrains-mono", "fira-code", "source-code-pro", "ibm-plex-mono", "pt-mono", "victor-mono", "anonymous-pro", "cascadia-code", "system"];
20
+ export const DEFAULT_APPEARANCE = { chatFontSize: 14.5, font: "nunito", mono: "jetbrains-mono", look: "classic", custom: {} };
17
21
  export const DIAGRAM_PRESETS = ["pop", "lavender", "mint", "sunset", "slate"];
18
22
  const ROOM_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,39}$/;
19
23
  const INSTRUCTION_FILES = ["CLAUDE.md", "AGENTS.md", "GEMINI.md", ".cursorrules"];
@@ -215,7 +219,44 @@ export class Hub extends EventEmitter {
215
219
  const mono = String(a.mono ?? next.appearance?.mono ?? DEFAULT_APPEARANCE.mono);
216
220
  if (!MONO_FONTS.includes(mono))
217
221
  throw new Error(`appearance.mono must be one of ${MONO_FONTS.join(", ")}`);
218
- next.appearance = { chatFontSize: Math.round(chatFontSize * 2) / 2, font, mono };
222
+ const look = String(a.look ?? next.appearance?.look ?? DEFAULT_APPEARANCE.look);
223
+ if (!/^[a-z][a-z0-9-]{0,30}$/.test(look))
224
+ throw new Error("appearance.look must be a short lower-case id");
225
+ const custom = { ...(next.appearance?.custom ?? {}) };
226
+ if (a.custom !== undefined && typeof a.custom === "object" && a.custom) {
227
+ for (const [lookId, values] of Object.entries(a.custom)) {
228
+ if (!/^[a-z][a-z0-9-]{0,30}$/.test(lookId))
229
+ throw new Error("appearance.custom: a look id is a short lower-case id");
230
+ if (values === null) {
231
+ delete custom[lookId];
232
+ continue;
233
+ }
234
+ if (typeof values !== "object")
235
+ throw new Error("appearance.custom: each look takes an object of adjustments");
236
+ const clean = {};
237
+ for (const [key, value] of Object.entries(values)) {
238
+ const kind = ADJUSTABLE[key];
239
+ if (!kind)
240
+ throw new Error(`appearance.custom: "${key}" is not adjustable (${Object.keys(ADJUSTABLE).join(", ")})`);
241
+ if (kind === "colour") {
242
+ if (typeof value !== "string" || !/^#[0-9a-fA-F]{6}$/.test(value))
243
+ throw new Error(`appearance.custom.${key} must be a colour like #1a2b3c`);
244
+ clean[key] = value.toLowerCase();
245
+ }
246
+ else {
247
+ const n = typeof value === "string" || typeof value === "number" ? Number(value) : NaN;
248
+ if (!Number.isFinite(n) || n < 0 || n > 2)
249
+ throw new Error(`appearance.custom.${key} must be a number between 0 and 2`);
250
+ clean[key] = String(Math.round(n * 100) / 100);
251
+ }
252
+ }
253
+ if (Object.keys(clean).length)
254
+ custom[lookId] = clean;
255
+ else
256
+ delete custom[lookId];
257
+ }
258
+ }
259
+ next.appearance = { chatFontSize: Math.round(chatFontSize * 2) / 2, font, mono, look, custom };
219
260
  }
220
261
  next.appearance = { ...DEFAULT_APPEARANCE, ...(next.appearance ?? {}) };
221
262
  if (!next.editor)
package/dist/main.js CHANGED
@@ -226,7 +226,7 @@ function openWindow(url, options, log) {
226
226
  }
227
227
  }
228
228
  log.info("opening the default browser");
229
- exec(openUrlCommand(url), () => undefined);
229
+ exec(openUrlCommand(url), { windowsHide: true }, () => undefined);
230
230
  }
231
231
  async function runDoctor(options, info) {
232
232
  const lines = [];
package/dist/recipes.js CHANGED
@@ -26,7 +26,7 @@ function resolveGlobalNpmRoot() {
26
26
  if (isWindows && process.env.APPDATA)
27
27
  candidates.push(join(process.env.APPDATA, "npm", "node_modules"));
28
28
  try {
29
- const out = execSync("npm root -g", { encoding: "utf8", shell: isWindows ? "cmd.exe" : "/bin/sh", stdio: ["ignore", "pipe", "ignore"] }).trim();
29
+ const out = execSync("npm root -g", { encoding: "utf8", shell: isWindows ? "cmd.exe" : "/bin/sh", stdio: ["ignore", "pipe", "ignore"], windowsHide: true }).trim();
30
30
  if (out)
31
31
  candidates.push(out);
32
32
  }
@@ -72,6 +72,7 @@ function resolveOnPath(names) {
72
72
  encoding: "utf8",
73
73
  shell: isWindows ? "cmd.exe" : "/bin/sh",
74
74
  stdio: ["ignore", "pipe", "ignore"],
75
+ windowsHide: true,
75
76
  });
76
77
  const first = out
77
78
  .split(/\r?\n/)
package/dist/shortcuts.js CHANGED
@@ -126,7 +126,7 @@ export function installShortcuts(o) {
126
126
  const aumid = appUserModelId(browser, "http://127.0.0.1:4810/", basename(join(o.dataDir, "browser")));
127
127
  for (const lnk of windowsShortcutPaths(home, env, o.desktop)) {
128
128
  mkdirSync(join(lnk, ".."), { recursive: true });
129
- const r = spawnSync("powershell", ["-NoProfile", "-Command", shortcutScript(lnk, wscript, vbs, o.dataDir, ico, aumid)], { encoding: "utf8" });
129
+ const r = spawnSync("powershell", ["-NoProfile", "-Command", shortcutScript(lnk, wscript, vbs, o.dataDir, ico, aumid)], { encoding: "utf8", windowsHide: true });
130
130
  if (r.status === 0)
131
131
  result.files.push(lnk);
132
132
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "viberoom",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "viberoom: group chat rooms for a human and several coding agents over the Agent Client Protocol",
5
5
  "type": "module",
6
6
  "engines": {