toc-ocra 0.2.0
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/LICENSE +21 -0
- package/README.md +70 -0
- package/assets/icon.svg +1 -0
- package/dist/plugin/renderer.css +2 -0
- package/dist/plugin/renderer.css.map +7 -0
- package/dist/plugin/renderer.js +2 -0
- package/dist/plugin/renderer.js.map +7 -0
- package/dist/src/config.d.ts +66 -0
- package/dist/src/config.js +173 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/control/pairing.d.ts +44 -0
- package/dist/src/control/pairing.js +99 -0
- package/dist/src/control/pairing.js.map +1 -0
- package/dist/src/exec/script-runner.d.ts +9 -0
- package/dist/src/exec/script-runner.js +110 -0
- package/dist/src/exec/script-runner.js.map +1 -0
- package/dist/src/health/server.d.ts +74 -0
- package/dist/src/health/server.js +248 -0
- package/dist/src/health/server.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +173 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logging/diagnostic-log.d.ts +16 -0
- package/dist/src/logging/diagnostic-log.js +128 -0
- package/dist/src/logging/diagnostic-log.js.map +1 -0
- package/dist/src/providers/cli/claude.d.ts +2 -0
- package/dist/src/providers/cli/claude.js +48 -0
- package/dist/src/providers/cli/claude.js.map +1 -0
- package/dist/src/providers/cli/codex.d.ts +2 -0
- package/dist/src/providers/cli/codex.js +67 -0
- package/dist/src/providers/cli/codex.js.map +1 -0
- package/dist/src/providers/cli/gemini.d.ts +2 -0
- package/dist/src/providers/cli/gemini.js +30 -0
- package/dist/src/providers/cli/gemini.js.map +1 -0
- package/dist/src/providers/cli/grok.d.ts +2 -0
- package/dist/src/providers/cli/grok.js +29 -0
- package/dist/src/providers/cli/grok.js.map +1 -0
- package/dist/src/providers/cli/opencode.d.ts +2 -0
- package/dist/src/providers/cli/opencode.js +29 -0
- package/dist/src/providers/cli/opencode.js.map +1 -0
- package/dist/src/providers/detection.d.ts +11 -0
- package/dist/src/providers/detection.js +96 -0
- package/dist/src/providers/detection.js.map +1 -0
- package/dist/src/providers/model-catalog-collector.d.ts +22 -0
- package/dist/src/providers/model-catalog-collector.js +66 -0
- package/dist/src/providers/model-catalog-collector.js.map +1 -0
- package/dist/src/providers/model-catalog.d.ts +45 -0
- package/dist/src/providers/model-catalog.js +382 -0
- package/dist/src/providers/model-catalog.js.map +1 -0
- package/dist/src/providers/provider.d.ts +49 -0
- package/dist/src/providers/provider.js +63 -0
- package/dist/src/providers/provider.js.map +1 -0
- package/dist/src/providers/registry.d.ts +31 -0
- package/dist/src/providers/registry.js +60 -0
- package/dist/src/providers/registry.js.map +1 -0
- package/dist/src/runs/orphan-registry.d.ts +24 -0
- package/dist/src/runs/orphan-registry.js +63 -0
- package/dist/src/runs/orphan-registry.js.map +1 -0
- package/dist/src/runs/process-tree.d.ts +21 -0
- package/dist/src/runs/process-tree.js +95 -0
- package/dist/src/runs/process-tree.js.map +1 -0
- package/dist/src/runs/run-supervisor.d.ts +63 -0
- package/dist/src/runs/run-supervisor.js +285 -0
- package/dist/src/runs/run-supervisor.js.map +1 -0
- package/dist/src/runtime/agent-runtime.d.ts +68 -0
- package/dist/src/runtime/agent-runtime.js +340 -0
- package/dist/src/runtime/agent-runtime.js.map +1 -0
- package/dist/src/runtime/agent-service.d.ts +33 -0
- package/dist/src/runtime/agent-service.js +181 -0
- package/dist/src/runtime/agent-service.js.map +1 -0
- package/dist/src/runtime/cli/hydrate-shell-path.d.ts +33 -0
- package/dist/src/runtime/cli/hydrate-shell-path.js +173 -0
- package/dist/src/runtime/cli/hydrate-shell-path.js.map +1 -0
- package/dist/src/session/terminal-line-sanitizer.d.ts +7 -0
- package/dist/src/session/terminal-line-sanitizer.js +21 -0
- package/dist/src/session/terminal-line-sanitizer.js.map +1 -0
- package/dist/src/session/terminal-tail-buffer.d.ts +70 -0
- package/dist/src/session/terminal-tail-buffer.js +149 -0
- package/dist/src/session/terminal-tail-buffer.js.map +1 -0
- package/dist/src/shared/cli-detection-types.d.ts +19 -0
- package/dist/src/shared/cli-detection-types.js +2 -0
- package/dist/src/shared/cli-detection-types.js.map +1 -0
- package/dist/src/shared/node-cli-command-resolution.d.ts +19 -0
- package/dist/src/shared/node-cli-command-resolution.js +173 -0
- package/dist/src/shared/node-cli-command-resolution.js.map +1 -0
- package/dist/src/transport/gateway-client.d.ts +38 -0
- package/dist/src/transport/gateway-client.js +73 -0
- package/dist/src/transport/gateway-client.js.map +1 -0
- package/dist/src/types/protocol.d.ts +172 -0
- package/dist/src/types/protocol.js +55 -0
- package/dist/src/types/protocol.js.map +1 -0
- package/dist/src/workspace/directory-browser.d.ts +17 -0
- package/dist/src/workspace/directory-browser.js +47 -0
- package/dist/src/workspace/directory-browser.js.map +1 -0
- package/dist/src/workspace/workspace-manager.d.ts +41 -0
- package/dist/src/workspace/workspace-manager.js +436 -0
- package/dist/src/workspace/workspace-manager.js.map +1 -0
- package/locales/en.json +66 -0
- package/locales/zh-CN.json +66 -0
- package/package.json +90 -0
- package/scripts/service.mjs +174 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../../src/providers/model-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One coding CLI, run headless: one process per turn, prompt on the command
|
|
3
|
+
* line, machine-readable events on stdout. Process exit is the end of the
|
|
4
|
+
* turn; the parser only adds the native session id, the final answer and a
|
|
5
|
+
* readable transcript for the output tail.
|
|
6
|
+
*
|
|
7
|
+
* Adding a CLI = one file implementing this interface + one entry in
|
|
8
|
+
* registry.ts.
|
|
9
|
+
*/
|
|
10
|
+
export type HeadlessRunRequest = {
|
|
11
|
+
prompt: string;
|
|
12
|
+
/** Native session to continue; empty starts a new one. */
|
|
13
|
+
sessionId: string;
|
|
14
|
+
model: string;
|
|
15
|
+
reasoningEffort: string;
|
|
16
|
+
workdir: string;
|
|
17
|
+
};
|
|
18
|
+
export type LaunchSpec = {
|
|
19
|
+
executable: string;
|
|
20
|
+
args: string[];
|
|
21
|
+
env: NodeJS.ProcessEnv;
|
|
22
|
+
};
|
|
23
|
+
export type ParsedLine = {
|
|
24
|
+
sessionId?: string;
|
|
25
|
+
/** Latest assistant answer; the last one seen becomes the final message. */
|
|
26
|
+
message?: string;
|
|
27
|
+
/** The CLI declared the turn finished (process exit may follow). */
|
|
28
|
+
turnCompleted?: boolean;
|
|
29
|
+
/** The CLI declared the turn failed. */
|
|
30
|
+
turnError?: string;
|
|
31
|
+
/** Human-readable rows for the output tail. */
|
|
32
|
+
display: string[];
|
|
33
|
+
};
|
|
34
|
+
export interface HeadlessProvider {
|
|
35
|
+
readonly id: string;
|
|
36
|
+
buildLaunch(request: HeadlessRunRequest): LaunchSpec;
|
|
37
|
+
/** Parses one stdout line; non-JSON lines are shown as-is. */
|
|
38
|
+
parseLine(line: string): ParsedLine;
|
|
39
|
+
}
|
|
40
|
+
export declare function providerEnvironment(): NodeJS.ProcessEnv;
|
|
41
|
+
/**
|
|
42
|
+
* Resolves a CLI on PATH. npm-installed CLIs are often `.js` shims; those are
|
|
43
|
+
* run with this Node so they work without a shell.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveExecutable(command: string, args: string[], env: NodeJS.ProcessEnv, override?: string): LaunchSpec;
|
|
46
|
+
export declare function tryJson(line: string): Record<string, unknown> | undefined;
|
|
47
|
+
export declare function str(value: unknown): string | undefined;
|
|
48
|
+
export declare function clip(text: string, max?: number): string;
|
|
49
|
+
export declare function textRows(prefix: string, text: string, maxRows?: number): string[];
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { realpathSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { delimiter, dirname, join } from 'node:path';
|
|
4
|
+
import { getVersionManagerBinPaths, resolveCliCommand } from '../shared/node-cli-command-resolution.js';
|
|
5
|
+
export function providerEnvironment() {
|
|
6
|
+
const env = { ...process.env };
|
|
7
|
+
const commandPaths = [
|
|
8
|
+
dirname(process.execPath),
|
|
9
|
+
...getVersionManagerBinPaths(env.PATH === undefined ? {} : { pathEnv: env.PATH }),
|
|
10
|
+
env.PATH,
|
|
11
|
+
'/opt/homebrew/bin',
|
|
12
|
+
'/usr/local/bin',
|
|
13
|
+
join(homedir(), '.local', 'bin')
|
|
14
|
+
].filter((value) => Boolean(value));
|
|
15
|
+
env.PATH = [...new Set(commandPaths)].join(delimiter);
|
|
16
|
+
return env;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolves a CLI on PATH. npm-installed CLIs are often `.js` shims; those are
|
|
20
|
+
* run with this Node so they work without a shell.
|
|
21
|
+
*/
|
|
22
|
+
export function resolveExecutable(command, args, env, override) {
|
|
23
|
+
const candidate = override?.trim() || resolveCliCommand(command, env.PATH === undefined ? {} : { pathEnv: env.PATH });
|
|
24
|
+
if (!candidate)
|
|
25
|
+
return { executable: command, args, env };
|
|
26
|
+
try {
|
|
27
|
+
const resolved = realpathSync(candidate);
|
|
28
|
+
if (resolved.endsWith('.js') || resolved.endsWith('.mjs') || resolved.endsWith('.cjs')) {
|
|
29
|
+
return { executable: process.env.TOC_OCRA_NODE_PATH || process.execPath, args: [resolved, ...args], env };
|
|
30
|
+
}
|
|
31
|
+
return { executable: resolved, args, env };
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return { executable: candidate, args, env };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function tryJson(line) {
|
|
38
|
+
const start = line.indexOf('{');
|
|
39
|
+
if (start < 0)
|
|
40
|
+
return undefined;
|
|
41
|
+
try {
|
|
42
|
+
const value = JSON.parse(line.slice(start));
|
|
43
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function str(value) {
|
|
50
|
+
return typeof value === 'string' && value.trim() ? value : undefined;
|
|
51
|
+
}
|
|
52
|
+
export function clip(text, max = 400) {
|
|
53
|
+
const flat = text.replace(/\s+$/g, '');
|
|
54
|
+
return flat.length > max ? `${flat.slice(0, max)}…` : flat;
|
|
55
|
+
}
|
|
56
|
+
export function textRows(prefix, text, maxRows = 40) {
|
|
57
|
+
const rows = text.split(/\r?\n/);
|
|
58
|
+
const shown = rows.slice(0, maxRows).map((row, index) => (index === 0 ? `${prefix}${row}` : ` ${row}`));
|
|
59
|
+
if (rows.length > maxRows)
|
|
60
|
+
shown.push(` …(其余 ${rows.length - maxRows} 行已省略)`);
|
|
61
|
+
return shown;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { HeadlessProvider } from './provider.js';
|
|
2
|
+
export type ProviderRuntime = NodeJS.Platform | 'wsl';
|
|
3
|
+
/**
|
|
4
|
+
* The single CLI catalog. Every entry is detected on the device; entries
|
|
5
|
+
* with `headless` can also run turns. Adding a runnable CLI is one provider
|
|
6
|
+
* file plus one line here.
|
|
7
|
+
*/
|
|
8
|
+
export type CliCatalogEntry = {
|
|
9
|
+
id: string;
|
|
10
|
+
aliases?: readonly string[];
|
|
11
|
+
detectCmd: string;
|
|
12
|
+
detectCmdAliases?: readonly string[];
|
|
13
|
+
detectRequiredCommands?: readonly string[];
|
|
14
|
+
detectUnsupportedRuntimes?: readonly ProviderRuntime[];
|
|
15
|
+
versionArguments?: readonly string[];
|
|
16
|
+
headless?: HeadlessProvider;
|
|
17
|
+
};
|
|
18
|
+
export declare const CLI_CATALOG: readonly CliCatalogEntry[];
|
|
19
|
+
export declare function catalogEntry(idOrAlias: string): CliCatalogEntry | undefined;
|
|
20
|
+
/** The runnable provider for an agent type, or an error naming the problem. */
|
|
21
|
+
export declare function resolveHeadlessProvider(agentType: string): HeadlessProvider;
|
|
22
|
+
export type ProviderDetectionCommand = {
|
|
23
|
+
id: string;
|
|
24
|
+
cmd: string;
|
|
25
|
+
requiredCommands?: readonly string[];
|
|
26
|
+
unsupportedRuntimes?: readonly ProviderRuntime[];
|
|
27
|
+
};
|
|
28
|
+
export declare function buildProviderDetectionCommands(configs?: readonly CliCatalogEntry[]): ProviderDetectionCommand[];
|
|
29
|
+
export declare const DETECTION_COMMANDS: ProviderDetectionCommand[];
|
|
30
|
+
export declare function getProviderDetectionProbeCommands(commands?: readonly ProviderDetectionCommand[], runtime?: ProviderRuntime): string[];
|
|
31
|
+
export declare function resolveDetectedProviderCommands(foundCommands: ReadonlySet<string>, commands?: readonly ProviderDetectionCommand[], runtime?: ProviderRuntime): Map<string, string>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { claudeProvider } from './cli/claude.js';
|
|
2
|
+
import { codexProvider } from './cli/codex.js';
|
|
3
|
+
import { geminiProvider } from './cli/gemini.js';
|
|
4
|
+
import { grokProvider } from './cli/grok.js';
|
|
5
|
+
import { opencodeProvider } from './cli/opencode.js';
|
|
6
|
+
export const CLI_CATALOG = [
|
|
7
|
+
{ id: 'codex', detectCmd: 'codex', versionArguments: ['--version'], headless: codexProvider },
|
|
8
|
+
{ id: 'claude', aliases: ['claude-code'], detectCmd: 'claude', detectCmdAliases: ['claude-code'], versionArguments: ['--version'], headless: claudeProvider },
|
|
9
|
+
{ id: 'grok', detectCmd: 'grok', versionArguments: ['--version'], headless: grokProvider },
|
|
10
|
+
{ id: 'gemini', detectCmd: 'gemini', versionArguments: ['--version'], headless: geminiProvider },
|
|
11
|
+
{ id: 'opencode', detectCmd: 'opencode', versionArguments: ['--version'], headless: opencodeProvider },
|
|
12
|
+
{ id: 'kiro', aliases: ['kiro-cli'], detectCmd: 'kiro-cli', detectCmdAliases: ['kiro'], versionArguments: ['--version'] },
|
|
13
|
+
{ id: 'cursor', detectCmd: 'cursor-agent', detectCmdAliases: ['cursor'] },
|
|
14
|
+
{ id: 'copilot', detectCmd: 'copilot' },
|
|
15
|
+
{ id: 'aider', detectCmd: 'aider' },
|
|
16
|
+
{ id: 'goose', detectCmd: 'goose' },
|
|
17
|
+
{ id: 'cline', detectCmd: 'cline' }
|
|
18
|
+
];
|
|
19
|
+
export function catalogEntry(idOrAlias) {
|
|
20
|
+
const normalized = idOrAlias.trim().toLowerCase();
|
|
21
|
+
return CLI_CATALOG.find((entry) => entry.id === normalized || entry.aliases?.includes(normalized));
|
|
22
|
+
}
|
|
23
|
+
/** The runnable provider for an agent type, or an error naming the problem. */
|
|
24
|
+
export function resolveHeadlessProvider(agentType) {
|
|
25
|
+
const entry = catalogEntry(agentType);
|
|
26
|
+
if (!entry)
|
|
27
|
+
throw new Error(`不支持的 CLI 类型:${agentType}`);
|
|
28
|
+
if (!entry.headless)
|
|
29
|
+
throw new Error(`${entry.id} 暂不支持无界面执行`);
|
|
30
|
+
return entry.headless;
|
|
31
|
+
}
|
|
32
|
+
export function buildProviderDetectionCommands(configs = CLI_CATALOG) {
|
|
33
|
+
return configs.flatMap((config) => [config.detectCmd, ...(config.detectCmdAliases ?? [])].map((cmd) => ({
|
|
34
|
+
id: config.id,
|
|
35
|
+
cmd,
|
|
36
|
+
...(config.detectRequiredCommands?.length ? { requiredCommands: config.detectRequiredCommands } : {}),
|
|
37
|
+
...(config.detectUnsupportedRuntimes?.length ? { unsupportedRuntimes: config.detectUnsupportedRuntimes } : {})
|
|
38
|
+
})));
|
|
39
|
+
}
|
|
40
|
+
export const DETECTION_COMMANDS = buildProviderDetectionCommands();
|
|
41
|
+
export function getProviderDetectionProbeCommands(commands = DETECTION_COMMANDS, runtime = process.platform) {
|
|
42
|
+
return [...new Set(commands
|
|
43
|
+
.filter((command) => !command.unsupportedRuntimes?.includes(runtime))
|
|
44
|
+
.flatMap((command) => [command.cmd, ...(command.requiredCommands ?? [])]))];
|
|
45
|
+
}
|
|
46
|
+
export function resolveDetectedProviderCommands(foundCommands, commands = DETECTION_COMMANDS, runtime = process.platform) {
|
|
47
|
+
const detected = new Map();
|
|
48
|
+
for (const command of commands) {
|
|
49
|
+
if (command.unsupportedRuntimes?.includes(runtime))
|
|
50
|
+
continue;
|
|
51
|
+
if (!foundCommands.has(command.cmd))
|
|
52
|
+
continue;
|
|
53
|
+
if (!(command.requiredCommands ?? []).every((required) => foundCommands.has(required)))
|
|
54
|
+
continue;
|
|
55
|
+
if (!detected.has(command.id))
|
|
56
|
+
detected.set(command.id, command.cmd);
|
|
57
|
+
}
|
|
58
|
+
return detected;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remembers the CLI processes this agent started, so that after a crash
|
|
3
|
+
* (kill -9, power loss of the agent only) the next start can stop the
|
|
4
|
+
* orphans instead of leaving them running unobserved. A recorded pid is
|
|
5
|
+
* only killed if it still runs the same executable, so a pid reused by an
|
|
6
|
+
* unrelated process is never touched.
|
|
7
|
+
*/
|
|
8
|
+
export type OrphanRecord = {
|
|
9
|
+
runId: string;
|
|
10
|
+
pid: number;
|
|
11
|
+
executable: string;
|
|
12
|
+
startedAt: number;
|
|
13
|
+
};
|
|
14
|
+
export declare class OrphanRegistry {
|
|
15
|
+
private readonly file;
|
|
16
|
+
private records;
|
|
17
|
+
private writing;
|
|
18
|
+
constructor(file: string);
|
|
19
|
+
add(record: OrphanRecord): void;
|
|
20
|
+
remove(runId: string): void;
|
|
21
|
+
private persist;
|
|
22
|
+
/** Kills leftovers from a previous agent process; returns what was stopped. */
|
|
23
|
+
reapPrevious(): Promise<OrphanRecord[]>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { basename, dirname } from 'node:path';
|
|
4
|
+
import { killProcessTree } from './process-tree.js';
|
|
5
|
+
export class OrphanRegistry {
|
|
6
|
+
file;
|
|
7
|
+
records = new Map();
|
|
8
|
+
writing = Promise.resolve();
|
|
9
|
+
constructor(file) {
|
|
10
|
+
this.file = file;
|
|
11
|
+
}
|
|
12
|
+
add(record) {
|
|
13
|
+
this.records.set(record.runId, record);
|
|
14
|
+
this.persist();
|
|
15
|
+
}
|
|
16
|
+
remove(runId) {
|
|
17
|
+
if (this.records.delete(runId))
|
|
18
|
+
this.persist();
|
|
19
|
+
}
|
|
20
|
+
persist() {
|
|
21
|
+
const snapshot = JSON.stringify([...this.records.values()]);
|
|
22
|
+
this.writing = this.writing.then(async () => {
|
|
23
|
+
await mkdir(dirname(this.file), { recursive: true, mode: 0o700 });
|
|
24
|
+
const temporary = `${this.file}.${process.pid}.tmp`;
|
|
25
|
+
await writeFile(temporary, snapshot, { mode: 0o600 });
|
|
26
|
+
await rename(temporary, this.file);
|
|
27
|
+
}).catch(() => undefined);
|
|
28
|
+
}
|
|
29
|
+
/** Kills leftovers from a previous agent process; returns what was stopped. */
|
|
30
|
+
async reapPrevious() {
|
|
31
|
+
let previous = [];
|
|
32
|
+
try {
|
|
33
|
+
previous = JSON.parse(await readFile(this.file, 'utf8'));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
const reaped = [];
|
|
39
|
+
for (const record of previous) {
|
|
40
|
+
if (!record || typeof record.pid !== 'number' || record.pid <= 1)
|
|
41
|
+
continue;
|
|
42
|
+
const command = await commandOf(record.pid);
|
|
43
|
+
if (command && command.includes(basename(record.executable))) {
|
|
44
|
+
await killProcessTree(record.pid);
|
|
45
|
+
reaped.push(record);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.records.clear();
|
|
49
|
+
this.persist();
|
|
50
|
+
await this.writing;
|
|
51
|
+
return reaped;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function commandOf(pid) {
|
|
55
|
+
if (process.platform === 'win32')
|
|
56
|
+
return Promise.resolve(undefined);
|
|
57
|
+
return new Promise((resolve) => {
|
|
58
|
+
execFile('ps', ['-o', 'command=', '-p', String(pid)], { timeout: 2_000 }, (error, stdout) => {
|
|
59
|
+
resolve(error ? undefined : stdout.trim() || undefined);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=orphan-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-registry.js","sourceRoot":"","sources":["../../../src/runs/orphan-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stopping a coding CLI must stop everything it started: the CLI spawns
|
|
3
|
+
* node workers, shells and tool commands, and killing only the root leaves
|
|
4
|
+
* them running (the old "stop does not stop" bug). Like Orca's
|
|
5
|
+
* pty-descendant-termination:
|
|
6
|
+
*
|
|
7
|
+
* 1. Snapshot the descendant tree while the root is alive (after it dies,
|
|
8
|
+
* children are re-parented and can no longer be found by ppid).
|
|
9
|
+
* 2. SIGTERM the root's process group and every descendant.
|
|
10
|
+
* 3. After a grace period, SIGKILL whatever is still alive.
|
|
11
|
+
*
|
|
12
|
+
* Runs are spawned `detached`, so the root leads its own process group.
|
|
13
|
+
* On Windows `taskkill /T /F` walks the tree itself.
|
|
14
|
+
*/
|
|
15
|
+
export declare const KILL_GRACE_MS = 3000;
|
|
16
|
+
export declare function listDescendants(rootPid: number): Promise<number[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Terminates a process tree. Resolves once every known member is gone or
|
|
19
|
+
* has been sent SIGKILL.
|
|
20
|
+
*/
|
|
21
|
+
export declare function killProcessTree(rootPid: number, graceMs?: number): Promise<void>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { execFile, spawn } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Stopping a coding CLI must stop everything it started: the CLI spawns
|
|
4
|
+
* node workers, shells and tool commands, and killing only the root leaves
|
|
5
|
+
* them running (the old "stop does not stop" bug). Like Orca's
|
|
6
|
+
* pty-descendant-termination:
|
|
7
|
+
*
|
|
8
|
+
* 1. Snapshot the descendant tree while the root is alive (after it dies,
|
|
9
|
+
* children are re-parented and can no longer be found by ppid).
|
|
10
|
+
* 2. SIGTERM the root's process group and every descendant.
|
|
11
|
+
* 3. After a grace period, SIGKILL whatever is still alive.
|
|
12
|
+
*
|
|
13
|
+
* Runs are spawned `detached`, so the root leads its own process group.
|
|
14
|
+
* On Windows `taskkill /T /F` walks the tree itself.
|
|
15
|
+
*/
|
|
16
|
+
export const KILL_GRACE_MS = 3_000;
|
|
17
|
+
function readProcessTable() {
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
execFile('ps', ['-axo', 'pid=,ppid='], { maxBuffer: 32 * 1024 * 1024, timeout: 2_000 }, (error, stdout) => {
|
|
20
|
+
if (error)
|
|
21
|
+
return resolve([]);
|
|
22
|
+
resolve(stdout.split('\n').flatMap((line) => {
|
|
23
|
+
const [pid, ppid] = line.trim().split(/\s+/).map(Number);
|
|
24
|
+
return pid && ppid !== undefined && Number.isFinite(ppid) ? [{ pid, ppid }] : [];
|
|
25
|
+
}));
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export async function listDescendants(rootPid) {
|
|
30
|
+
const rows = await readProcessTable();
|
|
31
|
+
const children = new Map();
|
|
32
|
+
for (const row of rows)
|
|
33
|
+
children.set(row.ppid, [...(children.get(row.ppid) ?? []), row.pid]);
|
|
34
|
+
const out = [];
|
|
35
|
+
const queue = [...(children.get(rootPid) ?? [])];
|
|
36
|
+
while (queue.length > 0) {
|
|
37
|
+
const pid = queue.shift();
|
|
38
|
+
if (out.includes(pid))
|
|
39
|
+
continue;
|
|
40
|
+
out.push(pid);
|
|
41
|
+
queue.push(...(children.get(pid) ?? []));
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
function signal(pid, sig) {
|
|
46
|
+
try {
|
|
47
|
+
process.kill(pid, sig);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Already gone.
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function alive(pid) {
|
|
54
|
+
try {
|
|
55
|
+
process.kill(pid, 0);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
63
|
+
/**
|
|
64
|
+
* Terminates a process tree. Resolves once every known member is gone or
|
|
65
|
+
* has been sent SIGKILL.
|
|
66
|
+
*/
|
|
67
|
+
export async function killProcessTree(rootPid, graceMs = KILL_GRACE_MS) {
|
|
68
|
+
// Never signal pid 0/1: `kill(-0)` would hit the agent's own process group.
|
|
69
|
+
if (!Number.isInteger(rootPid) || rootPid <= 1)
|
|
70
|
+
return;
|
|
71
|
+
if (process.platform === 'win32') {
|
|
72
|
+
await new Promise((resolve) => {
|
|
73
|
+
const child = spawn('taskkill', ['/PID', String(rootPid), '/T', '/F'], { stdio: 'ignore', windowsHide: true });
|
|
74
|
+
child.once('error', () => resolve());
|
|
75
|
+
child.once('close', () => resolve());
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const descendants = await listDescendants(rootPid);
|
|
80
|
+
signal(-rootPid, 'SIGTERM');
|
|
81
|
+
signal(rootPid, 'SIGTERM');
|
|
82
|
+
for (const pid of descendants)
|
|
83
|
+
signal(pid, 'SIGTERM');
|
|
84
|
+
const members = [rootPid, ...descendants];
|
|
85
|
+
const deadline = Date.now() + graceMs;
|
|
86
|
+
while (Date.now() < deadline && members.some(alive))
|
|
87
|
+
await sleep(100);
|
|
88
|
+
// Pick up anything spawned during the grace period, then force.
|
|
89
|
+
const late = alive(rootPid) ? await listDescendants(rootPid) : [];
|
|
90
|
+
signal(-rootPid, 'SIGKILL');
|
|
91
|
+
for (const pid of [...members, ...late])
|
|
92
|
+
if (alive(pid))
|
|
93
|
+
signal(pid, 'SIGKILL');
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=process-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-tree.js","sourceRoot":"","sources":["../../../src/runs/process-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AgentConfig } from '../config.js';
|
|
2
|
+
import type { DiagnosticLogger } from '../logging/diagnostic-log.js';
|
|
3
|
+
import { type TerminalTailRead } from '../session/terminal-tail-buffer.js';
|
|
4
|
+
import type { RunFinishedReport, RunStartPayload, RunStartedReport } from '../types/protocol.js';
|
|
5
|
+
import { OrphanRegistry } from './orphan-registry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Supervises headless CLI turns. One process per turn:
|
|
8
|
+
*
|
|
9
|
+
* spawn -> report started(pid) -> parse stdout (session id, answer)
|
|
10
|
+
* -> process exits -> report finished(status, final answer)
|
|
11
|
+
*
|
|
12
|
+
* "Done" is the process exit. If the CLI already declared the turn finished
|
|
13
|
+
* but its process lingers, it is stopped after COMPLETION_EXIT_GRACE_MS, so
|
|
14
|
+
* a finished turn can never keep the workstation busy. Stop kills the whole
|
|
15
|
+
* process tree.
|
|
16
|
+
*/
|
|
17
|
+
export declare const COMPLETION_EXIT_GRACE_MS = 15000;
|
|
18
|
+
export type RunReporter = {
|
|
19
|
+
started(runId: string, report: RunStartedReport): Promise<void>;
|
|
20
|
+
finished(runId: string, report: RunFinishedReport): Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
export type TailResult = TerminalTailRead & {
|
|
23
|
+
status: 'running' | 'finished' | 'idle';
|
|
24
|
+
run_id?: string;
|
|
25
|
+
};
|
|
26
|
+
export declare class RunSupervisor {
|
|
27
|
+
private readonly config;
|
|
28
|
+
private readonly logger;
|
|
29
|
+
private readonly reporter;
|
|
30
|
+
private readonly orphans?;
|
|
31
|
+
private readonly active;
|
|
32
|
+
private readonly recent;
|
|
33
|
+
/** Run ids whose finish report has not been acknowledged yet. */
|
|
34
|
+
private readonly unreported;
|
|
35
|
+
constructor(config: AgentConfig, logger: DiagnosticLogger, reporter: RunReporter, orphans?: OrphanRegistry | undefined);
|
|
36
|
+
get activeCount(): number;
|
|
37
|
+
/** Runs to list in the heartbeat: still running, or finished but not yet reported. */
|
|
38
|
+
activeRunIds(): string[];
|
|
39
|
+
markReported(runId: string): void;
|
|
40
|
+
recentRuns(): Array<{
|
|
41
|
+
runId: string;
|
|
42
|
+
workstationId: string;
|
|
43
|
+
status: string;
|
|
44
|
+
at: number;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Starts a turn. Refusals (busy workstation, concurrency limit, bad work
|
|
48
|
+
* directory, unknown CLI) are reported as a failed run, never thrown.
|
|
49
|
+
*/
|
|
50
|
+
start(payload: RunStartPayload): Promise<void>;
|
|
51
|
+
private onStdout;
|
|
52
|
+
private onExit;
|
|
53
|
+
private report;
|
|
54
|
+
/** Stops a run: the whole process tree, then a `cancelled` report. */
|
|
55
|
+
cancel(runId: string): Promise<boolean>;
|
|
56
|
+
tail(query: {
|
|
57
|
+
runId?: string;
|
|
58
|
+
workstationId?: string;
|
|
59
|
+
}, limit: number, beforeCursor?: number): TailResult;
|
|
60
|
+
disposeAll(): Promise<void>;
|
|
61
|
+
private remember;
|
|
62
|
+
validateWorkdir(input: string | undefined): Promise<string>;
|
|
63
|
+
}
|