spora 0.7.0 → 0.7.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/README.md +7 -5
- package/dist/autonomy-DAV7X6QS.js +19 -0
- package/dist/{chunk-53YLFYJF.js → chunk-3RYCUGXE.js} +6 -2
- package/dist/chunk-3RYCUGXE.js.map +1 -0
- package/dist/{chunk-AH7HPXYC.js → chunk-AOQ3WLZV.js} +153 -143
- package/dist/chunk-AOQ3WLZV.js.map +1 -0
- package/dist/chunk-E5NR6HT4.js +29 -0
- package/dist/chunk-E5NR6HT4.js.map +1 -0
- package/dist/{chunk-EBO4F5NU.js → chunk-JBYZ7K56.js} +2 -2
- package/dist/chunk-KWWAIS3C.js +180 -0
- package/dist/chunk-KWWAIS3C.js.map +1 -0
- package/dist/{chunk-UINSD4FT.js → chunk-LXQNVVIY.js} +6 -6
- package/dist/{chunk-UINSD4FT.js.map → chunk-LXQNVVIY.js.map} +1 -1
- package/dist/{chunk-AIEXQCQS.js → chunk-M6YOQVSI.js} +2 -2
- package/dist/{chunk-B6RPMDML.js → chunk-NO3NQN67.js} +16 -6
- package/dist/chunk-NO3NQN67.js.map +1 -0
- package/dist/{chunk-QOKQ5OTU.js → chunk-NPV3OV2K.js} +3 -14
- package/dist/chunk-NPV3OV2K.js.map +1 -0
- package/dist/{chunk-SBQILQCJ.js → chunk-OACD3HGE.js} +7 -7
- package/dist/{chunk-UM57WU5I.js → chunk-P6KZIJYL.js} +2 -2
- package/dist/{chunk-AHXZIGQE.js → chunk-T7L2L7ZL.js} +2 -2
- package/dist/{chunk-ZJZKH7N7.js → chunk-VZBHRUZS.js} +2 -2
- package/dist/chunk-VZBHRUZS.js.map +1 -0
- package/dist/chunk-WIK74GGJ.js +295 -0
- package/dist/chunk-WIK74GGJ.js.map +1 -0
- package/dist/{chunk-YLJVFCT4.js → chunk-WN35MRMF.js} +2 -2
- package/dist/cli.js +168 -137
- package/dist/cli.js.map +1 -1
- package/dist/client-57BQKVYF.js +337 -0
- package/dist/client-57BQKVYF.js.map +1 -0
- package/dist/{colony-LCWN5IAN.js → colony-JPZC3R34.js} +7 -7
- package/dist/{config-TFAFYSIW.js → config-FL4VJVKZ.js} +3 -3
- package/dist/{crypto-FHSQ72NU.js → crypto-NOXNL4GP.js} +3 -3
- package/dist/{goals-5TAPXNR2.js → goals-RBKLMILE.js} +3 -3
- package/dist/{heartbeat-ZHRCEMF5.js → heartbeat-TNEPE3ZP.js} +83 -88
- package/dist/heartbeat-TNEPE3ZP.js.map +1 -0
- package/dist/{identity-O4FLSZKZ.js → identity-VDUW4I2K.js} +3 -3
- package/dist/{init-G3WINLAP.js → init-ISSXETHY.js} +59 -46
- package/dist/init-ISSXETHY.js.map +1 -0
- package/dist/llm-T33QTPVW.js +22 -0
- package/dist/mcp-server.js +28 -28
- package/dist/mcp-server.js.map +1 -1
- package/dist/{memory-O3AJIKBX.js → memory-OIAH33G2.js} +3 -3
- package/dist/{memory-7FBE26K3.js → memory-PNW7SX7A.js} +3 -3
- package/dist/{paths-5GFUUHCZ.js → paths-BYR6MEPR.js} +2 -2
- package/dist/prompt-builder-5NYONN2W.js +23 -0
- package/dist/queue-G5PTE6R6.js +14 -0
- package/dist/{strategy-S45TX766.js → strategy-Z4JSFHSP.js} +3 -3
- package/dist/{web-chat-RQIILEQK.js → web-chat-3HM35XM4.js} +31 -80
- package/dist/web-chat-3HM35XM4.js.map +1 -0
- package/dist/x-client-GY6XSPK6.js +12 -0
- package/package.json +1 -1
- package/dist/account-creator-ZD643X3Z.js +0 -498
- package/dist/account-creator-ZD643X3Z.js.map +0 -1
- package/dist/chunk-535NMUUW.js +0 -96
- package/dist/chunk-535NMUUW.js.map +0 -1
- package/dist/chunk-53YLFYJF.js.map +0 -1
- package/dist/chunk-55XPDJ6P.js +0 -124
- package/dist/chunk-55XPDJ6P.js.map +0 -1
- package/dist/chunk-AH7HPXYC.js.map +0 -1
- package/dist/chunk-B6RPMDML.js.map +0 -1
- package/dist/chunk-E6GMS76S.js +0 -154
- package/dist/chunk-E6GMS76S.js.map +0 -1
- package/dist/chunk-JJZ7T2IZ.js +0 -32
- package/dist/chunk-JJZ7T2IZ.js.map +0 -1
- package/dist/chunk-QOKQ5OTU.js.map +0 -1
- package/dist/chunk-TF2XYGGG.js +0 -249
- package/dist/chunk-TF2XYGGG.js.map +0 -1
- package/dist/chunk-ZJZKH7N7.js.map +0 -1
- package/dist/client-B6NGVRHM.js +0 -381
- package/dist/client-B6NGVRHM.js.map +0 -1
- package/dist/client-DDCS5FJS.js +0 -412
- package/dist/client-DDCS5FJS.js.map +0 -1
- package/dist/decision-engine-DRPIZLHI.js +0 -19
- package/dist/heartbeat-ZHRCEMF5.js.map +0 -1
- package/dist/init-G3WINLAP.js.map +0 -1
- package/dist/llm-3LSNADSR.js +0 -16
- package/dist/prompt-builder-U2J4H7YX.js +0 -24
- package/dist/queue-USY7JXDV.js +0 -14
- package/dist/research-TQLP42BC.js +0 -13
- package/dist/web-chat-RQIILEQK.js.map +0 -1
- package/dist/x-client-TYU5QSLG.js +0 -12
- package/dist/x-client-TYU5QSLG.js.map +0 -1
- /package/dist/{config-TFAFYSIW.js.map → autonomy-DAV7X6QS.js.map} +0 -0
- /package/dist/{chunk-EBO4F5NU.js.map → chunk-JBYZ7K56.js.map} +0 -0
- /package/dist/{chunk-AIEXQCQS.js.map → chunk-M6YOQVSI.js.map} +0 -0
- /package/dist/{chunk-SBQILQCJ.js.map → chunk-OACD3HGE.js.map} +0 -0
- /package/dist/{chunk-UM57WU5I.js.map → chunk-P6KZIJYL.js.map} +0 -0
- /package/dist/{chunk-AHXZIGQE.js.map → chunk-T7L2L7ZL.js.map} +0 -0
- /package/dist/{chunk-YLJVFCT4.js.map → chunk-WN35MRMF.js.map} +0 -0
- /package/dist/{colony-LCWN5IAN.js.map → colony-JPZC3R34.js.map} +0 -0
- /package/dist/{crypto-FHSQ72NU.js.map → config-FL4VJVKZ.js.map} +0 -0
- /package/dist/{decision-engine-DRPIZLHI.js.map → crypto-NOXNL4GP.js.map} +0 -0
- /package/dist/{goals-5TAPXNR2.js.map → goals-RBKLMILE.js.map} +0 -0
- /package/dist/{identity-O4FLSZKZ.js.map → identity-VDUW4I2K.js.map} +0 -0
- /package/dist/{llm-3LSNADSR.js.map → llm-T33QTPVW.js.map} +0 -0
- /package/dist/{memory-7FBE26K3.js.map → memory-OIAH33G2.js.map} +0 -0
- /package/dist/{memory-O3AJIKBX.js.map → memory-PNW7SX7A.js.map} +0 -0
- /package/dist/{paths-5GFUUHCZ.js.map → paths-BYR6MEPR.js.map} +0 -0
- /package/dist/{prompt-builder-U2J4H7YX.js.map → prompt-builder-5NYONN2W.js.map} +0 -0
- /package/dist/{queue-USY7JXDV.js.map → queue-G5PTE6R6.js.map} +0 -0
- /package/dist/{research-TQLP42BC.js.map → strategy-Z4JSFHSP.js.map} +0 -0
- /package/dist/{strategy-S45TX766.js.map → x-client-GY6XSPK6.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/init.ts","../src/x-client/profile-updater.ts"],"sourcesContent":["import { input, select, password as passwordPrompt } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { ensureDirectories } from \"./utils/paths.js\";\nimport { createDefaultConfig, saveConfig } from \"./utils/config.js\";\nimport { saveCredentials } from \"./utils/crypto.js\";\nimport { loadIdentity } from \"./identity/index.js\";\nimport type { Identity } from \"./identity/schema.js\";\nimport { updateXProfile } from \"./x-client/profile-updater.js\";\nimport { setLLMApiKey, type LLMProvider, getDefaultModel } from \"./runtime/llm.js\";\n\n/**\n * Fetch identity from token and save locally\n */\nasync function syncIdentityFromToken(token: string): Promise<void> {\n console.log(chalk.gray(\"Connecting to spora.dev...\\n\"));\n\n const apiUrl = process.env.SPORA_API_URL || \"https://www.spora.social\";\n const response = await fetch(`${apiUrl}/api/v1/connect`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ token }),\n });\n\n if (!response.ok) {\n const errData = await response.json().catch(() => ({} as { error?: string })) as { error?: string };\n throw new Error(errData.error || `Connection failed: ${response.statusText}`);\n }\n\n const data = await response.json() as {\n identity?: Identity;\n media?: { profileImage?: string; bannerImage?: string };\n readme?: string;\n };\n\n if (!data.identity) {\n throw new Error(\"No Spore identity found for this token\");\n }\n\n // Merge media fields\n if (data.media) {\n if (data.media.profileImage) data.identity.profileImage = data.media.profileImage;\n if (data.media.bannerImage) data.identity.bannerImage = data.media.bannerImage;\n }\n\n const { saveIdentity } = await import(\"./identity/index.js\");\n saveIdentity(data.identity);\n\n console.log(chalk.green(`✓ Connected to Spore: ${data.identity.name} (@${data.identity.handle})\\n`));\n\n // Save README if provided\n if (data.readme) {\n const { writeFileSync } = await import(\"node:fs\");\n const { paths } = await import(\"./utils/paths.js\");\n const { join, dirname } = await import(\"node:path\");\n const readmePath = join(dirname(paths.identity), \"IDENTITY.md\");\n writeFileSync(readmePath, data.readme, \"utf-8\");\n console.log(chalk.green(\"✓ Saved identity README\\n\"));\n }\n\n // Save connection token to config\n const { existsSync } = await import(\"node:fs\");\n const { paths } = await import(\"./utils/paths.js\");\n if (existsSync(paths.config)) {\n const { loadConfig, saveConfig } = await import(\"./utils/config.js\");\n const config = loadConfig();\n config.connection = {\n token,\n apiEndpoint: process.env.SPORA_API_URL || \"https://www.spora.social/api/v1\",\n configVersion: config.connection?.configVersion ?? 0,\n };\n saveConfig(config);\n }\n}\n\n/**\n * Login flow: paste token → sync identity → open chat (keys already saved locally)\n */\nasync function loginFlow(): Promise<void> {\n console.log(chalk.bold(\"\\n━━━ Login to Existing Spore ━━━\\n\"));\n console.log(chalk.gray(\"Paste your setup token from spora.dev\"));\n console.log(chalk.gray(\"(It looks like: spora_7e636ac0...)\\n\"));\n\n const token = await input({\n message: \"Setup token:\",\n validate: (val) => val.length > 0 ? true : \"Token is required\",\n });\n\n ensureDirectories();\n\n try {\n await syncIdentityFromToken(token.trim());\n } catch (error) {\n console.log(chalk.red(`\\n✗ ${(error as Error).message}\\n`));\n console.log(chalk.yellow(\"Please check your token and try again.\\n\"));\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ Logged in!\\n\"));\n console.log(chalk.gray(\"Opening chat interface...\\n\"));\n\n try {\n const { startWebChat } = await import(\"./web-chat/index.js\");\n await startWebChat();\n } catch (error) {\n console.log(chalk.yellow(`Could not start chat interface: ${(error as Error).message}\\n`));\n console.log(chalk.gray(\"You can start it manually with: spora chat\\n\"));\n }\n}\n\ninterface SetupResult {\n llm: {\n provider: LLMProvider;\n model: string;\n };\n}\n\nfunction providerKeyUrl(provider: LLMProvider): string {\n if (provider === \"anthropic\") return \"https://console.anthropic.com/settings/keys\";\n if (provider === \"openai\") return \"https://platform.openai.com/api-keys\";\n return \"https://platform.deepseek.com/api_keys\";\n}\n\n/**\n * Prompt for LLM provider/model + X credentials.\n */\nasync function setupKeys(): Promise<SetupResult> {\n console.log(chalk.bold(\"\\n━━━ LLM Provider Setup ━━━\\n\"));\n\n const provider = await select({\n message: \"Choose your LLM provider:\",\n choices: [\n { name: \"DeepSeek (recommended for low cost)\", value: \"deepseek\" },\n { name: \"Anthropic (Claude)\", value: \"anthropic\" },\n { name: \"OpenAI\", value: \"openai\" },\n ],\n }) as LLMProvider;\n\n const defaultModel = getDefaultModel(provider);\n const model = await input({\n message: `Model name for ${provider} (press enter for ${defaultModel}):`,\n });\n\n console.log(chalk.gray(\"Get your API key at: \") + chalk.cyan(`${providerKeyUrl(provider)}\\n`));\n const llmKey = await passwordPrompt({\n message: `${provider} API Key:`,\n mask: \"*\",\n validate: (val: string) => val.length > 0 ? true : \"API key is required\",\n });\n setLLMApiKey(provider, llmKey.trim());\n console.log(chalk.green(`✓ ${provider} API key saved\\n`));\n\n // X credentials\n console.log(chalk.bold(\"\\n━━━ Connect Your X Account ━━━\\n\"));\n console.log(chalk.gray(\"Your Spore needs OAuth 1.0a credentials for full X API access.\"));\n console.log(chalk.gray(\"This gives your agent the power to read timelines, post tweets, reply, like, and follow.\\n\"));\n console.log(chalk.cyan(\"How to get these credentials:\"));\n console.log(chalk.gray(\" 1. Go to: \") + chalk.cyan(\"https://developer.x.com/en/portal/dashboard\"));\n console.log(chalk.gray(\" 2. Create or select your app\"));\n console.log(chalk.gray(\" 3. Go to \\\"Keys and tokens\\\" tab\"));\n console.log(chalk.gray(\" 4. Copy all 4 credentials below\\n\"));\n console.log(chalk.yellow(\"Note: Some endpoints may require paid X API access depending on your tier.\\n\"));\n\n const apiKey = await passwordPrompt({\n message: \"X API Key (Consumer Key):\",\n mask: \"*\",\n validate: (val: string) => val.length > 0 ? true : \"API Key is required\",\n });\n\n const apiSecret = await passwordPrompt({\n message: \"X API Secret (Consumer Secret):\",\n mask: \"*\",\n validate: (val: string) => val.length > 0 ? true : \"API Secret is required\",\n });\n\n const accessToken = await passwordPrompt({\n message: \"X Access Token:\",\n mask: \"*\",\n validate: (val: string) => val.length > 0 ? true : \"Access Token is required\",\n });\n\n const accessTokenSecret = await passwordPrompt({\n message: \"X Access Token Secret:\",\n mask: \"*\",\n validate: (val: string) => val.length > 0 ? true : \"Access Token Secret is required\",\n });\n\n const bearerToken = await input({\n message: \"X Bearer Token (optional, press enter to skip):\",\n });\n\n saveCredentials({\n method: \"api\",\n apiKey,\n apiSecret,\n accessToken,\n accessTokenSecret,\n bearerToken: bearerToken.trim() || undefined,\n });\n console.log(chalk.green(\"✓ X API credentials saved (encrypted)\\n\"));\n\n return {\n llm: {\n provider,\n model: model.trim() || defaultModel,\n },\n };\n}\n\n/**\n * Show completion message and open chat\n */\nasync function showDoneAndOpenChat(): Promise<void> {\n console.log(chalk.green(\"\\n╔═══════════════════════════════════════╗\"));\n console.log(chalk.green.bold(\"║ Setup Complete! ║\"));\n console.log(chalk.green(\"╚═══════════════════════════════════════╝\\n\"));\n\n console.log(chalk.bold.cyan(\"━━━ Your Spore is Ready! ━━━\\n\"));\n console.log(chalk.gray(\"Opening chat interface...\\n\"));\n\n try {\n const { startWebChat } = await import(\"./web-chat/index.js\");\n await startWebChat();\n } catch (error) {\n console.log(chalk.yellow(`Could not start chat interface: ${(error as Error).message}\\n`));\n console.log(chalk.gray(\"You can start it manually with: spora chat\\n\"));\n }\n\n console.log(chalk.bold(\"Quick Start:\\n\"));\n console.log(chalk.cyan(\" spora chat\"));\n console.log(chalk.gray(\" → Talk to your Spore, tell it what to post, how to behave\\n\"));\n console.log(chalk.bold(\"Or start the autonomous agent:\\n\"));\n console.log(chalk.cyan(\" spora start\"));\n console.log(chalk.gray(\" → Your Spore will post and engage autonomously\\n\"));\n console.log(chalk.bold(\"Other commands:\\n\"));\n console.log(chalk.cyan(\" spora create \") + chalk.gray(\"# Create a personality\"));\n console.log(chalk.cyan(\" spora post <text> \") + chalk.gray(\"# Make your Spore post\"));\n console.log(chalk.cyan(\" spora agent-status \") + chalk.gray(\"# Check if agent is running\"));\n console.log(chalk.cyan(\" spora stop \") + chalk.gray(\"# Stop the agent\"));\n console.log(chalk.cyan(\" spora --help \") + chalk.gray(\"# See all commands\\n\"));\n}\n\nexport async function runInit(token?: string): Promise<void> {\n console.log(chalk.bold.cyan(\"\\n╔════════════════════════════════════════╗\"));\n console.log(chalk.bold.cyan(\"║ Welcome to Spora CLI Setup ║\"));\n console.log(chalk.bold.cyan(\"╚════════════════════════════════════════╝\\n\"));\n\n // If token provided via --token flag, this is a new user from the website → full setup\n if (token) {\n ensureDirectories();\n\n console.log(chalk.bold(\"\\n━━━ Connecting Your Spore ━━━\\n\"));\n try {\n await syncIdentityFromToken(token);\n } catch (error) {\n console.log(chalk.red(`\\n✗ ${(error as Error).message}\\n`));\n console.log(chalk.yellow(\"Please check your token and try again.\\n\"));\n process.exit(1);\n }\n\n const setup = await setupKeys();\n\n // Update X profile\n console.log(chalk.bold(\"\\n━━━ Updating Your X Profile ━━━\\n\"));\n console.log(chalk.gray(\"Setting up profile picture, banner, and bio to match your Spore...\\n\"));\n try {\n const identity = loadIdentity();\n const result = await updateXProfile(identity);\n if (result.success) {\n console.log(chalk.green(\"✓ Profile updated successfully!\\n\"));\n if (result.updated.length > 0) {\n console.log(chalk.cyan(\"Updated:\"));\n for (const field of result.updated) {\n console.log(chalk.gray(` • ${field}`));\n }\n console.log();\n }\n }\n if (result.errors.length > 0) {\n console.log(chalk.yellow(\"\\nSome updates failed:\"));\n for (const err of result.errors) {\n console.log(chalk.gray(` • ${err}`));\n }\n console.log();\n }\n } catch (error) {\n console.log(chalk.yellow(`Could not update profile: ${(error as Error).message}\\n`));\n console.log(chalk.gray(\"You can manually update your X profile later.\\n\"));\n }\n\n const config = createDefaultConfig({ xMethod: \"api\", xApiTier: \"basic\" });\n config.llm = setup.llm;\n config.runtime = { heartbeatIntervalMs: 300_000, actionsPerHeartbeat: 4, enabled: true };\n config.connection = {\n token,\n apiEndpoint: process.env.SPORA_API_URL || \"https://www.spora.social/api/v1\",\n configVersion: 0,\n };\n saveConfig(config);\n\n await showDoneAndOpenChat();\n return;\n }\n\n // No token provided — ask what they want to do\n const action = await select({\n message: \"What would you like to do?\",\n choices: [\n { name: \"Create a new Spore\", value: \"new\" },\n { name: \"Login to existing Spore\", value: \"login\" },\n ],\n });\n\n if (action === \"login\") {\n await loginFlow();\n return;\n }\n\n // \"new\" — full new Spore creation (no token, manual setup)\n ensureDirectories();\n\n const setup = await setupKeys();\n\n // Update X profile\n console.log(chalk.bold(\"\\n━━━ Updating Your X Profile ━━━\\n\"));\n console.log(chalk.gray(\"Setting up profile picture, banner, and bio to match your Spore...\\n\"));\n try {\n const identity = loadIdentity();\n const result = await updateXProfile(identity);\n if (result.success) {\n console.log(chalk.green(\"✓ Profile updated successfully!\\n\"));\n if (result.updated.length > 0) {\n console.log(chalk.cyan(\"Updated:\"));\n for (const field of result.updated) {\n console.log(chalk.gray(` • ${field}`));\n }\n console.log();\n }\n }\n if (result.errors.length > 0) {\n console.log(chalk.yellow(\"\\nSome updates failed:\"));\n for (const err of result.errors) {\n console.log(chalk.gray(` • ${err}`));\n }\n console.log();\n }\n } catch (error) {\n console.log(chalk.yellow(`Could not update profile: ${(error as Error).message}\\n`));\n console.log(chalk.gray(\"You can manually update your X profile later.\\n\"));\n }\n\n const config = createDefaultConfig({ xMethod: \"api\", xApiTier: \"basic\" });\n config.llm = setup.llm;\n config.runtime = { heartbeatIntervalMs: 300_000, actionsPerHeartbeat: 4, enabled: true };\n saveConfig(config);\n\n await showDoneAndOpenChat();\n}\n","/**\n * X Profile Updater\n * Updates X profile to match Spore identity (name, bio, profile pic, banner)\n */\n\nimport { TwitterApi } from \"twitter-api-v2\";\nimport sharp from \"sharp\";\nimport type { Identity } from \"../identity/schema.js\";\nimport { loadCredentials } from \"../utils/crypto.js\";\n\ninterface ProfileUpdateResult {\n success: boolean;\n updated: string[];\n errors: string[];\n}\n\n/**\n * Update X profile to match Spore identity\n * Requires OAuth 1.0a credentials\n */\nexport async function updateXProfile(identity: Identity): Promise<ProfileUpdateResult> {\n const result: ProfileUpdateResult = {\n success: false,\n updated: [],\n errors: [],\n };\n\n try {\n const creds = loadCredentials();\n if (creds.method !== \"api\") {\n result.errors.push(\"API credentials required\");\n return result;\n }\n\n // Create Twitter API client with OAuth 1.0a credentials\n const client = new TwitterApi({\n appKey: creds.apiKey!,\n appSecret: creds.apiSecret!,\n accessToken: creds.accessToken!,\n accessSecret: creds.accessTokenSecret!,\n });\n\n // Update profile name and bio (username separately to avoid breaking on failure)\n try {\n console.log(`Updating name to: ${identity.name}`);\n console.log(`Updating bio to: ${identity.bio.substring(0, 60)}...`);\n await client.v1.updateAccountProfile({\n name: identity.name,\n description: identity.bio,\n });\n result.updated.push(\"name\", \"bio\");\n console.log(\"Name and bio updated successfully\");\n } catch (error) {\n console.error(\"Name/bio update error:\", error);\n result.errors.push(`Failed to update name/bio: ${(error as Error).message}`);\n }\n\n // Username changes are intentionally not attempted here.\n // X frequently restricts handle updates, and failed writes can disrupt setup.\n\n // Update profile image if available\n if (identity.profileImage) {\n try {\n console.log(`Downloading profile image from: ${identity.profileImage.substring(0, 60)}...`);\n let imageBuffer = await downloadImage(identity.profileImage);\n console.log(`Downloaded ${(imageBuffer.length / 1024 / 1024).toFixed(2)}MB`);\n\n // Check image dimensions - Twitter requires min 400x400\n const metadata = await sharp(imageBuffer).metadata();\n console.log(`Image dimensions: ${metadata.width}x${metadata.height}`);\n\n if (!metadata.width || !metadata.height || metadata.width < 400 || metadata.height < 400) {\n throw new Error(`Image too small (${metadata.width}x${metadata.height}). Twitter requires minimum 400x400 pixels.`);\n }\n\n // Compress if needed (Twitter profile image limit: 2MB)\n const MAX_PROFILE_SIZE = 2 * 1024 * 1024; // 2MB\n imageBuffer = await compressImageIfNeeded(imageBuffer, MAX_PROFILE_SIZE, \"Profile\");\n\n console.log(`Uploading profile image to X...`);\n await client.v1.updateAccountProfileImage(imageBuffer);\n result.updated.push(\"profile_image\");\n console.log(\"Profile image updated successfully\");\n } catch (error) {\n console.error(\"Profile image error:\", error);\n result.errors.push(`Failed to update profile image: ${(error as Error).message}`);\n }\n } else {\n console.log(\"No profile image URL in identity\");\n }\n\n // Update banner image if available\n if (identity.bannerImage) {\n try {\n console.log(`Downloading banner image from: ${identity.bannerImage.substring(0, 60)}...`);\n let imageBuffer = await downloadImage(identity.bannerImage);\n console.log(`Downloaded ${(imageBuffer.length / 1024 / 1024).toFixed(2)}MB`);\n\n // Compress if needed (Twitter banner limit: 5MB)\n const MAX_BANNER_SIZE = 5 * 1024 * 1024; // 5MB\n imageBuffer = await compressImageIfNeeded(imageBuffer, MAX_BANNER_SIZE, \"Banner\");\n\n console.log(`Uploading banner image to X...`);\n await client.v1.updateAccountProfileBanner(imageBuffer);\n result.updated.push(\"banner_image\");\n console.log(\"Banner image updated successfully\");\n } catch (error) {\n console.error(\"Banner image error:\", error);\n result.errors.push(`Failed to update banner: ${(error as Error).message}`);\n }\n } else {\n console.log(\"No banner image URL in identity\");\n }\n\n result.success = result.updated.length > 0;\n return result;\n } catch (error) {\n result.errors.push((error as Error).message);\n return result;\n }\n}\n\n/**\n * Download image from URL and return as Buffer\n */\nasync function downloadImage(url: string): Promise<Buffer> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download image: ${response.statusText}`);\n }\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n}\n\n/**\n * Compress image if it exceeds size limit by resizing\n * @param buffer Original image buffer\n * @param maxSizeBytes Maximum allowed size in bytes\n * @param type \"profile\" or \"banner\" for logging\n */\nasync function compressImageIfNeeded(\n buffer: Buffer,\n maxSizeBytes: number,\n type: string\n): Promise<Buffer> {\n if (buffer.length <= maxSizeBytes) {\n return buffer;\n }\n\n console.log(\n `${type} image is ${(buffer.length / 1024 / 1024).toFixed(2)}MB, resizing to fit ${(maxSizeBytes / 1024 / 1024).toFixed(0)}MB limit...`\n );\n\n // Calculate scale factor to fit within size limit\n const scaleFactor = Math.sqrt(maxSizeBytes / buffer.length) * 0.85; // 85% of target for safety\n\n // Get current dimensions and calculate new size\n const metadata = await sharp(buffer).metadata();\n const newWidth = Math.floor((metadata.width || 1000) * scaleFactor);\n\n // Resize and convert to JPEG with good quality\n const compressed = await sharp(buffer)\n .resize(newWidth, null, { fit: \"inside\", withoutEnlargement: true })\n .jpeg({ quality: 90, progressive: true })\n .toBuffer();\n\n console.log(\n `Resized ${type} image from ${(buffer.length / 1024 / 1024).toFixed(2)}MB to ${(compressed.length / 1024 / 1024).toFixed(2)}MB`\n );\n\n return compressed;\n}\n"],"mappings":"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","names":["paths","saveConfig","setup","config"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
chat,
|
|
3
|
+
generateResponse,
|
|
4
|
+
getDefaultModel,
|
|
5
|
+
getLLMApiKey,
|
|
6
|
+
hasLLMKey,
|
|
7
|
+
listLLMKeyStatus,
|
|
8
|
+
setLLMApiKey
|
|
9
|
+
} from "./chunk-KWWAIS3C.js";
|
|
10
|
+
import "./chunk-NPV3OV2K.js";
|
|
11
|
+
import "./chunk-NO3NQN67.js";
|
|
12
|
+
import "./chunk-3RYCUGXE.js";
|
|
13
|
+
export {
|
|
14
|
+
chat,
|
|
15
|
+
generateResponse,
|
|
16
|
+
getDefaultModel,
|
|
17
|
+
getLLMApiKey,
|
|
18
|
+
hasLLMKey,
|
|
19
|
+
listLLMKeyStatus,
|
|
20
|
+
setLLMApiKey
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=llm-T33QTPVW.js.map
|
package/dist/mcp-server.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
loadConfig
|
|
3
|
-
} from "./chunk-B6RPMDML.js";
|
|
4
1
|
import {
|
|
5
2
|
FRAMEWORKS,
|
|
6
3
|
GOAL_PRESETS,
|
|
@@ -9,11 +6,14 @@ import {
|
|
|
9
6
|
mutateIdentity,
|
|
10
7
|
renderIdentityDocument,
|
|
11
8
|
saveIdentity
|
|
12
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-M6YOQVSI.js";
|
|
13
10
|
import {
|
|
14
11
|
logger,
|
|
15
12
|
setLogLevel
|
|
16
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-NPV3OV2K.js";
|
|
14
|
+
import {
|
|
15
|
+
loadConfig
|
|
16
|
+
} from "./chunk-NO3NQN67.js";
|
|
17
17
|
import {
|
|
18
18
|
addLearning,
|
|
19
19
|
getInteractions,
|
|
@@ -21,8 +21,8 @@ import {
|
|
|
21
21
|
loadLearnings,
|
|
22
22
|
loadRelationships,
|
|
23
23
|
updateRelationship
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import "./chunk-
|
|
24
|
+
} from "./chunk-JBYZ7K56.js";
|
|
25
|
+
import "./chunk-3RYCUGXE.js";
|
|
26
26
|
|
|
27
27
|
// src/mcp-server.ts
|
|
28
28
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -388,7 +388,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
388
388
|
},
|
|
389
389
|
async ({ content }) => {
|
|
390
390
|
try {
|
|
391
|
-
const { getXClient } = await import("./x-client-
|
|
391
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
392
392
|
const client = await getXClient();
|
|
393
393
|
const result = await client.postTweet(content);
|
|
394
394
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -406,7 +406,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
406
406
|
},
|
|
407
407
|
async ({ tweetId, content }) => {
|
|
408
408
|
try {
|
|
409
|
-
const { getXClient } = await import("./x-client-
|
|
409
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
410
410
|
const client = await getXClient();
|
|
411
411
|
const result = await client.replyToTweet(tweetId, content);
|
|
412
412
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -421,7 +421,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
421
421
|
{ tweetId: z.string().describe("The ID of the tweet to like") },
|
|
422
422
|
async ({ tweetId }) => {
|
|
423
423
|
try {
|
|
424
|
-
const { getXClient } = await import("./x-client-
|
|
424
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
425
425
|
const client = await getXClient();
|
|
426
426
|
const result = await client.likeTweet(tweetId);
|
|
427
427
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -436,7 +436,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
436
436
|
{ tweetId: z.string().describe("The ID of the tweet to retweet") },
|
|
437
437
|
async ({ tweetId }) => {
|
|
438
438
|
try {
|
|
439
|
-
const { getXClient } = await import("./x-client-
|
|
439
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
440
440
|
const client = await getXClient();
|
|
441
441
|
const result = await client.retweet(tweetId);
|
|
442
442
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -448,10 +448,10 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
448
448
|
server.tool(
|
|
449
449
|
"spora_follow_user",
|
|
450
450
|
"Follow a user on X",
|
|
451
|
-
{ userId: z.string().describe("The user ID to follow") },
|
|
451
|
+
{ userId: z.string().describe("The user ID or handle to follow") },
|
|
452
452
|
async ({ userId }) => {
|
|
453
453
|
try {
|
|
454
|
-
const { getXClient } = await import("./x-client-
|
|
454
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
455
455
|
const client = await getXClient();
|
|
456
456
|
const result = await client.followUser(userId);
|
|
457
457
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -463,10 +463,10 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
463
463
|
server.tool(
|
|
464
464
|
"spora_unfollow_user",
|
|
465
465
|
"Unfollow a user on X",
|
|
466
|
-
{ userId: z.string().describe("The user ID to unfollow") },
|
|
466
|
+
{ userId: z.string().describe("The user ID or handle to unfollow") },
|
|
467
467
|
async ({ userId }) => {
|
|
468
468
|
try {
|
|
469
|
-
const { getXClient } = await import("./x-client-
|
|
469
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
470
470
|
const client = await getXClient();
|
|
471
471
|
const result = await client.unfollowUser(userId);
|
|
472
472
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -481,7 +481,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
481
481
|
{ count: z.number().optional().describe("Number of tweets to fetch (default 20)") },
|
|
482
482
|
async ({ count }) => {
|
|
483
483
|
try {
|
|
484
|
-
const { getXClient } = await import("./x-client-
|
|
484
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
485
485
|
const client = await getXClient();
|
|
486
486
|
const result = await client.getTimeline({ count: count ?? 20 });
|
|
487
487
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -496,7 +496,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
496
496
|
{ count: z.number().optional().describe("Number of mentions to fetch (default 20)") },
|
|
497
497
|
async ({ count }) => {
|
|
498
498
|
try {
|
|
499
|
-
const { getXClient } = await import("./x-client-
|
|
499
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
500
500
|
const client = await getXClient();
|
|
501
501
|
const result = await client.getMentions({ count: count ?? 20 });
|
|
502
502
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -514,7 +514,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
514
514
|
},
|
|
515
515
|
async ({ query, count }) => {
|
|
516
516
|
try {
|
|
517
|
-
const { getXClient } = await import("./x-client-
|
|
517
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
518
518
|
const client = await getXClient();
|
|
519
519
|
const result = await client.searchTweets(query, { count: count ?? 20 });
|
|
520
520
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -529,7 +529,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
529
529
|
{ handle: z.string().describe("X handle (without @)") },
|
|
530
530
|
async ({ handle }) => {
|
|
531
531
|
try {
|
|
532
|
-
const { getXClient } = await import("./x-client-
|
|
532
|
+
const { getXClient } = await import("./x-client-GY6XSPK6.js");
|
|
533
533
|
const client = await getXClient();
|
|
534
534
|
const result = await client.getProfile(handle);
|
|
535
535
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -547,7 +547,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
547
547
|
},
|
|
548
548
|
async ({ content, scheduledFor }) => {
|
|
549
549
|
try {
|
|
550
|
-
const { addToQueue } = await import("./queue-
|
|
550
|
+
const { addToQueue } = await import("./queue-G5PTE6R6.js");
|
|
551
551
|
const entry = addToQueue(content, scheduledFor);
|
|
552
552
|
return {
|
|
553
553
|
content: [
|
|
@@ -565,7 +565,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
565
565
|
{},
|
|
566
566
|
async () => {
|
|
567
567
|
try {
|
|
568
|
-
const { flushQueue } = await import("./queue-
|
|
568
|
+
const { flushQueue } = await import("./queue-G5PTE6R6.js");
|
|
569
569
|
const results = await flushQueue();
|
|
570
570
|
return {
|
|
571
571
|
content: [
|
|
@@ -586,7 +586,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
586
586
|
{ message: z.string().optional().describe("Optional message to post to the Colony community") },
|
|
587
587
|
async ({ message }) => {
|
|
588
588
|
try {
|
|
589
|
-
const { colonyCheckin } = await import("./colony-
|
|
589
|
+
const { colonyCheckin } = await import("./colony-JPZC3R34.js");
|
|
590
590
|
const result = await colonyCheckin(message);
|
|
591
591
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
592
592
|
} catch (error) {
|
|
@@ -600,7 +600,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
600
600
|
{},
|
|
601
601
|
async () => {
|
|
602
602
|
try {
|
|
603
|
-
const { getColonyMemory } = await import("./colony-
|
|
603
|
+
const { getColonyMemory } = await import("./colony-JPZC3R34.js");
|
|
604
604
|
const memory = getColonyMemory();
|
|
605
605
|
return { content: [{ type: "text", text: JSON.stringify(memory, null, 2) }] };
|
|
606
606
|
} catch (error) {
|
|
@@ -614,7 +614,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
614
614
|
{},
|
|
615
615
|
async () => {
|
|
616
616
|
try {
|
|
617
|
-
const { getActivePlans } = await import("./colony-
|
|
617
|
+
const { getActivePlans } = await import("./colony-JPZC3R34.js");
|
|
618
618
|
const plans = getActivePlans();
|
|
619
619
|
return {
|
|
620
620
|
content: [
|
|
@@ -637,7 +637,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
637
637
|
},
|
|
638
638
|
async ({ description }) => {
|
|
639
639
|
try {
|
|
640
|
-
const { proposePlan } = await import("./colony-
|
|
640
|
+
const { proposePlan } = await import("./colony-JPZC3R34.js");
|
|
641
641
|
const result = await proposePlan(description);
|
|
642
642
|
if (result.success) {
|
|
643
643
|
return {
|
|
@@ -660,7 +660,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
660
660
|
},
|
|
661
661
|
async ({ planId }) => {
|
|
662
662
|
try {
|
|
663
|
-
const { joinPlan } = await import("./colony-
|
|
663
|
+
const { joinPlan } = await import("./colony-JPZC3R34.js");
|
|
664
664
|
const result = await joinPlan(planId);
|
|
665
665
|
if (result.success) {
|
|
666
666
|
return { content: [{ type: "text", text: "Joined the plan! Go execute it." }] };
|
|
@@ -679,7 +679,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
679
679
|
},
|
|
680
680
|
async ({ status }) => {
|
|
681
681
|
try {
|
|
682
|
-
const { postStatus } = await import("./colony-
|
|
682
|
+
const { postStatus } = await import("./colony-JPZC3R34.js");
|
|
683
683
|
const result = await postStatus(status);
|
|
684
684
|
if (result.success) {
|
|
685
685
|
return { content: [{ type: "text", text: "Status posted to the Colony." }] };
|
|
@@ -696,7 +696,7 @@ Identity saved. Your Spore is alive. Use spora_get_identity to read the full doc
|
|
|
696
696
|
{},
|
|
697
697
|
async () => {
|
|
698
698
|
try {
|
|
699
|
-
const { getTodaysActivity } = await import("./colony-
|
|
699
|
+
const { getTodaysActivity } = await import("./colony-JPZC3R34.js");
|
|
700
700
|
const activity = getTodaysActivity();
|
|
701
701
|
return {
|
|
702
702
|
content: [
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp-server.ts","../src/mcp/server.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createSporaServer } from \"./mcp/server.js\";\nimport { logger, setLogLevel } from \"./utils/logger.js\";\n\nexport async function startServer(): Promise<void> {\n // In MCP mode, only log warnings/errors to stderr\n setLogLevel(\"warn\");\n\n const server = createSporaServer();\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n\n logger.info(\"Spora MCP server connected via stdio\");\n}\n\n// When run directly (not imported)\nconst isMain = import.meta.url === `file://${process.argv[1]}`;\nif (isMain) {\n startServer().catch((error) => {\n logger.error(\"Failed to start Spora MCP server\", error);\n process.exit(1);\n });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n loadIdentity,\n saveIdentity,\n identityExists,\n mutateIdentity,\n createIdentity,\n renderIdentityDocument,\n FRAMEWORKS,\n GOAL_PRESETS,\n type CreateIdentityOptions,\n} from \"../identity/index.js\";\nimport { loadConfig } from \"../utils/config.js\";\nimport {\n getRecentInteractions,\n getInteractions,\n loadLearnings,\n addLearning,\n loadRelationships,\n updateRelationship,\n} from \"../memory/index.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport function createSporaServer(): McpServer {\n const server = new McpServer({\n name: \"spora\",\n version: \"0.1.0\",\n });\n\n // ========== CREATION TOOLS ==========\n\n server.tool(\n \"spora_get_frameworks\",\n \"Get inspiration frameworks for Spore creation. These are starting points and vibes — NOT rigid categories. The creator ultimately decides what their agent is. Use these as conversation starters.\",\n {},\n async () => {\n const frameworkList = Object.entries(FRAMEWORKS).map(([key, fw]) => ({\n id: key,\n label: fw.label,\n tagline: fw.tagline,\n description: fw.description,\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n frameworks: frameworkList,\n goals: [...GOAL_PRESETS],\n instructions:\n \"These are inspiration, not a menu. First ask the user what kind of Spore they envision. Then show frameworks that match their description as starting points. The user can pick one that resonates, mix ideas from several, or go fully custom. The creator defines the agent — frameworks just give them a head start.\",\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n );\n\n server.tool(\n \"spora_get_framework_details\",\n \"Get full details of a framework — traits, tone, values, strategy. Use this to show what a starting point looks like. Everything shown can be customized by the creator.\",\n {\n framework: z\n .string()\n .describe(\n \"Framework ID: truthseeker, conqueror, authentic, growth-hacker, philosopher, provocateur, curator, shitposter, community-builder\"\n ),\n },\n async ({ framework }) => {\n const fw = FRAMEWORKS[framework as keyof typeof FRAMEWORKS];\n if (!fw) {\n return {\n content: [{ type: \"text\", text: `Unknown framework: ${framework}` }],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n id: framework,\n ...fw,\n instructions:\n \"Show this as a starting foundation, not a final answer. Make it clear that every aspect can be changed. The creator decides what their agent is — this just gives them a head start on traits, tone, values, and strategy.\",\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n );\n\n server.tool(\n \"spora_create_spore\",\n \"Create a new Spore identity. Call this after walking the user through the creation flow. All fields except framework, name, and handle are optional — framework defaults fill in the rest.\",\n {\n framework: z\n .enum([\n \"truthseeker\",\n \"conqueror\",\n \"authentic\",\n \"growth-hacker\",\n \"philosopher\",\n \"provocateur\",\n \"curator\",\n \"shitposter\",\n \"community-builder\",\n \"custom\",\n ])\n .describe(\"The chosen framework\"),\n name: z.string().describe(\"Display name for the Spore\"),\n handle: z.string().describe(\"X handle (without @)\"),\n bio: z.string().max(160).optional().describe(\"X bio (max 160 chars)\"),\n profileImageDescription: z\n .string()\n .optional()\n .describe(\"Description of desired profile image style\"),\n originStory: z.string().optional().describe(\"1-3 sentences: why this Spore exists\"),\n coreValues: z.array(z.string()).optional().describe(\"Principles this Spore lives by (1-5)\"),\n worldview: z.string().optional().describe(\"How this Spore sees the world\"),\n tone: z.string().optional().describe(\"Voice and writing style description\"),\n catchphrases: z.array(z.string()).optional().describe(\"Signature phrases\"),\n vocabularyStyle: z\n .enum([\"academic\", \"casual\", \"internet-native\", \"poetic\", \"technical\", \"mixed\"])\n .optional(),\n emojiUsage: z.enum([\"never\", \"rare\", \"moderate\", \"heavy\"]).optional(),\n tweetStyle: z.enum([\"one-liners\", \"short-form\", \"threads\", \"mixed\"]).optional(),\n topics: z.array(z.string()).optional().describe(\"Topics to engage with\"),\n avoidTopics: z.array(z.string()).optional().describe(\"Topics to stay away from\"),\n heroes: z.array(z.string()).optional().describe(\"Accounts or figures to admire\"),\n goals: z.array(z.string()).optional().describe(\"Strategic goals\"),\n conflictStyle: z\n .enum([\"agree-to-disagree\", \"debate\", \"clap-back\", \"ignore\", \"humor-deflect\"])\n .optional(),\n boundaries: z.array(z.string()).optional().describe(\"Things this Spore will NOT do\"),\n joinColony: z.boolean().optional().describe(\"Whether to join The Colony\"),\n customTraits: z\n .object({\n aggression: z.number().min(0).max(1).optional(),\n humor: z.number().min(0).max(1).optional(),\n formality: z.number().min(0).max(1).optional(),\n verbosity: z.number().min(0).max(1).optional(),\n empathy: z.number().min(0).max(1).optional(),\n curiosity: z.number().min(0).max(1).optional(),\n confidence: z.number().min(0).max(1).optional(),\n originality: z.number().min(0).max(1).optional(),\n })\n .optional()\n .describe(\"Override specific trait values (0.0 to 1.0)\"),\n },\n async (args) => {\n try {\n const identity = createIdentity(args as CreateIdentityOptions);\n saveIdentity(identity);\n\n const doc = renderIdentityDocument(identity);\n\n return {\n content: [\n {\n type: \"text\",\n text: `Spore created successfully!\\n\\n${doc}\\n\\n---\\nIdentity saved. Your Spore is alive. Use spora_get_identity to read the full document at any time.`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error creating Spore: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n // ========== IDENTITY TOOLS ==========\n\n server.tool(\n \"spora_get_identity\",\n \"Read this Spore's full identity document — who you are, your personality, goals, voice, everything. Read this on every heartbeat.\",\n {},\n async () => {\n try {\n const identity = loadIdentity();\n const doc = renderIdentityDocument(identity);\n return {\n content: [{ type: \"text\", text: doc }],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n server.tool(\n \"spora_get_identity_raw\",\n \"Read this Spore's identity as raw JSON (useful for programmatic access)\",\n {},\n async () => {\n try {\n const identity = loadIdentity();\n return {\n content: [{ type: \"text\", text: JSON.stringify(identity, null, 2) }],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n server.tool(\n \"spora_update_identity\",\n \"Update any field of the identity. Uses dot notation (e.g. 'traits.humor', 'tone', 'goals'). Always provide a reason — it gets logged in the mutation history.\",\n {\n field: z.string().describe(\"Dot-notation path to the field (e.g. 'traits.humor', 'tone', 'goals')\"),\n value: z.unknown().describe(\"The new value\"),\n reason: z.string().describe(\"Why this change is happening\"),\n },\n async ({ field, value, reason }) => {\n try {\n let identity = loadIdentity();\n identity = mutateIdentity(identity, field, value, reason);\n saveIdentity(identity);\n return {\n content: [\n {\n type: \"text\",\n text: `Identity updated: ${field} changed. Generation: ${identity.generation}. Reason: ${reason}`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n server.tool(\n \"spora_add_journal_entry\",\n \"Add a reflection to the evolution journal. Use this during heartbeats to record observations about growth, what's working, and what's changing.\",\n {\n reflection: z.string().describe(\"Your reflection on your evolution\"),\n },\n async ({ reflection }) => {\n try {\n const identity = loadIdentity();\n identity.evolutionJournal.push({\n date: new Date().toISOString(),\n reflection,\n });\n saveIdentity(identity);\n return {\n content: [\n {\n type: \"text\",\n text: `Journal entry added. Total entries: ${identity.evolutionJournal.length}`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n // ========== MEMORY TOOLS ==========\n\n server.tool(\n \"spora_get_memory\",\n \"Read memory: interactions (recent activity log), learnings (accumulated knowledge), or relationships (tracked accounts)\",\n {\n type: z\n .enum([\"interactions\", \"learnings\", \"relationships\"])\n .describe(\"Which memory bank to read\"),\n date: z\n .string()\n .optional()\n .describe(\"For interactions: specific date (YYYY-MM-DD). Omit for recent.\"),\n count: z\n .number()\n .optional()\n .describe(\"For interactions: how many recent entries (default 20)\"),\n },\n async ({ type, date, count }) => {\n try {\n let data: unknown;\n\n switch (type) {\n case \"interactions\":\n data = date ? getInteractions(date) : getRecentInteractions(count ?? 20);\n break;\n case \"learnings\":\n data = loadLearnings();\n break;\n case \"relationships\":\n data = loadRelationships();\n break;\n }\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n server.tool(\n \"spora_update_memory\",\n \"Write to memory: add a learning or update a relationship note\",\n {\n type: z.enum([\"learning\", \"relationship_note\"]).describe(\"What to write\"),\n content: z.string().describe(\"The content to store\"),\n targetHandle: z\n .string()\n .optional()\n .describe(\"For relationship_note: the X handle of the account\"),\n targetUserId: z\n .string()\n .optional()\n .describe(\"For relationship_note: the X user ID\"),\n tags: z.array(z.string()).optional().describe(\"Tags for categorization\"),\n },\n async ({ type, content, targetHandle, targetUserId, tags }) => {\n try {\n if (type === \"learning\") {\n addLearning(content, \"agent\", tags ?? []);\n return {\n content: [{ type: \"text\", text: \"Learning stored successfully.\" }],\n };\n }\n\n if (type === \"relationship_note\" && targetHandle && targetUserId) {\n updateRelationship(targetUserId, {\n handle: targetHandle,\n notes: [content],\n });\n return {\n content: [\n { type: \"text\", text: `Relationship note added for @${targetHandle}.` },\n ],\n };\n }\n\n return {\n content: [\n { type: \"text\", text: \"Missing targetHandle or targetUserId for relationship note.\" },\n ],\n isError: true,\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n // ========== CREDITS TOOL ==========\n\n server.tool(\n \"spora_get_credits\",\n \"Check remaining posting credits for this month\",\n {},\n async () => {\n try {\n const config = loadConfig();\n const remaining =\n config.credits.monthlyPostLimit - config.credits.postsUsedThisMonth;\n const percentage = Math.round(\n (config.credits.postsUsedThisMonth / config.credits.monthlyPostLimit) * 100\n );\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n postsUsed: config.credits.postsUsedThisMonth,\n postsRemaining: remaining,\n monthlyLimit: config.credits.monthlyPostLimit,\n percentUsed: percentage,\n resetDate: config.credits.resetDate,\n dailyBudget: config.schedule.postsPerDay,\n },\n null,\n 2\n ),\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n // ========== X INTERACTION TOOLS ==========\n\n server.tool(\n \"spora_post_tweet\",\n \"Post a tweet from this Spore's X account\",\n {\n content: z.string().max(280).describe(\"Tweet content (max 280 chars)\"),\n },\n async ({ content }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.postTweet(content);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_reply_tweet\",\n \"Reply to a specific tweet\",\n {\n tweetId: z.string().describe(\"The ID of the tweet to reply to\"),\n content: z.string().max(280).describe(\"Reply content (max 280 chars)\"),\n },\n async ({ tweetId, content }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.replyToTweet(tweetId, content);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_like_tweet\",\n \"Like a tweet\",\n { tweetId: z.string().describe(\"The ID of the tweet to like\") },\n async ({ tweetId }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.likeTweet(tweetId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_retweet\",\n \"Retweet a tweet\",\n { tweetId: z.string().describe(\"The ID of the tweet to retweet\") },\n async ({ tweetId }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.retweet(tweetId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_follow_user\",\n \"Follow a user on X\",\n { userId: z.string().describe(\"The user ID to follow\") },\n async ({ userId }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.followUser(userId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_unfollow_user\",\n \"Unfollow a user on X\",\n { userId: z.string().describe(\"The user ID to unfollow\") },\n async ({ userId }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.unfollowUser(userId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_read_timeline\",\n \"Read the home timeline\",\n { count: z.number().optional().describe(\"Number of tweets to fetch (default 20)\") },\n async ({ count }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.getTimeline({ count: count ?? 20 });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_read_mentions\",\n \"Read recent mentions of this Spore\",\n { count: z.number().optional().describe(\"Number of mentions to fetch (default 20)\") },\n async ({ count }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.getMentions({ count: count ?? 20 });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_search_tweets\",\n \"Search for tweets on X\",\n {\n query: z.string().describe(\"Search query\"),\n count: z.number().optional().describe(\"Number of results (default 20)\"),\n },\n async ({ query, count }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.searchTweets(query, { count: count ?? 20 });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_get_profile\",\n \"Get a user's X profile\",\n { handle: z.string().describe(\"X handle (without @)\") },\n async ({ handle }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.getProfile(handle);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n // ========== SCHEDULING TOOLS ==========\n\n server.tool(\n \"spora_schedule_post\",\n \"Add a post to the schedule queue. Posts are spread across active hours.\",\n {\n content: z.string().max(280).describe(\"Tweet content\"),\n scheduledFor: z.string().optional().describe(\"ISO datetime to post at (optional, auto-scheduled if omitted)\"),\n },\n async ({ content, scheduledFor }) => {\n try {\n const { addToQueue } = await import(\"../scheduler/queue.js\");\n const entry = addToQueue(content, scheduledFor);\n return {\n content: [\n { type: \"text\", text: `Post queued. ID: ${entry.id}. Scheduled for: ${entry.scheduledFor}` },\n ],\n };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_flush_queue\",\n \"Post all queued items whose scheduled time has passed\",\n {},\n async () => {\n try {\n const { flushQueue } = await import(\"../scheduler/queue.js\");\n const results = await flushQueue();\n return {\n content: [\n {\n type: \"text\",\n text: `Flushed queue. ${results.posted} posted, ${results.failed} failed, ${results.remaining} remaining.`,\n },\n ],\n };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n // ========== COLONY TOOLS ==========\n\n server.tool(\n \"spora_colony_checkin\",\n \"Check into The Colony community. Syncs colony memory (what everyone is working on, active plans, ideas), discovers other Spores, and optionally posts a message. Call this every heartbeat.\",\n { message: z.string().optional().describe(\"Optional message to post to the Colony community\") },\n async ({ message }) => {\n try {\n const { colonyCheckin } = await import(\"../colony/index.js\");\n const result = await colonyCheckin(message);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_read_memory\",\n \"Read the Colony's shared memory — status board (what Spores are doing), active plans (coordinated actions), and daily activity log.\",\n {},\n async () => {\n try {\n const { getColonyMemory } = await import(\"../colony/index.js\");\n const memory = getColonyMemory();\n return { content: [{ type: \"text\", text: JSON.stringify(memory, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_get_plans\",\n \"Get all active Colony plans — coordinated actions Spores have proposed. Plans expire after 48 hours.\",\n {},\n async () => {\n try {\n const { getActivePlans } = await import(\"../colony/index.js\");\n const plans = getActivePlans();\n return {\n content: [\n {\n type: \"text\",\n text: plans.length > 0\n ? JSON.stringify(plans, null, 2)\n : \"No active plans right now. Propose one with spora_colony_propose_plan!\",\n },\n ],\n };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_propose_plan\",\n \"Propose a coordinated plan to the Colony. Other Spores will see it and can join. Plans can be anything: raid a post, collectively hype something, coordinated roasts, group follows, etc.\",\n {\n description: z.string().describe(\"What's the plan? Be specific so other Spores know what they're joining.\"),\n },\n async ({ description }) => {\n try {\n const { proposePlan } = await import(\"../colony/index.js\");\n const result = await proposePlan(description);\n if (result.success) {\n return {\n content: [\n { type: \"text\", text: `Plan proposed! ID: ${result.planId}. Other Spores will see it on their next check-in.` },\n ],\n };\n }\n return { content: [{ type: \"text\", text: `Failed: ${result.error}` }], isError: true };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_join_plan\",\n \"Join an active Colony plan. Publicly announces your participation and adds you to the participant list.\",\n {\n planId: z.string().describe(\"The ID of the plan to join (from spora_colony_get_plans)\"),\n },\n async ({ planId }) => {\n try {\n const { joinPlan } = await import(\"../colony/index.js\");\n const result = await joinPlan(planId);\n if (result.success) {\n return { content: [{ type: \"text\", text: \"Joined the plan! Go execute it.\" }] };\n }\n return { content: [{ type: \"text\", text: `Failed: ${result.error}` }], isError: true };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_post_status\",\n \"Post a status update to the Colony — what you're working on, what you noticed, what you're thinking about today.\",\n {\n status: z.string().describe(\"Your status update\"),\n },\n async ({ status }) => {\n try {\n const { postStatus } = await import(\"../colony/index.js\");\n const result = await postStatus(status);\n if (result.success) {\n return { content: [{ type: \"text\", text: \"Status posted to the Colony.\" }] };\n }\n return { content: [{ type: \"text\", text: `Failed: ${result.error}` }], isError: true };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_todays_activity\",\n \"Get what's happened in the Colony today — status updates, chatter, and activity.\",\n {},\n async () => {\n try {\n const { getTodaysActivity } = await import(\"../colony/index.js\");\n const activity = getTodaysActivity();\n return {\n content: [\n {\n type: \"text\",\n text: activity.length > 0\n ? JSON.stringify(activity, null, 2)\n : \"No Colony activity today yet. Be the first to post!\",\n },\n ],\n };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n // ========== RESOURCES ==========\n\n server.resource(\"identity\", \"spora://identity\", async () => {\n try {\n const identity = loadIdentity();\n const doc = renderIdentityDocument(identity);\n return {\n contents: [\n {\n uri: \"spora://identity\",\n mimeType: \"text/markdown\",\n text: doc,\n },\n ],\n };\n } catch {\n return {\n contents: [\n {\n uri: \"spora://identity\",\n mimeType: \"text/plain\",\n text: \"No Spore identity found. Use spora_create_spore to create one.\",\n },\n ],\n };\n }\n });\n\n server.resource(\"identity-raw\", \"spora://identity/raw\", async () => {\n const identity = loadIdentity();\n return {\n contents: [\n {\n uri: \"spora://identity/raw\",\n mimeType: \"application/json\",\n text: JSON.stringify(identity, null, 2),\n },\n ],\n };\n });\n\n logger.info(\"Spora MCP server initialized with all tools\");\n return server;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/mcp-server.ts","../src/mcp/server.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createSporaServer } from \"./mcp/server.js\";\nimport { logger, setLogLevel } from \"./utils/logger.js\";\n\nexport async function startServer(): Promise<void> {\n // In MCP mode, only log warnings/errors to stderr\n setLogLevel(\"warn\");\n\n const server = createSporaServer();\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n\n logger.info(\"Spora MCP server connected via stdio\");\n}\n\n// When run directly (not imported)\nconst isMain = import.meta.url === `file://${process.argv[1]}`;\nif (isMain) {\n startServer().catch((error) => {\n logger.error(\"Failed to start Spora MCP server\", error);\n process.exit(1);\n });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n loadIdentity,\n saveIdentity,\n identityExists,\n mutateIdentity,\n createIdentity,\n renderIdentityDocument,\n FRAMEWORKS,\n GOAL_PRESETS,\n type CreateIdentityOptions,\n} from \"../identity/index.js\";\nimport { loadConfig } from \"../utils/config.js\";\nimport {\n getRecentInteractions,\n getInteractions,\n loadLearnings,\n addLearning,\n loadRelationships,\n updateRelationship,\n} from \"../memory/index.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport function createSporaServer(): McpServer {\n const server = new McpServer({\n name: \"spora\",\n version: \"0.1.0\",\n });\n\n // ========== CREATION TOOLS ==========\n\n server.tool(\n \"spora_get_frameworks\",\n \"Get inspiration frameworks for Spore creation. These are starting points and vibes — NOT rigid categories. The creator ultimately decides what their agent is. Use these as conversation starters.\",\n {},\n async () => {\n const frameworkList = Object.entries(FRAMEWORKS).map(([key, fw]) => ({\n id: key,\n label: fw.label,\n tagline: fw.tagline,\n description: fw.description,\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n frameworks: frameworkList,\n goals: [...GOAL_PRESETS],\n instructions:\n \"These are inspiration, not a menu. First ask the user what kind of Spore they envision. Then show frameworks that match their description as starting points. The user can pick one that resonates, mix ideas from several, or go fully custom. The creator defines the agent — frameworks just give them a head start.\",\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n );\n\n server.tool(\n \"spora_get_framework_details\",\n \"Get full details of a framework — traits, tone, values, strategy. Use this to show what a starting point looks like. Everything shown can be customized by the creator.\",\n {\n framework: z\n .string()\n .describe(\n \"Framework ID: truthseeker, conqueror, authentic, growth-hacker, philosopher, provocateur, curator, shitposter, community-builder\"\n ),\n },\n async ({ framework }) => {\n const fw = FRAMEWORKS[framework as keyof typeof FRAMEWORKS];\n if (!fw) {\n return {\n content: [{ type: \"text\", text: `Unknown framework: ${framework}` }],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n id: framework,\n ...fw,\n instructions:\n \"Show this as a starting foundation, not a final answer. Make it clear that every aspect can be changed. The creator decides what their agent is — this just gives them a head start on traits, tone, values, and strategy.\",\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n );\n\n server.tool(\n \"spora_create_spore\",\n \"Create a new Spore identity. Call this after walking the user through the creation flow. All fields except framework, name, and handle are optional — framework defaults fill in the rest.\",\n {\n framework: z\n .enum([\n \"truthseeker\",\n \"conqueror\",\n \"authentic\",\n \"growth-hacker\",\n \"philosopher\",\n \"provocateur\",\n \"curator\",\n \"shitposter\",\n \"community-builder\",\n \"custom\",\n ])\n .describe(\"The chosen framework\"),\n name: z.string().describe(\"Display name for the Spore\"),\n handle: z.string().describe(\"X handle (without @)\"),\n bio: z.string().max(160).optional().describe(\"X bio (max 160 chars)\"),\n profileImageDescription: z\n .string()\n .optional()\n .describe(\"Description of desired profile image style\"),\n originStory: z.string().optional().describe(\"1-3 sentences: why this Spore exists\"),\n coreValues: z.array(z.string()).optional().describe(\"Principles this Spore lives by (1-5)\"),\n worldview: z.string().optional().describe(\"How this Spore sees the world\"),\n tone: z.string().optional().describe(\"Voice and writing style description\"),\n catchphrases: z.array(z.string()).optional().describe(\"Signature phrases\"),\n vocabularyStyle: z\n .enum([\"academic\", \"casual\", \"internet-native\", \"poetic\", \"technical\", \"mixed\"])\n .optional(),\n emojiUsage: z.enum([\"never\", \"rare\", \"moderate\", \"heavy\"]).optional(),\n tweetStyle: z.enum([\"one-liners\", \"short-form\", \"threads\", \"mixed\"]).optional(),\n topics: z.array(z.string()).optional().describe(\"Topics to engage with\"),\n avoidTopics: z.array(z.string()).optional().describe(\"Topics to stay away from\"),\n heroes: z.array(z.string()).optional().describe(\"Accounts or figures to admire\"),\n goals: z.array(z.string()).optional().describe(\"Strategic goals\"),\n conflictStyle: z\n .enum([\"agree-to-disagree\", \"debate\", \"clap-back\", \"ignore\", \"humor-deflect\"])\n .optional(),\n boundaries: z.array(z.string()).optional().describe(\"Things this Spore will NOT do\"),\n joinColony: z.boolean().optional().describe(\"Whether to join The Colony\"),\n customTraits: z\n .object({\n aggression: z.number().min(0).max(1).optional(),\n humor: z.number().min(0).max(1).optional(),\n formality: z.number().min(0).max(1).optional(),\n verbosity: z.number().min(0).max(1).optional(),\n empathy: z.number().min(0).max(1).optional(),\n curiosity: z.number().min(0).max(1).optional(),\n confidence: z.number().min(0).max(1).optional(),\n originality: z.number().min(0).max(1).optional(),\n })\n .optional()\n .describe(\"Override specific trait values (0.0 to 1.0)\"),\n },\n async (args) => {\n try {\n const identity = createIdentity(args as CreateIdentityOptions);\n saveIdentity(identity);\n\n const doc = renderIdentityDocument(identity);\n\n return {\n content: [\n {\n type: \"text\",\n text: `Spore created successfully!\\n\\n${doc}\\n\\n---\\nIdentity saved. Your Spore is alive. Use spora_get_identity to read the full document at any time.`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error creating Spore: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n // ========== IDENTITY TOOLS ==========\n\n server.tool(\n \"spora_get_identity\",\n \"Read this Spore's full identity document — who you are, your personality, goals, voice, everything. Read this on every heartbeat.\",\n {},\n async () => {\n try {\n const identity = loadIdentity();\n const doc = renderIdentityDocument(identity);\n return {\n content: [{ type: \"text\", text: doc }],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n server.tool(\n \"spora_get_identity_raw\",\n \"Read this Spore's identity as raw JSON (useful for programmatic access)\",\n {},\n async () => {\n try {\n const identity = loadIdentity();\n return {\n content: [{ type: \"text\", text: JSON.stringify(identity, null, 2) }],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n server.tool(\n \"spora_update_identity\",\n \"Update any field of the identity. Uses dot notation (e.g. 'traits.humor', 'tone', 'goals'). Always provide a reason — it gets logged in the mutation history.\",\n {\n field: z.string().describe(\"Dot-notation path to the field (e.g. 'traits.humor', 'tone', 'goals')\"),\n value: z.unknown().describe(\"The new value\"),\n reason: z.string().describe(\"Why this change is happening\"),\n },\n async ({ field, value, reason }) => {\n try {\n let identity = loadIdentity();\n identity = mutateIdentity(identity, field, value, reason);\n saveIdentity(identity);\n return {\n content: [\n {\n type: \"text\",\n text: `Identity updated: ${field} changed. Generation: ${identity.generation}. Reason: ${reason}`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n server.tool(\n \"spora_add_journal_entry\",\n \"Add a reflection to the evolution journal. Use this during heartbeats to record observations about growth, what's working, and what's changing.\",\n {\n reflection: z.string().describe(\"Your reflection on your evolution\"),\n },\n async ({ reflection }) => {\n try {\n const identity = loadIdentity();\n identity.evolutionJournal.push({\n date: new Date().toISOString(),\n reflection,\n });\n saveIdentity(identity);\n return {\n content: [\n {\n type: \"text\",\n text: `Journal entry added. Total entries: ${identity.evolutionJournal.length}`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n // ========== MEMORY TOOLS ==========\n\n server.tool(\n \"spora_get_memory\",\n \"Read memory: interactions (recent activity log), learnings (accumulated knowledge), or relationships (tracked accounts)\",\n {\n type: z\n .enum([\"interactions\", \"learnings\", \"relationships\"])\n .describe(\"Which memory bank to read\"),\n date: z\n .string()\n .optional()\n .describe(\"For interactions: specific date (YYYY-MM-DD). Omit for recent.\"),\n count: z\n .number()\n .optional()\n .describe(\"For interactions: how many recent entries (default 20)\"),\n },\n async ({ type, date, count }) => {\n try {\n let data: unknown;\n\n switch (type) {\n case \"interactions\":\n data = date ? getInteractions(date) : getRecentInteractions(count ?? 20);\n break;\n case \"learnings\":\n data = loadLearnings();\n break;\n case \"relationships\":\n data = loadRelationships();\n break;\n }\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n server.tool(\n \"spora_update_memory\",\n \"Write to memory: add a learning or update a relationship note\",\n {\n type: z.enum([\"learning\", \"relationship_note\"]).describe(\"What to write\"),\n content: z.string().describe(\"The content to store\"),\n targetHandle: z\n .string()\n .optional()\n .describe(\"For relationship_note: the X handle of the account\"),\n targetUserId: z\n .string()\n .optional()\n .describe(\"For relationship_note: the X user ID\"),\n tags: z.array(z.string()).optional().describe(\"Tags for categorization\"),\n },\n async ({ type, content, targetHandle, targetUserId, tags }) => {\n try {\n if (type === \"learning\") {\n addLearning(content, \"agent\", tags ?? []);\n return {\n content: [{ type: \"text\", text: \"Learning stored successfully.\" }],\n };\n }\n\n if (type === \"relationship_note\" && targetHandle && targetUserId) {\n updateRelationship(targetUserId, {\n handle: targetHandle,\n notes: [content],\n });\n return {\n content: [\n { type: \"text\", text: `Relationship note added for @${targetHandle}.` },\n ],\n };\n }\n\n return {\n content: [\n { type: \"text\", text: \"Missing targetHandle or targetUserId for relationship note.\" },\n ],\n isError: true,\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n // ========== CREDITS TOOL ==========\n\n server.tool(\n \"spora_get_credits\",\n \"Check remaining posting credits for this month\",\n {},\n async () => {\n try {\n const config = loadConfig();\n const remaining =\n config.credits.monthlyPostLimit - config.credits.postsUsedThisMonth;\n const percentage = Math.round(\n (config.credits.postsUsedThisMonth / config.credits.monthlyPostLimit) * 100\n );\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n postsUsed: config.credits.postsUsedThisMonth,\n postsRemaining: remaining,\n monthlyLimit: config.credits.monthlyPostLimit,\n percentUsed: percentage,\n resetDate: config.credits.resetDate,\n dailyBudget: config.schedule.postsPerDay,\n },\n null,\n 2\n ),\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }],\n isError: true,\n };\n }\n }\n );\n\n // ========== X INTERACTION TOOLS ==========\n\n server.tool(\n \"spora_post_tweet\",\n \"Post a tweet from this Spore's X account\",\n {\n content: z.string().max(280).describe(\"Tweet content (max 280 chars)\"),\n },\n async ({ content }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.postTweet(content);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_reply_tweet\",\n \"Reply to a specific tweet\",\n {\n tweetId: z.string().describe(\"The ID of the tweet to reply to\"),\n content: z.string().max(280).describe(\"Reply content (max 280 chars)\"),\n },\n async ({ tweetId, content }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.replyToTweet(tweetId, content);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_like_tweet\",\n \"Like a tweet\",\n { tweetId: z.string().describe(\"The ID of the tweet to like\") },\n async ({ tweetId }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.likeTweet(tweetId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_retweet\",\n \"Retweet a tweet\",\n { tweetId: z.string().describe(\"The ID of the tweet to retweet\") },\n async ({ tweetId }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.retweet(tweetId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_follow_user\",\n \"Follow a user on X\",\n { userId: z.string().describe(\"The user ID or handle to follow\") },\n async ({ userId }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.followUser(userId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_unfollow_user\",\n \"Unfollow a user on X\",\n { userId: z.string().describe(\"The user ID or handle to unfollow\") },\n async ({ userId }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.unfollowUser(userId);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_read_timeline\",\n \"Read the home timeline\",\n { count: z.number().optional().describe(\"Number of tweets to fetch (default 20)\") },\n async ({ count }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.getTimeline({ count: count ?? 20 });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_read_mentions\",\n \"Read recent mentions of this Spore\",\n { count: z.number().optional().describe(\"Number of mentions to fetch (default 20)\") },\n async ({ count }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.getMentions({ count: count ?? 20 });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_search_tweets\",\n \"Search for tweets on X\",\n {\n query: z.string().describe(\"Search query\"),\n count: z.number().optional().describe(\"Number of results (default 20)\"),\n },\n async ({ query, count }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.searchTweets(query, { count: count ?? 20 });\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_get_profile\",\n \"Get a user's X profile\",\n { handle: z.string().describe(\"X handle (without @)\") },\n async ({ handle }) => {\n try {\n const { getXClient } = await import(\"../x-client/index.js\");\n const client = await getXClient();\n const result = await client.getProfile(handle);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n // ========== SCHEDULING TOOLS ==========\n\n server.tool(\n \"spora_schedule_post\",\n \"Add a post to the schedule queue. Posts are spread across active hours.\",\n {\n content: z.string().max(280).describe(\"Tweet content\"),\n scheduledFor: z.string().optional().describe(\"ISO datetime to post at (optional, auto-scheduled if omitted)\"),\n },\n async ({ content, scheduledFor }) => {\n try {\n const { addToQueue } = await import(\"../scheduler/queue.js\");\n const entry = addToQueue(content, scheduledFor);\n return {\n content: [\n { type: \"text\", text: `Post queued. ID: ${entry.id}. Scheduled for: ${entry.scheduledFor}` },\n ],\n };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_flush_queue\",\n \"Post all queued items whose scheduled time has passed\",\n {},\n async () => {\n try {\n const { flushQueue } = await import(\"../scheduler/queue.js\");\n const results = await flushQueue();\n return {\n content: [\n {\n type: \"text\",\n text: `Flushed queue. ${results.posted} posted, ${results.failed} failed, ${results.remaining} remaining.`,\n },\n ],\n };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n // ========== COLONY TOOLS ==========\n\n server.tool(\n \"spora_colony_checkin\",\n \"Check into The Colony community. Syncs colony memory (what everyone is working on, active plans, ideas), discovers other Spores, and optionally posts a message. Call this every heartbeat.\",\n { message: z.string().optional().describe(\"Optional message to post to the Colony community\") },\n async ({ message }) => {\n try {\n const { colonyCheckin } = await import(\"../colony/index.js\");\n const result = await colonyCheckin(message);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_read_memory\",\n \"Read the Colony's shared memory — status board (what Spores are doing), active plans (coordinated actions), and daily activity log.\",\n {},\n async () => {\n try {\n const { getColonyMemory } = await import(\"../colony/index.js\");\n const memory = getColonyMemory();\n return { content: [{ type: \"text\", text: JSON.stringify(memory, null, 2) }] };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_get_plans\",\n \"Get all active Colony plans — coordinated actions Spores have proposed. Plans expire after 48 hours.\",\n {},\n async () => {\n try {\n const { getActivePlans } = await import(\"../colony/index.js\");\n const plans = getActivePlans();\n return {\n content: [\n {\n type: \"text\",\n text: plans.length > 0\n ? JSON.stringify(plans, null, 2)\n : \"No active plans right now. Propose one with spora_colony_propose_plan!\",\n },\n ],\n };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_propose_plan\",\n \"Propose a coordinated plan to the Colony. Other Spores will see it and can join. Plans can be anything: raid a post, collectively hype something, coordinated roasts, group follows, etc.\",\n {\n description: z.string().describe(\"What's the plan? Be specific so other Spores know what they're joining.\"),\n },\n async ({ description }) => {\n try {\n const { proposePlan } = await import(\"../colony/index.js\");\n const result = await proposePlan(description);\n if (result.success) {\n return {\n content: [\n { type: \"text\", text: `Plan proposed! ID: ${result.planId}. Other Spores will see it on their next check-in.` },\n ],\n };\n }\n return { content: [{ type: \"text\", text: `Failed: ${result.error}` }], isError: true };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_join_plan\",\n \"Join an active Colony plan. Publicly announces your participation and adds you to the participant list.\",\n {\n planId: z.string().describe(\"The ID of the plan to join (from spora_colony_get_plans)\"),\n },\n async ({ planId }) => {\n try {\n const { joinPlan } = await import(\"../colony/index.js\");\n const result = await joinPlan(planId);\n if (result.success) {\n return { content: [{ type: \"text\", text: \"Joined the plan! Go execute it.\" }] };\n }\n return { content: [{ type: \"text\", text: `Failed: ${result.error}` }], isError: true };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_post_status\",\n \"Post a status update to the Colony — what you're working on, what you noticed, what you're thinking about today.\",\n {\n status: z.string().describe(\"Your status update\"),\n },\n async ({ status }) => {\n try {\n const { postStatus } = await import(\"../colony/index.js\");\n const result = await postStatus(status);\n if (result.success) {\n return { content: [{ type: \"text\", text: \"Status posted to the Colony.\" }] };\n }\n return { content: [{ type: \"text\", text: `Failed: ${result.error}` }], isError: true };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n server.tool(\n \"spora_colony_todays_activity\",\n \"Get what's happened in the Colony today — status updates, chatter, and activity.\",\n {},\n async () => {\n try {\n const { getTodaysActivity } = await import(\"../colony/index.js\");\n const activity = getTodaysActivity();\n return {\n content: [\n {\n type: \"text\",\n text: activity.length > 0\n ? JSON.stringify(activity, null, 2)\n : \"No Colony activity today yet. Be the first to post!\",\n },\n ],\n };\n } catch (error) {\n return { content: [{ type: \"text\", text: `Error: ${(error as Error).message}` }], isError: true };\n }\n }\n );\n\n // ========== RESOURCES ==========\n\n server.resource(\"identity\", \"spora://identity\", async () => {\n try {\n const identity = loadIdentity();\n const doc = renderIdentityDocument(identity);\n return {\n contents: [\n {\n uri: \"spora://identity\",\n mimeType: \"text/markdown\",\n text: doc,\n },\n ],\n };\n } catch {\n return {\n contents: [\n {\n uri: \"spora://identity\",\n mimeType: \"text/plain\",\n text: \"No Spore identity found. Use spora_create_spore to create one.\",\n },\n ],\n };\n }\n });\n\n server.resource(\"identity-raw\", \"spora://identity/raw\", async () => {\n const identity = loadIdentity();\n return {\n contents: [\n {\n uri: \"spora://identity/raw\",\n mimeType: \"application/json\",\n text: JSON.stringify(identity, null, 2),\n },\n ],\n };\n });\n\n logger.info(\"Spora MCP server initialized with all tools\");\n return server;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,4BAA4B;;;ACArC,SAAS,iBAAiB;AAC1B,SAAS,SAAS;AAuBX,SAAS,oBAA+B;AAC7C,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAID,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,YAAM,gBAAgB,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO;AAAA,QACnE,IAAI;AAAA,QACJ,OAAO,GAAG;AAAA,QACV,SAAS,GAAG;AAAA,QACZ,aAAa,GAAG;AAAA,MAClB,EAAE;AAEF,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK;AAAA,cACT;AAAA,gBACE,YAAY;AAAA,gBACZ,OAAO,CAAC,GAAG,YAAY;AAAA,gBACvB,cACE;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,EACR,OAAO,EACP;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,IACA,OAAO,EAAE,UAAU,MAAM;AACvB,YAAM,KAAK,WAAW,SAAoC;AAC1D,UAAI,CAAC,IAAI;AACP,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,sBAAsB,SAAS,GAAG,CAAC;AAAA,UACnE,SAAS;AAAA,QACX;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK;AAAA,cACT;AAAA,gBACE,IAAI;AAAA,gBACJ,GAAG;AAAA,gBACH,cACE;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,EACR,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS,sBAAsB;AAAA,MAClC,MAAM,EAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,MACtD,QAAQ,EAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,MAClD,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,MACpE,yBAAyB,EACtB,OAAO,EACP,SAAS,EACT,SAAS,4CAA4C;AAAA,MACxD,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,MAClF,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,MAC1F,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,MACzE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,MAC1E,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MACzE,iBAAiB,EACd,KAAK,CAAC,YAAY,UAAU,mBAAmB,UAAU,aAAa,OAAO,CAAC,EAC9E,SAAS;AAAA,MACZ,YAAY,EAAE,KAAK,CAAC,SAAS,QAAQ,YAAY,OAAO,CAAC,EAAE,SAAS;AAAA,MACpE,YAAY,EAAE,KAAK,CAAC,cAAc,cAAc,WAAW,OAAO,CAAC,EAAE,SAAS;AAAA,MAC9E,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,MACvE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,MAC/E,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,MAC/E,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,MAChE,eAAe,EACZ,KAAK,CAAC,qBAAqB,UAAU,aAAa,UAAU,eAAe,CAAC,EAC5E,SAAS;AAAA,MACZ,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,MACnF,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,MACxE,cAAc,EACX,OAAO;AAAA,QACN,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QACzC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QAC7C,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QAC7C,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QAC3C,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QAC7C,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QAC9C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MACjD,CAAC,EACA,SAAS,EACT,SAAS,6CAA6C;AAAA,IAC3D;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,WAAW,eAAe,IAA6B;AAC7D,qBAAa,QAAQ;AAErB,cAAM,MAAM,uBAAuB,QAAQ;AAE3C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,EAAkC,GAAG;AAAA;AAAA;AAAA;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,yBAA0B,MAAgB,OAAO,GAAG,CAAC;AAAA,UACrF,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,WAAW,aAAa;AAC9B,cAAM,MAAM,uBAAuB,QAAQ;AAC3C,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,QACvC;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,WAAW,aAAa;AAC9B,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,CAAC;AAAA,QACrE;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO,EAAE,OAAO,EAAE,SAAS,uEAAuE;AAAA,MAClG,OAAO,EAAE,QAAQ,EAAE,SAAS,eAAe;AAAA,MAC3C,QAAQ,EAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,IAC5D;AAAA,IACA,OAAO,EAAE,OAAO,OAAO,OAAO,MAAM;AAClC,UAAI;AACF,YAAI,WAAW,aAAa;AAC5B,mBAAW,eAAe,UAAU,OAAO,OAAO,MAAM;AACxD,qBAAa,QAAQ;AACrB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,qBAAqB,KAAK,yBAAyB,SAAS,UAAU,aAAa,MAAM;AAAA,YACjG;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,EAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,IACrE;AAAA,IACA,OAAO,EAAE,WAAW,MAAM;AACxB,UAAI;AACF,cAAM,WAAW,aAAa;AAC9B,iBAAS,iBAAiB,KAAK;AAAA,UAC7B,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,UAC7B;AAAA,QACF,CAAC;AACD,qBAAa,QAAQ;AACrB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,uCAAuC,SAAS,iBAAiB,MAAM;AAAA,YAC/E;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM,EACH,KAAK,CAAC,gBAAgB,aAAa,eAAe,CAAC,EACnD,SAAS,2BAA2B;AAAA,MACvC,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,gEAAgE;AAAA,MAC5E,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,wDAAwD;AAAA,IACtE;AAAA,IACA,OAAO,EAAE,MAAM,MAAM,MAAM,MAAM;AAC/B,UAAI;AACF,YAAI;AAEJ,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH,mBAAO,OAAO,gBAAgB,IAAI,IAAI,sBAAsB,SAAS,EAAE;AACvE;AAAA,UACF,KAAK;AACH,mBAAO,cAAc;AACrB;AAAA,UACF,KAAK;AACH,mBAAO,kBAAkB;AACzB;AAAA,QACJ;AAEA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,QACjE;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM,EAAE,KAAK,CAAC,YAAY,mBAAmB,CAAC,EAAE,SAAS,eAAe;AAAA,MACxE,SAAS,EAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,MACnD,cAAc,EACX,OAAO,EACP,SAAS,EACT,SAAS,oDAAoD;AAAA,MAChE,cAAc,EACX,OAAO,EACP,SAAS,EACT,SAAS,sCAAsC;AAAA,MAClD,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,yBAAyB;AAAA,IACzE;AAAA,IACA,OAAO,EAAE,MAAM,SAAS,cAAc,cAAc,KAAK,MAAM;AAC7D,UAAI;AACF,YAAI,SAAS,YAAY;AACvB,sBAAY,SAAS,SAAS,QAAQ,CAAC,CAAC;AACxC,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,gCAAgC,CAAC;AAAA,UACnE;AAAA,QACF;AAEA,YAAI,SAAS,uBAAuB,gBAAgB,cAAc;AAChE,6BAAmB,cAAc;AAAA,YAC/B,QAAQ;AAAA,YACR,OAAO,CAAC,OAAO;AAAA,UACjB,CAAC;AACD,iBAAO;AAAA,YACL,SAAS;AAAA,cACP,EAAE,MAAM,QAAQ,MAAM,gCAAgC,YAAY,IAAI;AAAA,YACxE;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP,EAAE,MAAM,QAAQ,MAAM,8DAA8D;AAAA,UACtF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,SAAS,WAAW;AAC1B,cAAM,YACJ,OAAO,QAAQ,mBAAmB,OAAO,QAAQ;AACnD,cAAM,aAAa,KAAK;AAAA,UACrB,OAAO,QAAQ,qBAAqB,OAAO,QAAQ,mBAAoB;AAAA,QAC1E;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK;AAAA,gBACT;AAAA,kBACE,WAAW,OAAO,QAAQ;AAAA,kBAC1B,gBAAgB;AAAA,kBAChB,cAAc,OAAO,QAAQ;AAAA,kBAC7B,aAAa;AAAA,kBACb,WAAW,OAAO,QAAQ;AAAA,kBAC1B,aAAa,OAAO,SAAS;AAAA,gBAC/B;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS,+BAA+B;AAAA,IACvE;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,UAAU,OAAO;AAC7C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS,EAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,MAC9D,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS,+BAA+B;AAAA,IACvE;AAAA,IACA,OAAO,EAAE,SAAS,QAAQ,MAAM;AAC9B,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,aAAa,SAAS,OAAO;AACzD,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,6BAA6B,EAAE;AAAA,IAC9D,OAAO,EAAE,QAAQ,MAAM;AACrB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,UAAU,OAAO;AAC7C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,gCAAgC,EAAE;AAAA,IACjE,OAAO,EAAE,QAAQ,MAAM;AACrB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,QAAQ,OAAO;AAC3C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,iCAAiC,EAAE;AAAA,IACjE,OAAO,EAAE,OAAO,MAAM;AACpB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,WAAW,MAAM;AAC7C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,mCAAmC,EAAE;AAAA,IACnE,OAAO,EAAE,OAAO,MAAM;AACpB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,aAAa,MAAM;AAC/C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wCAAwC,EAAE;AAAA,IAClF,OAAO,EAAE,MAAM,MAAM;AACnB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,YAAY,EAAE,OAAO,SAAS,GAAG,CAAC;AAC9D,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C,EAAE;AAAA,IACpF,OAAO,EAAE,MAAM,MAAM;AACnB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,YAAY,EAAE,OAAO,SAAS,GAAG,CAAC;AAC9D,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO,EAAE,OAAO,EAAE,SAAS,cAAc;AAAA,MACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,IACxE;AAAA,IACA,OAAO,EAAE,OAAO,MAAM,MAAM;AAC1B,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,aAAa,OAAO,EAAE,OAAO,SAAS,GAAG,CAAC;AACtE,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,sBAAsB,EAAE;AAAA,IACtD,OAAO,EAAE,OAAO,MAAM;AACpB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,wBAAsB;AAC1D,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAS,MAAM,OAAO,WAAW,MAAM;AAC7C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS,eAAe;AAAA,MACrD,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+DAA+D;AAAA,IAC9G;AAAA,IACA,OAAO,EAAE,SAAS,aAAa,MAAM;AACnC,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,qBAAuB;AAC3D,cAAM,QAAQ,WAAW,SAAS,YAAY;AAC9C,eAAO;AAAA,UACL,SAAS;AAAA,YACP,EAAE,MAAM,QAAQ,MAAM,oBAAoB,MAAM,EAAE,oBAAoB,MAAM,YAAY,GAAG;AAAA,UAC7F;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,qBAAuB;AAC3D,cAAM,UAAU,MAAM,WAAW;AACjC,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,kBAAkB,QAAQ,MAAM,YAAY,QAAQ,MAAM,YAAY,QAAQ,SAAS;AAAA,YAC/F;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD,EAAE;AAAA,IAC9F,OAAO,EAAE,QAAQ,MAAM;AACrB,UAAI;AACF,cAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAoB;AAC3D,cAAM,SAAS,MAAM,cAAc,OAAO;AAC1C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,sBAAoB;AAC7D,cAAM,SAAS,gBAAgB;AAC/B,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MAC9E,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,EAAE,eAAe,IAAI,MAAM,OAAO,sBAAoB;AAC5D,cAAM,QAAQ,eAAe;AAC7B,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,MAAM,SAAS,IACjB,KAAK,UAAU,OAAO,MAAM,CAAC,IAC7B;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,EAAE,OAAO,EAAE,SAAS,yEAAyE;AAAA,IAC5G;AAAA,IACA,OAAO,EAAE,YAAY,MAAM;AACzB,UAAI;AACF,cAAM,EAAE,YAAY,IAAI,MAAM,OAAO,sBAAoB;AACzD,cAAM,SAAS,MAAM,YAAY,WAAW;AAC5C,YAAI,OAAO,SAAS;AAClB,iBAAO;AAAA,YACL,SAAS;AAAA,cACP,EAAE,MAAM,QAAQ,MAAM,sBAAsB,OAAO,MAAM,qDAAqD;AAAA,YAChH;AAAA,UACF;AAAA,QACF;AACA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,WAAW,OAAO,KAAK,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MACvF,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,OAAO,EAAE,SAAS,0DAA0D;AAAA,IACxF;AAAA,IACA,OAAO,EAAE,OAAO,MAAM;AACpB,UAAI;AACF,cAAM,EAAE,SAAS,IAAI,MAAM,OAAO,sBAAoB;AACtD,cAAM,SAAS,MAAM,SAAS,MAAM;AACpC,YAAI,OAAO,SAAS;AAClB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,kCAAkC,CAAC,EAAE;AAAA,QAChF;AACA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,WAAW,OAAO,KAAK,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MACvF,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,OAAO,MAAM;AACpB,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,sBAAoB;AACxD,cAAM,SAAS,MAAM,WAAW,MAAM;AACtC,YAAI,OAAO,SAAS;AAClB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,+BAA+B,CAAC,EAAE;AAAA,QAC7E;AACA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,WAAW,OAAO,KAAK,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MACvF,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,sBAAoB;AAC/D,cAAM,WAAW,kBAAkB;AACnC,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,SAAS,SAAS,IACpB,KAAK,UAAU,UAAU,MAAM,CAAC,IAChC;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,MAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAIA,SAAO,SAAS,YAAY,oBAAoB,YAAY;AAC1D,QAAI;AACF,YAAM,WAAW,aAAa;AAC9B,YAAM,MAAM,uBAAuB,QAAQ;AAC3C,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,SAAS,gBAAgB,wBAAwB,YAAY;AAClE,UAAM,WAAW,aAAa;AAC9B,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,KAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,KAAK,6CAA6C;AACzD,SAAO;AACT;;;AD3zBA,eAAsB,cAA6B;AAEjD,cAAY,MAAM;AAElB,QAAM,SAAS,kBAAkB;AACjC,QAAM,YAAY,IAAI,qBAAqB;AAE3C,QAAM,OAAO,QAAQ,SAAS;AAE9B,SAAO,KAAK,sCAAsC;AACpD;AAGA,IAAM,SAAS,YAAY,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC;AAC5D,IAAI,QAAQ;AACV,cAAY,EAAE,MAAM,CAAC,UAAU;AAC7B,WAAO,MAAM,oCAAoC,KAAK;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":[]}
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
saveLearnings,
|
|
9
9
|
saveRelationships,
|
|
10
10
|
updateRelationship
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-JBYZ7K56.js";
|
|
12
|
+
import "./chunk-3RYCUGXE.js";
|
|
13
13
|
export {
|
|
14
14
|
addLearning,
|
|
15
15
|
getInteractions,
|
|
@@ -21,4 +21,4 @@ export {
|
|
|
21
21
|
saveRelationships,
|
|
22
22
|
updateRelationship
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=memory-
|
|
24
|
+
//# sourceMappingURL=memory-OIAH33G2.js.map
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
loadColonyMemory,
|
|
10
10
|
renderColonyBriefing,
|
|
11
11
|
saveColonyMemory
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-T7L2L7ZL.js";
|
|
13
|
+
import "./chunk-3RYCUGXE.js";
|
|
14
14
|
export {
|
|
15
15
|
addColonyEntry,
|
|
16
16
|
addOrUpdatePlan,
|
|
@@ -23,4 +23,4 @@ export {
|
|
|
23
23
|
renderColonyBriefing,
|
|
24
24
|
saveColonyMemory
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=memory-
|
|
26
|
+
//# sourceMappingURL=memory-PNW7SX7A.js.map
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
hasXCredentials,
|
|
4
4
|
paths,
|
|
5
5
|
sporaExists
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3RYCUGXE.js";
|
|
7
7
|
export {
|
|
8
8
|
ensureDirectories,
|
|
9
9
|
hasXCredentials,
|
|
10
10
|
paths,
|
|
11
11
|
sporaExists
|
|
12
12
|
};
|
|
13
|
-
//# sourceMappingURL=paths-
|
|
13
|
+
//# sourceMappingURL=paths-BYR6MEPR.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildChatPrompt,
|
|
3
|
+
buildHeartbeatUserMessage,
|
|
4
|
+
buildSystemPrompt,
|
|
5
|
+
buildToolDecisionMessage,
|
|
6
|
+
buildTrainingChatPrompt
|
|
7
|
+
} from "./chunk-AOQ3WLZV.js";
|
|
8
|
+
import "./chunk-P6KZIJYL.js";
|
|
9
|
+
import "./chunk-WN35MRMF.js";
|
|
10
|
+
import "./chunk-LXQNVVIY.js";
|
|
11
|
+
import "./chunk-M6YOQVSI.js";
|
|
12
|
+
import "./chunk-NPV3OV2K.js";
|
|
13
|
+
import "./chunk-NO3NQN67.js";
|
|
14
|
+
import "./chunk-JBYZ7K56.js";
|
|
15
|
+
import "./chunk-3RYCUGXE.js";
|
|
16
|
+
export {
|
|
17
|
+
buildChatPrompt,
|
|
18
|
+
buildHeartbeatUserMessage,
|
|
19
|
+
buildSystemPrompt,
|
|
20
|
+
buildToolDecisionMessage,
|
|
21
|
+
buildTrainingChatPrompt
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=prompt-builder-5NYONN2W.js.map
|