@godot-mcp/control-plane 0.0.0 → 0.1.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 +105 -2
- package/dist/audit/jsonlAuditSink.d.ts +33 -0
- package/dist/audit/jsonlAuditSink.d.ts.map +1 -0
- package/dist/audit/jsonlAuditSink.js +57 -0
- package/dist/audit/jsonlAuditSink.js.map +1 -0
- package/dist/audit/redact.d.ts +2 -0
- package/dist/audit/redact.d.ts.map +1 -0
- package/dist/audit/redact.js +44 -0
- package/dist/audit/redact.js.map +1 -0
- package/dist/auth/pairingDescriptor.d.ts +44 -0
- package/dist/auth/pairingDescriptor.d.ts.map +1 -0
- package/dist/auth/pairingDescriptor.js +91 -0
- package/dist/auth/pairingDescriptor.js.map +1 -0
- package/dist/auth/runtimeDirectory.d.ts +3 -0
- package/dist/auth/runtimeDirectory.d.ts.map +1 -0
- package/dist/auth/runtimeDirectory.js +30 -0
- package/dist/auth/runtimeDirectory.js.map +1 -0
- package/dist/auth/sessionCrypto.d.ts +18 -0
- package/dist/auth/sessionCrypto.d.ts.map +1 -0
- package/dist/auth/sessionCrypto.js +118 -0
- package/dist/auth/sessionCrypto.js.map +1 -0
- package/dist/editor/editorMutationService.d.ts +21 -0
- package/dist/editor/editorMutationService.d.ts.map +1 -0
- package/dist/editor/editorMutationService.js +120 -0
- package/dist/editor/editorMutationService.js.map +1 -0
- package/dist/editor/mutationLedger.d.ts +30 -0
- package/dist/editor/mutationLedger.d.ts.map +1 -0
- package/dist/editor/mutationLedger.js +133 -0
- package/dist/editor/mutationLedger.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +23 -0
- package/dist/errors.js.map +1 -0
- package/dist/evidence/evidenceStore.d.ts +63 -0
- package/dist/evidence/evidenceStore.d.ts.map +1 -0
- package/dist/evidence/evidenceStore.js +350 -0
- package/dist/evidence/evidenceStore.js.map +1 -0
- package/dist/extensions/extensionRegistry.d.ts +33 -0
- package/dist/extensions/extensionRegistry.d.ts.map +1 -0
- package/dist/extensions/extensionRegistry.js +37 -0
- package/dist/extensions/extensionRegistry.js.map +1 -0
- package/dist/help/coreHelp.d.ts +10 -0
- package/dist/help/coreHelp.d.ts.map +1 -0
- package/dist/help/coreHelp.js +82 -0
- package/dist/help/coreHelp.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/policy/authorize.d.ts +5 -0
- package/dist/policy/authorize.d.ts.map +1 -0
- package/dist/policy/authorize.js +19 -0
- package/dist/policy/authorize.js.map +1 -0
- package/dist/policy/capabilities.d.ts +36 -0
- package/dist/policy/capabilities.d.ts.map +1 -0
- package/dist/policy/capabilities.js +129 -0
- package/dist/policy/capabilities.js.map +1 -0
- package/dist/project/artifactStore.d.ts +32 -0
- package/dist/project/artifactStore.d.ts.map +1 -0
- package/dist/project/artifactStore.js +172 -0
- package/dist/project/artifactStore.js.map +1 -0
- package/dist/project/pathPolicy.d.ts +4 -0
- package/dist/project/pathPolicy.d.ts.map +1 -0
- package/dist/project/pathPolicy.js +74 -0
- package/dist/project/pathPolicy.js.map +1 -0
- package/dist/project/projectConfig.d.ts +10 -0
- package/dist/project/projectConfig.d.ts.map +1 -0
- package/dist/project/projectConfig.js +63 -0
- package/dist/project/projectConfig.js.map +1 -0
- package/dist/project/projectIdentity.d.ts +8 -0
- package/dist/project/projectIdentity.d.ts.map +1 -0
- package/dist/project/projectIdentity.js +58 -0
- package/dist/project/projectIdentity.js.map +1 -0
- package/dist/project/projectJobJournal.d.ts +49 -0
- package/dist/project/projectJobJournal.d.ts.map +1 -0
- package/dist/project/projectJobJournal.js +67 -0
- package/dist/project/projectJobJournal.js.map +1 -0
- package/dist/project/projectJobService.d.ts +52 -0
- package/dist/project/projectJobService.d.ts.map +1 -0
- package/dist/project/projectJobService.js +289 -0
- package/dist/project/projectJobService.js.map +1 -0
- package/dist/project/projectMutationService.d.ts +40 -0
- package/dist/project/projectMutationService.d.ts.map +1 -0
- package/dist/project/projectMutationService.js +145 -0
- package/dist/project/projectMutationService.js.map +1 -0
- package/dist/project/projectPreflight.d.ts +7 -0
- package/dist/project/projectPreflight.d.ts.map +1 -0
- package/dist/project/projectPreflight.js +50 -0
- package/dist/project/projectPreflight.js.map +1 -0
- package/dist/project/projectProcess.d.ts +40 -0
- package/dist/project/projectProcess.d.ts.map +1 -0
- package/dist/project/projectProcess.js +196 -0
- package/dist/project/projectProcess.js.map +1 -0
- package/dist/project/projectService.d.ts +20 -0
- package/dist/project/projectService.d.ts.map +1 -0
- package/dist/project/projectService.js +35 -0
- package/dist/project/projectService.js.map +1 -0
- package/dist/project/secureJournalFile.d.ts +3 -0
- package/dist/project/secureJournalFile.d.ts.map +1 -0
- package/dist/project/secureJournalFile.js +56 -0
- package/dist/project/secureJournalFile.js.map +1 -0
- package/dist/runtime/debugTokenStore.d.ts +41 -0
- package/dist/runtime/debugTokenStore.d.ts.map +1 -0
- package/dist/runtime/debugTokenStore.js +105 -0
- package/dist/runtime/debugTokenStore.js.map +1 -0
- package/dist/runtime/debuggerClient.d.ts +14 -0
- package/dist/runtime/debuggerClient.d.ts.map +1 -0
- package/dist/runtime/debuggerClient.js +21 -0
- package/dist/runtime/debuggerClient.js.map +1 -0
- package/dist/runtime/inputReceipt.d.ts +15 -0
- package/dist/runtime/inputReceipt.d.ts.map +1 -0
- package/dist/runtime/inputReceipt.js +36 -0
- package/dist/runtime/inputReceipt.js.map +1 -0
- package/dist/runtime/runtimeDescriptor.d.ts +50 -0
- package/dist/runtime/runtimeDescriptor.d.ts.map +1 -0
- package/dist/runtime/runtimeDescriptor.js +175 -0
- package/dist/runtime/runtimeDescriptor.js.map +1 -0
- package/dist/runtime/runtimeProcess.d.ts +39 -0
- package/dist/runtime/runtimeProcess.d.ts.map +1 -0
- package/dist/runtime/runtimeProcess.js +180 -0
- package/dist/runtime/runtimeProcess.js.map +1 -0
- package/dist/runtime/runtimeService.d.ts +130 -0
- package/dist/runtime/runtimeService.d.ts.map +1 -0
- package/dist/runtime/runtimeService.js +919 -0
- package/dist/runtime/runtimeService.js.map +1 -0
- package/dist/session/sessionService.d.ts +52 -0
- package/dist/session/sessionService.d.ts.map +1 -0
- package/dist/session/sessionService.js +72 -0
- package/dist/session/sessionService.js.map +1 -0
- package/dist/unsafe/unsafeFixtureAuthority.d.ts +27 -0
- package/dist/unsafe/unsafeFixtureAuthority.d.ts.map +1 -0
- package/dist/unsafe/unsafeFixtureAuthority.js +130 -0
- package/dist/unsafe/unsafeFixtureAuthority.js.map +1 -0
- package/dist/unsafe/unsafeFixtureProcess.d.ts +30 -0
- package/dist/unsafe/unsafeFixtureProcess.d.ts.map +1 -0
- package/dist/unsafe/unsafeFixtureProcess.js +119 -0
- package/dist/unsafe/unsafeFixtureProcess.js.map +1 -0
- package/dist/unsafe/unsafeFixtureService.d.ts +41 -0
- package/dist/unsafe/unsafeFixtureService.d.ts.map +1 -0
- package/dist/unsafe/unsafeFixtureService.js +162 -0
- package/dist/unsafe/unsafeFixtureService.js.map +1 -0
- package/dist/visual/pngComparison.d.ts +12 -0
- package/dist/visual/pngComparison.d.ts.map +1 -0
- package/dist/visual/pngComparison.js +136 -0
- package/dist/visual/pngComparison.js.map +1 -0
- package/dist/visual/scenarioService.d.ts +50 -0
- package/dist/visual/scenarioService.d.ts.map +1 -0
- package/dist/visual/scenarioService.js +421 -0
- package/dist/visual/scenarioService.js.map +1 -0
- package/dist/visual/visualService.d.ts +27 -0
- package/dist/visual/visualService.d.ts.map +1 -0
- package/dist/visual/visualService.js +70 -0
- package/dist/visual/visualService.js.map +1 -0
- package/package.json +26 -6
- package/index.js +0 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { GodotMcpException } from "../errors.js";
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
const ENVIRONMENT_ALLOWLIST = ["HOME", "LANG", "LC_ALL", "LC_CTYPE", "PATH", "TMPDIR", "XDG_RUNTIME_DIR"];
|
|
7
|
+
export function godotRuntimeArguments(input) {
|
|
8
|
+
return [
|
|
9
|
+
"--path",
|
|
10
|
+
input.projectRoot,
|
|
11
|
+
...(input.pins ? [
|
|
12
|
+
"--resolution", `${input.pins.width}x${input.pins.height}`,
|
|
13
|
+
"--rendering-method", input.pins.renderer,
|
|
14
|
+
"--language", input.pins.locale,
|
|
15
|
+
"--fixed-fps", String(input.pins.fixedFps),
|
|
16
|
+
] : []),
|
|
17
|
+
"--scene",
|
|
18
|
+
"res://addons/godot_mcp/runtime/runtime_harness.tscn",
|
|
19
|
+
"--remote-debug",
|
|
20
|
+
`tcp://127.0.0.1:${input.debugPort}`,
|
|
21
|
+
"--",
|
|
22
|
+
`--godot-mcp-runtime-descriptor=${input.descriptorPath}`,
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
export function scrubRuntimeEnvironment(environment) {
|
|
26
|
+
return Object.fromEntries(ENVIRONMENT_ALLOWLIST.flatMap((name) => {
|
|
27
|
+
const value = environment[name];
|
|
28
|
+
return value === undefined ? [] : [[name, value]];
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
export function lsofShowsLoopbackListener(output, pid, port) {
|
|
32
|
+
const lines = output.split(/\r?\n/);
|
|
33
|
+
const ownsProcess = lines.includes(`p${pid}`);
|
|
34
|
+
const endpoints = [`n127.0.0.1:${port}`, `n[::1]:${port}`, `nlocalhost:${port}`];
|
|
35
|
+
return ownsProcess && endpoints.some((endpoint) => lines.includes(endpoint));
|
|
36
|
+
}
|
|
37
|
+
export function listenerPortsAreDistinct(ports) {
|
|
38
|
+
return ports.length === new Set(ports).size;
|
|
39
|
+
}
|
|
40
|
+
export async function assertLoopbackListenerOwnedByProcess(pid, port) {
|
|
41
|
+
let output = "";
|
|
42
|
+
try {
|
|
43
|
+
const result = await execFileAsync(process.platform === "darwin" ? "/usr/sbin/lsof" : "lsof", [
|
|
44
|
+
"-nP", "-a", "-p", String(pid), `-iTCP:${port}`, "-sTCP:LISTEN", "-Fpn",
|
|
45
|
+
]);
|
|
46
|
+
output = result.stdout;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// lsof exits nonzero when the requested process does not own that listener.
|
|
50
|
+
}
|
|
51
|
+
if (lsofShowsLoopbackListener(output, pid, port))
|
|
52
|
+
return;
|
|
53
|
+
throw new GodotMcpException({
|
|
54
|
+
code: "CONFLICT",
|
|
55
|
+
message: "The configured Godot debugger port is not the editor's loopback listener; relaunch the editor with an explicit available debug-server port",
|
|
56
|
+
retryable: false,
|
|
57
|
+
correlationId: `${pid}:${port}`,
|
|
58
|
+
partialEffects: false,
|
|
59
|
+
rollback: "not_needed",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export async function assertLoopbackListenersOwnedByProcess(pid, ports, verify = assertLoopbackListenerOwnedByProcess) {
|
|
63
|
+
for (const port of new Set(ports))
|
|
64
|
+
await verify(pid, port);
|
|
65
|
+
}
|
|
66
|
+
async function processFingerprint(pid) {
|
|
67
|
+
const { stdout } = await execFileAsync("ps", ["-o", "lstart=", "-p", String(pid)]);
|
|
68
|
+
const started = stdout.trim();
|
|
69
|
+
if (!started)
|
|
70
|
+
throw new Error("Owned process start time is unavailable");
|
|
71
|
+
return `${pid}:${started}`;
|
|
72
|
+
}
|
|
73
|
+
export function childHasExited(child) {
|
|
74
|
+
return child.exitCode !== null || child.signalCode !== null;
|
|
75
|
+
}
|
|
76
|
+
export function shouldRefuseProcessSignal(child, currentFingerprint, ownedFingerprint) {
|
|
77
|
+
return currentFingerprint !== ownedFingerprint && !childHasExited(child);
|
|
78
|
+
}
|
|
79
|
+
function waitForExit(child) {
|
|
80
|
+
if (childHasExited(child))
|
|
81
|
+
return Promise.resolve(child.exitCode ?? 1);
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
child.once("error", reject);
|
|
84
|
+
child.once("close", (code) => resolve(code ?? 1));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
export class OwnedGodotProcess {
|
|
88
|
+
child;
|
|
89
|
+
pid;
|
|
90
|
+
fingerprint;
|
|
91
|
+
stopPromise;
|
|
92
|
+
output = "";
|
|
93
|
+
constructor(child, pid, fingerprint) {
|
|
94
|
+
this.child = child;
|
|
95
|
+
this.pid = pid;
|
|
96
|
+
this.fingerprint = fingerprint;
|
|
97
|
+
}
|
|
98
|
+
static async launch(input) {
|
|
99
|
+
const child = spawn(input.godotBin, godotRuntimeArguments(input), {
|
|
100
|
+
env: scrubRuntimeEnvironment(input.environment ?? process.env),
|
|
101
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
102
|
+
});
|
|
103
|
+
await new Promise((resolve, reject) => {
|
|
104
|
+
child.once("spawn", resolve);
|
|
105
|
+
child.once("error", reject);
|
|
106
|
+
});
|
|
107
|
+
const pid = child.pid;
|
|
108
|
+
if (!pid)
|
|
109
|
+
throw new Error("Godot runtime did not report a PID");
|
|
110
|
+
let fingerprint;
|
|
111
|
+
try {
|
|
112
|
+
fingerprint = await processFingerprint(pid);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (!childHasExited(child))
|
|
116
|
+
child.kill("SIGKILL");
|
|
117
|
+
await waitForExit(child).catch(() => undefined);
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
const owned = new OwnedGodotProcess(child, pid, fingerprint);
|
|
121
|
+
const append = (chunk) => {
|
|
122
|
+
owned.output = `${owned.output}${chunk.toString()}`.slice(-64 * 1024);
|
|
123
|
+
};
|
|
124
|
+
child.stdout?.on("data", append);
|
|
125
|
+
child.stderr?.on("data", append);
|
|
126
|
+
child.once("exit", (code, signal) => {
|
|
127
|
+
append(`\n[godot runtime exited: ${signal ?? `code ${code ?? "unknown"}`}]\n`);
|
|
128
|
+
});
|
|
129
|
+
return owned;
|
|
130
|
+
}
|
|
131
|
+
diagnostics() {
|
|
132
|
+
return this.output;
|
|
133
|
+
}
|
|
134
|
+
wait() {
|
|
135
|
+
return waitForExit(this.child);
|
|
136
|
+
}
|
|
137
|
+
stop(graceMs = 2_000) {
|
|
138
|
+
if (!this.stopPromise) {
|
|
139
|
+
const activeStop = (async () => {
|
|
140
|
+
if (childHasExited(this.child))
|
|
141
|
+
return;
|
|
142
|
+
const current = await processFingerprint(this.pid).catch(() => "");
|
|
143
|
+
if (shouldRefuseProcessSignal(this.child, current, this.fingerprint)) {
|
|
144
|
+
throw new GodotMcpException({
|
|
145
|
+
code: "CONFLICT",
|
|
146
|
+
message: "Owned runtime process fingerprint changed; refusing to signal",
|
|
147
|
+
retryable: false,
|
|
148
|
+
correlationId: this.fingerprint,
|
|
149
|
+
partialEffects: false,
|
|
150
|
+
rollback: "not_attempted",
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (childHasExited(this.child))
|
|
154
|
+
return;
|
|
155
|
+
this.child.kill("SIGTERM");
|
|
156
|
+
const stopped = await Promise.race([
|
|
157
|
+
waitForExit(this.child).then(() => true),
|
|
158
|
+
new Promise((resolve) => setTimeout(() => resolve(false), graceMs)),
|
|
159
|
+
]);
|
|
160
|
+
if (!stopped && !childHasExited(this.child)) {
|
|
161
|
+
const beforeKill = await processFingerprint(this.pid).catch(() => "");
|
|
162
|
+
if (shouldRefuseProcessSignal(this.child, beforeKill, this.fingerprint)) {
|
|
163
|
+
throw new Error("Owned runtime fingerprint changed before escalation");
|
|
164
|
+
}
|
|
165
|
+
if (childHasExited(this.child))
|
|
166
|
+
return;
|
|
167
|
+
this.child.kill("SIGKILL");
|
|
168
|
+
await waitForExit(this.child);
|
|
169
|
+
}
|
|
170
|
+
})();
|
|
171
|
+
this.stopPromise = activeStop;
|
|
172
|
+
void activeStop.catch(() => {
|
|
173
|
+
if (this.stopPromise === activeStop)
|
|
174
|
+
this.stopPromise = undefined;
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return this.stopPromise;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=runtimeProcess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeProcess.js","sourceRoot":"","sources":["../../src/runtime/runtimeProcess.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { InputOperationInput, InputOperationResult, ProjectIdentity, RuntimeCaptureFrameMetadata, RuntimeCaptureInput, RuntimeHandle, RuntimeLaunchPins, RuntimeOperationInput } from "@godot-mcp/protocol";
|
|
2
|
+
import { type DebuggerCommand, type DebuggerStopEvent } from "./debuggerClient.js";
|
|
3
|
+
import { type RuntimeDescriptorInput, type RuntimeDescriptorMaterial } from "./runtimeDescriptor.js";
|
|
4
|
+
import { type OwnedRuntimeProcess } from "./runtimeProcess.js";
|
|
5
|
+
export type RuntimeState = "idle" | "preparing" | "launching" | "authenticating" | "running" | "paused" | "stopping" | "stopped" | "failed";
|
|
6
|
+
interface RuntimeProcessLaunchInput {
|
|
7
|
+
godotBin: string;
|
|
8
|
+
projectRoot: string;
|
|
9
|
+
debugPort: number;
|
|
10
|
+
descriptorPath: string;
|
|
11
|
+
pins?: RuntimeLaunchPins;
|
|
12
|
+
}
|
|
13
|
+
export interface RuntimeServiceDependencies {
|
|
14
|
+
project: ProjectIdentity;
|
|
15
|
+
sessionId(): string | null;
|
|
16
|
+
godotBin?: string;
|
|
17
|
+
requireAuthenticatedDebuggerMetadata?: boolean;
|
|
18
|
+
createDescriptor?(input: RuntimeDescriptorInput): Promise<RuntimeDescriptorMaterial>;
|
|
19
|
+
prepare(input: {
|
|
20
|
+
descriptor: RuntimeDescriptorMaterial["descriptor"];
|
|
21
|
+
}): Promise<{
|
|
22
|
+
debugPort: number;
|
|
23
|
+
editorPid?: number;
|
|
24
|
+
debugTransport?: string;
|
|
25
|
+
}>;
|
|
26
|
+
verifyDebuggerListener?(pid: number, port: number): Promise<void>;
|
|
27
|
+
verifyEditorListener?(pid: number, port: number): Promise<void>;
|
|
28
|
+
launchProcess?(input: RuntimeProcessLaunchInput): Promise<OwnedRuntimeProcess>;
|
|
29
|
+
command(operation: string, input: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
|
|
30
|
+
capture?(input: Record<string, unknown>, timeoutMs?: number): Promise<{
|
|
31
|
+
data: RuntimeCaptureFrameMetadata;
|
|
32
|
+
binary?: Uint8Array;
|
|
33
|
+
binarySha256?: string;
|
|
34
|
+
}>;
|
|
35
|
+
cleanup?(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export interface RuntimeDebuggerClient {
|
|
38
|
+
request(command: DebuggerCommand, argumentsValue: Record<string, unknown>, timeoutMs?: number): Promise<Record<string, unknown>>;
|
|
39
|
+
nextStop(afterSequence: number, timeoutMs: number): Promise<DebuggerStopEvent>;
|
|
40
|
+
snapshot(): {
|
|
41
|
+
connected: boolean;
|
|
42
|
+
stopped: boolean;
|
|
43
|
+
stopSequence: number;
|
|
44
|
+
};
|
|
45
|
+
markRunning(afterSequence?: number): void;
|
|
46
|
+
refresh?(): Promise<void>;
|
|
47
|
+
close(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export interface RuntimeSnapshot {
|
|
50
|
+
state: RuntimeState;
|
|
51
|
+
handle: RuntimeHandle | null;
|
|
52
|
+
scenePath: string | null;
|
|
53
|
+
process: {
|
|
54
|
+
pid: number;
|
|
55
|
+
fingerprint: string;
|
|
56
|
+
} | null;
|
|
57
|
+
}
|
|
58
|
+
type LaunchInput = Extract<RuntimeOperationInput, {
|
|
59
|
+
operation: "launch";
|
|
60
|
+
}>;
|
|
61
|
+
export declare class RuntimeService {
|
|
62
|
+
private readonly dependencies;
|
|
63
|
+
private state;
|
|
64
|
+
private generation;
|
|
65
|
+
private handle;
|
|
66
|
+
private scenePath;
|
|
67
|
+
private process;
|
|
68
|
+
private processStopped;
|
|
69
|
+
private descriptor;
|
|
70
|
+
private closePromise;
|
|
71
|
+
private disconnectPromise;
|
|
72
|
+
private launchPromise;
|
|
73
|
+
private cleanupPromise;
|
|
74
|
+
private debuggerCleaned;
|
|
75
|
+
private lifecycleEpoch;
|
|
76
|
+
private closed;
|
|
77
|
+
private operationTail;
|
|
78
|
+
private debuggerClient;
|
|
79
|
+
private debuggerGeneration;
|
|
80
|
+
private debuggerSessionId;
|
|
81
|
+
private readonly debugTokens;
|
|
82
|
+
private readonly breakpointSources;
|
|
83
|
+
private opaqueProfileId;
|
|
84
|
+
constructor(dependencies: RuntimeServiceDependencies);
|
|
85
|
+
snapshot(): RuntimeSnapshot;
|
|
86
|
+
launch(input: Omit<LaunchInput, "operation">): Promise<{
|
|
87
|
+
handle: RuntimeHandle;
|
|
88
|
+
root: unknown;
|
|
89
|
+
}>;
|
|
90
|
+
private launchGeneration;
|
|
91
|
+
execute(input: Exclude<RuntimeOperationInput, LaunchInput>): Promise<unknown>;
|
|
92
|
+
private executeExclusive;
|
|
93
|
+
private executePerformance;
|
|
94
|
+
private attachAuthenticatedDebugger;
|
|
95
|
+
private executeDebug;
|
|
96
|
+
private requireDebuggerClient;
|
|
97
|
+
private assertDebuggerBinding;
|
|
98
|
+
private bindDebugStop;
|
|
99
|
+
private stepDebugger;
|
|
100
|
+
private setDebugBreakpoints;
|
|
101
|
+
private debugStack;
|
|
102
|
+
private scopeReference;
|
|
103
|
+
private readVariables;
|
|
104
|
+
private formatVariable;
|
|
105
|
+
private resolveWatch;
|
|
106
|
+
private requestVariables;
|
|
107
|
+
private projectSourcePath;
|
|
108
|
+
capture(input: RuntimeCaptureInput): Promise<{
|
|
109
|
+
frames: Array<{
|
|
110
|
+
data: Uint8Array;
|
|
111
|
+
metadata: RuntimeCaptureFrameMetadata;
|
|
112
|
+
}>;
|
|
113
|
+
}>;
|
|
114
|
+
input(input: InputOperationInput): Promise<InputOperationResult>;
|
|
115
|
+
private inputExclusive;
|
|
116
|
+
private captureExclusive;
|
|
117
|
+
close(): Promise<void>;
|
|
118
|
+
disconnect(): Promise<void>;
|
|
119
|
+
private assertHandle;
|
|
120
|
+
private assertHandleIdentity;
|
|
121
|
+
private runExclusive;
|
|
122
|
+
private assertLaunchCurrent;
|
|
123
|
+
private stopProcess;
|
|
124
|
+
private cleanup;
|
|
125
|
+
private cleanupDebuggerClient;
|
|
126
|
+
private cleanupDebugger;
|
|
127
|
+
private onProcessExit;
|
|
128
|
+
}
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=runtimeService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeService.d.ts","sourceRoot":"","sources":["../../src/runtime/runtimeService.ts"],"names":[],"mappings":"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"}
|