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.
Files changed (48) hide show
  1. package/dist/cli.js +136 -7
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/build.d.ts +19 -0
  4. package/dist/commands/build.js +128 -0
  5. package/dist/commands/build.js.map +1 -0
  6. package/dist/commands/config.d.ts +3 -0
  7. package/dist/commands/config.js +69 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/index.js +21 -7
  10. package/dist/commands/index.js.map +1 -1
  11. package/dist/commands/install.js +61 -5
  12. package/dist/commands/install.js.map +1 -1
  13. package/dist/commands/run.d.ts +11 -1
  14. package/dist/commands/run.js +42 -7
  15. package/dist/commands/run.js.map +1 -1
  16. package/dist/commands/runner.d.ts +2 -0
  17. package/dist/commands/runner.js +59 -0
  18. package/dist/commands/runner.js.map +1 -0
  19. package/dist/commands/setup.d.ts +1 -1
  20. package/dist/commands/setup.js +29 -10
  21. package/dist/commands/setup.js.map +1 -1
  22. package/dist/commands/validate.d.ts +6 -0
  23. package/dist/commands/validate.js +41 -0
  24. package/dist/commands/validate.js.map +1 -0
  25. package/dist/config/config.d.ts +20 -0
  26. package/dist/config/config.js +79 -0
  27. package/dist/config/config.js.map +1 -0
  28. package/dist/runners/api-runner.d.ts +18 -0
  29. package/dist/runners/api-runner.js +66 -0
  30. package/dist/runners/api-runner.js.map +1 -0
  31. package/dist/runners/pipelex-runner.d.ts +13 -0
  32. package/dist/runners/pipelex-runner.js +159 -0
  33. package/dist/runners/pipelex-runner.js.map +1 -0
  34. package/dist/runners/registry.d.ts +2 -0
  35. package/dist/runners/registry.js +15 -0
  36. package/dist/runners/registry.js.map +1 -0
  37. package/dist/runners/types.d.ts +87 -0
  38. package/dist/runners/types.js +2 -0
  39. package/dist/runners/types.js.map +1 -0
  40. package/dist/telemetry/posthog.js +1 -1
  41. package/dist/telemetry/posthog.js.map +1 -1
  42. package/package.json +5 -1
  43. package/dist/config.d.ts +0 -4
  44. package/dist/config.js +0 -21
  45. package/dist/config.js.map +0 -1
  46. package/dist/postinstall.d.ts +0 -1
  47. package/dist/postinstall.js +0 -4
  48. package/dist/postinstall.js.map +0 -1
@@ -1,9 +1,44 @@
1
- import { spawnPipelex } from "../runtime/spawn.js";
2
- import { trackEvent, shutdown } from "../telemetry/posthog.js";
3
- export async function runCommand(args) {
4
- trackEvent("command_run", { command: args[0] ?? "unknown" });
5
- const exitCode = await spawnPipelex(args);
6
- await shutdown();
7
- process.exit(exitCode);
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
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,QAAQ,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC"}
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,2 @@
1
+ export declare function runnerSetDefault(name: string): Promise<void>;
2
+ export declare function runnerList(): Promise<void>;
@@ -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":"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"}
@@ -1 +1 @@
1
- export declare function installSoftware(name: string): Promise<void>;
1
+ export declare function installRunner(name: string): Promise<void>;
@@ -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
- export async function installSoftware(name) {
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 software: ${name}`);
11
- p.log.info("Available software: pipelex");
12
- p.outro("Done");
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
- await ensureRuntime();
22
- p.log.success("pipelex installed successfully.");
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;AAEvC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,SAAS,EAAE,CAAC;IACZ,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAEvB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChB,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;QAC/C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;IACtB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,MAAM,QAAQ,EAAE,CAAC;AACnB,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,6 @@
1
+ import type { RunnerType } from "../runners/types.js";
2
+ export declare function validatePlx(target: string, options: {
3
+ pipe?: string;
4
+ bundle?: string;
5
+ runner?: RunnerType;
6
+ }): Promise<void>;
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAgBjD,MAAM,OAAO,SAAS;IACX,IAAI,GAAe,KAAK,CAAC;IAEjB,OAAO,CAAS;IAChB,MAAM,CAAS;IAEhC,YAAY,OAAgB,EAAE,MAAe;QAC3C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,mEAAmE;IAE3D,KAAK,CAAC,OAAO,CACnB,MAAsB,EACtB,IAAY,EACZ,IAAc;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAErC,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,OAAO,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAC1E,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IAClC,CAAC;IAEO,GAAG,CAAI,IAAY;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,IAAI,CAAI,IAAY,EAAE,IAAa;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAA2B;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAA2B;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAyB;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAA2B;QAE3B,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;CACF"}
@@ -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"}
@@ -0,0 +1,2 @@
1
+ import type { Runner, RunnerType } from "./types.js";
2
+ export declare function createRunner(type?: RunnerType): Runner;