@caupulican/pi-adaptative 0.81.32 → 0.81.35

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 (237) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +69 -0
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +53 -0
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -0
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +1282 -0
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -0
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +1453 -0
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/builder-validator.json +14 -0
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/claude-trio.json +32 -0
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/full-provider-review.json +15 -0
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/provider-prompt-smoke.json +14 -0
  12. package/dist/bundled-resources/prompts/extensionify.md +5 -4
  13. package/dist/bundled-resources/prompts/skillify.md +5 -5
  14. package/dist/bundled-resources/skills/pi-harness-learning/SKILL.md +6 -3
  15. package/dist/config.d.ts +5 -1
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +10 -2
  18. package/dist/config.js.map +1 -1
  19. package/dist/core/agent-session.d.ts +7 -0
  20. package/dist/core/agent-session.d.ts.map +1 -1
  21. package/dist/core/agent-session.js +25 -2
  22. package/dist/core/agent-session.js.map +1 -1
  23. package/dist/core/background-lane-controller.d.ts +12 -3
  24. package/dist/core/background-lane-controller.d.ts.map +1 -1
  25. package/dist/core/background-lane-controller.js +67 -26
  26. package/dist/core/background-lane-controller.js.map +1 -1
  27. package/dist/core/bash-executor.d.ts.map +1 -1
  28. package/dist/core/bash-executor.js +7 -3
  29. package/dist/core/bash-executor.js.map +1 -1
  30. package/dist/core/context/context-store-retention.d.ts +4 -1
  31. package/dist/core/context/context-store-retention.d.ts.map +1 -1
  32. package/dist/core/context/context-store-retention.js +42 -151
  33. package/dist/core/context/context-store-retention.js.map +1 -1
  34. package/dist/core/context-pipeline.d.ts.map +1 -1
  35. package/dist/core/context-pipeline.js +6 -6
  36. package/dist/core/context-pipeline.js.map +1 -1
  37. package/dist/core/exec.d.ts.map +1 -1
  38. package/dist/core/exec.js +25 -39
  39. package/dist/core/exec.js.map +1 -1
  40. package/dist/core/extensions/loader.d.ts +9 -2
  41. package/dist/core/extensions/loader.d.ts.map +1 -1
  42. package/dist/core/extensions/loader.js +105 -21
  43. package/dist/core/extensions/loader.js.map +1 -1
  44. package/dist/core/footer-data-provider.d.ts.map +1 -1
  45. package/dist/core/footer-data-provider.js +2 -0
  46. package/dist/core/footer-data-provider.js.map +1 -1
  47. package/dist/core/goals/goal-state.d.ts +10 -0
  48. package/dist/core/goals/goal-state.d.ts.map +1 -1
  49. package/dist/core/goals/goal-state.js +37 -0
  50. package/dist/core/goals/goal-state.js.map +1 -1
  51. package/dist/core/goals/goal-tool-core.d.ts +11 -0
  52. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  53. package/dist/core/goals/goal-tool-core.js +51 -1
  54. package/dist/core/goals/goal-tool-core.js.map +1 -1
  55. package/dist/core/improvement-loop.d.ts.map +1 -1
  56. package/dist/core/improvement-loop.js +26 -5
  57. package/dist/core/improvement-loop.js.map +1 -1
  58. package/dist/core/models/fitness-store.d.ts.map +1 -1
  59. package/dist/core/models/fitness-store.js +1 -1
  60. package/dist/core/models/fitness-store.js.map +1 -1
  61. package/dist/core/models/local-runtime.d.ts +6 -4
  62. package/dist/core/models/local-runtime.d.ts.map +1 -1
  63. package/dist/core/models/local-runtime.js +108 -36
  64. package/dist/core/models/local-runtime.js.map +1 -1
  65. package/dist/core/output-guard.d.ts.map +1 -1
  66. package/dist/core/output-guard.js +23 -8
  67. package/dist/core/output-guard.js.map +1 -1
  68. package/dist/core/package-manager.d.ts.map +1 -1
  69. package/dist/core/package-manager.js +44 -59
  70. package/dist/core/package-manager.js.map +1 -1
  71. package/dist/core/profile-resource-selection.d.ts +16 -0
  72. package/dist/core/profile-resource-selection.d.ts.map +1 -1
  73. package/dist/core/profile-resource-selection.js +41 -0
  74. package/dist/core/profile-resource-selection.js.map +1 -1
  75. package/dist/core/reflection-controller.d.ts.map +1 -1
  76. package/dist/core/reflection-controller.js +18 -1
  77. package/dist/core/reflection-controller.js.map +1 -1
  78. package/dist/core/reload-blockers.d.ts +1 -0
  79. package/dist/core/reload-blockers.d.ts.map +1 -1
  80. package/dist/core/reload-blockers.js +6 -2
  81. package/dist/core/reload-blockers.js.map +1 -1
  82. package/dist/core/resource-loader.d.ts +2 -0
  83. package/dist/core/resource-loader.d.ts.map +1 -1
  84. package/dist/core/resource-loader.js +50 -28
  85. package/dist/core/resource-loader.js.map +1 -1
  86. package/dist/core/settings-manager.d.ts.map +1 -1
  87. package/dist/core/settings-manager.js +1 -1
  88. package/dist/core/settings-manager.js.map +1 -1
  89. package/dist/core/slash-commands.d.ts.map +1 -1
  90. package/dist/core/slash-commands.js +1 -1
  91. package/dist/core/slash-commands.js.map +1 -1
  92. package/dist/core/toolkit/script-runner.d.ts.map +1 -1
  93. package/dist/core/toolkit/script-runner.js +58 -24
  94. package/dist/core/toolkit/script-runner.js.map +1 -1
  95. package/dist/core/tools/bash.d.ts.map +1 -1
  96. package/dist/core/tools/bash.js +13 -26
  97. package/dist/core/tools/bash.js.map +1 -1
  98. package/dist/core/tools/extensionify.d.ts +2 -1
  99. package/dist/core/tools/extensionify.d.ts.map +1 -1
  100. package/dist/core/tools/extensionify.js +11 -8
  101. package/dist/core/tools/extensionify.js.map +1 -1
  102. package/dist/core/tools/find.d.ts.map +1 -1
  103. package/dist/core/tools/find.js +54 -48
  104. package/dist/core/tools/find.js.map +1 -1
  105. package/dist/core/tools/git-filter.d.ts.map +1 -1
  106. package/dist/core/tools/git-filter.js +20 -32
  107. package/dist/core/tools/git-filter.js.map +1 -1
  108. package/dist/core/tools/goal.d.ts +1 -1
  109. package/dist/core/tools/goal.d.ts.map +1 -1
  110. package/dist/core/tools/goal.js +10 -3
  111. package/dist/core/tools/goal.js.map +1 -1
  112. package/dist/core/tools/grep.d.ts.map +1 -1
  113. package/dist/core/tools/grep.js +89 -80
  114. package/dist/core/tools/grep.js.map +1 -1
  115. package/dist/core/tools/output-accumulator.d.ts +2 -0
  116. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  117. package/dist/core/tools/output-accumulator.js +7 -4
  118. package/dist/core/tools/output-accumulator.js.map +1 -1
  119. package/dist/core/tools/read.d.ts.map +1 -1
  120. package/dist/core/tools/read.js +4 -3
  121. package/dist/core/tools/read.js.map +1 -1
  122. package/dist/index.d.ts +2 -1
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +2 -1
  125. package/dist/index.js.map +1 -1
  126. package/dist/main.d.ts +2 -0
  127. package/dist/main.d.ts.map +1 -1
  128. package/dist/main.js +23 -4
  129. package/dist/main.js.map +1 -1
  130. package/dist/migrations.d.ts.map +1 -1
  131. package/dist/migrations.js +18 -4
  132. package/dist/migrations.js.map +1 -1
  133. package/dist/modes/interactive/auth-dialogs-controller.d.ts +10 -0
  134. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  135. package/dist/modes/interactive/auth-dialogs-controller.js +94 -27
  136. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  137. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  138. package/dist/modes/interactive/auto-learn-controller.js +2 -1
  139. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  140. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -0
  141. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  142. package/dist/modes/interactive/components/bordered-loader.js +8 -0
  143. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  144. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  145. package/dist/modes/interactive/components/extension-editor.js +6 -15
  146. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  147. package/dist/modes/interactive/components/login-dialog.d.ts +3 -1
  148. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  149. package/dist/modes/interactive/components/login-dialog.js +20 -8
  150. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  151. package/dist/modes/interactive/components/profile-resource-editor.d.ts +4 -1
  152. package/dist/modes/interactive/components/profile-resource-editor.d.ts.map +1 -1
  153. package/dist/modes/interactive/components/profile-resource-editor.js +22 -39
  154. package/dist/modes/interactive/components/profile-resource-editor.js.map +1 -1
  155. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  156. package/dist/modes/interactive/components/session-selector.js +1 -1
  157. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  158. package/dist/modes/interactive/config-backup.d.ts +1 -0
  159. package/dist/modes/interactive/config-backup.d.ts.map +1 -1
  160. package/dist/modes/interactive/config-backup.js +14 -3
  161. package/dist/modes/interactive/config-backup.js.map +1 -1
  162. package/dist/modes/interactive/editor-overlay-host.d.ts +12 -0
  163. package/dist/modes/interactive/editor-overlay-host.d.ts.map +1 -1
  164. package/dist/modes/interactive/editor-overlay-host.js +55 -0
  165. package/dist/modes/interactive/editor-overlay-host.js.map +1 -1
  166. package/dist/modes/interactive/extension-ui-host.d.ts +2 -1
  167. package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
  168. package/dist/modes/interactive/extension-ui-host.js +161 -96
  169. package/dist/modes/interactive/extension-ui-host.js.map +1 -1
  170. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  171. package/dist/modes/interactive/external-editor.js +23 -28
  172. package/dist/modes/interactive/external-editor.js.map +1 -1
  173. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  174. package/dist/modes/interactive/interactive-mode.js +14 -8
  175. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  176. package/dist/modes/interactive/profile-menu-controller.d.ts +5 -1
  177. package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -1
  178. package/dist/modes/interactive/profile-menu-controller.js +118 -24
  179. package/dist/modes/interactive/profile-menu-controller.js.map +1 -1
  180. package/dist/modes/interactive/resource-shell-commands.d.ts +1 -0
  181. package/dist/modes/interactive/resource-shell-commands.d.ts.map +1 -1
  182. package/dist/modes/interactive/resource-shell-commands.js +5 -1
  183. package/dist/modes/interactive/resource-shell-commands.js.map +1 -1
  184. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  185. package/dist/modes/interactive/session-flow-commands.js +100 -7
  186. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  187. package/dist/modes/interactive/session-io-commands.d.ts.map +1 -1
  188. package/dist/modes/interactive/session-io-commands.js +80 -50
  189. package/dist/modes/interactive/session-io-commands.js.map +1 -1
  190. package/dist/modes/interactive/startup-checks.d.ts.map +1 -1
  191. package/dist/modes/interactive/startup-checks.js +14 -17
  192. package/dist/modes/interactive/startup-checks.js.map +1 -1
  193. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  194. package/dist/modes/rpc/rpc-client.js +20 -19
  195. package/dist/modes/rpc/rpc-client.js.map +1 -1
  196. package/dist/package-manager-cli.d.ts.map +1 -1
  197. package/dist/package-manager-cli.js +10 -19
  198. package/dist/package-manager-cli.js.map +1 -1
  199. package/dist/utils/child-process.d.ts +13 -7
  200. package/dist/utils/child-process.d.ts.map +1 -1
  201. package/dist/utils/child-process.js +56 -3
  202. package/dist/utils/child-process.js.map +1 -1
  203. package/dist/utils/clipboard-image.d.ts.map +1 -1
  204. package/dist/utils/clipboard-image.js +3 -2
  205. package/dist/utils/clipboard-image.js.map +1 -1
  206. package/dist/utils/clipboard.d.ts.map +1 -1
  207. package/dist/utils/clipboard.js +17 -10
  208. package/dist/utils/clipboard.js.map +1 -1
  209. package/dist/utils/external-editor-command.d.ts +8 -0
  210. package/dist/utils/external-editor-command.d.ts.map +1 -0
  211. package/dist/utils/external-editor-command.js +60 -0
  212. package/dist/utils/external-editor-command.js.map +1 -0
  213. package/dist/utils/paths.d.ts.map +1 -1
  214. package/dist/utils/paths.js +10 -2
  215. package/dist/utils/paths.js.map +1 -1
  216. package/dist/utils/tools-manager.d.ts.map +1 -1
  217. package/dist/utils/tools-manager.js +23 -10
  218. package/dist/utils/tools-manager.js.map +1 -1
  219. package/dist/utils/work-directory.d.ts +36 -0
  220. package/dist/utils/work-directory.d.ts.map +1 -0
  221. package/dist/utils/work-directory.js +462 -0
  222. package/dist/utils/work-directory.js.map +1 -0
  223. package/docs/index.md +2 -0
  224. package/docs/resources.md +2 -2
  225. package/docs/rpc.md +1 -1
  226. package/docs/tmux-agent-manager.md +48 -0
  227. package/docs/windows.md +100 -7
  228. package/docs/work-directory.md +41 -0
  229. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  230. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  231. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  232. package/examples/extensions/sandbox/package-lock.json +2 -2
  233. package/examples/extensions/sandbox/package.json +1 -1
  234. package/examples/extensions/with-deps/package-lock.json +2 -2
  235. package/examples/extensions/with-deps/package.json +1 -1
  236. package/npm-shrinkwrap.json +12 -12
  237. package/package.json +4 -4
@@ -25,13 +25,17 @@ import { globSync } from "glob";
25
25
  import ignore from "ignore";
26
26
  import { minimatch } from "minimatch";
27
27
  import { CONFIG_DIR_NAME } from "../config.js";
28
- import { spawnProcess, spawnProcessSync } from "../utils/child-process.js";
28
+ import { spawnProcess, spawnProcessSync, waitForChildProcessWithTermination } from "../utils/child-process.js";
29
29
  import { parseGitUrl } from "../utils/git.js";
30
30
  import { canonicalizePath, isLocalPath, markPathIgnoredByCloudSync, resolvePath } from "../utils/paths.js";
31
+ import { getProcessWorkRun } from "../utils/work-directory.js";
31
32
  import { createRollingOutputBuffer } from "./exec.js";
32
33
  import { isStdoutTakenOver } from "./output-guard.js";
33
34
  import { mergeResourceProfileMap, parseResourceProfileBlocks } from "./resource-profile-blocks.js";
34
35
  const NETWORK_TIMEOUT_MS = 10000;
36
+ const PACKAGE_CAPTURE_TIMEOUT_MS = 30_000;
37
+ const PACKAGE_OPERATION_TIMEOUT_MS = 10 * 60_000;
38
+ const PACKAGE_COMMAND_KILL_GRACE_MS = 2_000;
35
39
  const UPDATE_CHECK_CONCURRENCY = 4;
36
40
  const GIT_UPDATE_CONCURRENCY = 4;
37
41
  const MAX_RESOURCE_PROFILE_SCAN_BYTES = 2 * 1024 * 1024;
@@ -74,8 +78,7 @@ function getHomeDir() {
74
78
  return process.env.HOME || homedir();
75
79
  }
76
80
  export function getExtensionTempFolder(agentDir) {
77
- const tempFolder = join(agentDir, "tmp", "extensions");
78
- mkdirSync(tempFolder, { recursive: true, mode: 0o700 });
81
+ const tempFolder = getProcessWorkRun(agentDir, "extensions", "packages").path;
79
82
  chmodSync(tempFolder, 0o700);
80
83
  return tempFolder;
81
84
  }
@@ -2064,6 +2067,7 @@ export class DefaultPackageManager {
2064
2067
  const env = getEnv();
2065
2068
  return spawnProcess(command, args, {
2066
2069
  cwd: options?.cwd,
2070
+ detached: process.platform !== "win32",
2067
2071
  stdio: isStdoutTakenOver() ? ["ignore", 2, 2] : "inherit",
2068
2072
  env,
2069
2073
  });
@@ -2073,69 +2077,49 @@ export class DefaultPackageManager {
2073
2077
  const env = options?.env ? { ...baseEnv, ...options.env } : baseEnv;
2074
2078
  return spawnProcess(command, args, {
2075
2079
  cwd: options?.cwd,
2080
+ detached: process.platform !== "win32",
2076
2081
  stdio: ["ignore", "pipe", "pipe"],
2077
2082
  env,
2078
2083
  });
2079
2084
  }
2080
- runCommandCapture(command, args, options) {
2081
- return new Promise((resolvePromise, reject) => {
2082
- const child = this.spawnCaptureCommand(command, args, options);
2083
- // Callers parse stdout, so a silently truncated tail would corrupt results.
2084
- // Bound retention and fail loudly in the (pathological) overflow case.
2085
- const maxCapturedOutput = 16 * 1024 * 1024;
2086
- const stdout = createRollingOutputBuffer(maxCapturedOutput);
2087
- const stderr = createRollingOutputBuffer(maxCapturedOutput);
2088
- let timedOut = false;
2089
- const timeout = typeof options?.timeoutMs === "number"
2090
- ? setTimeout(() => {
2091
- timedOut = true;
2092
- child.kill();
2093
- }, options.timeoutMs)
2094
- : undefined;
2095
- child.stdout?.on("data", (data) => {
2096
- stdout.push(data.toString());
2097
- });
2098
- child.stderr?.on("data", (data) => {
2099
- stderr.push(data.toString());
2100
- });
2101
- child.once("error", (error) => {
2102
- if (timeout)
2103
- clearTimeout(timeout);
2104
- reject(error);
2105
- });
2106
- child.once("close", (code, signal) => {
2107
- if (timeout)
2108
- clearTimeout(timeout);
2109
- if (timedOut) {
2110
- reject(new Error(`${command} ${args.join(" ")} timed out after ${options?.timeoutMs}ms`));
2111
- return;
2112
- }
2113
- if (code === 0) {
2114
- if (stdout.truncated()) {
2115
- reject(new Error(`${command} ${args.join(" ")} produced more than ${maxCapturedOutput} bytes of output`));
2116
- return;
2117
- }
2118
- resolvePromise(stdout.text().trim());
2119
- return;
2120
- }
2121
- const exitStatus = code === null ? `signal ${signal ?? "unknown"}` : `code ${code}`;
2122
- reject(new Error(`${command} ${args.join(" ")} failed with ${exitStatus}: ${stderr.text() || stdout.text()}`));
2123
- });
2085
+ async runCommandCapture(command, args, options) {
2086
+ const child = this.spawnCaptureCommand(command, args, options);
2087
+ // Callers parse stdout, so a silently truncated tail would corrupt results.
2088
+ // Bound retention and fail loudly in the (pathological) overflow case.
2089
+ const maxCapturedOutput = 16 * 1024 * 1024;
2090
+ const stdout = createRollingOutputBuffer(maxCapturedOutput);
2091
+ const stderr = createRollingOutputBuffer(maxCapturedOutput);
2092
+ child.stdout?.on("data", (data) => stdout.push(data.toString()));
2093
+ child.stderr?.on("data", (data) => stderr.push(data.toString()));
2094
+ const timeoutMs = options?.timeoutMs ?? PACKAGE_CAPTURE_TIMEOUT_MS;
2095
+ const terminal = await waitForChildProcessWithTermination(child, {
2096
+ timeoutMs,
2097
+ killGraceMs: PACKAGE_COMMAND_KILL_GRACE_MS,
2124
2098
  });
2099
+ if (terminal.reason === "timeout") {
2100
+ throw new Error(`${command} ${args.join(" ")} timed out after ${timeoutMs}ms`);
2101
+ }
2102
+ if (terminal.code === 0) {
2103
+ if (stdout.truncated()) {
2104
+ throw new Error(`${command} ${args.join(" ")} produced more than ${maxCapturedOutput} bytes of output`);
2105
+ }
2106
+ return stdout.text().trim();
2107
+ }
2108
+ const exitStatus = terminal.code === null ? `signal ${child.signalCode ?? "unknown"}` : `code ${terminal.code}`;
2109
+ throw new Error(`${command} ${args.join(" ")} failed with ${exitStatus}: ${stderr.text() || stdout.text()}`);
2125
2110
  }
2126
- runCommand(command, args, options) {
2127
- return new Promise((resolvePromise, reject) => {
2128
- const child = this.spawnCommand(command, args, options);
2129
- child.on("error", reject);
2130
- child.on("exit", (code) => {
2131
- if (code === 0) {
2132
- resolvePromise();
2133
- }
2134
- else {
2135
- reject(new Error(`${command} ${args.join(" ")} failed with code ${code}`));
2136
- }
2137
- });
2111
+ async runCommand(command, args, options) {
2112
+ const child = this.spawnCommand(command, args, options);
2113
+ const terminal = await waitForChildProcessWithTermination(child, {
2114
+ timeoutMs: PACKAGE_OPERATION_TIMEOUT_MS,
2115
+ killGraceMs: PACKAGE_COMMAND_KILL_GRACE_MS,
2138
2116
  });
2117
+ if (terminal.reason === "timeout") {
2118
+ throw new Error(`${command} ${args.join(" ")} timed out after ${PACKAGE_OPERATION_TIMEOUT_MS}ms`);
2119
+ }
2120
+ if (terminal.code !== 0) {
2121
+ throw new Error(`${command} ${args.join(" ")} failed with code ${terminal.code}`);
2122
+ }
2139
2123
  }
2140
2124
  runCommandSync(command, args) {
2141
2125
  const env = getEnv();
@@ -2143,6 +2127,7 @@ export class DefaultPackageManager {
2143
2127
  stdio: ["ignore", "pipe", "pipe"],
2144
2128
  encoding: "utf-8",
2145
2129
  env,
2130
+ timeout: 30_000,
2146
2131
  });
2147
2132
  if (result.error || result.status !== 0) {
2148
2133
  throw new Error(`Failed to run ${command} ${args.join(" ")}: ${result.error?.message || result.stderr || result.stdout}`);