viberoom 0.6.1 → 0.8.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 (115) hide show
  1. package/NOTICE +14 -0
  2. package/README.md +11 -0
  3. package/dist/hub.js +101 -14
  4. package/dist/look-lint.js +180 -0
  5. package/dist/looks.js +151 -0
  6. package/dist/mcp-skills-server.js +87 -0
  7. package/dist/persona.js +2 -0
  8. package/dist/room.js +134 -4
  9. package/dist/server.js +70 -0
  10. package/dist/skills.js +23 -2
  11. package/package.json +1 -1
  12. package/ui/app.css +142 -114
  13. package/ui/app.js +423 -102
  14. package/ui/avatars.js +7 -14
  15. package/ui/components.css +156 -80
  16. package/ui/components.js +207 -1
  17. package/ui/fonts/anonymous-pro-cyrillic-400.woff2 +0 -0
  18. package/ui/fonts/anonymous-pro-cyrillic-700.woff2 +0 -0
  19. package/ui/fonts/anonymous-pro-latin-400.woff2 +0 -0
  20. package/ui/fonts/anonymous-pro-latin-700.woff2 +0 -0
  21. package/ui/fonts/anonymous-pro-latin-ext-400.woff2 +0 -0
  22. package/ui/fonts/anonymous-pro-latin-ext-700.woff2 +0 -0
  23. package/ui/fonts/anonymous-pro.css +7 -0
  24. package/ui/fonts/cascadia-code-cyrillic-ext.woff2 +0 -0
  25. package/ui/fonts/cascadia-code-cyrillic.woff2 +0 -0
  26. package/ui/fonts/cascadia-code-latin-ext.woff2 +0 -0
  27. package/ui/fonts/cascadia-code-latin.woff2 +0 -0
  28. package/ui/fonts/cascadia-code.css +5 -0
  29. package/ui/fonts/comfortaa-cyrillic-ext.woff2 +0 -0
  30. package/ui/fonts/comfortaa-cyrillic.woff2 +0 -0
  31. package/ui/fonts/comfortaa-latin-ext.woff2 +0 -0
  32. package/ui/fonts/comfortaa-latin.woff2 +0 -0
  33. package/ui/fonts/comfortaa.css +5 -0
  34. package/ui/fonts/exo-2-cyrillic-ext.woff2 +0 -0
  35. package/ui/fonts/exo-2-cyrillic.woff2 +0 -0
  36. package/ui/fonts/exo-2-latin-ext.woff2 +0 -0
  37. package/ui/fonts/exo-2-latin.woff2 +0 -0
  38. package/ui/fonts/exo-2.css +5 -0
  39. package/ui/fonts/golos-text-cyrillic-ext.woff2 +0 -0
  40. package/ui/fonts/golos-text-cyrillic.woff2 +0 -0
  41. package/ui/fonts/golos-text-latin-ext.woff2 +0 -0
  42. package/ui/fonts/golos-text-latin.woff2 +0 -0
  43. package/ui/fonts/golos-text.css +5 -0
  44. package/ui/fonts/ibm-plex-mono-cyrillic-400.woff2 +0 -0
  45. package/ui/fonts/ibm-plex-mono-cyrillic-600.woff2 +0 -0
  46. package/ui/fonts/ibm-plex-mono-cyrillic-700.woff2 +0 -0
  47. package/ui/fonts/ibm-plex-mono-cyrillic-ext-400.woff2 +0 -0
  48. package/ui/fonts/ibm-plex-mono-cyrillic-ext-600.woff2 +0 -0
  49. package/ui/fonts/ibm-plex-mono-cyrillic-ext-700.woff2 +0 -0
  50. package/ui/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
  51. package/ui/fonts/ibm-plex-mono-latin-600.woff2 +0 -0
  52. package/ui/fonts/ibm-plex-mono-latin-700.woff2 +0 -0
  53. package/ui/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
  54. package/ui/fonts/ibm-plex-mono-latin-ext-600.woff2 +0 -0
  55. package/ui/fonts/ibm-plex-mono-latin-ext-700.woff2 +0 -0
  56. package/ui/fonts/ibm-plex-mono.css +13 -0
  57. package/ui/fonts/ibm-plex-sans-cyrillic-400.woff2 +0 -0
  58. package/ui/fonts/ibm-plex-sans-cyrillic-600.woff2 +0 -0
  59. package/ui/fonts/ibm-plex-sans-cyrillic-700.woff2 +0 -0
  60. package/ui/fonts/ibm-plex-sans-cyrillic-ext-400.woff2 +0 -0
  61. package/ui/fonts/ibm-plex-sans-cyrillic-ext-600.woff2 +0 -0
  62. package/ui/fonts/ibm-plex-sans-cyrillic-ext-700.woff2 +0 -0
  63. package/ui/fonts/ibm-plex-sans-latin-400.woff2 +0 -0
  64. package/ui/fonts/ibm-plex-sans-latin-600.woff2 +0 -0
  65. package/ui/fonts/ibm-plex-sans-latin-700.woff2 +0 -0
  66. package/ui/fonts/ibm-plex-sans-latin-ext-400.woff2 +0 -0
  67. package/ui/fonts/ibm-plex-sans-latin-ext-600.woff2 +0 -0
  68. package/ui/fonts/ibm-plex-sans-latin-ext-700.woff2 +0 -0
  69. package/ui/fonts/ibm-plex-sans.css +13 -0
  70. package/ui/fonts/manrope-cyrillic-ext.woff2 +0 -0
  71. package/ui/fonts/manrope-cyrillic.woff2 +0 -0
  72. package/ui/fonts/manrope-latin-ext.woff2 +0 -0
  73. package/ui/fonts/manrope-latin.woff2 +0 -0
  74. package/ui/fonts/manrope.css +5 -0
  75. package/ui/fonts/montserrat-cyrillic-ext.woff2 +0 -0
  76. package/ui/fonts/montserrat-cyrillic.woff2 +0 -0
  77. package/ui/fonts/montserrat-latin-ext.woff2 +0 -0
  78. package/ui/fonts/montserrat-latin.woff2 +0 -0
  79. package/ui/fonts/montserrat.css +5 -0
  80. package/ui/fonts/open-sans-cyrillic-ext.woff2 +0 -0
  81. package/ui/fonts/open-sans-cyrillic.woff2 +0 -0
  82. package/ui/fonts/open-sans-latin-ext.woff2 +0 -0
  83. package/ui/fonts/open-sans-latin.woff2 +0 -0
  84. package/ui/fonts/open-sans.css +5 -0
  85. package/ui/fonts/pt-mono-cyrillic-ext.woff2 +0 -0
  86. package/ui/fonts/pt-mono-cyrillic.woff2 +0 -0
  87. package/ui/fonts/pt-mono-latin-ext.woff2 +0 -0
  88. package/ui/fonts/pt-mono-latin.woff2 +0 -0
  89. package/ui/fonts/pt-mono.css +5 -0
  90. package/ui/fonts/rubik-cyrillic-ext.woff2 +0 -0
  91. package/ui/fonts/rubik-cyrillic.woff2 +0 -0
  92. package/ui/fonts/rubik-latin-ext.woff2 +0 -0
  93. package/ui/fonts/rubik-latin.woff2 +0 -0
  94. package/ui/fonts/rubik.css +5 -0
  95. package/ui/fonts/source-sans-3-cyrillic-ext.woff2 +0 -0
  96. package/ui/fonts/source-sans-3-cyrillic.woff2 +0 -0
  97. package/ui/fonts/source-sans-3-latin-ext.woff2 +0 -0
  98. package/ui/fonts/source-sans-3-latin.woff2 +0 -0
  99. package/ui/fonts/source-sans-3.css +5 -0
  100. package/ui/fonts/ubuntu-sans-cyrillic-ext.woff2 +0 -0
  101. package/ui/fonts/ubuntu-sans-cyrillic.woff2 +0 -0
  102. package/ui/fonts/ubuntu-sans-latin-ext.woff2 +0 -0
  103. package/ui/fonts/ubuntu-sans-latin.woff2 +0 -0
  104. package/ui/fonts/ubuntu-sans.css +5 -0
  105. package/ui/fonts/victor-mono-cyrillic-ext.woff2 +0 -0
  106. package/ui/fonts/victor-mono-cyrillic.woff2 +0 -0
  107. package/ui/fonts/victor-mono-latin-ext.woff2 +0 -0
  108. package/ui/fonts/victor-mono-latin.woff2 +0 -0
  109. package/ui/fonts/victor-mono.css +5 -0
  110. package/ui/index.html +16 -6
  111. package/ui/looks.css +2831 -0
  112. package/ui/manifest.json +3 -3
  113. package/ui/theme.css +203 -96
  114. package/ui/tokens.js +800 -45
  115. package/ui/ui.js +2 -0
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Rubik"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/rubik-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Rubik"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/rubik-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Rubik"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/rubik-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Rubik"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/rubik-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/source-sans-3-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/source-sans-3-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/source-sans-3-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/source-sans-3-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Ubuntu Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/ubuntu-sans-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Ubuntu Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/ubuntu-sans-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Ubuntu Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/ubuntu-sans-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Ubuntu Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/ubuntu-sans-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Victor Mono"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/victor-mono-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Victor Mono"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/victor-mono-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Victor Mono"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/victor-mono-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Victor Mono"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/victor-mono-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
package/ui/index.html CHANGED
@@ -5,12 +5,14 @@
5
5
  <meta charset="utf-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
7
  <title>viberoom</title>
8
- <link rel="icon" href="/icon.svg?v=7" type="image/svg+xml">
9
- <link rel="icon" href="/favicon.ico?v=7" sizes="any">
10
- <link rel="apple-touch-icon" href="/icon-256.png?v=7">
8
+ <link rel="icon" href="/favicon.ico?v=8" sizes="16x16 32x32 48x48 64x64 128x128 256x256">
9
+ <link rel="icon" href="/icon-256.png?v=8" type="image/png" sizes="256x256">
10
+ <link rel="apple-touch-icon" href="/icon-256.png?v=8">
11
11
  <link rel="manifest" href="/manifest.json">
12
12
  <meta name="theme-color" content="#6d5dfc">
13
13
  <link rel="stylesheet" href="/theme.css">
14
+ <link rel="stylesheet" href="/looks.css">
15
+ <link rel="stylesheet" href="/looks-custom.css" id="looks-custom">
14
16
  <link rel="stylesheet" href="/components.css">
15
17
  <link rel="stylesheet" href="/app.css">
16
18
  </head>
@@ -133,6 +135,14 @@
133
135
  <div class="actions"><button type="submit" data-ui="button" data-kind="primary" data-size="lg">Start vibing</button></div>
134
136
  </form>
135
137
  </dialog>
138
+ <dialog id="look-dialog" class="dialog wide">
139
+ <form id="look-form" method="dialog">
140
+ <h3><span class="h-ico" data-icon="eye"></span>Pick a look</h3>
141
+ <p class="lead">How viberoom is drawn. A click tries a look on the window at once; change it, or fine-tune it, any time under Settings → Appearance.</p>
142
+ <div class="look-cards" id="look-dialog-cards"></div>
143
+ <div class="actions"><button type="submit" data-ui="button" data-kind="primary" data-size="lg">Keep this look</button></div>
144
+ </form>
145
+ </dialog>
136
146
  <dialog id="confirm-dialog" class="dialog narrow">
137
147
  <form method="dialog">
138
148
  <h3 id="cf-title">Are you sure?</h3>
@@ -201,7 +211,7 @@
201
211
  <details class="geek" id="inv-geek">
202
212
  <summary><span data-icon="geek"></span>for geeks<span class="g-hint">reply delay, skills, where the vibemate lives</span><span class="chev" data-icon="down"></span></summary>
203
213
  <div class="geek-body">
204
- <label>Reply delay override, seconds<button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>Empty: the room's delay. A value here overrides it for this vibemate only. Before each turn the vibemate waits a random 0–N seconds, so replies cross less often; messages that arrive meanwhile land in its backlog.</span><input id="inv-delay" type="number" min="0" max="120" step="0.5" placeholder="the room's"></label>
214
+ <label>Reply delay override, seconds<button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>Empty: the room's delay. A value here overrides it for this vibemate only. Before each turn the vibemate waits a random 0–N seconds, so replies cross less often; messages that arrive meanwhile land in its backlog.</span><span data-ui="number-field"><input id="inv-delay" type="number" min="0" max="120" step="0.5" placeholder="the room's"><span class="steps" aria-hidden="true"><button type="button" data-act="up" tabindex="-1" title="More"></button><button type="button" data-act="down" tabindex="-1" title="Less"></button></span></span></label>
205
215
  <label>Skills <span class="hint">(from the library)</span><div id="inv-skills" class="check-list"></div></label>
206
216
  <p class="hint" id="inv-where"></p>
207
217
  <p class="hint" id="inv-note"></p>
@@ -248,7 +258,7 @@
248
258
  <h3><span class="h-ico" data-icon="refresh"></span>Welcome back</h3>
249
259
  <p class="lead" id="rc-intro"></p>
250
260
  <div class="choice-list">
251
- <label class="choice"><input type="radio" name="rc-mode" value="replay" checked> <span><strong>Replay the last</strong> <input id="rc-replay" type="number" min="0" max="500" value="10" class="rc-num"> <strong>chat messages</strong> — a fresh start with the recent history.<span class="rc-is-default" hidden>default</span><button type="button" class="link-btn rc-default" data-mode="replay" hidden>Make default</button><button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>A new vibemate session that reads the recent room history (room events in between come along), like a person coming back from a break. Cheap and works for every vibemate.</span></span></label>
261
+ <label class="choice"><input type="radio" name="rc-mode" value="replay" checked> <span><strong>Replay the last</strong> <span data-ui="number-field" class="rc-num"><input id="rc-replay" type="number" min="0" max="500" value="10"><span class="steps" aria-hidden="true"><button type="button" data-act="up" tabindex="-1" title="More"></button><button type="button" data-act="down" tabindex="-1" title="Less"></button></span></span> <strong>chat messages</strong> — a fresh start with the recent history.<span class="rc-is-default" hidden>default</span><button type="button" class="link-btn rc-default" data-mode="replay" hidden>Make default</button><button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>A new vibemate session that reads the recent room history (room events in between come along), like a person coming back from a break. Cheap and works for every vibemate.</span></span></label>
252
262
  <label class="choice"><input type="radio" name="rc-mode" value="load"> <span><strong>Restore the full session</strong> — the vibemate comes back with everything it knew.<span class="rc-is-default" hidden>default</span><button type="button" class="link-btn rc-default" data-mode="load" hidden>Make default</button><button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>ACP <code>session/load</code>: the vibemate reloads its own stored conversation, with tool results and reasoning. Its next turn pays for the whole history again. Falls back to replay if the vibemate cannot load it.</span></span></label>
253
263
  </div>
254
264
  <table class="rc-table" id="rc-table"></table>
@@ -295,7 +305,7 @@
295
305
  <div class="fv-tools" id="fv-tools" hidden>
296
306
  <label class="search fv-find"><span class="search-icon" data-icon="search"></span><input id="fv-search" type="search" placeholder="Find in this file…" autocomplete="off"></label>
297
307
  <span class="fv-hits" id="fv-hits"></span>
298
- <label class="fv-goto">line <input id="fv-line" type="number" min="1" step="1" placeholder="1"></label>
308
+ <label class="fv-goto">line <span data-ui="number-field" class="fv-num"><input id="fv-line" type="number" min="1" step="1" placeholder="1"><span class="steps" aria-hidden="true"><button type="button" data-act="up" tabindex="-1" title="More"></button><button type="button" data-act="down" tabindex="-1" title="Less"></button></span></span></label>
299
309
  <label class="fv-wrap"><input id="fv-wrap" type="checkbox"> wrap</label>
300
310
  <span class="fv-count" id="fv-count"></span>
301
311
  </div>