@tyvm/knowhow-module-terminal 0.0.1

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 ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@tyvm/knowhow-module-terminal",
3
+ "version": "0.0.1",
4
+ "description": "Terminal addon module for @tyvm/knowhow — portless PTY over the tunnel WebSocket",
5
+ "main": "ts_build/index.js",
6
+ "types": "ts_build/index.d.ts",
7
+ "scripts": {
8
+ "compile": "tsc",
9
+ "prepublishOnly": "npm run compile"
10
+ },
11
+ "keywords": [
12
+ "knowhow",
13
+ "terminal",
14
+ "pty",
15
+ "tunnel"
16
+ ],
17
+ "author": "Tyvm AI",
18
+ "license": "MIT",
19
+ "peerDependencies": {
20
+ "@tyvm/knowhow": "*"
21
+ },
22
+ "dependencies": {
23
+ "@tyvm/knowhow-tunnel": "*",
24
+ "node-pty": "^1.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^20.19.39",
28
+ "typescript": "^5.0.0"
29
+ }
30
+ }
@@ -0,0 +1,143 @@
1
+ import {
2
+ TunnelAddon,
3
+ TunnelAddonContext,
4
+ AnyTunnelMessage,
5
+ TunnelMessageType,
6
+ TunnelPtyOpen,
7
+ TunnelPtyData,
8
+ TunnelPtyResize,
9
+ TunnelPtyClose,
10
+ } from "@tyvm/knowhow-tunnel";
11
+ import * as pty from "node-pty";
12
+
13
+ interface PtySession {
14
+ pty: pty.IPty;
15
+ streamId: string;
16
+ }
17
+
18
+ /**
19
+ * TunnelTerminalAddon
20
+ *
21
+ * Handles TUNNEL_PTY_* messages over the existing tunnel WebSocket.
22
+ * No local port is opened — all communication flows through the tunnel.
23
+ *
24
+ * Message flow:
25
+ * backend → worker TUNNEL_PTY_OPEN → spawn PTY
26
+ * worker → backend TUNNEL_PTY_DATA → PTY stdout/stderr output
27
+ * backend → worker TUNNEL_PTY_DATA → keyboard input
28
+ * backend → worker TUNNEL_PTY_RESIZE → resize PTY window
29
+ * backend → worker TUNNEL_PTY_CLOSE → kill PTY
30
+ * worker → backend TUNNEL_PTY_EXIT → PTY process exited
31
+ */
32
+ export class TunnelTerminalAddon implements TunnelAddon {
33
+ name = "terminal";
34
+
35
+ // Handle all TUNNEL_PTY_* messages via prefix matching
36
+ handles = ["TUNNEL_PTY_"];
37
+
38
+ private sessions = new Map<string, PtySession>();
39
+
40
+ onDisconnect(): void {
41
+ // Kill all active PTY sessions when the tunnel disconnects
42
+ for (const [streamId, session] of this.sessions) {
43
+ try {
44
+ session.pty.kill();
45
+ } catch {
46
+ // ignore
47
+ }
48
+ this.sessions.delete(streamId);
49
+ }
50
+ }
51
+
52
+ async onMessage(message: AnyTunnelMessage, ctx: TunnelAddonContext): Promise<void> {
53
+ switch (message.type) {
54
+ case TunnelMessageType.PTY_OPEN:
55
+ this.handleOpen(message as TunnelPtyOpen, ctx);
56
+ break;
57
+ case TunnelMessageType.PTY_DATA:
58
+ this.handleInput(message as TunnelPtyData);
59
+ break;
60
+ case TunnelMessageType.PTY_RESIZE:
61
+ this.handleResize(message as TunnelPtyResize);
62
+ break;
63
+ case TunnelMessageType.PTY_CLOSE:
64
+ this.handleClose(message as TunnelPtyClose, ctx);
65
+ break;
66
+ }
67
+ }
68
+
69
+ private handleOpen(msg: TunnelPtyOpen, ctx: TunnelAddonContext): void {
70
+ const { streamId, command, args = [], cols = 80, rows = 24, env = {} } = msg;
71
+
72
+ if (this.sessions.has(streamId)) {
73
+ console.warn(`[terminal] PTY session already exists for streamId=${streamId}`);
74
+ return;
75
+ }
76
+
77
+ console.log(`[terminal] Spawning PTY streamId=${streamId} cmd=${command} ${args.join(" ")}`);
78
+
79
+ const shell = pty.spawn(command, args, {
80
+ name: "xterm-256color",
81
+ cols,
82
+ rows,
83
+ cwd: process.env.HOME || process.cwd(),
84
+ env: {
85
+ ...process.env,
86
+ ...env,
87
+ TERM: "xterm-256color",
88
+ COLORTERM: "truecolor",
89
+ } as Record<string, string>,
90
+ });
91
+
92
+ const session: PtySession = { pty: shell, streamId };
93
+ this.sessions.set(streamId, session);
94
+
95
+ // Forward PTY output back through the tunnel
96
+ shell.onData((data: string) => {
97
+ ctx.send({
98
+ type: TunnelMessageType.PTY_DATA,
99
+ streamId,
100
+ data: Buffer.from(data).toString("base64"),
101
+ });
102
+ });
103
+
104
+ shell.onExit(({ exitCode }) => {
105
+ console.log(`[terminal] PTY exited streamId=${streamId} code=${exitCode}`);
106
+ this.sessions.delete(streamId);
107
+ ctx.send({
108
+ type: TunnelMessageType.PTY_EXIT,
109
+ streamId,
110
+ exitCode,
111
+ });
112
+ });
113
+ }
114
+
115
+ private handleInput(msg: TunnelPtyData): void {
116
+ const session = this.sessions.get(msg.streamId);
117
+ if (!session) return;
118
+ const text = Buffer.from(msg.data, "base64").toString("utf8");
119
+ session.pty.write(text);
120
+ }
121
+
122
+ private handleResize(msg: TunnelPtyResize): void {
123
+ const session = this.sessions.get(msg.streamId);
124
+ if (!session) return;
125
+ session.pty.resize(msg.cols, msg.rows);
126
+ }
127
+
128
+ private handleClose(msg: TunnelPtyClose, ctx: TunnelAddonContext): void {
129
+ const session = this.sessions.get(msg.streamId);
130
+ if (!session) return;
131
+ try {
132
+ session.pty.kill();
133
+ } catch {
134
+ // ignore
135
+ }
136
+ this.sessions.delete(msg.streamId);
137
+ ctx.send({
138
+ type: TunnelMessageType.PTY_EXIT,
139
+ streamId: msg.streamId,
140
+ exitCode: 0,
141
+ });
142
+ }
143
+ }
package/src/index.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { KnowhowModule, InitParams } from "@tyvm/knowhow/ts_build/src/services/modules/types";
2
+ import { TunnelTerminalAddon } from "./TunnelTerminalAddon";
3
+
4
+ export { TunnelTerminalAddon } from "./TunnelTerminalAddon";
5
+
6
+ const terminalModule: KnowhowModule = {
7
+ async init(params: InitParams) {
8
+ const tunnelHandler = params.context?.Tunnel;
9
+ if (tunnelHandler) {
10
+ tunnelHandler.use(new TunnelTerminalAddon());
11
+ console.log("✅ Terminal module: TunnelTerminalAddon registered on tunnel handler");
12
+ } else {
13
+ console.warn("⚠️ Terminal module: no TunnelHandler in context — terminal addon not registered");
14
+ }
15
+ },
16
+ tools: [],
17
+ agents: [],
18
+ plugins: [],
19
+ clients: [],
20
+ commands: [],
21
+ };
22
+
23
+ export default terminalModule;
@@ -0,0 +1,12 @@
1
+ import { TunnelAddon, TunnelAddonContext, AnyTunnelMessage } from "@tyvm/knowhow-tunnel";
2
+ export declare class TunnelTerminalAddon implements TunnelAddon {
3
+ name: string;
4
+ handles: string[];
5
+ private sessions;
6
+ onDisconnect(): void;
7
+ onMessage(message: AnyTunnelMessage, ctx: TunnelAddonContext): Promise<void>;
8
+ private handleOpen;
9
+ private handleInput;
10
+ private handleResize;
11
+ private handleClose;
12
+ }
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TunnelTerminalAddon = void 0;
37
+ const knowhow_tunnel_1 = require("@tyvm/knowhow-tunnel");
38
+ const pty = __importStar(require("node-pty"));
39
+ class TunnelTerminalAddon {
40
+ name = "terminal";
41
+ handles = ["TUNNEL_PTY_"];
42
+ sessions = new Map();
43
+ onDisconnect() {
44
+ for (const [streamId, session] of this.sessions) {
45
+ try {
46
+ session.pty.kill();
47
+ }
48
+ catch {
49
+ }
50
+ this.sessions.delete(streamId);
51
+ }
52
+ }
53
+ async onMessage(message, ctx) {
54
+ switch (message.type) {
55
+ case knowhow_tunnel_1.TunnelMessageType.PTY_OPEN:
56
+ this.handleOpen(message, ctx);
57
+ break;
58
+ case knowhow_tunnel_1.TunnelMessageType.PTY_DATA:
59
+ this.handleInput(message);
60
+ break;
61
+ case knowhow_tunnel_1.TunnelMessageType.PTY_RESIZE:
62
+ this.handleResize(message);
63
+ break;
64
+ case knowhow_tunnel_1.TunnelMessageType.PTY_CLOSE:
65
+ this.handleClose(message, ctx);
66
+ break;
67
+ }
68
+ }
69
+ handleOpen(msg, ctx) {
70
+ const { streamId, command, args = [], cols = 80, rows = 24, env = {} } = msg;
71
+ if (this.sessions.has(streamId)) {
72
+ console.warn(`[terminal] PTY session already exists for streamId=${streamId}`);
73
+ return;
74
+ }
75
+ console.log(`[terminal] Spawning PTY streamId=${streamId} cmd=${command} ${args.join(" ")}`);
76
+ const shell = pty.spawn(command, args, {
77
+ name: "xterm-256color",
78
+ cols,
79
+ rows,
80
+ cwd: process.env.HOME || process.cwd(),
81
+ env: {
82
+ ...process.env,
83
+ ...env,
84
+ TERM: "xterm-256color",
85
+ COLORTERM: "truecolor",
86
+ },
87
+ });
88
+ const session = { pty: shell, streamId };
89
+ this.sessions.set(streamId, session);
90
+ shell.onData((data) => {
91
+ ctx.send({
92
+ type: knowhow_tunnel_1.TunnelMessageType.PTY_DATA,
93
+ streamId,
94
+ data: Buffer.from(data).toString("base64"),
95
+ });
96
+ });
97
+ shell.onExit(({ exitCode }) => {
98
+ console.log(`[terminal] PTY exited streamId=${streamId} code=${exitCode}`);
99
+ this.sessions.delete(streamId);
100
+ ctx.send({
101
+ type: knowhow_tunnel_1.TunnelMessageType.PTY_EXIT,
102
+ streamId,
103
+ exitCode,
104
+ });
105
+ });
106
+ }
107
+ handleInput(msg) {
108
+ const session = this.sessions.get(msg.streamId);
109
+ if (!session)
110
+ return;
111
+ const text = Buffer.from(msg.data, "base64").toString("utf8");
112
+ session.pty.write(text);
113
+ }
114
+ handleResize(msg) {
115
+ const session = this.sessions.get(msg.streamId);
116
+ if (!session)
117
+ return;
118
+ session.pty.resize(msg.cols, msg.rows);
119
+ }
120
+ handleClose(msg, ctx) {
121
+ const session = this.sessions.get(msg.streamId);
122
+ if (!session)
123
+ return;
124
+ try {
125
+ session.pty.kill();
126
+ }
127
+ catch {
128
+ }
129
+ this.sessions.delete(msg.streamId);
130
+ ctx.send({
131
+ type: knowhow_tunnel_1.TunnelMessageType.PTY_EXIT,
132
+ streamId: msg.streamId,
133
+ exitCode: 0,
134
+ });
135
+ }
136
+ }
137
+ exports.TunnelTerminalAddon = TunnelTerminalAddon;
138
+ //# sourceMappingURL=TunnelTerminalAddon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TunnelTerminalAddon.js","sourceRoot":"","sources":["../src/TunnelTerminalAddon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { KnowhowModule } from "@tyvm/knowhow/ts_build/src/services/modules/types";
2
+ export { TunnelTerminalAddon } from "./TunnelTerminalAddon";
3
+ declare const terminalModule: KnowhowModule;
4
+ export default terminalModule;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TunnelTerminalAddon = void 0;
4
+ const TunnelTerminalAddon_1 = require("./TunnelTerminalAddon");
5
+ var TunnelTerminalAddon_2 = require("./TunnelTerminalAddon");
6
+ Object.defineProperty(exports, "TunnelTerminalAddon", { enumerable: true, get: function () { return TunnelTerminalAddon_2.TunnelTerminalAddon; } });
7
+ const terminalModule = {
8
+ async init(params) {
9
+ const tunnelHandler = params.context?.Tunnel;
10
+ if (tunnelHandler) {
11
+ tunnelHandler.use(new TunnelTerminalAddon_1.TunnelTerminalAddon());
12
+ console.log("✅ Terminal module: TunnelTerminalAddon registered on tunnel handler");
13
+ }
14
+ else {
15
+ console.warn("⚠️ Terminal module: no TunnelHandler in context — terminal addon not registered");
16
+ }
17
+ },
18
+ tools: [],
19
+ agents: [],
20
+ plugins: [],
21
+ clients: [],
22
+ commands: [],
23
+ };
24
+ exports.default = terminalModule;
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,+DAA4D;AAE5D,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAE5B,MAAM,cAAc,GAAkB;IACpC,KAAK,CAAC,IAAI,CAAC,MAAkB;QAC3B,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;QAC7C,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,GAAG,CAAC,IAAI,yCAAmB,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IACD,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,kBAAe,cAAc,CAAC"}
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": ["es5", "es6", "es2021", "es2022"],
4
+ "skipLibCheck": true,
5
+ "noImplicitAny": false,
6
+ "removeComments": true,
7
+ "resolveJsonModule": true,
8
+ "declaration": true,
9
+ "module": "commonjs",
10
+ "esModuleInterop": true,
11
+ "moduleResolution": "node",
12
+ "target": "esnext",
13
+ "outDir": "ts_build",
14
+ "sourceMap": true
15
+ },
16
+ "include": ["./src/**/*.ts", "./tests/**/*.ts"],
17
+ "exclude": ["node_modules", "tests/tree-sitter/test-files/**/*.ts", "tests/test-files/**/*.ts"]
18
+ }