@inquir/compute 0.2.0 → 0.4.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 +159 -1
- package/dist/app-observability.d.ts +69 -0
- package/dist/app-observability.d.ts.map +1 -0
- package/dist/app-observability.js +65 -0
- package/dist/app-observability.js.map +1 -0
- package/dist/app-observability.types.d.ts +358 -0
- package/dist/app-observability.types.d.ts.map +1 -0
- package/dist/app-observability.types.js +2 -0
- package/dist/app-observability.types.js.map +1 -0
- package/dist/apps.d.ts +304 -6
- package/dist/apps.d.ts.map +1 -1
- package/dist/apps.js +89 -7
- package/dist/apps.js.map +1 -1
- package/dist/build-timeout-policy.d.ts +13 -0
- package/dist/build-timeout-policy.d.ts.map +1 -0
- package/dist/build-timeout-policy.js +11 -0
- package/dist/build-timeout-policy.js.map +1 -0
- 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 +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/invocation-observation.d.ts +23 -0
- package/dist/invocation-observation.d.ts.map +1 -0
- package/dist/invocation-observation.js +79 -0
- package/dist/invocation-observation.js.map +1 -0
- 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 +147 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +64 -0
- package/dist/projects.js.map +1 -0
- package/dist/release-commands.d.ts +80 -0
- package/dist/release-commands.d.ts.map +1 -0
- package/dist/release-commands.js +147 -0
- package/dist/release-commands.js.map +1 -0
- package/dist/source-command-http.d.ts +7 -0
- package/dist/source-command-http.d.ts.map +1 -0
- package/dist/source-command-http.js +87 -0
- package/dist/source-command-http.js.map +1 -0
- package/dist/source-command-protocol.d.ts +137 -0
- package/dist/source-command-protocol.d.ts.map +1 -0
- package/dist/source-command-protocol.js +311 -0
- package/dist/source-command-protocol.js.map +1 -0
- package/dist/source-commands.d.ts +33 -0
- package/dist/source-commands.d.ts.map +1 -0
- package/dist/source-commands.js +116 -0
- package/dist/source-commands.js.map +1 -0
- package/dist/transport.d.ts +63 -2
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +237 -14
- 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 +7 -3
|
@@ -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,147 @@
|
|
|
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). Archiving a project archives its applications too;
|
|
7
|
+
* removing a membership leaves the application running. Serverless functions
|
|
8
|
+
* are managed separately.
|
|
9
|
+
* The canvas draws its
|
|
10
|
+
* application members as nodes, the recorded connections between them as
|
|
11
|
+
* edges, and remembers where each node was dragged on the membership row.
|
|
12
|
+
*/
|
|
13
|
+
import type { AppResources, AppScalingPolicy, AppVolumeSpec } from './apps.js';
|
|
14
|
+
import { type TransportClient } from './transport.js';
|
|
15
|
+
export interface Project {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
slug: string;
|
|
19
|
+
description: string | null;
|
|
20
|
+
/** Number of container applications in this project. */
|
|
21
|
+
resourceCount: number;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CreateProjectInput {
|
|
26
|
+
name: string;
|
|
27
|
+
slug?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ProjectListResponse {
|
|
31
|
+
items: Project[];
|
|
32
|
+
nextCursor: string | null;
|
|
33
|
+
}
|
|
34
|
+
export interface ProjectResourceRef {
|
|
35
|
+
kind: 'application';
|
|
36
|
+
id: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ProjectMember extends ProjectResourceRef {
|
|
39
|
+
addedAt: string;
|
|
40
|
+
name: string;
|
|
41
|
+
createdAt: string;
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ProjectDetail extends Project {
|
|
45
|
+
resources: ProjectMember[];
|
|
46
|
+
nextCursor: string | null;
|
|
47
|
+
}
|
|
48
|
+
export declare function listProjects(client: TransportClient, options?: {
|
|
49
|
+
limit?: number;
|
|
50
|
+
cursor?: string;
|
|
51
|
+
}): Promise<ProjectListResponse>;
|
|
52
|
+
/** Resolve a live project by its id or slug. */
|
|
53
|
+
export declare function getProject(client: TransportClient, project: string): Promise<ProjectDetail>;
|
|
54
|
+
export declare function createProject(client: TransportClient, input: CreateProjectInput): Promise<Project>;
|
|
55
|
+
/** Idempotent: filing an existing member again returns the same membership. */
|
|
56
|
+
export declare function addProjectResource(client: TransportClient, project: string, resource: ProjectResourceRef): Promise<ProjectMember>;
|
|
57
|
+
/**
|
|
58
|
+
* Unfile an application from one project. It keeps running, and its other
|
|
59
|
+
* memberships stay; a 404 means it was not a member.
|
|
60
|
+
*/
|
|
61
|
+
export declare function removeProjectResource(client: TransportClient, project: string, resource: ProjectResourceRef): Promise<{
|
|
62
|
+
removed: true;
|
|
63
|
+
}>;
|
|
64
|
+
export interface CanvasPosition {
|
|
65
|
+
x: number;
|
|
66
|
+
y: number;
|
|
67
|
+
}
|
|
68
|
+
/** Where the node's image comes from — the glyph on the card. */
|
|
69
|
+
export type CanvasSourceKind = 'github' | 'build' | 'image' | 'none';
|
|
70
|
+
/** Production health of a node, as the folder listing computes it. */
|
|
71
|
+
export interface ProjectCanvasProduction {
|
|
72
|
+
activeReleaseId: string;
|
|
73
|
+
status: string;
|
|
74
|
+
restartCount: number;
|
|
75
|
+
failureReason?: string;
|
|
76
|
+
/** First verified production URL; absent for a TCP-only service. */
|
|
77
|
+
url?: string;
|
|
78
|
+
}
|
|
79
|
+
export interface ProjectCanvasApplication {
|
|
80
|
+
id: string;
|
|
81
|
+
name: string;
|
|
82
|
+
/** Permanent address label; absent when the apps plane is not composed. */
|
|
83
|
+
slug?: string;
|
|
84
|
+
template: string | null;
|
|
85
|
+
sourceKind: CanvasSourceKind;
|
|
86
|
+
production: ProjectCanvasProduction | null;
|
|
87
|
+
desiredReplicas?: number;
|
|
88
|
+
activation?: AppScalingPolicy['activation'];
|
|
89
|
+
ingress?: 'private' | 'public';
|
|
90
|
+
resources?: AppResources;
|
|
91
|
+
volumes: AppVolumeSpec[];
|
|
92
|
+
/** When the production release was created; absent when nothing is promoted. */
|
|
93
|
+
lastDeployAt?: string;
|
|
94
|
+
lastChangeAt: string;
|
|
95
|
+
createdAt: string;
|
|
96
|
+
updatedAt: string;
|
|
97
|
+
}
|
|
98
|
+
export interface ProjectCanvasNode {
|
|
99
|
+
/** `app:<applicationId>` — the id a layout write uses. */
|
|
100
|
+
id: string;
|
|
101
|
+
kind: 'application';
|
|
102
|
+
application: ProjectCanvasApplication;
|
|
103
|
+
/** null until somebody drags the node; the dashboard auto-arranges it then. */
|
|
104
|
+
position: CanvasPosition | null;
|
|
105
|
+
}
|
|
106
|
+
export interface ProjectCanvasEdge {
|
|
107
|
+
id: string;
|
|
108
|
+
consumerApplicationId: string;
|
|
109
|
+
providerApplicationId: string;
|
|
110
|
+
envKey: string;
|
|
111
|
+
providerTemplate: string | null;
|
|
112
|
+
/** The provider is not a member of this folder. */
|
|
113
|
+
external: boolean;
|
|
114
|
+
provider: {
|
|
115
|
+
id: string;
|
|
116
|
+
name: string;
|
|
117
|
+
archived: boolean;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** @deprecated Projects do not contain serverless functions. */
|
|
121
|
+
export type ProjectCanvasFunction = never;
|
|
122
|
+
export interface ProjectCanvas {
|
|
123
|
+
project: {
|
|
124
|
+
id: string;
|
|
125
|
+
name: string;
|
|
126
|
+
slug: string;
|
|
127
|
+
};
|
|
128
|
+
nodes: ProjectCanvasNode[];
|
|
129
|
+
edges: ProjectCanvasEdge[];
|
|
130
|
+
/** @deprecated Empty compatibility field; projects contain applications only. */
|
|
131
|
+
functions: readonly never[];
|
|
132
|
+
/** More than the server draws (500); the dashboard falls back to the list. */
|
|
133
|
+
truncated: boolean;
|
|
134
|
+
generatedAt: string;
|
|
135
|
+
}
|
|
136
|
+
/** `{ "app:<id>": {x, y} | null }` — null forgets a position. */
|
|
137
|
+
export type ProjectCanvasLayout = Record<`app:${string}`, CanvasPosition | null>;
|
|
138
|
+
/** `:project` is the folder's id or slug. */
|
|
139
|
+
export declare function getProjectCanvas(client: TransportClient, project: string): Promise<ProjectCanvas>;
|
|
140
|
+
/**
|
|
141
|
+
* Store node positions. Only members can be placed: a stranger's id is a 400
|
|
142
|
+
* and nothing is written. Positions are cosmetic — no release, no routing.
|
|
143
|
+
*/
|
|
144
|
+
export declare function saveProjectCanvasLayout(client: TransportClient, project: string, positions: ProjectCanvasLayout): Promise<{
|
|
145
|
+
updated: number;
|
|
146
|
+
}>;
|
|
147
|
+
//# 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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"}
|
package/dist/projects.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
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). Archiving a project archives its applications too;
|
|
7
|
+
* removing a membership leaves the application running. Serverless functions
|
|
8
|
+
* are managed separately.
|
|
9
|
+
* The canvas draws its
|
|
10
|
+
* application members as nodes, the recorded connections between them as
|
|
11
|
+
* edges, and remembers where each node was dragged on the membership row.
|
|
12
|
+
*/
|
|
13
|
+
import { rawRequest } from './transport.js';
|
|
14
|
+
export async function listProjects(client, options = {}) {
|
|
15
|
+
const query = new URLSearchParams();
|
|
16
|
+
if (options.limit !== undefined)
|
|
17
|
+
query.set('limit', String(options.limit));
|
|
18
|
+
if (options.cursor !== undefined)
|
|
19
|
+
query.set('cursor', options.cursor);
|
|
20
|
+
return rawRequest(client, 'GET', `/v1/projects${query.size ? `?${query}` : ''}`);
|
|
21
|
+
}
|
|
22
|
+
/** Resolve a live project by its id or slug. */
|
|
23
|
+
export async function getProject(client, project) {
|
|
24
|
+
return rawRequest(client, 'GET', `/v1/projects/${encodeURIComponent(project)}`);
|
|
25
|
+
}
|
|
26
|
+
export async function createProject(client, input) {
|
|
27
|
+
return rawRequest(client, 'POST', '/v1/projects', input);
|
|
28
|
+
}
|
|
29
|
+
/** Idempotent: filing an existing member again returns the same membership. */
|
|
30
|
+
export async function addProjectResource(client, project, resource) {
|
|
31
|
+
// JavaScript consumers do not get the TypeScript literal-kind check.
|
|
32
|
+
if (resource?.kind !== 'application') {
|
|
33
|
+
throw new TypeError('Projects only contain long-lived container applications; resource.kind must be "application".');
|
|
34
|
+
}
|
|
35
|
+
return rawRequest(client, 'POST', `/v1/projects/${encodeURIComponent(project)}/resources`, {
|
|
36
|
+
kind: 'application',
|
|
37
|
+
id: resource.id,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Unfile an application from one project. It keeps running, and its other
|
|
42
|
+
* memberships stay; a 404 means it was not a member.
|
|
43
|
+
*/
|
|
44
|
+
export async function removeProjectResource(client, project, resource) {
|
|
45
|
+
if (resource?.kind !== 'application') {
|
|
46
|
+
throw new TypeError('Projects only contain long-lived container applications; resource.kind must be "application".');
|
|
47
|
+
}
|
|
48
|
+
return rawRequest(client, 'DELETE', `/v1/projects/${encodeURIComponent(project)}/resources/application/${encodeURIComponent(resource.id)}`);
|
|
49
|
+
}
|
|
50
|
+
/** `:project` is the folder's id or slug. */
|
|
51
|
+
export async function getProjectCanvas(client, project) {
|
|
52
|
+
return rawRequest(client, 'GET', `/v1/projects/${encodeURIComponent(project)}/canvas`);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Store node positions. Only members can be placed: a stranger's id is a 400
|
|
56
|
+
* and nothing is written. Positions are cosmetic — no release, no routing.
|
|
57
|
+
*/
|
|
58
|
+
export async function saveProjectCanvasLayout(client, project, positions) {
|
|
59
|
+
if (Object.keys(positions).some((nodeId) => !nodeId.startsWith('app:') || nodeId.length === 4)) {
|
|
60
|
+
throw new TypeError('Project canvas positions must use application node IDs: app:<applicationId>.');
|
|
61
|
+
}
|
|
62
|
+
return rawRequest(client, 'PUT', `/v1/projects/${encodeURIComponent(project)}/canvas/layout`, { positions });
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type TransportClient } from './transport.js';
|
|
2
|
+
export interface ReleaseCommandInput {
|
|
3
|
+
command: string;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface ReleaseCommandRecord {
|
|
8
|
+
version: 1;
|
|
9
|
+
apiUrl: string;
|
|
10
|
+
credentialHash: string;
|
|
11
|
+
tenantId: string;
|
|
12
|
+
functionId: string;
|
|
13
|
+
requestId: string;
|
|
14
|
+
input: {
|
|
15
|
+
command: string;
|
|
16
|
+
timeoutMs: number;
|
|
17
|
+
env: Record<string, string>;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export type ReleaseCommandOutcome = {
|
|
21
|
+
requestId: string;
|
|
22
|
+
functionId: string;
|
|
23
|
+
kind: 'EXEC_RELEASE';
|
|
24
|
+
state: 'PENDING' | 'RECOVERY_HELD';
|
|
25
|
+
resumeUrl: string;
|
|
26
|
+
} | {
|
|
27
|
+
requestId: string;
|
|
28
|
+
functionId: string;
|
|
29
|
+
kind: 'EXEC_RELEASE';
|
|
30
|
+
state: 'CANCELLED_BEFORE_ADMISSION' | 'CANCELLED_WITHOUT_CONTAINER';
|
|
31
|
+
result: null;
|
|
32
|
+
} | {
|
|
33
|
+
requestId: string;
|
|
34
|
+
functionId: string;
|
|
35
|
+
kind: 'EXEC_RELEASE';
|
|
36
|
+
state: 'REMOVED';
|
|
37
|
+
result: {
|
|
38
|
+
termination: 'EXITED' | 'TIMEOUT' | 'CANCELLED' | 'HOST_REBOOT';
|
|
39
|
+
exitCode: number | null;
|
|
40
|
+
stdout: string;
|
|
41
|
+
stderr: string;
|
|
42
|
+
durationMs: number;
|
|
43
|
+
timedOut: boolean;
|
|
44
|
+
truncated: boolean;
|
|
45
|
+
logFailure: {
|
|
46
|
+
code: string;
|
|
47
|
+
} | null;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export declare class ReleaseCommandObservationEndedError extends Error {
|
|
51
|
+
readonly retained: ReleaseCommandRecord;
|
|
52
|
+
constructor(retained: ReleaseCommandRecord, options?: ErrorOptions);
|
|
53
|
+
}
|
|
54
|
+
export interface ReleaseCommandOperation {
|
|
55
|
+
record(): ReleaseCommandRecord;
|
|
56
|
+
submit(signal?: AbortSignal): Promise<ReleaseCommandOutcome>;
|
|
57
|
+
resume(signal?: AbortSignal): Promise<ReleaseCommandOutcome>;
|
|
58
|
+
cancel(signal?: AbortSignal): Promise<{
|
|
59
|
+
requestId: string;
|
|
60
|
+
functionId: string;
|
|
61
|
+
kind: 'EXEC_RELEASE';
|
|
62
|
+
state: 'CANCEL_REQUESTED';
|
|
63
|
+
}>;
|
|
64
|
+
/** Only resumes. An expired observer never requests durable cancellation. */
|
|
65
|
+
observe(options?: {
|
|
66
|
+
signal?: AbortSignal;
|
|
67
|
+
timeoutMs?: number;
|
|
68
|
+
pollIntervalMs?: number;
|
|
69
|
+
}): Promise<ReleaseCommandOutcome>;
|
|
70
|
+
}
|
|
71
|
+
/** The caller must persist the original UUID/request before the FIRST HTTP submission. */
|
|
72
|
+
export declare function prepareReleaseCommand(client: TransportClient, options: {
|
|
73
|
+
functionId: string;
|
|
74
|
+
requestId: string;
|
|
75
|
+
input: ReleaseCommandInput;
|
|
76
|
+
retain(record: ReleaseCommandRecord): Promise<void>;
|
|
77
|
+
}): Promise<ReleaseCommandOperation>;
|
|
78
|
+
/** Recovery performs NO discovery and NO submit, even after admission is withdrawn. */
|
|
79
|
+
export declare function restoreReleaseCommand(client: TransportClient, record: ReleaseCommandRecord): ReleaseCommandOperation;
|
|
80
|
+
//# sourceMappingURL=release-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-commands.d.ts","sourceRoot":"","sources":["../src/release-commands.ts"],"names":[],"mappings":"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"}
|