@inquir/compute 0.2.0 → 0.3.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/README.md +6 -3
- package/dist/apps.d.ts +231 -5
- package/dist/apps.d.ts.map +1 -1
- package/dist/apps.js +73 -7
- package/dist/apps.js.map +1 -1
- package/dist/discovery.d.ts +9 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +74 -7
- package/dist/discovery.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/local-runner-harness.js +28 -6
- package/dist/local-runner-harness.js.map +1 -1
- package/dist/local-runner.d.ts.map +1 -1
- package/dist/local-runner.js +103 -6
- package/dist/local-runner.js.map +1 -1
- package/dist/projects.d.ts +138 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +52 -0
- package/dist/projects.js.map +1 -0
- package/dist/transport.d.ts +36 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +181 -7
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +10 -6
package/dist/discovery.js
CHANGED
|
@@ -4,6 +4,9 @@ import { createRequire } from 'node:module';
|
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
6
6
|
import { computeSourceHash } from './hashing.js';
|
|
7
|
+
const DEFAULT_DISCOVERY_TIMEOUT_MS = 120_000;
|
|
8
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
|
|
9
|
+
const DEFAULT_KILL_GRACE_MS = 1_000;
|
|
7
10
|
const CANDIDATE_FILE_PATTERN = /(?:^index\.[cm]?[jt]s$|^function\.[cm]?[jt]s$|^pipeline\.[cm]?[jt]s$|\.function\.[cm]?[jt]s$|\.pipeline\.[cm]?[jt]s$)/;
|
|
8
11
|
const modulePath = typeof __filename === 'string' ? __filename : fileURLToPath(import.meta.url);
|
|
9
12
|
const require = createRequire(modulePath);
|
|
@@ -32,25 +35,89 @@ function collectCandidateFiles(rootDir, output) {
|
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
}
|
|
35
|
-
function runDiscoveryHarness(candidateFiles) {
|
|
38
|
+
function runDiscoveryHarness(candidateFiles, options) {
|
|
36
39
|
if (candidateFiles.length === 0) {
|
|
37
40
|
return Promise.resolve({ assets: [], diagnostics: [] });
|
|
38
41
|
}
|
|
39
42
|
const harnessPath = path.join(path.dirname(modulePath), `discovery-harness${path.extname(modulePath)}`);
|
|
40
43
|
const tsxImportPath = resolveTsxImportPath();
|
|
44
|
+
const timeoutMs = Math.floor(options.timeoutMs ?? DEFAULT_DISCOVERY_TIMEOUT_MS);
|
|
45
|
+
const maxOutputBytes = Math.floor(options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES);
|
|
46
|
+
const killGraceMs = Math.floor(options.killGraceMs ?? DEFAULT_KILL_GRACE_MS);
|
|
47
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
|
|
48
|
+
throw new RangeError('discovery timeoutMs must be positive');
|
|
49
|
+
if (!Number.isFinite(maxOutputBytes) || maxOutputBytes <= 0)
|
|
50
|
+
throw new RangeError('discovery maxOutputBytes must be positive');
|
|
51
|
+
if (!Number.isFinite(killGraceMs) || killGraceMs < 0)
|
|
52
|
+
throw new RangeError('discovery killGraceMs must be non-negative');
|
|
41
53
|
return new Promise((resolve) => {
|
|
42
54
|
const child = spawn(process.execPath, ['--import', tsxImportPath, harnessPath, ...candidateFiles], {
|
|
43
55
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
44
56
|
});
|
|
45
|
-
|
|
46
|
-
|
|
57
|
+
const stdoutChunks = [];
|
|
58
|
+
const stderrChunks = [];
|
|
59
|
+
let capturedBytes = 0;
|
|
60
|
+
let terminalError;
|
|
61
|
+
let settled = false;
|
|
62
|
+
let forceKillTimer;
|
|
63
|
+
const timeoutTimer = setTimeout(() => terminate(`Discovery exceeded timeout of ${timeoutMs} ms`), timeoutMs);
|
|
64
|
+
timeoutTimer.unref?.();
|
|
65
|
+
function terminate(message) {
|
|
66
|
+
if (terminalError || settled)
|
|
67
|
+
return;
|
|
68
|
+
terminalError = message;
|
|
69
|
+
try {
|
|
70
|
+
child.kill('SIGTERM');
|
|
71
|
+
}
|
|
72
|
+
catch { /* close will settle */ }
|
|
73
|
+
forceKillTimer = setTimeout(() => {
|
|
74
|
+
if (!settled) {
|
|
75
|
+
try {
|
|
76
|
+
child.kill('SIGKILL');
|
|
77
|
+
}
|
|
78
|
+
catch { /* close will settle */ }
|
|
79
|
+
}
|
|
80
|
+
}, killGraceMs);
|
|
81
|
+
forceKillTimer.unref?.();
|
|
82
|
+
}
|
|
83
|
+
const capture = (target, chunk) => {
|
|
84
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
85
|
+
const remaining = Math.max(0, maxOutputBytes - capturedBytes);
|
|
86
|
+
if (remaining > 0)
|
|
87
|
+
target.push(buffer.subarray(0, remaining));
|
|
88
|
+
capturedBytes += buffer.length;
|
|
89
|
+
if (capturedBytes > maxOutputBytes) {
|
|
90
|
+
terminate(`Discovery harness output exceeded ${maxOutputBytes} bytes`);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
47
93
|
child.stdout.on('data', (chunk) => {
|
|
48
|
-
|
|
94
|
+
capture(stdoutChunks, chunk);
|
|
49
95
|
});
|
|
50
96
|
child.stderr.on('data', (chunk) => {
|
|
51
|
-
|
|
97
|
+
capture(stderrChunks, chunk);
|
|
98
|
+
});
|
|
99
|
+
child.once('error', (error) => {
|
|
100
|
+
if (settled)
|
|
101
|
+
return;
|
|
102
|
+
settled = true;
|
|
103
|
+
clearTimeout(timeoutTimer);
|
|
104
|
+
if (forceKillTimer)
|
|
105
|
+
clearTimeout(forceKillTimer);
|
|
106
|
+
resolve({ assets: [], diagnostics: [{ code: 'IMPORT_FAILED', message: error.message }] });
|
|
52
107
|
});
|
|
53
108
|
child.on('close', () => {
|
|
109
|
+
if (settled)
|
|
110
|
+
return;
|
|
111
|
+
settled = true;
|
|
112
|
+
clearTimeout(timeoutTimer);
|
|
113
|
+
if (forceKillTimer)
|
|
114
|
+
clearTimeout(forceKillTimer);
|
|
115
|
+
const stdout = Buffer.concat(stdoutChunks).toString('utf8');
|
|
116
|
+
const stderr = Buffer.concat(stderrChunks).toString('utf8');
|
|
117
|
+
if (terminalError) {
|
|
118
|
+
resolve({ assets: [], diagnostics: [{ code: 'IMPORT_FAILED', message: terminalError }] });
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
54
121
|
if (!stdout.trim()) {
|
|
55
122
|
resolve({
|
|
56
123
|
assets: [],
|
|
@@ -75,11 +142,11 @@ function runDiscoveryHarness(candidateFiles) {
|
|
|
75
142
|
});
|
|
76
143
|
});
|
|
77
144
|
}
|
|
78
|
-
export async function discoverAssets(config) {
|
|
145
|
+
export async function discoverAssets(config, options = {}) {
|
|
79
146
|
const candidateFiles = [];
|
|
80
147
|
collectCandidateFiles(config.absoluteFunctionsDir, candidateFiles);
|
|
81
148
|
collectCandidateFiles(config.absolutePipelinesDir, candidateFiles);
|
|
82
|
-
const harnessResult = await runDiscoveryHarness(candidateFiles);
|
|
149
|
+
const harnessResult = await runDiscoveryHarness(candidateFiles, options);
|
|
83
150
|
const diagnostics = [...harnessResult.diagnostics];
|
|
84
151
|
// Orphan asset detection
|
|
85
152
|
for (const filePath of (harnessResult.noAssetFiles ?? [])) {
|
package/dist/discovery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * from './define-pipeline.js';
|
|
|
6
6
|
export * from './discovery.js';
|
|
7
7
|
export * from './hashing.js';
|
|
8
8
|
export * from './local-runner.js';
|
|
9
|
+
export * from './projects.js';
|
|
9
10
|
export * from './transport.js';
|
|
10
11
|
export * from './types.js';
|
|
11
12
|
export { createZipBase64 } from './zip.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export * from './define-pipeline.js';
|
|
|
6
6
|
export * from './discovery.js';
|
|
7
7
|
export * from './hashing.js';
|
|
8
8
|
export * from './local-runner.js';
|
|
9
|
+
export * from './projects.js';
|
|
9
10
|
export * from './transport.js';
|
|
10
11
|
export * from './types.js';
|
|
11
12
|
export { createZipBase64 } from './zip.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -6,8 +6,10 @@ function serializeError(error) {
|
|
|
6
6
|
}
|
|
7
7
|
return { message: String(error) };
|
|
8
8
|
}
|
|
9
|
-
function captureConsole() {
|
|
9
|
+
function captureConsole(maxLogBytes) {
|
|
10
10
|
const logs = [];
|
|
11
|
+
let capturedBytes = 0;
|
|
12
|
+
let droppedLogs = 0;
|
|
11
13
|
const original = {
|
|
12
14
|
log: console.log,
|
|
13
15
|
info: console.info,
|
|
@@ -16,7 +18,7 @@ function captureConsole() {
|
|
|
16
18
|
debug: console.debug,
|
|
17
19
|
};
|
|
18
20
|
const push = (level, args) => {
|
|
19
|
-
|
|
21
|
+
const line = `[${level}] ${args.map((value) => {
|
|
20
22
|
if (typeof value === 'string') {
|
|
21
23
|
return value;
|
|
22
24
|
}
|
|
@@ -26,7 +28,17 @@ function captureConsole() {
|
|
|
26
28
|
catch {
|
|
27
29
|
return String(value);
|
|
28
30
|
}
|
|
29
|
-
}).join(' ')}
|
|
31
|
+
}).join(' ')}`;
|
|
32
|
+
// Count the JSON-encoded form because escaping can make the response much
|
|
33
|
+
// larger than the raw console text captured here.
|
|
34
|
+
const bytes = Buffer.byteLength(JSON.stringify(line), 'utf8') + 1;
|
|
35
|
+
if (capturedBytes + bytes <= maxLogBytes) {
|
|
36
|
+
logs.push(line);
|
|
37
|
+
capturedBytes += bytes;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
droppedLogs++;
|
|
41
|
+
}
|
|
30
42
|
};
|
|
31
43
|
console.log = (...args) => push('log', args);
|
|
32
44
|
console.info = (...args) => push('info', args);
|
|
@@ -35,6 +47,11 @@ function captureConsole() {
|
|
|
35
47
|
console.debug = (...args) => push('debug', args);
|
|
36
48
|
return {
|
|
37
49
|
logs,
|
|
50
|
+
appendDropNotice: () => {
|
|
51
|
+
if (droppedLogs > 0) {
|
|
52
|
+
logs.push(`[inquir] ${droppedLogs} log entr${droppedLogs === 1 ? 'y was' : 'ies were'} dropped after reaching ${maxLogBytes} bytes`);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
38
55
|
restore: () => {
|
|
39
56
|
console.log = original.log;
|
|
40
57
|
console.info = original.info;
|
|
@@ -45,11 +62,13 @@ function captureConsole() {
|
|
|
45
62
|
};
|
|
46
63
|
}
|
|
47
64
|
async function main() {
|
|
48
|
-
const [, , filePath, exportName, payloadJson] = process.argv;
|
|
65
|
+
const [, , filePath, exportName, payloadJson, timeoutArg, maxLogBytesArg] = process.argv;
|
|
49
66
|
if (!filePath || !exportName) {
|
|
50
67
|
throw new Error('Usage: local-runner-harness <filePath> <exportName> <payloadJson>');
|
|
51
68
|
}
|
|
52
|
-
const
|
|
69
|
+
const timeoutMs = Number(timeoutArg) > 0 ? Math.floor(Number(timeoutArg)) : undefined;
|
|
70
|
+
const maxLogBytes = Number(maxLogBytesArg) > 0 ? Math.floor(Number(maxLogBytesArg)) : 4 * 1024 * 1024;
|
|
71
|
+
const { logs, restore, appendDropNotice } = captureConsole(maxLogBytes);
|
|
53
72
|
try {
|
|
54
73
|
const moduleExports = await import(pathToFileURL(filePath).href);
|
|
55
74
|
const asset = moduleExports[exportName] ?? moduleExports.default;
|
|
@@ -64,8 +83,10 @@ async function main() {
|
|
|
64
83
|
throw new Error(`Export "${exportName}" does not expose a callable handler`);
|
|
65
84
|
}
|
|
66
85
|
const parsedInput = inputSchema?.parse ? inputSchema.parse(payload) : payload;
|
|
67
|
-
const
|
|
86
|
+
const signal = timeoutMs !== undefined ? AbortSignal.timeout(timeoutMs) : undefined;
|
|
87
|
+
const result = await handler(parsedInput, { signal });
|
|
68
88
|
const parsedResult = outputSchema?.parse ? outputSchema.parse(result) : result;
|
|
89
|
+
appendDropNotice();
|
|
69
90
|
const response = {
|
|
70
91
|
result: parsedResult,
|
|
71
92
|
logs,
|
|
@@ -73,6 +94,7 @@ async function main() {
|
|
|
73
94
|
process.stdout.write(JSON.stringify(response));
|
|
74
95
|
}
|
|
75
96
|
catch (error) {
|
|
97
|
+
appendDropNotice();
|
|
76
98
|
const response = {
|
|
77
99
|
logs,
|
|
78
100
|
error: serializeError(error),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-runner-harness.js","sourceRoot":"","sources":["../src/local-runner-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQjD,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,cAAc;
|
|
1
|
+
{"version":3,"file":"local-runner-harness.js","sourceRoot":"","sources":["../src/local-runner-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-runner.d.ts","sourceRoot":"","sources":["../src/local-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"local-runner.d.ts","sourceRoot":"","sources":["../src/local-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgC9E,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC,EACpE,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,eAAoB,GAC5B,MAAM,EAAE,CAuBV;AAED,wBAAsB,UAAU,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACpE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC,EACpE,OAAO,EAAE,QAAQ,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAuJlC"}
|
package/dist/local-runner.js
CHANGED
|
@@ -2,6 +2,8 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
5
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
|
|
6
|
+
const DEFAULT_KILL_GRACE_MS = 1_000;
|
|
5
7
|
const modulePath = typeof __filename === 'string' ? __filename : fileURLToPath(import.meta.url);
|
|
6
8
|
const require = createRequire(modulePath);
|
|
7
9
|
function resolveTsxImportPath() {
|
|
@@ -24,29 +26,124 @@ export function buildLocalRunnerArgs(asset, payload, options = {}) {
|
|
|
24
26
|
if (options.inspectBrk) {
|
|
25
27
|
args.push('--inspect-brk');
|
|
26
28
|
}
|
|
27
|
-
args.push(getHarnessPath(), path.resolve(asset.filePath), asset.exportName, JSON.stringify(payload ?? {}))
|
|
29
|
+
args.push(getHarnessPath(), path.resolve(asset.filePath), asset.exportName, JSON.stringify(payload ?? {}), String(options.inspectBrk ? 0 : (options.timeoutMs ?? 0)),
|
|
30
|
+
// Reserve at least half of the parent capture budget for the result/error
|
|
31
|
+
// envelope. Otherwise logs can legally fill the entire budget and make an
|
|
32
|
+
// otherwise valid JSON response look like an output-limit failure.
|
|
33
|
+
String(Math.max(1, Math.floor((options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES) / 2))));
|
|
28
34
|
return args;
|
|
29
35
|
}
|
|
30
36
|
export async function runLocally(asset, payload, options = {}) {
|
|
37
|
+
if (options.timeoutMs !== undefined && (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0)) {
|
|
38
|
+
throw new RangeError('timeoutMs must be a positive finite number');
|
|
39
|
+
}
|
|
40
|
+
if (options.maxOutputBytes !== undefined && (!Number.isFinite(options.maxOutputBytes) || options.maxOutputBytes <= 0)) {
|
|
41
|
+
throw new RangeError('maxOutputBytes must be a positive finite number');
|
|
42
|
+
}
|
|
43
|
+
if (options.killGraceMs !== undefined && (!Number.isFinite(options.killGraceMs) || options.killGraceMs < 0)) {
|
|
44
|
+
throw new RangeError('killGraceMs must be a non-negative finite number');
|
|
45
|
+
}
|
|
31
46
|
const startedAt = Date.now();
|
|
32
47
|
const args = buildLocalRunnerArgs(asset, payload, options);
|
|
48
|
+
const maxOutputBytes = Math.floor(options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES);
|
|
49
|
+
const killGraceMs = Math.floor(options.killGraceMs ?? DEFAULT_KILL_GRACE_MS);
|
|
50
|
+
// A debugger deliberately pauses before user code. A wall-clock deadline
|
|
51
|
+
// would otherwise kill a healthy session while it waits for attachment.
|
|
52
|
+
const timeoutMs = options.inspectBrk ? undefined : options.timeoutMs;
|
|
33
53
|
return await new Promise((resolve, reject) => {
|
|
34
54
|
const child = spawn(process.execPath, args, {
|
|
35
55
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
36
56
|
cwd: options.cwd,
|
|
37
57
|
});
|
|
38
|
-
|
|
39
|
-
|
|
58
|
+
const stdoutChunks = [];
|
|
59
|
+
const stderrChunks = [];
|
|
60
|
+
let capturedBytes = 0;
|
|
61
|
+
let settled = false;
|
|
62
|
+
let terminationReason;
|
|
63
|
+
let timeoutTimer;
|
|
64
|
+
let forceKillTimer;
|
|
65
|
+
const cleanup = () => {
|
|
66
|
+
if (timeoutTimer)
|
|
67
|
+
clearTimeout(timeoutTimer);
|
|
68
|
+
if (forceKillTimer)
|
|
69
|
+
clearTimeout(forceKillTimer);
|
|
70
|
+
options.signal?.removeEventListener('abort', onExternalAbort);
|
|
71
|
+
};
|
|
72
|
+
const terminate = (reason) => {
|
|
73
|
+
if (terminationReason || settled)
|
|
74
|
+
return;
|
|
75
|
+
terminationReason = reason;
|
|
76
|
+
try {
|
|
77
|
+
child.kill('SIGTERM');
|
|
78
|
+
}
|
|
79
|
+
catch { /* close/error will settle the run */ }
|
|
80
|
+
forceKillTimer = setTimeout(() => {
|
|
81
|
+
if (!settled) {
|
|
82
|
+
try {
|
|
83
|
+
child.kill('SIGKILL');
|
|
84
|
+
}
|
|
85
|
+
catch { /* close/error will settle the run */ }
|
|
86
|
+
}
|
|
87
|
+
}, killGraceMs);
|
|
88
|
+
forceKillTimer.unref?.();
|
|
89
|
+
};
|
|
90
|
+
const onExternalAbort = () => terminate('cancelled');
|
|
91
|
+
const capture = (target, chunk) => {
|
|
92
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
93
|
+
const remaining = Math.max(0, maxOutputBytes - capturedBytes);
|
|
94
|
+
if (remaining > 0)
|
|
95
|
+
target.push(buffer.subarray(0, remaining));
|
|
96
|
+
capturedBytes += buffer.length;
|
|
97
|
+
if (capturedBytes > maxOutputBytes)
|
|
98
|
+
terminate('output-limit');
|
|
99
|
+
};
|
|
40
100
|
child.stdout.on('data', (chunk) => {
|
|
41
|
-
|
|
101
|
+
capture(stdoutChunks, chunk);
|
|
42
102
|
});
|
|
43
103
|
child.stderr.on('data', (chunk) => {
|
|
44
|
-
|
|
104
|
+
capture(stderrChunks, chunk);
|
|
105
|
+
});
|
|
106
|
+
if (timeoutMs !== undefined) {
|
|
107
|
+
timeoutTimer = setTimeout(() => terminate('timeout'), Math.floor(timeoutMs));
|
|
108
|
+
timeoutTimer.unref?.();
|
|
109
|
+
}
|
|
110
|
+
if (options.signal) {
|
|
111
|
+
if (options.signal.aborted)
|
|
112
|
+
onExternalAbort();
|
|
113
|
+
else
|
|
114
|
+
options.signal.addEventListener('abort', onExternalAbort, { once: true });
|
|
115
|
+
}
|
|
116
|
+
child.once('error', (error) => {
|
|
117
|
+
if (settled)
|
|
118
|
+
return;
|
|
119
|
+
settled = true;
|
|
120
|
+
cleanup();
|
|
121
|
+
reject(error);
|
|
45
122
|
});
|
|
46
|
-
child.on('error', reject);
|
|
47
123
|
child.on('close', (code) => {
|
|
124
|
+
if (settled)
|
|
125
|
+
return;
|
|
126
|
+
settled = true;
|
|
127
|
+
cleanup();
|
|
48
128
|
const durationMs = Date.now() - startedAt;
|
|
129
|
+
const stdout = Buffer.concat(stdoutChunks).toString('utf8');
|
|
130
|
+
const stderr = Buffer.concat(stderrChunks).toString('utf8');
|
|
49
131
|
const debuggerUrl = options.inspectBrk ? parseDebuggerUrl(stderr) : undefined;
|
|
132
|
+
if (terminationReason) {
|
|
133
|
+
const message = terminationReason === 'timeout'
|
|
134
|
+
? `Local run exceeded timeout of ${Math.floor(timeoutMs)} ms`
|
|
135
|
+
: terminationReason === 'cancelled'
|
|
136
|
+
? 'Local run was cancelled'
|
|
137
|
+
: `Local harness output exceeded ${maxOutputBytes} bytes`;
|
|
138
|
+
resolve({
|
|
139
|
+
logs: stderr ? stderr.trim().split(/\r?\n/).filter(Boolean) : [],
|
|
140
|
+
durationMs,
|
|
141
|
+
debuggerUrl,
|
|
142
|
+
terminationReason,
|
|
143
|
+
error: { message, code: code ?? undefined },
|
|
144
|
+
});
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
50
147
|
let response;
|
|
51
148
|
try {
|
|
52
149
|
response = stdout ? JSON.parse(stdout) : { logs: [] };
|
package/dist/local-runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-runner.js","sourceRoot":"","sources":["../src/local-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AASxD,MAAM,UAAU,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChG,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;AAE1C,SAAS,oBAAoB;IAC3B,8EAA8E;IAC9E,6EAA6E;IAC7E,OAAO,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EACxB,uBAAuB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC5C,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAoE,EACpE,OAAgB,EAChB,UAA2B,EAAE;IAE7B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mEAAmE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,IAAI,CACP,cAAc,EAAE,EAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAC5B,KAAK,CAAC,UAAU,EAChB,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"local-runner.js","sourceRoot":"","sources":["../src/local-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project folders: inventory, membership, and the canvas/layout behind the
|
|
3
|
+
* dashboard's project view.
|
|
4
|
+
*
|
|
5
|
+
* A folder groups long-lived container applications (web services, APIs,
|
|
6
|
+
* databases, and workers). Serverless functions are managed separately.
|
|
7
|
+
* The canvas draws its
|
|
8
|
+
* application members as nodes, the recorded connections between them as
|
|
9
|
+
* edges, and remembers where each node was dragged on the membership row.
|
|
10
|
+
*/
|
|
11
|
+
import type { AppResources, AppScalingPolicy, AppVolumeSpec } from './apps.js';
|
|
12
|
+
import { type TransportClient } from './transport.js';
|
|
13
|
+
export interface Project {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
slug: string;
|
|
17
|
+
description: string | null;
|
|
18
|
+
/** Number of container applications in this project. */
|
|
19
|
+
resourceCount: number;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
}
|
|
23
|
+
export interface CreateProjectInput {
|
|
24
|
+
name: string;
|
|
25
|
+
slug?: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ProjectListResponse {
|
|
29
|
+
items: Project[];
|
|
30
|
+
nextCursor: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface ProjectResourceRef {
|
|
33
|
+
kind: 'application';
|
|
34
|
+
id: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ProjectMember extends ProjectResourceRef {
|
|
37
|
+
addedAt: string;
|
|
38
|
+
name: string;
|
|
39
|
+
createdAt: string;
|
|
40
|
+
updatedAt: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ProjectDetail extends Project {
|
|
43
|
+
resources: ProjectMember[];
|
|
44
|
+
nextCursor: string | null;
|
|
45
|
+
}
|
|
46
|
+
export declare function listProjects(client: TransportClient, options?: {
|
|
47
|
+
limit?: number;
|
|
48
|
+
cursor?: string;
|
|
49
|
+
}): Promise<ProjectListResponse>;
|
|
50
|
+
/** Resolve a live project by its id or slug. */
|
|
51
|
+
export declare function getProject(client: TransportClient, project: string): Promise<ProjectDetail>;
|
|
52
|
+
export declare function createProject(client: TransportClient, input: CreateProjectInput): Promise<Project>;
|
|
53
|
+
/** Idempotent: filing an existing member again returns the same membership. */
|
|
54
|
+
export declare function addProjectResource(client: TransportClient, project: string, resource: ProjectResourceRef): Promise<ProjectMember>;
|
|
55
|
+
export interface CanvasPosition {
|
|
56
|
+
x: number;
|
|
57
|
+
y: number;
|
|
58
|
+
}
|
|
59
|
+
/** Where the node's image comes from — the glyph on the card. */
|
|
60
|
+
export type CanvasSourceKind = 'github' | 'build' | 'image' | 'none';
|
|
61
|
+
/** Production health of a node, as the folder listing computes it. */
|
|
62
|
+
export interface ProjectCanvasProduction {
|
|
63
|
+
activeReleaseId: string;
|
|
64
|
+
status: string;
|
|
65
|
+
restartCount: number;
|
|
66
|
+
failureReason?: string;
|
|
67
|
+
/** First verified production URL; absent for a TCP-only service. */
|
|
68
|
+
url?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface ProjectCanvasApplication {
|
|
71
|
+
id: string;
|
|
72
|
+
name: string;
|
|
73
|
+
/** Permanent address label; absent when the apps plane is not composed. */
|
|
74
|
+
slug?: string;
|
|
75
|
+
template: string | null;
|
|
76
|
+
sourceKind: CanvasSourceKind;
|
|
77
|
+
production: ProjectCanvasProduction | null;
|
|
78
|
+
desiredReplicas?: number;
|
|
79
|
+
activation?: AppScalingPolicy['activation'];
|
|
80
|
+
ingress?: 'private' | 'public';
|
|
81
|
+
resources?: AppResources;
|
|
82
|
+
volumes: AppVolumeSpec[];
|
|
83
|
+
/** When the production release was created; absent when nothing is promoted. */
|
|
84
|
+
lastDeployAt?: string;
|
|
85
|
+
lastChangeAt: string;
|
|
86
|
+
createdAt: string;
|
|
87
|
+
updatedAt: string;
|
|
88
|
+
}
|
|
89
|
+
export interface ProjectCanvasNode {
|
|
90
|
+
/** `app:<applicationId>` — the id a layout write uses. */
|
|
91
|
+
id: string;
|
|
92
|
+
kind: 'application';
|
|
93
|
+
application: ProjectCanvasApplication;
|
|
94
|
+
/** null until somebody drags the node; the dashboard auto-arranges it then. */
|
|
95
|
+
position: CanvasPosition | null;
|
|
96
|
+
}
|
|
97
|
+
export interface ProjectCanvasEdge {
|
|
98
|
+
id: string;
|
|
99
|
+
consumerApplicationId: string;
|
|
100
|
+
providerApplicationId: string;
|
|
101
|
+
envKey: string;
|
|
102
|
+
providerTemplate: string | null;
|
|
103
|
+
/** The provider is not a member of this folder. */
|
|
104
|
+
external: boolean;
|
|
105
|
+
provider: {
|
|
106
|
+
id: string;
|
|
107
|
+
name: string;
|
|
108
|
+
archived: boolean;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** @deprecated Projects do not contain serverless functions. */
|
|
112
|
+
export type ProjectCanvasFunction = never;
|
|
113
|
+
export interface ProjectCanvas {
|
|
114
|
+
project: {
|
|
115
|
+
id: string;
|
|
116
|
+
name: string;
|
|
117
|
+
slug: string;
|
|
118
|
+
};
|
|
119
|
+
nodes: ProjectCanvasNode[];
|
|
120
|
+
edges: ProjectCanvasEdge[];
|
|
121
|
+
/** @deprecated Empty compatibility field; projects contain applications only. */
|
|
122
|
+
functions: readonly never[];
|
|
123
|
+
/** More than the server draws (500); the dashboard falls back to the list. */
|
|
124
|
+
truncated: boolean;
|
|
125
|
+
generatedAt: string;
|
|
126
|
+
}
|
|
127
|
+
/** `{ "app:<id>": {x, y} | null }` — null forgets a position. */
|
|
128
|
+
export type ProjectCanvasLayout = Record<`app:${string}`, CanvasPosition | null>;
|
|
129
|
+
/** `:project` is the folder's id or slug. */
|
|
130
|
+
export declare function getProjectCanvas(client: TransportClient, project: string): Promise<ProjectCanvas>;
|
|
131
|
+
/**
|
|
132
|
+
* Store node positions. Only members can be placed: a stranger's id is a 400
|
|
133
|
+
* and nothing is written. Positions are cosmetic — no release, no routing.
|
|
134
|
+
*/
|
|
135
|
+
export declare function saveProjectCanvasLayout(client: TransportClient, project: string, positions: ProjectCanvasLayout): Promise<{
|
|
136
|
+
updated: number;
|
|
137
|
+
}>;
|
|
138
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"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"}
|