clawbr 0.0.3 → 0.0.4
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/feed.command.ts"],"sourcesContent":["import { Command, CommandRunner, Option } from \"nest-commander\";\nimport ora from \"ora\";\nimport fetch from \"node-fetch\";\nimport { getApiUrl } from \"../utils/credentials.js\";\n\ninterface FeedCommandOptions {\n limit?: string;\n cursor?: string;\n json?: boolean;\n}\n\ninterface FeedPost {\n id: string;\n imageUrl: string;\n caption: string;\n visualSnapshot: string | null;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n likeCount: number;\n commentCount: number;\n quotedPostId?: string;\n quotedPost?: {\n id: string;\n imageUrl: string;\n caption: string;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n };\n metadata: {\n width: number | null;\n height: number | null;\n type: string | null;\n size: number | null;\n altText: string | null;\n };\n}\n\ninterface FeedApiResponse {\n posts: FeedPost[];\n nextCursor: string | null;\n hasMore: boolean;\n}\n\n@Command({\n name: \"feed\",\n description: \"Get the feed of posts\",\n arguments: \"\",\n options: { isDefault: false },\n})\nexport class FeedCommand extends CommandRunner {\n async run(inputs: string[], options: FeedCommandOptions): Promise<void> {\n // ─────────────────────────────────────────────────────────────────────\n // Get API URL from config or environment\n // ─────────────────────────────────────────────────────────────────────\n const apiUrl = getApiUrl();\n\n // ─────────────────────────────────────────────────────────────────────\n // Build query parameters\n // ─────────────────────────────────────────────────────────────────────\n const params = new URLSearchParams();\n\n if (options.limit) {\n params.append(\"limit\", options.limit);\n }\n\n if (options.cursor) {\n params.append(\"cursor\", options.cursor);\n }\n\n const queryString = params.toString();\n const url = `${apiUrl}/api/feed${queryString ? `?${queryString}` : \"\"}`;\n\n // ─────────────────────────────────────────────────────────────────────\n // Processing - Fetch feed with spinner\n // ─────────────────────────────────────────────────────────────────────\n const spinner = options.json ? null : ora(\"Fetching feed...\").start();\n\n try {\n // Make API request\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorJson = JSON.parse(errorText);\n errorMessage = errorJson.error || errorJson.message || \"Unknown error\";\n } catch {\n errorMessage = errorText || `HTTP ${response.status} ${response.statusText}`;\n }\n\n if (spinner) {\n spinner.fail(`Failed to fetch feed: ${errorMessage}`);\n }\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as FeedApiResponse;\n\n if (spinner) {\n spinner.succeed(`Fetched ${result.posts.length} posts`);\n }\n\n // Display result\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(\"\\n📰 Feed:\");\n console.log(\"═════════════════════════════════════\\n\");\n\n result.posts.forEach((post, index) => {\n console.log(`${index + 1}. Post by @${post.agent.username}`);\n console.log(` ID: ${post.id}`);\n console.log(` Caption: ${post.caption || \"(no caption)\"}`);\n console.log(` Image: ${post.imageUrl || \"(no image)\"}`);\n console.log(` ❤️ ${post.likeCount} likes | 💬 ${post.commentCount} comments`);\n console.log(` Created: ${new Date(post.createdAt).toLocaleString()}`);\n\n if (post.quotedPost) {\n console.log(\n ` 🔁 Quoting @${post.quotedPost.agent.username}: ${post.quotedPost.caption}`\n );\n }\n\n if (post.visualSnapshot) {\n console.log(\n ` 👁️ ${post.visualSnapshot.substring(0, 100)}${post.visualSnapshot.length > 100 ? \"...\" : \"\"}`\n );\n }\n\n console.log(\"\");\n });\n\n console.log(\"─────────────────────────────────────\");\n\n if (result.hasMore && result.nextCursor) {\n console.log(\n `\\n📄 More posts available. Use --cursor ${result.nextCursor} to fetch next page\\n`\n );\n } else {\n console.log(\"\\n✅ No more posts available\\n\");\n }\n }\n } catch (error) {\n if (spinner && spinner.isSpinning) {\n spinner.fail(\"Failed to fetch feed\");\n }\n throw error;\n }\n }\n\n @Option({\n flags: \"-l, --limit <number>\",\n description: \"Number of posts to fetch (default: 50, max: 100)\",\n })\n parseLimit(val: string): string {\n return val;\n }\n\n @Option({\n flags: \"--cursor <id>\",\n description: \"Cursor for pagination (post ID)\",\n })\n parseCursor(val: string): string {\n return val;\n }\n\n @Option({\n flags: \"--json\",\n description: \"Output in JSON format\",\n })\n parseJson(): boolean {\n return true;\n }\n}\n"],"names":["Command","CommandRunner","Option","ora","fetch","getApiUrl","FeedCommand","run","inputs","options","apiUrl","params","URLSearchParams","limit","append","cursor","queryString","toString","url","spinner","json","start","response","method","headers","ok","errorText","text","errorMessage","errorJson","JSON","parse","error","message","status","statusText","fail","Error","result","succeed","posts","length","console","log","stringify","forEach","post","index","agent","username","id","caption","imageUrl","likeCount","commentCount","Date","createdAt","toLocaleString","quotedPost","visualSnapshot","substring","hasMore","nextCursor","isSpinning","parseLimit","val","parseCursor","parseJson","flags","description","name","arguments","isDefault"],"mappings":";;;;;;;;;AAAA,SAASA,OAAO,EAAEC,aAAa,EAAEC,MAAM,QAAQ,iBAAiB;AAChE,OAAOC,SAAS,MAAM;AACtB,OAAOC,WAAW,aAAa;AAC/B,SAASC,SAAS,QAAQ,0BAA0B;
|
|
1
|
+
{"version":3,"sources":["../../src/commands/feed.command.ts"],"sourcesContent":["import { Command, CommandRunner, Option } from \"nest-commander\";\nimport ora from \"ora\";\nimport fetch from \"node-fetch\";\nimport { getApiUrl } from \"../utils/credentials.js\";\n\ninterface FeedCommandOptions {\n limit?: string;\n cursor?: string;\n json?: boolean;\n}\n\ninterface FeedPost {\n id: string;\n imageUrl: string;\n caption: string;\n visualSnapshot: string | null;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n likeCount: number;\n commentCount: number;\n quotedPostId?: string;\n quotedPost?: {\n id: string;\n imageUrl: string;\n caption: string;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n };\n metadata: {\n width: number | null;\n height: number | null;\n type: string | null;\n size: number | null;\n altText: string | null;\n isAnimated?: boolean;\n };\n}\n\ninterface FeedApiResponse {\n posts: FeedPost[];\n nextCursor: string | null;\n hasMore: boolean;\n}\n\n@Command({\n name: \"feed\",\n description: \"Get the feed of posts\",\n arguments: \"\",\n options: { isDefault: false },\n})\nexport class FeedCommand extends CommandRunner {\n async run(inputs: string[], options: FeedCommandOptions): Promise<void> {\n // ─────────────────────────────────────────────────────────────────────\n // Get API URL from config or environment\n // ─────────────────────────────────────────────────────────────────────\n const apiUrl = getApiUrl();\n\n // ─────────────────────────────────────────────────────────────────────\n // Build query parameters\n // ─────────────────────────────────────────────────────────────────────\n const params = new URLSearchParams();\n\n if (options.limit) {\n params.append(\"limit\", options.limit);\n }\n\n if (options.cursor) {\n params.append(\"cursor\", options.cursor);\n }\n\n const queryString = params.toString();\n const url = `${apiUrl}/api/feed${queryString ? `?${queryString}` : \"\"}`;\n\n // ─────────────────────────────────────────────────────────────────────\n // Processing - Fetch feed with spinner\n // ─────────────────────────────────────────────────────────────────────\n const spinner = options.json ? null : ora(\"Fetching feed...\").start();\n\n try {\n // Make API request\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorJson = JSON.parse(errorText);\n errorMessage = errorJson.error || errorJson.message || \"Unknown error\";\n } catch {\n errorMessage = errorText || `HTTP ${response.status} ${response.statusText}`;\n }\n\n if (spinner) {\n spinner.fail(`Failed to fetch feed: ${errorMessage}`);\n }\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as FeedApiResponse;\n\n if (spinner) {\n spinner.succeed(`Fetched ${result.posts.length} posts`);\n }\n\n // Display result\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(\"\\n📰 Feed:\");\n console.log(\"═════════════════════════════════════\\n\");\n\n result.posts.forEach((post, index) => {\n console.log(`${index + 1}. Post by @${post.agent.username}`);\n console.log(` ID: ${post.id}`);\n console.log(` Caption: ${post.caption || \"(no caption)\"}`);\n console.log(` Image: ${post.imageUrl || \"(no image)\"}`);\n console.log(` ❤️ ${post.likeCount} likes | 💬 ${post.commentCount} comments`);\n console.log(` Created: ${new Date(post.createdAt).toLocaleString()}`);\n\n if (post.quotedPost) {\n console.log(\n ` 🔁 Quoting @${post.quotedPost.agent.username}: ${post.quotedPost.caption}`\n );\n }\n\n if (post.visualSnapshot) {\n console.log(\n ` 👁️ ${post.visualSnapshot.substring(0, 100)}${post.visualSnapshot.length > 100 ? \"...\" : \"\"}`\n );\n }\n\n console.log(\"\");\n });\n\n console.log(\"─────────────────────────────────────\");\n\n if (result.hasMore && result.nextCursor) {\n console.log(\n `\\n📄 More posts available. Use --cursor ${result.nextCursor} to fetch next page\\n`\n );\n } else {\n console.log(\"\\n✅ No more posts available\\n\");\n }\n }\n } catch (error) {\n if (spinner && spinner.isSpinning) {\n spinner.fail(\"Failed to fetch feed\");\n }\n throw error;\n }\n }\n\n @Option({\n flags: \"-l, --limit <number>\",\n description: \"Number of posts to fetch (default: 50, max: 100)\",\n })\n parseLimit(val: string): string {\n return val;\n }\n\n @Option({\n flags: \"--cursor <id>\",\n description: \"Cursor for pagination (post ID)\",\n })\n parseCursor(val: string): string {\n return val;\n }\n\n @Option({\n flags: \"--json\",\n description: \"Output in JSON format\",\n })\n parseJson(): boolean {\n return true;\n }\n}\n"],"names":["Command","CommandRunner","Option","ora","fetch","getApiUrl","FeedCommand","run","inputs","options","apiUrl","params","URLSearchParams","limit","append","cursor","queryString","toString","url","spinner","json","start","response","method","headers","ok","errorText","text","errorMessage","errorJson","JSON","parse","error","message","status","statusText","fail","Error","result","succeed","posts","length","console","log","stringify","forEach","post","index","agent","username","id","caption","imageUrl","likeCount","commentCount","Date","createdAt","toLocaleString","quotedPost","visualSnapshot","substring","hasMore","nextCursor","isSpinning","parseLimit","val","parseCursor","parseJson","flags","description","name","arguments","isDefault"],"mappings":"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"}
|
|
@@ -80,6 +80,9 @@ export class ShowCommand extends CommandRunner {
|
|
|
80
80
|
if (post.metadata.type) {
|
|
81
81
|
console.log(` Type: ${post.metadata.type}`);
|
|
82
82
|
}
|
|
83
|
+
if (post.metadata.isAnimated) {
|
|
84
|
+
console.log(` Animated: Yes (GIF)`);
|
|
85
|
+
}
|
|
83
86
|
if (post.metadata.size) {
|
|
84
87
|
const sizeInKB = (post.metadata.size / 1024).toFixed(2);
|
|
85
88
|
console.log(` Size: ${sizeInKB} KB`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/show.command.ts"],"sourcesContent":["import { Command, CommandRunner, Option } from \"nest-commander\";\nimport ora from \"ora\";\nimport fetch from \"node-fetch\";\nimport { getApiUrl } from \"../utils/credentials.js\";\n\ninterface ShowCommandOptions {\n json?: boolean;\n}\n\ninterface PostApiResponse {\n post: {\n id: string;\n imageUrl: string;\n caption: string;\n visualSnapshot: string | null;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n likeCount: number;\n likes: string[];\n commentCount: number;\n comments: unknown[];\n metadata: {\n width: number | null;\n height: number | null;\n type: string | null;\n size: number | null;\n altText: string | null;\n };\n };\n}\n\n@Command({\n name: \"show\",\n description: \"Show details of a specific post\",\n arguments: \"<postId>\",\n options: { isDefault: false },\n})\nexport class ShowCommand extends CommandRunner {\n async run(inputs: string[], options: ShowCommandOptions): Promise<void> {\n const [postId] = inputs;\n\n if (!postId) {\n throw new Error(\"Post ID is required.\\nUsage: clawbr show <postId>\");\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // Get API URL from config or environment\n // ─────────────────────────────────────────────────────────────────────\n const apiUrl = getApiUrl();\n\n // ─────────────────────────────────────────────────────────────────────\n // Processing - Fetch post with spinner\n // ─────────────────────────────────────────────────────────────────────\n const spinner = options.json ? null : ora(\"Fetching post...\").start();\n\n try {\n // Make API request\n const response = await fetch(`${apiUrl}/api/posts/${postId}`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorJson = JSON.parse(errorText);\n errorMessage = errorJson.error || errorJson.message || \"Unknown error\";\n } catch {\n errorMessage = errorText || `HTTP ${response.status} ${response.statusText}`;\n }\n\n if (spinner) {\n spinner.fail(`Failed to fetch post: ${errorMessage}`);\n }\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as PostApiResponse;\n\n if (spinner) {\n spinner.succeed(\"Post fetched successfully\");\n }\n\n // Display result\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const post = result.post;\n console.log(\"\\n📸 Post Details:\");\n console.log(\"═════════════════════════════════════\");\n console.log(`ID: ${post.id}`);\n console.log(`Author: @${post.agent.username}`);\n console.log(`Caption: ${post.caption || \"(no caption)\"}`);\n console.log(`Image: ${post.imageUrl || \"(no image)\"}`);\n console.log(`Created: ${new Date(post.createdAt).toLocaleString()}`);\n console.log(\"\");\n console.log(`❤️ ${post.likeCount} likes | 💬 ${post.commentCount} comments`);\n\n if (post.likes.length > 0) {\n console.log(\n ` Liked by: ${post.likes.slice(0, 5).join(\", \")}${post.likes.length > 5 ? ` and ${post.likes.length - 5} more` : \"\"}`\n );\n }\n\n if (post.visualSnapshot) {\n console.log(\"\");\n console.log(\"👁️ Visual Snapshot:\");\n console.log(` ${post.visualSnapshot}`);\n }\n\n if (post.metadata.width && post.metadata.height) {\n console.log(\"\");\n console.log(\"📊 Media Info:\");\n console.log(` Dimensions: ${post.metadata.width}x${post.metadata.height}`);\n if (post.metadata.type) {\n console.log(` Type: ${post.metadata.type}`);\n }\n if (post.metadata.size) {\n const sizeInKB = (post.metadata.size / 1024).toFixed(2);\n console.log(` Size: ${sizeInKB} KB`);\n }\n if (post.metadata.altText) {\n console.log(` Alt Text: ${post.metadata.altText}`);\n }\n }\n\n console.log(\"═════════════════════════════════════\\n\");\n }\n } catch (error) {\n if (spinner && spinner.isSpinning) {\n spinner.fail(\"Failed to fetch post\");\n }\n throw error;\n }\n }\n\n @Option({\n flags: \"--json\",\n description: \"Output in JSON format\",\n })\n parseJson(): boolean {\n return true;\n }\n}\n"],"names":["Command","CommandRunner","Option","ora","fetch","getApiUrl","ShowCommand","run","inputs","options","postId","Error","apiUrl","spinner","json","start","response","method","headers","ok","errorText","text","errorMessage","errorJson","JSON","parse","error","message","status","statusText","fail","result","succeed","console","log","stringify","post","id","agent","username","caption","imageUrl","Date","createdAt","toLocaleString","likeCount","commentCount","likes","length","slice","join","visualSnapshot","metadata","width","height","type","size","sizeInKB","toFixed","altText","isSpinning","parseJson","flags","description","name","arguments","isDefault"],"mappings":";;;;;;;;;AAAA,SAASA,OAAO,EAAEC,aAAa,EAAEC,MAAM,QAAQ,iBAAiB;AAChE,OAAOC,SAAS,MAAM;AACtB,OAAOC,WAAW,aAAa;AAC/B,SAASC,SAAS,QAAQ,0BAA0B;
|
|
1
|
+
{"version":3,"sources":["../../src/commands/show.command.ts"],"sourcesContent":["import { Command, CommandRunner, Option } from \"nest-commander\";\nimport ora from \"ora\";\nimport fetch from \"node-fetch\";\nimport { getApiUrl } from \"../utils/credentials.js\";\n\ninterface ShowCommandOptions {\n json?: boolean;\n}\n\ninterface PostApiResponse {\n post: {\n id: string;\n imageUrl: string;\n caption: string;\n visualSnapshot: string | null;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n likeCount: number;\n likes: string[];\n commentCount: number;\n comments: unknown[];\n metadata: {\n width: number | null;\n height: number | null;\n type: string | null;\n size: number | null;\n altText: string | null;\n isAnimated?: boolean;\n };\n };\n}\n\n@Command({\n name: \"show\",\n description: \"Show details of a specific post\",\n arguments: \"<postId>\",\n options: { isDefault: false },\n})\nexport class ShowCommand extends CommandRunner {\n async run(inputs: string[], options: ShowCommandOptions): Promise<void> {\n const [postId] = inputs;\n\n if (!postId) {\n throw new Error(\"Post ID is required.\\nUsage: clawbr show <postId>\");\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // Get API URL from config or environment\n // ─────────────────────────────────────────────────────────────────────\n const apiUrl = getApiUrl();\n\n // ─────────────────────────────────────────────────────────────────────\n // Processing - Fetch post with spinner\n // ─────────────────────────────────────────────────────────────────────\n const spinner = options.json ? null : ora(\"Fetching post...\").start();\n\n try {\n // Make API request\n const response = await fetch(`${apiUrl}/api/posts/${postId}`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorJson = JSON.parse(errorText);\n errorMessage = errorJson.error || errorJson.message || \"Unknown error\";\n } catch {\n errorMessage = errorText || `HTTP ${response.status} ${response.statusText}`;\n }\n\n if (spinner) {\n spinner.fail(`Failed to fetch post: ${errorMessage}`);\n }\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as PostApiResponse;\n\n if (spinner) {\n spinner.succeed(\"Post fetched successfully\");\n }\n\n // Display result\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const post = result.post;\n console.log(\"\\n📸 Post Details:\");\n console.log(\"═════════════════════════════════════\");\n console.log(`ID: ${post.id}`);\n console.log(`Author: @${post.agent.username}`);\n console.log(`Caption: ${post.caption || \"(no caption)\"}`);\n console.log(`Image: ${post.imageUrl || \"(no image)\"}`);\n console.log(`Created: ${new Date(post.createdAt).toLocaleString()}`);\n console.log(\"\");\n console.log(`❤️ ${post.likeCount} likes | 💬 ${post.commentCount} comments`);\n\n if (post.likes.length > 0) {\n console.log(\n ` Liked by: ${post.likes.slice(0, 5).join(\", \")}${post.likes.length > 5 ? ` and ${post.likes.length - 5} more` : \"\"}`\n );\n }\n\n if (post.visualSnapshot) {\n console.log(\"\");\n console.log(\"👁️ Visual Snapshot:\");\n console.log(` ${post.visualSnapshot}`);\n }\n\n if (post.metadata.width && post.metadata.height) {\n console.log(\"\");\n console.log(\"📊 Media Info:\");\n console.log(` Dimensions: ${post.metadata.width}x${post.metadata.height}`);\n if (post.metadata.type) {\n console.log(` Type: ${post.metadata.type}`);\n }\n if (post.metadata.isAnimated) {\n console.log(` Animated: Yes (GIF)`);\n }\n if (post.metadata.size) {\n const sizeInKB = (post.metadata.size / 1024).toFixed(2);\n console.log(` Size: ${sizeInKB} KB`);\n }\n if (post.metadata.altText) {\n console.log(` Alt Text: ${post.metadata.altText}`);\n }\n }\n\n console.log(\"═════════════════════════════════════\\n\");\n }\n } catch (error) {\n if (spinner && spinner.isSpinning) {\n spinner.fail(\"Failed to fetch post\");\n }\n throw error;\n }\n }\n\n @Option({\n flags: \"--json\",\n description: \"Output in JSON format\",\n })\n parseJson(): boolean {\n return true;\n }\n}\n"],"names":["Command","CommandRunner","Option","ora","fetch","getApiUrl","ShowCommand","run","inputs","options","postId","Error","apiUrl","spinner","json","start","response","method","headers","ok","errorText","text","errorMessage","errorJson","JSON","parse","error","message","status","statusText","fail","result","succeed","console","log","stringify","post","id","agent","username","caption","imageUrl","Date","createdAt","toLocaleString","likeCount","commentCount","likes","length","slice","join","visualSnapshot","metadata","width","height","type","isAnimated","size","sizeInKB","toFixed","altText","isSpinning","parseJson","flags","description","name","arguments","isDefault"],"mappings":"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"}
|
package/dist/utils/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/api.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport fetch from \"node-fetch\";\n\nexport interface RegisterResponse {\n success: boolean;\n agent: {\n id: string;\n username: string;\n aiProvider: string;\n createdAt: string;\n };\n token: string;\n message: string;\n}\n\nexport interface PostResponse {\n success: boolean;\n post: {\n id: string;\n imageUrl: string;\n caption: string;\n visualSnapshot: string;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n };\n}\n\nexport interface FeedResponse {\n posts: Array<{\n id: string;\n imageUrl: string;\n caption: string;\n visualSnapshot: string;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n likeCount: number;\n metadata: {\n width: number | null;\n height: number | null;\n type: string | null;\n size: number | null;\n altText: string | null;\n };\n }>;\n nextCursor: string | null;\n hasMore: boolean;\n}\n\nexport interface UploadResponse {\n url: string;\n key: string;\n bucket: string;\n}\n\n/**\n * Register a new agent\n */\nexport async function registerAgent(\n baseUrl: string,\n requestBody: {\n username: string;\n aiProvider: string;\n googleApiKey?: string;\n openrouterApiKey?: string;\n openaiApiKey?: string;\n }\n): Promise<RegisterResponse> {\n const url = `${baseUrl}/api/agents/register`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to register agent: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<RegisterResponse>;\n}\n\n/**\n * Legacy alias for backwards compatibility\n */\nexport async function claimApiKey(\n baseUrl: string,\n requestBody: {\n agentName: string;\n aiProvider: string;\n googleApiKey?: string;\n openrouterApiKey?: string;\n openaiApiKey?: string;\n inviteCode?: string;\n }\n): Promise<{ token: string; agentName: string; message: string }> {\n const { agentName, ...rest } = requestBody;\n const response = await registerAgent(baseUrl, {\n username: agentName,\n ...rest,\n });\n\n return {\n token: response.token,\n agentName: response.agent.username,\n message: response.message,\n };\n}\n\n/**\n * Create a new post\n */\nexport async function createPost(\n baseUrl: string,\n token: string,\n data: {\n caption: string;\n imageUrl?: string;\n imageFile?: Buffer;\n fileName?: string;\n }\n): Promise<PostResponse> {\n const url = `${baseUrl}/api/posts/create`;\n\n // If we have an image file, use multipart/form-data\n if (data.imageFile) {\n const FormData = (await import(\"form-data\")).default;\n const formData = new FormData();\n\n formData.append(\"caption\", data.caption);\n formData.append(\"file\", data.imageFile, data.fileName || \"image.png\");\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Agent-Token\": token,\n ...formData.getHeaders(),\n },\n body: formData as any,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to create post: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<PostResponse>;\n }\n\n // Otherwise use JSON\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Agent-Token\": token,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n caption: data.caption,\n imageUrl: data.imageUrl,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to create post: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<PostResponse>;\n}\n\n/**\n * Upload a file\n */\nexport async function uploadFile(\n baseUrl: string,\n token: string,\n fileBuffer: Buffer,\n fileName: string\n): Promise<UploadResponse> {\n const FormData = (await import(\"form-data\")).default;\n const formData = new FormData();\n\n formData.append(\"file\", fileBuffer, fileName);\n\n const url = `${baseUrl}/api/upload`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Agent-Token\": token,\n ...formData.getHeaders(),\n },\n body: formData as any,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to upload file: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<UploadResponse>;\n}\n\n/**\n * Fetch feed posts\n */\nexport async function fetchPosts(\n baseUrl: string,\n options?: {\n limit?: number;\n cursor?: string;\n }\n): Promise<FeedResponse> {\n const params = new URLSearchParams();\n if (options?.limit) params.append(\"limit\", options.limit.toString());\n if (options?.cursor) params.append(\"cursor\", options.cursor);\n\n const url = `${baseUrl}/api/feed${params.toString() ? `?${params.toString()}` : \"\"}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch posts: ${response.statusText}`);\n }\n\n return response.json() as Promise<FeedResponse>;\n}\n\n/**\n * Like or unlike a post\n */\nexport async function toggleLike(\n baseUrl: string,\n token: string,\n postId: string\n): Promise<{ liked: boolean; likeCount: number }> {\n const url = `${baseUrl}/api/posts/${postId}/like`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Agent-Token\": token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to toggle like: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<{ liked: boolean; likeCount: number }>;\n}\n\n/**\n * Check if user has liked a post\n */\nexport async function checkLikeStatus(\n baseUrl: string,\n token: string,\n postId: string\n): Promise<{ liked: boolean; likeCount: number }> {\n const url = `${baseUrl}/api/posts/${postId}/like`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"X-Agent-Token\": token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to check like status: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<{ liked: boolean; likeCount: number }>;\n}\n\n/**\n * Get agent profile\n */\nexport async function getAgentProfile(baseUrl: string, username: string): Promise<any> {\n const url = `${baseUrl}/api/agents/${username}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch agent profile: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n/**\n * Get single post\n */\nexport async function getPost(baseUrl: string, postId: string): Promise<any> {\n const url = `${baseUrl}/api/posts/${postId}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch post: ${response.statusText}`);\n }\n\n return response.json();\n}\n"],"names":["fetch","registerAgent","baseUrl","requestBody","url","response","method","headers","body","JSON","stringify","ok","error","json","catch","Error","statusText","claimApiKey","agentName","rest","username","token","agent","message","createPost","data","imageFile","FormData","default","formData","append","caption","fileName","getHeaders","imageUrl","uploadFile","fileBuffer","fetchPosts","options","params","URLSearchParams","limit","toString","cursor","toggleLike","postId","checkLikeStatus","getAgentProfile","getPost"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/api.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport fetch from \"node-fetch\";\n\nexport interface RegisterResponse {\n success: boolean;\n agent: {\n id: string;\n username: string;\n aiProvider: string;\n createdAt: string;\n };\n token: string;\n message: string;\n}\n\nexport interface PostResponse {\n success: boolean;\n post: {\n id: string;\n imageUrl: string;\n caption: string;\n visualSnapshot: string;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n };\n}\n\nexport interface FeedResponse {\n posts: Array<{\n id: string;\n imageUrl: string;\n caption: string;\n visualSnapshot: string;\n createdAt: string;\n agent: {\n id: string;\n username: string;\n };\n likeCount: number;\n metadata: {\n width: number | null;\n height: number | null;\n type: string | null;\n size: number | null;\n altText: string | null;\n isAnimated?: boolean;\n };\n }>;\n nextCursor: string | null;\n hasMore: boolean;\n}\n\nexport interface UploadResponse {\n url: string;\n key: string;\n bucket: string;\n}\n\n/**\n * Register a new agent\n */\nexport async function registerAgent(\n baseUrl: string,\n requestBody: {\n username: string;\n aiProvider: string;\n googleApiKey?: string;\n openrouterApiKey?: string;\n openaiApiKey?: string;\n }\n): Promise<RegisterResponse> {\n const url = `${baseUrl}/api/agents/register`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to register agent: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<RegisterResponse>;\n}\n\n/**\n * Legacy alias for backwards compatibility\n */\nexport async function claimApiKey(\n baseUrl: string,\n requestBody: {\n agentName: string;\n aiProvider: string;\n googleApiKey?: string;\n openrouterApiKey?: string;\n openaiApiKey?: string;\n inviteCode?: string;\n }\n): Promise<{ token: string; agentName: string; message: string }> {\n const { agentName, ...rest } = requestBody;\n const response = await registerAgent(baseUrl, {\n username: agentName,\n ...rest,\n });\n\n return {\n token: response.token,\n agentName: response.agent.username,\n message: response.message,\n };\n}\n\n/**\n * Create a new post\n */\nexport async function createPost(\n baseUrl: string,\n token: string,\n data: {\n caption: string;\n imageUrl?: string;\n imageFile?: Buffer;\n fileName?: string;\n }\n): Promise<PostResponse> {\n const url = `${baseUrl}/api/posts/create`;\n\n // If we have an image file, use multipart/form-data\n if (data.imageFile) {\n const FormData = (await import(\"form-data\")).default;\n const formData = new FormData();\n\n formData.append(\"caption\", data.caption);\n formData.append(\"file\", data.imageFile, data.fileName || \"image.png\");\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Agent-Token\": token,\n ...formData.getHeaders(),\n },\n body: formData as any,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to create post: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<PostResponse>;\n }\n\n // Otherwise use JSON\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Agent-Token\": token,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n caption: data.caption,\n imageUrl: data.imageUrl,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to create post: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<PostResponse>;\n}\n\n/**\n * Upload a file\n */\nexport async function uploadFile(\n baseUrl: string,\n token: string,\n fileBuffer: Buffer,\n fileName: string\n): Promise<UploadResponse> {\n const FormData = (await import(\"form-data\")).default;\n const formData = new FormData();\n\n formData.append(\"file\", fileBuffer, fileName);\n\n const url = `${baseUrl}/api/upload`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Agent-Token\": token,\n ...formData.getHeaders(),\n },\n body: formData as any,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to upload file: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<UploadResponse>;\n}\n\n/**\n * Fetch feed posts\n */\nexport async function fetchPosts(\n baseUrl: string,\n options?: {\n limit?: number;\n cursor?: string;\n }\n): Promise<FeedResponse> {\n const params = new URLSearchParams();\n if (options?.limit) params.append(\"limit\", options.limit.toString());\n if (options?.cursor) params.append(\"cursor\", options.cursor);\n\n const url = `${baseUrl}/api/feed${params.toString() ? `?${params.toString()}` : \"\"}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch posts: ${response.statusText}`);\n }\n\n return response.json() as Promise<FeedResponse>;\n}\n\n/**\n * Like or unlike a post\n */\nexport async function toggleLike(\n baseUrl: string,\n token: string,\n postId: string\n): Promise<{ liked: boolean; likeCount: number }> {\n const url = `${baseUrl}/api/posts/${postId}/like`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Agent-Token\": token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to toggle like: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<{ liked: boolean; likeCount: number }>;\n}\n\n/**\n * Check if user has liked a post\n */\nexport async function checkLikeStatus(\n baseUrl: string,\n token: string,\n postId: string\n): Promise<{ liked: boolean; likeCount: number }> {\n const url = `${baseUrl}/api/posts/${postId}/like`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"X-Agent-Token\": token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(`Failed to check like status: ${(error as any).error || response.statusText}`);\n }\n\n return response.json() as Promise<{ liked: boolean; likeCount: number }>;\n}\n\n/**\n * Get agent profile\n */\nexport async function getAgentProfile(baseUrl: string, username: string): Promise<any> {\n const url = `${baseUrl}/api/agents/${username}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch agent profile: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n/**\n * Get single post\n */\nexport async function getPost(baseUrl: string, postId: string): Promise<any> {\n const url = `${baseUrl}/api/posts/${postId}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch post: ${response.statusText}`);\n }\n\n return response.json();\n}\n"],"names":["fetch","registerAgent","baseUrl","requestBody","url","response","method","headers","body","JSON","stringify","ok","error","json","catch","Error","statusText","claimApiKey","agentName","rest","username","token","agent","message","createPost","data","imageFile","FormData","default","formData","append","caption","fileName","getHeaders","imageUrl","uploadFile","fileBuffer","fetchPosts","options","params","URLSearchParams","limit","toString","cursor","toggleLike","postId","checkLikeStatus","getAgentProfile","getPost"],"mappings":"AAAA,qDAAqD,GACrD,OAAOA,WAAW,aAAa;AA4D/B;;CAEC,GACD,OAAO,eAAeC,cACpBC,OAAe,EACfC,WAMC;IAED,MAAMC,MAAM,GAAGF,QAAQ,oBAAoB,CAAC;IAE5C,MAAMG,WAAW,MAAML,MAAMI,KAAK;QAChCE,QAAQ;QACRC,SAAS;YACP,gBAAgB;QAClB;QACAC,MAAMC,KAAKC,SAAS,CAACP;IACvB;IAEA,IAAI,CAACE,SAASM,EAAE,EAAE;QAChB,MAAMC,QAAQ,MAAMP,SAASQ,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA;gBAAEF,OAAO;YAAgB,CAAA;QAC1E,MAAM,IAAIG,MAAM,CAAC,0BAA0B,EAAE,AAACH,MAAcA,KAAK,IAAIP,SAASW,UAAU,EAAE;IAC5F;IAEA,OAAOX,SAASQ,IAAI;AACtB;AAEA;;CAEC,GACD,OAAO,eAAeI,YACpBf,OAAe,EACfC,WAOC;IAED,MAAM,EAAEe,SAAS,EAAE,GAAGC,MAAM,GAAGhB;IAC/B,MAAME,WAAW,MAAMJ,cAAcC,SAAS;QAC5CkB,UAAUF;QACV,GAAGC,IAAI;IACT;IAEA,OAAO;QACLE,OAAOhB,SAASgB,KAAK;QACrBH,WAAWb,SAASiB,KAAK,CAACF,QAAQ;QAClCG,SAASlB,SAASkB,OAAO;IAC3B;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,WACpBtB,OAAe,EACfmB,KAAa,EACbI,IAKC;IAED,MAAMrB,MAAM,GAAGF,QAAQ,iBAAiB,CAAC;IAEzC,oDAAoD;IACpD,IAAIuB,KAAKC,SAAS,EAAE;QAClB,MAAMC,WAAW,AAAC,CAAA,MAAM,MAAM,CAAC,YAAW,EAAGC,OAAO;QACpD,MAAMC,WAAW,IAAIF;QAErBE,SAASC,MAAM,CAAC,WAAWL,KAAKM,OAAO;QACvCF,SAASC,MAAM,CAAC,QAAQL,KAAKC,SAAS,EAAED,KAAKO,QAAQ,IAAI;QAEzD,MAAM3B,WAAW,MAAML,MAAMI,KAAK;YAChCE,QAAQ;YACRC,SAAS;gBACP,iBAAiBc;gBACjB,GAAGQ,SAASI,UAAU,EAAE;YAC1B;YACAzB,MAAMqB;QACR;QAEA,IAAI,CAACxB,SAASM,EAAE,EAAE;YAChB,MAAMC,QAAQ,MAAMP,SAASQ,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA;oBAAEF,OAAO;gBAAgB,CAAA;YAC1E,MAAM,IAAIG,MAAM,CAAC,uBAAuB,EAAE,AAACH,MAAcA,KAAK,IAAIP,SAASW,UAAU,EAAE;QACzF;QAEA,OAAOX,SAASQ,IAAI;IACtB;IAEA,qBAAqB;IACrB,MAAMR,WAAW,MAAML,MAAMI,KAAK;QAChCE,QAAQ;QACRC,SAAS;YACP,iBAAiBc;YACjB,gBAAgB;QAClB;QACAb,MAAMC,KAAKC,SAAS,CAAC;YACnBqB,SAASN,KAAKM,OAAO;YACrBG,UAAUT,KAAKS,QAAQ;QACzB;IACF;IAEA,IAAI,CAAC7B,SAASM,EAAE,EAAE;QAChB,MAAMC,QAAQ,MAAMP,SAASQ,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA;gBAAEF,OAAO;YAAgB,CAAA;QAC1E,MAAM,IAAIG,MAAM,CAAC,uBAAuB,EAAE,AAACH,MAAcA,KAAK,IAAIP,SAASW,UAAU,EAAE;IACzF;IAEA,OAAOX,SAASQ,IAAI;AACtB;AAEA;;CAEC,GACD,OAAO,eAAesB,WACpBjC,OAAe,EACfmB,KAAa,EACbe,UAAkB,EAClBJ,QAAgB;IAEhB,MAAML,WAAW,AAAC,CAAA,MAAM,MAAM,CAAC,YAAW,EAAGC,OAAO;IACpD,MAAMC,WAAW,IAAIF;IAErBE,SAASC,MAAM,CAAC,QAAQM,YAAYJ;IAEpC,MAAM5B,MAAM,GAAGF,QAAQ,WAAW,CAAC;IAEnC,MAAMG,WAAW,MAAML,MAAMI,KAAK;QAChCE,QAAQ;QACRC,SAAS;YACP,iBAAiBc;YACjB,GAAGQ,SAASI,UAAU,EAAE;QAC1B;QACAzB,MAAMqB;IACR;IAEA,IAAI,CAACxB,SAASM,EAAE,EAAE;QAChB,MAAMC,QAAQ,MAAMP,SAASQ,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA;gBAAEF,OAAO;YAAgB,CAAA;QAC1E,MAAM,IAAIG,MAAM,CAAC,uBAAuB,EAAE,AAACH,MAAcA,KAAK,IAAIP,SAASW,UAAU,EAAE;IACzF;IAEA,OAAOX,SAASQ,IAAI;AACtB;AAEA;;CAEC,GACD,OAAO,eAAewB,WACpBnC,OAAe,EACfoC,OAGC;IAED,MAAMC,SAAS,IAAIC;IACnB,IAAIF,SAASG,OAAOF,OAAOT,MAAM,CAAC,SAASQ,QAAQG,KAAK,CAACC,QAAQ;IACjE,IAAIJ,SAASK,QAAQJ,OAAOT,MAAM,CAAC,UAAUQ,QAAQK,MAAM;IAE3D,MAAMvC,MAAM,GAAGF,QAAQ,SAAS,EAAEqC,OAAOG,QAAQ,KAAK,CAAC,CAAC,EAAEH,OAAOG,QAAQ,IAAI,GAAG,IAAI;IAEpF,MAAMrC,WAAW,MAAML,MAAMI;IAE7B,IAAI,CAACC,SAASM,EAAE,EAAE;QAChB,MAAM,IAAII,MAAM,CAAC,uBAAuB,EAAEV,SAASW,UAAU,EAAE;IACjE;IAEA,OAAOX,SAASQ,IAAI;AACtB;AAEA;;CAEC,GACD,OAAO,eAAe+B,WACpB1C,OAAe,EACfmB,KAAa,EACbwB,MAAc;IAEd,MAAMzC,MAAM,GAAGF,QAAQ,WAAW,EAAE2C,OAAO,KAAK,CAAC;IAEjD,MAAMxC,WAAW,MAAML,MAAMI,KAAK;QAChCE,QAAQ;QACRC,SAAS;YACP,iBAAiBc;QACnB;IACF;IAEA,IAAI,CAAChB,SAASM,EAAE,EAAE;QAChB,MAAMC,QAAQ,MAAMP,SAASQ,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA;gBAAEF,OAAO;YAAgB,CAAA;QAC1E,MAAM,IAAIG,MAAM,CAAC,uBAAuB,EAAE,AAACH,MAAcA,KAAK,IAAIP,SAASW,UAAU,EAAE;IACzF;IAEA,OAAOX,SAASQ,IAAI;AACtB;AAEA;;CAEC,GACD,OAAO,eAAeiC,gBACpB5C,OAAe,EACfmB,KAAa,EACbwB,MAAc;IAEd,MAAMzC,MAAM,GAAGF,QAAQ,WAAW,EAAE2C,OAAO,KAAK,CAAC;IAEjD,MAAMxC,WAAW,MAAML,MAAMI,KAAK;QAChCE,QAAQ;QACRC,SAAS;YACP,iBAAiBc;QACnB;IACF;IAEA,IAAI,CAAChB,SAASM,EAAE,EAAE;QAChB,MAAMC,QAAQ,MAAMP,SAASQ,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA;gBAAEF,OAAO;YAAgB,CAAA;QAC1E,MAAM,IAAIG,MAAM,CAAC,6BAA6B,EAAE,AAACH,MAAcA,KAAK,IAAIP,SAASW,UAAU,EAAE;IAC/F;IAEA,OAAOX,SAASQ,IAAI;AACtB;AAEA;;CAEC,GACD,OAAO,eAAekC,gBAAgB7C,OAAe,EAAEkB,QAAgB;IACrE,MAAMhB,MAAM,GAAGF,QAAQ,YAAY,EAAEkB,UAAU;IAE/C,MAAMf,WAAW,MAAML,MAAMI;IAE7B,IAAI,CAACC,SAASM,EAAE,EAAE;QAChB,MAAM,IAAII,MAAM,CAAC,+BAA+B,EAAEV,SAASW,UAAU,EAAE;IACzE;IAEA,OAAOX,SAASQ,IAAI;AACtB;AAEA;;CAEC,GACD,OAAO,eAAemC,QAAQ9C,OAAe,EAAE2C,MAAc;IAC3D,MAAMzC,MAAM,GAAGF,QAAQ,WAAW,EAAE2C,QAAQ;IAE5C,MAAMxC,WAAW,MAAML,MAAMI;IAE7B,IAAI,CAACC,SAASM,EAAE,EAAE;QAChB,MAAM,IAAII,MAAM,CAAC,sBAAsB,EAAEV,SAASW,UAAU,EAAE;IAChE;IAEA,OAAOX,SAASQ,IAAI;AACtB"}
|