@t4h.framework/cli 0.0.0-experimental-2f9c297 → 0.0.0-experimental-20261019200538
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/CHANGELOG.md +14 -0
- package/dist/bin/bin.js +1 -20
- package/dist/bin/bin.js.map +1 -1
- package/dist/commands/ai/ai-bootstrap.js +51 -185
- package/dist/commands/ai/ai-bootstrap.js.map +1 -1
- package/dist/commands/build/build.js +2 -6
- package/dist/commands/build/build.js.map +1 -1
- package/dist/commands/dev/dev.js +1 -8
- package/dist/commands/dev/dev.js.map +1 -1
- package/dist/commands/publish/publish.js +0 -1
- package/dist/commands/publish/publish.js.map +1 -1
- package/package.json +3 -12
- package/LICENSE +0 -21
- package/dist/commands/ai/ai-hook.js +0 -84
- package/dist/commands/ai/ai-hook.js.map +0 -1
- package/dist/commands/ai/tools/agent-instructions.js +0 -75
- package/dist/commands/ai/tools/agent-instructions.js.map +0 -1
- package/dist/commands/ai/tools/agent-settings.js +0 -61
- package/dist/commands/ai/tools/agent-settings.js.map +0 -1
- package/dist/commands/ai/tools/assets-lock.js +0 -34
- package/dist/commands/ai/tools/assets-lock.js.map +0 -1
- package/dist/commands/check/check.js +0 -185
- package/dist/commands/check/check.js.map +0 -1
- package/dist/commands/mcp/mcp-server.js +0 -235
- package/dist/commands/mcp/mcp-server.js.map +0 -1
- package/dist/commands/mcp/mcp-tools.js +0 -283
- package/dist/commands/mcp/mcp-tools.js.map +0 -1
- package/dist/commands/mcp/mcp.js +0 -71
- package/dist/commands/mcp/mcp.js.map +0 -1
- package/dist/commands/runtime/runtime.js +0 -143
- package/dist/commands/runtime/runtime.js.map +0 -1
- package/dist/commands/workflows/workflows.js +0 -166
- package/dist/commands/workflows/workflows.js.map +0 -1
- package/dist/tools/debug-log-option.js +0 -13
- package/dist/tools/debug-log-option.js.map +0 -1
- package/dist/tools/dev-server-client.js +0 -261
- package/dist/tools/dev-server-client.js.map +0 -1
- package/dist/tools/load-dev.js +0 -23
- package/dist/tools/load-dev.js.map +0 -1
- package/dist/tools/project-package.js +0 -67
- package/dist/tools/project-package.js.map +0 -1
- package/dist/tools/project-scripts.js +0 -53
- package/dist/tools/project-scripts.js.map +0 -1
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { setTimeout as sleep } from 'node:timers/promises';
|
|
3
|
-
import { Argument, Command, Option } from 'commander';
|
|
4
|
-
import { loadDev } from '../../tools/load-dev.js';
|
|
5
|
-
const NEXT_RUNTIME_POLL_IN_MS = 500;
|
|
6
|
-
/** Prints the message of an expected failure instead of a stack trace. */
|
|
7
|
-
const failing = (action) => async (...args) => {
|
|
8
|
-
exitWhenStdoutCloses();
|
|
9
|
-
try {
|
|
10
|
-
await action(...args);
|
|
11
|
-
}
|
|
12
|
-
catch (error) {
|
|
13
|
-
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
14
|
-
process.exit(1);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
const print = (value) => process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
18
|
-
const line = (value) => process.stdout.write(`${value}\n`);
|
|
19
|
-
/** `framework runtime watch | head` closes stdout: stop quietly. */
|
|
20
|
-
function exitWhenStdoutCloses() {
|
|
21
|
-
process.stdout.on('error', error => {
|
|
22
|
-
if (error.code === 'EPIPE')
|
|
23
|
-
process.exit(0);
|
|
24
|
-
throw error;
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Picks the runtime of `pid`, else the one serving `projectDir`, else the only
|
|
29
|
-
* one running. Throws with the candidates when that is ambiguous.
|
|
30
|
-
*/
|
|
31
|
-
export function selectRuntime(runtimes, { pid, projectDir }) {
|
|
32
|
-
if (pid !== undefined) {
|
|
33
|
-
const runtime = runtimes.find(candidate => candidate.pid === pid);
|
|
34
|
-
if (!runtime)
|
|
35
|
-
throw new Error(`No runtime is running with pid ${pid}`);
|
|
36
|
-
return runtime;
|
|
37
|
-
}
|
|
38
|
-
const ofProject = runtimes.filter(candidate => candidate.projectDir === projectDir);
|
|
39
|
-
const candidates = ofProject.length ? ofProject : runtimes;
|
|
40
|
-
if (candidates.length === 0)
|
|
41
|
-
throw new Error('No runtime is running; start one with `framework dev` or `framework workflows <workflow> run`');
|
|
42
|
-
if (candidates.length > 1)
|
|
43
|
-
throw new Error(`${candidates.length} runtimes are running; pass a pid: ${candidates
|
|
44
|
-
.map(({ pid, kind, projectDir }) => `${pid} (${kind}, ${projectDir})`)
|
|
45
|
-
.join(', ')}`);
|
|
46
|
-
return candidates[0];
|
|
47
|
-
}
|
|
48
|
-
export function formatRuntimeStatus({ runtime, queue, runs, }) {
|
|
49
|
-
return [
|
|
50
|
-
`runtime ${runtime.pid} (${runtime.kind}) ${runtime.projectDir ?? runtime.entrypoint}`,
|
|
51
|
-
`workers=${queue.workers} concurrency=${queue.concurrency}`,
|
|
52
|
-
`queue=${queue.queued} (urgent ${queue.urgent})`,
|
|
53
|
-
`running=${queue.inFlight}/${queue.capacity}`,
|
|
54
|
-
`runs running=${runs.running}`,
|
|
55
|
-
].join(' | ');
|
|
56
|
-
}
|
|
57
|
-
const pidArgument = () => new Argument('[pid]', 'Runtime pid (see `framework runtime ls`)').argParser(value => {
|
|
58
|
-
const pid = Number.parseInt(value, 10);
|
|
59
|
-
if (!Number.isInteger(pid))
|
|
60
|
-
throw new Error('Invalid pid');
|
|
61
|
-
return pid;
|
|
62
|
-
});
|
|
63
|
-
const projectOption = () => new Option('--project <dir>', 'Pick the runtime of this project when no pid is given')
|
|
64
|
-
.default(process.cwd(), 'the current directory')
|
|
65
|
-
.argParser(value => path.resolve(process.cwd(), value));
|
|
66
|
-
const RUNTIME_EXPORTS = [
|
|
67
|
-
'formatRuntimeEvent',
|
|
68
|
-
'listRuntimes',
|
|
69
|
-
'requestRuntimeStatus',
|
|
70
|
-
'watchRuntime',
|
|
71
|
-
];
|
|
72
|
-
/** The runtime commands talk to runtimes through the project's dev package. */
|
|
73
|
-
const loadRuntimeDev = (projectDir) => loadDev(projectDir, RUNTIME_EXPORTS);
|
|
74
|
-
async function waitForNextRuntime({ listRuntimes }, previous) {
|
|
75
|
-
while (true) {
|
|
76
|
-
const next = (await listRuntimes()).find(runtime => runtime.pid !== previous.pid &&
|
|
77
|
-
runtime.projectDir === previous.projectDir &&
|
|
78
|
-
runtime.parentPid === previous.parentPid);
|
|
79
|
-
if (next)
|
|
80
|
-
return next;
|
|
81
|
-
await sleep(NEXT_RUNTIME_POLL_IN_MS);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
const lsCommand = new Command('ls')
|
|
85
|
-
.description('List the runtimes running on this machine (JSON)')
|
|
86
|
-
.action(async () => {
|
|
87
|
-
const { listRuntimes } = await loadRuntimeDev(process.cwd());
|
|
88
|
-
print({ runtimes: await listRuntimes() });
|
|
89
|
-
});
|
|
90
|
-
const statusCommand = new Command('status')
|
|
91
|
-
.description('Print the queue, the jobs running and the runs of a runtime (JSON)')
|
|
92
|
-
.addArgument(pidArgument())
|
|
93
|
-
.addOption(projectOption())
|
|
94
|
-
.action(failing(async (pid, options) => {
|
|
95
|
-
const { listRuntimes, requestRuntimeStatus } = await loadRuntimeDev(options.project);
|
|
96
|
-
const runtime = selectRuntime(await listRuntimes(), {
|
|
97
|
-
pid,
|
|
98
|
-
projectDir: options.project,
|
|
99
|
-
});
|
|
100
|
-
print(await requestRuntimeStatus(runtime));
|
|
101
|
-
}));
|
|
102
|
-
const watchCommand = new Command('watch')
|
|
103
|
-
.description('Follow what a runtime runs: jobs, queue size, runs, activities, timeouts')
|
|
104
|
-
.addArgument(pidArgument())
|
|
105
|
-
.addOption(projectOption())
|
|
106
|
-
.option('--json', 'Print NDJSON instead of readable lines', false)
|
|
107
|
-
.option('--no-follow', 'Stop when the runtime exits instead of waiting for the next one (dev rebuilds)')
|
|
108
|
-
.action(failing(async (pid, options) => {
|
|
109
|
-
const dev = await loadRuntimeDev(options.project);
|
|
110
|
-
const { formatRuntimeEvent, listRuntimes, watchRuntime } = dev;
|
|
111
|
-
let runtime = selectRuntime(await listRuntimes(), {
|
|
112
|
-
pid,
|
|
113
|
-
projectDir: options.project,
|
|
114
|
-
});
|
|
115
|
-
const onStatus = (status) => options.json
|
|
116
|
-
? line(JSON.stringify({ type: 'status', ...status }))
|
|
117
|
-
: line(formatRuntimeStatus(status));
|
|
118
|
-
let watcher = null;
|
|
119
|
-
process.once('SIGINT', () => {
|
|
120
|
-
watcher?.close();
|
|
121
|
-
process.exit(0);
|
|
122
|
-
});
|
|
123
|
-
while (true) {
|
|
124
|
-
watcher = watchRuntime(runtime, {
|
|
125
|
-
onStatus,
|
|
126
|
-
onEvent: event => line(options.json
|
|
127
|
-
? JSON.stringify({ type: 'event', event })
|
|
128
|
-
: formatRuntimeEvent(event)),
|
|
129
|
-
});
|
|
130
|
-
await watcher.closed.catch(() => { });
|
|
131
|
-
if (!options.follow)
|
|
132
|
-
return;
|
|
133
|
-
if (!options.json)
|
|
134
|
-
line(`runtime ${runtime.pid} exited; waiting for the next one…`);
|
|
135
|
-
runtime = await waitForNextRuntime(dev, runtime);
|
|
136
|
-
}
|
|
137
|
-
}));
|
|
138
|
-
export const runtimeCommand = new Command('runtime')
|
|
139
|
-
.description('Inspect the runtimes started by `framework dev` and `framework workflows`')
|
|
140
|
-
.addCommand(lsCommand)
|
|
141
|
-
.addCommand(statusCommand)
|
|
142
|
-
.addCommand(watchCommand);
|
|
143
|
-
//# sourceMappingURL=runtime.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/commands/runtime/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { parseEnv } from 'node:util';
|
|
4
|
-
import { Argument, Command, Option } from 'commander';
|
|
5
|
-
import { debugLogOption, debugOption, toDebugLog, } from '../../tools/debug-log-option.js';
|
|
6
|
-
import { findDevServer, runOnDevServer } from '../../tools/dev-server-client.js';
|
|
7
|
-
import { loadDev, toProjectDir } from '../../tools/load-dev.js';
|
|
8
|
-
/** `DEFAULT_HEADLESS_RUN_TIMEOUT_IN_MS` of the dev package. */
|
|
9
|
-
export const DEFAULT_WORKFLOW_RUN_TIMEOUT_IN_MS = 60_000;
|
|
10
|
-
/** Exit codes of `framework workflows`, for scripts and agents. */
|
|
11
|
-
export const WORKFLOWS_EXIT_CODE = {
|
|
12
|
-
ok: 0,
|
|
13
|
-
rejected: 1,
|
|
14
|
-
error: 1,
|
|
15
|
-
timedOut: 2,
|
|
16
|
-
};
|
|
17
|
-
export function toWorkflowRunExitCode(result) {
|
|
18
|
-
if (result.timedOut)
|
|
19
|
-
return WORKFLOWS_EXIT_CODE.timedOut;
|
|
20
|
-
return result.run.status === 'fulfilled'
|
|
21
|
-
? WORKFLOWS_EXIT_CODE.ok
|
|
22
|
-
: WORKFLOWS_EXIT_CODE.rejected;
|
|
23
|
-
}
|
|
24
|
-
export function readWorkflowInput({ input, inputFile, }) {
|
|
25
|
-
if (input !== undefined && inputFile !== undefined)
|
|
26
|
-
throw new Error('Pass either --input or --input-file, not both');
|
|
27
|
-
const text = inputFile !== undefined ? fs.readFileSync(inputFile, 'utf8') : input;
|
|
28
|
-
if (text === undefined)
|
|
29
|
-
return undefined;
|
|
30
|
-
try {
|
|
31
|
-
return JSON.parse(text);
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
throw new Error(`The workflow input is not valid JSON: ${error.message}`, { cause: error });
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/** Fails with an HTTP-like status and details, printed as `{ error }`. */
|
|
38
|
-
export class WorkflowsError extends Error {
|
|
39
|
-
status;
|
|
40
|
-
details;
|
|
41
|
-
name = 'WorkflowsError';
|
|
42
|
-
constructor(message, status, details) {
|
|
43
|
-
super(message);
|
|
44
|
-
this.status = status;
|
|
45
|
-
this.details = details;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* By name: `HeadlessAppError` belongs to the project's dev package, and
|
|
50
|
-
* `DevServerError` / `WorkflowsError` carry the same fields.
|
|
51
|
-
*/
|
|
52
|
-
const STATUS_ERROR_NAMES = new Set([
|
|
53
|
-
'HeadlessAppError',
|
|
54
|
-
'DevServerError',
|
|
55
|
-
'WorkflowsError',
|
|
56
|
-
]);
|
|
57
|
-
const isStatusError = (error) => error instanceof Error && STATUS_ERROR_NAMES.has(error.name);
|
|
58
|
-
export function toErrorOutput(error) {
|
|
59
|
-
if (isStatusError(error))
|
|
60
|
-
return {
|
|
61
|
-
error: {
|
|
62
|
-
message: error.message,
|
|
63
|
-
status: error.status ?? null,
|
|
64
|
-
details: error.details ?? null,
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
return {
|
|
68
|
-
error: { message: error instanceof Error ? error.message : String(error) },
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
const print = (value) => process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
72
|
-
async function execute(app, workflowId, action, options) {
|
|
73
|
-
if (workflowId === undefined) {
|
|
74
|
-
print({ workflows: app.workflows });
|
|
75
|
-
return WORKFLOWS_EXIT_CODE.ok;
|
|
76
|
-
}
|
|
77
|
-
const workflow = app.workflows.find(({ id }) => id === workflowId);
|
|
78
|
-
if (!workflow)
|
|
79
|
-
throw new WorkflowsError(`Workflow not found: ${workflowId}`, 404, {
|
|
80
|
-
workflows: app.workflows.map(({ id }) => id),
|
|
81
|
-
});
|
|
82
|
-
if (action !== 'run') {
|
|
83
|
-
print({ workflow });
|
|
84
|
-
return WORKFLOWS_EXIT_CODE.ok;
|
|
85
|
-
}
|
|
86
|
-
const result = await app.run(workflowId, readWorkflowInput(options), {
|
|
87
|
-
timeoutInMs: options.timeout,
|
|
88
|
-
trace: options.trace,
|
|
89
|
-
});
|
|
90
|
-
print(result);
|
|
91
|
-
return toWorkflowRunExitCode(result);
|
|
92
|
-
}
|
|
93
|
-
/** The `framework dev` of the project, as a `WorkflowsApp` (`--attach`). */
|
|
94
|
-
async function attachDevServer(projectDir) {
|
|
95
|
-
const server = await findDevServer(projectDir);
|
|
96
|
-
if (!server)
|
|
97
|
-
throw new WorkflowsError(`No dev server is running for ${projectDir}; start it with \`framework dev\`, or drop --attach to run headless`, undefined, null);
|
|
98
|
-
const { workflows } = await server.client.manifest();
|
|
99
|
-
return {
|
|
100
|
-
workflows,
|
|
101
|
-
run: (workflowId, input, options) => runOnDevServer(server.client, workflowId, input, options),
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
export const workflowsCommand = new Command('workflows')
|
|
105
|
-
.description('List, describe or run the workflows of the app, headless or on the running dev server (--attach); prints JSON')
|
|
106
|
-
.addArgument(new Argument('[workflow]', 'Workflow id; omit it to list the workflows'))
|
|
107
|
-
.addArgument(new Argument('[action]', 'What to do with the workflow')
|
|
108
|
-
.choices(['describe', 'run'])
|
|
109
|
-
.default('describe'))
|
|
110
|
-
.option('--entrypoint <entrypoint path>', 'The entrypoint package json path', './package.json')
|
|
111
|
-
.addOption(new Option('-e, --env <envs..>', 'The env secrets (NAME=value)')
|
|
112
|
-
.argParser((value, previous) => {
|
|
113
|
-
const index = value.indexOf('=');
|
|
114
|
-
if (index < 1)
|
|
115
|
-
throw new Error('Invalid secret format');
|
|
116
|
-
return { ...previous, [value.slice(0, index)]: value.slice(index + 1) };
|
|
117
|
-
})
|
|
118
|
-
.default({}))
|
|
119
|
-
.addOption(new Option('--env-file-if-exists <file-path>', 'Load variables from a .env file if it exists').argParser(value => path.resolve(process.cwd(), value)))
|
|
120
|
-
.option('--attach', 'Use the dev server of the project (`framework dev`) instead of a headless runtime; runs keep going after the command exits', false)
|
|
121
|
-
.option('-i, --input <json>', 'Workflow input as JSON (run)')
|
|
122
|
-
.addOption(new Option('--input-file <file-path>', 'Read the workflow input JSON from a file (run)').argParser(value => path.resolve(process.cwd(), value)))
|
|
123
|
-
.addOption(new Option('-t, --timeout <ms>', 'Stop waiting for the run after this many milliseconds (run)')
|
|
124
|
-
.default(DEFAULT_WORKFLOW_RUN_TIMEOUT_IN_MS)
|
|
125
|
-
.argParser(value => {
|
|
126
|
-
const timeout = Number.parseInt(value, 10);
|
|
127
|
-
if (!Number.isInteger(timeout) || timeout < 0)
|
|
128
|
-
throw new Error('Invalid timeout');
|
|
129
|
-
return timeout;
|
|
130
|
-
}))
|
|
131
|
-
.addOption(debugOption())
|
|
132
|
-
.addOption(debugLogOption())
|
|
133
|
-
.option('--trace', 'Include the activities, logs and child runs in the output (run)', false)
|
|
134
|
-
.action(async (workflowId, action, options) => {
|
|
135
|
-
if (options.envFileIfExists && fs.existsSync(options.envFileIfExists))
|
|
136
|
-
Object.assign(options.env, parseEnv(fs.readFileSync(options.envFileIfExists, 'utf8')));
|
|
137
|
-
let app = null;
|
|
138
|
-
let exitCode = WORKFLOWS_EXIT_CODE.error;
|
|
139
|
-
const shutdown = async (code) => {
|
|
140
|
-
await app?.down().catch(() => { });
|
|
141
|
-
process.exit(code);
|
|
142
|
-
};
|
|
143
|
-
process.once('SIGINT', () => void shutdown(130));
|
|
144
|
-
process.once('SIGTERM', () => void shutdown(143));
|
|
145
|
-
try {
|
|
146
|
-
if (action === 'run')
|
|
147
|
-
readWorkflowInput(options);
|
|
148
|
-
const projectDir = toProjectDir(options.entrypoint);
|
|
149
|
-
if (options.attach)
|
|
150
|
-
exitCode = await execute(await attachDevServer(projectDir), workflowId, action, options);
|
|
151
|
-
else {
|
|
152
|
-
const dev = await loadDev(projectDir, ['HeadlessApp']);
|
|
153
|
-
app = await dev.HeadlessApp.up({
|
|
154
|
-
entrypoint: options.entrypoint,
|
|
155
|
-
env: options.env,
|
|
156
|
-
debugLog: toDebugLog(options),
|
|
157
|
-
});
|
|
158
|
-
exitCode = await execute(app, workflowId, action, options);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
catch (error) {
|
|
162
|
-
print(toErrorOutput(error));
|
|
163
|
-
}
|
|
164
|
-
await shutdown(exitCode);
|
|
165
|
-
});
|
|
166
|
-
//# sourceMappingURL=workflows.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/commands/workflows/workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { Option } from 'commander';
|
|
3
|
-
/** `DEBUG_LOG_STDERR` of the dev package: the events go to stderr. */
|
|
4
|
-
export const DEBUG_LOG_STDERR = '-';
|
|
5
|
-
export const debugOption = () => new Option('--debug', 'Log what the runtime runs (jobs, runs, activities, queue) to stderr');
|
|
6
|
-
export const debugLogOption = () => new Option('--debug-log <file-path>', 'Append the runtime events to this file as NDJSON instead of stderr').argParser(value => path.resolve(process.cwd(), value));
|
|
7
|
-
/** The `debugLog` the dev package takes, or undefined when debugging is off. */
|
|
8
|
-
export function toDebugLog({ debug, debugLog, }) {
|
|
9
|
-
if (debugLog)
|
|
10
|
-
return debugLog;
|
|
11
|
-
return debug ? DEBUG_LOG_STDERR : undefined;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=debug-log-option.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-log-option.js","sourceRoot":"","sources":["../../src/tools/debug-log-option.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAOnC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAC9B,IAAI,MAAM,CACR,SAAS,EACT,qEAAqE,CACtE,CAAA;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CACjC,IAAI,MAAM,CACR,yBAAyB,EACzB,oEAAoE,CACrE,CAAC,SAAS,CAAS,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;AAElE,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,GACQ;IAChB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,OAAO,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7C,CAAC"}
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { execFile } from 'node:child_process';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { setTimeout as sleep } from 'node:timers/promises';
|
|
5
|
-
import { promisify } from 'node:util';
|
|
6
|
-
import { loadDev } from './load-dev.js';
|
|
7
|
-
/** `DEV_ROUTES_PREFIX` of the dev package. */
|
|
8
|
-
const DEV_ROUTES_PREFIX = '/_dev';
|
|
9
|
-
/** `SERVER_URL_ARG` the dev server passes to the app process it forks. */
|
|
10
|
-
const SERVER_URL_ARG = '--server-url=';
|
|
11
|
-
/** `MAX_LIMIT` of the `/_dev` page queries. */
|
|
12
|
-
export const DEV_SERVER_PAGE_LIMIT = 50;
|
|
13
|
-
const DEFAULT_REQUEST_TIMEOUT_IN_MS = 30_000;
|
|
14
|
-
const PROBE_TIMEOUT_IN_MS = 2_000;
|
|
15
|
-
const DEFAULT_POLL_INTERVAL_IN_MS = 250;
|
|
16
|
-
const DEFAULT_RUN_TIMEOUT_IN_MS = 60_000;
|
|
17
|
-
/** A `/_dev` request failed; `status` is the HTTP status, if any. */
|
|
18
|
-
export class DevServerError extends Error {
|
|
19
|
-
status;
|
|
20
|
-
details;
|
|
21
|
-
name = 'DevServerError';
|
|
22
|
-
constructor(message, status, details, options) {
|
|
23
|
-
super(message, options);
|
|
24
|
-
this.status = status;
|
|
25
|
-
this.details = details;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/** Typed client of the `/_dev` routes of a running `framework dev`. */
|
|
29
|
-
export class DevServerClient {
|
|
30
|
-
url;
|
|
31
|
-
fetch;
|
|
32
|
-
timeoutInMs;
|
|
33
|
-
constructor(url, { fetch = globalThis.fetch, timeoutInMs = DEFAULT_REQUEST_TIMEOUT_IN_MS, } = {}) {
|
|
34
|
-
this.url = url;
|
|
35
|
-
this.fetch = fetch;
|
|
36
|
-
this.timeoutInMs = timeoutInMs;
|
|
37
|
-
}
|
|
38
|
-
/** Waits for the app to be ready (`/_dev/manifest` blocks until then). */
|
|
39
|
-
manifest() {
|
|
40
|
-
return this.request('GET', '/manifest');
|
|
41
|
-
}
|
|
42
|
-
state(timeoutInMs) {
|
|
43
|
-
return this.request('GET', '/state', { timeoutInMs });
|
|
44
|
-
}
|
|
45
|
-
findRuns(query = {}) {
|
|
46
|
-
return this.request('GET', '/runs', { query });
|
|
47
|
-
}
|
|
48
|
-
findRun(runId) {
|
|
49
|
-
return this.request('GET', `/runs/${encodeURIComponent(runId)}`);
|
|
50
|
-
}
|
|
51
|
-
findActivities(runId, page = {}) {
|
|
52
|
-
return this.request('GET', `/runs/${encodeURIComponent(runId)}/activities`, { query: page });
|
|
53
|
-
}
|
|
54
|
-
findActivity(runId, activityId) {
|
|
55
|
-
return this.request('GET', `/runs/${encodeURIComponent(runId)}/activities/${encodeURIComponent(activityId)}`);
|
|
56
|
-
}
|
|
57
|
-
findLogs(runId, page = {}) {
|
|
58
|
-
return this.request('GET', `/runs/${encodeURIComponent(runId)}/logs`, {
|
|
59
|
-
query: page,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
findWaitingActivities(page = {}) {
|
|
63
|
-
return this.request('GET', '/activities/waiting', { query: page });
|
|
64
|
-
}
|
|
65
|
-
startRun(workflowId, input) {
|
|
66
|
-
return this.request('POST', `/workflows/${encodeURIComponent(workflowId)}/runs`, { body: input });
|
|
67
|
-
}
|
|
68
|
-
/** Resolves a waiting async activity now, with `payload` as its outcome. */
|
|
69
|
-
advanceActivity(activityId, payload) {
|
|
70
|
-
return this.request('POST', `/activities/${encodeURIComponent(activityId)}/advance`, { body: payload === undefined ? {} : { payload } });
|
|
71
|
-
}
|
|
72
|
-
/** Every activity of the run, in the order they ran. */
|
|
73
|
-
async findAllActivities(runId) {
|
|
74
|
-
const activities = await this.findAll(page => this.findActivities(runId, page).then(result => ({
|
|
75
|
-
items: result.activities,
|
|
76
|
-
count: result.count,
|
|
77
|
-
})));
|
|
78
|
-
return activities.reverse();
|
|
79
|
-
}
|
|
80
|
-
/** Every log of the run, oldest first. */
|
|
81
|
-
async findAllLogs(runId) {
|
|
82
|
-
const logs = await this.findAll(page => this.findLogs(runId, page).then(result => ({
|
|
83
|
-
items: result.logs,
|
|
84
|
-
count: result.count,
|
|
85
|
-
})));
|
|
86
|
-
return logs.reverse();
|
|
87
|
-
}
|
|
88
|
-
findAllRuns(query) {
|
|
89
|
-
return this.findAll(page => this.findRuns({ ...query, ...page }).then(result => ({
|
|
90
|
-
items: result.runs,
|
|
91
|
-
count: result.count,
|
|
92
|
-
})));
|
|
93
|
-
}
|
|
94
|
-
async findAll(find) {
|
|
95
|
-
const items = [];
|
|
96
|
-
for (let offset = 0;; offset += DEV_SERVER_PAGE_LIMIT) {
|
|
97
|
-
const page = await find({ limit: DEV_SERVER_PAGE_LIMIT, offset });
|
|
98
|
-
items.push(...page.items);
|
|
99
|
-
if (!page.items.length || offset + DEV_SERVER_PAGE_LIMIT >= page.count)
|
|
100
|
-
return items;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async request(method, route, { query, body, timeoutInMs = this.timeoutInMs, } = {}) {
|
|
104
|
-
const url = new URL(`${DEV_ROUTES_PREFIX}${route}`, this.url);
|
|
105
|
-
for (const [name, value] of Object.entries(query ?? {}))
|
|
106
|
-
if (value !== undefined)
|
|
107
|
-
url.searchParams.set(name, String(value));
|
|
108
|
-
let response;
|
|
109
|
-
try {
|
|
110
|
-
response = await this.fetch(url, {
|
|
111
|
-
method,
|
|
112
|
-
headers: method === 'POST' ? { 'content-type': 'application/json' } : {},
|
|
113
|
-
// An absent input is sent as no body: the route reads it as `undefined`.
|
|
114
|
-
body: method === 'POST' && body !== undefined
|
|
115
|
-
? JSON.stringify(body)
|
|
116
|
-
: undefined,
|
|
117
|
-
signal: AbortSignal.timeout(timeoutInMs),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
|
-
throw new DevServerError(`The dev server at ${this.url} did not answer ${method} ${url.pathname}: ${error.message}`, undefined, null, { cause: error });
|
|
122
|
-
}
|
|
123
|
-
const text = await response.text();
|
|
124
|
-
let json;
|
|
125
|
-
try {
|
|
126
|
-
json = text ? JSON.parse(text) : undefined;
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
json = text;
|
|
130
|
-
}
|
|
131
|
-
if (!response.ok)
|
|
132
|
-
throw toDevServerError(response.status, json);
|
|
133
|
-
return json;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/** Reads `{ statusCode, message, error }`, the error body of the dev server. */
|
|
137
|
-
function toDevServerError(status, body) {
|
|
138
|
-
const { message, error } = (typeof body === 'object' && body !== null ? body : { message: body });
|
|
139
|
-
if (typeof message === 'string' && message)
|
|
140
|
-
return new DevServerError(error && typeof error === 'string' && error !== message
|
|
141
|
-
? `${message} (${error})`
|
|
142
|
-
: message, status, null);
|
|
143
|
-
return new DevServerError(`The dev server answered ${status}${typeof error === 'string' ? ` ${error}` : ''}`, status, message ?? null);
|
|
144
|
-
}
|
|
145
|
-
const execFileAsync = promisify(execFile);
|
|
146
|
-
/**
|
|
147
|
-
* The URL a dev server handed to its app process. Newer dev versions publish
|
|
148
|
-
* it in the registry; for older ones (the project picks the version) it is
|
|
149
|
-
* read from the process arguments (`--server-url=`), except on Windows.
|
|
150
|
-
*/
|
|
151
|
-
export async function readRuntimeServerUrl(runtime) {
|
|
152
|
-
if (runtime.serverUrl)
|
|
153
|
-
return runtime.serverUrl;
|
|
154
|
-
let args;
|
|
155
|
-
try {
|
|
156
|
-
// cspell:ignore cmdline
|
|
157
|
-
args = (await fs.promises.readFile(`/proc/${runtime.pid}/cmdline`, 'utf8'))
|
|
158
|
-
.split('\0')
|
|
159
|
-
.filter(Boolean);
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
if (process.platform === 'win32')
|
|
163
|
-
return null;
|
|
164
|
-
try {
|
|
165
|
-
const { stdout } = await execFileAsync('ps', [
|
|
166
|
-
'-ww',
|
|
167
|
-
'-o',
|
|
168
|
-
'args=',
|
|
169
|
-
'-p',
|
|
170
|
-
String(runtime.pid),
|
|
171
|
-
]);
|
|
172
|
-
args = stdout.trim().split(/\s+/);
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
const arg = args.find(value => value.startsWith(SERVER_URL_ARG));
|
|
179
|
-
return arg ? arg.slice(SERVER_URL_ARG.length) : null;
|
|
180
|
-
}
|
|
181
|
-
const toRealPath = (dir) => {
|
|
182
|
-
try {
|
|
183
|
-
return fs.realpathSync(path.resolve(dir));
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
return path.resolve(dir);
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
/**
|
|
190
|
-
* The `framework dev` serving `projectDir` on this machine, newest first, or
|
|
191
|
-
* `null` when none answers.
|
|
192
|
-
*/
|
|
193
|
-
export async function findDevServer(projectDir, { dev, fetch } = {}) {
|
|
194
|
-
const { listRuntimes } = dev ?? (await loadDev(projectDir, ['listRuntimes']));
|
|
195
|
-
const target = toRealPath(projectDir);
|
|
196
|
-
const runtimes = (await listRuntimes())
|
|
197
|
-
.filter(runtime => runtime.kind === 'dev' &&
|
|
198
|
-
runtime.projectDir !== null &&
|
|
199
|
-
toRealPath(runtime.projectDir) === target)
|
|
200
|
-
.reverse();
|
|
201
|
-
for (const runtime of runtimes) {
|
|
202
|
-
const url = await readRuntimeServerUrl(runtime);
|
|
203
|
-
if (!url)
|
|
204
|
-
continue;
|
|
205
|
-
const client = new DevServerClient(url, { fetch });
|
|
206
|
-
try {
|
|
207
|
-
await client.state(PROBE_TIMEOUT_IN_MS);
|
|
208
|
-
}
|
|
209
|
-
catch {
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
return { url, runtime, client };
|
|
213
|
-
}
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
/** An async activity still waiting for a callback, advance or timeout. */
|
|
217
|
-
export const isWaitingActivity = (activity) => activity.kind === 'async' && activity.pendingStatus === 'pending';
|
|
218
|
-
/** Activities (with input and output), logs and child runs, as `--trace`. */
|
|
219
|
-
export async function traceDevRun(client, runId, activities) {
|
|
220
|
-
const ran = activities ?? (await client.findAllActivities(runId));
|
|
221
|
-
const [detailed, logs, children] = await Promise.all([
|
|
222
|
-
Promise.all(ran.map(activity => client.findActivity(runId, activity.id))),
|
|
223
|
-
client.findAllLogs(runId),
|
|
224
|
-
client.findAllRuns({ parentRun: runId }),
|
|
225
|
-
]);
|
|
226
|
-
return { activities: detailed, logs, children };
|
|
227
|
-
}
|
|
228
|
-
/** The outcome of a run so far, in the shape of `HeadlessApp.run`. */
|
|
229
|
-
export async function readDevRun(client, runId, { timedOut = false, trace = false } = {}) {
|
|
230
|
-
const run = await client.findRun(runId);
|
|
231
|
-
const activities = await client.findAllActivities(runId);
|
|
232
|
-
return {
|
|
233
|
-
run,
|
|
234
|
-
timedOut,
|
|
235
|
-
waiting: activities.filter(isWaitingActivity),
|
|
236
|
-
...(trace ? { trace: await traceDevRun(client, runId, activities) } : {}),
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
/** Polls the run until it is no longer `running` or `timeoutInMs` elapses. */
|
|
240
|
-
export async function waitForDevRun(client, runId, { timeoutInMs = DEFAULT_RUN_TIMEOUT_IN_MS, pollIntervalInMs = DEFAULT_POLL_INTERVAL_IN_MS, } = {}) {
|
|
241
|
-
const deadline = Date.now() + timeoutInMs;
|
|
242
|
-
while (true) {
|
|
243
|
-
const { status } = await client.findRun(runId);
|
|
244
|
-
if (status !== 'running')
|
|
245
|
-
return true;
|
|
246
|
-
const left = deadline - Date.now();
|
|
247
|
-
if (left <= 0)
|
|
248
|
-
return false;
|
|
249
|
-
await sleep(Math.min(pollIntervalInMs, left));
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Starts a run on the dev server and waits like `HeadlessApp.run`, but the run
|
|
254
|
-
* keeps going on the server after a timeout (sleeping children included).
|
|
255
|
-
*/
|
|
256
|
-
export async function runOnDevServer(client, workflowId, input, { trace = false, ...options } = {}) {
|
|
257
|
-
const { id } = await client.startRun(workflowId, input);
|
|
258
|
-
const settled = await waitForDevRun(client, id, options);
|
|
259
|
-
return readDevRun(client, id, { timedOut: !settled, trace });
|
|
260
|
-
}
|
|
261
|
-
//# sourceMappingURL=dev-server-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server-client.js","sourceRoot":"","sources":["../../src/tools/dev-server-client.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/load-dev.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { DEV_PACKAGE_NAME, importProjectPackage, ProjectPackageError, } from './project-package.js';
|
|
3
|
-
/** The directory of a `--entrypoint` package json path. */
|
|
4
|
-
export const toProjectDir = (entrypoint) => path.dirname(path.resolve(process.cwd(), entrypoint));
|
|
5
|
-
/**
|
|
6
|
-
* Fails with the installed version when the project's dev package is older
|
|
7
|
-
* than the command needs, instead of a `x is not a function` later on.
|
|
8
|
-
*/
|
|
9
|
-
function requireExports(module, names) {
|
|
10
|
-
const missing = names.filter(name => module[name] === undefined);
|
|
11
|
-
if (missing.length)
|
|
12
|
-
throw new ProjectPackageError(`${DEV_PACKAGE_NAME}@${module.package.version} (${module.package.dir}) does not provide ${missing.join(', ')}; upgrade it in the project`);
|
|
13
|
-
return module;
|
|
14
|
-
}
|
|
15
|
-
/** The `@t4h.framework/dev` installed in the project, not the CLI's. */
|
|
16
|
-
export async function loadDev(projectDir, required = []) {
|
|
17
|
-
return requireExports(await importProjectPackage(DEV_PACKAGE_NAME, projectDir), required);
|
|
18
|
-
}
|
|
19
|
-
/** `@t4h.framework/dev/build` of the project, see `loadDev`. */
|
|
20
|
-
export async function loadDevBuild(projectDir, required = []) {
|
|
21
|
-
return requireExports(await importProjectPackage(DEV_PACKAGE_NAME, projectDir, './build'), required);
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=load-dev.js.map
|