@vm0/cli 9.270.0 → 9.271.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{agent-GWRPSBTH.js → agent-O4PIZ7NO.js} +7 -7
- package/{banking-P6SCAW3O.js → banking-K3T7FGVL.js} +5 -5
- package/{browser-JY5OKWWH.js → browser-ZUXV2DZI.js} +5 -5
- package/{chat-7RH3RGZQ.js → chat-FQ65YTRM.js} +6 -6
- package/{chunk-P46KNOFG.js → chunk-CCUKVMAH.js} +2 -2
- package/{chunk-JUE2IIB6.js → chunk-D7TEG7WN.js} +3 -3
- package/{chunk-4PFAYD37.js → chunk-EINTZ5MX.js} +21 -6
- package/chunk-EINTZ5MX.js.map +1 -0
- package/{chunk-72ZGOFYI.js → chunk-JXUQQIUP.js} +12 -4
- package/chunk-JXUQQIUP.js.map +1 -0
- package/{chunk-ZUHSC7WF.js → chunk-MD3YWUKO.js} +2 -18
- package/chunk-MD3YWUKO.js.map +1 -0
- package/{chunk-WFGX6IFZ.js → chunk-MOWAU52B.js} +2 -2
- package/{chunk-IYGQB2IF.js → chunk-NGDZ3M3I.js} +2 -2
- package/{chunk-6AA2D344.js → chunk-RFTCX5UZ.js} +2 -2
- package/{chunk-W25EDDGL.js → chunk-TC7IZRA2.js} +2 -2
- package/{chunk-VNXDSWLZ.js → chunk-TM6A5MNI.js} +185 -94
- package/chunk-TM6A5MNI.js.map +1 -0
- package/{chunk-NGVPA5PP.js → chunk-TZDXFY6G.js} +289 -394
- package/{chunk-NGVPA5PP.js.map → chunk-TZDXFY6G.js.map} +1 -1
- package/{chunk-IWQVF27E.js → chunk-VSL4HRIA.js} +2 -2
- package/{chunk-JSH7H3SB.js → chunk-X7YXT2UE.js} +14 -10
- package/chunk-X7YXT2UE.js.map +1 -0
- package/{computer-use-KIPDCGWU.js → computer-use-LAD5XLHX.js} +5 -5
- package/{connector-Y5RELY3X.js → connector-AVTEZ5M4.js} +9 -9
- package/{connector-Y5RELY3X.js.map → connector-AVTEZ5M4.js.map} +1 -1
- package/{credit-PYPLO2DH.js → credit-I45PC4IZ.js} +7 -7
- package/{developer-support-BTVJRES3.js → developer-support-HG2427DE.js} +5 -5
- package/{doctor-6O6JP2WS.js → doctor-NEF5PDLF.js} +7 -7
- package/{feishu-JED4BVTP.js → feishu-C7TLUZNW.js} +11 -7
- package/{feishu-JED4BVTP.js.map → feishu-C7TLUZNW.js.map} +1 -1
- package/{finance-3FHYRVG2.js → finance-QRINPXNY.js} +5 -5
- package/{generate-37C27FP7.js → generate-OR4TSIMU.js} +8 -8
- package/{github-EH2LQE7I.js → github-B6FLS3YK.js} +11 -7
- package/{github-EH2LQE7I.js.map → github-B6FLS3YK.js.map} +1 -1
- package/{goal-XECU5EWN.js → goal-QXSEQGAT.js} +5 -5
- package/{host-NEOIQLMT.js → host-4TKBODTL.js} +5 -5
- package/{logs-ETQTIIG4.js → logs-WBT4C34D.js} +8 -8
- package/{mail-PZKZHOCR.js → mail-GVDB4DW2.js} +7 -7
- package/{maps-7M6YJZYG.js → maps-7PWULA7U.js} +5 -5
- package/{model-PGAUO6W5.js → model-54YGVJAR.js} +6 -6
- package/{model-provider-W5UVHH6U.js → model-provider-ZPDGFYK3.js} +6 -6
- package/{org-EUVQDJTX.js → org-4IZEIH7U.js} +5 -5
- package/package.json +1 -1
- package/{people-search-ZN6RLZXA.js → people-search-3MYEUXPL.js} +5 -5
- package/{phone-HXFIS3AF.js → phone-374WD72N.js} +11 -7
- package/{phone-HXFIS3AF.js.map → phone-374WD72N.js.map} +1 -1
- package/{preference-PRQX4SKA.js → preference-6MJRMHWU.js} +5 -5
- package/{resource-JY6BVLHP.js → resource-LHAF45BR.js} +6 -6
- package/{scrape-K4JOJDHX.js → scrape-IWNRA5Y6.js} +5 -5
- package/{search-REY6675M.js → search-D65TMXEQ.js} +8 -8
- package/{secret-IHJS2ING.js → secret-HCD3ZCX2.js} +5 -5
- package/{slack-JTSV74J5.js → slack-R4LKBTX6.js} +10 -6
- package/slack-R4LKBTX6.js.map +1 -0
- package/{teams-7WJFP33N.js → teams-3JJJ2G3A.js} +11 -7
- package/{teams-7WJFP33N.js.map → teams-3JJJ2G3A.js.map} +1 -1
- package/{telegram-AC6MPDBH.js → telegram-2E2UM67J.js} +11 -7
- package/{telegram-AC6MPDBH.js.map → telegram-2E2UM67J.js.map} +1 -1
- package/{upgrade-RHBB33B6.js → upgrade-J6FYUUYV.js} +4 -4
- package/{variable-7T7HFEXZ.js → variable-YXJ6NH3N.js} +5 -5
- package/{video-KAR3CSKG.js → video-GYS2CSQF.js} +4 -4
- package/{weather-2TV7QHNI.js → weather-N5IWRZPG.js} +5 -5
- package/{web-SHKUVKKL.js → web-LPR6C2K7.js} +5 -5
- package/{web-search-TLA5G6MO.js → web-search-BT6BDI5E.js} +5 -5
- package/{whoami-E7OQS7EL.js → whoami-YV26HEXS.js} +7 -7
- package/{workflow-J5PQ5AXJ.js → workflow-T2R3IE2A.js} +6 -6
- package/zero.js +44 -44
- package/chunk-4PFAYD37.js.map +0 -1
- package/chunk-72ZGOFYI.js.map +0 -1
- package/chunk-JSH7H3SB.js.map +0 -1
- package/chunk-VNXDSWLZ.js.map +0 -1
- package/chunk-ZUHSC7WF.js.map +0 -1
- package/slack-JTSV74J5.js.map +0 -1
- /package/{agent-GWRPSBTH.js.map → agent-O4PIZ7NO.js.map} +0 -0
- /package/{banking-P6SCAW3O.js.map → banking-K3T7FGVL.js.map} +0 -0
- /package/{browser-JY5OKWWH.js.map → browser-ZUXV2DZI.js.map} +0 -0
- /package/{chat-7RH3RGZQ.js.map → chat-FQ65YTRM.js.map} +0 -0
- /package/{chunk-P46KNOFG.js.map → chunk-CCUKVMAH.js.map} +0 -0
- /package/{chunk-JUE2IIB6.js.map → chunk-D7TEG7WN.js.map} +0 -0
- /package/{chunk-WFGX6IFZ.js.map → chunk-MOWAU52B.js.map} +0 -0
- /package/{chunk-IYGQB2IF.js.map → chunk-NGDZ3M3I.js.map} +0 -0
- /package/{chunk-6AA2D344.js.map → chunk-RFTCX5UZ.js.map} +0 -0
- /package/{chunk-W25EDDGL.js.map → chunk-TC7IZRA2.js.map} +0 -0
- /package/{chunk-IWQVF27E.js.map → chunk-VSL4HRIA.js.map} +0 -0
- /package/{computer-use-KIPDCGWU.js.map → computer-use-LAD5XLHX.js.map} +0 -0
- /package/{credit-PYPLO2DH.js.map → credit-I45PC4IZ.js.map} +0 -0
- /package/{developer-support-BTVJRES3.js.map → developer-support-HG2427DE.js.map} +0 -0
- /package/{doctor-6O6JP2WS.js.map → doctor-NEF5PDLF.js.map} +0 -0
- /package/{finance-3FHYRVG2.js.map → finance-QRINPXNY.js.map} +0 -0
- /package/{generate-37C27FP7.js.map → generate-OR4TSIMU.js.map} +0 -0
- /package/{goal-XECU5EWN.js.map → goal-QXSEQGAT.js.map} +0 -0
- /package/{host-NEOIQLMT.js.map → host-4TKBODTL.js.map} +0 -0
- /package/{logs-ETQTIIG4.js.map → logs-WBT4C34D.js.map} +0 -0
- /package/{mail-PZKZHOCR.js.map → mail-GVDB4DW2.js.map} +0 -0
- /package/{maps-7M6YJZYG.js.map → maps-7PWULA7U.js.map} +0 -0
- /package/{model-PGAUO6W5.js.map → model-54YGVJAR.js.map} +0 -0
- /package/{model-provider-W5UVHH6U.js.map → model-provider-ZPDGFYK3.js.map} +0 -0
- /package/{org-EUVQDJTX.js.map → org-4IZEIH7U.js.map} +0 -0
- /package/{people-search-ZN6RLZXA.js.map → people-search-3MYEUXPL.js.map} +0 -0
- /package/{preference-PRQX4SKA.js.map → preference-6MJRMHWU.js.map} +0 -0
- /package/{resource-JY6BVLHP.js.map → resource-LHAF45BR.js.map} +0 -0
- /package/{scrape-K4JOJDHX.js.map → scrape-IWNRA5Y6.js.map} +0 -0
- /package/{search-REY6675M.js.map → search-D65TMXEQ.js.map} +0 -0
- /package/{secret-IHJS2ING.js.map → secret-HCD3ZCX2.js.map} +0 -0
- /package/{upgrade-RHBB33B6.js.map → upgrade-J6FYUUYV.js.map} +0 -0
- /package/{variable-7T7HFEXZ.js.map → variable-YXJ6NH3N.js.map} +0 -0
- /package/{video-KAR3CSKG.js.map → video-GYS2CSQF.js.map} +0 -0
- /package/{weather-2TV7QHNI.js.map → weather-N5IWRZPG.js.map} +0 -0
- /package/{web-SHKUVKKL.js.map → web-LPR6C2K7.js.map} +0 -0
- /package/{web-search-TLA5G6MO.js.map → web-search-BT6BDI5E.js.map} +0 -0
- /package/{whoami-E7OQS7EL.js.map → whoami-YV26HEXS.js.map} +0 -0
- /package/{workflow-J5PQ5AXJ.js.map → workflow-T2R3IE2A.js.map} +0 -0
|
@@ -5,27 +5,27 @@ import {
|
|
|
5
5
|
currentPlanAllowsVideo,
|
|
6
6
|
currentPlanCanBuyCredits,
|
|
7
7
|
currentTokenCanReadBilling
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-NGDZ3M3I.js";
|
|
9
9
|
import {
|
|
10
10
|
createZeroCreditCheckout,
|
|
11
11
|
getZeroBillingStatus,
|
|
12
12
|
getZeroOrgMembers
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-TZDXFY6G.js";
|
|
14
|
+
import "./chunk-JXUQQIUP.js";
|
|
15
15
|
import {
|
|
16
16
|
planUpgradeUrl
|
|
17
17
|
} from "./chunk-2NW76WYJ.js";
|
|
18
18
|
import {
|
|
19
19
|
getPlatformOrigin
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-CCUKVMAH.js";
|
|
21
21
|
import "./chunk-MA22KQYU.js";
|
|
22
22
|
import {
|
|
23
23
|
source_default,
|
|
24
24
|
withErrorHandler
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-D7TEG7WN.js";
|
|
26
26
|
import {
|
|
27
27
|
decodeZeroTokenPayload
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-MD3YWUKO.js";
|
|
29
29
|
import {
|
|
30
30
|
Command,
|
|
31
31
|
Option
|
|
@@ -163,4 +163,4 @@ var zeroCreditCommand = new Command().name("credit").description("View credit ba
|
|
|
163
163
|
export {
|
|
164
164
|
zeroCreditCommand
|
|
165
165
|
};
|
|
166
|
-
//# sourceMappingURL=credit-
|
|
166
|
+
//# sourceMappingURL=credit-I45PC4IZ.js.map
|
|
@@ -4,13 +4,13 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import {
|
|
5
5
|
requestDeveloperSupportConsent,
|
|
6
6
|
submitDeveloperSupport
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-TZDXFY6G.js";
|
|
8
|
+
import "./chunk-JXUQQIUP.js";
|
|
9
9
|
import "./chunk-MA22KQYU.js";
|
|
10
10
|
import {
|
|
11
11
|
withErrorHandler
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-D7TEG7WN.js";
|
|
13
|
+
import "./chunk-MD3YWUKO.js";
|
|
14
14
|
import {
|
|
15
15
|
Command
|
|
16
16
|
} from "./chunk-CCWPKGTB.js";
|
|
@@ -61,4 +61,4 @@ Notes:
|
|
|
61
61
|
export {
|
|
62
62
|
zeroDeveloperSupportCommand
|
|
63
63
|
};
|
|
64
|
-
//# sourceMappingURL=developer-support-
|
|
64
|
+
//# sourceMappingURL=developer-support-HG2427DE.js.map
|
|
@@ -4,25 +4,25 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import {
|
|
5
5
|
currentPlanAllowsVideo,
|
|
6
6
|
currentPlanCanBuyCredits
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NGDZ3M3I.js";
|
|
8
8
|
import {
|
|
9
9
|
getZeroBillingStatus,
|
|
10
10
|
getZeroOrg,
|
|
11
11
|
getZeroOrgMembers
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-TZDXFY6G.js";
|
|
13
|
+
import "./chunk-JXUQQIUP.js";
|
|
14
14
|
import {
|
|
15
15
|
planUpgradeUrl
|
|
16
16
|
} from "./chunk-2NW76WYJ.js";
|
|
17
17
|
import {
|
|
18
18
|
getPlatformOrigin
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-CCUKVMAH.js";
|
|
20
20
|
import "./chunk-MA22KQYU.js";
|
|
21
21
|
import {
|
|
22
22
|
source_default,
|
|
23
23
|
withErrorHandler
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import "./chunk-
|
|
24
|
+
} from "./chunk-D7TEG7WN.js";
|
|
25
|
+
import "./chunk-MD3YWUKO.js";
|
|
26
26
|
import {
|
|
27
27
|
Command
|
|
28
28
|
} from "./chunk-CCWPKGTB.js";
|
|
@@ -122,4 +122,4 @@ Notes:
|
|
|
122
122
|
export {
|
|
123
123
|
zeroDoctorCommand
|
|
124
124
|
};
|
|
125
|
-
//# sourceMappingURL=doctor-
|
|
125
|
+
//# sourceMappingURL=doctor-NEF5PDLF.js.map
|
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
downloadFeishuFile,
|
|
8
8
|
initFeishuFileUpload,
|
|
9
9
|
sendFeishuMessage
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-TZDXFY6G.js";
|
|
11
|
+
import "./chunk-JXUQQIUP.js";
|
|
12
12
|
import "./chunk-MA22KQYU.js";
|
|
13
13
|
import {
|
|
14
14
|
source_default,
|
|
15
15
|
withErrorHandler
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-D7TEG7WN.js";
|
|
17
|
+
import "./chunk-MD3YWUKO.js";
|
|
18
18
|
import {
|
|
19
19
|
Command
|
|
20
20
|
} from "./chunk-CCWPKGTB.js";
|
|
@@ -235,11 +235,15 @@ Notes:
|
|
|
235
235
|
const prepared = await initFeishuFileUpload({
|
|
236
236
|
filename,
|
|
237
237
|
contentType,
|
|
238
|
-
length: fileSize
|
|
238
|
+
length: fileSize,
|
|
239
|
+
supportsUploadHeaders: true
|
|
239
240
|
});
|
|
240
241
|
const uploadResponse = await fetch(prepared.uploadUrl, {
|
|
241
242
|
method: "PUT",
|
|
242
|
-
headers: {
|
|
243
|
+
headers: {
|
|
244
|
+
"Content-Type": prepared.contentType,
|
|
245
|
+
...prepared.uploadHeaders
|
|
246
|
+
},
|
|
243
247
|
body: new Uint8Array(readFileSync2(options.file))
|
|
244
248
|
});
|
|
245
249
|
if (!uploadResponse.ok) {
|
|
@@ -274,4 +278,4 @@ Examples:
|
|
|
274
278
|
export {
|
|
275
279
|
zeroFeishuCommand
|
|
276
280
|
};
|
|
277
|
-
//# sourceMappingURL=feishu-
|
|
281
|
+
//# sourceMappingURL=feishu-C7TLUZNW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/feishu/index.ts","../src/commands/zero/feishu/download-file.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\";\nimport { withErrorHandler } from \"../../../lib/command\";\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 { 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\";\nimport { withErrorHandler } from \"../../../../lib/command\";\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\";\nimport { withErrorHandler } from \"../../../lib/command\";\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 });\n const uploadResponse = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": prepared.contentType },\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/feishu/index.ts","../src/commands/zero/feishu/download-file.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\";\nimport { withErrorHandler } from \"../../../lib/command\";\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 { 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\";\nimport { withErrorHandler } from \"../../../../lib/command\";\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\";\nimport { withErrorHandler } from \"../../../lib/command\";\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":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;ACAA;AAAA,SAAS,cAAc;AACvB,SAAS,UAAU,YAAY;AAQ/B,SAAS,eAAe,SAAyB;AAC/C,SAAO,KAAK,OAAO,GAAG,UAAU,SAAS,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE;AAClE;AAEA,SAAS,kBAAkB,OAAmC;AAC5D,MAAI,UAAU,UAAU,UAAU,SAAS;AACzC,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,SAAO;AACT;AAEO,IAAM,sBAAsB,IAAI,QAAQ,EAC5C,KAAK,eAAe,EACpB,YAAY,uCAAuC,EACnD,SAAS,gBAAgB,uCAAuC,EAChE,SAAS,cAAc,qCAAqC,EAC5D;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,2BAA2B,wBAAwB,EAC1D,OAAO,oBAAoB,+CAA+C,EAC1E;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcF,EACC;AAAA,EACC;AAAA,IACE,OACE,WACA,SACA,YAKG;AACH,YAAM,UAAU,QAAQ,OAAO,eAAe,OAAO;AACrD,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,kBAAkB,QAAQ,IAAI;AAAA,QAC9B,QAAQ;AAAA,QACR;AAAA,MACF;AACA,cAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,IACpC;AAAA,EACF;AACF;;;ACtEF;;;ACAA;AAAA,SAAS,oBAAoB;AAkB7B,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,UACP,OACqC;AACrC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,KAAK;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,MAAM,gCAAgC;AAAA,MAC9C,OAAO,IAAI,MAAM,yCAAyC;AAAA,IAC5D,CAAC;AAAA,EACH;AACA,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,UAAM,IAAI,MAAM,2BAA2B;AAAA,MACzC,OAAO,IAAI,MAAM,mCAAmC;AAAA,IACtD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,IAAM,cAAc,IAAI,QAAQ,EACpC,KAAK,MAAM,EACX,YAAY,yCAAyC,EACrD,OAAO,2BAA2B,wBAAwB,EAC1D,OAAO,mBAAmB,gBAAgB,EAC1C,OAAO,wBAAwB,6CAA6C,EAC5E,OAAO,4BAA4B,wBAAwB,EAC3D,OAAO,YAAY,0BAA0B,EAC7C,OAAO,wBAAwB,cAAc,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaF,EACC;AAAA,EACC,iBAAiB,OAAO,YAA+B;AACrD,UAAM,UAAU,CAAC,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,MAC1D;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO;AACpC,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,QAAI,OAAO,QAAQ;AACnB,QAAI,CAAC,QAAQ,CAAC,QAAQ,QAAQ,CAAC,QAAQ,MAAM,OAAO;AAClD,UAAI;AACF,eAAO,aAAa,cAAc,MAAM,EAAE,KAAK;AAAA,MACjD,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,OAAO,UAAU,QAAQ,IAAI;AACnC,QAAI,QAAQ,IAAI,MAAM,QAAQ,IAAI,GAAG;AACnC,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AAEA,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC,gBAAgB,QAAQ;AAAA,MACxB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,kBAAkB,QAAQ;AAAA,MAC1B,eAAe,QAAQ;AAAA,MACvB;AAAA,MACA;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,eAAM,MAAM,iCAA4B,OAAO,SAAS,GAAG,CAAC;AAAA,EAC1E,CAAC;AACH;;;ADxGK,IAAM,2BAA2B,IAAI,QAAQ,EACjD,KAAK,SAAS,EACd,YAAY,sBAAsB,EAClC,WAAW,WAAW;;;AEPzB;AAAA,SAAS,gBAAAA,eAAc,gBAAgB;AACvC,SAAS,YAAAC,WAAU,eAAe;AAWlC,IAAM,oBAAsD;AAAA,EAC1D,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAYA,SAAS,iBAAiB,WAA2B;AACnD,SACE,kBAAkB,QAAQ,SAAS,EAAE,YAAY,CAAC,KAClD;AAEJ;AAEO,IAAM,oBAAoB,IAAI,QAAQ,EAC1C,KAAK,aAAa,EAClB,YAAY,sDAAsD,EAClE,eAAe,qBAAqB,2BAA2B,EAC/D,OAAO,2BAA2B,wBAAwB,EAC1D,OAAO,mBAAmB,gBAAgB,EAC1C,OAAO,wBAAwB,6CAA6C,EAC5E,OAAO,4BAA4B,wBAAwB,EAC3D,OAAO,YAAY,0BAA0B,EAC7C,OAAO,yBAAyB,gCAAgC,EAChE;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeF,EACC;AAAA,EACC,iBAAiB,OAAO,YAAiC;AACvD,UAAM,UAAU,CAAC,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,MAC1D;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO;AACpC,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,OAAO,SAAS,QAAQ,IAAI;AAClC,UAAI,CAAC,KAAK,OAAO,GAAG;AAClB,cAAM,IAAI,MAAM,uBAAuB,QAAQ,IAAI,EAAE;AAAA,MACvD;AACA,iBAAW,KAAK;AAAA,IAClB,SAAS,OAAO;AACd,UAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,MAAM,GAAG;AAC9D,cAAM;AAAA,MACR;AACA,YAAM,IAAI,MAAM,mBAAmB,QAAQ,IAAI,EAAE;AAAA,IACnD;AACA,QAAI,aAAa,GAAG;AAClB,YAAM,IAAI,MAAM,eAAe;AAAA,IACjC;AACA,QAAI,WAAW,8BAA8B;AAC3C,YAAM,IAAI;AAAA,QACR,yBAAyB,4BAA4B;AAAA,MACvD;AAAA,IACF;AAEA,UAAM,WAAWC,UAAS,QAAQ,IAAI;AACtC,UAAM,cAAc,QAAQ,eAAe,iBAAiB,QAAQ,IAAI;AACxE,UAAM,WAAW,MAAM,qBAAqB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,uBAAuB;AAAA,IACzB,CAAC;AACD,UAAM,iBAAiB,MAAM,MAAM,SAAS,WAAW;AAAA,MACrD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB,SAAS;AAAA,QACzB,GAAG,SAAS;AAAA,MACd;AAAA,MACA,MAAM,IAAI,WAAWC,cAAa,QAAQ,IAAI,CAAC;AAAA,IACjD,CAAC;AACD,QAAI,CAAC,eAAe,IAAI;AACtB,YAAM,IAAI;AAAA,QACR,uBAAuB,eAAe,MAAM,IAAI,eAAe,UAAU;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,yBAAyB;AAAA,MAC5C,UAAU,SAAS;AAAA,MACnB,gBAAgB,QAAQ;AAAA,MACxB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,kBAAkB,QAAQ;AAAA,MAC1B,eAAe,QAAQ;AAAA,MACvB,aAAa,SAAS;AAAA,IACxB,CAAC;AACD,YAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,EACpC,CAAC;AACH;;;AJzIK,IAAM,oBAAoB,IAAI,QAAQ,EAC1C,KAAK,QAAQ,EACb,YAAY,iDAAiD,EAC7D,WAAW,wBAAwB,EACnC,WAAW,mBAAmB,EAC9B,WAAW,iBAAiB,EAC5B;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOF;","names":["readFileSync","basename","basename","readFileSync"]}
|
|
@@ -14,14 +14,14 @@ import {
|
|
|
14
14
|
zeroFinanceQuoteRequestSchema,
|
|
15
15
|
zeroFinanceRangeSchema,
|
|
16
16
|
zeroFinanceSearchRequestSchema
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-TZDXFY6G.js";
|
|
18
|
+
import "./chunk-JXUQQIUP.js";
|
|
19
19
|
import "./chunk-MA22KQYU.js";
|
|
20
20
|
import {
|
|
21
21
|
source_default,
|
|
22
22
|
withErrorHandler
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-D7TEG7WN.js";
|
|
24
|
+
import "./chunk-MD3YWUKO.js";
|
|
25
25
|
import {
|
|
26
26
|
Command,
|
|
27
27
|
InvalidArgumentError,
|
|
@@ -125,4 +125,4 @@ Notes:
|
|
|
125
125
|
export {
|
|
126
126
|
zeroFinanceCommand
|
|
127
127
|
};
|
|
128
|
-
//# sourceMappingURL=finance-
|
|
128
|
+
//# sourceMappingURL=finance-QRINPXNY.js.map
|
|
@@ -19,35 +19,35 @@ import {
|
|
|
19
19
|
resolvePresentationRunbookColorToken,
|
|
20
20
|
selectResourceCandidates,
|
|
21
21
|
toGenerationTarget
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-TM6A5MNI.js";
|
|
23
23
|
import {
|
|
24
24
|
currentPlanAllowsVideo,
|
|
25
25
|
currentTokenCanReadBilling
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-NGDZ3M3I.js";
|
|
27
27
|
import {
|
|
28
28
|
getZeroAgentUserConnectors,
|
|
29
29
|
getZeroBillingStatus,
|
|
30
30
|
listZeroConnectorCatalog,
|
|
31
31
|
listZeroConnectorCatalogStatus
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-TZDXFY6G.js";
|
|
33
33
|
import {
|
|
34
34
|
generateWebImage,
|
|
35
35
|
generateWebVideo,
|
|
36
36
|
generateWebVoice
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-JXUQQIUP.js";
|
|
38
38
|
import {
|
|
39
39
|
planUpgradeUrl
|
|
40
40
|
} from "./chunk-2NW76WYJ.js";
|
|
41
41
|
import {
|
|
42
42
|
getPlatformOrigin
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-CCUKVMAH.js";
|
|
44
44
|
import "./chunk-MA22KQYU.js";
|
|
45
45
|
import {
|
|
46
46
|
ApiRequestError,
|
|
47
47
|
source_default,
|
|
48
48
|
withErrorHandler
|
|
49
|
-
} from "./chunk-
|
|
50
|
-
import "./chunk-
|
|
49
|
+
} from "./chunk-D7TEG7WN.js";
|
|
50
|
+
import "./chunk-MD3YWUKO.js";
|
|
51
51
|
import {
|
|
52
52
|
Command,
|
|
53
53
|
InvalidArgumentError,
|
|
@@ -2804,4 +2804,4 @@ var generateCommand = new Command().name("generate").description(
|
|
|
2804
2804
|
export {
|
|
2805
2805
|
generateCommand
|
|
2806
2806
|
};
|
|
2807
|
-
//# sourceMappingURL=generate-
|
|
2807
|
+
//# sourceMappingURL=generate-OR4TSIMU.js.map
|
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
completeGithubFileUpload,
|
|
6
6
|
downloadGithubFile,
|
|
7
7
|
initGithubFileUpload
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-TZDXFY6G.js";
|
|
9
|
+
import "./chunk-JXUQQIUP.js";
|
|
10
10
|
import "./chunk-MA22KQYU.js";
|
|
11
11
|
import {
|
|
12
12
|
withErrorHandler
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-D7TEG7WN.js";
|
|
14
|
+
import "./chunk-MD3YWUKO.js";
|
|
15
15
|
import {
|
|
16
16
|
Command
|
|
17
17
|
} from "./chunk-CCWPKGTB.js";
|
|
@@ -165,12 +165,16 @@ Notes:
|
|
|
165
165
|
const prepared = await initGithubFileUpload({
|
|
166
166
|
filename,
|
|
167
167
|
contentType,
|
|
168
|
-
length: fileSize
|
|
168
|
+
length: fileSize,
|
|
169
|
+
supportsUploadHeaders: true
|
|
169
170
|
});
|
|
170
171
|
const fileContent = readFileSync(options.file);
|
|
171
172
|
const uploadResponse = await fetch(prepared.uploadUrl, {
|
|
172
173
|
method: "PUT",
|
|
173
|
-
headers: {
|
|
174
|
+
headers: {
|
|
175
|
+
"Content-Type": prepared.contentType,
|
|
176
|
+
...prepared.uploadHeaders
|
|
177
|
+
},
|
|
174
178
|
body: new Uint8Array(fileContent)
|
|
175
179
|
});
|
|
176
180
|
if (!uploadResponse.ok) {
|
|
@@ -201,4 +205,4 @@ Examples:
|
|
|
201
205
|
export {
|
|
202
206
|
zeroGithubCommand
|
|
203
207
|
};
|
|
204
|
-
//# sourceMappingURL=github-
|
|
208
|
+
//# sourceMappingURL=github-B6FLS3YK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/github/index.ts","../src/commands/zero/github/download-file.ts","../src/commands/zero/github/upload-file.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroGithubCommand = new Command()\n .name(\"github\")\n .description(\"Upload and download GitHub files\")\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero github upload-file -f /tmp/report.pdf -r vm0-ai/vm0 -i 42\n Download a file: zero github download-file https://github.com/user-attachments/assets/abc123 -o /tmp/out.png`,\n );\n","import { basename, join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadGithubFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nfunction filenameFromUrl(fileUrl: string): string {\n if (URL.canParse(fileUrl)) {\n const segment = new URL(fileUrl).pathname.split(\"/\").filter(Boolean).pop();\n if (!segment) {\n return \"file\";\n }\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n }\n return basename(fileUrl) || \"file\";\n}\n\nfunction safeDefaultFilename(filename: string): string {\n const component = basename(filename.replaceAll(\"\\\\\", \"/\"));\n if (!component || component === \".\" || component === \"..\") {\n return \"file\";\n }\n return component;\n}\n\nfunction defaultOutPath(fileUrl: string, filename?: string): string {\n return join(\n tmpdir(),\n `github-${safeDefaultFilename(filename || filenameFromUrl(fileUrl))}`,\n );\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a file from a GitHub context block\")\n .argument(\"<url>\", \"URL from a [GitHub file] block\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/github-<filename-or-url-basename>)\",\n )\n .option(\"--filename <name>\", \"Filename hint from the [GitHub file] block\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero github download-file https://github.com/user-attachments/assets/abc123 --filename screenshot.png\n Download to explicit path: zero github download-file https://github.com/user-attachments/assets/abc123 -o /tmp/screenshot.png\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/github-screenshot.png\",\"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/github_frame_%03d.jpg\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - The URL comes from a [GitHub file] block\n - Streams the GitHub file bytes through VM0 directly to disk`,\n )\n .action(\n withErrorHandler(\n async (fileUrl: string, options: { out?: string; filename?: string }) => {\n const outPath =\n options.out ?? defaultOutPath(fileUrl, options.filename);\n const result = await downloadGithubFile(\n fileUrl,\n outPath,\n options.filename,\n );\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { readFileSync, statSync } from \"fs\";\nimport { basename, extname } from \"path\";\nimport { Command } from \"commander\";\nimport {\n completeGithubFileUpload,\n initGithubFileUpload,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".md\": \"text/markdown\",\n \".json\": \"application/json\",\n};\n\nfunction inferContentType(localPath: string): string {\n const ext = extname(localPath).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? \"application/octet-stream\";\n}\n\nfunction parseIssueNumber(value: string): number {\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(\"issue-number must be a positive integer\");\n }\n return parsed;\n}\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file to a GitHub issue or pull request comment\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"-r, --repo <owner/name>\", \"GitHub repository\")\n .requiredOption(\n \"-i, --issue-number <number>\",\n \"GitHub issue or pull request number\",\n )\n .option(\"--caption <text>\", \"Text to include before the file link\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero github upload-file -f /tmp/report.pdf -r vm0-ai/vm0 -i 42\n With a caption: zero github upload-file -f /tmp/data.csv -r vm0-ai/vm0 -i 42 --caption \"Daily report\"\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"commentId\":\"123\",\"repo\":\"vm0-ai/vm0\",\"issueNumber\":42,\"filename\":\"report.pdf\",\"mimetype\":\"application/pdf\",\"size\":12345,\"url\":\"https://...\"}\n\nNotes:\n - Uses the GitHub App installation on the server side\n - Uploads through VM0 storage first, then posts a GitHub comment containing the file URL`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n repo: string;\n issueNumber: string;\n caption?: string;\n contentType?: string;\n }) => {\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n if (!stat.isFile()) {\n throw new Error(`Not a regular file: ${options.file}`);\n }\n fileSize = stat.size;\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Not \")) {\n throw error;\n }\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n\n const filename = basename(options.file);\n const contentType =\n options.contentType ?? inferContentType(options.file);\n const issueNumber = parseIssueNumber(options.issueNumber);\n\n const prepared = await initGithubFileUpload({\n filename,\n contentType,\n length: fileSize,\n });\n\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": prepared.contentType },\n body: new Uint8Array(fileContent),\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n const result = await completeGithubFileUpload({\n uploadId: prepared.uploadId,\n repo: options.repo,\n issueNumber,\n contentType: prepared.contentType,\n caption: options.caption,\n });\n\n console.log(JSON.stringify(result));\n },\n ),\n );\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;;ACAA;AAAA,SAAS,UAAU,YAAY;AAC/B,SAAS,cAAc;AAKvB,SAAS,gBAAgB,SAAyB;AAChD,MAAI,IAAI,SAAS,OAAO,GAAG;AACzB,UAAM,UAAU,IAAI,IAAI,OAAO,EAAE,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAO,mBAAmB,OAAO;AAAA,IACnC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,SAAS,OAAO,KAAK;AAC9B;AAEA,SAAS,oBAAoB,UAA0B;AACrD,QAAM,YAAY,SAAS,SAAS,WAAW,MAAM,GAAG,CAAC;AACzD,MAAI,CAAC,aAAa,cAAc,OAAO,cAAc,MAAM;AACzD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAAiB,UAA2B;AAClE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU,oBAAoB,YAAY,gBAAgB,OAAO,CAAC,CAAC;AAAA,EACrE;AACF;AAEO,IAAM,sBAAsB,IAAI,QAAQ,EAC5C,KAAK,eAAe,EACpB,YAAY,6CAA6C,EACzD,SAAS,SAAS,gCAAgC,EAClD;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,qBAAqB,4CAA4C,EACxE;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBF,EACC;AAAA,EACC;AAAA,IACE,OAAO,SAAiB,YAAiD;AACvE,YAAM,UACJ,QAAQ,OAAO,eAAe,SAAS,QAAQ,QAAQ;AACzD,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AACA,cAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,IACpC;AAAA,EACF;AACF;;;ACjFF;AAAA,SAAS,cAAc,gBAAgB;AACvC,SAAS,YAAAA,WAAU,eAAe;AAQlC,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX;AAEA,SAAS,iBAAiB,WAA2B;AACnD,QAAM,MAAM,QAAQ,SAAS,EAAE,YAAY;AAC3C,SAAO,kBAAkB,GAAG,KAAK;AACnC;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,UAAU,GAAG;AAChD,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACA,SAAO;AACT;AAEO,IAAM,oBAAoB,IAAI,QAAQ,EAC1C,KAAK,aAAa,EAClB,YAAY,+DAA+D,EAC3E,eAAe,qBAAqB,2BAA2B,EAC/D,eAAe,2BAA2B,mBAAmB,EAC7D;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,oBAAoB,sCAAsC,EACjE,OAAO,yBAAyB,gCAAgC,EAChE;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYF,EACC;AAAA,EACC;AAAA,IACE,OAAO,YAMD;AACJ,UAAI;AACJ,UAAI;AACF,cAAM,OAAO,SAAS,QAAQ,IAAI;AAClC,YAAI,CAAC,KAAK,OAAO,GAAG;AAClB,gBAAM,IAAI,MAAM,uBAAuB,QAAQ,IAAI,EAAE;AAAA,QACvD;AACA,mBAAW,KAAK;AAAA,MAClB,SAAS,OAAO;AACd,YAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,MAAM,GAAG;AAC9D,gBAAM;AAAA,QACR;AACA,cAAM,IAAI,MAAM,mBAAmB,QAAQ,IAAI,EAAE;AAAA,MACnD;AAEA,UAAI,aAAa,GAAG;AAClB,cAAM,IAAI,MAAM,eAAe;AAAA,MACjC;AAEA,YAAM,WAAWC,UAAS,QAAQ,IAAI;AACtC,YAAM,cACJ,QAAQ,eAAe,iBAAiB,QAAQ,IAAI;AACtD,YAAM,cAAc,iBAAiB,QAAQ,WAAW;AAExD,YAAM,WAAW,MAAM,qBAAqB;AAAA,QAC1C;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,cAAc,aAAa,QAAQ,IAAI;AAC7C,YAAM,iBAAiB,MAAM,MAAM,SAAS,WAAW;AAAA,QACrD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,SAAS,YAAY;AAAA,QAChD,MAAM,IAAI,WAAW,WAAW;AAAA,MAClC,CAAC;AAED,UAAI,CAAC,eAAe,IAAI;AACtB,cAAM,IAAI;AAAA,UACR,uBAAuB,eAAe,MAAM,IAAI,eAAe,UAAU;AAAA,QAC3E;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,yBAAyB;AAAA,QAC5C,UAAU,SAAS;AAAA,QACnB,MAAM,QAAQ;AAAA,QACd;AAAA,QACA,aAAa,SAAS;AAAA,QACtB,SAAS,QAAQ;AAAA,MACnB,CAAC;AAED,cAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,IACpC;AAAA,EACF;AACF;;;AF3HK,IAAM,oBAAoB,IAAI,QAAQ,EAC1C,KAAK,QAAQ,EACb,YAAY,kCAAkC,EAC9C,WAAW,mBAAmB,EAC9B,WAAW,iBAAiB,EAC5B;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAIF;","names":["basename","basename"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/github/index.ts","../src/commands/zero/github/download-file.ts","../src/commands/zero/github/upload-file.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroGithubCommand = new Command()\n .name(\"github\")\n .description(\"Upload and download GitHub files\")\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero github upload-file -f /tmp/report.pdf -r vm0-ai/vm0 -i 42\n Download a file: zero github download-file https://github.com/user-attachments/assets/abc123 -o /tmp/out.png`,\n );\n","import { basename, join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadGithubFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nfunction filenameFromUrl(fileUrl: string): string {\n if (URL.canParse(fileUrl)) {\n const segment = new URL(fileUrl).pathname.split(\"/\").filter(Boolean).pop();\n if (!segment) {\n return \"file\";\n }\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n }\n return basename(fileUrl) || \"file\";\n}\n\nfunction safeDefaultFilename(filename: string): string {\n const component = basename(filename.replaceAll(\"\\\\\", \"/\"));\n if (!component || component === \".\" || component === \"..\") {\n return \"file\";\n }\n return component;\n}\n\nfunction defaultOutPath(fileUrl: string, filename?: string): string {\n return join(\n tmpdir(),\n `github-${safeDefaultFilename(filename || filenameFromUrl(fileUrl))}`,\n );\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a file from a GitHub context block\")\n .argument(\"<url>\", \"URL from a [GitHub file] block\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/github-<filename-or-url-basename>)\",\n )\n .option(\"--filename <name>\", \"Filename hint from the [GitHub file] block\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero github download-file https://github.com/user-attachments/assets/abc123 --filename screenshot.png\n Download to explicit path: zero github download-file https://github.com/user-attachments/assets/abc123 -o /tmp/screenshot.png\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/github-screenshot.png\",\"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/github_frame_%03d.jpg\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - The URL comes from a [GitHub file] block\n - Streams the GitHub file bytes through VM0 directly to disk`,\n )\n .action(\n withErrorHandler(\n async (fileUrl: string, options: { out?: string; filename?: string }) => {\n const outPath =\n options.out ?? defaultOutPath(fileUrl, options.filename);\n const result = await downloadGithubFile(\n fileUrl,\n outPath,\n options.filename,\n );\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { readFileSync, statSync } from \"fs\";\nimport { basename, extname } from \"path\";\nimport { Command } from \"commander\";\nimport {\n completeGithubFileUpload,\n initGithubFileUpload,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".md\": \"text/markdown\",\n \".json\": \"application/json\",\n};\n\nfunction inferContentType(localPath: string): string {\n const ext = extname(localPath).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? \"application/octet-stream\";\n}\n\nfunction parseIssueNumber(value: string): number {\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(\"issue-number must be a positive integer\");\n }\n return parsed;\n}\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file to a GitHub issue or pull request comment\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"-r, --repo <owner/name>\", \"GitHub repository\")\n .requiredOption(\n \"-i, --issue-number <number>\",\n \"GitHub issue or pull request number\",\n )\n .option(\"--caption <text>\", \"Text to include before the file link\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero github upload-file -f /tmp/report.pdf -r vm0-ai/vm0 -i 42\n With a caption: zero github upload-file -f /tmp/data.csv -r vm0-ai/vm0 -i 42 --caption \"Daily report\"\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"commentId\":\"123\",\"repo\":\"vm0-ai/vm0\",\"issueNumber\":42,\"filename\":\"report.pdf\",\"mimetype\":\"application/pdf\",\"size\":12345,\"url\":\"https://...\"}\n\nNotes:\n - Uses the GitHub App installation on the server side\n - Uploads through VM0 storage first, then posts a GitHub comment containing the file URL`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n repo: string;\n issueNumber: string;\n caption?: string;\n contentType?: string;\n }) => {\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n if (!stat.isFile()) {\n throw new Error(`Not a regular file: ${options.file}`);\n }\n fileSize = stat.size;\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Not \")) {\n throw error;\n }\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n\n const filename = basename(options.file);\n const contentType =\n options.contentType ?? inferContentType(options.file);\n const issueNumber = parseIssueNumber(options.issueNumber);\n\n const prepared = await initGithubFileUpload({\n filename,\n contentType,\n length: fileSize,\n supportsUploadHeaders: true,\n });\n\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": prepared.contentType,\n ...prepared.uploadHeaders,\n },\n body: new Uint8Array(fileContent),\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n const result = await completeGithubFileUpload({\n uploadId: prepared.uploadId,\n repo: options.repo,\n issueNumber,\n contentType: prepared.contentType,\n caption: options.caption,\n });\n\n console.log(JSON.stringify(result));\n },\n ),\n );\n"],"mappings":"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","names":["basename","basename"]}
|
|
@@ -10,13 +10,13 @@ import {
|
|
|
10
10
|
getGoal,
|
|
11
11
|
pauseGoal,
|
|
12
12
|
resumeGoal
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-TZDXFY6G.js";
|
|
14
|
+
import "./chunk-JXUQQIUP.js";
|
|
15
15
|
import "./chunk-MA22KQYU.js";
|
|
16
16
|
import {
|
|
17
17
|
withErrorHandler
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
18
|
+
} from "./chunk-D7TEG7WN.js";
|
|
19
|
+
import "./chunk-MD3YWUKO.js";
|
|
20
20
|
import {
|
|
21
21
|
Command
|
|
22
22
|
} from "./chunk-CCWPKGTB.js";
|
|
@@ -78,4 +78,4 @@ var zeroGoalCommand = new Command().name("goal").description("Manage the current
|
|
|
78
78
|
export {
|
|
79
79
|
zeroGoalCommand
|
|
80
80
|
};
|
|
81
|
-
//# sourceMappingURL=goal-
|
|
81
|
+
//# sourceMappingURL=goal-QXSEQGAT.js.map
|
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
getHostedSiteFiles,
|
|
8
8
|
hostedArtifactKindSchema,
|
|
9
9
|
prepareHostedSite
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-TZDXFY6G.js";
|
|
11
|
+
import "./chunk-JXUQQIUP.js";
|
|
12
12
|
import "./chunk-MA22KQYU.js";
|
|
13
13
|
import {
|
|
14
14
|
source_default,
|
|
15
15
|
withErrorHandler
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-D7TEG7WN.js";
|
|
17
|
+
import "./chunk-MD3YWUKO.js";
|
|
18
18
|
import {
|
|
19
19
|
Command,
|
|
20
20
|
InvalidArgumentError
|
|
@@ -657,4 +657,4 @@ Notes:
|
|
|
657
657
|
export {
|
|
658
658
|
zeroHostCommand
|
|
659
659
|
};
|
|
660
|
-
//# sourceMappingURL=host-
|
|
660
|
+
//# sourceMappingURL=host-4TKBODTL.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
isSupportedFramework,
|
|
8
8
|
parseTime,
|
|
9
9
|
searchCommand
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-EINTZ5MX.js";
|
|
11
11
|
import {
|
|
12
12
|
collectLogItems,
|
|
13
13
|
formatIsoTimestamp,
|
|
@@ -16,19 +16,19 @@ import {
|
|
|
16
16
|
parsePositiveLogCount
|
|
17
17
|
} from "./chunk-FKYDKKID.js";
|
|
18
18
|
import "./chunk-LN2ATWKS.js";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-TM6A5MNI.js";
|
|
20
20
|
import {
|
|
21
21
|
getZeroRunAgentEvents,
|
|
22
22
|
listZeroLogs
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-TZDXFY6G.js";
|
|
24
|
+
import "./chunk-JXUQQIUP.js";
|
|
25
25
|
import "./chunk-MA22KQYU.js";
|
|
26
26
|
import {
|
|
27
27
|
source_default,
|
|
28
28
|
withErrorHandler
|
|
29
|
-
} from "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-
|
|
29
|
+
} from "./chunk-D7TEG7WN.js";
|
|
30
|
+
import "./chunk-X7YXT2UE.js";
|
|
31
|
+
import "./chunk-MD3YWUKO.js";
|
|
32
32
|
import {
|
|
33
33
|
Command
|
|
34
34
|
} from "./chunk-CCWPKGTB.js";
|
|
@@ -273,4 +273,4 @@ Examples:
|
|
|
273
273
|
export {
|
|
274
274
|
zeroLogsCommand
|
|
275
275
|
};
|
|
276
|
-
//# sourceMappingURL=logs-
|
|
276
|
+
//# sourceMappingURL=logs-WBT4C34D.js.map
|
|
@@ -7,21 +7,21 @@ import {
|
|
|
7
7
|
findConnectorStatusItem,
|
|
8
8
|
printCallbackTurnInstruction,
|
|
9
9
|
resolveAgentContext
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-RFTCX5UZ.js";
|
|
11
11
|
import {
|
|
12
12
|
linkZeroMailDraft,
|
|
13
13
|
listZeroConnectorCatalogStatus
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-TZDXFY6G.js";
|
|
15
|
+
import "./chunk-JXUQQIUP.js";
|
|
16
16
|
import {
|
|
17
17
|
getPlatformOrigin
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-CCUKVMAH.js";
|
|
19
19
|
import "./chunk-MA22KQYU.js";
|
|
20
20
|
import {
|
|
21
21
|
source_default,
|
|
22
22
|
withErrorHandler
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-D7TEG7WN.js";
|
|
24
|
+
import "./chunk-MD3YWUKO.js";
|
|
25
25
|
import {
|
|
26
26
|
Command,
|
|
27
27
|
Option
|
|
@@ -234,4 +234,4 @@ var zeroMailCommand = new Command().name("mail").description("Review linked Gmai
|
|
|
234
234
|
export {
|
|
235
235
|
zeroMailCommand
|
|
236
236
|
};
|
|
237
|
-
//# sourceMappingURL=mail-
|
|
237
|
+
//# sourceMappingURL=mail-GVDB4DW2.js.map
|
|
@@ -3,14 +3,14 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
callZeroMaps
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-TZDXFY6G.js";
|
|
7
|
+
import "./chunk-JXUQQIUP.js";
|
|
8
8
|
import "./chunk-MA22KQYU.js";
|
|
9
9
|
import {
|
|
10
10
|
source_default,
|
|
11
11
|
withErrorHandler
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-D7TEG7WN.js";
|
|
13
|
+
import "./chunk-MD3YWUKO.js";
|
|
14
14
|
import {
|
|
15
15
|
Command,
|
|
16
16
|
InvalidArgumentError
|
|
@@ -483,4 +483,4 @@ Notes:
|
|
|
483
483
|
export {
|
|
484
484
|
zeroMapsCommand
|
|
485
485
|
};
|
|
486
|
-
//# sourceMappingURL=maps-
|
|
486
|
+
//# sourceMappingURL=maps-7PWULA7U.js.map
|
|
@@ -5,18 +5,18 @@ import {
|
|
|
5
5
|
formatModelPolicyStatus,
|
|
6
6
|
formatModelProviderRoute,
|
|
7
7
|
getModelProviderRouteKind
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-TC7IZRA2.js";
|
|
9
9
|
import {
|
|
10
10
|
listZeroModelPolicies
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-TZDXFY6G.js";
|
|
12
|
+
import "./chunk-JXUQQIUP.js";
|
|
13
13
|
import "./chunk-MA22KQYU.js";
|
|
14
14
|
import {
|
|
15
15
|
getVm0ModelPriceTier,
|
|
16
16
|
source_default,
|
|
17
17
|
withErrorHandler
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
18
|
+
} from "./chunk-D7TEG7WN.js";
|
|
19
|
+
import "./chunk-MD3YWUKO.js";
|
|
20
20
|
import {
|
|
21
21
|
Command
|
|
22
22
|
} from "./chunk-CCWPKGTB.js";
|
|
@@ -89,4 +89,4 @@ export {
|
|
|
89
89
|
switchCommand,
|
|
90
90
|
zeroModelCommand
|
|
91
91
|
};
|
|
92
|
-
//# sourceMappingURL=model-
|
|
92
|
+
//# sourceMappingURL=model-54YGVJAR.js.map
|
|
@@ -5,17 +5,17 @@ import {
|
|
|
5
5
|
formatModelPolicyStatus,
|
|
6
6
|
getModelProviderRouteKind,
|
|
7
7
|
getModelProviderTypeLabel
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-TC7IZRA2.js";
|
|
9
9
|
import {
|
|
10
10
|
listZeroModelPolicies
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-TZDXFY6G.js";
|
|
12
|
+
import "./chunk-JXUQQIUP.js";
|
|
13
13
|
import "./chunk-MA22KQYU.js";
|
|
14
14
|
import {
|
|
15
15
|
source_default,
|
|
16
16
|
withErrorHandler
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-D7TEG7WN.js";
|
|
18
|
+
import "./chunk-MD3YWUKO.js";
|
|
19
19
|
import {
|
|
20
20
|
Command
|
|
21
21
|
} from "./chunk-CCWPKGTB.js";
|
|
@@ -73,4 +73,4 @@ export {
|
|
|
73
73
|
setCommand,
|
|
74
74
|
zeroModelProviderCommand
|
|
75
75
|
};
|
|
76
|
-
//# sourceMappingURL=model-provider-
|
|
76
|
+
//# sourceMappingURL=model-provider-ZPDGFYK3.js.map
|