@vm0/cli 9.249.0 → 9.249.2

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 (141) hide show
  1. package/{agent-J7UZFWFE.js → agent-TOFXTWYP.js} +11 -10
  2. package/{agent-J7UZFWFE.js.map → agent-TOFXTWYP.js.map} +1 -1
  3. package/{banking-TLHPJBS5.js → banking-U7I6EJUO.js} +8 -7
  4. package/{banking-TLHPJBS5.js.map → banking-U7I6EJUO.js.map} +1 -1
  5. package/{chat-PWHG42AL.js → chat-77EDGFMS.js} +9 -8
  6. package/{chat-PWHG42AL.js.map → chat-77EDGFMS.js.map} +1 -1
  7. package/{chunk-DIRAZ3YX.js → chunk-3VVCUQPB.js} +3 -3
  8. package/{chunk-DIRAZ3YX.js.map → chunk-3VVCUQPB.js.map} +1 -1
  9. package/{chunk-LDQPMTQY.js → chunk-4HN7U3JF.js} +103 -625
  10. package/chunk-4HN7U3JF.js.map +1 -0
  11. package/{chunk-ZJENFGWZ.js → chunk-5CZNUTFF.js} +3 -3
  12. package/chunk-A2NKQGRI.js +491 -0
  13. package/chunk-A2NKQGRI.js.map +1 -0
  14. package/{chunk-6IFIMWPY.js → chunk-AFNSFKAH.js} +5 -5
  15. package/{chunk-XE764T2N.js → chunk-BQOOTJNB.js} +27 -672
  16. package/chunk-BQOOTJNB.js.map +1 -0
  17. package/{chunk-KLIW3XK7.js → chunk-GPF7NSX7.js} +2 -2
  18. package/{chunk-HJOW32CJ.js → chunk-HSGQT7LT.js} +3 -3
  19. package/{chunk-PD3A7MGG.js → chunk-JCLLQRCI.js} +3 -3
  20. package/{chunk-B3W2RUBP.js → chunk-LD4ZVU4O.js} +2 -2
  21. package/chunk-N6TDQYGF.js +678 -0
  22. package/chunk-N6TDQYGF.js.map +1 -0
  23. package/{chunk-3QXK5RR7.js → chunk-ROB3OE37.js} +17 -113
  24. package/chunk-ROB3OE37.js.map +1 -0
  25. package/{chunk-LTDQISD7.js → chunk-SB7EZ2ZO.js} +2 -2
  26. package/{chunk-RTYT3CSZ.js → chunk-UG5XA6KU.js} +2 -2
  27. package/{chunk-ZKWCFMDV.js → chunk-UNQJRTJQ.js} +3 -3
  28. package/chunk-W75R7EZF.js +17 -0
  29. package/chunk-W75R7EZF.js.map +1 -0
  30. package/chunk-WDDZJGWL.js +32 -0
  31. package/chunk-WDDZJGWL.js.map +1 -0
  32. package/{chunk-JFY6GK7Y.js → chunk-X2545RBX.js} +2 -2
  33. package/{chunk-ZE2VIESK.js → chunk-X4DBCBU4.js} +2 -2
  34. package/{computer-use-EE6NPCXS.js → computer-use-BCGPVGWS.js} +7 -6
  35. package/{computer-use-EE6NPCXS.js.map → computer-use-BCGPVGWS.js.map} +1 -1
  36. package/{connector-SCLSWTMT.js → connector-CHZSI2LW.js} +14 -13
  37. package/{connector-SCLSWTMT.js.map → connector-CHZSI2LW.js.map} +1 -1
  38. package/credit-RWFBPKOS.js +166 -0
  39. package/credit-RWFBPKOS.js.map +1 -0
  40. package/{developer-support-V3N3BOYC.js → developer-support-IVR3HIP7.js} +8 -7
  41. package/{developer-support-V3N3BOYC.js.map → developer-support-IVR3HIP7.js.map} +1 -1
  42. package/{doctor-AQLFJCC6.js → doctor-KGWTXW2Q.js} +39 -13
  43. package/doctor-KGWTXW2Q.js.map +1 -0
  44. package/{esm-PZKPCIYJ.js → esm-GOCEMHJO.js} +3 -3
  45. package/{feishu-XHOLF32I.js → feishu-PLF4P5OG.js} +8 -7
  46. package/{feishu-XHOLF32I.js.map → feishu-PLF4P5OG.js.map} +1 -1
  47. package/{finance-TF5RU7FD.js → finance-LVFG3WWP.js} +8 -7
  48. package/{finance-TF5RU7FD.js.map → finance-LVFG3WWP.js.map} +1 -1
  49. package/{generate-GFFAZX7Y.js → generate-4FIBMMJO.js} +77 -22
  50. package/generate-4FIBMMJO.js.map +1 -0
  51. package/{getMachineId-bsd-L73QENVB.js → getMachineId-bsd-SB7C44VX.js} +4 -4
  52. package/{getMachineId-darwin-TCCWKQ2S.js → getMachineId-darwin-R4BWY3CQ.js} +4 -4
  53. package/{getMachineId-linux-TJYYUZVM.js → getMachineId-linux-BR4HVNPW.js} +3 -3
  54. package/{getMachineId-unsupported-DPRVLH4Y.js → getMachineId-unsupported-FPGM635L.js} +3 -3
  55. package/{getMachineId-win-7EE436CJ.js → getMachineId-win-RB4JMF33.js} +4 -4
  56. package/{github-V4ZW6TI4.js → github-WHNAVVG3.js} +8 -7
  57. package/{github-V4ZW6TI4.js.map → github-WHNAVVG3.js.map} +1 -1
  58. package/{goal-TED5FUYM.js → goal-G4J2BQ5Z.js} +8 -7
  59. package/{goal-TED5FUYM.js.map → goal-G4J2BQ5Z.js.map} +1 -1
  60. package/{host-HKDD3CHD.js → host-3W6U2ZUP.js} +8 -7
  61. package/{host-HKDD3CHD.js.map → host-3W6U2ZUP.js.map} +1 -1
  62. package/{intro-MIVVJG7M.js → intro-PMHOBGDL.js} +3 -3
  63. package/{logs-SBMQQM46.js → logs-P7JLTGXY.js} +10 -9
  64. package/{logs-SBMQQM46.js.map → logs-P7JLTGXY.js.map} +1 -1
  65. package/{mail-SF5JKA2F.js → mail-LIAOXDD4.js} +12 -11
  66. package/{mail-SF5JKA2F.js.map → mail-LIAOXDD4.js.map} +1 -1
  67. package/{maps-D5NKFEAD.js → maps-C4NOXSE7.js} +8 -7
  68. package/{maps-D5NKFEAD.js.map → maps-C4NOXSE7.js.map} +1 -1
  69. package/{model-S7CMGRIH.js → model-I2MNQ5KC.js} +9 -8
  70. package/{model-S7CMGRIH.js.map → model-I2MNQ5KC.js.map} +1 -1
  71. package/{model-provider-ATXIDNKM.js → model-provider-AOCCHEMP.js} +9 -8
  72. package/{model-provider-ATXIDNKM.js.map → model-provider-AOCCHEMP.js.map} +1 -1
  73. package/{org-6JBRK5NL.js → org-MVBG3WXZ.js} +9 -8
  74. package/{org-6JBRK5NL.js.map → org-MVBG3WXZ.js.map} +1 -1
  75. package/package.json +1 -1
  76. package/{phone-B3UWRGWF.js → phone-4OZQFYHU.js} +8 -7
  77. package/{phone-B3UWRGWF.js.map → phone-4OZQFYHU.js.map} +1 -1
  78. package/{preference-HRRRUEP3.js → preference-H2A3WBGQ.js} +9 -8
  79. package/{preference-HRRRUEP3.js.map → preference-H2A3WBGQ.js.map} +1 -1
  80. package/{resource-65P5D2LT.js → resource-CPCQ6V6M.js} +9 -8
  81. package/{resource-65P5D2LT.js.map → resource-CPCQ6V6M.js.map} +1 -1
  82. package/{scrape-N3AWNV2R.js → scrape-6RMFDYAT.js} +8 -7
  83. package/{scrape-N3AWNV2R.js.map → scrape-6RMFDYAT.js.map} +1 -1
  84. package/{search-T76RE67L.js → search-HSQVSQZY.js} +10 -9
  85. package/{search-T76RE67L.js.map → search-HSQVSQZY.js.map} +1 -1
  86. package/{secret-WALMH6S2.js → secret-S4D6CNOX.js} +9 -8
  87. package/{secret-WALMH6S2.js.map → secret-S4D6CNOX.js.map} +1 -1
  88. package/{slack-WXDCNAI2.js → slack-E3E2NIDZ.js} +50 -175
  89. package/slack-E3E2NIDZ.js.map +1 -0
  90. package/{teams-LAQBLRUR.js → teams-CLEWT2LQ.js} +8 -7
  91. package/{teams-LAQBLRUR.js.map → teams-CLEWT2LQ.js.map} +1 -1
  92. package/{telegram-5BASFBEA.js → telegram-35FKKA4K.js} +8 -7
  93. package/{telegram-5BASFBEA.js.map → telegram-35FKKA4K.js.map} +1 -1
  94. package/{undici-ZMFN7TNU.js → undici-YXSVPIYI.js} +2 -2
  95. package/upgrade-DNGUR42E.js +50 -0
  96. package/upgrade-DNGUR42E.js.map +1 -0
  97. package/{variable-GBVHKR6I.js → variable-C7RWUPV6.js} +9 -8
  98. package/{variable-GBVHKR6I.js.map → variable-C7RWUPV6.js.map} +1 -1
  99. package/{video-3FXQGBYB.js → video-JS5VOA2S.js} +9 -7
  100. package/{video-3FXQGBYB.js.map → video-JS5VOA2S.js.map} +1 -1
  101. package/{weather-JNMUODGJ.js → weather-5R2N5OX4.js} +8 -7
  102. package/{weather-JNMUODGJ.js.map → weather-5R2N5OX4.js.map} +1 -1
  103. package/{web-DZT26X4I.js → web-FXIIYCZ7.js} +10 -8
  104. package/{web-DZT26X4I.js.map → web-FXIIYCZ7.js.map} +1 -1
  105. package/{web-search-36UUSSUX.js → web-search-SZP7J4UM.js} +8 -7
  106. package/{web-search-36UUSSUX.js.map → web-search-SZP7J4UM.js.map} +1 -1
  107. package/{whoami-NXYCNII4.js → whoami-J4FRN67A.js} +10 -9
  108. package/{whoami-NXYCNII4.js.map → whoami-J4FRN67A.js.map} +1 -1
  109. package/{workflow-WHTBJCEF.js → workflow-HQHZKXB2.js} +9 -8
  110. package/{workflow-WHTBJCEF.js.map → workflow-HQHZKXB2.js.map} +1 -1
  111. package/zero.js +88 -61
  112. package/zero.js.map +1 -1
  113. package/chunk-3QXK5RR7.js.map +0 -1
  114. package/chunk-LDQPMTQY.js.map +0 -1
  115. package/chunk-LRHXR7JT.js +0 -33
  116. package/chunk-LRHXR7JT.js.map +0 -1
  117. package/chunk-XE764T2N.js.map +0 -1
  118. package/credit-2VN2PYRE.js +0 -128
  119. package/credit-2VN2PYRE.js.map +0 -1
  120. package/doctor-AQLFJCC6.js.map +0 -1
  121. package/generate-GFFAZX7Y.js.map +0 -1
  122. package/slack-WXDCNAI2.js.map +0 -1
  123. /package/{chunk-ZJENFGWZ.js.map → chunk-5CZNUTFF.js.map} +0 -0
  124. /package/{chunk-6IFIMWPY.js.map → chunk-AFNSFKAH.js.map} +0 -0
  125. /package/{chunk-KLIW3XK7.js.map → chunk-GPF7NSX7.js.map} +0 -0
  126. /package/{chunk-HJOW32CJ.js.map → chunk-HSGQT7LT.js.map} +0 -0
  127. /package/{chunk-PD3A7MGG.js.map → chunk-JCLLQRCI.js.map} +0 -0
  128. /package/{chunk-B3W2RUBP.js.map → chunk-LD4ZVU4O.js.map} +0 -0
  129. /package/{chunk-LTDQISD7.js.map → chunk-SB7EZ2ZO.js.map} +0 -0
  130. /package/{chunk-RTYT3CSZ.js.map → chunk-UG5XA6KU.js.map} +0 -0
  131. /package/{chunk-ZKWCFMDV.js.map → chunk-UNQJRTJQ.js.map} +0 -0
  132. /package/{chunk-JFY6GK7Y.js.map → chunk-X2545RBX.js.map} +0 -0
  133. /package/{chunk-ZE2VIESK.js.map → chunk-X4DBCBU4.js.map} +0 -0
  134. /package/{esm-PZKPCIYJ.js.map → esm-GOCEMHJO.js.map} +0 -0
  135. /package/{getMachineId-bsd-L73QENVB.js.map → getMachineId-bsd-SB7C44VX.js.map} +0 -0
  136. /package/{getMachineId-darwin-TCCWKQ2S.js.map → getMachineId-darwin-R4BWY3CQ.js.map} +0 -0
  137. /package/{getMachineId-linux-TJYYUZVM.js.map → getMachineId-linux-BR4HVNPW.js.map} +0 -0
  138. /package/{getMachineId-unsupported-DPRVLH4Y.js.map → getMachineId-unsupported-FPGM635L.js.map} +0 -0
  139. /package/{getMachineId-win-7EE436CJ.js.map → getMachineId-win-RB4JMF33.js.map} +0 -0
  140. /package/{intro-MIVVJG7M.js.map → intro-PMHOBGDL.js.map} +0 -0
  141. /package/{undici-ZMFN7TNU.js.map → undici-YXSVPIYI.js.map} +0 -0
@@ -5,21 +5,22 @@ import {
5
5
  callZeroScrape,
6
6
  zeroScrapeFormatSchema,
7
7
  zeroScrapeModeSchema
8
- } from "./chunk-3QXK5RR7.js";
9
- import "./chunk-LTDQISD7.js";
8
+ } from "./chunk-ROB3OE37.js";
9
+ import "./chunk-N6TDQYGF.js";
10
+ import "./chunk-SB7EZ2ZO.js";
10
11
  import {
11
12
  source_default,
12
13
  withErrorHandler
13
- } from "./chunk-XE764T2N.js";
14
- import "./chunk-LRHXR7JT.js";
14
+ } from "./chunk-BQOOTJNB.js";
15
+ import "./chunk-A2NKQGRI.js";
15
16
  import {
16
17
  Command,
17
18
  InvalidArgumentError,
18
19
  Option
19
- } from "./chunk-B3W2RUBP.js";
20
+ } from "./chunk-LD4ZVU4O.js";
20
21
  import {
21
22
  init_esm_shims
22
- } from "./chunk-DIRAZ3YX.js";
23
+ } from "./chunk-3VVCUQPB.js";
23
24
 
24
25
  // src/commands/zero/scrape/index.ts
25
26
  init_esm_shims();
@@ -96,4 +97,4 @@ Notes:
96
97
  export {
97
98
  zeroScrapeCommand
98
99
  };
99
- //# sourceMappingURL=scrape-N3AWNV2R.js.map
100
+ //# sourceMappingURL=scrape-6RMFDYAT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/zero/scrape/index.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n zeroScrapeFormatSchema,\n zeroScrapeModeSchema,\n type ZeroScrapeFormat,\n type ZeroScrapeMode,\n} from \"@vm0/api-contracts/contracts/zero-scrape\";\n\nimport { callZeroScrape, type ZeroScrapeResponse } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst SCRAPE_FORMATS = zeroScrapeFormatSchema.options;\nconst SCRAPE_MODES = zeroScrapeModeSchema.options;\n\ninterface ScrapeOptions {\n readonly format: ZeroScrapeFormat;\n readonly mode: ZeroScrapeMode;\n readonly json?: boolean;\n}\n\nfunction parseFormat(value: string): ZeroScrapeFormat {\n const result = zeroScrapeFormatSchema.safeParse(value);\n if (result.success) {\n return result.data;\n }\n throw new InvalidArgumentError(\n `format must be one of: ${SCRAPE_FORMATS.join(\", \")}`,\n );\n}\n\nfunction parseMode(value: string): ZeroScrapeMode {\n const result = zeroScrapeModeSchema.safeParse(value);\n if (result.success) {\n return result.data;\n }\n throw new InvalidArgumentError(\n `mode must be one of: ${SCRAPE_MODES.join(\", \")}`,\n );\n}\n\nfunction renderScrapeMetadata(response: ZeroScrapeResponse): 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 renderScrapeResult(response: ZeroScrapeResponse): void {\n if (response.format === \"links\") {\n for (const link of response.result.links) {\n console.log(link);\n }\n return;\n }\n\n const markdown = response.result.markdown;\n if (markdown) {\n console.log(markdown);\n }\n}\n\nexport const zeroScrapeCommand = new Command()\n .name(\"scrape\")\n .description(\"Scrape a public web page through managed zero scrape\")\n .argument(\"<url>\", \"Public http or https URL to scrape\")\n .addOption(\n new Option(\"--format <format>\", \"Output format\")\n .default(\"markdown\")\n .argParser(parseFormat),\n )\n .addOption(\n new Option(\"--mode <mode>\", \"Scrape mode\")\n .default(\"standard\")\n .argParser(parseMode),\n )\n .option(\"--json\", \"Print the raw scrape response as JSON\")\n .action(\n withErrorHandler(async (url: string, options: ScrapeOptions) => {\n const response = await callZeroScrape({\n url,\n format: options.format,\n mode: options.mode,\n });\n\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n\n console.log(chalk.green(\"✓ Scrape completed\"));\n renderScrapeMetadata(response);\n renderScrapeResult(response);\n }),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Scrape markdown: zero scrape https://example.com --format markdown\n Scrape links: zero scrape https://example.com --format links\n Enhanced scrape: zero scrape https://example.com --mode enhanced --json\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires scrape:read capability) or a CLI token\n - Firecrawl calls and credit billing happen on the vm0 API server\n - Enhanced mode is explicit because it uses a higher billing category`,\n );\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAYA,IAAM,iBAAiB,uBAAuB;AAC9C,IAAM,eAAe,qBAAqB;AAQ1C,SAAS,YAAY,OAAiC;AACpD,QAAM,SAAS,uBAAuB,UAAU,KAAK;AACrD,MAAI,OAAO,SAAS;AAClB,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,IAAI;AAAA,IACR,0BAA0B,eAAe,KAAK,IAAI,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,UAAU,OAA+B;AAChD,QAAM,SAAS,qBAAqB,UAAU,KAAK;AACnD,MAAI,OAAO,SAAS;AAClB,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,IAAI;AAAA,IACR,wBAAwB,aAAa,KAAK,IAAI,CAAC;AAAA,EACjD;AACF;AAEA,SAAS,qBAAqB,UAAoC;AAChE,UAAQ,IAAI,eAAM,IAAI,eAAe,SAAS,QAAQ,EAAE,CAAC;AACzD,UAAQ,IAAI,eAAM,IAAI,uBAAuB,SAAS,eAAe,EAAE,CAAC;AACxE,UAAQ,IAAI,eAAM,IAAI,uBAAuB,SAAS,eAAe,EAAE,CAAC;AACxE,UAAQ,IAAI,eAAM,IAAI,sBAAsB,SAAS,cAAc,EAAE,CAAC;AACxE;AAEA,SAAS,mBAAmB,UAAoC;AAC9D,MAAI,SAAS,WAAW,SAAS;AAC/B,eAAW,QAAQ,SAAS,OAAO,OAAO;AACxC,cAAQ,IAAI,IAAI;AAAA,IAClB;AACA;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,OAAO;AACjC,MAAI,UAAU;AACZ,YAAQ,IAAI,QAAQ;AAAA,EACtB;AACF;AAEO,IAAM,oBAAoB,IAAI,QAAQ,EAC1C,KAAK,QAAQ,EACb,YAAY,sDAAsD,EAClE,SAAS,SAAS,oCAAoC,EACtD;AAAA,EACC,IAAI,OAAO,qBAAqB,eAAe,EAC5C,QAAQ,UAAU,EAClB,UAAU,WAAW;AAC1B,EACC;AAAA,EACC,IAAI,OAAO,iBAAiB,aAAa,EACtC,QAAQ,UAAU,EAClB,UAAU,SAAS;AACxB,EACC,OAAO,UAAU,uCAAuC,EACxD;AAAA,EACC,iBAAiB,OAAO,KAAa,YAA2B;AAC9D,UAAM,WAAW,MAAM,eAAe;AAAA,MACpC;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ;AAAA,IAChB,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,CAAC;AACpC;AAAA,IACF;AAEA,YAAQ,IAAI,eAAM,MAAM,yBAAoB,CAAC;AAC7C,yBAAqB,QAAQ;AAC7B,uBAAmB,QAAQ;AAAA,EAC7B,CAAC;AACH,EACC;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUF;","names":[]}
1
+ {"version":3,"sources":["../src/commands/zero/scrape/index.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n zeroScrapeFormatSchema,\n zeroScrapeModeSchema,\n type ZeroScrapeFormat,\n type ZeroScrapeMode,\n} from \"@vm0/api-contracts/contracts/zero-scrape\";\n\nimport { callZeroScrape, type ZeroScrapeResponse } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst SCRAPE_FORMATS = zeroScrapeFormatSchema.options;\nconst SCRAPE_MODES = zeroScrapeModeSchema.options;\n\ninterface ScrapeOptions {\n readonly format: ZeroScrapeFormat;\n readonly mode: ZeroScrapeMode;\n readonly json?: boolean;\n}\n\nfunction parseFormat(value: string): ZeroScrapeFormat {\n const result = zeroScrapeFormatSchema.safeParse(value);\n if (result.success) {\n return result.data;\n }\n throw new InvalidArgumentError(\n `format must be one of: ${SCRAPE_FORMATS.join(\", \")}`,\n );\n}\n\nfunction parseMode(value: string): ZeroScrapeMode {\n const result = zeroScrapeModeSchema.safeParse(value);\n if (result.success) {\n return result.data;\n }\n throw new InvalidArgumentError(\n `mode must be one of: ${SCRAPE_MODES.join(\", \")}`,\n );\n}\n\nfunction renderScrapeMetadata(response: ZeroScrapeResponse): 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 renderScrapeResult(response: ZeroScrapeResponse): void {\n if (response.format === \"links\") {\n for (const link of response.result.links) {\n console.log(link);\n }\n return;\n }\n\n const markdown = response.result.markdown;\n if (markdown) {\n console.log(markdown);\n }\n}\n\nexport const zeroScrapeCommand = new Command()\n .name(\"scrape\")\n .description(\"Scrape a public web page through managed zero scrape\")\n .argument(\"<url>\", \"Public http or https URL to scrape\")\n .addOption(\n new Option(\"--format <format>\", \"Output format\")\n .default(\"markdown\")\n .argParser(parseFormat),\n )\n .addOption(\n new Option(\"--mode <mode>\", \"Scrape mode\")\n .default(\"standard\")\n .argParser(parseMode),\n )\n .option(\"--json\", \"Print the raw scrape response as JSON\")\n .action(\n withErrorHandler(async (url: string, options: ScrapeOptions) => {\n const response = await callZeroScrape({\n url,\n format: options.format,\n mode: options.mode,\n });\n\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n\n console.log(chalk.green(\"✓ Scrape completed\"));\n renderScrapeMetadata(response);\n renderScrapeResult(response);\n }),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Scrape markdown: zero scrape https://example.com --format markdown\n Scrape links: zero scrape https://example.com --format links\n Enhanced scrape: zero scrape https://example.com --mode enhanced --json\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires scrape:read capability) or a CLI token\n - Firecrawl calls and credit billing happen on the vm0 API server\n - Enhanced mode is explicit because it uses a higher billing category`,\n );\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAYA,IAAM,iBAAiB,uBAAuB;AAC9C,IAAM,eAAe,qBAAqB;AAQ1C,SAAS,YAAY,OAAiC;AACpD,QAAM,SAAS,uBAAuB,UAAU,KAAK;AACrD,MAAI,OAAO,SAAS;AAClB,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,IAAI;AAAA,IACR,0BAA0B,eAAe,KAAK,IAAI,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,UAAU,OAA+B;AAChD,QAAM,SAAS,qBAAqB,UAAU,KAAK;AACnD,MAAI,OAAO,SAAS;AAClB,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,IAAI;AAAA,IACR,wBAAwB,aAAa,KAAK,IAAI,CAAC;AAAA,EACjD;AACF;AAEA,SAAS,qBAAqB,UAAoC;AAChE,UAAQ,IAAI,eAAM,IAAI,eAAe,SAAS,QAAQ,EAAE,CAAC;AACzD,UAAQ,IAAI,eAAM,IAAI,uBAAuB,SAAS,eAAe,EAAE,CAAC;AACxE,UAAQ,IAAI,eAAM,IAAI,uBAAuB,SAAS,eAAe,EAAE,CAAC;AACxE,UAAQ,IAAI,eAAM,IAAI,sBAAsB,SAAS,cAAc,EAAE,CAAC;AACxE;AAEA,SAAS,mBAAmB,UAAoC;AAC9D,MAAI,SAAS,WAAW,SAAS;AAC/B,eAAW,QAAQ,SAAS,OAAO,OAAO;AACxC,cAAQ,IAAI,IAAI;AAAA,IAClB;AACA;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,OAAO;AACjC,MAAI,UAAU;AACZ,YAAQ,IAAI,QAAQ;AAAA,EACtB;AACF;AAEO,IAAM,oBAAoB,IAAI,QAAQ,EAC1C,KAAK,QAAQ,EACb,YAAY,sDAAsD,EAClE,SAAS,SAAS,oCAAoC,EACtD;AAAA,EACC,IAAI,OAAO,qBAAqB,eAAe,EAC5C,QAAQ,UAAU,EAClB,UAAU,WAAW;AAC1B,EACC;AAAA,EACC,IAAI,OAAO,iBAAiB,aAAa,EACtC,QAAQ,UAAU,EAClB,UAAU,SAAS;AACxB,EACC,OAAO,UAAU,uCAAuC,EACxD;AAAA,EACC,iBAAiB,OAAO,KAAa,YAA2B;AAC9D,UAAM,WAAW,MAAM,eAAe;AAAA,MACpC;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ;AAAA,IAChB,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,CAAC;AACpC;AAAA,IACF;AAEA,YAAQ,IAAI,eAAM,MAAM,yBAAoB,CAAC;AAC7C,yBAAqB,QAAQ;AAC7B,uBAAmB,QAAQ;AAAA,EAC7B,CAAC;AACH,EACC;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUF;","names":[]}
@@ -8,23 +8,24 @@ import {
8
8
  parseSearchQuery,
9
9
  parseTime,
10
10
  runLogsSearch
11
- } from "./chunk-LDQPMTQY.js";
12
- import "./chunk-RTYT3CSZ.js";
11
+ } from "./chunk-4HN7U3JF.js";
12
+ import "./chunk-UG5XA6KU.js";
13
13
  import {
14
14
  searchZeroChat
15
- } from "./chunk-3QXK5RR7.js";
16
- import "./chunk-LTDQISD7.js";
15
+ } from "./chunk-ROB3OE37.js";
16
+ import "./chunk-N6TDQYGF.js";
17
+ import "./chunk-SB7EZ2ZO.js";
17
18
  import {
18
19
  source_default,
19
20
  withErrorHandler
20
- } from "./chunk-XE764T2N.js";
21
- import "./chunk-LRHXR7JT.js";
21
+ } from "./chunk-BQOOTJNB.js";
22
+ import "./chunk-A2NKQGRI.js";
22
23
  import {
23
24
  Command
24
- } from "./chunk-B3W2RUBP.js";
25
+ } from "./chunk-LD4ZVU4O.js";
25
26
  import {
26
27
  init_esm_shims
27
- } from "./chunk-DIRAZ3YX.js";
28
+ } from "./chunk-3VVCUQPB.js";
28
29
 
29
30
  // src/commands/zero/search/index.ts
30
31
  init_esm_shims();
@@ -195,4 +196,4 @@ export {
195
196
  buildSlackRecipe,
196
197
  zeroSearchCommand
197
198
  };
198
- //# sourceMappingURL=search-T76RE67L.js.map
199
+ //# sourceMappingURL=search-HSQVSQZY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/zero/search/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { runLogsSearch, type LogsSearchCliOptions } from \"../logs/search\";\nimport { searchZeroChat } from \"../../../lib/api\";\nimport type {\n ChatSearchMessage,\n ChatSearchResponse,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { parseSearchQuery } from \"../../../lib/utils/search-query\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\n\nconst SUPPORTED_SOURCES = [\"logs\", \"chat\", \"slack\"] as const;\ntype Source = (typeof SUPPORTED_SOURCES)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport const SEARCH_EXPLAINER = `\nAvailable sources:\n logs full agent event stream (tool calls, tokens, system events) from agent runs\n chat user/assistant text messages as shown in the web chat UI\n slack returns a recipe for calling the Slack API directly; requires the Slack connector\n\nUsage: zero search <query> --source <logs|chat|slack> [flags]\nRun 'zero search --help' for all flags.`;\n\nexport function buildSlackRecipe(query: string): string {\n const encoded = encodeURIComponent(query);\n return `The \\`slack\\` source does not call Slack from this CLI. Run the\nfollowing inside an agent sandbox that has $SLACK_TOKEN available:\n\n curl -H \"Authorization: Bearer $SLACK_TOKEN\" \\\\\n \"https://slack.com/api/search.messages?query=${encoded}\"\n\nIf you don't have $SLACK_TOKEN, check the connector status:\n zero connector status slack\n\nTo verify the token and network policy end-to-end:\n zero connector check --env-name SLACK_TOKEN\n\nSlack API docs: https://api.slack.com/methods/search.messages\n\nNote: CLI-local flags (--limit, --since, -A/-B/-C) are ignored for the\nslack source. Pass equivalents to Slack's API via count= / highlight=\nquery parameters instead.`;\n}\n\ninterface SearchOptions {\n source: string[];\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n}\n\nfunction collectSource(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN =\n options.context !== undefined\n ? parseBoundedLogCount(options.context, \"--context\", 0, 10)\n : 0;\n const before =\n options.beforeContext !== undefined\n ? parseBoundedLogCount(options.beforeContext, \"--before-context\", 0, 10)\n : contextN;\n const after =\n options.afterContext !== undefined\n ? parseBoundedLogCount(options.afterContext, \"--after-context\", 0, 10)\n : contextN;\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n return parseBoundedLogCount(value, \"--limit\", 1, 50);\n}\n\nasync function runLogsSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n const logsOptions: LogsSearchCliOptions = {\n afterContext: options.afterContext,\n beforeContext: options.beforeContext,\n context: options.context,\n agentId: options.agent,\n run: options.run,\n since: options.since,\n limit: options.limit,\n };\n await runLogsSearch(query, logsOptions);\n}\n\nfunction formatTimestamp(iso: string): string {\n return formatIsoTimestamp(iso);\n}\n\nfunction renderChatMessage(msg: ChatSearchMessage, isMatch: boolean): void {\n const marker = isMatch ? chalk.yellow(\"▸\") : chalk.dim(\"·\");\n const header = `${marker} ${chalk.dim(msg.role)} ${chalk.dim(formatTimestamp(msg.createdAt))}`;\n console.log(header);\n console.log(isMatch ? msg.content : chalk.dim(msg.content));\n}\n\nfunction renderChatResults(response: ChatSearchResponse): void {\n let isFirst = true;\n for (const result of response.results) {\n if (!isFirst) console.log();\n isFirst = false;\n\n console.log(\n chalk.bold(\n `── Thread ${result.chatThreadId} (${result.agentName}) ──────────`,\n ),\n );\n for (const msg of result.contextBefore) {\n renderChatMessage(msg, false);\n }\n renderChatMessage(result.matchedMessage, true);\n for (const msg of result.contextAfter) {\n renderChatMessage(msg, false);\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nasync function runChatSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n if (options.run !== undefined) {\n throw new Error(\"--run is not supported with --source chat\");\n }\n if (options.agent !== undefined && !isUuid(options.agent)) {\n console.error(\n chalk.red(`✗ Invalid agent ID \"${options.agent}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find agent IDs\"));\n process.exit(1);\n }\n\n const { before, after } = parseContextOptions(options);\n const limit = parseLimit(options.limit);\n const since =\n options.since !== undefined\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n\n const response = await searchZeroChat({\n keyword: query,\n agentId: options.agent,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderChatResults(response);\n}\n\nasync function runSlackSource(\n query: string,\n _options: SearchOptions,\n): Promise<void> {\n console.log(buildSlackRecipe(query));\n}\n\nexport const zeroSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search logs, chat, or get a recipe for external sources\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--source <type>\",\n \"Source to search: logs | chat | slack (pass once)\",\n collectSource,\n [] as string[],\n )\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\"--run <id>\", \"Filter by run ID\")\n .option(\"--since <time>\", \"Time window (e.g., 7d, 2h)\")\n .option(\"--limit <n>\", \"Maximum number of matches\")\n .option(\"-A, --after-context <n>\", \"Show n items after each match\")\n .option(\"-B, --before-context <n>\", \"Show n items before each match\")\n .option(\"-C, --context <n>\", \"Show n items before and after each match\")\n .addHelpText(\"after\", SEARCH_EXPLAINER)\n .action(\n withErrorHandler(async (query: string, options: SearchOptions) => {\n const searchQuery = parseSearchQuery(query, \"Query\");\n const sources = options.source;\n\n if (sources.length === 0) {\n console.log(SEARCH_EXPLAINER);\n return;\n }\n\n if (sources.length > 1) {\n throw new Error(\"Only one --source is allowed.\");\n }\n\n const source = sources[0]!;\n if (!SUPPORTED_SOURCES.includes(source as Source)) {\n throw new Error(\n `Unknown --source \"${source}\". Expected one of: ${SUPPORTED_SOURCES.join(\", \")}`,\n );\n }\n\n switch (source as Source) {\n case \"logs\":\n await runLogsSource(searchQuery, options);\n return;\n case \"chat\":\n await runChatSource(searchQuery, options);\n return;\n case \"slack\":\n await runSlackSource(searchQuery, options);\n return;\n }\n }),\n );\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/zero/search/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { runLogsSearch, type LogsSearchCliOptions } from \"../logs/search\";\nimport { searchZeroChat } from \"../../../lib/api\";\nimport type {\n ChatSearchMessage,\n ChatSearchResponse,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { parseSearchQuery } from \"../../../lib/utils/search-query\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\n\nconst SUPPORTED_SOURCES = [\"logs\", \"chat\", \"slack\"] as const;\ntype Source = (typeof SUPPORTED_SOURCES)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport const SEARCH_EXPLAINER = `\nAvailable sources:\n logs full agent event stream (tool calls, tokens, system events) from agent runs\n chat user/assistant text messages as shown in the web chat UI\n slack returns a recipe for calling the Slack API directly; requires the Slack connector\n\nUsage: zero search <query> --source <logs|chat|slack> [flags]\nRun 'zero search --help' for all flags.`;\n\nexport function buildSlackRecipe(query: string): string {\n const encoded = encodeURIComponent(query);\n return `The \\`slack\\` source does not call Slack from this CLI. Run the\nfollowing inside an agent sandbox that has $SLACK_TOKEN available:\n\n curl -H \"Authorization: Bearer $SLACK_TOKEN\" \\\\\n \"https://slack.com/api/search.messages?query=${encoded}\"\n\nIf you don't have $SLACK_TOKEN, check the connector status:\n zero connector status slack\n\nTo verify the token and network policy end-to-end:\n zero connector check --env-name SLACK_TOKEN\n\nSlack API docs: https://api.slack.com/methods/search.messages\n\nNote: CLI-local flags (--limit, --since, -A/-B/-C) are ignored for the\nslack source. Pass equivalents to Slack's API via count= / highlight=\nquery parameters instead.`;\n}\n\ninterface SearchOptions {\n source: string[];\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n}\n\nfunction collectSource(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN =\n options.context !== undefined\n ? parseBoundedLogCount(options.context, \"--context\", 0, 10)\n : 0;\n const before =\n options.beforeContext !== undefined\n ? parseBoundedLogCount(options.beforeContext, \"--before-context\", 0, 10)\n : contextN;\n const after =\n options.afterContext !== undefined\n ? parseBoundedLogCount(options.afterContext, \"--after-context\", 0, 10)\n : contextN;\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n return parseBoundedLogCount(value, \"--limit\", 1, 50);\n}\n\nasync function runLogsSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n const logsOptions: LogsSearchCliOptions = {\n afterContext: options.afterContext,\n beforeContext: options.beforeContext,\n context: options.context,\n agentId: options.agent,\n run: options.run,\n since: options.since,\n limit: options.limit,\n };\n await runLogsSearch(query, logsOptions);\n}\n\nfunction formatTimestamp(iso: string): string {\n return formatIsoTimestamp(iso);\n}\n\nfunction renderChatMessage(msg: ChatSearchMessage, isMatch: boolean): void {\n const marker = isMatch ? chalk.yellow(\"▸\") : chalk.dim(\"·\");\n const header = `${marker} ${chalk.dim(msg.role)} ${chalk.dim(formatTimestamp(msg.createdAt))}`;\n console.log(header);\n console.log(isMatch ? msg.content : chalk.dim(msg.content));\n}\n\nfunction renderChatResults(response: ChatSearchResponse): void {\n let isFirst = true;\n for (const result of response.results) {\n if (!isFirst) console.log();\n isFirst = false;\n\n console.log(\n chalk.bold(\n `── Thread ${result.chatThreadId} (${result.agentName}) ──────────`,\n ),\n );\n for (const msg of result.contextBefore) {\n renderChatMessage(msg, false);\n }\n renderChatMessage(result.matchedMessage, true);\n for (const msg of result.contextAfter) {\n renderChatMessage(msg, false);\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nasync function runChatSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n if (options.run !== undefined) {\n throw new Error(\"--run is not supported with --source chat\");\n }\n if (options.agent !== undefined && !isUuid(options.agent)) {\n console.error(\n chalk.red(`✗ Invalid agent ID \"${options.agent}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find agent IDs\"));\n process.exit(1);\n }\n\n const { before, after } = parseContextOptions(options);\n const limit = parseLimit(options.limit);\n const since =\n options.since !== undefined\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n\n const response = await searchZeroChat({\n keyword: query,\n agentId: options.agent,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderChatResults(response);\n}\n\nasync function runSlackSource(\n query: string,\n _options: SearchOptions,\n): Promise<void> {\n console.log(buildSlackRecipe(query));\n}\n\nexport const zeroSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search logs, chat, or get a recipe for external sources\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--source <type>\",\n \"Source to search: logs | chat | slack (pass once)\",\n collectSource,\n [] as string[],\n )\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\"--run <id>\", \"Filter by run ID\")\n .option(\"--since <time>\", \"Time window (e.g., 7d, 2h)\")\n .option(\"--limit <n>\", \"Maximum number of matches\")\n .option(\"-A, --after-context <n>\", \"Show n items after each match\")\n .option(\"-B, --before-context <n>\", \"Show n items before each match\")\n .option(\"-C, --context <n>\", \"Show n items before and after each match\")\n .addHelpText(\"after\", SEARCH_EXPLAINER)\n .action(\n withErrorHandler(async (query: string, options: SearchOptions) => {\n const searchQuery = parseSearchQuery(query, \"Query\");\n const sources = options.source;\n\n if (sources.length === 0) {\n console.log(SEARCH_EXPLAINER);\n return;\n }\n\n if (sources.length > 1) {\n throw new Error(\"Only one --source is allowed.\");\n }\n\n const source = sources[0]!;\n if (!SUPPORTED_SOURCES.includes(source as Source)) {\n throw new Error(\n `Unknown --source \"${source}\". Expected one of: ${SUPPORTED_SOURCES.join(\", \")}`,\n );\n }\n\n switch (source as Source) {\n case \"logs\":\n await runLogsSource(searchQuery, options);\n return;\n case \"chat\":\n await runChatSource(searchQuery, options);\n return;\n case \"slack\":\n await runSlackSource(searchQuery, options);\n return;\n }\n }),\n );\n"],"mappings":"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","names":[]}
@@ -5,24 +5,25 @@ import {
5
5
  isInteractive,
6
6
  promptConfirm,
7
7
  promptPassword
8
- } from "./chunk-JFY6GK7Y.js";
8
+ } from "./chunk-X2545RBX.js";
9
9
  import {
10
10
  deleteZeroSecret,
11
11
  listZeroSecrets,
12
12
  setZeroSecret
13
- } from "./chunk-3QXK5RR7.js";
14
- import "./chunk-LTDQISD7.js";
13
+ } from "./chunk-ROB3OE37.js";
14
+ import "./chunk-N6TDQYGF.js";
15
+ import "./chunk-SB7EZ2ZO.js";
15
16
  import {
16
17
  source_default,
17
18
  withErrorHandler
18
- } from "./chunk-XE764T2N.js";
19
- import "./chunk-LRHXR7JT.js";
19
+ } from "./chunk-BQOOTJNB.js";
20
+ import "./chunk-A2NKQGRI.js";
20
21
  import {
21
22
  Command
22
- } from "./chunk-B3W2RUBP.js";
23
+ } from "./chunk-LD4ZVU4O.js";
23
24
  import {
24
25
  init_esm_shims
25
- } from "./chunk-DIRAZ3YX.js";
26
+ } from "./chunk-3VVCUQPB.js";
26
27
 
27
28
  // src/commands/zero/secret/index.ts
28
29
  init_esm_shims();
@@ -146,4 +147,4 @@ var zeroSecretCommand = new Command().name("secret").description("Read or write
146
147
  export {
147
148
  zeroSecretCommand
148
149
  };
149
- //# sourceMappingURL=secret-WALMH6S2.js.map
150
+ //# sourceMappingURL=secret-S4D6CNOX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/zero/secret/index.ts","../src/commands/zero/secret/list.ts","../src/commands/zero/secret/set.ts","../src/commands/zero/secret/delete.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Read or write secrets (API keys, tokens)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroSecrets } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No secrets found\"));\n console.log();\n console.log(\"To add a secret:\");\n console.log(chalk.cyan(\" zero secret set MY_API_KEY --body <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n let typeIndicator = \"\";\n let derivedLine: string | null = null;\n\n if (secret.type === \"model-provider\") {\n typeIndicator = chalk.dim(\" [model-provider]\");\n } else if (secret.connectorDisplay) {\n typeIndicator = chalk.dim(\n ` [${secret.connectorDisplay.label} connector]`,\n );\n derivedLine = chalk.dim(\n `Available as: ${secret.connectorDisplay.environmentNames.join(\", \")}`,\n );\n } else if (secret.type === \"connector\") {\n typeIndicator = chalk.dim(\" [connector]\");\n }\n\n console.log(` ${chalk.cyan(secret.name)}${typeIndicator}`);\n if (derivedLine) {\n console.log(` ${derivedLine}`);\n }\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptPassword } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a secret\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete a secret\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSecret(name);\n console.log(chalk.green(`✓ Secret \"${name}\" deleted`));\n }),\n );\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/zero/secret/index.ts","../src/commands/zero/secret/list.ts","../src/commands/zero/secret/set.ts","../src/commands/zero/secret/delete.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Read or write secrets (API keys, tokens)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroSecrets } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No secrets found\"));\n console.log();\n console.log(\"To add a secret:\");\n console.log(chalk.cyan(\" zero secret set MY_API_KEY --body <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n let typeIndicator = \"\";\n let derivedLine: string | null = null;\n\n if (secret.type === \"model-provider\") {\n typeIndicator = chalk.dim(\" [model-provider]\");\n } else if (secret.connectorDisplay) {\n typeIndicator = chalk.dim(\n ` [${secret.connectorDisplay.label} connector]`,\n );\n derivedLine = chalk.dim(\n `Available as: ${secret.connectorDisplay.environmentNames.join(\", \")}`,\n );\n } else if (secret.type === \"connector\") {\n typeIndicator = chalk.dim(\" [connector]\");\n }\n\n console.log(` ${chalk.cyan(secret.name)}${typeIndicator}`);\n if (derivedLine) {\n console.log(` ${derivedLine}`);\n }\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptPassword } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a secret\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete a secret\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSecret(name);\n console.log(chalk.green(`✓ Secret \"${name}\" deleted`));\n }),\n );\n"],"mappings":"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","names":[]}
@@ -5,22 +5,21 @@ import {
5
5
  completeSlackFileUpload,
6
6
  downloadSlackFile,
7
7
  initSlackFileUpload,
8
- materializeSlackFileUpload,
9
8
  sendSlackMessage
10
- } from "./chunk-3QXK5RR7.js";
11
- import "./chunk-LTDQISD7.js";
9
+ } from "./chunk-ROB3OE37.js";
10
+ import "./chunk-N6TDQYGF.js";
11
+ import "./chunk-SB7EZ2ZO.js";
12
12
  import {
13
- inferWebUploadContentType,
14
13
  source_default,
15
14
  withErrorHandler
16
- } from "./chunk-XE764T2N.js";
17
- import "./chunk-LRHXR7JT.js";
15
+ } from "./chunk-BQOOTJNB.js";
16
+ import "./chunk-A2NKQGRI.js";
18
17
  import {
19
18
  Command
20
- } from "./chunk-B3W2RUBP.js";
19
+ } from "./chunk-LD4ZVU4O.js";
21
20
  import {
22
21
  init_esm_shims
23
- } from "./chunk-DIRAZ3YX.js";
22
+ } from "./chunk-3VVCUQPB.js";
24
23
 
25
24
  // src/commands/zero/slack/index.ts
26
25
  init_esm_shims();
@@ -111,171 +110,9 @@ Examples:
111
110
 
112
111
  // src/commands/zero/slack/upload-file.ts
113
112
  init_esm_shims();
114
- import { createHash, randomUUID } from "crypto";
115
113
  import { statSync, readFileSync as readFileSync2 } from "fs";
116
114
  import { basename } from "path";
117
- function readUploadFile(path) {
118
- let size;
119
- try {
120
- size = statSync(path).size;
121
- } catch {
122
- throw new Error(`File not found: ${path}`);
123
- }
124
- if (size === 0) {
125
- throw new Error("File is empty");
126
- }
127
- return { content: readFileSync2(path), size };
128
- }
129
- function warnDeliveryRetry(operationId) {
130
- console.warn(source_default.dim(` Retry with --operation-id ${operationId}`));
131
- }
132
- async function uploadDirectlyToSlack(initialized, options, fileContent) {
133
- const uploadResponse = await fetch(initialized.uploadUrl, {
134
- method: "POST",
135
- body: fileContent
136
- });
137
- if (!uploadResponse.ok) {
138
- throw new Error(
139
- `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`
140
- );
141
- }
142
- const result = await completeSlackFileUpload({
143
- fileId: initialized.fileId,
144
- channel: options.channel,
145
- threadTs: options.thread,
146
- title: options.title,
147
- initialComment: options.comment
148
- });
149
- console.log(source_default.green(`\u2713 File uploaded (file_id: ${result.fileId})`));
150
- console.log(source_default.dim(` permalink: ${result.permalink}`));
151
- }
152
- async function uploadCanonicalBody(initialized, contentType, fileContent) {
153
- if (!initialized.uploadUrl) {
154
- return;
155
- }
156
- const uploadResponse = await fetch(initialized.uploadUrl, {
157
- method: "PUT",
158
- headers: { "Content-Type": contentType },
159
- body: fileContent
160
- });
161
- if (!uploadResponse.ok) {
162
- throw new Error(
163
- `Canonical file upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`
164
- );
165
- }
166
- }
167
- async function uploadPendingSlackBody(delivery, fileContent) {
168
- try {
169
- const uploadResponse = await fetch(delivery.uploadUrl, {
170
- method: "POST",
171
- body: fileContent
172
- });
173
- if (!uploadResponse.ok) {
174
- return `Slack upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`;
175
- }
176
- return void 0;
177
- } catch (error) {
178
- return error instanceof Error ? error.message : "Slack upload failed";
179
- }
180
- }
181
- async function completeCanonicalSlackDelivery(args) {
182
- const uploadError = await uploadPendingSlackBody(
183
- args.delivery,
184
- args.fileContent
185
- );
186
- let result;
187
- try {
188
- result = await completeSlackFileUpload({
189
- fileId: args.delivery.fileId,
190
- channel: args.options.channel,
191
- ...args.options.thread ? { threadTs: args.options.thread } : {},
192
- ...args.options.title ? { title: args.options.title } : {},
193
- ...args.options.comment ? { initialComment: args.options.comment } : {},
194
- canonicalAssetId: args.initialized.assetId,
195
- operationId: args.initialized.operationId,
196
- ...uploadError ? { uploadError } : {}
197
- });
198
- } catch (error) {
199
- console.warn(
200
- source_default.yellow(
201
- `\u26A0 Slack delivery status could not be recorded: ${error instanceof Error ? error.message : "Unknown error"}`
202
- )
203
- );
204
- warnDeliveryRetry(args.initialized.operationId);
205
- return;
206
- }
207
- if (result.deliveryStatus === "failed") {
208
- console.warn(
209
- source_default.yellow(
210
- `\u26A0 Slack delivery failed: ${result.deliveryError ?? "Unknown error"}`
211
- )
212
- );
213
- warnDeliveryRetry(args.initialized.operationId);
214
- return;
215
- }
216
- console.log(source_default.green(`\u2713 Delivered to Slack (file_id: ${result.fileId})`));
217
- console.log(source_default.dim(` permalink: ${result.permalink}`));
218
- }
219
- async function publishCanonicalFile(initialized, options, contentType, fileContent) {
220
- await uploadCanonicalBody(initialized, contentType, fileContent);
221
- const materialized = await materializeSlackFileUpload({
222
- assetId: initialized.assetId,
223
- operationId: initialized.operationId
224
- });
225
- console.log(
226
- source_default.green(`\u2713 File published (asset_id: ${materialized.assetId})`)
227
- );
228
- console.log(source_default.dim(` url: ${materialized.url}`));
229
- if (materialized.delivery.status === "delivered") {
230
- console.log(
231
- source_default.green(
232
- `\u2713 Delivered to Slack (file_id: ${materialized.delivery.fileId})`
233
- )
234
- );
235
- console.log(source_default.dim(` permalink: ${materialized.delivery.permalink}`));
236
- return;
237
- }
238
- if (materialized.delivery.status === "failed") {
239
- console.warn(
240
- source_default.yellow(`\u26A0 Slack delivery failed: ${materialized.delivery.message}`)
241
- );
242
- warnDeliveryRetry(initialized.operationId);
243
- return;
244
- }
245
- await completeCanonicalSlackDelivery({
246
- initialized,
247
- delivery: materialized.delivery,
248
- options,
249
- fileContent
250
- });
251
- }
252
- async function uploadFile(options) {
253
- const file = readUploadFile(options.file);
254
- const filename = basename(options.file);
255
- const rawContentType = options.contentType ?? inferWebUploadContentType(options.file);
256
- const contentType = rawContentType.split(";")[0]?.trim().toLowerCase() ?? rawContentType;
257
- const operationId = options.operationId ?? randomUUID();
258
- const checksumSha256 = createHash("sha256").update(file.content).digest("hex");
259
- const initialized = await initSlackFileUpload({
260
- filename,
261
- length: file.size,
262
- canonical: {
263
- operationId,
264
- contentType,
265
- checksumSha256,
266
- channel: options.channel,
267
- threadTs: options.thread,
268
- title: options.title,
269
- initialComment: options.comment
270
- }
271
- });
272
- if ("fileId" in initialized) {
273
- await uploadDirectlyToSlack(initialized, options, file.content);
274
- return;
275
- }
276
- await publishCanonicalFile(initialized, options, contentType, file.content);
277
- }
278
- var uploadFileCommand = new Command().name("upload-file").description("Upload a file to a Slack channel as the bot").requiredOption("-f, --file <path>", "Local file path to upload").requiredOption("-c, --channel <id>", "Slack channel ID").option("--thread <ts>", "Thread timestamp to post as a reply").option("--title <title>", "Display title for the file").option("--comment <text>", "Initial comment to accompany the file").option("--content-type <mime>", "Override inferred content type").option("--operation-id <uuid>", "Reuse a failed upload operation").addHelpText(
115
+ var uploadFileCommand = new Command().name("upload-file").description("Upload a file to a Slack channel as the bot").requiredOption("-f, --file <path>", "Local file path to upload").requiredOption("-c, --channel <id>", "Slack channel ID").option("--thread <ts>", "Thread timestamp to post as a reply").option("--title <title>", "Display title for the file").option("--comment <text>", "Initial comment to accompany the file").addHelpText(
279
116
  "after",
280
117
  `
281
118
  Examples:
@@ -285,9 +122,47 @@ Examples:
285
122
 
286
123
  Notes:
287
124
  - Uses the bot token (not user SLACK_TOKEN), so no files:write permission is needed
288
- - Run-scoped calls publish to VM0 storage before Slack delivery
289
- - Returns canonical asset details and Slack delivery status`
290
- ).action(withErrorHandler(uploadFile));
125
+ - Returns file_id and permalink for reference`
126
+ ).action(
127
+ withErrorHandler(
128
+ async (options) => {
129
+ let fileSize;
130
+ try {
131
+ const stat = statSync(options.file);
132
+ fileSize = stat.size;
133
+ } catch {
134
+ throw new Error(`File not found: ${options.file}`);
135
+ }
136
+ if (fileSize === 0) {
137
+ throw new Error("File is empty");
138
+ }
139
+ const filename = basename(options.file);
140
+ const { uploadUrl, fileId } = await initSlackFileUpload({
141
+ filename,
142
+ length: fileSize
143
+ });
144
+ const fileContent = readFileSync2(options.file);
145
+ const uploadResponse = await fetch(uploadUrl, {
146
+ method: "POST",
147
+ body: fileContent
148
+ });
149
+ if (!uploadResponse.ok) {
150
+ throw new Error(
151
+ `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`
152
+ );
153
+ }
154
+ const result = await completeSlackFileUpload({
155
+ fileId,
156
+ channel: options.channel,
157
+ threadTs: options.thread,
158
+ title: options.title,
159
+ initialComment: options.comment
160
+ });
161
+ console.log(source_default.green(`\u2713 File uploaded (file_id: ${result.fileId})`));
162
+ console.log(source_default.dim(` permalink: ${result.permalink}`));
163
+ }
164
+ )
165
+ );
291
166
 
292
167
  // src/commands/zero/slack/download-file.ts
293
168
  init_esm_shims();
@@ -344,4 +219,4 @@ Examples:
344
219
  export {
345
220
  zeroSlackCommand
346
221
  };
347
- //# sourceMappingURL=slack-WXDCNAI2.js.map
222
+ //# sourceMappingURL=slack-E3E2NIDZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/slack/index.ts","../src/commands/zero/slack/message/index.ts","../src/commands/zero/slack/message/send.ts","../src/commands/zero/slack/upload-file.ts","../src/commands/zero/slack/download-file.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { zeroSlackMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\nimport { downloadFileCommand } from \"./download-file\";\n\nexport const zeroSlackCommand = new Command()\n .name(\"slack\")\n .description(\n \"Send messages, upload files, and download files from Slack as the bot\",\n )\n .addCommand(zeroSlackMessageCommand)\n .addCommand(uploadFileCommand)\n .addCommand(downloadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send a message: zero slack message send -c <channel-id> -t \"Hello!\"\n Reply in a thread: zero slack message send -c <channel-id> --thread <ts> -t \"reply\"\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c <channel-id>\n Download a file: zero slack download-file <file-id> -o /tmp/out.png`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroSlackMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Slack messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero slack message send -c <channel-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendSlackMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Slack channel or DM a user\")\n .option(\"-c, --channel <id>\", \"Channel ID\")\n .option(\"-u, --user <id>\", 'Slack user ID for DM (use \"me\" for yourself)')\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--thread <ts>\", \"Thread timestamp for replies\")\n .option(\"--blocks <json>\", \"Block Kit JSON string\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero slack message send -c C01234 -t \"Hello!\"\n DM a user: zero slack message send -u U0A8V9X98QJ -t \"Hello!\"\n DM yourself: zero slack message send -u me -t \"Hello!\"\n Reply in thread: zero slack message send -c C01234 --thread 1234567890.123456 -t \"reply\"\n Rich blocks: zero slack message send -c C01234 --blocks '[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Bold*\"}}]'\n\nNotes:\n - Either --channel or --user is required; they are mutually exclusive\n - Either --text or --blocks is required; both can be used together`,\n )\n .action(\n withErrorHandler(\n async (options: {\n channel?: string;\n user?: string;\n text?: string;\n thread?: string;\n blocks?: string;\n }) => {\n let text = options.text;\n const { channel, user, thread, blocks: blocksStr } = options;\n\n // Validate mutual exclusion: exactly one of --channel or --user\n if (!channel && !user) {\n throw new Error(\"Either --channel or --user must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"\\n zero slack message send -u USER_ID -t \"your message\"',\n ),\n });\n }\n if (channel && user) {\n throw new Error(\"--channel and --user are mutually exclusive\", {\n cause: new Error(\n \"Provide either --channel to send to a channel or --user to DM a user, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is not a TTY\n // (isTTY is true only for an interactive terminal, undefined when piped).\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 // Parse blocks JSON if provided\n let blocks: Array<{ type: string; [key: string]: unknown }> | undefined;\n if (blocksStr) {\n try {\n blocks = JSON.parse(blocksStr) as Array<{\n type: string;\n [key: string]: unknown;\n }>;\n } catch {\n throw new Error(\"Invalid JSON for --blocks flag\", {\n cause: new Error(\n \"Provide a valid JSON array of Block Kit blocks\",\n ),\n });\n }\n }\n\n // Validate at least one of text or blocks\n if (!text && !blocks) {\n throw new Error(\"Either --text or --blocks must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendSlackMessage({\n channel: channel || undefined,\n user: user || undefined,\n text: text || undefined,\n threadTs: thread,\n blocks,\n });\n\n const tsInfo = result.ts ? ` (ts: ${result.ts})` : \"\";\n console.log(chalk.green(`✓ Message sent${tsInfo}`));\n },\n ),\n );\n","import { statSync, readFileSync } from \"fs\";\nimport { basename } from \"path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { initSlackFileUpload, completeSlackFileUpload } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a file to a Slack channel as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"-c, --channel <id>\", \"Slack channel ID\")\n .option(\"--thread <ts>\", \"Thread timestamp to post as a reply\")\n .option(\"--title <title>\", \"Display title for the file\")\n .option(\"--comment <text>\", \"Initial comment to accompany the file\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c C01234\n Upload to thread: zero slack upload-file -f /tmp/log.txt -c C01234 --thread 1234567890.123456\n With title and comment: zero slack upload-file -f /tmp/data.csv -c C01234 --title \"Daily Report\" --comment \"Here's the report\"\n\nNotes:\n - Uses the bot token (not user SLACK_TOKEN), so no files:write permission is needed\n - Returns file_id and permalink for reference`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n channel: string;\n thread?: string;\n title?: string;\n comment?: string;\n }) => {\n // Validate file exists and get size\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n fileSize = stat.size;\n } catch {\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\n // Step 1: Get pre-signed upload URL from server\n const { uploadUrl, fileId } = await initSlackFileUpload({\n filename,\n length: fileSize,\n });\n\n // Step 2: Upload file directly to Slack's pre-signed URL\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(uploadUrl, {\n method: \"POST\",\n body: fileContent,\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n // Step 3: Complete the upload and share to channel/thread\n const result = await completeSlackFileUpload({\n fileId,\n channel: options.channel,\n threadTs: options.thread,\n title: options.title,\n initialComment: options.comment,\n });\n\n console.log(chalk.green(`✓ File uploaded (file_id: ${result.fileId})`));\n console.log(chalk.dim(` permalink: ${result.permalink}`));\n },\n ),\n );\n","import { basename, join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadSlackFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Slack file id.\n * Uses the system temp directory; extension is appended later once the\n * mimetype is known.\n *\n * `basename` strips any path separators from `fileId` so a hostile id like\n * `../etc/passwd` cannot escape `tmpdir()`.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `slack-${basename(fileId)}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Slack file by id using the bot token\")\n .argument(\"<file-id>\", \"Slack file id (e.g. F01234ABCD)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/slack-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero slack download-file F01234ABCD\n Download to explicit path: zero slack download-file F01234ABCD -o /tmp/image.png\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/slack-F01234ABCD\",\"mimetype\":\"image/png\",\"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\nNotes:\n - Uses the bot token on the server side; no user Slack token is needed\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadSlackFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n"],"mappings":"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","names":["readFileSync","readFileSync","basename","basename"]}
@@ -6,19 +6,20 @@ import {
6
6
  downloadTeamsFile,
7
7
  initTeamsFileUpload,
8
8
  sendTeamsMessage
9
- } from "./chunk-3QXK5RR7.js";
10
- import "./chunk-LTDQISD7.js";
9
+ } from "./chunk-ROB3OE37.js";
10
+ import "./chunk-N6TDQYGF.js";
11
+ import "./chunk-SB7EZ2ZO.js";
11
12
  import {
12
13
  source_default,
13
14
  withErrorHandler
14
- } from "./chunk-XE764T2N.js";
15
- import "./chunk-LRHXR7JT.js";
15
+ } from "./chunk-BQOOTJNB.js";
16
+ import "./chunk-A2NKQGRI.js";
16
17
  import {
17
18
  Command
18
- } from "./chunk-B3W2RUBP.js";
19
+ } from "./chunk-LD4ZVU4O.js";
19
20
  import {
20
21
  init_esm_shims
21
- } from "./chunk-DIRAZ3YX.js";
22
+ } from "./chunk-3VVCUQPB.js";
22
23
 
23
24
  // src/commands/zero/teams/index.ts
24
25
  init_esm_shims();
@@ -279,4 +280,4 @@ Examples:
279
280
  export {
280
281
  zeroTeamsCommand
281
282
  };
282
- //# sourceMappingURL=teams-LAQBLRUR.js.map
283
+ //# sourceMappingURL=teams-CLEWT2LQ.js.map