@vm0/cli 9.278.0 → 9.278.1

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 (194) hide show
  1. package/{agent-HUDTEGLK.js → agent-4F3XAJWN.js} +12 -6
  2. package/agent-4F3XAJWN.js.map +1 -0
  3. package/{banking-BMZONEXP.js → banking-CWQFQKZB.js} +61 -7
  4. package/banking-CWQFQKZB.js.map +1 -0
  5. package/{browser-LQP445CU.js → browser-BI6UFWPH.js} +4 -5
  6. package/browser-BI6UFWPH.js.map +1 -0
  7. package/{chat-UF7QAWUT.js → chat-MKIW4FPP.js} +24 -16
  8. package/chat-MKIW4FPP.js.map +1 -0
  9. package/chunk-2SJTFDC2.js +189 -0
  10. package/chunk-2SJTFDC2.js.map +1 -0
  11. package/chunk-4FTIKZKP.js +64 -0
  12. package/chunk-4FTIKZKP.js.map +1 -0
  13. package/chunk-7UZXNER2.js +568 -0
  14. package/chunk-7UZXNER2.js.map +1 -0
  15. package/chunk-A6ZRMNM3.js +102 -0
  16. package/chunk-A6ZRMNM3.js.map +1 -0
  17. package/{chunk-QC63TUJC.js → chunk-C62A6LD6.js} +2 -2
  18. package/chunk-CCTF3YVW.js +52 -0
  19. package/chunk-CCTF3YVW.js.map +1 -0
  20. package/chunk-CD2BLKGC.js +188 -0
  21. package/chunk-CD2BLKGC.js.map +1 -0
  22. package/chunk-CEJGHPF3.js +55 -0
  23. package/chunk-CEJGHPF3.js.map +1 -0
  24. package/chunk-DUA6CF7E.js +2053 -0
  25. package/chunk-DUA6CF7E.js.map +1 -0
  26. package/chunk-E2TQAKNL.js +1300 -0
  27. package/chunk-E2TQAKNL.js.map +1 -0
  28. package/{chunk-5ZZI2LSO.js → chunk-GHKWW4NC.js} +5 -5
  29. package/chunk-GV3PG6CZ.js +114 -0
  30. package/chunk-GV3PG6CZ.js.map +1 -0
  31. package/chunk-GY7D76EZ.js +81 -0
  32. package/chunk-GY7D76EZ.js.map +1 -0
  33. package/chunk-HHHHZMTA.js +434 -0
  34. package/chunk-HHHHZMTA.js.map +1 -0
  35. package/chunk-HZYOJTEE.js +1275 -0
  36. package/chunk-HZYOJTEE.js.map +1 -0
  37. package/chunk-J3ZRXVI6.js +740 -0
  38. package/chunk-J3ZRXVI6.js.map +1 -0
  39. package/chunk-JJWFO27K.js +31 -0
  40. package/chunk-JJWFO27K.js.map +1 -0
  41. package/chunk-JV6LM2YC.js +39 -0
  42. package/chunk-JV6LM2YC.js.map +1 -0
  43. package/chunk-KER77KJB.js +105 -0
  44. package/chunk-KER77KJB.js.map +1 -0
  45. package/{chunk-V5ZVB7RJ.js → chunk-KKO2XGLQ.js} +1 -6
  46. package/chunk-KKO2XGLQ.js.map +1 -0
  47. package/chunk-LIYPTQAO.js +198 -0
  48. package/chunk-LIYPTQAO.js.map +1 -0
  49. package/chunk-LYLDVUHT.js +131 -0
  50. package/chunk-LYLDVUHT.js.map +1 -0
  51. package/chunk-PFWBO2VK.js +801 -0
  52. package/chunk-PFWBO2VK.js.map +1 -0
  53. package/chunk-RTCRU35A.js +194 -0
  54. package/chunk-RTCRU35A.js.map +1 -0
  55. package/{chunk-F2AM4RWA.js → chunk-RTEEWZUT.js} +2 -2
  56. package/{chunk-F2AM4RWA.js.map → chunk-RTEEWZUT.js.map} +1 -1
  57. package/{chunk-BRV4D3P2.js → chunk-RUKMHBNQ.js} +2 -2
  58. package/chunk-SA4DYSBR.js +31 -0
  59. package/chunk-SA4DYSBR.js.map +1 -0
  60. package/chunk-SJPOFQJU.js +792 -0
  61. package/chunk-SJPOFQJU.js.map +1 -0
  62. package/{chunk-V7A6ZFHR.js → chunk-SMPSKBAP.js} +25 -774
  63. package/chunk-SMPSKBAP.js.map +1 -0
  64. package/{chunk-E53W6UVQ.js → chunk-T2X2EGV2.js} +4 -4
  65. package/chunk-T2X2EGV2.js.map +1 -0
  66. package/chunk-U2GQH6AD.js +309 -0
  67. package/chunk-U2GQH6AD.js.map +1 -0
  68. package/chunk-U6A2RPHO.js +66 -0
  69. package/chunk-U6A2RPHO.js.map +1 -0
  70. package/chunk-UIXUGVZB.js +362 -0
  71. package/chunk-UIXUGVZB.js.map +1 -0
  72. package/chunk-XRZKJACM.js +49 -0
  73. package/chunk-XRZKJACM.js.map +1 -0
  74. package/chunk-YDS3X7KB.js +202 -0
  75. package/chunk-YDS3X7KB.js.map +1 -0
  76. package/{chunk-A6TMOGPR.js → chunk-ZKNJW4K6.js} +1412 -334
  77. package/chunk-ZKNJW4K6.js.map +1 -0
  78. package/chunk-ZXSCBS77.js +90 -0
  79. package/chunk-ZXSCBS77.js.map +1 -0
  80. package/{computer-use-RRD7BCCK.js → computer-use-6AEVW47F.js} +9 -7
  81. package/computer-use-6AEVW47F.js.map +1 -0
  82. package/{connector-XX7UU6XE.js → connector-XDQ6JEBU.js} +25 -13
  83. package/connector-XDQ6JEBU.js.map +1 -0
  84. package/{credit-GDNNAQRO.js → credit-JPQA5XPA.js} +8 -10
  85. package/credit-JPQA5XPA.js.map +1 -0
  86. package/{developer-support-IISP5UBI.js → developer-support-V7NZOU2P.js} +27 -7
  87. package/developer-support-V7NZOU2P.js.map +1 -0
  88. package/{doctor-IZM2TJOH.js → doctor-FJO24TG3.js} +13 -11
  89. package/doctor-FJO24TG3.js.map +1 -0
  90. package/{feishu-XB7SQBSI.js → feishu-PNOAM33Q.js} +99 -9
  91. package/feishu-PNOAM33Q.js.map +1 -0
  92. package/{finance-OGWHKQLU.js → finance-55OJ6GYP.js} +49 -9
  93. package/finance-55OJ6GYP.js.map +1 -0
  94. package/{generate-AA2PVOYQ.js → generate-XUKBK523.js} +26 -21
  95. package/generate-XUKBK523.js.map +1 -0
  96. package/{github-VJVIBTVF.js → github-V4MD2PMM.js} +83 -8
  97. package/github-V4MD2PMM.js.map +1 -0
  98. package/{goal-7SYVHDTK.js → goal-FS5FJKVU.js} +69 -13
  99. package/goal-FS5FJKVU.js.map +1 -0
  100. package/{host-UVQMIOBA.js → host-GITTJ6PR.js} +124 -10
  101. package/host-GITTJ6PR.js.map +1 -0
  102. package/{logs-PIS4X24E.js → logs-EEUIGYUD.js} +51 -11
  103. package/logs-EEUIGYUD.js.map +1 -0
  104. package/{mail-L33OSQ2R.js → mail-G4SAJSBD.js} +39 -8
  105. package/mail-G4SAJSBD.js.map +1 -0
  106. package/{maps-D5XTXU5U.js → maps-7ANNU3BX.js} +65 -11
  107. package/maps-7ANNU3BX.js.map +1 -0
  108. package/{model-ZFMRECDM.js → model-DSPDCJLB.js} +6 -6
  109. package/model-DSPDCJLB.js.map +1 -0
  110. package/{model-provider-EZZ2DRYZ.js → model-provider-RZQ45PNG.js} +6 -6
  111. package/model-provider-RZQ45PNG.js.map +1 -0
  112. package/package.json +1 -1
  113. package/{people-search-PFTIO2QS.js → people-search-I7PUMF5M.js} +22 -6
  114. package/people-search-I7PUMF5M.js.map +1 -0
  115. package/{phone-6SG5ZUNL.js → phone-SSAPGMTW.js} +90 -9
  116. package/phone-SSAPGMTW.js.map +1 -0
  117. package/{recognize-LLU6J3SW.js → recognize-D7VORZBN.js} +27 -9
  118. package/recognize-D7VORZBN.js.map +1 -0
  119. package/{resource-FGUSXS4G.js → resource-76IV3TMW.js} +21 -7
  120. package/resource-76IV3TMW.js.map +1 -0
  121. package/{scrape-BAUZ2YFD.js → scrape-JBDLNTLB.js} +22 -6
  122. package/scrape-JBDLNTLB.js.map +1 -0
  123. package/{search-DLO5RXRM.js → search-UNZNUTZX.js} +29 -9
  124. package/search-UNZNUTZX.js.map +1 -0
  125. package/{slack-CVATPKP3.js → slack-AAH6GG2W.js} +103 -11
  126. package/slack-AAH6GG2W.js.map +1 -0
  127. package/{teams-ZZYO6YIK.js → teams-6OPXE4TX.js} +90 -9
  128. package/teams-6OPXE4TX.js.map +1 -0
  129. package/{telegram-VY7T4YAR.js → telegram-RRZG73RT.js} +101 -10
  130. package/telegram-RRZG73RT.js.map +1 -0
  131. package/{upgrade-GFA4ZUU4.js → upgrade-I5IL4UQL.js} +3 -4
  132. package/upgrade-I5IL4UQL.js.map +1 -0
  133. package/{video-STFG7BET.js → video-HV44W4X7.js} +5 -4
  134. package/video-HV44W4X7.js.map +1 -0
  135. package/{weather-ISJEHJWR.js → weather-EQ7CSADB.js} +70 -16
  136. package/weather-EQ7CSADB.js.map +1 -0
  137. package/{web-YN4CVHK7.js → web-6LIMWEOZ.js} +5 -5
  138. package/web-6LIMWEOZ.js.map +1 -0
  139. package/{web-search-PC7IECND.js → web-search-AT7WONZN.js} +22 -6
  140. package/web-search-AT7WONZN.js.map +1 -0
  141. package/{whoami-KXFXZGM6.js → whoami-RKTLLSI4.js} +16 -7
  142. package/whoami-RKTLLSI4.js.map +1 -0
  143. package/{workflow-O7YZHB7A.js → workflow-ZH32P622.js} +135 -39
  144. package/workflow-ZH32P622.js.map +1 -0
  145. package/zero.js +40 -40
  146. package/agent-HUDTEGLK.js.map +0 -1
  147. package/banking-BMZONEXP.js.map +0 -1
  148. package/browser-LQP445CU.js.map +0 -1
  149. package/chat-UF7QAWUT.js.map +0 -1
  150. package/chunk-2W73DZDW.js +0 -32
  151. package/chunk-2W73DZDW.js.map +0 -1
  152. package/chunk-6PN6QGIM.js +0 -11405
  153. package/chunk-6PN6QGIM.js.map +0 -1
  154. package/chunk-A6TMOGPR.js.map +0 -1
  155. package/chunk-ANOLYIPL.js +0 -10
  156. package/chunk-ANOLYIPL.js.map +0 -1
  157. package/chunk-E53W6UVQ.js.map +0 -1
  158. package/chunk-V5ZVB7RJ.js.map +0 -1
  159. package/chunk-V7A6ZFHR.js.map +0 -1
  160. package/computer-use-RRD7BCCK.js.map +0 -1
  161. package/connector-XX7UU6XE.js.map +0 -1
  162. package/credit-GDNNAQRO.js.map +0 -1
  163. package/developer-support-IISP5UBI.js.map +0 -1
  164. package/doctor-IZM2TJOH.js.map +0 -1
  165. package/feishu-XB7SQBSI.js.map +0 -1
  166. package/finance-OGWHKQLU.js.map +0 -1
  167. package/generate-AA2PVOYQ.js.map +0 -1
  168. package/github-VJVIBTVF.js.map +0 -1
  169. package/goal-7SYVHDTK.js.map +0 -1
  170. package/host-UVQMIOBA.js.map +0 -1
  171. package/logs-PIS4X24E.js.map +0 -1
  172. package/mail-L33OSQ2R.js.map +0 -1
  173. package/maps-D5XTXU5U.js.map +0 -1
  174. package/model-ZFMRECDM.js.map +0 -1
  175. package/model-provider-EZZ2DRYZ.js.map +0 -1
  176. package/people-search-PFTIO2QS.js.map +0 -1
  177. package/phone-6SG5ZUNL.js.map +0 -1
  178. package/recognize-LLU6J3SW.js.map +0 -1
  179. package/resource-FGUSXS4G.js.map +0 -1
  180. package/scrape-BAUZ2YFD.js.map +0 -1
  181. package/search-DLO5RXRM.js.map +0 -1
  182. package/slack-CVATPKP3.js.map +0 -1
  183. package/teams-ZZYO6YIK.js.map +0 -1
  184. package/telegram-VY7T4YAR.js.map +0 -1
  185. package/upgrade-GFA4ZUU4.js.map +0 -1
  186. package/video-STFG7BET.js.map +0 -1
  187. package/weather-ISJEHJWR.js.map +0 -1
  188. package/web-YN4CVHK7.js.map +0 -1
  189. package/web-search-PC7IECND.js.map +0 -1
  190. package/whoami-KXFXZGM6.js.map +0 -1
  191. package/workflow-O7YZHB7A.js.map +0 -1
  192. /package/{chunk-QC63TUJC.js.map → chunk-C62A6LD6.js.map} +0 -0
  193. /package/{chunk-5ZZI2LSO.js.map → chunk-GHKWW4NC.js.map} +0 -0
  194. /package/{chunk-BRV4D3P2.js.map → chunk-RUKMHBNQ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/feishu/index.ts","../src/commands/zero/feishu/download-file.ts","../src/lib/api/domains/integrations-feishu.ts","../src/commands/zero/feishu/message/index.ts","../src/commands/zero/feishu/message/send.ts","../src/commands/zero/feishu/upload-file.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { downloadFileCommand } from \"./download-file\";\nimport { zeroFeishuMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroFeishuCommand = new Command()\n .name(\"feishu\")\n .description(\"Send messages and transfer files through Feishu\")\n .addCommand(zeroFeishuMessageCommand)\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to a chat: zero feishu message send -c <chat-id> -t \"Hello!\"\n Send a DM: zero feishu message send -u <open-id> -t \"Hello!\"\n Reply in a thread: zero feishu message send -r <message-id> --thread -t \"Reply\"\n Upload a file: zero feishu upload-file -f /tmp/report.pdf -c <chat-id>\n Download a file: zero feishu download-file <message-id> <file-key> --type file`,\n );\n","import { tmpdir } from \"node:os\";\nimport { basename, join } from \"node:path\";\n\nimport { Command } from \"commander\";\nimport type { FeishuResourceType } from \"@vm0/api-contracts/contracts/integrations\";\n\nimport { downloadFeishuFile } from \"../../../lib/api/domains/integrations-feishu\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\nfunction defaultOutPath(fileKey: string): string {\n return join(tmpdir(), `feishu-${basename(fileKey).slice(0, 80)}`);\n}\n\nfunction parseResourceType(value: string): FeishuResourceType {\n if (value !== \"file\" && value !== \"image\") {\n throw new Error(\"--type must be either file or image\");\n }\n return value;\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a file from a Feishu message\")\n .argument(\"<message-id>\", \"Message ID from a [Feishu file] block\")\n .argument(\"<file-key>\", \"File key from a [Feishu file] block\")\n .requiredOption(\n \"--type <type>\",\n \"Resource type from the block: file or image\",\n )\n .option(\"-i, --installation <id>\", \"Feishu installation ID\")\n .option(\"-o, --out <path>\", \"Output path (default: /tmp/feishu-<file-key>)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Download a file: zero feishu download-file om_xxx file_xxx --type file\n Download an image: zero feishu download-file om_xxx img_xxx --type image -o /tmp/image.png\n Select an app: zero feishu download-file om_xxx file_xxx --type file -i <installation-id>\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/feishu-file_xxx\",\"mimetype\":\"application/pdf\",\"size\":12345}\n\nNotes:\n - Use the message ID, file key, and type exactly as shown in a [Feishu file] block\n - Specify --installation when the organization has multiple Feishu bots\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(\n async (\n messageId: string,\n fileKey: string,\n options: {\n readonly type: string;\n readonly installation?: string;\n readonly out?: string;\n },\n ) => {\n const outPath = options.out ?? defaultOutPath(fileKey);\n const result = await downloadFeishuFile(\n messageId,\n fileKey,\n parseResourceType(options.type),\n options.installation,\n outPath,\n );\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { createWriteStream } from \"node:fs\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\n\nimport { initClient } from \"@vm0/api-contracts/contracts/trpc-contract\";\nimport {\n integrationsFeishuUploadCompleteContract,\n integrationsFeishuUploadInitContract,\n integrationsFeishuMessageContract,\n type FeishuResourceType,\n type FeishuUploadCompleteBody,\n type FeishuUploadCompleteResponse,\n type FeishuUploadInitBody,\n type FeishuUploadInitResponse,\n type SendFeishuMessageBody,\n type SendFeishuMessageResponse,\n} from \"@vm0/api-contracts/contracts/integrations\";\n\nimport { headersWithCliClientHeaders } from \"../client-headers\";\nimport { getActiveToken } from \"../config\";\nimport {\n ApiRequestError,\n getBaseUrl,\n getClientConfig,\n handleError,\n} from \"../core/client-factory\";\n\ninterface DownloadFeishuFileResult {\n readonly path: string;\n readonly mimetype: string;\n readonly size: number;\n}\n\nexport async function sendFeishuMessage(\n body: SendFeishuMessageBody,\n): Promise<SendFeishuMessageResponse> {\n const config = await getClientConfig();\n const client = initClient(integrationsFeishuMessageContract, config);\n const result = await client.sendMessage({ body, headers: {} });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to send Feishu message\");\n}\n\nexport async function initFeishuFileUpload(\n body: FeishuUploadInitBody,\n): Promise<FeishuUploadInitResponse> {\n const config = await getClientConfig();\n const client = initClient(integrationsFeishuUploadInitContract, config);\n const result = await client.init({ body, headers: {} });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to initialize Feishu file upload\");\n}\n\nexport async function completeFeishuFileUpload(\n body: FeishuUploadCompleteBody,\n): Promise<FeishuUploadCompleteResponse> {\n const config = await getClientConfig();\n const client = initClient(integrationsFeishuUploadCompleteContract, config);\n const result = await client.complete({ body, headers: {} });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to complete Feishu file upload\");\n}\n\nexport async function downloadFeishuFile(\n messageId: string,\n fileKey: string,\n resourceType: FeishuResourceType,\n installationId: string | undefined,\n outPath: string,\n): Promise<DownloadFeishuFileResult> {\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/feishu/download-file\", baseUrl);\n url.searchParams.set(\"message_id\", messageId);\n url.searchParams.set(\"file_key\", fileKey);\n url.searchParams.set(\"type\", resourceType);\n if (installationId) {\n url.searchParams.set(\"installation_id\", installationId);\n }\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n const response = await fetch(url, {\n headers: headersWithCliClientHeaders(headers),\n });\n if (!response.ok) {\n let message = `Failed to download Feishu 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) {\n message = body.error.message;\n }\n if (body.error?.code) {\n code = body.error.code;\n }\n } catch {\n // Keep the generic error when the response body is not JSON.\n }\n throw new ApiRequestError(message, code, response.status);\n }\n if (!response.body) {\n throw new ApiRequestError(\n \"Feishu 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 await pipeline(\n Readable.fromWeb(response.body as never),\n createWriteStream(outPath),\n );\n const contentLength = response.headers.get(\"content-length\");\n const size = contentLength ? Number(contentLength) : 0;\n return { path: outPath, mimetype, size };\n}\n","import { Command } from \"commander\";\n\nimport { sendCommand } from \"./send\";\n\nexport const zeroFeishuMessageCommand = new Command()\n .name(\"message\")\n .description(\"Send Feishu messages\")\n .addCommand(sendCommand);\n","import { readFileSync } from \"node:fs\";\n\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { sendFeishuMessage } from \"../../../../lib/api/domains/integrations-feishu\";\nimport { withErrorHandler } from \"../../../../lib/command/with-error-handler\";\n\ninterface SendFeishuOptions {\n readonly installation?: string;\n readonly chat?: string;\n readonly user?: string;\n readonly reply?: string;\n readonly thread?: boolean;\n readonly text?: string;\n readonly card?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction parseCard(\n input: string | undefined,\n): Record<string, unknown> | undefined {\n if (!input) {\n return undefined;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch {\n throw new Error(\"Invalid JSON for --card flag\", {\n cause: new Error(\"Provide a valid Feishu card JSON object\"),\n });\n }\n if (!isRecord(parsed)) {\n throw new Error(\"Invalid JSON for --card\", {\n cause: new Error(\"Provide a Feishu card JSON object\"),\n });\n }\n return parsed;\n}\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Feishu chat or user\")\n .option(\"-i, --installation <id>\", \"Feishu installation ID\")\n .option(\"-c, --chat <id>\", \"Feishu chat ID\")\n .option(\"-u, --user <open-id>\", 'Feishu user open ID (use \"me\" for yourself)')\n .option(\"-r, --reply <message-id>\", \"Message ID to reply to\")\n .option(\"--thread\", \"Reply in a Feishu thread\")\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--card <json>\", \"Feishu interactive card JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Chat message: zero feishu message send -c oc_xxx -t \"Hello!\"\n Direct message: zero feishu message send -u ou_xxx -t \"Hello!\"\n DM yourself: zero feishu message send -u me -t \"Hello!\"\n Thread reply: zero feishu message send -r om_xxx --thread -t \"Reply\"\n Interactive card: zero feishu message send -c oc_xxx --card '{\"schema\":\"2.0\",\"body\":{\"elements\":[]}}'\n Select a custom app: zero feishu message send -i <installation-id> -c oc_xxx -t \"Hello!\"\n\nNotes:\n - Exactly one of --chat, --user, or --reply is required\n - Exactly one of --text or --card is required\n - --installation is required when the organization has multiple Feishu bots`,\n )\n .action(\n withErrorHandler(async (options: SendFeishuOptions) => {\n const targets = [options.chat, options.user, options.reply].filter(\n Boolean,\n );\n if (targets.length !== 1) {\n throw new Error(\n \"Exactly one of --chat, --user, or --reply must be provided\",\n );\n }\n if (options.thread && !options.reply) {\n throw new Error(\"--thread requires --reply\");\n }\n\n let text = options.text;\n if (!text && !options.card && !process.stdin.isTTY) {\n try {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n } catch {\n // stdin is not readable; fall through to normal input validation.\n }\n }\n const card = parseCard(options.card);\n if (Boolean(text) === Boolean(card)) {\n throw new Error(\"Exactly one of --text or --card must be provided\");\n }\n\n const result = await sendFeishuMessage({\n installationId: options.installation,\n chat: options.chat,\n user: options.user,\n replyToMessageId: options.reply,\n replyInThread: options.thread,\n text,\n card,\n });\n console.log(chalk.green(`✓ Message sent (message: ${result.messageId})`));\n }),\n );\n","import { readFileSync, statSync } from \"node:fs\";\nimport { basename, extname } from \"node:path\";\n\nimport { Command } from \"commander\";\nimport { FEISHU_FILE_UPLOAD_MAX_BYTES } from \"@vm0/api-contracts/contracts/integrations\";\n\nimport {\n completeFeishuFileUpload,\n initFeishuFileUpload,\n} from \"../../../lib/api/domains/integrations-feishu\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\nconst MIME_BY_EXTENSION: Readonly<Record<string, string>> = {\n \".csv\": \"text/csv\",\n \".gif\": \"image/gif\",\n \".jpeg\": \"image/jpeg\",\n \".jpg\": \"image/jpeg\",\n \".json\": \"application/json\",\n \".md\": \"text/markdown\",\n \".mov\": \"video/quicktime\",\n \".mp4\": \"video/mp4\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".svg\": \"image/svg+xml\",\n \".txt\": \"text/plain\",\n \".webm\": \"video/webm\",\n \".webp\": \"image/webp\",\n};\n\ninterface UploadFeishuOptions {\n readonly file: string;\n readonly installation?: string;\n readonly chat?: string;\n readonly user?: string;\n readonly reply?: string;\n readonly thread?: boolean;\n readonly contentType?: string;\n}\n\nfunction inferContentType(localPath: string): string {\n return (\n MIME_BY_EXTENSION[extname(localPath).toLowerCase()] ??\n \"application/octet-stream\"\n );\n}\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file to Feishu as an organization bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .option(\"-i, --installation <id>\", \"Feishu installation ID\")\n .option(\"-c, --chat <id>\", \"Feishu chat ID\")\n .option(\"-u, --user <open-id>\", 'Feishu user open ID (use \"me\" for yourself)')\n .option(\"-r, --reply <message-id>\", \"Message ID to reply to\")\n .option(\"--thread\", \"Reply in a Feishu thread\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload to a chat: zero feishu upload-file -f /tmp/report.pdf -c oc_xxx\n Send a DM: zero feishu upload-file -f /tmp/report.pdf -u ou_xxx\n Reply with a file: zero feishu upload-file -f /tmp/report.pdf -r om_xxx --thread\n Select a custom app: zero feishu upload-file -f /tmp/report.pdf -i <installation-id> -c oc_xxx\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"messageId\":\"om_xxx\",\"chatId\":\"oc_xxx\",\"fileKey\":\"file_xxx\",\"filename\":\"report.pdf\",\"mimetype\":\"application/pdf\",\"size\":12345,\"url\":\"https://...\"}\n\nNotes:\n - Exactly one of --chat, --user, or --reply is required\n - Feishu accepts non-empty files up to 30 MB\n - Specify --installation when the organization has multiple Feishu bots`,\n )\n .action(\n withErrorHandler(async (options: UploadFeishuOptions) => {\n const targets = [options.chat, options.user, options.reply].filter(\n Boolean,\n );\n if (targets.length !== 1) {\n throw new Error(\n \"Exactly one of --chat, --user, or --reply must be provided\",\n );\n }\n if (options.thread && !options.reply) {\n throw new Error(\"--thread requires --reply\");\n }\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 if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n if (fileSize > FEISHU_FILE_UPLOAD_MAX_BYTES) {\n throw new Error(\n `File exceeds Feishu's ${FEISHU_FILE_UPLOAD_MAX_BYTES}-byte limit`,\n );\n }\n\n const filename = basename(options.file);\n const contentType = options.contentType ?? inferContentType(options.file);\n const prepared = await initFeishuFileUpload({\n filename,\n contentType,\n length: fileSize,\n supportsUploadHeaders: true,\n });\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(readFileSync(options.file)),\n });\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n const result = await completeFeishuFileUpload({\n uploadId: prepared.uploadId,\n installationId: options.installation,\n chat: options.chat,\n user: options.user,\n replyToMessageId: options.reply,\n replyInThread: options.thread,\n contentType: prepared.contentType,\n });\n console.log(JSON.stringify(result));\n }),\n );\n"],"mappings":"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","names":["readFileSync","basename","basename","readFileSync"]}
@@ -4,23 +4,22 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  ZERO_FINANCE_DEFAULT_INTERVAL,
6
6
  ZERO_FINANCE_DEFAULT_RANGE,
7
- callZeroFinanceChart,
8
- callZeroFinanceProfile,
9
- callZeroFinanceQuote,
10
- callZeroFinanceSearch,
11
7
  zeroFinanceChartRequestSchema,
8
+ zeroFinanceContract,
12
9
  zeroFinanceIntervalSchema,
13
10
  zeroFinanceProfileRequestSchema,
14
11
  zeroFinanceQuoteRequestSchema,
15
12
  zeroFinanceRangeSchema,
16
13
  zeroFinanceSearchRequestSchema
17
- } from "./chunk-6PN6QGIM.js";
18
- import "./chunk-V7A6ZFHR.js";
19
- import "./chunk-ANOLYIPL.js";
14
+ } from "./chunk-LYLDVUHT.js";
15
+ import "./chunk-JV6LM2YC.js";
20
16
  import {
17
+ getClientConfig,
18
+ handleError,
19
+ initClient,
21
20
  source_default,
22
21
  withErrorHandler
23
- } from "./chunk-5ZZI2LSO.js";
22
+ } from "./chunk-GHKWW4NC.js";
24
23
  import "./chunk-32FE3MDA.js";
25
24
  import {
26
25
  Command,
@@ -33,6 +32,47 @@ import {
33
32
 
34
33
  // src/commands/zero/finance/index.ts
35
34
  init_esm_shims();
35
+
36
+ // src/lib/api/domains/zero-finance.ts
37
+ init_esm_shims();
38
+ async function callZeroFinanceSearch(body) {
39
+ const config = await getClientConfig();
40
+ const client = initClient(zeroFinanceContract, config);
41
+ const result = await client.search({ headers: {}, body });
42
+ if (result.status === 200) {
43
+ return result.body;
44
+ }
45
+ handleError(result, "Failed to search financial instruments");
46
+ }
47
+ async function callZeroFinanceProfile(body) {
48
+ const config = await getClientConfig();
49
+ const client = initClient(zeroFinanceContract, config);
50
+ const result = await client.profile({ headers: {}, body });
51
+ if (result.status === 200) {
52
+ return result.body;
53
+ }
54
+ handleError(result, "Failed to fetch finance profile");
55
+ }
56
+ async function callZeroFinanceQuote(body) {
57
+ const config = await getClientConfig();
58
+ const client = initClient(zeroFinanceContract, config);
59
+ const result = await client.quote({ headers: {}, body });
60
+ if (result.status === 200) {
61
+ return result.body;
62
+ }
63
+ handleError(result, "Failed to fetch finance quote");
64
+ }
65
+ async function callZeroFinanceChart(body) {
66
+ const config = await getClientConfig();
67
+ const client = initClient(zeroFinanceContract, config);
68
+ const result = await client.chart({ headers: {}, body });
69
+ if (result.status === 200) {
70
+ return result.body;
71
+ }
72
+ handleError(result, "Failed to fetch finance chart");
73
+ }
74
+
75
+ // src/commands/zero/finance/index.ts
36
76
  function firstIssueMessage(result) {
37
77
  return result.success ? "finance request is invalid" : result.error.issues[0]?.message ?? "finance request is invalid";
38
78
  }
@@ -125,4 +165,4 @@ Notes:
125
165
  export {
126
166
  zeroFinanceCommand
127
167
  };
128
- //# sourceMappingURL=finance-OGWHKQLU.js.map
168
+ //# sourceMappingURL=finance-55OJ6GYP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/finance/index.ts","../src/lib/api/domains/zero-finance.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n ZERO_FINANCE_DEFAULT_INTERVAL,\n ZERO_FINANCE_DEFAULT_RANGE,\n zeroFinanceChartRequestSchema,\n zeroFinanceIntervalSchema,\n zeroFinanceProfileRequestSchema,\n zeroFinanceQuoteRequestSchema,\n zeroFinanceRangeSchema,\n zeroFinanceSearchRequestSchema,\n type ZeroFinanceResponse,\n type ZeroFinanceInterval,\n type ZeroFinanceRange,\n} from \"@vm0/api-contracts/contracts/zero-finance\";\n\nimport {\n callZeroFinanceChart,\n callZeroFinanceProfile,\n callZeroFinanceQuote,\n callZeroFinanceSearch,\n} from \"../../../lib/api/domains/zero-finance\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\ninterface JsonOption {\n readonly json?: boolean;\n}\n\ninterface ChartOptions extends JsonOption {\n readonly range: ZeroFinanceRange;\n readonly interval: ZeroFinanceInterval;\n}\n\nfunction firstIssueMessage(\n result:\n | ReturnType<typeof zeroFinanceSearchRequestSchema.safeParse>\n | ReturnType<typeof zeroFinanceProfileRequestSchema.safeParse>\n | ReturnType<typeof zeroFinanceQuoteRequestSchema.safeParse>\n | ReturnType<typeof zeroFinanceChartRequestSchema.safeParse>,\n): string {\n return result.success\n ? \"finance request is invalid\"\n : (result.error.issues[0]?.message ?? \"finance request is invalid\");\n}\n\nfunction parseRange(value: string): ZeroFinanceRange {\n const result = zeroFinanceRangeSchema.safeParse(value);\n if (result.success) {\n return result.data;\n }\n throw new InvalidArgumentError(\n `range must be one of: ${zeroFinanceRangeSchema.options.join(\", \")}`,\n );\n}\n\nfunction parseInterval(value: string): ZeroFinanceInterval {\n const result = zeroFinanceIntervalSchema.safeParse(value);\n if (result.success) {\n return result.data;\n }\n throw new InvalidArgumentError(\n `interval must be one of: ${zeroFinanceIntervalSchema.options.join(\", \")}`,\n );\n}\n\nfunction renderResponse(response: ZeroFinanceResponse, json?: boolean): void {\n if (json) {\n console.log(JSON.stringify(response));\n return;\n }\n\n console.log(chalk.green(`✓ Finance ${response.operation} completed`));\n console.log(JSON.stringify(response.result, null, 2));\n console.log(chalk.dim(`Provider: ${response.provider}`));\n console.log(chalk.dim(`Credits charged: ${response.creditsCharged}`));\n}\n\nconst searchCommand = new Command()\n .name(\"search\")\n .description(\"Search for a financial instrument\")\n .argument(\"<query>\", \"Company name, symbol, or instrument\")\n .option(\"--json\", \"Print the raw Zero Finance response as JSON\")\n .action(\n withErrorHandler(async (query: string, options: JsonOption) => {\n const request = zeroFinanceSearchRequestSchema.safeParse({ query });\n if (!request.success) {\n throw new InvalidArgumentError(firstIssueMessage(request));\n }\n renderResponse(await callZeroFinanceSearch(request.data), options.json);\n }),\n );\n\nconst profileCommand = new Command()\n .name(\"profile\")\n .description(\"Fetch a company profile\")\n .argument(\"<symbol>\", \"Yahoo Finance symbol, such as AAPL or 0700.HK\")\n .option(\"--json\", \"Print the raw Zero Finance response as JSON\")\n .action(\n withErrorHandler(async (symbol: string, options: JsonOption) => {\n const request = zeroFinanceProfileRequestSchema.safeParse({ symbol });\n if (!request.success) {\n throw new InvalidArgumentError(firstIssueMessage(request));\n }\n renderResponse(await callZeroFinanceProfile(request.data), options.json);\n }),\n );\n\nconst quoteCommand = new Command()\n .name(\"quote\")\n .description(\"Fetch the latest available market quote\")\n .argument(\"<symbol>\", \"Yahoo Finance symbol, such as AAPL or 0700.HK\")\n .option(\"--json\", \"Print the raw Zero Finance response as JSON\")\n .action(\n withErrorHandler(async (symbol: string, options: JsonOption) => {\n const request = zeroFinanceQuoteRequestSchema.safeParse({ symbol });\n if (!request.success) {\n throw new InvalidArgumentError(firstIssueMessage(request));\n }\n renderResponse(await callZeroFinanceQuote(request.data), options.json);\n }),\n );\n\nconst chartCommand = new Command()\n .name(\"chart\")\n .description(\"Fetch OHLCV chart data\")\n .argument(\"<symbol>\", \"Yahoo Finance symbol, such as AAPL or 0700.HK\")\n .addOption(\n new Option(\"--range <range>\", \"Chart time range\")\n .default(ZERO_FINANCE_DEFAULT_RANGE)\n .argParser(parseRange),\n )\n .addOption(\n new Option(\"--interval <interval>\", \"Chart interval\")\n .default(ZERO_FINANCE_DEFAULT_INTERVAL)\n .argParser(parseInterval),\n )\n .option(\"--json\", \"Print the raw Zero Finance response as JSON\")\n .action(\n withErrorHandler(async (symbol: string, options: ChartOptions) => {\n const request = zeroFinanceChartRequestSchema.safeParse({\n symbol,\n range: options.range,\n interval: options.interval,\n });\n if (!request.success) {\n throw new InvalidArgumentError(firstIssueMessage(request));\n }\n renderResponse(await callZeroFinanceChart(request.data), options.json);\n }),\n );\n\nexport const zeroFinanceCommand = new Command()\n .name(\"finance\")\n .description(\"Query financial instruments through managed Zero Finance\")\n .addCommand(searchCommand)\n .addCommand(profileCommand)\n .addCommand(quoteCommand)\n .addCommand(chartCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Search instruments: zero finance search \"Tencent\"\n Company profile: zero finance profile AAPL\n Latest quote: zero finance quote 0700.HK --json\n Historical chart: zero finance chart AAPL --range 1y --interval 1d\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires finance:read capability) or a CLI token\n - Each successful command consumes 1 credit\n - Data is returned from APIDojo's Yahoo Finance API on RapidAPI without Zero-side caching`,\n );\n","import {\n zeroFinanceContract,\n type ZeroFinanceChartRequest,\n type ZeroFinanceProfileRequest,\n type ZeroFinanceQuoteRequest,\n type ZeroFinanceResponse,\n type ZeroFinanceSearchRequest,\n} from \"@vm0/api-contracts/contracts/zero-finance\";\nimport { initClient } from \"@vm0/api-contracts/contracts/trpc-contract\";\n\nimport { getClientConfig, handleError } from \"../core/client-factory\";\n\nexport async function callZeroFinanceSearch(\n body: ZeroFinanceSearchRequest,\n): Promise<ZeroFinanceResponse> {\n const config = await getClientConfig();\n const client = initClient(zeroFinanceContract, 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 financial instruments\");\n}\n\nexport async function callZeroFinanceProfile(\n body: ZeroFinanceProfileRequest,\n): Promise<ZeroFinanceResponse> {\n const config = await getClientConfig();\n const client = initClient(zeroFinanceContract, config);\n const result = await client.profile({ headers: {}, body });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to fetch finance profile\");\n}\n\nexport async function callZeroFinanceQuote(\n body: ZeroFinanceQuoteRequest,\n): Promise<ZeroFinanceResponse> {\n const config = await getClientConfig();\n const client = initClient(zeroFinanceContract, config);\n const result = await client.quote({ headers: {}, body });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to fetch finance quote\");\n}\n\nexport async function callZeroFinanceChart(\n body: ZeroFinanceChartRequest,\n): Promise<ZeroFinanceResponse> {\n const config = await getClientConfig();\n const client = initClient(zeroFinanceContract, config);\n const result = await client.chart({ headers: {}, body });\n if (result.status === 200) {\n return result.body;\n }\n handleError(result, \"Failed to fetch finance chart\");\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,14 @@
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
+ generateWebAvatarVideo,
6
+ generateWebImage,
7
+ generateWebVideo,
8
+ generateWebVoice,
9
+ listWebAvatarVideoAvatars,
10
+ listWebAvatarVideoVoices
11
+ } from "./chunk-J3ZRXVI6.js";
4
12
  import {
5
13
  RESOURCE_REGISTRY_VERSION,
6
14
  buildPresentationRunbookInstructionLines,
@@ -19,39 +27,39 @@ import {
19
27
  selectResourceCandidates,
20
28
  toGenerationTarget
21
29
  } from "./chunk-NKYACNWA.js";
22
- import {
23
- currentPlanAllowsVideo,
24
- currentTokenCanReadBilling
25
- } from "./chunk-2W73DZDW.js";
26
30
  import {
27
31
  getZeroAgentUserConnectors,
28
- getZeroBillingStatus,
29
32
  listZeroConnectorCatalog,
30
33
  listZeroConnectorCatalogStatus
31
- } from "./chunk-6PN6QGIM.js";
34
+ } from "./chunk-U2GQH6AD.js";
35
+ import "./chunk-HZYOJTEE.js";
36
+ import "./chunk-HHHHZMTA.js";
37
+ import "./chunk-DUA6CF7E.js";
38
+ import "./chunk-YDS3X7KB.js";
39
+ import "./chunk-LIYPTQAO.js";
40
+ import "./chunk-SMPSKBAP.js";
41
+ import "./chunk-A6ZRMNM3.js";
32
42
  import {
33
- generateWebAvatarVideo,
34
- generateWebImage,
35
- generateWebVideo,
36
- generateWebVoice,
37
- listWebAvatarVideoAvatars,
38
- listWebAvatarVideoVoices
39
- } from "./chunk-V7A6ZFHR.js";
43
+ currentPlanAllowsVideo,
44
+ currentTokenCanReadBilling,
45
+ getZeroBillingStatus
46
+ } from "./chunk-4FTIKZKP.js";
47
+ import "./chunk-7UZXNER2.js";
48
+ import "./chunk-JV6LM2YC.js";
40
49
  import {
41
50
  planUpgradeUrl
42
51
  } from "./chunk-J45P5ALH.js";
43
52
  import {
44
53
  getPlatformOrigin
45
- } from "./chunk-BRV4D3P2.js";
46
- import "./chunk-ANOLYIPL.js";
54
+ } from "./chunk-RUKMHBNQ.js";
47
55
  import {
48
56
  ApiRequestError,
49
57
  source_default,
50
58
  withErrorHandler
51
- } from "./chunk-5ZZI2LSO.js";
59
+ } from "./chunk-GHKWW4NC.js";
52
60
  import {
53
61
  isFeatureEnabled
54
- } from "./chunk-V5ZVB7RJ.js";
62
+ } from "./chunk-KKO2XGLQ.js";
55
63
  import {
56
64
  decodeZeroTokenPayload
57
65
  } from "./chunk-32FE3MDA.js";
@@ -182,9 +190,6 @@ function createStyledImageCompilationPacket(options) {
182
190
  };
183
191
  }
184
192
 
185
- // src/commands/zero/shared/resource-registry.ts
186
- init_esm_shims();
187
-
188
193
  // src/commands/zero/shared/resource-listing.ts
189
194
  init_esm_shims();
190
195
  function formatRegistryListing(entries, emptyLabel) {
@@ -3211,4 +3216,4 @@ var generateCommand = new Command().name("generate").description(
3211
3216
  export {
3212
3217
  generateCommand
3213
3218
  };
3214
- //# sourceMappingURL=generate-AA2PVOYQ.js.map
3219
+ //# sourceMappingURL=generate-XUKBK523.js.map