pty-manager 1.9.6 → 1.9.8
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.d.mts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +119 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +114 -2
- package/dist/index.mjs.map +1 -1
- package/dist/pty-worker.js +113 -2
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Lazy runtime check for node-pty native addon.
|
|
5
|
+
*
|
|
6
|
+
* Called once before the first PTY spawn. Ensures the native binary is
|
|
7
|
+
* loadable and spawn-helper permissions are correct.
|
|
8
|
+
*
|
|
9
|
+
* 1. Finds the binary — checks for prebuilt pty.node under
|
|
10
|
+
* prebuilds/<platform>-<arch>/ (node-pty >=1.0), then falls back to
|
|
11
|
+
* checking for a node-gyp compiled build/Release/pty.node
|
|
12
|
+
* 2. Fixes spawn-helper permissions — bun install can strip execute
|
|
13
|
+
* bits from the spawn-helper Mach-O binary, causing posix_spawnp
|
|
14
|
+
* failed at runtime. The script chmod 755s all spawn-helpers under
|
|
15
|
+
* prebuilds/
|
|
16
|
+
* 3. Rebuilds if missing — if no binary is found at all, runs
|
|
17
|
+
* node-gyp rebuild as a last resort (with a 2-minute timeout)
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Ensure node-pty is usable. Called once before first spawn.
|
|
21
|
+
* Idempotent — subsequent calls are no-ops.
|
|
22
|
+
*
|
|
23
|
+
* @param log - logger function (defaults to console.log)
|
|
24
|
+
* @throws Error if no native binary can be found or built
|
|
25
|
+
*/
|
|
26
|
+
declare function ensurePty(log?: (msg: string) => void): void;
|
|
27
|
+
|
|
3
28
|
/**
|
|
4
29
|
* PTY Agent Manager Types
|
|
5
30
|
*
|
|
@@ -1251,4 +1276,4 @@ declare function isBun(): boolean;
|
|
|
1251
1276
|
*/
|
|
1252
1277
|
declare function createPTYManager(options?: BunPTYManagerOptions): BunCompatiblePTYManager;
|
|
1253
1278
|
|
|
1254
|
-
export { type AdapterFactoryConfig, AdapterRegistry, type AuthRequiredInfo, type AuthRequiredMethod, type AutoResponseRule, BaseCLIAdapter, type BlockingPromptDetection, type BlockingPromptInfo, type BlockingPromptType, type BuildTimelineOptions, BunCompatiblePTYManager, type BunPTYManagerOptions, type CLIAdapter, type LogOptions, type Logger, type LoginDetection, type MessageType, PTYManager, type PTYManagerConfig, type PTYManagerEvents, PTYSession, type PTYSessionEvents, type ParsedOutput, SPECIAL_KEYS, type SessionFilter, type SessionHandle, type SessionMessage, type SessionStatus, ShellAdapter, type ShellAdapterOptions, type SpawnConfig, type StallClassification, type StopOptions, type TaskCompletionTimelineResult, type TaskCompletionTimelineStep, type TaskCompletionTraceRecord, type TaskCompletionTurnTimeline, type TerminalAttachment, type ToolRunningInfo, type WorkerSessionHandle, buildTaskCompletionTimeline, createAdapter, createPTYManager, extractTaskCompletionTraceRecords, isBun };
|
|
1279
|
+
export { type AdapterFactoryConfig, AdapterRegistry, type AuthRequiredInfo, type AuthRequiredMethod, type AutoResponseRule, BaseCLIAdapter, type BlockingPromptDetection, type BlockingPromptInfo, type BlockingPromptType, type BuildTimelineOptions, BunCompatiblePTYManager, type BunPTYManagerOptions, type CLIAdapter, type LogOptions, type Logger, type LoginDetection, type MessageType, PTYManager, type PTYManagerConfig, type PTYManagerEvents, PTYSession, type PTYSessionEvents, type ParsedOutput, SPECIAL_KEYS, type SessionFilter, type SessionHandle, type SessionMessage, type SessionStatus, ShellAdapter, type ShellAdapterOptions, type SpawnConfig, type StallClassification, type StopOptions, type TaskCompletionTimelineResult, type TaskCompletionTimelineStep, type TaskCompletionTraceRecord, type TaskCompletionTurnTimeline, type TerminalAttachment, type ToolRunningInfo, type WorkerSessionHandle, buildTaskCompletionTimeline, createAdapter, createPTYManager, ensurePty, extractTaskCompletionTraceRecords, isBun };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Lazy runtime check for node-pty native addon.
|
|
5
|
+
*
|
|
6
|
+
* Called once before the first PTY spawn. Ensures the native binary is
|
|
7
|
+
* loadable and spawn-helper permissions are correct.
|
|
8
|
+
*
|
|
9
|
+
* 1. Finds the binary — checks for prebuilt pty.node under
|
|
10
|
+
* prebuilds/<platform>-<arch>/ (node-pty >=1.0), then falls back to
|
|
11
|
+
* checking for a node-gyp compiled build/Release/pty.node
|
|
12
|
+
* 2. Fixes spawn-helper permissions — bun install can strip execute
|
|
13
|
+
* bits from the spawn-helper Mach-O binary, causing posix_spawnp
|
|
14
|
+
* failed at runtime. The script chmod 755s all spawn-helpers under
|
|
15
|
+
* prebuilds/
|
|
16
|
+
* 3. Rebuilds if missing — if no binary is found at all, runs
|
|
17
|
+
* node-gyp rebuild as a last resort (with a 2-minute timeout)
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Ensure node-pty is usable. Called once before first spawn.
|
|
21
|
+
* Idempotent — subsequent calls are no-ops.
|
|
22
|
+
*
|
|
23
|
+
* @param log - logger function (defaults to console.log)
|
|
24
|
+
* @throws Error if no native binary can be found or built
|
|
25
|
+
*/
|
|
26
|
+
declare function ensurePty(log?: (msg: string) => void): void;
|
|
27
|
+
|
|
3
28
|
/**
|
|
4
29
|
* PTY Agent Manager Types
|
|
5
30
|
*
|
|
@@ -1251,4 +1276,4 @@ declare function isBun(): boolean;
|
|
|
1251
1276
|
*/
|
|
1252
1277
|
declare function createPTYManager(options?: BunPTYManagerOptions): BunCompatiblePTYManager;
|
|
1253
1278
|
|
|
1254
|
-
export { type AdapterFactoryConfig, AdapterRegistry, type AuthRequiredInfo, type AuthRequiredMethod, type AutoResponseRule, BaseCLIAdapter, type BlockingPromptDetection, type BlockingPromptInfo, type BlockingPromptType, type BuildTimelineOptions, BunCompatiblePTYManager, type BunPTYManagerOptions, type CLIAdapter, type LogOptions, type Logger, type LoginDetection, type MessageType, PTYManager, type PTYManagerConfig, type PTYManagerEvents, PTYSession, type PTYSessionEvents, type ParsedOutput, SPECIAL_KEYS, type SessionFilter, type SessionHandle, type SessionMessage, type SessionStatus, ShellAdapter, type ShellAdapterOptions, type SpawnConfig, type StallClassification, type StopOptions, type TaskCompletionTimelineResult, type TaskCompletionTimelineStep, type TaskCompletionTraceRecord, type TaskCompletionTurnTimeline, type TerminalAttachment, type ToolRunningInfo, type WorkerSessionHandle, buildTaskCompletionTimeline, createAdapter, createPTYManager, extractTaskCompletionTraceRecords, isBun };
|
|
1279
|
+
export { type AdapterFactoryConfig, AdapterRegistry, type AuthRequiredInfo, type AuthRequiredMethod, type AutoResponseRule, BaseCLIAdapter, type BlockingPromptDetection, type BlockingPromptInfo, type BlockingPromptType, type BuildTimelineOptions, BunCompatiblePTYManager, type BunPTYManagerOptions, type CLIAdapter, type LogOptions, type Logger, type LoginDetection, type MessageType, PTYManager, type PTYManagerConfig, type PTYManagerEvents, PTYSession, type PTYSessionEvents, type ParsedOutput, SPECIAL_KEYS, type SessionFilter, type SessionHandle, type SessionMessage, type SessionStatus, ShellAdapter, type ShellAdapterOptions, type SpawnConfig, type StallClassification, type StopOptions, type TaskCompletionTimelineResult, type TaskCompletionTimelineStep, type TaskCompletionTraceRecord, type TaskCompletionTurnTimeline, type TerminalAttachment, type ToolRunningInfo, type WorkerSessionHandle, buildTaskCompletionTimeline, createAdapter, createPTYManager, ensurePty, extractTaskCompletionTraceRecords, isBun };
|
package/dist/index.js
CHANGED
|
@@ -40,11 +40,123 @@ __export(index_exports, {
|
|
|
40
40
|
buildTaskCompletionTimeline: () => buildTaskCompletionTimeline,
|
|
41
41
|
createAdapter: () => createAdapter,
|
|
42
42
|
createPTYManager: () => createPTYManager,
|
|
43
|
+
ensurePty: () => ensurePty,
|
|
43
44
|
extractTaskCompletionTraceRecords: () => extractTaskCompletionTraceRecords,
|
|
44
45
|
isBun: () => isBun
|
|
45
46
|
});
|
|
46
47
|
module.exports = __toCommonJS(index_exports);
|
|
47
48
|
|
|
49
|
+
// src/ensure-pty.ts
|
|
50
|
+
var import_fs = require("fs");
|
|
51
|
+
var import_path = require("path");
|
|
52
|
+
var import_child_process = require("child_process");
|
|
53
|
+
var TAG = "[pty-preflight]";
|
|
54
|
+
var platformArch = `${process.platform}-${process.arch}`;
|
|
55
|
+
var checked = false;
|
|
56
|
+
function findNodePtyRoots() {
|
|
57
|
+
const roots = [];
|
|
58
|
+
try {
|
|
59
|
+
const nodePtyMain = require.resolve("node-pty");
|
|
60
|
+
const nodePtyRoot = (0, import_path.dirname)((0, import_path.dirname)(nodePtyMain));
|
|
61
|
+
if ((0, import_fs.existsSync)((0, import_path.join)(nodePtyRoot, "package.json"))) {
|
|
62
|
+
roots.push(nodePtyRoot);
|
|
63
|
+
}
|
|
64
|
+
} catch {
|
|
65
|
+
}
|
|
66
|
+
const packageRoot = (0, import_path.join)(__dirname, "..");
|
|
67
|
+
const candidates = [
|
|
68
|
+
(0, import_path.join)(packageRoot, "node_modules", "node-pty"),
|
|
69
|
+
// Monorepo hoisted
|
|
70
|
+
(0, import_path.join)(packageRoot, "..", "node-pty"),
|
|
71
|
+
(0, import_path.join)(packageRoot, "..", "..", "node-pty")
|
|
72
|
+
];
|
|
73
|
+
for (const candidate of candidates) {
|
|
74
|
+
if ((0, import_fs.existsSync)((0, import_path.join)(candidate, "package.json")) && !roots.includes(candidate)) {
|
|
75
|
+
roots.push(candidate);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return roots;
|
|
79
|
+
}
|
|
80
|
+
function findNativeBinary(nodePtyRoot) {
|
|
81
|
+
const prebuildPath = (0, import_path.join)(nodePtyRoot, "prebuilds", platformArch, "pty.node");
|
|
82
|
+
if ((0, import_fs.existsSync)(prebuildPath)) {
|
|
83
|
+
return { type: "prebuild", path: prebuildPath };
|
|
84
|
+
}
|
|
85
|
+
const gypPath = (0, import_path.join)(nodePtyRoot, "build", "Release", "pty.node");
|
|
86
|
+
if ((0, import_fs.existsSync)(gypPath)) {
|
|
87
|
+
return { type: "gyp", path: gypPath };
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
function fixSpawnHelpers(nodePtyRoot, log) {
|
|
92
|
+
if (process.platform === "win32") return;
|
|
93
|
+
const prebuildsDir = (0, import_path.join)(nodePtyRoot, "prebuilds");
|
|
94
|
+
if (!(0, import_fs.existsSync)(prebuildsDir)) return;
|
|
95
|
+
try {
|
|
96
|
+
for (const entry of (0, import_fs.readdirSync)(prebuildsDir)) {
|
|
97
|
+
const helperPath = (0, import_path.join)(prebuildsDir, entry, "spawn-helper");
|
|
98
|
+
if ((0, import_fs.existsSync)(helperPath)) {
|
|
99
|
+
try {
|
|
100
|
+
const stat = (0, import_fs.statSync)(helperPath);
|
|
101
|
+
if ((stat.mode & 73) === 0) {
|
|
102
|
+
(0, import_fs.chmodSync)(helperPath, 493);
|
|
103
|
+
log(`${TAG} Fixed spawn-helper permissions: ${(0, import_path.relative)(nodePtyRoot, helperPath)}`);
|
|
104
|
+
}
|
|
105
|
+
} catch {
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
} catch {
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function rebuildNodePty(nodePtyRoot, log) {
|
|
113
|
+
log(`${TAG} No native binary found \u2014 attempting node-gyp rebuild...`);
|
|
114
|
+
try {
|
|
115
|
+
(0, import_child_process.execSync)("node-gyp rebuild", {
|
|
116
|
+
cwd: nodePtyRoot,
|
|
117
|
+
stdio: "pipe",
|
|
118
|
+
timeout: 12e4
|
|
119
|
+
});
|
|
120
|
+
log(`${TAG} node-gyp rebuild succeeded`);
|
|
121
|
+
return true;
|
|
122
|
+
} catch (err) {
|
|
123
|
+
log(`${TAG} node-gyp rebuild failed: ${err instanceof Error ? err.message : err}`);
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function ensurePty(log = console.log) {
|
|
128
|
+
if (checked) return;
|
|
129
|
+
checked = true;
|
|
130
|
+
const roots = findNodePtyRoots();
|
|
131
|
+
if (roots.length === 0) {
|
|
132
|
+
throw new Error(
|
|
133
|
+
`${TAG} node-pty not found. Install it with: npm install node-pty`
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
let anyBinaryFound = false;
|
|
137
|
+
for (const root of roots) {
|
|
138
|
+
const binary = findNativeBinary(root);
|
|
139
|
+
if (binary) {
|
|
140
|
+
log(`${TAG} Found ${binary.type} binary for ${platformArch}`);
|
|
141
|
+
anyBinaryFound = true;
|
|
142
|
+
}
|
|
143
|
+
fixSpawnHelpers(root, log);
|
|
144
|
+
if (!binary) {
|
|
145
|
+
if (rebuildNodePty(root, log)) {
|
|
146
|
+
if (findNativeBinary(root)) {
|
|
147
|
+
anyBinaryFound = true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (anyBinaryFound) break;
|
|
152
|
+
}
|
|
153
|
+
if (!anyBinaryFound) {
|
|
154
|
+
throw new Error(
|
|
155
|
+
`${TAG} No node-pty native binary available for ${platformArch}. Try: cd node_modules/node-pty && node-gyp rebuild`
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
48
160
|
// src/pty-manager.ts
|
|
49
161
|
var import_events2 = require("events");
|
|
50
162
|
|
|
@@ -896,6 +1008,7 @@ var PTYSession = class _PTYSession extends import_events.EventEmitter {
|
|
|
896
1008
|
if (this.ptyProcess) {
|
|
897
1009
|
throw new Error("Session already started");
|
|
898
1010
|
}
|
|
1011
|
+
ensurePty((msg) => this.logger.info({ sessionId: this.id }, msg));
|
|
899
1012
|
const nodePty = loadPty();
|
|
900
1013
|
this._status = "starting";
|
|
901
1014
|
this._startedAt = /* @__PURE__ */ new Date();
|
|
@@ -1074,7 +1187,6 @@ var PTYSession = class _PTYSession extends import_events.EventEmitter {
|
|
|
1074
1187
|
} else {
|
|
1075
1188
|
this.writeRaw(resp + "\r");
|
|
1076
1189
|
}
|
|
1077
|
-
this._lastBlockingPromptHash = null;
|
|
1078
1190
|
this.outputBuffer = "";
|
|
1079
1191
|
this.emit("blocking_prompt", promptInfo, true);
|
|
1080
1192
|
return true;
|
|
@@ -1426,7 +1538,7 @@ var PTYSession = class _PTYSession extends import_events.EventEmitter {
|
|
|
1426
1538
|
break;
|
|
1427
1539
|
case "permission_approved":
|
|
1428
1540
|
this._lastActivityAt = /* @__PURE__ */ new Date();
|
|
1429
|
-
this.
|
|
1541
|
+
this.outputBuffer = "";
|
|
1430
1542
|
this.resetStallTimer();
|
|
1431
1543
|
break;
|
|
1432
1544
|
default:
|
|
@@ -2002,7 +2114,7 @@ function asTimestamp(value) {
|
|
|
2002
2114
|
}
|
|
2003
2115
|
|
|
2004
2116
|
// src/adapters/base-adapter.ts
|
|
2005
|
-
var
|
|
2117
|
+
var import_child_process2 = require("child_process");
|
|
2006
2118
|
var BaseCLIAdapter = class {
|
|
2007
2119
|
/**
|
|
2008
2120
|
* Auto-response rules for handling known blocking prompts.
|
|
@@ -2168,7 +2280,7 @@ var BaseCLIAdapter = class {
|
|
|
2168
2280
|
return new Promise((resolve) => {
|
|
2169
2281
|
const command = this.getCommand();
|
|
2170
2282
|
try {
|
|
2171
|
-
const proc = (0,
|
|
2283
|
+
const proc = (0, import_child_process2.spawn)(command, ["--version"], {
|
|
2172
2284
|
shell: true,
|
|
2173
2285
|
timeout: 5e3
|
|
2174
2286
|
});
|
|
@@ -2431,7 +2543,7 @@ var ShellAdapter = class {
|
|
|
2431
2543
|
};
|
|
2432
2544
|
|
|
2433
2545
|
// src/bun-compat.ts
|
|
2434
|
-
var
|
|
2546
|
+
var import_child_process3 = require("child_process");
|
|
2435
2547
|
var import_events3 = require("events");
|
|
2436
2548
|
var path = __toESM(require("path"));
|
|
2437
2549
|
var readline = __toESM(require("readline"));
|
|
@@ -2472,7 +2584,7 @@ var BunCompatiblePTYManager = class extends import_events3.EventEmitter {
|
|
|
2472
2584
|
return possiblePaths[0];
|
|
2473
2585
|
}
|
|
2474
2586
|
startWorker() {
|
|
2475
|
-
this.worker = (0,
|
|
2587
|
+
this.worker = (0, import_child_process3.spawn)(this.nodePath, [this.workerPath], {
|
|
2476
2588
|
stdio: ["pipe", "pipe", "pipe"],
|
|
2477
2589
|
env: { ...process.env, ...this.env }
|
|
2478
2590
|
});
|
|
@@ -2983,6 +3095,7 @@ function createPTYManager(options) {
|
|
|
2983
3095
|
buildTaskCompletionTimeline,
|
|
2984
3096
|
createAdapter,
|
|
2985
3097
|
createPTYManager,
|
|
3098
|
+
ensurePty,
|
|
2986
3099
|
extractTaskCompletionTraceRecords,
|
|
2987
3100
|
isBun
|
|
2988
3101
|
});
|