@mulmocast/slide 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +458 -0
  2. package/lib/actions/bundle.d.ts +3 -0
  3. package/lib/actions/bundle.d.ts.map +1 -0
  4. package/lib/actions/bundle.js +60 -0
  5. package/lib/actions/bundle.js.map +1 -0
  6. package/lib/actions/common.d.ts +21 -0
  7. package/lib/actions/common.d.ts.map +1 -0
  8. package/lib/actions/common.js +159 -0
  9. package/lib/actions/common.js.map +1 -0
  10. package/lib/actions/movie.d.ts +3 -0
  11. package/lib/actions/movie.d.ts.map +1 -0
  12. package/lib/actions/movie.js +58 -0
  13. package/lib/actions/movie.js.map +1 -0
  14. package/lib/actions/upload.d.ts +6 -0
  15. package/lib/actions/upload.d.ts.map +1 -0
  16. package/lib/actions/upload.js +172 -0
  17. package/lib/actions/upload.js.map +1 -0
  18. package/lib/cli.d.ts +3 -0
  19. package/lib/cli.d.ts.map +1 -0
  20. package/lib/cli.js +301 -0
  21. package/lib/cli.js.map +1 -0
  22. package/lib/convert/marp.d.ts +22 -0
  23. package/lib/convert/marp.d.ts.map +1 -0
  24. package/lib/convert/marp.js +375 -0
  25. package/lib/convert/marp.js.map +1 -0
  26. package/lib/convert/pdf.d.ts +14 -0
  27. package/lib/convert/pdf.d.ts.map +1 -0
  28. package/lib/convert/pdf.js +130 -0
  29. package/lib/convert/pdf.js.map +1 -0
  30. package/lib/convert/pptx.d.ts +13 -0
  31. package/lib/convert/pptx.d.ts.map +1 -0
  32. package/lib/convert/pptx.js +138 -0
  33. package/lib/convert/pptx.js.map +1 -0
  34. package/lib/utils/lang.d.ts +16 -0
  35. package/lib/utils/lang.d.ts.map +1 -0
  36. package/lib/utils/lang.js +37 -0
  37. package/lib/utils/lang.js.map +1 -0
  38. package/lib/utils/llm.d.ts +21 -0
  39. package/lib/utils/llm.d.ts.map +1 -0
  40. package/lib/utils/llm.js +200 -0
  41. package/lib/utils/llm.js.map +1 -0
  42. package/lib/utils/pdf.d.ts +37 -0
  43. package/lib/utils/pdf.d.ts.map +1 -0
  44. package/lib/utils/pdf.js +142 -0
  45. package/lib/utils/pdf.js.map +1 -0
  46. package/package.json +67 -0
  47. package/tools/keynote/extract.scpt +195 -0
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getPackageRoot = getPackageRoot;
37
+ exports.getKeynoteScriptPath = getKeynoteScriptPath;
38
+ exports.detectFileType = detectFileType;
39
+ exports.getBasename = getBasename;
40
+ exports.convertToMulmoScript = convertToMulmoScript;
41
+ exports.initializeContext = initializeContext;
42
+ exports.getMulmoScriptPath = getMulmoScriptPath;
43
+ exports.runAction = runAction;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const child_process_1 = require("child_process");
47
+ const pptx_1 = require("../convert/pptx");
48
+ const marp_1 = require("../convert/marp");
49
+ const pdf_1 = require("../convert/pdf");
50
+ const mulmocast_1 = require("mulmocast");
51
+ // Get package root directory (works for both development and npm installed)
52
+ function getPackageRoot() {
53
+ // __dirname points to lib/actions/ when compiled, so go up 2 levels
54
+ return path.resolve(__dirname, "..", "..");
55
+ }
56
+ // Get path to Keynote AppleScript
57
+ function getKeynoteScriptPath() {
58
+ return path.join(getPackageRoot(), "tools", "keynote", "extract.scpt");
59
+ }
60
+ function detectFileType(filePath) {
61
+ const ext = path.extname(filePath).toLowerCase();
62
+ switch (ext) {
63
+ case ".pptx":
64
+ return "pptx";
65
+ case ".md":
66
+ return "marp";
67
+ case ".key":
68
+ return "keynote";
69
+ case ".pdf":
70
+ return "pdf";
71
+ default:
72
+ throw new Error(`Unsupported file type: ${ext}`);
73
+ }
74
+ }
75
+ function getBasename(filePath) {
76
+ const ext = path.extname(filePath);
77
+ return path.basename(filePath, ext);
78
+ }
79
+ async function convertToMulmoScript(filePath, fileType, options = {}) {
80
+ const absolutePath = path.resolve(filePath);
81
+ const { generateText = false, lang } = options;
82
+ console.log(`Converting ${fileType.toUpperCase()} to MulmoScript...`);
83
+ switch (fileType) {
84
+ case "pptx": {
85
+ const result = await (0, pptx_1.convertPptx)({ inputPath: absolutePath, generateText, lang });
86
+ return result.mulmoScriptPath;
87
+ }
88
+ case "marp": {
89
+ const result = await (0, marp_1.convertMarp)({ inputPath: absolutePath, generateText, lang });
90
+ return result.mulmoScriptPath;
91
+ }
92
+ case "pdf": {
93
+ const result = await (0, pdf_1.convertPdf)({ inputPath: absolutePath, generateText, lang });
94
+ return result.mulmoScriptPath;
95
+ }
96
+ case "keynote": {
97
+ const basename = getBasename(filePath);
98
+ const scriptPath = getKeynoteScriptPath();
99
+ (0, child_process_1.execSync)(`osascript "${scriptPath}" "${absolutePath}"`, {
100
+ stdio: "inherit",
101
+ cwd: process.cwd(),
102
+ });
103
+ return path.join("scripts", basename, "mulmo_script.json");
104
+ }
105
+ }
106
+ }
107
+ async function initializeContext(mulmoScriptPath, outputDir) {
108
+ const absoluteScriptPath = path.resolve(mulmoScriptPath);
109
+ const scriptDir = path.dirname(absoluteScriptPath);
110
+ const scriptFile = path.basename(absoluteScriptPath);
111
+ const absoluteOutputDir = path.resolve(outputDir);
112
+ const files = (0, mulmocast_1.getFileObject)({
113
+ basedir: scriptDir,
114
+ outdir: absoluteOutputDir,
115
+ file: scriptFile,
116
+ });
117
+ const context = await (0, mulmocast_1.initializeContextFromFiles)(files, false, false);
118
+ if (!context) {
119
+ throw new Error("Failed to initialize MulmoStudio context");
120
+ }
121
+ return context;
122
+ }
123
+ function getMulmoScriptPath(basename) {
124
+ return path.join("scripts", basename, "mulmo_script.json");
125
+ }
126
+ async function runAction(commandName, inputFile, actionRunner, options = {}) {
127
+ const { force = false, generateText = false } = options;
128
+ if (!fs.existsSync(inputFile)) {
129
+ console.error(`File not found: ${inputFile}`);
130
+ process.exit(1);
131
+ }
132
+ try {
133
+ const fileType = detectFileType(inputFile);
134
+ const basename = getBasename(inputFile);
135
+ const outputDir = path.join("output", basename);
136
+ if (!fs.existsSync(outputDir)) {
137
+ fs.mkdirSync(outputDir, { recursive: true });
138
+ }
139
+ const mulmoScriptPath = getMulmoScriptPath(basename);
140
+ if (!force && fs.existsSync(mulmoScriptPath)) {
141
+ console.log(`\n✓ Using existing MulmoScript: ${mulmoScriptPath}`);
142
+ }
143
+ else {
144
+ await convertToMulmoScript(inputFile, fileType, { generateText });
145
+ if (!fs.existsSync(mulmoScriptPath)) {
146
+ throw new Error(`MulmoScript not generated: ${mulmoScriptPath}`);
147
+ }
148
+ console.log(`\n✓ MulmoScript generated: ${mulmoScriptPath}`);
149
+ }
150
+ await actionRunner(mulmoScriptPath, outputDir);
151
+ console.log(`\n✓ ${commandName} generation complete!`);
152
+ console.log(` Output directory: ${outputDir}`);
153
+ }
154
+ catch (error) {
155
+ console.error("\n✗ Error:", error instanceof Error ? error.message : String(error));
156
+ process.exit(1);
157
+ }
158
+ }
159
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/actions/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env tsx
2
+ export {};
3
+ //# sourceMappingURL=movie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movie.d.ts","sourceRoot":"","sources":["../../src/actions/movie.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const mulmocast_1 = require("mulmocast");
8
+ const yargs_1 = __importDefault(require("yargs"));
9
+ const helpers_1 = require("yargs/helpers");
10
+ const common_1 = require("./common");
11
+ async function runMulmoMovie(mulmoScriptPath, outputDir) {
12
+ console.log(`\nGenerating movie with mulmo...`);
13
+ console.log(` Input: ${mulmoScriptPath}`);
14
+ console.log(` Output: ${outputDir}`);
15
+ const context = await (0, common_1.initializeContext)(mulmoScriptPath, outputDir);
16
+ console.log(" Generating audio...");
17
+ const audioContext = await (0, mulmocast_1.audio)(context);
18
+ console.log(" Generating images...");
19
+ const imageContext = await (0, mulmocast_1.images)(audioContext);
20
+ console.log(" Creating movie...");
21
+ const result = await (0, mulmocast_1.movie)(imageContext);
22
+ if (!result) {
23
+ throw new Error("Movie generation failed");
24
+ }
25
+ }
26
+ async function main() {
27
+ const argv = await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
28
+ .usage("Usage: $0 <presentation-file> [options]")
29
+ .command("$0 <file>", "Generate movie from presentation", (yargs) => {
30
+ return yargs.positional("file", {
31
+ describe: "Presentation file (.pptx, .md, .key)",
32
+ type: "string",
33
+ demandOption: true,
34
+ });
35
+ })
36
+ .options({
37
+ f: {
38
+ alias: "force",
39
+ type: "boolean",
40
+ description: "Force regenerate MulmoScript",
41
+ default: false,
42
+ },
43
+ g: {
44
+ alias: "generate-text",
45
+ type: "boolean",
46
+ description: "Generate narration text using LLM",
47
+ default: false,
48
+ },
49
+ })
50
+ .help()
51
+ .parse();
52
+ await (0, common_1.runAction)("Movie", argv.file, runMulmoMovie, {
53
+ force: argv.f,
54
+ generateText: argv.g,
55
+ });
56
+ }
57
+ main();
58
+ //# sourceMappingURL=movie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movie.js","sourceRoot":"","sources":["../../src/actions/movie.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAiD;AACjD,kDAA0B;AAC1B,2CAAwC;AACxC,qCAAwD;AAExD,KAAK,UAAU,aAAa,CAAC,eAAuB,EAAE,SAAiB;IACrE,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,YAAY,eAAe,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAiB,EAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IAEpE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,MAAM,IAAA,iBAAK,EAAC,OAAO,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAM,EAAC,YAAY,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAK,EAAC,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,MAAM,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC5C,KAAK,CAAC,yCAAyC,CAAC;SAChD,OAAO,CAAC,WAAW,EAAE,kCAAkC,EAAE,CAAC,KAAK,EAAE,EAAE;QAClE,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE;YAC9B,QAAQ,EAAE,sCAAsC;YAChD,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC,CAAC;SACD,OAAO,CAAC;QACP,CAAC,EAAE;YACD,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,8BAA8B;YAC3C,OAAO,EAAE,KAAK;SACf;QACD,CAAC,EAAE;YACD,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,mCAAmC;YAChD,OAAO,EAAE,KAAK;SACf;KACF,CAAC;SACD,IAAI,EAAE;SACN,KAAK,EAAE,CAAC;IAEX,MAAM,IAAA,kBAAS,EAAC,OAAO,EAAE,IAAI,CAAC,IAAc,EAAE,aAAa,EAAE;QAC3D,KAAK,EAAE,IAAI,CAAC,CAAC;QACb,YAAY,EAAE,IAAI,CAAC,CAAC;KACrB,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env tsx
2
+ export declare function uploadBundleDir(bundleDir: string, apiKey: string): Promise<{
3
+ success: boolean;
4
+ uploadPath?: string;
5
+ }>;
6
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/actions/upload.ts"],"names":[],"mappings":";AAyDA,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6DpD"}
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.uploadBundleDir = uploadBundleDir;
41
+ const dotenv_1 = __importDefault(require("dotenv"));
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ dotenv_1.default.config({ quiet: true });
45
+ const API_BASE_URL = "https://mulmocast-app-dev.web.app/api/1.0";
46
+ async function uploadFileToR2(sign, mediaDir) {
47
+ const filePath = path.join(mediaDir, sign.fileName);
48
+ if (!fs.existsSync(filePath)) {
49
+ console.error(` Failed to upload: ${sign.fileName} not found`);
50
+ return false;
51
+ }
52
+ const fileBuffer = fs.readFileSync(filePath);
53
+ try {
54
+ const response = await fetch(sign.url, {
55
+ method: "PUT",
56
+ headers: {
57
+ "Content-Type": sign.contentType,
58
+ },
59
+ body: new Uint8Array(fileBuffer),
60
+ });
61
+ if (!response.ok) {
62
+ console.error(` Failed to upload ${sign.fileName}: ${response.status} ${response.statusText}`);
63
+ return false;
64
+ }
65
+ console.log(` Uploaded: ${sign.fileName}`);
66
+ return true;
67
+ }
68
+ catch (error) {
69
+ console.error(` Error uploading ${sign.fileName}:`, error);
70
+ return false;
71
+ }
72
+ }
73
+ async function uploadBundleDir(bundleDir, apiKey) {
74
+ const jsonFilePath = path.join(bundleDir, "mulmo_view.json");
75
+ if (!fs.existsSync(jsonFilePath)) {
76
+ throw new Error(`mulmo_view.json not found in ${bundleDir}`);
77
+ }
78
+ const fileContent = fs.readFileSync(jsonFilePath, "utf-8");
79
+ const viewer = JSON.parse(fileContent);
80
+ console.log(" Requesting upload URLs...");
81
+ const response = await fetch(`${API_BASE_URL}/me/uploads`, {
82
+ method: "POST",
83
+ headers: {
84
+ "Content-Type": "application/json",
85
+ Authorization: `Bearer ${apiKey}`,
86
+ },
87
+ body: JSON.stringify({ viewer }),
88
+ });
89
+ if (!response.ok) {
90
+ const errorText = await response.text();
91
+ throw new Error(`Server error: ${response.status} ${errorText}`);
92
+ }
93
+ const data = (await response.json());
94
+ if (data.signs && data.signs.length > 0) {
95
+ console.log(` Uploading ${data.signs.length} files...`);
96
+ const results = await Promise.all(data.signs.map((sign) => uploadFileToR2(sign, bundleDir)));
97
+ const failCount = results.filter((success) => !success).length;
98
+ if (failCount > 0) {
99
+ throw new Error(`Failed to upload ${failCount} out of ${data.signs.length} files`);
100
+ }
101
+ }
102
+ const contentId = data.uploadPath.split("/").pop();
103
+ if (!contentId) {
104
+ throw new Error("Failed to extract contentId from uploadPath");
105
+ }
106
+ console.log(" Completing upload...");
107
+ const completeResponse = await fetch(`${API_BASE_URL}/me/uploads/${contentId}/complete`, {
108
+ method: "POST",
109
+ headers: {
110
+ "Content-Type": "application/json",
111
+ Authorization: `Bearer ${apiKey}`,
112
+ },
113
+ body: JSON.stringify({ contentId }),
114
+ });
115
+ if (!completeResponse.ok) {
116
+ const errorText = await completeResponse.text();
117
+ throw new Error(`Failed to complete upload: ${completeResponse.status} ${errorText}`);
118
+ }
119
+ return {
120
+ success: true,
121
+ uploadPath: data.uploadPath,
122
+ };
123
+ }
124
+ function findBundleDir(basename) {
125
+ const outputDir = path.join("output", basename);
126
+ if (!fs.existsSync(outputDir)) {
127
+ throw new Error(`Output directory not found: ${outputDir}`);
128
+ }
129
+ // Search for subdirectory containing mulmo_view.json
130
+ const entries = fs.readdirSync(outputDir, { withFileTypes: true });
131
+ for (const entry of entries) {
132
+ if (entry.isDirectory()) {
133
+ const candidatePath = path.join(outputDir, entry.name);
134
+ if (fs.existsSync(path.join(candidatePath, "mulmo_view.json"))) {
135
+ return candidatePath;
136
+ }
137
+ }
138
+ }
139
+ throw new Error(`mulmo_view.json not found in ${outputDir}`);
140
+ }
141
+ async function main() {
142
+ const args = process.argv.slice(2);
143
+ if (args.length === 0) {
144
+ console.error("Usage: yarn upload <basename>");
145
+ console.error("");
146
+ console.error("Upload a bundle to MulmoCast server.");
147
+ console.error("The bundle is expected at output/<basename>/<script>/");
148
+ console.error("");
149
+ console.error("Environment variable required:");
150
+ console.error(" MULMO_MEDIA_API_KEY - API key for authentication");
151
+ process.exit(1);
152
+ }
153
+ const apiKey = process.env.MULMO_MEDIA_API_KEY;
154
+ if (!apiKey) {
155
+ console.error("Error: MULMO_MEDIA_API_KEY environment variable is not set");
156
+ process.exit(1);
157
+ }
158
+ try {
159
+ const bundleDir = findBundleDir(args[0]);
160
+ console.log(`\nUploading bundle...`);
161
+ console.log(` Directory: ${bundleDir}`);
162
+ const result = await uploadBundleDir(bundleDir, apiKey);
163
+ console.log(`\n✓ Upload complete!`);
164
+ console.log(` Upload path: ${result.uploadPath}`);
165
+ }
166
+ catch (error) {
167
+ console.error("\n✗ Error:", error instanceof Error ? error.message : String(error));
168
+ process.exit(1);
169
+ }
170
+ }
171
+ main();
172
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/actions/upload.ts"],"names":[],"mappings":"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"}
package/lib/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}