@vm0/cli 9.278.0 → 9.279.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 (230) hide show
  1. package/{agent-HUDTEGLK.js → agent-4N7ZZDFJ.js} +16 -10
  2. package/agent-4N7ZZDFJ.js.map +1 -0
  3. package/{banking-BMZONEXP.js → banking-HBODHOCJ.js} +64 -10
  4. package/banking-HBODHOCJ.js.map +1 -0
  5. package/{browser-LQP445CU.js → browser-KT5KVZY2.js} +7 -8
  6. package/browser-KT5KVZY2.js.map +1 -0
  7. package/{chat-UF7QAWUT.js → chat-6RRIXDF5.js} +29 -21
  8. package/chat-6RRIXDF5.js.map +1 -0
  9. package/chunk-4ATK3VFX.js +202 -0
  10. package/chunk-4ATK3VFX.js.map +1 -0
  11. package/chunk-4CXT7THL.js +55 -0
  12. package/chunk-4CXT7THL.js.map +1 -0
  13. package/{chunk-BRV4D3P2.js → chunk-4QGLWHVD.js} +3 -3
  14. package/chunk-4SGKKHZW.js +309 -0
  15. package/chunk-4SGKKHZW.js.map +1 -0
  16. package/{chunk-AUWSMG4F.js → chunk-52CNCL6Y.js} +5 -2
  17. package/{chunk-AUWSMG4F.js.map → chunk-52CNCL6Y.js.map} +1 -1
  18. package/chunk-5RY3DZTW.js +101 -0
  19. package/chunk-5RY3DZTW.js.map +1 -0
  20. package/chunk-AFKJ4MU3.js +105 -0
  21. package/chunk-AFKJ4MU3.js.map +1 -0
  22. package/chunk-AMLZWOJK.js +792 -0
  23. package/chunk-AMLZWOJK.js.map +1 -0
  24. package/chunk-B3U6VDOF.js +90 -0
  25. package/chunk-B3U6VDOF.js.map +1 -0
  26. package/chunk-B6RXOHA2.js +801 -0
  27. package/chunk-B6RXOHA2.js.map +1 -0
  28. package/chunk-BB6QIVAM.js +189 -0
  29. package/chunk-BB6QIVAM.js.map +1 -0
  30. package/{chunk-NDYPPVD3.js → chunk-BMQE7GWV.js} +2 -2
  31. package/chunk-BMRAUGFL.js +198 -0
  32. package/chunk-BMRAUGFL.js.map +1 -0
  33. package/{chunk-45J5VDVQ.js → chunk-BS6PZU7T.js} +2 -2
  34. package/chunk-C4LKBBIS.js +2053 -0
  35. package/chunk-C4LKBBIS.js.map +1 -0
  36. package/{chunk-QC63TUJC.js → chunk-CBNDRL4P.js} +3 -3
  37. package/{chunk-V7A6ZFHR.js → chunk-CMWQJ3XO.js} +26 -775
  38. package/chunk-CMWQJ3XO.js.map +1 -0
  39. package/{chunk-NKYACNWA.js → chunk-DUWZNPUA.js} +2 -2
  40. package/{chunk-BVCE3PAD.js → chunk-G2HB4N56.js} +2 -2
  41. package/chunk-HMH473P6.js +362 -0
  42. package/chunk-HMH473P6.js.map +1 -0
  43. package/chunk-HMUAPCDD.js +81 -0
  44. package/chunk-HMUAPCDD.js.map +1 -0
  45. package/chunk-HXIDRGW4.js +434 -0
  46. package/chunk-HXIDRGW4.js.map +1 -0
  47. package/chunk-JXWXVXOW.js +1275 -0
  48. package/chunk-JXWXVXOW.js.map +1 -0
  49. package/{chunk-32FE3MDA.js → chunk-KHPTA6UQ.js} +2 -2
  50. package/chunk-KWHNNLC5.js +31 -0
  51. package/chunk-KWHNNLC5.js.map +1 -0
  52. package/chunk-LLQCX33F.js +49 -0
  53. package/chunk-LLQCX33F.js.map +1 -0
  54. package/{chunk-E53W6UVQ.js → chunk-LO24UKAH.js} +5 -5
  55. package/chunk-LO24UKAH.js.map +1 -0
  56. package/chunk-ML33LZ5V.js +66 -0
  57. package/chunk-ML33LZ5V.js.map +1 -0
  58. package/chunk-NIG6LRRX.js +39 -0
  59. package/chunk-NIG6LRRX.js.map +1 -0
  60. package/{chunk-JAUTPXVK.js → chunk-PAULHBEP.js} +2 -2
  61. package/chunk-PO3DAXC6.js +52 -0
  62. package/chunk-PO3DAXC6.js.map +1 -0
  63. package/chunk-QQT7SBVV.js +1300 -0
  64. package/chunk-QQT7SBVV.js.map +1 -0
  65. package/{chunk-J45P5ALH.js → chunk-RAQ7DE6K.js} +2 -2
  66. package/chunk-RKOODQ77.js +194 -0
  67. package/chunk-RKOODQ77.js.map +1 -0
  68. package/{chunk-V5ZVB7RJ.js → chunk-T656XQMT.js} +7 -7
  69. package/chunk-T656XQMT.js.map +1 -0
  70. package/chunk-TDLAIIDN.js +568 -0
  71. package/chunk-TDLAIIDN.js.map +1 -0
  72. package/{chunk-A6TMOGPR.js → chunk-TQKKFLRI.js} +1416 -339
  73. package/chunk-TQKKFLRI.js.map +1 -0
  74. package/{chunk-5ZZI2LSO.js → chunk-U2PPHCTL.js} +7 -7
  75. package/{chunk-VNNPAHD3.js → chunk-UH7XK55U.js} +2 -2
  76. package/chunk-VCAMYQOI.js +31 -0
  77. package/chunk-VCAMYQOI.js.map +1 -0
  78. package/chunk-WERS62WT.js +21130 -0
  79. package/chunk-WERS62WT.js.map +1 -0
  80. package/chunk-XIZVMBW4.js +188 -0
  81. package/chunk-XIZVMBW4.js.map +1 -0
  82. package/{chunk-SVFOPAWB.js → chunk-XJXBVERS.js} +2 -2
  83. package/chunk-XQ4CXHGB.js +131 -0
  84. package/chunk-XQ4CXHGB.js.map +1 -0
  85. package/{chunk-F2AM4RWA.js → chunk-XW5M3ADB.js} +3 -3
  86. package/{chunk-F2AM4RWA.js.map → chunk-XW5M3ADB.js.map} +1 -1
  87. package/chunk-YEXLP5U7.js +64 -0
  88. package/chunk-YEXLP5U7.js.map +1 -0
  89. package/chunk-ZEFTCUFJ.js +114 -0
  90. package/chunk-ZEFTCUFJ.js.map +1 -0
  91. package/{computer-use-RRD7BCCK.js → computer-use-VG65FLDL.js} +12 -10
  92. package/computer-use-VG65FLDL.js.map +1 -0
  93. package/{connector-XX7UU6XE.js → connector-25H4SU52.js} +28 -16
  94. package/connector-25H4SU52.js.map +1 -0
  95. package/{credit-GDNNAQRO.js → credit-D3RLUW6C.js} +12 -14
  96. package/credit-D3RLUW6C.js.map +1 -0
  97. package/{developer-support-IISP5UBI.js → developer-support-NMZJG32A.js} +30 -10
  98. package/developer-support-NMZJG32A.js.map +1 -0
  99. package/{doctor-IZM2TJOH.js → doctor-MXF4RDPN.js} +17 -15
  100. package/doctor-MXF4RDPN.js.map +1 -0
  101. package/{esm-GRI4FR5B.js → esm-XLHK4LBA.js} +3 -3
  102. package/{feishu-XB7SQBSI.js → feishu-SHMTS5ZM.js} +102 -12
  103. package/feishu-SHMTS5ZM.js.map +1 -0
  104. package/{finance-OGWHKQLU.js → finance-A3QUYKGH.js} +52 -12
  105. package/finance-A3QUYKGH.js.map +1 -0
  106. package/{generate-AA2PVOYQ.js → generate-QQ6ZTCR2.js} +31 -26
  107. package/generate-QQ6ZTCR2.js.map +1 -0
  108. package/{getMachineId-bsd-UR6WEJ6T.js → getMachineId-bsd-WOC3WZM5.js} +4 -4
  109. package/{getMachineId-darwin-O3UESQMK.js → getMachineId-darwin-K35YZX2F.js} +4 -4
  110. package/{getMachineId-linux-EGNGXDN3.js → getMachineId-linux-A4QJCCBS.js} +3 -3
  111. package/{getMachineId-unsupported-EZ7SMARH.js → getMachineId-unsupported-UOQIWS5S.js} +3 -3
  112. package/{getMachineId-win-CM62ICHH.js → getMachineId-win-YJDJQYJQ.js} +4 -4
  113. package/{github-VJVIBTVF.js → github-5M3YRGDF.js} +86 -11
  114. package/github-5M3YRGDF.js.map +1 -0
  115. package/{goal-7SYVHDTK.js → goal-F6G5KOI2.js} +72 -16
  116. package/goal-F6G5KOI2.js.map +1 -0
  117. package/{host-UVQMIOBA.js → host-6UT2OW4I.js} +127 -13
  118. package/host-6UT2OW4I.js.map +1 -0
  119. package/{intro-2UYXBOHI.js → intro-HYSW634N.js} +3 -3
  120. package/{logs-PIS4X24E.js → logs-YH346I7J.js} +57 -17
  121. package/logs-YH346I7J.js.map +1 -0
  122. package/{mail-L33OSQ2R.js → mail-SC44CH54.js} +42 -11
  123. package/mail-SC44CH54.js.map +1 -0
  124. package/{maps-D5XTXU5U.js → maps-YQ62JSHO.js} +68 -14
  125. package/maps-YQ62JSHO.js.map +1 -0
  126. package/{model-ZFMRECDM.js → model-PPOIXDVZ.js} +9 -9
  127. package/model-PPOIXDVZ.js.map +1 -0
  128. package/{model-provider-EZZ2DRYZ.js → model-provider-PD7FGL7A.js} +9 -9
  129. package/model-provider-PD7FGL7A.js.map +1 -0
  130. package/package.json +2 -5
  131. package/{people-search-PFTIO2QS.js → people-search-VS5J4HME.js} +25 -9
  132. package/people-search-VS5J4HME.js.map +1 -0
  133. package/{phone-6SG5ZUNL.js → phone-YZ7TX25A.js} +93 -12
  134. package/phone-YZ7TX25A.js.map +1 -0
  135. package/{recognize-LLU6J3SW.js → recognize-XKO53YEI.js} +30 -12
  136. package/recognize-XKO53YEI.js.map +1 -0
  137. package/{resource-FGUSXS4G.js → resource-V43QBVKO.js} +25 -11
  138. package/resource-V43QBVKO.js.map +1 -0
  139. package/{scrape-BAUZ2YFD.js → scrape-PDMJI2PY.js} +25 -9
  140. package/scrape-PDMJI2PY.js.map +1 -0
  141. package/{search-DLO5RXRM.js → search-USJZ3HKX.js} +35 -15
  142. package/search-USJZ3HKX.js.map +1 -0
  143. package/{slack-CVATPKP3.js → slack-K557P6WW.js} +106 -14
  144. package/slack-K557P6WW.js.map +1 -0
  145. package/{teams-ZZYO6YIK.js → teams-HN2UOU3U.js} +93 -12
  146. package/teams-HN2UOU3U.js.map +1 -0
  147. package/{telegram-VY7T4YAR.js → telegram-YCRQFLJC.js} +104 -13
  148. package/telegram-YCRQFLJC.js.map +1 -0
  149. package/{undici-MBS5ACFE.js → undici-YESHDB4G.js} +2 -2
  150. package/{upgrade-GFA4ZUU4.js → upgrade-VVJ3KJ6V.js} +7 -8
  151. package/upgrade-VVJ3KJ6V.js.map +1 -0
  152. package/{video-STFG7BET.js → video-DNGIFKVY.js} +8 -7
  153. package/video-DNGIFKVY.js.map +1 -0
  154. package/{weather-ISJEHJWR.js → weather-4Z7OZ2TP.js} +73 -19
  155. package/weather-4Z7OZ2TP.js.map +1 -0
  156. package/{web-YN4CVHK7.js → web-C6RLBMZM.js} +8 -8
  157. package/web-C6RLBMZM.js.map +1 -0
  158. package/{web-search-PC7IECND.js → web-search-CDPWLF74.js} +25 -9
  159. package/web-search-CDPWLF74.js.map +1 -0
  160. package/{whoami-KXFXZGM6.js → whoami-VDI5345O.js} +19 -10
  161. package/whoami-VDI5345O.js.map +1 -0
  162. package/{workflow-O7YZHB7A.js → workflow-VEZ3NTPR.js} +140 -44
  163. package/workflow-VEZ3NTPR.js.map +1 -0
  164. package/zero.js +46 -46
  165. package/agent-HUDTEGLK.js.map +0 -1
  166. package/banking-BMZONEXP.js.map +0 -1
  167. package/browser-LQP445CU.js.map +0 -1
  168. package/chat-UF7QAWUT.js.map +0 -1
  169. package/chunk-2W73DZDW.js +0 -32
  170. package/chunk-2W73DZDW.js.map +0 -1
  171. package/chunk-6PN6QGIM.js +0 -11405
  172. package/chunk-6PN6QGIM.js.map +0 -1
  173. package/chunk-A6TMOGPR.js.map +0 -1
  174. package/chunk-ANOLYIPL.js +0 -10
  175. package/chunk-ANOLYIPL.js.map +0 -1
  176. package/chunk-E53W6UVQ.js.map +0 -1
  177. package/chunk-V5ZVB7RJ.js.map +0 -1
  178. package/chunk-V7A6ZFHR.js.map +0 -1
  179. package/computer-use-RRD7BCCK.js.map +0 -1
  180. package/connector-XX7UU6XE.js.map +0 -1
  181. package/credit-GDNNAQRO.js.map +0 -1
  182. package/developer-support-IISP5UBI.js.map +0 -1
  183. package/doctor-IZM2TJOH.js.map +0 -1
  184. package/feishu-XB7SQBSI.js.map +0 -1
  185. package/finance-OGWHKQLU.js.map +0 -1
  186. package/generate-AA2PVOYQ.js.map +0 -1
  187. package/github-VJVIBTVF.js.map +0 -1
  188. package/goal-7SYVHDTK.js.map +0 -1
  189. package/host-UVQMIOBA.js.map +0 -1
  190. package/logs-PIS4X24E.js.map +0 -1
  191. package/mail-L33OSQ2R.js.map +0 -1
  192. package/maps-D5XTXU5U.js.map +0 -1
  193. package/model-ZFMRECDM.js.map +0 -1
  194. package/model-provider-EZZ2DRYZ.js.map +0 -1
  195. package/people-search-PFTIO2QS.js.map +0 -1
  196. package/phone-6SG5ZUNL.js.map +0 -1
  197. package/recognize-LLU6J3SW.js.map +0 -1
  198. package/resource-FGUSXS4G.js.map +0 -1
  199. package/scrape-BAUZ2YFD.js.map +0 -1
  200. package/search-DLO5RXRM.js.map +0 -1
  201. package/slack-CVATPKP3.js.map +0 -1
  202. package/teams-ZZYO6YIK.js.map +0 -1
  203. package/telegram-VY7T4YAR.js.map +0 -1
  204. package/upgrade-GFA4ZUU4.js.map +0 -1
  205. package/video-STFG7BET.js.map +0 -1
  206. package/weather-ISJEHJWR.js.map +0 -1
  207. package/web-YN4CVHK7.js.map +0 -1
  208. package/web-search-PC7IECND.js.map +0 -1
  209. package/whoami-KXFXZGM6.js.map +0 -1
  210. package/workflow-O7YZHB7A.js.map +0 -1
  211. /package/{chunk-BRV4D3P2.js.map → chunk-4QGLWHVD.js.map} +0 -0
  212. /package/{chunk-NDYPPVD3.js.map → chunk-BMQE7GWV.js.map} +0 -0
  213. /package/{chunk-45J5VDVQ.js.map → chunk-BS6PZU7T.js.map} +0 -0
  214. /package/{chunk-QC63TUJC.js.map → chunk-CBNDRL4P.js.map} +0 -0
  215. /package/{chunk-NKYACNWA.js.map → chunk-DUWZNPUA.js.map} +0 -0
  216. /package/{chunk-BVCE3PAD.js.map → chunk-G2HB4N56.js.map} +0 -0
  217. /package/{chunk-32FE3MDA.js.map → chunk-KHPTA6UQ.js.map} +0 -0
  218. /package/{chunk-JAUTPXVK.js.map → chunk-PAULHBEP.js.map} +0 -0
  219. /package/{chunk-J45P5ALH.js.map → chunk-RAQ7DE6K.js.map} +0 -0
  220. /package/{chunk-5ZZI2LSO.js.map → chunk-U2PPHCTL.js.map} +0 -0
  221. /package/{chunk-VNNPAHD3.js.map → chunk-UH7XK55U.js.map} +0 -0
  222. /package/{chunk-SVFOPAWB.js.map → chunk-XJXBVERS.js.map} +0 -0
  223. /package/{esm-GRI4FR5B.js.map → esm-XLHK4LBA.js.map} +0 -0
  224. /package/{getMachineId-bsd-UR6WEJ6T.js.map → getMachineId-bsd-WOC3WZM5.js.map} +0 -0
  225. /package/{getMachineId-darwin-O3UESQMK.js.map → getMachineId-darwin-K35YZX2F.js.map} +0 -0
  226. /package/{getMachineId-linux-EGNGXDN3.js.map → getMachineId-linux-A4QJCCBS.js.map} +0 -0
  227. /package/{getMachineId-unsupported-EZ7SMARH.js.map → getMachineId-unsupported-UOQIWS5S.js.map} +0 -0
  228. /package/{getMachineId-win-CM62ICHH.js.map → getMachineId-win-YJDJQYJQ.js.map} +0 -0
  229. /package/{intro-2UYXBOHI.js.map → intro-HYSW634N.js.map} +0 -0
  230. /package/{undici-MBS5ACFE.js.map → undici-YESHDB4G.js.map} +0 -0
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from "node:module";
3
+ const require = __createRequire(import.meta.url);
4
+ import {
5
+ zeroComputerUseAuthorizationRequestsContract,
6
+ zeroComputerUseCommandContract,
7
+ zeroComputerUseHostsContract,
8
+ zeroComputerUsePluginCommandContract,
9
+ zeroComputerUseWriteCommandContract
10
+ } from "./chunk-AMLZWOJK.js";
11
+ import {
12
+ ApiRequestError,
13
+ cliClientHeaderApi,
14
+ getActiveToken,
15
+ getBaseUrl,
16
+ handleError,
17
+ headersWithCliClientHeaders,
18
+ initClient
19
+ } from "./chunk-U2PPHCTL.js";
20
+ import {
21
+ init_esm_shims
22
+ } from "./chunk-52CNCL6Y.js";
23
+
24
+ // src/lib/api/domains/zero-computer-use.ts
25
+ init_esm_shims();
26
+ function normalizeConfiguredUrl(value) {
27
+ return value.startsWith("http") ? value : `https://${value}`;
28
+ }
29
+ function resolveComputerUseApiBaseUrl(baseUrl) {
30
+ const override = process.env.VM0_API_BACKEND_URL;
31
+ if (override) {
32
+ return normalizeConfiguredUrl(override).replace(/\/$/, "");
33
+ }
34
+ const url = new URL(baseUrl);
35
+ if (url.hostname === "www.vm0.ai" || url.hostname === "app.vm0.ai") {
36
+ url.hostname = "api.vm0.ai";
37
+ }
38
+ return url.toString().replace(/\/$/, "");
39
+ }
40
+ function buildHeaders(token) {
41
+ const headers = {};
42
+ if (token) {
43
+ headers.Authorization = `Bearer ${token}`;
44
+ }
45
+ return headers;
46
+ }
47
+ async function getComputerUseClientConfig() {
48
+ const baseUrl = resolveComputerUseApiBaseUrl(await getBaseUrl());
49
+ const token = await getActiveToken();
50
+ if (!token) {
51
+ throw new ApiRequestError("Not authenticated", "UNAUTHORIZED", 401);
52
+ }
53
+ return {
54
+ baseUrl,
55
+ baseHeaders: buildHeaders(token),
56
+ jsonQuery: false,
57
+ api: cliClientHeaderApi
58
+ };
59
+ }
60
+ function commandBody(params) {
61
+ return {
62
+ kind: params.kind,
63
+ timeoutMs: params.timeoutMs ?? 15e3,
64
+ ...params.app ? { app: params.app } : {},
65
+ ...params.snapshotId ? { snapshotId: params.snapshotId } : {},
66
+ ...params.elementId ? { elementId: params.elementId } : {},
67
+ ...params.elementIndex !== void 0 ? { elementIndex: params.elementIndex } : {},
68
+ ...params.x !== void 0 ? { x: params.x } : {},
69
+ ...params.y !== void 0 ? { y: params.y } : {},
70
+ ...params.button ? { button: params.button } : {},
71
+ ...params.clickCount !== void 0 ? { clickCount: params.clickCount } : {},
72
+ ...params.direction ? { direction: params.direction } : {},
73
+ ...params.pages !== void 0 ? { pages: params.pages } : {},
74
+ ...params.value !== void 0 ? { value: params.value } : {},
75
+ ...params.text !== void 0 ? { text: params.text } : {},
76
+ ...params.key ? { key: params.key } : {},
77
+ ...params.action ? { action: params.action } : {}
78
+ };
79
+ }
80
+ async function createComputerUseReadCommand(params) {
81
+ const config = await getComputerUseClientConfig();
82
+ const client = initClient(zeroComputerUseCommandContract, config);
83
+ const result = await client.create({ body: commandBody(params) });
84
+ if (result.status === 200) {
85
+ return result.body;
86
+ }
87
+ handleError(result, "Failed to create computer-use command");
88
+ }
89
+ async function createComputerUseWriteCommand(params) {
90
+ const config = await getComputerUseClientConfig();
91
+ const client = initClient(zeroComputerUseWriteCommandContract, config);
92
+ const result = await client.create({ body: commandBody(params) });
93
+ if (result.status === 200) {
94
+ return result.body;
95
+ }
96
+ handleError(result, "Failed to create computer-use write command");
97
+ }
98
+ async function createComputerUsePluginCommand(params) {
99
+ const config = await getComputerUseClientConfig();
100
+ const client = initClient(zeroComputerUsePluginCommandContract, config);
101
+ const result = await client.create({ body: params });
102
+ if (result.status === 200) {
103
+ return result.body;
104
+ }
105
+ handleError(result, "Failed to create computer-use plugin command");
106
+ }
107
+ async function listComputerUseHosts() {
108
+ const config = await getComputerUseClientConfig();
109
+ const client = initClient(zeroComputerUseHostsContract, config);
110
+ const result = await client.list({});
111
+ if (result.status === 200) {
112
+ return result.body.hosts;
113
+ }
114
+ handleError(result, "Failed to list computer-use hosts");
115
+ }
116
+ async function getComputerUseCommand(commandId) {
117
+ const config = await getComputerUseClientConfig();
118
+ const client = initClient(zeroComputerUseCommandContract, config);
119
+ const result = await client.get({ params: { commandId } });
120
+ if (result.status === 200) {
121
+ return result.body;
122
+ }
123
+ handleError(result, "Failed to get computer-use command");
124
+ }
125
+ async function createComputerUseAuthorizationRequest() {
126
+ const config = await getComputerUseClientConfig();
127
+ const client = initClient(
128
+ zeroComputerUseAuthorizationRequestsContract,
129
+ config
130
+ );
131
+ const result = await client.create({ body: {} });
132
+ if (result.status === 200) {
133
+ return result.body;
134
+ }
135
+ handleError(result, "Failed to create computer-use authorization request");
136
+ }
137
+ async function fetchComputerUseScreenshot(commandId) {
138
+ const config = await getComputerUseClientConfig();
139
+ const response = await fetch(
140
+ `${config.baseUrl}/api/zero/computer-use/commands/${encodeURIComponent(
141
+ commandId
142
+ )}/screenshot`,
143
+ { headers: headersWithCliClientHeaders(config.baseHeaders) }
144
+ );
145
+ if (!response.ok) {
146
+ throw new ApiRequestError(
147
+ "Failed to download computer-use screenshot",
148
+ "REQUEST_FAILED",
149
+ response.status
150
+ );
151
+ }
152
+ const arrayBuffer = await response.arrayBuffer();
153
+ const mimeType = response.headers.get("content-type") ?? "application/octet-stream";
154
+ return { buffer: Buffer.from(arrayBuffer), mimeType };
155
+ }
156
+ async function fetchComputerUsePluginContent(commandId) {
157
+ const config = await getComputerUseClientConfig();
158
+ const response = await fetch(
159
+ `${config.baseUrl}/api/zero/computer-use/commands/${encodeURIComponent(
160
+ commandId
161
+ )}/plugin-content`,
162
+ { headers: headersWithCliClientHeaders(config.baseHeaders) }
163
+ );
164
+ if (!response.ok) {
165
+ throw new ApiRequestError(
166
+ "Failed to download computer-use plugin content",
167
+ "REQUEST_FAILED",
168
+ response.status
169
+ );
170
+ }
171
+ const arrayBuffer = await response.arrayBuffer();
172
+ const mimeType = response.headers.get("content-type") ?? "application/octet-stream";
173
+ const disposition = response.headers.get("content-disposition") ?? "";
174
+ const fileName = /filename="([^"]+)"/.exec(disposition)?.[1] ?? "plugin-content.bin";
175
+ return { buffer: Buffer.from(arrayBuffer), mimeType, fileName };
176
+ }
177
+
178
+ export {
179
+ createComputerUseReadCommand,
180
+ createComputerUseWriteCommand,
181
+ createComputerUsePluginCommand,
182
+ listComputerUseHosts,
183
+ getComputerUseCommand,
184
+ createComputerUseAuthorizationRequest,
185
+ fetchComputerUseScreenshot,
186
+ fetchComputerUsePluginContent
187
+ };
188
+ //# sourceMappingURL=chunk-XIZVMBW4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/api/domains/zero-computer-use.ts"],"sourcesContent":["import { initClient } from \"@vm0/api-contracts/contracts/trpc-contract\";\nimport type {\n ComputerUseAuthorizationRequestCreateResponse,\n ComputerUseCommandCreateResponse,\n ComputerUseCommandResponse,\n ComputerUseHost,\n ComputerUseReadCommandKind,\n ComputerUseWriteCommandKind,\n} from \"@vm0/api-contracts/contracts/zero-computer-use\";\nimport type { ComputerUseAnyPluginCallBody } from \"@vm0/api-contracts/contracts/zero-computer-use-plugins\";\nimport {\n zeroComputerUseAuthorizationRequestsContract,\n zeroComputerUseCommandContract,\n zeroComputerUseHostsContract,\n zeroComputerUsePluginCommandContract,\n zeroComputerUseWriteCommandContract,\n} from \"@vm0/api-contracts/contracts/zero-computer-use\";\nimport {\n ApiRequestError,\n getBaseUrl,\n handleError,\n} from \"../core/client-factory\";\nimport { getActiveToken } from \"../config\";\nimport {\n cliClientHeaderApi,\n headersWithCliClientHeaders,\n} from \"../client-headers\";\n\nfunction normalizeConfiguredUrl(value: string): string {\n return value.startsWith(\"http\") ? value : `https://${value}`;\n}\n\nfunction resolveComputerUseApiBaseUrl(baseUrl: string): string {\n const override = process.env.VM0_API_BACKEND_URL;\n if (override) {\n return normalizeConfiguredUrl(override).replace(/\\/$/, \"\");\n }\n\n const url = new URL(baseUrl);\n if (url.hostname === \"www.vm0.ai\" || url.hostname === \"app.vm0.ai\") {\n url.hostname = \"api.vm0.ai\";\n }\n return url.toString().replace(/\\/$/, \"\");\n}\n\nfunction buildHeaders(token?: string): Record<string, string> {\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n}\n\nasync function getComputerUseClientConfig() {\n const baseUrl = resolveComputerUseApiBaseUrl(await getBaseUrl());\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n return {\n baseUrl,\n baseHeaders: buildHeaders(token),\n jsonQuery: false as const,\n api: cliClientHeaderApi,\n };\n}\n\ninterface ComputerUseCommandParams<\n Kind extends ComputerUseReadCommandKind | ComputerUseWriteCommandKind,\n> {\n readonly kind: Kind;\n readonly app?: string;\n readonly snapshotId?: string;\n readonly elementId?: string;\n readonly elementIndex?: number;\n readonly x?: number;\n readonly y?: number;\n readonly button?: \"left\" | \"right\" | \"middle\";\n readonly clickCount?: number;\n readonly direction?: \"up\" | \"down\" | \"left\" | \"right\";\n readonly pages?: number;\n readonly value?: string;\n readonly text?: string;\n readonly key?: string;\n readonly action?: string;\n readonly timeoutMs?: number;\n}\n\nfunction commandBody<\n Kind extends ComputerUseReadCommandKind | ComputerUseWriteCommandKind,\n>(params: ComputerUseCommandParams<Kind>) {\n return {\n kind: params.kind,\n timeoutMs: params.timeoutMs ?? 15_000,\n ...(params.app ? { app: params.app } : {}),\n ...(params.snapshotId ? { snapshotId: params.snapshotId } : {}),\n ...(params.elementId ? { elementId: params.elementId } : {}),\n ...(params.elementIndex !== undefined\n ? { elementIndex: params.elementIndex }\n : {}),\n ...(params.x !== undefined ? { x: params.x } : {}),\n ...(params.y !== undefined ? { y: params.y } : {}),\n ...(params.button ? { button: params.button } : {}),\n ...(params.clickCount !== undefined\n ? { clickCount: params.clickCount }\n : {}),\n ...(params.direction ? { direction: params.direction } : {}),\n ...(params.pages !== undefined ? { pages: params.pages } : {}),\n ...(params.value !== undefined ? { value: params.value } : {}),\n ...(params.text !== undefined ? { text: params.text } : {}),\n ...(params.key ? { key: params.key } : {}),\n ...(params.action ? { action: params.action } : {}),\n };\n}\n\nexport async function createComputerUseReadCommand(\n params: ComputerUseCommandParams<ComputerUseReadCommandKind>,\n): Promise<ComputerUseCommandCreateResponse> {\n const config = await getComputerUseClientConfig();\n const client = initClient(zeroComputerUseCommandContract, config);\n const result = await client.create({ body: commandBody(params) });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to create computer-use command\");\n}\n\nexport async function createComputerUseWriteCommand(\n params: ComputerUseCommandParams<ComputerUseWriteCommandKind>,\n): Promise<ComputerUseCommandCreateResponse> {\n const config = await getComputerUseClientConfig();\n const client = initClient(zeroComputerUseWriteCommandContract, config);\n const result = await client.create({ body: commandBody(params) });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to create computer-use write command\");\n}\n\nexport async function createComputerUsePluginCommand(\n params: ComputerUseAnyPluginCallBody,\n): Promise<ComputerUseCommandCreateResponse> {\n const config = await getComputerUseClientConfig();\n const client = initClient(zeroComputerUsePluginCommandContract, config);\n const result = await client.create({ body: params });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to create computer-use plugin command\");\n}\n\nexport async function listComputerUseHosts(): Promise<\n readonly ComputerUseHost[]\n> {\n const config = await getComputerUseClientConfig();\n const client = initClient(zeroComputerUseHostsContract, config);\n const result = await client.list({});\n\n if (result.status === 200) {\n return result.body.hosts;\n }\n\n handleError(result, \"Failed to list computer-use hosts\");\n}\n\nexport async function getComputerUseCommand(\n commandId: string,\n): Promise<ComputerUseCommandResponse> {\n const config = await getComputerUseClientConfig();\n const client = initClient(zeroComputerUseCommandContract, config);\n const result = await client.get({ params: { commandId } });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to get computer-use command\");\n}\n\nexport async function createComputerUseAuthorizationRequest(): Promise<ComputerUseAuthorizationRequestCreateResponse> {\n const config = await getComputerUseClientConfig();\n const client = initClient(\n zeroComputerUseAuthorizationRequestsContract,\n config,\n );\n const result = await client.create({ body: {} });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to create computer-use authorization request\");\n}\n\n/**\n * Download a command screenshot through the authenticated API proxy. The bytes\n * never traverse a public URL; the API authorizes by command ownership and\n * streams the object back. Used when the command result carries an\n * object-storage pointer instead of an inline data URL.\n */\nexport async function fetchComputerUseScreenshot(\n commandId: string,\n): Promise<{ readonly buffer: Buffer; readonly mimeType: string }> {\n const config = await getComputerUseClientConfig();\n const response = await fetch(\n `${config.baseUrl}/api/zero/computer-use/commands/${encodeURIComponent(\n commandId,\n )}/screenshot`,\n { headers: headersWithCliClientHeaders(config.baseHeaders) },\n );\n\n if (!response.ok) {\n throw new ApiRequestError(\n \"Failed to download computer-use screenshot\",\n \"REQUEST_FAILED\",\n response.status,\n );\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const mimeType =\n response.headers.get(\"content-type\") ?? \"application/octet-stream\";\n return { buffer: Buffer.from(arrayBuffer), mimeType };\n}\n\nexport async function fetchComputerUsePluginContent(\n commandId: string,\n): Promise<{\n readonly buffer: Buffer;\n readonly mimeType: string;\n readonly fileName: string;\n}> {\n const config = await getComputerUseClientConfig();\n const response = await fetch(\n `${config.baseUrl}/api/zero/computer-use/commands/${encodeURIComponent(\n commandId,\n )}/plugin-content`,\n { headers: headersWithCliClientHeaders(config.baseHeaders) },\n );\n\n if (!response.ok) {\n throw new ApiRequestError(\n \"Failed to download computer-use plugin content\",\n \"REQUEST_FAILED\",\n response.status,\n );\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const mimeType =\n response.headers.get(\"content-type\") ?? \"application/octet-stream\";\n const disposition = response.headers.get(\"content-disposition\") ?? \"\";\n const fileName =\n /filename=\"([^\"]+)\"/.exec(disposition)?.[1] ?? \"plugin-content.bin\";\n return { buffer: Buffer.from(arrayBuffer), mimeType, fileName };\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  init_esm_shims
6
- } from "./chunk-AUWSMG4F.js";
6
+ } from "./chunk-52CNCL6Y.js";
7
7
 
8
8
  // ../../packages/core/src/model-display-name.ts
9
9
  init_esm_shims();
@@ -87,4 +87,4 @@ function getModelDisplayName(model) {
87
87
  export {
88
88
  getModelDisplayName
89
89
  };
90
- //# sourceMappingURL=chunk-SVFOPAWB.js.map
90
+ //# sourceMappingURL=chunk-XJXBVERS.js.map
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from "node:module";
3
+ const require = __createRequire(import.meta.url);
4
+ import {
5
+ authHeadersSchema
6
+ } from "./chunk-NIG6LRRX.js";
7
+ import {
8
+ apiErrorSchema,
9
+ external_exports,
10
+ initContract
11
+ } from "./chunk-U2PPHCTL.js";
12
+ import {
13
+ init_esm_shims
14
+ } from "./chunk-52CNCL6Y.js";
15
+
16
+ // ../../packages/api-contracts/src/contracts/zero-finance.ts
17
+ init_esm_shims();
18
+ var c = initContract();
19
+ var ZERO_FINANCE_DEFAULT_RANGE = "1y";
20
+ var ZERO_FINANCE_DEFAULT_INTERVAL = "1d";
21
+ var ZERO_FINANCE_MAX_QUERY_CHARS = 512;
22
+ var ZERO_FINANCE_MAX_SYMBOL_CHARS = 64;
23
+ var zeroFinanceRangeSchema = external_exports.enum([
24
+ "1d",
25
+ "5d",
26
+ "1mo",
27
+ "3mo",
28
+ "6mo",
29
+ "1y",
30
+ "2y",
31
+ "5y",
32
+ "10y",
33
+ "ytd",
34
+ "max"
35
+ ]);
36
+ var zeroFinanceIntervalSchema = external_exports.enum([
37
+ "1m",
38
+ "2m",
39
+ "5m",
40
+ "15m",
41
+ "30m",
42
+ "60m",
43
+ "1d",
44
+ "1wk",
45
+ "1mo"
46
+ ]);
47
+ var zeroFinanceSearchRequestSchema = external_exports.object({
48
+ query: external_exports.string().trim().min(1).max(ZERO_FINANCE_MAX_QUERY_CHARS)
49
+ });
50
+ var zeroFinanceSymbolSchema = external_exports.string().trim().min(1).max(ZERO_FINANCE_MAX_SYMBOL_CHARS);
51
+ var zeroFinanceProfileRequestSchema = external_exports.object({
52
+ symbol: zeroFinanceSymbolSchema
53
+ });
54
+ var zeroFinanceQuoteRequestSchema = external_exports.object({
55
+ symbol: zeroFinanceSymbolSchema
56
+ });
57
+ var zeroFinanceChartRequestSchema = external_exports.object({
58
+ symbol: zeroFinanceSymbolSchema,
59
+ range: zeroFinanceRangeSchema.default(ZERO_FINANCE_DEFAULT_RANGE),
60
+ interval: zeroFinanceIntervalSchema.default(ZERO_FINANCE_DEFAULT_INTERVAL)
61
+ });
62
+ var zeroFinanceOperationSchema = external_exports.enum([
63
+ "search",
64
+ "profile",
65
+ "quote",
66
+ "chart"
67
+ ]);
68
+ var zeroFinanceResponseSchema = external_exports.object({
69
+ operation: zeroFinanceOperationSchema,
70
+ provider: external_exports.literal("apidojo"),
71
+ billingCategory: external_exports.literal("request"),
72
+ billingQuantity: external_exports.literal(1),
73
+ creditsCharged: external_exports.number().int().nonnegative(),
74
+ result: external_exports.unknown()
75
+ });
76
+ var financeResponses = {
77
+ 200: zeroFinanceResponseSchema,
78
+ 400: apiErrorSchema,
79
+ 401: apiErrorSchema,
80
+ 402: apiErrorSchema,
81
+ 403: apiErrorSchema,
82
+ 502: apiErrorSchema,
83
+ 503: apiErrorSchema
84
+ };
85
+ var zeroFinanceContract = c.router({
86
+ search: {
87
+ method: "POST",
88
+ path: "/api/zero/finance/search",
89
+ headers: authHeadersSchema,
90
+ body: zeroFinanceSearchRequestSchema,
91
+ responses: financeResponses,
92
+ summary: "Search financial instruments through managed Zero Finance"
93
+ },
94
+ profile: {
95
+ method: "POST",
96
+ path: "/api/zero/finance/profile",
97
+ headers: authHeadersSchema,
98
+ body: zeroFinanceProfileRequestSchema,
99
+ responses: financeResponses,
100
+ summary: "Fetch a company profile through managed Zero Finance"
101
+ },
102
+ quote: {
103
+ method: "POST",
104
+ path: "/api/zero/finance/quote",
105
+ headers: authHeadersSchema,
106
+ body: zeroFinanceQuoteRequestSchema,
107
+ responses: financeResponses,
108
+ summary: "Fetch a market quote through managed Zero Finance"
109
+ },
110
+ chart: {
111
+ method: "POST",
112
+ path: "/api/zero/finance/chart",
113
+ headers: authHeadersSchema,
114
+ body: zeroFinanceChartRequestSchema,
115
+ responses: financeResponses,
116
+ summary: "Fetch market chart data through managed Zero Finance"
117
+ }
118
+ });
119
+
120
+ export {
121
+ ZERO_FINANCE_DEFAULT_RANGE,
122
+ ZERO_FINANCE_DEFAULT_INTERVAL,
123
+ zeroFinanceRangeSchema,
124
+ zeroFinanceIntervalSchema,
125
+ zeroFinanceSearchRequestSchema,
126
+ zeroFinanceProfileRequestSchema,
127
+ zeroFinanceQuoteRequestSchema,
128
+ zeroFinanceChartRequestSchema,
129
+ zeroFinanceContract
130
+ };
131
+ //# sourceMappingURL=chunk-XQ4CXHGB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/api-contracts/src/contracts/zero-finance.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport { authHeadersSchema, initContract } from \"./base\";\nimport { apiErrorSchema } from \"./errors\";\n\nconst c = initContract();\n\nexport const ZERO_FINANCE_DEFAULT_RANGE = \"1y\" as const;\nexport const ZERO_FINANCE_DEFAULT_INTERVAL = \"1d\" as const;\nexport const ZERO_FINANCE_MAX_QUERY_CHARS = 512;\nexport const ZERO_FINANCE_MAX_SYMBOL_CHARS = 64;\n\nexport const zeroFinanceRangeSchema = z.enum([\n \"1d\",\n \"5d\",\n \"1mo\",\n \"3mo\",\n \"6mo\",\n \"1y\",\n \"2y\",\n \"5y\",\n \"10y\",\n \"ytd\",\n \"max\",\n]);\n\nexport const zeroFinanceIntervalSchema = z.enum([\n \"1m\",\n \"2m\",\n \"5m\",\n \"15m\",\n \"30m\",\n \"60m\",\n \"1d\",\n \"1wk\",\n \"1mo\",\n]);\n\nexport const zeroFinanceSearchRequestSchema = z.object({\n query: z.string().trim().min(1).max(ZERO_FINANCE_MAX_QUERY_CHARS),\n});\n\nconst zeroFinanceSymbolSchema = z\n .string()\n .trim()\n .min(1)\n .max(ZERO_FINANCE_MAX_SYMBOL_CHARS);\n\nexport const zeroFinanceProfileRequestSchema = z.object({\n symbol: zeroFinanceSymbolSchema,\n});\n\nexport const zeroFinanceQuoteRequestSchema = z.object({\n symbol: zeroFinanceSymbolSchema,\n});\n\nexport const zeroFinanceChartRequestSchema = z.object({\n symbol: zeroFinanceSymbolSchema,\n range: zeroFinanceRangeSchema.default(ZERO_FINANCE_DEFAULT_RANGE),\n interval: zeroFinanceIntervalSchema.default(ZERO_FINANCE_DEFAULT_INTERVAL),\n});\n\nexport const zeroFinanceOperationSchema = z.enum([\n \"search\",\n \"profile\",\n \"quote\",\n \"chart\",\n]);\n\nexport const zeroFinanceResponseSchema = z.object({\n operation: zeroFinanceOperationSchema,\n provider: z.literal(\"apidojo\"),\n billingCategory: z.literal(\"request\"),\n billingQuantity: z.literal(1),\n creditsCharged: z.number().int().nonnegative(),\n result: z.unknown(),\n});\n\nexport type ZeroFinanceRange = z.infer<typeof zeroFinanceRangeSchema>;\nexport type ZeroFinanceInterval = z.infer<typeof zeroFinanceIntervalSchema>;\nexport type ZeroFinanceSearchRequest = z.infer<\n typeof zeroFinanceSearchRequestSchema\n>;\nexport type ZeroFinanceProfileRequest = z.infer<\n typeof zeroFinanceProfileRequestSchema\n>;\nexport type ZeroFinanceQuoteRequest = z.infer<\n typeof zeroFinanceQuoteRequestSchema\n>;\nexport type ZeroFinanceChartRequest = z.infer<\n typeof zeroFinanceChartRequestSchema\n>;\nexport type ZeroFinanceOperation = z.infer<typeof zeroFinanceOperationSchema>;\nexport type ZeroFinanceResponse = z.infer<typeof zeroFinanceResponseSchema>;\n\nconst financeResponses = {\n 200: zeroFinanceResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 402: apiErrorSchema,\n 403: apiErrorSchema,\n 502: apiErrorSchema,\n 503: apiErrorSchema,\n} as const;\n\nexport const zeroFinanceContract = c.router({\n search: {\n method: \"POST\",\n path: \"/api/zero/finance/search\",\n headers: authHeadersSchema,\n body: zeroFinanceSearchRequestSchema,\n responses: financeResponses,\n summary: \"Search financial instruments through managed Zero Finance\",\n },\n profile: {\n method: \"POST\",\n path: \"/api/zero/finance/profile\",\n headers: authHeadersSchema,\n body: zeroFinanceProfileRequestSchema,\n responses: financeResponses,\n summary: \"Fetch a company profile through managed Zero Finance\",\n },\n quote: {\n method: \"POST\",\n path: \"/api/zero/finance/quote\",\n headers: authHeadersSchema,\n body: zeroFinanceQuoteRequestSchema,\n responses: financeResponses,\n summary: \"Fetch a market quote through managed Zero Finance\",\n },\n chart: {\n method: \"POST\",\n path: \"/api/zero/finance/chart\",\n headers: authHeadersSchema,\n body: zeroFinanceChartRequestSchema,\n responses: financeResponses,\n summary: \"Fetch market chart data through managed Zero Finance\",\n },\n});\n\nexport type ZeroFinanceContract = typeof zeroFinanceContract;\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAKA,IAAM,IAAI,aAAa;AAEhB,IAAM,6BAA6B;AACnC,IAAM,gCAAgC;AACtC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AAEtC,IAAM,yBAAyB,iBAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,4BAA4B,iBAAE,KAAK;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,iCAAiC,iBAAE,OAAO;AAAA,EACrD,OAAO,iBAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,4BAA4B;AAClE,CAAC;AAED,IAAM,0BAA0B,iBAC7B,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,6BAA6B;AAE7B,IAAM,kCAAkC,iBAAE,OAAO;AAAA,EACtD,QAAQ;AACV,CAAC;AAEM,IAAM,gCAAgC,iBAAE,OAAO;AAAA,EACpD,QAAQ;AACV,CAAC;AAEM,IAAM,gCAAgC,iBAAE,OAAO;AAAA,EACpD,QAAQ;AAAA,EACR,OAAO,uBAAuB,QAAQ,0BAA0B;AAAA,EAChE,UAAU,0BAA0B,QAAQ,6BAA6B;AAC3E,CAAC;AAEM,IAAM,6BAA6B,iBAAE,KAAK;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,4BAA4B,iBAAE,OAAO;AAAA,EAChD,WAAW;AAAA,EACX,UAAU,iBAAE,QAAQ,SAAS;AAAA,EAC7B,iBAAiB,iBAAE,QAAQ,SAAS;AAAA,EACpC,iBAAiB,iBAAE,QAAQ,CAAC;AAAA,EAC5B,gBAAgB,iBAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC7C,QAAQ,iBAAE,QAAQ;AACpB,CAAC;AAmBD,IAAM,mBAAmB;AAAA,EACvB,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEO,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF,CAAC;","names":[]}
@@ -5,10 +5,10 @@ import {
5
5
  getZeroAgent,
6
6
  getZeroAgentCustomConnectors,
7
7
  getZeroAgentUserConnectors
8
- } from "./chunk-6PN6QGIM.js";
8
+ } from "./chunk-4SGKKHZW.js";
9
9
  import {
10
10
  init_esm_shims
11
- } from "./chunk-AUWSMG4F.js";
11
+ } from "./chunk-52CNCL6Y.js";
12
12
 
13
13
  // src/commands/zero/connector/action-url.ts
14
14
  init_esm_shims();
@@ -355,4 +355,4 @@ export {
355
355
  resolveAgentContext,
356
356
  resolveConnectorDiscoveryAgentContext
357
357
  };
358
- //# sourceMappingURL=chunk-F2AM4RWA.js.map
358
+ //# sourceMappingURL=chunk-XW5M3ADB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/zero/connector/action-url.ts","../src/commands/zero/connector/public-catalog.ts","../src/commands/zero/connector/agent-context.ts"],"sourcesContent":["export const CALLBACK_PROMPT_PLACEHOLDER =\n \"SOMETHING_AGENT_WANT_TO_BE_CALLBACK\";\n\nexport function connectorActionCallbackAvailable(): boolean {\n return Boolean(process.env.ZERO_CHAT_THREAD_ID?.trim());\n}\n\nfunction currentChatThreadId(agentId: string | undefined): string | null {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n const currentAgentId = process.env.ZERO_AGENT_ID?.trim();\n if (!threadId || !currentAgentId || agentId !== currentAgentId) {\n return null;\n }\n return threadId;\n}\n\nexport function currentChatSupportsActionCallback(\n agentId: string | undefined,\n): boolean {\n return currentChatThreadId(agentId) !== null;\n}\n\nfunction addCallbackSearchParams(\n params: URLSearchParams,\n threadId: string,\n callbackPrompt: string,\n): void {\n params.set(\"threadId\", threadId);\n params.set(\"callbackPrompt\", callbackPrompt);\n}\n\nexport function addRequestedCallbackSearchParams(\n params: URLSearchParams,\n callbackPrompt: string | undefined,\n agentId: string | undefined,\n): void {\n if (callbackPrompt === undefined) {\n return;\n }\n\n const normalizedPrompt = callbackPrompt.trim();\n if (!normalizedPrompt) {\n throw new Error(\"--callback-prompt cannot be empty\");\n }\n\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n throw new Error(\n \"--callback-prompt can only target the current Zero web chat thread and agent\",\n );\n }\n addCallbackSearchParams(params, threadId, normalizedPrompt);\n}\n\nexport function connectorActionUrl(args: {\n readonly origin: string;\n readonly path: string;\n readonly agentId?: string;\n}): string {\n const url = new URL(args.path, args.origin);\n if (args.agentId) {\n url.searchParams.set(\"agentId\", args.agentId);\n }\n return url.toString();\n}\n\nfunction callbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): string | null {\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n return null;\n }\n\n const url = new URL(actionUrl);\n addCallbackSearchParams(\n url.searchParams,\n threadId,\n CALLBACK_PROMPT_PLACEHOLDER,\n );\n return url.toString();\n}\n\nexport function printCallbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): void {\n const callbackUrl = callbackActionUrlExample(actionUrl, agentId);\n if (!callbackUrl) {\n return;\n }\n\n console.log(\"\");\n console.log(\n \"Or, if this is the only connector or permission action needed, use the callback URL below. After the user completes this action, Zero will automatically start the next round with the callback prompt:\",\n );\n console.log(callbackUrl);\n}\n\nexport function printCallbackTurnInstruction(): void {\n console.log(\"\");\n console.log(\n \"After sharing this callback URL, end the current turn. When the user completes the action, Zero will automatically start the next round with the callback prompt.\",\n );\n}\n","import type { PublicConnectorCatalogAuthMethodDetail } from \"@vm0/api-contracts/contracts/zero-connector-catalog\";\nimport type { ZeroConnectorCatalogStatus } from \"../../../lib/api/domains/zero-connectors\";\n\nexport type PublicConnectorStatus = ZeroConnectorCatalogStatus;\n\ninterface ConnectorSearchItem {\n readonly slug: string;\n readonly label: string;\n readonly description: string;\n readonly category: string;\n readonly tags: readonly string[];\n readonly generation: readonly string[];\n readonly authMethods: readonly {\n readonly id: string;\n readonly label: string;\n readonly description: string | null;\n }[];\n}\n\ninterface ConnectorSearchResult<T extends ConnectorSearchItem> {\n readonly connector: T;\n readonly score: number;\n readonly matchedField: string;\n}\n\ninterface ConnectorSearchOutput<T extends ConnectorSearchItem> {\n readonly results: readonly ConnectorSearchResult<T>[];\n readonly total: number;\n}\n\nconst TOKEN_BOUNDARY = /[_\\-\\s]+/;\nconst CASE_BOUNDARY = /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/;\nconst MIN_SCORE = 10;\n\nfunction tokenize(input: string): Set<string> {\n const tokens = new Set<string>();\n for (const chunk of input.split(TOKEN_BOUNDARY)) {\n if (!chunk) continue;\n for (const sub of chunk.split(CASE_BOUNDARY)) {\n const lower = sub.toLowerCase();\n if (lower) tokens.add(lower);\n }\n }\n return tokens;\n}\n\nfunction publicStrings(connector: ConnectorSearchItem): string[] {\n return [\n connector.slug,\n connector.label,\n connector.description,\n connector.category,\n ...connector.tags,\n ...connector.generation,\n ...connector.authMethods.flatMap((authMethod) => {\n return [\n authMethod.id,\n authMethod.label,\n ...(authMethod.description ? [authMethod.description] : []),\n ];\n }),\n ];\n}\n\ntype ScoreHit = { score: number; matchedField: string };\n\nfunction best(candidates: readonly (ScoreHit | null)[]): ScoreHit | null {\n return candidates.reduce<ScoreHit | null>((bestHit, hit) => {\n if (!hit) return bestHit;\n if (!bestHit || hit.score > bestHit.score) return hit;\n return bestHit;\n }, null);\n}\n\nfunction scoreExact(\n keywordLower: string,\n skipPrivateIdentifierMatches: boolean,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n if (connector.slug.toLowerCase() === keywordLower) {\n return { score: 100, matchedField: \"slug\" };\n }\n if (connector.label.toLowerCase() === keywordLower) {\n return { score: 80, matchedField: \"label\" };\n }\n for (const tag of connector.tags) {\n if (skipPrivateIdentifierMatches && tag.includes(\"_\")) continue;\n if (tag.toLowerCase() === keywordLower) {\n return { score: 70, matchedField: `tag:${tag}` };\n }\n }\n for (const generationType of connector.generation) {\n if (generationType.toLowerCase() === keywordLower) {\n return { score: 65, matchedField: `generation:${generationType}` };\n }\n }\n for (const authMethod of connector.authMethods) {\n if (authMethod.id.toLowerCase() === keywordLower) {\n return { score: 60, matchedField: `auth-method:${authMethod.id}` };\n }\n if (authMethod.label.toLowerCase() === keywordLower) {\n return { score: 60, matchedField: `auth-method:${authMethod.label}` };\n }\n }\n if (connector.category.toLowerCase() === keywordLower) {\n return { score: 55, matchedField: \"category\" };\n }\n return null;\n}\n\nfunction scoreSubstring(\n keywordLower: string,\n skipPrivateIdentifierMatches: boolean,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const candidates: ScoreHit[] = [];\n if (connector.slug.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 50, matchedField: \"slug\" });\n }\n if (connector.label.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 50, matchedField: \"label\" });\n }\n for (const tag of connector.tags) {\n if (skipPrivateIdentifierMatches && tag.includes(\"_\")) continue;\n if (tag.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 25, matchedField: `tag:${tag}` });\n }\n }\n for (const generationType of connector.generation) {\n if (generationType.toLowerCase().includes(keywordLower)) {\n candidates.push({\n score: 25,\n matchedField: `generation:${generationType}`,\n });\n }\n }\n for (const authMethod of connector.authMethods) {\n if (\n authMethod.id.toLowerCase().includes(keywordLower) ||\n authMethod.label.toLowerCase().includes(keywordLower)\n ) {\n candidates.push({\n score: 20,\n matchedField: `auth-method:${authMethod.id}`,\n });\n }\n }\n if (connector.category.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 20, matchedField: \"category\" });\n }\n if (connector.description.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 15, matchedField: \"description\" });\n }\n\n return best(candidates);\n}\n\nfunction scoreTokens(\n keywordTokens: ReadonlySet<string>,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const candidateTokens = new Set<string>();\n for (const source of publicStrings(connector)) {\n for (const token of tokenize(source)) {\n candidateTokens.add(token);\n }\n }\n\n let intersection = 0;\n let firstCommon = \"\";\n for (const token of keywordTokens) {\n if (candidateTokens.has(token)) {\n intersection++;\n if (!firstCommon) firstCommon = token;\n }\n }\n if (intersection === 0) return null;\n return { score: 10 * intersection, matchedField: `token:${firstCommon}` };\n}\n\nfunction scoreConnector(\n keywordLower: string,\n keyword: string,\n keywordTokens: ReadonlySet<string>,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const skipPrivateIdentifierMatches =\n /^[A-Za-z0-9_]+$/.test(keyword) && keyword.includes(\"_\");\n const tokenHit = skipPrivateIdentifierMatches\n ? null\n : scoreTokens(keywordTokens, connector);\n const hit = best([\n scoreExact(keywordLower, skipPrivateIdentifierMatches, connector),\n scoreSubstring(keywordLower, skipPrivateIdentifierMatches, connector),\n tokenHit,\n ]);\n if (!hit || hit.score < MIN_SCORE) return null;\n return hit;\n}\n\nexport function searchConnectorCatalog<T extends ConnectorSearchItem>(\n connectors: readonly T[],\n keyword: string,\n limit: number,\n): ConnectorSearchOutput<T> {\n const trimmed = keyword.trim();\n if (!trimmed) return { results: [], total: 0 };\n\n const keywordLower = trimmed.toLowerCase();\n const keywordTokens = tokenize(trimmed);\n const hits = connectors.flatMap((connector): ConnectorSearchResult<T>[] => {\n const hit = scoreConnector(keywordLower, trimmed, keywordTokens, connector);\n if (!hit) return [];\n return [\n {\n connector,\n score: hit.score,\n matchedField: hit.matchedField,\n },\n ];\n });\n\n hits.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.connector.slug.localeCompare(b.connector.slug);\n });\n\n return {\n results: hits.slice(0, limit),\n total: hits.length,\n };\n}\n\nexport function findConnectorStatusItem(\n connectors: readonly PublicConnectorStatus[],\n connectorSlug: string,\n): PublicConnectorStatus | null {\n const exact = connectors.find((connector) => {\n return connector.slug === connectorSlug;\n });\n if (exact) return exact;\n\n const lower = connectorSlug.toLowerCase();\n return (\n connectors.find((connector) => {\n return connector.slug.toLowerCase() === lower;\n }) ?? null\n );\n}\n\nexport function availableConnectorSlugs(\n connectors: readonly PublicConnectorStatus[],\n): string {\n return connectors\n .map((connector) => {\n return connector.slug;\n })\n .join(\", \");\n}\n\nexport function resolveManualGrantAuthMethod(\n connector: PublicConnectorStatus,\n rawAuthMethod: string | undefined,\n): PublicConnectorCatalogAuthMethodDetail {\n if (rawAuthMethod) {\n const authMethod = connector.authMethods.find((method) => {\n return method.id === rawAuthMethod;\n });\n if (!authMethod) {\n throw new Error(\n `${connector.slug} connector does not have ${rawAuthMethod} auth method`,\n {\n cause: new Error(\n `Available auth methods: ${connector.authMethods\n .map((method) => {\n return method.id;\n })\n .join(\", \")}`,\n ),\n },\n );\n }\n\n if (authMethod.grantKind === \"manual\") {\n return authMethod;\n }\n\n throw new Error(\n `${connector.slug} ${authMethod.id} auth method does not use a manual grant`,\n );\n }\n\n const manualAuthMethods = connector.authMethods.filter((method) => {\n return method.grantKind === \"manual\";\n });\n const authMethod = manualAuthMethods[0];\n if (manualAuthMethods.length === 1 && authMethod) {\n return authMethod;\n }\n if (manualAuthMethods.length === 0) {\n throw new Error(`${connector.slug} connector does not use a manual grant`);\n }\n\n throw new Error(\n `${connector.slug} connector has multiple manual grant auth methods`,\n {\n cause: new Error(\n `Pass --auth-method ${manualAuthMethods\n .map((method) => {\n return method.id;\n })\n .join(\"|\")}`,\n ),\n },\n );\n}\n","import {\n getZeroAgent,\n getZeroAgentCustomConnectors,\n getZeroAgentUserConnectors,\n} from \"../../../lib/api\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedConnectorSlugs: Set<string>;\n}\n\nexport interface ConnectorDiscoveryAgentContext extends AgentContext {\n authorizedCustomConnectorIds: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledConnectorSlugs] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedConnectorSlugs: new Set(enabledConnectorSlugs),\n };\n}\n\nexport async function resolveConnectorDiscoveryAgentContext(\n flagAgentId: string | undefined,\n): Promise<ConnectorDiscoveryAgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledConnectorSlugs, enabledCustomConnectorIds] =\n await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n getZeroAgentCustomConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedConnectorSlugs: new Set(enabledConnectorSlugs),\n authorizedCustomConnectorIds: new Set(enabledCustomConnectorIds),\n };\n}\n"],"mappings":"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","names":["authMethod"]}
1
+ {"version":3,"sources":["../src/commands/zero/connector/action-url.ts","../src/commands/zero/connector/public-catalog.ts","../src/commands/zero/connector/agent-context.ts"],"sourcesContent":["export const CALLBACK_PROMPT_PLACEHOLDER =\n \"SOMETHING_AGENT_WANT_TO_BE_CALLBACK\";\n\nexport function connectorActionCallbackAvailable(): boolean {\n return Boolean(process.env.ZERO_CHAT_THREAD_ID?.trim());\n}\n\nfunction currentChatThreadId(agentId: string | undefined): string | null {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n const currentAgentId = process.env.ZERO_AGENT_ID?.trim();\n if (!threadId || !currentAgentId || agentId !== currentAgentId) {\n return null;\n }\n return threadId;\n}\n\nexport function currentChatSupportsActionCallback(\n agentId: string | undefined,\n): boolean {\n return currentChatThreadId(agentId) !== null;\n}\n\nfunction addCallbackSearchParams(\n params: URLSearchParams,\n threadId: string,\n callbackPrompt: string,\n): void {\n params.set(\"threadId\", threadId);\n params.set(\"callbackPrompt\", callbackPrompt);\n}\n\nexport function addRequestedCallbackSearchParams(\n params: URLSearchParams,\n callbackPrompt: string | undefined,\n agentId: string | undefined,\n): void {\n if (callbackPrompt === undefined) {\n return;\n }\n\n const normalizedPrompt = callbackPrompt.trim();\n if (!normalizedPrompt) {\n throw new Error(\"--callback-prompt cannot be empty\");\n }\n\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n throw new Error(\n \"--callback-prompt can only target the current Zero web chat thread and agent\",\n );\n }\n addCallbackSearchParams(params, threadId, normalizedPrompt);\n}\n\nexport function connectorActionUrl(args: {\n readonly origin: string;\n readonly path: string;\n readonly agentId?: string;\n}): string {\n const url = new URL(args.path, args.origin);\n if (args.agentId) {\n url.searchParams.set(\"agentId\", args.agentId);\n }\n return url.toString();\n}\n\nfunction callbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): string | null {\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n return null;\n }\n\n const url = new URL(actionUrl);\n addCallbackSearchParams(\n url.searchParams,\n threadId,\n CALLBACK_PROMPT_PLACEHOLDER,\n );\n return url.toString();\n}\n\nexport function printCallbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): void {\n const callbackUrl = callbackActionUrlExample(actionUrl, agentId);\n if (!callbackUrl) {\n return;\n }\n\n console.log(\"\");\n console.log(\n \"Or, if this is the only connector or permission action needed, use the callback URL below. After the user completes this action, Zero will automatically start the next round with the callback prompt:\",\n );\n console.log(callbackUrl);\n}\n\nexport function printCallbackTurnInstruction(): void {\n console.log(\"\");\n console.log(\n \"After sharing this callback URL, end the current turn. When the user completes the action, Zero will automatically start the next round with the callback prompt.\",\n );\n}\n","import type { PublicConnectorCatalogAuthMethodDetail } from \"@vm0/api-contracts/contracts/zero-connector-catalog\";\nimport type { ZeroConnectorCatalogStatus } from \"../../../lib/api/domains/zero-connectors\";\n\nexport type PublicConnectorStatus = ZeroConnectorCatalogStatus;\n\ninterface ConnectorSearchItem {\n readonly slug: string;\n readonly label: string;\n readonly description: string;\n readonly category: string;\n readonly tags: readonly string[];\n readonly generation: readonly string[];\n readonly authMethods: readonly {\n readonly id: string;\n readonly label: string;\n readonly description: string | null;\n }[];\n}\n\ninterface ConnectorSearchResult<T extends ConnectorSearchItem> {\n readonly connector: T;\n readonly score: number;\n readonly matchedField: string;\n}\n\ninterface ConnectorSearchOutput<T extends ConnectorSearchItem> {\n readonly results: readonly ConnectorSearchResult<T>[];\n readonly total: number;\n}\n\nconst TOKEN_BOUNDARY = /[_\\-\\s]+/;\nconst CASE_BOUNDARY = /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/;\nconst MIN_SCORE = 10;\n\nfunction tokenize(input: string): Set<string> {\n const tokens = new Set<string>();\n for (const chunk of input.split(TOKEN_BOUNDARY)) {\n if (!chunk) continue;\n for (const sub of chunk.split(CASE_BOUNDARY)) {\n const lower = sub.toLowerCase();\n if (lower) tokens.add(lower);\n }\n }\n return tokens;\n}\n\nfunction publicStrings(connector: ConnectorSearchItem): string[] {\n return [\n connector.slug,\n connector.label,\n connector.description,\n connector.category,\n ...connector.tags,\n ...connector.generation,\n ...connector.authMethods.flatMap((authMethod) => {\n return [\n authMethod.id,\n authMethod.label,\n ...(authMethod.description ? [authMethod.description] : []),\n ];\n }),\n ];\n}\n\ntype ScoreHit = { score: number; matchedField: string };\n\nfunction best(candidates: readonly (ScoreHit | null)[]): ScoreHit | null {\n return candidates.reduce<ScoreHit | null>((bestHit, hit) => {\n if (!hit) return bestHit;\n if (!bestHit || hit.score > bestHit.score) return hit;\n return bestHit;\n }, null);\n}\n\nfunction scoreExact(\n keywordLower: string,\n skipPrivateIdentifierMatches: boolean,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n if (connector.slug.toLowerCase() === keywordLower) {\n return { score: 100, matchedField: \"slug\" };\n }\n if (connector.label.toLowerCase() === keywordLower) {\n return { score: 80, matchedField: \"label\" };\n }\n for (const tag of connector.tags) {\n if (skipPrivateIdentifierMatches && tag.includes(\"_\")) continue;\n if (tag.toLowerCase() === keywordLower) {\n return { score: 70, matchedField: `tag:${tag}` };\n }\n }\n for (const generationType of connector.generation) {\n if (generationType.toLowerCase() === keywordLower) {\n return { score: 65, matchedField: `generation:${generationType}` };\n }\n }\n for (const authMethod of connector.authMethods) {\n if (authMethod.id.toLowerCase() === keywordLower) {\n return { score: 60, matchedField: `auth-method:${authMethod.id}` };\n }\n if (authMethod.label.toLowerCase() === keywordLower) {\n return { score: 60, matchedField: `auth-method:${authMethod.label}` };\n }\n }\n if (connector.category.toLowerCase() === keywordLower) {\n return { score: 55, matchedField: \"category\" };\n }\n return null;\n}\n\nfunction scoreSubstring(\n keywordLower: string,\n skipPrivateIdentifierMatches: boolean,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const candidates: ScoreHit[] = [];\n if (connector.slug.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 50, matchedField: \"slug\" });\n }\n if (connector.label.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 50, matchedField: \"label\" });\n }\n for (const tag of connector.tags) {\n if (skipPrivateIdentifierMatches && tag.includes(\"_\")) continue;\n if (tag.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 25, matchedField: `tag:${tag}` });\n }\n }\n for (const generationType of connector.generation) {\n if (generationType.toLowerCase().includes(keywordLower)) {\n candidates.push({\n score: 25,\n matchedField: `generation:${generationType}`,\n });\n }\n }\n for (const authMethod of connector.authMethods) {\n if (\n authMethod.id.toLowerCase().includes(keywordLower) ||\n authMethod.label.toLowerCase().includes(keywordLower)\n ) {\n candidates.push({\n score: 20,\n matchedField: `auth-method:${authMethod.id}`,\n });\n }\n }\n if (connector.category.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 20, matchedField: \"category\" });\n }\n if (connector.description.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 15, matchedField: \"description\" });\n }\n\n return best(candidates);\n}\n\nfunction scoreTokens(\n keywordTokens: ReadonlySet<string>,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const candidateTokens = new Set<string>();\n for (const source of publicStrings(connector)) {\n for (const token of tokenize(source)) {\n candidateTokens.add(token);\n }\n }\n\n let intersection = 0;\n let firstCommon = \"\";\n for (const token of keywordTokens) {\n if (candidateTokens.has(token)) {\n intersection++;\n if (!firstCommon) firstCommon = token;\n }\n }\n if (intersection === 0) return null;\n return { score: 10 * intersection, matchedField: `token:${firstCommon}` };\n}\n\nfunction scoreConnector(\n keywordLower: string,\n keyword: string,\n keywordTokens: ReadonlySet<string>,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const skipPrivateIdentifierMatches =\n /^[A-Za-z0-9_]+$/.test(keyword) && keyword.includes(\"_\");\n const tokenHit = skipPrivateIdentifierMatches\n ? null\n : scoreTokens(keywordTokens, connector);\n const hit = best([\n scoreExact(keywordLower, skipPrivateIdentifierMatches, connector),\n scoreSubstring(keywordLower, skipPrivateIdentifierMatches, connector),\n tokenHit,\n ]);\n if (!hit || hit.score < MIN_SCORE) return null;\n return hit;\n}\n\nexport function searchConnectorCatalog<T extends ConnectorSearchItem>(\n connectors: readonly T[],\n keyword: string,\n limit: number,\n): ConnectorSearchOutput<T> {\n const trimmed = keyword.trim();\n if (!trimmed) return { results: [], total: 0 };\n\n const keywordLower = trimmed.toLowerCase();\n const keywordTokens = tokenize(trimmed);\n const hits = connectors.flatMap((connector): ConnectorSearchResult<T>[] => {\n const hit = scoreConnector(keywordLower, trimmed, keywordTokens, connector);\n if (!hit) return [];\n return [\n {\n connector,\n score: hit.score,\n matchedField: hit.matchedField,\n },\n ];\n });\n\n hits.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.connector.slug.localeCompare(b.connector.slug);\n });\n\n return {\n results: hits.slice(0, limit),\n total: hits.length,\n };\n}\n\nexport function findConnectorStatusItem(\n connectors: readonly PublicConnectorStatus[],\n connectorSlug: string,\n): PublicConnectorStatus | null {\n const exact = connectors.find((connector) => {\n return connector.slug === connectorSlug;\n });\n if (exact) return exact;\n\n const lower = connectorSlug.toLowerCase();\n return (\n connectors.find((connector) => {\n return connector.slug.toLowerCase() === lower;\n }) ?? null\n );\n}\n\nexport function availableConnectorSlugs(\n connectors: readonly PublicConnectorStatus[],\n): string {\n return connectors\n .map((connector) => {\n return connector.slug;\n })\n .join(\", \");\n}\n\nexport function resolveManualGrantAuthMethod(\n connector: PublicConnectorStatus,\n rawAuthMethod: string | undefined,\n): PublicConnectorCatalogAuthMethodDetail {\n if (rawAuthMethod) {\n const authMethod = connector.authMethods.find((method) => {\n return method.id === rawAuthMethod;\n });\n if (!authMethod) {\n throw new Error(\n `${connector.slug} connector does not have ${rawAuthMethod} auth method`,\n {\n cause: new Error(\n `Available auth methods: ${connector.authMethods\n .map((method) => {\n return method.id;\n })\n .join(\", \")}`,\n ),\n },\n );\n }\n\n if (authMethod.grantKind === \"manual\") {\n return authMethod;\n }\n\n throw new Error(\n `${connector.slug} ${authMethod.id} auth method does not use a manual grant`,\n );\n }\n\n const manualAuthMethods = connector.authMethods.filter((method) => {\n return method.grantKind === \"manual\";\n });\n const authMethod = manualAuthMethods[0];\n if (manualAuthMethods.length === 1 && authMethod) {\n return authMethod;\n }\n if (manualAuthMethods.length === 0) {\n throw new Error(`${connector.slug} connector does not use a manual grant`);\n }\n\n throw new Error(\n `${connector.slug} connector has multiple manual grant auth methods`,\n {\n cause: new Error(\n `Pass --auth-method ${manualAuthMethods\n .map((method) => {\n return method.id;\n })\n .join(\"|\")}`,\n ),\n },\n );\n}\n","import {\n getZeroAgent,\n getZeroAgentCustomConnectors,\n getZeroAgentUserConnectors,\n} from \"../../../lib/api/domains/zero-agents\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedConnectorSlugs: Set<string>;\n}\n\nexport interface ConnectorDiscoveryAgentContext extends AgentContext {\n authorizedCustomConnectorIds: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledConnectorSlugs] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedConnectorSlugs: new Set(enabledConnectorSlugs),\n };\n}\n\nexport async function resolveConnectorDiscoveryAgentContext(\n flagAgentId: string | undefined,\n): Promise<ConnectorDiscoveryAgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledConnectorSlugs, enabledCustomConnectorIds] =\n await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n getZeroAgentCustomConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedConnectorSlugs: new Set(enabledConnectorSlugs),\n authorizedCustomConnectorIds: new Set(enabledCustomConnectorIds),\n };\n}\n"],"mappings":"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","names":["authMethod"]}
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from "node:module";
3
+ const require = __createRequire(import.meta.url);
4
+ import {
5
+ zeroBillingCreditCheckoutContract,
6
+ zeroBillingStatusContract
7
+ } from "./chunk-TDLAIIDN.js";
8
+ import {
9
+ getClientConfig,
10
+ handleError,
11
+ initClient
12
+ } from "./chunk-U2PPHCTL.js";
13
+ import {
14
+ decodeZeroTokenPayload
15
+ } from "./chunk-KHPTA6UQ.js";
16
+ import {
17
+ init_esm_shims
18
+ } from "./chunk-52CNCL6Y.js";
19
+
20
+ // src/lib/api/domains/zero-billing.ts
21
+ init_esm_shims();
22
+ async function getZeroBillingStatus() {
23
+ const config = await getClientConfig();
24
+ const client = initClient(zeroBillingStatusContract, config);
25
+ const result = await client.get({ headers: {} });
26
+ if (result.status === 200) {
27
+ return result.body;
28
+ }
29
+ handleError(result, "Failed to get billing status");
30
+ }
31
+ async function createZeroCreditCheckout(body) {
32
+ const config = await getClientConfig();
33
+ const client = initClient(zeroBillingCreditCheckoutContract, config);
34
+ const result = await client.create({ body });
35
+ if (result.status === 200) {
36
+ return result.body;
37
+ }
38
+ handleError(result, "Failed to create credit checkout");
39
+ }
40
+
41
+ // src/commands/zero/shared/billing-capabilities.ts
42
+ init_esm_shims();
43
+ function legacyPaidCapability(tier) {
44
+ return tier !== "limited-free-1" && tier !== "pro-suspend";
45
+ }
46
+ function currentPlanCanBuyCredits(billing) {
47
+ return billing.canBuyCredits ?? legacyPaidCapability(billing.tier);
48
+ }
49
+ function currentPlanAllowsVideo(billing) {
50
+ return billing.videoGenerationAllowed ?? legacyPaidCapability(billing.tier);
51
+ }
52
+ function currentTokenCanReadBilling() {
53
+ const payload = decodeZeroTokenPayload();
54
+ return payload === void 0 || payload.capabilities.includes("billing:read");
55
+ }
56
+
57
+ export {
58
+ getZeroBillingStatus,
59
+ createZeroCreditCheckout,
60
+ currentPlanCanBuyCredits,
61
+ currentPlanAllowsVideo,
62
+ currentTokenCanReadBilling
63
+ };
64
+ //# sourceMappingURL=chunk-YEXLP5U7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/api/domains/zero-billing.ts","../src/commands/zero/shared/billing-capabilities.ts"],"sourcesContent":["import { initClient } from \"@vm0/api-contracts/contracts/trpc-contract\";\nimport {\n zeroBillingStatusContract,\n zeroBillingCreditCheckoutContract,\n type BillingStatusResponse,\n} from \"@vm0/api-contracts/contracts/zero-billing\";\n\nimport { getClientConfig, handleError } from \"../core/client-factory\";\n\nexport async function getZeroBillingStatus(): Promise<BillingStatusResponse> {\n const config = await getClientConfig();\n const client = initClient(zeroBillingStatusContract, config);\n\n const result = await client.get({ headers: {} });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to get billing status\");\n}\n\nexport async function createZeroCreditCheckout(body: {\n readonly credits: number;\n readonly successUrl: string;\n readonly cancelUrl: string;\n readonly autoRecharge?: {\n readonly enabled: boolean;\n readonly threshold?: number;\n readonly amount?: number;\n };\n}): Promise<{ readonly url: string }> {\n const config = await getClientConfig();\n const client = initClient(zeroBillingCreditCheckoutContract, config);\n\n const result = await client.create({ body });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to create credit checkout\");\n}\n","import type { BillingStatusResponse } from \"@vm0/api-contracts/contracts/zero-billing\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\n\nfunction legacyPaidCapability(tier: string): boolean {\n return tier !== \"limited-free-1\" && tier !== \"pro-suspend\";\n}\n\nexport function currentPlanCanBuyCredits(\n billing: BillingStatusResponse,\n): boolean {\n return billing.canBuyCredits ?? legacyPaidCapability(billing.tier);\n}\n\nexport function currentPlanAllowsVideo(\n billing: BillingStatusResponse,\n): boolean {\n return billing.videoGenerationAllowed ?? legacyPaidCapability(billing.tier);\n}\n\nexport function currentTokenCanReadBilling(): boolean {\n const payload = decodeZeroTokenPayload();\n return payload === undefined || payload.capabilities.includes(\"billing:read\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AASA,eAAsB,uBAAuD;AAC3E,QAAM,SAAS,MAAM,gBAAgB;AACrC,QAAM,SAAS,WAAW,2BAA2B,MAAM;AAE3D,QAAM,SAAS,MAAM,OAAO,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;AAC/C,MAAI,OAAO,WAAW,KAAK;AACzB,WAAO,OAAO;AAAA,EAChB;AACA,cAAY,QAAQ,8BAA8B;AACpD;AAEA,eAAsB,yBAAyB,MAST;AACpC,QAAM,SAAS,MAAM,gBAAgB;AACrC,QAAM,SAAS,WAAW,mCAAmC,MAAM;AAEnE,QAAM,SAAS,MAAM,OAAO,OAAO,EAAE,KAAK,CAAC;AAC3C,MAAI,OAAO,WAAW,KAAK;AACzB,WAAO,OAAO;AAAA,EAChB;AACA,cAAY,QAAQ,kCAAkC;AACxD;;;ACtCA;AAGA,SAAS,qBAAqB,MAAuB;AACnD,SAAO,SAAS,oBAAoB,SAAS;AAC/C;AAEO,SAAS,yBACd,SACS;AACT,SAAO,QAAQ,iBAAiB,qBAAqB,QAAQ,IAAI;AACnE;AAEO,SAAS,uBACd,SACS;AACT,SAAO,QAAQ,0BAA0B,qBAAqB,QAAQ,IAAI;AAC5E;AAEO,SAAS,6BAAsC;AACpD,QAAM,UAAU,uBAAuB;AACvC,SAAO,YAAY,UAAa,QAAQ,aAAa,SAAS,cAAc;AAC9E;","names":[]}