zerg-ztc 0.1.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 (411) hide show
  1. package/README.md +361 -0
  2. package/dist/App.d.ts +4 -0
  3. package/dist/App.d.ts.map +1 -0
  4. package/dist/App.js +499 -0
  5. package/dist/App.js.map +1 -0
  6. package/dist/agent/agent.d.ts +54 -0
  7. package/dist/agent/agent.d.ts.map +1 -0
  8. package/dist/agent/agent.js +347 -0
  9. package/dist/agent/agent.js.map +1 -0
  10. package/dist/agent/backends/anthropic.d.ts +13 -0
  11. package/dist/agent/backends/anthropic.d.ts.map +1 -0
  12. package/dist/agent/backends/anthropic.js +54 -0
  13. package/dist/agent/backends/anthropic.js.map +1 -0
  14. package/dist/agent/backends/gemini.d.ts +13 -0
  15. package/dist/agent/backends/gemini.d.ts.map +1 -0
  16. package/dist/agent/backends/gemini.js +71 -0
  17. package/dist/agent/backends/gemini.js.map +1 -0
  18. package/dist/agent/backends/inception.d.ts +12 -0
  19. package/dist/agent/backends/inception.d.ts.map +1 -0
  20. package/dist/agent/backends/inception.js +15 -0
  21. package/dist/agent/backends/inception.js.map +1 -0
  22. package/dist/agent/backends/index.d.ts +7 -0
  23. package/dist/agent/backends/index.d.ts.map +1 -0
  24. package/dist/agent/backends/index.js +6 -0
  25. package/dist/agent/backends/index.js.map +1 -0
  26. package/dist/agent/backends/openai.d.ts +12 -0
  27. package/dist/agent/backends/openai.d.ts.map +1 -0
  28. package/dist/agent/backends/openai.js +15 -0
  29. package/dist/agent/backends/openai.js.map +1 -0
  30. package/dist/agent/backends/openai_compatible.d.ts +17 -0
  31. package/dist/agent/backends/openai_compatible.d.ts.map +1 -0
  32. package/dist/agent/backends/openai_compatible.js +95 -0
  33. package/dist/agent/backends/openai_compatible.js.map +1 -0
  34. package/dist/agent/backends/types.d.ts +49 -0
  35. package/dist/agent/backends/types.d.ts.map +1 -0
  36. package/dist/agent/backends/types.js +2 -0
  37. package/dist/agent/backends/types.js.map +1 -0
  38. package/dist/agent/commands/clipboard.d.ts +3 -0
  39. package/dist/agent/commands/clipboard.d.ts.map +1 -0
  40. package/dist/agent/commands/clipboard.js +72 -0
  41. package/dist/agent/commands/clipboard.js.map +1 -0
  42. package/dist/agent/commands/config.d.ts +3 -0
  43. package/dist/agent/commands/config.d.ts.map +1 -0
  44. package/dist/agent/commands/config.js +120 -0
  45. package/dist/agent/commands/config.js.map +1 -0
  46. package/dist/agent/commands/debug.d.ts +3 -0
  47. package/dist/agent/commands/debug.d.ts.map +1 -0
  48. package/dist/agent/commands/debug.js +23 -0
  49. package/dist/agent/commands/debug.js.map +1 -0
  50. package/dist/agent/commands/emulation.d.ts +3 -0
  51. package/dist/agent/commands/emulation.d.ts.map +1 -0
  52. package/dist/agent/commands/emulation.js +78 -0
  53. package/dist/agent/commands/emulation.js.map +1 -0
  54. package/dist/agent/commands/execution.d.ts +3 -0
  55. package/dist/agent/commands/execution.d.ts.map +1 -0
  56. package/dist/agent/commands/execution.js +8 -0
  57. package/dist/agent/commands/execution.js.map +1 -0
  58. package/dist/agent/commands/help.d.ts +3 -0
  59. package/dist/agent/commands/help.d.ts.map +1 -0
  60. package/dist/agent/commands/help.js +19 -0
  61. package/dist/agent/commands/help.js.map +1 -0
  62. package/dist/agent/commands/history.d.ts +3 -0
  63. package/dist/agent/commands/history.d.ts.map +1 -0
  64. package/dist/agent/commands/history.js +12 -0
  65. package/dist/agent/commands/history.js.map +1 -0
  66. package/dist/agent/commands/index.d.ts +4 -0
  67. package/dist/agent/commands/index.d.ts.map +1 -0
  68. package/dist/agent/commands/index.js +19 -0
  69. package/dist/agent/commands/index.js.map +1 -0
  70. package/dist/agent/commands/model.d.ts +3 -0
  71. package/dist/agent/commands/model.d.ts.map +1 -0
  72. package/dist/agent/commands/model.js +10 -0
  73. package/dist/agent/commands/model.js.map +1 -0
  74. package/dist/agent/commands/models.d.ts +3 -0
  75. package/dist/agent/commands/models.d.ts.map +1 -0
  76. package/dist/agent/commands/models.js +110 -0
  77. package/dist/agent/commands/models.js.map +1 -0
  78. package/dist/agent/commands/permissions.d.ts +3 -0
  79. package/dist/agent/commands/permissions.d.ts.map +1 -0
  80. package/dist/agent/commands/permissions.js +58 -0
  81. package/dist/agent/commands/permissions.js.map +1 -0
  82. package/dist/agent/commands/retry.d.ts +3 -0
  83. package/dist/agent/commands/retry.d.ts.map +1 -0
  84. package/dist/agent/commands/retry.js +8 -0
  85. package/dist/agent/commands/retry.js.map +1 -0
  86. package/dist/agent/commands/shell.d.ts +4 -0
  87. package/dist/agent/commands/shell.d.ts.map +1 -0
  88. package/dist/agent/commands/shell.js +66 -0
  89. package/dist/agent/commands/shell.js.map +1 -0
  90. package/dist/agent/commands/skills.d.ts +3 -0
  91. package/dist/agent/commands/skills.d.ts.map +1 -0
  92. package/dist/agent/commands/skills.js +50 -0
  93. package/dist/agent/commands/skills.js.map +1 -0
  94. package/dist/agent/commands/status.d.ts +3 -0
  95. package/dist/agent/commands/status.d.ts.map +1 -0
  96. package/dist/agent/commands/status.js +18 -0
  97. package/dist/agent/commands/status.js.map +1 -0
  98. package/dist/agent/commands/types.d.ts +70 -0
  99. package/dist/agent/commands/types.d.ts.map +1 -0
  100. package/dist/agent/commands/types.js +2 -0
  101. package/dist/agent/commands/types.js.map +1 -0
  102. package/dist/agent/factory.d.ts +13 -0
  103. package/dist/agent/factory.d.ts.map +1 -0
  104. package/dist/agent/factory.js +46 -0
  105. package/dist/agent/factory.js.map +1 -0
  106. package/dist/agent/index.d.ts +14 -0
  107. package/dist/agent/index.d.ts.map +1 -0
  108. package/dist/agent/index.js +10 -0
  109. package/dist/agent/index.js.map +1 -0
  110. package/dist/agent/runtime/capabilities.d.ts +7 -0
  111. package/dist/agent/runtime/capabilities.d.ts.map +1 -0
  112. package/dist/agent/runtime/capabilities.js +8 -0
  113. package/dist/agent/runtime/capabilities.js.map +1 -0
  114. package/dist/agent/runtime/memory.d.ts +13 -0
  115. package/dist/agent/runtime/memory.d.ts.map +1 -0
  116. package/dist/agent/runtime/memory.js +13 -0
  117. package/dist/agent/runtime/memory.js.map +1 -0
  118. package/dist/agent/runtime/policy.d.ts +22 -0
  119. package/dist/agent/runtime/policy.d.ts.map +1 -0
  120. package/dist/agent/runtime/policy.js +29 -0
  121. package/dist/agent/runtime/policy.js.map +1 -0
  122. package/dist/agent/runtime/session.d.ts +11 -0
  123. package/dist/agent/runtime/session.d.ts.map +1 -0
  124. package/dist/agent/runtime/session.js +10 -0
  125. package/dist/agent/runtime/session.js.map +1 -0
  126. package/dist/agent/runtime/tracing.d.ts +13 -0
  127. package/dist/agent/runtime/tracing.d.ts.map +1 -0
  128. package/dist/agent/runtime/tracing.js +6 -0
  129. package/dist/agent/runtime/tracing.js.map +1 -0
  130. package/dist/agent/tools/file.d.ts +5 -0
  131. package/dist/agent/tools/file.d.ts.map +1 -0
  132. package/dist/agent/tools/file.js +162 -0
  133. package/dist/agent/tools/file.js.map +1 -0
  134. package/dist/agent/tools/index.d.ts +13 -0
  135. package/dist/agent/tools/index.d.ts.map +1 -0
  136. package/dist/agent/tools/index.js +34 -0
  137. package/dist/agent/tools/index.js.map +1 -0
  138. package/dist/agent/tools/search.d.ts +3 -0
  139. package/dist/agent/tools/search.d.ts.map +1 -0
  140. package/dist/agent/tools/search.js +124 -0
  141. package/dist/agent/tools/search.js.map +1 -0
  142. package/dist/agent/tools/shell.d.ts +3 -0
  143. package/dist/agent/tools/shell.d.ts.map +1 -0
  144. package/dist/agent/tools/shell.js +60 -0
  145. package/dist/agent/tools/shell.js.map +1 -0
  146. package/dist/agent/tools/skills.d.ts +3 -0
  147. package/dist/agent/tools/skills.d.ts.map +1 -0
  148. package/dist/agent/tools/skills.js +27 -0
  149. package/dist/agent/tools/skills.js.map +1 -0
  150. package/dist/agent/tools/types.d.ts +8 -0
  151. package/dist/agent/tools/types.d.ts.map +1 -0
  152. package/dist/agent/tools/types.js +2 -0
  153. package/dist/agent/tools/types.js.map +1 -0
  154. package/dist/agent/tools/zerg.d.ts +3 -0
  155. package/dist/agent/tools/zerg.d.ts.map +1 -0
  156. package/dist/agent/tools/zerg.js +47 -0
  157. package/dist/agent/tools/zerg.js.map +1 -0
  158. package/dist/cli.d.ts +3 -0
  159. package/dist/cli.d.ts.map +1 -0
  160. package/dist/cli.js +75 -0
  161. package/dist/cli.js.map +1 -0
  162. package/dist/components/FullScreen.d.ts +28 -0
  163. package/dist/components/FullScreen.d.ts.map +1 -0
  164. package/dist/components/FullScreen.js +40 -0
  165. package/dist/components/FullScreen.js.map +1 -0
  166. package/dist/components/Header.d.ts +10 -0
  167. package/dist/components/Header.d.ts.map +1 -0
  168. package/dist/components/Header.js +14 -0
  169. package/dist/components/Header.js.map +1 -0
  170. package/dist/components/InputArea.d.ts +24 -0
  171. package/dist/components/InputArea.d.ts.map +1 -0
  172. package/dist/components/InputArea.js +476 -0
  173. package/dist/components/InputArea.js.map +1 -0
  174. package/dist/components/MessageList.d.ts +12 -0
  175. package/dist/components/MessageList.d.ts.map +1 -0
  176. package/dist/components/MessageList.js +9 -0
  177. package/dist/components/MessageList.js.map +1 -0
  178. package/dist/components/StatusBar.d.ts +18 -0
  179. package/dist/components/StatusBar.d.ts.map +1 -0
  180. package/dist/components/StatusBar.js +21 -0
  181. package/dist/components/StatusBar.js.map +1 -0
  182. package/dist/components/index.d.ts +6 -0
  183. package/dist/components/index.d.ts.map +1 -0
  184. package/dist/components/index.js +7 -0
  185. package/dist/components/index.js.map +1 -0
  186. package/dist/config/types.d.ts +12 -0
  187. package/dist/config/types.d.ts.map +1 -0
  188. package/dist/config/types.js +2 -0
  189. package/dist/config/types.js.map +1 -0
  190. package/dist/config.d.ts +28 -0
  191. package/dist/config.d.ts.map +1 -0
  192. package/dist/config.js +155 -0
  193. package/dist/config.js.map +1 -0
  194. package/dist/debug/logger.d.ts +2 -0
  195. package/dist/debug/logger.d.ts.map +1 -0
  196. package/dist/debug/logger.js +15 -0
  197. package/dist/debug/logger.js.map +1 -0
  198. package/dist/emulation/catalog.d.ts +4 -0
  199. package/dist/emulation/catalog.d.ts.map +1 -0
  200. package/dist/emulation/catalog.js +68 -0
  201. package/dist/emulation/catalog.js.map +1 -0
  202. package/dist/emulation/trace_style.d.ts +3 -0
  203. package/dist/emulation/trace_style.d.ts.map +1 -0
  204. package/dist/emulation/trace_style.js +10 -0
  205. package/dist/emulation/trace_style.js.map +1 -0
  206. package/dist/emulation/types.d.ts +8 -0
  207. package/dist/emulation/types.d.ts.map +1 -0
  208. package/dist/emulation/types.js +2 -0
  209. package/dist/emulation/types.js.map +1 -0
  210. package/dist/skills/index.d.ts +5 -0
  211. package/dist/skills/index.d.ts.map +1 -0
  212. package/dist/skills/index.js +36 -0
  213. package/dist/skills/index.js.map +1 -0
  214. package/dist/skills/loader.d.ts +3 -0
  215. package/dist/skills/loader.d.ts.map +1 -0
  216. package/dist/skills/loader.js +137 -0
  217. package/dist/skills/loader.js.map +1 -0
  218. package/dist/skills/registry.d.ts +3 -0
  219. package/dist/skills/registry.d.ts.map +1 -0
  220. package/dist/skills/registry.js +5 -0
  221. package/dist/skills/registry.js.map +1 -0
  222. package/dist/skills/types.d.ts +11 -0
  223. package/dist/skills/types.d.ts.map +1 -0
  224. package/dist/skills/types.js +2 -0
  225. package/dist/skills/types.js.map +1 -0
  226. package/dist/types.d.ts +93 -0
  227. package/dist/types.d.ts.map +1 -0
  228. package/dist/types.js +5 -0
  229. package/dist/types.js.map +1 -0
  230. package/dist/ui/core/factory.d.ts +4 -0
  231. package/dist/ui/core/factory.d.ts.map +1 -0
  232. package/dist/ui/core/factory.js +7 -0
  233. package/dist/ui/core/factory.js.map +1 -0
  234. package/dist/ui/core/index.d.ts +5 -0
  235. package/dist/ui/core/index.d.ts.map +1 -0
  236. package/dist/ui/core/index.js +4 -0
  237. package/dist/ui/core/index.js.map +1 -0
  238. package/dist/ui/core/input.d.ts +22 -0
  239. package/dist/ui/core/input.d.ts.map +1 -0
  240. package/dist/ui/core/input.js +15 -0
  241. package/dist/ui/core/input.js.map +1 -0
  242. package/dist/ui/core/input_segments.d.ts +19 -0
  243. package/dist/ui/core/input_segments.d.ts.map +1 -0
  244. package/dist/ui/core/input_segments.js +367 -0
  245. package/dist/ui/core/input_segments.js.map +1 -0
  246. package/dist/ui/core/input_state.d.ts +24 -0
  247. package/dist/ui/core/input_state.d.ts.map +1 -0
  248. package/dist/ui/core/input_state.js +2 -0
  249. package/dist/ui/core/input_state.js.map +1 -0
  250. package/dist/ui/core/layout_yoga.d.ts +11 -0
  251. package/dist/ui/core/layout_yoga.d.ts.map +1 -0
  252. package/dist/ui/core/layout_yoga.js +102 -0
  253. package/dist/ui/core/layout_yoga.js.map +1 -0
  254. package/dist/ui/core/style.d.ts +3 -0
  255. package/dist/ui/core/style.d.ts.map +1 -0
  256. package/dist/ui/core/style.js +37 -0
  257. package/dist/ui/core/style.js.map +1 -0
  258. package/dist/ui/core/types.d.ts +50 -0
  259. package/dist/ui/core/types.d.ts.map +1 -0
  260. package/dist/ui/core/types.js +2 -0
  261. package/dist/ui/core/types.js.map +1 -0
  262. package/dist/ui/ink/index.d.ts +2 -0
  263. package/dist/ui/ink/index.d.ts.map +1 -0
  264. package/dist/ui/ink/index.js +2 -0
  265. package/dist/ui/ink/index.js.map +1 -0
  266. package/dist/ui/ink/render.d.ts +6 -0
  267. package/dist/ui/ink/render.d.ts.map +1 -0
  268. package/dist/ui/ink/render.js +14 -0
  269. package/dist/ui/ink/render.js.map +1 -0
  270. package/dist/ui/views/app.d.ts +28 -0
  271. package/dist/ui/views/app.d.ts.map +1 -0
  272. package/dist/ui/views/app.js +59 -0
  273. package/dist/ui/views/app.js.map +1 -0
  274. package/dist/ui/views/header.d.ts +11 -0
  275. package/dist/ui/views/header.d.ts.map +1 -0
  276. package/dist/ui/views/header.js +28 -0
  277. package/dist/ui/views/header.js.map +1 -0
  278. package/dist/ui/views/input_area.d.ts +45 -0
  279. package/dist/ui/views/input_area.d.ts.map +1 -0
  280. package/dist/ui/views/input_area.js +183 -0
  281. package/dist/ui/views/input_area.js.map +1 -0
  282. package/dist/ui/views/message_list.d.ts +12 -0
  283. package/dist/ui/views/message_list.d.ts.map +1 -0
  284. package/dist/ui/views/message_list.js +381 -0
  285. package/dist/ui/views/message_list.js.map +1 -0
  286. package/dist/ui/views/status_bar.d.ts +18 -0
  287. package/dist/ui/views/status_bar.d.ts.map +1 -0
  288. package/dist/ui/views/status_bar.js +72 -0
  289. package/dist/ui/views/status_bar.js.map +1 -0
  290. package/dist/ui/vue/index.d.ts +5 -0
  291. package/dist/ui/vue/index.d.ts.map +1 -0
  292. package/dist/ui/vue/index.js +50 -0
  293. package/dist/ui/vue/index.js.map +1 -0
  294. package/dist/utils/clipboard.d.ts +2 -0
  295. package/dist/utils/clipboard.d.ts.map +1 -0
  296. package/dist/utils/clipboard.js +39 -0
  297. package/dist/utils/clipboard.js.map +1 -0
  298. package/dist/utils/clipboard_image.d.ts +2 -0
  299. package/dist/utils/clipboard_image.d.ts.map +1 -0
  300. package/dist/utils/clipboard_image.js +37 -0
  301. package/dist/utils/clipboard_image.js.map +1 -0
  302. package/dist/utils/diff.d.ts +2 -0
  303. package/dist/utils/diff.d.ts.map +1 -0
  304. package/dist/utils/diff.js +49 -0
  305. package/dist/utils/diff.js.map +1 -0
  306. package/dist/utils/image_preview.d.ts +2 -0
  307. package/dist/utils/image_preview.d.ts.map +1 -0
  308. package/dist/utils/image_preview.js +37 -0
  309. package/dist/utils/image_preview.js.map +1 -0
  310. package/dist/utils/models.d.ts +8 -0
  311. package/dist/utils/models.d.ts.map +1 -0
  312. package/dist/utils/models.js +85 -0
  313. package/dist/utils/models.js.map +1 -0
  314. package/dist/utils/shell.d.ts +4 -0
  315. package/dist/utils/shell.d.ts.map +1 -0
  316. package/dist/utils/shell.js +57 -0
  317. package/dist/utils/shell.js.map +1 -0
  318. package/dist/utils/tool_summary.d.ts +3 -0
  319. package/dist/utils/tool_summary.d.ts.map +1 -0
  320. package/dist/utils/tool_summary.js +54 -0
  321. package/dist/utils/tool_summary.js.map +1 -0
  322. package/dist/utils/tool_trace.d.ts +9 -0
  323. package/dist/utils/tool_trace.d.ts.map +1 -0
  324. package/dist/utils/tool_trace.js +183 -0
  325. package/dist/utils/tool_trace.js.map +1 -0
  326. package/package.json +41 -0
  327. package/src/App.tsx +576 -0
  328. package/src/agent/agent.ts +407 -0
  329. package/src/agent/backends/anthropic.ts +76 -0
  330. package/src/agent/backends/gemini.ts +107 -0
  331. package/src/agent/backends/inception.ts +23 -0
  332. package/src/agent/backends/index.ts +16 -0
  333. package/src/agent/backends/openai.ts +23 -0
  334. package/src/agent/backends/openai_compatible.ts +131 -0
  335. package/src/agent/backends/types.ts +59 -0
  336. package/src/agent/commands/clipboard.ts +77 -0
  337. package/src/agent/commands/config.ts +130 -0
  338. package/src/agent/commands/debug.ts +23 -0
  339. package/src/agent/commands/emulation.ts +80 -0
  340. package/src/agent/commands/execution.ts +9 -0
  341. package/src/agent/commands/help.ts +20 -0
  342. package/src/agent/commands/history.ts +13 -0
  343. package/src/agent/commands/index.ts +40 -0
  344. package/src/agent/commands/model.ts +11 -0
  345. package/src/agent/commands/models.ts +116 -0
  346. package/src/agent/commands/permissions.ts +64 -0
  347. package/src/agent/commands/retry.ts +9 -0
  348. package/src/agent/commands/shell.ts +68 -0
  349. package/src/agent/commands/skills.ts +54 -0
  350. package/src/agent/commands/status.ts +19 -0
  351. package/src/agent/commands/types.ts +78 -0
  352. package/src/agent/factory.ts +60 -0
  353. package/src/agent/index.ts +20 -0
  354. package/src/agent/runtime/capabilities.ts +6 -0
  355. package/src/agent/runtime/memory.ts +23 -0
  356. package/src/agent/runtime/policy.ts +48 -0
  357. package/src/agent/runtime/session.ts +18 -0
  358. package/src/agent/runtime/tracing.ts +23 -0
  359. package/src/agent/tools/file.ts +173 -0
  360. package/src/agent/tools/index.ts +46 -0
  361. package/src/agent/tools/search.ts +137 -0
  362. package/src/agent/tools/shell.ts +65 -0
  363. package/src/agent/tools/skills.ts +28 -0
  364. package/src/agent/tools/types.ts +10 -0
  365. package/src/agent/tools/zerg.ts +50 -0
  366. package/src/cli.tsx +80 -0
  367. package/src/components/FullScreen.tsx +73 -0
  368. package/src/components/Header.tsx +27 -0
  369. package/src/components/InputArea.tsx +551 -0
  370. package/src/components/MessageList.tsx +25 -0
  371. package/src/components/StatusBar.tsx +49 -0
  372. package/src/components/index.tsx +6 -0
  373. package/src/config/types.ts +11 -0
  374. package/src/config.ts +178 -0
  375. package/src/debug/logger.ts +14 -0
  376. package/src/emulation/README.md +24 -0
  377. package/src/emulation/catalog.ts +82 -0
  378. package/src/emulation/trace_style.ts +8 -0
  379. package/src/emulation/types.ts +7 -0
  380. package/src/skills/index.ts +36 -0
  381. package/src/skills/loader.ts +135 -0
  382. package/src/skills/registry.ts +6 -0
  383. package/src/skills/types.ts +10 -0
  384. package/src/types.ts +83 -0
  385. package/src/ui/README.md +44 -0
  386. package/src/ui/core/factory.ts +9 -0
  387. package/src/ui/core/index.ts +4 -0
  388. package/src/ui/core/input.ts +38 -0
  389. package/src/ui/core/input_segments.ts +375 -0
  390. package/src/ui/core/input_state.ts +17 -0
  391. package/src/ui/core/layout_yoga.ts +122 -0
  392. package/src/ui/core/style.ts +38 -0
  393. package/src/ui/core/types.ts +53 -0
  394. package/src/ui/ink/index.tsx +1 -0
  395. package/src/ui/ink/render.tsx +49 -0
  396. package/src/ui/views/app.ts +99 -0
  397. package/src/ui/views/header.ts +42 -0
  398. package/src/ui/views/input_area.ts +244 -0
  399. package/src/ui/views/message_list.ts +427 -0
  400. package/src/ui/views/status_bar.ts +104 -0
  401. package/src/ui/vue/index.ts +53 -0
  402. package/src/utils/clipboard.ts +39 -0
  403. package/src/utils/clipboard_image.ts +40 -0
  404. package/src/utils/diff.ts +52 -0
  405. package/src/utils/image_preview.ts +36 -0
  406. package/src/utils/models.ts +98 -0
  407. package/src/utils/shell.ts +63 -0
  408. package/src/utils/tool_summary.ts +56 -0
  409. package/src/utils/tool_trace.ts +206 -0
  410. package/tsconfig.json +22 -0
  411. package/vite.config.ts +363 -0
@@ -0,0 +1,407 @@
1
+ // Standard library
2
+ import { existsSync, readFileSync } from 'fs';
3
+ import { extname } from 'path';
4
+
5
+ // Local
6
+ import { Message, ToolCall, AgentEvent } from '../types.js';
7
+ import { AnthropicBackend, AgentBackend, BackendRequest, BackendResponse, ContentBlock, LlmMessage, RequestContentBlock, TokenUsage } from './backends/index.js';
8
+ import { AllowAllPolicy, Policy } from './runtime/policy.js';
9
+ import { NoopTracer, Tracer } from './runtime/tracing.js';
10
+ import { defaultTools, executeTool, getToolDefinitions, getTool } from './tools/index.js';
11
+
12
+ // --- Types ---
13
+
14
+ export interface AgentConfig {
15
+ model?: string;
16
+ apiKey?: string;
17
+ apiEndpoint?: string;
18
+ maxTokens?: number;
19
+ maxIterations?: number;
20
+ tools?: typeof defaultTools;
21
+ systemPrompt?: string;
22
+ backend?: AgentBackend;
23
+ policy?: Policy;
24
+ tracer?: Tracer;
25
+ }
26
+
27
+ export class AgentError extends Error {
28
+ constructor(message: string, public code?: string) {
29
+ super(message);
30
+ this.name = 'AgentError';
31
+ }
32
+ }
33
+
34
+ export type EventHandler = (event: AgentEvent) => void;
35
+
36
+ // --- Agent Class ---
37
+
38
+ export class Agent {
39
+ private config: Required<AgentConfig>;
40
+ private eventHandlers: Set<EventHandler> = new Set();
41
+ private backend: AgentBackend;
42
+ private policy: Policy;
43
+ private tracer: Tracer;
44
+ private streamChunkSize = 32;
45
+
46
+ constructor(config: AgentConfig = {}) {
47
+ const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY || '';
48
+
49
+ this.config = {
50
+ model: config.model || 'claude-opus-4-20250514',
51
+ apiKey,
52
+ apiEndpoint: config.apiEndpoint || 'https://api.anthropic.com/v1/messages',
53
+ maxTokens: config.maxTokens || 4096,
54
+ maxIterations: config.maxIterations || 10,
55
+ tools: config.tools || defaultTools,
56
+ systemPrompt: config.systemPrompt || this.getDefaultSystemPrompt(),
57
+ backend: config.backend || new AnthropicBackend({ apiKey, apiEndpoint: config.apiEndpoint }),
58
+ policy: config.policy || new AllowAllPolicy(),
59
+ tracer: config.tracer || new NoopTracer()
60
+ };
61
+
62
+ this.backend = this.config.backend;
63
+ this.policy = this.config.policy;
64
+ this.tracer = this.config.tracer;
65
+ }
66
+
67
+ hasApiKey(): boolean {
68
+ return !!this.config.apiKey && this.config.apiKey.length > 0;
69
+ }
70
+
71
+ private getDefaultSystemPrompt(): string {
72
+ return `You are ZTC (Zerg Terminal Client), an AI assistant that helps users interact with the Zerg continual AI system and manage local development tasks.
73
+
74
+ You have access to tools for:
75
+ - Reading and writing files
76
+ - Listing directory contents
77
+ - Running shell commands
78
+ - Querying the Zerg system
79
+
80
+ Be concise and helpful. When using tools, explain what you're doing briefly. If a task requires multiple steps, proceed through them systematically.`;
81
+ }
82
+
83
+ // Event handling
84
+ on(handler: EventHandler): () => void {
85
+ this.eventHandlers.add(handler);
86
+ return () => this.eventHandlers.delete(handler);
87
+ }
88
+
89
+ private emit(event: AgentEvent): void {
90
+ for (const handler of this.eventHandlers) {
91
+ handler(event);
92
+ }
93
+ }
94
+
95
+ // Convert messages to API format
96
+ private formatMessages(messages: Message[]): LlmMessage[] {
97
+ return messages
98
+ .filter((m): m is Message & { role: 'user' | 'assistant' } => m.role === 'user' || m.role === 'assistant')
99
+ .map(m => ({
100
+ role: m.role,
101
+ content: m.role === 'user' ? this.buildContentBlocks(m.content) : m.content
102
+ }));
103
+ }
104
+
105
+ private contentLength(content: string | RequestContentBlock[]): number {
106
+ if (typeof content === 'string') return content.length;
107
+ return content.reduce((sum, block) => {
108
+ if (block.type === 'text') return sum + block.text.length;
109
+ return sum + block.data.length;
110
+ }, 0);
111
+ }
112
+
113
+ private buildContentBlocks(content: string): string | RequestContentBlock[] {
114
+ const trimmed = content.trimStart();
115
+ if (trimmed.startsWith('[') && trimmed.includes('"tool_use_id"')) {
116
+ return content;
117
+ }
118
+
119
+ const imageRegex = /\[image ([^\]]+)\]/g;
120
+ let match: RegExpExecArray | null;
121
+ let cursor = 0;
122
+ const blocks: RequestContentBlock[] = [];
123
+
124
+ while ((match = imageRegex.exec(content)) !== null) {
125
+ const start = match.index;
126
+ const end = match.index + match[0].length;
127
+ if (start > cursor) {
128
+ blocks.push({ type: 'text', text: content.slice(cursor, start) });
129
+ }
130
+ const path = match[1].trim();
131
+ const imageBlock = this.loadImageBlock(path);
132
+ if (imageBlock) {
133
+ blocks.push(imageBlock);
134
+ } else {
135
+ blocks.push({ type: 'text', text: match[0] });
136
+ }
137
+ cursor = end;
138
+ }
139
+
140
+ if (blocks.length === 0) return content;
141
+ if (cursor < content.length) {
142
+ blocks.push({ type: 'text', text: content.slice(cursor) });
143
+ }
144
+
145
+ const merged: RequestContentBlock[] = [];
146
+ for (const block of blocks) {
147
+ const last = merged[merged.length - 1];
148
+ if (block.type === 'text' && last?.type === 'text') {
149
+ last.text += block.text;
150
+ continue;
151
+ }
152
+ merged.push(block);
153
+ }
154
+
155
+ const hasImage = merged.some(block => block.type === 'image');
156
+ return hasImage ? merged : content;
157
+ }
158
+
159
+ private loadImageBlock(path: string): RequestContentBlock | null {
160
+ try {
161
+ if (!existsSync(path)) return null;
162
+ const ext = extname(path).toLowerCase();
163
+ const mediaType = this.getImageMediaType(ext);
164
+ if (!mediaType) return null;
165
+ const buffer = readFileSync(path);
166
+ return {
167
+ type: 'image',
168
+ mediaType,
169
+ data: buffer.toString('base64'),
170
+ path
171
+ };
172
+ } catch {
173
+ return null;
174
+ }
175
+ }
176
+
177
+ private getImageMediaType(ext: string): string | null {
178
+ switch (ext) {
179
+ case '.png':
180
+ return 'image/png';
181
+ case '.jpg':
182
+ case '.jpeg':
183
+ return 'image/jpeg';
184
+ case '.webp':
185
+ return 'image/webp';
186
+ case '.gif':
187
+ return 'image/gif';
188
+ case '.bmp':
189
+ return 'image/bmp';
190
+ case '.tif':
191
+ case '.tiff':
192
+ return 'image/tiff';
193
+ case '.heic':
194
+ case '.heif':
195
+ return 'image/heic';
196
+ default:
197
+ return null;
198
+ }
199
+ }
200
+
201
+ // Type guards
202
+ private isTextBlock(block: ContentBlock): block is { type: 'text'; text: string } {
203
+ return block.type === 'text';
204
+ }
205
+
206
+ private isToolUseBlock(block: ContentBlock): block is { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> } {
207
+ return block.type === 'tool_use';
208
+ }
209
+
210
+ private buildRequest(messages: Message[]): BackendRequest {
211
+ return {
212
+ model: this.config.model,
213
+ maxTokens: this.config.maxTokens,
214
+ system: this.config.systemPrompt,
215
+ messages: this.formatMessages(messages),
216
+ tools: getToolDefinitions(this.config.tools)
217
+ };
218
+ }
219
+
220
+ private estimateUsage(request: BackendRequest, response: BackendResponse): TokenUsage {
221
+ const inputChars = request.system.length + request.messages.reduce((sum, msg) => sum + this.contentLength(msg.content), 0);
222
+ const outputChars = response.content
223
+ .filter(this.isTextBlock)
224
+ .reduce((sum, block) => sum + block.text.length, 0);
225
+ const inputTokens = Math.max(1, Math.ceil(inputChars / 4));
226
+ const outputTokens = Math.max(1, Math.ceil(outputChars / 4));
227
+ return {
228
+ inputTokens,
229
+ outputTokens,
230
+ totalTokens: inputTokens + outputTokens,
231
+ estimated: true
232
+ };
233
+ }
234
+
235
+ private mergeUsage(current: TokenUsage | null, next: TokenUsage): TokenUsage {
236
+ if (!current) return next;
237
+ return {
238
+ inputTokens: current.inputTokens + next.inputTokens,
239
+ outputTokens: current.outputTokens + next.outputTokens,
240
+ totalTokens: current.totalTokens + next.totalTokens,
241
+ estimated: current.estimated || next.estimated
242
+ };
243
+ }
244
+
245
+ private async emitStreamText(text: string): Promise<void> {
246
+ this.emit({ type: 'stream_start' });
247
+ for (let i = 0; i < text.length; i += this.streamChunkSize) {
248
+ const chunk = text.slice(i, i + this.streamChunkSize);
249
+ this.emit({ type: 'stream_delta', content: chunk });
250
+ await new Promise(resolve => setTimeout(resolve, 10));
251
+ }
252
+ this.emit({ type: 'stream_end' });
253
+ }
254
+
255
+ // Main execution loop
256
+ async run(messages: Message[]): Promise<{ content: string; toolCalls: ToolCall[]; usage?: TokenUsage }> {
257
+ if (!this.hasApiKey()) {
258
+ throw new AgentError('No API key configured. Use /config key <key> to set one.', 'NO_API_KEY');
259
+ }
260
+
261
+ const allToolCalls: ToolCall[] = [];
262
+ let iterations = 0;
263
+ let finalContent = '';
264
+ let totalUsage: TokenUsage | null = null;
265
+
266
+ while (iterations < this.config.maxIterations) {
267
+ iterations++;
268
+ this.emit({ type: 'thinking_start' });
269
+
270
+ try {
271
+ // Call the API
272
+ const request = this.buildRequest(messages);
273
+ this.tracer.event({ type: 'api_request', timestamp: new Date() });
274
+ const response = await this.callAPI(request);
275
+ this.tracer.event({ type: 'api_response', timestamp: new Date(), data: { stopReason: response.stopReason } });
276
+ this.emit({ type: 'thinking_end' });
277
+
278
+ const usage = response.usage ?? this.estimateUsage(request, response);
279
+ totalUsage = this.mergeUsage(totalUsage, usage);
280
+ this.emit({ type: 'token_usage', usage: totalUsage });
281
+
282
+ // Check for tool use
283
+ const toolUseBlocks = response.content.filter(this.isToolUseBlock);
284
+
285
+ if (toolUseBlocks.length === 0) {
286
+ // No tools, extract text and finish
287
+ const textBlocks = response.content.filter(this.isTextBlock);
288
+ finalContent = textBlocks.map(b => b.text).join('\n');
289
+ await this.emitStreamText(finalContent);
290
+ break;
291
+ }
292
+
293
+ // Execute tools
294
+ const toolResults: Array<{ tool_use_id: string; content: string }> = [];
295
+
296
+ for (const toolBlock of toolUseBlocks) {
297
+ const toolCall: ToolCall = {
298
+ id: toolBlock.id,
299
+ name: toolBlock.name,
300
+ args: toolBlock.input,
301
+ status: 'running',
302
+ startedAt: new Date()
303
+ };
304
+ allToolCalls.push(toolCall);
305
+
306
+ const tool = getTool(toolBlock.name, this.config.tools);
307
+ const policyDecision = this.policy.evaluateTool({
308
+ name: toolBlock.name,
309
+ args: toolBlock.input,
310
+ capabilities: tool?.capabilities || []
311
+ });
312
+
313
+ if (!policyDecision.allowed) {
314
+ const reason = policyDecision.reason || 'Policy denied tool execution';
315
+ toolCall.status = 'error';
316
+ toolCall.error = reason;
317
+ toolCall.completedAt = new Date();
318
+ toolResults.push({ tool_use_id: toolBlock.id, content: `Error: ${reason}` });
319
+ this.emit({ type: 'tool_error', tool: toolBlock.name, error: reason });
320
+ this.tracer.event({
321
+ type: 'policy_denied',
322
+ timestamp: new Date(),
323
+ data: { tool: toolBlock.name, reason }
324
+ });
325
+ continue;
326
+ }
327
+
328
+ this.tracer.event({
329
+ type: 'tool_start',
330
+ timestamp: new Date(),
331
+ data: { tool: toolBlock.name }
332
+ });
333
+ this.emit({ type: 'tool_start', tool: toolBlock.name, args: toolBlock.input });
334
+
335
+ try {
336
+ const result = await executeTool(
337
+ toolBlock.name,
338
+ toolBlock.input,
339
+ this.config.tools
340
+ );
341
+
342
+ toolCall.status = 'complete';
343
+ toolCall.result = result;
344
+ toolCall.completedAt = new Date();
345
+
346
+ toolResults.push({ tool_use_id: toolBlock.id, content: result });
347
+ this.emit({ type: 'tool_end', tool: toolBlock.name, result });
348
+ this.tracer.event({
349
+ type: 'tool_end',
350
+ timestamp: new Date(),
351
+ data: { tool: toolBlock.name }
352
+ });
353
+ } catch (err) {
354
+ const error = (err as Error).message;
355
+ toolCall.status = 'error';
356
+ toolCall.error = error;
357
+ toolCall.completedAt = new Date();
358
+
359
+ toolResults.push({ tool_use_id: toolBlock.id, content: `Error: ${error}` });
360
+ this.emit({ type: 'tool_error', tool: toolBlock.name, error });
361
+ this.tracer.event({
362
+ type: 'tool_error',
363
+ timestamp: new Date(),
364
+ data: { tool: toolBlock.name, error }
365
+ });
366
+ }
367
+ }
368
+
369
+ // Add assistant message with tool use
370
+ const textContent = response.content
371
+ .filter(this.isTextBlock)
372
+ .map(b => b.text)
373
+ .join('\n');
374
+
375
+ messages.push({
376
+ id: `assistant_${Date.now()}`,
377
+ role: 'assistant',
378
+ content: textContent || '[Using tools...]',
379
+ timestamp: new Date(),
380
+ toolCalls: allToolCalls.slice(-toolUseBlocks.length)
381
+ });
382
+
383
+ // Add tool results as user message (API format)
384
+ messages.push({
385
+ id: `tool_${Date.now()}`,
386
+ role: 'user',
387
+ content: JSON.stringify(toolResults),
388
+ timestamp: new Date()
389
+ });
390
+
391
+ } catch (err) {
392
+ const error = (err as Error).message;
393
+ this.emit({ type: 'error', error });
394
+ throw err;
395
+ }
396
+ }
397
+
398
+ return { content: finalContent, toolCalls: allToolCalls, usage: totalUsage || undefined };
399
+ }
400
+
401
+ // API call
402
+ private async callAPI(request: BackendRequest): Promise<BackendResponse> {
403
+ return this.backend.generate(request);
404
+ }
405
+ }
406
+
407
+ export default Agent;
@@ -0,0 +1,76 @@
1
+ import { AgentBackend, BackendRequest, BackendResponse } from './types.js';
2
+
3
+ interface AnthropicBackendConfig {
4
+ apiKey: string;
5
+ apiEndpoint?: string;
6
+ }
7
+
8
+ interface AnthropicResponse {
9
+ content: BackendResponse['content'];
10
+ stop_reason: string;
11
+ usage?: {
12
+ input_tokens?: number;
13
+ output_tokens?: number;
14
+ };
15
+ }
16
+
17
+ export class AnthropicBackend implements AgentBackend {
18
+ private apiKey: string;
19
+ private apiEndpoint: string;
20
+
21
+ constructor(config: AnthropicBackendConfig) {
22
+ this.apiKey = config.apiKey;
23
+ this.apiEndpoint = config.apiEndpoint || 'https://api.anthropic.com/v1/messages';
24
+ }
25
+
26
+ async generate(request: BackendRequest): Promise<BackendResponse> {
27
+ const body = {
28
+ model: request.model,
29
+ max_tokens: request.maxTokens,
30
+ system: request.system,
31
+ messages: request.messages.map(message => ({
32
+ role: message.role,
33
+ content: typeof message.content === 'string'
34
+ ? message.content
35
+ : message.content.map(block => (
36
+ block.type === 'text'
37
+ ? { type: 'text', text: block.text }
38
+ : { type: 'image', source: { type: 'base64', media_type: block.mediaType, data: block.data } }
39
+ ))
40
+ })),
41
+ tools: request.tools.map(t => ({
42
+ name: t.name,
43
+ description: t.description,
44
+ input_schema: t.parameters
45
+ }))
46
+ };
47
+
48
+ const response = await fetch(this.apiEndpoint, {
49
+ method: 'POST',
50
+ headers: {
51
+ 'Content-Type': 'application/json',
52
+ 'x-api-key': this.apiKey,
53
+ 'anthropic-version': '2023-06-01'
54
+ },
55
+ body: JSON.stringify(body)
56
+ });
57
+
58
+ if (!response.ok) {
59
+ const errorText = await response.text();
60
+ throw new Error(`API error (${response.status}): ${errorText}`);
61
+ }
62
+
63
+ const data = await response.json() as AnthropicResponse;
64
+ const inputTokens = data.usage?.input_tokens ?? 0;
65
+ const outputTokens = data.usage?.output_tokens ?? 0;
66
+ return {
67
+ content: data.content,
68
+ stopReason: data.stop_reason,
69
+ usage: data.usage ? {
70
+ inputTokens,
71
+ outputTokens,
72
+ totalTokens: inputTokens + outputTokens
73
+ } : undefined
74
+ };
75
+ }
76
+ }
@@ -0,0 +1,107 @@
1
+ import { AgentBackend, BackendRequest, BackendResponse, ContentBlock } from './types.js';
2
+
3
+ interface GeminiConfig {
4
+ apiKey: string;
5
+ apiEndpoint?: string;
6
+ }
7
+
8
+ interface GeminiCandidate {
9
+ content?: {
10
+ parts?: Array<{
11
+ text?: string;
12
+ functionCall?: {
13
+ name?: string;
14
+ args?: Record<string, unknown>;
15
+ };
16
+ }>;
17
+ };
18
+ finishReason?: string;
19
+ }
20
+
21
+ interface GeminiResponse {
22
+ candidates?: GeminiCandidate[];
23
+ usageMetadata?: {
24
+ promptTokenCount?: number;
25
+ candidatesTokenCount?: number;
26
+ totalTokenCount?: number;
27
+ };
28
+ }
29
+
30
+ export class GeminiBackend implements AgentBackend {
31
+ private apiKey: string;
32
+ private apiEndpoint: string;
33
+
34
+ constructor(config: GeminiConfig) {
35
+ this.apiKey = config.apiKey;
36
+ this.apiEndpoint = config.apiEndpoint || 'https://generativelanguage.googleapis.com/v1beta/models';
37
+ }
38
+
39
+ async generate(request: BackendRequest): Promise<BackendResponse> {
40
+ const url = `${this.apiEndpoint}/${encodeURIComponent(request.model)}:generateContent?key=${this.apiKey}`;
41
+ const mapParts = (content: BackendRequest['messages'][number]['content']) => {
42
+ if (typeof content === 'string') {
43
+ return [{ text: content }];
44
+ }
45
+ return content.map(block => {
46
+ if (block.type === 'text') {
47
+ return { text: block.text };
48
+ }
49
+ return { inlineData: { mimeType: block.mediaType, data: block.data } };
50
+ });
51
+ };
52
+ const body = {
53
+ systemInstruction: { parts: [{ text: request.system }] },
54
+ contents: request.messages.map(m => ({
55
+ role: m.role === 'assistant' ? 'model' : 'user',
56
+ parts: mapParts(m.content)
57
+ })),
58
+ tools: [{
59
+ functionDeclarations: request.tools.map(t => ({
60
+ name: t.name,
61
+ description: t.description,
62
+ parameters: t.parameters
63
+ }))
64
+ }]
65
+ };
66
+
67
+ const response = await fetch(url, {
68
+ method: 'POST',
69
+ headers: { 'Content-Type': 'application/json' },
70
+ body: JSON.stringify(body)
71
+ });
72
+
73
+ if (!response.ok) {
74
+ const errorText = await response.text();
75
+ throw new Error(`API error (${response.status}): ${errorText}`);
76
+ }
77
+
78
+ const data = await response.json() as GeminiResponse;
79
+ const candidate = data.candidates?.[0];
80
+ const blocks: ContentBlock[] = [];
81
+ const parts = candidate?.content?.parts || [];
82
+
83
+ for (const part of parts) {
84
+ if (part.text) {
85
+ blocks.push({ type: 'text', text: part.text });
86
+ }
87
+ if (part.functionCall?.name) {
88
+ blocks.push({
89
+ type: 'tool_use',
90
+ id: `${part.functionCall.name}_${Date.now()}`,
91
+ name: part.functionCall.name,
92
+ input: part.functionCall.args || {}
93
+ });
94
+ }
95
+ }
96
+
97
+ const inputTokens = data.usageMetadata?.promptTokenCount ?? 0;
98
+ const outputTokens = data.usageMetadata?.candidatesTokenCount ?? 0;
99
+ const totalTokens = data.usageMetadata?.totalTokenCount ?? (inputTokens + outputTokens);
100
+
101
+ return {
102
+ content: blocks,
103
+ stopReason: candidate?.finishReason || 'unknown',
104
+ usage: data.usageMetadata ? { inputTokens, outputTokens, totalTokens } : undefined
105
+ };
106
+ }
107
+ }
@@ -0,0 +1,23 @@
1
+ import { OpenAICompatibleBackend } from './openai_compatible.js';
2
+ import { AgentBackend, BackendRequest, BackendResponse } from './types.js';
3
+
4
+ interface InceptionConfig {
5
+ apiKey: string;
6
+ apiEndpoint?: string;
7
+ }
8
+
9
+ export class InceptionBackend implements AgentBackend {
10
+ private backend: OpenAICompatibleBackend;
11
+
12
+ constructor(config: InceptionConfig) {
13
+ this.backend = new OpenAICompatibleBackend({
14
+ apiKey: config.apiKey,
15
+ baseUrl: config.apiEndpoint || 'https://api.inceptionlabs.ai/v1',
16
+ apiPath: '/chat/completions'
17
+ });
18
+ }
19
+
20
+ async generate(request: BackendRequest): Promise<BackendResponse> {
21
+ return this.backend.generate(request);
22
+ }
23
+ }
@@ -0,0 +1,16 @@
1
+ export { AnthropicBackend } from './anthropic.js';
2
+ export { OpenAIBackend } from './openai.js';
3
+ export { OpenAICompatibleBackend } from './openai_compatible.js';
4
+ export { InceptionBackend } from './inception.js';
5
+ export { GeminiBackend } from './gemini.js';
6
+ export type {
7
+ AgentBackend,
8
+ BackendRequest,
9
+ BackendResponse,
10
+ ContentBlock,
11
+ TextBlock,
12
+ ToolUseBlock,
13
+ LlmMessage,
14
+ RequestContentBlock,
15
+ TokenUsage
16
+ } from './types.js';
@@ -0,0 +1,23 @@
1
+ import { OpenAICompatibleBackend } from './openai_compatible.js';
2
+ import { AgentBackend, BackendRequest, BackendResponse } from './types.js';
3
+
4
+ interface OpenAIConfig {
5
+ apiKey: string;
6
+ apiEndpoint?: string;
7
+ }
8
+
9
+ export class OpenAIBackend implements AgentBackend {
10
+ private backend: OpenAICompatibleBackend;
11
+
12
+ constructor(config: OpenAIConfig) {
13
+ this.backend = new OpenAICompatibleBackend({
14
+ apiKey: config.apiKey,
15
+ baseUrl: config.apiEndpoint || 'https://api.openai.com/v1',
16
+ apiPath: '/chat/completions'
17
+ });
18
+ }
19
+
20
+ async generate(request: BackendRequest): Promise<BackendResponse> {
21
+ return this.backend.generate(request);
22
+ }
23
+ }