treesap 0.1.11 → 0.1.13

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/README.md ADDED
@@ -0,0 +1,217 @@
1
+ # Treesap
2
+
3
+ **AI Agent Framework for Distributed Development Teams**
4
+
5
+ Treesap is a revolutionary development platform that enables multiple AI agents and human developers to collaborate in real-time through persistent terminal sessions and WebSocket-based coordination. Built for the future of software development where AI agents work alongside humans in coordinated teams.
6
+
7
+ ## 🌟 Key Features
8
+
9
+ - **Multi-Agent Terminal Orchestration** - Multiple AI agents can work simultaneously across different terminal sessions
10
+ - **Real-Time Cross-Session Monitoring** - External agents can observe and control multiple terminal sessions
11
+ - **Mobile-Responsive Terminal Interface** - Chat-style input for better mobile development experience
12
+ - **WebSocket-Based Architecture** - Real-time bidirectional communication between terminals, web UI, and external agents
13
+ - **Framework Agnostic** - Works with any development stack (Hono, Vite, React, etc.)
14
+ - **Persistent Terminal Sessions** - Sessions survive across browser refreshes and disconnections
15
+ - **Live Preview Integration** - Built-in development server with live reload
16
+
17
+ ## 🚀 Quick Start
18
+
19
+ ### Installation
20
+
21
+ ```bash
22
+ npm install treesap
23
+ ```
24
+
25
+ ### Basic Setup
26
+
27
+ 1. Create a `treesap.config.ts` file in your project root:
28
+
29
+ ```typescript
30
+ import type { TreesapConfig } from 'treesap';
31
+
32
+ const config: TreesapConfig = {
33
+ port: 1235, // Treesap server port
34
+ previewPort: 5173, // Your app's dev server port
35
+ devCommand: "npm run dev", // Command to start your dev server
36
+ devPort: 5173, // Port your dev server runs on
37
+ projectRoot: process.cwd()
38
+ };
39
+
40
+ export default config;
41
+ ```
42
+
43
+ 2. Add scripts to your `package.json`:
44
+
45
+ ```json
46
+ {
47
+ "scripts": {
48
+ "dev:treesap": "treesap dev",
49
+ "treesap": "treesap start"
50
+ }
51
+ }
52
+ ```
53
+
54
+ 3. Start Treesap:
55
+
56
+ ```bash
57
+ npm run dev:treesap
58
+ ```
59
+
60
+ Visit `http://localhost:1235` to access the Treesap interface with integrated terminal and live preview.
61
+
62
+ ## 🏗️ Core Concepts
63
+
64
+ ### Terminal Sessions
65
+ Each terminal session is persistent and can be shared across multiple clients (browsers, agents, etc.). Sessions survive disconnections and can be resumed at any time.
66
+
67
+ ### WebSocket Communication
68
+ All terminal I/O, resize events, and cross-session communication happens over WebSockets, enabling real-time collaboration between humans and AI agents.
69
+
70
+ ### Agent Coordination
71
+ External AI agents can:
72
+ - Monitor multiple terminal sessions simultaneously
73
+ - Send commands to specific terminals
74
+ - Receive real-time output from all monitored sessions
75
+ - Coordinate complex multi-step tasks across multiple environments
76
+
77
+ ## 📱 Mobile-First Design
78
+
79
+ Treesap features a responsive terminal interface with:
80
+ - **Chat-style input** - Familiar textarea interface for mobile users
81
+ - **Two-step command execution** - Send to input field, then execute
82
+ - **Automatic terminal resizing** - Adapts to mobile screen sizes and orientation changes
83
+ - **Touch-optimized controls** - Better interaction on mobile devices
84
+
85
+ ## ⚙️ Configuration
86
+
87
+ The `TreesapConfig` interface supports these options:
88
+
89
+ ```typescript
90
+ interface TreesapConfig {
91
+ port?: number; // Treesap server port (default: 1235)
92
+ previewPort?: number; // Preview iframe port (default: 3000)
93
+ devCommand?: string; // Command to auto-start dev server
94
+ devPort?: number; // Dev server port to auto-start
95
+ projectRoot?: string; // Project root directory
96
+ }
97
+ ```
98
+
99
+ ## 🧠 Multi-Agent Development
100
+
101
+ Treesap enables unprecedented AI agent collaboration:
102
+
103
+ ### Agent Orchestration
104
+ - **Supervisor Agents** - Monitor multiple coding agents across different terminals
105
+ - **Specialized Agents** - Each agent can work in its dedicated terminal session
106
+ - **Cross-Agent Communication** - Agents can coordinate through the WebSocket infrastructure
107
+
108
+ ### Human-AI Collaboration
109
+ - **Seamless Handoffs** - Switch between human and AI control of terminal sessions
110
+ - **Real-time Monitoring** - Watch AI agents work while maintaining override capability
111
+ - **Collaborative Debugging** - Multiple agents can work on the same problem simultaneously
112
+
113
+ ## 🛠️ Architecture
114
+
115
+ ### WebSocket Terminal Service
116
+ - Persistent terminal sessions using `node-pty`
117
+ - Multi-client session sharing
118
+ - Cross-session monitoring and control
119
+ - Real-time input/output streaming
120
+
121
+ ### Sapling Islands Components
122
+ - Reactive terminal interface
123
+ - Live preview integration
124
+ - Mobile-responsive design
125
+ - Chat-style input system
126
+
127
+ ### External Agent Integration
128
+ ```typescript
129
+ // Connect to WebSocket for monitoring
130
+ const ws = new WebSocket('ws://localhost:1235/terminal/ws');
131
+
132
+ // Join a terminal session
133
+ ws.send(JSON.stringify({
134
+ type: 'join',
135
+ sessionId: 'terminal-1',
136
+ terminalId: 'terminal-1'
137
+ }));
138
+
139
+ // Send commands
140
+ ws.send(JSON.stringify({
141
+ type: 'input',
142
+ sessionId: 'terminal-1',
143
+ data: 'npm test\r'
144
+ }));
145
+ ```
146
+
147
+ ## 🎯 Use Cases
148
+
149
+ ### AI Development Teams
150
+ - Multiple AI agents working on different parts of a large codebase
151
+ - Coordinated testing and deployment across multiple environments
152
+ - Real-time code review and collaboration between AI agents
153
+
154
+ ### Educational Platforms
155
+ - Instructors monitoring multiple student coding sessions
156
+ - AI tutors providing real-time assistance
157
+ - Collaborative coding exercises with mixed human-AI teams
158
+
159
+ ### DevOps Orchestration
160
+ - Coordinated deployments across multiple servers
161
+ - Real-time monitoring and intervention capabilities
162
+ - Automated testing with human oversight
163
+
164
+ ## 📚 API Reference
165
+
166
+ ### WebSocket Message Types
167
+ - `join` - Join a terminal session
168
+ - `leave` - Leave a terminal session
169
+ - `input` - Send input to terminal
170
+ - `resize` - Resize terminal dimensions
171
+ - `ping/pong` - Connection health checks
172
+
173
+ ### Terminal Service Methods
174
+ - `getActiveSessions()` - List all active sessions
175
+ - `sendCommandToSession(sessionId, command)` - Send command to session
176
+ - `getSessionClients(sessionId)` - Get connected clients
177
+ - `closeSession(sessionId)` - Terminate a session
178
+
179
+ ## 🔧 Development
180
+
181
+ ### Prerequisites
182
+ - Node.js >=18.0.0
183
+ - TypeScript support
184
+
185
+ ### Building from Source
186
+ ```bash
187
+ git clone https://github.com/withtreesap/treesap.git
188
+ cd treesap/packages/treesap
189
+ npm install
190
+ npm run build
191
+ ```
192
+
193
+ ### Development Scripts
194
+ ```bash
195
+ npm run dev # Start with hot reload
196
+ npm run dev:css # Watch CSS changes
197
+ npm run build # Build for production
198
+ npm run clean # Clean build artifacts
199
+ ```
200
+
201
+ ## 🤝 Contributing
202
+
203
+ We welcome contributions! Treesap is building the foundation for the future of AI-powered development.
204
+
205
+ ## 📄 License
206
+
207
+ MIT License - see LICENSE file for details.
208
+
209
+ ## 🔗 Links
210
+
211
+ - [GitHub Repository](https://github.com/withtreesap/treesap)
212
+ - [Issues & Bug Reports](https://github.com/withtreesap/treesap/issues)
213
+ - [NPM Package](https://www.npmjs.com/package/treesap)
214
+
215
+ ---
216
+
217
+ **Treesap** - *Growing the future of collaborative development* 🌳
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
2
2
  export function Terminal({ id, index = 1 }) {
3
3
  const terminalId = id || `terminal-${index}`;
4
4
  const sessionId = `terminal-${index}`;
5
- return (_jsxs("sapling-island", { loading: "visible", children: [_jsxs("template", { children: [_jsx("link", { href: "https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.min.css", rel: "stylesheet" }), _jsx("script", { type: "module", src: "/components/Terminal.js" })] }), _jsx("div", { id: terminalId, class: "h-full bg-gray-900 flex font-sans overflow-hidden", children: _jsx("div", { class: "w-full flex flex-col bg-gray-900 relative", children: _jsx("div", { id: `${terminalId}-container`, class: "h-full flex flex-col", children: _jsx("div", { class: "flex-1 overflow-hidden", children: _jsx("div", { id: `${terminalId}-xterm`, class: "h-full w-full" }) }) }) }) }), _jsx("script", { dangerouslySetInnerHTML: { __html: `
5
+ return (_jsxs("sapling-island", { loading: "visible", children: [_jsxs("template", { children: [_jsx("link", { href: "https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.min.css", rel: "stylesheet" }), _jsx("script", { type: "module", src: "/components/Terminal.js" })] }), _jsx("div", { id: terminalId, class: "h-full bg-[#1e1e1e] flex font-sans overflow-hidden", children: _jsx("div", { class: "w-full flex flex-col bg-[#1e1e1e] relative min-w-0", children: _jsx("div", { id: `${terminalId}-container`, class: "h-full flex flex-col min-w-0", children: _jsx("div", { class: "flex-1 overflow-hidden min-w-0", children: _jsx("div", { id: `${terminalId}-xterm`, class: "h-full w-full min-w-0 max-w-full" }) }) }) }) }), _jsx("script", { dangerouslySetInnerHTML: { __html: `
6
6
  // Pass terminal data to JavaScript
7
7
  window.terminalData_${terminalId.replace(/-/g, '_')} = {
8
8
  terminalId: '${terminalId}',
@@ -1 +1 @@
1
- {"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../../src/components/Terminal.tsx"],"names":[],"mappings":";AAKA,MAAM,UAAU,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAiB;IACvD,MAAM,UAAU,GAAG,EAAE,IAAI,YAAY,KAAK,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,YAAY,KAAK,EAAE,CAAC;IACtC,OAAO,CACL,0BAAgB,OAAO,EAAC,SAAS,aAC/B,+BACE,eAAM,IAAI,EAAC,mEAAmE,EAAC,GAAG,EAAC,YAAY,GAAG,EAClG,iBAAQ,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAC,yBAAyB,GAAU,IACpD,EAEX,cAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAC,mDAAmD,YAE5E,cAAK,KAAK,EAAC,2CAA2C,YAEpD,cAAK,EAAE,EAAE,GAAG,UAAU,YAAY,EAAE,KAAK,EAAC,sBAAsB,YAG9D,cAAK,KAAK,EAAC,wBAAwB,YACjC,cAAK,EAAE,EAAE,GAAG,UAAU,QAAQ,EAAE,KAAK,EAAC,eAAe,GAAO,GACxD,GACF,GACF,GACF,EAEN,iBAAQ,uBAAuB,EAAE,EAAC,MAAM,EAAE;;8BAElB,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;yBAClC,UAAU;wBACX,SAAS;mBACd,KAAK;;OAEjB,EAAC,GAAW,IACE,CAClB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../../src/components/Terminal.tsx"],"names":[],"mappings":";AAKA,MAAM,UAAU,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAiB;IACvD,MAAM,UAAU,GAAG,EAAE,IAAI,YAAY,KAAK,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,YAAY,KAAK,EAAE,CAAC;IACtC,OAAO,CACL,0BAAgB,OAAO,EAAC,SAAS,aAC/B,+BACE,eAAM,IAAI,EAAC,mEAAmE,EAAC,GAAG,EAAC,YAAY,GAAG,EAClG,iBAAQ,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAC,yBAAyB,GAAU,IACpD,EAEX,cAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAC,oDAAoD,YAE7E,cAAK,KAAK,EAAC,oDAAoD,YAE7D,cAAK,EAAE,EAAE,GAAG,UAAU,YAAY,EAAE,KAAK,EAAC,8BAA8B,YAGtE,cAAK,KAAK,EAAC,gCAAgC,YACzC,cAAK,EAAE,EAAE,GAAG,UAAU,QAAQ,EAAE,KAAK,EAAC,kCAAkC,GAAO,GAC3E,GACF,GACF,GACF,EAEN,iBAAQ,uBAAuB,EAAE,EAAC,MAAM,EAAE;;8BAElB,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;yBAClC,UAAU;wBACX,SAAS;mBACd,KAAK;;OAEjB,EAAC,GAAW,IACE,CAClB,CAAC;AACJ,CAAC"}
@@ -8,10 +8,12 @@ export interface WebSocketClient {
8
8
  lastPing: Date;
9
9
  }
10
10
  export interface WebSocketMessage {
11
- type: 'join' | 'leave' | 'input' | 'ping' | 'pong';
11
+ type: 'join' | 'leave' | 'input' | 'resize' | 'ping' | 'pong';
12
12
  sessionId?: string;
13
13
  terminalId?: string;
14
14
  data?: string;
15
+ cols?: number;
16
+ rows?: number;
15
17
  timestamp?: number;
16
18
  }
17
19
  export declare class WebSocketTerminalService {
@@ -24,6 +26,7 @@ export declare class WebSocketTerminalService {
24
26
  private static handleJoin;
25
27
  private static handleLeave;
26
28
  private static handleInput;
29
+ private static handleResize;
27
30
  private static handleDisconnect;
28
31
  private static addClientToSession;
29
32
  private static removeClientFromSession;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAKhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAgC;IAClD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAsC;IAC5D,OAAO,CAAC,MAAM,CAAC,cAAc,CAAkC;IAE/D,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM;IA8ChC,OAAO,CAAC,MAAM,CAAC,aAAa;IAsB5B,OAAO,CAAC,MAAM,CAAC,aAAa;IAkC5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAuCzB,OAAO,CAAC,MAAM,CAAC,WAAW;IAe1B,OAAO,CAAC,MAAM,CAAC,WAAW;IA8B1B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAOjC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAYtC,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAiBzC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAQ3C,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAenC,OAAO,CAAC,MAAM,CAAC,YAAY;IAe3B,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAKrD,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAaxE,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAO7E,MAAM,CAAC,mBAAmB,IAAI,MAAM;IAIpC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM;IAoBrC,MAAM,CAAC,OAAO;CAUf"}
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAKhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAgC;IAClD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAsC;IAC5D,OAAO,CAAC,MAAM,CAAC,cAAc,CAAkC;IAE/D,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM;IA8ChC,OAAO,CAAC,MAAM,CAAC,aAAa;IAsB5B,OAAO,CAAC,MAAM,CAAC,aAAa;IAqC5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAuCzB,OAAO,CAAC,MAAM,CAAC,WAAW;IAe1B,OAAO,CAAC,MAAM,CAAC,WAAW;IA8B1B,OAAO,CAAC,MAAM,CAAC,YAAY;IA0B3B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAOjC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAYtC,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAiBzC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAQ3C,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAenC,OAAO,CAAC,MAAM,CAAC,YAAY;IAe3B,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAKrD,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAaxE,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAO7E,MAAM,CAAC,mBAAmB,IAAI,MAAM;IAIpC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM;IAoBrC,MAAM,CAAC,OAAO;CAUf"}
@@ -80,6 +80,9 @@ export class WebSocketTerminalService {
80
80
  case 'input':
81
81
  this.handleInput(clientId, message);
82
82
  break;
83
+ case 'resize':
84
+ this.handleResize(clientId, message);
85
+ break;
83
86
  case 'ping':
84
87
  this.sendToClient(clientId, {
85
88
  type: 'pong',
@@ -167,6 +170,29 @@ export class WebSocketTerminalService {
167
170
  });
168
171
  }
169
172
  }
173
+ static handleResize(clientId, message) {
174
+ const client = this.clients.get(clientId);
175
+ if (!client || !message.sessionId || message.cols === undefined || message.rows === undefined)
176
+ return;
177
+ // Get the terminal session
178
+ const session = TerminalService.getSession(message.sessionId);
179
+ if (!session) {
180
+ console.error(`Session ${message.sessionId} not found for resize`);
181
+ return;
182
+ }
183
+ // Resize the PTY
184
+ try {
185
+ console.log(`Resizing terminal session ${message.sessionId} to ${message.cols}x${message.rows}`);
186
+ session.process.resize(message.cols, message.rows);
187
+ session.lastActivity = new Date();
188
+ // Update session dimensions
189
+ session.cols = message.cols;
190
+ session.rows = message.rows;
191
+ }
192
+ catch (error) {
193
+ console.error(`Failed to resize session ${message.sessionId}:`, error);
194
+ }
195
+ }
170
196
  static handleDisconnect(clientId) {
171
197
  const client = this.clients.get(clientId);
172
198
  console.log(`WebSocket client disconnected: ${clientId}`);
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"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"}
@@ -58,7 +58,10 @@ class TerminalManager {
58
58
  }
59
59
 
60
60
  setupXterm() {
61
- // Create terminal instance with VS Code-like theme
61
+ // Detect mobile devices for responsive terminal setup
62
+ const isMobile = window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
63
+
64
+ // Create terminal instance with VS Code-like theme and responsive settings
62
65
  this.terminal = new Terminal({
63
66
  cursorBlink: true,
64
67
  fontSize: 12,
@@ -86,9 +89,14 @@ class TerminalManager {
86
89
  brightCyan: '#29b8db',
87
90
  brightWhite: '#ffffff'
88
91
  },
89
- scrollback: 1000,
92
+ scrollback: isMobile ? 500 : 1000, // Smaller scrollback for mobile performance
90
93
  tabStopWidth: 4,
91
- allowTransparency: false
94
+ allowTransparency: false,
95
+ // Mobile-specific options
96
+ ...(isMobile && {
97
+ convertEol: true,
98
+ disableStdin: false
99
+ })
92
100
  });
93
101
 
94
102
  // Open terminal in container
@@ -110,7 +118,20 @@ class TerminalManager {
110
118
 
111
119
  // Resize handler
112
120
  window.addEventListener('resize', () => {
113
- this.fitTerminal();
121
+ // Add a small delay for mobile orientation changes
122
+ clearTimeout(this.resizeTimeout);
123
+ this.resizeTimeout = setTimeout(() => {
124
+ this.fitTerminal();
125
+ }, 100);
126
+ });
127
+
128
+ // Mobile orientation change handler
129
+ window.addEventListener('orientationchange', () => {
130
+ // Longer delay for orientation changes as they can be slower
131
+ clearTimeout(this.orientationTimeout);
132
+ this.orientationTimeout = setTimeout(() => {
133
+ this.fitTerminal();
134
+ }, 300);
114
135
  });
115
136
  }
116
137
 
@@ -120,10 +141,77 @@ class TerminalManager {
120
141
  setTimeout(() => {
121
142
  const containerRect = this.xtermContainer.getBoundingClientRect();
122
143
  if (containerRect.width > 0 && containerRect.height > 0) {
123
- const cols = Math.floor(containerRect.width / 7.2); // Approximate character width for 12px font
124
- const rows = Math.floor(containerRect.height / 14.4); // Approximate line height for 12px font
125
- console.log(`Fitting terminal ${this.terminalId}: ${cols}x${rows} (container: ${containerRect.width}x${containerRect.height})`);
144
+ // Detect mobile devices for responsive sizing
145
+ const isMobile = window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
146
+
147
+ // Use consistent font size
148
+ const fontSize = 12;
149
+
150
+ // Calculate character dimensions more accurately
151
+ // Create a temporary element to measure actual character size
152
+ const testElement = document.createElement('div');
153
+ testElement.style.fontFamily = this.terminal.options.fontFamily;
154
+ testElement.style.fontSize = `${fontSize}px`;
155
+ testElement.style.position = 'absolute';
156
+ testElement.style.visibility = 'hidden';
157
+ testElement.style.whiteSpace = 'pre';
158
+ testElement.textContent = 'M'; // Use 'M' as it's typically the widest character
159
+ document.body.appendChild(testElement);
160
+
161
+ const charWidth = testElement.getBoundingClientRect().width;
162
+ const charHeight = testElement.getBoundingClientRect().height;
163
+ document.body.removeChild(testElement);
164
+
165
+ // Calculate columns and rows based on actual character dimensions
166
+ const cols = Math.max(20, Math.floor(containerRect.width / charWidth)); // Minimum 20 columns
167
+ const rows = Math.max(10, Math.floor(containerRect.height / charHeight)); // Minimum 10 rows
168
+
169
+ // Store previous dimensions to detect significant changes
170
+ const prevCols = this.lastCols || 0;
171
+ const prevRows = this.lastRows || 0;
172
+ const significantChange = Math.abs(cols - prevCols) > Math.max(10, prevCols * 0.3) ||
173
+ Math.abs(rows - prevRows) > Math.max(5, prevRows * 0.3);
174
+
175
+ console.log(`Fitting terminal ${this.terminalId}: ${cols}x${rows} (container: ${containerRect.width}x${containerRect.height}, charSize: ${charWidth}x${charHeight}, mobile: ${isMobile})`);
176
+
177
+
178
+ // Resize the terminal
126
179
  this.terminal.resize(cols, rows);
180
+
181
+ // Send resize notification to backend PTY
182
+ if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
183
+ const resizeMessage = {
184
+ type: 'resize',
185
+ sessionId: this.sessionId,
186
+ terminalId: this.terminalId,
187
+ cols: cols,
188
+ rows: rows
189
+ };
190
+ this.websocket.send(JSON.stringify(resizeMessage));
191
+ }
192
+
193
+ // Force a refresh if there was a significant size change (like mobile rotation)
194
+ if (significantChange && (prevCols > 0 || prevRows > 0)) {
195
+ console.log(`Significant terminal size change detected, forcing refresh`);
196
+ // Small delay to ensure resize is processed, then refresh
197
+ setTimeout(() => {
198
+ if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
199
+ // Send Ctrl+L to clear and refresh the display
200
+ const refreshMessage = {
201
+ type: 'input',
202
+ sessionId: this.sessionId,
203
+ terminalId: this.terminalId,
204
+ data: '\x0C' // Ctrl+L (form feed) to refresh
205
+ };
206
+ this.websocket.send(JSON.stringify(refreshMessage));
207
+ }
208
+ }, 100);
209
+ }
210
+
211
+ // Store current dimensions for next comparison
212
+ this.lastCols = cols;
213
+ this.lastRows = rows;
214
+
127
215
  } else {
128
216
  console.warn(`Terminal ${this.terminalId} container has zero dimensions, retrying...`);
129
217
  // Retry after a short delay
@@ -336,8 +424,8 @@ function initializeTerminals() {
336
424
  const saplingIslands = document.querySelectorAll('sapling-island');
337
425
 
338
426
  for (const island of saplingIslands) {
339
- // Look for a div with bg-gray-900 class (terminal styling)
340
- const terminalDiv = island.querySelector('div.bg-gray-900[id]');
427
+ // Look for a div with terminal ID (updated selector for new background class)
428
+ const terminalDiv = island.querySelector('div[id^="terminal-"]');
341
429
  if (terminalDiv && terminalDiv.id && terminalDiv.id.startsWith('terminal-')) {
342
430
  const terminalId = terminalDiv.id;
343
431
  console.log('Found terminal component with ID:', terminalId);
@@ -1249,10 +1249,18 @@ video {
1249
1249
  width: 100%;
1250
1250
  }
1251
1251
 
1252
+ .min-w-0 {
1253
+ min-width: 0px;
1254
+ }
1255
+
1252
1256
  .min-w-\[140px\] {
1253
1257
  min-width: 140px;
1254
1258
  }
1255
1259
 
1260
+ .max-w-full {
1261
+ max-width: 100%;
1262
+ }
1263
+
1256
1264
  .flex-1 {
1257
1265
  flex: 1 1 0%;
1258
1266
  }
@@ -1425,11 +1433,6 @@ video {
1425
1433
  background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
1426
1434
  }
1427
1435
 
1428
- .bg-gray-900 {
1429
- --tw-bg-opacity: 1;
1430
- background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));
1431
- }
1432
-
1433
1436
  .bg-transparent {
1434
1437
  background-color: transparent;
1435
1438
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "treesap",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "AI Agent Framework",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,15 +13,15 @@ export function Terminal({ id, index = 1 }: TerminalProps) {
13
13
  <script type="module" src="/components/Terminal.js"></script>
14
14
  </template>
15
15
 
16
- <div id={terminalId} class="h-full bg-gray-900 flex font-sans overflow-hidden">
16
+ <div id={terminalId} class="h-full bg-[#1e1e1e] flex font-sans overflow-hidden">
17
17
  {/* Terminal Interface */}
18
- <div class="w-full flex flex-col bg-gray-900 relative">
18
+ <div class="w-full flex flex-col bg-[#1e1e1e] relative min-w-0">
19
19
  {/* Terminal header */}
20
- <div id={`${terminalId}-container`} class="h-full flex flex-col">
20
+ <div id={`${terminalId}-container`} class="h-full flex flex-col min-w-0">
21
21
 
22
22
  {/* Xterm.js terminal container */}
23
- <div class="flex-1 overflow-hidden">
24
- <div id={`${terminalId}-xterm`} class="h-full w-full"></div>
23
+ <div class="flex-1 overflow-hidden min-w-0">
24
+ <div id={`${terminalId}-xterm`} class="h-full w-full min-w-0 max-w-full"></div>
25
25
  </div>
26
26
  </div>
27
27
  </div>
@@ -14,10 +14,12 @@ export interface WebSocketClient {
14
14
  }
15
15
 
16
16
  export interface WebSocketMessage {
17
- type: 'join' | 'leave' | 'input' | 'ping' | 'pong';
17
+ type: 'join' | 'leave' | 'input' | 'resize' | 'ping' | 'pong';
18
18
  sessionId?: string;
19
19
  terminalId?: string;
20
20
  data?: string;
21
+ cols?: number;
22
+ rows?: number;
21
23
  timestamp?: number;
22
24
  }
23
25
 
@@ -114,6 +116,9 @@ export class WebSocketTerminalService {
114
116
  case 'input':
115
117
  this.handleInput(clientId, message);
116
118
  break;
119
+ case 'resize':
120
+ this.handleResize(clientId, message);
121
+ break;
117
122
  case 'ping':
118
123
  this.sendToClient(clientId, {
119
124
  type: 'pong',
@@ -212,6 +217,32 @@ export class WebSocketTerminalService {
212
217
  }
213
218
  }
214
219
 
220
+ private static handleResize(clientId: string, message: WebSocketMessage) {
221
+ const client = this.clients.get(clientId);
222
+ if (!client || !message.sessionId || message.cols === undefined || message.rows === undefined) return;
223
+
224
+ // Get the terminal session
225
+ const session = TerminalService.getSession(message.sessionId);
226
+ if (!session) {
227
+ console.error(`Session ${message.sessionId} not found for resize`);
228
+ return;
229
+ }
230
+
231
+ // Resize the PTY
232
+ try {
233
+ console.log(`Resizing terminal session ${message.sessionId} to ${message.cols}x${message.rows}`);
234
+ session.process.resize(message.cols, message.rows);
235
+ session.lastActivity = new Date();
236
+
237
+ // Update session dimensions
238
+ session.cols = message.cols;
239
+ session.rows = message.rows;
240
+
241
+ } catch (error) {
242
+ console.error(`Failed to resize session ${message.sessionId}:`, error);
243
+ }
244
+ }
245
+
215
246
  private static handleDisconnect(clientId: string) {
216
247
  const client = this.clients.get(clientId);
217
248
  console.log(`WebSocket client disconnected: ${clientId}`);
@@ -58,7 +58,10 @@ class TerminalManager {
58
58
  }
59
59
 
60
60
  setupXterm() {
61
- // Create terminal instance with VS Code-like theme
61
+ // Detect mobile devices for responsive terminal setup
62
+ const isMobile = window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
63
+
64
+ // Create terminal instance with VS Code-like theme and responsive settings
62
65
  this.terminal = new Terminal({
63
66
  cursorBlink: true,
64
67
  fontSize: 12,
@@ -86,9 +89,14 @@ class TerminalManager {
86
89
  brightCyan: '#29b8db',
87
90
  brightWhite: '#ffffff'
88
91
  },
89
- scrollback: 1000,
92
+ scrollback: isMobile ? 500 : 1000, // Smaller scrollback for mobile performance
90
93
  tabStopWidth: 4,
91
- allowTransparency: false
94
+ allowTransparency: false,
95
+ // Mobile-specific options
96
+ ...(isMobile && {
97
+ convertEol: true,
98
+ disableStdin: false
99
+ })
92
100
  });
93
101
 
94
102
  // Open terminal in container
@@ -110,7 +118,20 @@ class TerminalManager {
110
118
 
111
119
  // Resize handler
112
120
  window.addEventListener('resize', () => {
113
- this.fitTerminal();
121
+ // Add a small delay for mobile orientation changes
122
+ clearTimeout(this.resizeTimeout);
123
+ this.resizeTimeout = setTimeout(() => {
124
+ this.fitTerminal();
125
+ }, 100);
126
+ });
127
+
128
+ // Mobile orientation change handler
129
+ window.addEventListener('orientationchange', () => {
130
+ // Longer delay for orientation changes as they can be slower
131
+ clearTimeout(this.orientationTimeout);
132
+ this.orientationTimeout = setTimeout(() => {
133
+ this.fitTerminal();
134
+ }, 300);
114
135
  });
115
136
  }
116
137
 
@@ -120,10 +141,77 @@ class TerminalManager {
120
141
  setTimeout(() => {
121
142
  const containerRect = this.xtermContainer.getBoundingClientRect();
122
143
  if (containerRect.width > 0 && containerRect.height > 0) {
123
- const cols = Math.floor(containerRect.width / 7.2); // Approximate character width for 12px font
124
- const rows = Math.floor(containerRect.height / 14.4); // Approximate line height for 12px font
125
- console.log(`Fitting terminal ${this.terminalId}: ${cols}x${rows} (container: ${containerRect.width}x${containerRect.height})`);
144
+ // Detect mobile devices for responsive sizing
145
+ const isMobile = window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
146
+
147
+ // Use consistent font size
148
+ const fontSize = 12;
149
+
150
+ // Calculate character dimensions more accurately
151
+ // Create a temporary element to measure actual character size
152
+ const testElement = document.createElement('div');
153
+ testElement.style.fontFamily = this.terminal.options.fontFamily;
154
+ testElement.style.fontSize = `${fontSize}px`;
155
+ testElement.style.position = 'absolute';
156
+ testElement.style.visibility = 'hidden';
157
+ testElement.style.whiteSpace = 'pre';
158
+ testElement.textContent = 'M'; // Use 'M' as it's typically the widest character
159
+ document.body.appendChild(testElement);
160
+
161
+ const charWidth = testElement.getBoundingClientRect().width;
162
+ const charHeight = testElement.getBoundingClientRect().height;
163
+ document.body.removeChild(testElement);
164
+
165
+ // Calculate columns and rows based on actual character dimensions
166
+ const cols = Math.max(20, Math.floor(containerRect.width / charWidth)); // Minimum 20 columns
167
+ const rows = Math.max(10, Math.floor(containerRect.height / charHeight)); // Minimum 10 rows
168
+
169
+ // Store previous dimensions to detect significant changes
170
+ const prevCols = this.lastCols || 0;
171
+ const prevRows = this.lastRows || 0;
172
+ const significantChange = Math.abs(cols - prevCols) > Math.max(10, prevCols * 0.3) ||
173
+ Math.abs(rows - prevRows) > Math.max(5, prevRows * 0.3);
174
+
175
+ console.log(`Fitting terminal ${this.terminalId}: ${cols}x${rows} (container: ${containerRect.width}x${containerRect.height}, charSize: ${charWidth}x${charHeight}, mobile: ${isMobile})`);
176
+
177
+
178
+ // Resize the terminal
126
179
  this.terminal.resize(cols, rows);
180
+
181
+ // Send resize notification to backend PTY
182
+ if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
183
+ const resizeMessage = {
184
+ type: 'resize',
185
+ sessionId: this.sessionId,
186
+ terminalId: this.terminalId,
187
+ cols: cols,
188
+ rows: rows
189
+ };
190
+ this.websocket.send(JSON.stringify(resizeMessage));
191
+ }
192
+
193
+ // Force a refresh if there was a significant size change (like mobile rotation)
194
+ if (significantChange && (prevCols > 0 || prevRows > 0)) {
195
+ console.log(`Significant terminal size change detected, forcing refresh`);
196
+ // Small delay to ensure resize is processed, then refresh
197
+ setTimeout(() => {
198
+ if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
199
+ // Send Ctrl+L to clear and refresh the display
200
+ const refreshMessage = {
201
+ type: 'input',
202
+ sessionId: this.sessionId,
203
+ terminalId: this.terminalId,
204
+ data: '\x0C' // Ctrl+L (form feed) to refresh
205
+ };
206
+ this.websocket.send(JSON.stringify(refreshMessage));
207
+ }
208
+ }, 100);
209
+ }
210
+
211
+ // Store current dimensions for next comparison
212
+ this.lastCols = cols;
213
+ this.lastRows = rows;
214
+
127
215
  } else {
128
216
  console.warn(`Terminal ${this.terminalId} container has zero dimensions, retrying...`);
129
217
  // Retry after a short delay
@@ -336,8 +424,8 @@ function initializeTerminals() {
336
424
  const saplingIslands = document.querySelectorAll('sapling-island');
337
425
 
338
426
  for (const island of saplingIslands) {
339
- // Look for a div with bg-gray-900 class (terminal styling)
340
- const terminalDiv = island.querySelector('div.bg-gray-900[id]');
427
+ // Look for a div with terminal ID (updated selector for new background class)
428
+ const terminalDiv = island.querySelector('div[id^="terminal-"]');
341
429
  if (terminalDiv && terminalDiv.id && terminalDiv.id.startsWith('terminal-')) {
342
430
  const terminalId = terminalDiv.id;
343
431
  console.log('Found terminal component with ID:', terminalId);
@@ -1249,10 +1249,18 @@ video {
1249
1249
  width: 100%;
1250
1250
  }
1251
1251
 
1252
+ .min-w-0 {
1253
+ min-width: 0px;
1254
+ }
1255
+
1252
1256
  .min-w-\[140px\] {
1253
1257
  min-width: 140px;
1254
1258
  }
1255
1259
 
1260
+ .max-w-full {
1261
+ max-width: 100%;
1262
+ }
1263
+
1256
1264
  .flex-1 {
1257
1265
  flex: 1 1 0%;
1258
1266
  }
@@ -1425,11 +1433,6 @@ video {
1425
1433
  background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
1426
1434
  }
1427
1435
 
1428
- .bg-gray-900 {
1429
- --tw-bg-opacity: 1;
1430
- background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));
1431
- }
1432
-
1433
1436
  .bg-transparent {
1434
1437
  background-color: transparent;
1435
1438
  }