@vetala/vetala 0.2.3-dev → 0.3.1-dev

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.
@@ -0,0 +1,431 @@
1
+ import * as readline from "node:readline";
2
+ import { loadConfig } from "./config.js";
3
+ import { Agent, isAgentInterruptedError } from "./agent.js";
4
+ import { ApprovalManager } from "./approvals.js";
5
+ import { IpcTerminalUI } from "./ipc-ui.js";
6
+ import { PathPolicy } from "./path-policy.js";
7
+ import { SessionStore } from "./session-store.js";
8
+ import { SkillRuntime } from "./skills/runtime.js";
9
+ import { createToolRegistry } from "./tools/index.js";
10
+ import { detectRuntimeHostProfile } from "./runtime-profile.js";
11
+ async function main() {
12
+ // Parse workspace from args
13
+ const args = process.argv.slice(2);
14
+ let workspace = process.cwd();
15
+ for (let i = 0; i < args.length; i++) {
16
+ if (args[i] === "--workspace" && i + 1 < args.length) {
17
+ workspace = args[i + 1];
18
+ }
19
+ }
20
+ let config = await loadConfig();
21
+ const store = new SessionStore();
22
+ const runtimeProfile = detectRuntimeHostProfile();
23
+ const ui = new IpcTerminalUI(runtimeProfile);
24
+ // Load or create a session
25
+ let session;
26
+ try {
27
+ const sessions = await store.listSessions();
28
+ const matching = sessions.find((s) => s.workspaceRoot === workspace);
29
+ if (matching) {
30
+ session = await store.loadSession(matching.id);
31
+ }
32
+ else {
33
+ session = await store.createSession(workspace, config.defaultProvider, config.defaultModel);
34
+ }
35
+ }
36
+ catch {
37
+ session = await store.createSession(workspace, config.defaultProvider, config.defaultModel);
38
+ }
39
+ // Send the initial ready message with dashboard data
40
+ ui.sendReady(session);
41
+ ui.sendStatus("Ready");
42
+ const skills = new SkillRuntime({
43
+ getSession: () => session,
44
+ sessionStore: store
45
+ });
46
+ // Set up stdin reader for IPC commands from the Haskell TUI
47
+ const rl = readline.createInterface({
48
+ input: process.stdin,
49
+ terminal: false
50
+ });
51
+ let activeAgent = null;
52
+ // Pending approval resolution
53
+ let pendingApprovalResolve = null;
54
+ const pendingSelects = new Map();
55
+ const pendingInputs = new Map();
56
+ const requestApprovalDecision = (request) => {
57
+ return new Promise((resolve) => {
58
+ pendingApprovalResolve = resolve;
59
+ ui.sendApprovalPrompt(request.label);
60
+ });
61
+ };
62
+ const requestSelect = (title, options) => {
63
+ return new Promise((resolve) => {
64
+ const id = Math.random().toString();
65
+ pendingSelects.set(id, resolve);
66
+ ui.sendPromptSelect(id, title, options);
67
+ });
68
+ };
69
+ const requestTextInput = (title, placeholder) => {
70
+ return new Promise((resolve) => {
71
+ const id = Math.random().toString();
72
+ pendingInputs.set(id, resolve);
73
+ ui.sendPromptInput(id, title, placeholder);
74
+ });
75
+ };
76
+ const createTools = () => createToolRegistry({
77
+ includeWebSearch: config.searchProviderName !== "disabled",
78
+ skillRuntime: skills
79
+ });
80
+ let queuedNextPrompt = null;
81
+ const runPrompt = async (prompt, forceRun = false) => {
82
+ const trimmed = prompt.trim();
83
+ if (!trimmed)
84
+ return;
85
+ // Busy guard: if agent is running, ask user what to do
86
+ if (activeAgent && !forceRun) {
87
+ const choice = await requestSelect(`Current turn is still running. What to do with: "${trimmed.slice(0, 60)}"?`, ["Send now (stop current turn)", "Send after current turn", "Cancel"]);
88
+ if (choice === 0) {
89
+ // Force: interrupt current, then queue to run it
90
+ queuedNextPrompt = trimmed;
91
+ ui.info("Stopping the current turn and sending next prompt.");
92
+ ui.sendStatus("Stopping current turn");
93
+ activeAgent.requestStop();
94
+ }
95
+ else if (choice === 1) {
96
+ // Queue
97
+ queuedNextPrompt = trimmed;
98
+ ui.info(`Queued next prompt: ${trimmed.slice(0, 80)}`);
99
+ ui.sendStatus("Queued next prompt");
100
+ }
101
+ // else cancel: do nothing
102
+ return;
103
+ }
104
+ // If it's a slash command, handle simply
105
+ if (trimmed.startsWith("/")) {
106
+ await handleCommand(trimmed);
107
+ return;
108
+ }
109
+ ui.sendStatus("Running agent");
110
+ const approvals = new ApprovalManager(session, store, null, requestApprovalDecision);
111
+ const agent = new Agent({
112
+ config,
113
+ session,
114
+ sessionStore: store,
115
+ approvals,
116
+ pathPolicy: new PathPolicy(session.workspaceRoot, approvals),
117
+ runtimeProfile,
118
+ skills,
119
+ tools: createTools(),
120
+ ui
121
+ });
122
+ activeAgent = agent;
123
+ try {
124
+ await agent.runTurn(trimmed, true);
125
+ ui.sendStatus(queuedNextPrompt ? "Running queued prompt" : "Ready");
126
+ }
127
+ catch (error) {
128
+ if (isAgentInterruptedError(error)) {
129
+ ui.sendStatus(queuedNextPrompt ? "Running queued prompt" : "Interrupted");
130
+ }
131
+ else {
132
+ ui.error(error instanceof Error ? error.message : String(error));
133
+ ui.sendStatus("Failed");
134
+ }
135
+ }
136
+ finally {
137
+ activeAgent = null;
138
+ const next = queuedNextPrompt;
139
+ if (next) {
140
+ queuedNextPrompt = null;
141
+ void runPrompt(next, true);
142
+ }
143
+ }
144
+ };
145
+ const applyModelSelection = async (provider, model, reasoningEffort) => {
146
+ const { getProviderDefinition } = await import("./providers/index.js");
147
+ const { saveProviderDefaults, saveProviderPersistentAuth, withProviderStoredAuth, withProviderSessionAuth, loadConfig: reloadConfig, providerConfigFor } = await import("./config.js");
148
+ const def = getProviderDefinition(provider);
149
+ await store.updateModel(session, provider, model);
150
+ await saveProviderDefaults(provider, model, def.supportsReasoningEffort ? { reasoningEffort } : {});
151
+ session.provider = provider;
152
+ session.model = model;
153
+ const nextConfig = await reloadConfig();
154
+ const nextProfile = providerConfigFor(nextConfig, session.provider);
155
+ if (nextProfile.authSource === "missing" || nextProfile.authSource === "stored_hash") {
156
+ const authLabel = def.auth.inputLabel;
157
+ const keyVal = await requestTextInput(`Enter ${authLabel} for ${def.label} / ${model}`, "");
158
+ if (!keyVal.trim()) {
159
+ ui.warn(`Credential entry cancelled. Model settings saved, but no usable ${def.label} credential is active.`);
160
+ ui.sendReady(session);
161
+ ui.sendStatus("Ready");
162
+ return;
163
+ }
164
+ const retIdx = await requestSelect("Keep credential:", [
165
+ "Keep for all sessions until /logout",
166
+ "This session only",
167
+ "Cancel"
168
+ ]);
169
+ if (retIdx === 0) {
170
+ await saveProviderPersistentAuth(session.provider, def.auth.defaultMode, keyVal.trim());
171
+ config = withProviderStoredAuth(nextConfig, session.provider, def.auth.defaultMode, keyVal.trim());
172
+ }
173
+ else if (retIdx === 1) {
174
+ config = withProviderSessionAuth(nextConfig, session.provider, def.auth.defaultMode, keyVal.trim());
175
+ }
176
+ else {
177
+ ui.warn("API key setup cancelled.");
178
+ ui.sendReady(session);
179
+ ui.sendStatus("Ready");
180
+ return;
181
+ }
182
+ }
183
+ else {
184
+ config = nextConfig;
185
+ }
186
+ ui.info(`Provider set to ${def.label} / ${model}`);
187
+ ui.sendReady(session);
188
+ ui.sendStatus("Ready");
189
+ };
190
+ const handleCommand = async (commandLine) => {
191
+ const [command, ...args] = commandLine.slice(1).split(/\s+/);
192
+ switch (command) {
193
+ case "help":
194
+ ui.info([
195
+ "/help", "/model", "/undo", "/skill", "/tools",
196
+ "/history", "/resume <session-id>", "/new",
197
+ "/approve", "/config", "/logout", "/clear", "/exit"
198
+ ].join("\n"));
199
+ break;
200
+ case "clear":
201
+ ui.sendClear();
202
+ ui.sendStatus("Ready");
203
+ break;
204
+ case "history":
205
+ ui.info(session.messages
206
+ .slice(-20)
207
+ .map((msg) => {
208
+ const label = msg.role.padEnd(9, " ");
209
+ const content = (msg.content ?? "[tool call]").replace(/\s+/g, " ").slice(0, 140);
210
+ return `${label} ${content}`;
211
+ })
212
+ .join("\n") || "(empty session)");
213
+ break;
214
+ case "tools":
215
+ ui.info(createTools()
216
+ .list()
217
+ .map((tool) => `${tool.readOnly ? "ro" : "rw"} ${tool.name} - ${tool.description}`)
218
+ .join("\n"));
219
+ break;
220
+ case "config":
221
+ ui.printConfig(config);
222
+ break;
223
+ case "undo": {
224
+ const { undoLastEdit } = await import("./edit-history.js");
225
+ const approvals = new ApprovalManager(session, store, null, requestApprovalDecision);
226
+ const result = await undoLastEdit(session, store, (req) => approvals.requestApproval(req));
227
+ ui.info(result.content);
228
+ ui.sendStatus(result.isError ? "Undo blocked" : "Ready");
229
+ break;
230
+ }
231
+ case "skill":
232
+ case "skills": {
233
+ if (args.length === 0) {
234
+ const available = await skills.listSkills();
235
+ const pinned = new Set((await skills.pinnedSkills()).map((s) => s.name));
236
+ ui.info(available.length > 0
237
+ ? available.map((s) => `${pinned.has(s.name) ? "*" : "-"} ${s.name} - ${s.description}`).join("\n")
238
+ : "(no skills available)");
239
+ break;
240
+ }
241
+ const [sub, ...rest] = args;
242
+ if (sub === "use" || sub === "pin") {
243
+ if (!rest[0]) {
244
+ ui.warn("Usage: /skill use <name>");
245
+ break;
246
+ }
247
+ const skill = await skills.pinSkill(rest[0]);
248
+ ui.info(`Pinned skill: ${skill.name}`);
249
+ }
250
+ else if (sub === "drop" || sub === "unpin") {
251
+ if (!rest[0]) {
252
+ ui.warn("Usage: /skill drop <name>");
253
+ break;
254
+ }
255
+ const skill = await skills.unpinSkill(rest[0]);
256
+ ui.info(`Unpinned skill: ${skill.name}`);
257
+ }
258
+ else if (sub === "clear") {
259
+ const cleared = await skills.clearPinnedSkills();
260
+ ui.info(`Cleared ${cleared} pinned skills.`);
261
+ }
262
+ break;
263
+ }
264
+ case "resume": {
265
+ if (!args[0]) {
266
+ const sessions = await store.listSessions();
267
+ if (sessions.length === 0) {
268
+ ui.info("(no sessions)");
269
+ break;
270
+ }
271
+ const items = sessions.slice(0, 10).map(s => `${s.id.slice(0, 8)} ${s.provider}/${s.model} ${s.workspaceRoot}`);
272
+ const idx = await requestSelect("Select session to resume", [...items, "Cancel"]);
273
+ if (idx < sessions.length) {
274
+ const s = sessions[idx];
275
+ if (s) {
276
+ session = await store.loadSession(s.id);
277
+ activeAgent = null;
278
+ ui.sendClear();
279
+ ui.sendStatus(`Resumed ${session.id.slice(0, 8)}`);
280
+ ui.sendReady(session);
281
+ }
282
+ }
283
+ else {
284
+ ui.sendStatus("Ready");
285
+ }
286
+ break;
287
+ }
288
+ session = await store.loadSession(args[0]);
289
+ ui.sendClear();
290
+ ui.sendStatus(`Resumed ${session.id.slice(0, 8)}`);
291
+ ui.sendReady(session);
292
+ break;
293
+ }
294
+ case "new": {
295
+ session = await store.createSession(session.workspaceRoot, config.defaultProvider, config.defaultModel);
296
+ ui.sendClear();
297
+ ui.sendStatus(`Created ${session.id.slice(0, 8)}`);
298
+ ui.sendReady(session);
299
+ break;
300
+ }
301
+ case "approve":
302
+ ui.info([
303
+ `web access: ${session.approvals.webAccess ? "granted" : "not granted"}`,
304
+ `path grants: ${session.approvals.outOfTreeRoots.join(", ") || "(none)"}`,
305
+ `session grants: ${session.approvals.sessionActionKeys.join(", ") || "(none)"}`
306
+ ].join("\n"));
307
+ break;
308
+ case "logout": {
309
+ const { clearProviderSavedAuth } = await import("./config.js");
310
+ await clearProviderSavedAuth(session.provider);
311
+ ui.info(`Cleared saved credential for ${session.provider}.`);
312
+ ui.sendStatus("Logged out");
313
+ break;
314
+ }
315
+ case "model": {
316
+ const { listProviders, getProviderDefinition } = await import("./providers/index.js");
317
+ const providers = listProviders();
318
+ const items = [...providers.map((p) => p.name === session.provider ? `${p.label} (current)` : p.label), "Cancel"];
319
+ const pIdx = await requestSelect("Select provider", items);
320
+ if (pIdx >= providers.length || pIdx < 0) {
321
+ ui.sendStatus("Ready");
322
+ break;
323
+ }
324
+ const nextProvider = providers[pIdx].name;
325
+ const def = getProviderDefinition(nextProvider);
326
+ let nextModel = nextProvider === session.provider ? session.model : def.defaultModel;
327
+ if (nextProvider === "sarvam") {
328
+ const smodels = [...def.suggestedModels, "Cancel"];
329
+ const mIdx = await requestSelect("Select Sarvam model", smodels);
330
+ if (mIdx >= def.suggestedModels.length) {
331
+ ui.sendStatus("Ready");
332
+ break;
333
+ }
334
+ nextModel = def.suggestedModels[mIdx];
335
+ }
336
+ else if (nextProvider === "openrouter") {
337
+ const mName = await requestTextInput("Enter OpenRouter model id", nextModel);
338
+ if (!mName.trim()) {
339
+ ui.sendStatus("Ready");
340
+ break;
341
+ }
342
+ nextModel = mName.trim();
343
+ }
344
+ else {
345
+ const mName = await requestTextInput(`Enter model for ${def.label}`, nextModel);
346
+ if (!mName.trim()) {
347
+ ui.sendStatus("Ready");
348
+ break;
349
+ }
350
+ nextModel = mName.trim();
351
+ }
352
+ let nextReasoning = null;
353
+ if (def.supportsReasoningEffort) {
354
+ const rItems = ["None", "Low", "Medium", "High", "Cancel"];
355
+ const vals = [null, "low", "medium", "high", null];
356
+ const rIdx = await requestSelect("Select reasoning effort", rItems);
357
+ if (rIdx >= 4) {
358
+ ui.sendStatus("Ready");
359
+ break;
360
+ }
361
+ nextReasoning = vals[rIdx];
362
+ }
363
+ await applyModelSelection(nextProvider, nextModel, nextReasoning);
364
+ break;
365
+ }
366
+ default:
367
+ ui.warn(`Unknown command: /${command}`);
368
+ }
369
+ };
370
+ // Listen for JSON commands from the Haskell TUI
371
+ rl.on("line", async (line) => {
372
+ let cmd;
373
+ try {
374
+ cmd = JSON.parse(line);
375
+ }
376
+ catch {
377
+ return; // Skip malformed lines
378
+ }
379
+ switch (cmd.tag) {
380
+ case "input":
381
+ if (cmd.data?.text && typeof cmd.data.text === "string") {
382
+ await runPrompt(cmd.data.text);
383
+ }
384
+ break;
385
+ case "trust":
386
+ // Trust acknowledged, nothing to do on backend side
387
+ break;
388
+ case "approval":
389
+ if (pendingApprovalResolve && cmd.data?.scope) {
390
+ const scope = cmd.data.scope;
391
+ const resolve = pendingApprovalResolve;
392
+ pendingApprovalResolve = null;
393
+ resolve(scope);
394
+ }
395
+ break;
396
+ case "submitSelect":
397
+ if (cmd.data?.id && typeof cmd.data.index === "number") {
398
+ const id = cmd.data.id;
399
+ const resolve = pendingSelects.get(id);
400
+ if (resolve) {
401
+ pendingSelects.delete(id);
402
+ resolve(cmd.data.index);
403
+ }
404
+ }
405
+ break;
406
+ case "submitInput":
407
+ if (cmd.data?.id && typeof cmd.data.value === "string") {
408
+ const id = cmd.data.id;
409
+ const resolve = pendingInputs.get(id);
410
+ if (resolve) {
411
+ pendingInputs.delete(id);
412
+ resolve(cmd.data.value);
413
+ }
414
+ }
415
+ break;
416
+ case "interrupt":
417
+ activeAgent?.requestStop();
418
+ break;
419
+ case "exit":
420
+ process.exit(0);
421
+ }
422
+ });
423
+ rl.on("close", () => {
424
+ process.exit(0);
425
+ });
426
+ }
427
+ main().catch((error) => {
428
+ process.stderr.write(`IPC backend error: ${error}\n`);
429
+ process.exit(1);
430
+ });
431
+ //# sourceMappingURL=ipc-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-backend.js","sourceRoot":"","sources":["../../src/ipc-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { TerminalUI } from "./terminal-ui.js";
2
+ import type { EffectiveConfig, RuntimeHostProfile, SessionState, ToolCall } from "./types.js";
3
+ import type { Ora } from "ora";
4
+ export declare class IpcTerminalUI extends TerminalUI {
5
+ constructor(runtimeProfile: RuntimeHostProfile);
6
+ /** Send the initial dashboard / ready message */
7
+ sendReady(session: SessionState): void;
8
+ printBanner(): void;
9
+ printStartup(_session: SessionState): void;
10
+ printTrustPrompt(workspaceRoot: string): void;
11
+ promptLabel(): string;
12
+ info(message: string): void;
13
+ activity(message: string): void;
14
+ warn(message: string): void;
15
+ error(message: string): void;
16
+ startSpinner(label: string): Ora;
17
+ appendAssistantText(text: string): void;
18
+ printAssistantMessage(message: string): void;
19
+ endAssistantTurn(): void;
20
+ printToolCall(toolCall: ToolCall): void;
21
+ printToolResult(summary: string, isError: boolean): void;
22
+ printConfig(config: EffectiveConfig): void;
23
+ sendApprovalPrompt(label: string): void;
24
+ sendPromptSelect(id: string, title: string, options: string[]): void;
25
+ sendPromptInput(id: string, title: string, placeholder: string): void;
26
+ sendStatus(text: string): void;
27
+ sendClear(): void;
28
+ }
@@ -0,0 +1,125 @@
1
+ import { TerminalUI } from "./terminal-ui.js";
2
+ import { formatRuntimeHostSummary, formatRuntimeTerminalSummary } from "./runtime-profile.js";
3
+ function sendIPC(tag, data = {}) {
4
+ const msg = JSON.stringify({ tag, data });
5
+ process.stdout.write(msg + "\n");
6
+ }
7
+ export class IpcTerminalUI extends TerminalUI {
8
+ constructor(runtimeProfile) {
9
+ super(runtimeProfile);
10
+ }
11
+ /** Send the initial dashboard / ready message */
12
+ sendReady(session) {
13
+ sendIPC("ready", {
14
+ provider: session.provider,
15
+ model: session.model,
16
+ workspace: session.workspaceRoot,
17
+ sessionId: session.id,
18
+ updatedAt: session.updatedAt
19
+ });
20
+ }
21
+ printBanner() { }
22
+ printStartup(_session) { }
23
+ printTrustPrompt(workspaceRoot) {
24
+ sendIPC("prompt", { promptType: "trust", workspace: workspaceRoot });
25
+ }
26
+ promptLabel() {
27
+ return "";
28
+ }
29
+ info(message) {
30
+ sendIPC("entry", { kind: "info", text: message });
31
+ }
32
+ activity(message) {
33
+ sendIPC("activity", { label: message });
34
+ }
35
+ warn(message) {
36
+ sendIPC("entry", { kind: "warn", text: message });
37
+ }
38
+ error(message) {
39
+ sendIPC("entry", { kind: "error", text: message });
40
+ }
41
+ startSpinner(label) {
42
+ sendIPC("spinner", { label, active: true });
43
+ let spinning = true;
44
+ const fakeSpinner = {
45
+ get isSpinning() {
46
+ return spinning;
47
+ },
48
+ stop() {
49
+ spinning = false;
50
+ sendIPC("spinner", { label: null, active: false });
51
+ return fakeSpinner;
52
+ }
53
+ };
54
+ return fakeSpinner;
55
+ }
56
+ appendAssistantText(text) {
57
+ sendIPC("chunk", { text });
58
+ }
59
+ printAssistantMessage(message) {
60
+ // Flush any streaming buffer first, then push a complete entry
61
+ sendIPC("flush", {});
62
+ sendIPC("entry", { kind: "assistant", text: message });
63
+ }
64
+ endAssistantTurn() {
65
+ sendIPC("flush", {});
66
+ }
67
+ printToolCall(toolCall) {
68
+ let renderedArgs = "{}";
69
+ try {
70
+ const parsed = JSON.parse(toolCall.function.arguments);
71
+ if (Object.keys(parsed).length > 0) {
72
+ renderedArgs = JSON.stringify(parsed, null, 2);
73
+ }
74
+ }
75
+ catch {
76
+ renderedArgs = toolCall.function.arguments.trim() || "{}";
77
+ }
78
+ sendIPC("flush", {});
79
+ sendIPC("entry", {
80
+ kind: "tool",
81
+ text: `⬢ ${toolCall.function.name}\n${renderedArgs}`
82
+ });
83
+ }
84
+ printToolResult(summary, isError) {
85
+ sendIPC("flush", {});
86
+ sendIPC("entry", {
87
+ kind: isError ? "error" : "tool",
88
+ text: `↳ ${summary}`
89
+ });
90
+ }
91
+ printConfig(config) {
92
+ sendIPC("entry", {
93
+ kind: "info",
94
+ text: [
95
+ `config: ${config.configPath}`,
96
+ `data: ${config.dataPath}`,
97
+ `provider: ${config.defaultProvider}`,
98
+ `auth: ${config.authMode} (${config.authSource})`,
99
+ `sha256: ${config.authFingerprint?.slice(0, 12) ?? "(none)"}`,
100
+ `model: ${config.defaultModel}`,
101
+ `reason: ${config.reasoningEffort ?? "(none)"}`,
102
+ `search: ${config.searchProviderName}`,
103
+ `base: ${config.baseUrl}`,
104
+ `host: ${formatRuntimeHostSummary(this.runtimeProfile)}`,
105
+ `term: ${formatRuntimeTerminalSummary(this.runtimeProfile)}`
106
+ ].join("\n")
107
+ });
108
+ }
109
+ sendApprovalPrompt(label) {
110
+ sendIPC("prompt", { promptType: "approval", label });
111
+ }
112
+ sendPromptSelect(id, title, options) {
113
+ sendIPC("prompt", { promptType: "select", id, title, options });
114
+ }
115
+ sendPromptInput(id, title, placeholder) {
116
+ sendIPC("prompt", { promptType: "input", id, title, placeholder });
117
+ }
118
+ sendStatus(text) {
119
+ sendIPC("status", { text });
120
+ }
121
+ sendClear() {
122
+ sendIPC("clear", {});
123
+ }
124
+ }
125
+ //# sourceMappingURL=ipc-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-ui.js","sourceRoot":"","sources":["../../src/ipc-ui.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export interface CommandOutput {
8
8
  interface BaseOptions {
9
9
  cwd: string;
10
10
  timeoutMs?: number;
11
+ noPty?: boolean;
11
12
  }
12
13
  export declare function runExecFile(file: string, args: string[], options: BaseOptions): Promise<CommandOutput>;
13
14
  export declare function runShellCommand(command: string, options: BaseOptions): Promise<CommandOutput>;