@agimon-ai/doompi-runner 0.0.1-alpha.78 → 0.0.1-alpha.79

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/bin/cli.cjs CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require_index = require("../src/services/cliApp/index.cjs");
4
4
  const require_index$1 = require("../src/services/runnerDependencies/index.cjs");
5
+ let node_fs = require("node:fs");
5
6
  let node_url = require("node:url");
6
7
  let _agimon_ai_doompi_telemetry = require("@agimon-ai/doompi-telemetry");
7
8
  //#region src/bin/cli.ts
@@ -65,7 +66,7 @@ async function main(argv = process.argv.slice(2)) {
65
66
  await telemetry.shutdown();
66
67
  }
67
68
  }
68
- if (process.argv[1] && require("url").pathToFileURL(__filename).href === (0, node_url.pathToFileURL)(process.argv[1]).href) main().then((code) => {
69
+ if (process.argv[1] && (0, node_fs.existsSync)(process.argv[1]) && (0, node_fs.realpathSync)((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href)) === (0, node_fs.realpathSync)(process.argv[1])) main().then((code) => {
69
70
  process.exitCode = code;
70
71
  }, (error) => {
71
72
  process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","names":["createDoomTelemetry","createRunnerDependencies","runCli","pathToFileURL"],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { pathToFileURL } from 'node:url';\n\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\n\nimport { runCli } from '../services/cliApp';\nimport { createRunnerDependencies } from '../services/runnerDependencies';\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const environment = Object.freeze({ ...process.env });\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-cli',\n packageName: '@agimon-ai/doompi-runner',\n env: environment,\n enableLogs: true,\n enableTraces: true,\n });\n const container = createRunnerDependencies({ environment });\n const registry = container.runnerRegistry;\n let stdoutBytes = 0;\n let stderrBytes = 0;\n try {\n const exitCode = await runCli(argv, {\n registry,\n launcher: container.launcher,\n rmuxBackend: container.rmuxBackend,\n logReader: container.logReader,\n env: environment,\n stdout: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stdoutBytes += Buffer.byteLength(output, 'utf8');\n process.stdout.write(output);\n },\n stderr: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stderrBytes += Buffer.byteLength(output, 'utf8');\n process.stderr.write(output);\n },\n readStdin,\n });\n await telemetry.recordEvent('doom_runner.cli_finished', {\n outcome: exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError('doom_runner.cli_failed', error, {\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n throw error;\n } finally {\n registry.close();\n await telemetry.shutdown();\n }\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";;;;;;;AASA,eAAe,YAA6B;CAC1C,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QAAQ,OAAO,OAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;CACxG,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM;AAC9C;AAEA,eAAsB,KAAK,OAA0B,QAAQ,KAAK,MAAM,CAAC,GAAoB;CAC3F,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpD,MAAM,aAAA,GAAYA,4BAAAA,oBAAAA,CAAoB;EACpC,aAAa;EACb,aAAa;EACb,KAAK;EACL,YAAY;EACZ,cAAc;CAChB,CAAC;CACD,MAAM,YAAYC,gBAAAA,yBAAyB,EAAE,YAAY,CAAC;CAC1D,MAAM,WAAW,UAAU;CAC3B,IAAI,cAAc;CAClB,IAAI,cAAc;CAClB,IAAI;EACF,MAAM,WAAW,MAAMC,cAAAA,OAAO,MAAM;GAClC;GACA,UAAU,UAAU;GACpB,aAAa,UAAU;GACvB,WAAW,UAAU;GACrB,KAAK;GACL,SAAS,SAAS;IAChB,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,KAAK;IACpD,eAAe,OAAO,WAAW,QAAQ,MAAM;IAC/C,QAAQ,OAAO,MAAM,MAAM;GAC7B;GACA,SAAS,SAAS;IAChB,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,KAAK;IACpD,eAAe,OAAO,WAAW,QAAQ,MAAM;IAC/C,QAAQ,OAAO,MAAM,MAAM;GAC7B;GACA;EACF,CAAC;EACD,MAAM,UAAU,YAAY,4BAA4B;GACtD,SAAS,aAAa,IAAI,cAAc;GACxC,oBAAoB;GACpB,aAAa,KAAK,IAAI,IAAI;GAC1B,yBAAyB,KAAK;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC;EACD,OAAO;CACT,SAAS,OAAO;EACd,MAAM,UAAU,YAAY,0BAA0B,OAAO;GAC3D,aAAa,KAAK,IAAI,IAAI;GAC1B,yBAAyB,KAAK;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC;EACD,MAAM;CACR,UAAU;EACR,SAAS,MAAM;EACf,MAAM,UAAU,SAAS;CAC3B;AACF;AAEA,IAAI,QAAQ,KAAK,MAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,UAAA,GAA0BC,SAAAA,cAAAA,CAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,KAAK,CAAC,CAAC,MACJ,SAAS;CACR,QAAQ,WAAW;AACrB,IACC,UAAmB;CAClB,QAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG;CAClF,QAAQ,WAAW;AACrB,CACF"}
1
+ {"version":3,"file":"cli.cjs","names":["createDoomTelemetry","createRunnerDependencies","runCli","existsSync","realpathSync","fileURLToPath"],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync, realpathSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\n\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\n\nimport { runCli } from '../services/cliApp';\nimport { createRunnerDependencies } from '../services/runnerDependencies';\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const environment = Object.freeze({ ...process.env });\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-cli',\n packageName: '@agimon-ai/doompi-runner',\n env: environment,\n enableLogs: true,\n enableTraces: true,\n });\n const container = createRunnerDependencies({ environment });\n const registry = container.runnerRegistry;\n let stdoutBytes = 0;\n let stderrBytes = 0;\n try {\n const exitCode = await runCli(argv, {\n registry,\n launcher: container.launcher,\n rmuxBackend: container.rmuxBackend,\n logReader: container.logReader,\n env: environment,\n stdout: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stdoutBytes += Buffer.byteLength(output, 'utf8');\n process.stdout.write(output);\n },\n stderr: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stderrBytes += Buffer.byteLength(output, 'utf8');\n process.stderr.write(output);\n },\n readStdin,\n });\n await telemetry.recordEvent('doom_runner.cli_finished', {\n outcome: exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError('doom_runner.cli_failed', error, {\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n throw error;\n } finally {\n registry.close();\n await telemetry.shutdown();\n }\n}\n\nif (\n process.argv[1] &&\n existsSync(process.argv[1]) &&\n realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1])\n) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";;;;;;;;AAUA,eAAe,YAA6B;CAC1C,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QAAQ,OAAO,OAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;CACxG,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM;AAC9C;AAEA,eAAsB,KAAK,OAA0B,QAAQ,KAAK,MAAM,CAAC,GAAoB;CAC3F,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpD,MAAM,aAAA,GAAYA,4BAAAA,oBAAAA,CAAoB;EACpC,aAAa;EACb,aAAa;EACb,KAAK;EACL,YAAY;EACZ,cAAc;CAChB,CAAC;CACD,MAAM,YAAYC,gBAAAA,yBAAyB,EAAE,YAAY,CAAC;CAC1D,MAAM,WAAW,UAAU;CAC3B,IAAI,cAAc;CAClB,IAAI,cAAc;CAClB,IAAI;EACF,MAAM,WAAW,MAAMC,cAAAA,OAAO,MAAM;GAClC;GACA,UAAU,UAAU;GACpB,aAAa,UAAU;GACvB,WAAW,UAAU;GACrB,KAAK;GACL,SAAS,SAAS;IAChB,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,KAAK;IACpD,eAAe,OAAO,WAAW,QAAQ,MAAM;IAC/C,QAAQ,OAAO,MAAM,MAAM;GAC7B;GACA,SAAS,SAAS;IAChB,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,KAAK;IACpD,eAAe,OAAO,WAAW,QAAQ,MAAM;IAC/C,QAAQ,OAAO,MAAM,MAAM;GAC7B;GACA;EACF,CAAC;EACD,MAAM,UAAU,YAAY,4BAA4B;GACtD,SAAS,aAAa,IAAI,cAAc;GACxC,oBAAoB;GACpB,aAAa,KAAK,IAAI,IAAI;GAC1B,yBAAyB,KAAK;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC;EACD,OAAO;CACT,SAAS,OAAO;EACd,MAAM,UAAU,YAAY,0BAA0B,OAAO;GAC3D,aAAa,KAAK,IAAI,IAAI;GAC1B,yBAAyB,KAAK;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC;EACD,MAAM;CACR,UAAU;EACR,SAAS,MAAM;EACf,MAAM,UAAU,SAAS;CAC3B;AACF;AAEA,IACE,QAAQ,KAAK,OAAA,GACbC,QAAAA,WAAAA,CAAW,QAAQ,KAAK,EAAE,MAAA,GAC1BC,QAAAA,aAAAA,EAAAA,GAAaC,SAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAA6B,CAAC,OAAA,GAAMD,QAAAA,aAAAA,CAAa,QAAQ,KAAK,EAAE,GAE7E,KAAK,CAAC,CAAC,MACJ,SAAS;CACR,QAAQ,WAAW;AACrB,IACC,UAAmB;CAClB,QAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG;CAClF,QAAQ,WAAW;AACrB,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.cts","names":[],"sources":["../../src/bin/cli.ts"],"mappings":";wBAesB,KAAK,2BAAkD"}
1
+ {"version":3,"file":"cli.d.cts","names":[],"sources":["../../src/bin/cli.ts"],"mappings":";wBAgBsB,KAAK,2BAAkD"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.mts","names":[],"sources":["../../src/bin/cli.ts"],"mappings":";wBAesB,KAAK,2BAAkD"}
1
+ {"version":3,"file":"cli.d.mts","names":[],"sources":["../../src/bin/cli.ts"],"mappings":";wBAgBsB,KAAK,2BAAkD"}
package/dist/bin/cli.mjs CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { runCli } from "../src/services/cliApp/index.mjs";
3
3
  import { createRunnerDependencies } from "../src/services/runnerDependencies/index.mjs";
4
- import { pathToFileURL } from "node:url";
4
+ import { existsSync, realpathSync } from "node:fs";
5
+ import { fileURLToPath } from "node:url";
5
6
  import { createDoomTelemetry } from "@agimon-ai/doompi-telemetry";
6
7
  //#region src/bin/cli.ts
7
8
  async function readStdin() {
@@ -64,7 +65,7 @@ async function main(argv = process.argv.slice(2)) {
64
65
  await telemetry.shutdown();
65
66
  }
66
67
  }
67
- if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) main().then((code) => {
68
+ if (process.argv[1] && existsSync(process.argv[1]) && realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1])) main().then((code) => {
68
69
  process.exitCode = code;
69
70
  }, (error) => {
70
71
  process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { pathToFileURL } from 'node:url';\n\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\n\nimport { runCli } from '../services/cliApp';\nimport { createRunnerDependencies } from '../services/runnerDependencies';\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const environment = Object.freeze({ ...process.env });\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-cli',\n packageName: '@agimon-ai/doompi-runner',\n env: environment,\n enableLogs: true,\n enableTraces: true,\n });\n const container = createRunnerDependencies({ environment });\n const registry = container.runnerRegistry;\n let stdoutBytes = 0;\n let stderrBytes = 0;\n try {\n const exitCode = await runCli(argv, {\n registry,\n launcher: container.launcher,\n rmuxBackend: container.rmuxBackend,\n logReader: container.logReader,\n env: environment,\n stdout: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stdoutBytes += Buffer.byteLength(output, 'utf8');\n process.stdout.write(output);\n },\n stderr: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stderrBytes += Buffer.byteLength(output, 'utf8');\n process.stderr.write(output);\n },\n readStdin,\n });\n await telemetry.recordEvent('doom_runner.cli_finished', {\n outcome: exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError('doom_runner.cli_failed', error, {\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n throw error;\n } finally {\n registry.close();\n await telemetry.shutdown();\n }\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";;;;;;AASA,eAAe,YAA6B;CAC1C,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QAAQ,OAAO,OAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;CACxG,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM;AAC9C;AAEA,eAAsB,KAAK,OAA0B,QAAQ,KAAK,MAAM,CAAC,GAAoB;CAC3F,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpD,MAAM,YAAY,oBAAoB;EACpC,aAAa;EACb,aAAa;EACb,KAAK;EACL,YAAY;EACZ,cAAc;CAChB,CAAC;CACD,MAAM,YAAY,yBAAyB,EAAE,YAAY,CAAC;CAC1D,MAAM,WAAW,UAAU;CAC3B,IAAI,cAAc;CAClB,IAAI,cAAc;CAClB,IAAI;EACF,MAAM,WAAW,MAAM,OAAO,MAAM;GAClC;GACA,UAAU,UAAU;GACpB,aAAa,UAAU;GACvB,WAAW,UAAU;GACrB,KAAK;GACL,SAAS,SAAS;IAChB,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,KAAK;IACpD,eAAe,OAAO,WAAW,QAAQ,MAAM;IAC/C,QAAQ,OAAO,MAAM,MAAM;GAC7B;GACA,SAAS,SAAS;IAChB,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,KAAK;IACpD,eAAe,OAAO,WAAW,QAAQ,MAAM;IAC/C,QAAQ,OAAO,MAAM,MAAM;GAC7B;GACA;EACF,CAAC;EACD,MAAM,UAAU,YAAY,4BAA4B;GACtD,SAAS,aAAa,IAAI,cAAc;GACxC,oBAAoB;GACpB,aAAa,KAAK,IAAI,IAAI;GAC1B,yBAAyB,KAAK;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC;EACD,OAAO;CACT,SAAS,OAAO;EACd,MAAM,UAAU,YAAY,0BAA0B,OAAO;GAC3D,aAAa,KAAK,IAAI,IAAI;GAC1B,yBAAyB,KAAK;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC;EACD,MAAM;CACR,UAAU;EACR,SAAS,MAAM;EACf,MAAM,UAAU,SAAS;CAC3B;AACF;AAEA,IAAI,QAAQ,KAAK,MAAM,YAAY,QAAQ,cAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,KAAK,CAAC,CAAC,MACJ,SAAS;CACR,QAAQ,WAAW;AACrB,IACC,UAAmB;CAClB,QAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG;CAClF,QAAQ,WAAW;AACrB,CACF"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync, realpathSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\n\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\n\nimport { runCli } from '../services/cliApp';\nimport { createRunnerDependencies } from '../services/runnerDependencies';\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const environment = Object.freeze({ ...process.env });\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-cli',\n packageName: '@agimon-ai/doompi-runner',\n env: environment,\n enableLogs: true,\n enableTraces: true,\n });\n const container = createRunnerDependencies({ environment });\n const registry = container.runnerRegistry;\n let stdoutBytes = 0;\n let stderrBytes = 0;\n try {\n const exitCode = await runCli(argv, {\n registry,\n launcher: container.launcher,\n rmuxBackend: container.rmuxBackend,\n logReader: container.logReader,\n env: environment,\n stdout: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stdoutBytes += Buffer.byteLength(output, 'utf8');\n process.stdout.write(output);\n },\n stderr: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stderrBytes += Buffer.byteLength(output, 'utf8');\n process.stderr.write(output);\n },\n readStdin,\n });\n await telemetry.recordEvent('doom_runner.cli_finished', {\n outcome: exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError('doom_runner.cli_failed', error, {\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n throw error;\n } finally {\n registry.close();\n await telemetry.shutdown();\n }\n}\n\nif (\n process.argv[1] &&\n existsSync(process.argv[1]) &&\n realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1])\n) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";;;;;;;AAUA,eAAe,YAA6B;CAC1C,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QAAQ,OAAO,OAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;CACxG,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM;AAC9C;AAEA,eAAsB,KAAK,OAA0B,QAAQ,KAAK,MAAM,CAAC,GAAoB;CAC3F,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,cAAc,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpD,MAAM,YAAY,oBAAoB;EACpC,aAAa;EACb,aAAa;EACb,KAAK;EACL,YAAY;EACZ,cAAc;CAChB,CAAC;CACD,MAAM,YAAY,yBAAyB,EAAE,YAAY,CAAC;CAC1D,MAAM,WAAW,UAAU;CAC3B,IAAI,cAAc;CAClB,IAAI,cAAc;CAClB,IAAI;EACF,MAAM,WAAW,MAAM,OAAO,MAAM;GAClC;GACA,UAAU,UAAU;GACpB,aAAa,UAAU;GACvB,WAAW,UAAU;GACrB,KAAK;GACL,SAAS,SAAS;IAChB,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,KAAK;IACpD,eAAe,OAAO,WAAW,QAAQ,MAAM;IAC/C,QAAQ,OAAO,MAAM,MAAM;GAC7B;GACA,SAAS,SAAS;IAChB,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,KAAK;IACpD,eAAe,OAAO,WAAW,QAAQ,MAAM;IAC/C,QAAQ,OAAO,MAAM,MAAM;GAC7B;GACA;EACF,CAAC;EACD,MAAM,UAAU,YAAY,4BAA4B;GACtD,SAAS,aAAa,IAAI,cAAc;GACxC,oBAAoB;GACpB,aAAa,KAAK,IAAI,IAAI;GAC1B,yBAAyB,KAAK;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC;EACD,OAAO;CACT,SAAS,OAAO;EACd,MAAM,UAAU,YAAY,0BAA0B,OAAO;GAC3D,aAAa,KAAK,IAAI,IAAI;GAC1B,yBAAyB,KAAK;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC;EACD,MAAM;CACR,UAAU;EACR,SAAS,MAAM;EACf,MAAM,UAAU,SAAS;CAC3B;AACF;AAEA,IACE,QAAQ,KAAK,MACb,WAAW,QAAQ,KAAK,EAAE,KAC1B,aAAa,cAAc,YAAY,GAAG,CAAC,MAAM,aAAa,QAAQ,KAAK,EAAE,GAE7E,KAAK,CAAC,CAAC,MACJ,SAAS;CACR,QAAQ,WAAW;AACrB,IACC,UAAmB;CAClB,QAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG;CAClF,QAAQ,WAAW;AACrB,CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-runner",
3
- "version": "0.0.1-alpha.78",
3
+ "version": "0.0.1-alpha.79",
4
4
  "description": "Supervised shell execution, background process control, and run logs for Pi coding agents.",
5
5
  "keywords": [
6
6
  "ai",
@@ -233,11 +233,11 @@
233
233
  "registry": "https://registry.npmjs.org/"
234
234
  },
235
235
  "dependencies": {
236
- "@agimon-ai/doompi-core": "0.0.1-alpha.78",
237
- "@agimon-ai/doompi-telemetry": "0.0.1-alpha.75",
238
- "@agimon-ai/doompi-ui": "0.0.1-alpha.78",
239
- "@agimon-ai/doompi-web-components": "0.0.1-alpha.36",
240
- "@agimon-ai/doompi-web-security": "0.0.1-alpha.38",
236
+ "@agimon-ai/doompi-core": "0.0.1-alpha.79",
237
+ "@agimon-ai/doompi-telemetry": "0.0.1-alpha.76",
238
+ "@agimon-ai/doompi-ui": "0.0.1-alpha.79",
239
+ "@agimon-ai/doompi-web-components": "0.0.1-alpha.37",
240
+ "@agimon-ai/doompi-web-security": "0.0.1-alpha.39",
241
241
  "@agimon-ai/foundation-process-registry": "0.29.25",
242
242
  "@deepseek-ai/cordis": "4.0.2",
243
243
  "@rmux/sdk": "0.6.5",
@@ -246,7 +246,7 @@
246
246
  "typebox": "1.3.30"
247
247
  },
248
248
  "devDependencies": {
249
- "@agimon-ai/doompi-build": "0.0.1-alpha.7",
249
+ "@agimon-ai/doompi-build": "0.0.1-alpha.8",
250
250
  "@earendil-works/pi-coding-agent": "0.86.0",
251
251
  "@earendil-works/pi-tui": "0.86.0",
252
252
  "@tanstack/react-store": "0.11.1",
@@ -273,14 +273,14 @@
273
273
  }
274
274
  },
275
275
  "optionalDependencies": {
276
- "@agimon-ai/doompi-runner-rmux-darwin-arm64": "0.0.1-alpha.73",
277
- "@agimon-ai/doompi-runner-rmux-darwin-x64": "0.0.1-alpha.73",
278
- "@agimon-ai/doompi-runner-rmux-linux-arm64": "0.0.1-alpha.73",
279
- "@agimon-ai/doompi-runner-rmux-linux-x64": "0.0.1-alpha.73",
280
- "@agimon-ai/doompi-runner-rtk-darwin-arm64": "0.0.1-alpha.73",
281
- "@agimon-ai/doompi-runner-rtk-darwin-x64": "0.0.1-alpha.73",
282
- "@agimon-ai/doompi-runner-rtk-linux-arm64": "0.0.1-alpha.73",
283
- "@agimon-ai/doompi-runner-rtk-linux-x64": "0.0.1-alpha.73"
276
+ "@agimon-ai/doompi-runner-rmux-darwin-arm64": "0.0.1-alpha.74",
277
+ "@agimon-ai/doompi-runner-rmux-darwin-x64": "0.0.1-alpha.74",
278
+ "@agimon-ai/doompi-runner-rmux-linux-arm64": "0.0.1-alpha.74",
279
+ "@agimon-ai/doompi-runner-rmux-linux-x64": "0.0.1-alpha.74",
280
+ "@agimon-ai/doompi-runner-rtk-darwin-arm64": "0.0.1-alpha.74",
281
+ "@agimon-ai/doompi-runner-rtk-darwin-x64": "0.0.1-alpha.74",
282
+ "@agimon-ai/doompi-runner-rtk-linux-arm64": "0.0.1-alpha.74",
283
+ "@agimon-ai/doompi-runner-rtk-linux-x64": "0.0.1-alpha.74"
284
284
  },
285
285
  "engines": {
286
286
  "node": ">=22.19.0"
@@ -27,8 +27,8 @@ CLI to manage it without adding another model tool.
27
27
 
28
28
  ## CLI
29
29
 
30
- Run the CLI directly, without starting it through another supervised runner.
31
- It inherits `PI_SESSION_ID` from the active Pi session and only accesses that
30
+ Invoke the CLI through the available Bash tool to inspect or control an existing
31
+ runner. Do not relaunch its original command to recover output. The CLI inherits `PI_SESSION_ID` from the active Pi session and only accesses that
32
32
  session's runners. A manual shell without `PI_SESSION_ID` fails closed.
33
33
 
34
34
  Use the unique runner ID returned by `bash`:
@@ -54,9 +54,10 @@ Use the unique runner ID returned by `bash`:
54
54
  - **`input` needs `interactive: true`.** A normal runner does not expose stdin.
55
55
  - **Stop what you no longer need.** Everything still running is stopped when
56
56
  the session ends, but a forgotten dev server holds a port until then.
57
- - **You are told when a runner exits.** A completion message with the exit
58
- status and log path arrives on its own. Never sleep, poll, or pgrep to wait
59
- for one. Check a runner when you have a reason to, not on a loop.
57
+ - **Completion delivery depends on the client.** Local DoomPi can notify its
58
+ agent, but remote MCP callers must not assume that this wakes their chat.
59
+ Use a bounded status or log read when needed. Do not sleep or poll in a loop,
60
+ promise automatic continuation, or report a running command as completed.
60
61
  - **Do not pipe to head or tail.** Results are already bounded and the full log
61
62
  is on disk. A tail pipe also leaves the live log empty until the command
62
63
  exits, which blanks the log pane in Runner Space.
@@ -13,16 +13,18 @@ Use Runner for shell work that may outlive one tool call, needs durable logs, or
13
13
  - Let short commands return inline.
14
14
  - Set `background: true` when the command should detach immediately.
15
15
  - Set `interactive: true` only when the process genuinely needs terminal input.
16
- - Give long foreground work a realistic timeout. Commands that cross the promotion threshold can continue as supervised runners.
16
+ - `timeout` only governs the foreground wait. A command promoted to the background can continue past it; do not treat it as a background deadline.
17
17
 
18
18
  ## Inspect and control work
19
19
 
20
- Use `/runners` or `SPC r l` in the TUI. For direct control, use:
20
+ For remote MCP, run the following commands through `bash`. They inherit the
21
+ bound session; do not supply another session ID. `/runners` and `SPC r l` are
22
+ local TUI interfaces, not shell commands or remote tools. For direct control, use:
21
23
 
22
24
  ```bash
23
25
  doom-runner list
24
26
  doom-runner status <runner-id>
25
- doom-runner logs <runner-id>
27
+ doom-runner logs <runner-id> --lines 100
26
28
  doom-runner input <runner-id> --text "y" --enter
27
29
  doom-runner stop <runner-id>
28
30
  doom-runner stop-all
@@ -32,6 +34,11 @@ Input requires a running interactive process backed by RMUX. Preserve the return
32
34
 
33
35
  ## Close the lifecycle
34
36
 
37
+ Remote MCP does not guarantee that completion notifications resume a ChatGPT
38
+ conversation. Retrieve a bounded status or log result during the current turn
39
+ when needed. Otherwise report that the run is still active with its identifier.
40
+ Do not promise automatic follow-up, continuously poll, or relaunch uncertain work.
41
+
35
42
  - Inspect logs instead of relaunching a command whose status is uncertain.
36
43
  - Stop watchers, servers, and failed interactive processes when they are no longer needed.
37
44
  - Treat commands as running with the Doom Pi process environment and the operating-system user's privileges.