@auvira.ai/sdk 0.2.9

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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +414 -0
  3. package/dist/agent/Agent.d.ts +27 -0
  4. package/dist/agent/Agent.d.ts.map +1 -0
  5. package/dist/agent/Agent.js +144 -0
  6. package/dist/agent/Agent.js.map +1 -0
  7. package/dist/agent/AgentRegistry.d.ts +13 -0
  8. package/dist/agent/AgentRegistry.d.ts.map +1 -0
  9. package/dist/agent/AgentRegistry.js +28 -0
  10. package/dist/agent/AgentRegistry.js.map +1 -0
  11. package/dist/agent/AgentRun.d.ts +38 -0
  12. package/dist/agent/AgentRun.d.ts.map +1 -0
  13. package/dist/agent/AgentRun.js +101 -0
  14. package/dist/agent/AgentRun.js.map +1 -0
  15. package/dist/agent/ConversationStore.d.ts +18 -0
  16. package/dist/agent/ConversationStore.d.ts.map +1 -0
  17. package/dist/agent/ConversationStore.js +38 -0
  18. package/dist/agent/ConversationStore.js.map +1 -0
  19. package/dist/agent/RunEventBus.d.ts +43 -0
  20. package/dist/agent/RunEventBus.d.ts.map +1 -0
  21. package/dist/agent/RunEventBus.js +289 -0
  22. package/dist/agent/RunEventBus.js.map +1 -0
  23. package/dist/agent/assistantEvent.d.ts +11 -0
  24. package/dist/agent/assistantEvent.d.ts.map +1 -0
  25. package/dist/agent/assistantEvent.js +20 -0
  26. package/dist/agent/assistantEvent.js.map +1 -0
  27. package/dist/agent/buildAgentPrompt.d.ts +10 -0
  28. package/dist/agent/buildAgentPrompt.d.ts.map +1 -0
  29. package/dist/agent/buildAgentPrompt.js +39 -0
  30. package/dist/agent/buildAgentPrompt.js.map +1 -0
  31. package/dist/agent/cancellation.d.ts +9 -0
  32. package/dist/agent/cancellation.d.ts.map +1 -0
  33. package/dist/agent/cancellation.js +18 -0
  34. package/dist/agent/cancellation.js.map +1 -0
  35. package/dist/agent/editCompletion.d.ts +35 -0
  36. package/dist/agent/editCompletion.d.ts.map +1 -0
  37. package/dist/agent/editCompletion.js +179 -0
  38. package/dist/agent/editCompletion.js.map +1 -0
  39. package/dist/agent/editEvents.d.ts +11 -0
  40. package/dist/agent/editEvents.d.ts.map +1 -0
  41. package/dist/agent/editEvents.js +36 -0
  42. package/dist/agent/editEvents.js.map +1 -0
  43. package/dist/agent/evaluateTaskCompletion.d.ts +49 -0
  44. package/dist/agent/evaluateTaskCompletion.d.ts.map +1 -0
  45. package/dist/agent/evaluateTaskCompletion.js +257 -0
  46. package/dist/agent/evaluateTaskCompletion.js.map +1 -0
  47. package/dist/agent/events.d.ts +182 -0
  48. package/dist/agent/events.d.ts.map +1 -0
  49. package/dist/agent/events.js +25 -0
  50. package/dist/agent/events.js.map +1 -0
  51. package/dist/agent/parseSendPayload.d.ts +24 -0
  52. package/dist/agent/parseSendPayload.d.ts.map +1 -0
  53. package/dist/agent/parseSendPayload.js +71 -0
  54. package/dist/agent/parseSendPayload.js.map +1 -0
  55. package/dist/agent/patchUtils.d.ts +17 -0
  56. package/dist/agent/patchUtils.d.ts.map +1 -0
  57. package/dist/agent/patchUtils.js +90 -0
  58. package/dist/agent/patchUtils.js.map +1 -0
  59. package/dist/agent/resolveModelConfig.d.ts +4 -0
  60. package/dist/agent/resolveModelConfig.d.ts.map +1 -0
  61. package/dist/agent/resolveModelConfig.js +27 -0
  62. package/dist/agent/resolveModelConfig.js.map +1 -0
  63. package/dist/agent/runAgentTask.d.ts +14 -0
  64. package/dist/agent/runAgentTask.d.ts.map +1 -0
  65. package/dist/agent/runAgentTask.js +376 -0
  66. package/dist/agent/runAgentTask.js.map +1 -0
  67. package/dist/agent/runResult.d.ts +10 -0
  68. package/dist/agent/runResult.d.ts.map +1 -0
  69. package/dist/agent/runResult.js +34 -0
  70. package/dist/agent/runResult.js.map +1 -0
  71. package/dist/agent/runValidationWithRepair.d.ts +32 -0
  72. package/dist/agent/runValidationWithRepair.d.ts.map +1 -0
  73. package/dist/agent/runValidationWithRepair.js +114 -0
  74. package/dist/agent/runValidationWithRepair.js.map +1 -0
  75. package/dist/agent/tools/edit.d.ts +4 -0
  76. package/dist/agent/tools/edit.d.ts.map +1 -0
  77. package/dist/agent/tools/edit.js +98 -0
  78. package/dist/agent/tools/edit.js.map +1 -0
  79. package/dist/agent/tools/executeTool.d.ts +8 -0
  80. package/dist/agent/tools/executeTool.d.ts.map +1 -0
  81. package/dist/agent/tools/executeTool.js +104 -0
  82. package/dist/agent/tools/executeTool.js.map +1 -0
  83. package/dist/agent/tools/glob.d.ts +6 -0
  84. package/dist/agent/tools/glob.d.ts.map +1 -0
  85. package/dist/agent/tools/glob.js +77 -0
  86. package/dist/agent/tools/glob.js.map +1 -0
  87. package/dist/agent/tools/grep.d.ts +4 -0
  88. package/dist/agent/tools/grep.d.ts.map +1 -0
  89. package/dist/agent/tools/grep.js +61 -0
  90. package/dist/agent/tools/grep.js.map +1 -0
  91. package/dist/agent/tools/pathGuard.d.ts +11 -0
  92. package/dist/agent/tools/pathGuard.d.ts.map +1 -0
  93. package/dist/agent/tools/pathGuard.js +55 -0
  94. package/dist/agent/tools/pathGuard.js.map +1 -0
  95. package/dist/agent/tools/read.d.ts +4 -0
  96. package/dist/agent/tools/read.d.ts.map +1 -0
  97. package/dist/agent/tools/read.js +41 -0
  98. package/dist/agent/tools/read.js.map +1 -0
  99. package/dist/agent/tools/types.d.ts +46 -0
  100. package/dist/agent/tools/types.d.ts.map +1 -0
  101. package/dist/agent/tools/types.js +2 -0
  102. package/dist/agent/tools/types.js.map +1 -0
  103. package/dist/agent/tools/write.d.ts +4 -0
  104. package/dist/agent/tools/write.d.ts.map +1 -0
  105. package/dist/agent/tools/write.js +63 -0
  106. package/dist/agent/tools/write.js.map +1 -0
  107. package/dist/agent/types.d.ts +193 -0
  108. package/dist/agent/types.d.ts.map +1 -0
  109. package/dist/agent/types.js +18 -0
  110. package/dist/agent/types.js.map +1 -0
  111. package/dist/agent/validateOptions.d.ts +12 -0
  112. package/dist/agent/validateOptions.d.ts.map +1 -0
  113. package/dist/agent/validateOptions.js +91 -0
  114. package/dist/agent/validateOptions.js.map +1 -0
  115. package/dist/git/cloneGitLabProject.d.ts +10 -0
  116. package/dist/git/cloneGitLabProject.d.ts.map +1 -0
  117. package/dist/git/cloneGitLabProject.js +24 -0
  118. package/dist/git/cloneGitLabProject.js.map +1 -0
  119. package/dist/git/createAgentBranch.d.ts +3 -0
  120. package/dist/git/createAgentBranch.d.ts.map +1 -0
  121. package/dist/git/createAgentBranch.js +14 -0
  122. package/dist/git/createAgentBranch.js.map +1 -0
  123. package/dist/git/gitDiff.d.ts +9 -0
  124. package/dist/git/gitDiff.d.ts.map +1 -0
  125. package/dist/git/gitDiff.js +34 -0
  126. package/dist/git/gitDiff.js.map +1 -0
  127. package/dist/git/maskSecrets.d.ts +3 -0
  128. package/dist/git/maskSecrets.d.ts.map +1 -0
  129. package/dist/git/maskSecrets.js +15 -0
  130. package/dist/git/maskSecrets.js.map +1 -0
  131. package/dist/git/resolveGitLabProject.d.ts +26 -0
  132. package/dist/git/resolveGitLabProject.d.ts.map +1 -0
  133. package/dist/git/resolveGitLabProject.js +68 -0
  134. package/dist/git/resolveGitLabProject.js.map +1 -0
  135. package/dist/git/sanitizeGitLabUrl.d.ts +8 -0
  136. package/dist/git/sanitizeGitLabUrl.d.ts.map +1 -0
  137. package/dist/git/sanitizeGitLabUrl.js +38 -0
  138. package/dist/git/sanitizeGitLabUrl.js.map +1 -0
  139. package/dist/index.d.ts +13 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +7 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/providers/agentic/AgenticCustomProvider.d.ts +9 -0
  144. package/dist/providers/agentic/AgenticCustomProvider.d.ts.map +1 -0
  145. package/dist/providers/agentic/AgenticCustomProvider.js +366 -0
  146. package/dist/providers/agentic/AgenticCustomProvider.js.map +1 -0
  147. package/dist/providers/agentic/agentLoop.d.ts +79 -0
  148. package/dist/providers/agentic/agentLoop.d.ts.map +1 -0
  149. package/dist/providers/agentic/agentLoop.js +646 -0
  150. package/dist/providers/agentic/agentLoop.js.map +1 -0
  151. package/dist/providers/agentic/priomptContext.d.ts +29 -0
  152. package/dist/providers/agentic/priomptContext.d.ts.map +1 -0
  153. package/dist/providers/agentic/priomptContext.js +90 -0
  154. package/dist/providers/agentic/priomptContext.js.map +1 -0
  155. package/dist/providers/agentic/seedRetrieval.d.ts +12 -0
  156. package/dist/providers/agentic/seedRetrieval.d.ts.map +1 -0
  157. package/dist/providers/agentic/seedRetrieval.js +58 -0
  158. package/dist/providers/agentic/seedRetrieval.js.map +1 -0
  159. package/dist/providers/agentic/toolPolicy.d.ts +15 -0
  160. package/dist/providers/agentic/toolPolicy.d.ts.map +1 -0
  161. package/dist/providers/agentic/toolPolicy.js +53 -0
  162. package/dist/providers/agentic/toolPolicy.js.map +1 -0
  163. package/dist/providers/agentic/toolSchemas.d.ts +177 -0
  164. package/dist/providers/agentic/toolSchemas.d.ts.map +1 -0
  165. package/dist/providers/agentic/toolSchemas.js +104 -0
  166. package/dist/providers/agentic/toolSchemas.js.map +1 -0
  167. package/dist/providers/agentic/trimAgentHistory.d.ts +18 -0
  168. package/dist/providers/agentic/trimAgentHistory.d.ts.map +1 -0
  169. package/dist/providers/agentic/trimAgentHistory.js +68 -0
  170. package/dist/providers/agentic/trimAgentHistory.js.map +1 -0
  171. package/dist/providers/custom/CustomModelProvider.d.ts +4 -0
  172. package/dist/providers/custom/CustomModelProvider.d.ts.map +1 -0
  173. package/dist/providers/custom/CustomModelProvider.js +538 -0
  174. package/dist/providers/custom/CustomModelProvider.js.map +1 -0
  175. package/dist/providers/custom/discoverTargetFiles.d.ts +16 -0
  176. package/dist/providers/custom/discoverTargetFiles.d.ts.map +1 -0
  177. package/dist/providers/custom/discoverTargetFiles.js +231 -0
  178. package/dist/providers/custom/discoverTargetFiles.js.map +1 -0
  179. package/dist/providers/custom/harnessPinTypes.d.ts +15 -0
  180. package/dist/providers/custom/harnessPinTypes.d.ts.map +1 -0
  181. package/dist/providers/custom/harnessPinTypes.js +46 -0
  182. package/dist/providers/custom/harnessPinTypes.js.map +1 -0
  183. package/dist/providers/custom/harnessPrompt.d.ts +29 -0
  184. package/dist/providers/custom/harnessPrompt.d.ts.map +1 -0
  185. package/dist/providers/custom/harnessPrompt.js +356 -0
  186. package/dist/providers/custom/harnessPrompt.js.map +1 -0
  187. package/dist/providers/custom/harnessSectionContext.d.ts +7 -0
  188. package/dist/providers/custom/harnessSectionContext.d.ts.map +1 -0
  189. package/dist/providers/custom/harnessSectionContext.js +82 -0
  190. package/dist/providers/custom/harnessSectionContext.js.map +1 -0
  191. package/dist/providers/custom/modelRequestDefaults.d.ts +16 -0
  192. package/dist/providers/custom/modelRequestDefaults.d.ts.map +1 -0
  193. package/dist/providers/custom/modelRequestDefaults.js +71 -0
  194. package/dist/providers/custom/modelRequestDefaults.js.map +1 -0
  195. package/dist/providers/custom/parseModelEditPlan.d.ts +21 -0
  196. package/dist/providers/custom/parseModelEditPlan.d.ts.map +1 -0
  197. package/dist/providers/custom/parseModelEditPlan.js +164 -0
  198. package/dist/providers/custom/parseModelEditPlan.js.map +1 -0
  199. package/dist/providers/custom/selectPromptFiles.d.ts +18 -0
  200. package/dist/providers/custom/selectPromptFiles.d.ts.map +1 -0
  201. package/dist/providers/custom/selectPromptFiles.js +180 -0
  202. package/dist/providers/custom/selectPromptFiles.js.map +1 -0
  203. package/dist/providers/custom/visionImages.d.ts +4 -0
  204. package/dist/providers/custom/visionImages.d.ts.map +1 -0
  205. package/dist/providers/custom/visionImages.js +10 -0
  206. package/dist/providers/custom/visionImages.js.map +1 -0
  207. package/dist/providers/openhands/OpenHandsMockProvider.d.ts +6 -0
  208. package/dist/providers/openhands/OpenHandsMockProvider.d.ts.map +1 -0
  209. package/dist/providers/openhands/OpenHandsMockProvider.js +73 -0
  210. package/dist/providers/openhands/OpenHandsMockProvider.js.map +1 -0
  211. package/dist/providers/openhands/OpenHandsProvider.d.ts +4 -0
  212. package/dist/providers/openhands/OpenHandsProvider.d.ts.map +1 -0
  213. package/dist/providers/openhands/OpenHandsProvider.js +163 -0
  214. package/dist/providers/openhands/OpenHandsProvider.js.map +1 -0
  215. package/dist/providers/openhands/openHandsEvents.d.ts +6 -0
  216. package/dist/providers/openhands/openHandsEvents.d.ts.map +1 -0
  217. package/dist/providers/openhands/openHandsEvents.js +54 -0
  218. package/dist/providers/openhands/openHandsEvents.js.map +1 -0
  219. package/dist/providers/openhands/types.d.ts +16 -0
  220. package/dist/providers/openhands/types.d.ts.map +1 -0
  221. package/dist/providers/openhands/types.js +2 -0
  222. package/dist/providers/openhands/types.js.map +1 -0
  223. package/dist/providers/runProvider.d.ts +4 -0
  224. package/dist/providers/runProvider.d.ts.map +1 -0
  225. package/dist/providers/runProvider.js +16 -0
  226. package/dist/providers/runProvider.js.map +1 -0
  227. package/dist/providers/types.d.ts +35 -0
  228. package/dist/providers/types.d.ts.map +1 -0
  229. package/dist/providers/types.js +5 -0
  230. package/dist/providers/types.js.map +1 -0
  231. package/dist/server/routes.d.ts +9 -0
  232. package/dist/server/routes.d.ts.map +1 -0
  233. package/dist/server/routes.js +58 -0
  234. package/dist/server/routes.js.map +1 -0
  235. package/dist/server/server.d.ts +10 -0
  236. package/dist/server/server.d.ts.map +1 -0
  237. package/dist/server/server.js +39 -0
  238. package/dist/server/server.js.map +1 -0
  239. package/dist/tools/fileExists.d.ts +3 -0
  240. package/dist/tools/fileExists.d.ts.map +1 -0
  241. package/dist/tools/fileExists.js +12 -0
  242. package/dist/tools/fileExists.js.map +1 -0
  243. package/dist/tools/resolveBuildValidation.d.ts +8 -0
  244. package/dist/tools/resolveBuildValidation.d.ts.map +1 -0
  245. package/dist/tools/resolveBuildValidation.js +35 -0
  246. package/dist/tools/resolveBuildValidation.js.map +1 -0
  247. package/dist/tools/runCommand.d.ts +17 -0
  248. package/dist/tools/runCommand.d.ts.map +1 -0
  249. package/dist/tools/runCommand.js +92 -0
  250. package/dist/tools/runCommand.js.map +1 -0
  251. package/dist/tools/safeValidateCommand.d.ts +9 -0
  252. package/dist/tools/safeValidateCommand.d.ts.map +1 -0
  253. package/dist/tools/safeValidateCommand.js +59 -0
  254. package/dist/tools/safeValidateCommand.js.map +1 -0
  255. package/dist/util/apiThrottle.d.ts +14 -0
  256. package/dist/util/apiThrottle.d.ts.map +1 -0
  257. package/dist/util/apiThrottle.js +50 -0
  258. package/dist/util/apiThrottle.js.map +1 -0
  259. package/dist/util/globMatch.d.ts +7 -0
  260. package/dist/util/globMatch.d.ts.map +1 -0
  261. package/dist/util/globMatch.js +25 -0
  262. package/dist/util/globMatch.js.map +1 -0
  263. package/dist/util/modelApiClient.d.ts +47 -0
  264. package/dist/util/modelApiClient.d.ts.map +1 -0
  265. package/dist/util/modelApiClient.js +245 -0
  266. package/dist/util/modelApiClient.js.map +1 -0
  267. package/dist/util/screenshotBase64.d.ts +3 -0
  268. package/dist/util/screenshotBase64.d.ts.map +1 -0
  269. package/dist/util/screenshotBase64.js +7 -0
  270. package/dist/util/screenshotBase64.js.map +1 -0
  271. package/dist/workspace/cleanupWorkspace.d.ts +3 -0
  272. package/dist/workspace/cleanupWorkspace.d.ts.map +1 -0
  273. package/dist/workspace/cleanupWorkspace.js +6 -0
  274. package/dist/workspace/cleanupWorkspace.js.map +1 -0
  275. package/dist/workspace/copyLocalRepo.d.ts +5 -0
  276. package/dist/workspace/copyLocalRepo.d.ts.map +1 -0
  277. package/dist/workspace/copyLocalRepo.js +34 -0
  278. package/dist/workspace/copyLocalRepo.js.map +1 -0
  279. package/dist/workspace/createWorkspace.d.ts +7 -0
  280. package/dist/workspace/createWorkspace.d.ts.map +1 -0
  281. package/dist/workspace/createWorkspace.js +10 -0
  282. package/dist/workspace/createWorkspace.js.map +1 -0
  283. package/dist/workspace/prepareWorkspace.d.ts +4 -0
  284. package/dist/workspace/prepareWorkspace.d.ts.map +1 -0
  285. package/dist/workspace/prepareWorkspace.js +46 -0
  286. package/dist/workspace/prepareWorkspace.js.map +1 -0
  287. package/dist/workspace/resolveWorkspaceMode.d.ts +7 -0
  288. package/dist/workspace/resolveWorkspaceMode.d.ts.map +1 -0
  289. package/dist/workspace/resolveWorkspaceMode.js +15 -0
  290. package/dist/workspace/resolveWorkspaceMode.js.map +1 -0
  291. package/dist/workspace/syncRepoToOwner.d.ts +3 -0
  292. package/dist/workspace/syncRepoToOwner.d.ts.map +1 -0
  293. package/dist/workspace/syncRepoToOwner.js +14 -0
  294. package/dist/workspace/syncRepoToOwner.js.map +1 -0
  295. package/dist/workspace/workspaceCheckpoint.d.ts +20 -0
  296. package/dist/workspace/workspaceCheckpoint.d.ts.map +1 -0
  297. package/dist/workspace/workspaceCheckpoint.js +243 -0
  298. package/dist/workspace/workspaceCheckpoint.js.map +1 -0
  299. package/dist/workspace/writeScreenshot.d.ts +15 -0
  300. package/dist/workspace/writeScreenshot.d.ts.map +1 -0
  301. package/dist/workspace/writeScreenshot.js +56 -0
  302. package/dist/workspace/writeScreenshot.js.map +1 -0
  303. package/package.json +53 -0
@@ -0,0 +1,92 @@
1
+ import { spawn } from "node:child_process";
2
+ /** Runs a command without shell and captures stdout/stderr. */
3
+ export function runCommand(argv, options) {
4
+ return new Promise((resolve) => {
5
+ const [command, ...args] = argv;
6
+ const timeoutMs = options.timeoutMs ?? 120_000;
7
+ const child = spawn(command, args, {
8
+ cwd: options.cwd,
9
+ env: { ...process.env, ...options.env },
10
+ stdio: ["ignore", "pipe", "pipe"],
11
+ });
12
+ let stdout = "";
13
+ let stderr = "";
14
+ let settled = false;
15
+ const finish = (result) => {
16
+ if (settled) {
17
+ return;
18
+ }
19
+ settled = true;
20
+ resolve(result);
21
+ };
22
+ const timer = setTimeout(() => {
23
+ child.kill("SIGTERM");
24
+ finish({
25
+ ok: false,
26
+ stdout,
27
+ stderr: `${stderr}\nCommand timed out after ${timeoutMs}ms`.trim(),
28
+ exitCode: null,
29
+ });
30
+ }, timeoutMs);
31
+ const onAbort = () => {
32
+ child.kill("SIGTERM");
33
+ finish({
34
+ ok: false,
35
+ stdout,
36
+ stderr: `${stderr}\nCommand aborted`.trim(),
37
+ exitCode: null,
38
+ });
39
+ };
40
+ if (options.signal) {
41
+ if (options.signal.aborted) {
42
+ onAbort();
43
+ return;
44
+ }
45
+ options.signal.addEventListener("abort", onAbort, { once: true });
46
+ }
47
+ child.stdout?.on("data", (chunk) => {
48
+ stdout += chunk.toString();
49
+ });
50
+ child.stderr?.on("data", (chunk) => {
51
+ stderr += chunk.toString();
52
+ });
53
+ child.on("error", (error) => {
54
+ clearTimeout(timer);
55
+ finish({
56
+ ok: false,
57
+ stdout,
58
+ stderr: `${stderr}\n${error.message}`.trim(),
59
+ exitCode: null,
60
+ });
61
+ });
62
+ child.on("close", (code) => {
63
+ clearTimeout(timer);
64
+ finish({
65
+ ok: code === 0,
66
+ stdout,
67
+ stderr,
68
+ exitCode: code,
69
+ });
70
+ });
71
+ });
72
+ }
73
+ /** Runs npm install in repo when node_modules is missing. */
74
+ export async function ensureDepsForBuild(repoPath) {
75
+ const { fileExists } = await import("./fileExists.js");
76
+ const packageJson = `${repoPath}/package.json`;
77
+ const nodeModules = `${repoPath}/node_modules`;
78
+ if (!(await fileExists(packageJson))) {
79
+ return;
80
+ }
81
+ if (await fileExists(nodeModules)) {
82
+ return;
83
+ }
84
+ const result = await runCommand(["npm", "install", "--ignore-scripts"], {
85
+ cwd: repoPath,
86
+ timeoutMs: 180_000,
87
+ });
88
+ if (!result.ok) {
89
+ throw new Error(`Failed to install dependencies: ${result.stderr || result.stdout}`);
90
+ }
91
+ }
92
+ //# sourceMappingURL=runCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runCommand.js","sourceRoot":"","sources":["../../src/tools/runCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare class ValidationCommandError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ /** Validates a command against the allowlist and rejects unsafe patterns. */
5
+ export declare function safeValidateCommand(command: string): string;
6
+ /** Parses an allowlisted command into argv for spawn without shell. */
7
+ export declare function parseValidationCommand(command: string): string[];
8
+ export declare function isBuildValidationCommand(command: string): boolean;
9
+ //# sourceMappingURL=safeValidateCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeValidateCommand.d.ts","sourceRoot":"","sources":["../../src/tools/safeValidateCommand.ts"],"names":[],"mappings":"AA0BA,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsB3D;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAShE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEjE"}
@@ -0,0 +1,59 @@
1
+ const ALLOWED_COMMANDS = new Set([
2
+ "npm run build",
3
+ "npm test",
4
+ "npm run test",
5
+ "pnpm build",
6
+ "pnpm test",
7
+ "pnpm run build",
8
+ "pnpm run test",
9
+ "yarn build",
10
+ "yarn test",
11
+ "yarn run build",
12
+ "yarn run test",
13
+ ]);
14
+ const UNSAFE_PATTERNS = [
15
+ /&&/,
16
+ /;/,
17
+ /\|/,
18
+ /`/,
19
+ /\$\(/,
20
+ /\brm\s+-rf\b/i,
21
+ /\bnpm\s+install\b/i,
22
+ /\bcurl\b/i,
23
+ /\|\s*sh\b/i,
24
+ ];
25
+ export class ValidationCommandError extends Error {
26
+ constructor(message) {
27
+ super(message);
28
+ this.name = "ValidationCommandError";
29
+ }
30
+ }
31
+ /** Validates a command against the allowlist and rejects unsafe patterns. */
32
+ export function safeValidateCommand(command) {
33
+ const trimmed = command.trim();
34
+ if (!trimmed) {
35
+ throw new ValidationCommandError("Validation command cannot be empty");
36
+ }
37
+ for (const pattern of UNSAFE_PATTERNS) {
38
+ if (pattern.test(trimmed)) {
39
+ throw new ValidationCommandError(`Validation command rejected as unsafe: ${trimmed}`);
40
+ }
41
+ }
42
+ if (!ALLOWED_COMMANDS.has(trimmed)) {
43
+ throw new ValidationCommandError(`Validation command not in allowlist: ${trimmed}`);
44
+ }
45
+ return trimmed;
46
+ }
47
+ /** Parses an allowlisted command into argv for spawn without shell. */
48
+ export function parseValidationCommand(command) {
49
+ const safe = safeValidateCommand(command);
50
+ const parts = safe.split(/\s+/);
51
+ if (parts[0] === "npm" || parts[0] === "pnpm" || parts[0] === "yarn") {
52
+ return parts;
53
+ }
54
+ throw new ValidationCommandError(`Unsupported command prefix: ${parts[0]}`);
55
+ }
56
+ export function isBuildValidationCommand(command) {
57
+ return /(?:npm|pnpm|yarn)\s+(?:run\s+)?build/.test(command.trim());
58
+ }
59
+ //# sourceMappingURL=safeValidateCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeValidateCommand.js","sourceRoot":"","sources":["../../src/tools/safeValidateCommand.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,eAAe;IACf,UAAU;IACV,cAAc;IACd,YAAY;IACZ,WAAW;IACX,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,WAAW;IACX,gBAAgB;IAChB,eAAe;CAChB,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG;IACtB,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,GAAG;IACH,MAAM;IACN,eAAe;IACf,oBAAoB;IACpB,WAAW;IACX,YAAY;CACb,CAAC;AAEF,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,sBAAsB,CAAC,oCAAoC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,sBAAsB,CAC9B,0CAA0C,OAAO,EAAE,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,sBAAsB,CAC9B,wCAAwC,OAAO,EAAE,CAClD,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEhC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,sBAAsB,CAAC,+BAA+B,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,OAAO,sCAAsC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface ApiConcurrencyResult<T> {
2
+ value: T;
3
+ queueWaitMs: number;
4
+ }
5
+ /** Limits concurrent custom-model API calls (default max 3). */
6
+ export declare function withApiConcurrencyLimit<T>(fn: (queueWaitMs: number) => Promise<T>): Promise<ApiConcurrencyResult<T>>;
7
+ /** Returns current throttle settings for diagnostics. */
8
+ export declare function getApiThrottleConfig(): {
9
+ maxConcurrent: number;
10
+ cooldownMs: number;
11
+ activeCalls: number;
12
+ queuedCalls: number;
13
+ };
14
+ //# sourceMappingURL=apiThrottle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiThrottle.d.ts","sourceRoot":"","sources":["../../src/util/apiThrottle.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,gEAAgE;AAChE,wBAAsB,uBAAuB,CAAC,CAAC,EAC7C,EAAE,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CA6BlC;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,IAAI;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAOA"}
@@ -0,0 +1,50 @@
1
+ let activeCalls = 0;
2
+ const waitQueue = [];
3
+ function getMaxConcurrent() {
4
+ const parsed = Number(process.env.CUSTOM_MODEL_MAX_CONCURRENT ?? "3");
5
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 3;
6
+ }
7
+ function getCooldownMs() {
8
+ const parsed = Number(process.env.CUSTOM_MODEL_API_COOLDOWN_MS ?? "0");
9
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
10
+ }
11
+ function sleep(ms) {
12
+ return new Promise((resolve) => setTimeout(resolve, ms));
13
+ }
14
+ /** Limits concurrent custom-model API calls (default max 3). */
15
+ export async function withApiConcurrencyLimit(fn) {
16
+ const maxConcurrent = getMaxConcurrent();
17
+ const queueStartedAt = Date.now();
18
+ while (activeCalls >= maxConcurrent) {
19
+ await new Promise((resolve) => waitQueue.push(resolve));
20
+ }
21
+ const queueWaitMs = Date.now() - queueStartedAt;
22
+ if (queueWaitMs > 1000) {
23
+ console.warn(`[auvira-agent] Waiting for model API slot (${queueWaitMs}ms, active=${activeCalls}/${maxConcurrent}).`);
24
+ }
25
+ activeCalls += 1;
26
+ try {
27
+ const value = await fn(queueWaitMs);
28
+ return { value, queueWaitMs };
29
+ }
30
+ finally {
31
+ activeCalls -= 1;
32
+ const next = waitQueue.shift();
33
+ if (next)
34
+ next();
35
+ const cooldownMs = getCooldownMs();
36
+ if (cooldownMs > 0) {
37
+ await sleep(cooldownMs);
38
+ }
39
+ }
40
+ }
41
+ /** Returns current throttle settings for diagnostics. */
42
+ export function getApiThrottleConfig() {
43
+ return {
44
+ maxConcurrent: getMaxConcurrent(),
45
+ cooldownMs: getCooldownMs(),
46
+ activeCalls,
47
+ queuedCalls: waitQueue.length,
48
+ };
49
+ }
50
+ //# sourceMappingURL=apiThrottle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiThrottle.js","sourceRoot":"","sources":["../../src/util/apiThrottle.ts"],"names":[],"mappings":"AAAA,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAsB,EAAE,CAAC;AAExC,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,GAAG,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAOD,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAuC;IAEvC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAElC,OAAO,WAAW,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IAChD,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CACV,8CAA8C,WAAW,cAAc,WAAW,IAAI,aAAa,IAAI,CACxG,CAAC;IACJ,CAAC;IAED,WAAW,IAAI,CAAC,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,WAAW,IAAI,CAAC,CAAC;QACjB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;QAEjB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,oBAAoB;IAMlC,OAAO;QACL,aAAa,EAAE,gBAAgB,EAAE;QACjC,UAAU,EAAE,aAAa,EAAE;QAC3B,WAAW;QACX,WAAW,EAAE,SAAS,CAAC,MAAM;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Converts a simple glob pattern to a regex (supports `*` segments). */
2
+ export declare function globToRegex(pattern: string): RegExp;
3
+ /** True when `relPath` matches at least one glob pattern. */
4
+ export declare function matchesAnyGlob(relPath: string, patterns: string[]): boolean;
5
+ /** Applies optional include/exclude glob filters to a repo-relative path. */
6
+ export declare function matchesPathGlobFilters(relPath: string, includeGlobs?: string[], excludeGlobs?: string[]): boolean;
7
+ //# sourceMappingURL=globMatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globMatch.d.ts","sourceRoot":"","sources":["../../src/util/globMatch.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAG3E;AAED,6EAA6E;AAC7E,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,OAAO,CAQT"}
@@ -0,0 +1,25 @@
1
+ /** Converts a simple glob pattern to a regex (supports `*` segments). */
2
+ export function globToRegex(pattern) {
3
+ const normalized = pattern.replace(/\\/g, "/");
4
+ const escaped = normalized
5
+ .split("*")
6
+ .map((part) => part.replace(/[.+?^${}()|[\]\\]/g, "\\$&"))
7
+ .join(".*");
8
+ return new RegExp(`^${escaped}$`);
9
+ }
10
+ /** True when `relPath` matches at least one glob pattern. */
11
+ export function matchesAnyGlob(relPath, patterns) {
12
+ const normalized = relPath.replace(/\\/g, "/");
13
+ return patterns.some((pattern) => globToRegex(pattern.trim()).test(normalized));
14
+ }
15
+ /** Applies optional include/exclude glob filters to a repo-relative path. */
16
+ export function matchesPathGlobFilters(relPath, includeGlobs, excludeGlobs) {
17
+ if (excludeGlobs?.length && matchesAnyGlob(relPath, excludeGlobs)) {
18
+ return false;
19
+ }
20
+ if (includeGlobs?.length) {
21
+ return matchesAnyGlob(relPath, includeGlobs);
22
+ }
23
+ return true;
24
+ }
25
+ //# sourceMappingURL=globMatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globMatch.js","sourceRoot":"","sources":["../../src/util/globMatch.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,UAAU;SACvB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,QAAkB;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,YAAuB,EACvB,YAAuB;IAEvB,IAAI,YAAY,EAAE,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,YAAY,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,47 @@
1
+ export interface RateLimitInfo {
2
+ /** True when the provider rejected the call due to rate limiting. */
3
+ isRateLimited: boolean;
4
+ httpStatus?: number;
5
+ /** MiniMax base_resp.status_code when present (e.g. 1002). */
6
+ providerStatusCode?: number;
7
+ retryAfterMs?: number;
8
+ message: string;
9
+ /** Raw rate-limit related response headers when available. */
10
+ headers: Record<string, string>;
11
+ }
12
+ export interface ModelApiCallResult<T> {
13
+ ok: boolean;
14
+ data?: T;
15
+ rateLimit?: RateLimitInfo;
16
+ httpStatus?: number;
17
+ queueWaitMs: number;
18
+ requestMs: number;
19
+ totalMs: number;
20
+ retries: number;
21
+ errorMessage?: string;
22
+ }
23
+ interface FetchJsonOptions {
24
+ url: string;
25
+ headers: Record<string, string>;
26
+ body: unknown;
27
+ timeoutMs: number;
28
+ maxRetries?: number;
29
+ signal?: AbortSignal;
30
+ }
31
+ /** Parses Retry-After header as seconds or HTTP date. */
32
+ export declare function parseRetryAfterMs(value: string | null): number | undefined;
33
+ /** Detects MiniMax/OpenAI-compatible rate limit responses. */
34
+ export declare function detectRateLimit(httpStatus: number, payload: unknown, headers: Headers): RateLimitInfo | undefined;
35
+ /** POST JSON with queue timing, retries, and rate-limit reporting. */
36
+ export declare function postJsonWithRetry<T>(options: FetchJsonOptions, queueWaitMs: number): Promise<ModelApiCallResult<T>>;
37
+ /** Formats rate-limit details for AgentRunResult.error.message. */
38
+ export declare function formatRateLimitReport(rateLimit: RateLimitInfo): string;
39
+ /** Formats timing details for slow-request diagnostics. */
40
+ export declare function formatTimingReport(input: {
41
+ queueWaitMs: number;
42
+ requestMs: number;
43
+ totalMs: number;
44
+ retries: number;
45
+ }): string;
46
+ export {};
47
+ //# sourceMappingURL=modelApiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelApiClient.d.ts","sourceRoot":"","sources":["../../src/util/modelApiClient.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAsCD,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAgB1E;AA+CD,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACf,aAAa,GAAG,SAAS,CA+B3B;AAwBD,sEAAsE;AACtE,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,gBAAgB,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAqHhC;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CAqBtE;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAET"}
@@ -0,0 +1,245 @@
1
+ function buildFetchSignal(timeoutMs, signal) {
2
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
3
+ if (!signal) {
4
+ return timeoutSignal;
5
+ }
6
+ if (typeof AbortSignal.any === "function") {
7
+ return AbortSignal.any([signal, timeoutSignal]);
8
+ }
9
+ const controller = new AbortController();
10
+ const abort = () => controller.abort();
11
+ if (signal.aborted || timeoutSignal.aborted) {
12
+ abort();
13
+ return controller.signal;
14
+ }
15
+ signal.addEventListener("abort", abort, { once: true });
16
+ timeoutSignal.addEventListener("abort", abort, { once: true });
17
+ return controller.signal;
18
+ }
19
+ function sleep(ms) {
20
+ return new Promise((resolve) => setTimeout(resolve, ms));
21
+ }
22
+ function getMaxRetries() {
23
+ const parsed = Number(process.env.CUSTOM_MODEL_MAX_RETRIES ?? "3");
24
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : 3;
25
+ }
26
+ function getRetryBaseMs() {
27
+ const parsed = Number(process.env.CUSTOM_MODEL_RETRY_BASE_MS ?? "2000");
28
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 2000;
29
+ }
30
+ /** Parses Retry-After header as seconds or HTTP date. */
31
+ export function parseRetryAfterMs(value) {
32
+ if (!value?.trim()) {
33
+ return undefined;
34
+ }
35
+ const seconds = Number(value);
36
+ if (Number.isFinite(seconds) && seconds >= 0) {
37
+ return Math.ceil(seconds * 1000);
38
+ }
39
+ const dateMs = Date.parse(value);
40
+ if (!Number.isNaN(dateMs)) {
41
+ return Math.max(0, dateMs - Date.now());
42
+ }
43
+ return undefined;
44
+ }
45
+ function collectRateLimitHeaders(headers) {
46
+ const collected = {};
47
+ for (const [key, value] of headers.entries()) {
48
+ const lower = key.toLowerCase();
49
+ if (lower.includes("rate") ||
50
+ lower.includes("limit") ||
51
+ lower.startsWith("retry-after") ||
52
+ lower.startsWith("x-ratelimit")) {
53
+ collected[key] = value;
54
+ }
55
+ }
56
+ return collected;
57
+ }
58
+ function readMiniMaxStatusCode(payload) {
59
+ if (!payload || typeof payload !== "object") {
60
+ return undefined;
61
+ }
62
+ const baseResp = payload
63
+ .base_resp;
64
+ return typeof baseResp?.status_code === "number"
65
+ ? baseResp.status_code
66
+ : undefined;
67
+ }
68
+ function readErrorMessage(payload, fallback) {
69
+ if (!payload || typeof payload !== "object") {
70
+ return fallback;
71
+ }
72
+ const record = payload;
73
+ return (record.error?.message ??
74
+ record.base_resp?.status_msg ??
75
+ fallback);
76
+ }
77
+ /** Detects MiniMax/OpenAI-compatible rate limit responses. */
78
+ export function detectRateLimit(httpStatus, payload, headers) {
79
+ const providerStatusCode = readMiniMaxStatusCode(payload);
80
+ const message = readErrorMessage(payload, `HTTP ${httpStatus}`);
81
+ const lowerMessage = message.toLowerCase();
82
+ const rateLimitHeaders = collectRateLimitHeaders(headers);
83
+ const isRateLimited = httpStatus === 429 ||
84
+ providerStatusCode === 1002 ||
85
+ providerStatusCode === 2045 ||
86
+ providerStatusCode === 2056 ||
87
+ lowerMessage.includes("rate limit") ||
88
+ lowerMessage.includes("usage limit") ||
89
+ lowerMessage.includes("too many requests");
90
+ if (!isRateLimited) {
91
+ return undefined;
92
+ }
93
+ const retryAfterMs = parseRetryAfterMs(headers.get("retry-after")) ??
94
+ parseRetryAfterMs(headers.get("retry-after-ms"));
95
+ return {
96
+ isRateLimited: true,
97
+ httpStatus,
98
+ providerStatusCode,
99
+ retryAfterMs,
100
+ message,
101
+ headers: rateLimitHeaders,
102
+ };
103
+ }
104
+ function computeRetryDelayMs(attempt, rateLimit) {
105
+ if (rateLimit?.retryAfterMs !== undefined) {
106
+ return rateLimit.retryAfterMs;
107
+ }
108
+ const base = getRetryBaseMs();
109
+ const exponential = base * 2 ** attempt;
110
+ const jitter = Math.floor(Math.random() * 500);
111
+ return Math.min(exponential + jitter, 60_000);
112
+ }
113
+ function isRetryableStatus(httpStatus, rateLimit) {
114
+ if (rateLimit?.isRateLimited) {
115
+ return true;
116
+ }
117
+ return httpStatus === 408 || httpStatus === 429 || httpStatus >= 500;
118
+ }
119
+ /** POST JSON with queue timing, retries, and rate-limit reporting. */
120
+ export async function postJsonWithRetry(options, queueWaitMs) {
121
+ const startedAt = Date.now();
122
+ const maxRetries = options.maxRetries ?? getMaxRetries();
123
+ let retries = 0;
124
+ let lastRateLimit;
125
+ let lastHttpStatus;
126
+ let lastErrorMessage;
127
+ let requestMs = 0;
128
+ for (let attempt = 0; attempt <= maxRetries; attempt += 1) {
129
+ if (options.signal?.aborted) {
130
+ return {
131
+ ok: false,
132
+ queueWaitMs,
133
+ requestMs,
134
+ totalMs: Date.now() - startedAt + queueWaitMs,
135
+ retries,
136
+ errorMessage: "Model API request aborted",
137
+ };
138
+ }
139
+ const requestStartedAt = Date.now();
140
+ try {
141
+ const response = await fetch(options.url, {
142
+ method: "POST",
143
+ headers: options.headers,
144
+ body: JSON.stringify(options.body),
145
+ signal: buildFetchSignal(options.timeoutMs, options.signal),
146
+ });
147
+ requestMs = Date.now() - requestStartedAt;
148
+ lastHttpStatus = response.status;
149
+ let payload;
150
+ try {
151
+ payload = (await response.json());
152
+ }
153
+ catch {
154
+ lastErrorMessage = `Model API returned non-JSON response (${response.status})`;
155
+ if (!isRetryableStatus(response.status) || attempt === maxRetries) {
156
+ break;
157
+ }
158
+ retries += 1;
159
+ await sleep(computeRetryDelayMs(attempt));
160
+ continue;
161
+ }
162
+ const rateLimit = detectRateLimit(response.status, payload, response.headers);
163
+ if (rateLimit) {
164
+ lastRateLimit = rateLimit;
165
+ lastErrorMessage = rateLimit.message;
166
+ if (attempt < maxRetries) {
167
+ retries += 1;
168
+ const delayMs = computeRetryDelayMs(attempt, rateLimit);
169
+ console.warn(`[auvira-agent] MiniMax rate limit (HTTP ${response.status}, code ${rateLimit.providerStatusCode ?? "n/a"}). Retrying in ${delayMs}ms (attempt ${attempt + 1}/${maxRetries + 1}).`);
170
+ await sleep(delayMs);
171
+ continue;
172
+ }
173
+ }
174
+ if (!response.ok) {
175
+ lastErrorMessage = readErrorMessage(payload, `Model API failed (${response.status})`);
176
+ if (isRetryableStatus(response.status, rateLimit) && attempt < maxRetries) {
177
+ retries += 1;
178
+ await sleep(computeRetryDelayMs(attempt, rateLimit));
179
+ continue;
180
+ }
181
+ }
182
+ return {
183
+ ok: response.ok,
184
+ data: payload,
185
+ rateLimit,
186
+ httpStatus: response.status,
187
+ queueWaitMs,
188
+ requestMs,
189
+ totalMs: Date.now() - startedAt + queueWaitMs,
190
+ retries,
191
+ errorMessage: response.ok ? undefined : lastErrorMessage,
192
+ };
193
+ }
194
+ catch (error) {
195
+ requestMs = Date.now() - requestStartedAt;
196
+ const isTimeout = error instanceof Error &&
197
+ (error.name === "TimeoutError" || error.name === "AbortError");
198
+ lastErrorMessage = isTimeout
199
+ ? `Model API request timed out after ${options.timeoutMs}ms`
200
+ : error instanceof Error
201
+ ? error.message
202
+ : "Model API request failed";
203
+ if (attempt < maxRetries) {
204
+ retries += 1;
205
+ await sleep(computeRetryDelayMs(attempt, lastRateLimit));
206
+ continue;
207
+ }
208
+ }
209
+ }
210
+ return {
211
+ ok: false,
212
+ rateLimit: lastRateLimit,
213
+ httpStatus: lastHttpStatus,
214
+ queueWaitMs,
215
+ requestMs,
216
+ totalMs: Date.now() - startedAt + queueWaitMs,
217
+ retries,
218
+ errorMessage: lastErrorMessage ?? "Model API request failed",
219
+ };
220
+ }
221
+ /** Formats rate-limit details for AgentRunResult.error.message. */
222
+ export function formatRateLimitReport(rateLimit) {
223
+ const parts = [
224
+ rateLimit.message,
225
+ rateLimit.httpStatus ? `HTTP ${rateLimit.httpStatus}` : undefined,
226
+ rateLimit.providerStatusCode
227
+ ? `MiniMax code ${rateLimit.providerStatusCode}`
228
+ : undefined,
229
+ rateLimit.retryAfterMs
230
+ ? `retry after ${Math.ceil(rateLimit.retryAfterMs / 1000)}s`
231
+ : undefined,
232
+ ].filter(Boolean);
233
+ const headerSummary = Object.entries(rateLimit.headers)
234
+ .map(([key, value]) => `${key}=${value}`)
235
+ .join(", ");
236
+ if (headerSummary) {
237
+ parts.push(`headers: ${headerSummary}`);
238
+ }
239
+ return parts.join(" | ");
240
+ }
241
+ /** Formats timing details for slow-request diagnostics. */
242
+ export function formatTimingReport(input) {
243
+ return `queue=${input.queueWaitMs}ms request=${input.requestMs}ms total=${input.totalMs}ms retries=${input.retries}`;
244
+ }
245
+ //# sourceMappingURL=modelApiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelApiClient.js","sourceRoot":"","sources":["../../src/util/modelApiClient.ts"],"names":[],"mappings":"AAiCA,SAAS,gBAAgB,CACvB,SAAiB,EACjB,MAAoB;IAEpB,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAC1C,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;QAC5C,KAAK,EAAE,CAAC;QACR,OAAO,UAAU,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,GAAG,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,MAAM,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAgB;IAC/C,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IACE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvB,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;YAC/B,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,EAC/B,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAI,OAAoD;SACnE,SAAS,CAAC;IACb,OAAO,OAAO,QAAQ,EAAE,WAAW,KAAK,QAAQ;QAC9C,CAAC,CAAC,QAAQ,CAAC,WAAW;QACtB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB,EAAE,QAAgB;IAC1D,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,OAGd,CAAC;IAEF,OAAO,CACL,MAAM,CAAC,KAAK,EAAE,OAAO;QACrB,MAAM,CAAC,SAAS,EAAE,UAAU;QAC5B,QAAQ,CACT,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,UAAkB,EAClB,OAAgB,EAChB,OAAgB;IAEhB,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,UAAU,EAAE,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE1D,MAAM,aAAa,GACjB,UAAU,KAAK,GAAG;QAClB,kBAAkB,KAAK,IAAI;QAC3B,kBAAkB,KAAK,IAAI;QAC3B,kBAAkB,KAAK,IAAI;QAC3B,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;QACnC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;QACpC,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAE7C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAChB,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7C,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEnD,OAAO;QACL,aAAa,EAAE,IAAI;QACnB,UAAU;QACV,kBAAkB;QAClB,YAAY;QACZ,OAAO;QACP,OAAO,EAAE,gBAAgB;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAe,EACf,SAAyB;IAEzB,IAAI,SAAS,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC,YAAY,CAAC;IAChC,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAkB,EAAE,SAAyB;IACtE,IAAI,SAAS,EAAE,aAAa,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,IAAI,GAAG,CAAC;AACvE,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAyB,EACzB,WAAmB;IAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,aAAa,EAAE,CAAC;IACzD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,aAAwC,CAAC;IAC7C,IAAI,cAAkC,CAAC;IACvC,IAAI,gBAAoC,CAAC;IACzC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC5B,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,WAAW;gBACX,SAAS;gBACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,WAAW;gBAC7C,OAAO;gBACP,YAAY,EAAE,2BAA2B;aAC1C,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;gBAClC,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;aAC5D,CAAC,CAAC;YAEH,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;YAC1C,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;YAEjC,IAAI,OAAU,CAAC;YACf,IAAI,CAAC;gBACH,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB,GAAG,yCAAyC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAC/E,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;oBAClE,MAAM;gBACR,CAAC;gBACD,OAAO,IAAI,CAAC,CAAC;gBACb,MAAM,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9E,IAAI,SAAS,EAAE,CAAC;gBACd,aAAa,GAAG,SAAS,CAAC;gBAC1B,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC;gBAErC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,CAAC;oBACb,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBACxD,OAAO,CAAC,IAAI,CACV,2CAA2C,QAAQ,CAAC,MAAM,UAAU,SAAS,CAAC,kBAAkB,IAAI,KAAK,kBAAkB,OAAO,eAAe,OAAO,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,CACnL,CAAC;oBACF,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;oBACrB,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,gBAAgB,GAAG,gBAAgB,CACjC,OAAO,EACP,qBAAqB,QAAQ,CAAC,MAAM,GAAG,CACxC,CAAC;gBAEF,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBAC1E,OAAO,IAAI,CAAC,CAAC;oBACb,MAAM,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;oBACrD,SAAS;gBACX,CAAC;YACH,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,OAAO;gBACb,SAAS;gBACT,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,WAAW;gBACX,SAAS;gBACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,WAAW;gBAC7C,OAAO;gBACP,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB;aACzD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;YAC1C,MAAM,SAAS,GACb,KAAK,YAAY,KAAK;gBACtB,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAEjE,gBAAgB,GAAG,SAAS;gBAC1B,CAAC,CAAC,qCAAqC,OAAO,CAAC,SAAS,IAAI;gBAC5D,CAAC,CAAC,KAAK,YAAY,KAAK;oBACtB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,0BAA0B,CAAC;YAEjC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC,CAAC;gBACb,MAAM,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;gBACzD,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,aAAa;QACxB,UAAU,EAAE,cAAc;QAC1B,WAAW;QACX,SAAS;QACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,WAAW;QAC7C,OAAO;QACP,YAAY,EAAE,gBAAgB,IAAI,0BAA0B;KAC7D,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,qBAAqB,CAAC,SAAwB;IAC5D,MAAM,KAAK,GAAG;QACZ,SAAS,CAAC,OAAO;QACjB,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;QACjE,SAAS,CAAC,kBAAkB;YAC1B,CAAC,CAAC,gBAAgB,SAAS,CAAC,kBAAkB,EAAE;YAChD,CAAC,CAAC,SAAS;QACb,SAAS,CAAC,YAAY;YACpB,CAAC,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG;YAC5D,CAAC,CAAC,SAAS;KACd,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;SACxC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,kBAAkB,CAAC,KAKlC;IACC,OAAO,SAAS,KAAK,CAAC,WAAW,cAAc,KAAK,CAAC,SAAS,YAAY,KAAK,CAAC,OAAO,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC;AACvH,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Strips a data-URL prefix from raw base64 screenshot input. */
2
+ export declare function normalizeScreenshotBase64(value: string): string;
3
+ //# sourceMappingURL=screenshotBase64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotBase64.d.ts","sourceRoot":"","sources":["../../src/util/screenshotBase64.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/D"}
@@ -0,0 +1,7 @@
1
+ /** Strips a data-URL prefix from raw base64 screenshot input. */
2
+ export function normalizeScreenshotBase64(value) {
3
+ const trimmed = value.trim();
4
+ const dataUrlMatch = /^data:image\/[a-z0-9.+-]+;base64,(.+)$/i.exec(trimmed);
5
+ return dataUrlMatch ? dataUrlMatch[1] : trimmed;
6
+ }
7
+ //# sourceMappingURL=screenshotBase64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotBase64.js","sourceRoot":"","sources":["../../src/util/screenshotBase64.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,yCAAyC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7E,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACnD,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Removes a workspace directory. */
2
+ export declare function cleanupWorkspace(workspacePath: string): Promise<void>;
3
+ //# sourceMappingURL=cleanupWorkspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanupWorkspace.d.ts","sourceRoot":"","sources":["../../src/workspace/cleanupWorkspace.ts"],"names":[],"mappings":"AAEA,qCAAqC;AACrC,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E"}
@@ -0,0 +1,6 @@
1
+ import { rm } from "node:fs/promises";
2
+ /** Removes a workspace directory. */
3
+ export async function cleanupWorkspace(workspacePath) {
4
+ await rm(workspacePath, { recursive: true, force: true });
5
+ }
6
+ //# sourceMappingURL=cleanupWorkspace.js.map