@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 David Than
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,414 @@
1
+ # @auvira.ai/sdk
2
+
3
+ Cursor-SDK-compatible TypeScript agent SDK with custom model support, local repo workspaces, GitLab cloning, visual context (screenshots + selected DOM), and safe post-edit validation.
4
+
5
+ ## Install
6
+
7
+ ### Option A — npm (recommended if you have npm Pro for private)
8
+
9
+ **Private** (requires [npm Pro](https://www.npmjs.com/products), ~$7/mo):
10
+
11
+ ```bash
12
+ npm publish --access restricted # from this repo, after npm login
13
+ npm install @auvira.ai/sdk # in consuming projects (same npm account or granted access)
14
+ ```
15
+
16
+ **Public** (free on npm):
17
+
18
+ ```bash
19
+ npm publish --access public
20
+ npm install @auvira.ai/sdk
21
+ ```
22
+
23
+ ### Option B — private GitHub repo (free, no npm publish)
24
+
25
+ ```bash
26
+ npm install github:athan37/auvira-sdk
27
+ ```
28
+
29
+ Requires GitHub auth (`gh auth login` or a PAT). Builds from source on install.
30
+
31
+ For local development:
32
+
33
+ ```bash
34
+ npm install
35
+ npm run build
36
+ ```
37
+
38
+ ## Quick start (local repo)
39
+
40
+ ```ts
41
+ import { Agent } from "@auvira.ai/sdk";
42
+
43
+ const agent = await Agent.create({
44
+ apiKey: process.env.AUVIRA_AGENT_API_KEY,
45
+ model: {
46
+ id: "openrouter/minimax/minimax-m3",
47
+ provider: "openhands",
48
+ baseURL: process.env.CUSTOM_MODEL_BASE_URL,
49
+ apiKey: process.env.CUSTOM_MODEL_API_KEY,
50
+ },
51
+ local: {
52
+ cwd: "/path/to/repo",
53
+ },
54
+ });
55
+
56
+ const result = await agent.send(
57
+ "Change the hero headline to Fast Emergency AC Repair in Houston",
58
+ {
59
+ selectedDom: {
60
+ tagName: "h1",
61
+ text: "Reliable HVAC Service When You Need It",
62
+ componentHint: "Hero",
63
+ route: "/",
64
+ },
65
+ validation: {
66
+ command: "npm run build",
67
+ },
68
+ },
69
+ );
70
+
71
+ const runResult = await result.wait();
72
+ console.log(runResult.status, runResult.summary, runResult.changedFiles);
73
+ ```
74
+
75
+ ## Streaming (Cursor SDK parity)
76
+
77
+ ```ts
78
+ const agent = await Agent.create({ /* ... */ });
79
+
80
+ const run = await agent.send("Update hero colors to match the reference image", {
81
+ validation: { skip: true },
82
+ });
83
+
84
+ for await (const event of run.stream()) {
85
+ if (event.type === "assistant") {
86
+ for (const block of event.message.content) {
87
+ if (block.type === "text") process.stdout.write(block.text);
88
+ }
89
+ }
90
+ if (event.type === "tool.start") {
91
+ console.log("tool:", event.name);
92
+ }
93
+ }
94
+
95
+ const result = await run.wait();
96
+ console.log(result.status, result.id, result.changedFiles);
97
+
98
+ // Follow-up keeps conversation context on the same agent instance.
99
+ const run2 = await agent.send("Make the accent color warmer");
100
+ await run2.wait();
101
+
102
+ await agent.close();
103
+ ```
104
+
105
+ `run.text()` blocks on `wait()` and returns the final assistant string. `run.iterText()` yields assistant text from stream events.
106
+
107
+ ## One-shot API
108
+
109
+ ```ts
110
+ import { Agent } from "@auvira.ai/sdk";
111
+
112
+ const result = await Agent.prompt(
113
+ "Change the hero headline to Fast Emergency AC Repair in Houston",
114
+ {
115
+ apiKey: process.env.AUVIRA_AGENT_API_KEY,
116
+ model: {
117
+ id: "openrouter/minimax/minimax-m3",
118
+ provider: "openhands",
119
+ baseURL: process.env.CUSTOM_MODEL_BASE_URL,
120
+ apiKey: process.env.CUSTOM_MODEL_API_KEY,
121
+ },
122
+ local: { cwd: "/path/to/repo" },
123
+ validation: { command: "npm run build" },
124
+ },
125
+ );
126
+ ```
127
+
128
+ ## GitLab source
129
+
130
+ Environment variables (`.env`):
131
+
132
+ ```bash
133
+ GITLAB_TOKEN=...
134
+ GITLAB_BASE_URL=https://gitlab.com/api/v4
135
+ GITLAB_GROUP_ID=135136695
136
+ ```
137
+
138
+ By project URL:
139
+
140
+ ```ts
141
+ const agent = await Agent.create({
142
+ model: { id: "mock-model", provider: "openhands" },
143
+ gitlab: {
144
+ projectUrl: "https://gitlab.com/auvira-group/generated-site-o4rz7l-rehs.git",
145
+ token: process.env.GITLAB_TOKEN,
146
+ branch: "main",
147
+ },
148
+ });
149
+ ```
150
+
151
+ By GitLab numeric project ID (resolved via `GITLAB_BASE_URL` API; token from env):
152
+
153
+ ```ts
154
+ const agent = await Agent.create({
155
+ model: { id: "mock-model", provider: "openhands" },
156
+ gitlab: {
157
+ projectId: 83611012,
158
+ },
159
+ });
160
+ ```
161
+
162
+ Auvira MongoDB project ID `6a382fe1e5fa82e481384836` maps to GitLab project `83611012` (`auvira-group/generated-site-o4rz7l-rehs`). Pass the GitLab numeric ID to `gitlab.projectId`.
163
+
164
+ Skip validation when a repo has known pre-existing build issues:
165
+
166
+ ```ts
167
+ await agent.send("Change the hero headline to ...", {
168
+ validation: { skip: true },
169
+ });
170
+ ```
171
+
172
+ GitLab mode clones over HTTPS, creates an `auvira/edit-*` branch, and returns a diff only (no push by default).
173
+
174
+ ## Custom model support
175
+
176
+ Pass model settings inline or via `.env`:
177
+
178
+ ```bash
179
+ CUSTOM_MODEL_BASE_URL=https://api.minimax.io/v1
180
+ CUSTOM_MODEL_API_KEY=...
181
+ CUSTOM_MODEL_ID=MiniMax-M3
182
+ ```
183
+
184
+ ```ts
185
+ model: {
186
+ id: "MiniMax-M3",
187
+ provider: "openhands",
188
+ // baseURL and apiKey optional when CUSTOM_MODEL_* env vars are set
189
+ }
190
+ ```
191
+
192
+ | Provider route | `CUSTOM_MODEL_BASE_URL` | Model `id` |
193
+ |----------------|-------------------------|------------|
194
+ | MiniMax direct (global) | `https://api.minimax.io/v1` | `MiniMax-M3` |
195
+ | MiniMax direct (China) | `https://api.minimaxi.com/v1` | `MiniMax-M3` |
196
+ | OpenRouter | `https://openrouter.ai/api/v1` | `minimax/minimax-m3` |
197
+
198
+ The SDK maps these to OpenHands CLI env vars internally (`LLM_MODEL`, `LLM_BASE_URL`, `LLM_API_KEY`) while also exposing `OPENHANDS_MODEL`, `CUSTOM_MODEL_BASE_URL`, and `CUSTOM_MODEL_API_KEY` to the provider process.
199
+
200
+ ## Mock mode
201
+
202
+ Deterministic edits without OpenHands CLI:
203
+
204
+ ```bash
205
+ export AUVIRA_AGENT_MOCK=1
206
+ # or
207
+ export OPENHANDS_MOCK_MODE=1
208
+ ```
209
+
210
+ Mock mode supports headline edit prompts like `Change the hero headline to ...` and edits common Hero/page files.
211
+
212
+ ## OpenHands CLI mode
213
+
214
+ When mock mode is off, the SDK runs OpenHands headless:
215
+
216
+ ```bash
217
+ export OPENHANDS_CLI_COMMAND="openhands" # optional override
218
+ ```
219
+
220
+ Requires OpenHands CLI installed and available on `PATH`.
221
+
222
+ ## HTTP usage
223
+
224
+ Optional built-in server:
225
+
226
+ ```bash
227
+ npm run build
228
+ node dist/server/server.js
229
+ ```
230
+
231
+ `POST /agent/prompt` accepts the same JSON shape as `Agent.prompt` and returns `AgentRunResult`.
232
+
233
+ `GET /health` returns `{ "ok": true }`.
234
+
235
+ Bind to localhost or protect with a reverse proxy; v1 has no built-in auth.
236
+
237
+ ## Security notes
238
+
239
+ - Validation commands are allowlisted (`npm/pnpm/yarn build|test` only).
240
+ - Shell chaining, installs, curl pipes, and destructive commands are rejected.
241
+ - GitLab URLs must be `https://gitlab.com/.../*.git` (no SSH, credentials in URL, or shell metacharacters).
242
+ - Tokens and API keys are masked in error output and never logged.
243
+ - Workspaces are copied/cloned to temp dirs; originals are not modified directly.
244
+
245
+ ## Test commands
246
+
247
+ ```bash
248
+ # Unit + real integration (MiniMax M3 + GitLab; requires .env)
249
+ npm run test
250
+
251
+ # Real integration only
252
+ npm run test:real
253
+
254
+ npm run typecheck
255
+ npm run build
256
+ ```
257
+
258
+ Real tests require in `.env`:
259
+
260
+ ```bash
261
+ GITLAB_TOKEN=...
262
+ GITLAB_BASE_URL=https://gitlab.com/api/v4
263
+ CUSTOM_MODEL_BASE_URL=https://api.minimax.io/v1
264
+ CUSTOM_MODEL_API_KEY=...
265
+ CUSTOM_MODEL_ID=MiniMax-M3
266
+ ```
267
+
268
+ Mock mode (`AUVIRA_AGENT_MOCK`) is not used in the test suite. Real tests call **MiniMax-M3** via the `custom` provider and clone from **GitLab** when configured.
269
+
270
+ ## Harness integration (cursor-agent-edit-website)
271
+
272
+ When embedding the SDK as a drop-in Cursor SDK replacement for the website edit harness:
273
+
274
+ - Pass the full compiled harness prompt unchanged via `agent.send` (system rules + `ALLOWED WRITE PATHS` + owner request).
275
+ - Pass **`selectedDom`** with `sectionIndex`, `sectionType`, `sectionTitle`, and `kind` when the host has structured pin metadata from the preview UI. DOM pin metadata wins over harness-only pin parsing and is required for reliable pinned section edits on single-page sites.
276
+ - Pass **`validation: { skip: true }`** — the harness runs its own build gate via `validateWorkspace`; the SDK default `npm run build` conflicts with harness system rules ("Do not run npm/shell builds").
277
+
278
+ ```ts
279
+ await agent.send(sendPayload, {
280
+ selectedDom: {
281
+ sectionIndex: 6,
282
+ sectionType: "services",
283
+ sectionTitle: "Our Services",
284
+ kind: "section",
285
+ componentHint: "Services · Our Services",
286
+ },
287
+ validation: { skip: true },
288
+ });
289
+ ```
290
+
291
+ ## Agent modes (v0.2+)
292
+
293
+ The `custom` provider supports two execution modes:
294
+
295
+ | Mode | When | Behavior |
296
+ |------|------|----------|
297
+ | **`agentic`** (default for harness prompts) | Harness `send` with compiled Cursor prompt | Multi-turn **grep → read → search_replace/write** tool loop (Cursor Agent parity) |
298
+ | **`json`** (default for simple prompts) | Headline edits, unit tests | One-shot JSON `{ edits: [...] }` with repair loop |
299
+
300
+ Override with env:
301
+
302
+ ```bash
303
+ AUVIRA_AGENT_MODE=agentic # force tool loop
304
+ AUVIRA_AGENT_MODE=json # force JSON edit path
305
+ ```
306
+
307
+ Tool budget (harness mode):
308
+
309
+ ```bash
310
+ AUVIRA_AGENT_MAX_TOOL_CALLS=25 # primary turn (default)
311
+ AUVIRA_AGENT_REPAIR_MAX_TOOL_CALLS=12 # apply/build repair turns (default)
312
+ AUVIRA_AGENT_HISTORY_TOOL_ROUNDS=3 # tool rounds kept in agent loop history
313
+ AUVIRA_CONTEXT_TOKEN_BUDGET=32000 # Priompt-style context cap
314
+ ```
315
+
316
+ MiniMax request tuning (custom provider):
317
+
318
+ ```bash
319
+ CUSTOM_MODEL_THINKING=adaptive|disabled # override thinking mode (default: adaptive for agentic, disabled for json)
320
+ CUSTOM_MODEL_MAX_COMPLETION_TOKENS=... # global cap override
321
+ CUSTOM_MODEL_MAX_COMPLETION_TOKENS_AGENTIC=2048
322
+ CUSTOM_MODEL_MAX_COMPLETION_TOKENS_VISION=4096
323
+ CUSTOM_MODEL_MAX_COMPLETION_TOKENS_JSON=8192
324
+ ```
325
+
326
+ All custom-provider chat requests default to `service_tier: "priority"`. Production should leave `CUSTOM_MODEL_API_COOLDOWN_MS` unset (0); tests set a 3s cooldown locally for rate-limit safety.
327
+
328
+ ### Stream events (v0.2.3+)
329
+
330
+ Live `run.stream()` / `run.messages()` events are enriched for host UIs. **Model-facing tool `output` strings are unchanged** — sanitization applies only to emitted stream payloads.
331
+
332
+ | Event | Purpose |
333
+ |-------|---------|
334
+ | `tool.start` / `tool.end` | Tool lifecycle; `tool.end.ok` reflects `ToolExecutionResult.ok` |
335
+ | `tool.end.output` | Structured metadata (grep pattern/count, read preview, edit previews, etc.) |
336
+ | `edit.diff` | Per-file unified patch after successful edit (`path`, `patch`, `truncated`, line stats) |
337
+ | `edit.applied` | Edit outcome with optional `linesAdded` / `linesRemoved` / `errorMessage` |
338
+ | `run.diff` | Run-level workspace checkpoint diff after agent run (agent-run changes only) |
339
+ | `completion.evaluated` | Post-checkpoint LLM task completion verdict (`source`: `llm`, `cached`, `skipped`, `error`; includes `isComplete`, `confidence`, `reason`, `missingWork`) |
340
+ | `run.early_finish` | Harness mode: emitted when an allowlisted checkpoint diff passes completion evaluation (`reason`: `diff_detected`, `completion_contract_met`, `completion_satisfied`, or `max_turns`) |
341
+ | `run.continue` | Harness continues when completion is incomplete (`reason`: `style_only_incomplete`, `completion_callback`, `min_turns_pending`) |
342
+ | `run.failed` | Optional `abortReason`, `toolCallCount`, `editsApplied`, `providerCode` (includes `INCOMPLETE_MULTI_STEP` when wiring never arrives) |
343
+
344
+ Stream caps (env overrides):
345
+
346
+ ```bash
347
+ AUVIRA_EVENT_DIFF_MAX_CHARS=12000 # edit.diff / run.diff patch cap (default 12000)
348
+ AUVIRA_TASK_COMPLETION_TIMEOUT_MS=15000
349
+ AUVIRA_TASK_COMPLETION_CONFIDENCE=0.75
350
+ AUVIRA_COMPLETION_MAX_CONTINUES=2
351
+ AUVIRA_TASK_COMPLETION_MODEL= # optional override; defaults to agent model — use a fast/cheap model in production
352
+ ```
353
+
354
+ **Completion evaluator performance (v0.2.9+):**
355
+
356
+ - **Per-turn evaluation:** The LLM completion evaluator runs once at the end of each model tool batch (not after every mutating tool). Evaluation still runs if a later tool in the batch fails or aborts, as long as at least one mutating tool applied.
357
+ - **Verdict cache:** Repeated identical evaluator inputs within a run reuse the last verdict (`completion.evaluated` with `source: "cached"`).
358
+ - **Smaller diffs:** Checkpoint diffs use line-based hunks (not full-file replace) and are memoized until the next mutating tool or `restore()`.
359
+ - **Vision gating:** Reference images are sent to the evaluator on the first check and on style-only diffs; subsequent wiring checks are text-only.
360
+ - **Non-harness globs:** `includeGlobs` / `excludeGlobs` on workspace checkpoints filter full-repo snapshots.
361
+
362
+ For production harness runs, set `AUVIRA_TASK_COMPLETION_MODEL` to a smaller/faster model than the main agent model to reduce evaluator latency and cost.
363
+
364
+ **Workspace checkpoints (v0.2.8+):** Before the agent edits, the SDK snapshots allowed files into an in-memory checkpoint. No `git add`, `git commit`, or index mutation occurs. `changedFiles`, `run.diff`, `completion.evaluated`, and harness early finish all use **checkpoint diff** (agent-run changes only — not pre-existing dirty git state).
365
+
366
+ **Post-checkpoint completion evaluation (v0.2.8+):** After a model turn produces an allowlisted checkpoint diff, the SDK calls a generic LLM evaluator with the owner request, selected DOM, reference images (when gated), diff patch, and recent tool results. If `isComplete` with confidence ≥ threshold → `run.early_finish` with `reason: "completion_satisfied"`. If incomplete → targeted user nudge and the loop continues. Opt out with `completion.auto: false` to use deterministic fallback only.
367
+
368
+ ```ts
369
+ await agent.send(payload, {
370
+ selectedDom,
371
+ completion: {
372
+ auto: true, // default in harness mode
373
+ confidenceThreshold: 0.8, // optional override
374
+ // Explicit deterministic contract still supported (v0.2.7):
375
+ requireWiringAfterStyle: true,
376
+ isComplete: ({ changedFiles }) => /* in-process only */,
377
+ },
378
+ });
379
+ ```
380
+
381
+ **Harness early finish (v0.2.5+):** When `harnessPrompt` is active and a model turn produces an allowlisted checkpoint diff, the loop evaluates completion before stopping.
382
+
383
+ Stream events emit Cursor-compatible tool names: `grep`, `read`, `glob`, `list_dir`, `search_replace`, `write`.
384
+
385
+ ## Current limitations
386
+
387
+ - No HTTP SSE streaming (`POST /agent/run`); in-process `run.stream()` only.
388
+ - No `Agent.resume` / cloud VM runtime (local cwd or GitLab clone only).
389
+ - No MCP server configuration.
390
+ - No cloud push or PR creation.
391
+ - OpenHands CLI required when using the `openhands` provider in production.
392
+ - GitLab sanitizer supports `gitlab.com` HTTPS URLs only in v1.
393
+ - Validation is limited to build/test allowlist commands.
394
+ - Local workspace copy excludes `node_modules`; SDK auto-runs `npm install` internally before build validation when needed.
395
+
396
+ ## Cursor SDK compatibility matrix
397
+
398
+ | Cursor SDK | Auvira SDK |
399
+ |------------|------------|
400
+ | `Agent.create` | Yes (+ `close()` / `await using`) |
401
+ | `Agent.prompt` | Yes |
402
+ | `agent.send` → `AgentRun` | Yes |
403
+ | `run.stream()` / `messages()` | Yes |
404
+ | `run.wait()` | Yes (`status`, `id`) |
405
+ | `run.text()` / `iterText()` | Yes |
406
+ | `run.cancel()` | Yes |
407
+ | `run.conversation()` | Yes (after first completed run) |
408
+ | Native grep/read/edit tools | Yes (`agentic` mode) |
409
+ | `Agent.resume` | No |
410
+ | Cloud / MCP | No |
411
+
412
+ ## License
413
+
414
+ MIT
@@ -0,0 +1,27 @@
1
+ import { AgentRun } from "./AgentRun.js";
2
+ import { type AgentSendPayload } from "./parseSendPayload.js";
3
+ import type { AgentCreateOptions, AgentPromptOptions, AgentRunResult, AgentSendOptions } from "./types.js";
4
+ export { AgentNotFoundError } from "./AgentRegistry.js";
5
+ /** Cursor-SDK-compatible Auvira agent. */
6
+ export declare class Agent {
7
+ private readonly createOptions;
8
+ readonly agentId: string;
9
+ private readonly conversation;
10
+ private lastWorkspace;
11
+ private lastVisionImages?;
12
+ private readonly activeRuns;
13
+ private closed;
14
+ private constructor();
15
+ /** Creates a reusable agent instance without running a task. */
16
+ static create(options: AgentCreateOptions): Promise<Agent>;
17
+ /** Resumes an in-process agent by id (Cursor SDK parity). */
18
+ static resume(agentId: string, options: AgentCreateOptions): Promise<Agent>;
19
+ /** One-shot prompt that creates an agent and runs a single task. */
20
+ static prompt(payload: AgentSendPayload, options: AgentPromptOptions): Promise<AgentRunResult>;
21
+ /** Sends a prompt and returns a Cursor-SDK-compatible run handle. */
22
+ send(payload: AgentSendPayload, options?: AgentSendOptions): Promise<AgentRun>;
23
+ /** Releases resources and cancels in-flight runs. */
24
+ close(): Promise<void>;
25
+ [Symbol.asyncDispose](): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=Agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../src/agent/Agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AASzC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,kBAAkB,EAElB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAUpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAyBxD,0CAA0C;AAC1C,qBAAa,KAAK;IAQd,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM;IAR1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IACxD,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,gBAAgB,CAAC,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAKP,gEAAgE;WACnD,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;IAQhE,6DAA6D;WAChD,MAAM,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,KAAK,CAAC;IAKjB,oEAAoE;WACvD,MAAM,CACjB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC;IAW1B,qEAAqE;IAC/D,IAAI,CACR,OAAO,EAAE,gBAAgB,EACzB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,QAAQ,CAAC;IAgFpB,qDAAqD;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
@@ -0,0 +1,144 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { AgentRun } from "./AgentRun.js";
3
+ import { ConversationStore } from "./ConversationStore.js";
4
+ import { getRegisteredAgent, registerAgent, unregisterAgent, } from "./AgentRegistry.js";
5
+ import { RunEventBus } from "./RunEventBus.js";
6
+ import { runAgentTask } from "./runAgentTask.js";
7
+ import { parseSendPayload, } from "./parseSendPayload.js";
8
+ import { AgentConfigError } from "./types.js";
9
+ import { resolveCreateOptions, splitPromptOptions, validateSendOptions, } from "./validateOptions.js";
10
+ import { cleanupWorkspace } from "../workspace/cleanupWorkspace.js";
11
+ import { resolveWorkspaceMode } from "../workspace/resolveWorkspaceMode.js";
12
+ export { AgentNotFoundError } from "./AgentRegistry.js";
13
+ function mergeAbortSignals(...signals) {
14
+ const controller = new AbortController();
15
+ for (const signal of signals) {
16
+ if (!signal) {
17
+ continue;
18
+ }
19
+ if (signal.aborted) {
20
+ controller.abort(signal.reason);
21
+ return controller.signal;
22
+ }
23
+ signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
24
+ }
25
+ return controller.signal;
26
+ }
27
+ /** Cursor-SDK-compatible Auvira agent. */
28
+ export class Agent {
29
+ createOptions;
30
+ agentId;
31
+ conversation = new ConversationStore();
32
+ lastWorkspace;
33
+ lastVisionImages;
34
+ activeRuns = new Set();
35
+ closed = false;
36
+ constructor(createOptions, agentId) {
37
+ this.createOptions = createOptions;
38
+ this.agentId = agentId;
39
+ }
40
+ /** Creates a reusable agent instance without running a task. */
41
+ static async create(options) {
42
+ const resolved = await resolveCreateOptions(options);
43
+ const agentId = randomUUID();
44
+ const agent = new Agent(resolved, agentId);
45
+ registerAgent(agent, agentId);
46
+ return agent;
47
+ }
48
+ /** Resumes an in-process agent by id (Cursor SDK parity). */
49
+ static async resume(agentId, options) {
50
+ await resolveCreateOptions(options);
51
+ return getRegisteredAgent(agentId);
52
+ }
53
+ /** One-shot prompt that creates an agent and runs a single task. */
54
+ static async prompt(payload, options) {
55
+ const { createOptions, sendOptions } = splitPromptOptions(options);
56
+ const agent = await Agent.create(createOptions);
57
+ try {
58
+ const run = await agent.send(payload, sendOptions);
59
+ return await run.wait();
60
+ }
61
+ finally {
62
+ await agent.close();
63
+ }
64
+ }
65
+ /** Sends a prompt and returns a Cursor-SDK-compatible run handle. */
66
+ async send(payload, options) {
67
+ if (this.closed) {
68
+ throw new AgentConfigError("Agent has been closed", "INVALID_CONFIG");
69
+ }
70
+ validateSendOptions(options);
71
+ const parsed = parseSendPayload(payload, options ?? {});
72
+ const images = parsed.images.length > 0
73
+ ? parsed.images
74
+ : this.lastVisionImages ?? [];
75
+ if (parsed.images.length > 0) {
76
+ this.lastVisionImages = parsed.images;
77
+ }
78
+ const mergedSendOptions = {
79
+ ...options,
80
+ screenshotBase64: parsed.screenshotBase64,
81
+ };
82
+ const secrets = [
83
+ this.createOptions.gitlab?.token,
84
+ this.createOptions.model.apiKey,
85
+ ];
86
+ const bus = new RunEventBus(undefined, secrets);
87
+ const abortController = new AbortController();
88
+ const signal = mergeAbortSignals(options?.signal, abortController.signal);
89
+ const reuseWorkspace = options?.reuseWorkspace === true ||
90
+ (options?.reuseWorkspace !== false && this.conversation.hasHistory());
91
+ const context = {
92
+ signal,
93
+ agentId: this.agentId,
94
+ images,
95
+ conversationHistory: this.conversation.getTurns(),
96
+ reuseWorkspace: reuseWorkspace ? this.lastWorkspace : undefined,
97
+ onWorkspacePrepared: (workspace) => {
98
+ this.lastWorkspace = workspace;
99
+ },
100
+ onRunComplete: (result, userPrompt) => {
101
+ if (result.status === "finished" && result.ok) {
102
+ this.conversation.appendExchange({
103
+ runId: result.id,
104
+ userPrompt,
105
+ assistantResponse: result.response,
106
+ });
107
+ bus.emit({
108
+ type: "conversation.updated",
109
+ turnCount: this.conversation.getTurns().length,
110
+ });
111
+ }
112
+ },
113
+ };
114
+ const resultPromise = runAgentTask(this.createOptions, parsed.prompt, mergedSendOptions, bus, context);
115
+ const run = new AgentRun(bus, resultPromise, abortController, () => this.conversation.getTurns());
116
+ this.activeRuns.add(run);
117
+ void resultPromise.finally(() => {
118
+ this.activeRuns.delete(run);
119
+ });
120
+ return run;
121
+ }
122
+ /** Releases resources and cancels in-flight runs. */
123
+ async close() {
124
+ if (this.closed) {
125
+ return;
126
+ }
127
+ this.closed = true;
128
+ await Promise.all([...this.activeRuns].map((run) => run.cancel().catch(() => undefined)));
129
+ this.activeRuns.clear();
130
+ if (this.lastWorkspace &&
131
+ resolveWorkspaceMode(this.createOptions) === "git_copy" &&
132
+ this.createOptions.cleanupWorkspace === false) {
133
+ await cleanupWorkspace(this.lastWorkspace.path).catch(() => undefined);
134
+ }
135
+ this.conversation.clear();
136
+ this.lastWorkspace = undefined;
137
+ this.lastVisionImages = undefined;
138
+ unregisterAgent(this.agentId);
139
+ }
140
+ async [Symbol.asyncDispose]() {
141
+ await this.close();
142
+ }
143
+ }
144
+ //# sourceMappingURL=Agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Agent.js","sourceRoot":"","sources":["../../src/agent/Agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Agent } from "./Agent.js";
2
+ import { AgentConfigError } from "./types.js";
3
+ /** Registers an agent instance for Cursor-style resume. */
4
+ export declare function registerAgent(agent: Agent, agentId?: `${string}-${string}-${string}-${string}-${string}`): string;
5
+ /** Returns a previously registered agent or throws. */
6
+ export declare function getRegisteredAgent(agentId: string): Agent;
7
+ /** Removes an agent from the resume registry. */
8
+ export declare function unregisterAgent(agentId: string): void;
9
+ /** Cursor SDK parity — thrown when Agent.resume cannot find an agent id. */
10
+ export declare class AgentNotFoundError extends AgentConfigError {
11
+ constructor(message: string);
12
+ }
13
+ //# sourceMappingURL=AgentRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/AgentRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9C,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,sDAAe,GAAG,MAAM,CAG1E;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAMzD;AAED,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,4EAA4E;AAC5E,qBAAa,kBAAmB,SAAQ,gBAAgB;gBAC1C,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,28 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { AgentConfigError } from "./types.js";
3
+ const agents = new Map();
4
+ /** Registers an agent instance for Cursor-style resume. */
5
+ export function registerAgent(agent, agentId = randomUUID()) {
6
+ agents.set(agentId, agent);
7
+ return agentId;
8
+ }
9
+ /** Returns a previously registered agent or throws. */
10
+ export function getRegisteredAgent(agentId) {
11
+ const agent = agents.get(agentId.trim());
12
+ if (!agent) {
13
+ throw new AgentNotFoundError(`Agent not found: ${agentId}`);
14
+ }
15
+ return agent;
16
+ }
17
+ /** Removes an agent from the resume registry. */
18
+ export function unregisterAgent(agentId) {
19
+ agents.delete(agentId);
20
+ }
21
+ /** Cursor SDK parity — thrown when Agent.resume cannot find an agent id. */
22
+ export class AgentNotFoundError extends AgentConfigError {
23
+ constructor(message) {
24
+ super(message, "agent_not_found");
25
+ this.name = "AgentNotFoundError";
26
+ }
27
+ }
28
+ //# sourceMappingURL=AgentRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentRegistry.js","sourceRoot":"","sources":["../../src/agent/AgentRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;AAExC,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAAC,KAAY,EAAE,OAAO,GAAG,UAAU,EAAE;IAChE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,kBAAkB,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,4EAA4E;AAC5E,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}