mthds 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +136 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.d.ts +19 -0
- package/dist/commands/build.js +128 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +69 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/index.js +21 -7
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/install.js +61 -5
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/run.d.ts +11 -1
- package/dist/commands/run.js +42 -7
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/runner.d.ts +2 -0
- package/dist/commands/runner.js +59 -0
- package/dist/commands/runner.js.map +1 -0
- package/dist/commands/setup.d.ts +1 -1
- package/dist/commands/setup.js +29 -10
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/validate.d.ts +6 -0
- package/dist/commands/validate.js +41 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config/config.d.ts +20 -0
- package/dist/config/config.js +79 -0
- package/dist/config/config.js.map +1 -0
- package/dist/runners/api-runner.d.ts +18 -0
- package/dist/runners/api-runner.js +66 -0
- package/dist/runners/api-runner.js.map +1 -0
- package/dist/runners/pipelex-runner.d.ts +13 -0
- package/dist/runners/pipelex-runner.js +159 -0
- package/dist/runners/pipelex-runner.js.map +1 -0
- package/dist/runners/registry.d.ts +2 -0
- package/dist/runners/registry.js +15 -0
- package/dist/runners/registry.js.map +1 -0
- package/dist/runners/types.d.ts +87 -0
- package/dist/runners/types.js +2 -0
- package/dist/runners/types.js.map +1 -0
- package/dist/telemetry/posthog.js +1 -1
- package/dist/telemetry/posthog.js.map +1 -1
- package/package.json +5 -1
- package/dist/config.d.ts +0 -4
- package/dist/config.js +0 -21
- package/dist/config.js.map +0 -1
- package/dist/postinstall.d.ts +0 -1
- package/dist/postinstall.js +0 -4
- package/dist/postinstall.js.map +0 -1
package/dist/commands/run.js
CHANGED
|
@@ -1,9 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
3
|
+
import { printLogo } from "./index.js";
|
|
4
|
+
import { createRunner } from "../runners/registry.js";
|
|
5
|
+
export async function runPipeline(target, options) {
|
|
6
|
+
printLogo();
|
|
7
|
+
p.intro("mthds run");
|
|
8
|
+
const runner = createRunner(options.runner);
|
|
9
|
+
const isBundle = target.endsWith(".plx");
|
|
10
|
+
const request = {};
|
|
11
|
+
if (isBundle) {
|
|
12
|
+
request.plx_content = readFileSync(target, "utf-8");
|
|
13
|
+
if (options.pipe) {
|
|
14
|
+
request.pipe_code = options.pipe;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
request.pipe_code = target;
|
|
19
|
+
}
|
|
20
|
+
if (options.inputs) {
|
|
21
|
+
request.inputs = JSON.parse(readFileSync(options.inputs, "utf-8"));
|
|
22
|
+
}
|
|
23
|
+
const s = p.spinner();
|
|
24
|
+
s.start("Executing pipeline...");
|
|
25
|
+
try {
|
|
26
|
+
const result = await runner.execute(request);
|
|
27
|
+
s.stop(`Pipeline ${result.pipeline_state.toLowerCase()}.`);
|
|
28
|
+
if (!options.noOutput && options.output) {
|
|
29
|
+
writeFileSync(options.output, JSON.stringify(result, null, 2) + "\n", "utf-8");
|
|
30
|
+
p.log.success(`Output written to ${options.output}`);
|
|
31
|
+
}
|
|
32
|
+
if (!options.noPrettyPrint && result.pipe_output) {
|
|
33
|
+
p.log.info(JSON.stringify(result.pipe_output, null, 2));
|
|
34
|
+
}
|
|
35
|
+
p.outro("Done");
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
s.stop("Pipeline execution failed.");
|
|
39
|
+
p.log.error(err.message);
|
|
40
|
+
p.outro("");
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
8
43
|
}
|
|
9
44
|
//# sourceMappingURL=run.js.map
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAYtD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,OAAmB;IAEnB,SAAS,EAAE,CAAC;IACZ,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAErB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;QACnC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAE3D,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxC,aAAa,CACX,OAAO,CAAC,MAAM,EACd,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACtC,OAAO,CACR,CAAC;YACF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACjD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACrC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { printLogo } from "./index.js";
|
|
4
|
+
import { getConfigValue, setConfigValue } from "../config/config.js";
|
|
5
|
+
import { isPipelexInstalled } from "../runtime/check.js";
|
|
6
|
+
const KNOWN_RUNNERS = [
|
|
7
|
+
{ type: "api", label: "Pipelex API", builtin: true },
|
|
8
|
+
{ type: "pipelex", label: "Pipelex CLI (local)", builtin: false },
|
|
9
|
+
];
|
|
10
|
+
function isRunnerAvailable(type) {
|
|
11
|
+
switch (type) {
|
|
12
|
+
case "api":
|
|
13
|
+
return true;
|
|
14
|
+
case "pipelex":
|
|
15
|
+
return isPipelexInstalled();
|
|
16
|
+
default:
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function runnerSetDefault(name) {
|
|
21
|
+
printLogo();
|
|
22
|
+
p.intro("mthds runner set-default");
|
|
23
|
+
const known = KNOWN_RUNNERS.find((r) => r.type === name);
|
|
24
|
+
if (!known) {
|
|
25
|
+
p.log.error(`Unknown runner: ${name}`);
|
|
26
|
+
p.log.info(`Available runners: ${KNOWN_RUNNERS.map((r) => r.type).join(", ")}`);
|
|
27
|
+
p.outro("");
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
if (!known.builtin && !isRunnerAvailable(known.type)) {
|
|
31
|
+
p.log.error(`Runner "${name}" is not installed.`);
|
|
32
|
+
p.log.info(`Install it first: mthds setup runner ${name}`);
|
|
33
|
+
p.outro("");
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
setConfigValue("runner", name);
|
|
37
|
+
p.log.success(`Default runner set to ${name}.`);
|
|
38
|
+
p.outro("Done");
|
|
39
|
+
}
|
|
40
|
+
export async function runnerList() {
|
|
41
|
+
printLogo();
|
|
42
|
+
p.intro("mthds runner list");
|
|
43
|
+
const { value: currentDefault, source } = getConfigValue("runner");
|
|
44
|
+
const sourceLabel = source === "env" ? " (from env)" : source === "default" ? " (default)" : "";
|
|
45
|
+
p.log.info(`Default runner: ${chalk.bold(currentDefault)}${sourceLabel}\n`);
|
|
46
|
+
for (const r of KNOWN_RUNNERS) {
|
|
47
|
+
const available = isRunnerAvailable(r.type);
|
|
48
|
+
const isDefault = r.type === currentDefault;
|
|
49
|
+
const status = available
|
|
50
|
+
? chalk.green("installed")
|
|
51
|
+
: r.builtin
|
|
52
|
+
? chalk.green("built-in")
|
|
53
|
+
: chalk.dim("not installed");
|
|
54
|
+
const defaultMark = isDefault ? chalk.yellow(" (default)") : "";
|
|
55
|
+
p.log.info(` ${chalk.bold(r.type)} — ${r.label} ${status}${defaultMark}`);
|
|
56
|
+
}
|
|
57
|
+
p.outro("Done");
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/commands/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,aAAa,GAA4D;IAC7E,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;IACpD,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,EAAE;CAClE,CAAC;AAEF,SAAS,iBAAiB,CAAC,IAAgB;IACzC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,kBAAkB,EAAE,CAAC;QAC9B;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,SAAS,EAAE,CAAC;IACZ,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAEpC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,GAAG,CAAC,IAAI,CACR,sBAAsB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;QACF,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,qBAAqB,CAAC,CAAC;QAClD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,yBAAyB,IAAI,GAAG,CAAC,CAAC;IAChD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,SAAS,EAAE,CAAC;IACZ,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE7B,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,WAAW,GACf,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC;IAE5E,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;QAC5C,MAAM,MAAM,GAAG,SAAS;YACtB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;YAC1B,CAAC,CAAC,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/commands/setup.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function
|
|
1
|
+
export declare function installRunner(name: string): Promise<void>;
|
package/dist/commands/setup.js
CHANGED
|
@@ -3,23 +3,42 @@ import { isPipelexInstalled } from "../runtime/check.js";
|
|
|
3
3
|
import { ensureRuntime } from "../runtime/installer.js";
|
|
4
4
|
import { shutdown } from "../telemetry/posthog.js";
|
|
5
5
|
import { printLogo } from "./index.js";
|
|
6
|
-
|
|
6
|
+
import { getConfigValue, setConfigValue } from "../config/config.js";
|
|
7
|
+
export async function installRunner(name) {
|
|
7
8
|
printLogo();
|
|
8
|
-
p.intro("mthds setup");
|
|
9
|
+
p.intro("mthds setup runner");
|
|
9
10
|
if (name !== "pipelex") {
|
|
10
|
-
p.log.error(`Unknown
|
|
11
|
-
p.log.info("Available
|
|
12
|
-
p.outro("
|
|
11
|
+
p.log.error(`Unknown runner: ${name}`);
|
|
12
|
+
p.log.info("Available runners: api (built-in), pipelex");
|
|
13
|
+
p.outro("");
|
|
13
14
|
process.exit(1);
|
|
14
15
|
}
|
|
15
16
|
if (isPipelexInstalled()) {
|
|
16
17
|
p.log.success("pipelex is already installed.");
|
|
17
|
-
p.outro("Done");
|
|
18
|
-
await shutdown();
|
|
19
|
-
return;
|
|
20
18
|
}
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
else {
|
|
20
|
+
await ensureRuntime();
|
|
21
|
+
p.log.success("pipelex installed successfully.");
|
|
22
|
+
}
|
|
23
|
+
// Ask to set as default
|
|
24
|
+
const { value: currentDefault } = getConfigValue("runner");
|
|
25
|
+
if (currentDefault === name) {
|
|
26
|
+
p.log.info(`${name} is already the default runner.`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const makeDefault = await p.confirm({
|
|
30
|
+
message: `Set ${name} as the default runner? (current default: ${currentDefault})`,
|
|
31
|
+
initialValue: false,
|
|
32
|
+
});
|
|
33
|
+
if (p.isCancel(makeDefault)) {
|
|
34
|
+
p.cancel("Cancelled.");
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
if (makeDefault) {
|
|
38
|
+
setConfigValue("runner", name);
|
|
39
|
+
p.log.success(`Default runner set to ${name}.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
23
42
|
p.outro("Done");
|
|
24
43
|
await shutdown();
|
|
25
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,SAAS,EAAE,CAAC;IACZ,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAE9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,kBAAkB,EAAE,EAAE,CAAC;QACzB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,EAAE,CAAC;QACtB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACnD,CAAC;IAED,wBAAwB;IACxB,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE3D,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,iCAAiC,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YAClC,OAAO,EAAE,OAAO,IAAI,6CAA6C,cAAc,GAAG;YAClF,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,yBAAyB,IAAI,GAAG,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,MAAM,QAAQ,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
3
|
+
import { printLogo } from "./index.js";
|
|
4
|
+
import { createRunner } from "../runners/registry.js";
|
|
5
|
+
export async function validatePlx(target, options) {
|
|
6
|
+
printLogo();
|
|
7
|
+
p.intro("mthds validate");
|
|
8
|
+
const runner = createRunner(options.runner);
|
|
9
|
+
// Resolve the PLX content from either the positional target or --bundle
|
|
10
|
+
const bundlePath = options.bundle ?? (target.endsWith(".plx") ? target : undefined);
|
|
11
|
+
if (!bundlePath) {
|
|
12
|
+
p.log.error("Provide a .plx bundle file to validate (positional or --bundle).");
|
|
13
|
+
p.outro("");
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const plxContent = readFileSync(bundlePath, "utf-8");
|
|
17
|
+
const s = p.spinner();
|
|
18
|
+
s.start("Validating...");
|
|
19
|
+
try {
|
|
20
|
+
const result = await runner.validate({ plx_content: plxContent });
|
|
21
|
+
if (result.success) {
|
|
22
|
+
s.stop("Validation passed.");
|
|
23
|
+
p.log.success(result.message);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
s.stop("Validation failed.");
|
|
27
|
+
p.log.error(result.message);
|
|
28
|
+
}
|
|
29
|
+
p.outro("Done");
|
|
30
|
+
if (!result.success) {
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
s.stop("Validation failed.");
|
|
36
|
+
p.log.error(err.message);
|
|
37
|
+
p.outro("");
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,OAAgE;IAEhE,SAAS,EAAE,CAAC;IACZ,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAE1B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,wEAAwE;IACxE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEpF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,CAAC,CAAC,GAAG,CAAC,KAAK,CACT,kEAAkE,CACnE,CAAC;QACF,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAErD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;QAElE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC7B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC7B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAED,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEhB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC7B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RunnerType } from "../runners/types.js";
|
|
2
|
+
export interface MthdsConfig {
|
|
3
|
+
runner: RunnerType;
|
|
4
|
+
apiUrl: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const VALID_KEYS: string[];
|
|
8
|
+
export declare function resolveKey(cliKey: string): keyof MthdsConfig | undefined;
|
|
9
|
+
export declare function loadConfig(): MthdsConfig;
|
|
10
|
+
export declare function getConfigValue(key: keyof MthdsConfig): {
|
|
11
|
+
value: string;
|
|
12
|
+
source: "env" | "file" | "default";
|
|
13
|
+
};
|
|
14
|
+
export declare function setConfigValue(key: keyof MthdsConfig, value: string): void;
|
|
15
|
+
export declare function listConfig(): Array<{
|
|
16
|
+
key: string;
|
|
17
|
+
cliKey: string;
|
|
18
|
+
value: string;
|
|
19
|
+
source: "env" | "file" | "default";
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
const CONFIG_DIR = join(homedir(), ".mthds");
|
|
5
|
+
const CONFIG_PATH = join(CONFIG_DIR, "config.json");
|
|
6
|
+
const DEFAULTS = {
|
|
7
|
+
runner: "api",
|
|
8
|
+
apiUrl: "https://api.pipelex.com",
|
|
9
|
+
apiKey: "",
|
|
10
|
+
};
|
|
11
|
+
/** Map from config key to env var name */
|
|
12
|
+
const ENV_OVERRIDES = {
|
|
13
|
+
runner: "MTHDS_RUNNER",
|
|
14
|
+
apiUrl: "MTHDS_API_URL",
|
|
15
|
+
apiKey: "MTHDS_API_KEY",
|
|
16
|
+
};
|
|
17
|
+
/** Map from CLI flag names (kebab-case) to config keys */
|
|
18
|
+
const KEY_ALIASES = {
|
|
19
|
+
runner: "runner",
|
|
20
|
+
"api-url": "apiUrl",
|
|
21
|
+
"api-key": "apiKey",
|
|
22
|
+
};
|
|
23
|
+
export const VALID_KEYS = Object.keys(KEY_ALIASES);
|
|
24
|
+
export function resolveKey(cliKey) {
|
|
25
|
+
return KEY_ALIASES[cliKey];
|
|
26
|
+
}
|
|
27
|
+
function readConfigFile() {
|
|
28
|
+
if (!existsSync(CONFIG_PATH))
|
|
29
|
+
return {};
|
|
30
|
+
try {
|
|
31
|
+
const raw = readFileSync(CONFIG_PATH, "utf-8");
|
|
32
|
+
return JSON.parse(raw);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function writeConfigFile(config) {
|
|
39
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
40
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
41
|
+
}
|
|
42
|
+
export function loadConfig() {
|
|
43
|
+
const file = readConfigFile();
|
|
44
|
+
const merged = { ...DEFAULTS, ...file };
|
|
45
|
+
// Env vars take precedence
|
|
46
|
+
for (const [key, envName] of Object.entries(ENV_OVERRIDES)) {
|
|
47
|
+
const envVal = process.env[envName];
|
|
48
|
+
if (envVal !== undefined) {
|
|
49
|
+
merged[key] = envVal;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return merged;
|
|
53
|
+
}
|
|
54
|
+
export function getConfigValue(key) {
|
|
55
|
+
const envName = ENV_OVERRIDES[key];
|
|
56
|
+
const envVal = process.env[envName];
|
|
57
|
+
if (envVal !== undefined) {
|
|
58
|
+
return { value: envVal, source: "env" };
|
|
59
|
+
}
|
|
60
|
+
const file = readConfigFile();
|
|
61
|
+
if (key in file) {
|
|
62
|
+
return { value: String(file[key]), source: "file" };
|
|
63
|
+
}
|
|
64
|
+
return { value: String(DEFAULTS[key]), source: "default" };
|
|
65
|
+
}
|
|
66
|
+
export function setConfigValue(key, value) {
|
|
67
|
+
const file = readConfigFile();
|
|
68
|
+
file[key] = value;
|
|
69
|
+
writeConfigFile(file);
|
|
70
|
+
}
|
|
71
|
+
export function listConfig() {
|
|
72
|
+
const result = [];
|
|
73
|
+
for (const [cliKey, configKey] of Object.entries(KEY_ALIASES)) {
|
|
74
|
+
const { value, source } = getConfigValue(configKey);
|
|
75
|
+
result.push({ key: configKey, cliKey, value, source });
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Runner, RunnerType, BuildInputsRequest, BuildOutputRequest, BuildPipeRequest, BuildPipeResponse, BuildRunnerRequest, BuildRunnerResponse, ExecuteRequest, PipelineResponse, ValidateRequest, ValidateResponse } from "./types.js";
|
|
2
|
+
export declare class ApiRunner implements Runner {
|
|
3
|
+
readonly type: RunnerType;
|
|
4
|
+
private readonly baseUrl;
|
|
5
|
+
private readonly apiKey;
|
|
6
|
+
constructor(baseUrl?: string, apiKey?: string);
|
|
7
|
+
private request;
|
|
8
|
+
private get;
|
|
9
|
+
private post;
|
|
10
|
+
health(): Promise<Record<string, unknown>>;
|
|
11
|
+
version(): Promise<Record<string, string>>;
|
|
12
|
+
buildInputs(request: BuildInputsRequest): Promise<unknown>;
|
|
13
|
+
buildOutput(request: BuildOutputRequest): Promise<unknown>;
|
|
14
|
+
buildPipe(request: BuildPipeRequest): Promise<BuildPipeResponse>;
|
|
15
|
+
buildRunner(request: BuildRunnerRequest): Promise<BuildRunnerResponse>;
|
|
16
|
+
execute(request: ExecuteRequest): Promise<PipelineResponse>;
|
|
17
|
+
validate(request: ValidateRequest): Promise<ValidateResponse>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { loadConfig } from "../config/config.js";
|
|
2
|
+
export class ApiRunner {
|
|
3
|
+
type = "api";
|
|
4
|
+
baseUrl;
|
|
5
|
+
apiKey;
|
|
6
|
+
constructor(baseUrl, apiKey) {
|
|
7
|
+
const config = loadConfig();
|
|
8
|
+
this.baseUrl = (baseUrl ?? config.apiUrl).replace(/\/+$/, "");
|
|
9
|
+
this.apiKey = apiKey ?? config.apiKey;
|
|
10
|
+
}
|
|
11
|
+
// ── HTTP helpers ────────────────────────────────────────────────
|
|
12
|
+
async request(method, path, body) {
|
|
13
|
+
const url = `${this.baseUrl}${path}`;
|
|
14
|
+
const headers = {
|
|
15
|
+
Accept: "application/json",
|
|
16
|
+
};
|
|
17
|
+
if (this.apiKey) {
|
|
18
|
+
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
19
|
+
}
|
|
20
|
+
if (body !== undefined) {
|
|
21
|
+
headers["Content-Type"] = "application/json";
|
|
22
|
+
}
|
|
23
|
+
const res = await fetch(url, {
|
|
24
|
+
method,
|
|
25
|
+
headers,
|
|
26
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
27
|
+
});
|
|
28
|
+
if (!res.ok) {
|
|
29
|
+
const text = await res.text().catch(() => "");
|
|
30
|
+
throw new Error(`API ${method} ${path} failed (${res.status}): ${text || res.statusText}`);
|
|
31
|
+
}
|
|
32
|
+
return res.json();
|
|
33
|
+
}
|
|
34
|
+
get(path) {
|
|
35
|
+
return this.request("GET", path);
|
|
36
|
+
}
|
|
37
|
+
post(path, body) {
|
|
38
|
+
return this.request("POST", path, body);
|
|
39
|
+
}
|
|
40
|
+
// ── Runner implementation ───────────────────────────────────────
|
|
41
|
+
async health() {
|
|
42
|
+
return this.get("/health");
|
|
43
|
+
}
|
|
44
|
+
async version() {
|
|
45
|
+
return this.get("/api/v1/pipelex_version");
|
|
46
|
+
}
|
|
47
|
+
async buildInputs(request) {
|
|
48
|
+
return this.post("/api/v1/build/inputs", request);
|
|
49
|
+
}
|
|
50
|
+
async buildOutput(request) {
|
|
51
|
+
return this.post("/api/v1/build/output", request);
|
|
52
|
+
}
|
|
53
|
+
async buildPipe(request) {
|
|
54
|
+
return this.post("/api/v1/build/pipe", request);
|
|
55
|
+
}
|
|
56
|
+
async buildRunner(request) {
|
|
57
|
+
return this.post("/api/v1/build/runner", request);
|
|
58
|
+
}
|
|
59
|
+
async execute(request) {
|
|
60
|
+
return this.post("/api/v1/pipeline/execute", request);
|
|
61
|
+
}
|
|
62
|
+
async validate(request) {
|
|
63
|
+
return this.post("/api/v1/validate", request);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=api-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-runner.js","sourceRoot":"","sources":["../../src/runners/api-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Runner, RunnerType, BuildInputsRequest, BuildOutputRequest, BuildPipeRequest, BuildPipeResponse, BuildRunnerRequest, BuildRunnerResponse, ExecuteRequest, PipelineResponse, ValidateRequest, ValidateResponse } from "./types.js";
|
|
2
|
+
export declare class PipelexRunner implements Runner {
|
|
3
|
+
readonly type: RunnerType;
|
|
4
|
+
private exec;
|
|
5
|
+
health(): Promise<Record<string, unknown>>;
|
|
6
|
+
version(): Promise<Record<string, string>>;
|
|
7
|
+
buildInputs(_request: BuildInputsRequest): Promise<unknown>;
|
|
8
|
+
buildOutput(_request: BuildOutputRequest): Promise<unknown>;
|
|
9
|
+
buildPipe(request: BuildPipeRequest): Promise<BuildPipeResponse>;
|
|
10
|
+
buildRunner(request: BuildRunnerRequest): Promise<BuildRunnerResponse>;
|
|
11
|
+
execute(request: ExecuteRequest): Promise<PipelineResponse>;
|
|
12
|
+
validate(request: ValidateRequest): Promise<ValidateResponse>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { writeFileSync, readFileSync, mkdtempSync, rmSync, } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
function notSupported(method) {
|
|
8
|
+
throw new Error(`PipelexRunner.${method}() has no CLI equivalent. Use the API runner instead.`);
|
|
9
|
+
}
|
|
10
|
+
function makeTmpDir() {
|
|
11
|
+
return mkdtempSync(join(tmpdir(), "mthds-"));
|
|
12
|
+
}
|
|
13
|
+
export class PipelexRunner {
|
|
14
|
+
type = "pipelex";
|
|
15
|
+
async exec(args) {
|
|
16
|
+
return execFileAsync("pipelex", args, { encoding: "utf-8" });
|
|
17
|
+
}
|
|
18
|
+
// ── Health & version ────────────────────────────────────────────
|
|
19
|
+
async health() {
|
|
20
|
+
try {
|
|
21
|
+
await this.exec(["show", "config"]);
|
|
22
|
+
return { status: "ok" };
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error("pipelex CLI is not installed or not in PATH");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async version() {
|
|
29
|
+
const { stdout } = await this.exec(["--version"]);
|
|
30
|
+
return { pipelex: stdout.trim() };
|
|
31
|
+
}
|
|
32
|
+
// ── Build ───────────────────────────────────────────────────────
|
|
33
|
+
// buildInputs and buildOutput have no CLI equivalent.
|
|
34
|
+
async buildInputs(_request) {
|
|
35
|
+
notSupported("buildInputs");
|
|
36
|
+
}
|
|
37
|
+
async buildOutput(_request) {
|
|
38
|
+
notSupported("buildOutput");
|
|
39
|
+
}
|
|
40
|
+
// pipelex build pipe "PROMPT" -o <file>
|
|
41
|
+
async buildPipe(request) {
|
|
42
|
+
const tmp = makeTmpDir();
|
|
43
|
+
try {
|
|
44
|
+
const outPath = join(tmp, "bundle.plx");
|
|
45
|
+
await this.exec(["build", "pipe", request.brief, "-o", outPath]);
|
|
46
|
+
const plxContent = readFileSync(outPath, "utf-8");
|
|
47
|
+
return {
|
|
48
|
+
plx_content: plxContent,
|
|
49
|
+
pipelex_bundle_blueprint: {},
|
|
50
|
+
success: true,
|
|
51
|
+
message: "Pipeline generated via local CLI",
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// pipelex build runner <bundle.plx> --pipe <pipe_code> -o <file>
|
|
59
|
+
async buildRunner(request) {
|
|
60
|
+
const tmp = makeTmpDir();
|
|
61
|
+
try {
|
|
62
|
+
const bundlePath = join(tmp, "bundle.plx");
|
|
63
|
+
writeFileSync(bundlePath, request.plx_content, "utf-8");
|
|
64
|
+
const outPath = join(tmp, "runner.py");
|
|
65
|
+
await this.exec([
|
|
66
|
+
"build",
|
|
67
|
+
"runner",
|
|
68
|
+
bundlePath,
|
|
69
|
+
"--pipe",
|
|
70
|
+
request.pipe_code,
|
|
71
|
+
"-o",
|
|
72
|
+
outPath,
|
|
73
|
+
]);
|
|
74
|
+
const pythonCode = readFileSync(outPath, "utf-8");
|
|
75
|
+
return {
|
|
76
|
+
python_code: pythonCode,
|
|
77
|
+
pipe_code: request.pipe_code,
|
|
78
|
+
success: true,
|
|
79
|
+
message: "Runner code generated via local CLI",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ── Pipeline execution ──────────────────────────────────────────
|
|
87
|
+
// pipelex run <target> [--pipe code] [--inputs file] [--output file]
|
|
88
|
+
async execute(request) {
|
|
89
|
+
const tmp = makeTmpDir();
|
|
90
|
+
try {
|
|
91
|
+
const args = ["run"];
|
|
92
|
+
if (request.plx_content) {
|
|
93
|
+
const bundlePath = join(tmp, "bundle.plx");
|
|
94
|
+
writeFileSync(bundlePath, request.plx_content, "utf-8");
|
|
95
|
+
args.push(bundlePath);
|
|
96
|
+
if (request.pipe_code) {
|
|
97
|
+
args.push("--pipe", request.pipe_code);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (request.pipe_code) {
|
|
101
|
+
args.push(request.pipe_code);
|
|
102
|
+
}
|
|
103
|
+
if (request.inputs) {
|
|
104
|
+
const inputsPath = join(tmp, "inputs.json");
|
|
105
|
+
writeFileSync(inputsPath, JSON.stringify(request.inputs), "utf-8");
|
|
106
|
+
args.push("--inputs", inputsPath);
|
|
107
|
+
}
|
|
108
|
+
const outputPath = join(tmp, "output.json");
|
|
109
|
+
args.push("--output", outputPath);
|
|
110
|
+
await this.exec(args);
|
|
111
|
+
const raw = JSON.parse(readFileSync(outputPath, "utf-8"));
|
|
112
|
+
// The CLI output is working memory JSON. Wrap it in PipelineResponse shape.
|
|
113
|
+
return {
|
|
114
|
+
pipeline_run_id: raw["pipeline_run_id"] ?? "local",
|
|
115
|
+
created_at: new Date().toISOString(),
|
|
116
|
+
pipeline_state: "COMPLETED",
|
|
117
|
+
finished_at: new Date().toISOString(),
|
|
118
|
+
pipe_output: raw["pipe_output"]
|
|
119
|
+
? raw["pipe_output"]
|
|
120
|
+
: null,
|
|
121
|
+
main_stuff_name: raw["main_stuff_name"] ?? null,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// ── Validation ──────────────────────────────────────────────────
|
|
129
|
+
// pipelex validate --bundle <file.plx>
|
|
130
|
+
async validate(request) {
|
|
131
|
+
const tmp = makeTmpDir();
|
|
132
|
+
try {
|
|
133
|
+
const bundlePath = join(tmp, "bundle.plx");
|
|
134
|
+
writeFileSync(bundlePath, request.plx_content, "utf-8");
|
|
135
|
+
await this.exec(["validate", "--bundle", bundlePath]);
|
|
136
|
+
return {
|
|
137
|
+
plx_content: request.plx_content,
|
|
138
|
+
pipelex_bundle_blueprint: {
|
|
139
|
+
domain: "local",
|
|
140
|
+
},
|
|
141
|
+
success: true,
|
|
142
|
+
message: "PLX content validated via local CLI",
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
const message = err instanceof Error ? err.message : "Validation failed";
|
|
147
|
+
return {
|
|
148
|
+
plx_content: request.plx_content,
|
|
149
|
+
pipelex_bundle_blueprint: { domain: "local" },
|
|
150
|
+
success: false,
|
|
151
|
+
message,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=pipelex-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipelex-runner.js","sourceRoot":"","sources":["../../src/runners/pipelex-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,MAAM,GACP,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAgBjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,uDAAuD,CAC/E,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,OAAO,aAAa;IACf,IAAI,GAAe,SAAS,CAAC;IAE9B,KAAK,CAAC,IAAI,CAChB,IAAc;QAEd,OAAO,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;YACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACpC,CAAC;IAED,mEAAmE;IACnE,sDAAsD;IAEtD,KAAK,CAAC,WAAW,CAAC,QAA4B;QAC5C,YAAY,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAA4B;QAC5C,YAAY,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,SAAS,CAAC,OAAyB;QACvC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO;gBACL,WAAW,EAAE,UAAU;gBACvB,wBAAwB,EAAE,EAAE;gBAC5B,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,kCAAkC;aAC5C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,WAAW,CACf,OAA2B;QAE3B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC3C,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAExD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,IAAI,CAAC;gBACd,OAAO;gBACP,QAAQ;gBACR,UAAU;gBACV,QAAQ;gBACR,OAAO,CAAC,SAAS;gBACjB,IAAI;gBACJ,OAAO;aACR,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO;gBACL,WAAW,EAAE,UAAU;gBACvB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,qCAAqC;aAC/C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,qEAAqE;IAErE,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAa,CAAC,KAAK,CAAC,CAAC;YAE/B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;gBAC3C,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACtB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC/B,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC5C,aAAa,CACX,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAC9B,OAAO,CACR,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAElC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CACP,CAAC;YAE7B,4EAA4E;YAC5E,OAAO;gBACL,eAAe,EAAG,GAAG,CAAC,iBAAiB,CAAY,IAAI,OAAO;gBAC9D,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,cAAc,EAAE,WAAW;gBAC3B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,WAAW,EAAE,GAAG,CAAC,aAAa,CAAC;oBAC7B,CAAC,CAAE,GAAG,CAAC,aAAa,CAAqC;oBACzD,CAAC,CAAC,IAAI;gBACR,eAAe,EACZ,GAAG,CAAC,iBAAiB,CAAwB,IAAI,IAAI;aACzD,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,uCAAuC;IAEvC,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC3C,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAExD,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;YAEtD,OAAO;gBACL,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,wBAAwB,EAAE;oBACxB,MAAM,EAAE,OAAO;iBAChB;gBACD,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,qCAAqC;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;YAC3D,OAAO;gBACL,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,wBAAwB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;gBAC7C,OAAO,EAAE,KAAK;gBACd,OAAO;aACR,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF"}
|