@industry-theme/xterm-terminal-panel 0.5.2 → 0.5.4

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/dist/index.js CHANGED
@@ -32,7 +32,7 @@ import {
32
32
  context,
33
33
  SpanStatusCode
34
34
  } from "@opentelemetry/api";
35
- var PACKAGE_VERSION = "0.5.1";
35
+ var PACKAGE_VERSION = "0.5.4";
36
36
  var TRACER_NAME = "@industry-theme/xterm-terminal-panel";
37
37
  var TRACER_VERSION = PACKAGE_VERSION;
38
38
  function getTracer() {
@@ -1782,16 +1782,40 @@ var TerminalPanel = ({
1782
1782
  };
1783
1783
  // src/panels/TabbedTerminalPanel.tsx
1784
1784
  import { useTheme as useTheme6 } from "@principal-ade/industry-theme";
1785
- import { Terminal as TerminalIcon2, Lock as Lock2, Unlock as Unlock2, Box, Boxes, Loader2 } from "lucide-react";
1785
+ import { Terminal as TerminalIcon2, Lock as Lock2, Unlock as Unlock2, Box, Boxes } from "lucide-react";
1786
1786
  import React2, {
1787
1787
  useState as useState4,
1788
1788
  useCallback as useCallback3,
1789
1789
  useEffect as useEffect4,
1790
1790
  useRef as useRef3
1791
1791
  } from "react";
1792
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1792
+ import { jsx as jsx7, jsxs as jsxs6, Fragment as Fragment2 } from "react/jsx-runtime";
1793
+ var ActivityIndicator = ({ color, isAnimating }) => /* @__PURE__ */ jsxs6("div", {
1794
+ style: { display: "flex", gap: 1, alignItems: "center", height: 12 },
1795
+ children: [
1796
+ [0, 1, 2, 3, 4].map((i) => /* @__PURE__ */ jsx7("div", {
1797
+ style: {
1798
+ width: 2,
1799
+ height: 10,
1800
+ backgroundColor: color,
1801
+ borderRadius: 1,
1802
+ transformOrigin: "center",
1803
+ transform: isAnimating ? undefined : "scaleY(0.4)",
1804
+ animation: isAnimating ? `waveSine 1.2s ease-in-out ${i * 0.1}s infinite` : "none"
1805
+ }
1806
+ }, i)),
1807
+ /* @__PURE__ */ jsx7("style", {
1808
+ children: `
1809
+ @keyframes waveSine {
1810
+ 0%, 100% { transform: scaleY(0.4); }
1811
+ 50% { transform: scaleY(1); }
1812
+ }
1813
+ `
1814
+ })
1815
+ ]
1816
+ });
1793
1817
  function TerminalTabContentInner(props, ref) {
1794
- const { tab, sessionId, isActive, isVisible, actions, events, terminalContext, onSessionCreated, onScrollPositionChange, isForeign = false, defaultScrollLocked, activityDetection = true, activityTimeout = 500, autoShowBlinds = false } = props;
1818
+ const { tab, sessionId, isActive, isVisible, actions, events, terminalContext, onSessionCreated, onScrollPositionChange, isForeign = false, defaultScrollLocked, activityDetection = true, activityTimeout = 500, autoShowBlinds = false, onActivityStateChange } = props;
1795
1819
  console.log("[TerminalTabContent] RENDER", { tabId: tab.id, isActive, sessionId });
1796
1820
  const terminalRef = useRef3(null);
1797
1821
  const [localSessionId, setLocalSessionId] = useState4(sessionId);
@@ -1988,6 +2012,7 @@ function TerminalTabContentInner(props, ref) {
1988
2012
  }, [localSessionId, events]);
1989
2013
  const handleActivityChange = useCallback3((state) => {
1990
2014
  if (localSessionId) {
2015
+ onActivityStateChange?.(localSessionId, state.isActive);
1991
2016
  events.emit({
1992
2017
  type: "terminal:activity-changed",
1993
2018
  source: "TabbedTerminalPanel",
@@ -1999,7 +2024,7 @@ function TerminalTabContentInner(props, ref) {
1999
2024
  }
2000
2025
  });
2001
2026
  }
2002
- }, [localSessionId, events]);
2027
+ }, [localSessionId, events, onActivityStateChange]);
2003
2028
  const handleScrollToBottom = useCallback3(() => {
2004
2029
  terminalRef.current?.scrollToBottom();
2005
2030
  }, []);
@@ -2146,6 +2171,7 @@ var TabbedTerminalPanelInner = ({
2146
2171
  }, [isControlled, onActiveTabChange]);
2147
2172
  const [sessionIds, setSessionIds] = useState4(new Map);
2148
2173
  const [scrollPositions, setScrollPositions] = useState4(new Map);
2174
+ const [activityStates, setActivityStates] = useState4(new Map);
2149
2175
  const customTabsKey = React2.useMemo(() => {
2150
2176
  const customTabs = initialTabs.filter((tab) => tab.contentType !== "terminal");
2151
2177
  return JSON.stringify(customTabs);
@@ -2449,6 +2475,17 @@ var TabbedTerminalPanelInner = ({
2449
2475
  const handleSessionCreated = useCallback3((tabId, sessionId) => {
2450
2476
  setSessionIds((prev) => new Map(prev).set(tabId, sessionId));
2451
2477
  }, []);
2478
+ const handleActivityStateChange = useCallback3((sessionId, isActive) => {
2479
+ setActivityStates((prev) => {
2480
+ const next = new Map(prev);
2481
+ if (isActive) {
2482
+ next.set(sessionId, true);
2483
+ } else {
2484
+ next.delete(sessionId);
2485
+ }
2486
+ return next;
2487
+ });
2488
+ }, []);
2452
2489
  useTabKeyboardShortcuts({
2453
2490
  onNewTab: () => {
2454
2491
  if (isCreatingTabRef.current)
@@ -2471,32 +2508,16 @@ var TabbedTerminalPanelInner = ({
2471
2508
  });
2472
2509
  const renderTabAccessory = useCallback3((tab) => {
2473
2510
  const tabSessionId = sessionIds.get(tab.id);
2474
- const isWorking = tabSessionId ? workingStates?.[tabSessionId]?.isWorking : false;
2511
+ const hasExternalWorkingState = tabSessionId ? workingStates?.[tabSessionId]?.isWorking : false;
2512
+ const hasInternalActivity = tabSessionId ? activityStates.get(tabSessionId) : false;
2513
+ const isWorking = hasExternalWorkingState || hasInternalActivity;
2475
2514
  const isActive = tab.id === activeTabId;
2476
- if (!isActive && !isWorking)
2515
+ if (!isActive)
2477
2516
  return null;
2478
2517
  const scrollPosition = scrollPositions.get(tab.id) ?? defaultScrollPosition;
2479
- return /* @__PURE__ */ jsxs6("div", {
2480
- style: { display: "flex", alignItems: "center", gap: "4px" },
2518
+ return /* @__PURE__ */ jsxs6(Fragment2, {
2481
2519
  children: [
2482
- isWorking && /* @__PURE__ */ jsx7("div", {
2483
- style: {
2484
- display: "flex",
2485
- alignItems: "center",
2486
- justifyContent: "center",
2487
- width: "16px",
2488
- height: "16px",
2489
- color: theme.colors.primary
2490
- },
2491
- title: "Agent working",
2492
- children: /* @__PURE__ */ jsx7(Loader2, {
2493
- size: 12,
2494
- style: {
2495
- animation: "spin 1s linear infinite"
2496
- }
2497
- })
2498
- }),
2499
- isActive && /* @__PURE__ */ jsx7("button", {
2520
+ /* @__PURE__ */ jsx7("button", {
2500
2521
  onClick: (e) => {
2501
2522
  e.stopPropagation();
2502
2523
  handleToggleScrollLock();
@@ -2526,10 +2547,26 @@ var TabbedTerminalPanelInner = ({
2526
2547
  }) : /* @__PURE__ */ jsx7(Unlock2, {
2527
2548
  size: 10
2528
2549
  })
2550
+ }),
2551
+ /* @__PURE__ */ jsx7("div", {
2552
+ style: {
2553
+ position: "absolute",
2554
+ right: "8px",
2555
+ display: "flex",
2556
+ alignItems: "center",
2557
+ justifyContent: "center",
2558
+ width: "16px",
2559
+ height: "16px"
2560
+ },
2561
+ title: isWorking ? "Terminal active" : "Terminal idle",
2562
+ children: /* @__PURE__ */ jsx7(ActivityIndicator, {
2563
+ color: theme.colors.primary,
2564
+ isAnimating: isWorking ?? false
2565
+ })
2529
2566
  })
2530
2567
  ]
2531
2568
  });
2532
- }, [activeTabId, scrollPositions, defaultScrollPosition, handleToggleScrollLock, theme, sessionIds, workingStates]);
2569
+ }, [activeTabId, scrollPositions, defaultScrollPosition, handleToggleScrollLock, theme, sessionIds, workingStates, activityStates]);
2533
2570
  return /* @__PURE__ */ jsxs6("div", {
2534
2571
  style: {
2535
2572
  display: "flex",
@@ -2614,7 +2651,8 @@ var TabbedTerminalPanelInner = ({
2614
2651
  defaultScrollLocked,
2615
2652
  activityDetection,
2616
2653
  activityTimeout,
2617
- autoShowBlinds
2654
+ autoShowBlinds,
2655
+ onActivityStateChange: handleActivityStateChange
2618
2656
  }, tab.id);
2619
2657
  }
2620
2658
  return /* @__PURE__ */ jsx7("div", {
@@ -2643,7 +2681,8 @@ var TabbedTerminalPanelInner = ({
2643
2681
  defaultScrollLocked,
2644
2682
  activityDetection,
2645
2683
  activityTimeout,
2646
- autoShowBlinds
2684
+ autoShowBlinds,
2685
+ onActivityStateChange: handleActivityStateChange
2647
2686
  }, tab.id);
2648
2687
  }
2649
2688
  return /* @__PURE__ */ jsxs6("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"ThemedTerminal.d.ts","sourceRoot":"","sources":["../../../src/components/ThemedTerminal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAkC3D,OAAO,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAGV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,8BAA8B,CAAC;AAEtC,MAAM,WAAW,4BAA6B,SAAQ,mBAAmB;IACvE,KAAK,EAAE,KAAK,CAAC;CACd;AAsBD,eAAO,MAAM,cAAc,4HAunC1B,CAAC"}
1
+ {"version":3,"file":"ThemedTerminal.d.ts","sourceRoot":"","sources":["../../../src/components/ThemedTerminal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAkC3D,OAAO,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAGV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,8BAA8B,CAAC;AAEtC,MAAM,WAAW,4BAA6B,SAAQ,mBAAmB;IACvE,KAAK,EAAE,KAAK,CAAC;CACd;AAsBD,eAAO,MAAM,cAAc,4HAunC1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TabbedTerminalPanel.d.ts","sourceRoot":"","sources":["../../../src/panels/TabbedTerminalPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAKN,MAAM,OAAO,CAAC;AAMf,OAAO,KAAK,EACV,wBAAwB,EACxB,WAAW,EAKZ,MAAM,gBAAgB,CAAC;AAiCxB,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAqyCD,eAAO,MAAM,mBAAmB,EAAkC,CAAC,IAAI,SAAS,OAAO,cAAc,EAAE,OAAO,GAAG,WAAW,EAC1H,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,KAClC,KAAK,CAAC,YAAY,CAAC"}
1
+ {"version":3,"file":"TabbedTerminalPanel.d.ts","sourceRoot":"","sources":["../../../src/panels/TabbedTerminalPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAKN,MAAM,OAAO,CAAC;AAKf,OAAO,KAAK,EACV,wBAAwB,EACxB,WAAW,EAKZ,MAAM,gBAAgB,CAAC;AAkExB,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAqzCD,eAAO,MAAM,mBAAmB,EAAkC,CAAC,IAAI,SAAS,OAAO,cAAc,EAAE,OAAO,GAAG,WAAW,EAC1H,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,KAClC,KAAK,CAAC,YAAY,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { trace, context, SpanStatusCode, type Tracer, type Span } from '@opentelemetry/api';
2
2
  export declare const TRACER_NAME = "@industry-theme/xterm-terminal-panel";
3
- export declare const TRACER_VERSION = "0.5.1";
3
+ export declare const TRACER_VERSION = "0.5.4";
4
4
  export declare function getTracer(): Tracer;
5
5
  export declare function getActiveSpan(): Span | undefined;
6
6
  export declare function withSpan<T>(span: Span, fn: () => Promise<T>): Promise<T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@industry-theme/xterm-terminal-panel",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "Industry-themed xterm.js terminal components with panel framework integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",