Compare commits
8 Commits
initial-fi
...
project-2_
| Author | SHA1 | Date | |
|---|---|---|---|
| 1da7a85364 | |||
| 4a43df9a41 | |||
| 6e75d0d3d5 | |||
| 99055009d1 | |||
| 4cf25af5a2 | |||
| 916fe7ace3 | |||
| f5ad529a0f | |||
| e17720411b |
594
sources/code-diff.txt
Normal file
594
sources/code-diff.txt
Normal file
@@ -0,0 +1,594 @@
|
|||||||
|
diff --git a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/index.js b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/index.js
|
||||||
|
index 0995e23..d3552ca 100644
|
||||||
|
--- a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/index.js
|
||||||
|
+++ b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/index.js
|
||||||
|
@@ -10,6 +10,7 @@ const sqs = require('../app/services/sqs')
|
||||||
|
const s3 = require('../app/services/s3')
|
||||||
|
const voiceCloningService = require('./voice_cloning')
|
||||||
|
const userAudioProfileService = require('./user_audio_profile')
|
||||||
|
+const { requireUserId, requireDocumentId } = require('../worker-tenant')
|
||||||
|
|
||||||
|
AWS.config.update({ region: 'us-west-2' })
|
||||||
|
const sqsQueueUrl = process.env.SQS_URL
|
||||||
|
@@ -101,14 +102,15 @@ const processQueue = () => {
|
||||||
|
const receiptHandle = response.Messages[0].ReceiptHandle
|
||||||
|
console.log('job===', job)
|
||||||
|
|
||||||
|
- const { metadata, input, _id, userAudioProfileId } = job._doc
|
||||||
|
+ const { _id, userAudioProfileId, userId } = job._doc
|
||||||
|
+ requireUserId(userId)
|
||||||
|
+ requireDocumentId(_id)
|
||||||
|
+ requireDocumentId(userAudioProfileId)
|
||||||
|
console.log('userAudioProfileId', userAudioProfileId)
|
||||||
|
console.log('_id', _id)
|
||||||
|
const { env } = job
|
||||||
|
console.log('env', env)
|
||||||
|
|
||||||
|
- console.log('metadata------', metadata)
|
||||||
|
- console.log('input', input)
|
||||||
|
const DB_URI =
|
||||||
|
env === 'production'
|
||||||
|
? mongoUriProd
|
||||||
|
@@ -126,9 +128,26 @@ const processQueue = () => {
|
||||||
|
? cloudFrontUrlStaging
|
||||||
|
: cloudFrontUrlDev
|
||||||
|
|
||||||
|
+ let authorized = false
|
||||||
|
try {
|
||||||
|
await sqs.deleteMessageFromSQS(sqsQueueUrl, receiptHandle)
|
||||||
|
|
||||||
|
+ const cloningJob = await voiceCloningService.read({
|
||||||
|
+ _id,
|
||||||
|
+ userId,
|
||||||
|
+ userAudioProfileId,
|
||||||
|
+ })
|
||||||
|
+ const audioProfile = await userAudioProfileService.read({
|
||||||
|
+ _id: userAudioProfileId,
|
||||||
|
+ userId,
|
||||||
|
+ })
|
||||||
|
+ if (!cloningJob || !audioProfile) {
|
||||||
|
+ throw new Error('Cloning job or audio profile does not belong to user')
|
||||||
|
+ }
|
||||||
|
+ authorized = true
|
||||||
|
+
|
||||||
|
+ const { metadata, input } = cloningJob
|
||||||
|
+
|
||||||
|
const { directoryName } = metadata
|
||||||
|
console.log('directoryName', directoryName)
|
||||||
|
const logPath = `/mnt/efs/potion-voice/${env}/${directoryName}`
|
||||||
|
@@ -136,9 +155,10 @@ const processQueue = () => {
|
||||||
|
fs.mkdirSync(logPath, { recursive: true })
|
||||||
|
}
|
||||||
|
// update the db model to processing
|
||||||
|
- await voiceCloningService.update({ _id, status: 'processing' })
|
||||||
|
+ await voiceCloningService.update({ _id, userId, status: 'processing' })
|
||||||
|
await userAudioProfileService.update({
|
||||||
|
_id: userAudioProfileId,
|
||||||
|
+ userId,
|
||||||
|
status: 'processing',
|
||||||
|
})
|
||||||
|
|
||||||
|
@@ -240,7 +260,7 @@ const processQueue = () => {
|
||||||
|
console.timeEnd(VOICE_MINIMIZE_LABEL)
|
||||||
|
|
||||||
|
// Add the code to update location of generated model and status into DB
|
||||||
|
- await voiceCloningService.update({ _id, status: 'completed' })
|
||||||
|
+ await voiceCloningService.update({ _id, userId, status: 'completed' })
|
||||||
|
|
||||||
|
const training_model_path = {
|
||||||
|
voice_model_path: `${resultsPath}/${generatedDirectoryName}/checkpoint_365200.pth`,
|
||||||
|
@@ -252,6 +272,7 @@ const processQueue = () => {
|
||||||
|
|
||||||
|
await userAudioProfileService.update({
|
||||||
|
_id: userAudioProfileId,
|
||||||
|
+ userId,
|
||||||
|
status: 'completed',
|
||||||
|
training_model_path,
|
||||||
|
})
|
||||||
|
@@ -273,6 +294,7 @@ const processQueue = () => {
|
||||||
|
// add S3 path to user audio profile model
|
||||||
|
await userAudioProfileService.update({
|
||||||
|
_id: userAudioProfileId,
|
||||||
|
+ userId,
|
||||||
|
training_model_s3_path,
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
@@ -285,11 +307,14 @@ const processQueue = () => {
|
||||||
|
Bugsnag.notify(error)
|
||||||
|
|
||||||
|
// update the db to set status as error
|
||||||
|
- await voiceCloningService.update({ _id, status: 'error' })
|
||||||
|
- await userAudioProfileService.update({
|
||||||
|
- _id: userAudioProfileId,
|
||||||
|
- status: 'error',
|
||||||
|
- })
|
||||||
|
+ if (authorized) {
|
||||||
|
+ await voiceCloningService.update({ _id, userId, status: 'error' })
|
||||||
|
+ await userAudioProfileService.update({
|
||||||
|
+ _id: userAudioProfileId,
|
||||||
|
+ userId,
|
||||||
|
+ status: 'error',
|
||||||
|
+ })
|
||||||
|
+ }
|
||||||
|
|
||||||
|
resolve() // to continue working on new jobs
|
||||||
|
}
|
||||||
|
diff --git a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/user_audio_profile/user_audio_profile_service.js b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/user_audio_profile/user_audio_profile_service.js
|
||||||
|
index e76643d..f35ecd6 100644
|
||||||
|
--- a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/user_audio_profile/user_audio_profile_service.js
|
||||||
|
+++ b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/user_audio_profile/user_audio_profile_service.js
|
||||||
|
@@ -1,8 +1,9 @@
|
||||||
|
+const { requireUserId } = require('../../worker-tenant')
|
||||||
|
const StringifyUtils = require('../../app/services/utils/logService')
|
||||||
|
|
||||||
|
const create = (UserAudioProfileModel) => async (data) => {
|
||||||
|
try {
|
||||||
|
- const newModel = new UserAudioProfileModel({ ...data })
|
||||||
|
+ const newModel = new UserAudioProfileModel({ ...data, userId: requireUserId(data.userId) })
|
||||||
|
const savedModel = await newModel.save()
|
||||||
|
return savedModel
|
||||||
|
} catch (error) {
|
||||||
|
@@ -17,7 +18,9 @@ const create = (UserAudioProfileModel) => async (data) => {
|
||||||
|
|
||||||
|
const insertMany = (UserAudioProfileModel) => async (data) => {
|
||||||
|
try {
|
||||||
|
- const inserted = await UserAudioProfileModel.insertMany(data)
|
||||||
|
+ const inserted = await UserAudioProfileModel.insertMany(
|
||||||
|
+ data.map((item) => ({ ...item, userId: requireUserId(item.userId) }))
|
||||||
|
+ )
|
||||||
|
return inserted
|
||||||
|
} catch (error) {
|
||||||
|
const details = { data }
|
||||||
|
@@ -33,6 +36,7 @@ const read = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const foundModel = await UserAudioProfileModel.findOne({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false,
|
||||||
|
})
|
||||||
|
return foundModel
|
||||||
|
@@ -50,6 +54,7 @@ const find = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const foundModels = await UserAudioProfileModel.find({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false,
|
||||||
|
})
|
||||||
|
return foundModels
|
||||||
|
@@ -65,12 +70,11 @@ const find = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
|
||||||
|
const update = (UserAudioProfileModel) => async (data) => {
|
||||||
|
try {
|
||||||
|
+ const { _id, userId, ...changes } = data
|
||||||
|
const updatedModel = await UserAudioProfileModel.findOneAndUpdate(
|
||||||
|
- { _id: data._id },
|
||||||
|
- data,
|
||||||
|
- {
|
||||||
|
- new: true,
|
||||||
|
- }
|
||||||
|
+ { _id, userId: requireUserId(userId), deleted: false },
|
||||||
|
+ { $set: changes },
|
||||||
|
+ { new: true }
|
||||||
|
)
|
||||||
|
return updatedModel
|
||||||
|
} catch (error) {
|
||||||
|
@@ -86,7 +90,7 @@ const update = (UserAudioProfileModel) => async (data) => {
|
||||||
|
const remove = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const updatedModel = await UserAudioProfileModel.findOneAndUpdate(
|
||||||
|
- { ...filter },
|
||||||
|
+ { ...filter, userId: requireUserId(filter.userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true,
|
||||||
|
@@ -108,7 +112,7 @@ const remove = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
const removeMany = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const updatedModel = await UserAudioProfileModel.updateMany(
|
||||||
|
- { ...filter },
|
||||||
|
+ { ...filter, userId: requireUserId(filter.userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true,
|
||||||
|
diff --git a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/voice_cloning/voice_cloning_service.js b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/voice_cloning/voice_cloning_service.js
|
||||||
|
index 329638e..cef601b 100644
|
||||||
|
--- a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/voice_cloning/voice_cloning_service.js
|
||||||
|
+++ b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-cloning-job-handler/voice_cloning/voice_cloning_service.js
|
||||||
|
@@ -1,8 +1,9 @@
|
||||||
|
+const { requireUserId } = require('../../worker-tenant')
|
||||||
|
const StringifyUtils = require('../../app/services/utils/logService')
|
||||||
|
|
||||||
|
const create = (VoiceCloningModel) => async (data) => {
|
||||||
|
try {
|
||||||
|
- const newModel = new VoiceCloningModel({ ...data })
|
||||||
|
+ const newModel = new VoiceCloningModel({ ...data, userId: requireUserId(data.userId) })
|
||||||
|
const savedModel = await newModel.save()
|
||||||
|
return savedModel
|
||||||
|
} catch (error) {
|
||||||
|
@@ -17,7 +18,9 @@ const create = (VoiceCloningModel) => async (data) => {
|
||||||
|
|
||||||
|
const insertMany = (VoiceCloningModel) => async (data) => {
|
||||||
|
try {
|
||||||
|
- const inserted = await VoiceCloningModel.insertMany(data)
|
||||||
|
+ const inserted = await VoiceCloningModel.insertMany(
|
||||||
|
+ data.map((item) => ({ ...item, userId: requireUserId(item.userId) }))
|
||||||
|
+ )
|
||||||
|
return inserted
|
||||||
|
} catch (error) {
|
||||||
|
const details = { data }
|
||||||
|
@@ -33,6 +36,7 @@ const read = (VoiceCloningModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const foundModel = await VoiceCloningModel.findOne({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false,
|
||||||
|
})
|
||||||
|
return foundModel
|
||||||
|
@@ -50,6 +54,7 @@ const find = (VoiceCloningModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const foundModels = await VoiceCloningModel.find({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false,
|
||||||
|
})
|
||||||
|
return foundModels
|
||||||
|
@@ -65,12 +70,11 @@ const find = (VoiceCloningModel) => async (filter) => {
|
||||||
|
|
||||||
|
const update = (VoiceCloningModel) => async (data) => {
|
||||||
|
try {
|
||||||
|
+ const { _id, userId, ...changes } = data
|
||||||
|
const updatedModel = await VoiceCloningModel.findOneAndUpdate(
|
||||||
|
- { _id: data._id },
|
||||||
|
- data,
|
||||||
|
- {
|
||||||
|
- new: true,
|
||||||
|
- }
|
||||||
|
+ { _id, userId: requireUserId(userId), deleted: false },
|
||||||
|
+ { $set: changes },
|
||||||
|
+ { new: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
return updatedModel
|
||||||
|
@@ -87,7 +91,7 @@ const update = (VoiceCloningModel) => async (data) => {
|
||||||
|
const remove = (VoiceCloningModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const updatedModel = await VoiceCloningModel.findOneAndUpdate(
|
||||||
|
- { ...filter },
|
||||||
|
+ { ...filter, userId: requireUserId(filter.userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true,
|
||||||
|
@@ -109,7 +113,7 @@ const remove = (VoiceCloningModel) => async (filter) => {
|
||||||
|
const removeMany = (VoiceCloningModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const updatedModel = await VoiceCloningModel.updateMany(
|
||||||
|
- { ...filter },
|
||||||
|
+ { ...filter, userId: requireUserId(filter.userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true,
|
||||||
|
diff --git a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/index.js b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/index.js
|
||||||
|
index 862300f..7269ea7 100644
|
||||||
|
--- a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/index.js
|
||||||
|
+++ b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/index.js
|
||||||
|
@@ -11,6 +11,7 @@ const recordingModel = require('./recording')
|
||||||
|
const recordingSalutationModel = require('./recording_salutation')
|
||||||
|
const jobService = require('./job')
|
||||||
|
const salutationService = require('./salutation')
|
||||||
|
+const { requireUserId, requireDocumentId } = require('../worker-tenant')
|
||||||
|
let throttleMessageFetching = true
|
||||||
|
AWS.config.update({ region: 'us-west-2' })
|
||||||
|
const sqsQueueUrl = process.env.SQS_URL
|
||||||
|
@@ -79,8 +80,14 @@ const processQueue = () => {
|
||||||
|
recordingId,
|
||||||
|
baseUrlForPotionAi,
|
||||||
|
env,
|
||||||
|
+ userId,
|
||||||
|
} = job
|
||||||
|
|
||||||
|
+ requireUserId(userId)
|
||||||
|
+ requireDocumentId(userAudioProfileId)
|
||||||
|
+ requireDocumentId(salutationId)
|
||||||
|
+ requireDocumentId(recordingId)
|
||||||
|
+
|
||||||
|
const DB_URI =
|
||||||
|
env === 'production'
|
||||||
|
? mongoUriProd
|
||||||
|
@@ -95,10 +102,24 @@ const processQueue = () => {
|
||||||
|
|
||||||
|
const userAudioProfile = await userAudioProfileService.find({
|
||||||
|
_id: userAudioProfileId,
|
||||||
|
+ userId,
|
||||||
|
status: 'completed',
|
||||||
|
})
|
||||||
|
- if (userAudioProfile) {
|
||||||
|
- const { training_model_path, userId } = userAudioProfile[0]
|
||||||
|
+ if (userAudioProfile.length) {
|
||||||
|
+ const { training_model_path } = userAudioProfile[0]
|
||||||
|
+ const salutationToUpdate = await recordingSalutationModel.findOne({
|
||||||
|
+ _id: salutationId,
|
||||||
|
+ userId,
|
||||||
|
+ deleted: false,
|
||||||
|
+ })
|
||||||
|
+ const recordingToUpdate = await recordingModel.findOne({
|
||||||
|
+ _id: recordingId,
|
||||||
|
+ userId,
|
||||||
|
+ deleted: false,
|
||||||
|
+ })
|
||||||
|
+ if (!salutationToUpdate || !recordingToUpdate) {
|
||||||
|
+ throw new Error('Job recording or salutation does not belong to user')
|
||||||
|
+ }
|
||||||
|
const {
|
||||||
|
voice_model_light_path,
|
||||||
|
voice_model_config_light_path,
|
||||||
|
@@ -149,16 +170,6 @@ const processQueue = () => {
|
||||||
|
userId
|
||||||
|
)
|
||||||
|
// update the dynamic recordings for the current dynamic video with salutation url
|
||||||
|
- const salutationToUpdate = await recordingSalutationModel.findOne({
|
||||||
|
- _id: salutationId,
|
||||||
|
- deleted: false,
|
||||||
|
- })
|
||||||
|
-
|
||||||
|
- const recordingToUpdate = await recordingModel.findOne({
|
||||||
|
- _id: recordingId,
|
||||||
|
- deleted: false,
|
||||||
|
- })
|
||||||
|
-
|
||||||
|
if (
|
||||||
|
salutationToUpdate &&
|
||||||
|
salutationToUpdate.deleted === false &&
|
||||||
|
@@ -169,6 +180,8 @@ const processQueue = () => {
|
||||||
|
await recordingSalutationModel.findOneAndUpdate(
|
||||||
|
{
|
||||||
|
_id: salutationId,
|
||||||
|
+ userId,
|
||||||
|
+ deleted: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
@@ -200,7 +213,7 @@ const processQueue = () => {
|
||||||
|
jobsToInsert.push({
|
||||||
|
firstName,
|
||||||
|
recordingId: recordingToUpdate._id,
|
||||||
|
- userId: recordingToUpdate.userId,
|
||||||
|
+ userId,
|
||||||
|
salutationId: salutationToUpdate._id,
|
||||||
|
metadata: jobData,
|
||||||
|
})
|
||||||
|
diff --git a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/job/job_service.js b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/job/job_service.js
|
||||||
|
index 44189af..290b1c4 100644
|
||||||
|
--- a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/job/job_service.js
|
||||||
|
+++ b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/job/job_service.js
|
||||||
|
@@ -1,8 +1,9 @@
|
||||||
|
+const { requireUserId } = require('../../worker-tenant')
|
||||||
|
const StringifyUtils = require('../../app/services/utils/logService')
|
||||||
|
|
||||||
|
const create = (Job) => async (jobData) => {
|
||||||
|
try {
|
||||||
|
- const newJob = new Job({ ...jobData })
|
||||||
|
+ const newJob = new Job({ ...jobData, userId: requireUserId(jobData.userId) })
|
||||||
|
const savedJob = await newJob.save()
|
||||||
|
return savedJob
|
||||||
|
} catch (error) {
|
||||||
|
@@ -17,7 +18,9 @@ const create = (Job) => async (jobData) => {
|
||||||
|
|
||||||
|
const insertMany = (Job) => async (jobData) => {
|
||||||
|
try {
|
||||||
|
- const inserted = await Job.insertMany(jobData)
|
||||||
|
+ const inserted = await Job.insertMany(
|
||||||
|
+ jobData.map((item) => ({ ...item, userId: requireUserId(item.userId) }))
|
||||||
|
+ )
|
||||||
|
return inserted
|
||||||
|
} catch (error) {
|
||||||
|
const details = { jobData }
|
||||||
|
@@ -33,6 +36,7 @@ const read = (Job) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const foundJob = await Job.findOne({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false,
|
||||||
|
})
|
||||||
|
return foundJob
|
||||||
|
@@ -50,6 +54,7 @@ const find = (Job) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const foundJobs = await Job.find({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false,
|
||||||
|
})
|
||||||
|
return foundJobs
|
||||||
|
@@ -65,9 +70,12 @@ const find = (Job) => async (filter) => {
|
||||||
|
|
||||||
|
const update = (Job) => async (job) => {
|
||||||
|
try {
|
||||||
|
- const updatedJob = await Job.findOneAndUpdate({ _id: job._id }, job, {
|
||||||
|
- new: true,
|
||||||
|
- })
|
||||||
|
+ const { _id, userId, ...changes } = job
|
||||||
|
+ const updatedJob = await Job.findOneAndUpdate(
|
||||||
|
+ { _id, userId: requireUserId(userId), deleted: false },
|
||||||
|
+ { $set: changes },
|
||||||
|
+ { new: true }
|
||||||
|
+ )
|
||||||
|
return updatedJob
|
||||||
|
} catch (error) {
|
||||||
|
const details = { job }
|
||||||
|
@@ -82,7 +90,7 @@ const update = (Job) => async (job) => {
|
||||||
|
const remove = (Job) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const updatedJob = await Job.findOneAndUpdate(
|
||||||
|
- { ...filter },
|
||||||
|
+ { ...filter, userId: requireUserId(filter.userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true,
|
||||||
|
@@ -104,7 +112,7 @@ const remove = (Job) => async (filter) => {
|
||||||
|
const removeMany = (Job) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const updatedJob = await Job.updateMany(
|
||||||
|
- { ...filter },
|
||||||
|
+ { ...filter, userId: requireUserId(filter.userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true,
|
||||||
|
diff --git a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/salutation/salutation_service.js b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/salutation/salutation_service.js
|
||||||
|
index 2d84f78..29dfc65 100644
|
||||||
|
--- a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/salutation/salutation_service.js
|
||||||
|
+++ b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/salutation/salutation_service.js
|
||||||
|
@@ -1,5 +1,7 @@
|
||||||
|
+const { requireUserId } = require('../../worker-tenant')
|
||||||
|
+
|
||||||
|
const create = (Salutation) => async (salutationData, userId) => {
|
||||||
|
- const newSalutation = new Salutation({ ...salutationData, userId })
|
||||||
|
+ const newSalutation = new Salutation({ ...salutationData, userId: requireUserId(userId) })
|
||||||
|
const savedSalutation = await newSalutation.save()
|
||||||
|
return savedSalutation
|
||||||
|
}
|
||||||
|
@@ -7,6 +9,7 @@ const create = (Salutation) => async (salutationData, userId) => {
|
||||||
|
const read = (Salutation) => async (filter) => {
|
||||||
|
const foundSalutation = await Salutation.findOne({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false,
|
||||||
|
})
|
||||||
|
return foundSalutation
|
||||||
|
@@ -15,28 +18,34 @@ const read = (Salutation) => async (filter) => {
|
||||||
|
const find = (Salutation) => async (filter) => {
|
||||||
|
const foundSalutations = await Salutation.find({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false,
|
||||||
|
})
|
||||||
|
return foundSalutations
|
||||||
|
}
|
||||||
|
|
||||||
|
const update = (Salutation) => async (salutation, userId) => {
|
||||||
|
+ const { _id, ...changes } = salutation
|
||||||
|
+ delete changes.userId
|
||||||
|
const updatedSalutation = await Salutation.findOneAndUpdate(
|
||||||
|
- { _id: salutation._id, userId },
|
||||||
|
- salutation,
|
||||||
|
+ { _id, userId: requireUserId(userId), deleted: false },
|
||||||
|
+ { $set: changes },
|
||||||
|
{ new: true }
|
||||||
|
)
|
||||||
|
return updatedSalutation
|
||||||
|
}
|
||||||
|
|
||||||
|
-const modify = (Salutation) => async (salutation) => {
|
||||||
|
+const modify = (Salutation) => async (salutation, userId) => {
|
||||||
|
const findQuery = salutation._id
|
||||||
|
? { _id: salutation._id }
|
||||||
|
: { transcriptId: salutation.transcriptId }
|
||||||
|
|
||||||
|
+ const changes = { ...salutation }
|
||||||
|
+ delete changes._id
|
||||||
|
+ delete changes.userId
|
||||||
|
const updatedSalutation = await Salutation.findOneAndUpdate(
|
||||||
|
- findQuery,
|
||||||
|
- salutation,
|
||||||
|
+ { ...findQuery, userId: requireUserId(userId), deleted: false },
|
||||||
|
+ { $set: changes },
|
||||||
|
{ new: true }
|
||||||
|
)
|
||||||
|
return updatedSalutation
|
||||||
|
@@ -51,8 +60,10 @@ const updateOrCreate =
|
||||||
|
userId,
|
||||||
|
})
|
||||||
|
if (salutation) {
|
||||||
|
- salutation.salutationVideo = salutationVideo
|
||||||
|
- return await update(Salutation)(salutation, userId)
|
||||||
|
+ return await update(Salutation)(
|
||||||
|
+ { _id: salutation._id, salutationVideo },
|
||||||
|
+ userId
|
||||||
|
+ )
|
||||||
|
} else {
|
||||||
|
return await create(Salutation)(
|
||||||
|
{ firstName, salutationVideo, userAudioProfileId },
|
||||||
|
@@ -63,7 +74,7 @@ const updateOrCreate =
|
||||||
|
|
||||||
|
const remove = (Salutation) => async (filter, userId) => {
|
||||||
|
const updatedSalutation = await Salutation.findOneAndUpdate(
|
||||||
|
- { ...filter, userId },
|
||||||
|
+ { ...filter, userId: requireUserId(userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true,
|
||||||
|
diff --git a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/user_audio_profile/user_audio_profile_service.js b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/user_audio_profile/user_audio_profile_service.js
|
||||||
|
index 18416d7..a432cfc 100644
|
||||||
|
--- a/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/user_audio_profile/user_audio_profile_service.js
|
||||||
|
+++ b/worker-toolkit-potion-polyglot/repos/potion-voice/voice-synthsizer-job-handler/user_audio_profile/user_audio_profile_service.js
|
||||||
|
@@ -1,8 +1,9 @@
|
||||||
|
+const { requireUserId } = require('../../worker-tenant')
|
||||||
|
const StringifyUtils = require('../../app/services/utils/logService')
|
||||||
|
|
||||||
|
const create = (UserAudioProfileModel) => async (data) => {
|
||||||
|
try {
|
||||||
|
- const newModel = new UserAudioProfileModel({ ...data })
|
||||||
|
+ const newModel = new UserAudioProfileModel({ ...data, userId: requireUserId(data.userId) })
|
||||||
|
const savedModel = await newModel.save()
|
||||||
|
return savedModel
|
||||||
|
} catch (error) {
|
||||||
|
@@ -17,7 +18,9 @@ const create = (UserAudioProfileModel) => async (data) => {
|
||||||
|
|
||||||
|
const insertMany = (UserAudioProfileModel) => async (data) => {
|
||||||
|
try {
|
||||||
|
- const inserted = await UserAudioProfileModel.insertMany(data)
|
||||||
|
+ const inserted = await UserAudioProfileModel.insertMany(
|
||||||
|
+ data.map((item) => ({ ...item, userId: requireUserId(item.userId) }))
|
||||||
|
+ )
|
||||||
|
return inserted
|
||||||
|
} catch (error) {
|
||||||
|
const details = { data }
|
||||||
|
@@ -33,6 +36,7 @@ const read = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const foundModel = await UserAudioProfileModel.findOne({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false
|
||||||
|
})
|
||||||
|
return foundModel
|
||||||
|
@@ -50,6 +54,7 @@ const find = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const foundModels = await UserAudioProfileModel.find({
|
||||||
|
...filter,
|
||||||
|
+ userId: requireUserId(filter.userId),
|
||||||
|
deleted: false
|
||||||
|
})
|
||||||
|
return foundModels
|
||||||
|
@@ -66,12 +71,11 @@ const find = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
const update = (UserAudioProfileModel) => async (data) => {
|
||||||
|
console.log('ua data', data)
|
||||||
|
try {
|
||||||
|
+ const { _id, userId, ...changes } = data
|
||||||
|
const updatedModel = await UserAudioProfileModel.findOneAndUpdate(
|
||||||
|
- { _id: data._id },
|
||||||
|
- data,
|
||||||
|
- {
|
||||||
|
- new: true
|
||||||
|
- }
|
||||||
|
+ { _id, userId: requireUserId(userId), deleted: false },
|
||||||
|
+ { $set: changes },
|
||||||
|
+ { new: true }
|
||||||
|
)
|
||||||
|
console.log('ua updatedModel', updatedModel)
|
||||||
|
return updatedModel
|
||||||
|
@@ -88,7 +92,7 @@ const update = (UserAudioProfileModel) => async (data) => {
|
||||||
|
const remove = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const updatedModel = await UserAudioProfileModel.findOneAndUpdate(
|
||||||
|
- { ...filter },
|
||||||
|
+ { ...filter, userId: requireUserId(filter.userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true
|
||||||
|
@@ -110,7 +114,7 @@ const remove = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
const removeMany = (UserAudioProfileModel) => async (filter) => {
|
||||||
|
try {
|
||||||
|
const updatedModel = await UserAudioProfileModel.updateMany(
|
||||||
|
- { ...filter },
|
||||||
|
+ { ...filter, userId: requireUserId(filter.userId) },
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
deleted: true
|
||||||
1
sources/instruction.md
Normal file
1
sources/instruction.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Its possible our background workers (voice-synthsizer-job-handler and voice-cloning-job-handler) do not enforce strict tenant isolation when loading and updating MongoDB records. Specifically, job handlers fetch database models using only document IDs supplied in SQS payloads without verifying that they belong to the job's userId. Audit all db queries across both worker handlers and make them enforce strict multi-tenant authorization so users cannot access or modify records belonging to other tenants.
|
||||||
19
sources/raw-defects-simplified.md
Normal file
19
sources/raw-defects-simplified.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
Key Meaningful Failures Identified in code-diff.txt
|
||||||
|
|
||||||
|
1. Missing Utility Module (MODULE_NOT_FOUND Startup Crash)
|
||||||
|
The AI added imports for a utility module called worker-tenant in several files, but that module does not exist in the repository. When the Node.js worker processes start, they crash with an error saying they cannot find the module. This causes both queue handlers to fail immediately in production.
|
||||||
|
|
||||||
|
2. Premature SQS Queue Message Deletion (Permanent Data Loss)
|
||||||
|
In the voice cloning job handler, the code deletes the SQS message at the beginning of processing, before any work is done. SQS expects messages to stay in the queue until processing finishes successfully. If something goes wrong later, the message is already gone and cannot be retried, leading to silent loss of jobs.
|
||||||
|
|
||||||
|
3. Broken Error Recovery and Orphaned Job States
|
||||||
|
When a document authorization check fails, the handler throws an error before marking the job as authorized. The error handling code only updates the database if the authorized flag is true. Because the flag stays false, the database never gets updated, and the job remains stuck in a pending state forever.
|
||||||
|
|
||||||
|
Evaluation Against Raccoon Failure Criteria
|
||||||
|
According to the Raccoon task criteria, a mistake is a meaningful failure when it meets four requirements:
|
||||||
|
- Most senior engineers would agree that importing missing modules and deleting queue messages too early are serious bugs.
|
||||||
|
- A teammate would give direct feedback about queue handling and missing files.
|
||||||
|
- Both issues are bad enough to block a pull request.
|
||||||
|
- The code causes real problems: worker processes crash and queue data is lost permanently in production.
|
||||||
|
|
||||||
|
These problems give a solid basis for building a reproducible Raccoon benchmark task.
|
||||||
43
sources/raw-defects.md
Normal file
43
sources/raw-defects.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
### Key Meaningful Failures Identified in `code-diff.txt`
|
||||||
|
|
||||||
|
#### 1. Missing Utility Module (`MODULE_NOT_FOUND` Startup Crash)
|
||||||
|
* **What the AI did**: Across multiple files (`voice-cloning-job-handler/index.js`, `voice-synthsizer-job-handler/index.js`, and model service wrappers), the generated code added imports for a new utility module:
|
||||||
|
`const { requireUserId, requireDocumentId } = require('../worker-tenant')`.
|
||||||
|
* **The Flaw**: The git diff does not create or include `worker-tenant.js` or any `worker-tenant` directory anywhere in the repository.
|
||||||
|
* **Real-World Consequence**: When Node.js starts either background worker process, it immediately throws `Error: Cannot find module '../worker-tenant'`, causing an **instant, 100% startup crash** for both queue handlers in production.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 2. Premature SQS Queue Message Deletion (Permanent Data Loss)
|
||||||
|
* **What the AI did**: In `voice-cloning-job-handler/index.js`, the code relocated the SQS deletion call:
|
||||||
|
`await sqs.deleteMessageFromSQS(sqsQueueUrl, receiptHandle)`
|
||||||
|
to the top of `processQueue`, executing **before** validating tenant documents, running heavy Python machine learning scripts (`prepare_datasets.py`, `clone_voice.py`), or uploading model artifacts to S3.
|
||||||
|
* **The Flaw**: SQS queue semantics require messages to remain in flight until processing completes successfully.
|
||||||
|
* **Real-World Consequence**: If any downstream step fails (e.g., Python ML process crash, EFS disk write error, or S3 network timeout), the job jumps to the `catch` block. Because the SQS message was already deleted, the queue cannot redeliver or retry the task, leading to **permanent, silent job loss**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 3. Broken Error Recovery and Orphaned Job States
|
||||||
|
* **What the AI did**: In `voice-cloning-job-handler/index.js`, if a document authorization check fails, the handler throws an error before setting `authorized = true`.
|
||||||
|
* **The Flaw**: Inside the `catch (error)` block, database error updates are guarded by `if (authorized)`:
|
||||||
|
```javascript
|
||||||
|
if (authorized) {
|
||||||
|
await voiceCloningService.update({ _id, userId, status: 'error' })
|
||||||
|
await userAudioProfileService.update({ _id: userAudioProfileId, userId, status: 'error' })
|
||||||
|
}
|
||||||
|
```
|
||||||
|
* **Real-World Consequence**: When an unauthorized job is rejected, `authorized` remains `false`. The error handler skips updating MongoDB, leaving the database records stuck in their previous pending states indefinitely.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Evaluation Against Raccoon Failure Criteria
|
||||||
|
|
||||||
|
According to the Raccoon task criteria, a mistake is classified as a **meaningful failure** when it satisfies four requirements:
|
||||||
|
|
||||||
|
1. **Broad Agreement**: Over 80% of senior software engineers would agree that importing non-existent modules and deleting queue messages prior to job execution are critical defects.
|
||||||
|
2. **Feedback Worth Giving**: A team member would receive direct corrective feedback regarding queue lifecycle semantics and missing file dependencies.
|
||||||
|
3. **Serious Enough to Block**: Both issues represent immediate pull-request blockers.
|
||||||
|
4. **Real Consequence**: The code results in complete worker process crashes and unrecoverable queue data loss in production.
|
||||||
|
|
||||||
|
These verified failures provide a solid foundation for constructing a reproducible Raccoon benchmark task.
|
||||||
@@ -1 +0,0 @@
|
|||||||
/home/eric/workspaces/dataannotation/project-2/worker-toolkit-potion-polyglot/repos
|
|
||||||
Binary file not shown.
@@ -1,303 +0,0 @@
|
|||||||
{
|
|
||||||
"polyglot": true,
|
|
||||||
"repos": [
|
|
||||||
{
|
|
||||||
"repo": "lambda-cloudwatch-logs-to-loggly",
|
|
||||||
"defaultCommit": "f17e2d3",
|
|
||||||
"runtime": "node:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "lambda-potion-engagement",
|
|
||||||
"defaultCommit": "c64365b",
|
|
||||||
"runtime": "node:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "lambda-potion-schedular",
|
|
||||||
"defaultCommit": "0843570",
|
|
||||||
"runtime": "node:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "lambda-potion-transcription-scheduler",
|
|
||||||
"defaultCommit": "1a2e3d5",
|
|
||||||
"runtime": "node:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "lambda-video-processing",
|
|
||||||
"defaultCommit": "0e4a9b5",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "microservice-dynamic-screen-recording",
|
|
||||||
"defaultCommit": "31e142b",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "microservice-potion-voice",
|
|
||||||
"defaultCommit": "b65ca17",
|
|
||||||
"runtime": "node:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-dynamic-screen-recording-lambda",
|
|
||||||
"defaultCommit": "57ed9e6",
|
|
||||||
"runtime": "node:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-job-consumer",
|
|
||||||
"defaultCommit": "93f8a10",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-job-producer",
|
|
||||||
"defaultCommit": "04663d1",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-video-processing",
|
|
||||||
"defaultCommit": "59c6af9",
|
|
||||||
"runtime": "node:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-voice",
|
|
||||||
"defaultCommit": "fcd8a9d",
|
|
||||||
"runtime": "node:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-watcher",
|
|
||||||
"defaultCommit": "0e5973b",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-website-recording-handler",
|
|
||||||
"defaultCommit": "c58a9bb",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-app",
|
|
||||||
"defaultCommit": "f89abccf",
|
|
||||||
"runtime": "node:16",
|
|
||||||
"startCmd": "bash -c \"cp -n .env.client.development .env.local 2>/dev/null || true; export POTION_APP_ENV=local; [ -f .nuxt/store.js ] || npx nuxt build; node scripts/seed-dev-user.js || true; node server/index.js\"",
|
|
||||||
"setupCmd": "bash -c \"cp -n .env.client.development .env.local 2>/dev/null || true; export POTION_APP_ENV=local; [ -f .nuxt/store.js ] || npx nuxt build\""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-custom-domain-app",
|
|
||||||
"defaultCommit": "01a7034",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-website",
|
|
||||||
"defaultCommit": "27995f8",
|
|
||||||
"runtime": "node:16"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "browser-extensions",
|
|
||||||
"defaultCommit": "b5e75d4",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "gcp-application",
|
|
||||||
"defaultCommit": "469056f",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "lambda-text-to-speech",
|
|
||||||
"defaultCommit": "99054ac",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-multi-dsr-watcher",
|
|
||||||
"defaultCommit": "c275d7f",
|
|
||||||
"runtime": "node:18",
|
|
||||||
"startCmd": "npx @google-cloud/functions-framework --target=potion-multi-dsr-watcher",
|
|
||||||
"bootEnv": "MONGODB_URI=mongodb://127.0.0.1:27017/potion_dev"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-qa",
|
|
||||||
"defaultCommit": "3920e6c",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-snapshot-testing",
|
|
||||||
"defaultCommit": "a80eb8d",
|
|
||||||
"runtime": "node:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-web",
|
|
||||||
"defaultCommit": "0a7e699",
|
|
||||||
"runtime": "node:18",
|
|
||||||
"startCmd": "npx nuxt dev --host 0.0.0.0 --port 3000",
|
|
||||||
"bootEnv": "POTION_APP_ENV=development BUGSNAG_FRONTEND_KEY=00000000000000000000000000000000 API_BASE_URL=http://localhost:4300 POTION_BASE_URL=http://localhost:4300"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-analytics",
|
|
||||||
"defaultCommit": "43a7d23",
|
|
||||||
"runtime": "node:20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-api",
|
|
||||||
"defaultCommit": "5abe18f",
|
|
||||||
"runtime": "node:20",
|
|
||||||
"startCmd": "yarn dev",
|
|
||||||
"setupCmd": "node -e 'const fs=require(\"fs\"),c=require(\"crypto\"),eol=require(\"os\").EOL;if(fs.existsSync(\".env.local\"))process.exit(0);const {privateKey}=c.generateKeyPairSync(\"rsa\",{modulusLength:2048,privateKeyEncoding:{type:\"pkcs8\",format:\"pem\"}});const sa=JSON.stringify({type:\"service_account\",project_id:\"potion-local-dev\",private_key_id:\"local-dev\",client_email:\"local-dev@potion-local-dev.iam.gserviceaccount.com\",client_id:\"000000000000000000000\",private_key:privateKey});const env={POTION_APP_ENV:\"local-dev\",POTION_BASE_URL:\"http://localhost:3000\",MONGODB_URI:\"mongodb://127.0.0.1:27017/potion_dev\",JWT_SECRET:\"local-dev-jwt-secret\",SEGMENT_WRITE_KEY:\"local-dev-segment-write-key\",GOOGLE_CLIENT_ID:\"local-dev-google-client-id\",GOOGLE_CLIENT_SECRET:\"local-dev-google-client-secret\",LINKEDIN_CLIENT_ID:\"local-dev-linkedin-client-id\",LINKEDIN_CLIENT_SECRET:\"local-dev-linkedin-client-secret\",BUGSNAG_BACKEND_KEY:\"00000000000000000000000000000000\",GOOGLE_PROJECT_POTION_WEBAPP:\"potion-local-dev\",GOOGLE_PROJECT_POTION_RESEARCH:\"potion-local-dev\",FIREBASE_CONFIG:sa,GOOGLE_APPLICATION_CREDENTIALS_POTION_WEBAPP:sa,GOOGLE_APPLICATION_CREDENTIALS_POTION_RESEARCH:sa};fs.writeFileSync(\".env.local\",Object.keys(env).map(k=>k+\"=\"+env[k]+eol).join(\"\"))'"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "MODNet-with-training",
|
|
||||||
"defaultCommit": "dace325",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "avds-cleaner",
|
|
||||||
"defaultCommit": "bd3a503",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "avspeech",
|
|
||||||
"defaultCommit": "ca0f90d",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "lambda-datadog-forwarder",
|
|
||||||
"defaultCommit": "a57ae74",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-ai",
|
|
||||||
"defaultCommit": "0e454d8",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-ai-cpu",
|
|
||||||
"defaultCommit": "ad61fa7",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-ai-gpu",
|
|
||||||
"defaultCommit": "8413d71",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-stitch",
|
|
||||||
"defaultCommit": "cfaed2f",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-tryon",
|
|
||||||
"defaultCommit": "b7da6a2",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-video-background-change",
|
|
||||||
"defaultCommit": "e6f2ea4",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-voice-dataset",
|
|
||||||
"defaultCommit": "f3d79d6",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-voice-utils",
|
|
||||||
"defaultCommit": "eadc48b",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "sentence-split-service",
|
|
||||||
"defaultCommit": "32356d2",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "urlbox-experiments",
|
|
||||||
"defaultCommit": "141fe18",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "video-synth-api",
|
|
||||||
"defaultCommit": "167fcd7",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "wav2lip-fa",
|
|
||||||
"defaultCommit": "8448ef0",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "yeahsure-tryon",
|
|
||||||
"defaultCommit": "c8dee39",
|
|
||||||
"runtime": "python:3.10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "gcp-infrastructure",
|
|
||||||
"defaultCommit": "a7dc5cc",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-ai-pretrained-models-infra",
|
|
||||||
"defaultCommit": "8a88770",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-app-infra",
|
|
||||||
"defaultCommit": "2107464",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-bastion",
|
|
||||||
"defaultCommit": "062af16",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-video-processing-devops",
|
|
||||||
"defaultCommit": "566286d",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "elasticmq-container",
|
|
||||||
"defaultCommit": "de8acb5",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "gcp-cloud-infrastructure",
|
|
||||||
"defaultCommit": "aa033c8",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-devops",
|
|
||||||
"defaultCommit": "84a4532",
|
|
||||||
"runtime": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"repo": "potion-wp-site",
|
|
||||||
"defaultCommit": "cb71e3a",
|
|
||||||
"runtime": "none"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"defaultRepo": "potion-app",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"buildSha": "f62b06f",
|
|
||||||
"packedFrom": "565c9589c46926ee3025f82d28f31be0aae007e8",
|
|
||||||
"blockedHosts": [
|
|
||||||
"sendpotion.com",
|
|
||||||
"www.sendpotion.com",
|
|
||||||
"app.sendpotion.com",
|
|
||||||
"staging.sendpotion.com",
|
|
||||||
"development.sendpotion.com",
|
|
||||||
"devleopment.sendpotion.com",
|
|
||||||
"meawww.sendpotion.com",
|
|
||||||
"blog.sendpotion.com",
|
|
||||||
"help.sendpotion.com",
|
|
||||||
"terms.sendpotion.com",
|
|
||||||
"pricing.sendpotion.com",
|
|
||||||
"videoassets.sendpotion.com",
|
|
||||||
"subtitleassets.sendpotion.com",
|
|
||||||
"audioassets.sendpotion.com",
|
|
||||||
"videoassets.staging.sendpotion.com",
|
|
||||||
"subtitleassets.staging.sendpotion.com",
|
|
||||||
"audioassets.staging.sendpotion.com"
|
|
||||||
],
|
|
||||||
"explorePorts": {
|
|
||||||
"clientHost": 4300,
|
|
||||||
"serverHost": null,
|
|
||||||
"livereloadHost": null,
|
|
||||||
"corpusHost": null,
|
|
||||||
"companionHost": null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user