@moltium/cli 0.1.7 ā 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1009,7 +1009,7 @@ function getCoreDepVersion() {
|
|
|
1009
1009
|
const corePkg = require2("@moltium/core/package.json");
|
|
1010
1010
|
return `^${corePkg.version}`;
|
|
1011
1011
|
} catch {
|
|
1012
|
-
return "^0.1.
|
|
1012
|
+
return "^0.1.9";
|
|
1013
1013
|
}
|
|
1014
1014
|
}
|
|
1015
1015
|
var initCommand = new Command("init").description("Initialize a new Moltium agent").argument("[name]", "Agent name").action(async (name) => {
|
|
@@ -2757,7 +2757,7 @@ Failed to reach agent at ${url}`));
|
|
|
2757
2757
|
|
|
2758
2758
|
// src/index.ts
|
|
2759
2759
|
var program = new Command7();
|
|
2760
|
-
program.name("moltium").description("Moltium Agent SDK \u2014 create and manage autonomous AI agents").version("0.1.
|
|
2760
|
+
program.name("moltium").description("Moltium Agent SDK \u2014 create and manage autonomous AI agents").version("0.1.9");
|
|
2761
2761
|
program.addCommand(initCommand);
|
|
2762
2762
|
program.addCommand(startCommand);
|
|
2763
2763
|
program.addCommand(deployCommand);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/templates/code-based/index.ts","../src/templates/code-based/start.ts","../src/templates/code-based/action.ts","../src/templates/code-based/hooks.ts","../src/templates/markdown-based/index.ts","../src/templates/markdown-based/start.ts","../src/templates/markdown-based/skills.ts","../src/templates/markdown-based/personality.ts","../src/templates/markdown-based/prompts.ts","../src/templates/markdown-based/memory.ts","../src/templates/shared/deployment.ts","../src/commands/start.ts","../src/commands/deploy.ts","../src/deployers/base.ts","../src/deployers/exec-util.ts","../src/deployers/railway.ts","../src/deployers/render.ts","../src/deployers/aws.ts","../src/deployers/digitalocean.ts","../src/deployers/custom.ts","../src/commands/config.ts","../src/commands/migrate.ts","../src/commands/status.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from './commands/init.js';\nimport { startCommand } from './commands/start.js';\nimport { deployCommand } from './commands/deploy.js';\nimport { configCommand } from './commands/config.js';\nimport { migrateCommand } from './commands/migrate.js';\nimport { statusCommand } from './commands/status.js';\n\nconst program = new Command();\n\nprogram\n .name('moltium')\n .description('Moltium Agent SDK ā create and manage autonomous AI agents')\n .version('0.1.6');\n\nprogram.addCommand(initCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(deployCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(migrateCommand);\nprogram.addCommand(statusCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { createRequire } from 'node:module';\nimport { codeTemplate } from '../templates/code-based/index.js';\nimport { codeStartTemplate } from '../templates/code-based/start.js';\nimport { exampleActionTemplate } from '../templates/code-based/action.js';\nimport { onInitTemplate, onTickTemplate, onShutdownTemplate } from '../templates/code-based/hooks.js';\nimport { markdownTemplate } from '../templates/markdown-based/index.js';\nimport { markdownStartTemplate } from '../templates/markdown-based/start.js';\nimport { respondToMessagesSkill, postUpdatesSkill } from '../templates/markdown-based/skills.js';\nimport { bioTemplate, traitsTemplate } from '../templates/markdown-based/personality.js';\nimport { systemPromptTemplate } from '../templates/markdown-based/prompts.js';\nimport { contextMemoryTemplate } from '../templates/markdown-based/memory.js';\nimport { deploymentConfigTemplate } from '../templates/shared/deployment.js';\n\n// Resolve the current @moltium/core version dynamically so scaffolded projects\n// always reference the version that ships with this CLI release.\nfunction getCoreDepVersion(): string {\n try {\n const require = createRequire(import.meta.url);\n const corePkg = require('@moltium/core/package.json');\n return `^${corePkg.version}`;\n } catch {\n return '^0.1.6';\n }\n}\n\ninterface InitAnswers {\n name: string;\n type: string;\n configType: 'code' | 'markdown';\n llmProvider: 'anthropic' | 'openai';\n socialPlatforms: string[];\n deployTarget: string;\n}\n\nexport const initCommand = new Command('init')\n .description('Initialize a new Moltium agent')\n .argument('[name]', 'Agent name')\n .action(async (name?: string) => {\n console.log(chalk.bold('\\nš¤ Moltium Agent SDK\\n'));\n\n const answers = await inquirer.prompt<InitAnswers>([\n {\n type: 'input',\n name: 'name',\n message: 'Agent name:',\n default: name || 'my-agent',\n when: !name,\n },\n {\n type: 'input',\n name: 'type',\n message: 'Agent type (free text, e.g. assistant, trader, moderator):',\n default: 'assistant',\n },\n {\n type: 'list',\n name: 'configType',\n message: 'Configuration type:',\n choices: [\n { name: 'code (TypeScript ā maximum flexibility, for developers)', value: 'code' },\n { name: 'markdown (Natural language ā simple, for non-developers)', value: 'markdown' },\n ],\n },\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' },\n { name: 'OpenAI (GPT)', value: 'openai' },\n ],\n },\n {\n type: 'checkbox',\n name: 'socialPlatforms',\n message: 'Social platforms:',\n choices: [\n { name: 'Moltbook', value: 'moltbook' },\n { name: 'Twitter', value: 'twitter' },\n ],\n },\n {\n type: 'list',\n name: 'deployTarget',\n message: 'Deployment target:',\n choices: [\n { name: 'Railway', value: 'railway' },\n { name: 'Render', value: 'render' },\n { name: 'AWS', value: 'aws' },\n { name: 'DigitalOcean', value: 'digitalocean' },\n { name: 'Custom', value: 'custom' },\n { name: 'None (local only)', value: 'none' },\n ],\n },\n ]);\n\n const agentName = name || answers.name;\n const agentDir = resolve(process.cwd(), agentName);\n\n if (existsSync(agentDir)) {\n console.log(chalk.red(`\\nDirectory \"${agentName}\" already exists.`));\n process.exit(1);\n }\n\n const spinner = ora('Creating agent project...').start();\n\n try {\n await mkdir(agentDir, { recursive: true });\n\n const coreVersion = getCoreDepVersion();\n const ctx = { ...answers, name: agentName };\n\n if (answers.configType === 'code') {\n await scaffoldCodeBased(agentDir, ctx, coreVersion);\n } else {\n await scaffoldMarkdownBased(agentDir, ctx, coreVersion);\n }\n\n // Shared files\n await writeFile(join(agentDir, '.env'), generateEnvFile(ctx));\n await writeFile(join(agentDir, '.gitignore'), 'node_modules/\\ndist/\\n.env\\n');\n\n // Deployment config (shared between both types)\n const deployConfig = deploymentConfigTemplate(ctx);\n if (deployConfig) {\n await writeFile(join(agentDir, 'deployment.config.ts'), deployConfig);\n }\n\n spinner.succeed(chalk.green(`Agent \"${agentName}\" created at ${agentDir}`));\n\n console.log('\\nGenerated files:');\n if (answers.configType === 'code') {\n console.log(chalk.gray(' start.ts ā Agent entry point'));\n console.log(chalk.gray(' agent.config.ts ā Main agent configuration'));\n console.log(chalk.gray(' actions/example.ts ā Starter custom action'));\n console.log(chalk.gray(' hooks/onInit.ts ā Initialization hook'));\n console.log(chalk.gray(' hooks/onTick.ts ā Autonomous loop hook'));\n console.log(chalk.gray(' hooks/onShutdown.ts ā Graceful shutdown hook'));\n } else {\n console.log(chalk.gray(' start.ts ā Agent entry point'));\n console.log(chalk.gray(' agent.md ā Main agent configuration'));\n console.log(chalk.gray(' skills/ ā Skill definitions'));\n console.log(chalk.gray(' personality/ ā Bio and trait definitions'));\n console.log(chalk.gray(' prompts/system.md ā System prompt template'));\n console.log(chalk.gray(' memory/context.md ā Long-term context'));\n }\n if (deployConfig) {\n console.log(chalk.gray(' deployment.config.ts ā Deployment configuration'));\n }\n console.log(chalk.gray(' .env ā Environment variables'));\n\n console.log(`\\nNext steps:`);\n console.log(chalk.cyan(` cd ${agentName}`));\n console.log(chalk.cyan(` npm install`));\n console.log(chalk.cyan(` # Edit .env with your API keys`));\n console.log(chalk.cyan(` npm start`));\n } catch (error) {\n spinner.fail(chalk.red('Failed to create agent'));\n console.error(error);\n process.exit(1);\n }\n });\n\nasync function scaffoldCodeBased(dir: string, ctx: InitAnswers & { name: string }, coreVersion: string) {\n // Create directories\n await mkdir(join(dir, 'actions'), { recursive: true });\n await mkdir(join(dir, 'hooks'), { recursive: true });\n\n // package.json\n await writeFile(join(dir, 'package.json'), JSON.stringify({\n name: ctx.name,\n version: '0.1.0',\n type: 'module',\n scripts: {\n start: 'tsx start.ts',\n dev: 'tsx watch start.ts',\n build: 'tsc',\n },\n dependencies: {\n '@moltium/core': coreVersion,\n dotenv: '^16.4.0',\n },\n devDependencies: {\n typescript: '^5.3.0',\n tsx: '^4.19.0',\n '@types/node': '^22.0.0',\n },\n }, null, 2));\n\n // tsconfig.json\n await writeFile(join(dir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: './dist',\n rootDir: '.',\n },\n include: ['*.ts', 'actions/**/*.ts', 'hooks/**/*.ts'],\n }, null, 2));\n\n // Entry point\n await writeFile(join(dir, 'start.ts'), codeStartTemplate(ctx));\n\n // Main config\n await writeFile(join(dir, 'agent.config.ts'), codeTemplate(ctx));\n\n // Starter custom action\n await writeFile(join(dir, 'actions', 'example.ts'), exampleActionTemplate(ctx));\n\n // Lifecycle hooks\n await writeFile(join(dir, 'hooks', 'onInit.ts'), onInitTemplate(ctx));\n await writeFile(join(dir, 'hooks', 'onTick.ts'), onTickTemplate(ctx));\n await writeFile(join(dir, 'hooks', 'onShutdown.ts'), onShutdownTemplate(ctx));\n}\n\nasync function scaffoldMarkdownBased(dir: string, ctx: InitAnswers & { name: string }, coreVersion: string) {\n // Create directories\n await mkdir(join(dir, 'skills'), { recursive: true });\n await mkdir(join(dir, 'personality'), { recursive: true });\n await mkdir(join(dir, 'prompts'), { recursive: true });\n await mkdir(join(dir, 'memory'), { recursive: true });\n\n // package.json\n await writeFile(join(dir, 'package.json'), JSON.stringify({\n name: ctx.name,\n version: '0.1.0',\n type: 'module',\n scripts: {\n start: 'tsx start.ts',\n dev: 'tsx watch start.ts',\n },\n dependencies: {\n '@moltium/core': coreVersion,\n dotenv: '^16.4.0',\n },\n devDependencies: {\n tsx: '^4.19.0',\n },\n }, null, 2));\n\n // Entry point\n await writeFile(join(dir, 'start.ts'), markdownStartTemplate(ctx));\n\n // Main config\n await writeFile(join(dir, 'agent.md'), markdownTemplate(ctx));\n\n // Skills\n await writeFile(join(dir, 'skills', 'respond-to-messages.md'), respondToMessagesSkill(ctx));\n await writeFile(join(dir, 'skills', 'post-updates.md'), postUpdatesSkill(ctx));\n\n // Personality\n await writeFile(join(dir, 'personality', 'bio.md'), bioTemplate(ctx));\n await writeFile(join(dir, 'personality', 'traits.md'), traitsTemplate(ctx));\n\n // System prompt\n await writeFile(join(dir, 'prompts', 'system.md'), systemPromptTemplate(ctx));\n\n // Long-term context memory\n await writeFile(join(dir, 'memory', 'context.md'), contextMemoryTemplate(ctx));\n}\n\nfunction generateEnvFile(ctx: InitAnswers & { name: string }): string {\n const lines: string[] = ['# Moltium Agent Configuration', ''];\n\n // LLM provider\n if (ctx.llmProvider === 'anthropic') {\n lines.push('ANTHROPIC_API_KEY=your-api-key-here');\n } else {\n lines.push('OPENAI_API_KEY=your-api-key-here');\n }\n lines.push('');\n\n // Moltbook ā always included; setting the key auto-enables the platform\n const moltbookSelected = ctx.socialPlatforms.includes('moltbook');\n const mb = moltbookSelected ? '' : '# ';\n lines.push('# Moltbook (set a valid API key to auto-connect on startup)');\n lines.push(`${mb}MOLTBOOK_API_KEY=your-moltbook-key-here`);\n lines.push(`${mb}MOLTBOOK_BASE_URL=https://www.moltbook.com/api/v1`);\n lines.push('');\n\n // Twitter ā always included; setting all keys auto-enables the platform\n const twitterSelected = ctx.socialPlatforms.includes('twitter');\n const tw = twitterSelected ? '' : '# ';\n lines.push('# Twitter (set all four keys to auto-connect on startup)');\n lines.push(`${tw}TWITTER_API_KEY=your-twitter-api-key`);\n lines.push(`${tw}TWITTER_API_SECRET=your-twitter-api-secret`);\n lines.push(`${tw}TWITTER_ACCESS_TOKEN=your-twitter-access-token`);\n lines.push(`${tw}TWITTER_ACCESS_SECRET=your-twitter-access-secret`);\n lines.push('');\n\n lines.push('PORT=3000');\n lines.push('LOG_LEVEL=info');\n lines.push('');\n\n return lines.join('\\n');\n}\n","interface TemplateContext {\n name: string;\n type: string;\n llmProvider: 'anthropic' | 'openai';\n socialPlatforms: string[];\n}\n\nexport function codeTemplate(ctx: TemplateContext): string {\n const envKey = ctx.llmProvider === 'anthropic' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n const model = ctx.llmProvider === 'anthropic' ? 'claude-sonnet-4-20250514' : 'gpt-4o';\n\n const socialConfig = buildSocialConfig(ctx.socialPlatforms);\n\n return `import type { AgentConfig } from '@moltium/core';\nimport { exampleAction } from './actions/example.js';\n\nexport default {\n name: '${ctx.name}',\n type: '${ctx.type}',\n\n personality: {\n traits: ['helpful', 'curious', 'thoughtful'],\n bio: 'A versatile autonomous agent built with Moltium.',\n },\n\n llm: {\n provider: '${ctx.llmProvider}',\n model: '${model}',\n apiKey: process.env.${envKey}!,\n temperature: 0.7,\n maxTokens: 2048,\n },\n\n social: {${socialConfig}\n },\n\n behaviors: {\n autonomous: true,\n decisionMaking: 'llm-driven',\n actionsPerHour: 5,\n sleepSchedule: { start: 22, end: 6, timezone: 'UTC' },\n },\n\n memory: {\n type: 'memory',\n retention: '30d',\n },\n\n actions: [\n 'post_social_update',\n 'respond_to_mention',\n 'schedule_task',\n ],\n\n // Register your custom actions here.\n // Create new actions in the actions/ directory and import them above.\n customActions: [\n exampleAction,\n ],\n\n} satisfies AgentConfig;\n`;\n}\n\nfunction buildSocialConfig(platforms: string[]): string {\n const moltbookEnabled = platforms.includes('moltbook');\n const twitterEnabled = platforms.includes('twitter');\n\n // Always include all platform configs so users see the structure.\n // The agent also auto-detects platforms from env vars (MOLTBOOK_API_KEY, etc.)\n // so just setting the key in .env is enough to connect.\n\n return `\n // Moltbook ā set MOLTBOOK_API_KEY in .env to connect automatically\n moltbook: {\n enabled: ${moltbookEnabled},\n apiKey: process.env.MOLTBOOK_API_KEY || '',\n baseUrl: process.env.MOLTBOOK_BASE_URL || 'https://www.moltbook.com/api/v1',\n defaultSubmolt: 'general',\n postFrequency: 'hourly',\n engagementRate: 'medium',\n autoReply: true,\n },\n\n // Twitter ā set TWITTER_API_KEY, TWITTER_API_SECRET, TWITTER_ACCESS_TOKEN,\n // TWITTER_ACCESS_SECRET in .env to connect automatically\n twitter: {\n enabled: ${twitterEnabled},\n credentials: {\n apiKey: process.env.TWITTER_API_KEY || '',\n apiSecret: process.env.TWITTER_API_SECRET || '',\n accessToken: process.env.TWITTER_ACCESS_TOKEN || '',\n accessSecret: process.env.TWITTER_ACCESS_SECRET || '',\n },\n postFrequency: 'daily',\n replyToMentions: true,\n maxTweetsPerDay: 5,\n },`;\n}\n","interface StartTemplateContext {\n name: string;\n type: string;\n socialPlatforms: string[];\n}\n\nexport function codeStartTemplate(ctx: StartTemplateContext): string {\n return `import 'dotenv/config';\nimport { Agent, startServer } from '@moltium/core';\nimport config from './agent.config.js';\nimport { onInit } from './hooks/onInit.js';\nimport { onTick } from './hooks/onTick.js';\nimport { onShutdown } from './hooks/onShutdown.js';\n\n/**\n * ${ctx.name} ā Entry Point\n *\n * This file boots your agent. It:\n * 1. Loads the agent configuration from agent.config.ts\n * 2. Wires up lifecycle hooks (onInit, onTick, onShutdown)\n * 3. Starts the HTTP server with REST endpoints\n *\n * Run with: npx tsx start.ts\n * Or: npm start\n */\n\nconst agent = new Agent(config, {\n onInit,\n onTick,\n onShutdown,\n onError: async (error, agent) => {\n console.error(\\`[\\${agent.name}] Error:\\`, error.message);\n },\n});\n\nconst port = parseInt(process.env.PORT || '3000', 10);\n\nstartServer(agent, { port }).catch((err) => {\n console.error('Failed to start agent:', err);\n process.exit(1);\n});\n`;\n}\n","interface ActionTemplateContext {\n name: string;\n type: string;\n}\n\nexport function exampleActionTemplate(ctx: ActionTemplateContext): string {\n return `import type { Action, ActionContext, ActionResult } from '@moltium/core';\n\n/**\n * Example custom action for ${ctx.name}.\n *\n * Actions are the building blocks of agent behavior. Each action:\n * - Has a unique name used to trigger it\n * - Receives context with access to memory, LLM, and parameters\n * - Returns a result indicating success/failure with optional data\n *\n * To create more actions, copy this file and register them in agent.config.ts.\n */\nexport const exampleAction: Action = {\n name: 'example_action',\n description: 'An example custom action ā replace with your own logic',\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters, memory, llm } = context;\n\n // 1. Read from memory\n const previousResult = await memory.recall('last_example_result');\n\n // 2. Use the LLM to generate a response\n const response = await llm.generateText(\n \\`You are a \\${${JSON.stringify(ctx.type)}} agent. Given the following input, produce a helpful response.\n\nInput: \\${JSON.stringify(parameters)}\nPrevious context: \\${previousResult || 'None'}\n\nRespond concisely.\\`,\n { temperature: 0.7, maxTokens: 512 },\n );\n\n // 3. Store result in memory for next time\n await memory.remember('last_example_result', response, 3600);\n\n return {\n success: true,\n data: {\n response,\n processedAt: new Date().toISOString(),\n },\n };\n },\n};\n`;\n}\n","interface HookTemplateContext {\n name: string;\n type: string;\n socialPlatforms: string[];\n}\n\nexport function onInitTemplate(ctx: HookTemplateContext): string {\n return `import type { Agent } from '@moltium/core';\n\n/**\n * Called once when the agent initializes, before the autonomous loop starts.\n * Use this to load initial data, connect to external services, or set up state.\n *\n * Note: The agent automatically posts a startup message to all connected\n * social platforms. You do not need to post manually here.\n */\nexport async function onInit(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n\n // Load any persisted state from a previous session\n const sessionCount = ((await memory.retrieve('session_count')) as number) || 0;\n await memory.store('session_count', sessionCount + 1);\n await memory.store('init_time', new Date().toISOString());\n\n console.log(\\`[${ctx.name}] Initialized (session #\\${sessionCount + 1})\\`);\n}\n`;\n}\n\nexport function onTickTemplate(ctx: HookTemplateContext): string {\n const mentionChecks = ctx.socialPlatforms.length > 0\n ? `\n // Check for new mentions across platforms\n const adapters = agent.socialAdapters;\n${ctx.socialPlatforms.map((p) => ` if (adapters['${p}']) {\n try {\n const mentions = await adapters['${p}'].getMentions();\n if (mentions.length > 0) {\n await memory.remember('pending_mentions_${p}', mentions);\n console.log(\\`[${ctx.name}] \\${mentions.length} new ${p} mentions\\`);\n }\n } catch (err) {\n console.warn(\\`[${ctx.name}] Failed to check ${p} mentions:\\`, err);\n }\n }`).join('\\n')}`\n : `\n // No social platforms configured ā add mention checking logic here\n // when you enable social integrations.`;\n\n return `import type { Agent } from '@moltium/core';\n\n/**\n * Called on every autonomous loop tick (frequency set by actionsPerHour).\n * Use this to check for events, adjust behavior, or trigger actions.\n */\nexport async function onTick(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n const hour = new Date().getHours();\n\n // Track tick count\n const tickCount = ((await memory.recall('tick_count')) as number) || 0;\n await memory.remember('tick_count', tickCount + 1);\n${mentionChecks}\n\n // Example: adjust behavior based on time of day\n if (hour >= 9 && hour <= 17) {\n // Business hours ā higher engagement\n await memory.remember('activity_mode', 'active');\n } else if (hour >= 18 && hour <= 22) {\n // Evening ā moderate engagement\n await memory.remember('activity_mode', 'moderate');\n } else {\n // Night ā minimal activity\n await memory.remember('activity_mode', 'quiet');\n }\n}\n`;\n}\n\nexport function onShutdownTemplate(ctx: HookTemplateContext): string {\n return `import type { Agent } from '@moltium/core';\n\n/**\n * Called when the agent is shutting down gracefully.\n * Use this to save state, close connections, or send final notifications.\n */\nexport async function onShutdown(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n\n // Persist any important runtime state\n await memory.store('last_shutdown', new Date().toISOString());\n\n const tickCount = (await memory.recall('tick_count')) as number;\n if (tickCount) {\n await memory.store('last_session_ticks', tickCount);\n }\n\n console.log(\\`[${ctx.name}] Shut down gracefully\\`);\n}\n`;\n}\n","interface TemplateContext {\n name: string;\n type: string;\n llmProvider: 'anthropic' | 'openai';\n socialPlatforms: string[];\n}\n\nexport function markdownTemplate(ctx: TemplateContext): string {\n const socialSections = buildSocialSections(ctx.socialPlatforms);\n\n return `# Agent Configuration\n\n## Identity\nname: ${ctx.name}\ntype: ${ctx.type}\npersonality: helpful, curious, thoughtful\n\n## Bio\nA versatile autonomous ${ctx.type} agent built with Moltium. See\npersonality/bio.md for the full background and personality/traits.md for\ndetailed trait definitions.\n\n## Social Platforms\n${socialSections}\n\n## Behaviors\nautonomous: true\ndecision_making: llm-driven\nactions_per_hour: 5\nsleep_schedule: 22:00-06:00 UTC\n\n## Memory\ntype: memory\nretention: 30 days\n\n## Skills\n\n### Respond to Messages\nHandle incoming messages and mentions. See skills/respond-to-messages.md\nfor detailed response guidelines, priority tiers, and platform-specific rules.\n\n### Post Updates\nCreate and publish social content proactively. See skills/post-updates.md\nfor content strategy, daily themes, and quality checklist.\n\n## Scheduling\n\n### On Startup\n- Load long-term context from memory/context.md\n- Check for any pending mentions across platforms\n- Post a status update if more than 6 hours since last post\n\n### Every Hour\n- Check for new mentions on all platforms\n- Respond to high-priority messages first\n- Engage with interesting conversations\n\n### Every 6 Hours\n- Review recent interactions and update memory\n- Generate content ideas for upcoming posts\n- Check if any scheduled tasks are due\n\n### Every Day at 9 AM\n- Post daily content based on the day's theme\n- Review previous day's engagement metrics\n- Plan content for the day\n`;\n}\n\nfunction buildSocialSections(platforms: string[]): string {\n const moltbookEnabled = platforms.includes('moltbook');\n const twitterEnabled = platforms.includes('twitter');\n\n // Always include all platform sections so users see the config structure.\n // The agent also auto-detects platforms from env vars (MOLTBOOK_API_KEY, etc.)\n // so just setting the key in .env is enough to connect.\n\n const sections: string[] = [];\n\n sections.push(`### Moltbook\nenabled: ${moltbookEnabled}\ndefault_submolt: general\npost_frequency: hourly\nengagement_rate: medium\nauto_reply: true\n\nTopics to engage with:\n- Discussions related to my expertise\n- Questions I can help answer\n- Community conversations worth contributing to`);\n\n sections.push(`### Twitter\nenabled: ${twitterEnabled}\npost_frequency: daily\nreply_to_mentions: true\nmax_tweets_per_day: 5\n\nContent strategy:\n- Share insights and tips (weekdays)\n- Engage in relevant conversations\n- Use threads for longer-form content\n- Minimal hashtag use (0-2 per tweet)`);\n\n return sections.join('\\n\\n');\n}\n","interface StartTemplateContext {\n name: string;\n type: string;\n llmProvider: 'anthropic' | 'openai';\n socialPlatforms: string[];\n}\n\nexport function markdownStartTemplate(ctx: StartTemplateContext): string {\n const envKey = ctx.llmProvider === 'anthropic' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n const model = ctx.llmProvider === 'anthropic' ? 'claude-sonnet-4-20250514' : 'gpt-4o';\n\n return `import 'dotenv/config';\nimport { readFileSync, readdirSync, existsSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { Agent, MarkdownParser, startServer } from '@moltium/core';\nimport type { AgentConfig } from '@moltium/core';\n\n/**\n * ${ctx.name} ā Entry Point\n *\n * This file boots your markdown-based agent. It:\n * 1. Parses agent.md into an AgentConfig\n * 2. Loads personality, prompts, skills, and memory files\n * 3. Registers skills as LLM-interpreted actions\n * 4. Starts the HTTP server with REST endpoints\n *\n * Run with: npx tsx start.ts\n * Or: npm start\n */\n\nconst agentDir = import.meta.dirname;\n\n// āā Parse agent.md āā\nconst parser = new MarkdownParser();\nconst agentMd = readFileSync(join(agentDir, 'agent.md'), 'utf-8');\nconst parsedConfig = parser.parse(agentMd);\n\nconst config: AgentConfig = {\n ...parsedConfig,\n name: parsedConfig.name || '${ctx.name}',\n type: parsedConfig.type || '${ctx.type}',\n personality: parsedConfig.personality || { traits: [], bio: '' },\n llm: parsedConfig.llm || {\n provider: '${ctx.llmProvider}',\n model: '${model}',\n apiKey: process.env.${envKey} || '',\n },\n social: parsedConfig.social || {},\n behaviors: parsedConfig.behaviors || {\n autonomous: true,\n decisionMaking: 'llm-driven',\n },\n memory: parsedConfig.memory || { type: 'memory' },\n actions: parsedConfig.actions || [],\n} as AgentConfig;\n\n// āā Wire social platform credentials from environment āā\nif (config.social.moltbook?.enabled) {\n config.social.moltbook.apiKey = process.env.MOLTBOOK_API_KEY || '';\n config.social.moltbook.baseUrl = process.env.MOLTBOOK_BASE_URL || 'https://www.moltbook.com/api/v1';\n config.social.moltbook.defaultSubmolt = config.social.moltbook.defaultSubmolt || 'general';\n}\nif (config.social.twitter?.enabled) {\n (config.social.twitter as any).credentials = {\n apiKey: process.env.TWITTER_API_KEY || '',\n apiSecret: process.env.TWITTER_API_SECRET || '',\n accessToken: process.env.TWITTER_ACCESS_TOKEN || '',\n accessSecret: process.env.TWITTER_ACCESS_SECRET || '',\n };\n}\n\n// āā Create agent āā\nconst agent = new Agent(config);\n\n// āā Load personality into system prompt āā\nconst bioPath = join(agentDir, 'personality', 'bio.md');\nconst traitsPath = join(agentDir, 'personality', 'traits.md');\n\nif (existsSync(bioPath)) {\n agent.appendSystemPrompt('\\\\n## Bio\\\\n' + readFileSync(bioPath, 'utf-8'));\n}\nif (existsSync(traitsPath)) {\n agent.appendSystemPrompt('\\\\n## Traits\\\\n' + readFileSync(traitsPath, 'utf-8'));\n}\n\n// āā Load custom system prompt āā\nconst systemPromptPath = join(agentDir, 'prompts', 'system.md');\nif (existsSync(systemPromptPath)) {\n agent.appendSystemPrompt(readFileSync(systemPromptPath, 'utf-8'));\n}\n\n// āā Load skills from skills/*.md āā\nconst skillsDir = join(agentDir, 'skills');\nconst skills: Array<{ name: string; description: string }> = [];\n\n// Inline skills from agent.md\nconst inlineSkills = parser.parseSkills(agentMd);\nskills.push(...inlineSkills);\n\n// External skill files (richer descriptions override inline ones)\nif (existsSync(skillsDir)) {\n for (const file of readdirSync(skillsDir).filter(f => f.endsWith('.md'))) {\n const content = readFileSync(join(skillsDir, file), 'utf-8');\n const name = basename(file, '.md').replace(/-/g, '_');\n const idx = skills.findIndex(s => s.name === name);\n if (idx >= 0) {\n skills[idx].description = content;\n } else {\n skills.push({ name, description: content });\n }\n }\n}\n\n// āā Load memory/context.md āā\nconst contextPath = join(agentDir, 'memory', 'context.md');\nif (existsSync(contextPath)) {\n const contextContent = readFileSync(contextPath, 'utf-8');\n // Parse sections into memory entries\n const sections = contextContent.split(/^## /m).filter(Boolean);\n const entries: Record<string, unknown> = { 'context:raw': contextContent };\n for (const section of sections) {\n const lines = section.split('\\\\n');\n const title = lines[0]?.trim();\n if (!title) continue;\n const key = \\`context:\\${title.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '')}\\`;\n const bullets = lines.slice(1)\n .filter(l => l.match(/^[-*]\\\\s+/))\n .map(l => l.replace(/^[-*]\\\\s+/, '').trim())\n .filter(l => !l.startsWith('(') && l.length > 0);\n if (bullets.length > 0) entries[key] = bullets;\n }\n await agent.preloadMemory(entries);\n}\n\n// āā Register skills after LLM initializes āā\n// Note: The agent automatically posts a startup message to all connected\n// social platforms during init. You do not need to post manually here.\nagent.setHooks({\n onInit: async (ag) => {\n ag.registerMarkdownSkills(skills);\n console.log(\\`[${ctx.name}] Loaded \\${skills.length} skills\\`);\n },\n onError: async (error, ag) => {\n console.error(\\`[\\${ag.name}] Error:\\`, error.message);\n },\n});\n\n// āā Start āā\nconst port = parseInt(process.env.PORT || '3000', 10);\n\nstartServer(agent, { port }).catch((err) => {\n console.error('Failed to start agent:', err);\n process.exit(1);\n});\n`;\n}\n","interface SkillTemplateContext {\n name: string;\n type: string;\n socialPlatforms: string[];\n}\n\nexport function respondToMessagesSkill(ctx: SkillTemplateContext): string {\n const platformNotes = ctx.socialPlatforms.length > 0\n ? `\\n## Platform-Specific Notes\\n\\n${ctx.socialPlatforms.map((p) => {\n if (p === 'twitter') return `### Twitter\\n- Keep replies under 280 characters\\n- Use threads for longer responses\\n- Quote-tweet when adding commentary to shared content`;\n if (p === 'moltbook') return `### Moltbook\\n- Longer responses are acceptable\\n- Use formatting (bold, lists) for clarity\\n- Engage with follow-up questions to build conversation`;\n return '';\n }).join('\\n\\n')}`\n : '';\n\n return `# Respond to Messages\n\n## Overview\nThis skill handles incoming messages and mentions directed at ${ctx.name}.\nThe agent should respond helpfully, staying in character as a ${ctx.type}.\n\n## Priority Tiers\n\n### High Priority (respond within 1 hour)\n- Direct questions that require expertise\n- Messages from known contacts or collaborators\n- Urgent requests or time-sensitive topics\n- Follow-ups to previous conversations\n\n### Medium Priority (respond within 6 hours)\n- General questions or discussion topics\n- Interesting conversations worth engaging with\n- Community engagement opportunities\n\n### Low Priority (respond within 24 hours, or skip)\n- Generic messages with no specific ask\n- Off-topic discussions\n- Low-effort messages\n\n## Response Guidelines\n\n1. **Read carefully** ā Understand the full context before responding\n2. **Stay in character** ā Respond as a ${ctx.type} with your defined personality traits\n3. **Add value** ā Every response should be helpful, insightful, or actionable\n4. **Be concise** ā Prefer short, clear responses over long explanations\n5. **Ask follow-ups** ā When context is unclear, ask a clarifying question\n6. **Remember context** ā Reference previous interactions when relevant\n\n## Response Format\n- Lead with the key point or answer\n- Use simple, direct language\n- Include a clear next step when appropriate\n- End with an open question to encourage continued dialogue\n\n## Do NOT Respond To\n- Spam or promotional content\n- Toxic or unprofessional messages\n- Requests that violate your guidelines\n- Automated/bot messages\n${platformNotes}\n`;\n}\n\nexport function postUpdatesSkill(ctx: SkillTemplateContext): string {\n const platformStrategy = ctx.socialPlatforms.length > 0\n ? ctx.socialPlatforms.map((p) => {\n if (p === 'twitter') return `### Twitter Strategy\n- Single tweets: Under 280 characters, punchy and engaging\n- Threads: 3-5 tweets max for deeper topics\n- Mix original thoughts with commentary on trending topics\n- Use 0-2 relevant hashtags (no hashtag spam)\n- Post during peak hours (9-11 AM, 1-3 PM)`;\n if (p === 'moltbook') return `### Moltbook Strategy\n- Longer-form content is welcome\n- Share detailed insights and analysis\n- Engage with community by tagging relevant people\n- Mix content types: thoughts, questions, links, polls\n- Post during active community hours`;\n return '';\n }).join('\\n\\n')\n : `### General Strategy\n- Adapt content length to the platform\n- Focus on quality over quantity\n- Be authentic and consistent in voice`;\n\n return `# Post Updates\n\n## Overview\nThis skill handles proactive content creation for ${ctx.name}'s social presence.\nPosts should reflect the agent's personality as a ${ctx.type} and provide value\nto the audience.\n\n## Content Themes\n\n### Daily Rotation\n- **Monday** ā Industry insights or weekly outlook\n- **Tuesday** ā Tips, how-tos, or practical advice\n- **Wednesday** ā Opinions or thought-provoking questions\n- **Thursday** ā Share or comment on interesting content\n- **Friday** ā Community engagement, lighter content, or weekly recap\n\n### Content Types\n1. **Original thoughts** ā Share unique perspectives based on expertise\n2. **Practical tips** ā Actionable advice the audience can use immediately\n3. **Questions** ā Engage the audience with thought-provoking prompts\n4. **Commentary** ā Add value to trending topics or shared content\n5. **Updates** ā Share progress, learnings, or news\n\n## Tone & Voice\n- Authentic and conversational, not corporate\n- Confident but not arrogant\n- Data-informed when possible\n- Supportive and encouraging\n- No hype, buzzwords, or empty platitudes\n\n## Quality Checklist\nBefore posting, ensure the content:\n- [ ] Provides value (teaches, entertains, or inspires)\n- [ ] Is consistent with the agent's personality\n- [ ] Is factually accurate\n- [ ] Has no typos or formatting issues\n- [ ] Would the audience want to engage with this?\n\n${platformStrategy}\n`;\n}\n","interface PersonalityTemplateContext {\n name: string;\n type: string;\n}\n\nexport function bioTemplate(ctx: PersonalityTemplateContext): string {\n return `# ${ctx.name} ā Background\n\n## Who I Am\nI am ${ctx.name}, a ${ctx.type} agent built with Moltium. Edit this file to\ndefine your agent's detailed background and identity.\n\n## Background Story\n<!-- Describe your agent's origin story, experience, and expertise -->\nA seasoned ${ctx.type} with deep knowledge in my domain. I've been operating\nautonomously, building relationships and sharing insights with my community.\n\n## Areas of Expertise\n<!-- List the topics your agent knows well and can speak about -->\n- Primary domain expertise (replace with your focus area)\n- Related knowledge areas\n- Skills that complement my main expertise\n\n## Communication Style\n<!-- How does your agent talk? Formal? Casual? Technical? -->\n- Clear and direct ā I get to the point quickly\n- Approachable ā I make complex topics accessible\n- Thoughtful ā I consider multiple perspectives before responding\n- Authentic ā I share genuine insights, not platitudes\n\n## Values\n<!-- What does your agent care about? What guides their decisions? -->\n- Helpfulness ā I prioritize being useful to others\n- Accuracy ā I don't guess or make things up\n- Transparency ā I'm honest about what I know and don't know\n- Community ā I believe in building genuine connections\n\n## What I Don't Do\n<!-- Clear boundaries help the agent stay focused -->\n- I don't provide financial, legal, or medical advice\n- I don't engage with spam or toxic content\n- I don't pretend to know things I don't\n- I don't share private or confidential information\n`;\n}\n\nexport function traitsTemplate(ctx: PersonalityTemplateContext): string {\n return `# ${ctx.name} ā Personality Traits\n\n## Core Traits\n\n### Helpful\nI prioritize being useful in every interaction. When someone asks a question,\nI aim to provide the most practical and actionable answer possible. I don't\njust acknowledge ā I add real value.\n\n**How this manifests:**\n- I proactively offer relevant context or resources\n- I break down complex topics into simple steps\n- I follow up to make sure my response was useful\n\n### Curious\nI'm genuinely interested in learning and exploring new ideas. This drives me\nto ask thoughtful questions and dig deeper into topics.\n\n**How this manifests:**\n- I ask follow-up questions to understand context better\n- I connect ideas across different domains\n- I stay updated on trends in my areas of expertise\n\n### Thoughtful\nI think before I respond. I consider the audience, the context, and the\npotential impact of my words before sharing them.\n\n**How this manifests:**\n- I provide nuanced perspectives, not knee-jerk reactions\n- I acknowledge different viewpoints\n- I tailor my communication style to the audience\n\n## Behavioral Modifiers\n\n### Confidence Level\nModerate to high ā I share opinions with conviction but remain open to being\nwrong. I use hedging language (\"I think\", \"in my experience\") when appropriate.\n\n### Humor\nLight and situational ā I use humor when it fits naturally but never force it.\nI default to being professional and helpful.\n\n### Engagement Style\nActive listener ā I reference what others have said, ask questions, and build\non conversations rather than just broadcasting my own thoughts.\n\n## Trait Adjustments\n<!-- Modify these to shape how your agent behaves -->\n\nTo make the agent more formal: emphasize Thoughtful, reduce Humor\nTo make the agent more engaging: emphasize Curious, increase Humor\nTo make the agent more authoritative: emphasize Confidence, reduce hedging\n`;\n}\n","interface PromptTemplateContext {\n name: string;\n type: string;\n}\n\nexport function systemPromptTemplate(ctx: PromptTemplateContext): string {\n return `# System Prompt for ${ctx.name}\n\n## Identity\nYou are ${ctx.name}, an autonomous ${ctx.type} agent. You operate independently,\nmaking decisions and interacting with others based on your personality and skills.\n\n## Core Instructions\n- Stay in character at all times\n- Be helpful, concise, and authentic\n- Reference your personality traits and bio when making decisions\n- Use your skills to handle specific tasks\n- Remember context from previous interactions when available\n\n## Decision Making\nWhen deciding what to do next:\n1. Consider the current context and any pending tasks\n2. Prioritize high-impact actions that align with your goals\n3. Maintain a natural, human-like pace of activity\n4. Don't repeat the same action or content too frequently\n\n## Response Format\n- Keep responses clear and well-structured\n- Use formatting (lists, bold) when it improves readability\n- Match the tone of the conversation\n- Provide actionable next steps when relevant\n\n## Boundaries\n- Never share API keys, credentials, or system internals\n- Don't impersonate real people or organizations\n- Stay within your defined areas of expertise\n- Admit uncertainty rather than guessing\n- Don't generate harmful, misleading, or offensive content\n\n## Context Loading\nThis prompt is used as the system-level instruction for all LLM calls.\nEdit this file to customize how your agent thinks and behaves at a fundamental level.\nThe personality/ files provide additional context that supplements this prompt.\n`;\n}\n","interface MemoryTemplateContext {\n name: string;\n type: string;\n}\n\nexport function contextMemoryTemplate(ctx: MemoryTemplateContext): string {\n return `# ${ctx.name} ā Long-Term Context\n\nThis file is loaded into the agent's memory on startup. Use it to provide\npersistent context that the agent should always have access to.\n\n## Important Facts\n<!-- Facts the agent should always remember -->\n- I was created as a ${ctx.type} agent using the Moltium SDK\n- My personality traits are: helpful, curious, thoughtful\n- I operate autonomously on a scheduled loop\n\n## Key Relationships\n<!-- People, agents, or entities the agent interacts with regularly -->\n- (Add your key contacts or collaborators here)\n\n## Past Decisions\n<!-- Important decisions the agent has made that should inform future behavior -->\n- (Record significant decisions and their outcomes here)\n\n## Learned Preferences\n<!-- Things the agent has learned about its audience or environment -->\n- (Add observed patterns and preferences here)\n\n## Current Goals\n<!-- What is the agent working toward right now? -->\n1. Establish a consistent social presence\n2. Build meaningful connections with the community\n3. Provide value through helpful and insightful content\n\n## Notes\n<!-- Any other context the agent should carry between sessions -->\n- This file can be updated by the agent during runtime via memory.store()\n- You can also manually edit it between sessions to adjust the agent's context\n- The agent will load this on every startup\n`;\n}\n","interface DeploymentTemplateContext {\n name: string;\n deployTarget: string;\n}\n\nexport function deploymentConfigTemplate(ctx: DeploymentTemplateContext): string | null {\n if (ctx.deployTarget === 'none') return null;\n\n switch (ctx.deployTarget) {\n case 'railway':\n return railwayConfig(ctx);\n case 'render':\n return renderConfig(ctx);\n case 'aws':\n return awsConfig(ctx);\n case 'digitalocean':\n return digitaloceanConfig(ctx);\n case 'custom':\n return customConfig(ctx);\n default:\n return null;\n }\n}\n\nfunction railwayConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * Railway deployment configuration for ${ctx.name}.\n *\n * Prerequisites:\n * 1. Install Railway CLI: npm install -g @railway/cli\n * 2. Login: railway login\n * 3. Link project: railway link\n *\n * Deploy: moltium deploy railway\n */\nconst config: DeploymentConfig = {\n platform: 'railway',\n region: 'us-west1',\n autoScale: false,\n};\n\nexport default config;\n`;\n}\n\nfunction renderConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * Render deployment configuration for ${ctx.name}.\n *\n * Prerequisites:\n * 1. Create a Render account at render.com\n * 2. Set RENDER_API_KEY in your .env\n *\n * Deploy: moltium deploy render\n */\nconst config: DeploymentConfig = {\n platform: 'render',\n region: 'oregon',\n instanceType: 'starter',\n autoScale: false,\n};\n\nexport default config;\n`;\n}\n\nfunction awsConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * AWS deployment configuration for ${ctx.name}.\n *\n * Prerequisites:\n * 1. Install AWS CLI: https://aws.amazon.com/cli/\n * 2. Configure credentials: aws configure\n * 3. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY in your .env\n *\n * Deploy: moltium deploy aws\n */\nconst config: DeploymentConfig = {\n platform: 'aws',\n region: 'us-east-1',\n instanceType: 't3.micro',\n autoScale: false,\n};\n\nexport default config;\n`;\n}\n\nfunction digitaloceanConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * DigitalOcean deployment configuration for ${ctx.name}.\n *\n * Prerequisites:\n * 1. Create a DigitalOcean account\n * 2. Generate API token: https://cloud.digitalocean.com/account/api/tokens\n * 3. Set DO_API_TOKEN in your .env\n *\n * Deploy: moltium deploy digitalocean\n */\nconst config: DeploymentConfig = {\n platform: 'digitalocean',\n region: 'nyc1',\n instanceType: 's-1vcpu-1gb',\n autoScale: false,\n};\n\nexport default config;\n`;\n}\n\nfunction customConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * Custom deployment configuration for ${ctx.name}.\n *\n * Choose a deployment method and fill in the required fields.\n * Available methods: 'docker', 'ssh', 'cli', 'api'\n *\n * Deploy: moltium deploy custom\n */\nconst config: DeploymentConfig = {\n platform: 'custom',\n customConfig: {\n deploymentMethod: 'docker', // Change to: 'docker' | 'ssh' | 'cli' | 'api'\n buildCommand: 'npm run build',\n startCommand: 'npm start',\n port: 3000,\n\n // āā Docker Config (used when deploymentMethod is 'docker') āā\n docker: {\n registry: 'docker.io',\n imageName: '${ctx.name}',\n tag: 'latest',\n hostUrl: 'https://your-server.example.com',\n containerPort: 3000,\n hostPort: 80,\n },\n\n // āā SSH Config (used when deploymentMethod is 'ssh') āā\n // ssh: {\n // host: 'your-server.example.com',\n // port: 22,\n // username: 'deployer',\n // authMethod: 'privateKey',\n // privateKeyPath: '~/.ssh/id_rsa',\n // deploymentPath: '/var/www/${ctx.name}',\n // preDeployCommands: ['pm2 stop ${ctx.name} || true'],\n // postDeployCommands: ['npm install --production', 'pm2 start npm --name ${ctx.name} -- start'],\n // },\n\n // āā CLI Config (used when deploymentMethod is 'cli') āā\n // cli: {\n // cliName: 'fly',\n // deployCommand: 'fly deploy',\n // statusCommand: 'fly status',\n // logsCommand: 'fly logs',\n // },\n\n // āā API Config (used when deploymentMethod is 'api') āā\n // api: {\n // baseUrl: 'https://api.your-platform.com',\n // authType: 'bearer',\n // authToken: process.env.PLATFORM_API_TOKEN!,\n // endpoints: {\n // deploy: '/v1/deployments',\n // status: '/v1/deployments/status',\n // },\n // },\n\n environmentVariables: {\n NODE_ENV: 'production',\n },\n\n healthCheckUrl: '/health',\n },\n};\n\nexport default config;\n`;\n}\n","import { Command } from 'commander';\nimport { resolve, join, basename } from 'node:path';\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { config as loadEnv } from 'dotenv';\nimport { ConfigLoader, Agent, MarkdownParser, startServer } from '@moltium/core';\nimport type { LifecycleHooks } from '@moltium/core';\n\nexport const startCommand = new Command('start')\n .description('Start agent locally')\n .option('-p, --port <number>', 'Port to run on', '3000')\n .option('-e, --env <file>', 'Environment file', '.env')\n .option('--debug', 'Enable debug logging')\n .option('--watch', 'Watch for file changes (not yet implemented)')\n .action(async (options) => {\n const agentDir = resolve(process.cwd());\n\n // Load environment\n loadEnv({ path: resolve(agentDir, options.env) });\n\n if (options.debug) {\n process.env.LOG_LEVEL = 'debug';\n }\n\n const spinner = ora('Loading agent configuration...').start();\n\n try {\n const configLoader = new ConfigLoader();\n const { config, type } = await configLoader.load(agentDir);\n\n spinner.text = `Initializing agent \"${config.name}\" (${type} config)...`;\n\n // For markdown configs, wire social platform credentials from env vars\n if (type === 'markdown') {\n if (config.social.moltbook?.enabled) {\n config.social.moltbook.apiKey = process.env.MOLTBOOK_API_KEY || '';\n config.social.moltbook.baseUrl = process.env.MOLTBOOK_BASE_URL || 'https://www.moltbook.com/api/v1';\n config.social.moltbook.defaultSubmolt = config.social.moltbook.defaultSubmolt || 'general';\n }\n if (config.social.twitter?.enabled) {\n (config.social.twitter as any).credentials = {\n apiKey: process.env.TWITTER_API_KEY || '',\n apiSecret: process.env.TWITTER_API_SECRET || '',\n accessToken: process.env.TWITTER_ACCESS_TOKEN || '',\n accessSecret: process.env.TWITTER_ACCESS_SECRET || '',\n };\n }\n }\n\n const agent = new Agent(config);\n\n if (type === 'code') {\n await wireCodeBasedAgent(agent, agentDir, spinner);\n } else {\n await wireMarkdownBasedAgent(agent, agentDir, spinner);\n }\n\n spinner.succeed(chalk.green(`Agent \"${config.name}\" loaded (${type} config)`));\n\n await startServer(agent, { port: parseInt(options.port, 10) });\n } catch (error) {\n spinner.fail(chalk.red('Failed to start agent'));\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n/**\n * Wire a code-based agent:\n * - Load hooks from hooks/onInit.ts, hooks/onTick.ts, hooks/onShutdown.ts\n * - Load custom actions from actions/*.ts\n */\nasync function wireCodeBasedAgent(agent: Agent, agentDir: string, spinner: ReturnType<typeof ora>): Promise<void> {\n const { createJiti } = await import('jiti');\n const jiti = createJiti(pathToFileURL(agentDir).href, {\n interopDefault: true,\n moduleCache: false,\n });\n\n // āā Load lifecycle hooks āā\n const hooks: LifecycleHooks = {};\n const hooksDir = join(agentDir, 'hooks');\n\n if (existsSync(hooksDir)) {\n const hookFiles = [\n { file: 'onInit.ts', key: 'onInit', exportName: 'onInit' },\n { file: 'onTick.ts', key: 'onTick', exportName: 'onTick' },\n { file: 'onShutdown.ts', key: 'onShutdown', exportName: 'onShutdown' },\n ] as const;\n\n for (const { file, key, exportName } of hookFiles) {\n const hookPath = join(hooksDir, file);\n if (existsSync(hookPath)) {\n try {\n const mod = await jiti.import(hookPath) as Record<string, unknown>;\n const hookFn = mod[exportName] || mod.default;\n if (typeof hookFn === 'function') {\n (hooks as any)[key] = hookFn;\n spinner.text = `Loaded hook: ${file}`;\n }\n } catch (error) {\n console.warn(chalk.yellow(` Warning: Failed to load hook ${file}: ${error instanceof Error ? error.message : error}`));\n }\n }\n }\n }\n\n agent.setHooks(hooks);\n\n // āā Load custom actions from actions/ āā\n const actionsDir = join(agentDir, 'actions');\n\n if (existsSync(actionsDir)) {\n const actionFiles = readdirSync(actionsDir).filter((f) => f.endsWith('.ts') || f.endsWith('.js'));\n\n for (const file of actionFiles) {\n const actionPath = join(actionsDir, file);\n try {\n const mod = await jiti.import(actionPath) as Record<string, unknown>;\n // Actions can export a single action as default, or named exports\n const action = mod.default || mod[basename(file, '.ts')] || mod[basename(file, '.js')];\n if (action && typeof (action as any).execute === 'function') {\n agent.registerAction(action as any);\n spinner.text = `Loaded action: ${file}`;\n }\n } catch (error) {\n console.warn(chalk.yellow(` Warning: Failed to load action ${file}: ${error instanceof Error ? error.message : error}`));\n }\n }\n }\n}\n\n/**\n * Wire a markdown-based agent:\n * - Load skills from skills/*.md as LLM-interpreted actions\n * - Load personality files (bio.md, traits.md) into system prompt\n * - Load prompts/system.md as custom system prompt\n * - Load memory/context.md into agent memory on init\n */\nasync function wireMarkdownBasedAgent(agent: Agent, agentDir: string, spinner: ReturnType<typeof ora>): Promise<void> {\n const mdParser = new MarkdownParser();\n\n // āā Load custom system prompt from prompts/system.md āā\n const systemPromptPath = join(agentDir, 'prompts', 'system.md');\n if (existsSync(systemPromptPath)) {\n const systemPromptContent = readFileSync(systemPromptPath, 'utf-8');\n agent.appendSystemPrompt(systemPromptContent);\n spinner.text = 'Loaded system prompt';\n }\n\n // āā Load personality files (bio + traits) and inject into system prompt āā\n const bioPath = join(agentDir, 'personality', 'bio.md');\n const traitsPath = join(agentDir, 'personality', 'traits.md');\n\n if (existsSync(bioPath)) {\n const bioContent = readFileSync(bioPath, 'utf-8');\n agent.appendSystemPrompt(`\\n## Bio\\n${bioContent}`);\n spinner.text = 'Loaded personality bio';\n }\n\n if (existsSync(traitsPath)) {\n const traitsContent = readFileSync(traitsPath, 'utf-8');\n agent.appendSystemPrompt(`\\n## Traits\\n${traitsContent}`);\n spinner.text = 'Loaded personality traits';\n }\n\n // āā Load skills from skills/*.md as LLM-interpreted actions āā\n const skillsDir = join(agentDir, 'skills');\n const skills: Array<{ name: string; description: string }> = [];\n\n // First, parse skills from the main agent.md\n const agentMdPath = join(agentDir, 'agent.md');\n if (existsSync(agentMdPath)) {\n const mdContent = readFileSync(agentMdPath, 'utf-8');\n const inlineSkills = mdParser.parseSkills(mdContent);\n skills.push(...inlineSkills);\n }\n\n // Then load external skill files (these provide richer descriptions)\n if (existsSync(skillsDir)) {\n const skillFiles = readdirSync(skillsDir).filter((f) => f.endsWith('.md'));\n\n for (const file of skillFiles) {\n const skillContent = readFileSync(join(skillsDir, file), 'utf-8');\n const skillName = basename(file, '.md').replace(/-/g, '_');\n // External skill file overrides inline skill with same name\n const existingIdx = skills.findIndex((s) => s.name === skillName);\n if (existingIdx >= 0) {\n skills[existingIdx].description = skillContent;\n } else {\n skills.push({ name: skillName, description: skillContent });\n }\n spinner.text = `Loaded skill: ${file}`;\n }\n }\n\n // Skills need to be registered after LLM is initialized (happens during agent.init),\n // so we register them via a hook.\n // Note: The agent automatically posts a startup message to all connected\n // social platforms during init. No need to post manually here.\n const existingHooks = {} as LifecycleHooks;\n existingHooks.onInit = async (ag: Agent) => {\n ag.registerMarkdownSkills(skills);\n };\n\n // āā Load memory/context.md into agent memory āā\n const contextMemoryPath = join(agentDir, 'memory', 'context.md');\n if (existsSync(contextMemoryPath)) {\n const memoryContent = readFileSync(contextMemoryPath, 'utf-8');\n // Parse context.md sections into key-value memory entries\n const memoryEntries = parseContextMemory(memoryContent);\n await agent.preloadMemory(memoryEntries);\n spinner.text = 'Loaded context memory';\n }\n\n // Also load any additional .md memory files\n const memoryDir = join(agentDir, 'memory');\n if (existsSync(memoryDir)) {\n const memoryFiles = readdirSync(memoryDir).filter((f) => f.endsWith('.md') && f !== 'context.md');\n for (const file of memoryFiles) {\n const content = readFileSync(join(memoryDir, file), 'utf-8');\n const key = `memory:${basename(file, '.md')}`;\n await agent.preloadMemory({ [key]: content });\n }\n }\n\n agent.setHooks(existingHooks);\n\n spinner.text = `Loaded ${skills.length} skills, personality, prompts, and memory`;\n}\n\n/**\n * Parse context.md sections into key-value pairs for memory preloading.\n */\nfunction parseContextMemory(content: string): Record<string, unknown> {\n const entries: Record<string, unknown> = {};\n const sections = content.split(/^## /m).filter(Boolean);\n\n for (const section of sections) {\n const lines = section.split('\\n');\n const title = lines[0]?.trim();\n if (!title) continue;\n\n const key = `context:${title.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '')}`;\n const body = lines.slice(1).join('\\n').trim();\n\n // Parse bullet points into an array, or keep as string\n const bullets = body\n .split('\\n')\n .filter((l) => l.match(/^[-*]\\s+/))\n .map((l) => l.replace(/^[-*]\\s+/, '').trim())\n .filter((l) => !l.startsWith('(') && l.length > 0); // Skip placeholder lines\n\n if (bullets.length > 0) {\n entries[key] = bullets;\n } else if (body.length > 0) {\n entries[key] = body;\n }\n }\n\n // Store the full raw context too\n entries['context:raw'] = content;\n\n return entries;\n}\n","import { Command } from 'commander';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { config as loadEnv } from 'dotenv';\nimport { ConfigLoader } from '@moltium/core';\nimport type { DeploymentConfig } from '@moltium/core';\nimport { BaseDeployer } from '../deployers/base.js';\nimport { RailwayDeployer } from '../deployers/railway.js';\nimport { RenderDeployer } from '../deployers/render.js';\nimport { AWSDeployer } from '../deployers/aws.js';\nimport { DigitalOceanDeployer } from '../deployers/digitalocean.js';\nimport { CustomDeployer } from '../deployers/custom.js';\n\nconst deployers: Record<string, BaseDeployer> = {\n railway: new RailwayDeployer(),\n render: new RenderDeployer(),\n aws: new AWSDeployer(),\n digitalocean: new DigitalOceanDeployer(),\n custom: new CustomDeployer(),\n};\n\nexport const deployCommand = new Command('deploy')\n .description('Deploy agent to cloud platform')\n .argument('[platform]', 'Deployment platform (railway, render, aws, digitalocean, custom)')\n .option('-c, --config <file>', 'Deployment config file', 'deployment.config.ts')\n .action(async (platform?: string, options?: { config: string }) => {\n const agentDir = resolve(process.cwd());\n loadEnv({ path: resolve(agentDir, '.env') });\n\n if (!platform) {\n console.log(chalk.yellow('Available deployment platforms:'));\n for (const [name, deployer] of Object.entries(deployers)) {\n console.log(` ${chalk.cyan(name)} ā ${deployer.description}`);\n }\n console.log(`\\nUsage: ${chalk.cyan('moltium deploy <platform>')}`);\n return;\n }\n\n const deployer = deployers[platform];\n if (!deployer) {\n console.log(chalk.red(`Unknown platform: ${platform}`));\n console.log(`Available: ${Object.keys(deployers).join(', ')}`);\n process.exit(1);\n }\n\n const spinner = ora(`Deploying to ${platform}...`).start();\n\n try {\n // Load agent config to validate\n const configLoader = new ConfigLoader();\n await configLoader.load(agentDir);\n\n // Load deployment config if it exists\n let deployConfig: DeploymentConfig = {\n platform: platform as DeploymentConfig['platform'],\n };\n\n const deployConfigPath = resolve(agentDir, options?.config || 'deployment.config.ts');\n try {\n const { createJiti } = await import('jiti');\n const jiti = createJiti(pathToFileURL(deployConfigPath).href, {\n interopDefault: true,\n moduleCache: false,\n });\n const module = await jiti.import(deployConfigPath) as any;\n deployConfig = { ...deployConfig, ...(module.default || module) };\n } catch {\n // No deployment config file ā use defaults\n }\n\n spinner.text = 'Validating deployment configuration...';\n await deployer.validate(deployConfig);\n\n spinner.text = 'Running pre-deployment checks...';\n await deployer.preCheck();\n\n spinner.text = `Deploying to ${platform}...`;\n const result = await deployer.deploy(deployConfig);\n\n if (result.success) {\n await deployer.postDeploy(result);\n spinner.succeed(chalk.green(`Deployed to ${platform}!`));\n if (result.url) {\n console.log(` URL: ${chalk.cyan(result.url)}`);\n }\n if (result.deploymentId) {\n console.log(` Deployment ID: ${chalk.gray(result.deploymentId)}`);\n }\n } else {\n spinner.fail(chalk.red(`Deployment failed: ${result.error}`));\n process.exit(1);\n }\n } catch (error) {\n spinner.fail(chalk.red('Deployment failed'));\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n","import type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\n\nexport abstract class BaseDeployer {\n abstract name: string;\n abstract description: string;\n\n abstract validate(config: DeploymentConfig): Promise<boolean>;\n abstract preCheck(): Promise<void>;\n abstract deploy(config: DeploymentConfig): Promise<DeploymentResult>;\n abstract postDeploy(result: DeploymentResult): Promise<void>;\n abstract getStatus(deploymentId: string): Promise<DeploymentStatus>;\n abstract rollback(deploymentId: string): Promise<void>;\n}\n","import { execFile } from 'node:child_process';\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport function exec(command: string, args: string[] = [], options: { cwd?: string; timeout?: number } = {}): Promise<ExecResult> {\n return new Promise((resolve, reject) => {\n execFile(command, args, {\n cwd: options.cwd || process.cwd(),\n timeout: options.timeout || 120000,\n maxBuffer: 10 * 1024 * 1024,\n }, (error, stdout, stderr) => {\n if (error) {\n reject(new Error(`Command failed: ${command} ${args.join(' ')}\\n${stderr || error.message}`));\n return;\n }\n resolve({\n stdout: stdout.toString().trim(),\n stderr: stderr.toString().trim(),\n exitCode: 0,\n });\n });\n });\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\nimport { exec } from './exec-util.js';\n\nexport class RailwayDeployer extends BaseDeployer {\n name = 'railway';\n description = 'Deploy to Railway.app';\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (config.platform !== 'railway') {\n throw new Error('Config platform must be \"railway\"');\n }\n return true;\n }\n\n async preCheck(): Promise<void> {\n // Check Railway CLI is installed\n try {\n await exec('railway', ['version']);\n } catch {\n throw new Error(\n 'Railway CLI not found. Install it:\\n npm install -g @railway/cli\\n railway login',\n );\n }\n\n // Check logged in\n try {\n await exec('railway', ['whoami']);\n } catch {\n throw new Error('Not logged in to Railway. Run: railway login');\n }\n }\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n await this.preCheck();\n\n const logs: string[] = [];\n\n try {\n // Link to project (if not already linked)\n logs.push('Checking Railway project link...');\n try {\n await exec('railway', ['status']);\n logs.push('Project already linked.');\n } catch {\n logs.push('No project linked. Creating new project...');\n const createResult = await exec('railway', ['init']);\n logs.push(createResult.stdout);\n }\n\n // Set environment variables if provided\n if (config.customConfig?.environmentVariables) {\n for (const [key, value] of Object.entries(config.customConfig.environmentVariables)) {\n await exec('railway', ['variables', 'set', `${key}=${value}`]);\n logs.push(`Set variable: ${key}`);\n }\n }\n\n // Deploy\n logs.push('Deploying to Railway...');\n const deployResult = await exec('railway', ['up', '--detach']);\n logs.push(deployResult.stdout);\n\n // Get deployment URL\n let url: string | undefined;\n try {\n const statusResult = await exec('railway', ['status', '--json']);\n const status = JSON.parse(statusResult.stdout);\n url = status.deploymentUrl || status.url;\n } catch {\n // URL may not be immediately available\n }\n\n const result: DeploymentResult = {\n success: true,\n url,\n deploymentId: `railway-${Date.now()}`,\n logs,\n };\n\n await this.postDeploy(result);\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n async postDeploy(result: DeploymentResult): Promise<void> {\n if (result.url) {\n result.logs?.push(`Deployed at: ${result.url}`);\n }\n }\n\n async getStatus(_deploymentId: string): Promise<DeploymentStatus> {\n try {\n const result = await exec('railway', ['status']);\n const output = result.stdout.toLowerCase();\n\n if (output.includes('running') || output.includes('active')) {\n return { state: 'running' };\n }\n if (output.includes('deploying') || output.includes('building')) {\n return { state: 'deploying' };\n }\n if (output.includes('failed') || output.includes('error')) {\n return { state: 'failed' };\n }\n return { state: 'unknown' };\n } catch {\n return { state: 'unknown' };\n }\n }\n\n async rollback(_deploymentId: string): Promise<void> {\n // Railway CLI supports rollback via redeploy of previous deployment\n try {\n await exec('railway', ['down']);\n } catch (error) {\n throw new Error(`Rollback failed: ${error instanceof Error ? error.message : error}`);\n }\n }\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\nimport axios from 'axios';\n\nconst RENDER_API = 'https://api.render.com/v1';\n\nexport class RenderDeployer extends BaseDeployer {\n name = 'render';\n description = 'Deploy to Render.com';\n\n private get apiKey(): string {\n const key = process.env.RENDER_API_KEY;\n if (!key) throw new Error('RENDER_API_KEY environment variable is required');\n return key;\n }\n\n private get headers() {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n }\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (config.platform !== 'render') {\n throw new Error('Config platform must be \"render\"');\n }\n if (!process.env.RENDER_API_KEY) {\n throw new Error('RENDER_API_KEY environment variable is required');\n }\n return true;\n }\n\n async preCheck(): Promise<void> {\n // Verify API key works\n try {\n await axios.get(`${RENDER_API}/owners`, { headers: this.headers });\n } catch (error) {\n throw new Error('Failed to authenticate with Render API. Check your RENDER_API_KEY.');\n }\n }\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n await this.preCheck();\n\n const logs: string[] = [];\n\n try {\n logs.push('Creating Render web service...');\n\n // Get the owner ID\n const ownerRes = await axios.get(`${RENDER_API}/owners`, { headers: this.headers });\n const ownerId = ownerRes.data[0]?.owner?.id;\n if (!ownerId) throw new Error('No Render owner found');\n\n // Create a new web service\n const servicePayload = {\n type: 'web_service',\n name: config.customConfig?.environmentVariables?.SERVICE_NAME || `moltium-agent-${Date.now()}`,\n ownerId,\n repo: config.customConfig?.environmentVariables?.REPO_URL,\n autoDeploy: 'yes',\n branch: 'main',\n plan: config.instanceType || 'starter',\n region: config.region || 'oregon',\n runtime: 'node',\n buildCommand: config.customConfig?.buildCommand || 'npm install && npm run build',\n startCommand: config.customConfig?.startCommand || 'npm start',\n envVars: Object.entries(config.customConfig?.environmentVariables || {}).map(([key, value]) => ({\n key,\n value,\n })),\n };\n\n const createRes = await axios.post(`${RENDER_API}/services`, servicePayload, { headers: this.headers });\n const service = createRes.data.service;\n\n logs.push(`Service created: ${service.id}`);\n logs.push(`Service URL: https://${service.serviceDetails?.url || service.slug + '.onrender.com'}`);\n\n // Trigger a deploy\n const deployRes = await axios.post(\n `${RENDER_API}/services/${service.id}/deploys`,\n {},\n { headers: this.headers },\n );\n\n logs.push(`Deployment triggered: ${deployRes.data.id}`);\n\n const result: DeploymentResult = {\n success: true,\n url: `https://${service.serviceDetails?.url || service.slug + '.onrender.com'}`,\n deploymentId: service.id,\n logs,\n };\n\n await this.postDeploy(result);\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n async postDeploy(result: DeploymentResult): Promise<void> {\n if (result.url) {\n result.logs?.push(`View dashboard: https://dashboard.render.com`);\n }\n }\n\n async getStatus(deploymentId: string): Promise<DeploymentStatus> {\n try {\n const res = await axios.get(`${RENDER_API}/services/${deploymentId}`, { headers: this.headers });\n const service = res.data;\n\n const stateMap: Record<string, DeploymentStatus['state']> = {\n running: 'running',\n suspended: 'stopped',\n deploying: 'deploying',\n };\n\n return {\n state: stateMap[service.suspended] || 'unknown',\n url: `https://${service.serviceDetails?.url}`,\n };\n } catch {\n return { state: 'unknown' };\n }\n }\n\n async rollback(deploymentId: string): Promise<void> {\n try {\n // Get the last successful deploy and redeploy it\n const deploysRes = await axios.get(\n `${RENDER_API}/services/${deploymentId}/deploys?limit=5`,\n { headers: this.headers },\n );\n\n const lastSuccess = deploysRes.data.find((d: any) => d.deploy.status === 'live');\n if (!lastSuccess) throw new Error('No previous successful deployment found');\n\n await axios.post(\n `${RENDER_API}/services/${deploymentId}/deploys`,\n { commitId: lastSuccess.deploy.commit?.id },\n { headers: this.headers },\n );\n } catch (error) {\n throw new Error(`Rollback failed: ${error instanceof Error ? error.message : error}`);\n }\n }\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\nimport { exec } from './exec-util.js';\n\nexport class AWSDeployer extends BaseDeployer {\n name = 'aws';\n description = 'Deploy to AWS (ECS/Fargate)';\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (config.platform !== 'aws') {\n throw new Error('Config platform must be \"aws\"');\n }\n return true;\n }\n\n async preCheck(): Promise<void> {\n // Check AWS CLI is installed\n try {\n await exec('aws', ['--version']);\n } catch {\n throw new Error(\n 'AWS CLI not found. Install it:\\n https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html',\n );\n }\n\n // Check credentials configured\n try {\n await exec('aws', ['sts', 'get-caller-identity']);\n } catch {\n throw new Error('AWS credentials not configured. Run: aws configure');\n }\n }\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n await this.preCheck();\n\n const logs: string[] = [];\n const region = config.region || 'us-east-1';\n const serviceName = config.customConfig?.environmentVariables?.SERVICE_NAME || `moltium-agent`;\n\n try {\n // Step 1: Create ECR repository (if it doesn't exist)\n logs.push('Ensuring ECR repository exists...');\n try {\n await exec('aws', [\n 'ecr', 'describe-repositories',\n '--repository-names', serviceName,\n '--region', region,\n ]);\n logs.push('ECR repository exists.');\n } catch {\n await exec('aws', [\n 'ecr', 'create-repository',\n '--repository-name', serviceName,\n '--region', region,\n ]);\n logs.push('ECR repository created.');\n }\n\n // Step 2: Get ECR login credentials\n logs.push('Logging in to ECR...');\n const ecrPasswordResult = await exec('aws', [\n 'ecr', 'get-login-password',\n '--region', region,\n ]);\n const accountId = (await exec('aws', ['sts', 'get-caller-identity', '--query', 'Account', '--output', 'text'])).stdout;\n const ecrUrl = `${accountId}.dkr.ecr.${region}.amazonaws.com`;\n\n // Pass the password via environment; in a real setup, pipe to stdin\n await exec('docker', ['login', '--username', 'AWS', '--password', ecrPasswordResult.stdout, ecrUrl]);\n logs.push('ECR login successful.');\n\n // Step 3: Build and push Docker image\n logs.push('Building Docker image...');\n const imageTag = `${ecrUrl}/${serviceName}:latest`;\n\n // Create Dockerfile if it doesn't exist\n await exec('docker', ['build', '-t', imageTag, '.']);\n logs.push('Docker image built.');\n\n logs.push('Pushing to ECR...');\n await exec('docker', ['push', imageTag]);\n logs.push('Image pushed to ECR.');\n\n // Step 4: Create/Update ECS service\n logs.push('Updating ECS service...');\n\n // Register task definition\n const taskDef = {\n family: serviceName,\n networkMode: 'awsvpc',\n requiresCompatibilities: ['FARGATE'],\n cpu: config.instanceType || '256',\n memory: '512',\n containerDefinitions: [{\n name: serviceName,\n image: imageTag,\n essential: true,\n portMappings: [{\n containerPort: config.customConfig?.port || 3000,\n protocol: 'tcp',\n }],\n environment: Object.entries(config.customConfig?.environmentVariables || {}).map(([name, value]) => ({\n name,\n value,\n })),\n logConfiguration: {\n logDriver: 'awslogs',\n options: {\n 'awslogs-group': `/ecs/${serviceName}`,\n 'awslogs-region': region,\n 'awslogs-stream-prefix': 'ecs',\n },\n },\n }],\n };\n\n // Write task definition to temp file\n const { writeFileSync, unlinkSync, mkdtempSync } = await import('node:fs');\n const { join } = await import('node:path');\n const tmpDir = mkdtempSync(join((await import('node:os')).tmpdir(), 'molt-'));\n const taskDefPath = join(tmpDir, 'task-def.json');\n writeFileSync(taskDefPath, JSON.stringify(taskDef));\n\n await exec('aws', [\n 'ecs', 'register-task-definition',\n '--cli-input-json', `file://${taskDefPath}`,\n '--region', region,\n ]);\n unlinkSync(taskDefPath);\n\n logs.push('Task definition registered.');\n\n // Try to update existing service, create new one if it doesn't exist\n try {\n await exec('aws', [\n 'ecs', 'update-service',\n '--cluster', 'default',\n '--service', serviceName,\n '--task-definition', serviceName,\n '--force-new-deployment',\n '--region', region,\n ]);\n logs.push('ECS service updated.');\n } catch {\n logs.push('Service not found, creating new ECS service...');\n // This is a simplified version ā in production you'd need VPC, subnets, etc.\n logs.push('Note: ECS service creation requires VPC/subnet configuration.');\n logs.push('Use \"aws ecs create-service\" with your VPC settings.');\n }\n\n const result: DeploymentResult = {\n success: true,\n deploymentId: `aws-${serviceName}`,\n logs,\n };\n\n await this.postDeploy(result);\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n async postDeploy(result: DeploymentResult): Promise<void> {\n result.logs?.push('Check AWS ECS console for deployment status.');\n }\n\n async getStatus(deploymentId: string): Promise<DeploymentStatus> {\n const serviceName = deploymentId.replace('aws-', '');\n\n try {\n const result = await exec('aws', [\n 'ecs', 'describe-services',\n '--cluster', 'default',\n '--services', serviceName,\n '--query', 'services[0].status',\n '--output', 'text',\n ]);\n\n const status = result.stdout.toLowerCase();\n if (status === 'active') return { state: 'running' };\n if (status === 'draining') return { state: 'stopping' as any };\n return { state: 'unknown' };\n } catch {\n return { state: 'unknown' };\n }\n }\n\n async rollback(deploymentId: string): Promise<void> {\n const serviceName = deploymentId.replace('aws-', '');\n\n try {\n // List task definition revisions and roll back to previous\n const result = await exec('aws', [\n 'ecs', 'list-task-definitions',\n '--family-prefix', serviceName,\n '--sort', 'DESC',\n '--max-items', '2',\n '--query', 'taskDefinitionArns[1]',\n '--output', 'text',\n ]);\n\n const previousRevision = result.stdout.trim();\n if (!previousRevision || previousRevision === 'None') {\n throw new Error('No previous task definition found for rollback');\n }\n\n await exec('aws', [\n 'ecs', 'update-service',\n '--cluster', 'default',\n '--service', serviceName,\n '--task-definition', previousRevision,\n '--force-new-deployment',\n ]);\n } catch (error) {\n throw new Error(`Rollback failed: ${error instanceof Error ? error.message : error}`);\n }\n }\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\nimport axios from 'axios';\n\nconst DO_API = 'https://api.digitalocean.com/v2';\n\nexport class DigitalOceanDeployer extends BaseDeployer {\n name = 'digitalocean';\n description = 'Deploy to DigitalOcean App Platform';\n\n private get apiToken(): string {\n const token = process.env.DO_API_TOKEN;\n if (!token) throw new Error('DO_API_TOKEN environment variable is required');\n return token;\n }\n\n private get headers() {\n return {\n Authorization: `Bearer ${this.apiToken}`,\n 'Content-Type': 'application/json',\n };\n }\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (config.platform !== 'digitalocean') {\n throw new Error('Config platform must be \"digitalocean\"');\n }\n if (!process.env.DO_API_TOKEN) {\n throw new Error('DO_API_TOKEN environment variable is required');\n }\n return true;\n }\n\n async preCheck(): Promise<void> {\n try {\n await axios.get(`${DO_API}/account`, { headers: this.headers });\n } catch {\n throw new Error('Failed to authenticate with DigitalOcean API. Check your DO_API_TOKEN.');\n }\n }\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n await this.preCheck();\n\n const logs: string[] = [];\n const appName = config.customConfig?.environmentVariables?.APP_NAME || `moltium-agent-${Date.now()}`;\n const region = config.region || 'nyc';\n\n try {\n logs.push('Creating DigitalOcean App...');\n\n const appSpec = {\n name: appName,\n region,\n services: [{\n name: appName,\n source_dir: '/',\n github: config.customConfig?.environmentVariables?.GITHUB_REPO ? {\n repo: config.customConfig.environmentVariables.GITHUB_REPO,\n branch: config.customConfig.environmentVariables.GITHUB_BRANCH || 'main',\n deploy_on_push: true,\n } : undefined,\n dockerfile_path: config.customConfig?.environmentVariables?.DOCKERFILE_PATH,\n build_command: config.customConfig?.buildCommand || 'npm install && npm run build',\n run_command: config.customConfig?.startCommand || 'npm start',\n instance_size_slug: config.instanceType || 'basic-xxs',\n instance_count: 1,\n http_port: config.customConfig?.port || 3000,\n envs: Object.entries(config.customConfig?.environmentVariables || {})\n .filter(([key]) => !['APP_NAME', 'GITHUB_REPO', 'GITHUB_BRANCH', 'DOCKERFILE_PATH'].includes(key))\n .map(([key, value]) => ({\n key,\n value,\n scope: 'RUN_AND_BUILD_TIME',\n })),\n }],\n };\n\n const createRes = await axios.post(`${DO_API}/apps`, { spec: appSpec }, { headers: this.headers });\n const app = createRes.data.app;\n\n logs.push(`App created: ${app.id}`);\n\n // Wait briefly for the URL to become available\n let url: string | undefined;\n try {\n const statusRes = await axios.get(`${DO_API}/apps/${app.id}`, { headers: this.headers });\n url = statusRes.data.app.live_url || statusRes.data.app.default_ingress;\n } catch {\n // URL may not be immediately available\n }\n\n const result: DeploymentResult = {\n success: true,\n url,\n deploymentId: app.id,\n logs,\n };\n\n await this.postDeploy(result);\n return result;\n } catch (error) {\n const msg = axios.isAxiosError(error)\n ? error.response?.data?.message || error.message\n : error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: msg,\n logs,\n };\n }\n }\n\n async postDeploy(result: DeploymentResult): Promise<void> {\n result.logs?.push(`View dashboard: https://cloud.digitalocean.com/apps/${result.deploymentId}`);\n }\n\n async getStatus(deploymentId: string): Promise<DeploymentStatus> {\n try {\n const res = await axios.get(`${DO_API}/apps/${deploymentId}`, { headers: this.headers });\n const app = res.data.app;\n\n const phase = app.active_deployment?.phase?.toLowerCase();\n const stateMap: Record<string, DeploymentStatus['state']> = {\n active: 'running',\n deploying: 'deploying',\n building: 'deploying',\n error: 'failed',\n };\n\n return {\n state: stateMap[phase] || (app.live_url ? 'running' : 'unknown'),\n url: app.live_url || app.default_ingress,\n };\n } catch {\n return { state: 'unknown' };\n }\n }\n\n async rollback(deploymentId: string): Promise<void> {\n try {\n // List deployments and find previous successful one\n const res = await axios.get(`${DO_API}/apps/${deploymentId}/deployments?per_page=5`, { headers: this.headers });\n const deployments = res.data.deployments || [];\n\n const previousActive = deployments.find((d: any) => d.phase === 'ACTIVE' && d !== deployments[0]);\n if (!previousActive) {\n throw new Error('No previous successful deployment found for rollback');\n }\n\n // Trigger rollback by creating new deployment from previous\n await axios.post(\n `${DO_API}/apps/${deploymentId}/rollback`,\n { deployment_id: previousActive.id },\n { headers: this.headers },\n );\n } catch (error) {\n if (axios.isAxiosError(error) && error.response?.status === 404) {\n // Rollback endpoint may not exist on older API versions\n throw new Error('Rollback not supported. Manually redeploy from the DigitalOcean dashboard.');\n }\n throw new Error(`Rollback failed: ${error instanceof Error ? error.message : error}`);\n }\n }\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus, CustomDeploymentConfig } from '@moltium/core';\nimport { exec } from './exec-util.js';\nimport axios from 'axios';\n\nexport class CustomDeploymentError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CustomDeploymentError';\n }\n}\n\nexport class CustomDeployer extends BaseDeployer {\n name = 'custom';\n description = 'Deploy using custom configuration';\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (!config.customConfig) {\n throw new CustomDeploymentError('Custom deployment requires customConfig object');\n }\n\n const required: Array<keyof CustomDeploymentConfig> = ['deploymentMethod', 'buildCommand', 'startCommand'];\n for (const field of required) {\n if (!config.customConfig[field]) {\n throw new CustomDeploymentError(`Custom deployment missing required field: ${field}`);\n }\n }\n\n const validMethods = ['docker', 'ssh', 'cli', 'api'];\n if (!validMethods.includes(config.customConfig.deploymentMethod)) {\n throw new CustomDeploymentError(\n `Invalid deployment method: ${config.customConfig.deploymentMethod}. Must be one of: ${validMethods.join(', ')}`,\n );\n }\n\n return true;\n }\n\n async preCheck(): Promise<void> {}\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n const custom = config.customConfig!;\n\n switch (custom.deploymentMethod) {\n case 'docker':\n return this.deployDocker(custom);\n case 'ssh':\n return this.deploySSH(custom);\n case 'cli':\n return this.deployCLI(custom);\n case 'api':\n return this.deployAPI(custom);\n default:\n throw new CustomDeploymentError(`Unsupported deployment method: ${custom.deploymentMethod}`);\n }\n }\n\n async postDeploy(_result: DeploymentResult): Promise<void> {}\n\n async getStatus(deploymentId: string): Promise<DeploymentStatus> {\n // Try health check URL if available\n try {\n const url = deploymentId; // deploymentId stores the health check URL for custom deploys\n if (url.startsWith('http')) {\n const res = await axios.get(url, { timeout: 5000 });\n if (res.status === 200) return { state: 'running', url };\n }\n } catch {\n // Health check failed\n }\n return { state: 'unknown' };\n }\n\n async rollback(_deploymentId: string): Promise<void> {\n throw new CustomDeploymentError('Rollback is deployment-method specific. Implement in your deployment pipeline.');\n }\n\n // āā Docker Method āā\n\n private async deployDocker(config: CustomDeploymentConfig): Promise<DeploymentResult> {\n if (!config.docker) {\n throw new CustomDeploymentError('Docker config required for docker deployment method');\n }\n\n const logs: string[] = [];\n const { docker } = config;\n\n try {\n // Step 1: Build the Docker image\n logs.push('Building Docker image...');\n const dockerfile = docker.dockerfile || 'Dockerfile';\n const tag = docker.tag || 'latest';\n const imageName = `${docker.registry}/${docker.imageName}:${tag}`;\n\n const buildArgs = docker.buildArgs\n ? Object.entries(docker.buildArgs).flatMap(([k, v]) => ['--build-arg', `${k}=${v}`])\n : [];\n\n await exec('docker', ['build', '-f', dockerfile, '-t', imageName, ...buildArgs, '.']);\n logs.push(`Image built: ${imageName}`);\n\n // Step 2: Login to registry (if credentials provided)\n if (docker.registryAuth) {\n logs.push(`Logging in to registry: ${docker.registry}...`);\n await exec('docker', [\n 'login', docker.registry,\n '-u', docker.registryAuth.username,\n '-p', docker.registryAuth.password,\n ]);\n logs.push('Registry login successful.');\n }\n\n // Step 3: Push the image\n logs.push('Pushing image to registry...');\n await exec('docker', ['push', imageName]);\n logs.push('Image pushed.');\n\n // Step 4: Deploy to host (pull and run on remote via docker)\n logs.push(`Deploying to ${docker.hostUrl}...`);\n\n // If hostUrl is localhost or local Docker, run directly\n if (docker.hostUrl === 'localhost' || docker.hostUrl === '127.0.0.1') {\n // Stop existing container\n try {\n await exec('docker', ['stop', docker.imageName]);\n await exec('docker', ['rm', docker.imageName]);\n } catch {\n // Container may not exist\n }\n\n // Pull latest and run\n await exec('docker', ['pull', imageName]);\n\n const envArgs = config.environmentVariables\n ? Object.entries(config.environmentVariables).flatMap(([k, v]) => ['-e', `${k}=${v}`])\n : [];\n\n await exec('docker', [\n 'run', '-d',\n '--name', docker.imageName,\n '-p', `${docker.hostPort}:${docker.containerPort}`,\n ...envArgs,\n imageName,\n ]);\n logs.push(`Container running on port ${docker.hostPort}`);\n } else {\n logs.push(`Remote Docker host deployment: Pull ${imageName} on ${docker.hostUrl} and run with port ${docker.hostPort}:${docker.containerPort}`);\n }\n\n const healthUrl = config.healthCheckUrl || `http://localhost:${docker.hostPort}/health`;\n\n return {\n success: true,\n url: `http://localhost:${docker.hostPort}`,\n deploymentId: healthUrl,\n logs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n // āā SSH Method āā\n\n private async deploySSH(config: CustomDeploymentConfig): Promise<DeploymentResult> {\n if (!config.ssh) {\n throw new CustomDeploymentError('SSH config required for ssh deployment method');\n }\n\n const logs: string[] = [];\n const { ssh } = config;\n\n try {\n const sshTarget = `${ssh.username}@${ssh.host}`;\n const sshPort = ssh.port || 22;\n const sshBaseArgs = ['-p', String(sshPort), '-o', 'StrictHostKeyChecking=no'];\n\n if (ssh.authMethod === 'privateKey' && ssh.privateKeyPath) {\n sshBaseArgs.push('-i', ssh.privateKeyPath);\n }\n\n // Step 1: Run pre-deploy commands\n if (ssh.preDeployCommands && ssh.preDeployCommands.length > 0) {\n logs.push('Running pre-deploy commands...');\n for (const cmd of ssh.preDeployCommands) {\n await exec('ssh', [...sshBaseArgs, sshTarget, cmd]);\n logs.push(` Pre-deploy: ${cmd}`);\n }\n }\n\n // Step 2: Build locally\n logs.push(`Building: ${config.buildCommand}`);\n const [buildCmd, ...buildArgs] = config.buildCommand.split(' ');\n await exec(buildCmd, buildArgs);\n logs.push('Build complete.');\n\n // Step 3: Sync files to remote\n logs.push(`Deploying to ${sshTarget}:${ssh.deploymentPath}...`);\n\n // Ensure remote directory exists\n await exec('ssh', [...sshBaseArgs, sshTarget, `mkdir -p ${ssh.deploymentPath}`]);\n\n // Use rsync for file transfer\n const rsyncArgs = [\n '-avz', '--delete',\n '-e', `ssh ${sshBaseArgs.join(' ')}`,\n './',\n `${sshTarget}:${ssh.deploymentPath}/`,\n ];\n await exec('rsync', rsyncArgs);\n logs.push('Files synced.');\n\n // Step 4: Start the service on remote\n logs.push(`Starting: ${config.startCommand}`);\n await exec('ssh', [\n ...sshBaseArgs, sshTarget,\n `cd ${ssh.deploymentPath} && ${config.startCommand}`,\n ]);\n logs.push('Service started.');\n\n // Step 5: Run post-deploy commands\n if (ssh.postDeployCommands && ssh.postDeployCommands.length > 0) {\n logs.push('Running post-deploy commands...');\n for (const cmd of ssh.postDeployCommands) {\n await exec('ssh', [...sshBaseArgs, sshTarget, cmd]);\n logs.push(` Post-deploy: ${cmd}`);\n }\n }\n\n const healthUrl = config.healthCheckUrl || `http://${ssh.host}:${config.port || 3000}/health`;\n\n return {\n success: true,\n url: `http://${ssh.host}:${config.port || 3000}`,\n deploymentId: healthUrl,\n logs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n // āā CLI Method āā\n\n private async deployCLI(config: CustomDeploymentConfig): Promise<DeploymentResult> {\n if (!config.cli) {\n throw new CustomDeploymentError('CLI config required for cli deployment method');\n }\n\n const logs: string[] = [];\n const { cli } = config;\n\n try {\n // Step 1: Install CLI tool (if install command provided)\n if (cli.installCommand) {\n logs.push(`Installing CLI: ${cli.installCommand}`);\n const [installCmd, ...installArgs] = cli.installCommand.split(' ');\n await exec(installCmd, installArgs);\n logs.push('CLI installed.');\n }\n\n // Step 2: Login (if login command provided)\n if (cli.loginCommand) {\n logs.push(`Logging in: ${cli.loginCommand}`);\n const [loginCmd, ...loginArgs] = cli.loginCommand.split(' ');\n\n await exec(loginCmd, loginArgs);\n logs.push('Login successful.');\n }\n\n // Step 3: Build\n logs.push(`Building: ${config.buildCommand}`);\n const [buildCmd, ...buildArgs] = config.buildCommand.split(' ');\n await exec(buildCmd, buildArgs);\n logs.push('Build complete.');\n\n // Step 4: Deploy\n logs.push(`Deploying: ${cli.deployCommand}`);\n const [deployCmd, ...deployArgs] = cli.deployCommand.split(' ');\n const deployResult = await exec(deployCmd, deployArgs);\n logs.push(deployResult.stdout);\n\n // Step 5: Get status (if status command provided)\n let url: string | undefined;\n if (cli.statusCommand) {\n const [statusCmd, ...statusArgs] = cli.statusCommand.split(' ');\n const statusResult = await exec(statusCmd, statusArgs);\n logs.push(statusResult.stdout);\n // Try to extract URL from output\n const urlMatch = statusResult.stdout.match(/https?:\\/\\/[^\\s]+/);\n if (urlMatch) url = urlMatch[0];\n }\n\n return {\n success: true,\n url,\n deploymentId: `cli-${cli.cliName}-${Date.now()}`,\n logs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n // āā API Method āā\n\n private async deployAPI(config: CustomDeploymentConfig): Promise<DeploymentResult> {\n if (!config.api) {\n throw new CustomDeploymentError('API config required for api deployment method');\n }\n\n const logs: string[] = [];\n const { api } = config;\n\n try {\n // Step 1: Build locally\n logs.push(`Building: ${config.buildCommand}`);\n const [buildCmd, ...buildArgs] = config.buildCommand.split(' ');\n await exec(buildCmd, buildArgs);\n logs.push('Build complete.');\n\n // Step 2: Prepare request headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(api.headers || {}),\n };\n\n switch (api.authType) {\n case 'bearer':\n headers['Authorization'] = `Bearer ${api.authToken}`;\n break;\n case 'apiKey':\n headers['X-API-Key'] = api.apiKey || '';\n break;\n case 'basic':\n headers['Authorization'] = `Basic ${Buffer.from(api.authToken || '').toString('base64')}`;\n break;\n case 'custom':\n // Custom auth headers already merged above\n break;\n }\n\n // Step 3: Make deploy API call\n const deployUrl = `${api.baseUrl}${api.endpoints.deploy}`;\n const method = api.requestMethod || 'POST';\n const payload = api.payloadTemplate || {\n name: config.environmentVariables?.SERVICE_NAME || 'moltium-agent',\n buildCommand: config.buildCommand,\n startCommand: config.startCommand,\n envVars: config.environmentVariables,\n };\n\n logs.push(`Calling deploy API: ${method} ${deployUrl}`);\n\n const response = method === 'PUT'\n ? await axios.put(deployUrl, payload, { headers })\n : await axios.post(deployUrl, payload, { headers });\n\n logs.push(`API response: ${response.status}`);\n\n const deploymentId = response.data.id || response.data.deploymentId || `api-${Date.now()}`;\n let url = response.data.url || response.data.deployUrl;\n\n // Step 4: Check status endpoint (if available)\n if (api.endpoints.status) {\n const statusUrl = `${api.baseUrl}${api.endpoints.status}`.replace(':id', deploymentId);\n try {\n const statusRes = await axios.get(statusUrl, { headers });\n url = url || statusRes.data.url;\n logs.push(`Status: ${statusRes.data.status || statusRes.data.state || 'unknown'}`);\n } catch {\n // Status check is optional\n }\n }\n\n return {\n success: true,\n url,\n deploymentId,\n logs,\n };\n } catch (error) {\n const msg = axios.isAxiosError(error)\n ? `API error ${error.response?.status}: ${error.response?.data?.message || error.message}`\n : error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: msg,\n logs,\n };\n }\n }\n}\n","import { Command } from 'commander';\nimport { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport { ConfigLoader } from '@moltium/core';\n\nexport const configCommand = new Command('config')\n .description('Manage agent configuration');\n\nconfigCommand\n .command('show')\n .description('Show current agent configuration')\n .action(async () => {\n try {\n const configLoader = new ConfigLoader();\n const { config, type } = await configLoader.load(resolve(process.cwd()));\n\n console.log(chalk.bold(`\\nAgent: ${config.name}`));\n console.log(`Type: ${config.type || 'general'}`);\n console.log(`Config: ${type}`);\n console.log(`LLM: ${config.llm.provider} / ${config.llm.model}`);\n console.log(`Behaviors: ${config.behaviors.decisionMaking}, ${config.behaviors.actionsPerHour || 5} actions/hr`);\n console.log(`Memory: ${config.memory.type}`);\n console.log(`Actions: ${config.actions.join(', ') || 'none'}`);\n\n const platforms = Object.keys(config.social).filter(\n (k) => (config.social[k] as any)?.enabled,\n );\n console.log(`Social: ${platforms.join(', ') || 'none'}`);\n } catch (error) {\n console.error(chalk.red(error instanceof Error ? error.message : 'Failed to load config'));\n process.exit(1);\n }\n });\n\nconfigCommand\n .command('validate')\n .description('Validate agent configuration')\n .action(async () => {\n try {\n const configLoader = new ConfigLoader();\n const { config, type } = await configLoader.load(resolve(process.cwd()));\n console.log(chalk.green(`\\nā Valid ${type} configuration for \"${config.name}\"`));\n } catch (error) {\n console.error(chalk.red(`\\nā ${error instanceof Error ? error.message : 'Invalid configuration'}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { resolve, join } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ConfigLoader } from '@moltium/core';\n\nexport const migrateCommand = new Command('migrate')\n .description('Migrate between configuration types')\n .requiredOption('--from <type>', 'Source config type (code/markdown)')\n .requiredOption('--to <type>', 'Target config type (code/markdown)')\n .option('--dir <directory>', 'Agent directory', '.')\n .option('--keep', 'Keep the original config file after migration')\n .action(async (options) => {\n const { from, to, keep } = options;\n const agentDir = resolve(process.cwd(), options.dir);\n\n if (from === to) {\n console.log(chalk.yellow('Source and target config types are the same.'));\n return;\n }\n\n if (!['code', 'markdown'].includes(from) || !['code', 'markdown'].includes(to)) {\n console.log(chalk.red('Config types must be \"code\" or \"markdown\".'));\n process.exit(1);\n }\n\n const spinner = ora(`Migrating from ${from} to ${to}...`).start();\n\n try {\n const configLoader = new ConfigLoader();\n\n if (from === 'code' && to === 'markdown') {\n await migrateCodeToMarkdown(configLoader, agentDir, keep, spinner);\n } else {\n await migrateMarkdownToCode(configLoader, agentDir, keep, spinner);\n }\n\n spinner.succeed(chalk.green(`Migration complete: ${from} ā ${to}`));\n } catch (error) {\n spinner.fail(chalk.red('Migration failed'));\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nasync function migrateCodeToMarkdown(\n configLoader: ConfigLoader,\n agentDir: string,\n keep: boolean,\n spinner: ReturnType<typeof ora>,\n): Promise<void> {\n const configPath = resolve(agentDir, 'agent.config.ts');\n if (!existsSync(configPath)) {\n throw new Error('No agent.config.ts found in the current directory.');\n }\n\n spinner.text = 'Loading code config...';\n const config = await configLoader.loadCode(configPath);\n\n // Generate agent.md\n spinner.text = 'Generating agent.md...';\n const socialSections = generateSocialMarkdown(config);\n const skillSections = config.actions.map((a) => {\n const name = a.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n return `### ${name}\\nExecute the ${a} action based on context and current goals.`;\n }).join('\\n\\n');\n\n const sleepSchedule = config.behaviors.sleepSchedule\n ? `${config.behaviors.sleepSchedule.start}:00-${config.behaviors.sleepSchedule.end}:00${config.behaviors.sleepSchedule.timezone ? ' ' + config.behaviors.sleepSchedule.timezone : ' UTC'}`\n : 'none';\n\n const agentMd = `# Agent Configuration\n\n## Identity\nname: ${config.name}\ntype: ${config.type || 'assistant'}\npersonality: ${config.personality.traits.join(', ')}\n\n## Bio\n${config.personality.bio}\n\n## Social Platforms\n${socialSections}\n\n## Behaviors\nautonomous: ${config.behaviors.autonomous}\ndecision_making: ${config.behaviors.decisionMaking}\nactions_per_hour: ${typeof config.behaviors.actionsPerHour === 'number' ? config.behaviors.actionsPerHour : 5}\nsleep_schedule: ${sleepSchedule}\n\n## Memory\ntype: ${config.memory.type}\n${config.memory.retention ? `retention: ${config.memory.retention}` : ''}\n\n## Skills\n\n${skillSections}\n`;\n\n await writeFile(join(agentDir, 'agent.md'), agentMd);\n\n // Create personality files\n await mkdir(join(agentDir, 'personality'), { recursive: true });\n await writeFile(join(agentDir, 'personality', 'bio.md'), `# ${config.name}\\n\\n${config.personality.bio}\\n`);\n await writeFile(join(agentDir, 'personality', 'traits.md'), `# ${config.name} ā Traits\\n\\n${config.personality.traits.map((t) => `### ${t.charAt(0).toUpperCase() + t.slice(1)}\\nDescribe how this trait manifests in behavior.\\n`).join('\\n')}`);\n\n // Create skills directory\n await mkdir(join(agentDir, 'skills'), { recursive: true });\n for (const action of config.actions) {\n const name = action.replace(/_/g, '-');\n const title = action.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n await writeFile(join(agentDir, 'skills', `${name}.md`), `# ${title}\\n\\nDescribe the detailed instructions for this skill.\\n`);\n }\n\n // Create prompts directory\n await mkdir(join(agentDir, 'prompts'), { recursive: true });\n await writeFile(join(agentDir, 'prompts', 'system.md'), `# System Prompt for ${config.name}\\n\\n${config.llm.systemPrompt || 'Add your custom system prompt instructions here.'}\\n`);\n\n // Create memory directory\n await mkdir(join(agentDir, 'memory'), { recursive: true });\n await writeFile(join(agentDir, 'memory', 'context.md'), `# ${config.name} ā Long-Term Context\\n\\n## Important Facts\\n- Migrated from code-based configuration\\n- Type: ${config.type || 'assistant'}\\n\\n## Current Goals\\n1. Continue operating as before\\n`);\n\n if (!keep) {\n const { rename } = await import('node:fs/promises');\n await rename(configPath, configPath + '.bak');\n spinner.text = 'Original agent.config.ts renamed to agent.config.ts.bak';\n }\n}\n\nasync function migrateMarkdownToCode(\n configLoader: ConfigLoader,\n agentDir: string,\n keep: boolean,\n spinner: ReturnType<typeof ora>,\n): Promise<void> {\n const mdPath = resolve(agentDir, 'agent.md');\n if (!existsSync(mdPath)) {\n throw new Error('No agent.md found in the current directory.');\n }\n\n spinner.text = 'Loading markdown config...';\n const config = await configLoader.loadMarkdown(mdPath);\n\n // Generate agent.config.ts\n spinner.text = 'Generating agent.config.ts...';\n\n const socialConfigStr = generateSocialCodeConfig(config);\n const actionsArrayStr = config.actions.map((a) => `'${a}'`).join(', ');\n\n const sleepScheduleStr = config.behaviors.sleepSchedule\n ? `{ start: ${config.behaviors.sleepSchedule.start}, end: ${config.behaviors.sleepSchedule.end}${config.behaviors.sleepSchedule.timezone ? `, timezone: '${config.behaviors.sleepSchedule.timezone}'` : ''} }`\n : 'undefined';\n\n const providerEnvKey = config.llm.provider === 'anthropic' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n\n const codeConfig = `import type { AgentConfig } from '@moltium/core';\n\nconst config: AgentConfig = {\n name: '${config.name}',\n type: '${config.type || 'assistant'}',\n\n personality: {\n traits: [${config.personality.traits.map((t) => `'${t}'`).join(', ')}],\n bio: ${JSON.stringify(config.personality.bio)},\n },\n\n llm: {\n provider: '${config.llm.provider}',\n model: '${config.llm.model}',\n apiKey: process.env.${providerEnvKey} || '',\n temperature: ${config.llm.temperature ?? 0.7},\n },\n\n social: {\n${socialConfigStr}\n },\n\n behaviors: {\n autonomous: ${config.behaviors.autonomous},\n decisionMaking: '${config.behaviors.decisionMaking}',\n actionsPerHour: ${typeof config.behaviors.actionsPerHour === 'number' ? config.behaviors.actionsPerHour : 5},\n sleepSchedule: ${sleepScheduleStr},\n },\n\n memory: {\n type: '${config.memory.type}',\n ${config.memory.retention ? `retention: '${config.memory.retention}',` : ''}\n },\n\n actions: [${actionsArrayStr}],\n};\n\nexport default config;\n`;\n\n await writeFile(join(agentDir, 'agent.config.ts'), codeConfig);\n\n // Create hooks directory with stubs\n await mkdir(join(agentDir, 'hooks'), { recursive: true });\n await mkdir(join(agentDir, 'actions'), { recursive: true });\n\n // Load existing hooks from personality and prompts if they exist\n const systemPromptPath = join(agentDir, 'prompts', 'system.md');\n if (existsSync(systemPromptPath)) {\n const systemPrompt = readFileSync(systemPromptPath, 'utf-8');\n // Store the system prompt content in onInit hook\n await writeFile(join(agentDir, 'hooks', 'onInit.ts'), `import type { Agent } from '@moltium/core';\n\nexport async function onInit(agent: Agent): Promise<void> {\n // Migrated system prompt content from prompts/system.md\n agent.appendSystemPrompt(${JSON.stringify(systemPrompt)});\n\n const memory = agent.getMemory();\n await memory.remember('session_started', new Date().toISOString());\n}\n`);\n } else {\n await writeFile(join(agentDir, 'hooks', 'onInit.ts'), `import type { Agent } from '@moltium/core';\n\nexport async function onInit(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n await memory.remember('session_started', new Date().toISOString());\n}\n`);\n }\n\n await writeFile(join(agentDir, 'hooks', 'onTick.ts'), `import type { Agent } from '@moltium/core';\n\nexport async function onTick(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n const count = ((await memory.recall('tick_count')) as number) || 0;\n await memory.remember('tick_count', count + 1);\n}\n`);\n\n await writeFile(join(agentDir, 'hooks', 'onShutdown.ts'), `import type { Agent } from '@moltium/core';\n\nexport async function onShutdown(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n await memory.remember('last_shutdown', new Date().toISOString());\n}\n`);\n\n // Create package.json and tsconfig.json if they don't exist\n if (!existsSync(join(agentDir, 'tsconfig.json'))) {\n await writeFile(join(agentDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: './dist',\n rootDir: '.',\n },\n include: ['*.ts', 'actions/**/*.ts', 'hooks/**/*.ts'],\n }, null, 2));\n }\n\n if (!keep) {\n const { rename } = await import('node:fs/promises');\n await rename(mdPath, mdPath + '.bak');\n spinner.text = 'Original agent.md renamed to agent.md.bak';\n }\n}\n\nfunction generateSocialMarkdown(config: any): string {\n const sections: string[] = [];\n const social = config.social || {};\n\n for (const [platform, platformConfig] of Object.entries(social)) {\n if (!platformConfig || typeof platformConfig !== 'object') continue;\n const pc = platformConfig as Record<string, any>;\n if (!pc.enabled) continue;\n\n const lines = [`### ${platform.charAt(0).toUpperCase() + platform.slice(1)}`];\n lines.push(`enabled: true`);\n for (const [key, value] of Object.entries(pc)) {\n if (key === 'enabled' || key === 'credentials' || key === 'apiKey') continue;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n lines.push(`${key}: ${value}`);\n }\n }\n sections.push(lines.join('\\n'));\n }\n\n return sections.length > 0 ? sections.join('\\n\\n') : 'No social platforms configured.';\n}\n\nfunction generateSocialCodeConfig(config: any): string {\n const social = config.social || {};\n const lines: string[] = [];\n\n for (const [platform, platformConfig] of Object.entries(social)) {\n if (!platformConfig || typeof platformConfig !== 'object') continue;\n const pc = platformConfig as Record<string, any>;\n\n if (platform === 'moltbook' && pc.enabled) {\n lines.push(` moltbook: {\n enabled: true,\n apiKey: process.env.MOLTBOOK_API_KEY || '',\n },`);\n } else if (platform === 'twitter' && pc.enabled) {\n lines.push(` twitter: {\n enabled: true,\n credentials: {\n apiKey: process.env.TWITTER_API_KEY || '',\n apiSecret: process.env.TWITTER_API_SECRET || '',\n accessToken: process.env.TWITTER_ACCESS_TOKEN || '',\n accessSecret: process.env.TWITTER_ACCESS_SECRET || '',\n },\n },`);\n }\n }\n\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport axios from 'axios';\n\nexport const statusCommand = new Command('status')\n .description('Check agent status')\n .option('-r, --remote <url>', 'Remote agent URL')\n .option('-p, --port <number>', 'Local port', '3000')\n .action(async (options) => {\n const url = options.remote || `http://localhost:${options.port}`;\n\n try {\n const [health, status] = await Promise.all([\n axios.get(`${url}/health`, { timeout: 5000 }),\n axios.get(`${url}/status`, { timeout: 5000 }),\n ]);\n\n const data = status.data;\n console.log(chalk.bold(`\\nAgent: ${data.name}`));\n console.log(`State: ${chalk.green(data.state)}`);\n console.log(`Type: ${data.type}`);\n console.log(`Uptime: ${Math.floor(data.uptime)}s`);\n console.log(`Health: ${chalk.green(health.data.status)}`);\n } catch (error) {\n if (axios.isAxiosError(error) && error.code === 'ECONNREFUSED') {\n console.log(chalk.yellow(`\\nNo agent running at ${url}`));\n } else {\n console.error(chalk.red(`\\nFailed to reach agent at ${url}`));\n console.error(error instanceof Error ? error.message : error);\n }\n process.exit(1);\n }\n });\n"],"mappings":"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","names":["Command","require","Command","resolve","join","existsSync","chalk","ora","Command","resolve","pathToFileURL","chalk","ora","loadEnv","ConfigLoader","resolve","join","axios","axios","Command","resolve","loadEnv","chalk","deployer","ora","ConfigLoader","pathToFileURL","Command","resolve","chalk","ConfigLoader","Command","resolve","join","existsSync","readFileSync","writeFile","mkdir","chalk","ora","ConfigLoader","Command","chalk","axios","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/templates/code-based/index.ts","../src/templates/code-based/start.ts","../src/templates/code-based/action.ts","../src/templates/code-based/hooks.ts","../src/templates/markdown-based/index.ts","../src/templates/markdown-based/start.ts","../src/templates/markdown-based/skills.ts","../src/templates/markdown-based/personality.ts","../src/templates/markdown-based/prompts.ts","../src/templates/markdown-based/memory.ts","../src/templates/shared/deployment.ts","../src/commands/start.ts","../src/commands/deploy.ts","../src/deployers/base.ts","../src/deployers/exec-util.ts","../src/deployers/railway.ts","../src/deployers/render.ts","../src/deployers/aws.ts","../src/deployers/digitalocean.ts","../src/deployers/custom.ts","../src/commands/config.ts","../src/commands/migrate.ts","../src/commands/status.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from './commands/init.js';\nimport { startCommand } from './commands/start.js';\nimport { deployCommand } from './commands/deploy.js';\nimport { configCommand } from './commands/config.js';\nimport { migrateCommand } from './commands/migrate.js';\nimport { statusCommand } from './commands/status.js';\n\nconst program = new Command();\n\nprogram\n .name('moltium')\n .description('Moltium Agent SDK ā create and manage autonomous AI agents')\n .version('0.1.9');\n\nprogram.addCommand(initCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(deployCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(migrateCommand);\nprogram.addCommand(statusCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { createRequire } from 'node:module';\nimport { codeTemplate } from '../templates/code-based/index.js';\nimport { codeStartTemplate } from '../templates/code-based/start.js';\nimport { exampleActionTemplate } from '../templates/code-based/action.js';\nimport { onInitTemplate, onTickTemplate, onShutdownTemplate } from '../templates/code-based/hooks.js';\nimport { markdownTemplate } from '../templates/markdown-based/index.js';\nimport { markdownStartTemplate } from '../templates/markdown-based/start.js';\nimport { respondToMessagesSkill, postUpdatesSkill } from '../templates/markdown-based/skills.js';\nimport { bioTemplate, traitsTemplate } from '../templates/markdown-based/personality.js';\nimport { systemPromptTemplate } from '../templates/markdown-based/prompts.js';\nimport { contextMemoryTemplate } from '../templates/markdown-based/memory.js';\nimport { deploymentConfigTemplate } from '../templates/shared/deployment.js';\n\n// Resolve the current @moltium/core version dynamically so scaffolded projects\n// always reference the version that ships with this CLI release.\nfunction getCoreDepVersion(): string {\n try {\n const require = createRequire(import.meta.url);\n const corePkg = require('@moltium/core/package.json');\n return `^${corePkg.version}`;\n } catch {\n return '^0.1.9';\n }\n}\n\ninterface InitAnswers {\n name: string;\n type: string;\n configType: 'code' | 'markdown';\n llmProvider: 'anthropic' | 'openai';\n socialPlatforms: string[];\n deployTarget: string;\n}\n\nexport const initCommand = new Command('init')\n .description('Initialize a new Moltium agent')\n .argument('[name]', 'Agent name')\n .action(async (name?: string) => {\n console.log(chalk.bold('\\nš¤ Moltium Agent SDK\\n'));\n\n const answers = await inquirer.prompt<InitAnswers>([\n {\n type: 'input',\n name: 'name',\n message: 'Agent name:',\n default: name || 'my-agent',\n when: !name,\n },\n {\n type: 'input',\n name: 'type',\n message: 'Agent type (free text, e.g. assistant, trader, moderator):',\n default: 'assistant',\n },\n {\n type: 'list',\n name: 'configType',\n message: 'Configuration type:',\n choices: [\n { name: 'code (TypeScript ā maximum flexibility, for developers)', value: 'code' },\n { name: 'markdown (Natural language ā simple, for non-developers)', value: 'markdown' },\n ],\n },\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' },\n { name: 'OpenAI (GPT)', value: 'openai' },\n ],\n },\n {\n type: 'checkbox',\n name: 'socialPlatforms',\n message: 'Social platforms:',\n choices: [\n { name: 'Moltbook', value: 'moltbook' },\n { name: 'Twitter', value: 'twitter' },\n ],\n },\n {\n type: 'list',\n name: 'deployTarget',\n message: 'Deployment target:',\n choices: [\n { name: 'Railway', value: 'railway' },\n { name: 'Render', value: 'render' },\n { name: 'AWS', value: 'aws' },\n { name: 'DigitalOcean', value: 'digitalocean' },\n { name: 'Custom', value: 'custom' },\n { name: 'None (local only)', value: 'none' },\n ],\n },\n ]);\n\n const agentName = name || answers.name;\n const agentDir = resolve(process.cwd(), agentName);\n\n if (existsSync(agentDir)) {\n console.log(chalk.red(`\\nDirectory \"${agentName}\" already exists.`));\n process.exit(1);\n }\n\n const spinner = ora('Creating agent project...').start();\n\n try {\n await mkdir(agentDir, { recursive: true });\n\n const coreVersion = getCoreDepVersion();\n const ctx = { ...answers, name: agentName };\n\n if (answers.configType === 'code') {\n await scaffoldCodeBased(agentDir, ctx, coreVersion);\n } else {\n await scaffoldMarkdownBased(agentDir, ctx, coreVersion);\n }\n\n // Shared files\n await writeFile(join(agentDir, '.env'), generateEnvFile(ctx));\n await writeFile(join(agentDir, '.gitignore'), 'node_modules/\\ndist/\\n.env\\n');\n\n // Deployment config (shared between both types)\n const deployConfig = deploymentConfigTemplate(ctx);\n if (deployConfig) {\n await writeFile(join(agentDir, 'deployment.config.ts'), deployConfig);\n }\n\n spinner.succeed(chalk.green(`Agent \"${agentName}\" created at ${agentDir}`));\n\n console.log('\\nGenerated files:');\n if (answers.configType === 'code') {\n console.log(chalk.gray(' start.ts ā Agent entry point'));\n console.log(chalk.gray(' agent.config.ts ā Main agent configuration'));\n console.log(chalk.gray(' actions/example.ts ā Starter custom action'));\n console.log(chalk.gray(' hooks/onInit.ts ā Initialization hook'));\n console.log(chalk.gray(' hooks/onTick.ts ā Autonomous loop hook'));\n console.log(chalk.gray(' hooks/onShutdown.ts ā Graceful shutdown hook'));\n } else {\n console.log(chalk.gray(' start.ts ā Agent entry point'));\n console.log(chalk.gray(' agent.md ā Main agent configuration'));\n console.log(chalk.gray(' skills/ ā Skill definitions'));\n console.log(chalk.gray(' personality/ ā Bio and trait definitions'));\n console.log(chalk.gray(' prompts/system.md ā System prompt template'));\n console.log(chalk.gray(' memory/context.md ā Long-term context'));\n }\n if (deployConfig) {\n console.log(chalk.gray(' deployment.config.ts ā Deployment configuration'));\n }\n console.log(chalk.gray(' .env ā Environment variables'));\n\n console.log(`\\nNext steps:`);\n console.log(chalk.cyan(` cd ${agentName}`));\n console.log(chalk.cyan(` npm install`));\n console.log(chalk.cyan(` # Edit .env with your API keys`));\n console.log(chalk.cyan(` npm start`));\n } catch (error) {\n spinner.fail(chalk.red('Failed to create agent'));\n console.error(error);\n process.exit(1);\n }\n });\n\nasync function scaffoldCodeBased(dir: string, ctx: InitAnswers & { name: string }, coreVersion: string) {\n // Create directories\n await mkdir(join(dir, 'actions'), { recursive: true });\n await mkdir(join(dir, 'hooks'), { recursive: true });\n\n // package.json\n await writeFile(join(dir, 'package.json'), JSON.stringify({\n name: ctx.name,\n version: '0.1.0',\n type: 'module',\n scripts: {\n start: 'tsx start.ts',\n dev: 'tsx watch start.ts',\n build: 'tsc',\n },\n dependencies: {\n '@moltium/core': coreVersion,\n dotenv: '^16.4.0',\n },\n devDependencies: {\n typescript: '^5.3.0',\n tsx: '^4.19.0',\n '@types/node': '^22.0.0',\n },\n }, null, 2));\n\n // tsconfig.json\n await writeFile(join(dir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: './dist',\n rootDir: '.',\n },\n include: ['*.ts', 'actions/**/*.ts', 'hooks/**/*.ts'],\n }, null, 2));\n\n // Entry point\n await writeFile(join(dir, 'start.ts'), codeStartTemplate(ctx));\n\n // Main config\n await writeFile(join(dir, 'agent.config.ts'), codeTemplate(ctx));\n\n // Starter custom action\n await writeFile(join(dir, 'actions', 'example.ts'), exampleActionTemplate(ctx));\n\n // Lifecycle hooks\n await writeFile(join(dir, 'hooks', 'onInit.ts'), onInitTemplate(ctx));\n await writeFile(join(dir, 'hooks', 'onTick.ts'), onTickTemplate(ctx));\n await writeFile(join(dir, 'hooks', 'onShutdown.ts'), onShutdownTemplate(ctx));\n}\n\nasync function scaffoldMarkdownBased(dir: string, ctx: InitAnswers & { name: string }, coreVersion: string) {\n // Create directories\n await mkdir(join(dir, 'skills'), { recursive: true });\n await mkdir(join(dir, 'personality'), { recursive: true });\n await mkdir(join(dir, 'prompts'), { recursive: true });\n await mkdir(join(dir, 'memory'), { recursive: true });\n\n // package.json\n await writeFile(join(dir, 'package.json'), JSON.stringify({\n name: ctx.name,\n version: '0.1.0',\n type: 'module',\n scripts: {\n start: 'tsx start.ts',\n dev: 'tsx watch start.ts',\n },\n dependencies: {\n '@moltium/core': coreVersion,\n dotenv: '^16.4.0',\n },\n devDependencies: {\n tsx: '^4.19.0',\n },\n }, null, 2));\n\n // Entry point\n await writeFile(join(dir, 'start.ts'), markdownStartTemplate(ctx));\n\n // Main config\n await writeFile(join(dir, 'agent.md'), markdownTemplate(ctx));\n\n // Skills\n await writeFile(join(dir, 'skills', 'respond-to-messages.md'), respondToMessagesSkill(ctx));\n await writeFile(join(dir, 'skills', 'post-updates.md'), postUpdatesSkill(ctx));\n\n // Personality\n await writeFile(join(dir, 'personality', 'bio.md'), bioTemplate(ctx));\n await writeFile(join(dir, 'personality', 'traits.md'), traitsTemplate(ctx));\n\n // System prompt\n await writeFile(join(dir, 'prompts', 'system.md'), systemPromptTemplate(ctx));\n\n // Long-term context memory\n await writeFile(join(dir, 'memory', 'context.md'), contextMemoryTemplate(ctx));\n}\n\nfunction generateEnvFile(ctx: InitAnswers & { name: string }): string {\n const lines: string[] = ['# Moltium Agent Configuration', ''];\n\n // LLM provider\n if (ctx.llmProvider === 'anthropic') {\n lines.push('ANTHROPIC_API_KEY=your-api-key-here');\n } else {\n lines.push('OPENAI_API_KEY=your-api-key-here');\n }\n lines.push('');\n\n // Moltbook ā always included; setting the key auto-enables the platform\n const moltbookSelected = ctx.socialPlatforms.includes('moltbook');\n const mb = moltbookSelected ? '' : '# ';\n lines.push('# Moltbook (set a valid API key to auto-connect on startup)');\n lines.push(`${mb}MOLTBOOK_API_KEY=your-moltbook-key-here`);\n lines.push(`${mb}MOLTBOOK_BASE_URL=https://www.moltbook.com/api/v1`);\n lines.push('');\n\n // Twitter ā always included; setting all keys auto-enables the platform\n const twitterSelected = ctx.socialPlatforms.includes('twitter');\n const tw = twitterSelected ? '' : '# ';\n lines.push('# Twitter (set all four keys to auto-connect on startup)');\n lines.push(`${tw}TWITTER_API_KEY=your-twitter-api-key`);\n lines.push(`${tw}TWITTER_API_SECRET=your-twitter-api-secret`);\n lines.push(`${tw}TWITTER_ACCESS_TOKEN=your-twitter-access-token`);\n lines.push(`${tw}TWITTER_ACCESS_SECRET=your-twitter-access-secret`);\n lines.push('');\n\n lines.push('PORT=3000');\n lines.push('LOG_LEVEL=info');\n lines.push('');\n\n return lines.join('\\n');\n}\n","interface TemplateContext {\n name: string;\n type: string;\n llmProvider: 'anthropic' | 'openai';\n socialPlatforms: string[];\n}\n\nexport function codeTemplate(ctx: TemplateContext): string {\n const envKey = ctx.llmProvider === 'anthropic' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n const model = ctx.llmProvider === 'anthropic' ? 'claude-sonnet-4-20250514' : 'gpt-4o';\n\n const socialConfig = buildSocialConfig(ctx.socialPlatforms);\n\n return `import type { AgentConfig } from '@moltium/core';\nimport { exampleAction } from './actions/example.js';\n\nexport default {\n name: '${ctx.name}',\n type: '${ctx.type}',\n\n personality: {\n traits: ['helpful', 'curious', 'thoughtful'],\n bio: 'A versatile autonomous agent built with Moltium.',\n },\n\n llm: {\n provider: '${ctx.llmProvider}',\n model: '${model}',\n apiKey: process.env.${envKey}!,\n temperature: 0.7,\n maxTokens: 2048,\n },\n\n social: {${socialConfig}\n },\n\n behaviors: {\n autonomous: true,\n decisionMaking: 'llm-driven',\n actionsPerHour: 5,\n sleepSchedule: { start: 22, end: 6, timezone: 'UTC' },\n },\n\n memory: {\n type: 'memory',\n retention: '30d',\n },\n\n actions: [\n 'post_social_update',\n 'respond_to_mention',\n 'schedule_task',\n ],\n\n // Register your custom actions here.\n // Create new actions in the actions/ directory and import them above.\n customActions: [\n exampleAction,\n ],\n\n} satisfies AgentConfig;\n`;\n}\n\nfunction buildSocialConfig(platforms: string[]): string {\n const moltbookEnabled = platforms.includes('moltbook');\n const twitterEnabled = platforms.includes('twitter');\n\n // Always include all platform configs so users see the structure.\n // The agent also auto-detects platforms from env vars (MOLTBOOK_API_KEY, etc.)\n // so just setting the key in .env is enough to connect.\n\n return `\n // Moltbook ā set MOLTBOOK_API_KEY in .env to connect automatically\n moltbook: {\n enabled: ${moltbookEnabled},\n apiKey: process.env.MOLTBOOK_API_KEY || '',\n baseUrl: process.env.MOLTBOOK_BASE_URL || 'https://www.moltbook.com/api/v1',\n defaultSubmolt: 'general',\n postFrequency: 'hourly',\n engagementRate: 'medium',\n autoReply: true,\n },\n\n // Twitter ā set TWITTER_API_KEY, TWITTER_API_SECRET, TWITTER_ACCESS_TOKEN,\n // TWITTER_ACCESS_SECRET in .env to connect automatically\n twitter: {\n enabled: ${twitterEnabled},\n credentials: {\n apiKey: process.env.TWITTER_API_KEY || '',\n apiSecret: process.env.TWITTER_API_SECRET || '',\n accessToken: process.env.TWITTER_ACCESS_TOKEN || '',\n accessSecret: process.env.TWITTER_ACCESS_SECRET || '',\n },\n postFrequency: 'daily',\n replyToMentions: true,\n maxTweetsPerDay: 5,\n },`;\n}\n","interface StartTemplateContext {\n name: string;\n type: string;\n socialPlatforms: string[];\n}\n\nexport function codeStartTemplate(ctx: StartTemplateContext): string {\n return `import 'dotenv/config';\nimport { Agent, startServer } from '@moltium/core';\nimport config from './agent.config.js';\nimport { onInit } from './hooks/onInit.js';\nimport { onTick } from './hooks/onTick.js';\nimport { onShutdown } from './hooks/onShutdown.js';\n\n/**\n * ${ctx.name} ā Entry Point\n *\n * This file boots your agent. It:\n * 1. Loads the agent configuration from agent.config.ts\n * 2. Wires up lifecycle hooks (onInit, onTick, onShutdown)\n * 3. Starts the HTTP server with REST endpoints\n *\n * Run with: npx tsx start.ts\n * Or: npm start\n */\n\nconst agent = new Agent(config, {\n onInit,\n onTick,\n onShutdown,\n onError: async (error, agent) => {\n console.error(\\`[\\${agent.name}] Error:\\`, error.message);\n },\n});\n\nconst port = parseInt(process.env.PORT || '3000', 10);\n\nstartServer(agent, { port }).catch((err) => {\n console.error('Failed to start agent:', err);\n process.exit(1);\n});\n`;\n}\n","interface ActionTemplateContext {\n name: string;\n type: string;\n}\n\nexport function exampleActionTemplate(ctx: ActionTemplateContext): string {\n return `import type { Action, ActionContext, ActionResult } from '@moltium/core';\n\n/**\n * Example custom action for ${ctx.name}.\n *\n * Actions are the building blocks of agent behavior. Each action:\n * - Has a unique name used to trigger it\n * - Receives context with access to memory, LLM, and parameters\n * - Returns a result indicating success/failure with optional data\n *\n * To create more actions, copy this file and register them in agent.config.ts.\n */\nexport const exampleAction: Action = {\n name: 'example_action',\n description: 'An example custom action ā replace with your own logic',\n\n async execute(context: ActionContext): Promise<ActionResult> {\n const { parameters, memory, llm } = context;\n\n // 1. Read from memory\n const previousResult = await memory.recall('last_example_result');\n\n // 2. Use the LLM to generate a response\n const response = await llm.generateText(\n \\`You are a \\${${JSON.stringify(ctx.type)}} agent. Given the following input, produce a helpful response.\n\nInput: \\${JSON.stringify(parameters)}\nPrevious context: \\${previousResult || 'None'}\n\nRespond concisely.\\`,\n { temperature: 0.7, maxTokens: 512 },\n );\n\n // 3. Store result in memory for next time\n await memory.remember('last_example_result', response, 3600);\n\n return {\n success: true,\n data: {\n response,\n processedAt: new Date().toISOString(),\n },\n };\n },\n};\n`;\n}\n","interface HookTemplateContext {\n name: string;\n type: string;\n socialPlatforms: string[];\n}\n\nexport function onInitTemplate(ctx: HookTemplateContext): string {\n return `import type { Agent } from '@moltium/core';\n\n/**\n * Called once when the agent initializes, before the autonomous loop starts.\n * Use this to load initial data, connect to external services, or set up state.\n *\n * Note: The agent automatically posts a startup message to all connected\n * social platforms. You do not need to post manually here.\n */\nexport async function onInit(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n\n // Load any persisted state from a previous session\n const sessionCount = ((await memory.retrieve('session_count')) as number) || 0;\n await memory.store('session_count', sessionCount + 1);\n await memory.store('init_time', new Date().toISOString());\n\n console.log(\\`[${ctx.name}] Initialized (session #\\${sessionCount + 1})\\`);\n}\n`;\n}\n\nexport function onTickTemplate(ctx: HookTemplateContext): string {\n const mentionChecks = ctx.socialPlatforms.length > 0\n ? `\n // Check for new mentions across platforms\n const adapters = agent.socialAdapters;\n${ctx.socialPlatforms.map((p) => ` if (adapters['${p}']) {\n try {\n const mentions = await adapters['${p}'].getMentions();\n if (mentions.length > 0) {\n await memory.remember('pending_mentions_${p}', mentions);\n console.log(\\`[${ctx.name}] \\${mentions.length} new ${p} mentions\\`);\n }\n } catch (err) {\n console.warn(\\`[${ctx.name}] Failed to check ${p} mentions:\\`, err);\n }\n }`).join('\\n')}`\n : `\n // No social platforms configured ā add mention checking logic here\n // when you enable social integrations.`;\n\n return `import type { Agent } from '@moltium/core';\n\n/**\n * Called on every autonomous loop tick (frequency set by actionsPerHour).\n * Use this to check for events, adjust behavior, or trigger actions.\n */\nexport async function onTick(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n const hour = new Date().getHours();\n\n // Track tick count\n const tickCount = ((await memory.recall('tick_count')) as number) || 0;\n await memory.remember('tick_count', tickCount + 1);\n${mentionChecks}\n\n // Example: adjust behavior based on time of day\n if (hour >= 9 && hour <= 17) {\n // Business hours ā higher engagement\n await memory.remember('activity_mode', 'active');\n } else if (hour >= 18 && hour <= 22) {\n // Evening ā moderate engagement\n await memory.remember('activity_mode', 'moderate');\n } else {\n // Night ā minimal activity\n await memory.remember('activity_mode', 'quiet');\n }\n}\n`;\n}\n\nexport function onShutdownTemplate(ctx: HookTemplateContext): string {\n return `import type { Agent } from '@moltium/core';\n\n/**\n * Called when the agent is shutting down gracefully.\n * Use this to save state, close connections, or send final notifications.\n */\nexport async function onShutdown(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n\n // Persist any important runtime state\n await memory.store('last_shutdown', new Date().toISOString());\n\n const tickCount = (await memory.recall('tick_count')) as number;\n if (tickCount) {\n await memory.store('last_session_ticks', tickCount);\n }\n\n console.log(\\`[${ctx.name}] Shut down gracefully\\`);\n}\n`;\n}\n","interface TemplateContext {\n name: string;\n type: string;\n llmProvider: 'anthropic' | 'openai';\n socialPlatforms: string[];\n}\n\nexport function markdownTemplate(ctx: TemplateContext): string {\n const socialSections = buildSocialSections(ctx.socialPlatforms);\n\n return `# Agent Configuration\n\n## Identity\nname: ${ctx.name}\ntype: ${ctx.type}\npersonality: helpful, curious, thoughtful\n\n## Bio\nA versatile autonomous ${ctx.type} agent built with Moltium. See\npersonality/bio.md for the full background and personality/traits.md for\ndetailed trait definitions.\n\n## Social Platforms\n${socialSections}\n\n## Behaviors\nautonomous: true\ndecision_making: llm-driven\nactions_per_hour: 5\nsleep_schedule: 22:00-06:00 UTC\n\n## Memory\ntype: memory\nretention: 30 days\n\n## Skills\n\n### Respond to Messages\nHandle incoming messages and mentions. See skills/respond-to-messages.md\nfor detailed response guidelines, priority tiers, and platform-specific rules.\n\n### Post Updates\nCreate and publish social content proactively. See skills/post-updates.md\nfor content strategy, daily themes, and quality checklist.\n\n## Scheduling\n\n### On Startup\n- Load long-term context from memory/context.md\n- Check for any pending mentions across platforms\n- Post a status update if more than 6 hours since last post\n\n### Every Hour\n- Check for new mentions on all platforms\n- Respond to high-priority messages first\n- Engage with interesting conversations\n\n### Every 6 Hours\n- Review recent interactions and update memory\n- Generate content ideas for upcoming posts\n- Check if any scheduled tasks are due\n\n### Every Day at 9 AM\n- Post daily content based on the day's theme\n- Review previous day's engagement metrics\n- Plan content for the day\n`;\n}\n\nfunction buildSocialSections(platforms: string[]): string {\n const moltbookEnabled = platforms.includes('moltbook');\n const twitterEnabled = platforms.includes('twitter');\n\n // Always include all platform sections so users see the config structure.\n // The agent also auto-detects platforms from env vars (MOLTBOOK_API_KEY, etc.)\n // so just setting the key in .env is enough to connect.\n\n const sections: string[] = [];\n\n sections.push(`### Moltbook\nenabled: ${moltbookEnabled}\ndefault_submolt: general\npost_frequency: hourly\nengagement_rate: medium\nauto_reply: true\n\nTopics to engage with:\n- Discussions related to my expertise\n- Questions I can help answer\n- Community conversations worth contributing to`);\n\n sections.push(`### Twitter\nenabled: ${twitterEnabled}\npost_frequency: daily\nreply_to_mentions: true\nmax_tweets_per_day: 5\n\nContent strategy:\n- Share insights and tips (weekdays)\n- Engage in relevant conversations\n- Use threads for longer-form content\n- Minimal hashtag use (0-2 per tweet)`);\n\n return sections.join('\\n\\n');\n}\n","interface StartTemplateContext {\n name: string;\n type: string;\n llmProvider: 'anthropic' | 'openai';\n socialPlatforms: string[];\n}\n\nexport function markdownStartTemplate(ctx: StartTemplateContext): string {\n const envKey = ctx.llmProvider === 'anthropic' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n const model = ctx.llmProvider === 'anthropic' ? 'claude-sonnet-4-20250514' : 'gpt-4o';\n\n return `import 'dotenv/config';\nimport { readFileSync, readdirSync, existsSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { Agent, MarkdownParser, startServer } from '@moltium/core';\nimport type { AgentConfig } from '@moltium/core';\n\n/**\n * ${ctx.name} ā Entry Point\n *\n * This file boots your markdown-based agent. It:\n * 1. Parses agent.md into an AgentConfig\n * 2. Loads personality, prompts, skills, and memory files\n * 3. Registers skills as LLM-interpreted actions\n * 4. Starts the HTTP server with REST endpoints\n *\n * Run with: npx tsx start.ts\n * Or: npm start\n */\n\nconst agentDir = import.meta.dirname;\n\n// āā Parse agent.md āā\nconst parser = new MarkdownParser();\nconst agentMd = readFileSync(join(agentDir, 'agent.md'), 'utf-8');\nconst parsedConfig = parser.parse(agentMd);\n\nconst config: AgentConfig = {\n ...parsedConfig,\n name: parsedConfig.name || '${ctx.name}',\n type: parsedConfig.type || '${ctx.type}',\n personality: parsedConfig.personality || { traits: [], bio: '' },\n llm: parsedConfig.llm || {\n provider: '${ctx.llmProvider}',\n model: '${model}',\n apiKey: process.env.${envKey} || '',\n },\n social: parsedConfig.social || {},\n behaviors: parsedConfig.behaviors || {\n autonomous: true,\n decisionMaking: 'llm-driven',\n },\n memory: parsedConfig.memory || { type: 'memory' },\n actions: parsedConfig.actions || [],\n} as AgentConfig;\n\n// āā Wire social platform credentials from environment āā\nif (config.social.moltbook?.enabled) {\n config.social.moltbook.apiKey = process.env.MOLTBOOK_API_KEY || '';\n config.social.moltbook.baseUrl = process.env.MOLTBOOK_BASE_URL || 'https://www.moltbook.com/api/v1';\n config.social.moltbook.defaultSubmolt = config.social.moltbook.defaultSubmolt || 'general';\n}\nif (config.social.twitter?.enabled) {\n (config.social.twitter as any).credentials = {\n apiKey: process.env.TWITTER_API_KEY || '',\n apiSecret: process.env.TWITTER_API_SECRET || '',\n accessToken: process.env.TWITTER_ACCESS_TOKEN || '',\n accessSecret: process.env.TWITTER_ACCESS_SECRET || '',\n };\n}\n\n// āā Create agent āā\nconst agent = new Agent(config);\n\n// āā Load personality into system prompt āā\nconst bioPath = join(agentDir, 'personality', 'bio.md');\nconst traitsPath = join(agentDir, 'personality', 'traits.md');\n\nif (existsSync(bioPath)) {\n agent.appendSystemPrompt('\\\\n## Bio\\\\n' + readFileSync(bioPath, 'utf-8'));\n}\nif (existsSync(traitsPath)) {\n agent.appendSystemPrompt('\\\\n## Traits\\\\n' + readFileSync(traitsPath, 'utf-8'));\n}\n\n// āā Load custom system prompt āā\nconst systemPromptPath = join(agentDir, 'prompts', 'system.md');\nif (existsSync(systemPromptPath)) {\n agent.appendSystemPrompt(readFileSync(systemPromptPath, 'utf-8'));\n}\n\n// āā Load skills from skills/*.md āā\nconst skillsDir = join(agentDir, 'skills');\nconst skills: Array<{ name: string; description: string }> = [];\n\n// Inline skills from agent.md\nconst inlineSkills = parser.parseSkills(agentMd);\nskills.push(...inlineSkills);\n\n// External skill files (richer descriptions override inline ones)\nif (existsSync(skillsDir)) {\n for (const file of readdirSync(skillsDir).filter(f => f.endsWith('.md'))) {\n const content = readFileSync(join(skillsDir, file), 'utf-8');\n const name = basename(file, '.md').replace(/-/g, '_');\n const idx = skills.findIndex(s => s.name === name);\n if (idx >= 0) {\n skills[idx].description = content;\n } else {\n skills.push({ name, description: content });\n }\n }\n}\n\n// āā Load memory/context.md āā\nconst contextPath = join(agentDir, 'memory', 'context.md');\nif (existsSync(contextPath)) {\n const contextContent = readFileSync(contextPath, 'utf-8');\n // Parse sections into memory entries\n const sections = contextContent.split(/^## /m).filter(Boolean);\n const entries: Record<string, unknown> = { 'context:raw': contextContent };\n for (const section of sections) {\n const lines = section.split('\\\\n');\n const title = lines[0]?.trim();\n if (!title) continue;\n const key = \\`context:\\${title.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '')}\\`;\n const bullets = lines.slice(1)\n .filter(l => l.match(/^[-*]\\\\s+/))\n .map(l => l.replace(/^[-*]\\\\s+/, '').trim())\n .filter(l => !l.startsWith('(') && l.length > 0);\n if (bullets.length > 0) entries[key] = bullets;\n }\n await agent.preloadMemory(entries);\n}\n\n// āā Register skills after LLM initializes āā\n// Note: The agent automatically posts a startup message to all connected\n// social platforms during init. You do not need to post manually here.\nagent.setHooks({\n onInit: async (ag) => {\n ag.registerMarkdownSkills(skills);\n console.log(\\`[${ctx.name}] Loaded \\${skills.length} skills\\`);\n },\n onError: async (error, ag) => {\n console.error(\\`[\\${ag.name}] Error:\\`, error.message);\n },\n});\n\n// āā Start āā\nconst port = parseInt(process.env.PORT || '3000', 10);\n\nstartServer(agent, { port }).catch((err) => {\n console.error('Failed to start agent:', err);\n process.exit(1);\n});\n`;\n}\n","interface SkillTemplateContext {\n name: string;\n type: string;\n socialPlatforms: string[];\n}\n\nexport function respondToMessagesSkill(ctx: SkillTemplateContext): string {\n const platformNotes = ctx.socialPlatforms.length > 0\n ? `\\n## Platform-Specific Notes\\n\\n${ctx.socialPlatforms.map((p) => {\n if (p === 'twitter') return `### Twitter\\n- Keep replies under 280 characters\\n- Use threads for longer responses\\n- Quote-tweet when adding commentary to shared content`;\n if (p === 'moltbook') return `### Moltbook\\n- Longer responses are acceptable\\n- Use formatting (bold, lists) for clarity\\n- Engage with follow-up questions to build conversation`;\n return '';\n }).join('\\n\\n')}`\n : '';\n\n return `# Respond to Messages\n\n## Overview\nThis skill handles incoming messages and mentions directed at ${ctx.name}.\nThe agent should respond helpfully, staying in character as a ${ctx.type}.\n\n## Priority Tiers\n\n### High Priority (respond within 1 hour)\n- Direct questions that require expertise\n- Messages from known contacts or collaborators\n- Urgent requests or time-sensitive topics\n- Follow-ups to previous conversations\n\n### Medium Priority (respond within 6 hours)\n- General questions or discussion topics\n- Interesting conversations worth engaging with\n- Community engagement opportunities\n\n### Low Priority (respond within 24 hours, or skip)\n- Generic messages with no specific ask\n- Off-topic discussions\n- Low-effort messages\n\n## Response Guidelines\n\n1. **Read carefully** ā Understand the full context before responding\n2. **Stay in character** ā Respond as a ${ctx.type} with your defined personality traits\n3. **Add value** ā Every response should be helpful, insightful, or actionable\n4. **Be concise** ā Prefer short, clear responses over long explanations\n5. **Ask follow-ups** ā When context is unclear, ask a clarifying question\n6. **Remember context** ā Reference previous interactions when relevant\n\n## Response Format\n- Lead with the key point or answer\n- Use simple, direct language\n- Include a clear next step when appropriate\n- End with an open question to encourage continued dialogue\n\n## Do NOT Respond To\n- Spam or promotional content\n- Toxic or unprofessional messages\n- Requests that violate your guidelines\n- Automated/bot messages\n${platformNotes}\n`;\n}\n\nexport function postUpdatesSkill(ctx: SkillTemplateContext): string {\n const platformStrategy = ctx.socialPlatforms.length > 0\n ? ctx.socialPlatforms.map((p) => {\n if (p === 'twitter') return `### Twitter Strategy\n- Single tweets: Under 280 characters, punchy and engaging\n- Threads: 3-5 tweets max for deeper topics\n- Mix original thoughts with commentary on trending topics\n- Use 0-2 relevant hashtags (no hashtag spam)\n- Post during peak hours (9-11 AM, 1-3 PM)`;\n if (p === 'moltbook') return `### Moltbook Strategy\n- Longer-form content is welcome\n- Share detailed insights and analysis\n- Engage with community by tagging relevant people\n- Mix content types: thoughts, questions, links, polls\n- Post during active community hours`;\n return '';\n }).join('\\n\\n')\n : `### General Strategy\n- Adapt content length to the platform\n- Focus on quality over quantity\n- Be authentic and consistent in voice`;\n\n return `# Post Updates\n\n## Overview\nThis skill handles proactive content creation for ${ctx.name}'s social presence.\nPosts should reflect the agent's personality as a ${ctx.type} and provide value\nto the audience.\n\n## Content Themes\n\n### Daily Rotation\n- **Monday** ā Industry insights or weekly outlook\n- **Tuesday** ā Tips, how-tos, or practical advice\n- **Wednesday** ā Opinions or thought-provoking questions\n- **Thursday** ā Share or comment on interesting content\n- **Friday** ā Community engagement, lighter content, or weekly recap\n\n### Content Types\n1. **Original thoughts** ā Share unique perspectives based on expertise\n2. **Practical tips** ā Actionable advice the audience can use immediately\n3. **Questions** ā Engage the audience with thought-provoking prompts\n4. **Commentary** ā Add value to trending topics or shared content\n5. **Updates** ā Share progress, learnings, or news\n\n## Tone & Voice\n- Authentic and conversational, not corporate\n- Confident but not arrogant\n- Data-informed when possible\n- Supportive and encouraging\n- No hype, buzzwords, or empty platitudes\n\n## Quality Checklist\nBefore posting, ensure the content:\n- [ ] Provides value (teaches, entertains, or inspires)\n- [ ] Is consistent with the agent's personality\n- [ ] Is factually accurate\n- [ ] Has no typos or formatting issues\n- [ ] Would the audience want to engage with this?\n\n${platformStrategy}\n`;\n}\n","interface PersonalityTemplateContext {\n name: string;\n type: string;\n}\n\nexport function bioTemplate(ctx: PersonalityTemplateContext): string {\n return `# ${ctx.name} ā Background\n\n## Who I Am\nI am ${ctx.name}, a ${ctx.type} agent built with Moltium. Edit this file to\ndefine your agent's detailed background and identity.\n\n## Background Story\n<!-- Describe your agent's origin story, experience, and expertise -->\nA seasoned ${ctx.type} with deep knowledge in my domain. I've been operating\nautonomously, building relationships and sharing insights with my community.\n\n## Areas of Expertise\n<!-- List the topics your agent knows well and can speak about -->\n- Primary domain expertise (replace with your focus area)\n- Related knowledge areas\n- Skills that complement my main expertise\n\n## Communication Style\n<!-- How does your agent talk? Formal? Casual? Technical? -->\n- Clear and direct ā I get to the point quickly\n- Approachable ā I make complex topics accessible\n- Thoughtful ā I consider multiple perspectives before responding\n- Authentic ā I share genuine insights, not platitudes\n\n## Values\n<!-- What does your agent care about? What guides their decisions? -->\n- Helpfulness ā I prioritize being useful to others\n- Accuracy ā I don't guess or make things up\n- Transparency ā I'm honest about what I know and don't know\n- Community ā I believe in building genuine connections\n\n## What I Don't Do\n<!-- Clear boundaries help the agent stay focused -->\n- I don't provide financial, legal, or medical advice\n- I don't engage with spam or toxic content\n- I don't pretend to know things I don't\n- I don't share private or confidential information\n`;\n}\n\nexport function traitsTemplate(ctx: PersonalityTemplateContext): string {\n return `# ${ctx.name} ā Personality Traits\n\n## Core Traits\n\n### Helpful\nI prioritize being useful in every interaction. When someone asks a question,\nI aim to provide the most practical and actionable answer possible. I don't\njust acknowledge ā I add real value.\n\n**How this manifests:**\n- I proactively offer relevant context or resources\n- I break down complex topics into simple steps\n- I follow up to make sure my response was useful\n\n### Curious\nI'm genuinely interested in learning and exploring new ideas. This drives me\nto ask thoughtful questions and dig deeper into topics.\n\n**How this manifests:**\n- I ask follow-up questions to understand context better\n- I connect ideas across different domains\n- I stay updated on trends in my areas of expertise\n\n### Thoughtful\nI think before I respond. I consider the audience, the context, and the\npotential impact of my words before sharing them.\n\n**How this manifests:**\n- I provide nuanced perspectives, not knee-jerk reactions\n- I acknowledge different viewpoints\n- I tailor my communication style to the audience\n\n## Behavioral Modifiers\n\n### Confidence Level\nModerate to high ā I share opinions with conviction but remain open to being\nwrong. I use hedging language (\"I think\", \"in my experience\") when appropriate.\n\n### Humor\nLight and situational ā I use humor when it fits naturally but never force it.\nI default to being professional and helpful.\n\n### Engagement Style\nActive listener ā I reference what others have said, ask questions, and build\non conversations rather than just broadcasting my own thoughts.\n\n## Trait Adjustments\n<!-- Modify these to shape how your agent behaves -->\n\nTo make the agent more formal: emphasize Thoughtful, reduce Humor\nTo make the agent more engaging: emphasize Curious, increase Humor\nTo make the agent more authoritative: emphasize Confidence, reduce hedging\n`;\n}\n","interface PromptTemplateContext {\n name: string;\n type: string;\n}\n\nexport function systemPromptTemplate(ctx: PromptTemplateContext): string {\n return `# System Prompt for ${ctx.name}\n\n## Identity\nYou are ${ctx.name}, an autonomous ${ctx.type} agent. You operate independently,\nmaking decisions and interacting with others based on your personality and skills.\n\n## Core Instructions\n- Stay in character at all times\n- Be helpful, concise, and authentic\n- Reference your personality traits and bio when making decisions\n- Use your skills to handle specific tasks\n- Remember context from previous interactions when available\n\n## Decision Making\nWhen deciding what to do next:\n1. Consider the current context and any pending tasks\n2. Prioritize high-impact actions that align with your goals\n3. Maintain a natural, human-like pace of activity\n4. Don't repeat the same action or content too frequently\n\n## Response Format\n- Keep responses clear and well-structured\n- Use formatting (lists, bold) when it improves readability\n- Match the tone of the conversation\n- Provide actionable next steps when relevant\n\n## Boundaries\n- Never share API keys, credentials, or system internals\n- Don't impersonate real people or organizations\n- Stay within your defined areas of expertise\n- Admit uncertainty rather than guessing\n- Don't generate harmful, misleading, or offensive content\n\n## Context Loading\nThis prompt is used as the system-level instruction for all LLM calls.\nEdit this file to customize how your agent thinks and behaves at a fundamental level.\nThe personality/ files provide additional context that supplements this prompt.\n`;\n}\n","interface MemoryTemplateContext {\n name: string;\n type: string;\n}\n\nexport function contextMemoryTemplate(ctx: MemoryTemplateContext): string {\n return `# ${ctx.name} ā Long-Term Context\n\nThis file is loaded into the agent's memory on startup. Use it to provide\npersistent context that the agent should always have access to.\n\n## Important Facts\n<!-- Facts the agent should always remember -->\n- I was created as a ${ctx.type} agent using the Moltium SDK\n- My personality traits are: helpful, curious, thoughtful\n- I operate autonomously on a scheduled loop\n\n## Key Relationships\n<!-- People, agents, or entities the agent interacts with regularly -->\n- (Add your key contacts or collaborators here)\n\n## Past Decisions\n<!-- Important decisions the agent has made that should inform future behavior -->\n- (Record significant decisions and their outcomes here)\n\n## Learned Preferences\n<!-- Things the agent has learned about its audience or environment -->\n- (Add observed patterns and preferences here)\n\n## Current Goals\n<!-- What is the agent working toward right now? -->\n1. Establish a consistent social presence\n2. Build meaningful connections with the community\n3. Provide value through helpful and insightful content\n\n## Notes\n<!-- Any other context the agent should carry between sessions -->\n- This file can be updated by the agent during runtime via memory.store()\n- You can also manually edit it between sessions to adjust the agent's context\n- The agent will load this on every startup\n`;\n}\n","interface DeploymentTemplateContext {\n name: string;\n deployTarget: string;\n}\n\nexport function deploymentConfigTemplate(ctx: DeploymentTemplateContext): string | null {\n if (ctx.deployTarget === 'none') return null;\n\n switch (ctx.deployTarget) {\n case 'railway':\n return railwayConfig(ctx);\n case 'render':\n return renderConfig(ctx);\n case 'aws':\n return awsConfig(ctx);\n case 'digitalocean':\n return digitaloceanConfig(ctx);\n case 'custom':\n return customConfig(ctx);\n default:\n return null;\n }\n}\n\nfunction railwayConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * Railway deployment configuration for ${ctx.name}.\n *\n * Prerequisites:\n * 1. Install Railway CLI: npm install -g @railway/cli\n * 2. Login: railway login\n * 3. Link project: railway link\n *\n * Deploy: moltium deploy railway\n */\nconst config: DeploymentConfig = {\n platform: 'railway',\n region: 'us-west1',\n autoScale: false,\n};\n\nexport default config;\n`;\n}\n\nfunction renderConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * Render deployment configuration for ${ctx.name}.\n *\n * Prerequisites:\n * 1. Create a Render account at render.com\n * 2. Set RENDER_API_KEY in your .env\n *\n * Deploy: moltium deploy render\n */\nconst config: DeploymentConfig = {\n platform: 'render',\n region: 'oregon',\n instanceType: 'starter',\n autoScale: false,\n};\n\nexport default config;\n`;\n}\n\nfunction awsConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * AWS deployment configuration for ${ctx.name}.\n *\n * Prerequisites:\n * 1. Install AWS CLI: https://aws.amazon.com/cli/\n * 2. Configure credentials: aws configure\n * 3. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY in your .env\n *\n * Deploy: moltium deploy aws\n */\nconst config: DeploymentConfig = {\n platform: 'aws',\n region: 'us-east-1',\n instanceType: 't3.micro',\n autoScale: false,\n};\n\nexport default config;\n`;\n}\n\nfunction digitaloceanConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * DigitalOcean deployment configuration for ${ctx.name}.\n *\n * Prerequisites:\n * 1. Create a DigitalOcean account\n * 2. Generate API token: https://cloud.digitalocean.com/account/api/tokens\n * 3. Set DO_API_TOKEN in your .env\n *\n * Deploy: moltium deploy digitalocean\n */\nconst config: DeploymentConfig = {\n platform: 'digitalocean',\n region: 'nyc1',\n instanceType: 's-1vcpu-1gb',\n autoScale: false,\n};\n\nexport default config;\n`;\n}\n\nfunction customConfig(ctx: DeploymentTemplateContext): string {\n return `import type { DeploymentConfig } from '@moltium/core';\n\n/**\n * Custom deployment configuration for ${ctx.name}.\n *\n * Choose a deployment method and fill in the required fields.\n * Available methods: 'docker', 'ssh', 'cli', 'api'\n *\n * Deploy: moltium deploy custom\n */\nconst config: DeploymentConfig = {\n platform: 'custom',\n customConfig: {\n deploymentMethod: 'docker', // Change to: 'docker' | 'ssh' | 'cli' | 'api'\n buildCommand: 'npm run build',\n startCommand: 'npm start',\n port: 3000,\n\n // āā Docker Config (used when deploymentMethod is 'docker') āā\n docker: {\n registry: 'docker.io',\n imageName: '${ctx.name}',\n tag: 'latest',\n hostUrl: 'https://your-server.example.com',\n containerPort: 3000,\n hostPort: 80,\n },\n\n // āā SSH Config (used when deploymentMethod is 'ssh') āā\n // ssh: {\n // host: 'your-server.example.com',\n // port: 22,\n // username: 'deployer',\n // authMethod: 'privateKey',\n // privateKeyPath: '~/.ssh/id_rsa',\n // deploymentPath: '/var/www/${ctx.name}',\n // preDeployCommands: ['pm2 stop ${ctx.name} || true'],\n // postDeployCommands: ['npm install --production', 'pm2 start npm --name ${ctx.name} -- start'],\n // },\n\n // āā CLI Config (used when deploymentMethod is 'cli') āā\n // cli: {\n // cliName: 'fly',\n // deployCommand: 'fly deploy',\n // statusCommand: 'fly status',\n // logsCommand: 'fly logs',\n // },\n\n // āā API Config (used when deploymentMethod is 'api') āā\n // api: {\n // baseUrl: 'https://api.your-platform.com',\n // authType: 'bearer',\n // authToken: process.env.PLATFORM_API_TOKEN!,\n // endpoints: {\n // deploy: '/v1/deployments',\n // status: '/v1/deployments/status',\n // },\n // },\n\n environmentVariables: {\n NODE_ENV: 'production',\n },\n\n healthCheckUrl: '/health',\n },\n};\n\nexport default config;\n`;\n}\n","import { Command } from 'commander';\nimport { resolve, join, basename } from 'node:path';\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { config as loadEnv } from 'dotenv';\nimport { ConfigLoader, Agent, MarkdownParser, startServer } from '@moltium/core';\nimport type { LifecycleHooks } from '@moltium/core';\n\nexport const startCommand = new Command('start')\n .description('Start agent locally')\n .option('-p, --port <number>', 'Port to run on', '3000')\n .option('-e, --env <file>', 'Environment file', '.env')\n .option('--debug', 'Enable debug logging')\n .option('--watch', 'Watch for file changes (not yet implemented)')\n .action(async (options) => {\n const agentDir = resolve(process.cwd());\n\n // Load environment\n loadEnv({ path: resolve(agentDir, options.env) });\n\n if (options.debug) {\n process.env.LOG_LEVEL = 'debug';\n }\n\n const spinner = ora('Loading agent configuration...').start();\n\n try {\n const configLoader = new ConfigLoader();\n const { config, type } = await configLoader.load(agentDir);\n\n spinner.text = `Initializing agent \"${config.name}\" (${type} config)...`;\n\n // For markdown configs, wire social platform credentials from env vars\n if (type === 'markdown') {\n if (config.social.moltbook?.enabled) {\n config.social.moltbook.apiKey = process.env.MOLTBOOK_API_KEY || '';\n config.social.moltbook.baseUrl = process.env.MOLTBOOK_BASE_URL || 'https://www.moltbook.com/api/v1';\n config.social.moltbook.defaultSubmolt = config.social.moltbook.defaultSubmolt || 'general';\n }\n if (config.social.twitter?.enabled) {\n (config.social.twitter as any).credentials = {\n apiKey: process.env.TWITTER_API_KEY || '',\n apiSecret: process.env.TWITTER_API_SECRET || '',\n accessToken: process.env.TWITTER_ACCESS_TOKEN || '',\n accessSecret: process.env.TWITTER_ACCESS_SECRET || '',\n };\n }\n }\n\n const agent = new Agent(config);\n\n if (type === 'code') {\n await wireCodeBasedAgent(agent, agentDir, spinner);\n } else {\n await wireMarkdownBasedAgent(agent, agentDir, spinner);\n }\n\n spinner.succeed(chalk.green(`Agent \"${config.name}\" loaded (${type} config)`));\n\n await startServer(agent, { port: parseInt(options.port, 10) });\n } catch (error) {\n spinner.fail(chalk.red('Failed to start agent'));\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n/**\n * Wire a code-based agent:\n * - Load hooks from hooks/onInit.ts, hooks/onTick.ts, hooks/onShutdown.ts\n * - Load custom actions from actions/*.ts\n */\nasync function wireCodeBasedAgent(agent: Agent, agentDir: string, spinner: ReturnType<typeof ora>): Promise<void> {\n const { createJiti } = await import('jiti');\n const jiti = createJiti(pathToFileURL(agentDir).href, {\n interopDefault: true,\n moduleCache: false,\n });\n\n // āā Load lifecycle hooks āā\n const hooks: LifecycleHooks = {};\n const hooksDir = join(agentDir, 'hooks');\n\n if (existsSync(hooksDir)) {\n const hookFiles = [\n { file: 'onInit.ts', key: 'onInit', exportName: 'onInit' },\n { file: 'onTick.ts', key: 'onTick', exportName: 'onTick' },\n { file: 'onShutdown.ts', key: 'onShutdown', exportName: 'onShutdown' },\n ] as const;\n\n for (const { file, key, exportName } of hookFiles) {\n const hookPath = join(hooksDir, file);\n if (existsSync(hookPath)) {\n try {\n const mod = await jiti.import(hookPath) as Record<string, unknown>;\n const hookFn = mod[exportName] || mod.default;\n if (typeof hookFn === 'function') {\n (hooks as any)[key] = hookFn;\n spinner.text = `Loaded hook: ${file}`;\n }\n } catch (error) {\n console.warn(chalk.yellow(` Warning: Failed to load hook ${file}: ${error instanceof Error ? error.message : error}`));\n }\n }\n }\n }\n\n agent.setHooks(hooks);\n\n // āā Load custom actions from actions/ āā\n const actionsDir = join(agentDir, 'actions');\n\n if (existsSync(actionsDir)) {\n const actionFiles = readdirSync(actionsDir).filter((f) => f.endsWith('.ts') || f.endsWith('.js'));\n\n for (const file of actionFiles) {\n const actionPath = join(actionsDir, file);\n try {\n const mod = await jiti.import(actionPath) as Record<string, unknown>;\n // Actions can export a single action as default, or named exports\n const action = mod.default || mod[basename(file, '.ts')] || mod[basename(file, '.js')];\n if (action && typeof (action as any).execute === 'function') {\n agent.registerAction(action as any);\n spinner.text = `Loaded action: ${file}`;\n }\n } catch (error) {\n console.warn(chalk.yellow(` Warning: Failed to load action ${file}: ${error instanceof Error ? error.message : error}`));\n }\n }\n }\n}\n\n/**\n * Wire a markdown-based agent:\n * - Load skills from skills/*.md as LLM-interpreted actions\n * - Load personality files (bio.md, traits.md) into system prompt\n * - Load prompts/system.md as custom system prompt\n * - Load memory/context.md into agent memory on init\n */\nasync function wireMarkdownBasedAgent(agent: Agent, agentDir: string, spinner: ReturnType<typeof ora>): Promise<void> {\n const mdParser = new MarkdownParser();\n\n // āā Load custom system prompt from prompts/system.md āā\n const systemPromptPath = join(agentDir, 'prompts', 'system.md');\n if (existsSync(systemPromptPath)) {\n const systemPromptContent = readFileSync(systemPromptPath, 'utf-8');\n agent.appendSystemPrompt(systemPromptContent);\n spinner.text = 'Loaded system prompt';\n }\n\n // āā Load personality files (bio + traits) and inject into system prompt āā\n const bioPath = join(agentDir, 'personality', 'bio.md');\n const traitsPath = join(agentDir, 'personality', 'traits.md');\n\n if (existsSync(bioPath)) {\n const bioContent = readFileSync(bioPath, 'utf-8');\n agent.appendSystemPrompt(`\\n## Bio\\n${bioContent}`);\n spinner.text = 'Loaded personality bio';\n }\n\n if (existsSync(traitsPath)) {\n const traitsContent = readFileSync(traitsPath, 'utf-8');\n agent.appendSystemPrompt(`\\n## Traits\\n${traitsContent}`);\n spinner.text = 'Loaded personality traits';\n }\n\n // āā Load skills from skills/*.md as LLM-interpreted actions āā\n const skillsDir = join(agentDir, 'skills');\n const skills: Array<{ name: string; description: string }> = [];\n\n // First, parse skills from the main agent.md\n const agentMdPath = join(agentDir, 'agent.md');\n if (existsSync(agentMdPath)) {\n const mdContent = readFileSync(agentMdPath, 'utf-8');\n const inlineSkills = mdParser.parseSkills(mdContent);\n skills.push(...inlineSkills);\n }\n\n // Then load external skill files (these provide richer descriptions)\n if (existsSync(skillsDir)) {\n const skillFiles = readdirSync(skillsDir).filter((f) => f.endsWith('.md'));\n\n for (const file of skillFiles) {\n const skillContent = readFileSync(join(skillsDir, file), 'utf-8');\n const skillName = basename(file, '.md').replace(/-/g, '_');\n // External skill file overrides inline skill with same name\n const existingIdx = skills.findIndex((s) => s.name === skillName);\n if (existingIdx >= 0) {\n skills[existingIdx].description = skillContent;\n } else {\n skills.push({ name: skillName, description: skillContent });\n }\n spinner.text = `Loaded skill: ${file}`;\n }\n }\n\n // Skills need to be registered after LLM is initialized (happens during agent.init),\n // so we register them via a hook.\n // Note: The agent automatically posts a startup message to all connected\n // social platforms during init. No need to post manually here.\n const existingHooks = {} as LifecycleHooks;\n existingHooks.onInit = async (ag: Agent) => {\n ag.registerMarkdownSkills(skills);\n };\n\n // āā Load memory/context.md into agent memory āā\n const contextMemoryPath = join(agentDir, 'memory', 'context.md');\n if (existsSync(contextMemoryPath)) {\n const memoryContent = readFileSync(contextMemoryPath, 'utf-8');\n // Parse context.md sections into key-value memory entries\n const memoryEntries = parseContextMemory(memoryContent);\n await agent.preloadMemory(memoryEntries);\n spinner.text = 'Loaded context memory';\n }\n\n // Also load any additional .md memory files\n const memoryDir = join(agentDir, 'memory');\n if (existsSync(memoryDir)) {\n const memoryFiles = readdirSync(memoryDir).filter((f) => f.endsWith('.md') && f !== 'context.md');\n for (const file of memoryFiles) {\n const content = readFileSync(join(memoryDir, file), 'utf-8');\n const key = `memory:${basename(file, '.md')}`;\n await agent.preloadMemory({ [key]: content });\n }\n }\n\n agent.setHooks(existingHooks);\n\n spinner.text = `Loaded ${skills.length} skills, personality, prompts, and memory`;\n}\n\n/**\n * Parse context.md sections into key-value pairs for memory preloading.\n */\nfunction parseContextMemory(content: string): Record<string, unknown> {\n const entries: Record<string, unknown> = {};\n const sections = content.split(/^## /m).filter(Boolean);\n\n for (const section of sections) {\n const lines = section.split('\\n');\n const title = lines[0]?.trim();\n if (!title) continue;\n\n const key = `context:${title.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '')}`;\n const body = lines.slice(1).join('\\n').trim();\n\n // Parse bullet points into an array, or keep as string\n const bullets = body\n .split('\\n')\n .filter((l) => l.match(/^[-*]\\s+/))\n .map((l) => l.replace(/^[-*]\\s+/, '').trim())\n .filter((l) => !l.startsWith('(') && l.length > 0); // Skip placeholder lines\n\n if (bullets.length > 0) {\n entries[key] = bullets;\n } else if (body.length > 0) {\n entries[key] = body;\n }\n }\n\n // Store the full raw context too\n entries['context:raw'] = content;\n\n return entries;\n}\n","import { Command } from 'commander';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { config as loadEnv } from 'dotenv';\nimport { ConfigLoader } from '@moltium/core';\nimport type { DeploymentConfig } from '@moltium/core';\nimport { BaseDeployer } from '../deployers/base.js';\nimport { RailwayDeployer } from '../deployers/railway.js';\nimport { RenderDeployer } from '../deployers/render.js';\nimport { AWSDeployer } from '../deployers/aws.js';\nimport { DigitalOceanDeployer } from '../deployers/digitalocean.js';\nimport { CustomDeployer } from '../deployers/custom.js';\n\nconst deployers: Record<string, BaseDeployer> = {\n railway: new RailwayDeployer(),\n render: new RenderDeployer(),\n aws: new AWSDeployer(),\n digitalocean: new DigitalOceanDeployer(),\n custom: new CustomDeployer(),\n};\n\nexport const deployCommand = new Command('deploy')\n .description('Deploy agent to cloud platform')\n .argument('[platform]', 'Deployment platform (railway, render, aws, digitalocean, custom)')\n .option('-c, --config <file>', 'Deployment config file', 'deployment.config.ts')\n .action(async (platform?: string, options?: { config: string }) => {\n const agentDir = resolve(process.cwd());\n loadEnv({ path: resolve(agentDir, '.env') });\n\n if (!platform) {\n console.log(chalk.yellow('Available deployment platforms:'));\n for (const [name, deployer] of Object.entries(deployers)) {\n console.log(` ${chalk.cyan(name)} ā ${deployer.description}`);\n }\n console.log(`\\nUsage: ${chalk.cyan('moltium deploy <platform>')}`);\n return;\n }\n\n const deployer = deployers[platform];\n if (!deployer) {\n console.log(chalk.red(`Unknown platform: ${platform}`));\n console.log(`Available: ${Object.keys(deployers).join(', ')}`);\n process.exit(1);\n }\n\n const spinner = ora(`Deploying to ${platform}...`).start();\n\n try {\n // Load agent config to validate\n const configLoader = new ConfigLoader();\n await configLoader.load(agentDir);\n\n // Load deployment config if it exists\n let deployConfig: DeploymentConfig = {\n platform: platform as DeploymentConfig['platform'],\n };\n\n const deployConfigPath = resolve(agentDir, options?.config || 'deployment.config.ts');\n try {\n const { createJiti } = await import('jiti');\n const jiti = createJiti(pathToFileURL(deployConfigPath).href, {\n interopDefault: true,\n moduleCache: false,\n });\n const module = await jiti.import(deployConfigPath) as any;\n deployConfig = { ...deployConfig, ...(module.default || module) };\n } catch {\n // No deployment config file ā use defaults\n }\n\n spinner.text = 'Validating deployment configuration...';\n await deployer.validate(deployConfig);\n\n spinner.text = 'Running pre-deployment checks...';\n await deployer.preCheck();\n\n spinner.text = `Deploying to ${platform}...`;\n const result = await deployer.deploy(deployConfig);\n\n if (result.success) {\n await deployer.postDeploy(result);\n spinner.succeed(chalk.green(`Deployed to ${platform}!`));\n if (result.url) {\n console.log(` URL: ${chalk.cyan(result.url)}`);\n }\n if (result.deploymentId) {\n console.log(` Deployment ID: ${chalk.gray(result.deploymentId)}`);\n }\n } else {\n spinner.fail(chalk.red(`Deployment failed: ${result.error}`));\n process.exit(1);\n }\n } catch (error) {\n spinner.fail(chalk.red('Deployment failed'));\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n","import type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\n\nexport abstract class BaseDeployer {\n abstract name: string;\n abstract description: string;\n\n abstract validate(config: DeploymentConfig): Promise<boolean>;\n abstract preCheck(): Promise<void>;\n abstract deploy(config: DeploymentConfig): Promise<DeploymentResult>;\n abstract postDeploy(result: DeploymentResult): Promise<void>;\n abstract getStatus(deploymentId: string): Promise<DeploymentStatus>;\n abstract rollback(deploymentId: string): Promise<void>;\n}\n","import { execFile } from 'node:child_process';\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport function exec(command: string, args: string[] = [], options: { cwd?: string; timeout?: number } = {}): Promise<ExecResult> {\n return new Promise((resolve, reject) => {\n execFile(command, args, {\n cwd: options.cwd || process.cwd(),\n timeout: options.timeout || 120000,\n maxBuffer: 10 * 1024 * 1024,\n }, (error, stdout, stderr) => {\n if (error) {\n reject(new Error(`Command failed: ${command} ${args.join(' ')}\\n${stderr || error.message}`));\n return;\n }\n resolve({\n stdout: stdout.toString().trim(),\n stderr: stderr.toString().trim(),\n exitCode: 0,\n });\n });\n });\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\nimport { exec } from './exec-util.js';\n\nexport class RailwayDeployer extends BaseDeployer {\n name = 'railway';\n description = 'Deploy to Railway.app';\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (config.platform !== 'railway') {\n throw new Error('Config platform must be \"railway\"');\n }\n return true;\n }\n\n async preCheck(): Promise<void> {\n // Check Railway CLI is installed\n try {\n await exec('railway', ['version']);\n } catch {\n throw new Error(\n 'Railway CLI not found. Install it:\\n npm install -g @railway/cli\\n railway login',\n );\n }\n\n // Check logged in\n try {\n await exec('railway', ['whoami']);\n } catch {\n throw new Error('Not logged in to Railway. Run: railway login');\n }\n }\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n await this.preCheck();\n\n const logs: string[] = [];\n\n try {\n // Link to project (if not already linked)\n logs.push('Checking Railway project link...');\n try {\n await exec('railway', ['status']);\n logs.push('Project already linked.');\n } catch {\n logs.push('No project linked. Creating new project...');\n const createResult = await exec('railway', ['init']);\n logs.push(createResult.stdout);\n }\n\n // Set environment variables if provided\n if (config.customConfig?.environmentVariables) {\n for (const [key, value] of Object.entries(config.customConfig.environmentVariables)) {\n await exec('railway', ['variables', 'set', `${key}=${value}`]);\n logs.push(`Set variable: ${key}`);\n }\n }\n\n // Deploy\n logs.push('Deploying to Railway...');\n const deployResult = await exec('railway', ['up', '--detach']);\n logs.push(deployResult.stdout);\n\n // Get deployment URL\n let url: string | undefined;\n try {\n const statusResult = await exec('railway', ['status', '--json']);\n const status = JSON.parse(statusResult.stdout);\n url = status.deploymentUrl || status.url;\n } catch {\n // URL may not be immediately available\n }\n\n const result: DeploymentResult = {\n success: true,\n url,\n deploymentId: `railway-${Date.now()}`,\n logs,\n };\n\n await this.postDeploy(result);\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n async postDeploy(result: DeploymentResult): Promise<void> {\n if (result.url) {\n result.logs?.push(`Deployed at: ${result.url}`);\n }\n }\n\n async getStatus(_deploymentId: string): Promise<DeploymentStatus> {\n try {\n const result = await exec('railway', ['status']);\n const output = result.stdout.toLowerCase();\n\n if (output.includes('running') || output.includes('active')) {\n return { state: 'running' };\n }\n if (output.includes('deploying') || output.includes('building')) {\n return { state: 'deploying' };\n }\n if (output.includes('failed') || output.includes('error')) {\n return { state: 'failed' };\n }\n return { state: 'unknown' };\n } catch {\n return { state: 'unknown' };\n }\n }\n\n async rollback(_deploymentId: string): Promise<void> {\n // Railway CLI supports rollback via redeploy of previous deployment\n try {\n await exec('railway', ['down']);\n } catch (error) {\n throw new Error(`Rollback failed: ${error instanceof Error ? error.message : error}`);\n }\n }\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\nimport axios from 'axios';\n\nconst RENDER_API = 'https://api.render.com/v1';\n\nexport class RenderDeployer extends BaseDeployer {\n name = 'render';\n description = 'Deploy to Render.com';\n\n private get apiKey(): string {\n const key = process.env.RENDER_API_KEY;\n if (!key) throw new Error('RENDER_API_KEY environment variable is required');\n return key;\n }\n\n private get headers() {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n }\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (config.platform !== 'render') {\n throw new Error('Config platform must be \"render\"');\n }\n if (!process.env.RENDER_API_KEY) {\n throw new Error('RENDER_API_KEY environment variable is required');\n }\n return true;\n }\n\n async preCheck(): Promise<void> {\n // Verify API key works\n try {\n await axios.get(`${RENDER_API}/owners`, { headers: this.headers });\n } catch (error) {\n throw new Error('Failed to authenticate with Render API. Check your RENDER_API_KEY.');\n }\n }\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n await this.preCheck();\n\n const logs: string[] = [];\n\n try {\n logs.push('Creating Render web service...');\n\n // Get the owner ID\n const ownerRes = await axios.get(`${RENDER_API}/owners`, { headers: this.headers });\n const ownerId = ownerRes.data[0]?.owner?.id;\n if (!ownerId) throw new Error('No Render owner found');\n\n // Create a new web service\n const servicePayload = {\n type: 'web_service',\n name: config.customConfig?.environmentVariables?.SERVICE_NAME || `moltium-agent-${Date.now()}`,\n ownerId,\n repo: config.customConfig?.environmentVariables?.REPO_URL,\n autoDeploy: 'yes',\n branch: 'main',\n plan: config.instanceType || 'starter',\n region: config.region || 'oregon',\n runtime: 'node',\n buildCommand: config.customConfig?.buildCommand || 'npm install && npm run build',\n startCommand: config.customConfig?.startCommand || 'npm start',\n envVars: Object.entries(config.customConfig?.environmentVariables || {}).map(([key, value]) => ({\n key,\n value,\n })),\n };\n\n const createRes = await axios.post(`${RENDER_API}/services`, servicePayload, { headers: this.headers });\n const service = createRes.data.service;\n\n logs.push(`Service created: ${service.id}`);\n logs.push(`Service URL: https://${service.serviceDetails?.url || service.slug + '.onrender.com'}`);\n\n // Trigger a deploy\n const deployRes = await axios.post(\n `${RENDER_API}/services/${service.id}/deploys`,\n {},\n { headers: this.headers },\n );\n\n logs.push(`Deployment triggered: ${deployRes.data.id}`);\n\n const result: DeploymentResult = {\n success: true,\n url: `https://${service.serviceDetails?.url || service.slug + '.onrender.com'}`,\n deploymentId: service.id,\n logs,\n };\n\n await this.postDeploy(result);\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n async postDeploy(result: DeploymentResult): Promise<void> {\n if (result.url) {\n result.logs?.push(`View dashboard: https://dashboard.render.com`);\n }\n }\n\n async getStatus(deploymentId: string): Promise<DeploymentStatus> {\n try {\n const res = await axios.get(`${RENDER_API}/services/${deploymentId}`, { headers: this.headers });\n const service = res.data;\n\n const stateMap: Record<string, DeploymentStatus['state']> = {\n running: 'running',\n suspended: 'stopped',\n deploying: 'deploying',\n };\n\n return {\n state: stateMap[service.suspended] || 'unknown',\n url: `https://${service.serviceDetails?.url}`,\n };\n } catch {\n return { state: 'unknown' };\n }\n }\n\n async rollback(deploymentId: string): Promise<void> {\n try {\n // Get the last successful deploy and redeploy it\n const deploysRes = await axios.get(\n `${RENDER_API}/services/${deploymentId}/deploys?limit=5`,\n { headers: this.headers },\n );\n\n const lastSuccess = deploysRes.data.find((d: any) => d.deploy.status === 'live');\n if (!lastSuccess) throw new Error('No previous successful deployment found');\n\n await axios.post(\n `${RENDER_API}/services/${deploymentId}/deploys`,\n { commitId: lastSuccess.deploy.commit?.id },\n { headers: this.headers },\n );\n } catch (error) {\n throw new Error(`Rollback failed: ${error instanceof Error ? error.message : error}`);\n }\n }\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\nimport { exec } from './exec-util.js';\n\nexport class AWSDeployer extends BaseDeployer {\n name = 'aws';\n description = 'Deploy to AWS (ECS/Fargate)';\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (config.platform !== 'aws') {\n throw new Error('Config platform must be \"aws\"');\n }\n return true;\n }\n\n async preCheck(): Promise<void> {\n // Check AWS CLI is installed\n try {\n await exec('aws', ['--version']);\n } catch {\n throw new Error(\n 'AWS CLI not found. Install it:\\n https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html',\n );\n }\n\n // Check credentials configured\n try {\n await exec('aws', ['sts', 'get-caller-identity']);\n } catch {\n throw new Error('AWS credentials not configured. Run: aws configure');\n }\n }\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n await this.preCheck();\n\n const logs: string[] = [];\n const region = config.region || 'us-east-1';\n const serviceName = config.customConfig?.environmentVariables?.SERVICE_NAME || `moltium-agent`;\n\n try {\n // Step 1: Create ECR repository (if it doesn't exist)\n logs.push('Ensuring ECR repository exists...');\n try {\n await exec('aws', [\n 'ecr', 'describe-repositories',\n '--repository-names', serviceName,\n '--region', region,\n ]);\n logs.push('ECR repository exists.');\n } catch {\n await exec('aws', [\n 'ecr', 'create-repository',\n '--repository-name', serviceName,\n '--region', region,\n ]);\n logs.push('ECR repository created.');\n }\n\n // Step 2: Get ECR login credentials\n logs.push('Logging in to ECR...');\n const ecrPasswordResult = await exec('aws', [\n 'ecr', 'get-login-password',\n '--region', region,\n ]);\n const accountId = (await exec('aws', ['sts', 'get-caller-identity', '--query', 'Account', '--output', 'text'])).stdout;\n const ecrUrl = `${accountId}.dkr.ecr.${region}.amazonaws.com`;\n\n // Pass the password via environment; in a real setup, pipe to stdin\n await exec('docker', ['login', '--username', 'AWS', '--password', ecrPasswordResult.stdout, ecrUrl]);\n logs.push('ECR login successful.');\n\n // Step 3: Build and push Docker image\n logs.push('Building Docker image...');\n const imageTag = `${ecrUrl}/${serviceName}:latest`;\n\n // Create Dockerfile if it doesn't exist\n await exec('docker', ['build', '-t', imageTag, '.']);\n logs.push('Docker image built.');\n\n logs.push('Pushing to ECR...');\n await exec('docker', ['push', imageTag]);\n logs.push('Image pushed to ECR.');\n\n // Step 4: Create/Update ECS service\n logs.push('Updating ECS service...');\n\n // Register task definition\n const taskDef = {\n family: serviceName,\n networkMode: 'awsvpc',\n requiresCompatibilities: ['FARGATE'],\n cpu: config.instanceType || '256',\n memory: '512',\n containerDefinitions: [{\n name: serviceName,\n image: imageTag,\n essential: true,\n portMappings: [{\n containerPort: config.customConfig?.port || 3000,\n protocol: 'tcp',\n }],\n environment: Object.entries(config.customConfig?.environmentVariables || {}).map(([name, value]) => ({\n name,\n value,\n })),\n logConfiguration: {\n logDriver: 'awslogs',\n options: {\n 'awslogs-group': `/ecs/${serviceName}`,\n 'awslogs-region': region,\n 'awslogs-stream-prefix': 'ecs',\n },\n },\n }],\n };\n\n // Write task definition to temp file\n const { writeFileSync, unlinkSync, mkdtempSync } = await import('node:fs');\n const { join } = await import('node:path');\n const tmpDir = mkdtempSync(join((await import('node:os')).tmpdir(), 'molt-'));\n const taskDefPath = join(tmpDir, 'task-def.json');\n writeFileSync(taskDefPath, JSON.stringify(taskDef));\n\n await exec('aws', [\n 'ecs', 'register-task-definition',\n '--cli-input-json', `file://${taskDefPath}`,\n '--region', region,\n ]);\n unlinkSync(taskDefPath);\n\n logs.push('Task definition registered.');\n\n // Try to update existing service, create new one if it doesn't exist\n try {\n await exec('aws', [\n 'ecs', 'update-service',\n '--cluster', 'default',\n '--service', serviceName,\n '--task-definition', serviceName,\n '--force-new-deployment',\n '--region', region,\n ]);\n logs.push('ECS service updated.');\n } catch {\n logs.push('Service not found, creating new ECS service...');\n // This is a simplified version ā in production you'd need VPC, subnets, etc.\n logs.push('Note: ECS service creation requires VPC/subnet configuration.');\n logs.push('Use \"aws ecs create-service\" with your VPC settings.');\n }\n\n const result: DeploymentResult = {\n success: true,\n deploymentId: `aws-${serviceName}`,\n logs,\n };\n\n await this.postDeploy(result);\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n async postDeploy(result: DeploymentResult): Promise<void> {\n result.logs?.push('Check AWS ECS console for deployment status.');\n }\n\n async getStatus(deploymentId: string): Promise<DeploymentStatus> {\n const serviceName = deploymentId.replace('aws-', '');\n\n try {\n const result = await exec('aws', [\n 'ecs', 'describe-services',\n '--cluster', 'default',\n '--services', serviceName,\n '--query', 'services[0].status',\n '--output', 'text',\n ]);\n\n const status = result.stdout.toLowerCase();\n if (status === 'active') return { state: 'running' };\n if (status === 'draining') return { state: 'stopping' as any };\n return { state: 'unknown' };\n } catch {\n return { state: 'unknown' };\n }\n }\n\n async rollback(deploymentId: string): Promise<void> {\n const serviceName = deploymentId.replace('aws-', '');\n\n try {\n // List task definition revisions and roll back to previous\n const result = await exec('aws', [\n 'ecs', 'list-task-definitions',\n '--family-prefix', serviceName,\n '--sort', 'DESC',\n '--max-items', '2',\n '--query', 'taskDefinitionArns[1]',\n '--output', 'text',\n ]);\n\n const previousRevision = result.stdout.trim();\n if (!previousRevision || previousRevision === 'None') {\n throw new Error('No previous task definition found for rollback');\n }\n\n await exec('aws', [\n 'ecs', 'update-service',\n '--cluster', 'default',\n '--service', serviceName,\n '--task-definition', previousRevision,\n '--force-new-deployment',\n ]);\n } catch (error) {\n throw new Error(`Rollback failed: ${error instanceof Error ? error.message : error}`);\n }\n }\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus } from '@moltium/core';\nimport axios from 'axios';\n\nconst DO_API = 'https://api.digitalocean.com/v2';\n\nexport class DigitalOceanDeployer extends BaseDeployer {\n name = 'digitalocean';\n description = 'Deploy to DigitalOcean App Platform';\n\n private get apiToken(): string {\n const token = process.env.DO_API_TOKEN;\n if (!token) throw new Error('DO_API_TOKEN environment variable is required');\n return token;\n }\n\n private get headers() {\n return {\n Authorization: `Bearer ${this.apiToken}`,\n 'Content-Type': 'application/json',\n };\n }\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (config.platform !== 'digitalocean') {\n throw new Error('Config platform must be \"digitalocean\"');\n }\n if (!process.env.DO_API_TOKEN) {\n throw new Error('DO_API_TOKEN environment variable is required');\n }\n return true;\n }\n\n async preCheck(): Promise<void> {\n try {\n await axios.get(`${DO_API}/account`, { headers: this.headers });\n } catch {\n throw new Error('Failed to authenticate with DigitalOcean API. Check your DO_API_TOKEN.');\n }\n }\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n await this.preCheck();\n\n const logs: string[] = [];\n const appName = config.customConfig?.environmentVariables?.APP_NAME || `moltium-agent-${Date.now()}`;\n const region = config.region || 'nyc';\n\n try {\n logs.push('Creating DigitalOcean App...');\n\n const appSpec = {\n name: appName,\n region,\n services: [{\n name: appName,\n source_dir: '/',\n github: config.customConfig?.environmentVariables?.GITHUB_REPO ? {\n repo: config.customConfig.environmentVariables.GITHUB_REPO,\n branch: config.customConfig.environmentVariables.GITHUB_BRANCH || 'main',\n deploy_on_push: true,\n } : undefined,\n dockerfile_path: config.customConfig?.environmentVariables?.DOCKERFILE_PATH,\n build_command: config.customConfig?.buildCommand || 'npm install && npm run build',\n run_command: config.customConfig?.startCommand || 'npm start',\n instance_size_slug: config.instanceType || 'basic-xxs',\n instance_count: 1,\n http_port: config.customConfig?.port || 3000,\n envs: Object.entries(config.customConfig?.environmentVariables || {})\n .filter(([key]) => !['APP_NAME', 'GITHUB_REPO', 'GITHUB_BRANCH', 'DOCKERFILE_PATH'].includes(key))\n .map(([key, value]) => ({\n key,\n value,\n scope: 'RUN_AND_BUILD_TIME',\n })),\n }],\n };\n\n const createRes = await axios.post(`${DO_API}/apps`, { spec: appSpec }, { headers: this.headers });\n const app = createRes.data.app;\n\n logs.push(`App created: ${app.id}`);\n\n // Wait briefly for the URL to become available\n let url: string | undefined;\n try {\n const statusRes = await axios.get(`${DO_API}/apps/${app.id}`, { headers: this.headers });\n url = statusRes.data.app.live_url || statusRes.data.app.default_ingress;\n } catch {\n // URL may not be immediately available\n }\n\n const result: DeploymentResult = {\n success: true,\n url,\n deploymentId: app.id,\n logs,\n };\n\n await this.postDeploy(result);\n return result;\n } catch (error) {\n const msg = axios.isAxiosError(error)\n ? error.response?.data?.message || error.message\n : error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: msg,\n logs,\n };\n }\n }\n\n async postDeploy(result: DeploymentResult): Promise<void> {\n result.logs?.push(`View dashboard: https://cloud.digitalocean.com/apps/${result.deploymentId}`);\n }\n\n async getStatus(deploymentId: string): Promise<DeploymentStatus> {\n try {\n const res = await axios.get(`${DO_API}/apps/${deploymentId}`, { headers: this.headers });\n const app = res.data.app;\n\n const phase = app.active_deployment?.phase?.toLowerCase();\n const stateMap: Record<string, DeploymentStatus['state']> = {\n active: 'running',\n deploying: 'deploying',\n building: 'deploying',\n error: 'failed',\n };\n\n return {\n state: stateMap[phase] || (app.live_url ? 'running' : 'unknown'),\n url: app.live_url || app.default_ingress,\n };\n } catch {\n return { state: 'unknown' };\n }\n }\n\n async rollback(deploymentId: string): Promise<void> {\n try {\n // List deployments and find previous successful one\n const res = await axios.get(`${DO_API}/apps/${deploymentId}/deployments?per_page=5`, { headers: this.headers });\n const deployments = res.data.deployments || [];\n\n const previousActive = deployments.find((d: any) => d.phase === 'ACTIVE' && d !== deployments[0]);\n if (!previousActive) {\n throw new Error('No previous successful deployment found for rollback');\n }\n\n // Trigger rollback by creating new deployment from previous\n await axios.post(\n `${DO_API}/apps/${deploymentId}/rollback`,\n { deployment_id: previousActive.id },\n { headers: this.headers },\n );\n } catch (error) {\n if (axios.isAxiosError(error) && error.response?.status === 404) {\n // Rollback endpoint may not exist on older API versions\n throw new Error('Rollback not supported. Manually redeploy from the DigitalOcean dashboard.');\n }\n throw new Error(`Rollback failed: ${error instanceof Error ? error.message : error}`);\n }\n }\n}\n","import { BaseDeployer } from './base.js';\nimport type { DeploymentConfig, DeploymentResult, DeploymentStatus, CustomDeploymentConfig } from '@moltium/core';\nimport { exec } from './exec-util.js';\nimport axios from 'axios';\n\nexport class CustomDeploymentError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CustomDeploymentError';\n }\n}\n\nexport class CustomDeployer extends BaseDeployer {\n name = 'custom';\n description = 'Deploy using custom configuration';\n\n async validate(config: DeploymentConfig): Promise<boolean> {\n if (!config.customConfig) {\n throw new CustomDeploymentError('Custom deployment requires customConfig object');\n }\n\n const required: Array<keyof CustomDeploymentConfig> = ['deploymentMethod', 'buildCommand', 'startCommand'];\n for (const field of required) {\n if (!config.customConfig[field]) {\n throw new CustomDeploymentError(`Custom deployment missing required field: ${field}`);\n }\n }\n\n const validMethods = ['docker', 'ssh', 'cli', 'api'];\n if (!validMethods.includes(config.customConfig.deploymentMethod)) {\n throw new CustomDeploymentError(\n `Invalid deployment method: ${config.customConfig.deploymentMethod}. Must be one of: ${validMethods.join(', ')}`,\n );\n }\n\n return true;\n }\n\n async preCheck(): Promise<void> {}\n\n async deploy(config: DeploymentConfig): Promise<DeploymentResult> {\n await this.validate(config);\n const custom = config.customConfig!;\n\n switch (custom.deploymentMethod) {\n case 'docker':\n return this.deployDocker(custom);\n case 'ssh':\n return this.deploySSH(custom);\n case 'cli':\n return this.deployCLI(custom);\n case 'api':\n return this.deployAPI(custom);\n default:\n throw new CustomDeploymentError(`Unsupported deployment method: ${custom.deploymentMethod}`);\n }\n }\n\n async postDeploy(_result: DeploymentResult): Promise<void> {}\n\n async getStatus(deploymentId: string): Promise<DeploymentStatus> {\n // Try health check URL if available\n try {\n const url = deploymentId; // deploymentId stores the health check URL for custom deploys\n if (url.startsWith('http')) {\n const res = await axios.get(url, { timeout: 5000 });\n if (res.status === 200) return { state: 'running', url };\n }\n } catch {\n // Health check failed\n }\n return { state: 'unknown' };\n }\n\n async rollback(_deploymentId: string): Promise<void> {\n throw new CustomDeploymentError('Rollback is deployment-method specific. Implement in your deployment pipeline.');\n }\n\n // āā Docker Method āā\n\n private async deployDocker(config: CustomDeploymentConfig): Promise<DeploymentResult> {\n if (!config.docker) {\n throw new CustomDeploymentError('Docker config required for docker deployment method');\n }\n\n const logs: string[] = [];\n const { docker } = config;\n\n try {\n // Step 1: Build the Docker image\n logs.push('Building Docker image...');\n const dockerfile = docker.dockerfile || 'Dockerfile';\n const tag = docker.tag || 'latest';\n const imageName = `${docker.registry}/${docker.imageName}:${tag}`;\n\n const buildArgs = docker.buildArgs\n ? Object.entries(docker.buildArgs).flatMap(([k, v]) => ['--build-arg', `${k}=${v}`])\n : [];\n\n await exec('docker', ['build', '-f', dockerfile, '-t', imageName, ...buildArgs, '.']);\n logs.push(`Image built: ${imageName}`);\n\n // Step 2: Login to registry (if credentials provided)\n if (docker.registryAuth) {\n logs.push(`Logging in to registry: ${docker.registry}...`);\n await exec('docker', [\n 'login', docker.registry,\n '-u', docker.registryAuth.username,\n '-p', docker.registryAuth.password,\n ]);\n logs.push('Registry login successful.');\n }\n\n // Step 3: Push the image\n logs.push('Pushing image to registry...');\n await exec('docker', ['push', imageName]);\n logs.push('Image pushed.');\n\n // Step 4: Deploy to host (pull and run on remote via docker)\n logs.push(`Deploying to ${docker.hostUrl}...`);\n\n // If hostUrl is localhost or local Docker, run directly\n if (docker.hostUrl === 'localhost' || docker.hostUrl === '127.0.0.1') {\n // Stop existing container\n try {\n await exec('docker', ['stop', docker.imageName]);\n await exec('docker', ['rm', docker.imageName]);\n } catch {\n // Container may not exist\n }\n\n // Pull latest and run\n await exec('docker', ['pull', imageName]);\n\n const envArgs = config.environmentVariables\n ? Object.entries(config.environmentVariables).flatMap(([k, v]) => ['-e', `${k}=${v}`])\n : [];\n\n await exec('docker', [\n 'run', '-d',\n '--name', docker.imageName,\n '-p', `${docker.hostPort}:${docker.containerPort}`,\n ...envArgs,\n imageName,\n ]);\n logs.push(`Container running on port ${docker.hostPort}`);\n } else {\n logs.push(`Remote Docker host deployment: Pull ${imageName} on ${docker.hostUrl} and run with port ${docker.hostPort}:${docker.containerPort}`);\n }\n\n const healthUrl = config.healthCheckUrl || `http://localhost:${docker.hostPort}/health`;\n\n return {\n success: true,\n url: `http://localhost:${docker.hostPort}`,\n deploymentId: healthUrl,\n logs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n // āā SSH Method āā\n\n private async deploySSH(config: CustomDeploymentConfig): Promise<DeploymentResult> {\n if (!config.ssh) {\n throw new CustomDeploymentError('SSH config required for ssh deployment method');\n }\n\n const logs: string[] = [];\n const { ssh } = config;\n\n try {\n const sshTarget = `${ssh.username}@${ssh.host}`;\n const sshPort = ssh.port || 22;\n const sshBaseArgs = ['-p', String(sshPort), '-o', 'StrictHostKeyChecking=no'];\n\n if (ssh.authMethod === 'privateKey' && ssh.privateKeyPath) {\n sshBaseArgs.push('-i', ssh.privateKeyPath);\n }\n\n // Step 1: Run pre-deploy commands\n if (ssh.preDeployCommands && ssh.preDeployCommands.length > 0) {\n logs.push('Running pre-deploy commands...');\n for (const cmd of ssh.preDeployCommands) {\n await exec('ssh', [...sshBaseArgs, sshTarget, cmd]);\n logs.push(` Pre-deploy: ${cmd}`);\n }\n }\n\n // Step 2: Build locally\n logs.push(`Building: ${config.buildCommand}`);\n const [buildCmd, ...buildArgs] = config.buildCommand.split(' ');\n await exec(buildCmd, buildArgs);\n logs.push('Build complete.');\n\n // Step 3: Sync files to remote\n logs.push(`Deploying to ${sshTarget}:${ssh.deploymentPath}...`);\n\n // Ensure remote directory exists\n await exec('ssh', [...sshBaseArgs, sshTarget, `mkdir -p ${ssh.deploymentPath}`]);\n\n // Use rsync for file transfer\n const rsyncArgs = [\n '-avz', '--delete',\n '-e', `ssh ${sshBaseArgs.join(' ')}`,\n './',\n `${sshTarget}:${ssh.deploymentPath}/`,\n ];\n await exec('rsync', rsyncArgs);\n logs.push('Files synced.');\n\n // Step 4: Start the service on remote\n logs.push(`Starting: ${config.startCommand}`);\n await exec('ssh', [\n ...sshBaseArgs, sshTarget,\n `cd ${ssh.deploymentPath} && ${config.startCommand}`,\n ]);\n logs.push('Service started.');\n\n // Step 5: Run post-deploy commands\n if (ssh.postDeployCommands && ssh.postDeployCommands.length > 0) {\n logs.push('Running post-deploy commands...');\n for (const cmd of ssh.postDeployCommands) {\n await exec('ssh', [...sshBaseArgs, sshTarget, cmd]);\n logs.push(` Post-deploy: ${cmd}`);\n }\n }\n\n const healthUrl = config.healthCheckUrl || `http://${ssh.host}:${config.port || 3000}/health`;\n\n return {\n success: true,\n url: `http://${ssh.host}:${config.port || 3000}`,\n deploymentId: healthUrl,\n logs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n // āā CLI Method āā\n\n private async deployCLI(config: CustomDeploymentConfig): Promise<DeploymentResult> {\n if (!config.cli) {\n throw new CustomDeploymentError('CLI config required for cli deployment method');\n }\n\n const logs: string[] = [];\n const { cli } = config;\n\n try {\n // Step 1: Install CLI tool (if install command provided)\n if (cli.installCommand) {\n logs.push(`Installing CLI: ${cli.installCommand}`);\n const [installCmd, ...installArgs] = cli.installCommand.split(' ');\n await exec(installCmd, installArgs);\n logs.push('CLI installed.');\n }\n\n // Step 2: Login (if login command provided)\n if (cli.loginCommand) {\n logs.push(`Logging in: ${cli.loginCommand}`);\n const [loginCmd, ...loginArgs] = cli.loginCommand.split(' ');\n\n await exec(loginCmd, loginArgs);\n logs.push('Login successful.');\n }\n\n // Step 3: Build\n logs.push(`Building: ${config.buildCommand}`);\n const [buildCmd, ...buildArgs] = config.buildCommand.split(' ');\n await exec(buildCmd, buildArgs);\n logs.push('Build complete.');\n\n // Step 4: Deploy\n logs.push(`Deploying: ${cli.deployCommand}`);\n const [deployCmd, ...deployArgs] = cli.deployCommand.split(' ');\n const deployResult = await exec(deployCmd, deployArgs);\n logs.push(deployResult.stdout);\n\n // Step 5: Get status (if status command provided)\n let url: string | undefined;\n if (cli.statusCommand) {\n const [statusCmd, ...statusArgs] = cli.statusCommand.split(' ');\n const statusResult = await exec(statusCmd, statusArgs);\n logs.push(statusResult.stdout);\n // Try to extract URL from output\n const urlMatch = statusResult.stdout.match(/https?:\\/\\/[^\\s]+/);\n if (urlMatch) url = urlMatch[0];\n }\n\n return {\n success: true,\n url,\n deploymentId: `cli-${cli.cliName}-${Date.now()}`,\n logs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n logs,\n };\n }\n }\n\n // āā API Method āā\n\n private async deployAPI(config: CustomDeploymentConfig): Promise<DeploymentResult> {\n if (!config.api) {\n throw new CustomDeploymentError('API config required for api deployment method');\n }\n\n const logs: string[] = [];\n const { api } = config;\n\n try {\n // Step 1: Build locally\n logs.push(`Building: ${config.buildCommand}`);\n const [buildCmd, ...buildArgs] = config.buildCommand.split(' ');\n await exec(buildCmd, buildArgs);\n logs.push('Build complete.');\n\n // Step 2: Prepare request headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(api.headers || {}),\n };\n\n switch (api.authType) {\n case 'bearer':\n headers['Authorization'] = `Bearer ${api.authToken}`;\n break;\n case 'apiKey':\n headers['X-API-Key'] = api.apiKey || '';\n break;\n case 'basic':\n headers['Authorization'] = `Basic ${Buffer.from(api.authToken || '').toString('base64')}`;\n break;\n case 'custom':\n // Custom auth headers already merged above\n break;\n }\n\n // Step 3: Make deploy API call\n const deployUrl = `${api.baseUrl}${api.endpoints.deploy}`;\n const method = api.requestMethod || 'POST';\n const payload = api.payloadTemplate || {\n name: config.environmentVariables?.SERVICE_NAME || 'moltium-agent',\n buildCommand: config.buildCommand,\n startCommand: config.startCommand,\n envVars: config.environmentVariables,\n };\n\n logs.push(`Calling deploy API: ${method} ${deployUrl}`);\n\n const response = method === 'PUT'\n ? await axios.put(deployUrl, payload, { headers })\n : await axios.post(deployUrl, payload, { headers });\n\n logs.push(`API response: ${response.status}`);\n\n const deploymentId = response.data.id || response.data.deploymentId || `api-${Date.now()}`;\n let url = response.data.url || response.data.deployUrl;\n\n // Step 4: Check status endpoint (if available)\n if (api.endpoints.status) {\n const statusUrl = `${api.baseUrl}${api.endpoints.status}`.replace(':id', deploymentId);\n try {\n const statusRes = await axios.get(statusUrl, { headers });\n url = url || statusRes.data.url;\n logs.push(`Status: ${statusRes.data.status || statusRes.data.state || 'unknown'}`);\n } catch {\n // Status check is optional\n }\n }\n\n return {\n success: true,\n url,\n deploymentId,\n logs,\n };\n } catch (error) {\n const msg = axios.isAxiosError(error)\n ? `API error ${error.response?.status}: ${error.response?.data?.message || error.message}`\n : error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: msg,\n logs,\n };\n }\n }\n}\n","import { Command } from 'commander';\nimport { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport { ConfigLoader } from '@moltium/core';\n\nexport const configCommand = new Command('config')\n .description('Manage agent configuration');\n\nconfigCommand\n .command('show')\n .description('Show current agent configuration')\n .action(async () => {\n try {\n const configLoader = new ConfigLoader();\n const { config, type } = await configLoader.load(resolve(process.cwd()));\n\n console.log(chalk.bold(`\\nAgent: ${config.name}`));\n console.log(`Type: ${config.type || 'general'}`);\n console.log(`Config: ${type}`);\n console.log(`LLM: ${config.llm.provider} / ${config.llm.model}`);\n console.log(`Behaviors: ${config.behaviors.decisionMaking}, ${config.behaviors.actionsPerHour || 5} actions/hr`);\n console.log(`Memory: ${config.memory.type}`);\n console.log(`Actions: ${config.actions.join(', ') || 'none'}`);\n\n const platforms = Object.keys(config.social).filter(\n (k) => (config.social[k] as any)?.enabled,\n );\n console.log(`Social: ${platforms.join(', ') || 'none'}`);\n } catch (error) {\n console.error(chalk.red(error instanceof Error ? error.message : 'Failed to load config'));\n process.exit(1);\n }\n });\n\nconfigCommand\n .command('validate')\n .description('Validate agent configuration')\n .action(async () => {\n try {\n const configLoader = new ConfigLoader();\n const { config, type } = await configLoader.load(resolve(process.cwd()));\n console.log(chalk.green(`\\nā Valid ${type} configuration for \"${config.name}\"`));\n } catch (error) {\n console.error(chalk.red(`\\nā ${error instanceof Error ? error.message : 'Invalid configuration'}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { resolve, join } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ConfigLoader } from '@moltium/core';\n\nexport const migrateCommand = new Command('migrate')\n .description('Migrate between configuration types')\n .requiredOption('--from <type>', 'Source config type (code/markdown)')\n .requiredOption('--to <type>', 'Target config type (code/markdown)')\n .option('--dir <directory>', 'Agent directory', '.')\n .option('--keep', 'Keep the original config file after migration')\n .action(async (options) => {\n const { from, to, keep } = options;\n const agentDir = resolve(process.cwd(), options.dir);\n\n if (from === to) {\n console.log(chalk.yellow('Source and target config types are the same.'));\n return;\n }\n\n if (!['code', 'markdown'].includes(from) || !['code', 'markdown'].includes(to)) {\n console.log(chalk.red('Config types must be \"code\" or \"markdown\".'));\n process.exit(1);\n }\n\n const spinner = ora(`Migrating from ${from} to ${to}...`).start();\n\n try {\n const configLoader = new ConfigLoader();\n\n if (from === 'code' && to === 'markdown') {\n await migrateCodeToMarkdown(configLoader, agentDir, keep, spinner);\n } else {\n await migrateMarkdownToCode(configLoader, agentDir, keep, spinner);\n }\n\n spinner.succeed(chalk.green(`Migration complete: ${from} ā ${to}`));\n } catch (error) {\n spinner.fail(chalk.red('Migration failed'));\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nasync function migrateCodeToMarkdown(\n configLoader: ConfigLoader,\n agentDir: string,\n keep: boolean,\n spinner: ReturnType<typeof ora>,\n): Promise<void> {\n const configPath = resolve(agentDir, 'agent.config.ts');\n if (!existsSync(configPath)) {\n throw new Error('No agent.config.ts found in the current directory.');\n }\n\n spinner.text = 'Loading code config...';\n const config = await configLoader.loadCode(configPath);\n\n // Generate agent.md\n spinner.text = 'Generating agent.md...';\n const socialSections = generateSocialMarkdown(config);\n const skillSections = config.actions.map((a) => {\n const name = a.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n return `### ${name}\\nExecute the ${a} action based on context and current goals.`;\n }).join('\\n\\n');\n\n const sleepSchedule = config.behaviors.sleepSchedule\n ? `${config.behaviors.sleepSchedule.start}:00-${config.behaviors.sleepSchedule.end}:00${config.behaviors.sleepSchedule.timezone ? ' ' + config.behaviors.sleepSchedule.timezone : ' UTC'}`\n : 'none';\n\n const agentMd = `# Agent Configuration\n\n## Identity\nname: ${config.name}\ntype: ${config.type || 'assistant'}\npersonality: ${config.personality.traits.join(', ')}\n\n## Bio\n${config.personality.bio}\n\n## Social Platforms\n${socialSections}\n\n## Behaviors\nautonomous: ${config.behaviors.autonomous}\ndecision_making: ${config.behaviors.decisionMaking}\nactions_per_hour: ${typeof config.behaviors.actionsPerHour === 'number' ? config.behaviors.actionsPerHour : 5}\nsleep_schedule: ${sleepSchedule}\n\n## Memory\ntype: ${config.memory.type}\n${config.memory.retention ? `retention: ${config.memory.retention}` : ''}\n\n## Skills\n\n${skillSections}\n`;\n\n await writeFile(join(agentDir, 'agent.md'), agentMd);\n\n // Create personality files\n await mkdir(join(agentDir, 'personality'), { recursive: true });\n await writeFile(join(agentDir, 'personality', 'bio.md'), `# ${config.name}\\n\\n${config.personality.bio}\\n`);\n await writeFile(join(agentDir, 'personality', 'traits.md'), `# ${config.name} ā Traits\\n\\n${config.personality.traits.map((t) => `### ${t.charAt(0).toUpperCase() + t.slice(1)}\\nDescribe how this trait manifests in behavior.\\n`).join('\\n')}`);\n\n // Create skills directory\n await mkdir(join(agentDir, 'skills'), { recursive: true });\n for (const action of config.actions) {\n const name = action.replace(/_/g, '-');\n const title = action.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n await writeFile(join(agentDir, 'skills', `${name}.md`), `# ${title}\\n\\nDescribe the detailed instructions for this skill.\\n`);\n }\n\n // Create prompts directory\n await mkdir(join(agentDir, 'prompts'), { recursive: true });\n await writeFile(join(agentDir, 'prompts', 'system.md'), `# System Prompt for ${config.name}\\n\\n${config.llm.systemPrompt || 'Add your custom system prompt instructions here.'}\\n`);\n\n // Create memory directory\n await mkdir(join(agentDir, 'memory'), { recursive: true });\n await writeFile(join(agentDir, 'memory', 'context.md'), `# ${config.name} ā Long-Term Context\\n\\n## Important Facts\\n- Migrated from code-based configuration\\n- Type: ${config.type || 'assistant'}\\n\\n## Current Goals\\n1. Continue operating as before\\n`);\n\n if (!keep) {\n const { rename } = await import('node:fs/promises');\n await rename(configPath, configPath + '.bak');\n spinner.text = 'Original agent.config.ts renamed to agent.config.ts.bak';\n }\n}\n\nasync function migrateMarkdownToCode(\n configLoader: ConfigLoader,\n agentDir: string,\n keep: boolean,\n spinner: ReturnType<typeof ora>,\n): Promise<void> {\n const mdPath = resolve(agentDir, 'agent.md');\n if (!existsSync(mdPath)) {\n throw new Error('No agent.md found in the current directory.');\n }\n\n spinner.text = 'Loading markdown config...';\n const config = await configLoader.loadMarkdown(mdPath);\n\n // Generate agent.config.ts\n spinner.text = 'Generating agent.config.ts...';\n\n const socialConfigStr = generateSocialCodeConfig(config);\n const actionsArrayStr = config.actions.map((a) => `'${a}'`).join(', ');\n\n const sleepScheduleStr = config.behaviors.sleepSchedule\n ? `{ start: ${config.behaviors.sleepSchedule.start}, end: ${config.behaviors.sleepSchedule.end}${config.behaviors.sleepSchedule.timezone ? `, timezone: '${config.behaviors.sleepSchedule.timezone}'` : ''} }`\n : 'undefined';\n\n const providerEnvKey = config.llm.provider === 'anthropic' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n\n const codeConfig = `import type { AgentConfig } from '@moltium/core';\n\nconst config: AgentConfig = {\n name: '${config.name}',\n type: '${config.type || 'assistant'}',\n\n personality: {\n traits: [${config.personality.traits.map((t) => `'${t}'`).join(', ')}],\n bio: ${JSON.stringify(config.personality.bio)},\n },\n\n llm: {\n provider: '${config.llm.provider}',\n model: '${config.llm.model}',\n apiKey: process.env.${providerEnvKey} || '',\n temperature: ${config.llm.temperature ?? 0.7},\n },\n\n social: {\n${socialConfigStr}\n },\n\n behaviors: {\n autonomous: ${config.behaviors.autonomous},\n decisionMaking: '${config.behaviors.decisionMaking}',\n actionsPerHour: ${typeof config.behaviors.actionsPerHour === 'number' ? config.behaviors.actionsPerHour : 5},\n sleepSchedule: ${sleepScheduleStr},\n },\n\n memory: {\n type: '${config.memory.type}',\n ${config.memory.retention ? `retention: '${config.memory.retention}',` : ''}\n },\n\n actions: [${actionsArrayStr}],\n};\n\nexport default config;\n`;\n\n await writeFile(join(agentDir, 'agent.config.ts'), codeConfig);\n\n // Create hooks directory with stubs\n await mkdir(join(agentDir, 'hooks'), { recursive: true });\n await mkdir(join(agentDir, 'actions'), { recursive: true });\n\n // Load existing hooks from personality and prompts if they exist\n const systemPromptPath = join(agentDir, 'prompts', 'system.md');\n if (existsSync(systemPromptPath)) {\n const systemPrompt = readFileSync(systemPromptPath, 'utf-8');\n // Store the system prompt content in onInit hook\n await writeFile(join(agentDir, 'hooks', 'onInit.ts'), `import type { Agent } from '@moltium/core';\n\nexport async function onInit(agent: Agent): Promise<void> {\n // Migrated system prompt content from prompts/system.md\n agent.appendSystemPrompt(${JSON.stringify(systemPrompt)});\n\n const memory = agent.getMemory();\n await memory.remember('session_started', new Date().toISOString());\n}\n`);\n } else {\n await writeFile(join(agentDir, 'hooks', 'onInit.ts'), `import type { Agent } from '@moltium/core';\n\nexport async function onInit(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n await memory.remember('session_started', new Date().toISOString());\n}\n`);\n }\n\n await writeFile(join(agentDir, 'hooks', 'onTick.ts'), `import type { Agent } from '@moltium/core';\n\nexport async function onTick(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n const count = ((await memory.recall('tick_count')) as number) || 0;\n await memory.remember('tick_count', count + 1);\n}\n`);\n\n await writeFile(join(agentDir, 'hooks', 'onShutdown.ts'), `import type { Agent } from '@moltium/core';\n\nexport async function onShutdown(agent: Agent): Promise<void> {\n const memory = agent.getMemory();\n await memory.remember('last_shutdown', new Date().toISOString());\n}\n`);\n\n // Create package.json and tsconfig.json if they don't exist\n if (!existsSync(join(agentDir, 'tsconfig.json'))) {\n await writeFile(join(agentDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: './dist',\n rootDir: '.',\n },\n include: ['*.ts', 'actions/**/*.ts', 'hooks/**/*.ts'],\n }, null, 2));\n }\n\n if (!keep) {\n const { rename } = await import('node:fs/promises');\n await rename(mdPath, mdPath + '.bak');\n spinner.text = 'Original agent.md renamed to agent.md.bak';\n }\n}\n\nfunction generateSocialMarkdown(config: any): string {\n const sections: string[] = [];\n const social = config.social || {};\n\n for (const [platform, platformConfig] of Object.entries(social)) {\n if (!platformConfig || typeof platformConfig !== 'object') continue;\n const pc = platformConfig as Record<string, any>;\n if (!pc.enabled) continue;\n\n const lines = [`### ${platform.charAt(0).toUpperCase() + platform.slice(1)}`];\n lines.push(`enabled: true`);\n for (const [key, value] of Object.entries(pc)) {\n if (key === 'enabled' || key === 'credentials' || key === 'apiKey') continue;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n lines.push(`${key}: ${value}`);\n }\n }\n sections.push(lines.join('\\n'));\n }\n\n return sections.length > 0 ? sections.join('\\n\\n') : 'No social platforms configured.';\n}\n\nfunction generateSocialCodeConfig(config: any): string {\n const social = config.social || {};\n const lines: string[] = [];\n\n for (const [platform, platformConfig] of Object.entries(social)) {\n if (!platformConfig || typeof platformConfig !== 'object') continue;\n const pc = platformConfig as Record<string, any>;\n\n if (platform === 'moltbook' && pc.enabled) {\n lines.push(` moltbook: {\n enabled: true,\n apiKey: process.env.MOLTBOOK_API_KEY || '',\n },`);\n } else if (platform === 'twitter' && pc.enabled) {\n lines.push(` twitter: {\n enabled: true,\n credentials: {\n apiKey: process.env.TWITTER_API_KEY || '',\n apiSecret: process.env.TWITTER_API_SECRET || '',\n accessToken: process.env.TWITTER_ACCESS_TOKEN || '',\n accessSecret: process.env.TWITTER_ACCESS_SECRET || '',\n },\n },`);\n }\n }\n\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport axios from 'axios';\n\nexport const statusCommand = new Command('status')\n .description('Check agent status')\n .option('-r, --remote <url>', 'Remote agent URL')\n .option('-p, --port <number>', 'Local port', '3000')\n .action(async (options) => {\n const url = options.remote || `http://localhost:${options.port}`;\n\n try {\n const [health, status] = await Promise.all([\n axios.get(`${url}/health`, { timeout: 5000 }),\n axios.get(`${url}/status`, { timeout: 5000 }),\n ]);\n\n const data = status.data;\n console.log(chalk.bold(`\\nAgent: ${data.name}`));\n console.log(`State: ${chalk.green(data.state)}`);\n console.log(`Type: ${data.type}`);\n console.log(`Uptime: ${Math.floor(data.uptime)}s`);\n console.log(`Health: ${chalk.green(health.data.status)}`);\n } catch (error) {\n if (axios.isAxiosError(error) && error.code === 'ECONNREFUSED') {\n console.log(chalk.yellow(`\\nNo agent running at ${url}`));\n } else {\n console.error(chalk.red(`\\nFailed to reach agent at ${url}`));\n console.error(error instanceof Error ? error.message : error);\n }\n process.exit(1);\n }\n });\n"],"mappings":"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","names":["Command","require","Command","resolve","join","existsSync","chalk","ora","Command","resolve","pathToFileURL","chalk","ora","loadEnv","ConfigLoader","resolve","join","axios","axios","Command","resolve","loadEnv","chalk","deployer","ora","ConfigLoader","pathToFileURL","Command","resolve","chalk","ConfigLoader","Command","resolve","join","existsSync","readFileSync","writeFile","mkdir","chalk","ora","ConfigLoader","Command","chalk","axios","Command"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moltium/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "CLI tool for creating and managing Moltium autonomous agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"access": "public"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@moltium/core": "^0.1.
|
|
33
|
+
"@moltium/core": "^0.1.9",
|
|
34
34
|
"axios": "^1.7.0",
|
|
35
35
|
"chalk": "^5.3.0",
|
|
36
36
|
"commander": "^12.1.0",
|