@chances-ai/client 24.3.0 → 25.0.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 (39) hide show
  1. package/dist/client-core/client.d.ts +47 -1
  2. package/dist/client-core/client.d.ts.map +1 -1
  3. package/dist/client-core/client.js +143 -15
  4. package/dist/client-core/client.js.map +1 -1
  5. package/dist/client-core/store.d.ts +36 -0
  6. package/dist/client-core/store.d.ts.map +1 -1
  7. package/dist/client-core/store.js +4 -0
  8. package/dist/client-core/store.js.map +1 -1
  9. package/dist/client-core/transport.d.ts +1 -1
  10. package/dist/client-core/transport.d.ts.map +1 -1
  11. package/dist/client-core/transport.js +5 -1
  12. package/dist/client-core/transport.js.map +1 -1
  13. package/dist/web-ui/code-editor.d.ts +19 -0
  14. package/dist/web-ui/code-editor.d.ts.map +1 -0
  15. package/dist/web-ui/code-editor.js +111 -0
  16. package/dist/web-ui/code-editor.js.map +1 -0
  17. package/dist/web-ui/control-panel.d.ts.map +1 -1
  18. package/dist/web-ui/control-panel.js +20 -2
  19. package/dist/web-ui/control-panel.js.map +1 -1
  20. package/dist/web-ui/file-tree.d.ts.map +1 -1
  21. package/dist/web-ui/file-tree.js +7 -2
  22. package/dist/web-ui/file-tree.js.map +1 -1
  23. package/dist/web-ui/session-hotkeys.d.ts +14 -0
  24. package/dist/web-ui/session-hotkeys.d.ts.map +1 -0
  25. package/dist/web-ui/session-hotkeys.js +38 -0
  26. package/dist/web-ui/session-hotkeys.js.map +1 -0
  27. package/dist/web-ui/session-sidebar.d.ts +4 -2
  28. package/dist/web-ui/session-sidebar.d.ts.map +1 -1
  29. package/dist/web-ui/session-sidebar.js +25 -7
  30. package/dist/web-ui/session-sidebar.js.map +1 -1
  31. package/dist/web-ui/settings.d.ts +13 -0
  32. package/dist/web-ui/settings.d.ts.map +1 -0
  33. package/dist/web-ui/settings.js +27 -0
  34. package/dist/web-ui/settings.js.map +1 -0
  35. package/dist/web-ui/terminal.d.ts +10 -0
  36. package/dist/web-ui/terminal.d.ts.map +1 -0
  37. package/dist/web-ui/terminal.js +115 -0
  38. package/dist/web-ui/terminal.js.map +1 -0
  39. package/package.json +25 -5
@@ -0,0 +1,115 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * (7.5 W3) The interactive PTY terminal pane (xterm.js) — opens a real shell on
4
+ * the agent host over the off-ring `terminal/*` ACP messages. Mounted (lazily) by
5
+ * `ControlPanel` only when the agent advertises `terminal` (off by default
6
+ * server-side: `chances serve --terminal`). Privileged — a lease viewer's
7
+ * open/input is rejected `not_controller` server-side, so output simply never
8
+ * arrives (read-only by omission).
9
+ *
10
+ * xterm + this file are code-split (lazy) so the chat-only bundle never loads
11
+ * them. Browser-only (xterm needs a real DOM) → not happy-dom-testable; the wire
12
+ * relay + client-core terminal API ARE tested.
13
+ *
14
+ * Patterns borrowed (铁律 2): OpenHands `use-terminal` safe-fit guard +
15
+ * ResizeObserver→rAF; opencode 100 ms resize throttle.
16
+ */
17
+ import { useEffect, useRef } from "react";
18
+ import { Terminal as XTerm } from "@xterm/xterm";
19
+ import { FitAddon } from "@xterm/addon-fit";
20
+ import "@xterm/xterm/css/xterm.css";
21
+ const RESIZE_THROTTLE_MS = 100;
22
+ export function TerminalPane({ client, mode }) {
23
+ const ref = useRef(null);
24
+ useEffect(() => {
25
+ const container = ref.current;
26
+ if (!container)
27
+ return;
28
+ let disposed = false;
29
+ let terminalId = null;
30
+ let resizeTimer;
31
+ // xterm renders to a canvas → it needs concrete colours, not CSS vars. Read
32
+ // the panel's `--ch-*` chrome (set by themeCssVars) off the container, with
33
+ // sensible dark fallbacks.
34
+ const cssVar = (name, fallback) => {
35
+ const v = getComputedStyle(container).getPropertyValue(name).trim();
36
+ return v || fallback;
37
+ };
38
+ const term = new XTerm({
39
+ fontFamily: "ui-monospace, Menlo, Monaco, 'Courier New', monospace",
40
+ fontSize: 12,
41
+ cursorBlink: true,
42
+ scrollback: 5000,
43
+ theme: {
44
+ background: cssVar("--ch-bg", "#1e1e1e"),
45
+ foreground: cssVar("--ch-fg", "#d4d4d4"),
46
+ cursor: cssVar("--ch-accent", "#d4d4d4"),
47
+ },
48
+ });
49
+ const fit = new FitAddon();
50
+ term.loadAddon(fit);
51
+ term.open(container);
52
+ // Safe-fit (OpenHands): never fit a hidden / zero-size / unopened terminal.
53
+ const canFit = () => {
54
+ if (disposed || !term.element)
55
+ return false;
56
+ const cs = window.getComputedStyle(container);
57
+ return cs.display !== "none" && container.clientWidth > 0 && container.clientHeight > 0;
58
+ };
59
+ const fitSafely = () => {
60
+ if (canFit()) {
61
+ try {
62
+ fit.fit();
63
+ }
64
+ catch {
65
+ /* layout race — ignore */
66
+ }
67
+ }
68
+ };
69
+ fitSafely();
70
+ // Open the PTY at the current dims, then wire IO.
71
+ void client.openTerminal(term.cols, term.rows).then((id) => {
72
+ if (disposed) {
73
+ client.closeTerminal(id);
74
+ return;
75
+ }
76
+ terminalId = id;
77
+ });
78
+ const offOutput = client.onTerminalOutput((id, data) => {
79
+ if (id === terminalId)
80
+ term.write(data);
81
+ });
82
+ const onData = term.onData((data) => {
83
+ if (terminalId)
84
+ client.sendTerminalInput(terminalId, data);
85
+ });
86
+ const observer = new ResizeObserver(() => {
87
+ requestAnimationFrame(() => {
88
+ fitSafely();
89
+ if (resizeTimer)
90
+ return;
91
+ resizeTimer = setTimeout(() => {
92
+ resizeTimer = undefined;
93
+ if (terminalId && canFit())
94
+ client.resizeTerminal(terminalId, term.cols, term.rows);
95
+ }, RESIZE_THROTTLE_MS);
96
+ });
97
+ });
98
+ observer.observe(container);
99
+ return () => {
100
+ disposed = true;
101
+ if (resizeTimer)
102
+ clearTimeout(resizeTimer);
103
+ observer.disconnect();
104
+ offOutput();
105
+ onData.dispose();
106
+ if (terminalId)
107
+ client.closeTerminal(terminalId);
108
+ term.dispose();
109
+ };
110
+ // Re-create on mode change so canvas colours track the panel chrome (cheap;
111
+ // terminal sessions are short-lived).
112
+ }, [client, mode]);
113
+ return _jsx("div", { ref: ref, style: { width: "100%", height: "100%", minHeight: 0 } });
114
+ }
115
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/web-ui/terminal.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chances-ai/client",
3
- "version": "24.3.0",
3
+ "version": "25.0.0",
4
4
  "type": "module",
5
5
  "main": "./dist/client-core/index.js",
6
6
  "types": "./dist/client-core/index.d.ts",
@@ -18,14 +18,18 @@
18
18
  "dist"
19
19
  ],
20
20
  "dependencies": {
21
- "@chances-ai/design-system": "24.3.0",
22
- "@chances-ai/wire": "24.3.0",
23
- "@chances-ai/runtime": "24.3.0",
24
- "@chances-ai/ui-core": "24.3.0",
21
+ "@chances-ai/design-system": "25.0.0",
22
+ "@chances-ai/wire": "25.0.0",
23
+ "@chances-ai/runtime": "25.0.0",
24
+ "@chances-ai/ui-core": "25.0.0",
25
25
  "zustand": "^5.0.0"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "@heroui/react": "^3.1.0",
29
+ "@monaco-editor/react": "^4.7.0",
30
+ "@xterm/addon-fit": "^0.10.0",
31
+ "@xterm/xterm": "^5.5.0",
32
+ "monaco-editor": "^0.52.2",
29
33
  "react": "^19.2",
30
34
  "react-dom": "^19.2"
31
35
  },
@@ -33,6 +37,18 @@
33
37
  "@heroui/react": {
34
38
  "optional": true
35
39
  },
40
+ "@monaco-editor/react": {
41
+ "optional": true
42
+ },
43
+ "@xterm/addon-fit": {
44
+ "optional": true
45
+ },
46
+ "@xterm/xterm": {
47
+ "optional": true
48
+ },
49
+ "monaco-editor": {
50
+ "optional": true
51
+ },
36
52
  "react": {
37
53
  "optional": true
38
54
  },
@@ -43,9 +59,13 @@
43
59
  "devDependencies": {
44
60
  "@happy-dom/global-registrator": "^20.9.0",
45
61
  "@heroui/react": "^3.1.0",
62
+ "@monaco-editor/react": "^4.7.0",
46
63
  "@testing-library/dom": "^10.4.1",
47
64
  "@testing-library/react": "^16.3.2",
48
65
  "@testing-library/user-event": "^14.6.1",
66
+ "@xterm/addon-fit": "^0.10.0",
67
+ "@xterm/xterm": "^5.5.0",
68
+ "monaco-editor": "^0.52.2",
49
69
  "react": "^19.2",
50
70
  "react-dom": "^19.2"
51
71
  },