@telepat/rilo 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.
- package/LICENSE +21 -0
- package/README.md +209 -0
- package/index.js +1 -0
- package/models/black-forest-labs__flux-2-pro.json +78 -0
- package/models/black-forest-labs__flux-schnell.json +95 -0
- package/models/bytedance__seedream-4.json +71 -0
- package/models/deepseek-ai__deepseek-v3.json +61 -0
- package/models/google__nano-banana-pro.json +92 -0
- package/models/google__veo-3.1-fast.json +93 -0
- package/models/google__veo-3.1.json +93 -0
- package/models/jaaari__kokoro-82m.json +86 -0
- package/models/kwaivgi__kling-v3-video.json +101 -0
- package/models/minimax__speech-02-turbo.json +141 -0
- package/models/pixverse__pixverse-v5.6.json +113 -0
- package/models/prunaai__z-image-turbo.json +107 -0
- package/models/resemble-ai__chatterbox-turbo.json +102 -0
- package/models/wan-video__wan-2.2-i2v-fast.json +139 -0
- package/package.json +67 -0
- package/src/api/firebaseFunction.js +46 -0
- package/src/api/middleware/auth.js +70 -0
- package/src/api/openapi/generateOpenApi.js +21 -0
- package/src/api/openapi/spec.js +831 -0
- package/src/api/routes/jobs.js +45 -0
- package/src/api/routes/projectAssets.js +63 -0
- package/src/api/routes/projects.js +647 -0
- package/src/api/routes/webhooks.js +13 -0
- package/src/api/server.js +88 -0
- package/src/backends/firebaseClient.js +57 -0
- package/src/backends/outputBackend.js +186 -0
- package/src/backends/projectMetadataBackend.js +550 -0
- package/src/cli/commands/openHome.js +70 -0
- package/src/cli/commands/settingsFlow.js +196 -0
- package/src/cli/index.js +192 -0
- package/src/config/env.js +158 -0
- package/src/config/keystore.js +175 -0
- package/src/config/models.js +281 -0
- package/src/config/settingsSchema.js +214 -0
- package/src/media/ffmpeg.js +144 -0
- package/src/media/files.js +77 -0
- package/src/media/subtitles.js +444 -0
- package/src/observability/apiTrace.js +17 -0
- package/src/observability/logger.js +7 -0
- package/src/observability/metrics.js +10 -0
- package/src/pipeline/inputSanitizer.js +6 -0
- package/src/pipeline/orchestrator.js +1669 -0
- package/src/policy/contentGuardrails.js +30 -0
- package/src/providers/predictions.js +188 -0
- package/src/providers/replicateClient.js +12 -0
- package/src/steps/alignSubtitles.js +156 -0
- package/src/steps/burnInSubtitles.js +22 -0
- package/src/steps/composeFinalVideo.js +57 -0
- package/src/steps/generateKeyframes.js +70 -0
- package/src/steps/generateVideoSegments.js +95 -0
- package/src/steps/generateVoiceover.js +128 -0
- package/src/steps/imageToVideoAdapters.js +100 -0
- package/src/steps/script.js +177 -0
- package/src/steps/textToImageAdapters.js +87 -0
- package/src/store/assetStore.js +5 -0
- package/src/store/jobStore.js +102 -0
- package/src/store/projectAnalyticsStore.js +625 -0
- package/src/store/projectStore.js +684 -0
- package/src/store/settingsStore.js +155 -0
- package/src/store/staleAssetStore.js +63 -0
- package/src/types/job.js +28 -0
- package/src/types/media.js +28 -0
- package/src/worker/processor.js +24 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { createJob, findActiveJobByProject, getJob } from '../../store/jobStore.js';
|
|
3
|
+
import { runPipeline } from '../../pipeline/orchestrator.js';
|
|
4
|
+
import { ensureProject, resolveProjectName, writeProjectStory } from '../../store/projectStore.js';
|
|
5
|
+
|
|
6
|
+
export function createJobsRouter() {
|
|
7
|
+
const router = express.Router();
|
|
8
|
+
|
|
9
|
+
router.post('/', async (req, res) => {
|
|
10
|
+
const { story, project, forceRestart } = req.body || {};
|
|
11
|
+
if (!story) {
|
|
12
|
+
res.status(400).json({ error: 'story is required' });
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const resolvedProject = resolveProjectName(project || `api-${Date.now()}`);
|
|
17
|
+
const existingActiveJob = findActiveJobByProject(resolvedProject);
|
|
18
|
+
if (existingActiveJob) {
|
|
19
|
+
res.status(409).json({
|
|
20
|
+
error: `project already has an active job (${existingActiveJob.id})`,
|
|
21
|
+
jobId: existingActiveJob.id,
|
|
22
|
+
status: existingActiveJob.status
|
|
23
|
+
});
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
await ensureProject(resolvedProject);
|
|
28
|
+
await writeProjectStory(resolvedProject, story);
|
|
29
|
+
|
|
30
|
+
const job = createJob({ story, project: resolvedProject });
|
|
31
|
+
setImmediate(() => runPipeline(job.id, { forceRestart: Boolean(forceRestart) }));
|
|
32
|
+
res.status(202).json({ jobId: job.id, status: job.status });
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
router.get('/:jobId', (req, res) => {
|
|
36
|
+
const job = getJob(req.params.jobId);
|
|
37
|
+
if (!job) {
|
|
38
|
+
res.status(404).json({ error: 'job not found' });
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
res.json(job);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return router;
|
|
45
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { getProjectMetadataBackend } from '../../backends/projectMetadataBackend.js';
|
|
5
|
+
import { getProjectDir, resolveProjectName } from '../../store/projectStore.js';
|
|
6
|
+
|
|
7
|
+
function isPathWithinBase(baseDir, candidatePath) {
|
|
8
|
+
const normalizedBase = path.resolve(baseDir);
|
|
9
|
+
const normalizedCandidate = path.resolve(candidatePath);
|
|
10
|
+
const baseWithSeparator = normalizedBase.endsWith(path.sep)
|
|
11
|
+
? normalizedBase
|
|
12
|
+
: `${normalizedBase}${path.sep}`;
|
|
13
|
+
|
|
14
|
+
return normalizedCandidate === normalizedBase || normalizedCandidate.startsWith(baseWithSeparator);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function createProjectAssetsRouter() {
|
|
18
|
+
const router = express.Router();
|
|
19
|
+
|
|
20
|
+
router.get('/:project/assets/*', async (req, res) => {
|
|
21
|
+
try {
|
|
22
|
+
const backend = getProjectMetadataBackend();
|
|
23
|
+
if (backend.constructor?.name !== 'LocalProjectMetadataBackend') {
|
|
24
|
+
res.status(400).json({
|
|
25
|
+
error: 'asset file serving is available only for local backend; use assets[].value URLs for firebase backend'
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const project = resolveProjectName(req.params.project);
|
|
31
|
+
const assetPath = String(req.params[0] || '').trim();
|
|
32
|
+
if (!assetPath) {
|
|
33
|
+
res.status(400).json({ error: 'asset path is required' });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const projectDir = getProjectDir(project);
|
|
38
|
+
const filePath = path.resolve(projectDir, assetPath);
|
|
39
|
+
|
|
40
|
+
if (!isPathWithinBase(projectDir, filePath)) {
|
|
41
|
+
res.status(400).json({ error: 'invalid asset path' });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const stat = await fs.stat(filePath);
|
|
46
|
+
if (!stat.isFile()) {
|
|
47
|
+
res.status(404).json({ error: 'asset not found' });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
res.sendFile(filePath);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (error?.code === 'ENOENT') {
|
|
54
|
+
res.status(404).json({ error: 'asset not found' });
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
res.status(400).json({ error: error.message });
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return router;
|
|
63
|
+
}
|