@mrpatronz/nexusflow 1.7.0 → 1.9.0

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 (302) hide show
  1. package/README.md +57 -23
  2. package/dist/agent/AntigravityCliAdapter.d.ts +7 -0
  3. package/dist/agent/AntigravityCliAdapter.d.ts.map +1 -0
  4. package/dist/agent/AntigravityCliAdapter.js +13 -0
  5. package/dist/agent/AntigravityCliAdapter.js.map +1 -0
  6. package/dist/agent/ClaudeCliAdapter.d.ts +16 -0
  7. package/dist/agent/ClaudeCliAdapter.d.ts.map +1 -0
  8. package/dist/agent/ClaudeCliAdapter.js +34 -0
  9. package/dist/agent/ClaudeCliAdapter.js.map +1 -0
  10. package/dist/agent/CliAdapterBase.d.ts +48 -0
  11. package/dist/agent/CliAdapterBase.d.ts.map +1 -0
  12. package/dist/agent/CliAdapterBase.js +120 -0
  13. package/dist/agent/CliAdapterBase.js.map +1 -0
  14. package/dist/agent/NativeAgent.d.ts +13 -0
  15. package/dist/agent/NativeAgent.d.ts.map +1 -0
  16. package/dist/agent/NativeAgent.js +97 -0
  17. package/dist/agent/NativeAgent.js.map +1 -0
  18. package/dist/agent/NativeAgentBase.d.ts +27 -0
  19. package/dist/agent/NativeAgentBase.d.ts.map +1 -0
  20. package/dist/agent/NativeAgentBase.js +58 -0
  21. package/dist/agent/NativeAgentBase.js.map +1 -0
  22. package/dist/agent/NativeClaudeAgent.d.ts +13 -0
  23. package/dist/agent/NativeClaudeAgent.d.ts.map +1 -0
  24. package/dist/agent/NativeClaudeAgent.js +115 -0
  25. package/dist/agent/NativeClaudeAgent.js.map +1 -0
  26. package/dist/agent/NativeGoogleAgent.d.ts +13 -0
  27. package/dist/agent/NativeGoogleAgent.d.ts.map +1 -0
  28. package/dist/agent/NativeGoogleAgent.js +90 -0
  29. package/dist/agent/NativeGoogleAgent.js.map +1 -0
  30. package/dist/agent/ProviderRegistry.d.ts +31 -0
  31. package/dist/agent/ProviderRegistry.d.ts.map +1 -0
  32. package/dist/agent/ProviderRegistry.js +20 -0
  33. package/dist/agent/ProviderRegistry.js.map +1 -0
  34. package/dist/agent/ProviderRegistry.test.d.ts +2 -0
  35. package/dist/agent/ProviderRegistry.test.d.ts.map +1 -0
  36. package/dist/agent/ProviderRegistry.test.js +57 -0
  37. package/dist/agent/ProviderRegistry.test.js.map +1 -0
  38. package/dist/agent/adapters.d.ts +3 -0
  39. package/dist/agent/adapters.d.ts.map +1 -0
  40. package/dist/agent/adapters.js +48 -0
  41. package/dist/agent/adapters.js.map +1 -0
  42. package/dist/agent/nativeAgent.test.d.ts +2 -0
  43. package/dist/agent/nativeAgent.test.d.ts.map +1 -0
  44. package/dist/agent/nativeAgent.test.js +35 -0
  45. package/dist/agent/nativeAgent.test.js.map +1 -0
  46. package/dist/agent/nativeTools.d.ts +26 -0
  47. package/dist/agent/nativeTools.d.ts.map +1 -0
  48. package/dist/agent/nativeTools.js +62 -0
  49. package/dist/agent/nativeTools.js.map +1 -0
  50. package/dist/agent/nativeTools.test.d.ts +2 -0
  51. package/dist/agent/nativeTools.test.d.ts.map +1 -0
  52. package/dist/agent/nativeTools.test.js +67 -0
  53. package/dist/agent/nativeTools.test.js.map +1 -0
  54. package/dist/agent/session.d.ts +25 -0
  55. package/dist/agent/session.d.ts.map +1 -0
  56. package/dist/agent/session.js +31 -0
  57. package/dist/agent/session.js.map +1 -0
  58. package/dist/agent/session.test.d.ts +2 -0
  59. package/dist/agent/session.test.d.ts.map +1 -0
  60. package/dist/agent/session.test.js +44 -0
  61. package/dist/agent/session.test.js.map +1 -0
  62. package/dist/commands/create.d.ts +8 -7
  63. package/dist/commands/create.d.ts.map +1 -1
  64. package/dist/commands/create.js +134 -65
  65. package/dist/commands/create.js.map +1 -1
  66. package/dist/commands/desktop.d.ts +4 -5
  67. package/dist/commands/desktop.d.ts.map +1 -1
  68. package/dist/commands/desktop.js +35 -89
  69. package/dist/commands/desktop.js.map +1 -1
  70. package/dist/commands/doctor.d.ts.map +1 -1
  71. package/dist/commands/doctor.js +0 -1
  72. package/dist/commands/doctor.js.map +1 -1
  73. package/dist/commands/init.d.ts.map +1 -1
  74. package/dist/commands/init.js +1 -72
  75. package/dist/commands/init.js.map +1 -1
  76. package/dist/commands/list.d.ts.map +1 -1
  77. package/dist/commands/list.js +2 -1
  78. package/dist/commands/list.js.map +1 -1
  79. package/dist/commands/project.d.ts +30 -0
  80. package/dist/commands/project.d.ts.map +1 -0
  81. package/dist/commands/project.js +125 -0
  82. package/dist/commands/project.js.map +1 -0
  83. package/dist/commands/refresh.js +1 -1
  84. package/dist/commands/refresh.js.map +1 -1
  85. package/dist/commands/start.d.ts.map +1 -1
  86. package/dist/commands/start.js +18 -2
  87. package/dist/commands/start.js.map +1 -1
  88. package/dist/commands/stop.d.ts +1 -1
  89. package/dist/commands/stop.d.ts.map +1 -1
  90. package/dist/commands/stop.js +19 -2
  91. package/dist/commands/stop.js.map +1 -1
  92. package/dist/commands/tui.js +0 -1
  93. package/dist/commands/tui.js.map +1 -1
  94. package/dist/commands/ui.d.ts +7 -3
  95. package/dist/commands/ui.d.ts.map +1 -1
  96. package/dist/commands/ui.js +12 -6
  97. package/dist/commands/ui.js.map +1 -1
  98. package/dist/core/config.d.ts.map +1 -1
  99. package/dist/core/config.js +0 -9
  100. package/dist/core/config.js.map +1 -1
  101. package/dist/core/config.test.js +0 -9
  102. package/dist/core/config.test.js.map +1 -1
  103. package/dist/core/doctor.d.ts +1 -3
  104. package/dist/core/doctor.d.ts.map +1 -1
  105. package/dist/core/doctor.js +18 -69
  106. package/dist/core/doctor.js.map +1 -1
  107. package/dist/core/finish.d.ts.map +1 -1
  108. package/dist/core/finish.js +5 -0
  109. package/dist/core/finish.js.map +1 -1
  110. package/dist/core/graph.d.ts.map +1 -1
  111. package/dist/core/graph.js +2 -1
  112. package/dist/core/graph.js.map +1 -1
  113. package/dist/core/projects.d.ts +58 -0
  114. package/dist/core/projects.d.ts.map +1 -0
  115. package/dist/core/projects.js +190 -0
  116. package/dist/core/projects.js.map +1 -0
  117. package/dist/core/projects.test.d.ts +2 -0
  118. package/dist/core/projects.test.d.ts.map +1 -0
  119. package/dist/core/projects.test.js +165 -0
  120. package/dist/core/projects.test.js.map +1 -0
  121. package/dist/core/sync.d.ts.map +1 -1
  122. package/dist/core/sync.js +21 -0
  123. package/dist/core/sync.js.map +1 -1
  124. package/dist/core/sync.test.js +15 -0
  125. package/dist/core/sync.test.js.map +1 -1
  126. package/dist/core/workspace.create.test.js +68 -1
  127. package/dist/core/workspace.create.test.js.map +1 -1
  128. package/dist/core/workspace.d.ts +4 -3
  129. package/dist/core/workspace.d.ts.map +1 -1
  130. package/dist/core/workspace.js +138 -64
  131. package/dist/core/workspace.js.map +1 -1
  132. package/dist/desktop-server.d.ts +13 -0
  133. package/dist/desktop-server.d.ts.map +1 -0
  134. package/dist/desktop-server.js +23 -0
  135. package/dist/desktop-server.js.map +1 -0
  136. package/dist/generators/antigravity.js +1 -1
  137. package/dist/generators/antigravity.js.map +1 -1
  138. package/dist/generators/base.d.ts +1 -8
  139. package/dist/generators/base.d.ts.map +1 -1
  140. package/dist/generators/base.js +107 -58
  141. package/dist/generators/base.js.map +1 -1
  142. package/dist/generators/base.test.d.ts +2 -0
  143. package/dist/generators/base.test.d.ts.map +1 -0
  144. package/dist/generators/base.test.js +80 -0
  145. package/dist/generators/base.test.js.map +1 -0
  146. package/dist/generators/claude.js +1 -1
  147. package/dist/generators/claude.js.map +1 -1
  148. package/dist/generators/codex.js +1 -1
  149. package/dist/generators/codex.js.map +1 -1
  150. package/dist/generators/copilot.js +1 -1
  151. package/dist/generators/copilot.js.map +1 -1
  152. package/dist/generators/cursor.js +1 -1
  153. package/dist/generators/cursor.js.map +1 -1
  154. package/dist/generators/diff-context.d.ts.map +1 -1
  155. package/dist/generators/diff-context.js +3 -1
  156. package/dist/generators/diff-context.js.map +1 -1
  157. package/dist/generators/index.js +1 -1
  158. package/dist/generators/index.js.map +1 -1
  159. package/dist/generators/map-generator.d.ts.map +1 -1
  160. package/dist/generators/map-generator.js +3 -1
  161. package/dist/generators/map-generator.js.map +1 -1
  162. package/dist/gui/assets/DashboardPage-C3NH97y2.js +1 -0
  163. package/dist/gui/assets/GettingStartedPage-og-Kv7Sm.js +1 -0
  164. package/dist/gui/assets/ProjectsPage-COqqadEr.js +1 -0
  165. package/dist/gui/assets/ScaffoldRepoInline-DRipQsos.js +1 -0
  166. package/dist/gui/assets/Separator-Chx6O62Y.js +1 -0
  167. package/dist/gui/assets/SettingsPage-CpU3V9oU.js +1 -0
  168. package/dist/gui/assets/StartWorkPage-DIND0hJy.js +1 -0
  169. package/dist/gui/assets/StrategiesPage-6LWOnKdk.js +3 -0
  170. package/dist/gui/assets/WorkspacesPage-BUqgOhuy.js +6 -0
  171. package/dist/gui/assets/badge-BnkhqVEF.js +1 -0
  172. package/dist/gui/assets/button-cPldH5S4.js +1 -0
  173. package/dist/gui/assets/card-82INhRRE.js +1 -0
  174. package/dist/gui/assets/circle-plus-C0PNc7h4.js +1 -0
  175. package/dist/gui/assets/cpu-CPUNnHRM.js +1 -0
  176. package/dist/gui/assets/empty-DWyDwDYB.js +1 -0
  177. package/dist/gui/assets/external-link-BtYhMxno.js +1 -0
  178. package/dist/gui/assets/git-branch-Dw55pQWa.js +1 -0
  179. package/dist/gui/assets/index-CsA2SueF.css +2 -0
  180. package/dist/gui/assets/index-CyYbQwRf.js +52 -0
  181. package/dist/gui/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  182. package/dist/gui/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  183. package/dist/gui/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  184. package/dist/gui/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  185. package/dist/gui/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  186. package/dist/gui/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  187. package/dist/gui/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  188. package/dist/gui/assets/jetbrains-mono-latin-100-normal-DlYB2XW3.woff2 +0 -0
  189. package/dist/gui/assets/jetbrains-mono-latin-100-normal-DzH8uRxw.woff +0 -0
  190. package/dist/gui/assets/jetbrains-mono-latin-200-normal-CHn02WOn.woff +0 -0
  191. package/dist/gui/assets/jetbrains-mono-latin-200-normal-DvzYDkvL.woff2 +0 -0
  192. package/dist/gui/assets/jetbrains-mono-latin-300-normal-BYcAiAh2.woff +0 -0
  193. package/dist/gui/assets/jetbrains-mono-latin-300-normal-DuMDZskh.woff2 +0 -0
  194. package/dist/gui/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  195. package/dist/gui/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  196. package/dist/gui/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  197. package/dist/gui/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  198. package/dist/gui/assets/jetbrains-mono-latin-600-normal-BfsvjouI.woff +0 -0
  199. package/dist/gui/assets/jetbrains-mono-latin-600-normal-C8RAYTDA.woff2 +0 -0
  200. package/dist/gui/assets/jetbrains-mono-latin-700-normal-BYuf6tUa.woff2 +0 -0
  201. package/dist/gui/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff +0 -0
  202. package/dist/gui/assets/jetbrains-mono-latin-800-normal-D2mQHRMK.woff2 +0 -0
  203. package/dist/gui/assets/jetbrains-mono-latin-800-normal-Dj9qwObk.woff +0 -0
  204. package/dist/gui/assets/label-JFgMNsTn.js +1 -0
  205. package/dist/gui/assets/search-ChVovkOL.js +1 -0
  206. package/dist/gui/assets/skeleton-CCPbfn1L.js +1 -0
  207. package/dist/gui/assets/spinner-DXt6mnJk.js +1 -0
  208. package/dist/gui/assets/textarea-BLU5HXmZ.js +1 -0
  209. package/dist/gui/assets/trash-2-Da8F2gKd.js +1 -0
  210. package/dist/gui/assets/useAriaLabelledBy-CjNlctb9.js +1 -0
  211. package/dist/gui/assets/useCompositeListItem-DWGFLKqA.js +1 -0
  212. package/dist/gui/index.html +16 -6
  213. package/dist/index.js +56 -5
  214. package/dist/index.js.map +1 -1
  215. package/dist/mcp/tools.d.ts.map +1 -1
  216. package/dist/mcp/tools.js +4 -63
  217. package/dist/mcp/tools.js.map +1 -1
  218. package/dist/orchestration/detect.d.ts.map +1 -1
  219. package/dist/orchestration/detect.js +72 -26
  220. package/dist/orchestration/detect.js.map +1 -1
  221. package/dist/orchestration/index.d.ts +3 -1
  222. package/dist/orchestration/index.d.ts.map +1 -1
  223. package/dist/orchestration/index.js +3 -1
  224. package/dist/orchestration/index.js.map +1 -1
  225. package/dist/orchestration/log-tail.d.ts +27 -0
  226. package/dist/orchestration/log-tail.d.ts.map +1 -0
  227. package/dist/orchestration/log-tail.js +93 -0
  228. package/dist/orchestration/log-tail.js.map +1 -0
  229. package/dist/orchestration/log-tail.test.d.ts +2 -0
  230. package/dist/orchestration/log-tail.test.d.ts.map +1 -0
  231. package/dist/orchestration/log-tail.test.js +72 -0
  232. package/dist/orchestration/log-tail.test.js.map +1 -0
  233. package/dist/orchestration/orchestrator.d.ts +26 -0
  234. package/dist/orchestration/orchestrator.d.ts.map +1 -0
  235. package/dist/orchestration/orchestrator.js +102 -0
  236. package/dist/orchestration/orchestrator.js.map +1 -0
  237. package/dist/orchestration/orchestrator.test.d.ts +2 -0
  238. package/dist/orchestration/orchestrator.test.d.ts.map +1 -0
  239. package/dist/orchestration/orchestrator.test.js +85 -0
  240. package/dist/orchestration/orchestrator.test.js.map +1 -0
  241. package/dist/orchestration/runner.d.ts +62 -3
  242. package/dist/orchestration/runner.d.ts.map +1 -1
  243. package/dist/orchestration/runner.js +198 -103
  244. package/dist/orchestration/runner.js.map +1 -1
  245. package/dist/orchestration/runner.test.js +125 -1
  246. package/dist/orchestration/runner.test.js.map +1 -1
  247. package/dist/server.d.ts.map +1 -1
  248. package/dist/server.js +395 -126
  249. package/dist/server.js.map +1 -1
  250. package/dist/server.test.js +111 -123
  251. package/dist/server.test.js.map +1 -1
  252. package/dist/types.d.ts +79 -16
  253. package/dist/types.d.ts.map +1 -1
  254. package/dist/utils/feature.d.ts +42 -0
  255. package/dist/utils/feature.d.ts.map +1 -0
  256. package/dist/utils/feature.js +52 -0
  257. package/dist/utils/feature.js.map +1 -0
  258. package/dist/utils/multi-git.d.ts.map +1 -1
  259. package/dist/utils/multi-git.js +30 -7
  260. package/dist/utils/multi-git.js.map +1 -1
  261. package/dist/utils/session-finder.d.ts +21 -1
  262. package/dist/utils/session-finder.d.ts.map +1 -1
  263. package/dist/utils/session-finder.js +220 -143
  264. package/dist/utils/session-finder.js.map +1 -1
  265. package/dist/utils/session-finder.test.d.ts +2 -0
  266. package/dist/utils/session-finder.test.d.ts.map +1 -0
  267. package/dist/utils/session-finder.test.js +65 -0
  268. package/dist/utils/session-finder.test.js.map +1 -0
  269. package/dist/utils/slug.d.ts +12 -0
  270. package/dist/utils/slug.d.ts.map +1 -0
  271. package/dist/utils/slug.js +18 -0
  272. package/dist/utils/slug.js.map +1 -0
  273. package/dist/utils/test-command.d.ts +12 -0
  274. package/dist/utils/test-command.d.ts.map +1 -0
  275. package/dist/utils/test-command.js +22 -0
  276. package/dist/utils/test-command.js.map +1 -0
  277. package/dist/utils/update-check.d.ts +8 -0
  278. package/dist/utils/update-check.d.ts.map +1 -1
  279. package/dist/utils/update-check.js +13 -7
  280. package/dist/utils/update-check.js.map +1 -1
  281. package/dist/utils/update-check.test.d.ts +2 -0
  282. package/dist/utils/update-check.test.d.ts.map +1 -0
  283. package/dist/utils/update-check.test.js +25 -0
  284. package/dist/utils/update-check.test.js.map +1 -0
  285. package/dist/utils/workflow-advisor.d.ts +2 -2
  286. package/dist/utils/workflow-advisor.d.ts.map +1 -1
  287. package/dist/utils/workflow-advisor.js +50 -92
  288. package/dist/utils/workflow-advisor.js.map +1 -1
  289. package/dist/utils/workflows.d.ts.map +1 -1
  290. package/dist/utils/workflows.js +2 -4
  291. package/dist/utils/workflows.js.map +1 -1
  292. package/package.json +10 -1
  293. package/dist/gui/assets/index-CB-Ekvrs.css +0 -1
  294. package/dist/gui/assets/index-CixLsYSa.js +0 -26
  295. package/dist/utils/local-ai.d.ts +0 -27
  296. package/dist/utils/local-ai.d.ts.map +0 -1
  297. package/dist/utils/local-ai.js +0 -100
  298. package/dist/utils/local-ai.js.map +0 -1
  299. package/dist/utils/local-ai.test.d.ts +0 -2
  300. package/dist/utils/local-ai.test.d.ts.map +0 -1
  301. package/dist/utils/local-ai.test.js +0 -108
  302. package/dist/utils/local-ai.test.js.map +0 -1
@@ -0,0 +1,58 @@
1
+ import { EventEmitter } from 'node:events';
2
+ /**
3
+ * Shared lifecycle for the SDK-backed native agents. Owns the processing guard,
4
+ * the abort controller, and the idle/error signalling so each provider only
5
+ * implements its SDK-specific streaming loop.
6
+ */
7
+ export class NativeAgentBase extends EventEmitter {
8
+ cwd = '';
9
+ isProcessing = false;
10
+ abortController = null;
11
+ /**
12
+ * Returns a user-facing message when the provider isn't usable (e.g. missing
13
+ * API key), or null when it is. Checked before each turn so a misconfigured
14
+ * provider gives a clear error instead of a raw SDK auth exception.
15
+ */
16
+ configError() {
17
+ return null;
18
+ }
19
+ async start(cwd) {
20
+ this.cwd = cwd;
21
+ this.resetHistory();
22
+ }
23
+ async send(data) {
24
+ if (this.isProcessing)
25
+ return;
26
+ const cfgError = this.configError();
27
+ if (cfgError) {
28
+ this.emit('error', new Error(cfgError));
29
+ this.emit('idle');
30
+ return;
31
+ }
32
+ this.isProcessing = true;
33
+ const controller = new AbortController();
34
+ this.abortController = controller;
35
+ try {
36
+ await this.runLoop(data, controller.signal);
37
+ }
38
+ catch (err) {
39
+ // Any error surfacing after an intentional Stop is the abort, not a
40
+ // failure — the SDKs throw APIUserAbortError (name !== 'AbortError'),
41
+ // so check the signal rather than the error name.
42
+ if (!controller.signal.aborted) {
43
+ console.error(`${this.label} error:`, err);
44
+ this.emit('error', err);
45
+ }
46
+ }
47
+ finally {
48
+ this.isProcessing = false;
49
+ this.emit('idle');
50
+ }
51
+ }
52
+ stop() {
53
+ this.abortController?.abort();
54
+ this.abortController = null;
55
+ this.emit('close', 0);
56
+ }
57
+ }
58
+ //# sourceMappingURL=NativeAgentBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeAgentBase.js","sourceRoot":"","sources":["../../src/agent/NativeAgentBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;GAIG;AACH,MAAM,OAAgB,eAAgB,SAAQ,YAAY;IAC9C,GAAG,GAAW,EAAE,CAAC;IACjB,YAAY,GAAY,KAAK,CAAC;IAC9B,eAAe,GAA2B,IAAI,CAAC;IAWzD;;;;OAIG;IACO,WAAW;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,GAAW;QAC5B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAY;QAC5B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,oEAAoE;YACpE,sEAAsE;YACtE,kDAAkD;YAClD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,SAAS,EAAE,GAAG,CAAC,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import { NativeAgentBase } from './NativeAgentBase.js';
2
+ export declare class NativeClaudeAgent extends NativeAgentBase {
3
+ protected readonly label = "NativeClaudeAgent";
4
+ private anthropic;
5
+ private messages;
6
+ private modelName;
7
+ constructor();
8
+ private client;
9
+ protected configError(): string | null;
10
+ protected resetHistory(): void;
11
+ protected runLoop(userInput: string, signal: AbortSignal): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=NativeClaudeAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeClaudeAgent.d.ts","sourceRoot":"","sources":["../../src/agent/NativeClaudeAgent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AASvD,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,SAAS,CAAC,QAAQ,CAAC,KAAK,uBAAuB;IAC/C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAS;;IAO1B,OAAO,CAAC,MAAM;IAId,SAAS,CAAC,WAAW,IAAI,MAAM,GAAG,IAAI;IAItC,SAAS,CAAC,YAAY;cAIN,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CAiG/D"}
@@ -0,0 +1,115 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import { NativeAgentBase } from './NativeAgentBase.js';
3
+ import { NATIVE_TOOLS, NATIVE_STEP_LIMIT, STEP_LIMIT_NOTICE, buildSystemPrompt, executeNativeTool, } from './nativeTools.js';
4
+ export class NativeClaudeAgent extends NativeAgentBase {
5
+ label = 'NativeClaudeAgent';
6
+ anthropic = null;
7
+ messages = [];
8
+ modelName;
9
+ constructor() {
10
+ super();
11
+ this.modelName = process.env.ANTHROPIC_MODEL || 'claude-sonnet-5';
12
+ }
13
+ client() {
14
+ return (this.anthropic ??= new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY || '' }));
15
+ }
16
+ configError() {
17
+ return process.env.ANTHROPIC_API_KEY ? null : 'Anthropic API key is not configured (set ANTHROPIC_API_KEY).';
18
+ }
19
+ resetHistory() {
20
+ this.messages = [];
21
+ }
22
+ async runLoop(userInput, signal) {
23
+ this.messages.push({ role: 'user', content: userInput });
24
+ const system = buildSystemPrompt(this.cwd);
25
+ const tools = NATIVE_TOOLS.map((t) => ({
26
+ name: t.name,
27
+ description: t.description,
28
+ input_schema: {
29
+ type: 'object',
30
+ properties: { [t.argName]: { type: 'string', description: t.argDescription } },
31
+ required: [t.argName],
32
+ },
33
+ }));
34
+ let completed = false;
35
+ for (let step = 0; step < NATIVE_STEP_LIMIT; step++) {
36
+ if (signal.aborted)
37
+ break;
38
+ const stream = await this.client().messages.create({
39
+ model: this.modelName,
40
+ max_tokens: 8192,
41
+ system,
42
+ messages: this.messages,
43
+ tools,
44
+ stream: true,
45
+ }, { signal });
46
+ let content = '';
47
+ const toolCalls = [];
48
+ let currentToolCall = null;
49
+ for await (const chunk of stream) {
50
+ if (chunk.type === 'content_block_delta' && chunk.delta.type === 'text_delta') {
51
+ content += chunk.delta.text;
52
+ this.emit('data', chunk.delta.text);
53
+ }
54
+ else if (chunk.type === 'content_block_start' && chunk.content_block.type === 'tool_use') {
55
+ currentToolCall = { id: chunk.content_block.id, name: chunk.content_block.name, input: '' };
56
+ this.emit('data', `\n\n*Running tool: ${currentToolCall.name}*\n`);
57
+ }
58
+ else if (chunk.type === 'content_block_delta' && chunk.delta.type === 'input_json_delta' && currentToolCall) {
59
+ currentToolCall.input += chunk.delta.partial_json;
60
+ }
61
+ else if (chunk.type === 'content_block_stop') {
62
+ if (currentToolCall) {
63
+ toolCalls.push(currentToolCall);
64
+ currentToolCall = null;
65
+ }
66
+ }
67
+ }
68
+ // Parse tool inputs up front. A tool_use block and its later tool_result
69
+ // must be paired: if the JSON is malformed we drop BOTH, otherwise the
70
+ // Anthropic API rejects the next request with a dangling tool_result and
71
+ // the whole session is wedged.
72
+ const assistantContent = [];
73
+ if (content)
74
+ assistantContent.push({ type: 'text', text: content });
75
+ const validCalls = [];
76
+ for (const tc of toolCalls) {
77
+ try {
78
+ const args = JSON.parse(tc.input || '{}');
79
+ assistantContent.push({ type: 'tool_use', id: tc.id, name: tc.name, input: args });
80
+ validCalls.push({ id: tc.id, name: tc.name, args });
81
+ }
82
+ catch {
83
+ // Malformed tool input — skip the block entirely (no tool_result).
84
+ }
85
+ }
86
+ // Anthropic requires strictly alternating user/assistant turns with
87
+ // non-empty content. If the model returned nothing usable (no text and
88
+ // only malformed tool calls), record a minimal assistant turn so the
89
+ // next user message doesn't produce two consecutive user turns (400).
90
+ if (assistantContent.length === 0) {
91
+ assistantContent.push({ type: 'text', text: '(no response)' });
92
+ }
93
+ this.messages.push({ role: 'assistant', content: assistantContent });
94
+ if (validCalls.length === 0) {
95
+ completed = true;
96
+ break;
97
+ }
98
+ const toolResultContent = [];
99
+ for (const call of validCalls) {
100
+ try {
101
+ const result = await executeNativeTool(this.cwd, call.name, call.args);
102
+ toolResultContent.push({ type: 'tool_result', tool_use_id: call.id, content: result });
103
+ }
104
+ catch (err) {
105
+ toolResultContent.push({ type: 'tool_result', tool_use_id: call.id, content: `Error: ${err.message}`, is_error: true });
106
+ }
107
+ }
108
+ this.messages.push({ role: 'user', content: toolResultContent });
109
+ }
110
+ if (!completed && !signal.aborted) {
111
+ this.emit('data', STEP_LIMIT_NOTICE);
112
+ }
113
+ }
114
+ }
115
+ //# sourceMappingURL=NativeClaudeAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeClaudeAgent.js","sourceRoot":"","sources":["../../src/agent/NativeClaudeAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { NativeAgentBase } from './NativeAgentBase.js';
2
+ export declare class NativeGoogleAgent extends NativeAgentBase {
3
+ protected readonly label = "NativeGoogleAgent";
4
+ private ai;
5
+ private history;
6
+ private modelName;
7
+ constructor();
8
+ private client;
9
+ protected configError(): string | null;
10
+ protected resetHistory(): void;
11
+ protected runLoop(userInput: string, signal: AbortSignal): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=NativeGoogleAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeGoogleAgent.d.ts","sourceRoot":"","sources":["../../src/agent/NativeGoogleAgent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AASvD,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,SAAS,CAAC,QAAQ,CAAC,KAAK,uBAAuB;IAC/C,OAAO,CAAC,EAAE,CAA4B;IACtC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,SAAS,CAAS;;IAQ1B,OAAO,CAAC,MAAM;IAId,SAAS,CAAC,WAAW,IAAI,MAAM,GAAG,IAAI;IAItC,SAAS,CAAC,YAAY;cAIN,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CAyE/D"}
@@ -0,0 +1,90 @@
1
+ import { GoogleGenAI } from '@google/genai';
2
+ import { NativeAgentBase } from './NativeAgentBase.js';
3
+ import { NATIVE_TOOLS, NATIVE_STEP_LIMIT, STEP_LIMIT_NOTICE, buildSystemPrompt, executeNativeTool, } from './nativeTools.js';
4
+ export class NativeGoogleAgent extends NativeAgentBase {
5
+ label = 'NativeGoogleAgent';
6
+ ai = null;
7
+ history = [];
8
+ modelName;
9
+ constructor() {
10
+ super();
11
+ // Allow users to override the model via env var, fallback to gemini-2.0-flash
12
+ this.modelName = process.env.GEMINI_MODEL || 'gemini-2.0-flash';
13
+ }
14
+ client() {
15
+ return (this.ai ??= new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY || '' }));
16
+ }
17
+ configError() {
18
+ return process.env.GEMINI_API_KEY ? null : 'Google API key is not configured (set GEMINI_API_KEY).';
19
+ }
20
+ resetHistory() {
21
+ this.history = [];
22
+ }
23
+ async runLoop(userInput, signal) {
24
+ this.history.push({ role: 'user', parts: [{ text: userInput }] });
25
+ const config = {
26
+ systemInstruction: buildSystemPrompt(this.cwd),
27
+ // Cancels an in-flight request when stop() aborts the controller.
28
+ abortSignal: signal,
29
+ tools: [{
30
+ functionDeclarations: NATIVE_TOOLS.map((t) => ({
31
+ name: t.name,
32
+ description: t.description,
33
+ parameters: {
34
+ type: 'OBJECT',
35
+ properties: { [t.argName]: { type: 'STRING', description: t.argDescription } },
36
+ required: [t.argName],
37
+ },
38
+ })),
39
+ }],
40
+ };
41
+ let completed = false;
42
+ for (let step = 0; step < NATIVE_STEP_LIMIT; step++) {
43
+ if (signal.aborted)
44
+ break;
45
+ const responseStream = await this.client().models.generateContentStream({
46
+ model: this.modelName,
47
+ contents: this.history,
48
+ config,
49
+ });
50
+ let fullText = '';
51
+ const functionCalls = [];
52
+ for await (const chunk of responseStream) {
53
+ if (chunk.text) {
54
+ fullText += chunk.text;
55
+ this.emit('data', chunk.text);
56
+ }
57
+ if (chunk.functionCalls && chunk.functionCalls.length > 0) {
58
+ functionCalls.push(...chunk.functionCalls);
59
+ }
60
+ }
61
+ const modelParts = [];
62
+ if (fullText)
63
+ modelParts.push({ text: fullText });
64
+ if (functionCalls.length > 0)
65
+ modelParts.push(...functionCalls.map((fc) => ({ functionCall: fc })));
66
+ this.history.push({ role: 'model', parts: modelParts });
67
+ if (functionCalls.length === 0) {
68
+ completed = true;
69
+ break;
70
+ }
71
+ const functionResponses = [];
72
+ for (const call of functionCalls) {
73
+ this.emit('data', `\n\n*Running tool: ${call.name}*\n`);
74
+ let result;
75
+ try {
76
+ result = await executeNativeTool(this.cwd, call.name, call.args || {});
77
+ }
78
+ catch (e) {
79
+ result = `Error: ${e.message}`;
80
+ }
81
+ functionResponses.push({ functionResponse: { name: call.name, response: { result } } });
82
+ }
83
+ this.history.push({ role: 'user', parts: functionResponses });
84
+ }
85
+ if (!completed && !signal.aborted) {
86
+ this.emit('data', STEP_LIMIT_NOTICE);
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=NativeGoogleAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeGoogleAgent.js","sourceRoot":"","sources":["../../src/agent/NativeGoogleAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { AgentSession } from './session.js';
2
+ export interface ProviderStatus {
3
+ id: string;
4
+ name: string;
5
+ isConfigured: boolean;
6
+ message?: string;
7
+ icon?: string;
8
+ }
9
+ export interface AgentHarness {
10
+ start(cwd: string, session?: AgentSession): Promise<void>;
11
+ send(data: string): Promise<void>;
12
+ stop(): void;
13
+ on(event: 'data' | 'close' | 'error' | 'system' | 'idle', listener: (...args: any[]) => void): this;
14
+ }
15
+ export interface ProviderAdapter {
16
+ id: string;
17
+ name: string;
18
+ icon?: string;
19
+ isConfigured(): boolean;
20
+ getStatusMessage(): string | undefined;
21
+ createInstance(): AgentHarness;
22
+ }
23
+ declare class ProviderRegistryImpl {
24
+ private providers;
25
+ register(provider: ProviderAdapter): void;
26
+ getProvider(id: string): ProviderAdapter | undefined;
27
+ getAllStatus(): ProviderStatus[];
28
+ }
29
+ export declare const ProviderRegistry: ProviderRegistryImpl;
30
+ export {};
31
+ //# sourceMappingURL=ProviderRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,CAAC;IACb,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CACrG;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,IAAI,OAAO,CAAC;IACxB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAC;IACvC,cAAc,IAAI,YAAY,CAAC;CAChC;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,SAAS,CAA2C;IAE5D,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAIlC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,YAAY,IAAI,cAAc,EAAE;CASjC;AAED,eAAO,MAAM,gBAAgB,sBAA6B,CAAC"}
@@ -0,0 +1,20 @@
1
+ class ProviderRegistryImpl {
2
+ providers = new Map();
3
+ register(provider) {
4
+ this.providers.set(provider.id, provider);
5
+ }
6
+ getProvider(id) {
7
+ return this.providers.get(id);
8
+ }
9
+ getAllStatus() {
10
+ return Array.from(this.providers.values()).map(p => ({
11
+ id: p.id,
12
+ name: p.name,
13
+ icon: p.icon,
14
+ isConfigured: p.isConfigured(),
15
+ message: p.getStatusMessage()
16
+ }));
17
+ }
18
+ }
19
+ export const ProviderRegistry = new ProviderRegistryImpl();
20
+ //# sourceMappingURL=ProviderRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.ts"],"names":[],"mappings":"AA0BA,MAAM,oBAAoB;IAChB,SAAS,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE5D,QAAQ,CAAC,QAAyB;QAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE;YAC9B,OAAO,EAAE,CAAC,CAAC,gBAAgB,EAAE;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ProviderRegistry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderRegistry.test.d.ts","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ProviderRegistry } from './ProviderRegistry.js';
3
+ class MockAgentHarness {
4
+ started = false;
5
+ async start(cwd) {
6
+ this.started = true;
7
+ }
8
+ async send(data) { }
9
+ stop() { }
10
+ on(event, listener) { return this; }
11
+ }
12
+ // The registry is a shared singleton without a reset method, so each test
13
+ // registers its own uniquely-named provider to stay order-independent.
14
+ function makeProvider(id, overrides = {}) {
15
+ return {
16
+ id,
17
+ name: 'Mock',
18
+ isConfigured: () => true,
19
+ getStatusMessage: () => undefined,
20
+ createInstance: () => new MockAgentHarness(),
21
+ ...overrides
22
+ };
23
+ }
24
+ describe('ProviderRegistry', () => {
25
+ it('should register and retrieve a provider', () => {
26
+ ProviderRegistry.register(makeProvider('mock-retrieve'));
27
+ const retrieved = ProviderRegistry.getProvider('mock-retrieve');
28
+ expect(retrieved).toBeDefined();
29
+ expect(retrieved?.id).toBe('mock-retrieve');
30
+ expect(retrieved?.name).toBe('Mock');
31
+ });
32
+ it('should list all statuses correctly', () => {
33
+ ProviderRegistry.register(makeProvider('mock-unconfigured', {
34
+ name: 'Unconfigured',
35
+ isConfigured: () => false,
36
+ getStatusMessage: () => 'Missing API Key'
37
+ }));
38
+ const statuses = ProviderRegistry.getAllStatus();
39
+ const unconfiguredStatus = statuses.find(s => s.id === 'mock-unconfigured');
40
+ expect(unconfiguredStatus).toBeDefined();
41
+ expect(unconfiguredStatus?.isConfigured).toBe(false);
42
+ expect(unconfiguredStatus?.message).toBe('Missing API Key');
43
+ });
44
+ it('should create an instance correctly', () => {
45
+ ProviderRegistry.register(makeProvider('mock-instance'));
46
+ const provider = ProviderRegistry.getProvider('mock-instance');
47
+ expect(provider).toBeDefined();
48
+ if (provider) {
49
+ const instance = provider.createInstance();
50
+ expect(instance).toBeDefined();
51
+ expect(instance.started).toBe(false);
52
+ instance.start('/');
53
+ expect(instance.started).toBe(true);
54
+ }
55
+ });
56
+ });
57
+ //# sourceMappingURL=ProviderRegistry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderRegistry.test.js","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,gBAAgB;IACb,OAAO,GAAG,KAAK,CAAC;IACvB,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,IAAY,IAAG,CAAC;IAC3B,IAAI,KAAI,CAAC;IACT,EAAE,CAAC,KAAa,EAAE,QAAa,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC;CAClD;AAED,0EAA0E;AAC1E,uEAAuE;AACvE,SAAS,YAAY,CAAC,EAAU,EAAE,YAAsC,EAAE;IACxE,OAAO;QACL,EAAE;QACF,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI;QACxB,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;QACjC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,gBAAgB,EAAE;QAC5C,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;QAEzD,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,mBAAmB,EAAE;YAC1D,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK;YACzB,gBAAgB,EAAE,GAAG,EAAE,CAAC,iBAAiB;SAC1C,CAAC,CAAC,CAAC;QAEJ,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,mBAAmB,CAAC,CAAC;QAE5E,MAAM,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAE/B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAsB,CAAC;YAC/D,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpB,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ProviderRegistry } from './ProviderRegistry.js';
2
+ export { ProviderRegistry };
3
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/agent/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAoDzD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { ProviderRegistry } from './ProviderRegistry.js';
2
+ import { NativeClaudeAgent } from './NativeClaudeAgent.js';
3
+ import { NativeAgent } from './NativeAgent.js';
4
+ import { NativeGoogleAgent } from './NativeGoogleAgent.js';
5
+ import { ClaudeCliAdapter } from './ClaudeCliAdapter.js';
6
+ import { AntigravityCliAdapter } from './AntigravityCliAdapter.js';
7
+ ProviderRegistry.register({
8
+ id: 'claude-native',
9
+ name: 'Claude',
10
+ icon: 'Bot',
11
+ isConfigured: () => !!process.env.ANTHROPIC_API_KEY,
12
+ getStatusMessage: () => process.env.ANTHROPIC_API_KEY ? undefined : 'Anthropic API key is not configured in ANTHROPIC_API_KEY.',
13
+ createInstance: () => new NativeClaudeAgent()
14
+ });
15
+ ProviderRegistry.register({
16
+ id: 'openai-native',
17
+ name: 'OpenAI',
18
+ icon: 'Sparkles',
19
+ isConfigured: () => !!process.env.OPENAI_API_KEY,
20
+ getStatusMessage: () => process.env.OPENAI_API_KEY ? undefined : 'OpenAI API key is not configured in OPENAI_API_KEY.',
21
+ createInstance: () => new NativeAgent()
22
+ });
23
+ ProviderRegistry.register({
24
+ id: 'google-native',
25
+ name: 'Google Gemini',
26
+ icon: 'Sparkles',
27
+ isConfigured: () => !!process.env.GEMINI_API_KEY,
28
+ getStatusMessage: () => process.env.GEMINI_API_KEY ? undefined : 'Google API key is not configured in GEMINI_API_KEY.',
29
+ createInstance: () => new NativeGoogleAgent()
30
+ });
31
+ ProviderRegistry.register({
32
+ id: 'claude-cli',
33
+ name: 'Claude Code (Local CLI)',
34
+ icon: 'Terminal',
35
+ isConfigured: () => true, // Assume the CLI is installed for now
36
+ getStatusMessage: () => undefined, // No API key required!
37
+ createInstance: () => new ClaudeCliAdapter()
38
+ });
39
+ ProviderRegistry.register({
40
+ id: 'antigravity-cli',
41
+ name: 'Antigravity (Local CLI)',
42
+ icon: 'Terminal',
43
+ isConfigured: () => true, // Assume the CLI is installed for now
44
+ getStatusMessage: () => undefined, // No API key required!
45
+ createInstance: () => new AntigravityCliAdapter()
46
+ });
47
+ export { ProviderRegistry };
48
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/agent/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,KAAK;IACX,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACnD,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,2DAA2D;IAC/H,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;CAC9C,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;IAChD,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qDAAqD;IACtH,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;CACxC,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;IAChD,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qDAAqD;IACtH,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;CAC9C,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,sCAAsC;IAChE,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,uBAAuB;IAC1D,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,gBAAgB,EAAE;CAC7C,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,iBAAiB;IACrB,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,sCAAsC;IAChE,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,uBAAuB;IAC1D,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,qBAAqB,EAAE;CAClD,CAAC,CAAC;AAEH,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=nativeAgent.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeAgent.test.d.ts","sourceRoot":"","sources":["../../src/agent/nativeAgent.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { NativeAgent } from './NativeAgent.js';
3
+ import { NativeClaudeAgent } from './NativeClaudeAgent.js';
4
+ import { NativeGoogleAgent } from './NativeGoogleAgent.js';
5
+ // Ensure no keys leak in from the environment.
6
+ beforeEach(() => {
7
+ delete process.env.OPENAI_API_KEY;
8
+ delete process.env.ANTHROPIC_API_KEY;
9
+ delete process.env.GEMINI_API_KEY;
10
+ });
11
+ const cases = [
12
+ ['NativeAgent (OpenAI)', () => new NativeAgent(), /OpenAI API key is not configured/],
13
+ ['NativeClaudeAgent', () => new NativeClaudeAgent(), /Anthropic API key is not configured/],
14
+ ['NativeGoogleAgent', () => new NativeGoogleAgent(), /Google API key is not configured/],
15
+ ];
16
+ describe('native agents without an API key', () => {
17
+ for (const [name, make, expected] of cases) {
18
+ it(`${name}: constructs without throwing and emits a clear config error on send`, async () => {
19
+ // Construction must not throw even though the SDK client would reject an
20
+ // empty key — the client is built lazily behind the config gate.
21
+ const agent = make();
22
+ const events = [];
23
+ agent.on('error', (e) => events.push({ type: 'error', message: e.message }));
24
+ agent.on('idle', () => events.push({ type: 'idle' }));
25
+ await agent.start('/tmp/ws');
26
+ await agent.send('hello');
27
+ const err = events.find((e) => e.type === 'error');
28
+ expect(err, 'expected an error event').toBeTruthy();
29
+ expect(err.message).toMatch(expected);
30
+ // No network call happened, and the turn settled.
31
+ expect(events.some((e) => e.type === 'idle')).toBe(true);
32
+ });
33
+ }
34
+ });
35
+ //# sourceMappingURL=nativeAgent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeAgent.test.js","sourceRoot":"","sources":["../../src/agent/nativeAgent.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,+CAA+C;AAC/C,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAClC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,MAAM,KAAK,GAAkC;IAC3C,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE,EAAE,kCAAkC,CAAC;IACrF,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,EAAE,qCAAqC,CAAC;IAC3F,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,EAAE,kCAAkC,CAAC;CACzF,CAAC;AAEF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3C,EAAE,CAAC,GAAG,IAAI,sEAAsE,EAAE,KAAK,IAAI,EAAE;YAC3F,yEAAyE;YACzE,iEAAiE;YACjE,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;YACrB,MAAM,MAAM,GAAyC,EAAE,CAAC;YACxD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACpF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAEtD,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YACnD,MAAM,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC,UAAU,EAAE,CAAC;YACpD,MAAM,CAAC,GAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,kDAAkD;YAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @module agent/nativeTools
3
+ * Shared prompt, tool metadata, and execution for the SDK-backed native agents
4
+ * (OpenAI / Anthropic / Gemini). Keeping the tool executor here means the
5
+ * read-only workspace access — and its path-containment guard — is defined
6
+ * once instead of copied into three agent loops.
7
+ */
8
+ export declare const NATIVE_STEP_LIMIT = 5;
9
+ export declare const STEP_LIMIT_NOTICE = "\n\n*Stopped after reaching the tool-step limit without a final answer. Send a follow-up message to continue.*\n";
10
+ export declare function buildSystemPrompt(cwd: string): string;
11
+ export interface NativeToolMeta {
12
+ name: string;
13
+ description: string;
14
+ argName: string;
15
+ argDescription: string;
16
+ }
17
+ /** Provider-agnostic description of the two read-only tools. Each agent maps
18
+ * these into its own SDK's schema shape. */
19
+ export declare const NATIVE_TOOLS: NativeToolMeta[];
20
+ /**
21
+ * Execute a native tool call. Returns the tool's textual result; throws on an
22
+ * unknown tool, a path-containment violation, or a filesystem error (callers
23
+ * surface the message back to the model).
24
+ */
25
+ export declare function executeNativeTool(cwd: string, name: string, args: any): Promise<string>;
26
+ //# sourceMappingURL=nativeTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeTools.d.ts","sourceRoot":"","sources":["../../src/agent/nativeTools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,iBAAiB,qHACsF,CAAC;AAErH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;6CAC6C;AAC7C,eAAO,MAAM,YAAY,EAAE,cAAc,EAGxC,CAAC;AA4BF;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7F"}