@agimon-ai/po-runner 0.0.0-alpha.21 → 0.0.0-alpha.23

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 (67) hide show
  1. package/dist/apiContracts.cjs +8 -1
  2. package/dist/apiContracts.cjs.map +1 -1
  3. package/dist/apiContracts.d.mts.map +1 -1
  4. package/dist/apiContracts.mjs +8 -1
  5. package/dist/apiContracts.mjs.map +1 -1
  6. package/dist/{bashRunService-Ci0cGdYO.d.mts → bashRunService-BL4JIUi2.d.mts} +6 -1
  7. package/dist/bashRunService-BL4JIUi2.d.mts.map +1 -0
  8. package/dist/{bashRunService-DjOH5kye.cjs → bashRunService-CJhMNrPz.cjs} +8 -4
  9. package/dist/bashRunService-CJhMNrPz.cjs.map +1 -0
  10. package/dist/{bashRunService-Cl3pYccr.mjs → bashRunService-DbYsj1zc.mjs} +8 -4
  11. package/dist/bashRunService-DbYsj1zc.mjs.map +1 -0
  12. package/dist/bashRunService.cjs +1 -1
  13. package/dist/bashRunService.d.mts +1 -1
  14. package/dist/bashRunService.d.mts.map +1 -1
  15. package/dist/bashRunService.mjs +1 -1
  16. package/dist/bashTool.cjs +1 -1
  17. package/dist/bashTool.d.mts +2 -2
  18. package/dist/bashTool.mjs +1 -1
  19. package/dist/bin/cli.cjs +1 -1
  20. package/dist/bin/cli.mjs +1 -1
  21. package/dist/extensions/mcp.cjs +1 -0
  22. package/dist/extensions/mcp.cjs.map +1 -1
  23. package/dist/extensions/mcp.mjs +1 -0
  24. package/dist/extensions/mcp.mjs.map +1 -1
  25. package/dist/extensions/native.mjs +533 -256
  26. package/dist/extensions/native.mjs.map +1 -1
  27. package/dist/extensions/server.cjs +24 -6
  28. package/dist/extensions/server.cjs.map +1 -1
  29. package/dist/extensions/server.mjs +23 -5
  30. package/dist/extensions/server.mjs.map +1 -1
  31. package/dist/extensions/web.mjs +459 -517
  32. package/dist/extensions/web.mjs.map +1 -1
  33. package/dist/{headless-Dko_yBiy.cjs → headless-BqYKFHwy.cjs} +31 -6
  34. package/dist/headless-BqYKFHwy.cjs.map +1 -0
  35. package/dist/{headless-DOlCixyf.mjs → headless-CV-eb5rz.mjs} +31 -6
  36. package/dist/headless-CV-eb5rz.mjs.map +1 -0
  37. package/dist/{index-BzeXJk6V.d.mts → index-BciAgV5f.d.mts} +11 -4
  38. package/dist/index-BciAgV5f.d.mts.map +1 -0
  39. package/dist/{index--xF7DvsE.d.mts → index-CXbcmf-G.d.mts} +2 -2
  40. package/dist/{index--xF7DvsE.d.mts.map → index-CXbcmf-G.d.mts.map} +1 -1
  41. package/dist/index.cjs +4 -4
  42. package/dist/index.d.mts +2 -2
  43. package/dist/index.mjs +2 -2
  44. package/dist/responseEnvelope.d.mts +1 -1
  45. package/dist/{rmuxBackend-Dh0CYVAL.cjs → rmuxBackend-Cod2H85V.cjs} +2 -2
  46. package/dist/{rmuxBackend-Dh0CYVAL.cjs.map → rmuxBackend-Cod2H85V.cjs.map} +1 -1
  47. package/dist/rmuxBackend.cjs +1 -1
  48. package/dist/{rtkProcessor-DSGbM-Cm.cjs → rtkProcessor-xwARIxhe.cjs} +2 -2
  49. package/dist/{rtkProcessor-DSGbM-Cm.cjs.map → rtkProcessor-xwARIxhe.cjs.map} +1 -1
  50. package/dist/rtkProcessor.cjs +1 -1
  51. package/dist/{runnerDependencies-7h_cxOva.mjs → runnerDependencies-CamKwphq.mjs} +2 -2
  52. package/dist/{runnerDependencies-7h_cxOva.mjs.map → runnerDependencies-CamKwphq.mjs.map} +1 -1
  53. package/dist/{runnerDependencies-DSun3xO-.cjs → runnerDependencies-HIqMQp9b.cjs} +4 -4
  54. package/dist/{runnerDependencies-DSun3xO-.cjs.map → runnerDependencies-HIqMQp9b.cjs.map} +1 -1
  55. package/dist/runnerDependencies.cjs +1 -1
  56. package/dist/runnerDependencies.d.mts +1 -1
  57. package/dist/runnerDependencies.mjs +1 -1
  58. package/dist/{type-Do0YxwVQ.d.mts → type-BQ2shEB5.d.mts} +2 -2
  59. package/dist/{type-Do0YxwVQ.d.mts.map → type-BQ2shEB5.d.mts.map} +1 -1
  60. package/dist/types.d.mts +1 -1
  61. package/package.json +17 -17
  62. package/dist/bashRunService-Ci0cGdYO.d.mts.map +0 -1
  63. package/dist/bashRunService-Cl3pYccr.mjs.map +0 -1
  64. package/dist/bashRunService-DjOH5kye.cjs.map +0 -1
  65. package/dist/headless-DOlCixyf.mjs.map +0 -1
  66. package/dist/headless-Dko_yBiy.cjs.map +0 -1
  67. package/dist/index-BzeXJk6V.d.mts.map +0 -1
@@ -2,6 +2,8 @@ const require_runnerConfig = require("./runnerConfig-BoLMinlx.cjs");
2
2
  const require_bashTool = require("./bashTool-euL6zMDl.cjs");
3
3
  const require_bashResult = require("./bashResult-C2iKhHpD.cjs");
4
4
  const require_reconcile = require("./reconcile-5cZ11jSD.cjs");
5
+ let node_path = require("node:path");
6
+ let _agimon_ai_po_core_platform = require("@agimon-ai/po-core/platform");
5
7
  //#region src/constants/headless.ts
6
8
  const MS_PER_SECOND = 1e3;
7
9
  //#endregion
@@ -46,7 +48,10 @@ function parseStart(tail) {
46
48
  const key = token.slice(0, split);
47
49
  if (key === "name" && value !== "") request.name = value;
48
50
  if (key === "cwd" && value !== "") request.cwd = value;
49
- if (key === "interactive") request.interactive = value === "true";
51
+ if (key === "interactive") {
52
+ request.interactive = value === "true";
53
+ if (value === "prefer") request.preferInteractive = true;
54
+ }
50
55
  }
51
56
  return request;
52
57
  }
@@ -103,7 +108,15 @@ function createHeadlessBashTool(bashRunService, summarizeLog, settings, environm
103
108
  }
104
109
  };
105
110
  }
106
- function createHeadlessRunnersCommand(dependencies) {
111
+ /** A folder as typed, relative to the session directory; undefined when it is not one. */
112
+ async function runnerFolder(sessionDirectory, folder, fs) {
113
+ if (folder === void 0) return sessionDirectory;
114
+ const path = (0, node_path.resolve)(sessionDirectory, folder);
115
+ if (!fs) return path;
116
+ const info = await fs.fileInfo(path, _agimon_ai_po_core_platform.BACKGROUND_CONTEXT);
117
+ return info.ok && info.value.kind === "directory" ? path : void 0;
118
+ }
119
+ function createHeadlessRunnersCommand(dependencies, { fs, onStart } = {}) {
107
120
  return {
108
121
  name: COMMAND_NAME,
109
122
  description: SERVER_COMMAND_DESCRIPTION,
@@ -119,17 +132,29 @@ function createHeadlessRunnersCommand(dependencies) {
119
132
  }
120
133
  if (request.kind === "start") {
121
134
  if (!request.command) throw new Error("Usage: /runners start [name=x] [cwd=y] [interactive=true] -- <command>");
135
+ const cwd = await runnerFolder(context.cwd, request.cwd, fs);
136
+ if (cwd === void 0) {
137
+ const message = `That folder does not exist: ${request.cwd ?? ""}`;
138
+ onStart?.(context.sessionId, message);
139
+ await context.client.notify({
140
+ body: message,
141
+ level: "error"
142
+ });
143
+ return;
144
+ }
122
145
  const result = await dependencies.bashRunService.run({
123
146
  command: request.command,
124
147
  background: true,
125
148
  sessionId: context.sessionId,
126
- cwd: request.cwd === void 0 ? context.cwd : request.cwd,
149
+ cwd,
127
150
  ...request.name ? { name: request.name } : {},
128
- ...request.interactive ? { interactive: true } : {}
151
+ ...request.interactive ? { interactive: true } : {},
152
+ ...request.preferInteractive ? { preferInteractive: true } : {}
129
153
  });
154
+ onStart?.(context.sessionId, result.kind === "failed" ? result.error : void 0);
130
155
  await context.client.notify({
131
156
  body: require_bashResult.formatRunResult(result, {}, void 0, dependencies.settings, dependencies.environment).content[0]?.text ?? "Runner started.",
132
- level: "info"
157
+ level: result.kind === "failed" ? "error" : "info"
133
158
  });
134
159
  return;
135
160
  }
@@ -177,4 +202,4 @@ Object.defineProperty(exports, "createHeadlessRunnersCommand", {
177
202
  }
178
203
  });
179
204
 
180
- //# sourceMappingURL=headless-Dko_yBiy.cjs.map
205
+ //# sourceMappingURL=headless-BqYKFHwy.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-BqYKFHwy.cjs","names":["BASH_TOOL_NAME","BASH_TOOL_LABEL","getBackgroundThresholdMs","BashParamsSchema","textResult","formatRunResult","parseResultPragma","resolve","BACKGROUND_CONTEXT","stopRunnerProcess"],"sources":["../src/constants/headless.ts","../src/constants/runners.ts","../src/constants/runnersCommand.ts","../src/services/runnersCommand/index.ts","../src/services/headless/index.ts"],"sourcesContent":["export const MS_PER_SECOND = 1000;\n","export const COMMAND_NAME = 'runners';\nexport const COMMAND_DESCRIPTION =\n 'Open Runner Space: background processes started by bash. `/runners stop <id> [reason]` stops one, `/runners start [name=x] [cwd=y] [interactive=true] -- <command>` starts one.';\nexport const SERVER_COMMAND_DESCRIPTION = 'Start and stop supervised background runners without a terminal UI.';\n","export const RUNNERS_STOP_VERB = 'stop';\nexport const RUNNERS_START_VERB = 'start';\nexport const RUNNERS_COMMAND_SEPARATOR = '--';\nexport const NAME_KEY = 'name';\nexport const CWD_KEY = 'cwd';\nexport const INTERACTIVE_KEY = 'interactive';\n/** `interactive=prefer`: a terminal when rmux or tmux is available, plain output otherwise. */\nexport const INTERACTIVE_PREFER = 'prefer';\n","import {\n CWD_KEY,\n INTERACTIVE_KEY,\n INTERACTIVE_PREFER,\n NAME_KEY,\n RUNNERS_COMMAND_SEPARATOR,\n RUNNERS_START_VERB,\n RUNNERS_STOP_VERB,\n} from '../../constants/runnersCommand';\n/** The `/runners` verb that stops one runner without opening Runner Space. */\n/** The `/runners` verb that starts one, for a client that cannot call the bash tool. */\n/**\n * Ends the options and begins the command.\n *\n * A command is arbitrary shell: it may hold `=`, and it may hold flags of its\n * own (`pnpm test -- --watch`). Only the first of these is the separator, so\n * everything the reader typed survives intact after it.\n */\n\nexport interface RunnersStartRequest {\n kind: 'start';\n /** The shell command to run; empty when the reader gave none. */\n command: string;\n cwd?: string;\n name?: string;\n interactive: boolean;\n /** `interactive=prefer`: a terminal when one is available, plain output otherwise. */\n preferInteractive?: boolean;\n}\n\nexport type RunnersCommandRequest =\n /** No arguments: open Runner Space. */\n | { kind: 'space' }\n /** `stop <id> [reason]`: stop one runner headlessly; id is empty when it was left out. */\n | { kind: 'stop'; id: string; reason?: string }\n /** `start [key=value ...] -- <command>`: start one headlessly. */\n | RunnersStartRequest;\n\n/** Splits on whitespace but keeps a double-quoted run together, so a path with spaces survives. */\nfunction tokenize(text: string): string[] {\n return text.match(/(?:\"[^\"]*\"|\\S)+/gu) ?? [];\n}\n\nfunction unquote(value: string): string {\n return value.length >= 2 && value.startsWith('\"') && value.endsWith('\"') ? value.slice(1, -1) : value;\n}\n\n/**\n * Parses `start`'s tail: `key=value` pairs up to the separator, then the\n * command verbatim.\n *\n * Without a separator the whole tail is the command, so typing\n * `/runners start pnpm build` does what it looks like. Options are read only\n * when a separator says where they end, which is what keeps a command such as\n * `FOO=bar pnpm test` from being mistaken for one.\n */\nfunction parseStart(tail: string): RunnersStartRequest {\n const tokens = tokenize(tail);\n const separator = tokens.indexOf(RUNNERS_COMMAND_SEPARATOR);\n if (separator === -1) return { kind: 'start', command: tail.trim(), interactive: false };\n\n const request: RunnersStartRequest = {\n kind: 'start',\n // Sliced from the raw text rather than rejoined from tokens: rejoining\n // would collapse the spacing the reader wrote.\n command: tail.slice(tail.indexOf(RUNNERS_COMMAND_SEPARATOR) + RUNNERS_COMMAND_SEPARATOR.length).trim(),\n interactive: false,\n };\n for (const token of tokens.slice(0, separator)) {\n const split = token.indexOf('=');\n if (split <= 0) continue;\n const value = unquote(token.slice(split + 1));\n const key = token.slice(0, split);\n if (key === NAME_KEY && value !== '') request.name = value;\n if (key === CWD_KEY && value !== '') request.cwd = value;\n if (key === INTERACTIVE_KEY) {\n request.interactive = value === 'true';\n if (value === INTERACTIVE_PREFER) request.preferInteractive = true;\n }\n }\n return request;\n}\n\n/**\n * Parses `/runners` arguments. Anything other than a known verb opens Runner\n * Space, which is what the bare command has always done.\n */\nexport function parseRunnersCommand(args: string): RunnersCommandRequest {\n const trimmed = args.trim();\n const [verb = '', id = '', ...rest] = trimmed.split(/\\s+/u).filter(Boolean);\n if (verb === RUNNERS_START_VERB) return parseStart(trimmed.slice(verb.length).trim());\n if (verb !== RUNNERS_STOP_VERB) return { kind: 'space' };\n const reason = rest.join(' ').trim();\n return { kind: 'stop', id, ...(reason ? { reason } : {}) };\n}\n","import { resolve } from 'node:path';\n\nimport type {\n PoHeadlessCommand,\n PoHeadlessExecutionContext,\n PoHeadlessTool,\n PoHeadlessToolResult,\n} from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { BASH_TOOL_LABEL, BASH_TOOL_NAME } from '../../constants/bashTool';\nimport { MS_PER_SECOND } from '../../constants/headless';\nimport { COMMAND_NAME, SERVER_COMMAND_DESCRIPTION } from '../../constants/runners';\nimport { type BashParams, BashParamsSchema } from '../../schemas/bashTool';\nimport { formatRunResult, parseResultPragma, textResult } from '../../services/bashResult';\nimport { stopRunnerProcess } from '../../services/reconcile';\nimport { getBackgroundThresholdMs } from '../../services/runnerConfig';\nimport type { RunnerDependencies } from '../../services/runnerDependencies/type';\nimport { parseRunnersCommand } from '../../services/runnersCommand';\nimport { type LogSummarizer } from '../../types/bashResult';\nimport type { IBashRunService } from '../../types/bashRunService';\nimport type { RunnerSettings } from '../../types/runnerSettings';\n\nexport function createHeadlessBashTool(\n bashRunService: IBashRunService,\n summarizeLog?: LogSummarizer,\n settings?: RunnerSettings,\n environment: NodeJS.ProcessEnv = process.env,\n): PoHeadlessTool<typeof BashParamsSchema> {\n return {\n name: BASH_TOOL_NAME,\n label: BASH_TOOL_LABEL,\n description:\n 'Execute one Bash command in the current working directory. Foreground commands return bounded output; commands that outlive the threshold return a supervised runner id and streaming log path.',\n promptSnippet: 'Execute shell commands with bounded foreground output and supervised background runners',\n promptGuidelines: [\n `A command still running after ${Math.round(getBackgroundThresholdMs() / MS_PER_SECOND)} seconds remains active as a background runner with an id and streaming log path.`,\n 'Pass background: true for commands that should remain active, such as dev servers, watchers, and tails.',\n 'Stop background runners when they are no longer needed.',\n ],\n parameters: BashParamsSchema,\n executionMode: 'serial',\n execute: async (\n _toolCallId: string,\n params: BashParams,\n signal: AbortSignal | undefined,\n onUpdate: ((result: PoHeadlessToolResult) => void) | undefined,\n context: PoHeadlessExecutionContext,\n ) => {\n const { command, timeout, background, interactive, name } = params;\n if (signal?.aborted) throw new Error('Operation aborted');\n if (onUpdate)\n onUpdate(\n textResult(\n `Starting ${interactive === true ? 'interactive runner' : background === true ? 'background runner' : 'command'}...`,\n ),\n );\n let onOutput: ((output: string) => void) | undefined;\n if (background !== true && interactive !== true && onUpdate) onOutput = (output) => onUpdate(textResult(output));\n const result = await bashRunService.run({\n command,\n timeoutMs: timeout === undefined ? undefined : timeout * MS_PER_SECOND,\n background,\n interactive,\n name,\n ...(onOutput ? { onOutput } : {}),\n ...(signal ? { signal } : {}),\n cwd: context.cwd,\n sessionId: context.sessionId,\n });\n if (signal?.aborted) throw new Error('Operation aborted');\n return formatRunResult(result, parseResultPragma(command), summarizeLog, settings, environment);\n },\n };\n}\n\nexport interface HeadlessRunnersCommandOptions {\n /** Checks a typed folder exists before a runner starts in it. */\n fs?: FileSystem | undefined;\n /** Hears every start: why it did not happen, or undefined when it did, so the runners panel can say. */\n onStart?: (sessionId: string, failure: string | undefined) => void;\n}\n\n/** A folder as typed, relative to the session directory; undefined when it is not one. */\nasync function runnerFolder(\n sessionDirectory: string,\n folder: string | undefined,\n fs: FileSystem | undefined,\n): Promise<string | undefined> {\n if (folder === undefined) return sessionDirectory;\n const path = resolve(sessionDirectory, folder);\n if (!fs) return path;\n const info = await fs.fileInfo(path, BACKGROUND_CONTEXT);\n return info.ok && info.value.kind === 'directory' ? path : undefined;\n}\n\nexport function createHeadlessRunnersCommand(\n dependencies: RunnerDependencies,\n { fs, onStart }: HeadlessRunnersCommandOptions = {},\n): PoHeadlessCommand {\n return {\n name: COMMAND_NAME,\n description: SERVER_COMMAND_DESCRIPTION,\n async execute(args: string, context: PoHeadlessExecutionContext) {\n const request = parseRunnersCommand(args);\n if (request.kind === 'space') {\n const active = await dependencies.runnerRegistry.listBySession(context.sessionId);\n await context.client.notify({\n body: `${active.length} active runner${active.length === 1 ? '' : 's'}.`,\n level: 'info',\n });\n return;\n }\n if (request.kind === 'start') {\n if (!request.command) throw new Error('Usage: /runners start [name=x] [cwd=y] [interactive=true] -- <command>');\n const cwd = await runnerFolder(context.cwd, request.cwd, fs);\n if (cwd === undefined) {\n const message = `That folder does not exist: ${request.cwd ?? ''}`;\n onStart?.(context.sessionId, message);\n await context.client.notify({ body: message, level: 'error' });\n return;\n }\n const result = await dependencies.bashRunService.run({\n command: request.command,\n background: true,\n sessionId: context.sessionId,\n cwd,\n ...(request.name ? { name: request.name } : {}),\n ...(request.interactive ? { interactive: true } : {}),\n ...(request.preferInteractive ? { preferInteractive: true } : {}),\n });\n onStart?.(context.sessionId, result.kind === 'failed' ? result.error : undefined);\n await context.client.notify({\n body:\n formatRunResult(result, {}, undefined, dependencies.settings, dependencies.environment).content[0]?.text ??\n 'Runner started.',\n level: result.kind === 'failed' ? 'error' : 'info',\n });\n return;\n }\n if (!request.id) throw new Error('Usage: /runners stop <runner-id> [reason]');\n const record = await dependencies.runnerRegistry.get(request.id, context.sessionId);\n if (!record) {\n await context.client.notify({ body: `No active runner ${request.id} in this session.`, level: 'warning' });\n return;\n }\n const stopped = await stopRunnerProcess(record, dependencies.launcher, dependencies.rmuxBackend, {\n registry: dependencies.runnerRegistry,\n intent: {\n reason: 'stopped',\n terminationReason: 'user_stop',\n ...(request.reason ? { stopReason: request.reason } : {}),\n },\n });\n if (stopped) {\n await dependencies.runnerRegistry.complete(\n request.id,\n {\n reason: 'stopped',\n code: null,\n signal: null,\n ...(request.reason ? { stopReason: request.reason } : {}),\n },\n context.sessionId,\n );\n }\n await context.client.notify({\n body: stopped ? `Stopped runner ${request.id}.` : `Could not stop runner ${request.id}.`,\n level: stopped ? 'info' : 'error',\n });\n },\n };\n}\n"],"mappings":"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"}
@@ -2,6 +2,8 @@ import { t as getBackgroundThresholdMs } from "./runnerConfig-XXMq4VQA.mjs";
2
2
  import { n as BASH_TOOL_NAME, r as BashParamsSchema, t as BASH_TOOL_LABEL } from "./bashTool-BvC3YOgG.mjs";
3
3
  import { c as formatRunResult, f as parseResultPragma, m as textResult } from "./bashResult-BqDa7sbC.mjs";
4
4
  import { n as stopRunnerProcess } from "./reconcile-wNYQJZF-.mjs";
5
+ import { resolve } from "node:path";
6
+ import { BACKGROUND_CONTEXT } from "@agimon-ai/po-core/platform";
5
7
  //#region src/constants/headless.ts
6
8
  const MS_PER_SECOND = 1e3;
7
9
  //#endregion
@@ -46,7 +48,10 @@ function parseStart(tail) {
46
48
  const key = token.slice(0, split);
47
49
  if (key === "name" && value !== "") request.name = value;
48
50
  if (key === "cwd" && value !== "") request.cwd = value;
49
- if (key === "interactive") request.interactive = value === "true";
51
+ if (key === "interactive") {
52
+ request.interactive = value === "true";
53
+ if (value === "prefer") request.preferInteractive = true;
54
+ }
50
55
  }
51
56
  return request;
52
57
  }
@@ -103,7 +108,15 @@ function createHeadlessBashTool(bashRunService, summarizeLog, settings, environm
103
108
  }
104
109
  };
105
110
  }
106
- function createHeadlessRunnersCommand(dependencies) {
111
+ /** A folder as typed, relative to the session directory; undefined when it is not one. */
112
+ async function runnerFolder(sessionDirectory, folder, fs) {
113
+ if (folder === void 0) return sessionDirectory;
114
+ const path = resolve(sessionDirectory, folder);
115
+ if (!fs) return path;
116
+ const info = await fs.fileInfo(path, BACKGROUND_CONTEXT);
117
+ return info.ok && info.value.kind === "directory" ? path : void 0;
118
+ }
119
+ function createHeadlessRunnersCommand(dependencies, { fs, onStart } = {}) {
107
120
  return {
108
121
  name: COMMAND_NAME,
109
122
  description: SERVER_COMMAND_DESCRIPTION,
@@ -119,17 +132,29 @@ function createHeadlessRunnersCommand(dependencies) {
119
132
  }
120
133
  if (request.kind === "start") {
121
134
  if (!request.command) throw new Error("Usage: /runners start [name=x] [cwd=y] [interactive=true] -- <command>");
135
+ const cwd = await runnerFolder(context.cwd, request.cwd, fs);
136
+ if (cwd === void 0) {
137
+ const message = `That folder does not exist: ${request.cwd ?? ""}`;
138
+ onStart?.(context.sessionId, message);
139
+ await context.client.notify({
140
+ body: message,
141
+ level: "error"
142
+ });
143
+ return;
144
+ }
122
145
  const result = await dependencies.bashRunService.run({
123
146
  command: request.command,
124
147
  background: true,
125
148
  sessionId: context.sessionId,
126
- cwd: request.cwd === void 0 ? context.cwd : request.cwd,
149
+ cwd,
127
150
  ...request.name ? { name: request.name } : {},
128
- ...request.interactive ? { interactive: true } : {}
151
+ ...request.interactive ? { interactive: true } : {},
152
+ ...request.preferInteractive ? { preferInteractive: true } : {}
129
153
  });
154
+ onStart?.(context.sessionId, result.kind === "failed" ? result.error : void 0);
130
155
  await context.client.notify({
131
156
  body: formatRunResult(result, {}, void 0, dependencies.settings, dependencies.environment).content[0]?.text ?? "Runner started.",
132
- level: "info"
157
+ level: result.kind === "failed" ? "error" : "info"
133
158
  });
134
159
  return;
135
160
  }
@@ -166,4 +191,4 @@ function createHeadlessRunnersCommand(dependencies) {
166
191
  //#endregion
167
192
  export { createHeadlessRunnersCommand as n, createHeadlessBashTool as t };
168
193
 
169
- //# sourceMappingURL=headless-DOlCixyf.mjs.map
194
+ //# sourceMappingURL=headless-CV-eb5rz.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-CV-eb5rz.mjs","names":[],"sources":["../src/constants/headless.ts","../src/constants/runners.ts","../src/constants/runnersCommand.ts","../src/services/runnersCommand/index.ts","../src/services/headless/index.ts"],"sourcesContent":["export const MS_PER_SECOND = 1000;\n","export const COMMAND_NAME = 'runners';\nexport const COMMAND_DESCRIPTION =\n 'Open Runner Space: background processes started by bash. `/runners stop <id> [reason]` stops one, `/runners start [name=x] [cwd=y] [interactive=true] -- <command>` starts one.';\nexport const SERVER_COMMAND_DESCRIPTION = 'Start and stop supervised background runners without a terminal UI.';\n","export const RUNNERS_STOP_VERB = 'stop';\nexport const RUNNERS_START_VERB = 'start';\nexport const RUNNERS_COMMAND_SEPARATOR = '--';\nexport const NAME_KEY = 'name';\nexport const CWD_KEY = 'cwd';\nexport const INTERACTIVE_KEY = 'interactive';\n/** `interactive=prefer`: a terminal when rmux or tmux is available, plain output otherwise. */\nexport const INTERACTIVE_PREFER = 'prefer';\n","import {\n CWD_KEY,\n INTERACTIVE_KEY,\n INTERACTIVE_PREFER,\n NAME_KEY,\n RUNNERS_COMMAND_SEPARATOR,\n RUNNERS_START_VERB,\n RUNNERS_STOP_VERB,\n} from '../../constants/runnersCommand';\n/** The `/runners` verb that stops one runner without opening Runner Space. */\n/** The `/runners` verb that starts one, for a client that cannot call the bash tool. */\n/**\n * Ends the options and begins the command.\n *\n * A command is arbitrary shell: it may hold `=`, and it may hold flags of its\n * own (`pnpm test -- --watch`). Only the first of these is the separator, so\n * everything the reader typed survives intact after it.\n */\n\nexport interface RunnersStartRequest {\n kind: 'start';\n /** The shell command to run; empty when the reader gave none. */\n command: string;\n cwd?: string;\n name?: string;\n interactive: boolean;\n /** `interactive=prefer`: a terminal when one is available, plain output otherwise. */\n preferInteractive?: boolean;\n}\n\nexport type RunnersCommandRequest =\n /** No arguments: open Runner Space. */\n | { kind: 'space' }\n /** `stop <id> [reason]`: stop one runner headlessly; id is empty when it was left out. */\n | { kind: 'stop'; id: string; reason?: string }\n /** `start [key=value ...] -- <command>`: start one headlessly. */\n | RunnersStartRequest;\n\n/** Splits on whitespace but keeps a double-quoted run together, so a path with spaces survives. */\nfunction tokenize(text: string): string[] {\n return text.match(/(?:\"[^\"]*\"|\\S)+/gu) ?? [];\n}\n\nfunction unquote(value: string): string {\n return value.length >= 2 && value.startsWith('\"') && value.endsWith('\"') ? value.slice(1, -1) : value;\n}\n\n/**\n * Parses `start`'s tail: `key=value` pairs up to the separator, then the\n * command verbatim.\n *\n * Without a separator the whole tail is the command, so typing\n * `/runners start pnpm build` does what it looks like. Options are read only\n * when a separator says where they end, which is what keeps a command such as\n * `FOO=bar pnpm test` from being mistaken for one.\n */\nfunction parseStart(tail: string): RunnersStartRequest {\n const tokens = tokenize(tail);\n const separator = tokens.indexOf(RUNNERS_COMMAND_SEPARATOR);\n if (separator === -1) return { kind: 'start', command: tail.trim(), interactive: false };\n\n const request: RunnersStartRequest = {\n kind: 'start',\n // Sliced from the raw text rather than rejoined from tokens: rejoining\n // would collapse the spacing the reader wrote.\n command: tail.slice(tail.indexOf(RUNNERS_COMMAND_SEPARATOR) + RUNNERS_COMMAND_SEPARATOR.length).trim(),\n interactive: false,\n };\n for (const token of tokens.slice(0, separator)) {\n const split = token.indexOf('=');\n if (split <= 0) continue;\n const value = unquote(token.slice(split + 1));\n const key = token.slice(0, split);\n if (key === NAME_KEY && value !== '') request.name = value;\n if (key === CWD_KEY && value !== '') request.cwd = value;\n if (key === INTERACTIVE_KEY) {\n request.interactive = value === 'true';\n if (value === INTERACTIVE_PREFER) request.preferInteractive = true;\n }\n }\n return request;\n}\n\n/**\n * Parses `/runners` arguments. Anything other than a known verb opens Runner\n * Space, which is what the bare command has always done.\n */\nexport function parseRunnersCommand(args: string): RunnersCommandRequest {\n const trimmed = args.trim();\n const [verb = '', id = '', ...rest] = trimmed.split(/\\s+/u).filter(Boolean);\n if (verb === RUNNERS_START_VERB) return parseStart(trimmed.slice(verb.length).trim());\n if (verb !== RUNNERS_STOP_VERB) return { kind: 'space' };\n const reason = rest.join(' ').trim();\n return { kind: 'stop', id, ...(reason ? { reason } : {}) };\n}\n","import { resolve } from 'node:path';\n\nimport type {\n PoHeadlessCommand,\n PoHeadlessExecutionContext,\n PoHeadlessTool,\n PoHeadlessToolResult,\n} from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { BASH_TOOL_LABEL, BASH_TOOL_NAME } from '../../constants/bashTool';\nimport { MS_PER_SECOND } from '../../constants/headless';\nimport { COMMAND_NAME, SERVER_COMMAND_DESCRIPTION } from '../../constants/runners';\nimport { type BashParams, BashParamsSchema } from '../../schemas/bashTool';\nimport { formatRunResult, parseResultPragma, textResult } from '../../services/bashResult';\nimport { stopRunnerProcess } from '../../services/reconcile';\nimport { getBackgroundThresholdMs } from '../../services/runnerConfig';\nimport type { RunnerDependencies } from '../../services/runnerDependencies/type';\nimport { parseRunnersCommand } from '../../services/runnersCommand';\nimport { type LogSummarizer } from '../../types/bashResult';\nimport type { IBashRunService } from '../../types/bashRunService';\nimport type { RunnerSettings } from '../../types/runnerSettings';\n\nexport function createHeadlessBashTool(\n bashRunService: IBashRunService,\n summarizeLog?: LogSummarizer,\n settings?: RunnerSettings,\n environment: NodeJS.ProcessEnv = process.env,\n): PoHeadlessTool<typeof BashParamsSchema> {\n return {\n name: BASH_TOOL_NAME,\n label: BASH_TOOL_LABEL,\n description:\n 'Execute one Bash command in the current working directory. Foreground commands return bounded output; commands that outlive the threshold return a supervised runner id and streaming log path.',\n promptSnippet: 'Execute shell commands with bounded foreground output and supervised background runners',\n promptGuidelines: [\n `A command still running after ${Math.round(getBackgroundThresholdMs() / MS_PER_SECOND)} seconds remains active as a background runner with an id and streaming log path.`,\n 'Pass background: true for commands that should remain active, such as dev servers, watchers, and tails.',\n 'Stop background runners when they are no longer needed.',\n ],\n parameters: BashParamsSchema,\n executionMode: 'serial',\n execute: async (\n _toolCallId: string,\n params: BashParams,\n signal: AbortSignal | undefined,\n onUpdate: ((result: PoHeadlessToolResult) => void) | undefined,\n context: PoHeadlessExecutionContext,\n ) => {\n const { command, timeout, background, interactive, name } = params;\n if (signal?.aborted) throw new Error('Operation aborted');\n if (onUpdate)\n onUpdate(\n textResult(\n `Starting ${interactive === true ? 'interactive runner' : background === true ? 'background runner' : 'command'}...`,\n ),\n );\n let onOutput: ((output: string) => void) | undefined;\n if (background !== true && interactive !== true && onUpdate) onOutput = (output) => onUpdate(textResult(output));\n const result = await bashRunService.run({\n command,\n timeoutMs: timeout === undefined ? undefined : timeout * MS_PER_SECOND,\n background,\n interactive,\n name,\n ...(onOutput ? { onOutput } : {}),\n ...(signal ? { signal } : {}),\n cwd: context.cwd,\n sessionId: context.sessionId,\n });\n if (signal?.aborted) throw new Error('Operation aborted');\n return formatRunResult(result, parseResultPragma(command), summarizeLog, settings, environment);\n },\n };\n}\n\nexport interface HeadlessRunnersCommandOptions {\n /** Checks a typed folder exists before a runner starts in it. */\n fs?: FileSystem | undefined;\n /** Hears every start: why it did not happen, or undefined when it did, so the runners panel can say. */\n onStart?: (sessionId: string, failure: string | undefined) => void;\n}\n\n/** A folder as typed, relative to the session directory; undefined when it is not one. */\nasync function runnerFolder(\n sessionDirectory: string,\n folder: string | undefined,\n fs: FileSystem | undefined,\n): Promise<string | undefined> {\n if (folder === undefined) return sessionDirectory;\n const path = resolve(sessionDirectory, folder);\n if (!fs) return path;\n const info = await fs.fileInfo(path, BACKGROUND_CONTEXT);\n return info.ok && info.value.kind === 'directory' ? path : undefined;\n}\n\nexport function createHeadlessRunnersCommand(\n dependencies: RunnerDependencies,\n { fs, onStart }: HeadlessRunnersCommandOptions = {},\n): PoHeadlessCommand {\n return {\n name: COMMAND_NAME,\n description: SERVER_COMMAND_DESCRIPTION,\n async execute(args: string, context: PoHeadlessExecutionContext) {\n const request = parseRunnersCommand(args);\n if (request.kind === 'space') {\n const active = await dependencies.runnerRegistry.listBySession(context.sessionId);\n await context.client.notify({\n body: `${active.length} active runner${active.length === 1 ? '' : 's'}.`,\n level: 'info',\n });\n return;\n }\n if (request.kind === 'start') {\n if (!request.command) throw new Error('Usage: /runners start [name=x] [cwd=y] [interactive=true] -- <command>');\n const cwd = await runnerFolder(context.cwd, request.cwd, fs);\n if (cwd === undefined) {\n const message = `That folder does not exist: ${request.cwd ?? ''}`;\n onStart?.(context.sessionId, message);\n await context.client.notify({ body: message, level: 'error' });\n return;\n }\n const result = await dependencies.bashRunService.run({\n command: request.command,\n background: true,\n sessionId: context.sessionId,\n cwd,\n ...(request.name ? { name: request.name } : {}),\n ...(request.interactive ? { interactive: true } : {}),\n ...(request.preferInteractive ? { preferInteractive: true } : {}),\n });\n onStart?.(context.sessionId, result.kind === 'failed' ? result.error : undefined);\n await context.client.notify({\n body:\n formatRunResult(result, {}, undefined, dependencies.settings, dependencies.environment).content[0]?.text ??\n 'Runner started.',\n level: result.kind === 'failed' ? 'error' : 'info',\n });\n return;\n }\n if (!request.id) throw new Error('Usage: /runners stop <runner-id> [reason]');\n const record = await dependencies.runnerRegistry.get(request.id, context.sessionId);\n if (!record) {\n await context.client.notify({ body: `No active runner ${request.id} in this session.`, level: 'warning' });\n return;\n }\n const stopped = await stopRunnerProcess(record, dependencies.launcher, dependencies.rmuxBackend, {\n registry: dependencies.runnerRegistry,\n intent: {\n reason: 'stopped',\n terminationReason: 'user_stop',\n ...(request.reason ? { stopReason: request.reason } : {}),\n },\n });\n if (stopped) {\n await dependencies.runnerRegistry.complete(\n request.id,\n {\n reason: 'stopped',\n code: null,\n signal: null,\n ...(request.reason ? { stopReason: request.reason } : {}),\n },\n context.sessionId,\n );\n }\n await context.client.notify({\n body: stopped ? `Stopped runner ${request.id}.` : `Could not stop runner ${request.id}.`,\n level: stopped ? 'info' : 'error',\n });\n },\n };\n}\n"],"mappings":"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"}
@@ -1,12 +1,19 @@
1
- import { a as IBashRunService } from "./bashRunService-Ci0cGdYO.mjs";
1
+ import { a as IBashRunService } from "./bashRunService-BL4JIUi2.mjs";
2
2
  import { n as BashParamsSchema } from "./bashTool-B1EwZLo_.mjs";
3
3
  import { r as LogSummarizer } from "./bashResult-DcrRaBLv.mjs";
4
4
  import { t as RunnerSettings } from "./runnerSettings-DiV1lvzx.mjs";
5
- import { t as RunnerDependencies } from "./type-Do0YxwVQ.mjs";
5
+ import { t as RunnerDependencies } from "./type-BQ2shEB5.mjs";
6
+ import { FileSystem } from "@agimon-ai/po-core/platform";
6
7
  import { PoHeadlessCommand, PoHeadlessTool } from "@agimon-ai/po-core/headless";
7
8
  //#region src/services/headless/index.d.ts
8
9
  declare function createHeadlessBashTool(bashRunService: IBashRunService, summarizeLog?: LogSummarizer, settings?: RunnerSettings, environment?: NodeJS.ProcessEnv): PoHeadlessTool<typeof BashParamsSchema>;
9
- declare function createHeadlessRunnersCommand(dependencies: RunnerDependencies): PoHeadlessCommand;
10
+ interface HeadlessRunnersCommandOptions {
11
+ /** Checks a typed folder exists before a runner starts in it. */
12
+ fs?: FileSystem | undefined;
13
+ /** Hears every start: why it did not happen, or undefined when it did, so the runners panel can say. */
14
+ onStart?: (sessionId: string, failure: string | undefined) => void;
15
+ }
16
+ declare function createHeadlessRunnersCommand(dependencies: RunnerDependencies, { fs, onStart }?: HeadlessRunnersCommandOptions): PoHeadlessCommand;
10
17
  //#endregion
11
18
  export { createHeadlessRunnersCommand as n, createHeadlessBashTool as t };
12
- //# sourceMappingURL=index-BzeXJk6V.d.mts.map
19
+ //# sourceMappingURL=index-BciAgV5f.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BciAgV5f.d.mts","names":[],"sources":["../src/services/headless/index.ts"],"mappings":";;;;;;;;iBAuBgB,uBACd,gBAAgB,iBAChB,eAAe,eACf,WAAW,gBACX,cAAa,OAAO,aACnB,sBAAsB;UAgDR;;EAEf,KAAK;;EAEL,WAAW,mBAAmB;;iBAgBhB,6BACd,cAAc,sBACZ,IAAI,YAAW,gCAChB"}
@@ -1,4 +1,4 @@
1
- import { t as RunnerDependencies } from "./type-Do0YxwVQ.mjs";
1
+ import { t as RunnerDependencies } from "./type-BQ2shEB5.mjs";
2
2
  import { PoHostExecutionBudget } from "@agimon-ai/po-core/packageApi";
3
3
  //#region src/services/runnerDependencies/index.d.ts
4
4
  /**
@@ -19,4 +19,4 @@ declare function createRunnerDependencies(overrides: Partial<RunnerDependencies>
19
19
  }): RunnerDependencies;
20
20
  //#endregion
21
21
  export { createRunnerDependencies as t };
22
- //# sourceMappingURL=index--xF7DvsE.d.mts.map
22
+ //# sourceMappingURL=index-CXbcmf-G.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index--xF7DvsE.d.mts","names":[],"sources":["../src/services/runnerDependencies/index.ts"],"mappings":";;;;;;;;;;;;;;iBA4CgB,yBACd,WAAW,QAAQ;EACjB,aAAa,SAAS;EACtB;EACA,kBAAkB;IAEnB"}
1
+ {"version":3,"file":"index-CXbcmf-G.d.mts","names":[],"sources":["../src/services/runnerDependencies/index.ts"],"mappings":";;;;;;;;;;;;;;iBA4CgB,yBACd,WAAW,QAAQ;EACjB,aAAa,SAAS;EACtB;EACA,kBAAkB;IAEnB"}
package/dist/index.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_runnerConfig = require("./runnerConfig-BoLMinlx.cjs");
3
- const require_headless = require("./headless-Dko_yBiy.cjs");
4
- const require_rmuxBackend = require("./rmuxBackend-Dh0CYVAL.cjs");
5
- const require_rtkProcessor = require("./rtkProcessor-DSGbM-Cm.cjs");
6
- const require_runnerDependencies = require("./runnerDependencies-DSun3xO-.cjs");
3
+ const require_headless = require("./headless-BqYKFHwy.cjs");
4
+ const require_rmuxBackend = require("./rmuxBackend-Cod2H85V.cjs");
5
+ const require_rtkProcessor = require("./rtkProcessor-xwARIxhe.cjs");
6
+ const require_runnerDependencies = require("./runnerDependencies-HIqMQp9b.cjs");
7
7
  exports.DEFAULT_BG_THRESHOLD_MS = require_runnerConfig.DEFAULT_BG_THRESHOLD_MS;
8
8
  exports.DEFAULT_LOG_MAX_BYTES = require_runnerConfig.DEFAULT_LOG_MAX_BYTES;
9
9
  exports.DEFAULT_LOG_TTL_MS = require_runnerConfig.DEFAULT_LOG_TTL_MS;
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { n as RmuxLaunchRequest, t as IRmuxBackend } from "./rmuxBackend-CaEWooWn.mjs";
2
- import { n as createHeadlessRunnersCommand, t as createHeadlessBashTool } from "./index-BzeXJk6V.mjs";
2
+ import { n as createHeadlessRunnersCommand, t as createHeadlessBashTool } from "./index-BciAgV5f.mjs";
3
3
  import { A as getLogTtlMs, C as getBackgroundThresholdMs, M as getResultMaxBytes, c as DEFAULT_LOG_TTL_MS, k as getLogMaxBytes, n as DEFAULT_BG_THRESHOLD_MS, s as DEFAULT_LOG_MAX_BYTES, u as DEFAULT_RESULT_MAX_BYTES } from "./runnerConfig-DuWL6TJx.mjs";
4
4
  import { t as RmuxBackend } from "./index-C-IC35d9.mjs";
5
5
  import { r as rtkPackageForTarget } from "./index-BCCF1sGD.mjs";
6
- import { t as createRunnerDependencies } from "./index--xF7DvsE.mjs";
6
+ import { t as createRunnerDependencies } from "./index-CXbcmf-G.mjs";
7
7
  export { DEFAULT_BG_THRESHOLD_MS, DEFAULT_LOG_MAX_BYTES, DEFAULT_LOG_TTL_MS, DEFAULT_RESULT_MAX_BYTES, type IRmuxBackend, RmuxBackend, type RmuxLaunchRequest, createHeadlessBashTool, createHeadlessRunnersCommand, createRunnerDependencies, getBackgroundThresholdMs, getLogMaxBytes, getLogTtlMs, getResultMaxBytes, rtkPackageForTarget };
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { D as DEFAULT_RESULT_MAX_BYTES, T as DEFAULT_LOG_TTL_MS, c as getLogTtlMs, s as getLogMaxBytes, t as getBackgroundThresholdMs, u as getResultMaxBytes, w as DEFAULT_LOG_MAX_BYTES, y as DEFAULT_BG_THRESHOLD_MS } from "./runnerConfig-XXMq4VQA.mjs";
2
- import { n as createHeadlessRunnersCommand, t as createHeadlessBashTool } from "./headless-DOlCixyf.mjs";
2
+ import { n as createHeadlessRunnersCommand, t as createHeadlessBashTool } from "./headless-CV-eb5rz.mjs";
3
3
  import { t as RmuxBackend } from "./rmuxBackend-rjrVTG6K.mjs";
4
4
  import { r as rtkPackageForTarget } from "./rtkProcessor-Iw9gP5Xp.mjs";
5
- import { t as createRunnerDependencies } from "./runnerDependencies-7h_cxOva.mjs";
5
+ import { t as createRunnerDependencies } from "./runnerDependencies-CamKwphq.mjs";
6
6
  export { DEFAULT_BG_THRESHOLD_MS, DEFAULT_LOG_MAX_BYTES, DEFAULT_LOG_TTL_MS, DEFAULT_RESULT_MAX_BYTES, RmuxBackend, createHeadlessBashTool, createHeadlessRunnersCommand, createRunnerDependencies, getBackgroundThresholdMs, getLogMaxBytes, getLogTtlMs, getResultMaxBytes, rtkPackageForTarget };
@@ -1,4 +1,4 @@
1
- import { n as BashRunResult } from "./bashRunService-Ci0cGdYO.mjs";
1
+ import { n as BashRunResult } from "./bashRunService-BL4JIUi2.mjs";
2
2
  import { i as RunnerRecord } from "./runnerRegistry-V-Ocaf4N.mjs";
3
3
  import { a as ResultBudget, c as TruncatedOutput, i as LogSummary, n as Excerpt, o as SalvagedError, r as LogSummarizer, s as ToolResult, t as ErrorLineScanner } from "./bashResult-DcrRaBLv.mjs";
4
4
  import { t as RunnerSettings } from "./runnerSettings-DiV1lvzx.mjs";
@@ -4,9 +4,9 @@ const require_services_runnerSupervisor_index = require("./services/runnerSuperv
4
4
  let node_crypto = require("node:crypto");
5
5
  let node_fs = require("node:fs");
6
6
  node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
7
- let node_module = require("node:module");
8
7
  let node_path = require("node:path");
9
8
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
9
+ let node_module = require("node:module");
10
10
  let _rmux_sdk = require("@rmux/sdk");
11
11
  //#region src/constants/rmuxBackend.ts
12
12
  const RMUX_BINARY_ENV = "PO_RMUX_BINARY";
@@ -520,4 +520,4 @@ Object.defineProperty(exports, "rmuxPackageForTarget", {
520
520
  }
521
521
  });
522
522
 
523
- //# sourceMappingURL=rmuxBackend-Dh0CYVAL.cjs.map
523
+ //# sourceMappingURL=rmuxBackend-Cod2H85V.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rmuxBackend-Dh0CYVAL.cjs","names":["runtimeEntry","getResultMaxBytes","readExitMetadata","RMUX","supervisorPaths","path","shellJoin","getLogMaxBytes","createRequire","fs","createHash","noninteractiveEnvironment","NO_TERMINAL_INPUT_ENV","watchForFile"],"sources":["../src/constants/rmuxBackend.ts","../src/services/rmuxBackend/index.ts"],"sourcesContent":["export const RMUX_BINARY_ENV = 'PO_RMUX_BINARY';\nexport const POLL_MS = 100;\nexport const LOG_DRAIN_TIMEOUT_MS = 2_000;\n/**\n * Fallback interval for a missed log-completion event or a lost session.\n * The retained pane lets the sink write its marker before session cleanup.\n */\nexport const LOG_DRAIN_POLL_MS = 25;\nexport const PANE_STATE_FORMAT = '#{pane_dead}:#{pane_dead_status}:#{session_name}';\nexport const PANE_PID_FORMAT = '#{pane_pid}';\nexport const STOP_GRACE_MS = 3_000;\nexport const STOP_CLOSE_TIMEOUT_MS = 1_000;\nexport const EXECUTABLE_MODE = 0o755;\n/** The owner, group, and other execute bits, so an already runnable file is left alone. */\nexport const EXECUTABLE_BITS = 0o111;\nexport const VENDOR_DIRECTORY = 'vendor';\nexport const SESSION_PREFIX = 'po-runner-';\nexport const OWNED_TARGET_PATTERN = /^po-runner-[A-Za-z0-9_-]+$/;\nexport const SOCKET_HASH_LENGTH = 12;\nexport const NON_INTERACTIVE_ENV = { NO_COLOR: '1', CI: '1' };\n","import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport { type Pane, RMUX, type Rmux } from '@rmux/sdk';\n\nimport {\n EXECUTABLE_BITS,\n EXECUTABLE_MODE,\n LOG_DRAIN_POLL_MS,\n LOG_DRAIN_TIMEOUT_MS,\n NON_INTERACTIVE_ENV,\n OWNED_TARGET_PATTERN,\n PANE_PID_FORMAT,\n PANE_STATE_FORMAT,\n POLL_MS,\n RMUX_BINARY_ENV,\n SESSION_PREFIX,\n SOCKET_HASH_LENGTH,\n STOP_CLOSE_TIMEOUT_MS,\n STOP_GRACE_MS,\n VENDOR_DIRECTORY,\n} from '../../constants/rmuxBackend';\nimport type { RunHandle } from '../../types/launcher';\nimport type { PtyRun } from '../../types/ptyHost';\nimport type { IRmuxBackend, RmuxLaunchRequest } from '../../types/rmuxBackend';\nimport type { RunnerSettings } from '../../types/runnerSettings';\nimport type { ExitResult } from '../../types/spawner';\nimport { getLogMaxBytes, getResultMaxBytes, noninteractiveEnvironment } from '../runnerConfig';\nimport type { IRunnerPaths } from '../runnerPaths/type';\nimport {\n cleanupSupervisorFiles,\n type CommandSpec,\n NO_TERMINAL_INPUT_ENV,\n readExitMetadata,\n runtimeEntry,\n shellJoin,\n type SupervisorPaths,\n supervisorPaths,\n watchForFile,\n writeCommandSpec,\n} from '../runnerSupervisor';\n\n/** Pane liveness, its exit status, and whether the session still exists, in one read. */\nconst PACKAGE_BY_PLATFORM: Readonly<Record<string, string>> = {\n 'darwin-arm64': '@agimon-ai/po-runner-rmux-darwin-arm64',\n 'darwin-x64': '@agimon-ai/po-runner-rmux-darwin-x64',\n 'linux-arm64': '@agimon-ai/po-runner-rmux-linux-arm64',\n 'linux-x64': '@agimon-ai/po-runner-rmux-linux-x64',\n};\n\nexport class RmuxBackend implements IRmuxBackend {\n private clientPromise: Promise<Rmux | undefined> | undefined;\n private readonly runs = new Map<string, PtyRun>();\n private readonly completions = new Map<string, Promise<ExitResult>>();\n\n constructor(\n private readonly paths: IRunnerPaths,\n private readonly env: Readonly<Record<string, string | undefined>> = process.env,\n private readonly settings?: RunnerSettings,\n ) {}\n\n async launch(request: RmuxLaunchRequest): Promise<RunHandle | undefined> {\n const rmux = await this.client();\n if (!rmux) return undefined;\n\n this.paths.ensureDirectories();\n const target = `${SESSION_PREFIX}${request.id}`;\n const logPath = this.paths.logPathFor(request.id);\n const aux = this.auxPaths(request.id, request.sessionId);\n let created = false;\n let released = false;\n\n try {\n this.prepareFiles(request, logPath, aux);\n // `-P -F` reports the pane pid from the call that creates the pane, so the\n // launch does not spend a second round trip asking for it.\n const opened = await rmux.cmd(\n 'new-session',\n '-d',\n '-P',\n '-F',\n PANE_PID_FORMAT,\n '-s',\n target,\n '-c',\n request.cwd,\n process.execPath,\n runtimeEntry('runnerHost'),\n aux.spec,\n aux.gate,\n aux.exit,\n { check: true },\n );\n created = true;\n // Keep the pane until the log reader drains. Otherwise a fast shell can\n // end the session before the reader starts, losing its final output.\n await rmux.cmd('set-option', '-t', target, 'remain-on-exit', 'on', { check: true });\n await rmux.cmd('pipe-pane', '-t', target, this.logPipeCommand(logPath, aux.logDone, request), { check: true });\n\n const pane = rmux.session(target).pane(0, 0);\n const pid = reportedPid(String(opened.stdout ?? '')) ?? (await panePid(rmux, target));\n fs.writeFileSync(aux.gate, '', { mode: 0o600 });\n released = true;\n\n let buffering = true;\n const completion = this.monitor(rmux, pane, target, aux);\n this.trackCompletion(target, completion);\n const stop = (): Promise<boolean> => this.stop(target, pid);\n const handle: RunHandle = {\n id: request.id,\n name: request.name,\n pid,\n logPath,\n backend: 'rmux',\n backendTarget: target,\n output: () => (buffering ? readTail(logPath, getResultMaxBytes(this.env, this.settings) * 2) : ''),\n completion: () => completion,\n detach: () => {\n buffering = false;\n },\n stop,\n };\n\n if (request.interactive) this.runs.set(request.name, this.interactiveRun(handle, pane, completion));\n void completion\n .finally(() => this.runs.delete(request.name))\n .catch((error: unknown) => process.emitWarning(`RMUX completion failed for ${target}: ${errorMessage(error)}`));\n return handle;\n } catch (error) {\n if (released) throw error;\n if (created) {\n await rmux\n .session(target)\n .kill()\n .catch((cleanupError: unknown) =>\n process.emitWarning(`Could not clean up failed RMUX launch ${target}: ${errorMessage(cleanupError)}`),\n );\n }\n cleanupSupervisorFiles(aux);\n process.emitWarning(\n request.interactive\n ? `RMUX launch unavailable for interactive runner: ${errorMessage(error)}`\n : `RMUX launch unavailable, using supervised subprocess: ${errorMessage(error)}`,\n );\n return undefined;\n }\n }\n\n async stop(target: string, expectedPid: number): Promise<boolean> {\n if (!OWNED_TARGET_PATTERN.test(target) || !Number.isInteger(expectedPid) || expectedPid <= 0) return false;\n\n const rmux = await this.client();\n if (!rmux) return false;\n try {\n // A session that already ended took its process group with it.\n if (await sessionMissing(rmux, target)) return true;\n\n const pid = await panePid(rmux, target);\n if (pid !== expectedPid) return false;\n const signalled = signalPane(pid, target);\n if (signalled === 'gone') return true;\n if (signalled === 'failed') return false;\n\n if (await waitForPaneStop(rmux, target, STOP_GRACE_MS)) return true;\n if (await sessionMissing(rmux, target)) return true;\n\n // Revalidate after the grace period so a replacement pane is never closed.\n const currentPid = await panePid(rmux, target);\n if (currentPid !== expectedPid) return false;\n\n return closeOwnedSession(rmux, target);\n } catch (error) {\n process.emitWarning(`Could not stop RMUX target ${target}: ${errorMessage(error)}`);\n return false;\n }\n }\n\n async watch(id: string, target: string, sessionId?: string): Promise<ExitResult | undefined> {\n const rmux = await this.client();\n if (!rmux) return undefined;\n const pane = rmux.session(target).pane(0, 0);\n try {\n await rmux.displayMessage('#{pane_id}', { target });\n } catch (error) {\n process.emitWarning(`Could not watch RMUX target ${target}: ${errorMessage(error)}`);\n return undefined;\n }\n const completion = this.monitor(rmux, pane, target, this.auxPaths(id, sessionId));\n this.trackCompletion(target, completion);\n return completion;\n }\n\n async input(target: string, text: string): Promise<boolean> {\n const rmux = await this.client();\n if (!rmux) return false;\n const result = await rmux\n .session(target)\n .pane(0, 0)\n .sendText(text)\n .catch((error: unknown) => {\n process.emitWarning(`Could not send input to RMUX target ${target}: ${errorMessage(error)}`);\n return undefined;\n });\n return result !== undefined;\n }\n\n async capture(target: string): Promise<string | undefined> {\n const rmux = await this.client();\n if (!rmux) return undefined;\n return rmux\n .session(target)\n .pane(0, 0)\n .captureText()\n .catch((error: unknown) => {\n process.emitWarning(`Could not capture RMUX target ${target}: ${errorMessage(error)}`);\n return undefined;\n });\n }\n\n get(name: string): PtyRun | undefined {\n return this.runs.get(name);\n }\n\n readOutcome(id: string, sessionId: string): ExitResult | undefined {\n return readExitMetadata(this.auxPaths(id, sessionId).exit);\n }\n\n private trackCompletion(target: string, completion: Promise<ExitResult>): void {\n this.completions.set(target, completion);\n void completion\n .finally(() => this.completions.delete(target))\n .catch((error: unknown) => process.emitWarning(`RMUX monitor failed for ${target}: ${errorMessage(error)}`));\n }\n\n private client(): Promise<Rmux | undefined> {\n this.clientPromise ??= this.resolveClient();\n return this.clientPromise;\n }\n\n private async resolveClient(): Promise<Rmux | undefined> {\n const binaries = [resolveBundledRmuxBinary(import.meta.url, this.env), 'rmux'].filter(\n (value): value is string => value !== undefined,\n );\n for (const binary of binaries) {\n try {\n if (binary !== 'rmux') ensureExecutablePayload(binary);\n const client = new RMUX({ binary, socketName: socketName(this.paths.repositoryPath()) });\n await client.capabilities();\n return client;\n } catch (error) {\n process.emitWarning(`RMUX candidate ${binary} is unavailable: ${errorMessage(error)}`);\n // Try the next compatible candidate. Non-interactive calls can use the subprocess launcher.\n }\n }\n return undefined;\n }\n\n private prepareFiles(request: RmuxLaunchRequest, logPath: string, aux: SupervisorPaths): void {\n cleanupSupervisorFiles(aux);\n fs.writeFileSync(logPath, '', { mode: 0o600 });\n const env = environment(request.sessionId, request.interactive, this.env);\n // runnerHost supervises the command and watches the lifeline itself, so an\n // owner that dies mid-run is handled inside the pane rather than around it.\n const spec: CommandSpec = { command: request.command, cwd: request.cwd, env };\n writeCommandSpec(aux.spec, spec);\n }\n\n private auxPaths(id: string, sessionId?: string): SupervisorPaths {\n return supervisorPaths(this.paths.stateDirectory(sessionId), id);\n }\n\n /**\n * The sink the pane pipes into.\n *\n * An interactive run also asks for a raw copy: the scrubbed log it writes\n * beside it has had cursor movement taken out, which is what a terminal\n * needs most. Only interactive runs pay for it, because only they can be\n * attached to.\n */\n private logPipeCommand(logPath: string, donePath: string, request: RmuxLaunchRequest): string {\n const id = path.basename(logPath, '.log');\n return shellJoin([\n process.execPath,\n runtimeEntry('logSink'),\n logPath,\n this.paths.rotatedLogPathFor(id),\n String(getLogMaxBytes(this.env)),\n donePath,\n ...(request.interactive ? [this.paths.rawLogPathFor(id)] : []),\n ]);\n }\n\n private async monitor(rmux: Rmux, pane: Pane, target: string, aux: SupervisorPaths): Promise<ExitResult> {\n try {\n const paneCode = await waitForRunEnd(rmux, target, aux.exit);\n await waitForLogDrain(rmux, target, aux.logDone);\n return readExitMetadata(aux.exit) ?? { code: paneCode, signal: null };\n } finally {\n // The pane stays alive for log capture. Remove its session after draining,\n // allowing the last completed run to shut down the mux server too.\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = async (): Promise<void> => {\n if (!(await sessionMissing(rmux, target))) await pane.server.session(target).kill();\n };\n try {\n await Promise.race([\n cleanup().catch((error: unknown) =>\n process.emitWarning(`Could not clean up completed RMUX target ${target}: ${errorMessage(error)}`),\n ),\n new Promise<void>((resolve) => {\n timer = setTimeout(() => {\n process.emitWarning(`Timed out cleaning up RMUX target ${target} after ${STOP_CLOSE_TIMEOUT_MS}ms`);\n resolve();\n }, STOP_CLOSE_TIMEOUT_MS);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n cleanupSupervisorFiles(aux);\n }\n }\n }\n\n private interactiveRun(handle: RunHandle, pane: Pane, completion: Promise<ExitResult>): PtyRun {\n let screen = '';\n let active = true;\n const handlers = new Set<(data: string) => void>();\n const refresh = async (): Promise<void> => {\n while (active) {\n const next = await pane.captureText().catch((error: unknown) => {\n process.emitWarning(`Could not capture RMUX screen for ${handle.name}: ${errorMessage(error)}`);\n return screen;\n });\n if (next !== screen) {\n screen = next;\n for (const handler of handlers) handler(next);\n }\n await delay(POLL_MS);\n }\n };\n void refresh();\n void completion\n .finally(() => {\n active = false;\n })\n .catch((error: unknown) =>\n process.emitWarning(`RMUX interactive completion failed for ${handle.name}: ${errorMessage(error)}`),\n );\n return {\n ...handle,\n write: (text) => {\n void pane.sendText(text).catch((error: unknown) => process.emitWarning(errorMessage(error)));\n },\n screen: () => screen,\n onData: (handler) => {\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n resize: (cols, rows) => {\n void pane\n .resize({ width: cols, height: rows })\n .catch((error: unknown) => process.emitWarning(errorMessage(error)));\n },\n };\n }\n}\n\nexport function rmuxPackageForTarget(platform: string, architecture: string): string | undefined {\n const target = `${platform}-${architecture}`;\n const packageName = PACKAGE_BY_PLATFORM[target];\n if (!packageName) process.emitWarning(`Bundled RMUX binary is unavailable for unsupported target ${target}`);\n return packageName;\n}\n\nexport function resolveBundledRmuxBinary(\n moduleUrl = import.meta.url,\n env: Readonly<Record<string, string | undefined>> = process.env,\n): string | undefined {\n const configured = env[RMUX_BINARY_ENV];\n if (configured !== undefined && configured !== '') return configured;\n const packageName = rmuxPackageForTarget(process.platform, process.arch);\n if (!packageName) return undefined;\n try {\n const require = createRequire(moduleUrl);\n const manifest = require.resolve(`${packageName}/package.json`);\n return path.join(path.dirname(manifest), VENDOR_DIRECTORY, 'bin', 'rmux');\n } catch (error) {\n process.emitWarning(`Bundled RMUX binary is unavailable for ${packageName}: ${errorMessage(error)}`);\n return undefined;\n }\n}\n\n/**\n * Make the bundled payload runnable before the launcher is spawned.\n *\n * The prebuilt packages reach npm with plain 0644 files, so the executable bit\n * the build set is not what lands on a user machine. Restoring it on the one\n * binary we spawn is not enough: rmux execs two files of its own,\n * `bin/rmux-daemon` and `libexec/rmux/rmux`, and the launcher fails on that\n * first exec with a permission error. Every file the payload ships is restored\n * here instead, which also covers a helper a later rmux release adds.\n *\n * A configured override (PO_RMUX_BINARY) usually points at a stand-alone\n * binary, so only paths that really sit inside a package vendor tree get the\n * walk. Files that are already executable are left untouched, since chmod on a\n * binary owned by someone else would throw and drop an otherwise usable\n * candidate.\n */\nexport function ensureExecutablePayload(binary: string): void {\n const vendor = path.resolve(path.dirname(binary), '..');\n const payload =\n path.basename(vendor) === VENDOR_DIRECTORY\n ? fs\n .readdirSync(vendor, { recursive: true, withFileTypes: true })\n .filter((entry) => entry.isFile())\n .map((entry) => path.join(entry.parentPath, entry.name))\n : [binary];\n for (const file of payload) {\n if ((fs.statSync(file).mode & EXECUTABLE_BITS) === 0) fs.chmodSync(file, EXECUTABLE_MODE);\n }\n}\n\nfunction socketName(repositoryPath: string): string {\n const hash = createHash('sha256').update(repositoryPath).digest('hex').slice(0, SOCKET_HASH_LENGTH);\n return `${SESSION_PREFIX}${hash}`;\n}\n\nfunction environment(\n sessionId: string,\n interactive: boolean,\n env: Readonly<Record<string, string | undefined>>,\n): Record<string, string> {\n const values: NodeJS.ProcessEnv = {\n ...env,\n ...(interactive ? {} : { ...NON_INTERACTIVE_ENV, ...noninteractiveEnvironment(env) }),\n // Applied to interactive runs as well: a pane is a tty either way, and an\n // agent sending input to a prompt still has no way past a pager.\n ...NO_TERMINAL_INPUT_ENV,\n PI_SESSION_ID: sessionId,\n };\n if (!interactive) delete values['FORCE_COLOR'];\n return Object.fromEntries(\n Object.entries(values).filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n}\n\nasync function panePid(rmux: Rmux, target: string): Promise<number> {\n const response = await rmux.displayMessage(PANE_PID_FORMAT, { target });\n const message = typeof response['message'] === 'string' ? response['message'] : '';\n const pid = reportedPid(message);\n if (pid === undefined) throw new Error(`RMUX did not report a pane pid for ${target}`);\n return pid;\n}\n\n/** A pane pid as rmux prints it, or nothing when the output holds no usable pid. */\nfunction reportedPid(output: string): number | undefined {\n const pid = Number(output.trim());\n return Number.isInteger(pid) && pid > 0 ? pid : undefined;\n}\n\n/**\n * Waits for the run to end, preferring the supervisor's own record of it.\n *\n * The sidecar is written before the command's pane can end, and it outlives the\n * server that the pane's exit takes down with it. Watching for it means a run\n * that finishes inside a poll interval is observed when it finishes rather than\n * on the next tick. Asking the server stays the fallback for a supervisor that\n * died without recording anything.\n */\nasync function waitForRunEnd(rmux: Rmux, target: string, exitPath: string): Promise<number | null> {\n const landed = watchForFile(exitPath);\n let active = true;\n const readEvidence = async (): Promise<null> => {\n while (active) {\n if (await landed.appeared(POLL_MS)) return null;\n }\n return null;\n };\n const probePane = async (): Promise<number | null> => {\n while (active) {\n await delay(POLL_MS);\n if (!active) return null;\n const state = await readPaneExit(rmux, target);\n if (state.exited) return state.code;\n }\n return null;\n };\n try {\n // A stalled SDK request must not block the supervisor's durable evidence.\n // Keep only one pane request in flight, even when it never answers.\n return await Promise.race([readEvidence(), probePane()]);\n } finally {\n active = false;\n landed.close();\n }\n}\n\n/**\n * Gives the log sink a moment to mark the log complete.\n *\n * Normal completion retains the session until the sink records its final\n * writes. A lost session cannot guarantee a later marker, so it ends the wait.\n */\nasync function waitForLogDrain(rmux: Rmux, target: string, donePath: string): Promise<void> {\n const deadline = Date.now() + LOG_DRAIN_TIMEOUT_MS;\n const landed = watchForFile(donePath);\n let active = true;\n const readEvidence = async (): Promise<void> => {\n while (active && Date.now() < deadline) {\n if (await landed.appeared(LOG_DRAIN_POLL_MS)) return;\n }\n };\n const probeSession = async (): Promise<void> => {\n while (active && Date.now() < deadline) {\n await delay(LOG_DRAIN_POLL_MS);\n if (!active) return;\n if (await sessionMissing(rmux, target)) return;\n }\n };\n try {\n // The file loop enforces the deadline while a session query is outstanding.\n await Promise.race([readEvidence(), probeSession()]);\n } finally {\n active = false;\n landed.close();\n }\n}\n\nasync function closeOwnedSession(rmux: Rmux, target: string): Promise<boolean> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(result);\n };\n const timer = setTimeout(() => {\n process.emitWarning(`Timed out closing RMUX target ${target} after ${STOP_CLOSE_TIMEOUT_MS}ms`);\n finish(false);\n }, STOP_CLOSE_TIMEOUT_MS);\n void rmux\n .session(target)\n .kill()\n .then(\n () => finish(true),\n (error: unknown) => {\n process.emitWarning(`Could not close RMUX target ${target}: ${errorMessage(error)}`);\n finish(false);\n },\n );\n });\n}\n\nasync function waitForPaneStop(rmux: Rmux, target: string, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n try {\n if ((await readPaneExit(rmux, target)).exited) return true;\n } catch (error) {\n process.emitWarning(`Could not verify RMUX target ${target} stopped: ${errorMessage(error)}`);\n return false;\n }\n await delay(POLL_MS);\n }\n return false;\n}\n\n/**\n * One formatted read answers both questions this poll asks, so watching a run\n * costs the same single rmux call it always did.\n */\nasync function readPaneExit(rmux: Rmux, target: string): Promise<{ exited: boolean; code: number | null }> {\n let message: string;\n try {\n const response = await rmux.displayMessage(PANE_STATE_FORMAT, { target });\n message = typeof response['message'] === 'string' ? response['message'] : '';\n } catch {\n // The last session ending stops the server, so a server that cannot be\n // reached is the ordinary end of the last run rather than a fault.\n return { exited: true, code: null };\n }\n const [dead, status, ...rest] = message.trim().split(':');\n // A missing session formats as a live pane with no name rather than failing,\n // so the name is what says whether there is still anything to watch.\n if (rest.join(':') === '') return { exited: true, code: null };\n if (dead === '1' || dead === 'true') {\n const code = Number(status);\n return { exited: true, code: Number.isInteger(code) ? code : null };\n }\n return { exited: false, code: null };\n}\n\n/** A session that cannot be found, on a server that may itself be gone. */\nasync function sessionMissing(rmux: Rmux, target: string): Promise<boolean> {\n try {\n const probe = await rmux.cmd('has-session', '-t', target);\n return probe.returnCode !== 0;\n } catch {\n // No server to ask means no session to find.\n return true;\n }\n}\n\n/**\n * A pane that was already gone and a signal that could not be delivered are\n * opposite answers to \"is it stopped\", so they are reported apart.\n */\nfunction signalPane(pid: number, target: string): 'signalled' | 'gone' | 'failed' {\n try {\n process.kill(pid, 'SIGTERM');\n return 'signalled';\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ESRCH') return 'gone';\n process.emitWarning(`Could not signal RMUX target ${target}: ${errorMessage(error)}`);\n return 'failed';\n }\n}\n\nfunction readTail(target: string, maxBytes: number): string {\n let handle: number | undefined;\n try {\n const size = fs.statSync(target).size;\n const bytes = Math.min(size, maxBytes);\n const buffer = Buffer.alloc(bytes);\n handle = fs.openSync(target, 'r');\n fs.readSync(handle, buffer, 0, bytes, size - bytes);\n return buffer.toString('utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n process.emitWarning(`Could not read RMUX log ${target}: ${errorMessage(error)}`);\n }\n return '';\n } finally {\n if (handle !== undefined) fs.closeSync(handle);\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.();\n });\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rmuxBackend-Cod2H85V.cjs","names":["runtimeEntry","getResultMaxBytes","readExitMetadata","RMUX","supervisorPaths","path","shellJoin","getLogMaxBytes","createRequire","fs","createHash","noninteractiveEnvironment","NO_TERMINAL_INPUT_ENV","watchForFile"],"sources":["../src/constants/rmuxBackend.ts","../src/services/rmuxBackend/index.ts"],"sourcesContent":["export const RMUX_BINARY_ENV = 'PO_RMUX_BINARY';\nexport const POLL_MS = 100;\nexport const LOG_DRAIN_TIMEOUT_MS = 2_000;\n/**\n * Fallback interval for a missed log-completion event or a lost session.\n * The retained pane lets the sink write its marker before session cleanup.\n */\nexport const LOG_DRAIN_POLL_MS = 25;\nexport const PANE_STATE_FORMAT = '#{pane_dead}:#{pane_dead_status}:#{session_name}';\nexport const PANE_PID_FORMAT = '#{pane_pid}';\nexport const STOP_GRACE_MS = 3_000;\nexport const STOP_CLOSE_TIMEOUT_MS = 1_000;\nexport const EXECUTABLE_MODE = 0o755;\n/** The owner, group, and other execute bits, so an already runnable file is left alone. */\nexport const EXECUTABLE_BITS = 0o111;\nexport const VENDOR_DIRECTORY = 'vendor';\nexport const SESSION_PREFIX = 'po-runner-';\nexport const OWNED_TARGET_PATTERN = /^po-runner-[A-Za-z0-9_-]+$/;\nexport const SOCKET_HASH_LENGTH = 12;\nexport const NON_INTERACTIVE_ENV = { NO_COLOR: '1', CI: '1' };\n","import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport { type Pane, RMUX, type Rmux } from '@rmux/sdk';\n\nimport {\n EXECUTABLE_BITS,\n EXECUTABLE_MODE,\n LOG_DRAIN_POLL_MS,\n LOG_DRAIN_TIMEOUT_MS,\n NON_INTERACTIVE_ENV,\n OWNED_TARGET_PATTERN,\n PANE_PID_FORMAT,\n PANE_STATE_FORMAT,\n POLL_MS,\n RMUX_BINARY_ENV,\n SESSION_PREFIX,\n SOCKET_HASH_LENGTH,\n STOP_CLOSE_TIMEOUT_MS,\n STOP_GRACE_MS,\n VENDOR_DIRECTORY,\n} from '../../constants/rmuxBackend';\nimport type { RunHandle } from '../../types/launcher';\nimport type { PtyRun } from '../../types/ptyHost';\nimport type { IRmuxBackend, RmuxLaunchRequest } from '../../types/rmuxBackend';\nimport type { RunnerSettings } from '../../types/runnerSettings';\nimport type { ExitResult } from '../../types/spawner';\nimport { getLogMaxBytes, getResultMaxBytes, noninteractiveEnvironment } from '../runnerConfig';\nimport type { IRunnerPaths } from '../runnerPaths/type';\nimport {\n cleanupSupervisorFiles,\n type CommandSpec,\n NO_TERMINAL_INPUT_ENV,\n readExitMetadata,\n runtimeEntry,\n shellJoin,\n type SupervisorPaths,\n supervisorPaths,\n watchForFile,\n writeCommandSpec,\n} from '../runnerSupervisor';\n\n/** Pane liveness, its exit status, and whether the session still exists, in one read. */\nconst PACKAGE_BY_PLATFORM: Readonly<Record<string, string>> = {\n 'darwin-arm64': '@agimon-ai/po-runner-rmux-darwin-arm64',\n 'darwin-x64': '@agimon-ai/po-runner-rmux-darwin-x64',\n 'linux-arm64': '@agimon-ai/po-runner-rmux-linux-arm64',\n 'linux-x64': '@agimon-ai/po-runner-rmux-linux-x64',\n};\n\nexport class RmuxBackend implements IRmuxBackend {\n private clientPromise: Promise<Rmux | undefined> | undefined;\n private readonly runs = new Map<string, PtyRun>();\n private readonly completions = new Map<string, Promise<ExitResult>>();\n\n constructor(\n private readonly paths: IRunnerPaths,\n private readonly env: Readonly<Record<string, string | undefined>> = process.env,\n private readonly settings?: RunnerSettings,\n ) {}\n\n async launch(request: RmuxLaunchRequest): Promise<RunHandle | undefined> {\n const rmux = await this.client();\n if (!rmux) return undefined;\n\n this.paths.ensureDirectories();\n const target = `${SESSION_PREFIX}${request.id}`;\n const logPath = this.paths.logPathFor(request.id);\n const aux = this.auxPaths(request.id, request.sessionId);\n let created = false;\n let released = false;\n\n try {\n this.prepareFiles(request, logPath, aux);\n // `-P -F` reports the pane pid from the call that creates the pane, so the\n // launch does not spend a second round trip asking for it.\n const opened = await rmux.cmd(\n 'new-session',\n '-d',\n '-P',\n '-F',\n PANE_PID_FORMAT,\n '-s',\n target,\n '-c',\n request.cwd,\n process.execPath,\n runtimeEntry('runnerHost'),\n aux.spec,\n aux.gate,\n aux.exit,\n { check: true },\n );\n created = true;\n // Keep the pane until the log reader drains. Otherwise a fast shell can\n // end the session before the reader starts, losing its final output.\n await rmux.cmd('set-option', '-t', target, 'remain-on-exit', 'on', { check: true });\n await rmux.cmd('pipe-pane', '-t', target, this.logPipeCommand(logPath, aux.logDone, request), { check: true });\n\n const pane = rmux.session(target).pane(0, 0);\n const pid = reportedPid(String(opened.stdout ?? '')) ?? (await panePid(rmux, target));\n fs.writeFileSync(aux.gate, '', { mode: 0o600 });\n released = true;\n\n let buffering = true;\n const completion = this.monitor(rmux, pane, target, aux);\n this.trackCompletion(target, completion);\n const stop = (): Promise<boolean> => this.stop(target, pid);\n const handle: RunHandle = {\n id: request.id,\n name: request.name,\n pid,\n logPath,\n backend: 'rmux',\n backendTarget: target,\n output: () => (buffering ? readTail(logPath, getResultMaxBytes(this.env, this.settings) * 2) : ''),\n completion: () => completion,\n detach: () => {\n buffering = false;\n },\n stop,\n };\n\n if (request.interactive) this.runs.set(request.name, this.interactiveRun(handle, pane, completion));\n void completion\n .finally(() => this.runs.delete(request.name))\n .catch((error: unknown) => process.emitWarning(`RMUX completion failed for ${target}: ${errorMessage(error)}`));\n return handle;\n } catch (error) {\n if (released) throw error;\n if (created) {\n await rmux\n .session(target)\n .kill()\n .catch((cleanupError: unknown) =>\n process.emitWarning(`Could not clean up failed RMUX launch ${target}: ${errorMessage(cleanupError)}`),\n );\n }\n cleanupSupervisorFiles(aux);\n process.emitWarning(\n request.interactive\n ? `RMUX launch unavailable for interactive runner: ${errorMessage(error)}`\n : `RMUX launch unavailable, using supervised subprocess: ${errorMessage(error)}`,\n );\n return undefined;\n }\n }\n\n async stop(target: string, expectedPid: number): Promise<boolean> {\n if (!OWNED_TARGET_PATTERN.test(target) || !Number.isInteger(expectedPid) || expectedPid <= 0) return false;\n\n const rmux = await this.client();\n if (!rmux) return false;\n try {\n // A session that already ended took its process group with it.\n if (await sessionMissing(rmux, target)) return true;\n\n const pid = await panePid(rmux, target);\n if (pid !== expectedPid) return false;\n const signalled = signalPane(pid, target);\n if (signalled === 'gone') return true;\n if (signalled === 'failed') return false;\n\n if (await waitForPaneStop(rmux, target, STOP_GRACE_MS)) return true;\n if (await sessionMissing(rmux, target)) return true;\n\n // Revalidate after the grace period so a replacement pane is never closed.\n const currentPid = await panePid(rmux, target);\n if (currentPid !== expectedPid) return false;\n\n return closeOwnedSession(rmux, target);\n } catch (error) {\n process.emitWarning(`Could not stop RMUX target ${target}: ${errorMessage(error)}`);\n return false;\n }\n }\n\n async watch(id: string, target: string, sessionId?: string): Promise<ExitResult | undefined> {\n const rmux = await this.client();\n if (!rmux) return undefined;\n const pane = rmux.session(target).pane(0, 0);\n try {\n await rmux.displayMessage('#{pane_id}', { target });\n } catch (error) {\n process.emitWarning(`Could not watch RMUX target ${target}: ${errorMessage(error)}`);\n return undefined;\n }\n const completion = this.monitor(rmux, pane, target, this.auxPaths(id, sessionId));\n this.trackCompletion(target, completion);\n return completion;\n }\n\n async input(target: string, text: string): Promise<boolean> {\n const rmux = await this.client();\n if (!rmux) return false;\n const result = await rmux\n .session(target)\n .pane(0, 0)\n .sendText(text)\n .catch((error: unknown) => {\n process.emitWarning(`Could not send input to RMUX target ${target}: ${errorMessage(error)}`);\n return undefined;\n });\n return result !== undefined;\n }\n\n async capture(target: string): Promise<string | undefined> {\n const rmux = await this.client();\n if (!rmux) return undefined;\n return rmux\n .session(target)\n .pane(0, 0)\n .captureText()\n .catch((error: unknown) => {\n process.emitWarning(`Could not capture RMUX target ${target}: ${errorMessage(error)}`);\n return undefined;\n });\n }\n\n get(name: string): PtyRun | undefined {\n return this.runs.get(name);\n }\n\n readOutcome(id: string, sessionId: string): ExitResult | undefined {\n return readExitMetadata(this.auxPaths(id, sessionId).exit);\n }\n\n private trackCompletion(target: string, completion: Promise<ExitResult>): void {\n this.completions.set(target, completion);\n void completion\n .finally(() => this.completions.delete(target))\n .catch((error: unknown) => process.emitWarning(`RMUX monitor failed for ${target}: ${errorMessage(error)}`));\n }\n\n private client(): Promise<Rmux | undefined> {\n this.clientPromise ??= this.resolveClient();\n return this.clientPromise;\n }\n\n private async resolveClient(): Promise<Rmux | undefined> {\n const binaries = [resolveBundledRmuxBinary(import.meta.url, this.env), 'rmux'].filter(\n (value): value is string => value !== undefined,\n );\n for (const binary of binaries) {\n try {\n if (binary !== 'rmux') ensureExecutablePayload(binary);\n const client = new RMUX({ binary, socketName: socketName(this.paths.repositoryPath()) });\n await client.capabilities();\n return client;\n } catch (error) {\n process.emitWarning(`RMUX candidate ${binary} is unavailable: ${errorMessage(error)}`);\n // Try the next compatible candidate. Non-interactive calls can use the subprocess launcher.\n }\n }\n return undefined;\n }\n\n private prepareFiles(request: RmuxLaunchRequest, logPath: string, aux: SupervisorPaths): void {\n cleanupSupervisorFiles(aux);\n fs.writeFileSync(logPath, '', { mode: 0o600 });\n const env = environment(request.sessionId, request.interactive, this.env);\n // runnerHost supervises the command and watches the lifeline itself, so an\n // owner that dies mid-run is handled inside the pane rather than around it.\n const spec: CommandSpec = { command: request.command, cwd: request.cwd, env };\n writeCommandSpec(aux.spec, spec);\n }\n\n private auxPaths(id: string, sessionId?: string): SupervisorPaths {\n return supervisorPaths(this.paths.stateDirectory(sessionId), id);\n }\n\n /**\n * The sink the pane pipes into.\n *\n * An interactive run also asks for a raw copy: the scrubbed log it writes\n * beside it has had cursor movement taken out, which is what a terminal\n * needs most. Only interactive runs pay for it, because only they can be\n * attached to.\n */\n private logPipeCommand(logPath: string, donePath: string, request: RmuxLaunchRequest): string {\n const id = path.basename(logPath, '.log');\n return shellJoin([\n process.execPath,\n runtimeEntry('logSink'),\n logPath,\n this.paths.rotatedLogPathFor(id),\n String(getLogMaxBytes(this.env)),\n donePath,\n ...(request.interactive ? [this.paths.rawLogPathFor(id)] : []),\n ]);\n }\n\n private async monitor(rmux: Rmux, pane: Pane, target: string, aux: SupervisorPaths): Promise<ExitResult> {\n try {\n const paneCode = await waitForRunEnd(rmux, target, aux.exit);\n await waitForLogDrain(rmux, target, aux.logDone);\n return readExitMetadata(aux.exit) ?? { code: paneCode, signal: null };\n } finally {\n // The pane stays alive for log capture. Remove its session after draining,\n // allowing the last completed run to shut down the mux server too.\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = async (): Promise<void> => {\n if (!(await sessionMissing(rmux, target))) await pane.server.session(target).kill();\n };\n try {\n await Promise.race([\n cleanup().catch((error: unknown) =>\n process.emitWarning(`Could not clean up completed RMUX target ${target}: ${errorMessage(error)}`),\n ),\n new Promise<void>((resolve) => {\n timer = setTimeout(() => {\n process.emitWarning(`Timed out cleaning up RMUX target ${target} after ${STOP_CLOSE_TIMEOUT_MS}ms`);\n resolve();\n }, STOP_CLOSE_TIMEOUT_MS);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n cleanupSupervisorFiles(aux);\n }\n }\n }\n\n private interactiveRun(handle: RunHandle, pane: Pane, completion: Promise<ExitResult>): PtyRun {\n let screen = '';\n let active = true;\n const handlers = new Set<(data: string) => void>();\n const refresh = async (): Promise<void> => {\n while (active) {\n const next = await pane.captureText().catch((error: unknown) => {\n process.emitWarning(`Could not capture RMUX screen for ${handle.name}: ${errorMessage(error)}`);\n return screen;\n });\n if (next !== screen) {\n screen = next;\n for (const handler of handlers) handler(next);\n }\n await delay(POLL_MS);\n }\n };\n void refresh();\n void completion\n .finally(() => {\n active = false;\n })\n .catch((error: unknown) =>\n process.emitWarning(`RMUX interactive completion failed for ${handle.name}: ${errorMessage(error)}`),\n );\n return {\n ...handle,\n write: (text) => {\n void pane.sendText(text).catch((error: unknown) => process.emitWarning(errorMessage(error)));\n },\n screen: () => screen,\n onData: (handler) => {\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n resize: (cols, rows) => {\n void pane\n .resize({ width: cols, height: rows })\n .catch((error: unknown) => process.emitWarning(errorMessage(error)));\n },\n };\n }\n}\n\nexport function rmuxPackageForTarget(platform: string, architecture: string): string | undefined {\n const target = `${platform}-${architecture}`;\n const packageName = PACKAGE_BY_PLATFORM[target];\n if (!packageName) process.emitWarning(`Bundled RMUX binary is unavailable for unsupported target ${target}`);\n return packageName;\n}\n\nexport function resolveBundledRmuxBinary(\n moduleUrl = import.meta.url,\n env: Readonly<Record<string, string | undefined>> = process.env,\n): string | undefined {\n const configured = env[RMUX_BINARY_ENV];\n if (configured !== undefined && configured !== '') return configured;\n const packageName = rmuxPackageForTarget(process.platform, process.arch);\n if (!packageName) return undefined;\n try {\n const require = createRequire(moduleUrl);\n const manifest = require.resolve(`${packageName}/package.json`);\n return path.join(path.dirname(manifest), VENDOR_DIRECTORY, 'bin', 'rmux');\n } catch (error) {\n process.emitWarning(`Bundled RMUX binary is unavailable for ${packageName}: ${errorMessage(error)}`);\n return undefined;\n }\n}\n\n/**\n * Make the bundled payload runnable before the launcher is spawned.\n *\n * The prebuilt packages reach npm with plain 0644 files, so the executable bit\n * the build set is not what lands on a user machine. Restoring it on the one\n * binary we spawn is not enough: rmux execs two files of its own,\n * `bin/rmux-daemon` and `libexec/rmux/rmux`, and the launcher fails on that\n * first exec with a permission error. Every file the payload ships is restored\n * here instead, which also covers a helper a later rmux release adds.\n *\n * A configured override (PO_RMUX_BINARY) usually points at a stand-alone\n * binary, so only paths that really sit inside a package vendor tree get the\n * walk. Files that are already executable are left untouched, since chmod on a\n * binary owned by someone else would throw and drop an otherwise usable\n * candidate.\n */\nexport function ensureExecutablePayload(binary: string): void {\n const vendor = path.resolve(path.dirname(binary), '..');\n const payload =\n path.basename(vendor) === VENDOR_DIRECTORY\n ? fs\n .readdirSync(vendor, { recursive: true, withFileTypes: true })\n .filter((entry) => entry.isFile())\n .map((entry) => path.join(entry.parentPath, entry.name))\n : [binary];\n for (const file of payload) {\n if ((fs.statSync(file).mode & EXECUTABLE_BITS) === 0) fs.chmodSync(file, EXECUTABLE_MODE);\n }\n}\n\nfunction socketName(repositoryPath: string): string {\n const hash = createHash('sha256').update(repositoryPath).digest('hex').slice(0, SOCKET_HASH_LENGTH);\n return `${SESSION_PREFIX}${hash}`;\n}\n\nfunction environment(\n sessionId: string,\n interactive: boolean,\n env: Readonly<Record<string, string | undefined>>,\n): Record<string, string> {\n const values: NodeJS.ProcessEnv = {\n ...env,\n ...(interactive ? {} : { ...NON_INTERACTIVE_ENV, ...noninteractiveEnvironment(env) }),\n // Applied to interactive runs as well: a pane is a tty either way, and an\n // agent sending input to a prompt still has no way past a pager.\n ...NO_TERMINAL_INPUT_ENV,\n PI_SESSION_ID: sessionId,\n };\n if (!interactive) delete values['FORCE_COLOR'];\n return Object.fromEntries(\n Object.entries(values).filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n}\n\nasync function panePid(rmux: Rmux, target: string): Promise<number> {\n const response = await rmux.displayMessage(PANE_PID_FORMAT, { target });\n const message = typeof response['message'] === 'string' ? response['message'] : '';\n const pid = reportedPid(message);\n if (pid === undefined) throw new Error(`RMUX did not report a pane pid for ${target}`);\n return pid;\n}\n\n/** A pane pid as rmux prints it, or nothing when the output holds no usable pid. */\nfunction reportedPid(output: string): number | undefined {\n const pid = Number(output.trim());\n return Number.isInteger(pid) && pid > 0 ? pid : undefined;\n}\n\n/**\n * Waits for the run to end, preferring the supervisor's own record of it.\n *\n * The sidecar is written before the command's pane can end, and it outlives the\n * server that the pane's exit takes down with it. Watching for it means a run\n * that finishes inside a poll interval is observed when it finishes rather than\n * on the next tick. Asking the server stays the fallback for a supervisor that\n * died without recording anything.\n */\nasync function waitForRunEnd(rmux: Rmux, target: string, exitPath: string): Promise<number | null> {\n const landed = watchForFile(exitPath);\n let active = true;\n const readEvidence = async (): Promise<null> => {\n while (active) {\n if (await landed.appeared(POLL_MS)) return null;\n }\n return null;\n };\n const probePane = async (): Promise<number | null> => {\n while (active) {\n await delay(POLL_MS);\n if (!active) return null;\n const state = await readPaneExit(rmux, target);\n if (state.exited) return state.code;\n }\n return null;\n };\n try {\n // A stalled SDK request must not block the supervisor's durable evidence.\n // Keep only one pane request in flight, even when it never answers.\n return await Promise.race([readEvidence(), probePane()]);\n } finally {\n active = false;\n landed.close();\n }\n}\n\n/**\n * Gives the log sink a moment to mark the log complete.\n *\n * Normal completion retains the session until the sink records its final\n * writes. A lost session cannot guarantee a later marker, so it ends the wait.\n */\nasync function waitForLogDrain(rmux: Rmux, target: string, donePath: string): Promise<void> {\n const deadline = Date.now() + LOG_DRAIN_TIMEOUT_MS;\n const landed = watchForFile(donePath);\n let active = true;\n const readEvidence = async (): Promise<void> => {\n while (active && Date.now() < deadline) {\n if (await landed.appeared(LOG_DRAIN_POLL_MS)) return;\n }\n };\n const probeSession = async (): Promise<void> => {\n while (active && Date.now() < deadline) {\n await delay(LOG_DRAIN_POLL_MS);\n if (!active) return;\n if (await sessionMissing(rmux, target)) return;\n }\n };\n try {\n // The file loop enforces the deadline while a session query is outstanding.\n await Promise.race([readEvidence(), probeSession()]);\n } finally {\n active = false;\n landed.close();\n }\n}\n\nasync function closeOwnedSession(rmux: Rmux, target: string): Promise<boolean> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(result);\n };\n const timer = setTimeout(() => {\n process.emitWarning(`Timed out closing RMUX target ${target} after ${STOP_CLOSE_TIMEOUT_MS}ms`);\n finish(false);\n }, STOP_CLOSE_TIMEOUT_MS);\n void rmux\n .session(target)\n .kill()\n .then(\n () => finish(true),\n (error: unknown) => {\n process.emitWarning(`Could not close RMUX target ${target}: ${errorMessage(error)}`);\n finish(false);\n },\n );\n });\n}\n\nasync function waitForPaneStop(rmux: Rmux, target: string, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n try {\n if ((await readPaneExit(rmux, target)).exited) return true;\n } catch (error) {\n process.emitWarning(`Could not verify RMUX target ${target} stopped: ${errorMessage(error)}`);\n return false;\n }\n await delay(POLL_MS);\n }\n return false;\n}\n\n/**\n * One formatted read answers both questions this poll asks, so watching a run\n * costs the same single rmux call it always did.\n */\nasync function readPaneExit(rmux: Rmux, target: string): Promise<{ exited: boolean; code: number | null }> {\n let message: string;\n try {\n const response = await rmux.displayMessage(PANE_STATE_FORMAT, { target });\n message = typeof response['message'] === 'string' ? response['message'] : '';\n } catch {\n // The last session ending stops the server, so a server that cannot be\n // reached is the ordinary end of the last run rather than a fault.\n return { exited: true, code: null };\n }\n const [dead, status, ...rest] = message.trim().split(':');\n // A missing session formats as a live pane with no name rather than failing,\n // so the name is what says whether there is still anything to watch.\n if (rest.join(':') === '') return { exited: true, code: null };\n if (dead === '1' || dead === 'true') {\n const code = Number(status);\n return { exited: true, code: Number.isInteger(code) ? code : null };\n }\n return { exited: false, code: null };\n}\n\n/** A session that cannot be found, on a server that may itself be gone. */\nasync function sessionMissing(rmux: Rmux, target: string): Promise<boolean> {\n try {\n const probe = await rmux.cmd('has-session', '-t', target);\n return probe.returnCode !== 0;\n } catch {\n // No server to ask means no session to find.\n return true;\n }\n}\n\n/**\n * A pane that was already gone and a signal that could not be delivered are\n * opposite answers to \"is it stopped\", so they are reported apart.\n */\nfunction signalPane(pid: number, target: string): 'signalled' | 'gone' | 'failed' {\n try {\n process.kill(pid, 'SIGTERM');\n return 'signalled';\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ESRCH') return 'gone';\n process.emitWarning(`Could not signal RMUX target ${target}: ${errorMessage(error)}`);\n return 'failed';\n }\n}\n\nfunction readTail(target: string, maxBytes: number): string {\n let handle: number | undefined;\n try {\n const size = fs.statSync(target).size;\n const bytes = Math.min(size, maxBytes);\n const buffer = Buffer.alloc(bytes);\n handle = fs.openSync(target, 'r');\n fs.readSync(handle, buffer, 0, bytes, size - bytes);\n return buffer.toString('utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n process.emitWarning(`Could not read RMUX log ${target}: ${errorMessage(error)}`);\n }\n return '';\n } finally {\n if (handle !== undefined) fs.closeSync(handle);\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.();\n });\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_rmuxBackend = require("./rmuxBackend-Dh0CYVAL.cjs");
2
+ const require_rmuxBackend = require("./rmuxBackend-Cod2H85V.cjs");
3
3
  exports.RmuxBackend = require_rmuxBackend.RmuxBackend;
4
4
  exports.rmuxPackageForTarget = require_rmuxBackend.rmuxPackageForTarget;
@@ -3,9 +3,9 @@ const require_rtkProcessor = require("./rtkProcessor-CsrCPyTQ.cjs");
3
3
  const require_runnerConfig = require("./runnerConfig-BoLMinlx.cjs");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
6
- let node_module = require("node:module");
7
6
  let node_path = require("node:path");
8
7
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
8
+ let node_module = require("node:module");
9
9
  let node_child_process = require("node:child_process");
10
10
  //#region src/constants/rtkProcessor.ts
11
11
  const RTK_STDIN_MAX_BYTES = 10485760;
@@ -332,4 +332,4 @@ Object.defineProperty(exports, "rtkPackageForTarget", {
332
332
  }
333
333
  });
334
334
 
335
- //# sourceMappingURL=rtkProcessor-DSGbM-Cm.cjs.map
335
+ //# sourceMappingURL=rtkProcessor-xwARIxhe.cjs.map