@pablo2410/core-server 0.2.0 → 0.2.1
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.d.ts +6 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/package.json +13 -5
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
export { AuthEnv, BaseUser, DbAdapter, ExchangeTokenResponse, GetUserInfoResponse, GetUserInfoWithJwtResponse, PortalUser, RoleMapper, SessionPayload, SubdomainAuth, SubdomainAuthConfig, UpsertUserPayload, createSubdomainAuth } from './auth.js';
|
|
2
2
|
import 'express';
|
|
3
3
|
|
|
4
|
+
declare const SQDCP_PILLARS: readonly ["safety", "quality", "delivery", "cost", "people"];
|
|
5
|
+
type SqdcpPillar = typeof SQDCP_PILLARS[number];
|
|
6
|
+
declare const SQDCP_PILLAR_COLORS: Record<SqdcpPillar, string>;
|
|
7
|
+
declare const SQDCP_PILLAR_LABELS: Record<SqdcpPillar, string>;
|
|
8
|
+
|
|
4
9
|
/**
|
|
5
10
|
* Minimal environment interface required by core-server utilities.
|
|
6
11
|
* Each subdomain provides its own ENV object that satisfies this shape.
|
|
@@ -245,4 +250,4 @@ type TranscriptionError = {
|
|
|
245
250
|
type TranscriptionResult = WhisperResponse | TranscriptionError;
|
|
246
251
|
declare function createTranscriptionClient(env: CoreEnv): (options: TranscribeOptions) => Promise<TranscriptionResult>;
|
|
247
252
|
|
|
248
|
-
export { type CoreEnv, type DataApiCallOptions, type FileContent, type GenerateImageOptions, type GenerateImageResponse, type ImageContent, type InvokeParams, type InvokeResult, type MapRequestParams, type Message, type MessageContent, type NotificationPayload, type OutputSchema, type ResponseFormat, type Role, type StoragePutFn, type TextContent, type Tool, type ToolChoice, type TranscribeOptions, type TranscriptionError, type TranscriptionResult, type WhisperResponse, type WhisperSegment, createDataApiClient, createImageGenerator, createLLMClient, createMapClient, createNotificationClient, createTranscriptionClient };
|
|
253
|
+
export { type CoreEnv, type DataApiCallOptions, type FileContent, type GenerateImageOptions, type GenerateImageResponse, type ImageContent, type InvokeParams, type InvokeResult, type MapRequestParams, type Message, type MessageContent, type NotificationPayload, type OutputSchema, type ResponseFormat, type Role, SQDCP_PILLARS, SQDCP_PILLAR_COLORS, SQDCP_PILLAR_LABELS, type SqdcpPillar, type StoragePutFn, type TextContent, type Tool, type ToolChoice, type TranscribeOptions, type TranscriptionError, type TranscriptionResult, type WhisperResponse, type WhisperSegment, createDataApiClient, createImageGenerator, createLLMClient, createMapClient, createNotificationClient, createTranscriptionClient };
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,23 @@ import {
|
|
|
2
2
|
createSubdomainAuth
|
|
3
3
|
} from "./chunk-BSM4MWQQ.js";
|
|
4
4
|
|
|
5
|
+
// src/constants/sqdcp.ts
|
|
6
|
+
var SQDCP_PILLARS = ["safety", "quality", "delivery", "cost", "people"];
|
|
7
|
+
var SQDCP_PILLAR_COLORS = {
|
|
8
|
+
safety: "#ef4444",
|
|
9
|
+
quality: "#3b82f6",
|
|
10
|
+
delivery: "#f59e0b",
|
|
11
|
+
cost: "#10b981",
|
|
12
|
+
people: "#a855f7"
|
|
13
|
+
};
|
|
14
|
+
var SQDCP_PILLAR_LABELS = {
|
|
15
|
+
safety: "Safety",
|
|
16
|
+
quality: "Quality",
|
|
17
|
+
delivery: "Delivery",
|
|
18
|
+
cost: "Cost",
|
|
19
|
+
people: "People"
|
|
20
|
+
};
|
|
21
|
+
|
|
5
22
|
// src/dataApi.ts
|
|
6
23
|
function createDataApiClient(env) {
|
|
7
24
|
return async function callDataApi(apiId, options = {}) {
|
|
@@ -461,6 +478,9 @@ function createTranscriptionClient(env) {
|
|
|
461
478
|
};
|
|
462
479
|
}
|
|
463
480
|
export {
|
|
481
|
+
SQDCP_PILLARS,
|
|
482
|
+
SQDCP_PILLAR_COLORS,
|
|
483
|
+
SQDCP_PILLAR_LABELS,
|
|
464
484
|
createDataApiClient,
|
|
465
485
|
createImageGenerator,
|
|
466
486
|
createLLMClient,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dataApi.ts","../src/llm.ts","../src/imageGeneration.ts","../src/map.ts","../src/notification.ts","../src/voiceTranscription.ts"],"sourcesContent":["/**\n * Data API helper — calls the Manus built-in Data API Hub.\n *\n * Quick example:\n * const callDataApi = createDataApiClient(ENV);\n * await callDataApi(\"Youtube/search\", {\n * query: { gl: \"US\", hl: \"en\", q: \"manus\" },\n * });\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type DataApiCallOptions = {\n query?: Record<string, unknown>;\n body?: Record<string, unknown>;\n pathParams?: Record<string, unknown>;\n formData?: Record<string, unknown>;\n};\n\nexport function createDataApiClient(env: CoreEnv) {\n return async function callDataApi(\n apiId: string,\n options: DataApiCallOptions = {}\n ): Promise<unknown> {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const fullUrl = new URL(\n \"webdevtoken.v1.WebDevService/CallApi\",\n baseUrl\n ).toString();\n\n const response = await fetch(fullUrl, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n \"connect-protocol-version\": \"1\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify({\n apiId,\n query: options.query,\n body: options.body,\n path_params: options.pathParams,\n multipart_form_data: options.formData,\n }),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `Data API request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : \"\"}`\n );\n }\n\n const payload = await response.json().catch(() => ({}));\n if (payload && typeof payload === \"object\" && \"jsonData\" in payload) {\n try {\n return JSON.parse(\n (payload as Record<string, string>).jsonData ?? \"{}\"\n );\n } catch {\n return (payload as Record<string, unknown>).jsonData;\n }\n }\n return payload;\n };\n}\n","/**\n * LLM helper — calls the Manus built-in LLM API (OpenAI-compatible).\n *\n * Example:\n * const invokeLLM = createLLMClient(ENV);\n * const result = await invokeLLM({\n * messages: [\n * { role: \"system\", content: \"You are a helpful assistant.\" },\n * { role: \"user\", content: \"Hello, world!\" },\n * ],\n * });\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type Role = \"system\" | \"user\" | \"assistant\" | \"tool\" | \"function\";\n\nexport type TextContent = {\n type: \"text\";\n text: string;\n};\n\nexport type ImageContent = {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"auto\" | \"low\" | \"high\";\n };\n};\n\nexport type FileContent = {\n type: \"file_url\";\n file_url: {\n url: string;\n mime_type?:\n | \"audio/mpeg\"\n | \"audio/wav\"\n | \"application/pdf\"\n | \"audio/mp4\"\n | \"video/mp4\";\n };\n};\n\nexport type MessageContent = string | TextContent | ImageContent | FileContent;\n\nexport type Message = {\n role: Role;\n name?: string;\n tool_call_id?: string;\n content: MessageContent | MessageContent[];\n};\n\nexport type Tool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n};\n\ntype ToolChoiceExplicit = {\n type: \"function\";\n function: { name: string };\n};\n\nexport type ToolChoice =\n | \"none\"\n | \"auto\"\n | \"required\"\n | { name: string }\n | ToolChoiceExplicit;\n\ntype JsonSchema = {\n name: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n};\n\nexport type ResponseFormat =\n | { type: \"text\" }\n | { type: \"json_object\" }\n | { type: \"json_schema\"; json_schema: JsonSchema };\n\nexport type OutputSchema = {\n name: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n};\n\nexport type InvokeParams = {\n messages: Message[];\n tools?: Tool[];\n toolChoice?: ToolChoice;\n tool_choice?: ToolChoice;\n outputSchema?: OutputSchema;\n output_schema?: OutputSchema;\n responseFormat?: ResponseFormat;\n response_format?: ResponseFormat;\n};\n\nexport type InvokeResult = {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n};\n\nconst ensureArray = (\n value: MessageContent | MessageContent[]\n): MessageContent[] => (Array.isArray(value) ? value : [value]);\n\nconst normalizeContentPart = (\n part: MessageContent\n): TextContent | ImageContent | FileContent => {\n if (typeof part === \"string\") {\n return { type: \"text\", text: part };\n }\n if (part.type === \"text\") return part;\n if (part.type === \"image_url\") return part;\n if (part.type === \"file_url\") return part;\n throw new Error(\"Unsupported message content part\");\n};\n\nconst normalizeMessage = (message: Message) => {\n const { role, name, tool_call_id } = message;\n if (role === \"tool\" || role === \"function\") {\n const content = ensureArray(message.content)\n .map((part) => (typeof part === \"string\" ? part : JSON.stringify(part)))\n .join(\"\\n\");\n return { role, name, tool_call_id, content };\n }\n const contentParts = ensureArray(message.content).map(normalizeContentPart);\n if (contentParts.length === 1 && contentParts[0].type === \"text\") {\n return { role, name, content: contentParts[0].text };\n }\n return { role, name, content: contentParts };\n};\n\nconst normalizeToolChoice = (\n toolChoice: ToolChoice | undefined,\n tools: Tool[] | undefined\n): \"none\" | \"auto\" | ToolChoiceExplicit | undefined => {\n if (!toolChoice) return undefined;\n if (toolChoice === \"none\" || toolChoice === \"auto\") return toolChoice;\n if (toolChoice === \"required\") {\n if (!tools || tools.length === 0) {\n throw new Error(\n \"tool_choice 'required' was provided but no tools were configured\"\n );\n }\n if (tools.length > 1) {\n throw new Error(\n \"tool_choice 'required' needs a single tool or specify the tool name explicitly\"\n );\n }\n return { type: \"function\", function: { name: tools[0].function.name } };\n }\n if (\"name\" in toolChoice) {\n return { type: \"function\", function: { name: toolChoice.name } };\n }\n return toolChoice;\n};\n\nconst normalizeResponseFormat = ({\n responseFormat,\n response_format,\n outputSchema,\n output_schema,\n}: {\n responseFormat?: ResponseFormat;\n response_format?: ResponseFormat;\n outputSchema?: OutputSchema;\n output_schema?: OutputSchema;\n}):\n | { type: \"json_schema\"; json_schema: JsonSchema }\n | { type: \"text\" }\n | { type: \"json_object\" }\n | undefined => {\n const explicitFormat = responseFormat || response_format;\n if (explicitFormat) {\n if (\n explicitFormat.type === \"json_schema\" &&\n !explicitFormat.json_schema?.schema\n ) {\n throw new Error(\n \"responseFormat json_schema requires a defined schema object\"\n );\n }\n return explicitFormat;\n }\n const schema = outputSchema || output_schema;\n if (!schema) return undefined;\n if (!schema.name || !schema.schema) {\n throw new Error(\"outputSchema requires both name and schema\");\n }\n return {\n type: \"json_schema\",\n json_schema: {\n name: schema.name,\n schema: schema.schema,\n ...(typeof schema.strict === \"boolean\" ? { strict: schema.strict } : {}),\n },\n };\n};\n\nexport function createLLMClient(env: CoreEnv) {\n const resolveApiUrl = () =>\n env.forgeApiUrl && env.forgeApiUrl.trim().length > 0\n ? `${env.forgeApiUrl.replace(/\\/$/, \"\")}/v1/chat/completions`\n : \"https://forge.manus.im/v1/chat/completions\";\n\n const assertApiKey = () => {\n if (!env.forgeApiKey) {\n throw new Error(\"OPENAI_API_KEY is not configured\");\n }\n };\n\n return async function invokeLLM(\n params: InvokeParams\n ): Promise<InvokeResult> {\n assertApiKey();\n\n const {\n messages,\n tools,\n toolChoice,\n tool_choice,\n outputSchema,\n output_schema,\n responseFormat,\n response_format,\n } = params;\n\n const payload: Record<string, unknown> = {\n model: \"gemini-2.5-flash\",\n messages: messages.map(normalizeMessage),\n };\n\n if (tools && tools.length > 0) {\n payload.tools = tools;\n }\n\n const normalizedToolChoice = normalizeToolChoice(\n toolChoice || tool_choice,\n tools\n );\n if (normalizedToolChoice) {\n payload.tool_choice = normalizedToolChoice;\n }\n\n payload.max_tokens = 32768;\n payload.thinking = { budget_tokens: 128 };\n\n const normalizedResponseFormat = normalizeResponseFormat({\n responseFormat,\n response_format,\n outputSchema,\n output_schema,\n });\n if (normalizedResponseFormat) {\n payload.response_format = normalizedResponseFormat;\n }\n\n const response = await fetch(resolveApiUrl(), {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `LLM invoke failed: ${response.status} ${response.statusText} – ${errorText}`\n );\n }\n\n return (await response.json()) as InvokeResult;\n };\n}\n","/**\n * Image generation helper using internal ImageService.\n *\n * Example:\n * import { storagePut } from \"../storage\";\n * const generateImage = createImageGenerator(ENV, storagePut);\n * const { url } = await generateImage({ prompt: \"A serene landscape\" });\n */\nimport type { CoreEnv, StoragePutFn } from \"./types\";\n\nexport type GenerateImageOptions = {\n prompt: string;\n originalImages?: Array<{\n url?: string;\n b64Json?: string;\n mimeType?: string;\n }>;\n};\n\nexport type GenerateImageResponse = {\n url?: string;\n};\n\nexport function createImageGenerator(env: CoreEnv, storagePut: StoragePutFn) {\n return async function generateImage(\n options: GenerateImageOptions\n ): Promise<GenerateImageResponse> {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const fullUrl = new URL(\n \"images.v1.ImageService/GenerateImage\",\n baseUrl\n ).toString();\n\n const response = await fetch(fullUrl, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n \"connect-protocol-version\": \"1\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify({\n prompt: options.prompt,\n original_images: options.originalImages || [],\n }),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `Image generation request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : \"\"}`\n );\n }\n\n const result = (await response.json()) as {\n image: {\n b64Json: string;\n mimeType: string;\n };\n };\n\n const base64Data = result.image.b64Json;\n const buffer = Buffer.from(base64Data, \"base64\");\n\n const { url } = await storagePut(\n `generated/${Date.now()}.png`,\n buffer,\n result.image.mimeType\n );\n\n return { url };\n };\n}\n","/**\n * Google Maps API Integration for Manus WebDev Templates.\n *\n * Main function: createMapClient(env) returns makeRequest<T>(endpoint, params)\n * All credentials are automatically injected. Array parameters use | as separator.\n *\n * Example:\n * const makeRequest = createMapClient(ENV);\n * const result = await makeRequest<GeocodeResult>(\n * \"/maps/api/geocode/json\",\n * { address: \"1600 Amphitheatre Parkway\" }\n * );\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type MapRequestParams = Record<\n string,\n string | number | boolean | string[] | undefined\n>;\n\nexport function createMapClient(env: CoreEnv) {\n return async function makeRequest<T = unknown>(\n endpoint: string,\n params: MapRequestParams = {}\n ): Promise<T> {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const proxyUrl = new URL(\n \"webdevtoken.v1.WebDevService/GoogleMapsProxy\",\n baseUrl\n ).toString();\n\n const processedParams: Record<string, string> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n processedParams[key] = value.join(\"|\");\n } else {\n processedParams[key] = String(value);\n }\n }\n\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n \"connect-protocol-version\": \"1\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify({\n endpoint,\n params: processedParams,\n }),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `Maps API request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : \"\"}`\n );\n }\n\n const wrapper = (await response.json()) as { jsonData?: string };\n if (wrapper.jsonData) {\n try {\n return JSON.parse(wrapper.jsonData) as T;\n } catch {\n return wrapper.jsonData as unknown as T;\n }\n }\n return wrapper as unknown as T;\n };\n}\n","/**\n * Owner notification helper — pushes operational updates to the Manus project owner.\n *\n * Example:\n * const notifyOwner = createNotificationClient(ENV);\n * await notifyOwner({ title: \"New submission\", content: \"User X submitted form Y\" });\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type NotificationPayload = {\n title: string;\n content: string;\n};\n\nconst TITLE_MAX_LENGTH = 1200;\nconst CONTENT_MAX_LENGTH = 20000;\n\nexport function createNotificationClient(env: CoreEnv) {\n return async function notifyOwner(\n payload: NotificationPayload\n ): Promise<boolean> {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n const title =\n payload.title.length > TITLE_MAX_LENGTH\n ? payload.title.slice(0, TITLE_MAX_LENGTH)\n : payload.title;\n const content =\n payload.content.length > CONTENT_MAX_LENGTH\n ? payload.content.slice(0, CONTENT_MAX_LENGTH)\n : payload.content;\n\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const fullUrl = new URL(\n \"webdevtoken.v1.WebDevService/NotifyOwner\",\n baseUrl\n ).toString();\n\n try {\n const response = await fetch(fullUrl, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n \"connect-protocol-version\": \"1\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify({ title, content }),\n });\n\n if (!response.ok) {\n console.error(\n `Notification failed: ${response.status} ${response.statusText}`\n );\n return false;\n }\n return true;\n } catch (error) {\n console.error(\"Notification error:\", error);\n return false;\n }\n };\n}\n","/**\n * Voice transcription helper using internal Speech-to-Text service (Whisper API).\n *\n * Example:\n * const transcribeAudio = createTranscriptionClient(ENV);\n * const result = await transcribeAudio({\n * audioUrl: \"https://storage.example.com/audio/recording.mp3\",\n * language: \"en\",\n * });\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type TranscribeOptions = {\n audioUrl: string;\n language?: string;\n prompt?: string;\n};\n\nexport type WhisperSegment = {\n id: number;\n seek: number;\n start: number;\n end: number;\n text: string;\n tokens: number[];\n temperature: number;\n avg_logprob: number;\n compression_ratio: number;\n no_speech_prob: number;\n};\n\nexport type WhisperResponse = {\n task: string;\n language: string;\n duration: number;\n text: string;\n segments: WhisperSegment[];\n};\n\nexport type TranscriptionError = {\n error: string;\n code: string;\n details: string;\n};\n\nexport type TranscriptionResult = WhisperResponse | TranscriptionError;\n\nconst SUPPORTED_MIME_TYPES = [\n \"audio/webm\",\n \"audio/mp3\",\n \"audio/mpeg\",\n \"audio/wav\",\n \"audio/wave\",\n \"audio/ogg\",\n \"audio/m4a\",\n \"audio/mp4\",\n] as const;\n\nfunction getFileExtension(mimeType: string): string {\n const mimeToExt: Record<string, string> = {\n \"audio/webm\": \"webm\",\n \"audio/mp3\": \"mp3\",\n \"audio/mpeg\": \"mp3\",\n \"audio/wav\": \"wav\",\n \"audio/wave\": \"wav\",\n \"audio/ogg\": \"ogg\",\n \"audio/m4a\": \"m4a\",\n \"audio/mp4\": \"m4a\",\n };\n return mimeToExt[mimeType] || \"audio\";\n}\n\nfunction getLanguageName(langCode: string): string {\n const langMap: Record<string, string> = {\n en: \"English\",\n es: \"Spanish\",\n fr: \"French\",\n de: \"German\",\n it: \"Italian\",\n pt: \"Portuguese\",\n ru: \"Russian\",\n ja: \"Japanese\",\n ko: \"Korean\",\n zh: \"Chinese\",\n ar: \"Arabic\",\n hi: \"Hindi\",\n nl: \"Dutch\",\n pl: \"Polish\",\n tr: \"Turkish\",\n sv: \"Swedish\",\n da: \"Danish\",\n no: \"Norwegian\",\n fi: \"Finnish\",\n };\n return langMap[langCode] || langCode;\n}\n\nexport function createTranscriptionClient(env: CoreEnv) {\n return async function transcribeAudio(\n options: TranscribeOptions\n ): Promise<TranscriptionResult> {\n try {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n // Step 1: Fetch the audio file to determine MIME type and validate\n const audioResponse = await fetch(options.audioUrl);\n if (!audioResponse.ok) {\n return {\n error: \"Failed to fetch audio file\",\n code: \"FETCH_FAILED\",\n details: `HTTP ${audioResponse.status} ${audioResponse.statusText}`,\n };\n }\n\n const contentType =\n audioResponse.headers.get(\"content-type\") || \"audio/webm\";\n const mimeType = contentType.split(\";\")[0].trim();\n\n if (\n !SUPPORTED_MIME_TYPES.includes(\n mimeType as (typeof SUPPORTED_MIME_TYPES)[number]\n )\n ) {\n return {\n error: \"Unsupported audio format\",\n code: \"UNSUPPORTED_FORMAT\",\n details: `MIME type '${mimeType}' is not supported. Supported: ${SUPPORTED_MIME_TYPES.join(\", \")}`,\n };\n }\n\n // Step 2: Read audio buffer and check size\n const audioBuffer = await audioResponse.arrayBuffer();\n const sizeMB = audioBuffer.byteLength / (1024 * 1024);\n if (sizeMB > 16) {\n return {\n error: \"Audio file exceeds maximum size limit\",\n code: \"FILE_TOO_LARGE\",\n details: `File size is ${sizeMB.toFixed(2)}MB, maximum allowed is 16MB`,\n };\n }\n\n // Step 3: Create FormData for multipart upload to Whisper API\n const formData = new FormData();\n const filename = `audio.${getFileExtension(mimeType)}`;\n const audioBlob = new Blob([new Uint8Array(audioBuffer)], {\n type: mimeType,\n });\n formData.append(\"file\", audioBlob, filename);\n formData.append(\"model\", \"whisper-1\");\n formData.append(\"response_format\", \"verbose_json\");\n\n const prompt =\n options.prompt ||\n (options.language\n ? `Transcribe the user's voice to text, the user's working language is ${getLanguageName(options.language)}`\n : \"Transcribe the user's voice to text\");\n formData.append(\"prompt\", prompt);\n\n // Step 4: Call the transcription service\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const fullUrl = new URL(\"v1/audio/transcriptions\", baseUrl).toString();\n\n const response = await fetch(fullUrl, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${env.forgeApiKey}`,\n \"Accept-Encoding\": \"identity\",\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"\");\n return {\n error: \"Transcription service request failed\",\n code: \"TRANSCRIPTION_FAILED\",\n details: `${response.status} ${response.statusText}${errorText ? `: ${errorText}` : \"\"}`,\n };\n }\n\n // Step 5: Parse and return the transcription result\n const whisperResponse = (await response.json()) as WhisperResponse;\n\n if (\n !whisperResponse.text ||\n typeof whisperResponse.text !== \"string\"\n ) {\n return {\n error: \"Invalid transcription response\",\n code: \"SERVICE_ERROR\",\n details:\n \"Transcription service returned an invalid response format\",\n };\n }\n\n return whisperResponse;\n } catch (error) {\n return {\n error: \"Voice transcription failed\",\n code: \"SERVICE_ERROR\",\n details:\n error instanceof Error\n ? error.message\n : \"An unexpected error occurred\",\n };\n }\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/constants/sqdcp.ts","../src/dataApi.ts","../src/llm.ts","../src/imageGeneration.ts","../src/map.ts","../src/notification.ts","../src/voiceTranscription.ts"],"sourcesContent":["export const SQDCP_PILLARS = ['safety', 'quality', 'delivery', 'cost', 'people'] as const;\nexport type SqdcpPillar = typeof SQDCP_PILLARS[number];\nexport const SQDCP_PILLAR_COLORS: Record<SqdcpPillar, string> = {\n safety: '#ef4444',\n quality: '#3b82f6',\n delivery: '#f59e0b',\n cost: '#10b981',\n people: '#a855f7',\n};\nexport const SQDCP_PILLAR_LABELS: Record<SqdcpPillar, string> = {\n safety: 'Safety',\n quality: 'Quality',\n delivery: 'Delivery',\n cost: 'Cost',\n people: 'People',\n};\n","/**\n * Data API helper — calls the Manus built-in Data API Hub.\n *\n * Quick example:\n * const callDataApi = createDataApiClient(ENV);\n * await callDataApi(\"Youtube/search\", {\n * query: { gl: \"US\", hl: \"en\", q: \"manus\" },\n * });\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type DataApiCallOptions = {\n query?: Record<string, unknown>;\n body?: Record<string, unknown>;\n pathParams?: Record<string, unknown>;\n formData?: Record<string, unknown>;\n};\n\nexport function createDataApiClient(env: CoreEnv) {\n return async function callDataApi(\n apiId: string,\n options: DataApiCallOptions = {}\n ): Promise<unknown> {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const fullUrl = new URL(\n \"webdevtoken.v1.WebDevService/CallApi\",\n baseUrl\n ).toString();\n\n const response = await fetch(fullUrl, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n \"connect-protocol-version\": \"1\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify({\n apiId,\n query: options.query,\n body: options.body,\n path_params: options.pathParams,\n multipart_form_data: options.formData,\n }),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `Data API request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : \"\"}`\n );\n }\n\n const payload = await response.json().catch(() => ({}));\n if (payload && typeof payload === \"object\" && \"jsonData\" in payload) {\n try {\n return JSON.parse(\n (payload as Record<string, string>).jsonData ?? \"{}\"\n );\n } catch {\n return (payload as Record<string, unknown>).jsonData;\n }\n }\n return payload;\n };\n}\n","/**\n * LLM helper — calls the Manus built-in LLM API (OpenAI-compatible).\n *\n * Example:\n * const invokeLLM = createLLMClient(ENV);\n * const result = await invokeLLM({\n * messages: [\n * { role: \"system\", content: \"You are a helpful assistant.\" },\n * { role: \"user\", content: \"Hello, world!\" },\n * ],\n * });\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type Role = \"system\" | \"user\" | \"assistant\" | \"tool\" | \"function\";\n\nexport type TextContent = {\n type: \"text\";\n text: string;\n};\n\nexport type ImageContent = {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"auto\" | \"low\" | \"high\";\n };\n};\n\nexport type FileContent = {\n type: \"file_url\";\n file_url: {\n url: string;\n mime_type?:\n | \"audio/mpeg\"\n | \"audio/wav\"\n | \"application/pdf\"\n | \"audio/mp4\"\n | \"video/mp4\";\n };\n};\n\nexport type MessageContent = string | TextContent | ImageContent | FileContent;\n\nexport type Message = {\n role: Role;\n name?: string;\n tool_call_id?: string;\n content: MessageContent | MessageContent[];\n};\n\nexport type Tool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n};\n\ntype ToolChoiceExplicit = {\n type: \"function\";\n function: { name: string };\n};\n\nexport type ToolChoice =\n | \"none\"\n | \"auto\"\n | \"required\"\n | { name: string }\n | ToolChoiceExplicit;\n\ntype JsonSchema = {\n name: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n};\n\nexport type ResponseFormat =\n | { type: \"text\" }\n | { type: \"json_object\" }\n | { type: \"json_schema\"; json_schema: JsonSchema };\n\nexport type OutputSchema = {\n name: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n};\n\nexport type InvokeParams = {\n messages: Message[];\n tools?: Tool[];\n toolChoice?: ToolChoice;\n tool_choice?: ToolChoice;\n outputSchema?: OutputSchema;\n output_schema?: OutputSchema;\n responseFormat?: ResponseFormat;\n response_format?: ResponseFormat;\n};\n\nexport type InvokeResult = {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n};\n\nconst ensureArray = (\n value: MessageContent | MessageContent[]\n): MessageContent[] => (Array.isArray(value) ? value : [value]);\n\nconst normalizeContentPart = (\n part: MessageContent\n): TextContent | ImageContent | FileContent => {\n if (typeof part === \"string\") {\n return { type: \"text\", text: part };\n }\n if (part.type === \"text\") return part;\n if (part.type === \"image_url\") return part;\n if (part.type === \"file_url\") return part;\n throw new Error(\"Unsupported message content part\");\n};\n\nconst normalizeMessage = (message: Message) => {\n const { role, name, tool_call_id } = message;\n if (role === \"tool\" || role === \"function\") {\n const content = ensureArray(message.content)\n .map((part) => (typeof part === \"string\" ? part : JSON.stringify(part)))\n .join(\"\\n\");\n return { role, name, tool_call_id, content };\n }\n const contentParts = ensureArray(message.content).map(normalizeContentPart);\n if (contentParts.length === 1 && contentParts[0].type === \"text\") {\n return { role, name, content: contentParts[0].text };\n }\n return { role, name, content: contentParts };\n};\n\nconst normalizeToolChoice = (\n toolChoice: ToolChoice | undefined,\n tools: Tool[] | undefined\n): \"none\" | \"auto\" | ToolChoiceExplicit | undefined => {\n if (!toolChoice) return undefined;\n if (toolChoice === \"none\" || toolChoice === \"auto\") return toolChoice;\n if (toolChoice === \"required\") {\n if (!tools || tools.length === 0) {\n throw new Error(\n \"tool_choice 'required' was provided but no tools were configured\"\n );\n }\n if (tools.length > 1) {\n throw new Error(\n \"tool_choice 'required' needs a single tool or specify the tool name explicitly\"\n );\n }\n return { type: \"function\", function: { name: tools[0].function.name } };\n }\n if (\"name\" in toolChoice) {\n return { type: \"function\", function: { name: toolChoice.name } };\n }\n return toolChoice;\n};\n\nconst normalizeResponseFormat = ({\n responseFormat,\n response_format,\n outputSchema,\n output_schema,\n}: {\n responseFormat?: ResponseFormat;\n response_format?: ResponseFormat;\n outputSchema?: OutputSchema;\n output_schema?: OutputSchema;\n}):\n | { type: \"json_schema\"; json_schema: JsonSchema }\n | { type: \"text\" }\n | { type: \"json_object\" }\n | undefined => {\n const explicitFormat = responseFormat || response_format;\n if (explicitFormat) {\n if (\n explicitFormat.type === \"json_schema\" &&\n !explicitFormat.json_schema?.schema\n ) {\n throw new Error(\n \"responseFormat json_schema requires a defined schema object\"\n );\n }\n return explicitFormat;\n }\n const schema = outputSchema || output_schema;\n if (!schema) return undefined;\n if (!schema.name || !schema.schema) {\n throw new Error(\"outputSchema requires both name and schema\");\n }\n return {\n type: \"json_schema\",\n json_schema: {\n name: schema.name,\n schema: schema.schema,\n ...(typeof schema.strict === \"boolean\" ? { strict: schema.strict } : {}),\n },\n };\n};\n\nexport function createLLMClient(env: CoreEnv) {\n const resolveApiUrl = () =>\n env.forgeApiUrl && env.forgeApiUrl.trim().length > 0\n ? `${env.forgeApiUrl.replace(/\\/$/, \"\")}/v1/chat/completions`\n : \"https://forge.manus.im/v1/chat/completions\";\n\n const assertApiKey = () => {\n if (!env.forgeApiKey) {\n throw new Error(\"OPENAI_API_KEY is not configured\");\n }\n };\n\n return async function invokeLLM(\n params: InvokeParams\n ): Promise<InvokeResult> {\n assertApiKey();\n\n const {\n messages,\n tools,\n toolChoice,\n tool_choice,\n outputSchema,\n output_schema,\n responseFormat,\n response_format,\n } = params;\n\n const payload: Record<string, unknown> = {\n model: \"gemini-2.5-flash\",\n messages: messages.map(normalizeMessage),\n };\n\n if (tools && tools.length > 0) {\n payload.tools = tools;\n }\n\n const normalizedToolChoice = normalizeToolChoice(\n toolChoice || tool_choice,\n tools\n );\n if (normalizedToolChoice) {\n payload.tool_choice = normalizedToolChoice;\n }\n\n payload.max_tokens = 32768;\n payload.thinking = { budget_tokens: 128 };\n\n const normalizedResponseFormat = normalizeResponseFormat({\n responseFormat,\n response_format,\n outputSchema,\n output_schema,\n });\n if (normalizedResponseFormat) {\n payload.response_format = normalizedResponseFormat;\n }\n\n const response = await fetch(resolveApiUrl(), {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `LLM invoke failed: ${response.status} ${response.statusText} – ${errorText}`\n );\n }\n\n return (await response.json()) as InvokeResult;\n };\n}\n","/**\n * Image generation helper using internal ImageService.\n *\n * Example:\n * import { storagePut } from \"../storage\";\n * const generateImage = createImageGenerator(ENV, storagePut);\n * const { url } = await generateImage({ prompt: \"A serene landscape\" });\n */\nimport type { CoreEnv, StoragePutFn } from \"./types\";\n\nexport type GenerateImageOptions = {\n prompt: string;\n originalImages?: Array<{\n url?: string;\n b64Json?: string;\n mimeType?: string;\n }>;\n};\n\nexport type GenerateImageResponse = {\n url?: string;\n};\n\nexport function createImageGenerator(env: CoreEnv, storagePut: StoragePutFn) {\n return async function generateImage(\n options: GenerateImageOptions\n ): Promise<GenerateImageResponse> {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const fullUrl = new URL(\n \"images.v1.ImageService/GenerateImage\",\n baseUrl\n ).toString();\n\n const response = await fetch(fullUrl, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n \"connect-protocol-version\": \"1\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify({\n prompt: options.prompt,\n original_images: options.originalImages || [],\n }),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `Image generation request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : \"\"}`\n );\n }\n\n const result = (await response.json()) as {\n image: {\n b64Json: string;\n mimeType: string;\n };\n };\n\n const base64Data = result.image.b64Json;\n const buffer = Buffer.from(base64Data, \"base64\");\n\n const { url } = await storagePut(\n `generated/${Date.now()}.png`,\n buffer,\n result.image.mimeType\n );\n\n return { url };\n };\n}\n","/**\n * Google Maps API Integration for Manus WebDev Templates.\n *\n * Main function: createMapClient(env) returns makeRequest<T>(endpoint, params)\n * All credentials are automatically injected. Array parameters use | as separator.\n *\n * Example:\n * const makeRequest = createMapClient(ENV);\n * const result = await makeRequest<GeocodeResult>(\n * \"/maps/api/geocode/json\",\n * { address: \"1600 Amphitheatre Parkway\" }\n * );\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type MapRequestParams = Record<\n string,\n string | number | boolean | string[] | undefined\n>;\n\nexport function createMapClient(env: CoreEnv) {\n return async function makeRequest<T = unknown>(\n endpoint: string,\n params: MapRequestParams = {}\n ): Promise<T> {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const proxyUrl = new URL(\n \"webdevtoken.v1.WebDevService/GoogleMapsProxy\",\n baseUrl\n ).toString();\n\n const processedParams: Record<string, string> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n processedParams[key] = value.join(\"|\");\n } else {\n processedParams[key] = String(value);\n }\n }\n\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n \"connect-protocol-version\": \"1\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify({\n endpoint,\n params: processedParams,\n }),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n throw new Error(\n `Maps API request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : \"\"}`\n );\n }\n\n const wrapper = (await response.json()) as { jsonData?: string };\n if (wrapper.jsonData) {\n try {\n return JSON.parse(wrapper.jsonData) as T;\n } catch {\n return wrapper.jsonData as unknown as T;\n }\n }\n return wrapper as unknown as T;\n };\n}\n","/**\n * Owner notification helper — pushes operational updates to the Manus project owner.\n *\n * Example:\n * const notifyOwner = createNotificationClient(ENV);\n * await notifyOwner({ title: \"New submission\", content: \"User X submitted form Y\" });\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type NotificationPayload = {\n title: string;\n content: string;\n};\n\nconst TITLE_MAX_LENGTH = 1200;\nconst CONTENT_MAX_LENGTH = 20000;\n\nexport function createNotificationClient(env: CoreEnv) {\n return async function notifyOwner(\n payload: NotificationPayload\n ): Promise<boolean> {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n const title =\n payload.title.length > TITLE_MAX_LENGTH\n ? payload.title.slice(0, TITLE_MAX_LENGTH)\n : payload.title;\n const content =\n payload.content.length > CONTENT_MAX_LENGTH\n ? payload.content.slice(0, CONTENT_MAX_LENGTH)\n : payload.content;\n\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const fullUrl = new URL(\n \"webdevtoken.v1.WebDevService/NotifyOwner\",\n baseUrl\n ).toString();\n\n try {\n const response = await fetch(fullUrl, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n \"connect-protocol-version\": \"1\",\n authorization: `Bearer ${env.forgeApiKey}`,\n },\n body: JSON.stringify({ title, content }),\n });\n\n if (!response.ok) {\n console.error(\n `Notification failed: ${response.status} ${response.statusText}`\n );\n return false;\n }\n return true;\n } catch (error) {\n console.error(\"Notification error:\", error);\n return false;\n }\n };\n}\n","/**\n * Voice transcription helper using internal Speech-to-Text service (Whisper API).\n *\n * Example:\n * const transcribeAudio = createTranscriptionClient(ENV);\n * const result = await transcribeAudio({\n * audioUrl: \"https://storage.example.com/audio/recording.mp3\",\n * language: \"en\",\n * });\n */\nimport type { CoreEnv } from \"./types\";\n\nexport type TranscribeOptions = {\n audioUrl: string;\n language?: string;\n prompt?: string;\n};\n\nexport type WhisperSegment = {\n id: number;\n seek: number;\n start: number;\n end: number;\n text: string;\n tokens: number[];\n temperature: number;\n avg_logprob: number;\n compression_ratio: number;\n no_speech_prob: number;\n};\n\nexport type WhisperResponse = {\n task: string;\n language: string;\n duration: number;\n text: string;\n segments: WhisperSegment[];\n};\n\nexport type TranscriptionError = {\n error: string;\n code: string;\n details: string;\n};\n\nexport type TranscriptionResult = WhisperResponse | TranscriptionError;\n\nconst SUPPORTED_MIME_TYPES = [\n \"audio/webm\",\n \"audio/mp3\",\n \"audio/mpeg\",\n \"audio/wav\",\n \"audio/wave\",\n \"audio/ogg\",\n \"audio/m4a\",\n \"audio/mp4\",\n] as const;\n\nfunction getFileExtension(mimeType: string): string {\n const mimeToExt: Record<string, string> = {\n \"audio/webm\": \"webm\",\n \"audio/mp3\": \"mp3\",\n \"audio/mpeg\": \"mp3\",\n \"audio/wav\": \"wav\",\n \"audio/wave\": \"wav\",\n \"audio/ogg\": \"ogg\",\n \"audio/m4a\": \"m4a\",\n \"audio/mp4\": \"m4a\",\n };\n return mimeToExt[mimeType] || \"audio\";\n}\n\nfunction getLanguageName(langCode: string): string {\n const langMap: Record<string, string> = {\n en: \"English\",\n es: \"Spanish\",\n fr: \"French\",\n de: \"German\",\n it: \"Italian\",\n pt: \"Portuguese\",\n ru: \"Russian\",\n ja: \"Japanese\",\n ko: \"Korean\",\n zh: \"Chinese\",\n ar: \"Arabic\",\n hi: \"Hindi\",\n nl: \"Dutch\",\n pl: \"Polish\",\n tr: \"Turkish\",\n sv: \"Swedish\",\n da: \"Danish\",\n no: \"Norwegian\",\n fi: \"Finnish\",\n };\n return langMap[langCode] || langCode;\n}\n\nexport function createTranscriptionClient(env: CoreEnv) {\n return async function transcribeAudio(\n options: TranscribeOptions\n ): Promise<TranscriptionResult> {\n try {\n if (!env.forgeApiUrl) {\n throw new Error(\"BUILT_IN_FORGE_API_URL is not configured\");\n }\n if (!env.forgeApiKey) {\n throw new Error(\"BUILT_IN_FORGE_API_KEY is not configured\");\n }\n\n // Step 1: Fetch the audio file to determine MIME type and validate\n const audioResponse = await fetch(options.audioUrl);\n if (!audioResponse.ok) {\n return {\n error: \"Failed to fetch audio file\",\n code: \"FETCH_FAILED\",\n details: `HTTP ${audioResponse.status} ${audioResponse.statusText}`,\n };\n }\n\n const contentType =\n audioResponse.headers.get(\"content-type\") || \"audio/webm\";\n const mimeType = contentType.split(\";\")[0].trim();\n\n if (\n !SUPPORTED_MIME_TYPES.includes(\n mimeType as (typeof SUPPORTED_MIME_TYPES)[number]\n )\n ) {\n return {\n error: \"Unsupported audio format\",\n code: \"UNSUPPORTED_FORMAT\",\n details: `MIME type '${mimeType}' is not supported. Supported: ${SUPPORTED_MIME_TYPES.join(\", \")}`,\n };\n }\n\n // Step 2: Read audio buffer and check size\n const audioBuffer = await audioResponse.arrayBuffer();\n const sizeMB = audioBuffer.byteLength / (1024 * 1024);\n if (sizeMB > 16) {\n return {\n error: \"Audio file exceeds maximum size limit\",\n code: \"FILE_TOO_LARGE\",\n details: `File size is ${sizeMB.toFixed(2)}MB, maximum allowed is 16MB`,\n };\n }\n\n // Step 3: Create FormData for multipart upload to Whisper API\n const formData = new FormData();\n const filename = `audio.${getFileExtension(mimeType)}`;\n const audioBlob = new Blob([new Uint8Array(audioBuffer)], {\n type: mimeType,\n });\n formData.append(\"file\", audioBlob, filename);\n formData.append(\"model\", \"whisper-1\");\n formData.append(\"response_format\", \"verbose_json\");\n\n const prompt =\n options.prompt ||\n (options.language\n ? `Transcribe the user's voice to text, the user's working language is ${getLanguageName(options.language)}`\n : \"Transcribe the user's voice to text\");\n formData.append(\"prompt\", prompt);\n\n // Step 4: Call the transcription service\n const baseUrl = env.forgeApiUrl.endsWith(\"/\")\n ? env.forgeApiUrl\n : `${env.forgeApiUrl}/`;\n const fullUrl = new URL(\"v1/audio/transcriptions\", baseUrl).toString();\n\n const response = await fetch(fullUrl, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${env.forgeApiKey}`,\n \"Accept-Encoding\": \"identity\",\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"\");\n return {\n error: \"Transcription service request failed\",\n code: \"TRANSCRIPTION_FAILED\",\n details: `${response.status} ${response.statusText}${errorText ? `: ${errorText}` : \"\"}`,\n };\n }\n\n // Step 5: Parse and return the transcription result\n const whisperResponse = (await response.json()) as WhisperResponse;\n\n if (\n !whisperResponse.text ||\n typeof whisperResponse.text !== \"string\"\n ) {\n return {\n error: \"Invalid transcription response\",\n code: \"SERVICE_ERROR\",\n details:\n \"Transcription service returned an invalid response format\",\n };\n }\n\n return whisperResponse;\n } catch (error) {\n return {\n error: \"Voice transcription failed\",\n code: \"SERVICE_ERROR\",\n details:\n error instanceof Error\n ? error.message\n : \"An unexpected error occurred\",\n };\n }\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pablo2410/core-server",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Shared server utilities for Oplytics.digital subdomains",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -48,9 +48,17 @@
|
|
|
48
48
|
"axios": ">=1.0.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependenciesMeta": {
|
|
51
|
-
"express": {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
51
|
+
"express": {
|
|
52
|
+
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"jose": {
|
|
55
|
+
"optional": true
|
|
56
|
+
},
|
|
57
|
+
"cookie": {
|
|
58
|
+
"optional": true
|
|
59
|
+
},
|
|
60
|
+
"axios": {
|
|
61
|
+
"optional": true
|
|
62
|
+
}
|
|
55
63
|
}
|
|
56
64
|
}
|