@descryy/runtime-orchestrator 0.4.12 → 0.5.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/dist/attach-log-sources.d.ts +60 -0
- package/dist/attach-log-sources.d.ts.map +1 -0
- package/dist/attach-log-sources.js +238 -0
- package/dist/attach-log-sources.js.map +1 -0
- package/dist/attach-to-running-jvm-process.d.ts.map +1 -1
- package/dist/attach-to-running-jvm-process.js +129 -37
- package/dist/attach-to-running-jvm-process.js.map +1 -1
- package/dist/attach-to-running-node-process.d.ts +2 -0
- package/dist/attach-to-running-node-process.d.ts.map +1 -1
- package/dist/attach-to-running-node-process.js +222 -27
- package/dist/attach-to-running-node-process.js.map +1 -1
- package/dist/attach-to-running-process.d.ts.map +1 -1
- package/dist/attach-to-running-process.js +57 -11
- package/dist/attach-to-running-process.js.map +1 -1
- package/dist/cdp-client.d.ts +7 -1
- package/dist/cdp-client.d.ts.map +1 -1
- package/dist/cdp-client.js +83 -7
- package/dist/cdp-client.js.map +1 -1
- package/dist/cgroup-partial-restriction.d.ts.map +1 -1
- package/dist/cgroup-partial-restriction.js +4 -1
- package/dist/cgroup-partial-restriction.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/instrumented-execution.d.ts +2 -0
- package/dist/instrumented-execution.d.ts.map +1 -1
- package/dist/instrumented-execution.js +166 -24
- package/dist/instrumented-execution.js.map +1 -1
- package/dist/jvm-agent/build.d.ts +2 -2
- package/dist/jvm-agent/build.d.ts.map +1 -1
- package/dist/jvm-agent/build.js +46 -17
- package/dist/jvm-agent/build.js.map +1 -1
- package/dist/polling-output-source.d.ts +16 -6
- package/dist/polling-output-source.d.ts.map +1 -1
- package/dist/polling-output-source.js +38 -22
- package/dist/polling-output-source.js.map +1 -1
- package/dist/profile-backend-observation.d.ts +7 -0
- package/dist/profile-backend-observation.d.ts.map +1 -1
- package/dist/profile-backend-observation.js +87 -25
- package/dist/profile-backend-observation.js.map +1 -1
- package/dist/respawn-and-supervise.d.ts +1 -0
- package/dist/respawn-and-supervise.d.ts.map +1 -1
- package/dist/respawn-and-supervise.js +29 -1
- package/dist/respawn-and-supervise.js.map +1 -1
- package/package.json +17 -17
|
@@ -17,9 +17,11 @@
|
|
|
17
17
|
* (RT-024's readiness-then-front sequencing doesn't apply to a process Descry didn't
|
|
18
18
|
* start). Inventing an answer here would be the guess DEC-266/DEC-271 both reject.
|
|
19
19
|
*/
|
|
20
|
+
import { setImmediate as yieldToEventLoop } from "node:timers/promises";
|
|
20
21
|
import { EvidenceStore } from "@descryy/runtime-evidence-store";
|
|
21
22
|
import { ingestFileLog } from "@descryy/runtime-remote-log-ingestion";
|
|
22
23
|
import { COLLECTOR_VERSION } from "./collector-version.js";
|
|
24
|
+
const WRITE_BATCH_SIZE = 256;
|
|
23
25
|
/**
|
|
24
26
|
* Pure decision function — DEC-271's table read off `EnvironmentProfile.mode`.
|
|
25
27
|
* Never touches network or filesystem; `runRemoteLogObservation` below does the
|
|
@@ -62,46 +64,106 @@ export async function runRemoteLogObservation(input) {
|
|
|
62
64
|
const reason = mechanism.kind === "none"
|
|
63
65
|
? mechanism.reason
|
|
64
66
|
: `profile "${profile.name}" resolves to mechanism "${mechanism.kind}", not remote log ingestion -- runRemoteLogObservation never constructs an InboundProxy, so it refuses rather than silently doing nothing.`;
|
|
65
|
-
return { evidence: [], validationError: reason };
|
|
67
|
+
return { evidence: [], disclosures: [], validationError: reason };
|
|
66
68
|
}
|
|
67
69
|
const { config } = mechanism;
|
|
68
70
|
if (config.location.kind !== "file") {
|
|
69
71
|
return {
|
|
70
72
|
evidence: [],
|
|
73
|
+
disclosures: [],
|
|
71
74
|
validationError: `remoteLogSource.location.kind "${config.location.kind}" has no ingestion adapter yet -- only "file" is built (see file-log-adapter.ts's own doc); not observable here.`,
|
|
72
75
|
};
|
|
73
76
|
}
|
|
74
77
|
const fileConfig = { ...config, location: config.location };
|
|
75
|
-
let
|
|
78
|
+
let ingestion;
|
|
76
79
|
try {
|
|
77
|
-
|
|
80
|
+
ingestion = await ingestFileLog({
|
|
81
|
+
config: fileConfig,
|
|
82
|
+
...(input.observationStartedAt !== undefined ? { since: input.observationStartedAt } : {}),
|
|
83
|
+
...(input.window ?? {}),
|
|
84
|
+
});
|
|
78
85
|
}
|
|
79
86
|
catch (error) {
|
|
80
87
|
const detail = error instanceof Error ? error.message : String(error);
|
|
81
|
-
return { evidence: [], validationError: `remote log ingestion failed for profile "${profile.name}": ${detail}` };
|
|
88
|
+
return { evidence: [], disclosures: [], validationError: `remote log ingestion failed for profile "${profile.name}": ${detail}` };
|
|
82
89
|
}
|
|
90
|
+
const incompleteness = [...ingestion.disclosures];
|
|
83
91
|
const evidence = [];
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
92
|
+
let failedWrites = 0;
|
|
93
|
+
let firstWriteFailure = null;
|
|
94
|
+
for (let index = 0; index < ingestion.lines.length; index++) {
|
|
95
|
+
if (index > 0 && index % WRITE_BATCH_SIZE === 0)
|
|
96
|
+
await yieldToEventLoop();
|
|
97
|
+
const line = ingestion.lines[index];
|
|
98
|
+
try {
|
|
99
|
+
evidence.push(store.write({
|
|
100
|
+
executionId,
|
|
101
|
+
timestamp: line.timestamp ?? new Date().toISOString(),
|
|
102
|
+
source: "backend-process",
|
|
103
|
+
service: null,
|
|
104
|
+
process: null,
|
|
105
|
+
eventType: "BACKEND_LOG",
|
|
106
|
+
payload: {
|
|
107
|
+
raw: line.raw,
|
|
108
|
+
ingestedVia: "remote-log-ingestion",
|
|
109
|
+
profile: profile.name,
|
|
110
|
+
lineTimestamp: line.timestamp,
|
|
111
|
+
lineTimestampKnown: line.timestamp !== null,
|
|
112
|
+
...(line.truncated === true ? { lineTruncated: true } : {}),
|
|
113
|
+
},
|
|
114
|
+
traceId: line.traceId,
|
|
115
|
+
requestId: line.requestId,
|
|
116
|
+
correlationId: null,
|
|
117
|
+
graphNodeId: null,
|
|
118
|
+
sourceLocation: null,
|
|
119
|
+
stackTrace: null,
|
|
120
|
+
// the line itself isn't probabilistic; a later correlation to a captured
|
|
121
|
+
// request is a separate, lower-confidence question (correlateLogLine's tiers)
|
|
122
|
+
confidence: 1,
|
|
123
|
+
collectorVersion: COLLECTOR_VERSION,
|
|
124
|
+
...(line.preExisting === true ? { preExisting: true } : {}),
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
failedWrites += 1;
|
|
129
|
+
firstWriteFailure ??= error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (failedWrites > 0) {
|
|
133
|
+
incompleteness.push(`${String(failedWrites)} ingested lines could not be written to the evidence store (first failure: ${firstWriteFailure ?? "unknown"}); they are missing from the evidence.`);
|
|
134
|
+
}
|
|
135
|
+
const disclosures = [...incompleteness];
|
|
136
|
+
if (input.observationStartedAt === undefined) {
|
|
137
|
+
disclosures.push("no observation start was given, so no ingested line is marked as predating this run; ingested lines may be older than the run.");
|
|
138
|
+
}
|
|
139
|
+
if (incompleteness.length > 0) {
|
|
140
|
+
try {
|
|
141
|
+
evidence.push(store.write({
|
|
142
|
+
executionId,
|
|
143
|
+
timestamp: new Date().toISOString(),
|
|
144
|
+
source: "backend-process",
|
|
145
|
+
service: null,
|
|
146
|
+
process: null,
|
|
147
|
+
eventType: "COLLECTOR_ERROR",
|
|
148
|
+
payload: {
|
|
149
|
+
raw: `remote log ingestion for profile "${profile.name}" is incomplete: ${incompleteness.join(" ")}`,
|
|
150
|
+
collectorId: "remote-log-ingestion",
|
|
151
|
+
error: incompleteness.join(" "),
|
|
152
|
+
},
|
|
153
|
+
traceId: null,
|
|
154
|
+
requestId: null,
|
|
155
|
+
correlationId: null,
|
|
156
|
+
graphNodeId: null,
|
|
157
|
+
sourceLocation: null,
|
|
158
|
+
stackTrace: null,
|
|
159
|
+
confidence: 1,
|
|
160
|
+
collectorVersion: COLLECTOR_VERSION,
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
disclosures.push(`the disclosure above could not be written as evidence: ${error instanceof Error ? error.message : String(error)}`);
|
|
165
|
+
}
|
|
104
166
|
}
|
|
105
|
-
return { evidence, validationError: null };
|
|
167
|
+
return { evidence, disclosures, validationError: null };
|
|
106
168
|
}
|
|
107
169
|
//# sourceMappingURL=profile-backend-observation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile-backend-observation.js","sourceRoot":"","sources":["../src/profile-backend-observation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"profile-backend-observation.js","sourceRoot":"","sources":["../src/profile-backend-observation.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,7 @@ export interface RespawnAndSuperviseOptions {
|
|
|
45
45
|
readonly respawn: RespawnCommand;
|
|
46
46
|
/** How long to wait for the old target to exit after SIGTERM before escalating to SIGKILL. Same default as `ManagedProcess.kill()`. */
|
|
47
47
|
readonly gracePeriodMs?: number;
|
|
48
|
+
readonly expectedProcessStartTimeMs?: number;
|
|
48
49
|
readonly serviceName?: string;
|
|
49
50
|
readonly port?: number;
|
|
50
51
|
readonly resourceLimits?: SpawnProcessOptions["resourceLimits"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respawn-and-supervise.d.ts","sourceRoot":"","sources":["../src/respawn-and-supervise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"respawn-and-supervise.d.ts","sourceRoot":"","sources":["../src/respawn-and-supervise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAwD,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAIlJ,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,uBAAuB,CAAC;AAE/E;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,oGAAoG;IACpG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,qHAAqH;IACrH,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,uIAAuI;IACvI,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAChE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IACpE,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,yBAAyB;IACxC,sHAAsH;IACtH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6KAA6K;IAC7K,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;CAC9C;AAkFD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAgCjH;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,cAAc,GAAG,IAAI,CA4C5H"}
|
|
@@ -23,10 +23,35 @@
|
|
|
23
23
|
* group-kill escape hatch (`signalGroup`), which is only valid for a group it
|
|
24
24
|
* created itself.
|
|
25
25
|
*/
|
|
26
|
-
import { spawnProcess } from "@descryy/runtime-controller";
|
|
26
|
+
import { assertTargetPid, getProcessStartTimeMs, spawnProcess } from "@descryy/runtime-controller";
|
|
27
27
|
import { readFileSync, readlinkSync } from "node:fs";
|
|
28
28
|
import { isProcessAlive } from "./attach-to-running-process.js";
|
|
29
29
|
const DEFAULT_GRACE_PERIOD_MS = 5000;
|
|
30
|
+
const START_TIME_TOLERANCE_MS = 2000;
|
|
31
|
+
function sameCommandLine(pid, respawn) {
|
|
32
|
+
try {
|
|
33
|
+
const parts = readFileSync(`/proc/${String(pid)}/cmdline`, "utf8").split("\0").filter((part) => part !== "");
|
|
34
|
+
const declared = [respawn.command, ...(respawn.args ?? [])];
|
|
35
|
+
return parts.length === declared.length && parts.every((part, index) => part === declared[index]);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function assertSameProcess(options) {
|
|
42
|
+
if (options.expectedProcessStartTimeMs !== undefined) {
|
|
43
|
+
const start = getProcessStartTimeMs(options.targetPid);
|
|
44
|
+
if (!start.ok) {
|
|
45
|
+
throw new Error(`respawnAndSupervise: could not confirm pid ${String(options.targetPid)} is the process that was observed, so it was not killed: ${start.reason}`);
|
|
46
|
+
}
|
|
47
|
+
if (Math.abs(start.startTimeMs - options.expectedProcessStartTimeMs) > START_TIME_TOLERANCE_MS) {
|
|
48
|
+
throw new Error(`respawnAndSupervise: pid ${String(options.targetPid)} started at a different time than the process that was observed, so the pid was reused; it was not killed.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (options.respawn.source === "proc-cmdline-inferred" && sameCommandLine(options.targetPid, options.respawn) === false) {
|
|
52
|
+
throw new Error(`respawnAndSupervise: pid ${String(options.targetPid)} no longer runs the command line it was inferred from, so it was not killed.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
30
55
|
function sleep(ms) {
|
|
31
56
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
32
57
|
}
|
|
@@ -50,6 +75,7 @@ async function waitForDeath(pid, deadlineMs) {
|
|
|
50
75
|
* success.
|
|
51
76
|
*/
|
|
52
77
|
async function killTarget(pid, gracePeriodMs) {
|
|
78
|
+
assertTargetPid(pid);
|
|
53
79
|
if (!isProcessAlive(pid))
|
|
54
80
|
return { killedViaSigkill: false };
|
|
55
81
|
try {
|
|
@@ -85,10 +111,12 @@ async function killTarget(pid, gracePeriodMs) {
|
|
|
85
111
|
* refuse-rather-than-operate-on-nonexistent-target contract.
|
|
86
112
|
*/
|
|
87
113
|
export async function respawnAndSupervise(options) {
|
|
114
|
+
assertTargetPid(options.targetPid);
|
|
88
115
|
if (!isProcessAlive(options.targetPid)) {
|
|
89
116
|
throw new Error(`respawnAndSupervise: pid ${String(options.targetPid)} for "${options.processId}" is not running -- ` +
|
|
90
117
|
"respawn-and-supervise requires a target that already exists, the same as attach mode does.");
|
|
91
118
|
}
|
|
119
|
+
assertSameProcess(options);
|
|
92
120
|
const { killedViaSigkill } = await killTarget(options.targetPid, options.gracePeriodMs ?? DEFAULT_GRACE_PERIOD_MS);
|
|
93
121
|
const managedProcess = spawnProcess({
|
|
94
122
|
processId: options.processId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respawn-and-supervise.js","sourceRoot":"","sources":["../src/respawn-and-supervise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,YAAY,EAAiD,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"respawn-and-supervise.js","sourceRoot":"","sources":["../src/respawn-and-supervise.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@descryy/runtime-orchestrator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Assembles the runtime: controller-spawned services, live process output, collectors from a RuntimeAdapter, and a CollectorContext that can resolve script origins to source roots.",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -26,24 +26,24 @@
|
|
|
26
26
|
"access": "public"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@descryy/runtime-contracts": "0.
|
|
30
|
-
"@descryy/runtime-backend-observation": "0.3.
|
|
31
|
-
"@descryy/runtime-controller": "0.
|
|
32
|
-
"@descryy/runtime-evidence-store": "0.4.
|
|
33
|
-
"@descryy/runtime-adapter-typescript": "0.3.
|
|
34
|
-
"@descryy/runtime-environment-profile": "0.4.
|
|
35
|
-
"@descryy/runtime-remote-log-ingestion": "0.4.
|
|
36
|
-
"@descryy/runtime-external-service-observation": "0.3.
|
|
29
|
+
"@descryy/runtime-contracts": "0.4.1",
|
|
30
|
+
"@descryy/runtime-backend-observation": "0.3.8",
|
|
31
|
+
"@descryy/runtime-controller": "0.4.1",
|
|
32
|
+
"@descryy/runtime-evidence-store": "0.4.4",
|
|
33
|
+
"@descryy/runtime-adapter-typescript": "0.3.11",
|
|
34
|
+
"@descryy/runtime-environment-profile": "0.4.7",
|
|
35
|
+
"@descryy/runtime-remote-log-ingestion": "0.4.7",
|
|
36
|
+
"@descryy/runtime-external-service-observation": "0.3.7"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@descryy/runtime-adapter-csharp": "0.1.
|
|
40
|
-
"@descryy/runtime-adapter-go": "0.1.
|
|
41
|
-
"@descryy/runtime-adapter-jvm": "0.1.
|
|
42
|
-
"@descryy/runtime-adapter-php": "0.1.
|
|
43
|
-
"@descryy/runtime-adapter-python": "0.4.
|
|
44
|
-
"@descryy/runtime-adapter-ruby": "0.0.
|
|
45
|
-
"@descryy/runtime-adapter-rust": "0.1.
|
|
46
|
-
"@descryy/runtime-adapter-swift": "0.1.
|
|
39
|
+
"@descryy/runtime-adapter-csharp": "0.1.7",
|
|
40
|
+
"@descryy/runtime-adapter-go": "0.1.7",
|
|
41
|
+
"@descryy/runtime-adapter-jvm": "0.1.7",
|
|
42
|
+
"@descryy/runtime-adapter-php": "0.1.7",
|
|
43
|
+
"@descryy/runtime-adapter-python": "0.4.7",
|
|
44
|
+
"@descryy/runtime-adapter-ruby": "0.0.6",
|
|
45
|
+
"@descryy/runtime-adapter-rust": "0.1.7",
|
|
46
|
+
"@descryy/runtime-adapter-swift": "0.1.7"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"build": "tsc -b"
|