@happyvertical/smrt-voice 0.60.6 → 0.60.7
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/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/smrt-knowledge.json +3 -3
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { ObjectRegistry, SmrtObject, SmrtRecipe, crossPackageRef, field, foreign
|
|
|
2
2
|
import { Content } from "@happyvertical/smrt-content";
|
|
3
3
|
import { TenantScoped, tenantId } from "@happyvertical/smrt-tenancy";
|
|
4
4
|
//#region src/__smrt-register__.ts
|
|
5
|
-
ObjectRegistry.registerPackageManifest(JSON.parse(`{"version":"1.0.0","timestamp":0,"packageName":"@happyvertical/smrt-voice","packageVersion":"0.60.6","objects":{"@happyvertical/smrt-voice:VoiceOutput":{"name":"voiceoutput","className":"VoiceOutput","qualifiedName":"@happyvertical/smrt-voice:VoiceOutput","collection":"contents","description":"Generated audio output from text-to-speech synthesis","filePath":"/home/runner/work/smrt/smrt/packages/voice/src/voice-output.ts","packageName":"@happyvertical/smrt-voice","fields":{"created_at":{"type":"datetime","required":false},"updated_at":{"type":"datetime","required":false},"tenantId":{"type":"text","required":false,"_meta":{"generated":true,"source":"tenantScoped_decorator","sqlType":"UUID","__tenancy":{"isTenantIdField":true,"mode":"optional","field":"tenantId","autoFilter":true,"autoPopulate":true,"allowSuperAdminBypass":false}}},"type":{"type":"text","required":false,"description":"What kind of piece this is, such as an article or a document.","_meta":{"description":"What kind of piece this is, such as an article or a document."}},"variant":{"type":"text","required":false},"fileKey":{"type":"text","required":false},"author":{"type":"text","required":false,"description":"Who wrote this piece.","_meta":{"description":"Who wrote this piece."}},"name":{"type":"text","required":true,"default":"","description":"A short name used to find this piece in lists.","_meta":{"required":true,"description":"A short name used to find this piece in lists."}},"title":{"type":"text","required":false,"description":"The headline readers see.","_meta":{"description":"The headline readers see."}},"description":{"type":"text","required":false,"description":"A one or two sentence summary of the piece.","_meta":{"description":"A one or two sentence summary of the piece."}},"body":{"type":"text","required":false,"description":"The full text of the piece.","_meta":{"description":"The full text of the piece."}},"bodyFormat":{"type":"text","required":false,"enum":["markdown","html"]},"publish_date":{"type":"datetime","required":false,"description":"The date the piece went out, or is due to go out.","_meta":{"description":"The date the piece went out, or is due to go out."}},"url":{"type":"text","required":false},"source":{"type":"text","required":false},"original_url":{"type":"text","required":false},"language":{"type":"text","required":false},"tags":{"type":"json","required":false,"default":[],"description":"Words that group pieces by subject.","_meta":{"description":"Words that group pieces by subject."}},"category":{"type":"text","required":false,"description":"The one section the piece belongs to, such as news or local.","_meta":{"description":"The one section the piece belongs to, such as news or local."}},"status":{"type":"text","required":false,"default":"draft","description":"Where the piece stands: draft, in review, published or archived.","_meta":{"description":"Where the piece stands: draft, in review, published or archived."},"enum":["published","draft","review","archived","deleted"]},"state":{"type":"text","required":false,"default":"active","enum":["deprecated","active","highlighted"]},"metadata":{"type":"json","required":false,"default":{}},"thumbnailAssetId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-assets:Asset"},"voiceProfileId":{"type":"foreignKey","required":false,"related":"VoiceProfile","description":"The voice that read the text.","_meta":{"description":"The voice that read the text."}},"sourceText":{"type":"text","required":false,"default":"","description":"The text that was read aloud.","_meta":{"description":"The text that was read aloud."}},"audioAssetId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-assets:Asset","description":"The audio file of the recording.","_meta":{"description":"The audio file of the recording."}},"duration":{"type":"integer","required":false,"default":0,"description":"How long the recording runs, in seconds.","_meta":{"description":"How long the recording runs, in seconds."}},"wordTimings":{"type":"json","required":false,"default":[]},"audioMetadata":{"type":"json","required":false}},"methods":{"initialize":{"name":"initialize","async":true,"parameters":[],"returnType":"Promise<this>","isStatic":false,"isPublic":true},"save":{"name":"save","async":true,"parameters":[{"name":"options","type":"SmrtSaveOptions","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"resolveGovernance":{"name":"resolveGovernance","async":true,"parameters":[],"returnType":"Promise<ResolvedContentGovernance>","isStatic":false,"isPublic":true},"loadReferences":{"name":"loadReferences","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"addReference":{"name":"addReference","async":true,"parameters":[{"name":"content","type":"Content | string","optional":false,"unionBranches":[{"type":"Content"},{"type":"string"}]},{"name":"options","type":"object","optional":true,"memberTypes":["number | null"]}],"returnType":"any","isStatic":false,"isPublic":true},"removeReference":{"name":"removeReference","async":true,"parameters":[{"name":"targetId","type":"string","optional":false}],"returnType":"any","isStatic":false,"isPublic":true},"getReferences":{"name":"getReferences","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"getReferenceEdges":{"name":"getReferenceEdges","async":true,"parameters":[],"returnType":"Promise<Array<object>>","isStatic":false,"isPublic":true},"getReferenceDrift":{"name":"getReferenceDrift","async":true,"parameters":[],"returnType":"Promise<Array<object>>","isStatic":false,"isPublic":true},"isGoverned":{"name":"isGoverned","async":false,"parameters":[],"returnType":"boolean","isStatic":false,"isPublic":true},"getFactLinks":{"name":"getFactLinks","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["FactContentRelationship"]}],"returnType":"any","isStatic":false,"isPublic":true},"getFacts":{"name":"getFacts","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["FactContentRelationship","boolean"]}],"returnType":"Promise<Fact[]>","isStatic":false,"isPublic":true},"addFact":{"name":"addFact","async":true,"parameters":[{"name":"fact","type":"Fact | string","optional":false,"unionBranches":[{"type":"Fact"},{"type":"string"}]},{"name":"relationship","type":"FactContentRelationship","optional":true},{"name":"metadata","type":"Record<string, unknown>","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"removeFact":{"name":"removeFact","async":true,"parameters":[{"name":"factId","type":"string","optional":false},{"name":"relationship","type":"FactContentRelationship","optional":true}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"syncFacts":{"name":"syncFacts","async":true,"parameters":[{"name":"factIds","type":"string[]","optional":false},{"name":"relationship","type":"FactContentRelationship","optional":true}],"returnType":"Promise<object>","isStatic":false,"isPublic":true},"browseFacts":{"name":"browseFacts","async":true,"parameters":[{"name":"query","type":"any","optional":true,"default":""},{"name":"options","type":"object","optional":true,"memberTypes":["number","boolean"]}],"returnType":"Promise<Fact[]>","isStatic":false,"isPublic":true},"repairFactAudit":{"name":"repairFactAudit","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["number","string"]}],"returnType":"any","isStatic":false,"isPublic":true},"repairFactAuditAction":{"name":"repairFactAuditAction","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["number","string"]}],"returnType":"any","isStatic":false,"isPublic":true},"repairFactEvidence":{"name":"repairFactEvidence","async":true,"parameters":[{"name":"options","type":"FactAuditResourceRepairOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"repairFactEvidenceAction":{"name":"repairFactEvidenceAction","async":true,"parameters":[{"name":"options","type":"FactAuditResourceRepairOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"recheckFactClaims":{"name":"recheckFactClaims","async":true,"parameters":[{"name":"options","type":"FactAuditClaimRecheckOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"recheckFactClaimsAction":{"name":"recheckFactClaimsAction","async":true,"parameters":[{"name":"options","type":"FactAuditClaimRecheckOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"updateFactEvidenceStatus":{"name":"updateFactEvidenceStatus","async":true,"parameters":[{"name":"options","type":"FactEvidenceStatusUpdateOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"updateFactEvidenceStatusAction":{"name":"updateFactEvidenceStatusAction","async":true,"parameters":[{"name":"options","type":"FactEvidenceStatusUpdateOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"getFactAuditState":{"name":"getFactAuditState","async":true,"parameters":[],"returnType":"Promise<FactAuditState>","isStatic":false,"isPublic":true},"getFactAuditStateAction":{"name":"getFactAuditStateAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"getFactsState":{"name":"getFactsState","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["FactContentRelationship"]}],"returnType":"any","isStatic":false,"isPublic":true},"syncFactsState":{"name":"syncFactsState","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["string[]","FactContentRelationship"]}],"returnType":"any","isStatic":false,"isPublic":true},"createVersion":{"name":"createVersion","async":true,"parameters":[{"name":"options","type":"CreateContentVersionOptions","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"getVersions":{"name":"getVersions","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"restoreFromVersion":{"name":"restoreFromVersion","async":true,"parameters":[{"name":"versionNumber","type":"number","optional":false}],"returnType":"any","isStatic":false,"isPublic":true},"getReviews":{"name":"getReviews","async":true,"parameters":[{"name":"kind","type":"any","optional":true,"typeUnresolved":true}],"returnType":"any","isStatic":false,"isPublic":true},"listReviews":{"name":"listReviews","async":true,"parameters":[{"name":"options","type":"object","optional":true,"typeUnresolved":true}],"returnType":"any","isStatic":false,"isPublic":true},"getReviewRequirements":{"name":"getReviewRequirements","async":true,"parameters":[{"name":"profileKey","type":"string","optional":false},{"name":"governance","type":"ResolvedContentGovernance","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"getGovernanceState":{"name":"getGovernanceState","async":true,"parameters":[],"returnType":"Promise<ContentGovernanceState>","isStatic":false,"isPublic":true},"getGovernanceStateAction":{"name":"getGovernanceStateAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"listReviewProfilesAction":{"name":"listReviewProfilesAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"evaluateReviewProfile":{"name":"evaluateReviewProfile","async":true,"parameters":[{"name":"profileKey","type":"string","optional":false}],"returnType":"Promise<ContentReviewProfileEvaluation>","isStatic":false,"isPublic":true},"evaluateReviewProfileAction":{"name":"evaluateReviewProfileAction","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["string"]}],"returnType":"any","isStatic":false,"isPublic":true},"isReadyForReviewProfile":{"name":"isReadyForReviewProfile","async":true,"parameters":[{"name":"profileKey","type":"string","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"getPublishedTransparency":{"name":"getPublishedTransparency","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"getPublishedTransparencyAction":{"name":"getPublishedTransparencyAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"previewTransparency":{"name":"previewTransparency","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"previewTransparencyAction":{"name":"previewTransparencyAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"runReview":{"name":"runReview","async":true,"parameters":[{"name":"options","type":"RunContentReviewOptions","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"runReviewAction":{"name":"runReviewAction","async":true,"parameters":[{"name":"options","type":"RunContentReviewOptions","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"reviewFacts":{"name":"reviewFacts","async":true,"parameters":[{"name":"options","type":"Omit<RunContentReviewOptions, 'kind'>","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"reviewSafety":{"name":"reviewSafety","async":true,"parameters":[{"name":"options","type":"Omit<RunContentReviewOptions, 'kind'>","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"getCorrections":{"name":"getCorrections","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"listCorrections":{"name":"listCorrections","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"issueCorrection":{"name":"issueCorrection","async":true,"parameters":[{"name":"options","type":"IssueContentCorrectionOptions","optional":false}],"returnType":"any","isStatic":false,"isPublic":true},"issueCorrectionAction":{"name":"issueCorrectionAction","async":true,"parameters":[{"name":"options","type":"IssueContentCorrectionOptions","optional":false}],"returnType":"any","isStatic":false,"isPublic":true},"listVersions":{"name":"listVersions","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"mutateVersionAction":{"name":"mutateVersionAction","async":true,"parameters":[{"name":"options","type":"any","optional":true,"typeUnresolved":true}],"returnType":"any","isStatic":false,"isPublic":true},"getCategorySegments":{"name":"getCategorySegments","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getParentCategory":{"name":"getParentCategory","async":false,"parameters":[],"returnType":"string | null","isStatic":false,"isPublic":true},"getRootCategory":{"name":"getRootCategory","async":false,"parameters":[],"returnType":"string | null","isStatic":false,"isPublic":true},"getAncestorPaths":{"name":"getAncestorPaths","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"isInCategory":{"name":"isInCategory","async":false,"parameters":[{"name":"categoryPath","type":"string","optional":false},{"name":"includeChildren","type":"any","optional":true}],"returnType":"boolean","isStatic":false,"isPublic":true},"getAssets":{"name":"getAssets","async":true,"parameters":[{"name":"relationship","type":"string","optional":true},{"name":"options","type":"object","optional":true,"typeUnresolved":true}],"returnType":"Promise<Asset[]>","isStatic":false,"isPublic":true},"getAssetIds":{"name":"getAssetIds","async":true,"parameters":[{"name":"relationship","type":"string","optional":true}],"returnType":"Promise<string[]>","isStatic":false,"isPublic":true},"addAsset":{"name":"addAsset","async":true,"parameters":[{"name":"asset","type":"Asset","optional":false},{"name":"relationship","type":"any","optional":true,"default":"attachment"},{"name":"sortOrder","type":"any","optional":true}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"removeAsset":{"name":"removeAsset","async":true,"parameters":[{"name":"assetId","type":"string","optional":false},{"name":"relationship","type":"string","optional":true}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"getMetadata":{"name":"getMetadata","async":false,"parameters":[],"returnType":"Record<string, unknown>","isStatic":false,"isPublic":true},"setMetadata":{"name":"setMetadata","async":false,"parameters":[{"name":"metadata","type":"Record<string, unknown> | null | undefined","optional":false,"unionBranches":[{"type":"Record<string, unknown>"},{"type":"null"},{"type":"undefined"}]}],"returnType":"void","isStatic":false,"isPublic":true},"updateMetadata":{"name":"updateMetadata","async":false,"parameters":[{"name":"patch","type":"Partial<Record<string, unknown>>","optional":false}],"returnType":"Record<string, unknown>","isStatic":false,"isPublic":true},"getThumbnail":{"name":"getThumbnail","async":true,"parameters":[],"returnType":"Promise<Image | null>","isStatic":false,"isPublic":true},"setThumbnail":{"name":"setThumbnail","async":true,"parameters":[{"name":"image","type":"Image","optional":false}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"generateThumbnail":{"name":"generateThumbnail","async":true,"parameters":[{"name":"options","type":"ThumbnailOptions","optional":false}],"returnType":"Promise<Image>","isStatic":false,"isPublic":true},"getWordAtTime":{"name":"getWordAtTime","async":false,"parameters":[{"name":"seconds","type":"number","optional":false}],"returnType":"WordTiming | null","isStatic":false,"isPublic":true},"fromSynthesizedSpeech":{"name":"fromSynthesizedSpeech","async":false,"parameters":[{"name":"options","type":"VoiceOutputFromSynthesizedSpeechOptions","optional":false}],"returnType":"VoiceOutput","isStatic":true,"isPublic":true}},"decoratorConfig":{"tableStrategy":"sti","api":{"include":["list","get","create","delete"]},"mcp":{"include":["list","get"]},"cli":true,"tenantScoped":{"mode":"optional"},"tableName":"contents"},"extends":"Content","extendsQualified":"@happyvertical/smrt-content:Content","exportName":"VoiceOutput","collectionExportName":"VoiceOutputCollection","displayLabelField":"name","validationRules":[{"field":"name","rule":"required","fieldType":"text"}],"schema":{"tableName":"contents","ddl":"CREATE TABLE IF NOT EXISTS \\"contents\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"context\\" TEXT NOT NULL DEFAULT '',\\n \\"_meta_type\\" TEXT NOT NULL,\\n \\"_meta_data\\" JSON,\\n \\"created_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"updated_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"tenant_id\\" UUID,\\n \\"type\\" TEXT,\\n \\"variant\\" TEXT,\\n \\"file_key\\" TEXT,\\n \\"author\\" TEXT,\\n \\"name\\" TEXT DEFAULT '',\\n \\"title\\" TEXT,\\n \\"description\\" TEXT,\\n \\"body\\" TEXT,\\n \\"body_format\\" TEXT,\\n \\"publish_date\\" TIMESTAMP,\\n \\"url\\" TEXT,\\n \\"source\\" TEXT,\\n \\"original_url\\" TEXT,\\n \\"language\\" TEXT,\\n \\"tags\\" JSON DEFAULT '[]',\\n \\"category\\" TEXT,\\n \\"status\\" TEXT DEFAULT 'draft',\\n \\"state\\" TEXT DEFAULT 'active',\\n \\"metadata\\" JSON DEFAULT '{}',\\n \\"thumbnail_asset_id\\" UUID,\\n \\"voice_profile_id\\" UUID,\\n \\"source_text\\" TEXT DEFAULT '',\\n \\"audio_asset_id\\" UUID,\\n \\"duration\\" INTEGER DEFAULT 0,\\n \\"word_timings\\" JSON DEFAULT '[]',\\n \\"audio_metadata\\" JSON,\\n \\"feed_source_id\\" UUID,\\n \\"source_guid\\" TEXT,\\n \\"source_name\\" TEXT,\\n \\"source_homepage_url\\" TEXT,\\n \\"external_url\\" TEXT,\\n \\"original_published_at\\" TIMESTAMP,\\n \\"dedupe_key\\" TEXT\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"context":{"type":"TEXT","notNull":true,"default":""},"_meta_type":{"type":"TEXT","notNull":true},"_meta_data":{"type":"JSON","notNull":false},"created_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"updated_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":false},"type":{"type":"TEXT","notNull":false},"variant":{"type":"TEXT","notNull":false},"file_key":{"type":"TEXT","notNull":false},"author":{"type":"TEXT","notNull":false},"name":{"type":"TEXT","notNull":false,"default":""},"title":{"type":"TEXT","notNull":false},"description":{"type":"TEXT","notNull":false},"body":{"type":"TEXT","notNull":false},"body_format":{"type":"TEXT","notNull":false},"publish_date":{"type":"TIMESTAMP","notNull":false},"url":{"type":"TEXT","notNull":false},"source":{"type":"TEXT","notNull":false},"original_url":{"type":"TEXT","notNull":false},"language":{"type":"TEXT","notNull":false},"tags":{"type":"JSON","notNull":false,"default":[]},"category":{"type":"TEXT","notNull":false},"status":{"type":"TEXT","notNull":false,"default":"draft"},"state":{"type":"TEXT","notNull":false,"default":"active"},"metadata":{"type":"JSON","notNull":false,"default":{}},"thumbnail_asset_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false},"voice_profile_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"foreignKey":{"table":"voice_profiles","column":"id","onDelete":"NO ACTION","onUpdate":"CASCADE"}},"source_text":{"type":"TEXT","notNull":false,"default":""},"audio_asset_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false},"duration":{"type":"INTEGER","notNull":false,"default":0},"word_timings":{"type":"JSON","notNull":false,"default":[]},"audio_metadata":{"type":"JSON","notNull":false},"feed_source_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false},"source_guid":{"type":"TEXT","notNull":false},"source_name":{"type":"TEXT","notNull":false},"source_homepage_url":{"type":"TEXT","notNull":false},"external_url":{"type":"TEXT","notNull":false},"original_published_at":{"type":"TIMESTAMP","notNull":false},"dedupe_key":{"type":"TEXT","notNull":false}},"indexes":[{"name":"contents_slug_context_meta_type_idx","columns":["tenant_id","slug","context","_meta_type"],"unique":true,"nullsNotDistinct":true},{"name":"contents_meta_type_idx","columns":["_meta_type"]},{"name":"contents_tenant_id_publish_date_idx","columns":["tenant_id","publish_date"]},{"name":"contents_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"contents_thumbnail_asset_id_idx","columns":["thumbnail_asset_id"]},{"name":"contents_voice_profile_id_idx","columns":["voice_profile_id"]},{"name":"contents_audio_asset_id_idx","columns":["audio_asset_id"]},{"name":"contents_feed_source_id_idx","columns":["feed_source_id"]}],"version":"ee1272af"},"importPath":"@happyvertical/smrt-voice"},"@happyvertical/smrt-voice:VoiceProfile":{"name":"voiceprofile","className":"VoiceProfile","qualifiedName":"@happyvertical/smrt-voice:VoiceProfile","collection":"voiceprofiles","description":"Voice profile for AI-powered speech synthesis","filePath":"/home/runner/work/smrt/smrt/packages/voice/src/voice-profile.ts","packageName":"@happyvertical/smrt-voice","fields":{"created_at":{"type":"datetime","required":false},"updated_at":{"type":"datetime","required":false},"tenantId":{"type":"text","required":false,"_meta":{"sqlType":"UUID","nullable":true,"__tenancy":{"isTenantIdField":true,"autoFilter":true,"required":false,"autoPopulate":true,"nullable":true,"mode":"optional","field":"tenantId","allowSuperAdminBypass":false}}},"name":{"type":"text","required":false,"default":"","description":"What you call this voice, such as \\"Warm narrator\\".","_meta":{"description":"What you call this voice, such as \\"Warm narrator\\"."}},"description":{"type":"text","required":false,"description":"A note on how the voice sounds and what you use it for.","_meta":{"description":"A note on how the voice sounds and what you use it for."}},"language":{"type":"text","required":false,"default":"en-US","description":"The language the voice speaks.","_meta":{"description":"The language the voice speaks."}},"gender":{"type":"text","required":false,"default":"neutral","description":"Whether the voice sounds male, female or neutral.","_meta":{"description":"Whether the voice sounds male, female or neutral."},"enum":["male","female","neutral"]},"designPrompt":{"type":"text","required":false,"description":"Describe the voice you want in your own words, when there is no clip to copy.","_meta":{"description":"Describe the voice you want in your own words, when there is no clip to copy."}},"sampleAssetId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-assets:Asset","description":"The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice.","_meta":{"description":"The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice."}},"voiceData":{"type":"json","required":false,"default":{}},"defaultSpeed":{"type":"decimal","required":false,"default":1},"defaultPitch":{"type":"integer","required":false,"default":0},"status":{"type":"text","required":false,"default":"pending","description":"Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it.","_meta":{"description":"Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it."},"enum":["pending","processing","ready","failed"]},"provider":{"type":"text","required":false,"default":"qwen3-tts"},"errorMessage":{"type":"text","required":false}},"methods":{"toSpeechVoice":{"name":"toSpeechVoice","async":false,"parameters":[],"returnType":"SpeechVoice","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableStrategy":"sti","api":{"include":["list","get","create","update","delete"]},"mcp":{"include":["list","get"]},"cli":{"skipApiCheck":true},"tenantScoped":{"mode":"optional"},"conflictColumns":["tenant_id","slug","context","_meta_type"]},"extends":"SmrtObject","exportName":"VoiceProfile","collectionExportName":"VoiceProfileCollection","displayLabelField":"name","schema":{"tableName":"voice_profiles","ddl":"CREATE TABLE IF NOT EXISTS \\"voice_profiles\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"context\\" TEXT NOT NULL DEFAULT '',\\n \\"_meta_type\\" TEXT NOT NULL,\\n \\"_meta_data\\" JSON,\\n \\"created_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"updated_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"tenant_id\\" UUID,\\n \\"name\\" TEXT DEFAULT '',\\n \\"description\\" TEXT,\\n \\"language\\" TEXT DEFAULT 'en-US',\\n \\"gender\\" TEXT DEFAULT 'neutral',\\n \\"design_prompt\\" TEXT,\\n \\"sample_asset_id\\" UUID,\\n \\"voice_data\\" JSON DEFAULT '{}',\\n \\"default_speed\\" REAL DEFAULT 1,\\n \\"default_pitch\\" INTEGER DEFAULT 0,\\n \\"status\\" TEXT DEFAULT 'pending',\\n \\"provider\\" TEXT DEFAULT 'qwen3-tts',\\n \\"error_message\\" TEXT\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"context":{"type":"TEXT","notNull":true,"default":""},"_meta_type":{"type":"TEXT","notNull":true},"_meta_data":{"type":"JSON","notNull":false},"created_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"updated_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":false},"name":{"type":"TEXT","notNull":false,"default":""},"description":{"type":"TEXT","notNull":false},"language":{"type":"TEXT","notNull":false,"default":"en-US"},"gender":{"type":"TEXT","notNull":false,"default":"neutral"},"design_prompt":{"type":"TEXT","notNull":false},"sample_asset_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false},"voice_data":{"type":"JSON","notNull":false,"default":{}},"default_speed":{"type":"REAL","notNull":false,"default":1},"default_pitch":{"type":"INTEGER","notNull":false,"default":0},"status":{"type":"TEXT","notNull":false,"default":"pending"},"provider":{"type":"TEXT","notNull":false,"default":"qwen3-tts"},"error_message":{"type":"TEXT","notNull":false}},"indexes":[{"name":"voice_profiles_slug_context_meta_type_idx","columns":["tenant_id","slug","context","_meta_type"],"unique":true,"nullsNotDistinct":true},{"name":"voice_profiles_meta_type_idx","columns":["_meta_type"]},{"name":"voice_profiles_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"voice_profiles_sample_asset_id_idx","columns":["sample_asset_id"]}],"version":"b3717c47"},"importPath":"@happyvertical/smrt-voice"},"@happyvertical/smrt-voice:VoiceSample":{"name":"voicesample","className":"VoiceSample","qualifiedName":"@happyvertical/smrt-voice:VoiceSample","collection":"voicesamples","description":"Audio sample for voice cloning","filePath":"/home/runner/work/smrt/smrt/packages/voice/src/voice-sample.ts","packageName":"@happyvertical/smrt-voice","fields":{"created_at":{"type":"datetime","required":false},"updated_at":{"type":"datetime","required":false},"tenantId":{"type":"text","required":false,"_meta":{"sqlType":"UUID","nullable":true,"__tenancy":{"isTenantIdField":true,"autoFilter":true,"required":false,"autoPopulate":true,"nullable":true,"mode":"optional","field":"tenantId","allowSuperAdminBypass":false}}},"voiceProfileId":{"type":"foreignKey","required":false,"related":"VoiceProfile","description":"The voice this clip belongs to.","_meta":{"description":"The voice this clip belongs to."}},"assetId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-assets:Asset","description":"The audio file of the recording.","_meta":{"description":"The audio file of the recording."}},"duration":{"type":"integer","required":false,"default":0,"description":"How long the clip runs, in seconds. At least three is needed.","_meta":{"description":"How long the clip runs, in seconds. At least three is needed."}},"transcription":{"type":"text","required":false,"description":"The words spoken in the clip, written out.","_meta":{"description":"The words spoken in the clip, written out."}},"quality":{"type":"text","required":false,"default":"medium","description":"How clean the recording is: low, medium or high. A low one cannot be used to copy a voice.","_meta":{"description":"How clean the recording is: low, medium or high. A low one cannot be used to copy a voice."},"enum":["low","medium","high"]},"sampleRate":{"type":"integer","required":false},"channels":{"type":"integer","required":false},"format":{"type":"text","required":false},"isPrimary":{"type":"boolean","required":false,"default":false,"description":"Tick the one clip that best represents the voice.","_meta":{"description":"Tick the one clip that best represents the voice."}}},"methods":{},"decoratorConfig":{"tableStrategy":"sti","api":{"include":["list","get","create","delete"]},"mcp":{"include":["list","get"]},"cli":true,"tenantScoped":{"mode":"optional"},"conflictColumns":["tenant_id","slug","context","_meta_type"]},"extends":"SmrtObject","exportName":"VoiceSample","collectionExportName":"VoiceSampleCollection","schema":{"tableName":"voice_samples","ddl":"CREATE TABLE IF NOT EXISTS \\"voice_samples\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"context\\" TEXT NOT NULL DEFAULT '',\\n \\"_meta_type\\" TEXT NOT NULL,\\n \\"_meta_data\\" JSON,\\n \\"created_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"updated_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"tenant_id\\" UUID,\\n \\"voice_profile_id\\" UUID,\\n \\"asset_id\\" UUID,\\n \\"duration\\" INTEGER DEFAULT 0,\\n \\"transcription\\" TEXT,\\n \\"quality\\" TEXT DEFAULT 'medium',\\n \\"sample_rate\\" INTEGER,\\n \\"channels\\" INTEGER,\\n \\"format\\" TEXT,\\n \\"is_primary\\" BOOLEAN DEFAULT FALSE\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"context":{"type":"TEXT","notNull":true,"default":""},"_meta_type":{"type":"TEXT","notNull":true},"_meta_data":{"type":"JSON","notNull":false},"created_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"updated_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":false},"voice_profile_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"foreignKey":{"table":"voice_profiles","column":"id","onDelete":"NO ACTION","onUpdate":"CASCADE"}},"asset_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false},"duration":{"type":"INTEGER","notNull":false,"default":0},"transcription":{"type":"TEXT","notNull":false},"quality":{"type":"TEXT","notNull":false,"default":"medium"},"sample_rate":{"type":"INTEGER","notNull":false},"channels":{"type":"INTEGER","notNull":false},"format":{"type":"TEXT","notNull":false},"is_primary":{"type":"BOOLEAN","notNull":false,"default":false}},"indexes":[{"name":"voice_samples_slug_context_meta_type_idx","columns":["tenant_id","slug","context","_meta_type"],"unique":true,"nullsNotDistinct":true},{"name":"voice_samples_meta_type_idx","columns":["_meta_type"]},{"name":"voice_samples_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"voice_samples_voice_profile_id_idx","columns":["voice_profile_id"]},{"name":"voice_samples_asset_id_idx","columns":["asset_id"]}],"version":"cbb4acc4"},"importPath":"@happyvertical/smrt-voice"}},"moduleType":"smrt","recipes":[{"id":"voice.profiles","className":"VoiceProfilesRecipe","label":"Voice","summary":"Set up the voices your app can speak in, from a description or a recorded clip, and keep the speech it generates.","synonyms":["voices","text to speech","read aloud","voice cloning","narration","speech"],"models":["@happyvertical/smrt-voice:VoiceProfile","@happyvertical/smrt-voice:VoiceSample","@happyvertical/smrt-voice:VoiceOutput"],"nav":[{"label":"Voices","model":"@happyvertical/smrt-voice:VoiceProfile","icon":"users","description":"The voices your app can speak in, described in words or copied from a clip.","noun":"voice"},{"label":"Samples","model":"@happyvertical/smrt-voice:VoiceSample","icon":"folder","description":"The recorded clips a voice is copied from.","noun":"sample"},{"label":"Generated speech","model":"@happyvertical/smrt-voice:VoiceOutput","icon":"fileText","description":"Every recording the app has read aloud, with its text.","noun":"recording"}],"requires":[],"section":{"id":"publish","label":"Publish","icon":"fileText","description":"What you write, record and put out."},"options":{"@happyvertical/smrt-voice:VoiceProfile":{"fields":{"name":{"order":1},"description":{"order":2},"language":{"order":3},"gender":{"order":4},"designPrompt":{"label":"Describe the voice","order":5},"sampleAssetId":{"label":"Sample clip","order":6},"status":{"order":7},"defaultSpeed":{"label":"Speed","visibility":"advanced"},"defaultPitch":{"label":"Pitch","visibility":"advanced"},"provider":{"label":"Speech service","visibility":"advanced"},"errorMessage":{"label":"What went wrong","visibility":"advanced"},"voiceData":{"visibility":"hidden"},"tenantId":{"visibility":"hidden"}}},"@happyvertical/smrt-voice:VoiceSample":{"fields":{"voiceProfileId":{"label":"Voice","order":1},"assetId":{"label":"Audio file","order":2},"duration":{"label":"Length in seconds","order":3},"transcription":{"label":"What is said","order":4},"quality":{"order":5},"isPrimary":{"label":"Main clip","order":6},"sampleRate":{"visibility":"advanced"},"channels":{"visibility":"advanced"},"format":{"visibility":"advanced"},"tenantId":{"visibility":"hidden"}}},"@happyvertical/smrt-voice:VoiceOutput":{"fields":{"name":{"label":"Title","order":1},"sourceText":{"label":"Text","order":2},"voiceProfileId":{"label":"Voice","order":3},"audioAssetId":{"label":"Audio file","order":4},"duration":{"label":"Length in seconds","order":5},"description":{"visibility":"advanced"},"author":{"visibility":"advanced"},"publish_date":{"label":"Date","visibility":"advanced"},"language":{"visibility":"advanced"},"wordTimings":{"visibility":"hidden"},"audioMetadata":{"visibility":"hidden"},"type":{"visibility":"hidden"},"variant":{"visibility":"hidden"},"fileKey":{"visibility":"hidden"},"body":{"visibility":"hidden"},"bodyFormat":{"visibility":"hidden"},"url":{"visibility":"hidden"},"source":{"visibility":"hidden"},"original_url":{"visibility":"hidden"},"tags":{"visibility":"hidden"},"category":{"visibility":"hidden"},"status":{"visibility":"hidden"},"state":{"visibility":"hidden"},"metadata":{"visibility":"hidden"},"thumbnailAssetId":{"visibility":"hidden"},"tenantId":{"visibility":"hidden"}}}},"help":{"markdown":"## Overview\\n\\nVoice is where you set up the voices your app can speak in and keep the speech\\nit has read aloud. A voice is either described in your own words, such as \\"a\\nwarm, unhurried narrator\\", or copied from a recorded clip of a real person. The\\nspeech service prepares the voice and shows where it stands, from waiting to\\nready. Once a voice is ready, the app can read any text aloud in it, and each\\nrecording it makes is kept here with the text it came from.\\n\\n## Tasks\\n\\n### Create a voice\\n\\n1. Open the list of voices and choose **New**.\\n2. Give the voice a **{field:VoiceProfile.name}** your team will recognise.\\n3. Pick the **{field:VoiceProfile.language}** it speaks and, if you like, the **{field:VoiceProfile.gender}** it should sound like.\\n4. Do one of the following, not both: write what you want to hear in **{field:VoiceProfile.designPrompt}**, or pick a recorded clip in **{field:VoiceProfile.sampleAssetId}** to copy a real voice.\\n5. Save. The **{field:VoiceProfile.status}** shows whether the speech service is still preparing the voice, has it ready, or could not make it. You do not set it yourself.\\n\\n### Add a sample clip\\n\\nA clip can only be used to copy a voice when it runs at least three seconds and\\nits quality is not low. One clear speaker with no background noise works best.\\n\\n1. Open the list of samples and choose **New**.\\n2. Pick the **{field:VoiceSample.voiceProfileId}** the clip is for and the **{field:VoiceSample.assetId}** holding the recording.\\n3. Enter the **{field:VoiceSample.duration}** and, if you know it, the **{field:VoiceSample.quality}** of the recording.\\n4. Write out **{field:VoiceSample.transcription}** so the words can be matched to the sound.\\n5. Tick **{field:VoiceSample.isPrimary}** on the clip that best represents the voice.\\n6. Save. To take a clip out, open it and remove it.\\n\\n### Find a recording the app has made\\n\\nRecordings are made by the speech service whenever the app reads text aloud in\\none of your voices. The sound itself always comes from the service; here you\\nfind, listen to and tidy up what it has made.\\n\\n1. Open the list of generated speech.\\n2. Look at the **{field:VoiceOutput.name}** and the **{field:VoiceOutput.voiceProfileId}** to find the one you want.\\n3. Open it to read the **{field:VoiceOutput.sourceText}** and play the **{field:VoiceOutput.audioAssetId}**; the **{field:VoiceOutput.duration}** tells you how long it runs.\\n4. To clear out a recording you no longer need, open it and remove it.\\n","fieldRefs":["VoiceOutput.audioAssetId","VoiceOutput.duration","VoiceOutput.name","VoiceOutput.sourceText","VoiceOutput.voiceProfileId","VoiceProfile.designPrompt","VoiceProfile.gender","VoiceProfile.language","VoiceProfile.name","VoiceProfile.sampleAssetId","VoiceProfile.status","VoiceSample.assetId","VoiceSample.duration","VoiceSample.isPrimary","VoiceSample.quality","VoiceSample.transcription","VoiceSample.voiceProfileId"]},"demo":{"mode":"server","reasons":["Needs a server because its package does not build for a browser: documents/spider SDK graph; CJS parse error; and its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-chat, @happyvertical/smrt-content, @happyvertical/smrt-images, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627, #3628)."]}}],"smrtDependencies":["@happyvertical/smrt-assets","@happyvertical/smrt-content","@happyvertical/smrt-core","@happyvertical/smrt-tenancy"],"browser":{"status":"server-only","issues":["#3615","#3617","#3624","#3625","#3626","#3627","#3628"],"reason":"documents/spider SDK graph; CJS parse error","via":["@happyvertical/smrt-agents","@happyvertical/smrt-chat","@happyvertical/smrt-content","@happyvertical/smrt-images","@happyvertical/smrt-jobs","@happyvertical/smrt-profiles","@happyvertical/smrt-reports","@happyvertical/smrt-secrets","@happyvertical/smrt-tenancy","@happyvertical/smrt-users"]},"stampsConstructors":true}`));
|
|
5
|
+
ObjectRegistry.registerPackageManifest(JSON.parse(`{"version":"1.0.0","timestamp":0,"packageName":"@happyvertical/smrt-voice","packageVersion":"0.60.7","objects":{"@happyvertical/smrt-voice:VoiceOutput":{"name":"voiceoutput","className":"VoiceOutput","qualifiedName":"@happyvertical/smrt-voice:VoiceOutput","collection":"contents","description":"Generated audio output from text-to-speech synthesis","filePath":"/home/runner/work/smrt/smrt/packages/voice/src/voice-output.ts","packageName":"@happyvertical/smrt-voice","fields":{"created_at":{"type":"datetime","required":false},"updated_at":{"type":"datetime","required":false},"tenantId":{"type":"text","required":false,"_meta":{"generated":true,"source":"tenantScoped_decorator","sqlType":"UUID","__tenancy":{"isTenantIdField":true,"mode":"optional","field":"tenantId","autoFilter":true,"autoPopulate":true,"allowSuperAdminBypass":false}}},"type":{"type":"text","required":false,"description":"What kind of piece this is, such as an article or a document.","_meta":{"description":"What kind of piece this is, such as an article or a document."}},"variant":{"type":"text","required":false},"fileKey":{"type":"text","required":false},"author":{"type":"text","required":false,"description":"Who wrote this piece.","_meta":{"description":"Who wrote this piece."}},"name":{"type":"text","required":true,"default":"","description":"A short name used to find this piece in lists.","_meta":{"required":true,"description":"A short name used to find this piece in lists."}},"title":{"type":"text","required":false,"description":"The headline readers see.","_meta":{"description":"The headline readers see."}},"description":{"type":"text","required":false,"description":"A one or two sentence summary of the piece.","_meta":{"description":"A one or two sentence summary of the piece."}},"body":{"type":"text","required":false,"description":"The full text of the piece.","_meta":{"description":"The full text of the piece."}},"bodyFormat":{"type":"text","required":false,"enum":["markdown","html"]},"publish_date":{"type":"datetime","required":false,"description":"The date the piece went out, or is due to go out.","_meta":{"description":"The date the piece went out, or is due to go out."}},"url":{"type":"text","required":false},"source":{"type":"text","required":false},"original_url":{"type":"text","required":false},"language":{"type":"text","required":false},"tags":{"type":"json","required":false,"default":[],"description":"Words that group pieces by subject.","_meta":{"description":"Words that group pieces by subject."}},"category":{"type":"text","required":false,"description":"The one section the piece belongs to, such as news or local.","_meta":{"description":"The one section the piece belongs to, such as news or local."}},"status":{"type":"text","required":false,"default":"draft","description":"Where the piece stands: draft, in review, published or archived.","_meta":{"description":"Where the piece stands: draft, in review, published or archived."},"enum":["published","draft","review","archived","deleted"]},"state":{"type":"text","required":false,"default":"active","enum":["deprecated","active","highlighted"]},"metadata":{"type":"json","required":false,"default":{}},"thumbnailAssetId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-assets:Asset"},"voiceProfileId":{"type":"foreignKey","required":false,"related":"VoiceProfile","description":"The voice that read the text.","_meta":{"description":"The voice that read the text."}},"sourceText":{"type":"text","required":false,"default":"","description":"The text that was read aloud.","_meta":{"description":"The text that was read aloud."}},"audioAssetId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-assets:Asset","description":"The audio file of the recording.","_meta":{"description":"The audio file of the recording."}},"duration":{"type":"integer","required":false,"default":0,"description":"How long the recording runs, in seconds.","_meta":{"description":"How long the recording runs, in seconds."}},"wordTimings":{"type":"json","required":false,"default":[]},"audioMetadata":{"type":"json","required":false}},"methods":{"initialize":{"name":"initialize","async":true,"parameters":[],"returnType":"Promise<this>","isStatic":false,"isPublic":true},"save":{"name":"save","async":true,"parameters":[{"name":"options","type":"SmrtSaveOptions","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"resolveGovernance":{"name":"resolveGovernance","async":true,"parameters":[],"returnType":"Promise<ResolvedContentGovernance>","isStatic":false,"isPublic":true},"loadReferences":{"name":"loadReferences","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"addReference":{"name":"addReference","async":true,"parameters":[{"name":"content","type":"Content | string","optional":false,"unionBranches":[{"type":"Content"},{"type":"string"}]},{"name":"options","type":"object","optional":true,"memberTypes":["number | null"]}],"returnType":"any","isStatic":false,"isPublic":true},"removeReference":{"name":"removeReference","async":true,"parameters":[{"name":"targetId","type":"string","optional":false}],"returnType":"any","isStatic":false,"isPublic":true},"getReferences":{"name":"getReferences","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"getReferenceEdges":{"name":"getReferenceEdges","async":true,"parameters":[],"returnType":"Promise<Array<object>>","isStatic":false,"isPublic":true},"getReferenceDrift":{"name":"getReferenceDrift","async":true,"parameters":[],"returnType":"Promise<Array<object>>","isStatic":false,"isPublic":true},"isGoverned":{"name":"isGoverned","async":false,"parameters":[],"returnType":"boolean","isStatic":false,"isPublic":true},"getFactLinks":{"name":"getFactLinks","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["FactContentRelationship"]}],"returnType":"any","isStatic":false,"isPublic":true},"getFacts":{"name":"getFacts","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["FactContentRelationship","boolean"]}],"returnType":"Promise<Fact[]>","isStatic":false,"isPublic":true},"addFact":{"name":"addFact","async":true,"parameters":[{"name":"fact","type":"Fact | string","optional":false,"unionBranches":[{"type":"Fact"},{"type":"string"}]},{"name":"relationship","type":"FactContentRelationship","optional":true},{"name":"metadata","type":"Record<string, unknown>","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"removeFact":{"name":"removeFact","async":true,"parameters":[{"name":"factId","type":"string","optional":false},{"name":"relationship","type":"FactContentRelationship","optional":true}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"syncFacts":{"name":"syncFacts","async":true,"parameters":[{"name":"factIds","type":"string[]","optional":false},{"name":"relationship","type":"FactContentRelationship","optional":true}],"returnType":"Promise<object>","isStatic":false,"isPublic":true},"browseFacts":{"name":"browseFacts","async":true,"parameters":[{"name":"query","type":"any","optional":true,"default":""},{"name":"options","type":"object","optional":true,"memberTypes":["number","boolean"]}],"returnType":"Promise<Fact[]>","isStatic":false,"isPublic":true},"repairFactAudit":{"name":"repairFactAudit","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["number","string"]}],"returnType":"any","isStatic":false,"isPublic":true},"repairFactAuditAction":{"name":"repairFactAuditAction","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["number","string"]}],"returnType":"any","isStatic":false,"isPublic":true},"repairFactEvidence":{"name":"repairFactEvidence","async":true,"parameters":[{"name":"options","type":"FactAuditResourceRepairOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"repairFactEvidenceAction":{"name":"repairFactEvidenceAction","async":true,"parameters":[{"name":"options","type":"FactAuditResourceRepairOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"recheckFactClaims":{"name":"recheckFactClaims","async":true,"parameters":[{"name":"options","type":"FactAuditClaimRecheckOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"recheckFactClaimsAction":{"name":"recheckFactClaimsAction","async":true,"parameters":[{"name":"options","type":"FactAuditClaimRecheckOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"updateFactEvidenceStatus":{"name":"updateFactEvidenceStatus","async":true,"parameters":[{"name":"options","type":"FactEvidenceStatusUpdateOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"updateFactEvidenceStatusAction":{"name":"updateFactEvidenceStatusAction","async":true,"parameters":[{"name":"options","type":"FactEvidenceStatusUpdateOptions","optional":true,"resolvedType":"object"}],"returnType":"any","isStatic":false,"isPublic":true},"getFactAuditState":{"name":"getFactAuditState","async":true,"parameters":[],"returnType":"Promise<FactAuditState>","isStatic":false,"isPublic":true},"getFactAuditStateAction":{"name":"getFactAuditStateAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"getFactsState":{"name":"getFactsState","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["FactContentRelationship"]}],"returnType":"any","isStatic":false,"isPublic":true},"syncFactsState":{"name":"syncFactsState","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["string[]","FactContentRelationship"]}],"returnType":"any","isStatic":false,"isPublic":true},"createVersion":{"name":"createVersion","async":true,"parameters":[{"name":"options","type":"CreateContentVersionOptions","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"getVersions":{"name":"getVersions","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"restoreFromVersion":{"name":"restoreFromVersion","async":true,"parameters":[{"name":"versionNumber","type":"number","optional":false}],"returnType":"any","isStatic":false,"isPublic":true},"getReviews":{"name":"getReviews","async":true,"parameters":[{"name":"kind","type":"any","optional":true,"typeUnresolved":true}],"returnType":"any","isStatic":false,"isPublic":true},"listReviews":{"name":"listReviews","async":true,"parameters":[{"name":"options","type":"object","optional":true,"typeUnresolved":true}],"returnType":"any","isStatic":false,"isPublic":true},"getReviewRequirements":{"name":"getReviewRequirements","async":true,"parameters":[{"name":"profileKey","type":"string","optional":false},{"name":"governance","type":"ResolvedContentGovernance","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"getGovernanceState":{"name":"getGovernanceState","async":true,"parameters":[],"returnType":"Promise<ContentGovernanceState>","isStatic":false,"isPublic":true},"getGovernanceStateAction":{"name":"getGovernanceStateAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"listReviewProfilesAction":{"name":"listReviewProfilesAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"evaluateReviewProfile":{"name":"evaluateReviewProfile","async":true,"parameters":[{"name":"profileKey","type":"string","optional":false}],"returnType":"Promise<ContentReviewProfileEvaluation>","isStatic":false,"isPublic":true},"evaluateReviewProfileAction":{"name":"evaluateReviewProfileAction","async":true,"parameters":[{"name":"options","type":"object","optional":true,"memberTypes":["string"]}],"returnType":"any","isStatic":false,"isPublic":true},"isReadyForReviewProfile":{"name":"isReadyForReviewProfile","async":true,"parameters":[{"name":"profileKey","type":"string","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"getPublishedTransparency":{"name":"getPublishedTransparency","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"getPublishedTransparencyAction":{"name":"getPublishedTransparencyAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"previewTransparency":{"name":"previewTransparency","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"previewTransparencyAction":{"name":"previewTransparencyAction","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"runReview":{"name":"runReview","async":true,"parameters":[{"name":"options","type":"RunContentReviewOptions","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"runReviewAction":{"name":"runReviewAction","async":true,"parameters":[{"name":"options","type":"RunContentReviewOptions","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"reviewFacts":{"name":"reviewFacts","async":true,"parameters":[{"name":"options","type":"Omit<RunContentReviewOptions, 'kind'>","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"reviewSafety":{"name":"reviewSafety","async":true,"parameters":[{"name":"options","type":"Omit<RunContentReviewOptions, 'kind'>","optional":true}],"returnType":"any","isStatic":false,"isPublic":true},"getCorrections":{"name":"getCorrections","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"listCorrections":{"name":"listCorrections","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"issueCorrection":{"name":"issueCorrection","async":true,"parameters":[{"name":"options","type":"IssueContentCorrectionOptions","optional":false}],"returnType":"any","isStatic":false,"isPublic":true},"issueCorrectionAction":{"name":"issueCorrectionAction","async":true,"parameters":[{"name":"options","type":"IssueContentCorrectionOptions","optional":false}],"returnType":"any","isStatic":false,"isPublic":true},"listVersions":{"name":"listVersions","async":true,"parameters":[],"returnType":"any","isStatic":false,"isPublic":true},"mutateVersionAction":{"name":"mutateVersionAction","async":true,"parameters":[{"name":"options","type":"any","optional":true,"typeUnresolved":true}],"returnType":"any","isStatic":false,"isPublic":true},"getCategorySegments":{"name":"getCategorySegments","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getParentCategory":{"name":"getParentCategory","async":false,"parameters":[],"returnType":"string | null","isStatic":false,"isPublic":true},"getRootCategory":{"name":"getRootCategory","async":false,"parameters":[],"returnType":"string | null","isStatic":false,"isPublic":true},"getAncestorPaths":{"name":"getAncestorPaths","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"isInCategory":{"name":"isInCategory","async":false,"parameters":[{"name":"categoryPath","type":"string","optional":false},{"name":"includeChildren","type":"any","optional":true}],"returnType":"boolean","isStatic":false,"isPublic":true},"getAssets":{"name":"getAssets","async":true,"parameters":[{"name":"relationship","type":"string","optional":true},{"name":"options","type":"object","optional":true,"typeUnresolved":true}],"returnType":"Promise<Asset[]>","isStatic":false,"isPublic":true},"getAssetIds":{"name":"getAssetIds","async":true,"parameters":[{"name":"relationship","type":"string","optional":true}],"returnType":"Promise<string[]>","isStatic":false,"isPublic":true},"addAsset":{"name":"addAsset","async":true,"parameters":[{"name":"asset","type":"Asset","optional":false},{"name":"relationship","type":"any","optional":true,"default":"attachment"},{"name":"sortOrder","type":"any","optional":true}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"removeAsset":{"name":"removeAsset","async":true,"parameters":[{"name":"assetId","type":"string","optional":false},{"name":"relationship","type":"string","optional":true}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"getMetadata":{"name":"getMetadata","async":false,"parameters":[],"returnType":"Record<string, unknown>","isStatic":false,"isPublic":true},"setMetadata":{"name":"setMetadata","async":false,"parameters":[{"name":"metadata","type":"Record<string, unknown> | null | undefined","optional":false,"unionBranches":[{"type":"Record<string, unknown>"},{"type":"null"},{"type":"undefined"}]}],"returnType":"void","isStatic":false,"isPublic":true},"updateMetadata":{"name":"updateMetadata","async":false,"parameters":[{"name":"patch","type":"Partial<Record<string, unknown>>","optional":false}],"returnType":"Record<string, unknown>","isStatic":false,"isPublic":true},"getThumbnail":{"name":"getThumbnail","async":true,"parameters":[],"returnType":"Promise<Image | null>","isStatic":false,"isPublic":true},"setThumbnail":{"name":"setThumbnail","async":true,"parameters":[{"name":"image","type":"Image","optional":false}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"generateThumbnail":{"name":"generateThumbnail","async":true,"parameters":[{"name":"options","type":"ThumbnailOptions","optional":false}],"returnType":"Promise<Image>","isStatic":false,"isPublic":true},"getWordAtTime":{"name":"getWordAtTime","async":false,"parameters":[{"name":"seconds","type":"number","optional":false}],"returnType":"WordTiming | null","isStatic":false,"isPublic":true},"fromSynthesizedSpeech":{"name":"fromSynthesizedSpeech","async":false,"parameters":[{"name":"options","type":"VoiceOutputFromSynthesizedSpeechOptions","optional":false}],"returnType":"VoiceOutput","isStatic":true,"isPublic":true}},"decoratorConfig":{"tableStrategy":"sti","api":{"include":["list","get","create","delete"]},"mcp":{"include":["list","get"]},"cli":true,"tenantScoped":{"mode":"optional"},"tableName":"contents"},"extends":"Content","extendsQualified":"@happyvertical/smrt-content:Content","exportName":"VoiceOutput","collectionExportName":"VoiceOutputCollection","displayLabelField":"name","validationRules":[{"field":"name","rule":"required","fieldType":"text"}],"schema":{"tableName":"contents","ddl":"CREATE TABLE IF NOT EXISTS \\"contents\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"context\\" TEXT NOT NULL DEFAULT '',\\n \\"_meta_type\\" TEXT NOT NULL,\\n \\"_meta_data\\" JSON,\\n \\"created_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"updated_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"tenant_id\\" UUID,\\n \\"type\\" TEXT,\\n \\"variant\\" TEXT,\\n \\"file_key\\" TEXT,\\n \\"author\\" TEXT,\\n \\"name\\" TEXT DEFAULT '',\\n \\"title\\" TEXT,\\n \\"description\\" TEXT,\\n \\"body\\" TEXT,\\n \\"body_format\\" TEXT,\\n \\"publish_date\\" TIMESTAMP,\\n \\"url\\" TEXT,\\n \\"source\\" TEXT,\\n \\"original_url\\" TEXT,\\n \\"language\\" TEXT,\\n \\"tags\\" JSON DEFAULT '[]',\\n \\"category\\" TEXT,\\n \\"status\\" TEXT DEFAULT 'draft',\\n \\"state\\" TEXT DEFAULT 'active',\\n \\"metadata\\" JSON DEFAULT '{}',\\n \\"thumbnail_asset_id\\" UUID,\\n \\"voice_profile_id\\" UUID,\\n \\"source_text\\" TEXT DEFAULT '',\\n \\"audio_asset_id\\" UUID,\\n \\"duration\\" INTEGER DEFAULT 0,\\n \\"word_timings\\" JSON DEFAULT '[]',\\n \\"audio_metadata\\" JSON,\\n \\"feed_source_id\\" UUID,\\n \\"source_guid\\" TEXT,\\n \\"source_name\\" TEXT,\\n \\"source_homepage_url\\" TEXT,\\n \\"external_url\\" TEXT,\\n \\"original_published_at\\" TIMESTAMP,\\n \\"dedupe_key\\" TEXT\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"context":{"type":"TEXT","notNull":true,"default":""},"_meta_type":{"type":"TEXT","notNull":true},"_meta_data":{"type":"JSON","notNull":false},"created_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"updated_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":false},"type":{"type":"TEXT","notNull":false},"variant":{"type":"TEXT","notNull":false},"file_key":{"type":"TEXT","notNull":false},"author":{"type":"TEXT","notNull":false},"name":{"type":"TEXT","notNull":false,"default":""},"title":{"type":"TEXT","notNull":false},"description":{"type":"TEXT","notNull":false},"body":{"type":"TEXT","notNull":false},"body_format":{"type":"TEXT","notNull":false},"publish_date":{"type":"TIMESTAMP","notNull":false},"url":{"type":"TEXT","notNull":false},"source":{"type":"TEXT","notNull":false},"original_url":{"type":"TEXT","notNull":false},"language":{"type":"TEXT","notNull":false},"tags":{"type":"JSON","notNull":false,"default":[]},"category":{"type":"TEXT","notNull":false},"status":{"type":"TEXT","notNull":false,"default":"draft"},"state":{"type":"TEXT","notNull":false,"default":"active"},"metadata":{"type":"JSON","notNull":false,"default":{}},"thumbnail_asset_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false},"voice_profile_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"foreignKey":{"table":"voice_profiles","column":"id","onDelete":"NO ACTION","onUpdate":"CASCADE"}},"source_text":{"type":"TEXT","notNull":false,"default":""},"audio_asset_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false},"duration":{"type":"INTEGER","notNull":false,"default":0},"word_timings":{"type":"JSON","notNull":false,"default":[]},"audio_metadata":{"type":"JSON","notNull":false},"feed_source_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false},"source_guid":{"type":"TEXT","notNull":false},"source_name":{"type":"TEXT","notNull":false},"source_homepage_url":{"type":"TEXT","notNull":false},"external_url":{"type":"TEXT","notNull":false},"original_published_at":{"type":"TIMESTAMP","notNull":false},"dedupe_key":{"type":"TEXT","notNull":false}},"indexes":[{"name":"contents_slug_context_meta_type_idx","columns":["tenant_id","slug","context","_meta_type"],"unique":true,"nullsNotDistinct":true},{"name":"contents_meta_type_idx","columns":["_meta_type"]},{"name":"contents_tenant_id_publish_date_idx","columns":["tenant_id","publish_date"]},{"name":"contents_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"contents_thumbnail_asset_id_idx","columns":["thumbnail_asset_id"]},{"name":"contents_voice_profile_id_idx","columns":["voice_profile_id"]},{"name":"contents_audio_asset_id_idx","columns":["audio_asset_id"]},{"name":"contents_feed_source_id_idx","columns":["feed_source_id"]}],"version":"ee1272af"},"importPath":"@happyvertical/smrt-voice"},"@happyvertical/smrt-voice:VoiceProfile":{"name":"voiceprofile","className":"VoiceProfile","qualifiedName":"@happyvertical/smrt-voice:VoiceProfile","collection":"voiceprofiles","description":"Voice profile for AI-powered speech synthesis","filePath":"/home/runner/work/smrt/smrt/packages/voice/src/voice-profile.ts","packageName":"@happyvertical/smrt-voice","fields":{"created_at":{"type":"datetime","required":false},"updated_at":{"type":"datetime","required":false},"tenantId":{"type":"text","required":false,"_meta":{"sqlType":"UUID","nullable":true,"__tenancy":{"isTenantIdField":true,"autoFilter":true,"required":false,"autoPopulate":true,"nullable":true,"mode":"optional","field":"tenantId","allowSuperAdminBypass":false}}},"name":{"type":"text","required":false,"default":"","description":"What you call this voice, such as \\"Warm narrator\\".","_meta":{"description":"What you call this voice, such as \\"Warm narrator\\"."}},"description":{"type":"text","required":false,"description":"A note on how the voice sounds and what you use it for.","_meta":{"description":"A note on how the voice sounds and what you use it for."}},"language":{"type":"text","required":false,"default":"en-US","description":"The language the voice speaks.","_meta":{"description":"The language the voice speaks."}},"gender":{"type":"text","required":false,"default":"neutral","description":"Whether the voice sounds male, female or neutral.","_meta":{"description":"Whether the voice sounds male, female or neutral."},"enum":["male","female","neutral"]},"designPrompt":{"type":"text","required":false,"description":"Describe the voice you want in your own words, when there is no clip to copy.","_meta":{"description":"Describe the voice you want in your own words, when there is no clip to copy."}},"sampleAssetId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-assets:Asset","description":"The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice.","_meta":{"description":"The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice."}},"voiceData":{"type":"json","required":false,"default":{}},"defaultSpeed":{"type":"decimal","required":false,"default":1},"defaultPitch":{"type":"integer","required":false,"default":0},"status":{"type":"text","required":false,"default":"pending","description":"Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it.","_meta":{"description":"Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it."},"enum":["pending","processing","ready","failed"]},"provider":{"type":"text","required":false,"default":"qwen3-tts"},"errorMessage":{"type":"text","required":false}},"methods":{"toSpeechVoice":{"name":"toSpeechVoice","async":false,"parameters":[],"returnType":"SpeechVoice","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableStrategy":"sti","api":{"include":["list","get","create","update","delete"]},"mcp":{"include":["list","get"]},"cli":{"skipApiCheck":true},"tenantScoped":{"mode":"optional"},"conflictColumns":["tenant_id","slug","context","_meta_type"]},"extends":"SmrtObject","exportName":"VoiceProfile","collectionExportName":"VoiceProfileCollection","displayLabelField":"name","schema":{"tableName":"voice_profiles","ddl":"CREATE TABLE IF NOT EXISTS \\"voice_profiles\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"context\\" TEXT NOT NULL DEFAULT '',\\n \\"_meta_type\\" TEXT NOT NULL,\\n \\"_meta_data\\" JSON,\\n \\"created_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"updated_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"tenant_id\\" UUID,\\n \\"name\\" TEXT DEFAULT '',\\n \\"description\\" TEXT,\\n \\"language\\" TEXT DEFAULT 'en-US',\\n \\"gender\\" TEXT DEFAULT 'neutral',\\n \\"design_prompt\\" TEXT,\\n \\"sample_asset_id\\" UUID,\\n \\"voice_data\\" JSON DEFAULT '{}',\\n \\"default_speed\\" REAL DEFAULT 1,\\n \\"default_pitch\\" INTEGER DEFAULT 0,\\n \\"status\\" TEXT DEFAULT 'pending',\\n \\"provider\\" TEXT DEFAULT 'qwen3-tts',\\n \\"error_message\\" TEXT\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"context":{"type":"TEXT","notNull":true,"default":""},"_meta_type":{"type":"TEXT","notNull":true},"_meta_data":{"type":"JSON","notNull":false},"created_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"updated_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":false},"name":{"type":"TEXT","notNull":false,"default":""},"description":{"type":"TEXT","notNull":false},"language":{"type":"TEXT","notNull":false,"default":"en-US"},"gender":{"type":"TEXT","notNull":false,"default":"neutral"},"design_prompt":{"type":"TEXT","notNull":false},"sample_asset_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false},"voice_data":{"type":"JSON","notNull":false,"default":{}},"default_speed":{"type":"REAL","notNull":false,"default":1},"default_pitch":{"type":"INTEGER","notNull":false,"default":0},"status":{"type":"TEXT","notNull":false,"default":"pending"},"provider":{"type":"TEXT","notNull":false,"default":"qwen3-tts"},"error_message":{"type":"TEXT","notNull":false}},"indexes":[{"name":"voice_profiles_slug_context_meta_type_idx","columns":["tenant_id","slug","context","_meta_type"],"unique":true,"nullsNotDistinct":true},{"name":"voice_profiles_meta_type_idx","columns":["_meta_type"]},{"name":"voice_profiles_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"voice_profiles_sample_asset_id_idx","columns":["sample_asset_id"]}],"version":"b3717c47"},"importPath":"@happyvertical/smrt-voice"},"@happyvertical/smrt-voice:VoiceSample":{"name":"voicesample","className":"VoiceSample","qualifiedName":"@happyvertical/smrt-voice:VoiceSample","collection":"voicesamples","description":"Audio sample for voice cloning","filePath":"/home/runner/work/smrt/smrt/packages/voice/src/voice-sample.ts","packageName":"@happyvertical/smrt-voice","fields":{"created_at":{"type":"datetime","required":false},"updated_at":{"type":"datetime","required":false},"tenantId":{"type":"text","required":false,"_meta":{"sqlType":"UUID","nullable":true,"__tenancy":{"isTenantIdField":true,"autoFilter":true,"required":false,"autoPopulate":true,"nullable":true,"mode":"optional","field":"tenantId","allowSuperAdminBypass":false}}},"voiceProfileId":{"type":"foreignKey","required":false,"related":"VoiceProfile","description":"The voice this clip belongs to.","_meta":{"description":"The voice this clip belongs to."}},"assetId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-assets:Asset","description":"The audio file of the recording.","_meta":{"description":"The audio file of the recording."}},"duration":{"type":"integer","required":false,"default":0,"description":"How long the clip runs, in seconds. At least three is needed.","_meta":{"description":"How long the clip runs, in seconds. At least three is needed."}},"transcription":{"type":"text","required":false,"description":"The words spoken in the clip, written out.","_meta":{"description":"The words spoken in the clip, written out."}},"quality":{"type":"text","required":false,"default":"medium","description":"How clean the recording is: low, medium or high. A low one cannot be used to copy a voice.","_meta":{"description":"How clean the recording is: low, medium or high. A low one cannot be used to copy a voice."},"enum":["low","medium","high"]},"sampleRate":{"type":"integer","required":false},"channels":{"type":"integer","required":false},"format":{"type":"text","required":false},"isPrimary":{"type":"boolean","required":false,"default":false,"description":"Tick the one clip that best represents the voice.","_meta":{"description":"Tick the one clip that best represents the voice."}}},"methods":{},"decoratorConfig":{"tableStrategy":"sti","api":{"include":["list","get","create","delete"]},"mcp":{"include":["list","get"]},"cli":true,"tenantScoped":{"mode":"optional"},"conflictColumns":["tenant_id","slug","context","_meta_type"]},"extends":"SmrtObject","exportName":"VoiceSample","collectionExportName":"VoiceSampleCollection","schema":{"tableName":"voice_samples","ddl":"CREATE TABLE IF NOT EXISTS \\"voice_samples\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"context\\" TEXT NOT NULL DEFAULT '',\\n \\"_meta_type\\" TEXT NOT NULL,\\n \\"_meta_data\\" JSON,\\n \\"created_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"updated_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"tenant_id\\" UUID,\\n \\"voice_profile_id\\" UUID,\\n \\"asset_id\\" UUID,\\n \\"duration\\" INTEGER DEFAULT 0,\\n \\"transcription\\" TEXT,\\n \\"quality\\" TEXT DEFAULT 'medium',\\n \\"sample_rate\\" INTEGER,\\n \\"channels\\" INTEGER,\\n \\"format\\" TEXT,\\n \\"is_primary\\" BOOLEAN DEFAULT FALSE\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"context":{"type":"TEXT","notNull":true,"default":""},"_meta_type":{"type":"TEXT","notNull":true},"_meta_data":{"type":"JSON","notNull":false},"created_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"updated_at":{"type":"TIMESTAMP","notNull":true,"default":"current_timestamp"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":false},"voice_profile_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"foreignKey":{"table":"voice_profiles","column":"id","onDelete":"NO ACTION","onUpdate":"CASCADE"}},"asset_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false},"duration":{"type":"INTEGER","notNull":false,"default":0},"transcription":{"type":"TEXT","notNull":false},"quality":{"type":"TEXT","notNull":false,"default":"medium"},"sample_rate":{"type":"INTEGER","notNull":false},"channels":{"type":"INTEGER","notNull":false},"format":{"type":"TEXT","notNull":false},"is_primary":{"type":"BOOLEAN","notNull":false,"default":false}},"indexes":[{"name":"voice_samples_slug_context_meta_type_idx","columns":["tenant_id","slug","context","_meta_type"],"unique":true,"nullsNotDistinct":true},{"name":"voice_samples_meta_type_idx","columns":["_meta_type"]},{"name":"voice_samples_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"voice_samples_voice_profile_id_idx","columns":["voice_profile_id"]},{"name":"voice_samples_asset_id_idx","columns":["asset_id"]}],"version":"cbb4acc4"},"importPath":"@happyvertical/smrt-voice"}},"moduleType":"smrt","recipes":[{"id":"voice.profiles","className":"VoiceProfilesRecipe","label":"Voice","summary":"Set up the voices your app can speak in, from a description or a recorded clip, and keep the speech it generates.","synonyms":["voices","text to speech","read aloud","voice cloning","narration","speech"],"models":["@happyvertical/smrt-voice:VoiceProfile","@happyvertical/smrt-voice:VoiceSample","@happyvertical/smrt-voice:VoiceOutput"],"nav":[{"label":"Voices","model":"@happyvertical/smrt-voice:VoiceProfile","icon":"users","description":"The voices your app can speak in, described in words or copied from a clip.","noun":"voice"},{"label":"Samples","model":"@happyvertical/smrt-voice:VoiceSample","icon":"folder","description":"The recorded clips a voice is copied from.","noun":"sample"},{"label":"Generated speech","model":"@happyvertical/smrt-voice:VoiceOutput","icon":"fileText","description":"Every recording the app has read aloud, with its text.","noun":"recording"}],"requires":[],"section":{"id":"publish","label":"Publish","icon":"fileText","description":"What you write, record and put out."},"options":{"@happyvertical/smrt-voice:VoiceProfile":{"fields":{"name":{"order":1},"description":{"order":2},"language":{"order":3},"gender":{"order":4},"designPrompt":{"label":"Describe the voice","order":5},"sampleAssetId":{"label":"Sample clip","order":6},"status":{"order":7},"defaultSpeed":{"label":"Speed","visibility":"advanced"},"defaultPitch":{"label":"Pitch","visibility":"advanced"},"provider":{"label":"Speech service","visibility":"advanced"},"errorMessage":{"label":"What went wrong","visibility":"advanced"},"voiceData":{"visibility":"hidden"},"tenantId":{"visibility":"hidden"}}},"@happyvertical/smrt-voice:VoiceSample":{"fields":{"voiceProfileId":{"label":"Voice","order":1},"assetId":{"label":"Audio file","order":2},"duration":{"label":"Length in seconds","order":3},"transcription":{"label":"What is said","order":4},"quality":{"order":5},"isPrimary":{"label":"Main clip","order":6},"sampleRate":{"visibility":"advanced"},"channels":{"visibility":"advanced"},"format":{"visibility":"advanced"},"tenantId":{"visibility":"hidden"}}},"@happyvertical/smrt-voice:VoiceOutput":{"fields":{"name":{"label":"Title","order":1},"sourceText":{"label":"Text","order":2},"voiceProfileId":{"label":"Voice","order":3},"audioAssetId":{"label":"Audio file","order":4},"duration":{"label":"Length in seconds","order":5},"description":{"visibility":"advanced"},"author":{"visibility":"advanced"},"publish_date":{"label":"Date","visibility":"advanced"},"language":{"visibility":"advanced"},"wordTimings":{"visibility":"hidden"},"audioMetadata":{"visibility":"hidden"},"type":{"visibility":"hidden"},"variant":{"visibility":"hidden"},"fileKey":{"visibility":"hidden"},"body":{"visibility":"hidden"},"bodyFormat":{"visibility":"hidden"},"url":{"visibility":"hidden"},"source":{"visibility":"hidden"},"original_url":{"visibility":"hidden"},"tags":{"visibility":"hidden"},"category":{"visibility":"hidden"},"status":{"visibility":"hidden"},"state":{"visibility":"hidden"},"metadata":{"visibility":"hidden"},"thumbnailAssetId":{"visibility":"hidden"},"tenantId":{"visibility":"hidden"}}}},"help":{"markdown":"## Overview\\n\\nVoice is where you set up the voices your app can speak in and keep the speech\\nit has read aloud. A voice is either described in your own words, such as \\"a\\nwarm, unhurried narrator\\", or copied from a recorded clip of a real person. The\\nspeech service prepares the voice and shows where it stands, from waiting to\\nready. Once a voice is ready, the app can read any text aloud in it, and each\\nrecording it makes is kept here with the text it came from.\\n\\n## Tasks\\n\\n### Create a voice\\n\\n1. Open the list of voices and choose **New**.\\n2. Give the voice a **{field:VoiceProfile.name}** your team will recognise.\\n3. Pick the **{field:VoiceProfile.language}** it speaks and, if you like, the **{field:VoiceProfile.gender}** it should sound like.\\n4. Do one of the following, not both: write what you want to hear in **{field:VoiceProfile.designPrompt}**, or pick a recorded clip in **{field:VoiceProfile.sampleAssetId}** to copy a real voice.\\n5. Save. The **{field:VoiceProfile.status}** shows whether the speech service is still preparing the voice, has it ready, or could not make it. You do not set it yourself.\\n\\n### Add a sample clip\\n\\nA clip can only be used to copy a voice when it runs at least three seconds and\\nits quality is not low. One clear speaker with no background noise works best.\\n\\n1. Open the list of samples and choose **New**.\\n2. Pick the **{field:VoiceSample.voiceProfileId}** the clip is for and the **{field:VoiceSample.assetId}** holding the recording.\\n3. Enter the **{field:VoiceSample.duration}** and, if you know it, the **{field:VoiceSample.quality}** of the recording.\\n4. Write out **{field:VoiceSample.transcription}** so the words can be matched to the sound.\\n5. Tick **{field:VoiceSample.isPrimary}** on the clip that best represents the voice.\\n6. Save. To take a clip out, open it and remove it.\\n\\n### Find a recording the app has made\\n\\nRecordings are made by the speech service whenever the app reads text aloud in\\none of your voices. The sound itself always comes from the service; here you\\nfind, listen to and tidy up what it has made.\\n\\n1. Open the list of generated speech.\\n2. Look at the **{field:VoiceOutput.name}** and the **{field:VoiceOutput.voiceProfileId}** to find the one you want.\\n3. Open it to read the **{field:VoiceOutput.sourceText}** and play the **{field:VoiceOutput.audioAssetId}**; the **{field:VoiceOutput.duration}** tells you how long it runs.\\n4. To clear out a recording you no longer need, open it and remove it.\\n","fieldRefs":["VoiceOutput.audioAssetId","VoiceOutput.duration","VoiceOutput.name","VoiceOutput.sourceText","VoiceOutput.voiceProfileId","VoiceProfile.designPrompt","VoiceProfile.gender","VoiceProfile.language","VoiceProfile.name","VoiceProfile.sampleAssetId","VoiceProfile.status","VoiceSample.assetId","VoiceSample.duration","VoiceSample.isPrimary","VoiceSample.quality","VoiceSample.transcription","VoiceSample.voiceProfileId"]},"demo":{"mode":"server","reasons":["Needs a server because its package does not build for a browser: documents/spider SDK graph; CJS parse error; and its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-chat, @happyvertical/smrt-content, @happyvertical/smrt-images, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627, #3628)."]}}],"smrtDependencies":["@happyvertical/smrt-assets","@happyvertical/smrt-content","@happyvertical/smrt-core","@happyvertical/smrt-tenancy"],"browser":{"status":"server-only","issues":["#3615","#3617","#3624","#3625","#3626","#3627","#3628"],"reason":"documents/spider SDK graph; CJS parse error","via":["@happyvertical/smrt-agents","@happyvertical/smrt-chat","@happyvertical/smrt-content","@happyvertical/smrt-images","@happyvertical/smrt-jobs","@happyvertical/smrt-profiles","@happyvertical/smrt-reports","@happyvertical/smrt-secrets","@happyvertical/smrt-tenancy","@happyvertical/smrt-users"]},"stampsConstructors":true}`));
|
|
6
6
|
//#endregion
|
|
7
7
|
//#region src/voice-profile.ts
|
|
8
8
|
var __defProp$2 = Object.defineProperty;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/__smrt-register__.ts","../src/voice-profile.ts","../src/voice-output.ts","../src/voice-sample.ts","../src/recipes.ts"],"sourcesContent":["// Generated by @happyvertical/smrt-core smrtPlugin at library build time.\n// The package manifest is inlined so self-registration cannot miss when a\n// downstream bundler relocates this module away from dist/manifest.json\n// (https://github.com/happyvertical/smrt/issues/1506,\n// https://github.com/happyvertical/smrt/issues/1507).\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n\nObjectRegistry.registerPackageManifest(JSON.parse(\"{\\\"version\\\":\\\"1.0.0\\\",\\\"timestamp\\\":0,\\\"packageName\\\":\\\"@happyvertical/smrt-voice\\\",\\\"packageVersion\\\":\\\"0.60.6\\\",\\\"objects\\\":{\\\"@happyvertical/smrt-voice:VoiceOutput\\\":{\\\"name\\\":\\\"voiceoutput\\\",\\\"className\\\":\\\"VoiceOutput\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-voice:VoiceOutput\\\",\\\"collection\\\":\\\"contents\\\",\\\"description\\\":\\\"Generated audio output from text-to-speech synthesis\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/voice/src/voice-output.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-voice\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"generated\\\":true,\\\"source\\\":\\\"tenantScoped_decorator\\\",\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"autoFilter\\\":true,\\\"autoPopulate\\\":true,\\\"allowSuperAdminBypass\\\":false}}},\\\"type\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"What kind of piece this is, such as an article or a document.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"What kind of piece this is, such as an article or a document.\\\"}},\\\"variant\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"fileKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"author\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"Who wrote this piece.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Who wrote this piece.\\\"}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"A short name used to find this piece in lists.\\\",\\\"_meta\\\":{\\\"required\\\":true,\\\"description\\\":\\\"A short name used to find this piece in lists.\\\"}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"The headline readers see.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The headline readers see.\\\"}},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"A one or two sentence summary of the piece.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"A one or two sentence summary of the piece.\\\"}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"The full text of the piece.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The full text of the piece.\\\"}},\\\"bodyFormat\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"enum\\\":[\\\"markdown\\\",\\\"html\\\"]},\\\"publish_date\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false,\\\"description\\\":\\\"The date the piece went out, or is due to go out.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The date the piece went out, or is due to go out.\\\"}},\\\"url\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"source\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"original_url\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"language\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":[],\\\"description\\\":\\\"Words that group pieces by subject.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Words that group pieces by subject.\\\"}},\\\"category\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"The one section the piece belongs to, such as news or local.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The one section the piece belongs to, such as news or local.\\\"}},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"description\\\":\\\"Where the piece stands: draft, in review, published or archived.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Where the piece stands: draft, in review, published or archived.\\\"},\\\"enum\\\":[\\\"published\\\",\\\"draft\\\",\\\"review\\\",\\\"archived\\\",\\\"deleted\\\"]},\\\"state\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"active\\\",\\\"enum\\\":[\\\"deprecated\\\",\\\"active\\\",\\\"highlighted\\\"]},\\\"metadata\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":{}},\\\"thumbnailAssetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\"},\\\"voiceProfileId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"VoiceProfile\\\",\\\"description\\\":\\\"The voice that read the text.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The voice that read the text.\\\"}},\\\"sourceText\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"The text that was read aloud.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The text that was read aloud.\\\"}},\\\"audioAssetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\",\\\"description\\\":\\\"The audio file of the recording.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The audio file of the recording.\\\"}},\\\"duration\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0,\\\"description\\\":\\\"How long the recording runs, in seconds.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"How long the recording runs, in seconds.\\\"}},\\\"wordTimings\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":[]},\\\"audioMetadata\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"initialize\\\":{\\\"name\\\":\\\"initialize\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"SmrtSaveOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"resolveGovernance\\\":{\\\"name\\\":\\\"resolveGovernance\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<ResolvedContentGovernance>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"loadReferences\\\":{\\\"name\\\":\\\"loadReferences\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"addReference\\\":{\\\"name\\\":\\\"addReference\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"content\\\",\\\"type\\\":\\\"Content | string\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"Content\\\"},{\\\"type\\\":\\\"string\\\"}]},{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"number | null\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"removeReference\\\":{\\\"name\\\":\\\"removeReference\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"targetId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReferences\\\":{\\\"name\\\":\\\"getReferences\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReferenceEdges\\\":{\\\"name\\\":\\\"getReferenceEdges\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<Array<object>>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReferenceDrift\\\":{\\\"name\\\":\\\"getReferenceDrift\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<Array<object>>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"isGoverned\\\":{\\\"name\\\":\\\"isGoverned\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFactLinks\\\":{\\\"name\\\":\\\"getFactLinks\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"FactContentRelationship\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFacts\\\":{\\\"name\\\":\\\"getFacts\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"FactContentRelationship\\\",\\\"boolean\\\"]}],\\\"returnType\\\":\\\"Promise<Fact[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"addFact\\\":{\\\"name\\\":\\\"addFact\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"fact\\\",\\\"type\\\":\\\"Fact | string\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"Fact\\\"},{\\\"type\\\":\\\"string\\\"}]},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"FactContentRelationship\\\",\\\"optional\\\":true},{\\\"name\\\":\\\"metadata\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"removeFact\\\":{\\\"name\\\":\\\"removeFact\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"factId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"FactContentRelationship\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"syncFacts\\\":{\\\"name\\\":\\\"syncFacts\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"factIds\\\",\\\"type\\\":\\\"string[]\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"FactContentRelationship\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<object>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"browseFacts\\\":{\\\"name\\\":\\\"browseFacts\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"query\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true,\\\"default\\\":\\\"\\\"},{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"number\\\",\\\"boolean\\\"]}],\\\"returnType\\\":\\\"Promise<Fact[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"repairFactAudit\\\":{\\\"name\\\":\\\"repairFactAudit\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"number\\\",\\\"string\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"repairFactAuditAction\\\":{\\\"name\\\":\\\"repairFactAuditAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"number\\\",\\\"string\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"repairFactEvidence\\\":{\\\"name\\\":\\\"repairFactEvidence\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactAuditResourceRepairOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"repairFactEvidenceAction\\\":{\\\"name\\\":\\\"repairFactEvidenceAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactAuditResourceRepairOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"recheckFactClaims\\\":{\\\"name\\\":\\\"recheckFactClaims\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactAuditClaimRecheckOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"recheckFactClaimsAction\\\":{\\\"name\\\":\\\"recheckFactClaimsAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactAuditClaimRecheckOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"updateFactEvidenceStatus\\\":{\\\"name\\\":\\\"updateFactEvidenceStatus\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactEvidenceStatusUpdateOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"updateFactEvidenceStatusAction\\\":{\\\"name\\\":\\\"updateFactEvidenceStatusAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactEvidenceStatusUpdateOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFactAuditState\\\":{\\\"name\\\":\\\"getFactAuditState\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<FactAuditState>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFactAuditStateAction\\\":{\\\"name\\\":\\\"getFactAuditStateAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFactsState\\\":{\\\"name\\\":\\\"getFactsState\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"FactContentRelationship\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"syncFactsState\\\":{\\\"name\\\":\\\"syncFactsState\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"string[]\\\",\\\"FactContentRelationship\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"createVersion\\\":{\\\"name\\\":\\\"createVersion\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"CreateContentVersionOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getVersions\\\":{\\\"name\\\":\\\"getVersions\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"restoreFromVersion\\\":{\\\"name\\\":\\\"restoreFromVersion\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"versionNumber\\\",\\\"type\\\":\\\"number\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReviews\\\":{\\\"name\\\":\\\"getReviews\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"kind\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true,\\\"typeUnresolved\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"listReviews\\\":{\\\"name\\\":\\\"listReviews\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"typeUnresolved\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReviewRequirements\\\":{\\\"name\\\":\\\"getReviewRequirements\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"profileKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"governance\\\",\\\"type\\\":\\\"ResolvedContentGovernance\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getGovernanceState\\\":{\\\"name\\\":\\\"getGovernanceState\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<ContentGovernanceState>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getGovernanceStateAction\\\":{\\\"name\\\":\\\"getGovernanceStateAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"listReviewProfilesAction\\\":{\\\"name\\\":\\\"listReviewProfilesAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"evaluateReviewProfile\\\":{\\\"name\\\":\\\"evaluateReviewProfile\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"profileKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<ContentReviewProfileEvaluation>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"evaluateReviewProfileAction\\\":{\\\"name\\\":\\\"evaluateReviewProfileAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"string\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"isReadyForReviewProfile\\\":{\\\"name\\\":\\\"isReadyForReviewProfile\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"profileKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<boolean>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getPublishedTransparency\\\":{\\\"name\\\":\\\"getPublishedTransparency\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getPublishedTransparencyAction\\\":{\\\"name\\\":\\\"getPublishedTransparencyAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"previewTransparency\\\":{\\\"name\\\":\\\"previewTransparency\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"previewTransparencyAction\\\":{\\\"name\\\":\\\"previewTransparencyAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"runReview\\\":{\\\"name\\\":\\\"runReview\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"RunContentReviewOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"runReviewAction\\\":{\\\"name\\\":\\\"runReviewAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"RunContentReviewOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"reviewFacts\\\":{\\\"name\\\":\\\"reviewFacts\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"Omit<RunContentReviewOptions, 'kind'>\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"reviewSafety\\\":{\\\"name\\\":\\\"reviewSafety\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"Omit<RunContentReviewOptions, 'kind'>\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getCorrections\\\":{\\\"name\\\":\\\"getCorrections\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"listCorrections\\\":{\\\"name\\\":\\\"listCorrections\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"issueCorrection\\\":{\\\"name\\\":\\\"issueCorrection\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"IssueContentCorrectionOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"issueCorrectionAction\\\":{\\\"name\\\":\\\"issueCorrectionAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"IssueContentCorrectionOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"listVersions\\\":{\\\"name\\\":\\\"listVersions\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"mutateVersionAction\\\":{\\\"name\\\":\\\"mutateVersionAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true,\\\"typeUnresolved\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getCategorySegments\\\":{\\\"name\\\":\\\"getCategorySegments\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getParentCategory\\\":{\\\"name\\\":\\\"getParentCategory\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getRootCategory\\\":{\\\"name\\\":\\\"getRootCategory\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getAncestorPaths\\\":{\\\"name\\\":\\\"getAncestorPaths\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"isInCategory\\\":{\\\"name\\\":\\\"isInCategory\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"categoryPath\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"includeChildren\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getAssets\\\":{\\\"name\\\":\\\"getAssets\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":true},{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"typeUnresolved\\\":true}],\\\"returnType\\\":\\\"Promise<Asset[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getAssetIds\\\":{\\\"name\\\":\\\"getAssetIds\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<string[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"addAsset\\\":{\\\"name\\\":\\\"addAsset\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"asset\\\",\\\"type\\\":\\\"Asset\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true,\\\"default\\\":\\\"attachment\\\"},{\\\"name\\\":\\\"sortOrder\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"removeAsset\\\":{\\\"name\\\":\\\"removeAsset\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"assetId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getMetadata\\\":{\\\"name\\\":\\\"getMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setMetadata\\\":{\\\"name\\\":\\\"setMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"metadata\\\",\\\"type\\\":\\\"Record<string, unknown> | null | undefined\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"Record<string, unknown>\\\"},{\\\"type\\\":\\\"null\\\"},{\\\"type\\\":\\\"undefined\\\"}]}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"updateMetadata\\\":{\\\"name\\\":\\\"updateMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"patch\\\",\\\"type\\\":\\\"Partial<Record<string, unknown>>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getThumbnail\\\":{\\\"name\\\":\\\"getThumbnail\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<Image | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setThumbnail\\\":{\\\"name\\\":\\\"setThumbnail\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"image\\\",\\\"type\\\":\\\"Image\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"generateThumbnail\\\":{\\\"name\\\":\\\"generateThumbnail\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"ThumbnailOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<Image>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getWordAtTime\\\":{\\\"name\\\":\\\"getWordAtTime\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"seconds\\\",\\\"type\\\":\\\"number\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"WordTiming | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"fromSynthesizedSpeech\\\":{\\\"name\\\":\\\"fromSynthesizedSpeech\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"VoiceOutputFromSynthesizedSpeechOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"VoiceOutput\\\",\\\"isStatic\\\":true,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":true,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"tableName\\\":\\\"contents\\\"},\\\"extends\\\":\\\"Content\\\",\\\"extendsQualified\\\":\\\"@happyvertical/smrt-content:Content\\\",\\\"exportName\\\":\\\"VoiceOutput\\\",\\\"collectionExportName\\\":\\\"VoiceOutputCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"name\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"contents\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"contents\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"type\\\\\\\" TEXT,\\\\n \\\\\\\"variant\\\\\\\" TEXT,\\\\n \\\\\\\"file_key\\\\\\\" TEXT,\\\\n \\\\\\\"author\\\\\\\" TEXT,\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"body_format\\\\\\\" TEXT,\\\\n \\\\\\\"publish_date\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"url\\\\\\\" TEXT,\\\\n \\\\\\\"source\\\\\\\" TEXT,\\\\n \\\\\\\"original_url\\\\\\\" TEXT,\\\\n \\\\\\\"language\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" JSON DEFAULT '[]',\\\\n \\\\\\\"category\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"state\\\\\\\" TEXT DEFAULT 'active',\\\\n \\\\\\\"metadata\\\\\\\" JSON DEFAULT '{}',\\\\n \\\\\\\"thumbnail_asset_id\\\\\\\" UUID,\\\\n \\\\\\\"voice_profile_id\\\\\\\" UUID,\\\\n \\\\\\\"source_text\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"audio_asset_id\\\\\\\" UUID,\\\\n \\\\\\\"duration\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"word_timings\\\\\\\" JSON DEFAULT '[]',\\\\n \\\\\\\"audio_metadata\\\\\\\" JSON,\\\\n \\\\\\\"feed_source_id\\\\\\\" UUID,\\\\n \\\\\\\"source_guid\\\\\\\" TEXT,\\\\n \\\\\\\"source_name\\\\\\\" TEXT,\\\\n \\\\\\\"source_homepage_url\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"original_published_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"dedupe_key\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"variant\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"file_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"author\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"\\\"},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body_format\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"publish_date\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false},\\\"url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"original_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"language\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"default\\\":[]},\\\"category\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"state\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"active\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"default\\\":{}},\\\"thumbnail_asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false},\\\"voice_profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"voice_profiles\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"source_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"\\\"},\\\"audio_asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false},\\\"duration\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"word_timings\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"default\\\":[]},\\\"audio_metadata\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"feed_source_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false},\\\"source_guid\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_homepage_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"original_published_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false},\\\"dedupe_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"contents_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"contents_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"contents_tenant_id_publish_date_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"publish_date\\\"]},{\\\"name\\\":\\\"contents_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"contents_thumbnail_asset_id_idx\\\",\\\"columns\\\":[\\\"thumbnail_asset_id\\\"]},{\\\"name\\\":\\\"contents_voice_profile_id_idx\\\",\\\"columns\\\":[\\\"voice_profile_id\\\"]},{\\\"name\\\":\\\"contents_audio_asset_id_idx\\\",\\\"columns\\\":[\\\"audio_asset_id\\\"]},{\\\"name\\\":\\\"contents_feed_source_id_idx\\\",\\\"columns\\\":[\\\"feed_source_id\\\"]}],\\\"version\\\":\\\"ee1272af\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-voice\\\"},\\\"@happyvertical/smrt-voice:VoiceProfile\\\":{\\\"name\\\":\\\"voiceprofile\\\",\\\"className\\\":\\\"VoiceProfile\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-voice:VoiceProfile\\\",\\\"collection\\\":\\\"voiceprofiles\\\",\\\"description\\\":\\\"Voice profile for AI-powered speech synthesis\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/voice/src/voice-profile.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-voice\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"What you call this voice, such as \\\\\\\"Warm narrator\\\\\\\".\\\",\\\"_meta\\\":{\\\"description\\\":\\\"What you call this voice, such as \\\\\\\"Warm narrator\\\\\\\".\\\"}},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"A note on how the voice sounds and what you use it for.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"A note on how the voice sounds and what you use it for.\\\"}},\\\"language\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"en-US\\\",\\\"description\\\":\\\"The language the voice speaks.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The language the voice speaks.\\\"}},\\\"gender\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"neutral\\\",\\\"description\\\":\\\"Whether the voice sounds male, female or neutral.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Whether the voice sounds male, female or neutral.\\\"},\\\"enum\\\":[\\\"male\\\",\\\"female\\\",\\\"neutral\\\"]},\\\"designPrompt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"Describe the voice you want in your own words, when there is no clip to copy.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Describe the voice you want in your own words, when there is no clip to copy.\\\"}},\\\"sampleAssetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\",\\\"description\\\":\\\"The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice.\\\"}},\\\"voiceData\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":{}},\\\"defaultSpeed\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"default\\\":1},\\\"defaultPitch\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"pending\\\",\\\"description\\\":\\\"Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it.\\\"},\\\"enum\\\":[\\\"pending\\\",\\\"processing\\\",\\\"ready\\\",\\\"failed\\\"]},\\\"provider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"qwen3-tts\\\"},\\\"errorMessage\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"toSpeechVoice\\\":{\\\"name\\\":\\\"toSpeechVoice\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"SpeechVoice\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"skipApiCheck\\\":true},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"VoiceProfile\\\",\\\"collectionExportName\\\":\\\"VoiceProfileCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"voice_profiles\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"voice_profiles\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"language\\\\\\\" TEXT DEFAULT 'en-US',\\\\n \\\\\\\"gender\\\\\\\" TEXT DEFAULT 'neutral',\\\\n \\\\\\\"design_prompt\\\\\\\" TEXT,\\\\n \\\\\\\"sample_asset_id\\\\\\\" UUID,\\\\n \\\\\\\"voice_data\\\\\\\" JSON DEFAULT '{}',\\\\n \\\\\\\"default_speed\\\\\\\" REAL DEFAULT 1,\\\\n \\\\\\\"default_pitch\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'pending',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT 'qwen3-tts',\\\\n \\\\\\\"error_message\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"\\\"},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"language\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"en-US\\\"},\\\"gender\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"neutral\\\"},\\\"design_prompt\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sample_asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false},\\\"voice_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"default\\\":{}},\\\"default_speed\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":1},\\\"default_pitch\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"pending\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"qwen3-tts\\\"},\\\"error_message\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"voice_profiles_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"voice_profiles_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"voice_profiles_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"voice_profiles_sample_asset_id_idx\\\",\\\"columns\\\":[\\\"sample_asset_id\\\"]}],\\\"version\\\":\\\"b3717c47\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-voice\\\"},\\\"@happyvertical/smrt-voice:VoiceSample\\\":{\\\"name\\\":\\\"voicesample\\\",\\\"className\\\":\\\"VoiceSample\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-voice:VoiceSample\\\",\\\"collection\\\":\\\"voicesamples\\\",\\\"description\\\":\\\"Audio sample for voice cloning\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/voice/src/voice-sample.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-voice\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"voiceProfileId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"VoiceProfile\\\",\\\"description\\\":\\\"The voice this clip belongs to.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The voice this clip belongs to.\\\"}},\\\"assetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\",\\\"description\\\":\\\"The audio file of the recording.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The audio file of the recording.\\\"}},\\\"duration\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0,\\\"description\\\":\\\"How long the clip runs, in seconds. At least three is needed.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"How long the clip runs, in seconds. At least three is needed.\\\"}},\\\"transcription\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"The words spoken in the clip, written out.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The words spoken in the clip, written out.\\\"}},\\\"quality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"medium\\\",\\\"description\\\":\\\"How clean the recording is: low, medium or high. A low one cannot be used to copy a voice.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"How clean the recording is: low, medium or high. A low one cannot be used to copy a voice.\\\"},\\\"enum\\\":[\\\"low\\\",\\\"medium\\\",\\\"high\\\"]},\\\"sampleRate\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false},\\\"channels\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false},\\\"format\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"isPrimary\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":false,\\\"description\\\":\\\"Tick the one clip that best represents the voice.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Tick the one clip that best represents the voice.\\\"}}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":true,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"VoiceSample\\\",\\\"collectionExportName\\\":\\\"VoiceSampleCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"voice_samples\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"voice_samples\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"voice_profile_id\\\\\\\" UUID,\\\\n \\\\\\\"asset_id\\\\\\\" UUID,\\\\n \\\\\\\"duration\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"transcription\\\\\\\" TEXT,\\\\n \\\\\\\"quality\\\\\\\" TEXT DEFAULT 'medium',\\\\n \\\\\\\"sample_rate\\\\\\\" INTEGER,\\\\n \\\\\\\"channels\\\\\\\" INTEGER,\\\\n \\\\\\\"format\\\\\\\" TEXT,\\\\n \\\\\\\"is_primary\\\\\\\" BOOLEAN DEFAULT FALSE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"voice_profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"voice_profiles\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false},\\\"duration\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"transcription\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"quality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"medium\\\"},\\\"sample_rate\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false},\\\"channels\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false},\\\"format\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"is_primary\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"default\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"voice_samples_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"voice_samples_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"voice_samples_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"voice_samples_voice_profile_id_idx\\\",\\\"columns\\\":[\\\"voice_profile_id\\\"]},{\\\"name\\\":\\\"voice_samples_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"cbb4acc4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-voice\\\"}},\\\"moduleType\\\":\\\"smrt\\\",\\\"recipes\\\":[{\\\"id\\\":\\\"voice.profiles\\\",\\\"className\\\":\\\"VoiceProfilesRecipe\\\",\\\"label\\\":\\\"Voice\\\",\\\"summary\\\":\\\"Set up the voices your app can speak in, from a description or a recorded clip, and keep the speech it generates.\\\",\\\"synonyms\\\":[\\\"voices\\\",\\\"text to speech\\\",\\\"read aloud\\\",\\\"voice cloning\\\",\\\"narration\\\",\\\"speech\\\"],\\\"models\\\":[\\\"@happyvertical/smrt-voice:VoiceProfile\\\",\\\"@happyvertical/smrt-voice:VoiceSample\\\",\\\"@happyvertical/smrt-voice:VoiceOutput\\\"],\\\"nav\\\":[{\\\"label\\\":\\\"Voices\\\",\\\"model\\\":\\\"@happyvertical/smrt-voice:VoiceProfile\\\",\\\"icon\\\":\\\"users\\\",\\\"description\\\":\\\"The voices your app can speak in, described in words or copied from a clip.\\\",\\\"noun\\\":\\\"voice\\\"},{\\\"label\\\":\\\"Samples\\\",\\\"model\\\":\\\"@happyvertical/smrt-voice:VoiceSample\\\",\\\"icon\\\":\\\"folder\\\",\\\"description\\\":\\\"The recorded clips a voice is copied from.\\\",\\\"noun\\\":\\\"sample\\\"},{\\\"label\\\":\\\"Generated speech\\\",\\\"model\\\":\\\"@happyvertical/smrt-voice:VoiceOutput\\\",\\\"icon\\\":\\\"fileText\\\",\\\"description\\\":\\\"Every recording the app has read aloud, with its text.\\\",\\\"noun\\\":\\\"recording\\\"}],\\\"requires\\\":[],\\\"section\\\":{\\\"id\\\":\\\"publish\\\",\\\"label\\\":\\\"Publish\\\",\\\"icon\\\":\\\"fileText\\\",\\\"description\\\":\\\"What you write, record and put out.\\\"},\\\"options\\\":{\\\"@happyvertical/smrt-voice:VoiceProfile\\\":{\\\"fields\\\":{\\\"name\\\":{\\\"order\\\":1},\\\"description\\\":{\\\"order\\\":2},\\\"language\\\":{\\\"order\\\":3},\\\"gender\\\":{\\\"order\\\":4},\\\"designPrompt\\\":{\\\"label\\\":\\\"Describe the voice\\\",\\\"order\\\":5},\\\"sampleAssetId\\\":{\\\"label\\\":\\\"Sample clip\\\",\\\"order\\\":6},\\\"status\\\":{\\\"order\\\":7},\\\"defaultSpeed\\\":{\\\"label\\\":\\\"Speed\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"defaultPitch\\\":{\\\"label\\\":\\\"Pitch\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"provider\\\":{\\\"label\\\":\\\"Speech service\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"errorMessage\\\":{\\\"label\\\":\\\"What went wrong\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"voiceData\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"tenantId\\\":{\\\"visibility\\\":\\\"hidden\\\"}}},\\\"@happyvertical/smrt-voice:VoiceSample\\\":{\\\"fields\\\":{\\\"voiceProfileId\\\":{\\\"label\\\":\\\"Voice\\\",\\\"order\\\":1},\\\"assetId\\\":{\\\"label\\\":\\\"Audio file\\\",\\\"order\\\":2},\\\"duration\\\":{\\\"label\\\":\\\"Length in seconds\\\",\\\"order\\\":3},\\\"transcription\\\":{\\\"label\\\":\\\"What is said\\\",\\\"order\\\":4},\\\"quality\\\":{\\\"order\\\":5},\\\"isPrimary\\\":{\\\"label\\\":\\\"Main clip\\\",\\\"order\\\":6},\\\"sampleRate\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"channels\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"format\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"tenantId\\\":{\\\"visibility\\\":\\\"hidden\\\"}}},\\\"@happyvertical/smrt-voice:VoiceOutput\\\":{\\\"fields\\\":{\\\"name\\\":{\\\"label\\\":\\\"Title\\\",\\\"order\\\":1},\\\"sourceText\\\":{\\\"label\\\":\\\"Text\\\",\\\"order\\\":2},\\\"voiceProfileId\\\":{\\\"label\\\":\\\"Voice\\\",\\\"order\\\":3},\\\"audioAssetId\\\":{\\\"label\\\":\\\"Audio file\\\",\\\"order\\\":4},\\\"duration\\\":{\\\"label\\\":\\\"Length in seconds\\\",\\\"order\\\":5},\\\"description\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"author\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"publish_date\\\":{\\\"label\\\":\\\"Date\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"language\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"wordTimings\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"audioMetadata\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"type\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"variant\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"fileKey\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"body\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"bodyFormat\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"url\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"source\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"original_url\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"tags\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"category\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"status\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"state\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"metadata\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"thumbnailAssetId\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"tenantId\\\":{\\\"visibility\\\":\\\"hidden\\\"}}}},\\\"help\\\":{\\\"markdown\\\":\\\"## Overview\\\\n\\\\nVoice is where you set up the voices your app can speak in and keep the speech\\\\nit has read aloud. A voice is either described in your own words, such as \\\\\\\"a\\\\nwarm, unhurried narrator\\\\\\\", or copied from a recorded clip of a real person. The\\\\nspeech service prepares the voice and shows where it stands, from waiting to\\\\nready. Once a voice is ready, the app can read any text aloud in it, and each\\\\nrecording it makes is kept here with the text it came from.\\\\n\\\\n## Tasks\\\\n\\\\n### Create a voice\\\\n\\\\n1. Open the list of voices and choose **New**.\\\\n2. Give the voice a **{field:VoiceProfile.name}** your team will recognise.\\\\n3. Pick the **{field:VoiceProfile.language}** it speaks and, if you like, the **{field:VoiceProfile.gender}** it should sound like.\\\\n4. Do one of the following, not both: write what you want to hear in **{field:VoiceProfile.designPrompt}**, or pick a recorded clip in **{field:VoiceProfile.sampleAssetId}** to copy a real voice.\\\\n5. Save. The **{field:VoiceProfile.status}** shows whether the speech service is still preparing the voice, has it ready, or could not make it. You do not set it yourself.\\\\n\\\\n### Add a sample clip\\\\n\\\\nA clip can only be used to copy a voice when it runs at least three seconds and\\\\nits quality is not low. One clear speaker with no background noise works best.\\\\n\\\\n1. Open the list of samples and choose **New**.\\\\n2. Pick the **{field:VoiceSample.voiceProfileId}** the clip is for and the **{field:VoiceSample.assetId}** holding the recording.\\\\n3. Enter the **{field:VoiceSample.duration}** and, if you know it, the **{field:VoiceSample.quality}** of the recording.\\\\n4. Write out **{field:VoiceSample.transcription}** so the words can be matched to the sound.\\\\n5. Tick **{field:VoiceSample.isPrimary}** on the clip that best represents the voice.\\\\n6. Save. To take a clip out, open it and remove it.\\\\n\\\\n### Find a recording the app has made\\\\n\\\\nRecordings are made by the speech service whenever the app reads text aloud in\\\\none of your voices. The sound itself always comes from the service; here you\\\\nfind, listen to and tidy up what it has made.\\\\n\\\\n1. Open the list of generated speech.\\\\n2. Look at the **{field:VoiceOutput.name}** and the **{field:VoiceOutput.voiceProfileId}** to find the one you want.\\\\n3. Open it to read the **{field:VoiceOutput.sourceText}** and play the **{field:VoiceOutput.audioAssetId}**; the **{field:VoiceOutput.duration}** tells you how long it runs.\\\\n4. To clear out a recording you no longer need, open it and remove it.\\\\n\\\",\\\"fieldRefs\\\":[\\\"VoiceOutput.audioAssetId\\\",\\\"VoiceOutput.duration\\\",\\\"VoiceOutput.name\\\",\\\"VoiceOutput.sourceText\\\",\\\"VoiceOutput.voiceProfileId\\\",\\\"VoiceProfile.designPrompt\\\",\\\"VoiceProfile.gender\\\",\\\"VoiceProfile.language\\\",\\\"VoiceProfile.name\\\",\\\"VoiceProfile.sampleAssetId\\\",\\\"VoiceProfile.status\\\",\\\"VoiceSample.assetId\\\",\\\"VoiceSample.duration\\\",\\\"VoiceSample.isPrimary\\\",\\\"VoiceSample.quality\\\",\\\"VoiceSample.transcription\\\",\\\"VoiceSample.voiceProfileId\\\"]},\\\"demo\\\":{\\\"mode\\\":\\\"server\\\",\\\"reasons\\\":[\\\"Needs a server because its package does not build for a browser: documents/spider SDK graph; CJS parse error; and its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-chat, @happyvertical/smrt-content, @happyvertical/smrt-images, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627, #3628).\\\"]}}],\\\"smrtDependencies\\\":[\\\"@happyvertical/smrt-assets\\\",\\\"@happyvertical/smrt-content\\\",\\\"@happyvertical/smrt-core\\\",\\\"@happyvertical/smrt-tenancy\\\"],\\\"browser\\\":{\\\"status\\\":\\\"server-only\\\",\\\"issues\\\":[\\\"#3615\\\",\\\"#3617\\\",\\\"#3624\\\",\\\"#3625\\\",\\\"#3626\\\",\\\"#3627\\\",\\\"#3628\\\"],\\\"reason\\\":\\\"documents/spider SDK graph; CJS parse error\\\",\\\"via\\\":[\\\"@happyvertical/smrt-agents\\\",\\\"@happyvertical/smrt-chat\\\",\\\"@happyvertical/smrt-content\\\",\\\"@happyvertical/smrt-images\\\",\\\"@happyvertical/smrt-jobs\\\",\\\"@happyvertical/smrt-profiles\\\",\\\"@happyvertical/smrt-reports\\\",\\\"@happyvertical/smrt-secrets\\\",\\\"@happyvertical/smrt-tenancy\\\",\\\"@happyvertical/smrt-users\\\"]},\\\"stampsConstructors\\\":true}\"));\n","/**\n * Voice Profile Model\n *\n * Manages voice profiles for AI-powered voice synthesis and cloning.\n * Supports voice design via natural language descriptions and voice\n * cloning from audio samples.\n */\n\nimport type { SmrtObjectOptions } from '@happyvertical/smrt-core';\nimport {\n crossPackageRef,\n field,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { SpeechVoice } from '@happyvertical/speech';\n\n/**\n * Voice profile status\n */\nexport type VoiceProfileStatus = 'pending' | 'processing' | 'ready' | 'failed';\n\n/**\n * Voice gender classification\n */\nexport type VoiceGender = 'male' | 'female' | 'neutral';\n\n/**\n * Voice profile creation options\n */\nexport interface VoiceProfileOptions extends SmrtObjectOptions {\n /**\n * Human-readable name for the voice profile\n */\n name?: string;\n\n /**\n * Description of the voice characteristics\n */\n description?: string | null;\n\n /**\n * ISO language code (e.g., 'en-US', 'zh-CN')\n */\n language?: string;\n\n /**\n * Voice gender classification\n * @default 'neutral'\n */\n gender?: VoiceGender;\n\n /**\n * Natural language description for voice design\n * Used when creating a voice from scratch\n */\n designPrompt?: string | null;\n\n /**\n * Asset ID of the audio sample for voice cloning\n * Should be at least 3 seconds of clear speech\n */\n sampleAssetId?: string | null;\n\n /**\n * Provider-specific voice data (ID, embedding, etc.)\n * Stored after voice creation/cloning\n */\n voiceData?: Record<string, unknown> | null;\n\n /**\n * Default speech speed multiplier\n * @default 1.0\n */\n defaultSpeed?: number;\n\n /**\n * Default pitch adjustment in semitones\n * @default 0\n */\n defaultPitch?: number;\n\n /**\n * Voice profile status\n * @default 'pending'\n */\n status?: VoiceProfileStatus;\n\n /**\n * TTS provider that created this voice\n * @default 'qwen3-tts'\n */\n provider?: string;\n\n /**\n * Error message if status is 'failed'\n */\n errorMessage?: string | null;\n\n /**\n * Tenant ID for multi-tenant isolation\n * Null for global/default voices\n */\n tenantId?: string | null;\n}\n\n/**\n * Voice profile for AI-powered speech synthesis\n *\n * VoiceProfile represents a configured voice identity that can be used\n * for text-to-speech synthesis. Voices can be created through:\n * - Voice design: Natural language description of desired voice characteristics\n * - Voice cloning: 3+ second audio sample for voice replication\n *\n * @example\n * ```typescript\n * import { VoiceProfile } from '@happyvertical/smrt-voice';\n *\n * // Create a designed voice\n * const anchorVoice = new VoiceProfile({\n * name: 'News Anchor',\n * description: 'Professional news anchor voice with clear enunciation',\n * language: 'en-US',\n * gender: 'male',\n * designPrompt: 'Warm, authoritative male voice with slight gravitas, suitable for news broadcasts',\n * provider: 'qwen3-tts',\n * });\n *\n * // Create a cloned voice\n * const clonedVoice = new VoiceProfile({\n * name: 'Custom Voice',\n * description: 'Cloned from user sample',\n * language: 'en-US',\n * sampleAssetId: 'asset-123',\n * provider: 'qwen3-tts',\n * });\n * ```\n */\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableStrategy: 'sti',\n api: {\n include: ['list', 'get', 'create', 'update', 'delete'],\n },\n mcp: {\n include: ['list', 'get'],\n },\n cli: { skipApiCheck: true },\n})\nexport class VoiceProfile extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-voice\";\n /**\n * Tenant ID for multi-tenant isolation\n * Nullable to support global/default voices\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Human-readable name for the voice profile\n */\n @field({ description: 'What you call this voice, such as \"Warm narrator\".' })\n name: string = '';\n\n /**\n * Description of the voice characteristics\n */\n @field({\n description: 'A note on how the voice sounds and what you use it for.',\n })\n description: string | null = null;\n\n /**\n * ISO language code (e.g., 'en-US', 'zh-CN')\n */\n @field({ description: 'The language the voice speaks.' })\n language: string = 'en-US';\n\n /**\n * Voice gender classification\n */\n @field({ description: 'Whether the voice sounds male, female or neutral.' })\n gender: VoiceGender = 'neutral';\n\n /**\n * Natural language description for voice design\n * Used when creating a voice from scratch via AI\n */\n @field({\n description:\n 'Describe the voice you want in your own words, when there is no clip to copy.',\n })\n designPrompt: string | null = null;\n\n /**\n * Asset ID of the audio sample for voice cloning\n * Should be at least 3 seconds of clear speech\n */\n @field({\n description:\n 'The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice.',\n })\n @crossPackageRef('@happyvertical/smrt-assets:Asset')\n sampleAssetId: string | null = null;\n\n /**\n * Provider-specific voice data (ID, embedding, etc.)\n * Stored after voice creation/cloning is complete\n */\n voiceData: Record<string, unknown> | null = null;\n\n /**\n * Default speech speed multiplier (0.5 - 2.0)\n * 1.0 = normal speed\n */\n defaultSpeed: number = 1.0;\n\n /**\n * Default pitch adjustment in semitones (-20 to 20)\n * 0 = no adjustment\n */\n defaultPitch: number = 0;\n\n /**\n * Voice profile status\n * - pending: Profile created but voice not yet generated\n * - processing: Voice generation/cloning in progress\n * - ready: Voice is ready for use\n * - failed: Voice generation failed\n */\n @field({\n description:\n 'Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it.',\n })\n status: VoiceProfileStatus = 'pending';\n\n /**\n * TTS provider that created/manages this voice\n */\n provider: string = 'qwen3-tts';\n\n /**\n * Error message if status is 'failed'\n */\n errorMessage: string | null = null;\n\n constructor(options: VoiceProfileOptions = {}) {\n super(options);\n\n if (options.name !== undefined) this.name = options.name;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.language !== undefined) this.language = options.language;\n if (options.gender !== undefined) this.gender = options.gender;\n if (options.designPrompt !== undefined)\n this.designPrompt = options.designPrompt;\n if (options.sampleAssetId !== undefined)\n this.sampleAssetId = options.sampleAssetId;\n if (options.voiceData !== undefined) this.voiceData = options.voiceData;\n if (options.defaultSpeed !== undefined)\n this.defaultSpeed = options.defaultSpeed;\n if (options.defaultPitch !== undefined)\n this.defaultPitch = options.defaultPitch;\n if (options.status !== undefined) this.status = options.status;\n if (options.provider !== undefined) this.provider = options.provider;\n if (options.errorMessage !== undefined)\n this.errorMessage = options.errorMessage;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * Check if this voice profile uses voice cloning\n */\n get isCloned(): boolean {\n return this.sampleAssetId !== null;\n }\n\n /**\n * Check if this voice profile uses voice design\n */\n get isDesigned(): boolean {\n return this.designPrompt !== null && !this.isCloned;\n }\n\n /**\n * Check if the voice is ready for use\n */\n get isReady(): boolean {\n return this.status === 'ready';\n }\n\n /**\n * Check if this is a global (default) voice\n */\n get isGlobal(): boolean {\n return this.tenantId === null;\n }\n\n /**\n * Convert this persisted profile into the runtime voice shape consumed by\n * @happyvertical/speech adapters.\n */\n toSpeechVoice(): SpeechVoice {\n const voiceData = isRecord(this.voiceData) ? this.voiceData : {};\n const prompt =\n stringValue(voiceData.prompt) ?? stringValue(voiceData.voicePrompt);\n const speakerId =\n stringValue(voiceData.speakerId) ??\n stringValue(voiceData.speaker) ??\n stringValue(voiceData.providerVoiceId);\n\n return {\n id:\n stringValue(voiceData.id) ??\n stringValue(voiceData.voiceId) ??\n stringValue(this.id),\n name: this.name || undefined,\n language: this.language || undefined,\n speakerId,\n prompt,\n metadata: {\n ...voiceData,\n provider: this.provider,\n defaultSpeed: this.defaultSpeed,\n defaultPitch: this.defaultPitch,\n },\n };\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n","/**\n * Voice Output Model\n *\n * Represents generated audio output from text-to-speech synthesis.\n * Extends Content to leverage content management features.\n */\n\nimport { Content, type ContentOptions } from '@happyvertical/smrt-content';\nimport {\n crossPackageRef,\n field,\n foreignKey,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped } from '@happyvertical/smrt-tenancy';\nimport type {\n WordTiming as SpeechWordTiming,\n SynthesizedSpeech,\n} from '@happyvertical/speech';\nimport { VoiceProfile } from './voice-profile.js';\n\n/**\n * Word timing information for lip-sync alignment\n */\nexport interface WordTiming {\n /**\n * The word\n */\n word: string;\n\n /**\n * Start time in seconds\n */\n start: number;\n\n /**\n * End time in seconds\n */\n end: number;\n\n /**\n * Provider confidence score, when available\n */\n confidence?: number;\n\n /**\n * Speaker identifier, when diarization is available\n */\n speakerId?: string;\n}\n\n/**\n * Voice output metadata\n */\nexport interface VoiceOutputMetadata {\n /**\n * Sample rate in Hz\n */\n sampleRate?: number;\n\n /**\n * Audio format (e.g., 'wav', 'mp3', 'ogg')\n */\n format?: string;\n\n /**\n * MIME type returned by the speech provider\n */\n contentType?: string;\n\n /**\n * Number of audio channels\n */\n channels?: number;\n\n /**\n * Bit depth (e.g., 16, 24, 32)\n */\n bitDepth?: number;\n\n /**\n * File size in bytes\n */\n fileSize?: number;\n\n /**\n * TTS provider used\n */\n provider?: string;\n\n /**\n * Model used for synthesis\n */\n model?: string;\n\n /**\n * Speech speed used (1.0 = normal)\n */\n speed?: number;\n\n /**\n * Pitch adjustment used (semitones)\n */\n pitch?: number;\n}\n\n/**\n * Voice output creation options\n */\nexport interface VoiceOutputOptions extends ContentOptions {\n /**\n * Voice profile used for synthesis\n */\n voiceProfileId?: string | null;\n\n /**\n * Original text that was synthesized\n */\n sourceText?: string;\n\n /**\n * Asset ID of the generated audio file\n */\n audioAssetId?: string | null;\n\n /**\n * Duration of the generated audio in seconds\n */\n duration?: number;\n\n /**\n * Word-level timing information for lip-sync\n */\n wordTimings?: WordTiming[] | null;\n\n /**\n * Audio metadata\n */\n audioMetadata?: VoiceOutputMetadata;\n}\n\n/**\n * Create a VoiceOutput from a runtime @happyvertical/speech synthesis result.\n */\nexport interface VoiceOutputFromSynthesizedSpeechOptions\n extends VoiceOutputOptions {\n /**\n * Runtime synthesis result from @happyvertical/speech.\n */\n speech: SynthesizedSpeech;\n}\n\n/**\n * Generated audio output from text-to-speech synthesis\n *\n * VoiceOutput extends Content to represent audio generated from\n * text using a VoiceProfile. It includes word-level timing information\n * for lip-sync alignment in video production.\n *\n * @example\n * ```typescript\n * import { VoiceOutput } from '@happyvertical/smrt-voice';\n *\n * const output = new VoiceOutput({\n * voiceProfileId: 'voice-123',\n * sourceText: 'Welcome to the evening news broadcast.',\n * audioAssetId: 'asset-789',\n * duration: 3.5,\n * wordTimings: [\n * { word: 'Welcome', start: 0.0, end: 0.4 },\n * { word: 'to', start: 0.4, end: 0.5 },\n * { word: 'the', start: 0.5, end: 0.6 },\n * { word: 'evening', start: 0.6, end: 1.0 },\n * { word: 'news', start: 1.0, end: 1.3 },\n * { word: 'broadcast', start: 1.3, end: 1.9 },\n * ],\n * audioMetadata: {\n * sampleRate: 48000,\n * format: 'wav',\n * channels: 1,\n * provider: 'qwen3-tts',\n * },\n * });\n * ```\n */\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableStrategy: 'sti',\n api: {\n include: ['list', 'get', 'create', 'delete'],\n },\n mcp: {\n include: ['list', 'get'],\n },\n cli: true,\n})\nexport class VoiceOutput extends Content { static __smrtPackage__ = \"@happyvertical/smrt-voice\";\n /**\n * Voice profile used for synthesis\n */\n @field({ description: 'The voice that read the text.' })\n @foreignKey(() => VoiceProfile)\n voiceProfileId: string | null = null;\n\n /**\n * Original text that was synthesized\n */\n @field({ description: 'The text that was read aloud.' })\n sourceText: string = '';\n\n /**\n * Asset ID of the generated audio file\n */\n @field({ description: 'The audio file of the recording.' })\n @crossPackageRef('@happyvertical/smrt-assets:Asset')\n audioAssetId: string | null = null;\n\n /**\n * Duration of the generated audio in seconds\n */\n @field({ description: 'How long the recording runs, in seconds.' })\n duration: number = 0;\n\n /**\n * Word-level timing information for lip-sync alignment\n */\n wordTimings: WordTiming[] | null = null;\n\n /**\n * Audio metadata (sample rate, format, etc.)\n */\n audioMetadata: VoiceOutputMetadata = {};\n\n constructor(options: VoiceOutputOptions = {}) {\n super({\n ...options,\n type: 'voice-output',\n });\n\n if (options.voiceProfileId !== undefined)\n this.voiceProfileId = options.voiceProfileId;\n if (options.sourceText !== undefined) this.sourceText = options.sourceText;\n if (options.audioAssetId !== undefined)\n this.audioAssetId = options.audioAssetId;\n if (options.duration !== undefined) this.duration = options.duration;\n if (options.wordTimings !== undefined)\n this.wordTimings = options.wordTimings;\n if (options.audioMetadata !== undefined)\n this.audioMetadata = options.audioMetadata;\n }\n\n /**\n * Get the word count of the source text\n */\n get wordCount(): number {\n return this.sourceText.split(/\\s+/).filter(Boolean).length;\n }\n\n /**\n * Get the average words per second rate\n */\n get wordsPerSecond(): number {\n if (this.duration === 0) return 0;\n return this.wordCount / this.duration;\n }\n\n /**\n * Check if word timing data is available for lip-sync\n */\n get hasWordTimings(): boolean {\n return this.wordTimings !== null && this.wordTimings.length > 0;\n }\n\n /**\n * Get the word at a specific timestamp\n */\n getWordAtTime(seconds: number): WordTiming | null {\n if (!this.wordTimings) return null;\n return (\n this.wordTimings.find((wt) => seconds >= wt.start && seconds < wt.end) ??\n null\n );\n }\n\n /**\n * Build a persisted output model from a provider-neutral speech result.\n *\n * The binary audio remains in the caller-owned asset pipeline; this helper\n * only normalizes metadata and timing fields onto the SMRT model.\n */\n static fromSynthesizedSpeech(\n options: VoiceOutputFromSynthesizedSpeechOptions,\n ): VoiceOutput {\n const { speech, audioMetadata, duration, wordTimings, ...rest } = options;\n return new VoiceOutput({\n ...rest,\n duration: duration ?? speech.durationSeconds ?? 0,\n wordTimings: wordTimings ?? wordTimingsFromSpeech(speech.words),\n audioMetadata: {\n ...metadataFromSynthesizedSpeech(speech),\n ...audioMetadata,\n },\n });\n }\n}\n\nexport function wordTimingsFromSpeech(\n words: readonly SpeechWordTiming[] | null | undefined,\n): WordTiming[] | null {\n if (!words || words.length === 0) {\n return null;\n }\n return words.map((word) => ({\n word: word.word,\n start: word.startSeconds,\n end: word.endSeconds,\n confidence: word.confidence,\n speakerId: word.speakerId,\n }));\n}\n\nexport function metadataFromSynthesizedSpeech(\n speech: SynthesizedSpeech,\n): VoiceOutputMetadata {\n return {\n sampleRate: speech.sampleRate,\n format: speech.format ?? formatFromContentType(speech.contentType),\n contentType: speech.contentType,\n channels: speech.channels,\n fileSize: speech.audio.byteLength,\n provider: speech.provider,\n model: speech.model,\n };\n}\n\nfunction formatFromContentType(contentType: string): string | undefined {\n const normalized = contentType.split(';', 1)[0]?.trim().toLowerCase();\n if (!normalized?.startsWith('audio/')) {\n return undefined;\n }\n return normalized.slice('audio/'.length);\n}\n","/**\n * Voice Sample Model\n *\n * Manages audio samples used for voice cloning.\n * Samples should be at least 3 seconds of clear speech.\n */\n\nimport type { SmrtObjectOptions } from '@happyvertical/smrt-core';\nimport {\n crossPackageRef,\n field,\n foreignKey,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport { VoiceProfile } from './voice-profile.js';\n\n/**\n * Audio sample quality rating\n */\nexport type SampleQuality = 'low' | 'medium' | 'high';\n\n/**\n * Voice sample creation options\n */\nexport interface VoiceSampleOptions extends SmrtObjectOptions {\n /**\n * Voice profile this sample belongs to\n */\n voiceProfileId?: string | null;\n\n /**\n * Asset ID of the audio file\n */\n assetId?: string | null;\n\n /**\n * Sample duration in seconds\n */\n duration?: number;\n\n /**\n * Transcription of what was said in the sample\n */\n transcription?: string | null;\n\n /**\n * Quality rating based on audio analysis\n * @default 'medium'\n */\n quality?: SampleQuality;\n\n /**\n * Sample rate in Hz (e.g., 44100, 48000)\n */\n sampleRate?: number | null;\n\n /**\n * Number of audio channels (1 = mono, 2 = stereo)\n */\n channels?: number | null;\n\n /**\n * Audio format (e.g., 'wav', 'mp3', 'ogg')\n */\n format?: string | null;\n\n /**\n * Whether this is the primary sample for the voice profile\n * @default false\n */\n isPrimary?: boolean;\n\n /**\n * Tenant ID for multi-tenant isolation\n */\n tenantId?: string | null;\n}\n\n/**\n * Audio sample for voice cloning\n *\n * VoiceSample represents an audio recording used as source material\n * for voice cloning. For best results, samples should be:\n * - At least 3 seconds long\n * - Clear speech without background noise\n * - Single speaker only\n * - High quality (44.1kHz or higher)\n *\n * Multiple samples can be associated with a single VoiceProfile\n * to improve voice cloning quality.\n *\n * @example\n * ```typescript\n * import { VoiceSample } from '@happyvertical/smrt-voice';\n *\n * const sample = new VoiceSample({\n * voiceProfileId: 'voice-123',\n * assetId: 'asset-456',\n * duration: 5.2,\n * transcription: 'Hello, this is a test recording for voice cloning.',\n * quality: 'high',\n * sampleRate: 48000,\n * channels: 1,\n * format: 'wav',\n * isPrimary: true,\n * });\n * ```\n */\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableStrategy: 'sti',\n api: {\n include: ['list', 'get', 'create', 'delete'],\n },\n mcp: {\n include: ['list', 'get'],\n },\n cli: true,\n})\nexport class VoiceSample extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-voice\";\n /**\n * Tenant ID for multi-tenant isolation\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Voice profile this sample belongs to\n */\n @field({ description: 'The voice this clip belongs to.' })\n @foreignKey(() => VoiceProfile)\n voiceProfileId: string | null = null;\n\n /**\n * Asset ID of the audio file\n * References an Asset in smrt-assets\n */\n @field({ description: 'The audio file of the recording.' })\n @crossPackageRef('@happyvertical/smrt-assets:Asset')\n assetId: string | null = null;\n\n /**\n * Sample duration in seconds\n */\n @field({\n description:\n 'How long the clip runs, in seconds. At least three is needed.',\n })\n duration: number = 0;\n\n /**\n * Transcription of what was said in the sample\n * Used for alignment and quality verification\n */\n @field({ description: 'The words spoken in the clip, written out.' })\n transcription: string | null = null;\n\n /**\n * Quality rating based on audio analysis\n * - low: Noisy or short samples\n * - medium: Acceptable quality\n * - high: Clear audio, good length\n */\n @field({\n description:\n 'How clean the recording is: low, medium or high. A low one cannot be used to copy a voice.',\n })\n quality: SampleQuality = 'medium';\n\n /**\n * Sample rate in Hz\n */\n sampleRate: number | null = null;\n\n /**\n * Number of audio channels\n */\n channels: number | null = null;\n\n /**\n * Audio format\n */\n format: string | null = null;\n\n /**\n * Whether this is the primary sample for the voice profile\n */\n @field({ description: 'Tick the one clip that best represents the voice.' })\n isPrimary: boolean = false;\n\n constructor(options: VoiceSampleOptions = {}) {\n super(options);\n\n if (options.voiceProfileId !== undefined)\n this.voiceProfileId = options.voiceProfileId;\n if (options.assetId !== undefined) this.assetId = options.assetId;\n if (options.duration !== undefined) this.duration = options.duration;\n if (options.transcription !== undefined)\n this.transcription = options.transcription;\n if (options.quality !== undefined) this.quality = options.quality;\n if (options.sampleRate !== undefined) this.sampleRate = options.sampleRate;\n if (options.channels !== undefined) this.channels = options.channels;\n if (options.format !== undefined) this.format = options.format;\n if (options.isPrimary !== undefined) this.isPrimary = options.isPrimary;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * Check if sample meets minimum duration requirement (3 seconds)\n */\n get meetsMinDuration(): boolean {\n return this.duration >= 3;\n }\n\n /**\n * Check if sample is high quality and suitable for cloning\n */\n get isSuitableForCloning(): boolean {\n return this.meetsMinDuration && this.quality !== 'low';\n }\n}\n","/**\n * Declared recipes for smrt-voice (#4409, #4437): user-facing units of\n * functionality an app or agent can pick instead of the whole package.\n * The scanner reads these statics into the `recipes` array of `manifest.json`\n * and `smrt-knowledge.json`; nothing here runs at that point.\n *\n * @packageDocumentation\n */\n\nimport { SmrtRecipe } from '@happyvertical/smrt-core';\nimport { VoiceOutput } from './voice-output.js';\nimport { VoiceProfile } from './voice-profile.js';\nimport { VoiceSample } from './voice-sample.js';\n\n/** Voice: the voices your app can speak in, and the speech it has generated. */\nexport class VoiceProfilesRecipe extends SmrtRecipe {\n static id = 'voice.profiles';\n static help = './profiles.recipe.md';\n static label = 'Voice';\n static summary =\n 'Set up the voices your app can speak in, from a description or a recorded clip, and keep the speech it generates.';\n static synonyms = [\n 'voices',\n 'text to speech',\n 'read aloud',\n 'voice cloning',\n 'narration',\n 'speech',\n ];\n static section = {\n id: 'publish',\n label: 'Publish',\n icon: 'fileText',\n description: 'What you write, record and put out.',\n };\n static models = [VoiceProfile, VoiceSample, VoiceOutput];\n static nav = [\n {\n label: 'Voices',\n model: VoiceProfile,\n icon: 'users',\n description:\n 'The voices your app can speak in, described in words or copied from a clip.',\n noun: 'voice',\n },\n {\n label: 'Samples',\n model: VoiceSample,\n icon: 'folder',\n description: 'The recorded clips a voice is copied from.',\n noun: 'sample',\n },\n {\n label: 'Generated speech',\n model: VoiceOutput,\n icon: 'fileText',\n description: 'Every recording the app has read aloud, with its text.',\n noun: 'recording',\n },\n ];\n static options = {\n VoiceProfile: {\n fields: {\n name: { order: 1 },\n description: { order: 2 },\n language: { order: 3 },\n gender: { order: 4 },\n designPrompt: { label: 'Describe the voice', order: 5 },\n sampleAssetId: { label: 'Sample clip', order: 6 },\n status: { order: 7 },\n defaultSpeed: { label: 'Speed', visibility: 'advanced' },\n defaultPitch: { label: 'Pitch', visibility: 'advanced' },\n provider: { label: 'Speech service', visibility: 'advanced' },\n errorMessage: { label: 'What went wrong', visibility: 'advanced' },\n voiceData: { visibility: 'hidden' },\n tenantId: { visibility: 'hidden' },\n },\n },\n VoiceSample: {\n fields: {\n voiceProfileId: { label: 'Voice', order: 1 },\n assetId: { label: 'Audio file', order: 2 },\n duration: { label: 'Length in seconds', order: 3 },\n transcription: { label: 'What is said', order: 4 },\n quality: { order: 5 },\n isPrimary: { label: 'Main clip', order: 6 },\n sampleRate: { visibility: 'advanced' },\n channels: { visibility: 'advanced' },\n format: { visibility: 'advanced' },\n tenantId: { visibility: 'hidden' },\n },\n },\n VoiceOutput: {\n fields: {\n name: { label: 'Title', order: 1 },\n sourceText: { label: 'Text', order: 2 },\n voiceProfileId: { label: 'Voice', order: 3 },\n audioAssetId: { label: 'Audio file', order: 4 },\n duration: { label: 'Length in seconds', order: 5 },\n description: { visibility: 'advanced' },\n author: { visibility: 'advanced' },\n publish_date: { label: 'Date', visibility: 'advanced' },\n language: { visibility: 'advanced' },\n wordTimings: { visibility: 'hidden' },\n audioMetadata: { visibility: 'hidden' },\n type: { visibility: 'hidden' },\n variant: { visibility: 'hidden' },\n fileKey: { visibility: 'hidden' },\n body: { visibility: 'hidden' },\n bodyFormat: { visibility: 'hidden' },\n url: { visibility: 'hidden' },\n source: { visibility: 'hidden' },\n original_url: { visibility: 'hidden' },\n tags: { visibility: 'hidden' },\n category: { visibility: 'hidden' },\n status: { visibility: 'hidden' },\n state: { visibility: 'hidden' },\n metadata: { visibility: 'hidden' },\n thumbnailAssetId: { visibility: 'hidden' },\n tenantId: { visibility: 'hidden' },\n },\n },\n } as const;\n}\n"],"mappings":";;;;AAOA,eAAe,wBAAwB,KAAK,MAAM,m9vCAAi45C,CAAC;;;;;;;;;;;;;;;;;;AC+I765C,IAAM,eAAN,cAA2B,WAAW;CAM3C,WAA0B;CAM1B,OAAe;CAQf,cAA6B;CAM7B,WAAmB;CAMnB,SAAsB;CAUtB,eAA8B;CAW9B,gBAA+B;;;;;CAM/B,YAA4C;;;;;CAM5C,eAAuB;;;;;CAMvB,eAAuB;CAavB,SAA6B;;;;CAK7B,WAAmB;;;;CAKnB,eAA8B;CAE9B,YAAY,UAA+B,CAAC,GAAG;EAC7C,MAAM,OAAO;EAEb,IAAI,QAAQ,SAAS,KAAA,GAAW,KAAK,OAAO,QAAQ;EACpD,IAAI,QAAQ,gBAAgB,KAAA,GAC1B,KAAK,cAAc,QAAQ;EAC7B,IAAI,QAAQ,aAAa,KAAA,GAAW,KAAK,WAAW,QAAQ;EAC5D,IAAI,QAAQ,WAAW,KAAA,GAAW,KAAK,SAAS,QAAQ;EACxD,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,KAAK,eAAe,QAAQ;EAC9B,IAAI,QAAQ,kBAAkB,KAAA,GAC5B,KAAK,gBAAgB,QAAQ;EAC/B,IAAI,QAAQ,cAAc,KAAA,GAAW,KAAK,YAAY,QAAQ;EAC9D,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,KAAK,eAAe,QAAQ;EAC9B,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,KAAK,eAAe,QAAQ;EAC9B,IAAI,QAAQ,WAAW,KAAA,GAAW,KAAK,SAAS,QAAQ;EACxD,IAAI,QAAQ,aAAa,KAAA,GAAW,KAAK,WAAW,QAAQ;EAC5D,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,KAAK,eAAe,QAAQ;EAC9B,IAAI,QAAQ,aAAa,KAAA,GAAW,KAAK,WAAW,QAAQ;CAC9D;;;;CAKA,IAAI,WAAoB;EACtB,OAAO,KAAK,kBAAkB;CAChC;;;;CAKA,IAAI,aAAsB;EACxB,OAAO,KAAK,iBAAiB,QAAQ,CAAC,KAAK;CAC7C;;;;CAKA,IAAI,UAAmB;EACrB,OAAO,KAAK,WAAW;CACzB;;;;CAKA,IAAI,WAAoB;EACtB,OAAO,KAAK,aAAa;CAC3B;;;;;CAMA,gBAA6B;EAC3B,MAAM,YAAY,SAAS,KAAK,SAAS,IAAI,KAAK,YAAY,CAAC;EAC/D,MAAM,SACJ,YAAY,UAAU,MAAM,KAAK,YAAY,UAAU,WAAW;EACpE,MAAM,YACJ,YAAY,UAAU,SAAS,KAC/B,YAAY,UAAU,OAAO,KAC7B,YAAY,UAAU,eAAe;EAEvC,OAAO;GACL,IACE,YAAY,UAAU,EAAE,KACxB,YAAY,UAAU,OAAO,KAC7B,YAAY,KAAK,EAAE;GACrB,MAAM,KAAK,QAAQ,KAAA;GACnB,UAAU,KAAK,YAAY,KAAA;GAC3B;GACA;GACA,UAAU;IACR,GAAG;IACH,UAAU,KAAK;IACf,cAAc,KAAK;IACnB,cAAc,KAAK;GACrB;EACF;CACF;AACF;AAlL+C,gBAAlC,cAAyC,mBAAkB,2BAAA;AAMtE,kBAAA,CADC,SAAS,EAAE,UAAU,KAAK,CAAC,CAAA,GALjB,aAMX,WAAA,YAAA,CAAA;AAMA,kBAAA,CADC,MAAM,EAAE,aAAa,uDAAqD,CAAC,CAAA,GAXjE,aAYX,WAAA,QAAA,CAAA;AAQA,kBAAA,CAHC,MAAM,EACL,aAAa,0DACf,CAAC,CAAA,GAnBU,aAoBX,WAAA,eAAA,CAAA;AAMA,kBAAA,CADC,MAAM,EAAE,aAAa,iCAAiC,CAAC,CAAA,GAzB7C,aA0BX,WAAA,YAAA,CAAA;AAMA,kBAAA,CADC,MAAM,EAAE,aAAa,oDAAoD,CAAC,CAAA,GA/BhE,aAgCX,WAAA,UAAA,CAAA;AAUA,kBAAA,CAJC,MAAM,EACL,aACE,gFACJ,CAAC,CAAA,GAzCU,aA0CX,WAAA,gBAAA,CAAA;AAWA,kBAAA,CALC,MAAM,EACL,aACE,uGACJ,CAAC,GACA,gBAAgB,kCAAkC,CAAA,GApDxC,aAqDX,WAAA,iBAAA,CAAA;AA+BA,kBAAA,CAJC,MAAM,EACL,aACE,2GACJ,CAAC,CAAA,GAnFU,aAoFX,WAAA,UAAA,CAAA;AApFW,eAAN,kBAAA,CAXN,aAAa,EAAE,MAAM,WAAW,CAAC,GACjC,KAAK;CACJ,eAAe;CACf,KAAK,EACH,SAAS;EAAC;EAAQ;EAAO;EAAU;EAAU;CAAQ,EACvD;CACA,KAAK,EACH,SAAS,CAAC,QAAQ,KAAK,EACzB;CACA,KAAK,EAAE,cAAc,KAAK;AAC5B,CAAC,CAAA,GACY,YAAA;AAoLb,SAAS,SAAS,OAAkD;CAClE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,OAAoC;CACvD,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ,KAAA;AACjE;;;;;;;;;;;;;;;;;;AC5IO,IAAM,cAAN,cAA0B,QAAQ;CAMvC,iBAAgC;CAMhC,aAAqB;CAOrB,eAA8B;CAM9B,WAAmB;;;;CAKnB,cAAmC;;;;CAKnC,gBAAqC,CAAC;CAEtC,YAAY,UAA8B,CAAC,GAAG;EAC5C,MAAM;GACJ,GAAG;GACH,MAAM;EACR,CAAC;EAED,IAAI,QAAQ,mBAAmB,KAAA,GAC7B,KAAK,iBAAiB,QAAQ;EAChC,IAAI,QAAQ,eAAe,KAAA,GAAW,KAAK,aAAa,QAAQ;EAChE,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,KAAK,eAAe,QAAQ;EAC9B,IAAI,QAAQ,aAAa,KAAA,GAAW,KAAK,WAAW,QAAQ;EAC5D,IAAI,QAAQ,gBAAgB,KAAA,GAC1B,KAAK,cAAc,QAAQ;EAC7B,IAAI,QAAQ,kBAAkB,KAAA,GAC5B,KAAK,gBAAgB,QAAQ;CACjC;;;;CAKA,IAAI,YAAoB;EACtB,OAAO,KAAK,WAAW,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE;CACtD;;;;CAKA,IAAI,iBAAyB;EAC3B,IAAI,KAAK,aAAa,GAAG,OAAO;EAChC,OAAO,KAAK,YAAY,KAAK;CAC/B;;;;CAKA,IAAI,iBAA0B;EAC5B,OAAO,KAAK,gBAAgB,QAAQ,KAAK,YAAY,SAAS;CAChE;;;;CAKA,cAAc,SAAoC;EAChD,IAAI,CAAC,KAAK,aAAa,OAAO;EAC9B,OACE,KAAK,YAAY,MAAM,OAAO,WAAW,GAAG,SAAS,UAAU,GAAG,GAAG,KACrE;CAEJ;;;;;;;CAQA,OAAO,sBACL,SACa;EACb,MAAM,EAAE,QAAQ,eAAe,UAAU,aAAa,GAAG,SAAS;EAClE,OAAO,IAAI,YAAY;GACrB,GAAG;GACH,UAAU,YAAY,OAAO,mBAAmB;GAChD,aAAa,eAAe,sBAAsB,OAAO,KAAK;GAC9D,eAAe;IACb,GAAG,8BAA8B,MAAM;IACvC,GAAG;GACL;EACF,CAAC;CACH;AACF;AA5G2C,gBAA9B,aAAqC,mBAAkB,2BAAA;AAMlE,kBAAA,CAFC,MAAM,EAAE,aAAa,gCAAgC,CAAC,GACtD,iBAAiB,YAAY,CAAA,GALnB,YAMX,WAAA,kBAAA,CAAA;AAMA,kBAAA,CADC,MAAM,EAAE,aAAa,gCAAgC,CAAC,CAAA,GAX5C,YAYX,WAAA,cAAA,CAAA;AAOA,kBAAA,CAFC,MAAM,EAAE,aAAa,mCAAmC,CAAC,GACzD,gBAAgB,kCAAkC,CAAA,GAlBxC,YAmBX,WAAA,gBAAA,CAAA;AAMA,kBAAA,CADC,MAAM,EAAE,aAAa,2CAA2C,CAAC,CAAA,GAxBvD,YAyBX,WAAA,YAAA,CAAA;AAzBW,cAAN,kBAAA,CAXN,aAAa,EAAE,MAAM,WAAW,CAAC,GACjC,KAAK;CACJ,eAAe;CACf,KAAK,EACH,SAAS;EAAC;EAAQ;EAAO;EAAU;CAAQ,EAC7C;CACA,KAAK,EACH,SAAS,CAAC,QAAQ,KAAK,EACzB;CACA,KAAK;AACP,CAAC,CAAA,GACY,WAAA;AA8GN,SAAS,sBACd,OACqB;CACrB,IAAI,CAAC,SAAS,MAAM,WAAW,GAC7B,OAAO;CAET,OAAO,MAAM,KAAK,UAAU;EAC1B,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,KAAK,KAAK;EACV,YAAY,KAAK;EACjB,WAAW,KAAK;CAClB,EAAE;AACJ;AAEO,SAAS,8BACd,QACqB;CACrB,OAAO;EACL,YAAY,OAAO;EACnB,QAAQ,OAAO,UAAU,sBAAsB,OAAO,WAAW;EACjE,aAAa,OAAO;EACpB,UAAU,OAAO;EACjB,UAAU,OAAO,MAAM;EACvB,UAAU,OAAO;EACjB,OAAO,OAAO;CAChB;AACF;AAEA,SAAS,sBAAsB,aAAyC;CACtE,MAAM,aAAa,YAAY,MAAM,KAAK,CAAC,CAAA,CAAE,EAAC,EAAG,KAAK,CAAA,CAAE,YAAY;CACpE,IAAI,CAAC,YAAY,WAAW,QAAQ,GAClC;CAEF,OAAO,WAAW,MAAM,CAAe;AACzC;;;;;;;;;;;;;;;;;;AC5NO,IAAM,cAAN,cAA0B,WAAW;CAK1C,WAA0B;CAO1B,iBAAgC;CAQhC,UAAyB;CASzB,WAAmB;CAOnB,gBAA+B;CAY/B,UAAyB;;;;CAKzB,aAA4B;;;;CAK5B,WAA0B;;;;CAK1B,SAAwB;CAMxB,YAAqB;CAErB,YAAY,UAA8B,CAAC,GAAG;EAC5C,MAAM,OAAO;EAEb,IAAI,QAAQ,mBAAmB,KAAA,GAC7B,KAAK,iBAAiB,QAAQ;EAChC,IAAI,QAAQ,YAAY,KAAA,GAAW,KAAK,UAAU,QAAQ;EAC1D,IAAI,QAAQ,aAAa,KAAA,GAAW,KAAK,WAAW,QAAQ;EAC5D,IAAI,QAAQ,kBAAkB,KAAA,GAC5B,KAAK,gBAAgB,QAAQ;EAC/B,IAAI,QAAQ,YAAY,KAAA,GAAW,KAAK,UAAU,QAAQ;EAC1D,IAAI,QAAQ,eAAe,KAAA,GAAW,KAAK,aAAa,QAAQ;EAChE,IAAI,QAAQ,aAAa,KAAA,GAAW,KAAK,WAAW,QAAQ;EAC5D,IAAI,QAAQ,WAAW,KAAA,GAAW,KAAK,SAAS,QAAQ;EACxD,IAAI,QAAQ,cAAc,KAAA,GAAW,KAAK,YAAY,QAAQ;EAC9D,IAAI,QAAQ,aAAa,KAAA,GAAW,KAAK,WAAW,QAAQ;CAC9D;;;;CAKA,IAAI,mBAA4B;EAC9B,OAAO,KAAK,YAAY;CAC1B;;;;CAKA,IAAI,uBAAgC;EAClC,OAAO,KAAK,oBAAoB,KAAK,YAAY;CACnD;AACF;AArG8C,cAAjC,aAAwC,mBAAkB,2BAAA;AAKrE,gBAAA,CADC,SAAS,EAAE,UAAU,KAAK,CAAC,CAAA,GAJjB,YAKX,WAAA,YAAA,CAAA;AAOA,gBAAA,CAFC,MAAM,EAAE,aAAa,kCAAkC,CAAC,GACxD,iBAAiB,YAAY,CAAA,GAXnB,YAYX,WAAA,kBAAA,CAAA;AAQA,gBAAA,CAFC,MAAM,EAAE,aAAa,mCAAmC,CAAC,GACzD,gBAAgB,kCAAkC,CAAA,GAnBxC,YAoBX,WAAA,WAAA,CAAA;AASA,gBAAA,CAJC,MAAM,EACL,aACE,gEACJ,CAAC,CAAA,GA5BU,YA6BX,WAAA,YAAA,CAAA;AAOA,gBAAA,CADC,MAAM,EAAE,aAAa,6CAA6C,CAAC,CAAA,GAnCzD,YAoCX,WAAA,iBAAA,CAAA;AAYA,gBAAA,CAJC,MAAM,EACL,aACE,6FACJ,CAAC,CAAA,GA/CU,YAgDX,WAAA,WAAA,CAAA;AAqBA,gBAAA,CADC,MAAM,EAAE,aAAa,oDAAoD,CAAC,CAAA,GApEhE,YAqEX,WAAA,aAAA,CAAA;AArEW,cAAN,gBAAA,CAXN,aAAa,EAAE,MAAM,WAAW,CAAC,GACjC,KAAK;CACJ,eAAe;CACf,KAAK,EACH,SAAS;EAAC;EAAQ;EAAO;EAAU;CAAQ,EAC7C;CACA,KAAK,EACH,SAAS,CAAC,QAAQ,KAAK,EACzB;CACA,KAAK;AACP,CAAC,CAAA,GACY,WAAA;;;AC1GN,IAAM,sBAAN,cAAkC,WAAW;CAClD,OAAO,KAAK;CACZ,OAAO,OAAO;CACd,OAAO,QAAQ;CACf,OAAO,UACL;CACF,OAAO,WAAW;EAChB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,OAAO,UAAU;EACf,IAAI;EACJ,OAAO;EACP,MAAM;EACN,aAAa;CACf;CACA,OAAO,SAAS;EAAC;EAAc;EAAa;CAAW;CACvD,OAAO,MAAM;EACX;GACE,OAAO;GACP,OAAO;GACP,MAAM;GACN,aACE;GACF,MAAM;EACR;EACA;GACE,OAAO;GACP,OAAO;GACP,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,OAAO;GACP,OAAO;GACP,MAAM;GACN,aAAa;GACb,MAAM;EACR;CACF;CACA,OAAO,UAAU;EACf,cAAc,EACZ,QAAQ;GACN,MAAM,EAAE,OAAO,EAAE;GACjB,aAAa,EAAE,OAAO,EAAE;GACxB,UAAU,EAAE,OAAO,EAAE;GACrB,QAAQ,EAAE,OAAO,EAAE;GACnB,cAAc;IAAE,OAAO;IAAsB,OAAO;GAAE;GACtD,eAAe;IAAE,OAAO;IAAe,OAAO;GAAE;GAChD,QAAQ,EAAE,OAAO,EAAE;GACnB,cAAc;IAAE,OAAO;IAAS,YAAY;GAAW;GACvD,cAAc;IAAE,OAAO;IAAS,YAAY;GAAW;GACvD,UAAU;IAAE,OAAO;IAAkB,YAAY;GAAW;GAC5D,cAAc;IAAE,OAAO;IAAmB,YAAY;GAAW;GACjE,WAAW,EAAE,YAAY,SAAS;GAClC,UAAU,EAAE,YAAY,SAAS;EACnC,EACF;EACA,aAAa,EACX,QAAQ;GACN,gBAAgB;IAAE,OAAO;IAAS,OAAO;GAAE;GAC3C,SAAS;IAAE,OAAO;IAAc,OAAO;GAAE;GACzC,UAAU;IAAE,OAAO;IAAqB,OAAO;GAAE;GACjD,eAAe;IAAE,OAAO;IAAgB,OAAO;GAAE;GACjD,SAAS,EAAE,OAAO,EAAE;GACpB,WAAW;IAAE,OAAO;IAAa,OAAO;GAAE;GAC1C,YAAY,EAAE,YAAY,WAAW;GACrC,UAAU,EAAE,YAAY,WAAW;GACnC,QAAQ,EAAE,YAAY,WAAW;GACjC,UAAU,EAAE,YAAY,SAAS;EACnC,EACF;EACA,aAAa,EACX,QAAQ;GACN,MAAM;IAAE,OAAO;IAAS,OAAO;GAAE;GACjC,YAAY;IAAE,OAAO;IAAQ,OAAO;GAAE;GACtC,gBAAgB;IAAE,OAAO;IAAS,OAAO;GAAE;GAC3C,cAAc;IAAE,OAAO;IAAc,OAAO;GAAE;GAC9C,UAAU;IAAE,OAAO;IAAqB,OAAO;GAAE;GACjD,aAAa,EAAE,YAAY,WAAW;GACtC,QAAQ,EAAE,YAAY,WAAW;GACjC,cAAc;IAAE,OAAO;IAAQ,YAAY;GAAW;GACtD,UAAU,EAAE,YAAY,WAAW;GACnC,aAAa,EAAE,YAAY,SAAS;GACpC,eAAe,EAAE,YAAY,SAAS;GACtC,MAAM,EAAE,YAAY,SAAS;GAC7B,SAAS,EAAE,YAAY,SAAS;GAChC,SAAS,EAAE,YAAY,SAAS;GAChC,MAAM,EAAE,YAAY,SAAS;GAC7B,YAAY,EAAE,YAAY,SAAS;GACnC,KAAK,EAAE,YAAY,SAAS;GAC5B,QAAQ,EAAE,YAAY,SAAS;GAC/B,cAAc,EAAE,YAAY,SAAS;GACrC,MAAM,EAAE,YAAY,SAAS;GAC7B,UAAU,EAAE,YAAY,SAAS;GACjC,QAAQ,EAAE,YAAY,SAAS;GAC/B,OAAO,EAAE,YAAY,SAAS;GAC9B,UAAU,EAAE,YAAY,SAAS;GACjC,kBAAkB,EAAE,YAAY,SAAS;GACzC,UAAU,EAAE,YAAY,SAAS;EACnC,EACF;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/__smrt-register__.ts","../src/voice-profile.ts","../src/voice-output.ts","../src/voice-sample.ts","../src/recipes.ts"],"sourcesContent":["// Generated by @happyvertical/smrt-core smrtPlugin at library build time.\n// The package manifest is inlined so self-registration cannot miss when a\n// downstream bundler relocates this module away from dist/manifest.json\n// (https://github.com/happyvertical/smrt/issues/1506,\n// https://github.com/happyvertical/smrt/issues/1507).\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n\nObjectRegistry.registerPackageManifest(JSON.parse(\"{\\\"version\\\":\\\"1.0.0\\\",\\\"timestamp\\\":0,\\\"packageName\\\":\\\"@happyvertical/smrt-voice\\\",\\\"packageVersion\\\":\\\"0.60.7\\\",\\\"objects\\\":{\\\"@happyvertical/smrt-voice:VoiceOutput\\\":{\\\"name\\\":\\\"voiceoutput\\\",\\\"className\\\":\\\"VoiceOutput\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-voice:VoiceOutput\\\",\\\"collection\\\":\\\"contents\\\",\\\"description\\\":\\\"Generated audio output from text-to-speech synthesis\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/voice/src/voice-output.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-voice\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"generated\\\":true,\\\"source\\\":\\\"tenantScoped_decorator\\\",\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"autoFilter\\\":true,\\\"autoPopulate\\\":true,\\\"allowSuperAdminBypass\\\":false}}},\\\"type\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"What kind of piece this is, such as an article or a document.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"What kind of piece this is, such as an article or a document.\\\"}},\\\"variant\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"fileKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"author\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"Who wrote this piece.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Who wrote this piece.\\\"}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"A short name used to find this piece in lists.\\\",\\\"_meta\\\":{\\\"required\\\":true,\\\"description\\\":\\\"A short name used to find this piece in lists.\\\"}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"The headline readers see.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The headline readers see.\\\"}},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"A one or two sentence summary of the piece.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"A one or two sentence summary of the piece.\\\"}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"The full text of the piece.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The full text of the piece.\\\"}},\\\"bodyFormat\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"enum\\\":[\\\"markdown\\\",\\\"html\\\"]},\\\"publish_date\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false,\\\"description\\\":\\\"The date the piece went out, or is due to go out.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The date the piece went out, or is due to go out.\\\"}},\\\"url\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"source\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"original_url\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"language\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":[],\\\"description\\\":\\\"Words that group pieces by subject.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Words that group pieces by subject.\\\"}},\\\"category\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"The one section the piece belongs to, such as news or local.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The one section the piece belongs to, such as news or local.\\\"}},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"description\\\":\\\"Where the piece stands: draft, in review, published or archived.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Where the piece stands: draft, in review, published or archived.\\\"},\\\"enum\\\":[\\\"published\\\",\\\"draft\\\",\\\"review\\\",\\\"archived\\\",\\\"deleted\\\"]},\\\"state\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"active\\\",\\\"enum\\\":[\\\"deprecated\\\",\\\"active\\\",\\\"highlighted\\\"]},\\\"metadata\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":{}},\\\"thumbnailAssetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\"},\\\"voiceProfileId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"VoiceProfile\\\",\\\"description\\\":\\\"The voice that read the text.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The voice that read the text.\\\"}},\\\"sourceText\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"The text that was read aloud.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The text that was read aloud.\\\"}},\\\"audioAssetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\",\\\"description\\\":\\\"The audio file of the recording.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The audio file of the recording.\\\"}},\\\"duration\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0,\\\"description\\\":\\\"How long the recording runs, in seconds.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"How long the recording runs, in seconds.\\\"}},\\\"wordTimings\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":[]},\\\"audioMetadata\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"initialize\\\":{\\\"name\\\":\\\"initialize\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"SmrtSaveOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"resolveGovernance\\\":{\\\"name\\\":\\\"resolveGovernance\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<ResolvedContentGovernance>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"loadReferences\\\":{\\\"name\\\":\\\"loadReferences\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"addReference\\\":{\\\"name\\\":\\\"addReference\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"content\\\",\\\"type\\\":\\\"Content | string\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"Content\\\"},{\\\"type\\\":\\\"string\\\"}]},{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"number | null\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"removeReference\\\":{\\\"name\\\":\\\"removeReference\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"targetId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReferences\\\":{\\\"name\\\":\\\"getReferences\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReferenceEdges\\\":{\\\"name\\\":\\\"getReferenceEdges\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<Array<object>>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReferenceDrift\\\":{\\\"name\\\":\\\"getReferenceDrift\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<Array<object>>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"isGoverned\\\":{\\\"name\\\":\\\"isGoverned\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFactLinks\\\":{\\\"name\\\":\\\"getFactLinks\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"FactContentRelationship\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFacts\\\":{\\\"name\\\":\\\"getFacts\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"FactContentRelationship\\\",\\\"boolean\\\"]}],\\\"returnType\\\":\\\"Promise<Fact[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"addFact\\\":{\\\"name\\\":\\\"addFact\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"fact\\\",\\\"type\\\":\\\"Fact | string\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"Fact\\\"},{\\\"type\\\":\\\"string\\\"}]},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"FactContentRelationship\\\",\\\"optional\\\":true},{\\\"name\\\":\\\"metadata\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"removeFact\\\":{\\\"name\\\":\\\"removeFact\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"factId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"FactContentRelationship\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"syncFacts\\\":{\\\"name\\\":\\\"syncFacts\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"factIds\\\",\\\"type\\\":\\\"string[]\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"FactContentRelationship\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<object>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"browseFacts\\\":{\\\"name\\\":\\\"browseFacts\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"query\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true,\\\"default\\\":\\\"\\\"},{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"number\\\",\\\"boolean\\\"]}],\\\"returnType\\\":\\\"Promise<Fact[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"repairFactAudit\\\":{\\\"name\\\":\\\"repairFactAudit\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"number\\\",\\\"string\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"repairFactAuditAction\\\":{\\\"name\\\":\\\"repairFactAuditAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"number\\\",\\\"string\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"repairFactEvidence\\\":{\\\"name\\\":\\\"repairFactEvidence\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactAuditResourceRepairOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"repairFactEvidenceAction\\\":{\\\"name\\\":\\\"repairFactEvidenceAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactAuditResourceRepairOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"recheckFactClaims\\\":{\\\"name\\\":\\\"recheckFactClaims\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactAuditClaimRecheckOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"recheckFactClaimsAction\\\":{\\\"name\\\":\\\"recheckFactClaimsAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactAuditClaimRecheckOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"updateFactEvidenceStatus\\\":{\\\"name\\\":\\\"updateFactEvidenceStatus\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactEvidenceStatusUpdateOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"updateFactEvidenceStatusAction\\\":{\\\"name\\\":\\\"updateFactEvidenceStatusAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"FactEvidenceStatusUpdateOptions\\\",\\\"optional\\\":true,\\\"resolvedType\\\":\\\"object\\\"}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFactAuditState\\\":{\\\"name\\\":\\\"getFactAuditState\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<FactAuditState>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFactAuditStateAction\\\":{\\\"name\\\":\\\"getFactAuditStateAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFactsState\\\":{\\\"name\\\":\\\"getFactsState\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"FactContentRelationship\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"syncFactsState\\\":{\\\"name\\\":\\\"syncFactsState\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"string[]\\\",\\\"FactContentRelationship\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"createVersion\\\":{\\\"name\\\":\\\"createVersion\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"CreateContentVersionOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getVersions\\\":{\\\"name\\\":\\\"getVersions\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"restoreFromVersion\\\":{\\\"name\\\":\\\"restoreFromVersion\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"versionNumber\\\",\\\"type\\\":\\\"number\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReviews\\\":{\\\"name\\\":\\\"getReviews\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"kind\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true,\\\"typeUnresolved\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"listReviews\\\":{\\\"name\\\":\\\"listReviews\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"typeUnresolved\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getReviewRequirements\\\":{\\\"name\\\":\\\"getReviewRequirements\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"profileKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"governance\\\",\\\"type\\\":\\\"ResolvedContentGovernance\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getGovernanceState\\\":{\\\"name\\\":\\\"getGovernanceState\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<ContentGovernanceState>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getGovernanceStateAction\\\":{\\\"name\\\":\\\"getGovernanceStateAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"listReviewProfilesAction\\\":{\\\"name\\\":\\\"listReviewProfilesAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"evaluateReviewProfile\\\":{\\\"name\\\":\\\"evaluateReviewProfile\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"profileKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<ContentReviewProfileEvaluation>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"evaluateReviewProfileAction\\\":{\\\"name\\\":\\\"evaluateReviewProfileAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"memberTypes\\\":[\\\"string\\\"]}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"isReadyForReviewProfile\\\":{\\\"name\\\":\\\"isReadyForReviewProfile\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"profileKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<boolean>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getPublishedTransparency\\\":{\\\"name\\\":\\\"getPublishedTransparency\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getPublishedTransparencyAction\\\":{\\\"name\\\":\\\"getPublishedTransparencyAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"previewTransparency\\\":{\\\"name\\\":\\\"previewTransparency\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"previewTransparencyAction\\\":{\\\"name\\\":\\\"previewTransparencyAction\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"runReview\\\":{\\\"name\\\":\\\"runReview\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"RunContentReviewOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"runReviewAction\\\":{\\\"name\\\":\\\"runReviewAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"RunContentReviewOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"reviewFacts\\\":{\\\"name\\\":\\\"reviewFacts\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"Omit<RunContentReviewOptions, 'kind'>\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"reviewSafety\\\":{\\\"name\\\":\\\"reviewSafety\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"Omit<RunContentReviewOptions, 'kind'>\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getCorrections\\\":{\\\"name\\\":\\\"getCorrections\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"listCorrections\\\":{\\\"name\\\":\\\"listCorrections\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"issueCorrection\\\":{\\\"name\\\":\\\"issueCorrection\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"IssueContentCorrectionOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"issueCorrectionAction\\\":{\\\"name\\\":\\\"issueCorrectionAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"IssueContentCorrectionOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"listVersions\\\":{\\\"name\\\":\\\"listVersions\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"mutateVersionAction\\\":{\\\"name\\\":\\\"mutateVersionAction\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true,\\\"typeUnresolved\\\":true}],\\\"returnType\\\":\\\"any\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getCategorySegments\\\":{\\\"name\\\":\\\"getCategorySegments\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getParentCategory\\\":{\\\"name\\\":\\\"getParentCategory\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getRootCategory\\\":{\\\"name\\\":\\\"getRootCategory\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getAncestorPaths\\\":{\\\"name\\\":\\\"getAncestorPaths\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"isInCategory\\\":{\\\"name\\\":\\\"isInCategory\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"categoryPath\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"includeChildren\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getAssets\\\":{\\\"name\\\":\\\"getAssets\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":true},{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"object\\\",\\\"optional\\\":true,\\\"typeUnresolved\\\":true}],\\\"returnType\\\":\\\"Promise<Asset[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getAssetIds\\\":{\\\"name\\\":\\\"getAssetIds\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<string[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"addAsset\\\":{\\\"name\\\":\\\"addAsset\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"asset\\\",\\\"type\\\":\\\"Asset\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true,\\\"default\\\":\\\"attachment\\\"},{\\\"name\\\":\\\"sortOrder\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"removeAsset\\\":{\\\"name\\\":\\\"removeAsset\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"assetId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"relationship\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getMetadata\\\":{\\\"name\\\":\\\"getMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setMetadata\\\":{\\\"name\\\":\\\"setMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"metadata\\\",\\\"type\\\":\\\"Record<string, unknown> | null | undefined\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"Record<string, unknown>\\\"},{\\\"type\\\":\\\"null\\\"},{\\\"type\\\":\\\"undefined\\\"}]}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"updateMetadata\\\":{\\\"name\\\":\\\"updateMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"patch\\\",\\\"type\\\":\\\"Partial<Record<string, unknown>>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getThumbnail\\\":{\\\"name\\\":\\\"getThumbnail\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<Image | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setThumbnail\\\":{\\\"name\\\":\\\"setThumbnail\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"image\\\",\\\"type\\\":\\\"Image\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"generateThumbnail\\\":{\\\"name\\\":\\\"generateThumbnail\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"ThumbnailOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<Image>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getWordAtTime\\\":{\\\"name\\\":\\\"getWordAtTime\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"seconds\\\",\\\"type\\\":\\\"number\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"WordTiming | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"fromSynthesizedSpeech\\\":{\\\"name\\\":\\\"fromSynthesizedSpeech\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"VoiceOutputFromSynthesizedSpeechOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"VoiceOutput\\\",\\\"isStatic\\\":true,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":true,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"tableName\\\":\\\"contents\\\"},\\\"extends\\\":\\\"Content\\\",\\\"extendsQualified\\\":\\\"@happyvertical/smrt-content:Content\\\",\\\"exportName\\\":\\\"VoiceOutput\\\",\\\"collectionExportName\\\":\\\"VoiceOutputCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"name\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"contents\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"contents\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"type\\\\\\\" TEXT,\\\\n \\\\\\\"variant\\\\\\\" TEXT,\\\\n \\\\\\\"file_key\\\\\\\" TEXT,\\\\n \\\\\\\"author\\\\\\\" TEXT,\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"body_format\\\\\\\" TEXT,\\\\n \\\\\\\"publish_date\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"url\\\\\\\" TEXT,\\\\n \\\\\\\"source\\\\\\\" TEXT,\\\\n \\\\\\\"original_url\\\\\\\" TEXT,\\\\n \\\\\\\"language\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" JSON DEFAULT '[]',\\\\n \\\\\\\"category\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"state\\\\\\\" TEXT DEFAULT 'active',\\\\n \\\\\\\"metadata\\\\\\\" JSON DEFAULT '{}',\\\\n \\\\\\\"thumbnail_asset_id\\\\\\\" UUID,\\\\n \\\\\\\"voice_profile_id\\\\\\\" UUID,\\\\n \\\\\\\"source_text\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"audio_asset_id\\\\\\\" UUID,\\\\n \\\\\\\"duration\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"word_timings\\\\\\\" JSON DEFAULT '[]',\\\\n \\\\\\\"audio_metadata\\\\\\\" JSON,\\\\n \\\\\\\"feed_source_id\\\\\\\" UUID,\\\\n \\\\\\\"source_guid\\\\\\\" TEXT,\\\\n \\\\\\\"source_name\\\\\\\" TEXT,\\\\n \\\\\\\"source_homepage_url\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"original_published_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"dedupe_key\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"variant\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"file_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"author\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"\\\"},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body_format\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"publish_date\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false},\\\"url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"original_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"language\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"default\\\":[]},\\\"category\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"state\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"active\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"default\\\":{}},\\\"thumbnail_asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false},\\\"voice_profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"voice_profiles\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"source_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"\\\"},\\\"audio_asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false},\\\"duration\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"word_timings\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"default\\\":[]},\\\"audio_metadata\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"feed_source_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false},\\\"source_guid\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_homepage_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"original_published_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false},\\\"dedupe_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"contents_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"contents_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"contents_tenant_id_publish_date_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"publish_date\\\"]},{\\\"name\\\":\\\"contents_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"contents_thumbnail_asset_id_idx\\\",\\\"columns\\\":[\\\"thumbnail_asset_id\\\"]},{\\\"name\\\":\\\"contents_voice_profile_id_idx\\\",\\\"columns\\\":[\\\"voice_profile_id\\\"]},{\\\"name\\\":\\\"contents_audio_asset_id_idx\\\",\\\"columns\\\":[\\\"audio_asset_id\\\"]},{\\\"name\\\":\\\"contents_feed_source_id_idx\\\",\\\"columns\\\":[\\\"feed_source_id\\\"]}],\\\"version\\\":\\\"ee1272af\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-voice\\\"},\\\"@happyvertical/smrt-voice:VoiceProfile\\\":{\\\"name\\\":\\\"voiceprofile\\\",\\\"className\\\":\\\"VoiceProfile\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-voice:VoiceProfile\\\",\\\"collection\\\":\\\"voiceprofiles\\\",\\\"description\\\":\\\"Voice profile for AI-powered speech synthesis\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/voice/src/voice-profile.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-voice\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"What you call this voice, such as \\\\\\\"Warm narrator\\\\\\\".\\\",\\\"_meta\\\":{\\\"description\\\":\\\"What you call this voice, such as \\\\\\\"Warm narrator\\\\\\\".\\\"}},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"A note on how the voice sounds and what you use it for.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"A note on how the voice sounds and what you use it for.\\\"}},\\\"language\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"en-US\\\",\\\"description\\\":\\\"The language the voice speaks.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The language the voice speaks.\\\"}},\\\"gender\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"neutral\\\",\\\"description\\\":\\\"Whether the voice sounds male, female or neutral.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Whether the voice sounds male, female or neutral.\\\"},\\\"enum\\\":[\\\"male\\\",\\\"female\\\",\\\"neutral\\\"]},\\\"designPrompt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"Describe the voice you want in your own words, when there is no clip to copy.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Describe the voice you want in your own words, when there is no clip to copy.\\\"}},\\\"sampleAssetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\",\\\"description\\\":\\\"The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice.\\\"}},\\\"voiceData\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":{}},\\\"defaultSpeed\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"default\\\":1},\\\"defaultPitch\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"pending\\\",\\\"description\\\":\\\"Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it.\\\"},\\\"enum\\\":[\\\"pending\\\",\\\"processing\\\",\\\"ready\\\",\\\"failed\\\"]},\\\"provider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"qwen3-tts\\\"},\\\"errorMessage\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"toSpeechVoice\\\":{\\\"name\\\":\\\"toSpeechVoice\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"SpeechVoice\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"skipApiCheck\\\":true},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"VoiceProfile\\\",\\\"collectionExportName\\\":\\\"VoiceProfileCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"voice_profiles\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"voice_profiles\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"language\\\\\\\" TEXT DEFAULT 'en-US',\\\\n \\\\\\\"gender\\\\\\\" TEXT DEFAULT 'neutral',\\\\n \\\\\\\"design_prompt\\\\\\\" TEXT,\\\\n \\\\\\\"sample_asset_id\\\\\\\" UUID,\\\\n \\\\\\\"voice_data\\\\\\\" JSON DEFAULT '{}',\\\\n \\\\\\\"default_speed\\\\\\\" REAL DEFAULT 1,\\\\n \\\\\\\"default_pitch\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'pending',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT 'qwen3-tts',\\\\n \\\\\\\"error_message\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"\\\"},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"language\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"en-US\\\"},\\\"gender\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"neutral\\\"},\\\"design_prompt\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sample_asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false},\\\"voice_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"default\\\":{}},\\\"default_speed\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":1},\\\"default_pitch\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"pending\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"qwen3-tts\\\"},\\\"error_message\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"voice_profiles_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"voice_profiles_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"voice_profiles_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"voice_profiles_sample_asset_id_idx\\\",\\\"columns\\\":[\\\"sample_asset_id\\\"]}],\\\"version\\\":\\\"b3717c47\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-voice\\\"},\\\"@happyvertical/smrt-voice:VoiceSample\\\":{\\\"name\\\":\\\"voicesample\\\",\\\"className\\\":\\\"VoiceSample\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-voice:VoiceSample\\\",\\\"collection\\\":\\\"voicesamples\\\",\\\"description\\\":\\\"Audio sample for voice cloning\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/voice/src/voice-sample.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-voice\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"voiceProfileId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"VoiceProfile\\\",\\\"description\\\":\\\"The voice this clip belongs to.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The voice this clip belongs to.\\\"}},\\\"assetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\",\\\"description\\\":\\\"The audio file of the recording.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The audio file of the recording.\\\"}},\\\"duration\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0,\\\"description\\\":\\\"How long the clip runs, in seconds. At least three is needed.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"How long the clip runs, in seconds. At least three is needed.\\\"}},\\\"transcription\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"description\\\":\\\"The words spoken in the clip, written out.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"The words spoken in the clip, written out.\\\"}},\\\"quality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"medium\\\",\\\"description\\\":\\\"How clean the recording is: low, medium or high. A low one cannot be used to copy a voice.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"How clean the recording is: low, medium or high. A low one cannot be used to copy a voice.\\\"},\\\"enum\\\":[\\\"low\\\",\\\"medium\\\",\\\"high\\\"]},\\\"sampleRate\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false},\\\"channels\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false},\\\"format\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"isPrimary\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":false,\\\"description\\\":\\\"Tick the one clip that best represents the voice.\\\",\\\"_meta\\\":{\\\"description\\\":\\\"Tick the one clip that best represents the voice.\\\"}}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":true,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"VoiceSample\\\",\\\"collectionExportName\\\":\\\"VoiceSampleCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"voice_samples\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"voice_samples\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"voice_profile_id\\\\\\\" UUID,\\\\n \\\\\\\"asset_id\\\\\\\" UUID,\\\\n \\\\\\\"duration\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"transcription\\\\\\\" TEXT,\\\\n \\\\\\\"quality\\\\\\\" TEXT DEFAULT 'medium',\\\\n \\\\\\\"sample_rate\\\\\\\" INTEGER,\\\\n \\\\\\\"channels\\\\\\\" INTEGER,\\\\n \\\\\\\"format\\\\\\\" TEXT,\\\\n \\\\\\\"is_primary\\\\\\\" BOOLEAN DEFAULT FALSE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"voice_profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"voice_profiles\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false},\\\"duration\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"transcription\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"quality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"medium\\\"},\\\"sample_rate\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false},\\\"channels\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false},\\\"format\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"is_primary\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"default\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"voice_samples_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"voice_samples_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"voice_samples_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"voice_samples_voice_profile_id_idx\\\",\\\"columns\\\":[\\\"voice_profile_id\\\"]},{\\\"name\\\":\\\"voice_samples_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"cbb4acc4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-voice\\\"}},\\\"moduleType\\\":\\\"smrt\\\",\\\"recipes\\\":[{\\\"id\\\":\\\"voice.profiles\\\",\\\"className\\\":\\\"VoiceProfilesRecipe\\\",\\\"label\\\":\\\"Voice\\\",\\\"summary\\\":\\\"Set up the voices your app can speak in, from a description or a recorded clip, and keep the speech it generates.\\\",\\\"synonyms\\\":[\\\"voices\\\",\\\"text to speech\\\",\\\"read aloud\\\",\\\"voice cloning\\\",\\\"narration\\\",\\\"speech\\\"],\\\"models\\\":[\\\"@happyvertical/smrt-voice:VoiceProfile\\\",\\\"@happyvertical/smrt-voice:VoiceSample\\\",\\\"@happyvertical/smrt-voice:VoiceOutput\\\"],\\\"nav\\\":[{\\\"label\\\":\\\"Voices\\\",\\\"model\\\":\\\"@happyvertical/smrt-voice:VoiceProfile\\\",\\\"icon\\\":\\\"users\\\",\\\"description\\\":\\\"The voices your app can speak in, described in words or copied from a clip.\\\",\\\"noun\\\":\\\"voice\\\"},{\\\"label\\\":\\\"Samples\\\",\\\"model\\\":\\\"@happyvertical/smrt-voice:VoiceSample\\\",\\\"icon\\\":\\\"folder\\\",\\\"description\\\":\\\"The recorded clips a voice is copied from.\\\",\\\"noun\\\":\\\"sample\\\"},{\\\"label\\\":\\\"Generated speech\\\",\\\"model\\\":\\\"@happyvertical/smrt-voice:VoiceOutput\\\",\\\"icon\\\":\\\"fileText\\\",\\\"description\\\":\\\"Every recording the app has read aloud, with its text.\\\",\\\"noun\\\":\\\"recording\\\"}],\\\"requires\\\":[],\\\"section\\\":{\\\"id\\\":\\\"publish\\\",\\\"label\\\":\\\"Publish\\\",\\\"icon\\\":\\\"fileText\\\",\\\"description\\\":\\\"What you write, record and put out.\\\"},\\\"options\\\":{\\\"@happyvertical/smrt-voice:VoiceProfile\\\":{\\\"fields\\\":{\\\"name\\\":{\\\"order\\\":1},\\\"description\\\":{\\\"order\\\":2},\\\"language\\\":{\\\"order\\\":3},\\\"gender\\\":{\\\"order\\\":4},\\\"designPrompt\\\":{\\\"label\\\":\\\"Describe the voice\\\",\\\"order\\\":5},\\\"sampleAssetId\\\":{\\\"label\\\":\\\"Sample clip\\\",\\\"order\\\":6},\\\"status\\\":{\\\"order\\\":7},\\\"defaultSpeed\\\":{\\\"label\\\":\\\"Speed\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"defaultPitch\\\":{\\\"label\\\":\\\"Pitch\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"provider\\\":{\\\"label\\\":\\\"Speech service\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"errorMessage\\\":{\\\"label\\\":\\\"What went wrong\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"voiceData\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"tenantId\\\":{\\\"visibility\\\":\\\"hidden\\\"}}},\\\"@happyvertical/smrt-voice:VoiceSample\\\":{\\\"fields\\\":{\\\"voiceProfileId\\\":{\\\"label\\\":\\\"Voice\\\",\\\"order\\\":1},\\\"assetId\\\":{\\\"label\\\":\\\"Audio file\\\",\\\"order\\\":2},\\\"duration\\\":{\\\"label\\\":\\\"Length in seconds\\\",\\\"order\\\":3},\\\"transcription\\\":{\\\"label\\\":\\\"What is said\\\",\\\"order\\\":4},\\\"quality\\\":{\\\"order\\\":5},\\\"isPrimary\\\":{\\\"label\\\":\\\"Main clip\\\",\\\"order\\\":6},\\\"sampleRate\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"channels\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"format\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"tenantId\\\":{\\\"visibility\\\":\\\"hidden\\\"}}},\\\"@happyvertical/smrt-voice:VoiceOutput\\\":{\\\"fields\\\":{\\\"name\\\":{\\\"label\\\":\\\"Title\\\",\\\"order\\\":1},\\\"sourceText\\\":{\\\"label\\\":\\\"Text\\\",\\\"order\\\":2},\\\"voiceProfileId\\\":{\\\"label\\\":\\\"Voice\\\",\\\"order\\\":3},\\\"audioAssetId\\\":{\\\"label\\\":\\\"Audio file\\\",\\\"order\\\":4},\\\"duration\\\":{\\\"label\\\":\\\"Length in seconds\\\",\\\"order\\\":5},\\\"description\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"author\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"publish_date\\\":{\\\"label\\\":\\\"Date\\\",\\\"visibility\\\":\\\"advanced\\\"},\\\"language\\\":{\\\"visibility\\\":\\\"advanced\\\"},\\\"wordTimings\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"audioMetadata\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"type\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"variant\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"fileKey\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"body\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"bodyFormat\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"url\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"source\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"original_url\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"tags\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"category\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"status\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"state\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"metadata\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"thumbnailAssetId\\\":{\\\"visibility\\\":\\\"hidden\\\"},\\\"tenantId\\\":{\\\"visibility\\\":\\\"hidden\\\"}}}},\\\"help\\\":{\\\"markdown\\\":\\\"## Overview\\\\n\\\\nVoice is where you set up the voices your app can speak in and keep the speech\\\\nit has read aloud. A voice is either described in your own words, such as \\\\\\\"a\\\\nwarm, unhurried narrator\\\\\\\", or copied from a recorded clip of a real person. The\\\\nspeech service prepares the voice and shows where it stands, from waiting to\\\\nready. Once a voice is ready, the app can read any text aloud in it, and each\\\\nrecording it makes is kept here with the text it came from.\\\\n\\\\n## Tasks\\\\n\\\\n### Create a voice\\\\n\\\\n1. Open the list of voices and choose **New**.\\\\n2. Give the voice a **{field:VoiceProfile.name}** your team will recognise.\\\\n3. Pick the **{field:VoiceProfile.language}** it speaks and, if you like, the **{field:VoiceProfile.gender}** it should sound like.\\\\n4. Do one of the following, not both: write what you want to hear in **{field:VoiceProfile.designPrompt}**, or pick a recorded clip in **{field:VoiceProfile.sampleAssetId}** to copy a real voice.\\\\n5. Save. The **{field:VoiceProfile.status}** shows whether the speech service is still preparing the voice, has it ready, or could not make it. You do not set it yourself.\\\\n\\\\n### Add a sample clip\\\\n\\\\nA clip can only be used to copy a voice when it runs at least three seconds and\\\\nits quality is not low. One clear speaker with no background noise works best.\\\\n\\\\n1. Open the list of samples and choose **New**.\\\\n2. Pick the **{field:VoiceSample.voiceProfileId}** the clip is for and the **{field:VoiceSample.assetId}** holding the recording.\\\\n3. Enter the **{field:VoiceSample.duration}** and, if you know it, the **{field:VoiceSample.quality}** of the recording.\\\\n4. Write out **{field:VoiceSample.transcription}** so the words can be matched to the sound.\\\\n5. Tick **{field:VoiceSample.isPrimary}** on the clip that best represents the voice.\\\\n6. Save. To take a clip out, open it and remove it.\\\\n\\\\n### Find a recording the app has made\\\\n\\\\nRecordings are made by the speech service whenever the app reads text aloud in\\\\none of your voices. The sound itself always comes from the service; here you\\\\nfind, listen to and tidy up what it has made.\\\\n\\\\n1. Open the list of generated speech.\\\\n2. Look at the **{field:VoiceOutput.name}** and the **{field:VoiceOutput.voiceProfileId}** to find the one you want.\\\\n3. Open it to read the **{field:VoiceOutput.sourceText}** and play the **{field:VoiceOutput.audioAssetId}**; the **{field:VoiceOutput.duration}** tells you how long it runs.\\\\n4. To clear out a recording you no longer need, open it and remove it.\\\\n\\\",\\\"fieldRefs\\\":[\\\"VoiceOutput.audioAssetId\\\",\\\"VoiceOutput.duration\\\",\\\"VoiceOutput.name\\\",\\\"VoiceOutput.sourceText\\\",\\\"VoiceOutput.voiceProfileId\\\",\\\"VoiceProfile.designPrompt\\\",\\\"VoiceProfile.gender\\\",\\\"VoiceProfile.language\\\",\\\"VoiceProfile.name\\\",\\\"VoiceProfile.sampleAssetId\\\",\\\"VoiceProfile.status\\\",\\\"VoiceSample.assetId\\\",\\\"VoiceSample.duration\\\",\\\"VoiceSample.isPrimary\\\",\\\"VoiceSample.quality\\\",\\\"VoiceSample.transcription\\\",\\\"VoiceSample.voiceProfileId\\\"]},\\\"demo\\\":{\\\"mode\\\":\\\"server\\\",\\\"reasons\\\":[\\\"Needs a server because its package does not build for a browser: documents/spider SDK graph; CJS parse error; and its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-chat, @happyvertical/smrt-content, @happyvertical/smrt-images, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627, #3628).\\\"]}}],\\\"smrtDependencies\\\":[\\\"@happyvertical/smrt-assets\\\",\\\"@happyvertical/smrt-content\\\",\\\"@happyvertical/smrt-core\\\",\\\"@happyvertical/smrt-tenancy\\\"],\\\"browser\\\":{\\\"status\\\":\\\"server-only\\\",\\\"issues\\\":[\\\"#3615\\\",\\\"#3617\\\",\\\"#3624\\\",\\\"#3625\\\",\\\"#3626\\\",\\\"#3627\\\",\\\"#3628\\\"],\\\"reason\\\":\\\"documents/spider SDK graph; CJS parse error\\\",\\\"via\\\":[\\\"@happyvertical/smrt-agents\\\",\\\"@happyvertical/smrt-chat\\\",\\\"@happyvertical/smrt-content\\\",\\\"@happyvertical/smrt-images\\\",\\\"@happyvertical/smrt-jobs\\\",\\\"@happyvertical/smrt-profiles\\\",\\\"@happyvertical/smrt-reports\\\",\\\"@happyvertical/smrt-secrets\\\",\\\"@happyvertical/smrt-tenancy\\\",\\\"@happyvertical/smrt-users\\\"]},\\\"stampsConstructors\\\":true}\"));\n","/**\n * Voice Profile Model\n *\n * Manages voice profiles for AI-powered voice synthesis and cloning.\n * Supports voice design via natural language descriptions and voice\n * cloning from audio samples.\n */\n\nimport type { SmrtObjectOptions } from '@happyvertical/smrt-core';\nimport {\n crossPackageRef,\n field,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { SpeechVoice } from '@happyvertical/speech';\n\n/**\n * Voice profile status\n */\nexport type VoiceProfileStatus = 'pending' | 'processing' | 'ready' | 'failed';\n\n/**\n * Voice gender classification\n */\nexport type VoiceGender = 'male' | 'female' | 'neutral';\n\n/**\n * Voice profile creation options\n */\nexport interface VoiceProfileOptions extends SmrtObjectOptions {\n /**\n * Human-readable name for the voice profile\n */\n name?: string;\n\n /**\n * Description of the voice characteristics\n */\n description?: string | null;\n\n /**\n * ISO language code (e.g., 'en-US', 'zh-CN')\n */\n language?: string;\n\n /**\n * Voice gender classification\n * @default 'neutral'\n */\n gender?: VoiceGender;\n\n /**\n * Natural language description for voice design\n * Used when creating a voice from scratch\n */\n designPrompt?: string | null;\n\n /**\n * Asset ID of the audio sample for voice cloning\n * Should be at least 3 seconds of clear speech\n */\n sampleAssetId?: string | null;\n\n /**\n * Provider-specific voice data (ID, embedding, etc.)\n * Stored after voice creation/cloning\n */\n voiceData?: Record<string, unknown> | null;\n\n /**\n * Default speech speed multiplier\n * @default 1.0\n */\n defaultSpeed?: number;\n\n /**\n * Default pitch adjustment in semitones\n * @default 0\n */\n defaultPitch?: number;\n\n /**\n * Voice profile status\n * @default 'pending'\n */\n status?: VoiceProfileStatus;\n\n /**\n * TTS provider that created this voice\n * @default 'qwen3-tts'\n */\n provider?: string;\n\n /**\n * Error message if status is 'failed'\n */\n errorMessage?: string | null;\n\n /**\n * Tenant ID for multi-tenant isolation\n * Null for global/default voices\n */\n tenantId?: string | null;\n}\n\n/**\n * Voice profile for AI-powered speech synthesis\n *\n * VoiceProfile represents a configured voice identity that can be used\n * for text-to-speech synthesis. Voices can be created through:\n * - Voice design: Natural language description of desired voice characteristics\n * - Voice cloning: 3+ second audio sample for voice replication\n *\n * @example\n * ```typescript\n * import { VoiceProfile } from '@happyvertical/smrt-voice';\n *\n * // Create a designed voice\n * const anchorVoice = new VoiceProfile({\n * name: 'News Anchor',\n * description: 'Professional news anchor voice with clear enunciation',\n * language: 'en-US',\n * gender: 'male',\n * designPrompt: 'Warm, authoritative male voice with slight gravitas, suitable for news broadcasts',\n * provider: 'qwen3-tts',\n * });\n *\n * // Create a cloned voice\n * const clonedVoice = new VoiceProfile({\n * name: 'Custom Voice',\n * description: 'Cloned from user sample',\n * language: 'en-US',\n * sampleAssetId: 'asset-123',\n * provider: 'qwen3-tts',\n * });\n * ```\n */\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableStrategy: 'sti',\n api: {\n include: ['list', 'get', 'create', 'update', 'delete'],\n },\n mcp: {\n include: ['list', 'get'],\n },\n cli: { skipApiCheck: true },\n})\nexport class VoiceProfile extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-voice\";\n /**\n * Tenant ID for multi-tenant isolation\n * Nullable to support global/default voices\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Human-readable name for the voice profile\n */\n @field({ description: 'What you call this voice, such as \"Warm narrator\".' })\n name: string = '';\n\n /**\n * Description of the voice characteristics\n */\n @field({\n description: 'A note on how the voice sounds and what you use it for.',\n })\n description: string | null = null;\n\n /**\n * ISO language code (e.g., 'en-US', 'zh-CN')\n */\n @field({ description: 'The language the voice speaks.' })\n language: string = 'en-US';\n\n /**\n * Voice gender classification\n */\n @field({ description: 'Whether the voice sounds male, female or neutral.' })\n gender: VoiceGender = 'neutral';\n\n /**\n * Natural language description for voice design\n * Used when creating a voice from scratch via AI\n */\n @field({\n description:\n 'Describe the voice you want in your own words, when there is no clip to copy.',\n })\n designPrompt: string | null = null;\n\n /**\n * Asset ID of the audio sample for voice cloning\n * Should be at least 3 seconds of clear speech\n */\n @field({\n description:\n 'The recorded clip the voice is copied from, when there is one. Leave it empty for a described voice.',\n })\n @crossPackageRef('@happyvertical/smrt-assets:Asset')\n sampleAssetId: string | null = null;\n\n /**\n * Provider-specific voice data (ID, embedding, etc.)\n * Stored after voice creation/cloning is complete\n */\n voiceData: Record<string, unknown> | null = null;\n\n /**\n * Default speech speed multiplier (0.5 - 2.0)\n * 1.0 = normal speed\n */\n defaultSpeed: number = 1.0;\n\n /**\n * Default pitch adjustment in semitones (-20 to 20)\n * 0 = no adjustment\n */\n defaultPitch: number = 0;\n\n /**\n * Voice profile status\n * - pending: Profile created but voice not yet generated\n * - processing: Voice generation/cloning in progress\n * - ready: Voice is ready for use\n * - failed: Voice generation failed\n */\n @field({\n description:\n 'Where the voice stands: waiting, being prepared, ready to use, or failed. The speech service updates it.',\n })\n status: VoiceProfileStatus = 'pending';\n\n /**\n * TTS provider that created/manages this voice\n */\n provider: string = 'qwen3-tts';\n\n /**\n * Error message if status is 'failed'\n */\n errorMessage: string | null = null;\n\n constructor(options: VoiceProfileOptions = {}) {\n super(options);\n\n if (options.name !== undefined) this.name = options.name;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.language !== undefined) this.language = options.language;\n if (options.gender !== undefined) this.gender = options.gender;\n if (options.designPrompt !== undefined)\n this.designPrompt = options.designPrompt;\n if (options.sampleAssetId !== undefined)\n this.sampleAssetId = options.sampleAssetId;\n if (options.voiceData !== undefined) this.voiceData = options.voiceData;\n if (options.defaultSpeed !== undefined)\n this.defaultSpeed = options.defaultSpeed;\n if (options.defaultPitch !== undefined)\n this.defaultPitch = options.defaultPitch;\n if (options.status !== undefined) this.status = options.status;\n if (options.provider !== undefined) this.provider = options.provider;\n if (options.errorMessage !== undefined)\n this.errorMessage = options.errorMessage;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * Check if this voice profile uses voice cloning\n */\n get isCloned(): boolean {\n return this.sampleAssetId !== null;\n }\n\n /**\n * Check if this voice profile uses voice design\n */\n get isDesigned(): boolean {\n return this.designPrompt !== null && !this.isCloned;\n }\n\n /**\n * Check if the voice is ready for use\n */\n get isReady(): boolean {\n return this.status === 'ready';\n }\n\n /**\n * Check if this is a global (default) voice\n */\n get isGlobal(): boolean {\n return this.tenantId === null;\n }\n\n /**\n * Convert this persisted profile into the runtime voice shape consumed by\n * @happyvertical/speech adapters.\n */\n toSpeechVoice(): SpeechVoice {\n const voiceData = isRecord(this.voiceData) ? this.voiceData : {};\n const prompt =\n stringValue(voiceData.prompt) ?? stringValue(voiceData.voicePrompt);\n const speakerId =\n stringValue(voiceData.speakerId) ??\n stringValue(voiceData.speaker) ??\n stringValue(voiceData.providerVoiceId);\n\n return {\n id:\n stringValue(voiceData.id) ??\n stringValue(voiceData.voiceId) ??\n stringValue(this.id),\n name: this.name || undefined,\n language: this.language || undefined,\n speakerId,\n prompt,\n metadata: {\n ...voiceData,\n provider: this.provider,\n defaultSpeed: this.defaultSpeed,\n defaultPitch: this.defaultPitch,\n },\n };\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n","/**\n * Voice Output Model\n *\n * Represents generated audio output from text-to-speech synthesis.\n * Extends Content to leverage content management features.\n */\n\nimport { Content, type ContentOptions } from '@happyvertical/smrt-content';\nimport {\n crossPackageRef,\n field,\n foreignKey,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped } from '@happyvertical/smrt-tenancy';\nimport type {\n WordTiming as SpeechWordTiming,\n SynthesizedSpeech,\n} from '@happyvertical/speech';\nimport { VoiceProfile } from './voice-profile.js';\n\n/**\n * Word timing information for lip-sync alignment\n */\nexport interface WordTiming {\n /**\n * The word\n */\n word: string;\n\n /**\n * Start time in seconds\n */\n start: number;\n\n /**\n * End time in seconds\n */\n end: number;\n\n /**\n * Provider confidence score, when available\n */\n confidence?: number;\n\n /**\n * Speaker identifier, when diarization is available\n */\n speakerId?: string;\n}\n\n/**\n * Voice output metadata\n */\nexport interface VoiceOutputMetadata {\n /**\n * Sample rate in Hz\n */\n sampleRate?: number;\n\n /**\n * Audio format (e.g., 'wav', 'mp3', 'ogg')\n */\n format?: string;\n\n /**\n * MIME type returned by the speech provider\n */\n contentType?: string;\n\n /**\n * Number of audio channels\n */\n channels?: number;\n\n /**\n * Bit depth (e.g., 16, 24, 32)\n */\n bitDepth?: number;\n\n /**\n * File size in bytes\n */\n fileSize?: number;\n\n /**\n * TTS provider used\n */\n provider?: string;\n\n /**\n * Model used for synthesis\n */\n model?: string;\n\n /**\n * Speech speed used (1.0 = normal)\n */\n speed?: number;\n\n /**\n * Pitch adjustment used (semitones)\n */\n pitch?: number;\n}\n\n/**\n * Voice output creation options\n */\nexport interface VoiceOutputOptions extends ContentOptions {\n /**\n * Voice profile used for synthesis\n */\n voiceProfileId?: string | null;\n\n /**\n * Original text that was synthesized\n */\n sourceText?: string;\n\n /**\n * Asset ID of the generated audio file\n */\n audioAssetId?: string | null;\n\n /**\n * Duration of the generated audio in seconds\n */\n duration?: number;\n\n /**\n * Word-level timing information for lip-sync\n */\n wordTimings?: WordTiming[] | null;\n\n /**\n * Audio metadata\n */\n audioMetadata?: VoiceOutputMetadata;\n}\n\n/**\n * Create a VoiceOutput from a runtime @happyvertical/speech synthesis result.\n */\nexport interface VoiceOutputFromSynthesizedSpeechOptions\n extends VoiceOutputOptions {\n /**\n * Runtime synthesis result from @happyvertical/speech.\n */\n speech: SynthesizedSpeech;\n}\n\n/**\n * Generated audio output from text-to-speech synthesis\n *\n * VoiceOutput extends Content to represent audio generated from\n * text using a VoiceProfile. It includes word-level timing information\n * for lip-sync alignment in video production.\n *\n * @example\n * ```typescript\n * import { VoiceOutput } from '@happyvertical/smrt-voice';\n *\n * const output = new VoiceOutput({\n * voiceProfileId: 'voice-123',\n * sourceText: 'Welcome to the evening news broadcast.',\n * audioAssetId: 'asset-789',\n * duration: 3.5,\n * wordTimings: [\n * { word: 'Welcome', start: 0.0, end: 0.4 },\n * { word: 'to', start: 0.4, end: 0.5 },\n * { word: 'the', start: 0.5, end: 0.6 },\n * { word: 'evening', start: 0.6, end: 1.0 },\n * { word: 'news', start: 1.0, end: 1.3 },\n * { word: 'broadcast', start: 1.3, end: 1.9 },\n * ],\n * audioMetadata: {\n * sampleRate: 48000,\n * format: 'wav',\n * channels: 1,\n * provider: 'qwen3-tts',\n * },\n * });\n * ```\n */\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableStrategy: 'sti',\n api: {\n include: ['list', 'get', 'create', 'delete'],\n },\n mcp: {\n include: ['list', 'get'],\n },\n cli: true,\n})\nexport class VoiceOutput extends Content { static __smrtPackage__ = \"@happyvertical/smrt-voice\";\n /**\n * Voice profile used for synthesis\n */\n @field({ description: 'The voice that read the text.' })\n @foreignKey(() => VoiceProfile)\n voiceProfileId: string | null = null;\n\n /**\n * Original text that was synthesized\n */\n @field({ description: 'The text that was read aloud.' })\n sourceText: string = '';\n\n /**\n * Asset ID of the generated audio file\n */\n @field({ description: 'The audio file of the recording.' })\n @crossPackageRef('@happyvertical/smrt-assets:Asset')\n audioAssetId: string | null = null;\n\n /**\n * Duration of the generated audio in seconds\n */\n @field({ description: 'How long the recording runs, in seconds.' })\n duration: number = 0;\n\n /**\n * Word-level timing information for lip-sync alignment\n */\n wordTimings: WordTiming[] | null = null;\n\n /**\n * Audio metadata (sample rate, format, etc.)\n */\n audioMetadata: VoiceOutputMetadata = {};\n\n constructor(options: VoiceOutputOptions = {}) {\n super({\n ...options,\n type: 'voice-output',\n });\n\n if (options.voiceProfileId !== undefined)\n this.voiceProfileId = options.voiceProfileId;\n if (options.sourceText !== undefined) this.sourceText = options.sourceText;\n if (options.audioAssetId !== undefined)\n this.audioAssetId = options.audioAssetId;\n if (options.duration !== undefined) this.duration = options.duration;\n if (options.wordTimings !== undefined)\n this.wordTimings = options.wordTimings;\n if (options.audioMetadata !== undefined)\n this.audioMetadata = options.audioMetadata;\n }\n\n /**\n * Get the word count of the source text\n */\n get wordCount(): number {\n return this.sourceText.split(/\\s+/).filter(Boolean).length;\n }\n\n /**\n * Get the average words per second rate\n */\n get wordsPerSecond(): number {\n if (this.duration === 0) return 0;\n return this.wordCount / this.duration;\n }\n\n /**\n * Check if word timing data is available for lip-sync\n */\n get hasWordTimings(): boolean {\n return this.wordTimings !== null && this.wordTimings.length > 0;\n }\n\n /**\n * Get the word at a specific timestamp\n */\n getWordAtTime(seconds: number): WordTiming | null {\n if (!this.wordTimings) return null;\n return (\n this.wordTimings.find((wt) => seconds >= wt.start && seconds < wt.end) ??\n null\n );\n }\n\n /**\n * Build a persisted output model from a provider-neutral speech result.\n *\n * The binary audio remains in the caller-owned asset pipeline; this helper\n * only normalizes metadata and timing fields onto the SMRT model.\n */\n static fromSynthesizedSpeech(\n options: VoiceOutputFromSynthesizedSpeechOptions,\n ): VoiceOutput {\n const { speech, audioMetadata, duration, wordTimings, ...rest } = options;\n return new VoiceOutput({\n ...rest,\n duration: duration ?? speech.durationSeconds ?? 0,\n wordTimings: wordTimings ?? wordTimingsFromSpeech(speech.words),\n audioMetadata: {\n ...metadataFromSynthesizedSpeech(speech),\n ...audioMetadata,\n },\n });\n }\n}\n\nexport function wordTimingsFromSpeech(\n words: readonly SpeechWordTiming[] | null | undefined,\n): WordTiming[] | null {\n if (!words || words.length === 0) {\n return null;\n }\n return words.map((word) => ({\n word: word.word,\n start: word.startSeconds,\n end: word.endSeconds,\n confidence: word.confidence,\n speakerId: word.speakerId,\n }));\n}\n\nexport function metadataFromSynthesizedSpeech(\n speech: SynthesizedSpeech,\n): VoiceOutputMetadata {\n return {\n sampleRate: speech.sampleRate,\n format: speech.format ?? formatFromContentType(speech.contentType),\n contentType: speech.contentType,\n channels: speech.channels,\n fileSize: speech.audio.byteLength,\n provider: speech.provider,\n model: speech.model,\n };\n}\n\nfunction formatFromContentType(contentType: string): string | undefined {\n const normalized = contentType.split(';', 1)[0]?.trim().toLowerCase();\n if (!normalized?.startsWith('audio/')) {\n return undefined;\n }\n return normalized.slice('audio/'.length);\n}\n","/**\n * Voice Sample Model\n *\n * Manages audio samples used for voice cloning.\n * Samples should be at least 3 seconds of clear speech.\n */\n\nimport type { SmrtObjectOptions } from '@happyvertical/smrt-core';\nimport {\n crossPackageRef,\n field,\n foreignKey,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport { VoiceProfile } from './voice-profile.js';\n\n/**\n * Audio sample quality rating\n */\nexport type SampleQuality = 'low' | 'medium' | 'high';\n\n/**\n * Voice sample creation options\n */\nexport interface VoiceSampleOptions extends SmrtObjectOptions {\n /**\n * Voice profile this sample belongs to\n */\n voiceProfileId?: string | null;\n\n /**\n * Asset ID of the audio file\n */\n assetId?: string | null;\n\n /**\n * Sample duration in seconds\n */\n duration?: number;\n\n /**\n * Transcription of what was said in the sample\n */\n transcription?: string | null;\n\n /**\n * Quality rating based on audio analysis\n * @default 'medium'\n */\n quality?: SampleQuality;\n\n /**\n * Sample rate in Hz (e.g., 44100, 48000)\n */\n sampleRate?: number | null;\n\n /**\n * Number of audio channels (1 = mono, 2 = stereo)\n */\n channels?: number | null;\n\n /**\n * Audio format (e.g., 'wav', 'mp3', 'ogg')\n */\n format?: string | null;\n\n /**\n * Whether this is the primary sample for the voice profile\n * @default false\n */\n isPrimary?: boolean;\n\n /**\n * Tenant ID for multi-tenant isolation\n */\n tenantId?: string | null;\n}\n\n/**\n * Audio sample for voice cloning\n *\n * VoiceSample represents an audio recording used as source material\n * for voice cloning. For best results, samples should be:\n * - At least 3 seconds long\n * - Clear speech without background noise\n * - Single speaker only\n * - High quality (44.1kHz or higher)\n *\n * Multiple samples can be associated with a single VoiceProfile\n * to improve voice cloning quality.\n *\n * @example\n * ```typescript\n * import { VoiceSample } from '@happyvertical/smrt-voice';\n *\n * const sample = new VoiceSample({\n * voiceProfileId: 'voice-123',\n * assetId: 'asset-456',\n * duration: 5.2,\n * transcription: 'Hello, this is a test recording for voice cloning.',\n * quality: 'high',\n * sampleRate: 48000,\n * channels: 1,\n * format: 'wav',\n * isPrimary: true,\n * });\n * ```\n */\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableStrategy: 'sti',\n api: {\n include: ['list', 'get', 'create', 'delete'],\n },\n mcp: {\n include: ['list', 'get'],\n },\n cli: true,\n})\nexport class VoiceSample extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-voice\";\n /**\n * Tenant ID for multi-tenant isolation\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Voice profile this sample belongs to\n */\n @field({ description: 'The voice this clip belongs to.' })\n @foreignKey(() => VoiceProfile)\n voiceProfileId: string | null = null;\n\n /**\n * Asset ID of the audio file\n * References an Asset in smrt-assets\n */\n @field({ description: 'The audio file of the recording.' })\n @crossPackageRef('@happyvertical/smrt-assets:Asset')\n assetId: string | null = null;\n\n /**\n * Sample duration in seconds\n */\n @field({\n description:\n 'How long the clip runs, in seconds. At least three is needed.',\n })\n duration: number = 0;\n\n /**\n * Transcription of what was said in the sample\n * Used for alignment and quality verification\n */\n @field({ description: 'The words spoken in the clip, written out.' })\n transcription: string | null = null;\n\n /**\n * Quality rating based on audio analysis\n * - low: Noisy or short samples\n * - medium: Acceptable quality\n * - high: Clear audio, good length\n */\n @field({\n description:\n 'How clean the recording is: low, medium or high. A low one cannot be used to copy a voice.',\n })\n quality: SampleQuality = 'medium';\n\n /**\n * Sample rate in Hz\n */\n sampleRate: number | null = null;\n\n /**\n * Number of audio channels\n */\n channels: number | null = null;\n\n /**\n * Audio format\n */\n format: string | null = null;\n\n /**\n * Whether this is the primary sample for the voice profile\n */\n @field({ description: 'Tick the one clip that best represents the voice.' })\n isPrimary: boolean = false;\n\n constructor(options: VoiceSampleOptions = {}) {\n super(options);\n\n if (options.voiceProfileId !== undefined)\n this.voiceProfileId = options.voiceProfileId;\n if (options.assetId !== undefined) this.assetId = options.assetId;\n if (options.duration !== undefined) this.duration = options.duration;\n if (options.transcription !== undefined)\n this.transcription = options.transcription;\n if (options.quality !== undefined) this.quality = options.quality;\n if (options.sampleRate !== undefined) this.sampleRate = options.sampleRate;\n if (options.channels !== undefined) this.channels = options.channels;\n if (options.format !== undefined) this.format = options.format;\n if (options.isPrimary !== undefined) this.isPrimary = options.isPrimary;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * Check if sample meets minimum duration requirement (3 seconds)\n */\n get meetsMinDuration(): boolean {\n return this.duration >= 3;\n }\n\n /**\n * Check if sample is high quality and suitable for cloning\n */\n get isSuitableForCloning(): boolean {\n return this.meetsMinDuration && this.quality !== 'low';\n }\n}\n","/**\n * Declared recipes for smrt-voice (#4409, #4437): user-facing units of\n * functionality an app or agent can pick instead of the whole package.\n * The scanner reads these statics into the `recipes` array of `manifest.json`\n * and `smrt-knowledge.json`; nothing here runs at that point.\n *\n * @packageDocumentation\n */\n\nimport { SmrtRecipe } from '@happyvertical/smrt-core';\nimport { VoiceOutput } from './voice-output.js';\nimport { VoiceProfile } from './voice-profile.js';\nimport { VoiceSample } from './voice-sample.js';\n\n/** Voice: the voices your app can speak in, and the speech it has generated. */\nexport class VoiceProfilesRecipe extends SmrtRecipe {\n static id = 'voice.profiles';\n static help = './profiles.recipe.md';\n static label = 'Voice';\n static summary =\n 'Set up the voices your app can speak in, from a description or a recorded clip, and keep the speech it generates.';\n static synonyms = [\n 'voices',\n 'text to speech',\n 'read aloud',\n 'voice cloning',\n 'narration',\n 'speech',\n ];\n static section = {\n id: 'publish',\n label: 'Publish',\n icon: 'fileText',\n description: 'What you write, record and put out.',\n };\n static models = [VoiceProfile, VoiceSample, VoiceOutput];\n static nav = [\n {\n label: 'Voices',\n model: VoiceProfile,\n icon: 'users',\n description:\n 'The voices your app can speak in, described in words or copied from a clip.',\n noun: 'voice',\n },\n {\n label: 'Samples',\n model: VoiceSample,\n icon: 'folder',\n description: 'The recorded clips a voice is copied from.',\n noun: 'sample',\n },\n {\n label: 'Generated speech',\n model: VoiceOutput,\n icon: 'fileText',\n description: 'Every recording the app has read aloud, with its text.',\n noun: 'recording',\n },\n ];\n static options = {\n VoiceProfile: {\n fields: {\n name: { order: 1 },\n description: { order: 2 },\n language: { order: 3 },\n gender: { order: 4 },\n designPrompt: { label: 'Describe the voice', order: 5 },\n sampleAssetId: { label: 'Sample clip', order: 6 },\n status: { order: 7 },\n defaultSpeed: { label: 'Speed', visibility: 'advanced' },\n defaultPitch: { label: 'Pitch', visibility: 'advanced' },\n provider: { label: 'Speech service', visibility: 'advanced' },\n errorMessage: { label: 'What went wrong', visibility: 'advanced' },\n voiceData: { visibility: 'hidden' },\n tenantId: { visibility: 'hidden' },\n },\n },\n VoiceSample: {\n fields: {\n voiceProfileId: { label: 'Voice', order: 1 },\n assetId: { label: 'Audio file', order: 2 },\n duration: { label: 'Length in seconds', order: 3 },\n transcription: { label: 'What is said', order: 4 },\n quality: { order: 5 },\n isPrimary: { label: 'Main clip', order: 6 },\n sampleRate: { visibility: 'advanced' },\n channels: { visibility: 'advanced' },\n format: { visibility: 'advanced' },\n tenantId: { visibility: 'hidden' },\n },\n },\n VoiceOutput: {\n fields: {\n name: { label: 'Title', order: 1 },\n sourceText: { label: 'Text', order: 2 },\n voiceProfileId: { label: 'Voice', order: 3 },\n audioAssetId: { label: 'Audio file', order: 4 },\n duration: { label: 'Length in seconds', order: 5 },\n description: { visibility: 'advanced' },\n author: { visibility: 'advanced' },\n publish_date: { label: 'Date', visibility: 'advanced' },\n language: { visibility: 'advanced' },\n wordTimings: { visibility: 'hidden' },\n audioMetadata: { visibility: 'hidden' },\n type: { visibility: 'hidden' },\n variant: { visibility: 'hidden' },\n fileKey: { visibility: 'hidden' },\n body: { visibility: 'hidden' },\n bodyFormat: { visibility: 'hidden' },\n url: { visibility: 'hidden' },\n source: { visibility: 'hidden' },\n original_url: { visibility: 'hidden' },\n tags: { visibility: 'hidden' },\n category: { visibility: 'hidden' },\n status: { visibility: 'hidden' },\n state: { visibility: 'hidden' },\n metadata: { visibility: 'hidden' },\n thumbnailAssetId: { visibility: 'hidden' },\n tenantId: { visibility: 'hidden' },\n },\n },\n } as const;\n}\n"],"mappings":"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"}
|
package/dist/manifest.json
CHANGED
package/dist/smrt-knowledge.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"sensitiveFieldsExcluded": true,
|
|
4
4
|
"generatedAt": "1970-01-01T00:00:00.000Z",
|
|
5
5
|
"packageName": "@happyvertical/smrt-voice",
|
|
6
|
-
"packageVersion": "0.60.
|
|
6
|
+
"packageVersion": "0.60.7",
|
|
7
7
|
"sourceManifestPath": "dist/manifest.json",
|
|
8
8
|
"agentDocPath": "AGENTS.md",
|
|
9
9
|
"sourceHashes": {
|
|
10
|
-
"manifest": "
|
|
11
|
-
"packageJson": "
|
|
10
|
+
"manifest": "29e8b922acaecbf16d080e1d689d0ea633273d798b8230fd95a9b2db5171cf2d",
|
|
11
|
+
"packageJson": "19edc2b250e4661993d2cdc38627d14e49fce11edba164615e88967024bf3b07",
|
|
12
12
|
"agents": "44afd317b5b5f1d45bde629752dcf52445d4aec5f1032793f0b9aebc5893349f"
|
|
13
13
|
},
|
|
14
14
|
"exports": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-voice",
|
|
3
|
-
"version": "0.60.
|
|
3
|
+
"version": "0.60.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Voice profile management for AI-powered voice synthesis and cloning in the SMRT ecosystem",
|
|
6
6
|
"author": "HappyVertical",
|
|
@@ -29,17 +29,17 @@
|
|
|
29
29
|
"AGENTS.md"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@happyvertical/smrt-assets": "0.60.
|
|
33
|
-
"@happyvertical/smrt-config": "0.60.
|
|
34
|
-
"@happyvertical/smrt-content": "0.60.
|
|
35
|
-
"@happyvertical/smrt-core": "0.60.
|
|
36
|
-
"@happyvertical/smrt-tenancy": "0.60.
|
|
32
|
+
"@happyvertical/smrt-assets": "0.60.7",
|
|
33
|
+
"@happyvertical/smrt-config": "0.60.7",
|
|
34
|
+
"@happyvertical/smrt-content": "0.60.7",
|
|
35
|
+
"@happyvertical/smrt-core": "0.60.7",
|
|
36
|
+
"@happyvertical/smrt-tenancy": "0.60.7",
|
|
37
37
|
"@happyvertical/speech": "^0.111.3",
|
|
38
38
|
"@happyvertical/utils": "^0.111.3"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@happyvertical/logger": "^0.111.3",
|
|
42
|
-
"@happyvertical/smrt-vitest": "0.60.
|
|
42
|
+
"@happyvertical/smrt-vitest": "0.60.7",
|
|
43
43
|
"@happyvertical/sql": "^0.111.3",
|
|
44
44
|
"@types/node": "24.13.6",
|
|
45
45
|
"typescript": "6.0.3",
|