@leing2021/super-pi 0.22.1 → 0.23.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/README.md +66 -293
- package/extensions/ce-core/index.ts +276 -48
- package/extensions/ce-core/tools/parallel-subagent.ts +3 -3
- package/extensions/ce-core/tools/subagent.ts +2 -2
- package/package.json +4 -20
- package/rules/common/naming.md +154 -0
- package/skills/01-brainstorm/SKILL.md +42 -79
- package/skills/01-brainstorm/references/ce-brainstorm-mode.md +47 -0
- package/skills/02-plan/SKILL.md +43 -61
- package/skills/02-plan/references/solution-search.md +46 -0
- package/skills/03-work/SKILL.md +34 -52
- package/skills/03-work/references/completion-report.md +51 -0
- package/skills/04-review/SKILL.md +44 -51
- package/skills/04-review/references/solution-search.md +46 -0
- package/skills/06-next/SKILL.md +35 -20
- package/skills/06-next/references/recommendation-logic.md +47 -2
- package/skills/07-worktree/SKILL.md +21 -20
- package/skills/08-help/SKILL.md +46 -0
- package/skills/08-help/references/workflow-sequence.md +135 -0
- package/skills/references/language-detection.md +44 -0
- package/LICENSE +0 -21
- package/THIRD-PARTY-NOTICES.md +0 -35
- package/extensions/subagent/__tests__/async-job-tracker.test.ts +0 -21
- package/extensions/subagent/__tests__/execution-activity.test.ts +0 -15
- package/extensions/subagent/__tests__/parallel-render-stress.test.ts +0 -82
- package/extensions/subagent/__tests__/render-dedup.test.ts +0 -98
- package/extensions/subagent/__tests__/render-widget.test.ts +0 -28
- package/extensions/subagent/__tests__/throttle.test.ts +0 -90
- package/extensions/subagent/agent-management.ts +0 -596
- package/extensions/subagent/agent-manager-chain-detail.ts +0 -163
- package/extensions/subagent/agent-manager-detail.ts +0 -232
- package/extensions/subagent/agent-manager-edit.ts +0 -391
- package/extensions/subagent/agent-manager-list.ts +0 -279
- package/extensions/subagent/agent-manager-parallel.ts +0 -305
- package/extensions/subagent/agent-manager.ts +0 -706
- package/extensions/subagent/agent-scope.ts +0 -9
- package/extensions/subagent/agent-selection.ts +0 -26
- package/extensions/subagent/agent-serializer.ts +0 -124
- package/extensions/subagent/agent-templates.ts +0 -63
- package/extensions/subagent/agents/context-builder.md +0 -37
- package/extensions/subagent/agents/delegate.md +0 -9
- package/extensions/subagent/agents/oracle.md +0 -73
- package/extensions/subagent/agents/planner.md +0 -52
- package/extensions/subagent/agents/researcher.md +0 -50
- package/extensions/subagent/agents/reviewer.md +0 -38
- package/extensions/subagent/agents/scout.md +0 -48
- package/extensions/subagent/agents/worker.md +0 -52
- package/extensions/subagent/agents.ts +0 -762
- package/extensions/subagent/artifacts.ts +0 -101
- package/extensions/subagent/async-execution.ts +0 -521
- package/extensions/subagent/async-job-tracker.ts +0 -240
- package/extensions/subagent/async-status.ts +0 -242
- package/extensions/subagent/chain-clarify.ts +0 -1365
- package/extensions/subagent/chain-execution.ts +0 -854
- package/extensions/subagent/chain-serializer.ts +0 -127
- package/extensions/subagent/completion-dedupe.ts +0 -66
- package/extensions/subagent/doctor.ts +0 -201
- package/extensions/subagent/execution.ts +0 -748
- package/extensions/subagent/file-coalescer.ts +0 -43
- package/extensions/subagent/fork-context.ts +0 -64
- package/extensions/subagent/formatters.ts +0 -123
- package/extensions/subagent/frontmatter.ts +0 -32
- package/extensions/subagent/index.ts +0 -586
- package/extensions/subagent/intercom-bridge.ts +0 -241
- package/extensions/subagent/jsonl-writer.ts +0 -84
- package/extensions/subagent/model-fallback.ts +0 -109
- package/extensions/subagent/notify.ts +0 -111
- package/extensions/subagent/parallel-utils.ts +0 -109
- package/extensions/subagent/pi-args.ts +0 -139
- package/extensions/subagent/pi-spawn.ts +0 -101
- package/extensions/subagent/post-exit-stdio-guard.ts +0 -88
- package/extensions/subagent/prompt-template-bridge.ts +0 -400
- package/extensions/subagent/prompts/gather-context-and-clarify.md +0 -13
- package/extensions/subagent/prompts/parallel-cleanup.md +0 -42
- package/extensions/subagent/prompts/parallel-research.md +0 -50
- package/extensions/subagent/prompts/parallel-review.md +0 -40
- package/extensions/subagent/render-helpers.ts +0 -83
- package/extensions/subagent/render.ts +0 -908
- package/extensions/subagent/result-intercom.ts +0 -238
- package/extensions/subagent/result-watcher.ts +0 -172
- package/extensions/subagent/run-history.ts +0 -58
- package/extensions/subagent/run-status.ts +0 -137
- package/extensions/subagent/schemas.ts +0 -165
- package/extensions/subagent/session-tokens.ts +0 -51
- package/extensions/subagent/settings.ts +0 -368
- package/extensions/subagent/single-output.ts +0 -98
- package/extensions/subagent/skills.ts +0 -627
- package/extensions/subagent/slash-bridge.ts +0 -177
- package/extensions/subagent/slash-commands.ts +0 -304
- package/extensions/subagent/slash-live-state.ts +0 -295
- package/extensions/subagent/subagent-control.ts +0 -151
- package/extensions/subagent/subagent-executor.ts +0 -1915
- package/extensions/subagent/subagent-prompt-runtime.ts +0 -76
- package/extensions/subagent/subagent-runner.ts +0 -1471
- package/extensions/subagent/subagents-status.ts +0 -473
- package/extensions/subagent/text-editor.ts +0 -273
- package/extensions/subagent/throttle.ts +0 -77
- package/extensions/subagent/top-level-async.ts +0 -16
- package/extensions/subagent/types.ts +0 -624
- package/extensions/subagent/utils.ts +0 -457
- package/extensions/subagent/worktree.ts +0 -580
- package/extensions/super-pi-extension/agents/ce-oracle.md +0 -109
- package/extensions/super-pi-extension/agents/ce-planner.md +0 -116
- package/extensions/super-pi-extension/agents/ce-reviewer.md +0 -99
- package/extensions/super-pi-extension/agents/ce-scout.md +0 -80
- package/extensions/super-pi-extension/agents/ce-worker.md +0 -78
- package/extensions/super-pi-extension/chains/ce-parallel-review.chain.md +0 -34
- package/extensions/super-pi-extension/chains/ce-review-only.chain.md +0 -12
- package/extensions/super-pi-extension/chains/ce-standard.chain.md +0 -28
- package/extensions/super-pi-extension/index.ts +0 -129
- package/extensions/super-pi-extension/model-sync.ts +0 -204
- package/skills/08-status/SKILL.md +0 -41
- package/skills/08-status/references/artifact-locations.md +0 -10
- package/skills/09-help/SKILL.md +0 -37
- package/skills/09-help/references/workflow-sequence.md +0 -9
- package/skills/10-rules/SKILL.md +0 -76
- package/skills/pi-subagents/SKILL.md +0 -566
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2025 Nico Bailon
|
|
2
|
-
// SPDX-License-Identifier: MIT
|
|
3
|
-
// Source: https://github.com/nicobailon/pi-subagents
|
|
4
|
-
import * as fs from "node:fs";
|
|
5
|
-
import * as os from "node:os";
|
|
6
|
-
import * as path from "node:path";
|
|
7
|
-
import { fileURLToPath } from "node:url";
|
|
8
|
-
|
|
9
|
-
const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
10
|
-
const TASK_ARG_LIMIT = 8000;
|
|
11
|
-
const PROMPT_RUNTIME_EXTENSION_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-prompt-runtime.ts");
|
|
12
|
-
|
|
13
|
-
export interface BuildPiArgsInput {
|
|
14
|
-
baseArgs: string[];
|
|
15
|
-
task: string;
|
|
16
|
-
sessionEnabled: boolean;
|
|
17
|
-
sessionDir?: string;
|
|
18
|
-
sessionFile?: string;
|
|
19
|
-
model?: string;
|
|
20
|
-
thinking?: string;
|
|
21
|
-
systemPromptMode?: "append" | "replace";
|
|
22
|
-
inheritProjectContext: boolean;
|
|
23
|
-
inheritSkills: boolean;
|
|
24
|
-
tools?: string[];
|
|
25
|
-
extensions?: string[];
|
|
26
|
-
systemPrompt?: string | null;
|
|
27
|
-
mcpDirectTools?: string[];
|
|
28
|
-
promptFileStem?: string;
|
|
29
|
-
intercomSessionName?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface BuildPiArgsResult {
|
|
33
|
-
args: string[];
|
|
34
|
-
env: Record<string, string | undefined>;
|
|
35
|
-
tempDir?: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function applyThinkingSuffix(model: string | undefined, thinking: string | undefined): string | undefined {
|
|
39
|
-
if (!model || !thinking || thinking === "off") return model;
|
|
40
|
-
const colonIdx = model.lastIndexOf(":");
|
|
41
|
-
if (colonIdx !== -1 && THINKING_LEVELS.includes(model.substring(colonIdx + 1))) return model;
|
|
42
|
-
return `${model}:${thinking}`;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
|
|
46
|
-
const args = [...input.baseArgs];
|
|
47
|
-
|
|
48
|
-
if (input.sessionFile) {
|
|
49
|
-
fs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });
|
|
50
|
-
args.push("--session", input.sessionFile);
|
|
51
|
-
} else {
|
|
52
|
-
if (!input.sessionEnabled) {
|
|
53
|
-
args.push("--no-session");
|
|
54
|
-
}
|
|
55
|
-
if (input.sessionDir) {
|
|
56
|
-
fs.mkdirSync(input.sessionDir, { recursive: true });
|
|
57
|
-
args.push("--session-dir", input.sessionDir);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const modelArg = applyThinkingSuffix(input.model, input.thinking);
|
|
62
|
-
if (modelArg) {
|
|
63
|
-
args.push("--model", modelArg);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const toolExtensionPaths: string[] = [];
|
|
67
|
-
if (input.tools?.length) {
|
|
68
|
-
const builtinTools: string[] = [];
|
|
69
|
-
for (const tool of input.tools) {
|
|
70
|
-
if (tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js")) {
|
|
71
|
-
toolExtensionPaths.push(tool);
|
|
72
|
-
} else {
|
|
73
|
-
builtinTools.push(tool);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (builtinTools.length > 0) {
|
|
77
|
-
args.push("--tools", builtinTools.join(","));
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const runtimeExtensions = [PROMPT_RUNTIME_EXTENSION_PATH];
|
|
82
|
-
if (input.extensions !== undefined) {
|
|
83
|
-
args.push("--no-extensions");
|
|
84
|
-
for (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions])]) {
|
|
85
|
-
args.push("--extension", extPath);
|
|
86
|
-
}
|
|
87
|
-
} else {
|
|
88
|
-
for (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths])]) {
|
|
89
|
-
args.push("--extension", extPath);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (!input.inheritSkills) {
|
|
94
|
-
args.push("--no-skills");
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
let tempDir: string | undefined;
|
|
98
|
-
if (input.systemPrompt !== undefined && input.systemPrompt !== null) {
|
|
99
|
-
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagent-"));
|
|
100
|
-
const stem = (input.promptFileStem ?? "prompt").replace(/[^\w.-]/g, "_");
|
|
101
|
-
const promptPath = path.join(tempDir, `${stem}.md`);
|
|
102
|
-
fs.writeFileSync(promptPath, input.systemPrompt, { mode: 0o600 });
|
|
103
|
-
args.push(input.systemPromptMode === "replace" ? "--system-prompt" : "--append-system-prompt", promptPath);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (input.task.length > TASK_ARG_LIMIT) {
|
|
107
|
-
if (!tempDir) {
|
|
108
|
-
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagent-"));
|
|
109
|
-
}
|
|
110
|
-
const taskFilePath = path.join(tempDir, "task.md");
|
|
111
|
-
fs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 0o600 });
|
|
112
|
-
args.push(`@${taskFilePath}`);
|
|
113
|
-
} else {
|
|
114
|
-
args.push(`Task: ${input.task}`);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const env: Record<string, string | undefined> = {};
|
|
118
|
-
env.PI_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? "1" : "0";
|
|
119
|
-
env.PI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? "1" : "0";
|
|
120
|
-
if (input.intercomSessionName) {
|
|
121
|
-
env.PI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;
|
|
122
|
-
}
|
|
123
|
-
if (input.mcpDirectTools?.length) {
|
|
124
|
-
env.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(",");
|
|
125
|
-
} else {
|
|
126
|
-
env.MCP_DIRECT_TOOLS = "__none__";
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return { args, env, tempDir };
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export function cleanupTempDir(tempDir: string | null | undefined): void {
|
|
133
|
-
if (!tempDir) return;
|
|
134
|
-
try {
|
|
135
|
-
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
136
|
-
} catch {
|
|
137
|
-
// Temp cleanup is best effort.
|
|
138
|
-
}
|
|
139
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2025 Nico Bailon
|
|
2
|
-
// SPDX-License-Identifier: MIT
|
|
3
|
-
// Source: https://github.com/nicobailon/pi-subagents
|
|
4
|
-
import * as fs from "node:fs";
|
|
5
|
-
import { createRequire } from "node:module";
|
|
6
|
-
import * as path from "node:path";
|
|
7
|
-
|
|
8
|
-
const require = createRequire(import.meta.url);
|
|
9
|
-
|
|
10
|
-
export function resolvePiPackageRoot(): string | undefined {
|
|
11
|
-
try {
|
|
12
|
-
const entry = process.argv[1];
|
|
13
|
-
if (!entry) return undefined;
|
|
14
|
-
let dir = path.dirname(fs.realpathSync(entry));
|
|
15
|
-
while (dir !== path.dirname(dir)) {
|
|
16
|
-
try {
|
|
17
|
-
const pkg = JSON.parse(fs.readFileSync(path.join(dir, "package.json"), "utf-8"));
|
|
18
|
-
if (pkg.name === "@mariozechner/pi-coding-agent") return dir;
|
|
19
|
-
} catch {}
|
|
20
|
-
dir = path.dirname(dir);
|
|
21
|
-
}
|
|
22
|
-
} catch {}
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface PiSpawnDeps {
|
|
27
|
-
platform?: NodeJS.Platform;
|
|
28
|
-
execPath?: string;
|
|
29
|
-
argv1?: string;
|
|
30
|
-
existsSync?: (filePath: string) => boolean;
|
|
31
|
-
readFileSync?: (filePath: string, encoding: "utf-8") => string;
|
|
32
|
-
resolvePackageJson?: () => string;
|
|
33
|
-
piPackageRoot?: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface PiSpawnCommand {
|
|
37
|
-
command: string;
|
|
38
|
-
args: string[];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function isRunnableNodeScript(filePath: string, existsSync: (filePath: string) => boolean): boolean {
|
|
42
|
-
if (!existsSync(filePath)) return false;
|
|
43
|
-
return /\.(?:mjs|cjs|js)$/i.test(filePath);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function normalizePath(filePath: string): string {
|
|
47
|
-
return path.isAbsolute(filePath) ? filePath : path.resolve(filePath);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function resolveWindowsPiCliScript(deps: PiSpawnDeps = {}): string | undefined {
|
|
51
|
-
const existsSync = deps.existsSync ?? fs.existsSync;
|
|
52
|
-
const readFileSync = deps.readFileSync ?? ((filePath, encoding) => fs.readFileSync(filePath, encoding));
|
|
53
|
-
const argv1 = deps.argv1 ?? process.argv[1];
|
|
54
|
-
|
|
55
|
-
if (argv1) {
|
|
56
|
-
const argvPath = normalizePath(argv1);
|
|
57
|
-
if (isRunnableNodeScript(argvPath, existsSync)) {
|
|
58
|
-
return argvPath;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
const resolvePackageJson = deps.resolvePackageJson ?? (() => {
|
|
64
|
-
const root = deps.piPackageRoot ?? resolvePiPackageRoot();
|
|
65
|
-
if (root) return path.join(root, "package.json");
|
|
66
|
-
return require.resolve("@mariozechner/pi-coding-agent/package.json");
|
|
67
|
-
});
|
|
68
|
-
const packageJsonPath = resolvePackageJson();
|
|
69
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")) as {
|
|
70
|
-
bin?: string | Record<string, string>;
|
|
71
|
-
};
|
|
72
|
-
const binField = packageJson.bin;
|
|
73
|
-
const binPath = typeof binField === "string"
|
|
74
|
-
? binField
|
|
75
|
-
: binField?.pi ?? Object.values(binField ?? {})[0];
|
|
76
|
-
if (!binPath) return undefined;
|
|
77
|
-
const candidate = normalizePath(path.resolve(path.dirname(packageJsonPath), binPath));
|
|
78
|
-
if (isRunnableNodeScript(candidate, existsSync)) {
|
|
79
|
-
return candidate;
|
|
80
|
-
}
|
|
81
|
-
} catch {
|
|
82
|
-
return undefined;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return undefined;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function getPiSpawnCommand(args: string[], deps: PiSpawnDeps = {}): PiSpawnCommand {
|
|
89
|
-
const platform = deps.platform ?? process.platform;
|
|
90
|
-
if (platform === "win32") {
|
|
91
|
-
const piCliPath = resolveWindowsPiCliScript(deps);
|
|
92
|
-
if (piCliPath) {
|
|
93
|
-
return {
|
|
94
|
-
command: deps.execPath ?? process.execPath,
|
|
95
|
-
args: [piCliPath, ...args],
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return { command: "pi", args };
|
|
101
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2025 Nico Bailon
|
|
2
|
-
// SPDX-License-Identifier: MIT
|
|
3
|
-
// Source: https://github.com/nicobailon/pi-subagents
|
|
4
|
-
import type { ChildProcess } from "node:child_process";
|
|
5
|
-
|
|
6
|
-
interface PostExitStdioGuardOptions {
|
|
7
|
-
idleMs: number;
|
|
8
|
-
hardMs: number;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
interface ChildWithPipedStdio {
|
|
12
|
-
stdout: ChildProcess["stdout"];
|
|
13
|
-
stderr: ChildProcess["stderr"];
|
|
14
|
-
on: ChildProcess["on"];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface ChildWithKill {
|
|
18
|
-
kill(signal?: NodeJS.Signals | number): boolean;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function trySignalChild(child: ChildWithKill, signal: NodeJS.Signals): boolean {
|
|
22
|
-
try {
|
|
23
|
-
return child.kill(signal);
|
|
24
|
-
} catch {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function attachPostExitStdioGuard(
|
|
30
|
-
child: ChildWithPipedStdio,
|
|
31
|
-
options: PostExitStdioGuardOptions,
|
|
32
|
-
): () => void {
|
|
33
|
-
const { idleMs, hardMs } = options;
|
|
34
|
-
let exited = false;
|
|
35
|
-
let stdoutEnded = false;
|
|
36
|
-
let stderrEnded = false;
|
|
37
|
-
let idleTimer: NodeJS.Timeout | undefined;
|
|
38
|
-
let hardTimer: NodeJS.Timeout | undefined;
|
|
39
|
-
|
|
40
|
-
const destroyUnendedStdio = () => {
|
|
41
|
-
if (!stdoutEnded) {
|
|
42
|
-
try { child.stdout?.destroy(); } catch {}
|
|
43
|
-
}
|
|
44
|
-
if (!stderrEnded) {
|
|
45
|
-
try { child.stderr?.destroy(); } catch {}
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const clearTimers = () => {
|
|
50
|
-
if (idleTimer) {
|
|
51
|
-
clearTimeout(idleTimer);
|
|
52
|
-
idleTimer = undefined;
|
|
53
|
-
}
|
|
54
|
-
if (hardTimer) {
|
|
55
|
-
clearTimeout(hardTimer);
|
|
56
|
-
hardTimer = undefined;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const armIdleTimer = () => {
|
|
61
|
-
if (!exited) return;
|
|
62
|
-
if (idleTimer) clearTimeout(idleTimer);
|
|
63
|
-
idleTimer = setTimeout(destroyUnendedStdio, idleMs);
|
|
64
|
-
idleTimer.unref?.();
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
child.stdout?.on("data", armIdleTimer);
|
|
68
|
-
child.stderr?.on("data", armIdleTimer);
|
|
69
|
-
child.stdout?.on("end", () => {
|
|
70
|
-
stdoutEnded = true;
|
|
71
|
-
if (stdoutEnded && stderrEnded) clearTimers();
|
|
72
|
-
});
|
|
73
|
-
child.stderr?.on("end", () => {
|
|
74
|
-
stderrEnded = true;
|
|
75
|
-
if (stdoutEnded && stderrEnded) clearTimers();
|
|
76
|
-
});
|
|
77
|
-
child.on("exit", () => {
|
|
78
|
-
exited = true;
|
|
79
|
-
armIdleTimer();
|
|
80
|
-
if (hardTimer) return;
|
|
81
|
-
hardTimer = setTimeout(destroyUnendedStdio, hardMs);
|
|
82
|
-
hardTimer.unref?.();
|
|
83
|
-
});
|
|
84
|
-
child.on("close", clearTimers);
|
|
85
|
-
child.on("error", clearTimers);
|
|
86
|
-
|
|
87
|
-
return clearTimers;
|
|
88
|
-
}
|