@agent-link/server 0.1.174 → 0.1.175

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-link/server",
3
- "version": "0.1.174",
3
+ "version": "0.1.175",
4
4
  "description": "AgentLink relay server",
5
5
  "license": "MIT",
6
6
  "repository": {
package/web/app.js CHANGED
@@ -666,13 +666,23 @@ const App = {
666
666
  watch(loop.loopsList, () => { loadingLoops.value = false; });
667
667
 
668
668
  // ── Lifecycle ──
669
- onMounted(() => { connect(scheduleHighlight); });
669
+ function _onVisibilityChange() {
670
+ if (!document.hidden) {
671
+ nextTick(() => scrollToBottom(true));
672
+ }
673
+ }
674
+
675
+ onMounted(() => {
676
+ connect(scheduleHighlight);
677
+ document.addEventListener('visibilitychange', _onVisibilityChange);
678
+ });
670
679
  onUnmounted(() => {
671
680
  closeWs(); streaming.cleanup(); cleanupScroll(); cleanupHighlight();
672
681
  window.removeEventListener('resize', _resizeHandler);
673
682
  document.removeEventListener('click', _workdirMenuClickHandler);
674
683
  document.removeEventListener('click', _slashMenuClickOutside);
675
684
  document.removeEventListener('keydown', _workdirMenuKeyHandler);
685
+ document.removeEventListener('visibilitychange', _onVisibilityChange);
676
686
  });
677
687
 
678
688
  return {
package/web/css/tools.css CHANGED
@@ -93,6 +93,12 @@
93
93
  border-left: 1px solid var(--border);
94
94
  padding-left: 8px;
95
95
  overflow: hidden;
96
+ animation: toolExpand 0.15s ease-out;
97
+ }
98
+
99
+ @keyframes toolExpand {
100
+ from { opacity: 0; max-height: 0; }
101
+ to { opacity: 1; max-height: 500px; }
96
102
  }
97
103
 
98
104
  .tool-block {
@@ -6,7 +6,7 @@
6
6
  * @returns {{ onScroll, scrollToBottom, cleanup }}
7
7
  */
8
8
  export function createScrollManager(selector) {
9
- let _scrollTimer = null;
9
+ let _rafId = null;
10
10
  let _userScrolledUp = false;
11
11
 
12
12
  function onScroll(e) {
@@ -16,16 +16,17 @@ export function createScrollManager(selector) {
16
16
 
17
17
  function scrollToBottom(force) {
18
18
  if (_userScrolledUp && !force) return;
19
- if (_scrollTimer) return;
20
- _scrollTimer = setTimeout(() => {
21
- _scrollTimer = null;
19
+ if (document.hidden) return;
20
+ if (_rafId) return;
21
+ _rafId = requestAnimationFrame(() => {
22
+ _rafId = null;
22
23
  const el = document.querySelector(selector);
23
24
  if (el) el.scrollTop = el.scrollHeight;
24
- }, 50);
25
+ });
25
26
  }
26
27
 
27
28
  function cleanup() {
28
- if (_scrollTimer) { clearTimeout(_scrollTimer); _scrollTimer = null; }
29
+ if (_rafId) { cancelAnimationFrame(_rafId); _rafId = null; }
29
30
  }
30
31
 
31
32
  return { onScroll, scrollToBottom, cleanup };