beecork 1.0.0 → 1.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 (112) hide show
  1. package/dist/channels/discord.d.ts.map +1 -1
  2. package/dist/channels/discord.js +118 -6
  3. package/dist/channels/discord.js.map +1 -1
  4. package/dist/channels/telegram.d.ts.map +1 -1
  5. package/dist/channels/telegram.js +122 -8
  6. package/dist/channels/telegram.js.map +1 -1
  7. package/dist/channels/whatsapp.d.ts.map +1 -1
  8. package/dist/channels/whatsapp.js +115 -2
  9. package/dist/channels/whatsapp.js.map +1 -1
  10. package/dist/cli/media.d.ts +3 -0
  11. package/dist/cli/media.d.ts.map +1 -0
  12. package/dist/cli/media.js +113 -0
  13. package/dist/cli/media.js.map +1 -0
  14. package/dist/cli/setup.d.ts.map +1 -1
  15. package/dist/cli/setup.js +213 -20
  16. package/dist/cli/setup.js.map +1 -1
  17. package/dist/daemon.js +21 -0
  18. package/dist/daemon.js.map +1 -1
  19. package/dist/dashboard/server.d.ts.map +1 -1
  20. package/dist/dashboard/server.js +24 -0
  21. package/dist/dashboard/server.js.map +1 -1
  22. package/dist/db/migrations.d.ts.map +1 -1
  23. package/dist/db/migrations.js +30 -0
  24. package/dist/db/migrations.js.map +1 -1
  25. package/dist/index.js +121 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/mcp/server.js +153 -0
  28. package/dist/mcp/server.js.map +1 -1
  29. package/dist/media/factory.d.ts +7 -0
  30. package/dist/media/factory.d.ts.map +1 -0
  31. package/dist/media/factory.js +33 -0
  32. package/dist/media/factory.js.map +1 -0
  33. package/dist/media/generators/dall-e.d.ts +11 -0
  34. package/dist/media/generators/dall-e.d.ts.map +1 -0
  35. package/dist/media/generators/dall-e.js +42 -0
  36. package/dist/media/generators/dall-e.js.map +1 -0
  37. package/dist/media/generators/elevenlabs-music.d.ts +10 -0
  38. package/dist/media/generators/elevenlabs-music.d.ts.map +1 -0
  39. package/dist/media/generators/elevenlabs-music.js +35 -0
  40. package/dist/media/generators/elevenlabs-music.js.map +1 -0
  41. package/dist/media/generators/elevenlabs-sfx.d.ts +10 -0
  42. package/dist/media/generators/elevenlabs-sfx.d.ts.map +1 -0
  43. package/dist/media/generators/elevenlabs-sfx.js +34 -0
  44. package/dist/media/generators/elevenlabs-sfx.js.map +1 -0
  45. package/dist/media/generators/kling.d.ts +10 -0
  46. package/dist/media/generators/kling.d.ts.map +1 -0
  47. package/dist/media/generators/kling.js +53 -0
  48. package/dist/media/generators/kling.js.map +1 -0
  49. package/dist/media/generators/lyria.d.ts +11 -0
  50. package/dist/media/generators/lyria.d.ts.map +1 -0
  51. package/dist/media/generators/lyria.js +42 -0
  52. package/dist/media/generators/lyria.js.map +1 -0
  53. package/dist/media/generators/nano-banana.d.ts +11 -0
  54. package/dist/media/generators/nano-banana.d.ts.map +1 -0
  55. package/dist/media/generators/nano-banana.js +46 -0
  56. package/dist/media/generators/nano-banana.js.map +1 -0
  57. package/dist/media/generators/recraft.d.ts +10 -0
  58. package/dist/media/generators/recraft.d.ts.map +1 -0
  59. package/dist/media/generators/recraft.js +53 -0
  60. package/dist/media/generators/recraft.js.map +1 -0
  61. package/dist/media/generators/runway.d.ts +10 -0
  62. package/dist/media/generators/runway.d.ts.map +1 -0
  63. package/dist/media/generators/runway.js +58 -0
  64. package/dist/media/generators/runway.js.map +1 -0
  65. package/dist/media/generators/stable-diffusion.d.ts +10 -0
  66. package/dist/media/generators/stable-diffusion.d.ts.map +1 -0
  67. package/dist/media/generators/stable-diffusion.js +36 -0
  68. package/dist/media/generators/stable-diffusion.js.map +1 -0
  69. package/dist/media/generators/veo.d.ts +10 -0
  70. package/dist/media/generators/veo.d.ts.map +1 -0
  71. package/dist/media/generators/veo.js +33 -0
  72. package/dist/media/generators/veo.js.map +1 -0
  73. package/dist/media/index.d.ts +13 -0
  74. package/dist/media/index.d.ts.map +1 -0
  75. package/dist/media/index.js +10 -0
  76. package/dist/media/index.js.map +1 -0
  77. package/dist/media/loader.d.ts +8 -0
  78. package/dist/media/loader.d.ts.map +1 -0
  79. package/dist/media/loader.js +46 -0
  80. package/dist/media/loader.js.map +1 -0
  81. package/dist/media/types.d.ts +22 -0
  82. package/dist/media/types.d.ts.map +1 -0
  83. package/dist/media/types.js +2 -0
  84. package/dist/media/types.js.map +1 -0
  85. package/dist/projects/index.d.ts +4 -0
  86. package/dist/projects/index.d.ts.map +1 -0
  87. package/dist/projects/index.js +3 -0
  88. package/dist/projects/index.js.map +1 -0
  89. package/dist/projects/manager.d.ts +20 -0
  90. package/dist/projects/manager.d.ts.map +1 -0
  91. package/dist/projects/manager.js +135 -0
  92. package/dist/projects/manager.js.map +1 -0
  93. package/dist/projects/router.d.ts +6 -0
  94. package/dist/projects/router.d.ts.map +1 -0
  95. package/dist/projects/router.js +177 -0
  96. package/dist/projects/router.js.map +1 -0
  97. package/dist/projects/types.d.ts +26 -0
  98. package/dist/projects/types.d.ts.map +1 -0
  99. package/dist/projects/types.js +2 -0
  100. package/dist/projects/types.js.map +1 -0
  101. package/dist/session/manager.d.ts +3 -1
  102. package/dist/session/manager.d.ts.map +1 -1
  103. package/dist/session/manager.js +6 -5
  104. package/dist/session/manager.js.map +1 -1
  105. package/dist/types.d.ts +7 -0
  106. package/dist/types.d.ts.map +1 -1
  107. package/dist/types.js.map +1 -1
  108. package/dist/util/progress.d.ts +35 -0
  109. package/dist/util/progress.d.ts.map +1 -0
  110. package/dist/util/progress.js +134 -0
  111. package/dist/util/progress.js.map +1 -0
  112. package/package.json +1 -1
@@ -0,0 +1,42 @@
1
+ import { saveMedia } from '../store.js';
2
+ export class LyriaGenerator {
3
+ apiKey;
4
+ model;
5
+ id = 'lyria';
6
+ name = 'Google Lyria';
7
+ supportedTypes = ['music'];
8
+ constructor(apiKey, model = 'lyria-3-clip') {
9
+ this.apiKey = apiKey;
10
+ this.model = model;
11
+ }
12
+ async generate(type, prompt, options) {
13
+ if (type !== 'music')
14
+ throw new Error('Lyria only supports music generation');
15
+ const useProModel = (options?.duration && options.duration > 30) || this.model.includes('pro');
16
+ const modelId = useProModel ? 'lyria-3-pro' : 'lyria-3-clip';
17
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${modelId}:generateContent?key=${this.apiKey}`, {
18
+ method: 'POST',
19
+ headers: { 'Content-Type': 'application/json' },
20
+ body: JSON.stringify({
21
+ contents: [{ parts: [{ text: prompt.slice(0, 2000) }] }],
22
+ generationConfig: {
23
+ responseModalities: ['AUDIO'],
24
+ },
25
+ }),
26
+ signal: AbortSignal.timeout(300000), // 5 min for full songs
27
+ });
28
+ if (!response.ok) {
29
+ const err = await response.text();
30
+ throw new Error(`Lyria error ${response.status}: ${err.slice(0, 200)}`);
31
+ }
32
+ const data = await response.json();
33
+ const audioPart = data.candidates?.[0]?.content?.parts?.find((p) => p.inlineData);
34
+ if (!audioPart?.inlineData?.data) {
35
+ throw new Error('Lyria returned no audio data');
36
+ }
37
+ const buffer = Buffer.from(audioPart.inlineData.data, 'base64');
38
+ const filePath = saveMedia(buffer, 'mp3', 'generated-music.mp3');
39
+ return { filePath, mimeType: 'audio/mpeg' };
40
+ }
41
+ }
42
+ //# sourceMappingURL=lyria.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lyria.js","sourceRoot":"","sources":["../../../src/media/generators/lyria.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,OAAO,cAAc;IAKL;IAAwB;IAJnC,EAAE,GAAG,OAAO,CAAC;IACb,IAAI,GAAG,cAAc,CAAC;IACtB,cAAc,GAAgB,CAAC,OAAO,CAAC,CAAC;IAEjD,YAAoB,MAAc,EAAU,QAAgB,cAAc;QAAtD,WAAM,GAAN,MAAM,CAAQ;QAAU,UAAK,GAAL,KAAK,CAAyB;IAAG,CAAC;IAE9E,KAAK,CAAC,QAAQ,CAAC,IAAe,EAAE,MAAc,EAAE,OAAyB;QACvE,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAE9E,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/F,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,2DAA2D,OAAO,wBAAwB,IAAI,CAAC,MAAM,EAAE,EACvG;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxD,gBAAgB,EAAE;oBAChB,kBAAkB,EAAE,CAAC,OAAO,CAAC;iBAC9B;aACF,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,uBAAuB;SAC7D,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAS,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACvF,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;QACjE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { MediaGenerator, MediaType, GenerateOptions, GenerateResult } from '../types.js';
2
+ export declare class NanoBananaGenerator implements MediaGenerator {
3
+ private apiKey;
4
+ private model;
5
+ readonly id = "nano-banana";
6
+ readonly name = "Google Nano Banana";
7
+ readonly supportedTypes: MediaType[];
8
+ constructor(apiKey: string, model?: string);
9
+ generate(type: MediaType, prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
10
+ }
11
+ //# sourceMappingURL=nano-banana.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nano-banana.d.ts","sourceRoot":"","sources":["../../../src/media/generators/nano-banana.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9F,qBAAa,mBAAoB,YAAW,cAAc;IAK5C,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,KAAK;IAJjD,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,CAAa;gBAE7B,MAAM,EAAE,MAAM,EAAU,KAAK,GAAE,MAAiC;IAE9E,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAsCpG"}
@@ -0,0 +1,46 @@
1
+ import { saveMedia } from '../store.js';
2
+ export class NanoBananaGenerator {
3
+ apiKey;
4
+ model;
5
+ id = 'nano-banana';
6
+ name = 'Google Nano Banana';
7
+ supportedTypes = ['image'];
8
+ constructor(apiKey, model = 'gemini-2.5-flash-image') {
9
+ this.apiKey = apiKey;
10
+ this.model = model;
11
+ }
12
+ async generate(type, prompt, options) {
13
+ if (type !== 'image')
14
+ throw new Error('Nano Banana only supports image generation');
15
+ // Gemini image generation API
16
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${this.model}:generateContent?key=${this.apiKey}`, {
17
+ method: 'POST',
18
+ headers: { 'Content-Type': 'application/json' },
19
+ body: JSON.stringify({
20
+ contents: [{ parts: [{ text: prompt.slice(0, 2000) }] }],
21
+ generationConfig: {
22
+ responseModalities: ['IMAGE'],
23
+ imageGenerationConfig: {
24
+ numberOfImages: 1,
25
+ },
26
+ },
27
+ }),
28
+ signal: AbortSignal.timeout(120000),
29
+ });
30
+ if (!response.ok) {
31
+ const err = await response.text();
32
+ throw new Error(`Nano Banana error ${response.status}: ${err.slice(0, 200)}`);
33
+ }
34
+ const data = await response.json();
35
+ const imagePart = data.candidates?.[0]?.content?.parts?.find((p) => p.inlineData);
36
+ if (!imagePart?.inlineData?.data) {
37
+ throw new Error('Nano Banana returned no image data');
38
+ }
39
+ const buffer = Buffer.from(imagePart.inlineData.data, 'base64');
40
+ const mimeType = imagePart.inlineData.mimeType || 'image/png';
41
+ const ext = mimeType.includes('jpeg') ? 'jpg' : 'png';
42
+ const filePath = saveMedia(buffer, ext, `generated-image.${ext}`);
43
+ return { filePath, mimeType };
44
+ }
45
+ }
46
+ //# sourceMappingURL=nano-banana.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nano-banana.js","sourceRoot":"","sources":["../../../src/media/generators/nano-banana.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,OAAO,mBAAmB;IAKV;IAAwB;IAJnC,EAAE,GAAG,aAAa,CAAC;IACnB,IAAI,GAAG,oBAAoB,CAAC;IAC5B,cAAc,GAAgB,CAAC,OAAO,CAAC,CAAC;IAEjD,YAAoB,MAAc,EAAU,QAAgB,wBAAwB;QAAhE,WAAM,GAAN,MAAM,CAAQ;QAAU,UAAK,GAAL,KAAK,CAAmC;IAAG,CAAC;IAExF,KAAK,CAAC,QAAQ,CAAC,IAAe,EAAE,MAAc,EAAE,OAAyB;QACvE,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAEpF,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,2DAA2D,IAAI,CAAC,KAAK,wBAAwB,IAAI,CAAC,MAAM,EAAE,EAC1G;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxD,gBAAgB,EAAE;oBAChB,kBAAkB,EAAE,CAAC,OAAO,CAAC;oBAC7B,qBAAqB,EAAE;wBACrB,cAAc,EAAE,CAAC;qBAClB;iBACF;aACF,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAS,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACvF,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,IAAI,WAAW,CAAC;QAC9D,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAClE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { MediaGenerator, MediaType, GenerateOptions, GenerateResult } from '../types.js';
2
+ export declare class RecraftGenerator implements MediaGenerator {
3
+ private apiKey;
4
+ readonly id = "recraft";
5
+ readonly name = "Recraft (Images + Vectors)";
6
+ readonly supportedTypes: MediaType[];
7
+ constructor(apiKey: string);
8
+ generate(type: MediaType, prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
9
+ }
10
+ //# sourceMappingURL=recraft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recraft.d.ts","sourceRoot":"","sources":["../../../src/media/generators/recraft.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9F,qBAAa,gBAAiB,YAAW,cAAc;IAKzC,OAAO,CAAC,MAAM;IAJ1B,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,gCAAgC;IAC7C,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,CAAa;gBAE7B,MAAM,EAAE,MAAM;IAE5B,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CA8CpG"}
@@ -0,0 +1,53 @@
1
+ import { saveMedia } from '../store.js';
2
+ export class RecraftGenerator {
3
+ apiKey;
4
+ id = 'recraft';
5
+ name = 'Recraft (Images + Vectors)';
6
+ supportedTypes = ['image']; // SVG vectors are still "images"
7
+ constructor(apiKey) {
8
+ this.apiKey = apiKey;
9
+ }
10
+ async generate(type, prompt, options) {
11
+ if (type !== 'image')
12
+ throw new Error('Recraft only supports image/vector generation');
13
+ const isVector = options?.format === 'svg' || options?.style === 'vector';
14
+ const endpoint = isVector
15
+ ? 'https://external.api.recraft.ai/v1/images/generations'
16
+ : 'https://external.api.recraft.ai/v1/images/generations';
17
+ const response = await fetch(endpoint, {
18
+ method: 'POST',
19
+ headers: {
20
+ 'Authorization': `Bearer ${this.apiKey}`,
21
+ 'Content-Type': 'application/json',
22
+ },
23
+ body: JSON.stringify({
24
+ prompt: prompt.slice(0, 2000),
25
+ model: isVector ? 'recraftv4' : 'recraftv4',
26
+ response_format: isVector ? 'url' : 'b64_json',
27
+ style: isVector ? 'vector_illustration' : (options?.style || 'realistic_image'),
28
+ size: options?.width && options?.height ? `${options.width}x${options.height}` : '1024x1024',
29
+ }),
30
+ signal: AbortSignal.timeout(120000),
31
+ });
32
+ if (!response.ok) {
33
+ const err = await response.text();
34
+ throw new Error(`Recraft error ${response.status}: ${err.slice(0, 200)}`);
35
+ }
36
+ const data = await response.json();
37
+ const image = data.data?.[0];
38
+ if (isVector && image?.url) {
39
+ // Download SVG from URL
40
+ const svgResp = await fetch(image.url, { signal: AbortSignal.timeout(30000) });
41
+ const svgBuffer = Buffer.from(await svgResp.arrayBuffer());
42
+ const filePath = saveMedia(svgBuffer, 'svg', 'generated-vector.svg');
43
+ return { filePath, mimeType: 'image/svg+xml' };
44
+ }
45
+ else if (image?.b64_json) {
46
+ const buffer = Buffer.from(image.b64_json, 'base64');
47
+ const filePath = saveMedia(buffer, 'png', 'generated-image.png');
48
+ return { filePath, mimeType: 'image/png' };
49
+ }
50
+ throw new Error('Recraft returned no image data');
51
+ }
52
+ }
53
+ //# sourceMappingURL=recraft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recraft.js","sourceRoot":"","sources":["../../../src/media/generators/recraft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,OAAO,gBAAgB;IAKP;IAJX,EAAE,GAAG,SAAS,CAAC;IACf,IAAI,GAAG,4BAA4B,CAAC;IACpC,cAAc,GAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;IAEnF,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAEtC,KAAK,CAAC,QAAQ,CAAC,IAAe,EAAE,MAAc,EAAE,OAAyB;QACvE,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAEvF,MAAM,QAAQ,GAAG,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,OAAO,EAAE,KAAK,KAAK,QAAQ,CAAC;QAC1E,MAAM,QAAQ,GAAG,QAAQ;YACvB,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,uDAAuD,CAAC;QAE5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACxC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBAC7B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;gBAC3C,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;gBAC9C,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,iBAAiB,CAAC;gBAC/E,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,WAAW;aAC7F,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAS,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,QAAQ,IAAI,KAAK,EAAE,GAAG,EAAE,CAAC;YAC3B,wBAAwB;YACxB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC;YACrE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;QACjD,CAAC;aAAM,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;YACjE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { MediaGenerator, MediaType, GenerateOptions, GenerateResult } from '../types.js';
2
+ export declare class RunwayGenerator implements MediaGenerator {
3
+ private apiKey;
4
+ readonly id = "runway";
5
+ readonly name = "Runway Gen-3";
6
+ readonly supportedTypes: MediaType[];
7
+ constructor(apiKey: string);
8
+ generate(type: MediaType, prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
9
+ }
10
+ //# sourceMappingURL=runway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runway.d.ts","sourceRoot":"","sources":["../../../src/media/generators/runway.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9F,qBAAa,eAAgB,YAAW,cAAc;IAKxC,OAAO,CAAC,MAAM;IAJ1B,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,CAAa;gBAE7B,MAAM,EAAE,MAAM;IAE5B,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAsDpG"}
@@ -0,0 +1,58 @@
1
+ import { saveMedia } from '../store.js';
2
+ import { logger } from '../../util/logger.js';
3
+ export class RunwayGenerator {
4
+ apiKey;
5
+ id = 'runway';
6
+ name = 'Runway Gen-3';
7
+ supportedTypes = ['video'];
8
+ constructor(apiKey) {
9
+ this.apiKey = apiKey;
10
+ }
11
+ async generate(type, prompt, options) {
12
+ if (type !== 'video')
13
+ throw new Error('Runway only supports video generation');
14
+ // Start generation
15
+ const startResponse = await fetch('https://api.runwayml.com/v1/image_to_video', {
16
+ method: 'POST',
17
+ headers: {
18
+ 'Authorization': `Bearer ${this.apiKey}`,
19
+ 'Content-Type': 'application/json',
20
+ 'X-Runway-Version': '2024-11-06',
21
+ },
22
+ body: JSON.stringify({
23
+ model: 'gen3a_turbo',
24
+ promptText: prompt.slice(0, 2000),
25
+ duration: options?.duration || 5,
26
+ }),
27
+ signal: AbortSignal.timeout(30000),
28
+ });
29
+ if (!startResponse.ok) {
30
+ const err = await startResponse.text();
31
+ throw new Error(`Runway error ${startResponse.status}: ${err.slice(0, 200)}`);
32
+ }
33
+ const { id: taskId } = await startResponse.json();
34
+ // Poll for completion (max 5 minutes)
35
+ for (let i = 0; i < 60; i++) {
36
+ await new Promise(r => setTimeout(r, 5000));
37
+ const statusResponse = await fetch(`https://api.runwayml.com/v1/tasks/${taskId}`, {
38
+ headers: { 'Authorization': `Bearer ${this.apiKey}`, 'X-Runway-Version': '2024-11-06' },
39
+ signal: AbortSignal.timeout(10000),
40
+ });
41
+ if (!statusResponse.ok)
42
+ continue;
43
+ const status = await statusResponse.json();
44
+ if (status.status === 'SUCCEEDED' && status.output?.[0]) {
45
+ const videoResponse = await fetch(status.output[0], { signal: AbortSignal.timeout(60000) });
46
+ const buffer = Buffer.from(await videoResponse.arrayBuffer());
47
+ const filePath = saveMedia(buffer, 'mp4', 'generated-video.mp4');
48
+ return { filePath, mimeType: 'video/mp4', durationMs: (options?.duration || 5) * 1000 };
49
+ }
50
+ if (status.status === 'FAILED') {
51
+ throw new Error('Runway video generation failed');
52
+ }
53
+ logger.debug(`Runway task ${taskId}: ${status.status}`);
54
+ }
55
+ throw new Error('Runway video generation timed out (5 minutes)');
56
+ }
57
+ }
58
+ //# sourceMappingURL=runway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runway.js","sourceRoot":"","sources":["../../../src/media/generators/runway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { MediaGenerator, MediaType, GenerateOptions, GenerateResult } from '../types.js';
2
+ export declare class StableDiffusionGenerator implements MediaGenerator {
3
+ private apiKey;
4
+ readonly id = "stable-diffusion";
5
+ readonly name = "Stable Diffusion (Stability AI)";
6
+ readonly supportedTypes: MediaType[];
7
+ constructor(apiKey: string);
8
+ generate(type: MediaType, prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
9
+ }
10
+ //# sourceMappingURL=stable-diffusion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-diffusion.d.ts","sourceRoot":"","sources":["../../../src/media/generators/stable-diffusion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9F,qBAAa,wBAAyB,YAAW,cAAc;IAKjD,OAAO,CAAC,MAAM;IAJ1B,QAAQ,CAAC,EAAE,sBAAsB;IACjC,QAAQ,CAAC,IAAI,qCAAqC;IAClD,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,CAAa;gBAE7B,MAAM,EAAE,MAAM;IAE5B,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CA2BpG"}
@@ -0,0 +1,36 @@
1
+ import { saveMedia } from '../store.js';
2
+ export class StableDiffusionGenerator {
3
+ apiKey;
4
+ id = 'stable-diffusion';
5
+ name = 'Stable Diffusion (Stability AI)';
6
+ supportedTypes = ['image'];
7
+ constructor(apiKey) {
8
+ this.apiKey = apiKey;
9
+ }
10
+ async generate(type, prompt, options) {
11
+ if (type !== 'image')
12
+ throw new Error('Stable Diffusion only supports image generation');
13
+ const formData = new FormData();
14
+ formData.append('prompt', prompt.slice(0, 10000));
15
+ if (options?.style)
16
+ formData.append('style_preset', options.style);
17
+ formData.append('output_format', 'png');
18
+ const response = await fetch('https://api.stability.ai/v2beta/stable-image/generate/core', {
19
+ method: 'POST',
20
+ headers: {
21
+ 'Authorization': `Bearer ${this.apiKey}`,
22
+ 'Accept': 'image/*',
23
+ },
24
+ body: formData,
25
+ signal: AbortSignal.timeout(120000),
26
+ });
27
+ if (!response.ok) {
28
+ const err = await response.text();
29
+ throw new Error(`Stability AI error ${response.status}: ${err.slice(0, 200)}`);
30
+ }
31
+ const buffer = Buffer.from(await response.arrayBuffer());
32
+ const filePath = saveMedia(buffer, 'png', 'generated-image.png');
33
+ return { filePath, mimeType: 'image/png' };
34
+ }
35
+ }
36
+ //# sourceMappingURL=stable-diffusion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-diffusion.js","sourceRoot":"","sources":["../../../src/media/generators/stable-diffusion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,OAAO,wBAAwB;IAKf;IAJX,EAAE,GAAG,kBAAkB,CAAC;IACxB,IAAI,GAAG,iCAAiC,CAAC;IACzC,cAAc,GAAgB,CAAC,OAAO,CAAC,CAAC;IAEjD,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAEtC,KAAK,CAAC,QAAQ,CAAC,IAAe,EAAE,MAAc,EAAE,OAAyB;QACvE,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAEzF,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAClD,IAAI,OAAO,EAAE,KAAK;YAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACnE,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,4DAA4D,EAAE;YACzF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACxC,QAAQ,EAAE,SAAS;aACpB;YACD,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;QACjE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAC7C,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { MediaGenerator, MediaType, GenerateOptions, GenerateResult } from '../types.js';
2
+ export declare class VeoGenerator implements MediaGenerator {
3
+ private apiKey;
4
+ readonly id = "veo";
5
+ readonly name = "Google Veo";
6
+ readonly supportedTypes: MediaType[];
7
+ constructor(apiKey: string);
8
+ generate(type: MediaType, prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
9
+ }
10
+ //# sourceMappingURL=veo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"veo.d.ts","sourceRoot":"","sources":["../../../src/media/generators/veo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9F,qBAAa,YAAa,YAAW,cAAc;IAKrC,OAAO,CAAC,MAAM;IAJ1B,QAAQ,CAAC,EAAE,SAAS;IACpB,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,CAAa;gBAE7B,MAAM,EAAE,MAAM;IAE5B,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAwBpG"}
@@ -0,0 +1,33 @@
1
+ import { saveMedia } from '../store.js';
2
+ export class VeoGenerator {
3
+ apiKey;
4
+ id = 'veo';
5
+ name = 'Google Veo';
6
+ supportedTypes = ['video'];
7
+ constructor(apiKey) {
8
+ this.apiKey = apiKey;
9
+ }
10
+ async generate(type, prompt, options) {
11
+ if (type !== 'video')
12
+ throw new Error('Veo only supports video generation');
13
+ // Use Gemini API for Veo access
14
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/veo-2.0-generate-001:predict?key=${this.apiKey}`, {
15
+ method: 'POST',
16
+ headers: { 'Content-Type': 'application/json' },
17
+ body: JSON.stringify({
18
+ instances: [{ prompt: prompt.slice(0, 2000) }],
19
+ parameters: { sampleCount: 1, durationSeconds: options?.duration || 5 },
20
+ }),
21
+ signal: AbortSignal.timeout(300000), // 5 min timeout for video
22
+ });
23
+ if (!response.ok) {
24
+ const err = await response.text();
25
+ throw new Error(`Veo error ${response.status}: ${err.slice(0, 200)}`);
26
+ }
27
+ const data = await response.json();
28
+ const buffer = Buffer.from(data.predictions[0].bytesBase64Encoded, 'base64');
29
+ const filePath = saveMedia(buffer, 'mp4', 'generated-video.mp4');
30
+ return { filePath, mimeType: 'video/mp4', durationMs: (options?.duration || 5) * 1000 };
31
+ }
32
+ }
33
+ //# sourceMappingURL=veo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"veo.js","sourceRoot":"","sources":["../../../src/media/generators/veo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,MAAM,OAAO,YAAY;IAKH;IAJX,EAAE,GAAG,KAAK,CAAC;IACX,IAAI,GAAG,YAAY,CAAC;IACpB,cAAc,GAAgB,CAAC,OAAO,CAAC,CAAC;IAEjD,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAEtC,KAAK,CAAC,QAAQ,CAAC,IAAe,EAAE,MAAc,EAAE,OAAyB;QACvE,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAE5E,gCAAgC;QAChC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,4FAA4F,IAAI,CAAC,MAAM,EAAE,EAAE;YACtI,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC9C,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,EAAE;aACxE,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,0BAA0B;SAChE,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4D,CAAC;QAC7F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;QACjE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;IAC1F,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export type { MediaGenerator, MediaType, GenerateOptions, GenerateResult } from './types.js';
2
+ export { createMediaGenerator } from './factory.js';
3
+ export { loadCommunityGenerators } from './loader.js';
4
+ export { saveMedia, cleanupMedia, ensureMediaDir, getMediaDir, isOversized } from './store.js';
5
+ import type { MediaGenerator } from './types.js';
6
+ export interface MediaGeneratorConfig {
7
+ provider: string;
8
+ apiKey?: string;
9
+ model?: string;
10
+ style?: string;
11
+ }
12
+ export declare function initMediaGenerators(configs?: MediaGeneratorConfig[]): MediaGenerator[];
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,EAAE,GAAG,cAAc,EAAE,CAGtF"}
@@ -0,0 +1,10 @@
1
+ export { createMediaGenerator } from './factory.js';
2
+ export { loadCommunityGenerators } from './loader.js';
3
+ export { saveMedia, cleanupMedia, ensureMediaDir, getMediaDir, isOversized } from './store.js';
4
+ import { createMediaGenerator } from './factory.js';
5
+ export function initMediaGenerators(configs) {
6
+ if (!configs || configs.length === 0)
7
+ return [];
8
+ return configs.map(c => createMediaGenerator(c)).filter((g) => g !== null);
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAUpD,MAAM,UAAU,mBAAmB,CAAC,OAAgC;IAClE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAClG,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { MediaGenerator } from './types.js';
2
+ /**
3
+ * Discover and load community media generator packages from node_modules.
4
+ * Convention: packages named `beecork-media-<name>` must export a default
5
+ * class implementing the MediaGenerator interface.
6
+ */
7
+ export declare function loadCommunityGenerators(apiKeys?: Record<string, string>): Promise<MediaGenerator[]>;
8
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/media/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA6BzG"}
@@ -0,0 +1,46 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { logger } from '../util/logger.js';
4
+ const MEDIA_PREFIX = 'beecork-media-';
5
+ /**
6
+ * Discover and load community media generator packages from node_modules.
7
+ * Convention: packages named `beecork-media-<name>` must export a default
8
+ * class implementing the MediaGenerator interface.
9
+ */
10
+ export async function loadCommunityGenerators(apiKeys) {
11
+ const generators = [];
12
+ const searchPaths = [path.join(process.cwd(), 'node_modules')];
13
+ for (const searchPath of searchPaths) {
14
+ if (!fs.existsSync(searchPath))
15
+ continue;
16
+ try {
17
+ for (const dir of fs.readdirSync(searchPath)) {
18
+ if (!dir.startsWith(MEDIA_PREFIX))
19
+ continue;
20
+ try {
21
+ const pkgPath = path.join(searchPath, dir);
22
+ const pkgJson = JSON.parse(fs.readFileSync(path.join(pkgPath, 'package.json'), 'utf-8'));
23
+ const entryPath = path.join(pkgPath, pkgJson.main || 'index.js');
24
+ if (!fs.existsSync(entryPath))
25
+ continue;
26
+ const module = await import(entryPath);
27
+ const GeneratorClass = module.default || module[Object.keys(module)[0]];
28
+ if (!GeneratorClass || typeof GeneratorClass !== 'function')
29
+ continue;
30
+ const name = dir.slice(MEDIA_PREFIX.length);
31
+ const instance = new GeneratorClass(apiKeys?.[name]);
32
+ if (!instance.id || !instance.name || typeof instance.generate !== 'function')
33
+ continue;
34
+ generators.push(instance);
35
+ logger.info(`Community media generator loaded: ${instance.name} (${instance.id})`);
36
+ }
37
+ catch (err) {
38
+ logger.warn(`Failed to load community generator ${dir}:`, err);
39
+ }
40
+ }
41
+ }
42
+ catch { }
43
+ }
44
+ return generators;
45
+ }
46
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/media/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAgC;IAC5E,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAE/D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QACzC,IAAI,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;oBAAE,SAAS;gBAC5C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;oBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBACzF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC;oBACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;wBAAE,SAAS;oBACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;oBACvC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxE,IAAI,CAAC,cAAc,IAAI,OAAO,cAAc,KAAK,UAAU;wBAAE,SAAS;oBACtE,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBAC5C,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAmB,CAAC;oBACvE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,UAAU;wBAAE,SAAS;oBACxF,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,qCAAqC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,sCAAsC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type MediaType = 'image' | 'video' | 'audio' | 'music';
2
+ export interface GenerateOptions {
3
+ style?: string;
4
+ model?: string;
5
+ width?: number;
6
+ height?: number;
7
+ duration?: number;
8
+ format?: string;
9
+ }
10
+ export interface GenerateResult {
11
+ filePath: string;
12
+ mimeType: string;
13
+ durationMs?: number;
14
+ metadata?: Record<string, unknown>;
15
+ }
16
+ export interface MediaGenerator {
17
+ readonly id: string;
18
+ readonly name: string;
19
+ readonly supportedTypes: MediaType[];
20
+ generate(type: MediaType, prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC/F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export type { Project, RouteDecision, RoutingContext } from './types.js';
2
+ export { discoverProjects, createProject, listProjects, getProject, ensureCategory, touchProject, closeTab, getWorkspaceRoot, getManagedWorkspace } from './manager.js';
3
+ export { routeMessage, setUserContext } from './router.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/projects/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxK,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { discoverProjects, createProject, listProjects, getProject, ensureCategory, touchProject, closeTab, getWorkspaceRoot, getManagedWorkspace } from './manager.js';
2
+ export { routeMessage, setUserContext } from './router.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/projects/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxK,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Project } from './types.js';
2
+ /** Get the workspace root from config */
3
+ export declare function getWorkspaceRoot(): string;
4
+ /** Get the managed workspace path (.beecork/ under workspace root) */
5
+ export declare function getManagedWorkspace(): string;
6
+ /** Discover projects in scan paths (look for git repos, package.json, etc.) */
7
+ export declare function discoverProjects(scanPaths?: string[]): Project[];
8
+ /** Create a new project */
9
+ export declare function createProject(name: string, parentDir?: string): Project;
10
+ /** Ensure a managed category exists (lazy creation) */
11
+ export declare function ensureCategory(name: string): Project;
12
+ /** List all projects */
13
+ export declare function listProjects(): Project[];
14
+ /** Get a project by name */
15
+ export declare function getProject(name: string): Project | null;
16
+ /** Update last used timestamp */
17
+ export declare function touchProject(name: string): void;
18
+ /** Close (permanently delete) a tab */
19
+ export declare function closeTab(tabName: string): boolean;
20
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/projects/manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,yCAAyC;AACzC,wBAAgB,gBAAgB,IAAI,MAAM,CAKzC;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAoDhE;AAED,2BAA2B;AAC3B,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAoBvE;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAapD;AAED,wBAAwB;AACxB,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAOxC;AAED,4BAA4B;AAC5B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAKvD;AAED,iCAAiC;AACjC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,uCAAuC;AACvC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQjD"}