agentix-cli 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +337 -116
- package/dist/agent-QYQVGKLM.js +2 -0
- package/dist/chunk-34UAFPK4.js +10 -0
- package/dist/chunk-34UAFPK4.js.map +1 -0
- package/dist/{chunk-X7UN6JAA.js → chunk-6MKAXEE5.js} +2 -2
- package/dist/chunk-BAIQJHQF.js +64 -0
- package/dist/chunk-BAIQJHQF.js.map +1 -0
- package/dist/chunk-BHDLKX3G.js +6 -0
- package/dist/chunk-BHDLKX3G.js.map +1 -0
- package/dist/chunk-CJ45Y2IR.js +12 -0
- package/dist/chunk-CJ45Y2IR.js.map +1 -0
- package/dist/chunk-DSYKYZMT.js +2 -0
- package/dist/chunk-DSYKYZMT.js.map +1 -0
- package/dist/chunk-IVVVYXPH.js +136 -0
- package/dist/chunk-IVVVYXPH.js.map +1 -0
- package/dist/{chunk-MGMZNJCE.js → chunk-KXZMYLHQ.js} +27 -27
- package/dist/chunk-KXZMYLHQ.js.map +1 -0
- package/dist/chunk-SBUX74OU.js +108 -0
- package/dist/chunk-SBUX74OU.js.map +1 -0
- package/dist/chunk-X32247GM.js +2 -0
- package/dist/chunk-X32247GM.js.map +1 -0
- package/dist/chunk-ZRYBSI5G.js +23 -0
- package/dist/chunk-ZRYBSI5G.js.map +1 -0
- package/dist/cli.js +280 -36
- package/dist/cli.js.map +1 -1
- package/dist/compaction-E3MQRLTL.js +28 -0
- package/dist/compaction-E3MQRLTL.js.map +1 -0
- package/dist/config-MSWKC466.js +2 -0
- package/dist/debug-N3B5NVJU.js +2 -0
- package/dist/heal-OTGT5HHJ.js +2 -0
- package/dist/heal-OTGT5HHJ.js.map +1 -0
- package/dist/index.d.ts +712 -239
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/memory-extract-RGPUPMKU.js +2 -0
- package/dist/memory-extract-RGPUPMKU.js.map +1 -0
- package/dist/{providers-AVYG63KK.js → providers-G3WZ4RVJ.js} +2 -2
- package/dist/providers-G3WZ4RVJ.js.map +1 -0
- package/dist/registry-FP6FUOXF.js +2 -0
- package/dist/registry-FP6FUOXF.js.map +1 -0
- package/dist/subagent-WV7QKQ3L.js +3 -0
- package/dist/subagent-WV7QKQ3L.js.map +1 -0
- package/dist/usage-dashboard-2TJQBFSH.js +404 -0
- package/dist/usage-dashboard-2TJQBFSH.js.map +1 -0
- package/package.json +4 -1
- package/dist/agent-K2YOEOJ5.js +0 -2
- package/dist/chunk-F73GPYCO.js +0 -106
- package/dist/chunk-F73GPYCO.js.map +0 -1
- package/dist/chunk-MGMZNJCE.js.map +0 -1
- package/dist/chunk-NGKOM4ZZ.js +0 -137
- package/dist/chunk-NGKOM4ZZ.js.map +0 -1
- package/dist/chunk-Z4GC5D6D.js +0 -12
- package/dist/chunk-Z4GC5D6D.js.map +0 -1
- package/dist/heal-UV5A6B5T.js +0 -2
- /package/dist/{agent-K2YOEOJ5.js.map → agent-QYQVGKLM.js.map} +0 -0
- /package/dist/{chunk-X7UN6JAA.js.map → chunk-6MKAXEE5.js.map} +0 -0
- /package/dist/{heal-UV5A6B5T.js.map → config-MSWKC466.js.map} +0 -0
- /package/dist/{providers-AVYG63KK.js.map → debug-N3B5NVJU.js.map} +0 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/daemon.ts","../src/commands/init.ts","../src/commands/manage.ts","../src/commands/usage.ts","../src/commands/wiki.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\"\nimport { daemon } from \"@/commands/daemon\"\nimport { init } from \"@/commands/init\"\nimport { agent, channel, cron, mesh, skillCmd, hook, migrate, configCmd } from \"@/commands/manage\"\nimport { usage } from \"@/commands/usage\"\nimport { wiki } from \"@/commands/wiki\"\nimport { getPackageInfo } from \"@/utils/get-package-info\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nasync function main() {\n const packageInfo = await getPackageInfo()\n\n const program = new Command()\n .name(\"agentx\")\n .description(\n \"self-hosted multi-agent orchestrator — Telegram, WhatsApp, crons, A2A mesh, wiki knowledge\"\n )\n .version(\n packageInfo.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program\n .addCommand(daemon)\n .addCommand(init)\n .addCommand(agent)\n .addCommand(channel)\n .addCommand(cron)\n .addCommand(mesh)\n .addCommand(skillCmd)\n .addCommand(hook)\n .addCommand(migrate)\n .addCommand(configCmd)\n .addCommand(usage)\n .addCommand(wiki)\n\n const args = process.argv.slice(2)\n if (args.length === 0) {\n program.outputHelp()\n return\n }\n\n program.parse()\n}\n\nmain()\n","import { Command } from \"commander\"\nimport { AgentXDaemon } from \"@/daemon\"\nimport { loadDaemonConfig, validateWorkspaces } from \"@/daemon/config\"\nimport chalk from \"chalk\"\n\n// --- agentx daemon: start/stop/status/logs ---\n\nexport const daemon = new Command()\n .name(\"daemon\")\n .description(\"manage the agentx daemon — start, stop, status, logs\")\n\n// agentx daemon start\ndaemon\n .command(\"start\")\n .description(\"start the daemon (default if no subcommand)\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"-d, --detach\", \"run in background (detached)\")\n .option(\"--port <port>\", \"override bind port\")\n .action(async (opts) => {\n if (opts.detach) {\n const { spawn } = await import(\"child_process\")\n const args = [\"dist/cli.js\", \"daemon\", \"start\"]\n if (opts.config) args.push(\"-c\", opts.config)\n if (opts.port) args.push(\"--port\", opts.port)\n\n const child = spawn(\"node\", args, {\n detached: true,\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n cwd: process.cwd(),\n })\n child.unref()\n\n const { writeFileSync } = await import(\"fs\")\n writeFileSync(\"/tmp/agentx-daemon.pid\", String(child.pid))\n console.log(chalk.green(`Daemon started in background (PID: ${child.pid})`))\n console.log(chalk.dim(` Logs: tail -f /tmp/agentx-daemon.log`))\n console.log(chalk.dim(` Stop: agentx daemon stop`))\n return\n }\n\n const d = new AgentXDaemon(opts.config)\n await d.start()\n })\n\n// agentx daemon stop\ndaemon\n .command(\"stop\")\n .description(\"stop the running daemon\")\n .action(async () => {\n const { readFileSync, existsSync, unlinkSync } = await import(\"fs\")\n const { resolve } = await import(\"path\")\n\n // Check both PID file locations\n const pidFiles = [\n resolve(process.cwd(), \".agentx/daemon.pid\"),\n \"/tmp/agentx-daemon.pid\",\n ]\n\n for (const pidFile of pidFiles) {\n if (!existsSync(pidFile)) continue\n try {\n const pid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10)\n process.kill(pid, \"SIGTERM\")\n // Wait briefly for graceful shutdown\n await new Promise(r => setTimeout(r, 2000))\n try { unlinkSync(pidFile) } catch {}\n console.log(chalk.green(`Daemon stopped (PID: ${pid})`))\n return\n } catch {\n try { unlinkSync(pidFile) } catch {}\n }\n }\n\n // Fallback: kill by process name\n const { execSync } = await import(\"child_process\")\n try {\n execSync(\"pkill -f 'node dist/cli.js daemon'\", { stdio: \"ignore\" })\n console.log(chalk.green(\"Daemon stopped\"))\n } catch {\n console.log(chalk.yellow(\"No daemon process found\"))\n }\n })\n\n// agentx daemon status\ndaemon\n .command(\"status\")\n .alias(\"st\")\n .description(\"show daemon status, agents, crons, and mesh\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"--json\", \"output as JSON\")\n .action(async (opts) => {\n // Try connecting to running daemon first\n try {\n const config = loadDaemonConfig(opts.config)\n const [host, port] = config.node.bind.split(\":\")\n const url = `http://${host || \"127.0.0.1\"}:${port}/health`\n const res = await fetch(url, { signal: AbortSignal.timeout(3000) })\n const data = await res.json() as any\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n console.log()\n console.log(chalk.bold(` ${data.node.name}`) + chalk.dim(` (${data.node.id})`))\n console.log(chalk.green(\" Status: running\") + chalk.dim(` — uptime ${formatDuration(data.uptime)}`))\n console.log()\n\n // Agents\n console.log(chalk.bold(\" Agents:\"))\n for (const a of data.agents) {\n const active = a.active > 0 ? chalk.yellow(` [${a.active} active]`) : \"\"\n const errors = a.errors > 0 ? chalk.red(` (${a.errors} errors)`) : \"\"\n console.log(` ${chalk.cyan(a.name)} ${chalk.dim(`(${a.tier})`)}${active}${errors}`)\n console.log(chalk.dim(` ${a.workspace}`))\n }\n\n // Crons\n const enabledCrons = data.crons.filter((c: any) => c.enabled)\n if (data.crons.length) {\n console.log()\n console.log(chalk.bold(` Crons: ${enabledCrons.length} enabled / ${data.crons.length} total`))\n for (const c of data.crons) {\n const icon = c.enabled ? chalk.green(\"●\") : chalk.dim(\"○\")\n const next = c.nextRun ? chalk.dim(` next: ${new Date(c.nextRun).toLocaleTimeString()}`) : \"\"\n console.log(` ${icon} ${c.id}${next}`)\n }\n }\n\n // Mesh\n if (data.mesh?.length) {\n console.log()\n console.log(chalk.bold(\" Mesh:\"))\n for (const p of data.mesh) {\n const icon = p.healthy ? chalk.green(\"●\") : chalk.red(\"●\")\n const skills = p.skills?.length ? chalk.dim(` (${p.skills.length} agents)`) : \"\"\n console.log(` ${icon} ${p.peer} ${chalk.dim(p.peerUrl)}${skills}`)\n }\n }\n\n console.log()\n } catch (e: any) {\n if (e.cause?.code === \"ECONNREFUSED\" || e.name === \"TimeoutError\") {\n console.log(chalk.red(\" Daemon is not running\"))\n console.log(chalk.dim(\" Start with: agentx daemon start\"))\n } else {\n // No running daemon — show config info\n try {\n const config = loadDaemonConfig(opts.config)\n const warnings = validateWorkspaces(config)\n console.log()\n console.log(chalk.bold(` ${config.node.name}`) + chalk.dim(` (${config.node.id})`))\n console.log(chalk.yellow(\" Status: stopped\"))\n console.log(chalk.dim(` ${Object.keys(config.agents).length} agents, ${Object.keys(config.crons).length} crons configured`))\n if (warnings.length) {\n console.log()\n for (const w of warnings) console.log(chalk.yellow(` ⚠ ${w}`))\n }\n console.log()\n } catch (err: any) {\n console.log(chalk.red(` ${err.message}`))\n }\n }\n }\n })\n\n// agentx daemon logs\ndaemon\n .command(\"logs\")\n .description(\"tail daemon logs\")\n .option(\"-n, --lines <n>\", \"number of lines\", \"50\")\n .option(\"-f, --follow\", \"follow log output\", false)\n .action(async (opts) => {\n const { execSync, spawn: spawnProc } = await import(\"child_process\")\n const logFile = \"/tmp/agentx-daemon.log\"\n\n const { existsSync } = await import(\"fs\")\n if (!existsSync(logFile)) {\n console.log(chalk.yellow(\"No log file found at /tmp/agentx-daemon.log\"))\n return\n }\n\n if (opts.follow) {\n const tail = spawnProc(\"tail\", [\"-f\", \"-n\", opts.lines, logFile], { stdio: \"inherit\" })\n process.on(\"SIGINT\", () => { tail.kill(); process.exit(0) })\n } else {\n execSync(`tail -n ${opts.lines} ${logFile}`, { stdio: \"inherit\" })\n }\n })\n\n// agentx daemon send — send a task to an agent\ndaemon\n .command(\"send <agent> <message...>\")\n .description(\"send a task to an agent via the daemon API\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"--peer <peer>\", \"send to a mesh peer's agent\")\n .option(\"--json\", \"output raw JSON response\")\n .action(async (agent, messageParts, opts) => {\n const message = messageParts.join(\" \")\n\n try {\n const config = loadDaemonConfig(opts.config)\n const [host, port] = config.node.bind.split(\":\")\n const baseUrl = `http://${host || \"127.0.0.1\"}:${port}`\n\n let url: string\n let body: Record<string, unknown>\n\n if (opts.peer) {\n url = `${baseUrl}/mesh/task`\n body = { peer: opts.peer, message, agent }\n } else {\n url = `${baseUrl}/task`\n body = { agent, message }\n }\n\n console.log(chalk.dim(` Sending to ${opts.peer ? `${opts.peer}/${agent}` : agent}...`))\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n const data = await res.json() as any\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2))\n } else if (data.error) {\n console.log(chalk.red(` Error: ${data.error}`))\n } else {\n console.log()\n console.log(data.content || data.response || \"No response\")\n if (data.duration) {\n console.log(chalk.dim(`\\n (${(data.duration / 1000).toFixed(1)}s)`))\n }\n }\n } catch (e: any) {\n console.log(chalk.red(` Failed: ${e.message}`))\n console.log(chalk.dim(\" Is the daemon running? Try: agentx daemon status\"))\n }\n })\n\n// agentx daemon deploy — rsync dist to a remote server\ndaemon\n .command(\"deploy <host>\")\n .description(\"deploy agentx to a remote server via rsync\")\n .option(\"-i, --identity <key>\", \"SSH identity file\")\n .option(\"-u, --user <user>\", \"SSH user\", \"clawd\")\n .option(\"-p, --path <path>\", \"remote agentx path\", \"~/agentx\")\n .option(\"--restart\", \"restart remote daemon after deploy\", false)\n .option(\"--skip-checks\", \"skip build and test before deploy\", false)\n .action(async (host, opts) => {\n const { execSync } = await import(\"child_process\")\n const sshKey = opts.identity ? `-e \"ssh -i ${opts.identity}\"` : \"\"\n const remote = `${opts.user}@${host}:${opts.path}/dist/`\n\n // Pre-deploy checks\n if (!opts.skipChecks) {\n try {\n console.log(chalk.dim(\" Running tests...\"))\n execSync(\"npx vitest run --reporter=dot\", { stdio: \"pipe\", cwd: process.cwd() })\n console.log(chalk.green(\" ✓ Tests passed\"))\n } catch (e: any) {\n console.log(chalk.red(\" ✗ Tests failed — aborting deploy\"))\n console.log(chalk.dim(\" Use --skip-checks to deploy anyway\"))\n return\n }\n\n // Check dist exists and is recent\n const { existsSync, statSync } = await import(\"fs\")\n const { resolve } = await import(\"path\")\n const cliPath = resolve(process.cwd(), \"dist/cli.js\")\n if (!existsSync(cliPath)) {\n console.log(chalk.red(\" ✗ dist/ not found — run build first\"))\n return\n }\n const age = Date.now() - statSync(cliPath).mtimeMs\n if (age > 300_000) {\n console.log(chalk.yellow(\" ⚠ dist/ is older than 5 minutes — rebuilding...\"))\n execSync(\"npx tsup --no-dts\", { stdio: \"pipe\", cwd: process.cwd() })\n console.log(chalk.green(\" ✓ Build complete\"))\n }\n }\n\n console.log(chalk.dim(` Deploying to ${opts.user}@${host}:${opts.path}...`))\n\n try {\n execSync(`rsync -avzL --delete ${sshKey} dist/ ${remote}`, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n })\n console.log(chalk.green(\" ✓ Deploy complete\"))\n\n if (opts.restart) {\n console.log(chalk.dim(\" Restarting remote daemon...\"))\n const ssh = opts.identity ? `ssh -i ${opts.identity}` : \"ssh\"\n execSync(\n `${ssh} ${opts.user}@${host} \"pkill -f 'node dist/cli.js daemon' 2>/dev/null; sleep 2; cd ${opts.path} && nohup node dist/cli.js daemon start > /tmp/agentx-daemon.log 2>&1 &\"`,\n { stdio: \"inherit\" },\n )\n console.log(chalk.green(\" Remote daemon restarted\"))\n }\n } catch (e: any) {\n console.log(chalk.red(` Deploy failed: ${e.message}`))\n }\n })\n\n// Default: `agentx daemon` without subcommand starts the daemon\ndaemon.action(async (opts) => {\n const d = new AgentXDaemon(opts.config)\n await d.start()\n})\n\nfunction formatDuration(seconds: number): string {\n if (seconds < 60) return `${Math.round(seconds)}s`\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`\n if (seconds < 86400) return `${Math.round(seconds / 3600)}h ${Math.round((seconds % 3600) / 60)}m`\n return `${Math.round(seconds / 86400)}d ${Math.round((seconds % 86400) / 3600)}h`\n}\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"fs\"\nimport { resolve, join } from \"path\"\n\n// --- agentx init: interactive setup for new installations ---\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize agentx configuration in the current directory\")\n .option(\"--force\", \"overwrite existing config\")\n .action(async (opts) => {\n const cwd = process.cwd()\n const configPath = resolve(cwd, \"agentx.json\")\n const envPath = resolve(cwd, \".env\")\n const sessionsDir = resolve(cwd, \".agentx/sessions\")\n\n console.log()\n console.log(chalk.bold(\" agentx init\"))\n console.log()\n\n // Check existing config\n if (existsSync(configPath) && !opts.force) {\n console.log(chalk.yellow(` agentx.json already exists. Use --force to overwrite.`))\n console.log()\n return\n }\n\n // Find example config\n const examplePaths = [\n resolve(cwd, \"agentx.example.json\"),\n resolve(cwd, \"node_modules/agentix-cli/agentx.example.json\"),\n ]\n\n let example: string | undefined\n for (const p of examplePaths) {\n if (existsSync(p)) {\n example = readFileSync(p, \"utf-8\")\n break\n }\n }\n\n if (!example) {\n // Generate minimal config\n example = JSON.stringify({\n node: {\n id: require(\"os\").hostname().toLowerCase().replace(/[^a-z0-9-]/g, \"-\"),\n name: require(\"os\").hostname(),\n bind: \"127.0.0.1:18800\",\n },\n providers: {\n claude: { apiKey: \"${ANTHROPIC_API_KEY}\" },\n },\n agents: {\n assistant: {\n name: \"Assistant\",\n workspace: cwd,\n tier: \"claude-code\",\n model: \"claude-sonnet-4-6\",\n mentions: [\"@assistant\", \"assistant\"],\n maxConcurrent: 2,\n systemPrompt: \"You are a helpful assistant.\",\n permissionMode: \"default\",\n },\n },\n channels: {\n telegram: {\n enabled: false,\n accounts: {},\n policy: { dm: \"pair\", group: \"mention-required\" },\n },\n whatsapp: { enabled: false },\n },\n crons: {},\n mesh: {\n enabled: false,\n peers: [],\n discovery: \"static\",\n healthCheck: { interval: 60, timeout: 10 },\n },\n }, null, 2)\n }\n\n // Write config\n writeFileSync(configPath, example)\n console.log(chalk.green(` ✓ Created agentx.json`))\n\n // Create .env template\n if (!existsSync(envPath)) {\n writeFileSync(envPath, [\n \"# AgentX environment variables\",\n \"# ANTHROPIC_API_KEY=sk-ant-...\",\n \"# TG_BOT_TOKEN=123456:ABC...\",\n \"# MESH_TOKEN=your-mesh-secret\",\n \"\",\n ].join(\"\\n\"))\n console.log(chalk.green(` ✓ Created .env template`))\n }\n\n // Create session dir\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true })\n console.log(chalk.green(` ✓ Created .agentx/sessions/`))\n }\n\n // Create workspace .claude dir\n const claudeDir = resolve(cwd, \".claude\")\n if (!existsSync(claudeDir)) {\n mkdirSync(claudeDir, { recursive: true })\n console.log(chalk.green(` ✓ Created .claude/`))\n }\n\n console.log()\n console.log(chalk.bold(\" Next steps:\"))\n console.log(` 1. Edit ${chalk.cyan(\"agentx.json\")} — configure agents, channels, crons`)\n console.log(` 2. Edit ${chalk.cyan(\".env\")} — add API keys and bot tokens`)\n console.log(` 3. Run ${chalk.cyan(\"agentx daemon start\")} — start the daemon`)\n console.log(` 4. Run ${chalk.cyan(\"agentx daemon status\")} — verify everything`)\n console.log()\n })\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport prompts from \"prompts\"\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, cpSync, readdirSync } from \"fs\"\nimport { resolve, join } from \"path\"\nimport { loadDaemonConfig, validateWorkspaces } from \"@/daemon/config\"\n\n// --- agentx agent/channel/cron/mesh/skill/hook management commands ---\n\nfunction loadConfig(): any {\n const p = resolve(process.cwd(), \"agentx.json\")\n if (!existsSync(p)) throw new Error(\"No agentx.json found. Run: agentx init\")\n return JSON.parse(readFileSync(p, \"utf-8\"))\n}\n\nfunction saveConfig(config: any): void {\n writeFileSync(resolve(process.cwd(), \"agentx.json\"), JSON.stringify(config, null, 2))\n}\n\n// ==================== agentx agent ====================\n\nexport const agent = new Command()\n .name(\"agent\")\n .description(\"manage agents — add, list, remove\")\n\nagent\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list configured agents\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, a] of Object.entries(config.agents || {}) as any) {\n const mentions = a.mentions?.join(\", \") || \"\"\n console.log(` ${chalk.cyan(id)} — ${a.name} (${a.tier})`)\n console.log(chalk.dim(` workspace: ${a.workspace}`))\n if (mentions) console.log(chalk.dim(` mentions: ${mentions}`))\n }\n console.log()\n })\n\nagent\n .command(\"add\")\n .description(\"add a new agent interactively\")\n .action(async () => {\n const config = loadConfig()\n\n const answers = await prompts([\n { type: \"text\", name: \"id\", message: \"Agent ID (kebab-case)\", validate: (v: string) => /^[a-z0-9-]+$/.test(v) || \"Use lowercase, numbers, hyphens\" },\n { type: \"text\", name: \"name\", message: \"Display name\" },\n { type: \"text\", name: \"workspace\", message: \"Workspace path\", initial: resolve(process.cwd(), \"agents/\") },\n { type: \"select\", name: \"tier\", message: \"Execution tier\", choices: [\n { title: \"claude-code (subscription, full features)\", value: \"claude-code\" },\n { title: \"sdk (API key, programmatic)\", value: \"sdk\" },\n { title: \"orchestrator (any provider)\", value: \"orchestrator\" },\n ]},\n { type: \"text\", name: \"model\", message: \"Model\", initial: \"claude-sonnet-4-6\" },\n { type: \"list\", name: \"mentions\", message: \"Mention patterns (comma-separated)\", separator: \",\" },\n { type: \"number\", name: \"maxConcurrent\", message: \"Max concurrent tasks\", initial: 2 },\n { type: \"text\", name: \"systemPrompt\", message: \"System prompt\" },\n ])\n\n if (!answers.id) return\n\n // Create workspace + .claude dir\n const ws = answers.workspace.endsWith(answers.id) ? answers.workspace : join(answers.workspace, answers.id)\n mkdirSync(resolve(ws, \".claude/skills\"), { recursive: true })\n\n // Create CLAUDE.md\n const claudeMd = `# ${answers.name}\\n\\n${answers.systemPrompt}\\n`\n writeFileSync(resolve(ws, \"CLAUDE.md\"), claudeMd)\n\n // Create default settings.json\n writeFileSync(resolve(ws, \".claude/settings.json\"), JSON.stringify({\n permissions: {\n allow: [\"Bash(git *)\", \"Bash(curl *)\", \"Bash(node *)\", \"Read\", \"Write\", \"Edit\", \"Glob\", \"Grep\", \"WebFetch\", \"WebSearch\"],\n },\n }, null, 2))\n\n // Install wiki skill\n const wikiSkillSrc = resolve(process.cwd(), \"src/wiki/SKILL.md\")\n const wikiSkillDist = resolve(__dirname, \"../wiki/SKILL.md\")\n const skillSrc = existsSync(wikiSkillSrc) ? wikiSkillSrc : wikiSkillDist\n if (existsSync(skillSrc)) {\n mkdirSync(resolve(ws, \".claude/skills/wiki\"), { recursive: true })\n cpSync(skillSrc, resolve(ws, \".claude/skills/wiki/SKILL.md\"))\n }\n\n // Add to config\n config.agents = config.agents || {}\n config.agents[answers.id] = {\n name: answers.name,\n workspace: ws,\n tier: answers.tier,\n model: answers.model,\n mentions: answers.mentions?.map((m: string) => m.trim()).filter(Boolean) || [],\n maxConcurrent: answers.maxConcurrent,\n systemPrompt: answers.systemPrompt,\n permissionMode: \"default\",\n }\n\n saveConfig(config)\n console.log(chalk.green(`\\n Agent \"${answers.id}\" added`))\n console.log(chalk.dim(` Workspace: ${ws}`))\n console.log(chalk.dim(` Wiki skill installed`))\n console.log(chalk.dim(` CLAUDE.md + settings.json created`))\n console.log()\n })\n\nagent\n .command(\"remove <id>\")\n .alias(\"rm\")\n .description(\"remove an agent from config (keeps workspace)\")\n .action((id) => {\n const config = loadConfig()\n if (!config.agents?.[id]) {\n console.log(chalk.red(` Agent \"${id}\" not found`))\n return\n }\n delete config.agents[id]\n saveConfig(config)\n console.log(chalk.green(` Agent \"${id}\" removed from config (workspace preserved)`))\n })\n\n// ==================== agentx channel ====================\n\nexport const channel = new Command()\n .name(\"channel\")\n .description(\"manage channels — add telegram/whatsapp/discord, list\")\n\nchannel\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list configured channels and bindings\")\n .action(() => {\n const config = loadConfig()\n console.log()\n\n // Telegram\n const tg = config.channels?.telegram\n if (tg?.enabled) {\n console.log(chalk.bold(\" Telegram:\"))\n for (const [name, acc] of Object.entries(tg.accounts || {}) as any) {\n console.log(` ${chalk.cyan(name)} -> agent: ${acc.agentBinding}`)\n }\n } else {\n console.log(chalk.dim(\" Telegram: disabled\"))\n }\n\n // WhatsApp\n const wa = config.channels?.whatsapp\n if (wa?.enabled) {\n console.log(chalk.bold(\" WhatsApp:\"))\n console.log(` default agent: ${wa.defaultAgent || \"(none)\"}`)\n console.log(` session: ${wa.sessionDir || \".agentx/whatsapp-sessions\"}`)\n for (const route of wa.routes || []) {\n const target = route.contact ? `contact ${route.contact}` : `group \"${route.group}\"`\n console.log(` ${target} -> agent: ${route.agent}`)\n }\n } else {\n console.log(chalk.dim(\" WhatsApp: disabled\"))\n }\n\n // Discord\n const dc = config.channels?.discord\n if (dc?.enabled) {\n console.log(chalk.bold(\" Discord:\"))\n console.log(` agent: ${dc.agentBinding || \"(none)\"}`)\n } else {\n console.log(chalk.dim(\" Discord: disabled\"))\n }\n\n // GitLab\n const gl = config.channels?.gitlab\n if (gl?.enabled) {\n console.log(chalk.bold(\" GitLab:\"))\n console.log(` host: ${gl.host}`)\n console.log(` webhook: :${gl.webhookPort}`)\n for (const route of gl.routes || []) {\n console.log(` ${route.project} -> agent: ${route.agent}`)\n }\n } else {\n console.log(chalk.dim(\" GitLab: disabled\"))\n }\n\n console.log()\n })\n\nchannel\n .command(\"add\")\n .description(\"add a channel (telegram, whatsapp, or discord)\")\n .action(async () => {\n const config = loadConfig()\n const agentIds = Object.keys(config.agents || {})\n if (!agentIds.length) {\n console.log(chalk.red(\" No agents configured. Run: agentx agent add\"))\n return\n }\n\n const agentChoices = agentIds.map(id => ({ title: `${id} (${config.agents[id].name})`, value: id }))\n\n const { channelType } = await prompts({\n type: \"select\",\n name: \"channelType\",\n message: \"Channel type\",\n choices: [\n { title: \"Telegram — bot via BotFather token\", value: \"telegram\" },\n { title: \"WhatsApp — link via QR code (self-chat or contacts)\", value: \"whatsapp\" },\n { title: \"Discord — bot via Discord developer portal\", value: \"discord\" },\n { title: \"GitLab — webhook for issues, MRs, comments, pipelines\", value: \"gitlab\" },\n ],\n })\n\n if (!channelType) return\n\n config.channels = config.channels || {}\n\n // --- Telegram ---\n if (channelType === \"telegram\") {\n const answers = await prompts([\n { type: \"text\", name: \"accountName\", message: \"Account name (e.g. 'default', 'devops')\" },\n { type: \"text\", name: \"token\", message: \"Bot token (from @BotFather)\" },\n { type: \"select\", name: \"agentBinding\", message: \"Bind to agent\", choices: agentChoices },\n ])\n\n if (!answers.accountName || !answers.token) return\n\n try {\n const res = await fetch(`https://api.telegram.org/bot${answers.token}/getMe`)\n const data = await res.json() as any\n if (!data.ok) throw new Error(data.description)\n console.log(chalk.green(` Bot verified: @${data.result.username}`))\n\n const botHandle = `@${data.result.username}`\n const agentMentions = config.agents[answers.agentBinding].mentions || []\n if (!agentMentions.includes(botHandle)) {\n agentMentions.push(botHandle, data.result.username)\n config.agents[answers.agentBinding].mentions = agentMentions\n }\n } catch (e: any) {\n console.log(chalk.red(` Invalid token: ${e.message}`))\n return\n }\n\n config.channels.telegram = config.channels.telegram || { enabled: false, accounts: {}, policy: { dm: \"pair\", group: \"mention-required\" } }\n config.channels.telegram.enabled = true\n config.channels.telegram.accounts[answers.accountName] = {\n token: answers.token,\n agentBinding: answers.agentBinding,\n }\n\n saveConfig(config)\n console.log(chalk.green(` Telegram \"${answers.accountName}\" added -> ${answers.agentBinding}`))\n }\n\n // --- WhatsApp ---\n if (channelType === \"whatsapp\") {\n const answers = await prompts([\n { type: \"select\", name: \"defaultAgent\", message: \"Default agent for WhatsApp messages\", choices: agentChoices },\n { type: \"text\", name: \"sessionDir\", message: \"Session directory\", initial: \".agentx/whatsapp-sessions\" },\n { type: \"confirm\", name: \"addRoute\", message: \"Add a contact/group route?\", initial: true },\n ])\n\n if (!answers.defaultAgent) return\n\n const routes: any[] = []\n let addMore = answers.addRoute\n\n while (addMore) {\n const route = await prompts([\n { type: \"select\", name: \"type\", message: \"Route type\", choices: [\n { title: \"Contact (phone number)\", value: \"contact\" },\n { title: \"Group (name match)\", value: \"group\" },\n ]},\n { type: \"text\", name: \"value\", message: (prev: string) => prev === \"contact\" ? \"Phone number (e.g. +21624309128)\" : \"Group name (partial match)\" },\n { type: \"select\", name: \"agent\", message: \"Route to agent\", choices: agentChoices },\n { type: \"confirm\", name: \"more\", message: \"Add another route?\", initial: false },\n ])\n\n if (route.value && route.agent) {\n routes.push({\n [route.type]: route.value,\n agent: route.agent,\n })\n }\n addMore = route.more\n }\n\n config.channels.whatsapp = {\n enabled: true,\n sessionDir: answers.sessionDir,\n defaultAgent: answers.defaultAgent,\n routes,\n }\n\n saveConfig(config)\n mkdirSync(resolve(process.cwd(), answers.sessionDir), { recursive: true })\n console.log(chalk.green(` WhatsApp enabled (${routes.length} routes, default: ${answers.defaultAgent})`))\n console.log(chalk.dim(\" Start daemon to scan QR code: agentx daemon start\"))\n }\n\n // --- Discord ---\n if (channelType === \"discord\") {\n const answers = await prompts([\n { type: \"text\", name: \"token\", message: \"Discord bot token (from developer portal)\" },\n { type: \"select\", name: \"agentBinding\", message: \"Bind to agent\", choices: agentChoices },\n ])\n\n if (!answers.token) return\n\n config.channels.discord = {\n enabled: true,\n token: answers.token,\n agentBinding: answers.agentBinding,\n }\n\n saveConfig(config)\n console.log(chalk.green(` Discord added -> ${answers.agentBinding}`))\n }\n\n // --- GitLab ---\n if (channelType === \"gitlab\") {\n const answers = await prompts([\n { type: \"text\", name: \"host\", message: \"GitLab instance URL\", initial: \"https://gitlab.noqta.tn\" },\n { type: \"text\", name: \"token\", message: \"GitLab API token (PRIVATE-TOKEN)\" },\n { type: \"number\", name: \"webhookPort\", message: \"Webhook listen port\", initial: 18810 },\n { type: \"text\", name: \"webhookSecret\", message: \"Webhook secret (X-Gitlab-Token, optional)\" },\n { type: \"confirm\", name: \"addRoute\", message: \"Add a project route?\", initial: true },\n ])\n\n if (!answers.token) return\n\n const routes: any[] = []\n let addMore = answers.addRoute\n\n while (addMore) {\n const route = await prompts([\n { type: \"text\", name: \"project\", message: \"GitLab project path (e.g. noqta/mtgl-v2, or * for default)\" },\n { type: \"select\", name: \"agent\", message: \"Route to agent\", choices: agentChoices },\n { type: \"confirm\", name: \"more\", message: \"Add another route?\", initial: false },\n ])\n\n if (route.project && route.agent) {\n routes.push({ project: route.project, agent: route.agent })\n }\n addMore = route.more\n }\n\n config.channels.gitlab = {\n enabled: true,\n host: answers.host,\n token: answers.token,\n webhookPort: answers.webhookPort,\n webhookSecret: answers.webhookSecret || undefined,\n routes,\n }\n\n saveConfig(config)\n console.log(chalk.green(` GitLab enabled (${routes.length} routes, webhook :${answers.webhookPort})`))\n console.log(chalk.dim(` Add webhook in GitLab: ${answers.host}/<project>/-/hooks`))\n console.log(chalk.dim(` URL: http://your-server:${answers.webhookPort}/`))\n if (answers.webhookSecret) {\n console.log(chalk.dim(` Secret token: ${answers.webhookSecret}`))\n }\n console.log(chalk.dim(\" Events: Comments, Issues, Merge requests, Pipeline\"))\n }\n\n console.log(chalk.dim(\" Restart daemon to apply: agentx daemon stop && agentx daemon start\"))\n console.log()\n })\n\n// ==================== agentx cron ====================\n\nexport const cron = new Command()\n .name(\"cron\")\n .description(\"manage cron jobs — add, list, enable, disable\")\n\ncron\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list cron jobs\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, c] of Object.entries(config.crons || {}) as any) {\n const icon = c.enabled ? chalk.green(\"●\") : chalk.dim(\"○\")\n console.log(` ${icon} ${chalk.cyan(id)} — ${c.schedule} (${c.timezone})`)\n console.log(chalk.dim(` agent: ${c.agent} | timeout: ${c.timeout}s`))\n }\n if (!Object.keys(config.crons || {}).length) {\n console.log(chalk.dim(\" No cron jobs configured\"))\n }\n console.log()\n })\n\ncron\n .command(\"add\")\n .description(\"add a cron job\")\n .action(async () => {\n const config = loadConfig()\n const agentIds = Object.keys(config.agents || {})\n\n const answers = await prompts([\n { type: \"text\", name: \"id\", message: \"Job ID (kebab-case)\" },\n { type: \"text\", name: \"schedule\", message: \"Cron expression (e.g. '0 9 * * *')\" },\n { type: \"text\", name: \"timezone\", message: \"Timezone\", initial: \"UTC\" },\n { type: \"select\", name: \"agent\", message: \"Agent\", choices: agentIds.map(id => ({ title: id, value: id })) },\n { type: \"text\", name: \"prompt\", message: \"Task prompt\" },\n { type: \"number\", name: \"timeout\", message: \"Timeout (seconds)\", initial: 600 },\n { type: \"confirm\", name: \"enabled\", message: \"Enable now?\", initial: false },\n ])\n\n if (!answers.id || !answers.schedule) return\n\n config.crons = config.crons || {}\n config.crons[answers.id] = {\n enabled: answers.enabled,\n schedule: answers.schedule,\n timezone: answers.timezone,\n agent: answers.agent,\n prompt: answers.prompt,\n timeout: answers.timeout,\n onError: \"log\",\n }\n\n saveConfig(config)\n console.log(chalk.green(` Cron \"${answers.id}\" added (${answers.enabled ? \"enabled\" : \"disabled\"})`))\n console.log()\n })\n\ncron\n .command(\"enable <id>\")\n .description(\"enable a cron job\")\n .action((id) => {\n const config = loadConfig()\n if (!config.crons?.[id]) { console.log(chalk.red(` Cron \"${id}\" not found`)); return }\n config.crons[id].enabled = true\n saveConfig(config)\n console.log(chalk.green(` Cron \"${id}\" enabled`))\n })\n\ncron\n .command(\"disable <id>\")\n .description(\"disable a cron job\")\n .action((id) => {\n const config = loadConfig()\n if (!config.crons?.[id]) { console.log(chalk.red(` Cron \"${id}\" not found`)); return }\n config.crons[id].enabled = false\n saveConfig(config)\n console.log(chalk.green(` Cron \"${id}\" disabled`))\n })\n\n// ==================== agentx mesh ====================\n\nexport const mesh = new Command()\n .name(\"mesh\")\n .description(\"manage mesh peers — add, list, remove\")\n\nmesh\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list mesh peers\")\n .action(async () => {\n const config = loadConfig()\n console.log()\n if (!config.mesh?.enabled) {\n console.log(chalk.dim(\" Mesh: disabled\"))\n } else {\n console.log(chalk.bold(\" Mesh peers:\"))\n for (const peer of config.mesh.peers || []) {\n // Try health check\n let status = chalk.red(\"unreachable\")\n try {\n const res = await fetch(`${peer.url}/health`, { signal: AbortSignal.timeout(3000) })\n const data = await res.json() as any\n status = chalk.green(`healthy — ${data.agents?.length || 0} agents`)\n } catch {}\n console.log(` ${chalk.cyan(peer.name)} ${chalk.dim(peer.url)} ${status}`)\n }\n }\n console.log()\n })\n\nmesh\n .command(\"add\")\n .description(\"add a mesh peer (another agentx server)\")\n .action(async () => {\n const config = loadConfig()\n\n const answers = await prompts([\n { type: \"text\", name: \"name\", message: \"Peer name (e.g. 'server-2')\" },\n { type: \"text\", name: \"url\", message: \"Peer URL (e.g. 'http://100.67.108.119:18800')\" },\n { type: \"text\", name: \"token\", message: \"Auth token (optional, press enter to skip)\" },\n ])\n\n if (!answers.name || !answers.url) return\n\n // Verify connectivity\n try {\n const res = await fetch(`${answers.url}/.well-known/agent-card.json`, { signal: AbortSignal.timeout(5000) })\n const card = await res.json() as any\n console.log(chalk.green(` Connected: ${card.name} (${card.skills?.length || 0} agents)`))\n } catch {\n console.log(chalk.yellow(\" Could not reach peer (adding anyway)\"))\n }\n\n config.mesh = config.mesh || { enabled: false, peers: [], discovery: \"static\", healthCheck: { interval: 60, timeout: 10 } }\n config.mesh.enabled = true\n config.mesh.peers = config.mesh.peers || []\n config.mesh.peers.push({\n url: answers.url,\n name: answers.name,\n ...(answers.token ? { token: answers.token } : {}),\n })\n\n saveConfig(config)\n console.log(chalk.green(` Peer \"${answers.name}\" added`))\n console.log()\n })\n\nmesh\n .command(\"remove <name>\")\n .alias(\"rm\")\n .description(\"remove a mesh peer\")\n .action((name) => {\n const config = loadConfig()\n if (!config.mesh?.peers) return\n config.mesh.peers = config.mesh.peers.filter((p: any) => p.name !== name)\n if (config.mesh.peers.length === 0) config.mesh.enabled = false\n saveConfig(config)\n console.log(chalk.green(` Peer \"${name}\" removed`))\n })\n\n// ==================== agentx skill ====================\n\nexport const skillCmd = new Command()\n .name(\"skill\")\n .description(\"manage skills — add to agent(s), list\")\n\nskillCmd\n .command(\"add <skillPath>\")\n .description(\"add a skill to agent(s)\")\n .option(\"-a, --agent <agents...>\", \"target agent ID(s)\")\n .option(\"--all\", \"add to all agents\")\n .action(async (skillPath, opts) => {\n const config = loadConfig()\n const srcPath = resolve(skillPath)\n\n if (!existsSync(srcPath)) {\n console.log(chalk.red(` Skill not found: ${srcPath}`))\n return\n }\n\n // Determine skill name\n const skillName = existsSync(join(srcPath, \"SKILL.md\"))\n ? srcPath.split(\"/\").pop()!\n : srcPath.replace(/\\/SKILL\\.md$/, \"\").split(\"/\").pop()!\n\n // Determine target agents\n let targets: string[]\n if (opts.all) {\n targets = Object.keys(config.agents || {})\n } else if (opts.agent) {\n targets = opts.agent\n } else {\n const agentIds = Object.keys(config.agents || {})\n const answer = await prompts({\n type: \"multiselect\",\n name: \"agents\",\n message: \"Install to which agents?\",\n choices: agentIds.map(id => ({ title: `${id} (${config.agents[id].name})`, value: id })),\n })\n targets = answer.agents || []\n }\n\n for (const agentId of targets) {\n const agent = config.agents[agentId]\n if (!agent) { console.log(chalk.yellow(` Agent \"${agentId}\" not found, skipping`)); continue }\n\n const destDir = resolve(agent.workspace, \".claude/skills\", skillName)\n mkdirSync(destDir, { recursive: true })\n\n if (existsSync(join(srcPath, \"SKILL.md\"))) {\n // Copy entire skill directory\n cpSync(srcPath, destDir, { recursive: true })\n } else if (srcPath.endsWith(\".md\")) {\n // Single SKILL.md file\n cpSync(srcPath, join(destDir, \"SKILL.md\"))\n }\n\n console.log(chalk.green(` ${skillName} -> ${agentId} (${agent.workspace})`))\n }\n console.log()\n })\n\nskillCmd\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list skills per agent\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, a] of Object.entries(config.agents || {}) as any) {\n const skillsDir = resolve(a.workspace, \".claude/skills\")\n const skills = existsSync(skillsDir)\n ? readdirSync(skillsDir).filter((f: string) => !f.startsWith(\".\"))\n : []\n console.log(` ${chalk.cyan(id)}: ${skills.length ? skills.join(\", \") : chalk.dim(\"(none)\")}`)\n }\n console.log()\n })\n\n// ==================== agentx hook ====================\n\nexport const hook = new Command()\n .name(\"hook\")\n .description(\"manage hooks — add to agent workspace\")\n\nhook\n .command(\"add <agent>\")\n .description(\"add a hook to an agent's workspace settings\")\n .action(async (agentId) => {\n const config = loadConfig()\n const agent = config.agents?.[agentId]\n if (!agent) { console.log(chalk.red(` Agent \"${agentId}\" not found`)); return }\n\n const settingsPath = resolve(agent.workspace, \".claude/settings.json\")\n const settings = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, \"utf-8\")) : {}\n\n const answers = await prompts([\n { type: \"select\", name: \"event\", message: \"Hook event\", choices: [\n { title: \"PreToolUse — before any tool runs\", value: \"PreToolUse\" },\n { title: \"PostToolUse — after any tool runs\", value: \"PostToolUse\" },\n { title: \"SessionStart — when session begins\", value: \"SessionStart\" },\n { title: \"Notification — on notifications\", value: \"Notification\" },\n { title: \"Stop — before session stops\", value: \"Stop\" },\n ]},\n { type: \"select\", name: \"type\", message: \"Hook type\", choices: [\n { title: \"command — run a shell command\", value: \"command\" },\n { title: \"http — POST to a URL\", value: \"http\" },\n ]},\n { type: \"text\", name: \"value\", message: (prev: any) => prev === \"command\" ? \"Shell command\" : \"URL\" },\n { type: \"text\", name: \"matcher\", message: \"Matcher regex (optional, e.g. 'Bash' to match tool)\" },\n ])\n\n if (!answers.event || !answers.value) return\n\n settings.hooks = settings.hooks || {}\n settings.hooks[answers.event] = settings.hooks[answers.event] || []\n\n const hookDef: any = {\n type: answers.type,\n ...(answers.type === \"command\" ? { command: answers.value } : { url: answers.value }),\n }\n\n const entry: any = { hooks: [hookDef] }\n if (answers.matcher) entry.matcher = answers.matcher\n\n settings.hooks[answers.event].push(entry)\n\n mkdirSync(resolve(agent.workspace, \".claude\"), { recursive: true })\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2))\n console.log(chalk.green(` Hook added to ${agentId}: ${answers.event} -> ${answers.type}`))\n console.log()\n })\n\n// ==================== agentx migrate ====================\n\nexport const migrate = new Command()\n .name(\"migrate\")\n .description(\"import configuration from OpenClaw or other tools\")\n\nmigrate\n .command(\"openclaw [configPath]\")\n .description(\"import agents, channels, and crons from OpenClaw config\")\n .option(\"--dry-run\", \"show what would be imported without writing\")\n .action(async (configPath, opts) => {\n // Find OpenClaw config\n const searchPaths = [\n configPath,\n resolve(process.env.HOME || \"\", \".openclaw/openclaw.json\"),\n resolve(process.env.HOME || \"\", \".openclaw/clawdbot.json\"),\n ].filter(Boolean)\n\n let ocPath: string | undefined\n for (const p of searchPaths) {\n if (p && existsSync(p)) { ocPath = p; break }\n }\n\n if (!ocPath) {\n console.log(chalk.red(\" OpenClaw config not found. Pass the path: agentx migrate openclaw /path/to/config.json\"))\n return\n }\n\n console.log(chalk.dim(` Reading: ${ocPath}`))\n const oc = JSON.parse(readFileSync(ocPath, \"utf-8\"))\n\n const config = existsSync(resolve(process.cwd(), \"agentx.json\"))\n ? loadConfig()\n : { node: { id: \"imported\", name: \"Imported\", bind: \"127.0.0.1:18800\" }, providers: {}, agents: {}, channels: { telegram: { enabled: false, accounts: {}, policy: { dm: \"pair\", group: \"mention-required\" } }, whatsapp: { enabled: false } }, crons: {}, mesh: { enabled: false, peers: [] } }\n\n // Import agents\n const agents = oc.agents?.list || []\n const bindings = oc.bindings || []\n const bindMap: Record<string, string> = {}\n for (const b of bindings) {\n if (b.match?.channel === \"telegram\") {\n bindMap[b.match.accountId] = b.agentId\n }\n }\n // Default account -> main agent\n if (agents.find((a: any) => a.id === \"main\" || a.default)) {\n bindMap[\"default\"] = \"main\"\n }\n\n let agentCount = 0\n for (const a of agents) {\n if (a.workspace?.startsWith(\"/data\")) continue // skip remote devices\n\n const axId = a.id.replace(/-agent$/, \"\").replace(/^main$/, \"atlas\")\n const mentions = a.groupChat?.mentionPatterns || []\n if (!mentions.some((m: string) => m === axId)) mentions.push(axId)\n\n config.agents[axId] = {\n name: a.name,\n workspace: a.workspace,\n tier: \"claude-code\",\n model: \"claude-sonnet-4-6\",\n mentions,\n maxConcurrent: a.id === \"main\" ? 2 : 1,\n systemPrompt: `You are ${a.name} on AgentX.`,\n permissionMode: \"bypassPermissions\",\n }\n agentCount++\n\n if (!opts.dryRun) {\n mkdirSync(resolve(a.workspace, \".claude/skills\"), { recursive: true })\n }\n }\n console.log(` ${chalk.green(agentCount)} agents imported`)\n\n // Import Telegram accounts\n const tgAccounts = oc.channels?.telegram?.accounts || {}\n let tgCount = 0\n for (const [name, acc] of Object.entries(tgAccounts) as any) {\n if (!acc.botToken) continue\n const boundAgent = bindMap[name]\n const axAgentId = boundAgent?.replace(/-agent$/, \"\").replace(/^main$/, \"atlas\") || \"atlas\"\n\n config.channels.telegram.accounts[name] = {\n token: acc.botToken,\n agentBinding: axAgentId,\n }\n config.channels.telegram.enabled = true\n tgCount++\n }\n console.log(` ${chalk.green(tgCount)} Telegram accounts imported`)\n\n // Import cron jobs (from separate file if exists)\n const cronPath = resolve(ocPath, \"../cron/jobs.json\")\n if (existsSync(cronPath)) {\n const cronData = JSON.parse(readFileSync(cronPath, \"utf-8\"))\n let cronCount = 0\n for (const job of cronData.jobs || []) {\n const axId = job.name || job.id\n const agentId = job.agentId?.replace(/-agent$/, \"\").replace(/^main$/, \"atlas\") || \"atlas\"\n config.crons[axId] = {\n enabled: job.enabled || false,\n schedule: job.schedule?.expr || \"0 9 * * *\",\n timezone: job.schedule?.tz || \"UTC\",\n agent: agentId,\n prompt: job.payload?.message || \"\",\n timeout: job.payload?.timeoutSeconds || 600,\n onError: \"log\",\n }\n cronCount++\n }\n console.log(` ${chalk.green(cronCount)} cron jobs imported`)\n }\n\n if (opts.dryRun) {\n console.log(chalk.yellow(\"\\n Dry run — nothing written\"))\n console.log(JSON.stringify(config, null, 2))\n } else {\n saveConfig(config)\n console.log(chalk.green(\"\\n Migration complete! Review agentx.json and run: agentx daemon start\"))\n }\n console.log()\n })\n\n// ==================== agentx config ====================\n\nexport const configCmd = new Command()\n .name(\"config\")\n .description(\"validate and inspect configuration\")\n\nconfigCmd\n .command(\"check\")\n .description(\"validate agentx.json and check all workspaces\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .action(async (opts) => {\n console.log()\n try {\n const config = loadDaemonConfig(opts.config)\n console.log(chalk.green(\" ✓ Config valid\"))\n console.log(chalk.dim(` Node: ${config.node.name} (${config.node.id})`))\n console.log(chalk.dim(` Bind: ${config.node.bind}`))\n console.log(chalk.dim(` Agents: ${Object.keys(config.agents).length}`))\n console.log(chalk.dim(` Crons: ${Object.keys(config.crons).length}`))\n console.log(chalk.dim(` Mesh peers: ${config.mesh.peers.length}`))\n\n // Channels\n const tgAccounts = Object.keys(config.channels.telegram.accounts).length\n console.log(chalk.dim(` Telegram: ${config.channels.telegram.enabled ? `${tgAccounts} accounts` : \"disabled\"}`))\n console.log(chalk.dim(` WhatsApp: ${config.channels.whatsapp.enabled ? `${config.channels.whatsapp.routes.length} routes` : \"disabled\"}`))\n console.log(chalk.dim(` Discord: ${config.channels.discord?.enabled ? \"enabled\" : \"disabled\"}`))\n\n // Warnings\n const warnings = validateWorkspaces(config)\n if (warnings.length) {\n console.log()\n console.log(chalk.yellow(\" Warnings:\"))\n for (const w of warnings) {\n console.log(chalk.yellow(` ⚠ ${w}`))\n }\n } else {\n console.log(chalk.green(\" ✓ All workspaces valid\"))\n }\n\n // Check agent workspaces\n console.log()\n for (const [id, agent] of Object.entries(config.agents)) {\n const ws = agent.workspace\n const hasClaudeDir = existsSync(resolve(ws, \".claude\"))\n const hasClaudeMd = existsSync(resolve(ws, \"CLAUDE.md\"))\n const hasSettings = existsSync(resolve(ws, \".claude/settings.json\"))\n const skillCount = existsSync(resolve(ws, \".claude/skills\"))\n ? readdirSync(resolve(ws, \".claude/skills\")).filter(f => !f.startsWith(\".\")).length\n : 0\n\n const checks = [\n hasClaudeDir ? chalk.green(\"✓\") : chalk.red(\"✗\"),\n \".claude\",\n hasClaudeMd ? chalk.green(\"✓\") : chalk.yellow(\"○\"),\n \"CLAUDE.md\",\n hasSettings ? chalk.green(\"✓\") : chalk.yellow(\"○\"),\n \"settings\",\n `${skillCount} skills`,\n ]\n console.log(` ${chalk.cyan(id)}: ${checks.join(\" \")}`)\n }\n } catch (e: any) {\n console.log(chalk.red(` ✗ ${e.message}`))\n }\n console.log()\n })\n\nconfigCmd\n .command(\"show\")\n .description(\"print the resolved configuration\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .action((opts) => {\n try {\n const config = loadDaemonConfig(opts.config)\n console.log(JSON.stringify(config, null, 2))\n } catch (e: any) {\n console.log(chalk.red(e.message))\n }\n })\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport { loadDaemonConfig } from \"@/daemon/config\"\n\nexport const usage = new Command()\n .name(\"usage\")\n .description(\"token usage analysis and reporting\")\n\n// agentx usage — quick today summary\nusage\n .command(\"today\", { isDefault: true })\n .description(\"show today's token usage\")\n .action(async () => {\n try {\n const config = loadDaemonConfig()\n const [host, port] = config.node.bind.split(\":\")\n const res = await fetch(`http://${host || \"127.0.0.1\"}:${port}/usage`, { signal: AbortSignal.timeout(3000) })\n const data = await res.json() as any\n\n console.log()\n console.log(chalk.bold(` Token Usage (last 7 days)`))\n console.log()\n\n if (data.totalTasks === 0) {\n console.log(chalk.dim(\" No tasks recorded yet\"))\n console.log()\n return\n }\n\n const fmt = (n: number) => n.toLocaleString()\n\n console.log(` Total: ${chalk.bold(fmt(data.totalTokens))} tokens across ${data.totalTasks} tasks`)\n console.log(` Input: ${fmt(data.totalInput)}`)\n console.log(` Output: ${fmt(data.totalOutput)}`)\n console.log(` Cache read: ${fmt(data.totalCacheRead)}`)\n console.log(` Cache create: ${fmt(data.totalCacheCreate)}`)\n if (data.cacheHitRatio > 0) {\n console.log(` Cache hit: ${(data.cacheHitRatio * 100).toFixed(1)}%`)\n }\n if (data.totalErrors > 0) {\n console.log(` Errors: ${chalk.red(String(data.totalErrors))}`)\n }\n\n console.log()\n console.log(chalk.bold(\" By Agent:\"))\n const agents = Object.entries(data.byAgent || {}) as Array<[string, any]>\n agents.sort((a, b) => b[1].total - a[1].total)\n\n for (const [id, ag] of agents) {\n const total = fmt(ag.total || (ag.input + ag.output + ag.cacheRead + ag.cacheCreate))\n const avgMs = ag.avgDuration ? `${(ag.avgDuration / 1000).toFixed(1)}s avg` : \"\"\n console.log(` ${chalk.cyan(id)}: ${total} tokens (${ag.tasks} tasks) ${chalk.dim(avgMs)}`)\n }\n console.log()\n } catch (e: any) {\n if (e.cause?.code === \"ECONNREFUSED\") {\n console.log(chalk.red(\" Daemon not running. Start with: agentx daemon start\"))\n } else {\n console.log(chalk.red(` ${e.message}`))\n }\n }\n })\n\n// agentx usage report — run Python analyzer\nusage\n .command(\"report\")\n .description(\"run full session analysis (parses Claude Code JSONL files)\")\n .option(\"--days <n>\", \"analyze last N days\", \"7\")\n .action(async (opts) => {\n const { execSync } = await import(\"child_process\")\n const { existsSync } = await import(\"fs\")\n const { resolve } = await import(\"path\")\n\n const scriptPath = resolve(process.cwd(), \"scripts/token-report.py\")\n if (!existsSync(scriptPath)) {\n console.log(chalk.red(` Script not found: ${scriptPath}`))\n console.log(chalk.dim(\" The token analyzer script should be at scripts/token-report.py\"))\n return\n }\n\n console.log(chalk.dim(\" Analyzing Claude Code sessions...\"))\n try {\n execSync(`SINCE_DAYS=${opts.days} python3 \"${scriptPath}\"`, { stdio: \"inherit\" })\n } catch {\n console.log(chalk.red(\" Analysis failed. Is Python 3 installed?\"))\n }\n })\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport { WikiStore } from \"@/wiki\"\nimport { resolve } from \"path\"\nimport { execSync } from \"child_process\"\nimport { writeFileSync, mkdirSync } from \"fs\"\n\nfunction getWiki(wikiDir?: string): WikiStore {\n const dir = wikiDir || resolve(process.cwd(), \".agentx/wiki\")\n return new WikiStore(dir)\n}\n\nexport const wiki = new Command()\n .name(\"wiki\")\n .description(\"wiki knowledge base management\")\n\n// agentx wiki status\nwiki\n .command(\"status\")\n .description(\"show wiki status: entries, articles, unabsorbed count\")\n .option(\"--dir <path>\", \"wiki directory\")\n .action((opts) => {\n const store = getWiki(opts.dir)\n const entries = store.listEntries()\n const unabsorbed = store.getUnabsorbedEntries()\n const index = store.rebuildIndex()\n\n console.log()\n console.log(chalk.bold(\" Wiki Status\"))\n console.log()\n console.log(` Raw entries: ${entries.length}`)\n console.log(` Articles: ${index.articles.length}`)\n console.log(` Unabsorbed: ${chalk.yellow(String(unabsorbed.length))}`)\n console.log()\n\n if (unabsorbed.length > 0) {\n console.log(chalk.dim(\" Run 'agentx wiki absorb' to compile entries into articles\"))\n console.log()\n\n // Show unabsorbed by agent\n const byAgent = new Map<string, number>()\n for (const e of unabsorbed) {\n byAgent.set(e.agentId, (byAgent.get(e.agentId) || 0) + 1)\n }\n for (const [agent, count] of byAgent) {\n console.log(` ${chalk.cyan(agent)}: ${count} unabsorbed entries`)\n }\n console.log()\n }\n })\n\n// agentx wiki lint\nwiki\n .command(\"lint\")\n .description(\"check wiki for issues: broken links, orphans, stubs, unsourced\")\n .option(\"--dir <path>\", \"wiki directory\")\n .action((opts) => {\n const store = getWiki(opts.dir)\n const issues = store.lint()\n\n console.log()\n if (issues.length === 0) {\n console.log(chalk.green(\" No issues found\"))\n } else {\n console.log(chalk.bold(` ${issues.length} issues found:`))\n console.log()\n for (const issue of issues) {\n const icon = issue.type === \"broken-link\" ? \"x\" : issue.type === \"orphan\" ? \"?\" : \"!\"\n console.log(` [${icon}] ${chalk.dim(issue.type)} ${issue.article}: ${issue.message}`)\n }\n }\n console.log()\n })\n\n// agentx wiki absorb — compile unabsorbed entries into articles\nwiki\n .command(\"absorb\")\n .description(\"compile unabsorbed raw entries into wiki articles using Claude\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--dry-run\", \"show what would be absorbed without running\")\n .option(\"--max <n>\", \"max entries to process\", \"20\")\n .action(async (opts) => {\n const store = getWiki(opts.dir)\n const unabsorbed = store.getUnabsorbedEntries().slice(0, parseInt(opts.max))\n\n if (unabsorbed.length === 0) {\n console.log(chalk.green(\" All entries are absorbed. Nothing to do.\"))\n return\n }\n\n console.log(chalk.bold(` ${unabsorbed.length} entries to absorb`))\n console.log()\n\n // Group by agent\n const byAgent = new Map<string, typeof unabsorbed>()\n for (const entry of unabsorbed) {\n const list = byAgent.get(entry.agentId) || []\n list.push(entry)\n byAgent.set(entry.agentId, list)\n }\n\n for (const [agentId, entries] of byAgent) {\n console.log(` ${chalk.cyan(agentId)}: ${entries.length} entries`)\n for (const e of entries.slice(0, 3)) {\n console.log(chalk.dim(` [${e.date} via ${e.source}] ${e.content.slice(0, 80)}...`))\n }\n if (entries.length > 3) console.log(chalk.dim(` ... and ${entries.length - 3} more`))\n }\n console.log()\n\n if (opts.dryRun) {\n console.log(chalk.dim(\" Dry run — no changes made\"))\n return\n }\n\n // Build the absorb prompt with full entry content\n const existingArticles = store.rebuildIndex()\n const existingList = existingArticles.articles.length > 0\n ? `\\nExisting articles:\\n${existingArticles.articles.map(a => `- ${a.title} (${a.path})`).join(\"\\n\")}\\n`\n : \"\"\n\n const entryTexts = unabsorbed.map(e =>\n `--- ENTRY ${e.id} [${e.date} ${e.agentId} via ${e.source}] ---\\n${e.content}\\n--- END ENTRY ---`\n ).join(\"\\n\\n\")\n\n const prompt = `You are a wiki editor for an agent system. Your job is to compile raw conversation entries into structured wiki articles.\n\nRead these ${unabsorbed.length} raw entries and produce wiki articles in JSON format.\n${existingList}\nRules:\n1. Group related entries into articles by topic (e.g., \"Weekly Marketing Brief\", \"MTGL Deploy Process\", \"GitLab Token Issues\")\n2. Each article should synthesize information, not just copy-paste\n3. Use wikilinks [[Article Title]] to cross-reference related articles\n4. If an existing article covers the topic, produce an UPDATE with merged content\n5. Output ONLY valid JSON — no markdown fencing, no explanation\n\nOutput format (JSON array):\n[\n {\n \"path\": \"projects/mtgl-deploy.md\",\n \"title\": \"MTGL Deploy Process\",\n \"type\": \"process\",\n \"content\": \"How we deploy MTGL to staging...\\n\\nSee also [[GitLab Token Issues]]\",\n \"sources\": [\"entry-id-1\", \"entry-id-2\"]\n }\n]\n\nValid types: concept, process, project, decision, person, pattern, incident, report\n\nENTRIES:\n\n${entryTexts}`\n\n // Write prompt to temp file and run through Claude\n const tmpDir = resolve(store[\"baseDir\"], \"_tmp\")\n mkdirSync(tmpDir, { recursive: true })\n const promptPath = resolve(tmpDir, \"absorb-prompt.txt\")\n writeFileSync(promptPath, prompt)\n\n console.log(chalk.dim(\" Running Claude to compile articles...\"))\n\n try {\n let rawOutput: string\n try {\n rawOutput = execSync(\n `cat '${promptPath}' | claude -p - --output-format json --max-turns 5`,\n { encoding: \"utf-8\", timeout: 180_000, maxBuffer: 10 * 1024 * 1024 },\n )\n } catch (execErr: any) {\n // Claude exits non-zero on max_turns but stdout still has the result\n rawOutput = execErr.stdout || \"\"\n if (!rawOutput) throw execErr\n }\n\n // Parse Claude's JSON output\n let responseText: string\n try {\n const jsonOut = JSON.parse(rawOutput)\n responseText = jsonOut.result || jsonOut.content || rawOutput\n } catch {\n responseText = rawOutput\n }\n\n // Extract JSON array from response\n const jsonMatch = responseText.match(/\\[[\\s\\S]*\\]/)\n if (!jsonMatch) {\n console.log(chalk.red(\" Claude didn't return valid JSON. Raw output:\"))\n console.log(responseText.slice(0, 500))\n return\n }\n\n const articles = JSON.parse(jsonMatch[0]) as Array<{\n path: string\n title: string\n type: string\n content: string\n sources: string[]\n }>\n\n console.log(chalk.green(` Claude produced ${articles.length} articles:`))\n console.log()\n\n for (const article of articles) {\n const now = new Date().toISOString().slice(0, 10)\n // Determine owner from the majority of source entries\n const sourceAgents = article.sources\n .map(sid => unabsorbed.find(e => e.id === sid)?.agentId)\n .filter(Boolean) as string[]\n const owner = sourceAgents[0] || unabsorbed[0]?.agentId || \"system\"\n\n store.writeArticle(article.path, {\n title: article.title,\n type: article.type as any,\n owner,\n access: \"internal\",\n created: now,\n lastUpdated: now,\n related: [],\n sources: article.sources,\n }, article.content, owner)\n\n console.log(` ${chalk.green(\"+\")} ${article.path}: ${article.title}`)\n console.log(chalk.dim(` sources: ${article.sources.join(\", \")}`))\n }\n\n // Rebuild index\n store.rebuildIndex()\n console.log()\n console.log(chalk.green(\" Index rebuilt. Done.\"))\n\n } catch (e: any) {\n console.log(chalk.red(` Absorb failed: ${e.message?.slice(0, 200)}`))\n if (e.stderr) console.log(chalk.dim(String(e.stderr).slice(0, 500)))\n if (e.stdout) console.log(chalk.dim(\"stdout: \" + String(e.stdout).slice(0, 500)))\n }\n })\n\n// agentx wiki entries — list raw entries\nwiki\n .command(\"entries\")\n .description(\"list raw entries\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--agent <id>\", \"filter by agent\")\n .action((opts) => {\n const store = getWiki(opts.dir)\n let entries = store.listEntries()\n\n if (opts.agent) {\n entries = entries.filter(e => e.agentId === opts.agent)\n }\n\n console.log()\n console.log(chalk.bold(` ${entries.length} raw entries`))\n console.log()\n\n for (const e of entries.slice(-20)) {\n console.log(` ${chalk.dim(e.date)} ${chalk.cyan(e.agentId)} via ${e.source}: ${e.content.slice(0, 80)}...`)\n }\n\n if (entries.length > 20) {\n console.log(chalk.dim(` ... showing last 20 of ${entries.length}`))\n }\n console.log()\n })\n\n// agentx wiki search <query>\nwiki\n .command(\"search <query>\")\n .description(\"search wiki articles\")\n .option(\"--dir <path>\", \"wiki directory\")\n .action((query, opts) => {\n const store = getWiki(opts.dir)\n const results = store.findRelevant(query, undefined, 10)\n\n console.log()\n if (results.length === 0) {\n console.log(chalk.dim(\" No matching articles\"))\n } else {\n console.log(chalk.bold(` ${results.length} results for \"${query}\":`))\n console.log()\n for (const r of results) {\n console.log(` ${chalk.cyan(r.meta.title)} (${r.meta.type})`)\n console.log(chalk.dim(` ${r.path} — ${r.content.slice(0, 100)}...`))\n }\n }\n console.log()\n })\n"],"mappings":"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","names":["Command","Command","chalk","daemon","Command","opts","spawn","args","child","writeFileSync","AgentXDaemon","readFileSync","existsSync","unlinkSync","resolve","pidFiles","pidFile","pid","r","execSync","config","loadDaemonConfig","host","port","url","data","formatDuration","a","active","errors","enabledCrons","icon","next","p","skills","e","warnings","validateWorkspaces","w","err","spawnProc","logFile","tail","agent","messageParts","message","baseUrl","body","sshKey","remote","statSync","cliPath","ssh","seconds","Command","chalk","existsSync","readFileSync","writeFileSync","mkdirSync","resolve","init","opts","cwd","configPath","envPath","sessionsDir","examplePaths","example","p","claudeDir","Command","chalk","prompts","readFileSync","writeFileSync","existsSync","mkdirSync","cpSync","readdirSync","resolve","join","loadConfig","p","resolve","existsSync","readFileSync","saveConfig","config","writeFileSync","agent","Command","id","a","mentions","chalk","answers","prompts","v","ws","join","mkdirSync","claudeMd","wikiSkillSrc","wikiSkillDist","skillSrc","cpSync","m","channel","tg","name","acc","wa","route","target","dc","gl","agentIds","agentChoices","channelType","data","botHandle","agentMentions","e","routes","addMore","prev","cron","c","icon","mesh","peer","status","card","skillCmd","skillPath","opts","srcPath","skillName","targets","agentId","destDir","skillsDir","skills","readdirSync","f","hook","settingsPath","settings","entry","migrate","configPath","searchPaths","ocPath","oc","agents","bindings","bindMap","b","agentCount","axId","tgAccounts","tgCount","axAgentId","cronPath","cronData","cronCount","job","configCmd","loadDaemonConfig","warnings","validateWorkspaces","w","hasClaudeDir","hasClaudeMd","hasSettings","skillCount","checks","Command","chalk","usage","Command","config","loadDaemonConfig","host","port","data","chalk","fmt","n","agents","a","b","id","ag","total","avgMs","opts","execSync","existsSync","resolve","scriptPath","Command","chalk","resolve","execSync","writeFileSync","mkdirSync","getWiki","wikiDir","dir","WikiStore","wiki","Command","opts","store","entries","unabsorbed","index","chalk","byAgent","e","agent","count","issues","issue","icon","entry","list","agentId","existingArticles","existingList","a","entryTexts","prompt","tmpDir","promptPath","rawOutput","execErr","responseText","jsonOut","jsonMatch","articles","article","now","owner","sid","query","results","r","main","packageInfo","getPackageInfo","program","Command","daemon","init","agent","channel","cron","mesh","skillCmd","hook","migrate","configCmd","usage","wiki"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/daemon.ts","../src/commands/init.ts","../src/commands/manage.ts","../src/commands/usage.ts","../src/commands/wiki.ts","../src/wiki/serve.ts","../src/wiki/mesh.ts","../src/wiki/prompts.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\"\nimport { daemon } from \"@/commands/daemon\"\nimport { init } from \"@/commands/init\"\nimport { agent, channel, cron, mesh, skillCmd, hook, migrate, configCmd } from \"@/commands/manage\"\nimport { usage } from \"@/commands/usage\"\nimport { wiki } from \"@/commands/wiki\"\nimport { getPackageInfo } from \"@/utils/get-package-info\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nasync function main() {\n const packageInfo = await getPackageInfo()\n\n const program = new Command()\n .name(\"agentx\")\n .description(\n \"self-hosted multi-agent orchestrator — Telegram, WhatsApp, crons, A2A mesh, wiki knowledge\"\n )\n .version(\n packageInfo.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program\n .addCommand(daemon)\n .addCommand(init)\n .addCommand(agent)\n .addCommand(channel)\n .addCommand(cron)\n .addCommand(mesh)\n .addCommand(skillCmd)\n .addCommand(hook)\n .addCommand(migrate)\n .addCommand(configCmd)\n .addCommand(usage)\n .addCommand(wiki)\n\n const args = process.argv.slice(2)\n if (args.length === 0) {\n program.outputHelp()\n return\n }\n\n program.parse()\n}\n\nmain()\n","import { Command } from \"commander\"\nimport { AgentXDaemon } from \"@/daemon\"\nimport { loadDaemonConfig, validateWorkspaces } from \"@/daemon/config\"\nimport chalk from \"chalk\"\n\n// --- agentx daemon: start/stop/status/logs ---\n\nexport const daemon = new Command()\n .name(\"daemon\")\n .description(\"manage the agentx daemon — start, stop, status, logs\")\n\n// agentx daemon start\ndaemon\n .command(\"start\")\n .description(\"start the daemon (default if no subcommand)\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"-d, --detach\", \"run in background (detached)\")\n .option(\"--port <port>\", \"override bind port\")\n .action(async (opts) => {\n if (opts.detach) {\n const { spawn } = await import(\"child_process\")\n const args = [\"dist/cli.js\", \"daemon\", \"start\"]\n if (opts.config) args.push(\"-c\", opts.config)\n if (opts.port) args.push(\"--port\", opts.port)\n\n const child = spawn(\"node\", args, {\n detached: true,\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n cwd: process.cwd(),\n })\n child.unref()\n\n const { writeFileSync } = await import(\"fs\")\n writeFileSync(\"/tmp/agentx-daemon.pid\", String(child.pid))\n console.log(chalk.green(`Daemon started in background (PID: ${child.pid})`))\n console.log(chalk.dim(` Logs: tail -f /tmp/agentx-daemon.log`))\n console.log(chalk.dim(` Stop: agentx daemon stop`))\n return\n }\n\n // Single-instance guard — only one daemon can run at a time.\n // If another process is alive with the recorded PID, exit immediately.\n const { readFileSync, writeFileSync, mkdirSync, existsSync } = await import(\"fs\")\n const { resolve } = await import(\"path\")\n const lockDir = resolve(process.cwd(), \".agentx\")\n if (!existsSync(lockDir)) mkdirSync(lockDir, { recursive: true })\n const pidPath = resolve(lockDir, \"daemon.pid\")\n\n if (existsSync(pidPath)) {\n const oldPid = parseInt(readFileSync(pidPath, \"utf-8\").trim(), 10)\n if (oldPid && oldPid !== process.pid) {\n try {\n process.kill(oldPid, 0) // throws if process doesn't exist\n console.error(`Another agentx daemon is already running (PID ${oldPid}). Exiting.`)\n process.exit(0)\n } catch {\n // Old process is dead — we can proceed\n }\n }\n }\n writeFileSync(pidPath, String(process.pid))\n\n const d = new AgentXDaemon(opts.config)\n await d.start()\n })\n\n// agentx daemon stop\ndaemon\n .command(\"stop\")\n .description(\"stop the running daemon\")\n .action(async () => {\n const { readFileSync, existsSync, unlinkSync } = await import(\"fs\")\n const { resolve } = await import(\"path\")\n\n // Check both PID file locations\n const pidFiles = [\n resolve(process.cwd(), \".agentx/daemon.pid\"),\n \"/tmp/agentx-daemon.pid\",\n ]\n\n for (const pidFile of pidFiles) {\n if (!existsSync(pidFile)) continue\n try {\n const pid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10)\n process.kill(pid, \"SIGTERM\")\n // Wait briefly for graceful shutdown\n await new Promise(r => setTimeout(r, 2000))\n try { unlinkSync(pidFile) } catch {}\n console.log(chalk.green(`Daemon stopped (PID: ${pid})`))\n return\n } catch {\n try { unlinkSync(pidFile) } catch {}\n }\n }\n\n // Fallback: kill by process name\n const { execSync } = await import(\"child_process\")\n try {\n execSync(\"pkill -f 'node dist/cli.js daemon'\", { stdio: \"ignore\" })\n console.log(chalk.green(\"Daemon stopped\"))\n } catch {\n console.log(chalk.yellow(\"No daemon process found\"))\n }\n })\n\n// agentx daemon status\ndaemon\n .command(\"status\")\n .alias(\"st\")\n .description(\"show daemon status, agents, crons, and mesh\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"--json\", \"output as JSON\")\n .action(async (opts) => {\n // Try connecting to running daemon first\n try {\n const config = loadDaemonConfig(opts.config)\n const [host, port] = config.node.bind.split(\":\")\n const url = `http://${host || \"127.0.0.1\"}:${port}/health`\n const res = await fetch(url, { signal: AbortSignal.timeout(3000) })\n const data = await res.json() as any\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n console.log()\n console.log(chalk.bold(` ${data.node.name}`) + chalk.dim(` (${data.node.id})`))\n console.log(chalk.green(\" Status: running\") + chalk.dim(` — uptime ${formatDuration(data.uptime)}`))\n console.log()\n\n // Agents\n console.log(chalk.bold(\" Agents:\"))\n for (const a of data.agents) {\n const active = a.active > 0 ? chalk.yellow(` [${a.active} active]`) : \"\"\n const errors = a.errors > 0 ? chalk.red(` (${a.errors} errors)`) : \"\"\n console.log(` ${chalk.cyan(a.name)} ${chalk.dim(`(${a.tier})`)}${active}${errors}`)\n console.log(chalk.dim(` ${a.workspace}`))\n }\n\n // Crons\n const enabledCrons = data.crons.filter((c: any) => c.enabled)\n if (data.crons.length) {\n console.log()\n console.log(chalk.bold(` Crons: ${enabledCrons.length} enabled / ${data.crons.length} total`))\n for (const c of data.crons) {\n const icon = c.enabled ? chalk.green(\"●\") : chalk.dim(\"○\")\n const next = c.nextRun ? chalk.dim(` next: ${new Date(c.nextRun).toLocaleTimeString()}`) : \"\"\n console.log(` ${icon} ${c.id}${next}`)\n }\n }\n\n // Mesh\n if (data.mesh?.length) {\n console.log()\n console.log(chalk.bold(\" Mesh:\"))\n for (const p of data.mesh) {\n const icon = p.healthy ? chalk.green(\"●\") : chalk.red(\"●\")\n const skills = p.skills?.length ? chalk.dim(` (${p.skills.length} agents)`) : \"\"\n console.log(` ${icon} ${p.peer} ${chalk.dim(p.peerUrl)}${skills}`)\n }\n }\n\n console.log()\n } catch (e: any) {\n if (e.cause?.code === \"ECONNREFUSED\" || e.name === \"TimeoutError\") {\n console.log(chalk.red(\" Daemon is not running\"))\n console.log(chalk.dim(\" Start with: agentx daemon start\"))\n } else {\n // No running daemon — show config info\n try {\n const config = loadDaemonConfig(opts.config)\n const warnings = validateWorkspaces(config)\n console.log()\n console.log(chalk.bold(` ${config.node.name}`) + chalk.dim(` (${config.node.id})`))\n console.log(chalk.yellow(\" Status: stopped\"))\n console.log(chalk.dim(` ${Object.keys(config.agents).length} agents, ${Object.keys(config.crons).length} crons configured`))\n if (warnings.length) {\n console.log()\n for (const w of warnings) console.log(chalk.yellow(` ⚠ ${w}`))\n }\n console.log()\n } catch (err: any) {\n console.log(chalk.red(` ${err.message}`))\n }\n }\n }\n })\n\n// agentx daemon logs\ndaemon\n .command(\"logs\")\n .description(\"tail daemon logs\")\n .option(\"-n, --lines <n>\", \"number of lines\", \"50\")\n .option(\"-f, --follow\", \"follow log output\", false)\n .action(async (opts) => {\n const { execSync, spawn: spawnProc } = await import(\"child_process\")\n const logFile = \"/tmp/agentx-daemon.log\"\n\n const { existsSync } = await import(\"fs\")\n if (!existsSync(logFile)) {\n console.log(chalk.yellow(\"No log file found at /tmp/agentx-daemon.log\"))\n return\n }\n\n if (opts.follow) {\n const tail = spawnProc(\"tail\", [\"-f\", \"-n\", opts.lines, logFile], { stdio: \"inherit\" })\n process.on(\"SIGINT\", () => { tail.kill(); process.exit(0) })\n } else {\n execSync(`tail -n ${opts.lines} ${logFile}`, { stdio: \"inherit\" })\n }\n })\n\n// agentx daemon watch — live stream of agent activity\ndaemon\n .command(\"watch\")\n .description(\"stream live agent activity (SSE)\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .action(async (opts) => {\n const config = loadDaemonConfig(opts.config)\n const bind = config.node.bind || \"127.0.0.1:18800\"\n const url = `http://${bind.replace(\"0.0.0.0\", \"127.0.0.1\")}/events`\n\n console.log(chalk.dim(` Connecting to ${url}...`))\n console.log(chalk.dim(\" Press Ctrl+C to stop\\n\"))\n\n try {\n const res = await fetch(url)\n if (!res.ok || !res.body) {\n console.log(chalk.red(` Failed: ${res.status}`))\n return\n }\n const reader = res.body.getReader()\n const decoder = new TextDecoder()\n let buffer = \"\"\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const data = JSON.parse(line.slice(6))\n const time = new Date(data.time).toLocaleTimeString()\n const msg = data.message?.replace(/^\\[agentx\\]\\s*/, \"\") || \"\"\n // Color-code by content\n if (msg.includes(\"executing\")) console.log(`${chalk.dim(time)} ${chalk.cyan(\"▶\")} ${msg}`)\n else if (msg.includes(\"completed\")) console.log(`${chalk.dim(time)} ${chalk.green(\"✓\")} ${msg}`)\n else if (msg.includes(\"error\") || msg.includes(\"Error\")) console.log(`${chalk.dim(time)} ${chalk.red(\"✗\")} ${msg}`)\n else if (msg.includes(\"Routing\")) console.log(`${chalk.dim(time)} ${chalk.yellow(\"→\")} ${msg}`)\n else if (msg.includes(\"mention\")) console.log(`${chalk.dim(time)} ${chalk.magenta(\"@\")} ${msg}`)\n else if (msg.includes(\"Skipping\")) console.log(`${chalk.dim(time)} ${chalk.dim(\"⊘\")} ${chalk.dim(msg)}`)\n else console.log(`${chalk.dim(time)} ${msg}`)\n } catch { /* skip malformed */ }\n } else if (line.startsWith(\"event: status\")) {\n // First event — show current state\n }\n }\n }\n } catch (e: any) {\n console.log(chalk.red(` Connection failed: ${e.message}`))\n console.log(chalk.dim(\" Is the daemon running? Try: agentx daemon status\"))\n }\n })\n\n// agentx daemon send — send a task to an agent\ndaemon\n .command(\"send <agent> <message...>\")\n .description(\"send a task to an agent via the daemon API\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"--peer <peer>\", \"send to a mesh peer's agent\")\n .option(\"--json\", \"output raw JSON response\")\n .action(async (agent, messageParts, opts) => {\n const message = messageParts.join(\" \")\n\n try {\n const config = loadDaemonConfig(opts.config)\n const [host, port] = config.node.bind.split(\":\")\n const baseUrl = `http://${host || \"127.0.0.1\"}:${port}`\n\n let url: string\n let body: Record<string, unknown>\n\n if (opts.peer) {\n url = `${baseUrl}/mesh/task`\n body = { peer: opts.peer, message, agent }\n } else {\n url = `${baseUrl}/task`\n body = { agent, message }\n }\n\n console.log(chalk.dim(` Sending to ${opts.peer ? `${opts.peer}/${agent}` : agent}...`))\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n const data = await res.json() as any\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2))\n } else if (data.error) {\n console.log(chalk.red(` Error: ${data.error}`))\n } else {\n console.log()\n console.log(data.content || data.response || \"No response\")\n if (data.duration) {\n console.log(chalk.dim(`\\n (${(data.duration / 1000).toFixed(1)}s)`))\n }\n }\n } catch (e: any) {\n console.log(chalk.red(` Failed: ${e.message}`))\n console.log(chalk.dim(\" Is the daemon running? Try: agentx daemon status\"))\n }\n })\n\n// agentx daemon deploy — rsync dist to a remote server\ndaemon\n .command(\"deploy <host>\")\n .description(\"deploy agentx to a remote server via rsync\")\n .option(\"-i, --identity <key>\", \"SSH identity file\")\n .option(\"-u, --user <user>\", \"SSH user\", \"root\")\n .option(\"-p, --path <path>\", \"remote agentx path\", \"~/agentx\")\n .option(\"--restart\", \"restart remote daemon after deploy\", false)\n .option(\"--skip-checks\", \"skip build and test before deploy\", false)\n .action(async (host, opts) => {\n const { execSync } = await import(\"child_process\")\n const sshKey = opts.identity ? `-e \"ssh -i ${opts.identity}\"` : \"\"\n const remote = `${opts.user}@${host}:${opts.path}/dist/`\n\n // Pre-deploy checks\n if (!opts.skipChecks) {\n try {\n console.log(chalk.dim(\" Running tests...\"))\n execSync(\"npx vitest run --reporter=dot\", { stdio: \"pipe\", cwd: process.cwd() })\n console.log(chalk.green(\" ✓ Tests passed\"))\n } catch (e: any) {\n console.log(chalk.red(\" ✗ Tests failed — aborting deploy\"))\n console.log(chalk.dim(\" Use --skip-checks to deploy anyway\"))\n return\n }\n\n // Check dist exists and is recent\n const { existsSync, statSync } = await import(\"fs\")\n const { resolve } = await import(\"path\")\n const cliPath = resolve(process.cwd(), \"dist/cli.js\")\n if (!existsSync(cliPath)) {\n console.log(chalk.red(\" ✗ dist/ not found — run build first\"))\n return\n }\n const age = Date.now() - statSync(cliPath).mtimeMs\n if (age > 300_000) {\n console.log(chalk.yellow(\" ⚠ dist/ is older than 5 minutes — rebuilding...\"))\n execSync(\"npx tsup --no-dts\", { stdio: \"pipe\", cwd: process.cwd() })\n console.log(chalk.green(\" ✓ Build complete\"))\n }\n }\n\n console.log(chalk.dim(` Deploying to ${opts.user}@${host}:${opts.path}...`))\n\n try {\n execSync(`rsync -avzL --delete ${sshKey} dist/ ${remote}`, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n })\n console.log(chalk.green(\" ✓ Deploy complete\"))\n\n if (opts.restart) {\n console.log(chalk.dim(\" Restarting remote daemon...\"))\n const ssh = opts.identity ? `ssh -i ${opts.identity}` : \"ssh\"\n execSync(\n `${ssh} ${opts.user}@${host} \"pkill -f 'node dist/cli.js daemon' 2>/dev/null; sleep 2; cd ${opts.path} && nohup node dist/cli.js daemon start > /tmp/agentx-daemon.log 2>&1 &\"`,\n { stdio: \"inherit\" },\n )\n console.log(chalk.green(\" Remote daemon restarted\"))\n }\n } catch (e: any) {\n console.log(chalk.red(` Deploy failed: ${e.message}`))\n }\n })\n\n// Default: `agentx daemon` without subcommand starts the daemon\ndaemon.action(async (opts) => {\n const d = new AgentXDaemon(opts.config)\n await d.start()\n})\n\nfunction formatDuration(seconds: number): string {\n if (seconds < 60) return `${Math.round(seconds)}s`\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`\n if (seconds < 86400) return `${Math.round(seconds / 3600)}h ${Math.round((seconds % 3600) / 60)}m`\n return `${Math.round(seconds / 86400)}d ${Math.round((seconds % 86400) / 3600)}h`\n}\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"fs\"\nimport { resolve, join } from \"path\"\n\n// --- agentx init: interactive setup for new installations ---\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize agentx configuration in the current directory\")\n .option(\"--force\", \"overwrite existing config\")\n .action(async (opts) => {\n const cwd = process.cwd()\n const configPath = resolve(cwd, \"agentx.json\")\n const envPath = resolve(cwd, \".env\")\n const sessionsDir = resolve(cwd, \".agentx/sessions\")\n\n console.log()\n console.log(chalk.bold(\" agentx init\"))\n console.log()\n\n // Check existing config\n if (existsSync(configPath) && !opts.force) {\n console.log(chalk.yellow(` agentx.json already exists. Use --force to overwrite.`))\n console.log()\n return\n }\n\n // Find example config\n const examplePaths = [\n resolve(cwd, \"agentx.example.json\"),\n resolve(cwd, \"node_modules/agentix-cli/agentx.example.json\"),\n ]\n\n let example: string | undefined\n for (const p of examplePaths) {\n if (existsSync(p)) {\n example = readFileSync(p, \"utf-8\")\n break\n }\n }\n\n if (!example) {\n // Generate minimal config\n example = JSON.stringify({\n node: {\n id: require(\"os\").hostname().toLowerCase().replace(/[^a-z0-9-]/g, \"-\"),\n name: require(\"os\").hostname(),\n bind: \"127.0.0.1:18800\",\n },\n providers: {\n claude: { apiKey: \"${ANTHROPIC_API_KEY}\" },\n },\n agents: {\n assistant: {\n name: \"Assistant\",\n workspace: cwd,\n tier: \"claude-code\",\n model: \"claude-sonnet-4-6\",\n mentions: [\"@assistant\", \"assistant\"],\n maxConcurrent: 2,\n systemPrompt: \"You are a helpful assistant.\",\n permissionMode: \"default\",\n },\n },\n channels: {\n telegram: {\n enabled: false,\n accounts: {},\n policy: { dm: \"pair\", group: \"mention-required\" },\n },\n whatsapp: { enabled: false },\n },\n crons: {},\n mesh: {\n enabled: false,\n peers: [],\n discovery: \"static\",\n healthCheck: { interval: 60, timeout: 10 },\n },\n }, null, 2)\n }\n\n // Write config\n writeFileSync(configPath, example)\n console.log(chalk.green(` ✓ Created agentx.json`))\n\n // Create .env template\n if (!existsSync(envPath)) {\n writeFileSync(envPath, [\n \"# AgentX environment variables\",\n \"# ANTHROPIC_API_KEY=sk-ant-...\",\n \"# TG_BOT_TOKEN=123456:ABC...\",\n \"# MESH_TOKEN=your-mesh-secret\",\n \"\",\n ].join(\"\\n\"))\n console.log(chalk.green(` ✓ Created .env template`))\n }\n\n // Create session dir\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true })\n console.log(chalk.green(` ✓ Created .agentx/sessions/`))\n }\n\n // Create workspace .claude dir\n const claudeDir = resolve(cwd, \".claude\")\n if (!existsSync(claudeDir)) {\n mkdirSync(claudeDir, { recursive: true })\n console.log(chalk.green(` ✓ Created .claude/`))\n }\n\n console.log()\n console.log(chalk.bold(\" Next steps:\"))\n console.log(` 1. Edit ${chalk.cyan(\"agentx.json\")} — configure agents, channels, crons`)\n console.log(` 2. Edit ${chalk.cyan(\".env\")} — add API keys and bot tokens`)\n console.log(` 3. Run ${chalk.cyan(\"agentx daemon start\")} — start the daemon`)\n console.log(` 4. Run ${chalk.cyan(\"agentx daemon status\")} — verify everything`)\n console.log()\n })\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport prompts from \"prompts\"\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, cpSync, readdirSync } from \"fs\"\nimport { resolve, join } from \"path\"\nimport { loadDaemonConfig, validateWorkspaces } from \"@/daemon/config\"\n\n// --- agentx agent/channel/cron/mesh/skill/hook management commands ---\n\nfunction loadConfig(): any {\n const p = resolve(process.cwd(), \"agentx.json\")\n if (!existsSync(p)) throw new Error(\"No agentx.json found. Run: agentx init\")\n return JSON.parse(readFileSync(p, \"utf-8\"))\n}\n\nfunction saveConfig(config: any): void {\n writeFileSync(resolve(process.cwd(), \"agentx.json\"), JSON.stringify(config, null, 2))\n}\n\n// ==================== agentx agent ====================\n\nexport const agent = new Command()\n .name(\"agent\")\n .description(\"manage agents — add, list, remove\")\n\nagent\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list configured agents\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, a] of Object.entries(config.agents || {}) as any) {\n const mentions = a.mentions?.join(\", \") || \"\"\n console.log(` ${chalk.cyan(id)} — ${a.name} (${a.tier})`)\n console.log(chalk.dim(` workspace: ${a.workspace}`))\n if (mentions) console.log(chalk.dim(` mentions: ${mentions}`))\n }\n console.log()\n })\n\nagent\n .command(\"add\")\n .description(\"add a new agent interactively\")\n .action(async () => {\n const config = loadConfig()\n\n const answers = await prompts([\n { type: \"text\", name: \"id\", message: \"Agent ID (kebab-case)\", validate: (v: string) => /^[a-z0-9-]+$/.test(v) || \"Use lowercase, numbers, hyphens\" },\n { type: \"text\", name: \"name\", message: \"Display name\" },\n { type: \"text\", name: \"workspace\", message: \"Workspace path\", initial: resolve(process.cwd(), \"agents/\") },\n { type: \"select\", name: \"tier\", message: \"Execution tier\", choices: [\n { title: \"claude-code (subscription, full features)\", value: \"claude-code\" },\n { title: \"sdk (API key, programmatic)\", value: \"sdk\" },\n { title: \"orchestrator (any provider)\", value: \"orchestrator\" },\n ]},\n { type: \"text\", name: \"model\", message: \"Model\", initial: \"claude-sonnet-4-6\" },\n { type: \"list\", name: \"mentions\", message: \"Mention patterns (comma-separated)\", separator: \",\" },\n { type: \"number\", name: \"maxConcurrent\", message: \"Max concurrent tasks\", initial: 2 },\n { type: \"text\", name: \"systemPrompt\", message: \"System prompt\" },\n ])\n\n if (!answers.id) return\n\n // Create workspace + .claude dir\n const ws = answers.workspace.endsWith(answers.id) ? answers.workspace : join(answers.workspace, answers.id)\n mkdirSync(resolve(ws, \".claude/skills\"), { recursive: true })\n\n // Create CLAUDE.md\n const claudeMd = `# ${answers.name}\\n\\n${answers.systemPrompt}\\n`\n writeFileSync(resolve(ws, \"CLAUDE.md\"), claudeMd)\n\n // Create default settings.json\n writeFileSync(resolve(ws, \".claude/settings.json\"), JSON.stringify({\n permissions: {\n allow: [\"Bash(git *)\", \"Bash(curl *)\", \"Bash(node *)\", \"Read\", \"Write\", \"Edit\", \"Glob\", \"Grep\", \"WebFetch\", \"WebSearch\"],\n },\n }, null, 2))\n\n // Install wiki skill\n const wikiSkillSrc = resolve(process.cwd(), \"src/wiki/SKILL.md\")\n const wikiSkillDist = resolve(__dirname, \"../wiki/SKILL.md\")\n const skillSrc = existsSync(wikiSkillSrc) ? wikiSkillSrc : wikiSkillDist\n if (existsSync(skillSrc)) {\n mkdirSync(resolve(ws, \".claude/skills/wiki\"), { recursive: true })\n cpSync(skillSrc, resolve(ws, \".claude/skills/wiki/SKILL.md\"))\n }\n\n // Add to config\n config.agents = config.agents || {}\n config.agents[answers.id] = {\n name: answers.name,\n workspace: ws,\n tier: answers.tier,\n model: answers.model,\n mentions: answers.mentions?.map((m: string) => m.trim()).filter(Boolean) || [],\n maxConcurrent: answers.maxConcurrent,\n systemPrompt: answers.systemPrompt,\n permissionMode: \"default\",\n }\n\n saveConfig(config)\n console.log(chalk.green(`\\n Agent \"${answers.id}\" added`))\n console.log(chalk.dim(` Workspace: ${ws}`))\n console.log(chalk.dim(` Wiki skill installed`))\n console.log(chalk.dim(` CLAUDE.md + settings.json created`))\n console.log()\n })\n\nagent\n .command(\"remove <id>\")\n .alias(\"rm\")\n .description(\"remove an agent from config (keeps workspace)\")\n .action((id) => {\n const config = loadConfig()\n if (!config.agents?.[id]) {\n console.log(chalk.red(` Agent \"${id}\" not found`))\n return\n }\n delete config.agents[id]\n saveConfig(config)\n console.log(chalk.green(` Agent \"${id}\" removed from config (workspace preserved)`))\n })\n\n// ==================== agentx channel ====================\n\nexport const channel = new Command()\n .name(\"channel\")\n .description(\"manage channels — add telegram/whatsapp/discord, list\")\n\nchannel\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list configured channels and bindings\")\n .action(() => {\n const config = loadConfig()\n console.log()\n\n // Telegram\n const tg = config.channels?.telegram\n if (tg?.enabled) {\n console.log(chalk.bold(\" Telegram:\"))\n for (const [name, acc] of Object.entries(tg.accounts || {}) as any) {\n console.log(` ${chalk.cyan(name)} -> agent: ${acc.agentBinding}`)\n }\n } else {\n console.log(chalk.dim(\" Telegram: disabled\"))\n }\n\n // WhatsApp\n const wa = config.channels?.whatsapp\n if (wa?.enabled) {\n console.log(chalk.bold(\" WhatsApp:\"))\n console.log(` default agent: ${wa.defaultAgent || \"(none)\"}`)\n console.log(` session: ${wa.sessionDir || \".agentx/whatsapp-sessions\"}`)\n for (const route of wa.routes || []) {\n const target = route.contact ? `contact ${route.contact}` : `group \"${route.group}\"`\n console.log(` ${target} -> agent: ${route.agent}`)\n }\n } else {\n console.log(chalk.dim(\" WhatsApp: disabled\"))\n }\n\n // Discord\n const dc = config.channels?.discord\n if (dc?.enabled) {\n console.log(chalk.bold(\" Discord:\"))\n console.log(` agent: ${dc.agentBinding || \"(none)\"}`)\n } else {\n console.log(chalk.dim(\" Discord: disabled\"))\n }\n\n // GitLab\n const gl = config.channels?.gitlab\n if (gl?.enabled) {\n console.log(chalk.bold(\" GitLab:\"))\n console.log(` host: ${gl.host}`)\n console.log(` webhook: :${gl.webhookPort}`)\n for (const route of gl.routes || []) {\n console.log(` ${route.project} -> agent: ${route.agent}`)\n }\n } else {\n console.log(chalk.dim(\" GitLab: disabled\"))\n }\n\n console.log()\n })\n\nchannel\n .command(\"add\")\n .description(\"add a channel (telegram, whatsapp, or discord)\")\n .action(async () => {\n const config = loadConfig()\n const agentIds = Object.keys(config.agents || {})\n if (!agentIds.length) {\n console.log(chalk.red(\" No agents configured. Run: agentx agent add\"))\n return\n }\n\n const agentChoices = agentIds.map(id => ({ title: `${id} (${config.agents[id].name})`, value: id }))\n\n const { channelType } = await prompts({\n type: \"select\",\n name: \"channelType\",\n message: \"Channel type\",\n choices: [\n { title: \"Telegram — bot via BotFather token\", value: \"telegram\" },\n { title: \"WhatsApp — link via QR code (self-chat or contacts)\", value: \"whatsapp\" },\n { title: \"Discord — bot via Discord developer portal\", value: \"discord\" },\n { title: \"GitLab — webhook for issues, MRs, comments, pipelines\", value: \"gitlab\" },\n ],\n })\n\n if (!channelType) return\n\n config.channels = config.channels || {}\n\n // --- Telegram ---\n if (channelType === \"telegram\") {\n const answers = await prompts([\n { type: \"text\", name: \"accountName\", message: \"Account name (e.g. 'default', 'devops')\" },\n { type: \"text\", name: \"token\", message: \"Bot token (from @BotFather)\" },\n { type: \"select\", name: \"agentBinding\", message: \"Bind to agent\", choices: agentChoices },\n ])\n\n if (!answers.accountName || !answers.token) return\n\n try {\n const res = await fetch(`https://api.telegram.org/bot${answers.token}/getMe`)\n const data = await res.json() as any\n if (!data.ok) throw new Error(data.description)\n console.log(chalk.green(` Bot verified: @${data.result.username}`))\n\n const botHandle = `@${data.result.username}`\n const agentMentions = config.agents[answers.agentBinding].mentions || []\n if (!agentMentions.includes(botHandle)) {\n agentMentions.push(botHandle, data.result.username)\n config.agents[answers.agentBinding].mentions = agentMentions\n }\n } catch (e: any) {\n console.log(chalk.red(` Invalid token: ${e.message}`))\n return\n }\n\n config.channels.telegram = config.channels.telegram || { enabled: false, accounts: {}, policy: { dm: \"pair\", group: \"mention-required\" } }\n config.channels.telegram.enabled = true\n config.channels.telegram.accounts[answers.accountName] = {\n token: answers.token,\n agentBinding: answers.agentBinding,\n }\n\n saveConfig(config)\n console.log(chalk.green(` Telegram \"${answers.accountName}\" added -> ${answers.agentBinding}`))\n }\n\n // --- WhatsApp ---\n if (channelType === \"whatsapp\") {\n const answers = await prompts([\n { type: \"select\", name: \"defaultAgent\", message: \"Default agent for WhatsApp messages\", choices: agentChoices },\n { type: \"text\", name: \"sessionDir\", message: \"Session directory\", initial: \".agentx/whatsapp-sessions\" },\n { type: \"confirm\", name: \"addRoute\", message: \"Add a contact/group route?\", initial: true },\n ])\n\n if (!answers.defaultAgent) return\n\n const routes: any[] = []\n let addMore = answers.addRoute\n\n while (addMore) {\n const route = await prompts([\n { type: \"select\", name: \"type\", message: \"Route type\", choices: [\n { title: \"Contact (phone number)\", value: \"contact\" },\n { title: \"Group (name match)\", value: \"group\" },\n ]},\n { type: \"text\", name: \"value\", message: (prev: string) => prev === \"contact\" ? \"Phone number (e.g. +21624309128)\" : \"Group name (partial match)\" },\n { type: \"select\", name: \"agent\", message: \"Route to agent\", choices: agentChoices },\n { type: \"confirm\", name: \"more\", message: \"Add another route?\", initial: false },\n ])\n\n if (route.value && route.agent) {\n routes.push({\n [route.type]: route.value,\n agent: route.agent,\n })\n }\n addMore = route.more\n }\n\n config.channels.whatsapp = {\n enabled: true,\n sessionDir: answers.sessionDir,\n defaultAgent: answers.defaultAgent,\n routes,\n }\n\n saveConfig(config)\n mkdirSync(resolve(process.cwd(), answers.sessionDir), { recursive: true })\n console.log(chalk.green(` WhatsApp enabled (${routes.length} routes, default: ${answers.defaultAgent})`))\n console.log(chalk.dim(\" Start daemon to scan QR code: agentx daemon start\"))\n }\n\n // --- Discord ---\n if (channelType === \"discord\") {\n const answers = await prompts([\n { type: \"text\", name: \"token\", message: \"Discord bot token (from developer portal)\" },\n { type: \"select\", name: \"agentBinding\", message: \"Bind to agent\", choices: agentChoices },\n ])\n\n if (!answers.token) return\n\n config.channels.discord = {\n enabled: true,\n token: answers.token,\n agentBinding: answers.agentBinding,\n }\n\n saveConfig(config)\n console.log(chalk.green(` Discord added -> ${answers.agentBinding}`))\n }\n\n // --- GitLab ---\n if (channelType === \"gitlab\") {\n const answers = await prompts([\n { type: \"text\", name: \"host\", message: \"GitLab instance URL\", initial: \"https://gitlab.example.com\" },\n { type: \"text\", name: \"token\", message: \"GitLab API token (PRIVATE-TOKEN)\" },\n { type: \"number\", name: \"webhookPort\", message: \"Webhook listen port\", initial: 18810 },\n { type: \"text\", name: \"webhookSecret\", message: \"Webhook secret (X-Gitlab-Token, optional)\" },\n { type: \"confirm\", name: \"addRoute\", message: \"Add a project route?\", initial: true },\n ])\n\n if (!answers.token) return\n\n const routes: any[] = []\n let addMore = answers.addRoute\n\n while (addMore) {\n const route = await prompts([\n { type: \"text\", name: \"project\", message: \"GitLab project path (e.g. group/project, or * for default)\" },\n { type: \"select\", name: \"agent\", message: \"Route to agent\", choices: agentChoices },\n { type: \"confirm\", name: \"more\", message: \"Add another route?\", initial: false },\n ])\n\n if (route.project && route.agent) {\n routes.push({ project: route.project, agent: route.agent })\n }\n addMore = route.more\n }\n\n config.channels.gitlab = {\n enabled: true,\n host: answers.host,\n token: answers.token,\n webhookPort: answers.webhookPort,\n webhookSecret: answers.webhookSecret || undefined,\n routes,\n }\n\n saveConfig(config)\n console.log(chalk.green(` GitLab enabled (${routes.length} routes, webhook :${answers.webhookPort})`))\n console.log(chalk.dim(` Add webhook in GitLab: ${answers.host}/<project>/-/hooks`))\n console.log(chalk.dim(` URL: http://your-server:${answers.webhookPort}/`))\n if (answers.webhookSecret) {\n console.log(chalk.dim(` Secret token: ${answers.webhookSecret}`))\n }\n console.log(chalk.dim(\" Events: Comments, Issues, Merge requests, Pipeline\"))\n }\n\n console.log(chalk.dim(\" Restart daemon to apply: agentx daemon stop && agentx daemon start\"))\n console.log()\n })\n\n// ==================== agentx cron ====================\n\nexport const cron = new Command()\n .name(\"cron\")\n .description(\"manage cron jobs — add, list, enable, disable\")\n\ncron\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list cron jobs\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, c] of Object.entries(config.crons || {}) as any) {\n const icon = c.enabled ? chalk.green(\"●\") : chalk.dim(\"○\")\n console.log(` ${icon} ${chalk.cyan(id)} — ${c.schedule} (${c.timezone})`)\n console.log(chalk.dim(` agent: ${c.agent} | timeout: ${c.timeout}s`))\n }\n if (!Object.keys(config.crons || {}).length) {\n console.log(chalk.dim(\" No cron jobs configured\"))\n }\n console.log()\n })\n\ncron\n .command(\"add\")\n .description(\"add a cron job\")\n .action(async () => {\n const config = loadConfig()\n const agentIds = Object.keys(config.agents || {})\n\n const answers = await prompts([\n { type: \"text\", name: \"id\", message: \"Job ID (kebab-case)\" },\n { type: \"text\", name: \"schedule\", message: \"Cron expression (e.g. '0 9 * * *')\" },\n { type: \"text\", name: \"timezone\", message: \"Timezone\", initial: \"UTC\" },\n { type: \"select\", name: \"agent\", message: \"Agent\", choices: agentIds.map(id => ({ title: id, value: id })) },\n { type: \"text\", name: \"prompt\", message: \"Task prompt\" },\n { type: \"number\", name: \"timeout\", message: \"Timeout (seconds)\", initial: 600 },\n { type: \"confirm\", name: \"enabled\", message: \"Enable now?\", initial: false },\n ])\n\n if (!answers.id || !answers.schedule) return\n\n config.crons = config.crons || {}\n config.crons[answers.id] = {\n enabled: answers.enabled,\n schedule: answers.schedule,\n timezone: answers.timezone,\n agent: answers.agent,\n prompt: answers.prompt,\n timeout: answers.timeout,\n onError: \"log\",\n }\n\n saveConfig(config)\n console.log(chalk.green(` Cron \"${answers.id}\" added (${answers.enabled ? \"enabled\" : \"disabled\"})`))\n console.log()\n })\n\ncron\n .command(\"enable <id>\")\n .description(\"enable a cron job\")\n .action((id) => {\n const config = loadConfig()\n if (!config.crons?.[id]) { console.log(chalk.red(` Cron \"${id}\" not found`)); return }\n config.crons[id].enabled = true\n saveConfig(config)\n console.log(chalk.green(` Cron \"${id}\" enabled`))\n })\n\ncron\n .command(\"disable <id>\")\n .description(\"disable a cron job\")\n .action((id) => {\n const config = loadConfig()\n if (!config.crons?.[id]) { console.log(chalk.red(` Cron \"${id}\" not found`)); return }\n config.crons[id].enabled = false\n saveConfig(config)\n console.log(chalk.green(` Cron \"${id}\" disabled`))\n })\n\n// ==================== agentx mesh ====================\n\nexport const mesh = new Command()\n .name(\"mesh\")\n .description(\"manage mesh peers — add, list, remove\")\n\nmesh\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list mesh peers\")\n .action(async () => {\n const config = loadConfig()\n console.log()\n if (!config.mesh?.enabled) {\n console.log(chalk.dim(\" Mesh: disabled\"))\n } else {\n console.log(chalk.bold(\" Mesh peers:\"))\n for (const peer of config.mesh.peers || []) {\n // Try health check\n let status = chalk.red(\"unreachable\")\n try {\n const res = await fetch(`${peer.url}/health`, { signal: AbortSignal.timeout(3000) })\n const data = await res.json() as any\n status = chalk.green(`healthy — ${data.agents?.length || 0} agents`)\n } catch {}\n console.log(` ${chalk.cyan(peer.name)} ${chalk.dim(peer.url)} ${status}`)\n }\n }\n console.log()\n })\n\nmesh\n .command(\"add\")\n .description(\"add a mesh peer (another agentx server)\")\n .action(async () => {\n const config = loadConfig()\n\n const answers = await prompts([\n { type: \"text\", name: \"name\", message: \"Peer name (e.g. 'server-2')\" },\n { type: \"text\", name: \"url\", message: \"Peer URL (e.g. 'http://100.67.108.119:18800')\" },\n { type: \"text\", name: \"token\", message: \"Auth token (optional, press enter to skip)\" },\n ])\n\n if (!answers.name || !answers.url) return\n\n // Verify connectivity\n try {\n const res = await fetch(`${answers.url}/.well-known/agent-card.json`, { signal: AbortSignal.timeout(5000) })\n const card = await res.json() as any\n console.log(chalk.green(` Connected: ${card.name} (${card.skills?.length || 0} agents)`))\n } catch {\n console.log(chalk.yellow(\" Could not reach peer (adding anyway)\"))\n }\n\n config.mesh = config.mesh || { enabled: false, peers: [], discovery: \"static\", healthCheck: { interval: 60, timeout: 10 } }\n config.mesh.enabled = true\n config.mesh.peers = config.mesh.peers || []\n config.mesh.peers.push({\n url: answers.url,\n name: answers.name,\n ...(answers.token ? { token: answers.token } : {}),\n })\n\n saveConfig(config)\n console.log(chalk.green(` Peer \"${answers.name}\" added`))\n console.log()\n })\n\nmesh\n .command(\"remove <name>\")\n .alias(\"rm\")\n .description(\"remove a mesh peer\")\n .action((name) => {\n const config = loadConfig()\n if (!config.mesh?.peers) return\n config.mesh.peers = config.mesh.peers.filter((p: any) => p.name !== name)\n if (config.mesh.peers.length === 0) config.mesh.enabled = false\n saveConfig(config)\n console.log(chalk.green(` Peer \"${name}\" removed`))\n })\n\n// ==================== agentx skill ====================\n\nexport const skillCmd = new Command()\n .name(\"skill\")\n .description(\"manage skills — add to agent(s), list\")\n\nskillCmd\n .command(\"add <skillPath>\")\n .description(\"add a skill to agent(s)\")\n .option(\"-a, --agent <agents...>\", \"target agent ID(s)\")\n .option(\"--all\", \"add to all agents\")\n .action(async (skillPath, opts) => {\n const config = loadConfig()\n const srcPath = resolve(skillPath)\n\n if (!existsSync(srcPath)) {\n console.log(chalk.red(` Skill not found: ${srcPath}`))\n return\n }\n\n // Determine skill name\n const skillName = existsSync(join(srcPath, \"SKILL.md\"))\n ? srcPath.split(\"/\").pop()!\n : srcPath.replace(/\\/SKILL\\.md$/, \"\").split(\"/\").pop()!\n\n // Determine target agents\n let targets: string[]\n if (opts.all) {\n targets = Object.keys(config.agents || {})\n } else if (opts.agent) {\n targets = opts.agent\n } else {\n const agentIds = Object.keys(config.agents || {})\n const answer = await prompts({\n type: \"multiselect\",\n name: \"agents\",\n message: \"Install to which agents?\",\n choices: agentIds.map(id => ({ title: `${id} (${config.agents[id].name})`, value: id })),\n })\n targets = answer.agents || []\n }\n\n for (const agentId of targets) {\n const agent = config.agents[agentId]\n if (!agent) { console.log(chalk.yellow(` Agent \"${agentId}\" not found, skipping`)); continue }\n\n const destDir = resolve(agent.workspace, \".claude/skills\", skillName)\n mkdirSync(destDir, { recursive: true })\n\n if (existsSync(join(srcPath, \"SKILL.md\"))) {\n // Copy entire skill directory\n cpSync(srcPath, destDir, { recursive: true })\n } else if (srcPath.endsWith(\".md\")) {\n // Single SKILL.md file\n cpSync(srcPath, join(destDir, \"SKILL.md\"))\n }\n\n console.log(chalk.green(` ${skillName} -> ${agentId} (${agent.workspace})`))\n }\n console.log()\n })\n\nskillCmd\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list skills per agent\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, a] of Object.entries(config.agents || {}) as any) {\n const skillsDir = resolve(a.workspace, \".claude/skills\")\n const skills = existsSync(skillsDir)\n ? readdirSync(skillsDir).filter((f: string) => !f.startsWith(\".\"))\n : []\n console.log(` ${chalk.cyan(id)}: ${skills.length ? skills.join(\", \") : chalk.dim(\"(none)\")}`)\n }\n console.log()\n })\n\n// ==================== agentx hook ====================\n\nexport const hook = new Command()\n .name(\"hook\")\n .description(\"manage hooks — add to agent workspace\")\n\nhook\n .command(\"add <agent>\")\n .description(\"add a hook to an agent's workspace settings\")\n .action(async (agentId) => {\n const config = loadConfig()\n const agent = config.agents?.[agentId]\n if (!agent) { console.log(chalk.red(` Agent \"${agentId}\" not found`)); return }\n\n const settingsPath = resolve(agent.workspace, \".claude/settings.json\")\n const settings = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, \"utf-8\")) : {}\n\n const answers = await prompts([\n { type: \"select\", name: \"event\", message: \"Hook event\", choices: [\n { title: \"PreToolUse — before any tool runs\", value: \"PreToolUse\" },\n { title: \"PostToolUse — after any tool runs\", value: \"PostToolUse\" },\n { title: \"SessionStart — when session begins\", value: \"SessionStart\" },\n { title: \"Notification — on notifications\", value: \"Notification\" },\n { title: \"Stop — before session stops\", value: \"Stop\" },\n ]},\n { type: \"select\", name: \"type\", message: \"Hook type\", choices: [\n { title: \"command — run a shell command\", value: \"command\" },\n { title: \"http — POST to a URL\", value: \"http\" },\n ]},\n { type: \"text\", name: \"value\", message: (prev: any) => prev === \"command\" ? \"Shell command\" : \"URL\" },\n { type: \"text\", name: \"matcher\", message: \"Matcher regex (optional, e.g. 'Bash' to match tool)\" },\n ])\n\n if (!answers.event || !answers.value) return\n\n settings.hooks = settings.hooks || {}\n settings.hooks[answers.event] = settings.hooks[answers.event] || []\n\n const hookDef: any = {\n type: answers.type,\n ...(answers.type === \"command\" ? { command: answers.value } : { url: answers.value }),\n }\n\n const entry: any = { hooks: [hookDef] }\n if (answers.matcher) entry.matcher = answers.matcher\n\n settings.hooks[answers.event].push(entry)\n\n mkdirSync(resolve(agent.workspace, \".claude\"), { recursive: true })\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2))\n console.log(chalk.green(` Hook added to ${agentId}: ${answers.event} -> ${answers.type}`))\n console.log()\n })\n\n// ==================== agentx migrate ====================\n\nexport const migrate = new Command()\n .name(\"migrate\")\n .description(\"import configuration from OpenClaw or other tools\")\n\nmigrate\n .command(\"openclaw [configPath]\")\n .description(\"import agents, channels, and crons from OpenClaw config\")\n .option(\"--dry-run\", \"show what would be imported without writing\")\n .action(async (configPath, opts) => {\n // Find OpenClaw config\n const searchPaths = [\n configPath,\n resolve(process.env.HOME || \"\", \".openclaw/openclaw.json\"),\n resolve(process.env.HOME || \"\", \".openclaw/clawdbot.json\"),\n ].filter(Boolean)\n\n let ocPath: string | undefined\n for (const p of searchPaths) {\n if (p && existsSync(p)) { ocPath = p; break }\n }\n\n if (!ocPath) {\n console.log(chalk.red(\" OpenClaw config not found. Pass the path: agentx migrate openclaw /path/to/config.json\"))\n return\n }\n\n console.log(chalk.dim(` Reading: ${ocPath}`))\n const oc = JSON.parse(readFileSync(ocPath, \"utf-8\"))\n\n const config = existsSync(resolve(process.cwd(), \"agentx.json\"))\n ? loadConfig()\n : { node: { id: \"imported\", name: \"Imported\", bind: \"127.0.0.1:18800\" }, providers: {}, agents: {}, channels: { telegram: { enabled: false, accounts: {}, policy: { dm: \"pair\", group: \"mention-required\" } }, whatsapp: { enabled: false } }, crons: {}, mesh: { enabled: false, peers: [] } }\n\n // Import agents\n const agents = oc.agents?.list || []\n const bindings = oc.bindings || []\n const bindMap: Record<string, string> = {}\n for (const b of bindings) {\n if (b.match?.channel === \"telegram\") {\n bindMap[b.match.accountId] = b.agentId\n }\n }\n // Default account -> main agent\n if (agents.find((a: any) => a.id === \"main\" || a.default)) {\n bindMap[\"default\"] = \"main\"\n }\n\n let agentCount = 0\n for (const a of agents) {\n if (a.workspace?.startsWith(\"/data\")) continue // skip remote devices\n\n const axId = a.id.replace(/-agent$/, \"\").replace(/^main$/, \"main-agent\")\n const mentions = a.groupChat?.mentionPatterns || []\n if (!mentions.some((m: string) => m === axId)) mentions.push(axId)\n\n config.agents[axId] = {\n name: a.name,\n workspace: a.workspace,\n tier: \"claude-code\",\n model: \"claude-sonnet-4-6\",\n mentions,\n maxConcurrent: a.id === \"main\" ? 2 : 1,\n systemPrompt: `You are ${a.name} on AgentX.`,\n permissionMode: \"bypassPermissions\",\n }\n agentCount++\n\n if (!opts.dryRun) {\n mkdirSync(resolve(a.workspace, \".claude/skills\"), { recursive: true })\n }\n }\n console.log(` ${chalk.green(agentCount)} agents imported`)\n\n // Import Telegram accounts\n const tgAccounts = oc.channels?.telegram?.accounts || {}\n let tgCount = 0\n for (const [name, acc] of Object.entries(tgAccounts) as any) {\n if (!acc.botToken) continue\n const boundAgent = bindMap[name]\n const axAgentId = boundAgent?.replace(/-agent$/, \"\").replace(/^main$/, \"main-agent\") || \"default\"\n\n config.channels.telegram.accounts[name] = {\n token: acc.botToken,\n agentBinding: axAgentId,\n }\n config.channels.telegram.enabled = true\n tgCount++\n }\n console.log(` ${chalk.green(tgCount)} Telegram accounts imported`)\n\n // Import cron jobs (from separate file if exists)\n const cronPath = resolve(ocPath, \"../cron/jobs.json\")\n if (existsSync(cronPath)) {\n const cronData = JSON.parse(readFileSync(cronPath, \"utf-8\"))\n let cronCount = 0\n for (const job of cronData.jobs || []) {\n const axId = job.name || job.id\n const agentId = job.agentId?.replace(/-agent$/, \"\").replace(/^main$/, \"main-agent\") || \"default\"\n config.crons[axId] = {\n enabled: job.enabled || false,\n schedule: job.schedule?.expr || \"0 9 * * *\",\n timezone: job.schedule?.tz || \"UTC\",\n agent: agentId,\n prompt: job.payload?.message || \"\",\n timeout: job.payload?.timeoutSeconds || 600,\n onError: \"log\",\n }\n cronCount++\n }\n console.log(` ${chalk.green(cronCount)} cron jobs imported`)\n }\n\n if (opts.dryRun) {\n console.log(chalk.yellow(\"\\n Dry run — nothing written\"))\n console.log(JSON.stringify(config, null, 2))\n } else {\n saveConfig(config)\n console.log(chalk.green(\"\\n Migration complete! Review agentx.json and run: agentx daemon start\"))\n }\n console.log()\n })\n\n// ==================== agentx config ====================\n\nexport const configCmd = new Command()\n .name(\"config\")\n .description(\"validate and inspect configuration\")\n\nconfigCmd\n .command(\"check\")\n .description(\"validate agentx.json and check all workspaces\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .action(async (opts) => {\n console.log()\n try {\n const config = loadDaemonConfig(opts.config)\n console.log(chalk.green(\" ✓ Config valid\"))\n console.log(chalk.dim(` Node: ${config.node.name} (${config.node.id})`))\n console.log(chalk.dim(` Bind: ${config.node.bind}`))\n console.log(chalk.dim(` Agents: ${Object.keys(config.agents).length}`))\n console.log(chalk.dim(` Crons: ${Object.keys(config.crons).length}`))\n console.log(chalk.dim(` Mesh peers: ${config.mesh.peers.length}`))\n\n // Channels\n const tgAccounts = Object.keys(config.channels.telegram.accounts).length\n console.log(chalk.dim(` Telegram: ${config.channels.telegram.enabled ? `${tgAccounts} accounts` : \"disabled\"}`))\n console.log(chalk.dim(` WhatsApp: ${config.channels.whatsapp.enabled ? `${config.channels.whatsapp.routes.length} routes` : \"disabled\"}`))\n console.log(chalk.dim(` Discord: ${config.channels.discord?.enabled ? \"enabled\" : \"disabled\"}`))\n\n // Warnings\n const warnings = validateWorkspaces(config)\n if (warnings.length) {\n console.log()\n console.log(chalk.yellow(\" Warnings:\"))\n for (const w of warnings) {\n console.log(chalk.yellow(` ⚠ ${w}`))\n }\n } else {\n console.log(chalk.green(\" ✓ All workspaces valid\"))\n }\n\n // Check agent workspaces\n console.log()\n for (const [id, agent] of Object.entries(config.agents)) {\n const ws = agent.workspace\n const hasClaudeDir = existsSync(resolve(ws, \".claude\"))\n const hasClaudeMd = existsSync(resolve(ws, \"CLAUDE.md\"))\n const hasSettings = existsSync(resolve(ws, \".claude/settings.json\"))\n const skillCount = existsSync(resolve(ws, \".claude/skills\"))\n ? readdirSync(resolve(ws, \".claude/skills\")).filter(f => !f.startsWith(\".\")).length\n : 0\n\n const checks = [\n hasClaudeDir ? chalk.green(\"✓\") : chalk.red(\"✗\"),\n \".claude\",\n hasClaudeMd ? chalk.green(\"✓\") : chalk.yellow(\"○\"),\n \"CLAUDE.md\",\n hasSettings ? chalk.green(\"✓\") : chalk.yellow(\"○\"),\n \"settings\",\n `${skillCount} skills`,\n ]\n console.log(` ${chalk.cyan(id)}: ${checks.join(\" \")}`)\n }\n } catch (e: any) {\n console.log(chalk.red(` ✗ ${e.message}`))\n }\n console.log()\n })\n\nconfigCmd\n .command(\"show\")\n .description(\"print the resolved configuration\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .action((opts) => {\n try {\n const config = loadDaemonConfig(opts.config)\n console.log(JSON.stringify(config, null, 2))\n } catch (e: any) {\n console.log(chalk.red(e.message))\n }\n })\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport { loadDaemonConfig } from \"@/daemon/config\"\n\nexport const usage = new Command()\n .name(\"usage\")\n .description(\"token usage analysis and reporting\")\n\n// agentx usage — quick today summary\nusage\n .command(\"today\", { isDefault: true })\n .description(\"show today's token usage\")\n .action(async () => {\n try {\n const config = loadDaemonConfig()\n const [host, port] = config.node.bind.split(\":\")\n const res = await fetch(`http://${host || \"127.0.0.1\"}:${port}/usage`, { signal: AbortSignal.timeout(3000) })\n const data = await res.json() as any\n\n console.log()\n console.log(chalk.bold(` Token Usage (last 7 days)`))\n console.log()\n\n if (data.totalTasks === 0) {\n console.log(chalk.dim(\" No tasks recorded yet\"))\n console.log()\n return\n }\n\n const fmt = (n: number) => n.toLocaleString()\n\n console.log(` Total: ${chalk.bold(fmt(data.totalTokens))} tokens across ${data.totalTasks} tasks`)\n console.log(` Input: ${fmt(data.totalInput)}`)\n console.log(` Output: ${fmt(data.totalOutput)}`)\n console.log(` Cache read: ${fmt(data.totalCacheRead)}`)\n console.log(` Cache create: ${fmt(data.totalCacheCreate)}`)\n if (data.cacheHitRatio > 0) {\n console.log(` Cache hit: ${(data.cacheHitRatio * 100).toFixed(1)}%`)\n }\n if (data.totalErrors > 0) {\n console.log(` Errors: ${chalk.red(String(data.totalErrors))}`)\n }\n\n console.log()\n console.log(chalk.bold(\" By Agent:\"))\n const agents = Object.entries(data.byAgent || {}) as Array<[string, any]>\n agents.sort((a, b) => b[1].total - a[1].total)\n\n for (const [id, ag] of agents) {\n const total = fmt(ag.total || (ag.input + ag.output + ag.cacheRead + ag.cacheCreate))\n const avgMs = ag.avgDuration ? `${(ag.avgDuration / 1000).toFixed(1)}s avg` : \"\"\n console.log(` ${chalk.cyan(id)}: ${total} tokens (${ag.tasks} tasks) ${chalk.dim(avgMs)}`)\n }\n console.log()\n } catch (e: any) {\n if (e.cause?.code === \"ECONNREFUSED\") {\n console.log(chalk.red(\" Daemon not running. Start with: agentx daemon start\"))\n } else {\n console.log(chalk.red(` ${e.message}`))\n }\n }\n })\n\n// agentx usage serve — web dashboard\nusage\n .command(\"serve\")\n .description(\"start a web dashboard for token usage visualization\")\n .option(\"--port <n>\", \"port number\", \"4201\")\n .action(async (opts) => {\n const { startUsageDashboard } = await import(\"@/daemon/usage-dashboard\")\n startUsageDashboard(parseInt(opts.port))\n })\n\n// agentx usage report — run Python analyzer\nusage\n .command(\"report\")\n .description(\"run full session analysis (parses Claude Code JSONL files)\")\n .option(\"--days <n>\", \"analyze last N days\", \"7\")\n .action(async (opts) => {\n const { execSync } = await import(\"child_process\")\n const { existsSync } = await import(\"fs\")\n const { resolve } = await import(\"path\")\n\n const scriptPath = resolve(process.cwd(), \"scripts/token-report.py\")\n if (!existsSync(scriptPath)) {\n console.log(chalk.red(` Script not found: ${scriptPath}`))\n console.log(chalk.dim(\" The token analyzer script should be at scripts/token-report.py\"))\n return\n }\n\n console.log(chalk.dim(\" Analyzing Claude Code sessions...\"))\n try {\n execSync(`SINCE_DAYS=${opts.days} python3 \"${scriptPath}\"`, { stdio: \"inherit\" })\n } catch {\n console.log(chalk.red(\" Analysis failed. Is Python 3 installed?\"))\n }\n })\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport { WikiHub } from \"@/wiki\"\nimport type { WikiMode } from \"@/wiki/hub\"\nimport { startWikiServer } from \"@/wiki/serve\"\nimport { buildAbsorbPrompt } from \"@/wiki/prompts\"\nimport { resolve } from \"path\"\nimport { execSync } from \"child_process\"\nimport { writeFileSync, mkdirSync } from \"fs\"\n\nfunction getHub(dir?: string, mode?: WikiMode): WikiHub {\n return new WikiHub(dir || resolve(process.cwd(), \".agentx/wiki\"), undefined, mode || \"graph\")\n}\n\nfunction modeLabel(mode: WikiMode): string {\n if (mode === \"graph\") return \"Knowledge Graph\"\n if (mode === \"flat\") return \"Karpathy Flat\"\n return \"Unified\"\n}\n\nexport const wiki = new Command()\n .name(\"wiki\")\n .description(\"wiki knowledge base management\")\n\n// agentx wiki status\nwiki\n .command(\"status\")\n .description(\"show wiki status per agent\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--mode <mode>\", \"unified (default), graph, or flat\", \"unified\")\n .action((opts) => {\n const mode = opts.mode as WikiMode\n const hub = getHub(opts.dir, mode)\n const agents = hub.summary()\n const shared = hub.getSharedStore()\n const totalEntries = shared.listEntries().length\n\n console.log()\n console.log(chalk.bold(` Wiki Hub Status [${modeLabel(mode)}]`))\n console.log()\n console.log(` Total raw entries: ${totalEntries}`)\n console.log(` Agents: ${agents.length}`)\n console.log()\n\n for (const agent of agents) {\n const status = agent.unabsorbed > 0\n ? chalk.yellow(`${agent.unabsorbed} unabsorbed`)\n : chalk.green(\"up to date\")\n\n console.log(` ${chalk.cyan(agent.agentId)}`)\n console.log(` Entries: ${agent.totalEntries} Articles: ${agent.totalArticles} ${status}`)\n\n if (agent.articles.length > 0) {\n for (const a of agent.articles.slice(0, 3)) {\n console.log(chalk.dim(` - ${a.title} [${(a.tags || []).slice(0, 3).join(\", \")}]`))\n }\n if (agent.articles.length > 3) {\n console.log(chalk.dim(` ... and ${agent.articles.length - 3} more`))\n }\n }\n console.log()\n }\n\n const totalUnabsorbed = agents.reduce((s, a) => s + a.unabsorbed, 0)\n if (totalUnabsorbed > 0) {\n console.log(chalk.dim(\" Run 'agentx wiki absorb' to compile all, or 'agentx wiki absorb --agent <id>' for one agent\"))\n console.log()\n }\n })\n\n// agentx wiki lint\nwiki\n .command(\"lint\")\n .description(\"check wiki for issues per agent\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--mode <mode>\", \"unified (default), graph, or flat\", \"unified\")\n .option(\"--agent <id>\", \"lint a specific agent's wiki\")\n .action((opts) => {\n const hub = getHub(opts.dir, opts.mode as WikiMode)\n const agents = opts.agent ? [opts.agent] : hub.listAgents()\n let totalIssues = 0\n\n console.log()\n for (const agentId of agents) {\n const store = hub.getAgentWiki(agentId)\n const issues = store.lint()\n totalIssues += issues.length\n\n if (issues.length === 0) {\n console.log(` ${chalk.cyan(agentId)}: ${chalk.green(\"healthy\")}`)\n } else {\n console.log(` ${chalk.cyan(agentId)}: ${chalk.yellow(`${issues.length} issues`)}`)\n for (const issue of issues) {\n const icon = issue.type === \"broken-link\" ? \"x\" : issue.type === \"orphan\" ? \"?\" : \"!\"\n console.log(` [${icon}] ${chalk.dim(issue.type)} ${issue.article}: ${issue.message}`)\n }\n }\n }\n\n console.log()\n if (totalIssues === 0) {\n console.log(chalk.green(\" All agent wikis are healthy\"))\n }\n console.log()\n })\n\n// agentx wiki absorb — per-agent compilation\nwiki\n .command(\"absorb\")\n .description(\"compile unabsorbed entries into per-agent wiki articles\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--mode <mode>\", \"unified (default), graph, or flat\", \"unified\")\n .option(\"--agent <id>\", \"absorb only this agent\")\n .option(\"--dry-run\", \"preview without running\")\n .option(\"--max <n>\", \"max entries per agent\", \"20\")\n .action(async (opts) => {\n const mode = opts.mode as WikiMode\n const hub = getHub(opts.dir, mode)\n const agents = opts.agent ? [opts.agent] : hub.listAgents()\n const maxEntries = parseInt(opts.max)\n\n let totalAbsorbed = 0\n\n for (const agentId of agents) {\n const unabsorbed = hub.getUnabsorbedEntries(agentId).slice(0, maxEntries)\n\n if (unabsorbed.length === 0) {\n console.log(` ${chalk.cyan(agentId)}: ${chalk.green(\"all absorbed\")}`)\n continue\n }\n\n console.log()\n console.log(chalk.bold(` ${chalk.cyan(agentId)}: ${unabsorbed.length} entries to absorb`))\n for (const e of unabsorbed.slice(0, 3)) {\n console.log(chalk.dim(` [${e.date} via ${e.source}] ${e.content.slice(0, 80)}...`))\n }\n if (unabsorbed.length > 3) console.log(chalk.dim(` ... and ${unabsorbed.length - 3} more`))\n\n if (opts.dryRun) continue\n\n // Get this agent's wiki store\n const agentWiki = hub.getAgentWiki(agentId)\n\n // Build prompt using mode-specific template\n const existingIndex = agentWiki.rebuildIndex()\n const worldview = agentWiki.getWorldview() || hub.getSharedStore().getWorldview() || \"\"\n const entryTexts = unabsorbed.map(e =>\n `--- ENTRY ${e.id} [${e.date} ${e.agentId} via ${e.source}] ---\\n${e.content}\\n--- END ENTRY ---`\n ).join(\"\\n\\n\")\n\n const prompt = buildAbsorbPrompt(mode, agentId, worldview, existingIndex.articles, entryTexts, unabsorbed.length)\n console.log(chalk.dim(` Mode: ${modeLabel(mode)}`))\n\n // Write prompt and run Claude\n const tmpDir = resolve(agentWiki[\"baseDir\"], \"_tmp\")\n mkdirSync(tmpDir, { recursive: true })\n const promptPath = resolve(tmpDir, \"absorb-prompt.txt\")\n writeFileSync(promptPath, prompt)\n\n console.log(chalk.dim(` Compiling with Claude...`))\n\n try {\n let rawOutput: string\n try {\n rawOutput = execSync(\n `cat '${promptPath}' | claude -p - --output-format json --max-turns 3 --model sonnet --disallowedTools \"Bash Read Write Edit Glob Grep Agent WebSearch WebFetch NotebookEdit\"`,\n { encoding: \"utf-8\", timeout: 300_000, maxBuffer: 10 * 1024 * 1024 },\n )\n } catch (execErr: any) {\n rawOutput = execErr.stdout || \"\"\n if (!rawOutput) throw execErr\n }\n\n // Parse Claude's response — may be JSON envelope or raw text\n let responseText = rawOutput\n\n // Try to extract \"result\" from Claude's JSON envelope\n try {\n const envelope = JSON.parse(rawOutput)\n responseText = envelope.result || envelope.content || \"\"\n if (!responseText) {\n console.log(chalk.dim(` Claude envelope keys: ${Object.keys(envelope).join(\", \")}`))\n console.log(chalk.dim(` is_error: ${envelope.is_error}, stop_reason: ${envelope.stop_reason}`))\n }\n } catch {\n // Not a JSON envelope — use as-is\n }\n\n // Parse response — could be { articles: [...], gaps: [...] } or bare [...]\n let articles: Array<{ path: string; title: string; tags: string[]; content: string; sources: string[] }>\n let gaps: string[] = []\n\n // Find outermost JSON object or array\n const objStart = responseText.indexOf(\"{\")\n const arrStart = responseText.indexOf(\"[\")\n const jsonStart = (objStart >= 0 && (arrStart < 0 || objStart < arrStart)) ? objStart : arrStart\n\n if (jsonStart === -1) {\n console.log(chalk.red(` No JSON found in response`))\n console.log(chalk.dim(responseText.slice(0, 500)))\n continue\n }\n\n const openChar = responseText[jsonStart]\n const closeChar = openChar === \"{\" ? \"}\" : \"]\"\n let depth = 0\n let jsonEnd = -1\n for (let i = jsonStart; i < responseText.length; i++) {\n if (responseText[i] === openChar) depth++\n else if (responseText[i] === closeChar) { depth--; if (depth === 0) { jsonEnd = i + 1; break } }\n }\n\n if (jsonEnd === -1) { console.log(chalk.red(` Unbalanced JSON`)); continue }\n\n const jsonStr = responseText.slice(jsonStart, jsonEnd)\n try {\n const parsed = JSON.parse(jsonStr)\n if (Array.isArray(parsed)) {\n articles = parsed\n } else {\n articles = parsed.articles || []\n gaps = parsed.gaps || []\n }\n } catch (parseErr: any) {\n console.log(chalk.red(` JSON parse error: ${parseErr.message}`))\n console.log(chalk.dim(` First 300 chars: ${jsonStr.slice(0, 300)}`))\n continue\n }\n\n for (const article of articles) {\n const now = new Date().toISOString().slice(0, 10)\n agentWiki.writeArticle(article.path, {\n title: article.title,\n tags: article.tags || [],\n owner: agentId,\n access: \"public\",\n created: now,\n lastUpdated: now,\n sources: article.sources || [],\n }, article.content, agentId)\n\n const tagStr = (article.tags || []).slice(0, 5).join(\", \")\n console.log(` ${chalk.green(\"+\")} ${article.path}: ${article.title}`)\n if (tagStr) console.log(chalk.dim(` [${tagStr}]`))\n totalAbsorbed++\n }\n\n // Show gaps (missing puzzle pieces)\n if (gaps.length > 0) {\n console.log()\n console.log(chalk.yellow(` Gaps detected (${gaps.length} missing pieces):`))\n for (const gap of gaps) {\n console.log(chalk.yellow(` ? ${gap}`))\n }\n }\n\n agentWiki.rebuildIndex()\n } catch (e: any) {\n console.log(chalk.red(` Absorb failed: ${e.message?.slice(0, 200)}`))\n if (e.stderr) console.log(chalk.dim(String(e.stderr).slice(0, 300)))\n if (e.stdout) console.log(chalk.dim(\"stdout: \" + String(e.stdout).slice(0, 300)))\n }\n }\n\n console.log()\n if (opts.dryRun) {\n console.log(chalk.dim(\" Dry run — no changes made\"))\n } else if (totalAbsorbed > 0) {\n console.log(chalk.green(` ${totalAbsorbed} articles compiled across ${agents.length} agent(s)`))\n }\n console.log()\n })\n\n// agentx wiki entries\nwiki\n .command(\"entries\")\n .description(\"list raw entries\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--agent <id>\", \"filter by agent\")\n .action((opts) => {\n const hub = getHub(opts.dir)\n const shared = hub.getSharedStore()\n let entries = shared.listEntries()\n\n if (opts.agent) {\n entries = entries.filter(e => e.agentId === opts.agent)\n }\n\n console.log()\n console.log(chalk.bold(` ${entries.length} raw entries`))\n console.log()\n\n for (const e of entries.slice(-20)) {\n console.log(` ${chalk.dim(e.date)} ${chalk.cyan(e.agentId)} via ${e.source}: ${e.content.slice(0, 80)}...`)\n }\n\n if (entries.length > 20) {\n console.log(chalk.dim(` ... showing last 20 of ${entries.length}`))\n }\n console.log()\n })\n\n// agentx wiki serve\nwiki\n .command(\"serve\")\n .description(\"start a local web server to browse agent wikis (local + mesh)\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--mode <mode>\", \"unified (default), graph, or flat\", \"unified\")\n .option(\"--agent <id>\", \"serve only this agent's wiki\")\n .option(\"--port <n>\", \"port number\", \"4200\")\n .option(\"--peer <urls...>\", \"mesh peer URLs to federate\")\n .action(async (opts) => {\n const dir = opts.dir || resolve(process.cwd(), \".agentx/wiki\")\n const port = parseInt(opts.port)\n\n // Auto-discover peers from daemon config if not specified\n let peerUrls: string[] = opts.peer || []\n if (peerUrls.length === 0) {\n try {\n const { loadDaemonConfig } = await import(\"@/daemon/config\")\n const config = loadDaemonConfig()\n peerUrls = (config.mesh?.peers || []).map((p: any) => p.url)\n } catch { /* no config */ }\n }\n\n console.log()\n console.log(chalk.bold(\" AgentX Wiki Server\"))\n console.log()\n console.log(` ${chalk.green(\">\")} http://localhost:${port}`)\n if (opts.agent) {\n console.log(` Agent: ${chalk.cyan(opts.agent)}`)\n } else {\n console.log(` Mode: ${chalk.cyan(\"Hub\")} (all agents)`)\n }\n if (peerUrls.length > 0) {\n console.log(` Mesh: ${chalk.cyan(peerUrls.length + \" peer(s)\")} — ${peerUrls.join(\", \")}`)\n }\n console.log(chalk.dim(` Wiki: ${dir}`))\n console.log(chalk.dim(\" Press Ctrl+C to stop\"))\n console.log()\n\n startWikiServer(dir, port, opts.agent, peerUrls, opts.mode as WikiMode)\n })\n\n// agentx wiki search <query>\nwiki\n .command(\"search <query>\")\n .description(\"search wiki articles\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--mode <mode>\", \"unified (default), graph, or flat\", \"unified\")\n .option(\"--agent <id>\", \"search specific agent's wiki\")\n .action((query, opts) => {\n const hub = getHub(opts.dir, opts.mode as WikiMode)\n const agents = opts.agent ? [opts.agent] : hub.listAgents()\n\n console.log()\n let found = 0\n\n for (const agentId of agents) {\n const store = hub.getAgentWiki(agentId)\n const results = store.findRelevant(query, undefined, 10)\n\n if (results.length > 0) {\n console.log(chalk.bold(` ${chalk.cyan(agentId)}:`))\n for (const r of results) {\n console.log(` ${r.meta.title} [${(r.meta.tags || []).slice(0, 3).join(\", \")}]`)\n console.log(chalk.dim(` ${r.path} — ${r.content.slice(0, 100)}...`))\n }\n found += results.length\n }\n }\n\n if (found === 0) console.log(chalk.dim(\" No matching articles\"))\n console.log()\n })\n\n// agentx wiki sync — pull entries from mesh peers\nwiki\n .command(\"sync\")\n .description(\"pull raw entries from mesh peers into local wiki\")\n .option(\"--dir <path>\", \"wiki directory\")\n .option(\"--peer <url>\", \"sync from a specific peer URL (e.g., http://100.67.108.119:19900)\")\n .option(\"--dry-run\", \"show what would be synced without writing\")\n .action(async (opts) => {\n const hub = getHub(opts.dir)\n const shared = hub.getSharedStore()\n\n // Discover peers: from --peer flag, or from local daemon config\n let peerUrls: string[] = []\n\n if (opts.peer) {\n peerUrls = [opts.peer]\n } else {\n // Try to read mesh peers from local daemon\n try {\n const { loadDaemonConfig } = await import(\"@/daemon/config\")\n const config = loadDaemonConfig()\n peerUrls = (config.mesh?.peers || []).map((p: any) => p.url)\n } catch {\n console.log(chalk.red(\" No --peer specified and no daemon config found\"))\n console.log(chalk.dim(\" Usage: agentx wiki sync --peer http://100.67.108.119:19900\"))\n return\n }\n }\n\n if (peerUrls.length === 0) {\n console.log(chalk.dim(\" No mesh peers configured\"))\n return\n }\n\n // Get existing entry IDs to avoid duplicates\n const existingIds = new Set(shared.listEntries().map(e => e.id))\n\n let totalSynced = 0\n\n for (const peerUrl of peerUrls) {\n console.log()\n console.log(chalk.bold(` Syncing from ${peerUrl}...`))\n\n try {\n // Fetch entries from peer\n const res = await fetch(`${peerUrl}/wiki/entries`, { signal: AbortSignal.timeout(10000) })\n if (!res.ok) {\n console.log(chalk.red(` HTTP ${res.status}`))\n continue\n }\n\n const data = await res.json() as any\n const entries = data.entries || []\n const nodeId = data.nodeId || \"unknown\"\n\n console.log(chalk.dim(` Node: ${nodeId} — ${entries.length} entries`))\n\n let newCount = 0\n for (const entry of entries) {\n if (existingIds.has(entry.id)) continue\n\n if (!opts.dryRun) {\n shared.addEntry({\n id: entry.id,\n date: entry.date,\n agentId: entry.agentId,\n source: `${entry.source}@${nodeId}`, // Tag source with node\n sourceContext: entry.sourceContext,\n content: entry.content,\n })\n existingIds.add(entry.id)\n }\n newCount++\n }\n\n if (newCount > 0) {\n console.log(chalk.green(` ${newCount} new entries${opts.dryRun ? \" (dry run)\" : \" synced\"}`))\n } else {\n console.log(chalk.dim(\" Already up to date\"))\n }\n\n totalSynced += newCount\n\n // Also show remote agents summary\n try {\n const agentsRes = await fetch(`${peerUrl}/wiki/agents`, { signal: AbortSignal.timeout(5000) })\n if (agentsRes.ok) {\n const agentsData = await agentsRes.json() as any\n for (const agent of (agentsData.agents || [])) {\n if (agent.totalEntries > 0) {\n console.log(chalk.dim(` ${agent.agentId}: ${agent.totalEntries} entries, ${agent.totalArticles} articles`))\n }\n }\n }\n } catch { /* optional */ }\n\n } catch (e: any) {\n if (e.cause?.code === \"ECONNREFUSED\") {\n console.log(chalk.red(` Connection refused`))\n } else {\n console.log(chalk.red(` ${e.message}`))\n }\n }\n }\n\n console.log()\n if (totalSynced > 0 && !opts.dryRun) {\n console.log(chalk.green(` ${totalSynced} entries synced. Run 'agentx wiki absorb' to compile.`))\n } else if (totalSynced > 0) {\n console.log(chalk.dim(` ${totalSynced} entries would be synced (dry run)`))\n } else {\n console.log(chalk.dim(\" All peers up to date\"))\n }\n console.log()\n })\n\n// agentx wiki compare — deterministic comparison of all three modes\nwiki\n .command(\"compare\")\n .description(\"compare all wiki compilation modes for an agent\")\n .option(\"--dir <path>\", \"wiki directory\")\n .requiredOption(\"--agent <id>\", \"agent to compare\")\n .action((opts) => {\n const dir = opts.dir || resolve(process.cwd(), \".agentx/wiki\")\n const agentId = opts.agent\n const modes: WikiMode[] = [\"flat\", \"graph\", \"unified\"]\n\n // Collect stats per mode\n const stats = modes.map(mode => {\n const hub = new WikiHub(dir, undefined, mode)\n const wiki = hub.getAgentWiki(agentId)\n const index = wiki.rebuildIndex()\n const entries = hub.getAgentEntries(agentId)\n const unabsorbed = hub.getUnabsorbedEntries(agentId)\n\n const tags = new Set<string>()\n let totalTags = 0\n const sources = new Set<string>()\n for (const a of index.articles) {\n for (const t of (a.tags || [])) tags.add(t)\n totalTags += (a.tags?.length || 0)\n for (const s of (a.sources || [])) sources.add(s)\n }\n const dirs = new Set(index.articles.map(a => a.path.includes(\"/\") ? a.path.split(\"/\")[0] : \"/\"))\n\n return {\n mode,\n label: modeLabel(mode),\n articles: index.articles.length,\n entries: entries.length,\n unabsorbed: unabsorbed.length,\n uniqueTags: tags.size,\n avgTags: index.articles.length > 0 ? (totalTags / index.articles.length).toFixed(1) : \"0\",\n dirs: dirs.size,\n coverage: sources.size,\n articleList: index.articles,\n }\n })\n\n console.log()\n console.log(chalk.bold(` Wiki Compare: ${agentId}`))\n console.log(` Raw entries: ${stats[0].entries}`)\n console.log()\n\n // Table header\n const w = 22\n console.log(` ${\"\".padEnd(20)} ${stats.map(s => s.label.padEnd(w)).join(\" \")}`)\n console.log(` ${\"─\".repeat(20)} ${stats.map(() => \"─\".repeat(w)).join(\" \")}`)\n\n const rows: Array<[string, (s: typeof stats[0]) => string]> = [\n [\"Articles\", s => String(s.articles)],\n [\"Unabsorbed\", s => String(s.unabsorbed)],\n [\"Unique tags\", s => String(s.uniqueTags)],\n [\"Avg tags/article\", s => s.avgTags],\n [\"Directories\", s => String(s.dirs)],\n [\"Entry coverage\", s => `${s.coverage}/${s.entries}`],\n ]\n\n for (const [label, fn] of rows) {\n const vals = stats.map(s => fn(s).padEnd(w))\n console.log(` ${label.padEnd(20)} ${vals.join(\" \")}`)\n }\n\n console.log()\n\n // Best in each category\n const best = (key: \"uniqueTags\" | \"articles\" | \"coverage\", label: string) => {\n const max = Math.max(...stats.map(s => s[key] as number))\n const winners = stats.filter(s => (s[key] as number) === max).map(s => s.label)\n if (max > 0) console.log(chalk.dim(` Best ${label}: ${winners.join(\", \")} (${max})`))\n }\n best(\"uniqueTags\", \"tag richness\")\n best(\"articles\", \"article count\")\n best(\"coverage\", \"entry coverage\")\n\n console.log()\n })\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\"\nimport { WikiStore } from \"./store\"\nimport { WikiHub } from \"./hub\"\nimport { MeshWikiClient } from \"./mesh\"\nimport type { AgentWikiSummary } from \"./hub\"\n\n// --- Lightweight Markdown → HTML (no deps) ---\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\")\n}\n\nfunction md(text: string, wikiArticles: Map<string, string>, agentPrefix: string = \"\"): string {\n let html = escapeHtml(text)\n\n // Code blocks (fenced)\n html = html.replace(/```(\\w*)\\n([\\s\\S]*?)```/g, (_m, lang, code) =>\n `<pre><code class=\"lang-${lang}\">${code.trim()}</code></pre>`)\n\n // Inline code\n html = html.replace(/`([^`]+)`/g, '<code>$1</code>')\n\n // Tables\n html = html.replace(/^(\\|.+\\|)\\n(\\|[-| :]+\\|)\\n((?:\\|.+\\|\\n?)*)/gm, (_m, header, _sep, body) => {\n const ths = header.split(\"|\").filter((c: string) => c.trim()).map((c: string) => `<th>${c.trim()}</th>`).join(\"\")\n const rows = body.trim().split(\"\\n\").map((row: string) => {\n const tds = row.split(\"|\").filter((c: string) => c.trim()).map((c: string) => `<td>${c.trim()}</td>`).join(\"\")\n return `<tr>${tds}</tr>`\n }).join(\"\")\n return `<table><thead><tr>${ths}</tr></thead><tbody>${rows}</tbody></table>`\n })\n\n // Headings\n html = html.replace(/^#### (.+)$/gm, '<h4>$1</h4>')\n html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>')\n html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>')\n html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>')\n\n // Bold and italic\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n html = html.replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n\n // Wikilinks\n html = html.replace(/\\[\\[([^\\]]+)\\]\\]/g, (_m, title) => {\n const path = wikiArticles.get(title)\n if (path) {\n return `<a href=\"${agentPrefix}/article/${encodeURIComponent(path)}\" class=\"wikilink\">${title}</a>`\n }\n return `<a href=\"${agentPrefix}/search?q=${encodeURIComponent(title)}\" class=\"wikilink broken\">${title}</a>`\n })\n\n // External links\n html = html.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\" target=\"_blank\">$1</a>')\n\n // Unordered lists\n html = html.replace(/^- (.+)$/gm, '<li>$1</li>')\n html = html.replace(/(<li>.*<\\/li>\\n?)+/g, '<ul>$&</ul>')\n\n // Horizontal rules\n html = html.replace(/^---$/gm, '<hr>')\n\n // Paragraphs\n html = html.replace(/\\n\\n+/g, '</p><p>')\n html = `<p>${html}</p>`\n\n html = html.replace(/<p>(<(?:h[1-4]|pre|table|ul|hr|div))/g, '$1')\n html = html.replace(/(<\\/(?:h[1-4]|pre|table|ul|hr|div)>)<\\/p>/g, '$1')\n html = html.replace(/<p>\\s*<\\/p>/g, '')\n\n return html\n}\n\n// --- CSS ---\n\nconst CSS = `\n:root {\n --bg: #f8f9fa; --card: #ffffff; --border: #a2a9b1;\n --link: #0645ad; --link-visited: #0b0080; --link-broken: #ba0000;\n --heading-border: #a2a9b1; --text: #202122; --text-dim: #54595d;\n --accent: #eaecf0; --tag: #eaf3ff;\n}\n* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: -apple-system, 'Segoe UI', Roboto, sans-serif; color: var(--text); background: var(--bg); line-height: 1.6; }\n.layout { display: grid; grid-template-columns: 260px 1fr; min-height: 100vh; }\n.sidebar { background: var(--card); border-right: 1px solid var(--border); padding: 20px 16px; position: sticky; top: 0; height: 100vh; overflow-y: auto; }\n.sidebar h2 { font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-dim); margin: 20px 0 6px; padding-bottom: 4px; border-bottom: 1px solid var(--accent); }\n.sidebar h2:first-child { margin-top: 0; }\n.sidebar a { display: block; padding: 3px 8px; color: var(--link); text-decoration: none; font-size: 14px; border-radius: 3px; }\n.sidebar a:hover { background: var(--accent); }\n.sidebar a.active { background: var(--tag); font-weight: 600; }\n.sidebar .logo { font-size: 20px; font-weight: 700; color: var(--text); text-decoration: none; display: block; margin-bottom: 12px; padding: 4px 8px; }\n.sidebar .search-box { width: 100%; padding: 6px 10px; border: 1px solid var(--border); border-radius: 4px; font-size: 14px; margin-bottom: 12px; }\n.sidebar .agent-badge { display: inline-block; background: #dcedc8; color: #33691e; border-radius: 3px; padding: 1px 6px; font-size: 11px; font-weight: 600; margin-left: 4px; }\n.main { padding: 32px 48px; max-width: 960px; }\n.main h1 { font-size: 28px; font-weight: 400; border-bottom: 1px solid var(--heading-border); padding-bottom: 8px; margin-bottom: 16px; }\n.main h2 { font-size: 22px; font-weight: 400; border-bottom: 1px solid var(--accent); padding-bottom: 4px; margin: 24px 0 12px; }\n.main h3 { font-size: 18px; margin: 20px 0 8px; }\n.main h4 { font-size: 16px; margin: 16px 0 8px; }\n.main p { margin: 8px 0; }\n.main ul { margin: 8px 0 8px 24px; }\n.main li { margin: 2px 0; }\n.main a { color: var(--link); }\n.main a:visited { color: var(--link-visited); }\n.main a.wikilink.broken { color: var(--link-broken); }\n.meta { background: var(--accent); border: 1px solid var(--border); border-radius: 4px; padding: 12px 16px; margin-bottom: 20px; font-size: 13px; display: grid; grid-template-columns: auto 1fr; gap: 4px 16px; }\n.meta dt { font-weight: 600; color: var(--text-dim); }\n.tag { display: inline-block; background: var(--tag); border-radius: 3px; padding: 1px 8px; font-size: 12px; margin: 1px 2px; }\ntable { border-collapse: collapse; margin: 12px 0; width: 100%; }\nth, td { border: 1px solid var(--border); padding: 6px 12px; text-align: left; font-size: 14px; }\nth { background: var(--accent); font-weight: 600; }\ntr:hover td { background: #f0f4ff; }\npre { background: #f5f5f5; border: 1px solid var(--border); border-radius: 4px; padding: 12px; overflow-x: auto; font-size: 13px; margin: 12px 0; }\ncode { font-family: 'SF Mono', Menlo, monospace; font-size: 13px; }\np code { background: #f5f5f5; padding: 1px 4px; border-radius: 2px; }\n.entry-card { background: var(--card); border: 1px solid var(--border); border-radius: 4px; padding: 12px 16px; margin: 8px 0; }\n.entry-card .meta-line { font-size: 12px; color: var(--text-dim); margin-bottom: 4px; }\n.stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px; margin: 16px 0; }\n.stat-card { background: var(--card); border: 1px solid var(--border); border-radius: 6px; padding: 16px; text-align: center; }\n.stat-card .number { font-size: 32px; font-weight: 700; color: var(--link); }\n.stat-card .label { font-size: 13px; color: var(--text-dim); margin-top: 4px; }\n.agent-card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 20px; margin: 12px 0; transition: box-shadow 0.15s; }\n.agent-card:hover { box-shadow: 0 2px 8px rgba(0,0,0,0.1); }\n.agent-card h3 { margin: 0 0 8px; }\n.agent-card h3 a { text-decoration: none; font-size: 20px; }\n.agent-card .agent-stats { display: flex; gap: 16px; font-size: 14px; color: var(--text-dim); }\n.agent-card .agent-stats strong { color: var(--text); }\n.agent-card .article-list { margin-top: 8px; font-size: 13px; }\n.agent-card .article-list a { margin-right: 8px; }\n.backlinks { background: #fffbe6; border: 1px solid #e6d98c; border-radius: 4px; padding: 12px 16px; margin-top: 24px; font-size: 13px; }\n.backlinks h4 { margin-bottom: 4px; }\n.breadcrumb { font-size: 13px; color: var(--text-dim); margin-bottom: 12px; }\n.breadcrumb a { color: var(--link); text-decoration: none; }\n@media (max-width: 768px) { .layout { grid-template-columns: 1fr; } .sidebar { position: static; height: auto; } .main { padding: 20px; } }\n`\n\n// --- HTML Templates ---\n\nfunction pageLayout(title: string, sidebar: string, content: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${escapeHtml(title)} — AgentX Wiki</title>\n <style>${CSS}</style>\n</head>\n<body>\n <div class=\"layout\">\n <nav class=\"sidebar\">${sidebar}</nav>\n <main class=\"main\">${content}</main>\n </div>\n</body>\n</html>`\n}\n\n// --- Hub Mode (all agents) ---\n\nfunction groupByDir(articles: Array<{ title: string; path: string; tags?: string[] }>): Map<string, typeof articles> {\n const byDir = new Map<string, typeof articles>()\n for (const a of articles) {\n const dir = a.path.includes(\"/\") ? a.path.split(\"/\").slice(0, -1).join(\"/\") : \"/\"\n const list = byDir.get(dir) || []\n list.push(a)\n byDir.set(dir, list)\n }\n return new Map([...byDir].sort((a, b) => a[0].localeCompare(b[0])))\n}\n\nfunction dirLabel(dir: string): string {\n if (dir === \"/\") return \"Root\"\n return dir.split(\"/\").pop()!.replace(/-/g, \" \")\n}\n\nfunction hubSidebar(agents: AgentWikiSummary[], activePath?: string): string {\n let html = '<a href=\"/\" class=\"logo\">AgentX Wiki</a>'\n html += '<form action=\"/search\" method=\"get\"><input type=\"text\" name=\"q\" class=\"search-box\" placeholder=\"Search all wikis...\"></form>'\n html += '<h2>Hub</h2>'\n html += `<a href=\"/\"${!activePath ? ' class=\"active\"' : ''}>Home</a>`\n html += '<a href=\"/entries\">All Entries</a>'\n\n for (const agent of agents) {\n const agentPrefix = `/agent/${encodeURIComponent(agent.agentId)}`\n html += `<h2><a href=\"${agentPrefix}\" style=\"color:inherit;text-decoration:none\">${escapeHtml(agent.agentId)}</a> <span class=\"agent-badge\">${agent.totalArticles}</span></h2>`\n\n // Group articles by type\n const byType = groupByDir(agent.articles)\n for (const [type, articles] of byType) {\n html += `<div style=\"font-size:11px;text-transform:uppercase;letter-spacing:0.3px;color:#888;margin:8px 8px 2px;font-weight:600\">${dirLabel(type)}</div>`\n for (const a of articles) {\n const fullPath = `${agent.agentId}/${a.path}`\n const isActive = fullPath === activePath\n html += `<a href=\"${agentPrefix}/article/${encodeURIComponent(a.path)}\"${isActive ? ' class=\"active\"' : ''} style=\"padding-left:16px;font-size:13px\">${escapeHtml(a.title)}</a>`\n }\n }\n }\n\n return html\n}\n\nfunction hubHome(hub: WikiHub, allAgents?: AgentWikiSummary[], remoteAgents?: Array<AgentWikiSummary & { nodeId: string }>): string {\n const agents = allAgents || hub.summary()\n const shared = hub.getSharedStore()\n const totalEntries = shared.listEntries().length\n const totalArticles = agents.reduce((s, a) => s + a.totalArticles, 0)\n const totalUnabsorbed = agents.reduce((s, a) => s + a.unabsorbed, 0)\n const remoteIds = new Set((remoteAgents || []).map(r => r.agentId))\n\n let content = '<h1>AgentX Wiki Hub</h1>'\n\n // Stats\n content += '<div class=\"stats\">'\n content += `<div class=\"stat-card\"><div class=\"number\">${agents.length}</div><div class=\"label\">Agents</div></div>`\n content += `<div class=\"stat-card\"><div class=\"number\">${totalArticles}</div><div class=\"label\">Articles</div></div>`\n content += `<div class=\"stat-card\"><div class=\"number\">${totalEntries}</div><div class=\"label\">Raw Entries</div></div>`\n if (remoteAgents && remoteAgents.length > 0) {\n const nodes = new Set(remoteAgents.map(r => r.nodeId))\n content += `<div class=\"stat-card\"><div class=\"number\">${nodes.size}</div><div class=\"label\">Mesh Nodes</div></div>`\n }\n content += '</div>'\n\n // Agent cards\n content += '<h2>Agent Wikis</h2>'\n for (const agent of agents) {\n const status = agent.unabsorbed > 0\n ? `<span style=\"color: #e6a700;\">${agent.unabsorbed} unabsorbed</span>`\n : '<span style=\"color: green;\">up to date</span>'\n\n const isRemote = remoteIds.has(agent.agentId) && !hub.listAgents().includes(agent.agentId)\n const remoteBadge = isRemote ? ' <span class=\"tag\" style=\"background:#fff3cd;color:#856404\">remote</span>' : ''\n\n content += `<div class=\"agent-card\">`\n content += `<h3><a href=\"/agent/${encodeURIComponent(agent.agentId)}\">${escapeHtml(agent.agentId)}</a>${remoteBadge}</h3>`\n content += `<div class=\"agent-stats\">\n <span><strong>${agent.totalArticles}</strong> articles</span>\n <span><strong>${agent.totalEntries}</strong> entries</span>\n <span>${status}</span>\n </div>`\n\n if (agent.articles.length > 0) {\n content += '<div class=\"article-list\">'\n for (const a of agent.articles) {\n content += `<a href=\"/agent/${encodeURIComponent(agent.agentId)}/article/${encodeURIComponent(a.path)}\"><span class=\"tag\">${(a.tags||[]).slice(0,3).join(\", \")}</span> ${escapeHtml(a.title)}</a> `\n }\n content += '</div>'\n }\n content += '</div>'\n }\n\n return pageLayout(\"Hub\", hubSidebar(agents), content)\n}\n\nfunction hubAgentOverview(hub: WikiHub, agentId: string, allAgents?: AgentWikiSummary[]): string {\n const agents = allAgents || hub.summary()\n const agentSummary = agents.find(a => a.agentId === agentId)\n if (!agentSummary) return pageLayout(\"Not Found\", hubSidebar(agents), \"<h1>Agent not found</h1>\")\n\n // Use summary articles (may come from remote peer if it has more)\n const isRemote = (agentSummary as any).peerUrl !== undefined\n const entries = hub.getAgentEntries(agentId)\n const articles = agentSummary.articles || []\n\n let content = `<div class=\"breadcrumb\"><a href=\"/\">Hub</a> / ${escapeHtml(agentId)}</div>`\n content += `<h1>${escapeHtml(agentId)}</h1>`\n if (isRemote) {\n content += `<p><span class=\"tag\" style=\"background:#fff3cd;color:#856404\">remote @ ${escapeHtml((agentSummary as any).nodeId)}</span></p>`\n }\n\n // Stats\n content += '<div class=\"stats\">'\n content += `<div class=\"stat-card\"><div class=\"number\">${agentSummary.totalArticles}</div><div class=\"label\">Articles</div></div>`\n content += `<div class=\"stat-card\"><div class=\"number\">${agentSummary.totalEntries}</div><div class=\"label\">Entries</div></div>`\n content += `<div class=\"stat-card\"><div class=\"number\">${agentSummary.unabsorbed}</div><div class=\"label\">Unabsorbed</div></div>`\n content += '</div>'\n\n // Articles table\n if (articles.length > 0) {\n content += '<h2>Articles</h2><table>'\n content += '<tr><th>Title</th><th>Tags</th></tr>'\n for (const a of articles) {\n content += `<tr>\n <td><a href=\"/agent/${encodeURIComponent(agentId)}/article/${encodeURIComponent(a.path)}\">${escapeHtml(a.title)}</a></td>\n <td>${((a.tags || []) as string[]).slice(0, 4).map(t => `<span class=\"tag\">${t}</span>`).join(\" \")}</td>\n </tr>`\n }\n content += '</table>'\n }\n\n // Recent entries\n const recent = entries.slice(-5).reverse()\n if (recent.length > 0) {\n content += '<h2>Recent Entries</h2>'\n for (const e of recent) {\n content += `<div class=\"entry-card\">\n <div class=\"meta-line\">${e.date} via ${e.source} · <code>${e.id}</code></div>\n <p>${escapeHtml(e.content.slice(0, 300))}${e.content.length > 300 ? \"...\" : \"\"}</p>\n </div>`\n }\n }\n\n // Lint\n const agentStore = hub.getAgentWiki(agentId)\n const issues = agentStore.lint()\n if (issues.length > 0) {\n content += `<h2>Health Issues (${issues.length})</h2><table>`\n content += '<tr><th>Type</th><th>Article</th><th>Issue</th></tr>'\n for (const issue of issues) {\n content += `<tr><td><span class=\"tag\">${issue.type}</span></td><td>${escapeHtml(issue.article)}</td><td>${escapeHtml(issue.message)}</td></tr>`\n }\n content += '</table>'\n }\n\n return pageLayout(agentId, hubSidebar(agents, agentId), content)\n}\n\nfunction hubArticlePage(hub: WikiHub, agentId: string, articlePath: string, allAgents?: AgentWikiSummary[]): string | null {\n const store = hub.getAgentWiki(agentId)\n const article = store.readArticle(articlePath)\n if (!article) return null\n\n const agents = allAgents || hub.summary()\n const index = store.rebuildIndex()\n const titleToPath = new Map<string, string>()\n for (const a of index.articles) titleToPath.set(a.title, a.path)\n\n const prefix = `/agent/${encodeURIComponent(agentId)}`\n const backlinks = store.buildBacklinks()\n const inbound = backlinks[article.meta.title] || []\n\n let content = `<div class=\"breadcrumb\"><a href=\"/\">Hub</a> / <a href=\"${prefix}\">${escapeHtml(agentId)}</a> / ${escapeHtml(article.meta.title)}</div>`\n content += `<h1>${escapeHtml(article.meta.title)}</h1>`\n\n // Meta box\n content += '<dl class=\"meta\">'\n content += `<dt>Tags</dt><dd>${(article.meta.tags||[]).map(t => `<span class=\"tag\">${t}</span>`).join(\" \")}</dd>`\n content += `<dt>Owner</dt><dd>${escapeHtml(article.meta.owner)}</dd>`\n content += `<dt>Created</dt><dd>${article.meta.created}</dd>`\n content += `<dt>Updated</dt><dd>${article.meta.lastUpdated}</dd>`\n if (article.meta.sources?.length) {\n content += `<dt>Sources</dt><dd>${article.meta.sources.length} entries</dd>`\n }\n content += '</dl>'\n\n content += md(article.content, titleToPath, prefix)\n\n if (inbound.length > 0) {\n content += '<div class=\"backlinks\"><h4>Pages that link here:</h4><ul>'\n for (const link of inbound) {\n const linked = store.readArticle(link)\n content += `<li><a href=\"${prefix}/article/${encodeURIComponent(link)}\">${escapeHtml(linked?.meta.title || link)}</a></li>`\n }\n content += '</ul></div>'\n }\n\n return pageLayout(article.meta.title, hubSidebar(agents, `${agentId}/${articlePath}`), content)\n}\n\nfunction hubEntries(hub: WikiHub, allAgents?: AgentWikiSummary[]): string {\n const agents = allAgents || hub.summary()\n const shared = hub.getSharedStore()\n const entries = shared.listEntries()\n\n let content = '<div class=\"breadcrumb\"><a href=\"/\">Hub</a> / Entries</div>'\n content += `<h1>All Raw Entries (${entries.length})</h1>`\n\n const byDate = new Map<string, typeof entries>()\n for (const e of entries) {\n const list = byDate.get(e.date) || []\n list.push(e)\n byDate.set(e.date, list)\n }\n\n for (const [date, dateEntries] of [...byDate].reverse()) {\n content += `<h2>${date} (${dateEntries.length})</h2>`\n for (const e of dateEntries) {\n content += `<div class=\"entry-card\">\n <div class=\"meta-line\">\n <a href=\"/agent/${encodeURIComponent(e.agentId)}\">${escapeHtml(e.agentId)}</a>\n via ${e.source} · <code>${e.id}</code>\n </div>\n <p>${escapeHtml(e.content.slice(0, 400))}${e.content.length > 400 ? \"...\" : \"\"}</p>\n </div>`\n }\n }\n\n return pageLayout(\"All Entries\", hubSidebar(agents), content)\n}\n\nfunction hubSearch(hub: WikiHub, query: string, allAgents?: AgentWikiSummary[]): string {\n const agents = allAgents || hub.summary()\n let content = `<h1>Search: \"${escapeHtml(query)}\"</h1>`\n let totalResults = 0\n\n for (const agentSummary of agents) {\n const store = hub.getAgentWiki(agentSummary.agentId)\n const results = store.findRelevant(query, undefined, 10)\n\n if (results.length > 0) {\n content += `<h2>${escapeHtml(agentSummary.agentId)} (${results.length})</h2>`\n for (const r of results) {\n const prefix = `/agent/${encodeURIComponent(agentSummary.agentId)}`\n content += `<div class=\"entry-card\">\n <div class=\"meta-line\">${(r.meta.tags||[]).slice(0,3).map(t => `<span class=\"tag\">${t}</span>`).join(\" \")}</div>\n <h3><a href=\"${prefix}/article/${encodeURIComponent(r.path)}\">${escapeHtml(r.meta.title)}</a></h3>\n <p>${escapeHtml(r.content.slice(0, 200))}...</p>\n </div>`\n }\n totalResults += results.length\n }\n }\n\n if (totalResults === 0) content += '<p>No matching articles found.</p>'\n\n return pageLayout(`Search: ${query}`, hubSidebar(agents), content)\n}\n\n// --- Single Agent Mode ---\n\nfunction agentSidebar(store: WikiStore, agentId: string, activePath?: string): string {\n const index = store.rebuildIndex()\n const byType = groupByDir(index.articles.map(a => ({ title: a.title, path: a.path, tags: a.tags })))\n\n let html = `<a href=\"/\" class=\"logo\">${escapeHtml(agentId)}</a>`\n html += '<form action=\"/search\" method=\"get\"><input type=\"text\" name=\"q\" class=\"search-box\" placeholder=\"Search...\"></form>'\n html += '<h2>Navigation</h2>'\n html += `<a href=\"/\"${!activePath ? ' class=\"active\"' : ''}>Home</a>`\n html += '<a href=\"/lint\">Health Check</a>'\n\n for (const [type, articles] of byType) {\n html += `<h2>${dirLabel(type)}</h2>`\n for (const a of articles) {\n const isActive = a.path === activePath\n html += `<a href=\"/article/${encodeURIComponent(a.path)}\"${isActive ? ' class=\"active\"' : ''}>${escapeHtml(a.title)}</a>`\n }\n }\n\n return html\n}\n\n// --- Server ---\n\nexport function startWikiServer(wikiDir: string, port: number = 4200, agentFilter?: string, peerUrls: string[] = [], mode: \"flat\" | \"graph\" | \"unified\" = \"unified\"): void {\n const hub = new WikiHub(wikiDir, undefined, mode)\n const mesh = peerUrls.length > 0 ? new MeshWikiClient(peerUrls) : null\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || \"/\", `http://localhost:${port}`)\n const path = decodeURIComponent(url.pathname)\n\n let html: string | null = null\n let status = 200\n\n try {\n // Handle remote article fetch: /remote/:peerIdx/:agentId/article/:path\n if (path.startsWith(\"/remote/\") && mesh) {\n const parts = path.slice(\"/remote/\".length).split(\"/article/\")\n if (parts.length === 2) {\n const [peerAgent, articlePath] = parts\n const slashIdx = peerAgent.indexOf(\"/\")\n const peerUrl = decodeURIComponent(peerAgent.slice(0, slashIdx))\n const agentId = peerAgent.slice(slashIdx + 1)\n\n const article = await mesh.getRemoteArticle(peerUrl, agentId, articlePath)\n if (article) {\n const remoteAgents = await mesh.getRemoteAgents()\n const allAgents = [...hub.summary(), ...remoteAgents.map(r => ({ ...r, agentId: `${r.agentId} @${r.nodeId}` }))]\n\n let content = `<div class=\"breadcrumb\"><a href=\"/\">Hub</a> / <span class=\"tag\">remote</span> ${escapeHtml(agentId)} @ ${escapeHtml(peerUrl)}</div>`\n content += `<h1>${escapeHtml(article.meta.title)}</h1>`\n content += '<dl class=\"meta\">'\n content += `<dt>Tags</dt><dd>${(article.meta.tags||[]).map(t => `<span class=\"tag\">${t}</span>`).join(\" \")}</dd>`\n content += `<dt>Owner</dt><dd>${escapeHtml(article.meta.owner)}</dd>`\n content += `<dt>Source</dt><dd><span class=\"tag\">remote</span> ${escapeHtml(peerUrl)}</dd>`\n content += `<dt>Updated</dt><dd>${article.meta.lastUpdated}</dd>`\n content += '</dl>'\n\n const titleToPath = new Map<string, string>()\n content += md(article.content, titleToPath)\n\n html = pageLayout(article.meta.title, hubSidebar(allAgents), content)\n }\n }\n }\n\n if (!html && agentFilter) {\n // Single agent mode\n const store = hub.getAgentWiki(agentFilter)\n\n if (path === \"/\" || path === \"\") {\n const index = store.rebuildIndex()\n const entries = hub.getAgentEntries(agentFilter)\n let content = `<h1>${escapeHtml(agentFilter)}</h1>`\n content += '<div class=\"stats\">'\n content += `<div class=\"stat-card\"><div class=\"number\">${index.articles.length}</div><div class=\"label\">Articles</div></div>`\n content += `<div class=\"stat-card\"><div class=\"number\">${entries.length}</div><div class=\"label\">Entries</div></div>`\n content += '</div>'\n if (index.articles.length > 0) {\n content += '<h2>Articles</h2><table><tr><th>Title</th><th>Type</th><th>Updated</th></tr>'\n for (const a of index.articles) {\n content += `<tr><td><a href=\"/article/${encodeURIComponent(a.path)}\">${escapeHtml(a.title)}</a></td><td><span class=\"tag\">${(a.tags||[]).slice(0,3).join(\", \")}</span></td><td>${a.lastUpdated || \"\"}</td></tr>`\n }\n content += '</table>'\n }\n html = pageLayout(agentFilter, agentSidebar(store, agentFilter), content)\n } else if (path.startsWith(\"/article/\")) {\n const articlePath = path.slice(\"/article/\".length)\n const article = store.readArticle(articlePath)\n if (article) {\n const index = store.rebuildIndex()\n const titleToPath = new Map<string, string>()\n for (const a of index.articles) titleToPath.set(a.title, a.path)\n let content = `<h1>${escapeHtml(article.meta.title)}</h1>`\n content += '<dl class=\"meta\">'\n content += `<dt>Tags</dt><dd>${(article.meta.tags||[]).map(t => `<span class=\"tag\">${t}</span>`).join(\" \")}</dd>`\n content += `<dt>Updated</dt><dd>${article.meta.lastUpdated}</dd>`\n if (article.meta.sources?.length) content += `<dt>Sources</dt><dd>${article.meta.sources.length} entries</dd>`\n content += '</dl>'\n content += md(article.content, titleToPath)\n html = pageLayout(article.meta.title, agentSidebar(store, agentFilter, articlePath), content)\n }\n } else if (path === \"/lint\") {\n const issues = store.lint()\n let content = '<h1>Health Check</h1>'\n if (issues.length === 0) { content += '<p style=\"color:green;\">No issues.</p>' }\n else {\n content += `<table><tr><th>Type</th><th>Article</th><th>Issue</th></tr>`\n for (const i of issues) content += `<tr><td><span class=\"tag\">${i.type}</span></td><td>${escapeHtml(i.article)}</td><td>${escapeHtml(i.message)}</td></tr>`\n content += '</table>'\n }\n html = pageLayout(\"Health Check\", agentSidebar(store, agentFilter), content)\n } else if (path === \"/search\") {\n const q = url.searchParams.get(\"q\") || \"\"\n const results = store.findRelevant(q, undefined, 20)\n let content = `<h1>Search: \"${escapeHtml(q)}\"</h1>`\n for (const r of results) {\n content += `<div class=\"entry-card\"><h3><a href=\"/article/${encodeURIComponent(r.path)}\">${escapeHtml(r.meta.title)}</a></h3><p>${escapeHtml(r.content.slice(0, 200))}...</p></div>`\n }\n if (results.length === 0) content += '<p>No results.</p>'\n html = pageLayout(`Search: ${q}`, agentSidebar(store, agentFilter), content)\n }\n } else {\n // Hub mode — merge local + remote agents\n const remoteAgents = mesh ? await mesh.getRemoteAgents() : []\n const localAgents = hub.summary()\n // Merge: prefer whichever has more articles (local or remote)\n const localMap = new Map(localAgents.map(a => [a.agentId, a]))\n const allAgents: AgentWikiSummary[] = []\n const seen = new Set<string>()\n\n for (const local of localAgents) {\n const remote = remoteAgents.find(r => r.agentId === local.agentId)\n if (remote && remote.totalArticles > local.totalArticles) {\n // Remote has more articles — merge: keep remote articles, combine entry counts\n allAgents.push({\n ...remote,\n totalEntries: Math.max(local.totalEntries, remote.totalEntries),\n unabsorbed: Math.max(local.unabsorbed, remote.unabsorbed),\n })\n } else {\n allAgents.push(local)\n }\n seen.add(local.agentId)\n }\n // Add remote-only agents\n for (const remote of remoteAgents) {\n if (!seen.has(remote.agentId)) {\n allAgents.push(remote)\n seen.add(remote.agentId)\n }\n }\n\n if (path === \"/\" || path === \"\") {\n html = hubHome(hub, allAgents, remoteAgents)\n } else if (path === \"/entries\") {\n html = hubEntries(hub, allAgents)\n } else if (path === \"/search\") {\n html = hubSearch(hub, url.searchParams.get(\"q\") || \"\", allAgents)\n } else if (path.startsWith(\"/agent/\")) {\n const rest = path.slice(\"/agent/\".length)\n const slashIdx = rest.indexOf(\"/article/\")\n if (slashIdx === -1) {\n // Agent overview\n html = hubAgentOverview(hub, rest, allAgents)\n } else {\n // Agent article\n const agentId = rest.slice(0, slashIdx)\n const articlePath = rest.slice(slashIdx + \"/article/\".length)\n html = hubArticlePage(hub, agentId, articlePath, allAgents)\n\n // If not found locally, try remote peers\n if (!html && mesh) {\n const remote = remoteAgents.find(r => r.agentId === agentId)\n if (remote) {\n const article = await mesh.getRemoteArticle(remote.peerUrl, agentId, articlePath)\n if (article) {\n let content = `<div class=\"breadcrumb\"><a href=\"/\">Hub</a> / <span class=\"tag\">remote @ ${escapeHtml(remote.nodeId)}</span> / ${escapeHtml(agentId)}</div>`\n content += `<h1>${escapeHtml(article.meta.title)}</h1>`\n content += '<dl class=\"meta\">'\n content += `<dt>Tags</dt><dd>${(article.meta.tags||[]).map(t => `<span class=\"tag\">${t}</span>`).join(\" \")}</dd>`\n content += `<dt>Source</dt><dd><span class=\"tag\">remote</span> ${escapeHtml(remote.nodeId)}</dd>`\n content += `<dt>Updated</dt><dd>${article.meta.lastUpdated}</dd>`\n content += '</dl>'\n content += md(article.content, new Map())\n html = pageLayout(article.meta.title, hubSidebar(allAgents), content)\n }\n }\n }\n }\n }\n }\n\n if (!html) {\n status = 404\n const sidebar = agentFilter\n ? agentSidebar(hub.getAgentWiki(agentFilter), agentFilter)\n : hubSidebar(hub.summary())\n html = pageLayout(\"Not Found\", sidebar, \"<h1>Page not found</h1>\")\n }\n } catch (err: any) {\n status = 500\n html = pageLayout(\"Error\", \"\", `<h1>Error</h1><pre>${escapeHtml(err.message)}</pre>`)\n }\n\n res.writeHead(status, { \"Content-Type\": \"text/html; charset=utf-8\" })\n res.end(html)\n })\n\n server.listen(port)\n}\n","import type { AgentWikiSummary } from \"./hub\"\nimport type { WikiArticle } from \"./types\"\n\n/**\n * Fetches wiki data from mesh peers over HTTP.\n * Each peer exposes /wiki/agents, /wiki/entries, /wiki/articles.\n */\nexport class MeshWikiClient {\n private peers: Array<{ url: string; nodeId?: string }>\n private cache: Map<string, { data: any; ts: number }> = new Map()\n private ttl = 30_000 // 30s cache\n\n constructor(peerUrls: string[]) {\n this.peers = peerUrls.map(url => ({ url: url.replace(/\\/$/, \"\") }))\n }\n\n /**\n * Get agent summaries from all peers.\n * Returns remote summaries with nodeId attached.\n */\n async getRemoteAgents(): Promise<Array<AgentWikiSummary & { nodeId: string; peerUrl: string }>> {\n const results: Array<AgentWikiSummary & { nodeId: string; peerUrl: string }> = []\n\n await Promise.all(this.peers.map(async (peer) => {\n try {\n const data = await this.fetchJson(`${peer.url}/wiki/agents`)\n peer.nodeId = data.nodeId\n for (const agent of (data.agents || [])) {\n if (agent.totalEntries > 0 || agent.totalArticles > 0) {\n results.push({ ...agent, nodeId: data.nodeId, peerUrl: peer.url })\n }\n }\n } catch { /* peer unreachable */ }\n }))\n\n return results\n }\n\n /**\n * Get articles for a specific agent from a specific peer.\n */\n async getRemoteArticles(peerUrl: string, agentId: string): Promise<Array<{\n path: string; title: string; tags: string[]; lastUpdated?: string; sources?: string[]\n }>> {\n try {\n const data = await this.fetchJson(`${peerUrl}/wiki/articles?agent=${encodeURIComponent(agentId)}`)\n return data.articles || []\n } catch {\n return []\n }\n }\n\n /**\n * Fetch a specific article's content from a peer.\n */\n async getRemoteArticle(peerUrl: string, agentId: string, articlePath: string): Promise<WikiArticle | null> {\n try {\n const data = await this.fetchJson(\n `${peerUrl}/wiki/article?agent=${encodeURIComponent(agentId)}&path=${encodeURIComponent(articlePath)}`\n )\n return {\n meta: {\n title: data.title,\n tags: data.tags || [],\n owner: data.owner,\n access: \"public\",\n created: data.created,\n lastUpdated: data.lastUpdated,\n sources: data.sources || [],\n },\n content: data.content,\n path: data.path,\n }\n } catch {\n return null\n }\n }\n\n private async fetchJson(url: string): Promise<any> {\n const cached = this.cache.get(url)\n if (cached && Date.now() - cached.ts < this.ttl) return cached.data\n\n const res = await fetch(url, { signal: AbortSignal.timeout(5000) })\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n const data = await res.json()\n this.cache.set(url, { data, ts: Date.now() })\n return data\n }\n}\n","import type { WikiMode } from \"./hub\"\n\n/**\n * Two absorb prompts — same entries, different compilation strategies.\n */\n\nexport function buildAbsorbPrompt(\n mode: WikiMode,\n agentId: string,\n worldview: string,\n existingArticles: Array<{ title: string; path: string; tags?: string[] }>,\n entryTexts: string,\n entryCount: number,\n): string {\n const existingList = existingArticles.length > 0\n ? `\\nExisting articles:\\n${existingArticles.map(a => `- ${a.title} [${(a.tags || []).join(\", \")}] (${a.path})`).join(\"\\n\")}\\n`\n : \"\"\n\n const worldviewSection = worldview\n ? `\\n## Worldview\\n\\n${worldview}\\n`\n : \"\"\n\n if (mode === \"flat\") return buildFlatPrompt(agentId, worldviewSection, existingList, entryTexts, entryCount)\n if (mode === \"graph\") return buildGraphPrompt(agentId, worldviewSection, existingList, entryTexts, entryCount)\n return buildUnifiedPrompt(agentId, worldviewSection, existingList, entryTexts, entryCount)\n}\n\n// --- Karpathy Flat: tags, LLM-chosen paths, gap detection ---\n\nfunction buildFlatPrompt(\n agentId: string, worldview: string, existing: string, entries: string, count: number,\n): string {\n return `You are a wiki editor for the \"${agentId}\" agent. Compile raw entries into a personal wiki.\n\n## Karpathy Pattern\n\n- Plain markdown files. YOU choose the path and structure — it emerges from the data.\n- Tag AGGRESSIVELY. Tags are the #1 mechanism for context narrowing.\n- Use [[wikilinks]] to cross-reference between articles.\n- Synthesize — distill conversations into factual wiki articles, don't copy-paste.\n- If an existing article covers the topic, produce an UPDATE with full merged content.\n${worldview}${existing}\n## Tagging Rules\n\nTag every article with ALL relevant dimensions:\n- WHO: people, agents, teams (e.g., \"alice\", \"deploy-bot\", \"cto\")\n- WHAT: project, client, topic, tech (e.g., \"billing-api\", \"seo\", \"gitlab\", \"deploy\")\n- WHEN: dates, periods (e.g., \"2026-04-06\", \"week-14\")\n- WHERE: server, environment, channel (e.g., \"staging\", \"telegram\", \"production\")\n- HOW: type of knowledge (e.g., \"process\", \"incident\", \"report\", \"decision\")\n\nUse section tags: \\`<!-- tags: runbook, staging -->\\`\n\n## Gap Detection\n\nAfter compiling, add a \"gaps\" array — topics MENTIONED but not yet covered.\n\n## Output — ONLY valid JSON, no markdown fencing\n\n{\n \"articles\": [\n {\n \"path\": \"infra/staging-deploy.md\",\n \"title\": \"Staging Deployment Process\",\n \"tags\": [\"deploy\", \"staging\", \"devops\", \"process\", \"2026-04-06\"],\n \"content\": \"How we deploy to staging...\\\\n\\\\n## Steps\\\\n<!-- tags: runbook, staging -->\\\\n1. ...\",\n \"sources\": [\"entry-id-1\", \"entry-id-2\"]\n }\n ],\n \"gaps\": [\"Production server — mentioned but no article exists\"]\n}\n\nENTRIES (${count}):\n\n${entries}`\n}\n\n// --- Knowledge Graph: kind, parent, hierarchy, events, entities ---\n\nfunction buildGraphPrompt(\n agentId: string, worldview: string, existing: string, entries: string, count: number,\n): string {\n return `You are building a knowledge graph for the \"${agentId}\" agent. Compile raw entries into a structured wiki.\n\n## Knowledge Graph Model\n\nEvery article is a NODE with a kind and position in a hierarchy.\nThe path reflects the hierarchy: org/team/agent-name.md\n\n### Node Kinds\n\n**Entities** (things that persist):\nperson, agent, company, team, client, project, repo, server, service, domain\n\n**Occurrences** (things that happen — always have a date):\nevent, incident, deploy, decision\n\n**Knowledge** (what we know):\nprocess, pattern, concept, report\n\n### Rules\n\n1. Ask: \"What ENTITY is this about? What HAPPENED? Where in the hierarchy?\"\n2. Entities go under their parent: agent under team, server under project\n3. Events go under events/YYYY-MM-DD/ and list which entities are involved\n4. Path = hierarchy: org/<company>/<area>/<entity>.md\n5. Use [[wikilinks]] to cross-reference between nodes\n6. Synthesize — distill conversations into factual wiki content\n7. If an existing article covers the topic, produce an UPDATE with full merged content\n8. Tag aggressively too — tags help narrow context\n${worldview}${existing}\n## Gap Detection\n\nAfter compiling, add a \"gaps\" array — entities or events MENTIONED but missing.\n\n## Output — ONLY valid JSON, no markdown fencing\n\n{\n \"articles\": [\n {\n \"path\": \"org/team/marketing-bot.md\",\n \"title\": \"Marketing Bot — Content Agent\",\n \"tags\": [\"marketing-bot\", \"agent\", \"marketing\"],\n \"kind\": \"agent\",\n \"parent\": \"org/team\",\n \"content\": \"Marketing bot handles content and SEO.\",\n \"sources\": [\"entry-id-1\"],\n \"date\": null,\n \"involves\": null\n },\n {\n \"path\": \"events/2026-04-06/token-expiry.md\",\n \"title\": \"GitLab Token Expiry\",\n \"tags\": [\"incident\", \"gitlab\", \"2026-04-06\"],\n \"kind\": \"incident\",\n \"parent\": \"events/2026-04-06\",\n \"content\": \"The GITLAB_TOKEN expired, blocking deploys.\",\n \"sources\": [\"entry-id-2\"],\n \"date\": \"2026-04-06\",\n \"involves\": [\"org/clients/acme\"]\n }\n ],\n \"gaps\": [\"Production server — entity mentioned but missing\"]\n}\n\nENTRIES (${count}):\n\n${entries}`\n}\n\n// --- Unified: best of both — flat's tags + graph's entity thinking ---\n\nfunction buildUnifiedPrompt(\n agentId: string, worldview: string, existing: string, entries: string, count: number,\n): string {\n return `You are compiling a personal wiki for the \"${agentId}\" agent.\n\n## Your Job\n\nRead ${count} raw conversation entries. For each, ask:\n1. **Who** is mentioned? (people, agents, companies, teams)\n2. **What** is this about? (project, server, tool, concept)\n3. **What happened?** (deploy, incident, decision, report)\n4. **What's missing?** (entities mentioned but undocumented)\n\nThen compile articles — one topic per article, synthesized (not copy-pasted).\n\n## How to Organize\n\n- YOU choose the file path. Let structure emerge from the data.\n- Use whatever directory names make sense: projects/, incidents/, agents/ — your call.\n- Use [[wikilinks]] to cross-reference between articles.\n- If an existing article covers the topic, produce an UPDATE with full merged content.\n${worldview}${existing}\n## How to Tag (CRITICAL)\n\nTags are how agents find relevant context. Tag EVERY article with ALL dimensions:\n\n| Dimension | Examples |\n|-----------|----------|\n| **Who** | agent names, people, team names |\n| **What** | project names, tools, technologies |\n| **Type** | person, agent, server, project, incident, process, report, decision |\n| **When** | 2026-04-06, week-14, q2-2026 |\n| **Where** | staging, production, telegram, server-name |\n| **How** | deploy, runbook, spike, review |\n\nMinimum 6 tags per article. More is better.\nUse section-level tags too: \\`<!-- tags: runbook, staging -->\\`\n\n## How to Find Gaps\n\nAfter compiling, identify MISSING PIECES:\n- People mentioned but no article (e.g., \"Alice gives deploy instructions but who is Alice?\")\n- Servers referenced but undocumented (e.g., \"10.0.1.5 — what is this?\")\n- Processes implied but not written down (e.g., \"deploy to staging — how exactly?\")\n- Projects named but no overview (e.g., \"Project X — what is it?\")\n\nBe specific. \"X is undocumented\" is useless. \"Alice — stakeholder who issues deploy instructions via Telegram, no profile article\" is useful.\n\n## Output — ONLY valid JSON, no markdown fencing\n\n{\n \"articles\": [\n {\n \"path\": \"agents/marketing-bot.md\",\n \"title\": \"Marketing Bot — Content Agent\",\n \"tags\": [\"marketing-bot\", \"agent\", \"marketing\", \"content\", \"seo\"],\n \"content\": \"Marketing bot handles content, marketing, and SEO.\\\\n\\\\n## Capabilities\\\\n<!-- tags: capabilities, tools -->\\\\n...\",\n \"sources\": [\"entry-id-1\"]\n }\n ],\n \"gaps\": [\n \"Alice — stakeholder who issues deploy instructions via Telegram, no profile article\",\n \"10.0.1.5 — production server IP referenced but no infrastructure article\"\n ]\n}\n\nENTRIES (${count}):\n\n${entries}`\n}\n"],"mappings":"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","names":["Command","Command","chalk","daemon","Command","opts","spawn","args","child","writeFileSync","readFileSync","mkdirSync","existsSync","resolve","lockDir","pidPath","oldPid","AgentXDaemon","unlinkSync","pidFiles","pidFile","pid","r","execSync","config","loadDaemonConfig","host","port","url","data","formatDuration","active","errors","enabledCrons","c","icon","next","p","skills","e","warnings","validateWorkspaces","w","err","spawnProc","logFile","tail","res","reader","decoder","buffer","done","value","lines","line","time","msg","agent","messageParts","message","baseUrl","body","sshKey","remote","statSync","cliPath","ssh","seconds","Command","chalk","existsSync","readFileSync","writeFileSync","mkdirSync","resolve","init","opts","cwd","configPath","envPath","sessionsDir","examplePaths","example","p","claudeDir","Command","chalk","prompts","readFileSync","writeFileSync","existsSync","mkdirSync","cpSync","readdirSync","resolve","join","loadConfig","p","resolve","existsSync","readFileSync","saveConfig","config","writeFileSync","agent","Command","id","a","mentions","chalk","answers","prompts","v","ws","join","mkdirSync","claudeMd","wikiSkillSrc","wikiSkillDist","skillSrc","cpSync","m","channel","tg","name","acc","wa","route","target","dc","gl","agentIds","agentChoices","channelType","data","botHandle","agentMentions","e","routes","addMore","prev","cron","c","icon","mesh","peer","status","card","skillCmd","skillPath","opts","srcPath","skillName","targets","agentId","destDir","skillsDir","skills","readdirSync","f","hook","settingsPath","settings","entry","migrate","configPath","searchPaths","ocPath","oc","agents","bindings","bindMap","b","agentCount","axId","tgAccounts","tgCount","axAgentId","cronPath","cronData","cronCount","job","configCmd","loadDaemonConfig","warnings","validateWorkspaces","w","hasClaudeDir","hasClaudeMd","hasSettings","skillCount","checks","Command","chalk","usage","Command","config","loadDaemonConfig","host","port","data","chalk","fmt","n","agents","a","b","id","ag","total","avgMs","opts","startUsageDashboard","execSync","existsSync","resolve","scriptPath","Command","chalk","createServer","MeshWikiClient","peerUrls","url","results","peer","data","agent","peerUrl","agentId","articlePath","cached","res","escapeHtml","s","md","text","wikiArticles","agentPrefix","html","_m","lang","code","header","_sep","body","ths","c","rows","row","title","path","CSS","pageLayout","sidebar","content","groupByDir","articles","byDir","a","dir","list","b","dirLabel","hubSidebar","agents","activePath","agent","byType","type","isActive","hubHome","hub","allAgents","remoteAgents","totalEntries","totalArticles","totalUnabsorbed","remoteIds","r","nodes","status","remoteBadge","hubAgentOverview","agentId","agentSummary","isRemote","entries","t","recent","e","issues","issue","hubArticlePage","articlePath","store","article","index","titleToPath","prefix","inbound","link","linked","hubEntries","byDate","date","dateEntries","hubSearch","query","totalResults","results","agentSidebar","startWikiServer","wikiDir","port","agentFilter","peerUrls","mode","WikiHub","mesh","MeshWikiClient","createServer","req","res","url","parts","peerAgent","slashIdx","peerUrl","i","q","localAgents","localMap","seen","local","remote","rest","err","buildAbsorbPrompt","mode","agentId","worldview","existingArticles","entryTexts","entryCount","existingList","worldviewSection","buildFlatPrompt","buildGraphPrompt","buildUnifiedPrompt","existing","entries","count","resolve","execSync","writeFileSync","mkdirSync","getHub","dir","mode","WikiHub","modeLabel","wiki","Command","opts","hub","agents","totalEntries","chalk","agent","status","a","s","totalIssues","agentId","issues","issue","icon","maxEntries","totalAbsorbed","unabsorbed","e","agentWiki","existingIndex","worldview","entryTexts","prompt","buildAbsorbPrompt","tmpDir","promptPath","rawOutput","execErr","responseText","envelope","articles","gaps","objStart","arrStart","jsonStart","openChar","closeChar","depth","jsonEnd","i","jsonStr","parsed","parseErr","article","now","tagStr","gap","entries","port","peerUrls","loadDaemonConfig","p","startWikiServer","query","found","results","r","shared","existingIds","totalSynced","peerUrl","res","data","nodeId","newCount","entry","agentsRes","agentsData","stats","index","tags","totalTags","sources","t","dirs","w","rows","label","fn","vals","best","key","max","winners","main","packageInfo","getPackageInfo","program","Command","daemon","init","agent","channel","cron","mesh","skillCmd","hook","migrate","configCmd","usage","wiki"]}
|