@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
@@ -4,27 +4,43 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  ZERO_PEOPLE_SEARCH_DEFAULT_LIMIT,
6
6
  ZERO_PEOPLE_SEARCH_MAX_LIMIT,
7
- callZeroPeopleSearch,
7
+ zeroPeopleSearchContract,
8
8
  zeroPeopleSearchRequestSchema
9
- } from "./chunk-6PN6QGIM.js";
10
- import "./chunk-V7A6ZFHR.js";
11
- import "./chunk-ANOLYIPL.js";
9
+ } from "./chunk-HMUAPCDD.js";
10
+ import "./chunk-NIG6LRRX.js";
12
11
  import {
12
+ getClientConfig,
13
+ handleError,
14
+ initClient,
13
15
  source_default,
14
16
  withErrorHandler
15
- } from "./chunk-5ZZI2LSO.js";
16
- import "./chunk-32FE3MDA.js";
17
+ } from "./chunk-U2PPHCTL.js";
18
+ import "./chunk-KHPTA6UQ.js";
17
19
  import {
18
20
  Command,
19
21
  InvalidArgumentError,
20
22
  Option
21
- } from "./chunk-JAUTPXVK.js";
23
+ } from "./chunk-PAULHBEP.js";
22
24
  import {
23
25
  init_esm_shims
24
- } from "./chunk-AUWSMG4F.js";
26
+ } from "./chunk-52CNCL6Y.js";
25
27
 
26
28
  // src/commands/zero/people-search/index.ts
27
29
  init_esm_shims();
30
+
31
+ // src/lib/api/domains/zero-people-search.ts
32
+ init_esm_shims();
33
+ async function callZeroPeopleSearch(body) {
34
+ const config = await getClientConfig();
35
+ const client = initClient(zeroPeopleSearchContract, config);
36
+ const result = await client.search({ headers: {}, body });
37
+ if (result.status === 200) {
38
+ return result.body;
39
+ }
40
+ handleError(result, "Failed to search for people");
41
+ }
42
+
43
+ // src/commands/zero/people-search/index.ts
28
44
  function parseLimit(value) {
29
45
  if (!/^\d+$/.test(value)) {
30
46
  throw new InvalidArgumentError(
@@ -125,4 +141,4 @@ Notes:
125
141
  export {
126
142
  zeroPeopleSearchCommand
127
143
  };
128
- //# sourceMappingURL=people-search-PFTIO2QS.js.map
144
+ //# sourceMappingURL=people-search-VS5J4HME.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/people-search/index.ts","../src/lib/api/domains/zero-people-search.ts"],"sourcesContent":["import {\n ZERO_PEOPLE_SEARCH_DEFAULT_LIMIT,\n ZERO_PEOPLE_SEARCH_MAX_LIMIT,\n zeroPeopleSearchRequestSchema,\n} from \"@vm0/api-contracts/contracts/zero-people-search\";\nimport chalk from \"chalk\";\nimport { Command, InvalidArgumentError, Option } from \"commander\";\n\nimport { callZeroPeopleSearch } from \"../../../lib/api/domains/zero-people-search\";\nimport type { ZeroPeopleSearchResponse } from \"@vm0/api-contracts/contracts/zero-people-search\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\ninterface PeopleSearchOptions {\n readonly limit: number;\n readonly json?: boolean;\n}\n\nfunction parseLimit(value: string): number {\n if (!/^\\d+$/.test(value)) {\n throw new InvalidArgumentError(\n `limit must be an integer from 1 to ${ZERO_PEOPLE_SEARCH_MAX_LIMIT}`,\n );\n }\n const limit = Number(value);\n if (limit < 1 || limit > ZERO_PEOPLE_SEARCH_MAX_LIMIT) {\n throw new InvalidArgumentError(\n `limit must be an integer from 1 to ${ZERO_PEOPLE_SEARCH_MAX_LIMIT}`,\n );\n }\n return limit;\n}\n\nfunction renderMetadata(response: ZeroPeopleSearchResponse): void {\n console.log(chalk.dim(` Provider: ${response.provider}`));\n console.log(chalk.dim(` Billing category: ${response.billingCategory}`));\n console.log(chalk.dim(` Billing quantity: ${response.billingQuantity}`));\n console.log(chalk.dim(` Credits charged: ${response.creditsCharged}`));\n}\n\nfunction renderProfile(\n profile: ZeroPeopleSearchResponse[\"profiles\"][number],\n index: number,\n): void {\n console.log(`${index + 1}. ${profile.name}`);\n if (profile.title) {\n console.log(` Title: ${profile.title}`);\n }\n if (profile.company) {\n console.log(` Company: ${profile.company}`);\n }\n if (profile.location) {\n console.log(` Location: ${profile.location}`);\n }\n if (profile.summary) {\n console.log(` ${profile.summary}`);\n }\n console.log(\" Sources:\");\n for (const [sourceIndex, source] of profile.sources.entries()) {\n console.log(\n ` ${sourceIndex + 1}. ${source.title || \"(untitled source)\"}`,\n );\n console.log(` ${source.url}`);\n }\n}\n\nfunction renderProfiles(response: ZeroPeopleSearchResponse): void {\n if (response.profiles.length === 0) {\n console.log(\n chalk.dim(\n \"No matching professionals found. Try a broader role, company, skill, or location query.\",\n ),\n );\n return;\n }\n for (const [index, profile] of response.profiles.entries()) {\n renderProfile(profile, index);\n }\n}\n\nexport const zeroPeopleSearchCommand = new Command()\n .name(\"people-search\")\n .description(\"Find professionals through managed zero people search\")\n .argument(\"<query>\", \"Professional research query\")\n .addOption(\n new Option(\n \"--limit <count>\",\n `Maximum profiles (1-${ZERO_PEOPLE_SEARCH_MAX_LIMIT})`,\n )\n .default(ZERO_PEOPLE_SEARCH_DEFAULT_LIMIT)\n .argParser(parseLimit),\n )\n .option(\"--json\", \"Print the raw people-search response as JSON\")\n .action(\n withErrorHandler(async (query: string, options: PeopleSearchOptions) => {\n const request = zeroPeopleSearchRequestSchema.safeParse({\n query,\n limit: options.limit,\n });\n if (!request.success) {\n throw new InvalidArgumentError(\n request.error.issues[0]?.message ??\n \"people-search request is invalid\",\n );\n }\n const response = await callZeroPeopleSearch(request.data);\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n console.log(chalk.green(\"✓ People search completed\"));\n renderMetadata(response);\n renderProfiles(response);\n }),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Find a professional: zero people-search \"Who leads platform engineering at Notion?\"\n Search by criteria: zero people-search \"Fintech compliance leaders in New York\" --limit 10\n Machine-readable: zero people-search \"Kubernetes platform engineers\" --json\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires people-search:read capability) or a CLI token\n - Successful requests use managed credits, including searches with no matches\n - Queries are sent to vm0's managed Perplexity provider; never include secrets or private context\n - Profile fields are model-extracted from public professional sources and are not verified facts\n - Verify important claims using the provider-backed source URLs shown with each profile\n - Use only for legitimate professional research; never for harassment, doxxing, stalking, unauthorized background screening, or unlawful employment/privacy decisions\n - This command does not enrich email/phone data, message people, scrape profiles, or access authenticated LinkedIn`,\n );\n","import {\n zeroPeopleSearchContract,\n type ZeroPeopleSearchRequest,\n type ZeroPeopleSearchResponse,\n} from \"@vm0/api-contracts/contracts/zero-people-search\";\nimport { initClient } from \"@vm0/api-contracts/contracts/trpc-contract\";\n\nimport { getClientConfig, handleError } from \"../core/client-factory\";\n\nexport async function callZeroPeopleSearch(\n body: ZeroPeopleSearchRequest,\n): Promise<ZeroPeopleSearchResponse> {\n const config = await getClientConfig();\n const client = initClient(zeroPeopleSearchContract, config);\n const result = await client.search({ headers: {}, body });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to search for people\");\n}\n"],"mappings":"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","names":[]}
@@ -2,24 +2,29 @@
2
2
  import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
- completePhoneFileUpload,
6
- downloadPhoneFile,
7
- initPhoneFileUpload,
8
- sendPhoneMessage
9
- } from "./chunk-6PN6QGIM.js";
10
- import "./chunk-V7A6ZFHR.js";
11
- import "./chunk-ANOLYIPL.js";
5
+ integrationsPhoneMessageContract,
6
+ integrationsPhoneUploadCompleteContract,
7
+ integrationsPhoneUploadInitContract
8
+ } from "./chunk-B6RXOHA2.js";
9
+ import "./chunk-NIG6LRRX.js";
12
10
  import {
11
+ ApiRequestError,
12
+ getActiveToken,
13
+ getBaseUrl,
14
+ getClientConfig,
15
+ handleError,
16
+ headersWithCliClientHeaders,
17
+ initClient,
13
18
  source_default,
14
19
  withErrorHandler
15
- } from "./chunk-5ZZI2LSO.js";
16
- import "./chunk-32FE3MDA.js";
20
+ } from "./chunk-U2PPHCTL.js";
21
+ import "./chunk-KHPTA6UQ.js";
17
22
  import {
18
23
  Command
19
- } from "./chunk-JAUTPXVK.js";
24
+ } from "./chunk-PAULHBEP.js";
20
25
  import {
21
26
  init_esm_shims
22
- } from "./chunk-AUWSMG4F.js";
27
+ } from "./chunk-52CNCL6Y.js";
23
28
 
24
29
  // src/commands/zero/phone/index.ts
25
30
  init_esm_shims();
@@ -28,6 +33,82 @@ init_esm_shims();
28
33
  init_esm_shims();
29
34
  import { basename, join } from "path";
30
35
  import { tmpdir } from "os";
36
+
37
+ // src/lib/api/domains/integrations-phone.ts
38
+ init_esm_shims();
39
+ import { createWriteStream } from "fs";
40
+ import { Readable } from "stream";
41
+ import { pipeline } from "stream/promises";
42
+ async function sendPhoneMessage(body) {
43
+ const config = await getClientConfig();
44
+ const client = initClient(integrationsPhoneMessageContract, config);
45
+ const result = await client.sendMessage({ body, headers: {} });
46
+ if (result.status === 200) {
47
+ return result.body;
48
+ }
49
+ handleError(result, "Failed to send AgentPhone message");
50
+ }
51
+ async function initPhoneFileUpload(body) {
52
+ const config = await getClientConfig();
53
+ const client = initClient(integrationsPhoneUploadInitContract, config);
54
+ const result = await client.init({ body, headers: {} });
55
+ if (result.status === 200) {
56
+ return result.body;
57
+ }
58
+ handleError(result, "Failed to initialize AgentPhone file upload");
59
+ }
60
+ async function completePhoneFileUpload(body) {
61
+ const config = await getClientConfig();
62
+ const client = initClient(integrationsPhoneUploadCompleteContract, config);
63
+ const result = await client.complete({ body, headers: {} });
64
+ if (result.status === 200) {
65
+ return result.body;
66
+ }
67
+ handleError(result, "Failed to complete AgentPhone file upload");
68
+ }
69
+ async function downloadPhoneFile(fileId, outPath) {
70
+ const baseUrl = await getBaseUrl();
71
+ const token = await getActiveToken();
72
+ if (!token) {
73
+ throw new ApiRequestError("Not authenticated", "UNAUTHORIZED", 401);
74
+ }
75
+ const url = new URL("/api/zero/integrations/phone/download-file", baseUrl);
76
+ url.searchParams.set("file_id", fileId);
77
+ const headers = {
78
+ Authorization: `Bearer ${token}`
79
+ };
80
+ const response = await fetch(url, {
81
+ headers: headersWithCliClientHeaders(headers)
82
+ });
83
+ if (!response.ok) {
84
+ let message = `Failed to download AgentPhone file (HTTP ${response.status})`;
85
+ let code = "UNKNOWN";
86
+ try {
87
+ const body = await response.json();
88
+ if (body.error?.message) message = body.error.message;
89
+ if (body.error?.code) code = body.error.code;
90
+ } catch {
91
+ }
92
+ throw new ApiRequestError(message, code, response.status);
93
+ }
94
+ if (!response.body) {
95
+ throw new ApiRequestError(
96
+ "AgentPhone download response has no body",
97
+ "EMPTY_BODY",
98
+ 502
99
+ );
100
+ }
101
+ const mimetype = response.headers.get("x-file-mimetype") ?? response.headers.get("content-type") ?? "application/octet-stream";
102
+ await pipeline(
103
+ Readable.fromWeb(response.body),
104
+ createWriteStream(outPath)
105
+ );
106
+ const contentLengthHeader = response.headers.get("content-length");
107
+ const size = contentLengthHeader ? Number(contentLengthHeader) : 0;
108
+ return { path: outPath, mimetype, size };
109
+ }
110
+
111
+ // src/commands/zero/phone/download-file.ts
31
112
  function defaultOutPath(fileId) {
32
113
  return join(tmpdir(), `phone-${basename(fileId)}`);
33
114
  }
@@ -204,4 +285,4 @@ Examples:
204
285
  export {
205
286
  zeroPhoneCommand
206
287
  };
207
- //# sourceMappingURL=phone-6SG5ZUNL.js.map
288
+ //# sourceMappingURL=phone-YZ7TX25A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/phone/index.ts","../src/commands/zero/phone/download-file.ts","../src/lib/api/domains/integrations-phone.ts","../src/commands/zero/phone/message.ts","../src/commands/zero/phone/upload-file.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { messageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroPhoneCommand = new Command()\n .name(\"phone\")\n .description(\"Send AgentPhone messages, upload files, and download media\")\n .addCommand(messageCommand)\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send a message: zero phone message --to +15551234567 -t \"Hello!\"\n Upload a file: zero phone upload-file -f /tmp/report.pdf --to +15551234567\n Download a file: zero phone download-file <file-id> -o /tmp/out.jpg`,\n );\n","import { basename, join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadPhoneFile } from \"../../../lib/api/domains/integrations-phone\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `phone-${basename(fileId)}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download an AgentPhone media file by id\")\n .argument(\n \"<file-id>\",\n \"AgentPhone message id from an [AgentPhone file] block\",\n )\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/phone-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero phone download-file msg_123\n Download to explicit path: zero phone download-file msg_123 -o /tmp/photo.jpg\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/phone-msg_123\",\"mimetype\":\"image/jpeg\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): transcribe audio first with\n zero video transcribe --url <download-url>\n or extract frames with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n - PDF/text/csv/json/markdown: read the file directly`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadPhoneFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { createWriteStream } from \"node:fs\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { initClient } from \"@vm0/api-contracts/contracts/trpc-contract\";\nimport {\n integrationsPhoneMessageContract,\n integrationsPhoneUploadCompleteContract,\n integrationsPhoneUploadInitContract,\n type PhoneUploadCompleteBody,\n type PhoneUploadCompleteResponse,\n type PhoneUploadInitBody,\n type PhoneUploadInitResponse,\n type SendPhoneMessageBody,\n type SendPhoneMessageResponse,\n} from \"@vm0/api-contracts/contracts/integrations\";\nimport {\n ApiRequestError,\n getBaseUrl,\n getClientConfig,\n handleError,\n} from \"../core/client-factory\";\nimport { getActiveToken } from \"../config\";\nimport { headersWithCliClientHeaders } from \"../client-headers\";\n\ninterface DownloadPhoneFileResult {\n path: string;\n mimetype: string;\n size: number;\n}\n\nexport async function sendPhoneMessage(\n body: SendPhoneMessageBody,\n): Promise<SendPhoneMessageResponse> {\n const config = await getClientConfig();\n const client = initClient(integrationsPhoneMessageContract, config);\n\n const result = await client.sendMessage({ body, headers: {} });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to send AgentPhone message\");\n}\n\nexport async function initPhoneFileUpload(\n body: PhoneUploadInitBody,\n): Promise<PhoneUploadInitResponse> {\n const config = await getClientConfig();\n const client = initClient(integrationsPhoneUploadInitContract, config);\n\n const result = await client.init({ body, headers: {} });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to initialize AgentPhone file upload\");\n}\n\nexport async function completePhoneFileUpload(\n body: PhoneUploadCompleteBody,\n): Promise<PhoneUploadCompleteResponse> {\n const config = await getClientConfig();\n const client = initClient(integrationsPhoneUploadCompleteContract, config);\n\n const result = await client.complete({ body, headers: {} });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to complete AgentPhone file upload\");\n}\n\n/**\n * Download an AgentPhone media attachment to a local path.\n */\nexport async function downloadPhoneFile(\n fileId: string,\n outPath: string,\n): Promise<DownloadPhoneFileResult> {\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n\n const url = new URL(\"/api/zero/integrations/phone/download-file\", baseUrl);\n url.searchParams.set(\"file_id\", fileId);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n\n const response = await fetch(url, {\n headers: headersWithCliClientHeaders(headers),\n });\n\n if (!response.ok) {\n let message = `Failed to download AgentPhone file (HTTP ${response.status})`;\n let code = \"UNKNOWN\";\n try {\n const body = (await response.json()) as {\n error?: { message?: string; code?: string };\n };\n if (body.error?.message) message = body.error.message;\n if (body.error?.code) code = body.error.code;\n } catch {\n // keep generic message when the body is not JSON\n }\n throw new ApiRequestError(message, code, response.status);\n }\n\n if (!response.body) {\n throw new ApiRequestError(\n \"AgentPhone download response has no body\",\n \"EMPTY_BODY\",\n 502,\n );\n }\n\n const mimetype =\n response.headers.get(\"x-file-mimetype\") ??\n response.headers.get(\"content-type\") ??\n \"application/octet-stream\";\n\n await pipeline(\n Readable.fromWeb(response.body as never),\n createWriteStream(outPath),\n );\n\n const contentLengthHeader = response.headers.get(\"content-length\");\n const size = contentLengthHeader ? Number(contentLengthHeader) : 0;\n\n return { path: outPath, mimetype, size };\n}\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendPhoneMessage } from \"../../../lib/api/domains/integrations-phone\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\nexport const messageCommand = new Command()\n .name(\"message\")\n .description(\"Send an AgentPhone text message\")\n .requiredOption(\"--to <phone>\", \"Connected phone handle to message\")\n .option(\"--agent-id <id>\", \"AgentPhone agent ID (inferred when omitted)\")\n .option(\"-t, --text <message>\", \"Message text\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Send a message: zero phone message --to +15551234567 -t \"Hello!\"\n From stdin: printf \"Hello!\" | zero phone message --to +15551234567\n\nNotes:\n - The phone handle must already be connected to the authenticated VM0 user\n - AgentPhone agent ID is inferred from the conversation when omitted`,\n )\n .action(\n withErrorHandler(\n async (options: { to: string; agentId?: string; text?: string }) => {\n let text = options.text;\n if (!text && !process.stdin.isTTY) {\n try {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n } catch {\n // stdin not readable (e.g. test runner with no piped input);\n // fall through to the missing-text validation below.\n }\n }\n\n if (!text) {\n throw new Error(\"Either --text or piped stdin must be provided\", {\n cause: new Error(\n 'Usage: zero phone message --to +15551234567 -t \"your message\"',\n ),\n });\n }\n\n const result = await sendPhoneMessage({\n toNumber: options.to,\n text,\n agentphoneAgentId: options.agentId,\n });\n\n console.log(\n chalk.green(`✓ Message sent (message_id: ${result.messageId})`),\n );\n },\n ),\n );\n","import { readFileSync, statSync } from \"fs\";\nimport { basename, extname } from \"path\";\nimport { Command } from \"commander\";\nimport {\n completePhoneFileUpload,\n initPhoneFileUpload,\n} from \"../../../lib/api/domains/integrations-phone\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".md\": \"text/markdown\",\n \".json\": \"application/json\",\n};\n\nfunction inferContentType(localPath: string): string {\n const ext = extname(localPath).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? \"application/octet-stream\";\n}\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file to an AgentPhone conversation\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"--to <phone>\", \"Connected phone handle to message\")\n .option(\"--agent-id <id>\", \"AgentPhone agent ID (inferred when omitted)\")\n .option(\"--caption <text>\", \"Caption to accompany the file\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero phone upload-file -f /tmp/report.pdf --to +15551234567\n With a caption: zero phone upload-file -f /tmp/photo.jpg --to +15551234567 --caption \"Here it is\"\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"messageId\":\"msg_123\",\"toNumber\":\"+15551234567\",\"filename\":\"report.pdf\",\"mimetype\":\"application/pdf\",\"size\":12345,\"url\":\"https://...\"}`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n to: string;\n agentId?: string;\n caption?: string;\n contentType?: string;\n }) => {\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n if (!stat.isFile()) {\n throw new Error(`Not a regular file: ${options.file}`);\n }\n fileSize = stat.size;\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Not \")) {\n throw error;\n }\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n\n const filename = basename(options.file);\n const contentType =\n options.contentType ?? inferContentType(options.file);\n\n const prepared = await initPhoneFileUpload({\n filename,\n contentType,\n length: fileSize,\n supportsUploadHeaders: true,\n });\n\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": prepared.contentType,\n ...prepared.uploadHeaders,\n },\n body: new Uint8Array(fileContent),\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n const result = await completePhoneFileUpload({\n uploadId: prepared.uploadId,\n toNumber: options.to,\n agentphoneAgentId: options.agentId,\n contentType: prepared.contentType,\n caption: options.caption,\n });\n\n console.log(JSON.stringify(result));\n },\n ),\n );\n"],"mappings":"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","names":["readFileSync","basename","basename","readFileSync"]}
@@ -1,32 +1,50 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
+ import {
5
+ inferWebUploadContentType,
6
+ uploadWebFile
7
+ } from "./chunk-WERS62WT.js";
4
8
  import {
5
9
  ZERO_RECOGNITION_MAX_FILE_BYTES,
6
10
  ZERO_RECOGNITION_MAX_PROMPT_CHARS,
7
- callZeroRecognition,
11
+ zeroRecognitionContract,
8
12
  zeroRecognitionImageMimeTypeSchema
9
- } from "./chunk-6PN6QGIM.js";
10
- import {
11
- inferWebUploadContentType,
12
- uploadWebFile
13
- } from "./chunk-V7A6ZFHR.js";
14
- import "./chunk-ANOLYIPL.js";
13
+ } from "./chunk-ML33LZ5V.js";
14
+ import "./chunk-CMWQJ3XO.js";
15
+ import "./chunk-NIG6LRRX.js";
15
16
  import {
16
17
  ApiRequestError,
18
+ getClientConfig,
19
+ handleError,
20
+ initClient,
17
21
  withErrorHandler
18
- } from "./chunk-5ZZI2LSO.js";
19
- import "./chunk-32FE3MDA.js";
22
+ } from "./chunk-U2PPHCTL.js";
23
+ import "./chunk-KHPTA6UQ.js";
20
24
  import {
21
25
  Command
22
- } from "./chunk-JAUTPXVK.js";
26
+ } from "./chunk-PAULHBEP.js";
23
27
  import {
24
28
  init_esm_shims
25
- } from "./chunk-AUWSMG4F.js";
29
+ } from "./chunk-52CNCL6Y.js";
26
30
 
27
31
  // src/commands/zero/recognize/index.ts
28
32
  init_esm_shims();
29
33
  import { statSync } from "fs";
34
+
35
+ // src/lib/api/domains/zero-recognition.ts
36
+ init_esm_shims();
37
+ async function callZeroRecognition(body) {
38
+ const config = await getClientConfig();
39
+ const client = initClient(zeroRecognitionContract, config);
40
+ const result = await client.recognize({ headers: {}, body });
41
+ if (result.status === 200) {
42
+ return result.body;
43
+ }
44
+ handleError(result, "Failed to recognize image");
45
+ }
46
+
47
+ // src/commands/zero/recognize/index.ts
30
48
  function validatePrompt(prompt) {
31
49
  const trimmed = prompt.trim();
32
50
  if (!trimmed) {
@@ -104,4 +122,4 @@ Notes:
104
122
  export {
105
123
  zeroRecognizeCommand
106
124
  };
107
- //# sourceMappingURL=recognize-LLU6J3SW.js.map
125
+ //# sourceMappingURL=recognize-XKO53YEI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/recognize/index.ts","../src/lib/api/domains/zero-recognition.ts"],"sourcesContent":["import { statSync } from \"node:fs\";\n\nimport {\n ZERO_RECOGNITION_MAX_FILE_BYTES,\n ZERO_RECOGNITION_MAX_PROMPT_CHARS,\n zeroRecognitionImageMimeTypeSchema,\n type ZeroRecognitionImageMimeType,\n} from \"@vm0/api-contracts/contracts/zero-recognition\";\nimport { Command } from \"commander\";\n\nimport { ApiRequestError } from \"../../../lib/api/core/client-factory\";\nimport { callZeroRecognition } from \"../../../lib/api/domains/zero-recognition\";\nimport {\n inferWebUploadContentType,\n uploadWebFile,\n} from \"../../../lib/api/domains/web\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\ninterface RecognizeOptions {\n readonly file: string;\n readonly prompt: string;\n}\n\nfunction validatePrompt(prompt: string): string {\n const trimmed = prompt.trim();\n if (!trimmed) {\n throw new ApiRequestError(\n \"Recognition prompt must not be empty\",\n \"BAD_REQUEST\",\n 400,\n );\n }\n if (trimmed.length > ZERO_RECOGNITION_MAX_PROMPT_CHARS) {\n throw new ApiRequestError(\n `Recognition prompt must be ${ZERO_RECOGNITION_MAX_PROMPT_CHARS} characters or fewer`,\n \"BAD_REQUEST\",\n 400,\n );\n }\n return trimmed;\n}\n\nfunction validateImageFile(file: string): ZeroRecognitionImageMimeType {\n const stats = statSync(file);\n if (!stats.isFile()) {\n throw new ApiRequestError(\n `Not a regular file: ${file}`,\n \"BAD_REQUEST\",\n 400,\n );\n }\n if (stats.size === 0) {\n throw new ApiRequestError(\n \"Image file must not be empty\",\n \"BAD_REQUEST\",\n 400,\n );\n }\n if (stats.size > ZERO_RECOGNITION_MAX_FILE_BYTES) {\n throw new ApiRequestError(\n \"Image file must be 20 MB or smaller\",\n \"PAYLOAD_TOO_LARGE\",\n 413,\n );\n }\n\n const contentType = inferWebUploadContentType(file);\n const parsed = zeroRecognitionImageMimeTypeSchema.safeParse(contentType);\n if (!parsed.success) {\n throw new ApiRequestError(\n \"Image must be a PNG, JPEG, or WebP file\",\n \"BAD_REQUEST\",\n 400,\n );\n }\n return parsed.data;\n}\n\nexport const zeroRecognizeCommand = new Command()\n .name(\"recognize\")\n .description(\"Recognize one image through a managed multimodal model\")\n .requiredOption(\"-f, --file <path>\", \"Local PNG, JPEG, or WebP image\")\n .requiredOption(\"-p, --prompt <instruction>\", \"Recognition instruction\")\n .action(\n withErrorHandler(async (options: RecognizeOptions) => {\n const prompt = validatePrompt(options.prompt);\n const contentType = validateImageFile(options.file);\n const uploaded = await uploadWebFile(options.file, { contentType });\n const response = await callZeroRecognition({\n fileId: uploaded.id,\n prompt,\n });\n console.log(response.text);\n }),\n )\n .addHelpText(\n \"after\",\n `\nExample:\n zero recognize --file ./screenshot.png --prompt \"Describe the error shown\"\n\nNotes:\n - Available only in runs whose selected model does not support image input\n - Accepts one PNG, JPEG, or WebP image up to 20 MB\n - Uses a fixed vm0-managed recognition model and prints only recognized text`,\n );\n","import {\n zeroRecognitionContract,\n type ZeroRecognitionRequest,\n type ZeroRecognitionResponse,\n} from \"@vm0/api-contracts/contracts/zero-recognition\";\nimport { initClient } from \"@vm0/api-contracts/contracts/trpc-contract\";\n\nimport { getClientConfig, handleError } from \"../core/client-factory\";\n\nexport async function callZeroRecognition(\n body: ZeroRecognitionRequest,\n): Promise<ZeroRecognitionResponse> {\n const config = await getClientConfig();\n const client = initClient(zeroRecognitionContract, config);\n const result = await client.recognize({ headers: {}, body });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to recognize image\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,gBAAgB;;;ACAzB;AASA,eAAsB,oBACpB,MACkC;AAClC,QAAM,SAAS,MAAM,gBAAgB;AACrC,QAAM,SAAS,WAAW,yBAAyB,MAAM;AACzD,QAAM,SAAS,MAAM,OAAO,UAAU,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;AAC3D,MAAI,OAAO,WAAW,KAAK;AACzB,WAAO,OAAO;AAAA,EAChB;AACA,cAAY,QAAQ,2BAA2B;AACjD;;;ADIA,SAAS,eAAe,QAAwB;AAC9C,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,mCAAmC;AACtD,UAAM,IAAI;AAAA,MACR,8BAA8B,iCAAiC;AAAA,MAC/D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA4C;AACrE,QAAM,QAAQ,SAAS,IAAI;AAC3B,MAAI,CAAC,MAAM,OAAO,GAAG;AACnB,UAAM,IAAI;AAAA,MACR,uBAAuB,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,OAAO,iCAAiC;AAChD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,0BAA0B,IAAI;AAClD,QAAM,SAAS,mCAAmC,UAAU,WAAW;AACvE,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEO,IAAM,uBAAuB,IAAI,QAAQ,EAC7C,KAAK,WAAW,EAChB,YAAY,wDAAwD,EACpE,eAAe,qBAAqB,gCAAgC,EACpE,eAAe,8BAA8B,yBAAyB,EACtE;AAAA,EACC,iBAAiB,OAAO,YAA8B;AACpD,UAAM,SAAS,eAAe,QAAQ,MAAM;AAC5C,UAAM,cAAc,kBAAkB,QAAQ,IAAI;AAClD,UAAM,WAAW,MAAM,cAAc,QAAQ,MAAM,EAAE,YAAY,CAAC;AAClE,UAAM,WAAW,MAAM,oBAAoB;AAAA,MACzC,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,SAAS,IAAI;AAAA,EAC3B,CAAC;AACH,EACC;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQF;","names":[]}
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
+ import {
5
+ registryResourceDownloadContract
6
+ } from "./chunk-PO3DAXC6.js";
4
7
  import {
5
8
  findColorSystem,
6
9
  findDesignSystem,
@@ -10,23 +13,22 @@ import {
10
13
  findTool,
11
14
  findVideoTemplate,
12
15
  findWebsiteTemplateResource
13
- } from "./chunk-NKYACNWA.js";
14
- import {
15
- getRegistryResourceDownload
16
- } from "./chunk-6PN6QGIM.js";
17
- import "./chunk-V7A6ZFHR.js";
18
- import "./chunk-ANOLYIPL.js";
16
+ } from "./chunk-DUWZNPUA.js";
17
+ import "./chunk-NIG6LRRX.js";
19
18
  import {
19
+ getClientConfig,
20
+ handleError,
21
+ initClient,
20
22
  source_default,
21
23
  withErrorHandler
22
- } from "./chunk-5ZZI2LSO.js";
23
- import "./chunk-32FE3MDA.js";
24
+ } from "./chunk-U2PPHCTL.js";
25
+ import "./chunk-KHPTA6UQ.js";
24
26
  import {
25
27
  Command
26
- } from "./chunk-JAUTPXVK.js";
28
+ } from "./chunk-PAULHBEP.js";
27
29
  import {
28
30
  init_esm_shims
29
- } from "./chunk-AUWSMG4F.js";
31
+ } from "./chunk-52CNCL6Y.js";
30
32
 
31
33
  // src/commands/zero/resource/index.ts
32
34
  init_esm_shims();
@@ -3005,6 +3007,18 @@ var To = (s3) => {
3005
3007
  s3.mtimeCache || (s3.mtimeCache = /* @__PURE__ */ new Map()), s3.filter = t ? (e, i) => t(e, i) && !((s3.mtimeCache?.get(e) ?? i.mtime ?? 0) > (i.mtime ?? 0)) : (e, i) => !((s3.mtimeCache?.get(e) ?? i.mtime ?? 0) > (i.mtime ?? 0));
3006
3008
  };
3007
3009
 
3010
+ // src/lib/api/domains/registry-resources.ts
3011
+ init_esm_shims();
3012
+ async function getRegistryResourceDownload(query) {
3013
+ const config = await getClientConfig();
3014
+ const client = initClient(registryResourceDownloadContract, config);
3015
+ const result = await client.download({ query });
3016
+ if (result.status === 200) {
3017
+ return result.body;
3018
+ }
3019
+ handleError(result, `Registry resource "${query.id}" not found`);
3020
+ }
3021
+
3008
3022
  // src/commands/zero/resource/index.ts
3009
3023
  function candidateIds(id) {
3010
3024
  if (id.includes(":")) {
@@ -3110,4 +3124,4 @@ export {
3110
3124
  findRegistryResourceForPull,
3111
3125
  zeroResourceCommand
3112
3126
  };
3113
- //# sourceMappingURL=resource-FGUSXS4G.js.map
3127
+ //# sourceMappingURL=resource-V43QBVKO.js.map