@procedures/node 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +21 -0
  3. package/README.md +342 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/index.d.ts +11 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +14 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/module.d.ts +19 -0
  10. package/dist/module.d.ts.map +1 -0
  11. package/dist/module.js +97 -0
  12. package/dist/module.js.map +1 -0
  13. package/dist/procedures/node/index.d.ts +5 -0
  14. package/dist/procedures/node/index.d.ts.map +1 -0
  15. package/dist/procedures/node/index.js +5 -0
  16. package/dist/procedures/node/index.js.map +1 -0
  17. package/dist/procedures/node/kill.d.ts +11 -0
  18. package/dist/procedures/node/kill.d.ts.map +1 -0
  19. package/dist/procedures/node/kill.js +25 -0
  20. package/dist/procedures/node/kill.js.map +1 -0
  21. package/dist/procedures/node/run.d.ts +18 -0
  22. package/dist/procedures/node/run.d.ts.map +1 -0
  23. package/dist/procedures/node/run.js +48 -0
  24. package/dist/procedures/node/run.js.map +1 -0
  25. package/dist/procedures/node/spawn.d.ts +14 -0
  26. package/dist/procedures/node/spawn.d.ts.map +1 -0
  27. package/dist/procedures/node/spawn.js +35 -0
  28. package/dist/procedures/node/spawn.js.map +1 -0
  29. package/dist/procedures/node/status.d.ts +11 -0
  30. package/dist/procedures/node/status.d.ts.map +1 -0
  31. package/dist/procedures/node/status.js +17 -0
  32. package/dist/procedures/node/status.js.map +1 -0
  33. package/dist/process-manager.d.ts +50 -0
  34. package/dist/process-manager.d.ts.map +1 -0
  35. package/dist/process-manager.js +92 -0
  36. package/dist/process-manager.js.map +1 -0
  37. package/dist/register.d.ts +7 -0
  38. package/dist/register.d.ts.map +1 -0
  39. package/dist/register.js +9 -0
  40. package/dist/register.js.map +1 -0
  41. package/dist/types.d.ts +83 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +90 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +77 -3
  46. package/src/index.ts +17 -0
  47. package/src/module.ts +121 -0
  48. package/src/procedures/node/index.ts +4 -0
  49. package/src/procedures/node/kill.ts +30 -0
  50. package/src/procedures/node/run.ts +56 -0
  51. package/src/procedures/node/spawn.ts +39 -0
  52. package/src/procedures/node/status.ts +23 -0
  53. package/src/process-manager.ts +102 -0
  54. package/src/register.ts +11 -0
  55. package/src/types.ts +184 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kill.js","sourceRoot":"","sources":["../../../src/procedures/node/kill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAoB;IACjD,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC;IAEhD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,MAAwB,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAmB,EAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,WAAW,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * node.run procedure
3
+ *
4
+ * Runs a Node.js script and waits for completion.
5
+ *
6
+ * The script runs with the Node.js of the host (`process.execPath`), through `runCommand` of
7
+ * client-shell: the output has a limit, and the timeout and the signal kill the script and the
8
+ * processes that it started (deep dive WRP-10). Before, the output had no limit, and the timeout
9
+ * killed only the direct child.
10
+ */
11
+ import type { NodeRunInput, NodeRunOutput } from "../../types.js";
12
+ /**
13
+ * Run a Node.js script and wait for completion
14
+ */
15
+ export declare function nodeRun(input: NodeRunInput, ctx?: {
16
+ signal?: AbortSignal | undefined;
17
+ }): Promise<NodeRunOutput>;
18
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/procedures/node/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKlE;;GAEG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,YAAY,EACnB,GAAG,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,GACzC,OAAO,CAAC,aAAa,CAAC,CAgCxB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * node.run procedure
3
+ *
4
+ * Runs a Node.js script and waits for completion.
5
+ *
6
+ * The script runs with the Node.js of the host (`process.execPath`), through `runCommand` of
7
+ * client-shell: the output has a limit, and the timeout and the signal kill the script and the
8
+ * processes that it started (deep dive WRP-10). Before, the output had no limit, and the timeout
9
+ * killed only the direct child.
10
+ */
11
+ import { runCommand } from "@procedures/shell/command";
12
+ /** The end of the output that a timeout error shows. */
13
+ const ERROR_OUTPUT_CHARS = 2000;
14
+ /**
15
+ * Run a Node.js script and wait for completion
16
+ */
17
+ export async function nodeRun(input, ctx) {
18
+ const { script, args = [], cwd, env, timeout, maxOutputBytes } = input;
19
+ const result = await runCommand(process.execPath, {
20
+ args: [script, ...args],
21
+ cwd,
22
+ env,
23
+ timeout,
24
+ signal: ctx?.signal,
25
+ maxOutputBytes,
26
+ });
27
+ if (result.error) {
28
+ throw new Error(`node did not start: ${result.error}`);
29
+ }
30
+ if (result.timedOut) {
31
+ const output = `${result.stdout}${result.stderr}`.slice(-ERROR_OUTPUT_CHARS);
32
+ throw new Error(`Process timed out after ${timeout}ms${output ? `. Output:\n${output}` : ""}`);
33
+ }
34
+ if (result.aborted) {
35
+ const error = new Error("node.run was aborted");
36
+ error.name = "AbortError";
37
+ throw error;
38
+ }
39
+ const output = {
40
+ exitCode: result.exitCode,
41
+ stdout: result.stdout,
42
+ stderr: result.stderr,
43
+ };
44
+ if (result.truncated)
45
+ output.truncated = true;
46
+ return output;
47
+ }
48
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/procedures/node/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,wDAAwD;AACxD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAmB,EACnB,GAA0C;IAE1C,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAEvE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE;QAChD,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;QACvB,GAAG;QACH,GAAG;QACH,OAAO;QACP,MAAM,EAAE,GAAG,EAAE,MAAM;QACnB,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;QAC1B,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IACF,IAAI,MAAM,CAAC,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * node.spawn procedure
3
+ *
4
+ * Spawns a long-running Node.js process.
5
+ *
6
+ * The process is a record of the process registry of client-shell: node.status shows it,
7
+ * node.kill ends its whole tree, and it ends with the host (deep dive WRP-4, WRP-10).
8
+ */
9
+ import type { NodeSpawnInput, NodeSpawnOutput } from "../../types.js";
10
+ /**
11
+ * Spawn a long-running Node.js process
12
+ */
13
+ export declare function nodeSpawn(input: NodeSpawnInput): Promise<NodeSpawnOutput>;
14
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/procedures/node/spawn.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtE;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAuB/E"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * node.spawn procedure
3
+ *
4
+ * Spawns a long-running Node.js process.
5
+ *
6
+ * The process is a record of the process registry of client-shell: node.status shows it,
7
+ * node.kill ends its whole tree, and it ends with the host (deep dive WRP-4, WRP-10).
8
+ */
9
+ import { processManager } from "../../process-manager.js";
10
+ /**
11
+ * Spawn a long-running Node.js process
12
+ */
13
+ export async function nodeSpawn(input) {
14
+ const { script, args = [], cwd, env, ready } = input;
15
+ const started = processManager.start(script, { args, cwd, env });
16
+ if (started.status === "error") {
17
+ throw new Error(`node did not start for ${script}`);
18
+ }
19
+ // Wait for ready pattern if specified
20
+ if (ready) {
21
+ try {
22
+ await processManager.waitForReady(started.processId, ready.pattern, ready.timeout ?? 30000);
23
+ }
24
+ catch (error) {
25
+ // A process that is not ready is of no use to the caller: stop it
26
+ await processManager.kill(started.processId);
27
+ throw error;
28
+ }
29
+ }
30
+ return {
31
+ processId: started.processId,
32
+ pid: started.pid,
33
+ };
34
+ }
35
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/procedures/node/spawn.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAqB;IACnD,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAErD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,sCAAsC;IACtC,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kEAAkE;YAClE,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * node.status procedure
3
+ *
4
+ * Gets status of spawned Node.js processes.
5
+ */
6
+ import type { NodeStatusInput, NodeStatusOutput } from "../../types.js";
7
+ /**
8
+ * Get status of running processes (and the recent exits)
9
+ */
10
+ export declare function nodeStatus(input: NodeStatusInput): Promise<NodeStatusOutput>;
11
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/procedures/node/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGxE;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAUlF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * node.status procedure
3
+ *
4
+ * Gets status of spawned Node.js processes.
5
+ */
6
+ import { processManager } from "../../process-manager.js";
7
+ /**
8
+ * Get status of running processes (and the recent exits)
9
+ */
10
+ export async function nodeStatus(input) {
11
+ const { processId } = input;
12
+ const processes = processManager.getStatus(processId).map((info) => input.output ? { ...info, output: processManager.output(info.processId) } : info);
13
+ return {
14
+ processes,
15
+ };
16
+ }
17
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/procedures/node/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE5B,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACjF,CAAC;IAEF,OAAO;QACL,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Process Manager - Manages spawned Node.js processes
3
+ *
4
+ * The manager is a view of the process registry of client-shell, for the group "node"
5
+ * (deep dive WRP-4, WRP-10):
6
+ * - `kill` ends the whole process tree, not only the direct child;
7
+ * - the registry reads the output of each process, so a full pipe does not stop it;
8
+ * - the processes end when the host ends (before, they were detached and kept running);
9
+ * - the registry removes old exit records, and `cleanup` removes the rest.
10
+ */
11
+ import type { ProcessInfo } from "./types.js";
12
+ /** The group of the node processes in the process registry. */
13
+ export declare const NODE_GROUP = "node";
14
+ declare class ProcessManager {
15
+ /**
16
+ * Start a Node.js script and record it
17
+ */
18
+ start(script: string, options: {
19
+ args?: string[] | undefined;
20
+ cwd?: string | undefined;
21
+ env?: Record<string, string> | undefined;
22
+ }): ProcessInfo;
23
+ /**
24
+ * Get a managed process by ID
25
+ */
26
+ get(processId: string): ProcessInfo | undefined;
27
+ /**
28
+ * Kill a process (and the processes that it started) by ID, and wait for its end
29
+ */
30
+ kill(processId: string, signal?: NodeJS.Signals): Promise<boolean>;
31
+ /**
32
+ * Wait for a ready pattern in the output
33
+ */
34
+ waitForReady(processId: string, pattern: string, timeout?: number): Promise<void>;
35
+ /**
36
+ * The end of the output of a process (the last 64 KiB)
37
+ */
38
+ output(processId: string): string;
39
+ /**
40
+ * Get status of all or specific processes
41
+ */
42
+ getStatus(processId?: string): ProcessInfo[];
43
+ /**
44
+ * Cleanup exited processes
45
+ */
46
+ cleanup(): number;
47
+ }
48
+ export declare const processManager: ProcessManager;
49
+ export {};
50
+ //# sourceMappingURL=process-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../src/process-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,+DAA+D;AAC/D,eAAO,MAAM,UAAU,SAAS,CAAC;AAejC,cAAM,cAAc;IAClB;;OAEG;IACH,KAAK,CACH,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAAE,GAC3G,WAAW,CASb;IAED;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAG9C;IAED;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlF;IAED;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhC;IAED;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAK3C;IAED;;OAEG;IACH,OAAO,IAAI,MAAM,CAMhB;CACF;AAGD,eAAO,MAAM,cAAc,EAAE,cAAqC,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Process Manager - Manages spawned Node.js processes
3
+ *
4
+ * The manager is a view of the process registry of client-shell, for the group "node"
5
+ * (deep dive WRP-4, WRP-10):
6
+ * - `kill` ends the whole process tree, not only the direct child;
7
+ * - the registry reads the output of each process, so a full pipe does not stop it;
8
+ * - the processes end when the host ends (before, they were detached and kept running);
9
+ * - the registry removes old exit records, and `cleanup` removes the rest.
10
+ */
11
+ import { processes } from "@procedures/shell/command";
12
+ /** The group of the node processes in the process registry. */
13
+ export const NODE_GROUP = "node";
14
+ function toProcessInfo(info) {
15
+ const result = {
16
+ processId: info.id,
17
+ pid: info.pid,
18
+ script: info.label ?? info.args[0] ?? "",
19
+ status: info.status,
20
+ startedAt: info.startedAt,
21
+ };
22
+ if (info.exitCode !== undefined)
23
+ result.exitCode = info.exitCode;
24
+ if (info.exitedAt !== undefined)
25
+ result.exitedAt = info.exitedAt;
26
+ return result;
27
+ }
28
+ class ProcessManager {
29
+ /**
30
+ * Start a Node.js script and record it
31
+ */
32
+ start(script, options) {
33
+ const info = processes.start(process.execPath, {
34
+ args: [script, ...(options.args ?? [])],
35
+ cwd: options.cwd,
36
+ env: options.env,
37
+ group: NODE_GROUP,
38
+ label: script,
39
+ });
40
+ return toProcessInfo(info);
41
+ }
42
+ /**
43
+ * Get a managed process by ID
44
+ */
45
+ get(processId) {
46
+ const info = processes.get(processId);
47
+ return info && info.group === NODE_GROUP ? toProcessInfo(info) : undefined;
48
+ }
49
+ /**
50
+ * Kill a process (and the processes that it started) by ID, and wait for its end
51
+ */
52
+ async kill(processId, signal = "SIGTERM") {
53
+ if (!this.get(processId))
54
+ return false;
55
+ return (await processes.stop(processId, signal)).stopped;
56
+ }
57
+ /**
58
+ * Wait for a ready pattern in the output
59
+ */
60
+ async waitForReady(processId, pattern, timeout = 30000) {
61
+ await processes.waitFor(processId, new RegExp(pattern), timeout);
62
+ }
63
+ /**
64
+ * The end of the output of a process (the last 64 KiB)
65
+ */
66
+ output(processId) {
67
+ return this.get(processId) ? processes.output(processId) : "";
68
+ }
69
+ /**
70
+ * Get status of all or specific processes
71
+ */
72
+ getStatus(processId) {
73
+ return processes
74
+ .list({ group: NODE_GROUP })
75
+ .filter((info) => processId === undefined || info.id === processId)
76
+ .map(toProcessInfo);
77
+ }
78
+ /**
79
+ * Cleanup exited processes
80
+ */
81
+ cleanup() {
82
+ let cleaned = 0;
83
+ for (const info of processes.list({ group: NODE_GROUP })) {
84
+ if (info.exitedAt && processes.forget(info.id))
85
+ cleaned++;
86
+ }
87
+ return cleaned;
88
+ }
89
+ }
90
+ // Singleton instance
91
+ export const processManager = new ProcessManager();
92
+ //# sourceMappingURL=process-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../src/process-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Importing this file registers the procedures of @procedures/node, and of the modules that it
3
+ * requires, in the global registry: `import "@procedures/node/register"`. The package root and the
4
+ * `./module` entry register nothing (ARCHITECTURE-PROPOSALS-2026-10, P9).
5
+ */
6
+ export * from "./module.js";
7
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,cAAc,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Importing this file registers the procedures of @procedures/node, and of the modules that it
3
+ * requires, in the global registry: `import "@procedures/node/register"`. The package root and the
4
+ * `./module` entry register nothing (ARCHITECTURE-PROPOSALS-2026-10, P9).
5
+ */
6
+ import { registerNodeProcedures } from "./module.js";
7
+ export * from "./module.js";
8
+ registerNodeProcedures();
9
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,cAAc,aAAa,CAAC;AAE5B,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Type definitions for client-node procedures
3
+ */
4
+ import { z } from "zod";
5
+ export declare const NodeRunInputSchema: z.ZodObject<{
6
+ script: z.ZodString;
7
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
8
+ cwd: z.ZodOptional<z.ZodString>;
9
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
10
+ timeout: z.ZodOptional<z.ZodNumber>;
11
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
12
+ }>;
13
+ export type NodeRunInput = z.infer<typeof NodeRunInputSchema>;
14
+ export interface NodeRunOutput {
15
+ /** Exit code of the process */
16
+ exitCode: number;
17
+ /** Standard output */
18
+ stdout: string;
19
+ /** Standard error */
20
+ stderr: string;
21
+ /** True when an output stream was longer than `maxOutputBytes` */
22
+ truncated?: boolean | undefined;
23
+ }
24
+ export declare const NodeSpawnInputSchema: z.ZodObject<{
25
+ script: z.ZodString;
26
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ cwd: z.ZodOptional<z.ZodString>;
28
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
29
+ ready: z.ZodOptional<z.ZodObject<{
30
+ pattern: z.ZodString;
31
+ timeout: z.ZodOptional<z.ZodNumber>;
32
+ }>>;
33
+ }>;
34
+ export type NodeSpawnInput = z.infer<typeof NodeSpawnInputSchema>;
35
+ export interface NodeSpawnOutput {
36
+ /** Unique process identifier for management */
37
+ processId: string;
38
+ /** OS process ID */
39
+ pid: number;
40
+ }
41
+ export declare const NodeKillInputSchema: z.ZodObject<{
42
+ processId: z.ZodString;
43
+ signal: z.ZodOptional<z.ZodString>;
44
+ }>;
45
+ export type NodeKillInput = z.infer<typeof NodeKillInputSchema>;
46
+ export interface NodeKillOutput {
47
+ /** Whether the kill was successful */
48
+ success: boolean;
49
+ /** Exit code if process exited */
50
+ exitCode?: number | undefined;
51
+ }
52
+ export declare const NodeStatusInputSchema: z.ZodObject<{
53
+ processId: z.ZodOptional<z.ZodString>;
54
+ output: z.ZodOptional<z.ZodBoolean>;
55
+ }>;
56
+ export type NodeStatusInput = z.infer<typeof NodeStatusInputSchema>;
57
+ export interface ProcessInfo {
58
+ /** Process identifier */
59
+ processId: string;
60
+ /** OS process ID */
61
+ pid: number;
62
+ /** Script path */
63
+ script: string;
64
+ /** Current status */
65
+ status: "running" | "exited" | "error";
66
+ /** Exit code if exited */
67
+ exitCode?: number | undefined;
68
+ /** Start time */
69
+ startedAt: string;
70
+ /** Exit time if exited */
71
+ exitedAt?: string | undefined;
72
+ /** With `output: true`, the end of the output */
73
+ output?: string | undefined;
74
+ }
75
+ export interface NodeStatusOutput {
76
+ /** List of processes */
77
+ processes: ProcessInfo[];
78
+ }
79
+ export declare const NodeRunOutputSchema: z.ZodType<NodeRunOutput>;
80
+ export declare const NodeSpawnOutputSchema: z.ZodType<NodeSpawnOutput>;
81
+ export declare const NodeKillOutputSchema: z.ZodType<NodeKillOutput>;
82
+ export declare const NodeStatusOutputSchema: z.ZodType<NodeStatusOutput>;
83
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Type definitions for client-node procedures
3
+ */
4
+ import { z } from "zod";
5
+ // ============================================================================
6
+ // node.run - Run script and wait for completion
7
+ // ============================================================================
8
+ export const NodeRunInputSchema = z.object({
9
+ /** Script path to run */
10
+ script: z.string().describe("Script path to run"),
11
+ /** Arguments to pass to the script */
12
+ args: z.array(z.string()).optional().describe("Arguments to pass to the script"),
13
+ /** Working directory */
14
+ cwd: z.string().optional().describe("Working directory"),
15
+ /** Environment variables */
16
+ env: z.record(z.string(), z.string()).optional().describe("Environment variables"),
17
+ /** Timeout in milliseconds. At the timeout, the script and its child processes are killed. */
18
+ timeout: z.number().optional().describe("Timeout in milliseconds. At the timeout, the script and its child processes are killed."),
19
+ /** The most bytes kept of each output stream (default: 64 MiB). The procedure keeps the first bytes. */
20
+ maxOutputBytes: z.number().int().positive().optional().describe("The most bytes kept of each output stream (default: 64 MiB). The procedure keeps the first bytes."),
21
+ });
22
+ // ============================================================================
23
+ // node.spawn - Spawn long-running process
24
+ // ============================================================================
25
+ export const NodeSpawnInputSchema = z.object({
26
+ /** Script path to run */
27
+ script: z.string().describe("Script path to run"),
28
+ /** Arguments to pass to the script */
29
+ args: z.array(z.string()).optional().describe("Arguments to pass to the script"),
30
+ /** Working directory */
31
+ cwd: z.string().optional().describe("Working directory"),
32
+ /** Environment variables */
33
+ env: z.record(z.string(), z.string()).optional().describe("Environment variables"),
34
+ /** Ready pattern - wait for this in stdout before returning */
35
+ ready: z
36
+ .object({
37
+ pattern: z.string(),
38
+ timeout: z.number().optional(),
39
+ })
40
+ .optional().describe("Ready pattern - wait for this in stdout before returning"),
41
+ });
42
+ // ============================================================================
43
+ // node.kill - Kill a spawned process
44
+ // ============================================================================
45
+ export const NodeKillInputSchema = z.object({
46
+ /** Process ID returned from node.spawn */
47
+ processId: z.string().describe("Process ID returned from node.spawn"),
48
+ /** Signal to send (default: SIGTERM) */
49
+ signal: z.string().optional().describe("Signal to send (default: SIGTERM)"),
50
+ });
51
+ // ============================================================================
52
+ // node.status - Get status of running processes
53
+ // ============================================================================
54
+ export const NodeStatusInputSchema = z.object({
55
+ /** Optional process ID to filter by */
56
+ processId: z.string().optional().describe("Optional process ID to filter by"),
57
+ /** Also give the end of the output of each process (the last 64 KiB) */
58
+ output: z.boolean().optional().describe("Also give the end of the output of each process (the last 64 KiB)"),
59
+ });
60
+ // Output schemas (roadmap 2.1). Loose objects: a field that a schema does not name stays in the
61
+ // result (a strict schema would remove it when the output is validated).
62
+ export const NodeRunOutputSchema = z.looseObject({
63
+ exitCode: z.number().describe("The exit code of the script"),
64
+ stdout: z.string().describe("The standard output"),
65
+ stderr: z.string().describe("The standard error"),
66
+ truncated: z.boolean().optional().describe("True when an output stream was longer than maxOutputBytes"),
67
+ });
68
+ export const NodeSpawnOutputSchema = z.looseObject({
69
+ processId: z.string().describe("The id of the process: node.kill and node.status take it"),
70
+ pid: z.number().describe("The process id of the operating system"),
71
+ });
72
+ export const NodeKillOutputSchema = z.looseObject({
73
+ success: z.boolean().describe("True when the process ended"),
74
+ exitCode: z.number().optional().describe("The exit code, when the process exited"),
75
+ });
76
+ export const NodeStatusOutputSchema = z.looseObject({
77
+ processes: z
78
+ .array(z.looseObject({
79
+ processId: z.string().describe("The id of the process"),
80
+ pid: z.number().describe("The process id of the operating system"),
81
+ script: z.string().describe("The script"),
82
+ status: z.enum(["running", "exited", "error"]).describe("The state of the process"),
83
+ exitCode: z.number().optional().describe("The exit code, when the process exited"),
84
+ startedAt: z.string().describe("The start time (ISO 8601)"),
85
+ exitedAt: z.string().optional().describe("The end time (ISO 8601), when the process ended"),
86
+ output: z.string().optional().describe("With output: true, the end of the output"),
87
+ }))
88
+ .describe("The processes of this host"),
89
+ });
90
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,80 @@
1
1
  {
2
+ "$schema": "https://json.schemastore.org/package",
2
3
  "name": "@procedures/node",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
4
+ "version": "0.2.0",
5
+ "description": "Node.js process procedures: run scripts, spawn and manage long-running processes, with output caps and process-tree cleanup.",
6
+ "keywords": [
7
+ "node",
8
+ "process",
9
+ "spawn",
10
+ "process-manager",
11
+ "procedures"
12
+ ],
13
+ "homepage": "https://mark1russell7.github.io/client/",
14
+ "bugs": {
15
+ "url": "https://github.com/mark1russell7/client/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/mark1russell7/client.git",
20
+ "directory": "packages/client-node"
21
+ },
22
+ "license": "MIT",
23
+ "author": "Mark Russell (https://github.com/mark1russell7)",
24
+ "type": "module",
25
+ "main": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js"
31
+ },
32
+ "./module": {
33
+ "types": "./dist/module.d.ts",
34
+ "import": "./dist/module.js"
35
+ },
36
+ "./register": {
37
+ "types": "./dist/register.d.ts",
38
+ "import": "./dist/register.js"
39
+ }
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "src",
44
+ "!src/**/*.test.ts",
45
+ "!src/**/*.test.tsx",
46
+ "!src/**/__tests__",
47
+ "CHANGELOG.md"
48
+ ],
49
+ "sideEffects": [
50
+ "./dist/register.js"
51
+ ],
52
+ "engines": {
53
+ "node": ">=22"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public",
57
+ "provenance": true
58
+ },
59
+ "dependencies": {
60
+ "@procedures/client": "0.2.0",
61
+ "@procedures/shell": "0.2.0",
62
+ "zod": "^4.6.5"
63
+ },
64
+ "devDependencies": {
65
+ "typescript": "^7.0.2",
66
+ "@types/node": "^22.0.0",
67
+ "@mark1russell7/cue": "^1.0.0",
68
+ "vitest": "^5.0.3"
69
+ },
70
+ "client": {
71
+ "procedures": "./dist/register.js"
72
+ },
73
+ "scripts": {
74
+ "build": "tsc -b",
75
+ "typecheck": "tsc --noEmit",
76
+ "clean": "rm -rf dist .tsbuildinfo",
77
+ "test": "vitest run",
78
+ "test:watch": "vitest"
79
+ }
6
80
  }