agentix-cli 0.16.0 → 0.18.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.
Files changed (173) hide show
  1. package/dist/agent-RDVGL2TW.js +2 -0
  2. package/dist/audit-Z47AQFFD.js +3 -0
  3. package/dist/audit-Z47AQFFD.js.map +1 -0
  4. package/dist/board-dashboard-KX2CNOSY.js +7282 -0
  5. package/dist/board-dashboard-KX2CNOSY.js.map +1 -0
  6. package/dist/chunk-34NG7UDX.js +11 -0
  7. package/dist/chunk-34NG7UDX.js.map +1 -0
  8. package/dist/{chunk-6MKAXEE5.js → chunk-4ITQP3XL.js} +2 -2
  9. package/dist/{chunk-6MKAXEE5.js.map → chunk-4ITQP3XL.js.map} +1 -1
  10. package/dist/chunk-53NRX2NA.js +2 -0
  11. package/dist/chunk-53NRX2NA.js.map +1 -0
  12. package/dist/chunk-6PPIFDOQ.js +1742 -0
  13. package/dist/chunk-6PPIFDOQ.js.map +1 -0
  14. package/dist/chunk-AFRHKA7B.js +2 -0
  15. package/dist/chunk-AFRHKA7B.js.map +1 -0
  16. package/dist/chunk-ASSJ4Z6Z.js +164 -0
  17. package/dist/chunk-ASSJ4Z6Z.js.map +1 -0
  18. package/dist/chunk-BLUXL6HR.js +854 -0
  19. package/dist/chunk-BLUXL6HR.js.map +1 -0
  20. package/dist/chunk-BTAEYL3P.js +72 -0
  21. package/dist/chunk-BTAEYL3P.js.map +1 -0
  22. package/dist/chunk-CDNWCYF7.js +2 -0
  23. package/dist/chunk-CDNWCYF7.js.map +1 -0
  24. package/dist/chunk-DJEZ2HVU.js +5 -0
  25. package/dist/chunk-DJEZ2HVU.js.map +1 -0
  26. package/dist/{chunk-FLOGK2U7.js → chunk-DSCMCVTV.js} +3 -3
  27. package/dist/chunk-DSCMCVTV.js.map +1 -0
  28. package/dist/chunk-EW27SCCC.js +2 -0
  29. package/dist/chunk-EW27SCCC.js.map +1 -0
  30. package/dist/chunk-HPDHNIA3.js +2 -0
  31. package/dist/chunk-IM376SD6.js +13 -0
  32. package/dist/chunk-IM376SD6.js.map +1 -0
  33. package/dist/chunk-J4WKMKTP.js +5 -0
  34. package/dist/{chunk-YI2T5QYB.js.map → chunk-J4WKMKTP.js.map} +1 -1
  35. package/dist/chunk-JGXE2YNV.js +46 -0
  36. package/dist/chunk-JGXE2YNV.js.map +1 -0
  37. package/dist/chunk-JXEPJ3YD.js +118 -0
  38. package/dist/chunk-JXEPJ3YD.js.map +1 -0
  39. package/dist/chunk-LY7JGDV7.js +6 -0
  40. package/dist/chunk-LY7JGDV7.js.map +1 -0
  41. package/dist/chunk-N67JZAXU.js +2 -0
  42. package/dist/chunk-N67JZAXU.js.map +1 -0
  43. package/dist/chunk-SR3X25TN.js +3 -0
  44. package/dist/chunk-SR3X25TN.js.map +1 -0
  45. package/dist/{chunk-7MBTMCKY.js → chunk-TRQSP67X.js} +2 -2
  46. package/dist/chunk-U364GNQX.js +719 -0
  47. package/dist/chunk-U364GNQX.js.map +1 -0
  48. package/dist/chunk-VJUTQAPJ.js +2 -0
  49. package/dist/chunk-VJUTQAPJ.js.map +1 -0
  50. package/dist/{chunk-HI24KAEY.js → chunk-WJXU5F4Z.js} +3 -4
  51. package/dist/{chunk-HI24KAEY.js.map → chunk-WJXU5F4Z.js.map} +1 -1
  52. package/dist/{chunk-QZP65I2H.js → chunk-ZE2YFX4K.js} +2 -2
  53. package/dist/cli.js +1 -320
  54. package/dist/cli.js.map +1 -1
  55. package/dist/{compaction-JBZZ7I7Y.js → compaction-S5H6DTOR.js} +6 -6
  56. package/dist/compaction-S5H6DTOR.js.map +1 -0
  57. package/dist/config-UOHEG4BW.js +2 -0
  58. package/dist/config-mutator-KSEBWKJH.js +2 -0
  59. package/dist/context-planner-2RGHJHSO.js +17 -0
  60. package/dist/context-planner-2RGHJHSO.js.map +1 -0
  61. package/dist/debug-TGAP7E7W.js +2 -0
  62. package/dist/discover-OATU7SHI.js +4 -0
  63. package/dist/discover-OATU7SHI.js.map +1 -0
  64. package/dist/editor-chat-FUBQLMAQ.js +137 -0
  65. package/dist/editor-chat-FUBQLMAQ.js.map +1 -0
  66. package/dist/heal-YP7QI7D3.js +2 -0
  67. package/dist/inbox-O5UB3YQN.js +315 -0
  68. package/dist/inbox-O5UB3YQN.js.map +1 -0
  69. package/dist/index.d.ts +3390 -1814
  70. package/dist/index.js +23 -53
  71. package/dist/index.js.map +1 -1
  72. package/dist/ingest-whatsapp-C3O5UPBX.js +6 -0
  73. package/dist/ingest-whatsapp-C3O5UPBX.js.map +1 -0
  74. package/dist/loader-BGWA7IRY.js +2 -0
  75. package/dist/loader-LBHKSXBK.js +2 -0
  76. package/dist/memory-extract-KKPKAOPH.js +2 -0
  77. package/dist/processes-7W27G3J3.js +256 -0
  78. package/dist/processes-7W27G3J3.js.map +1 -0
  79. package/dist/program-2MDELQLX.js +2 -0
  80. package/dist/providers-WCQSKTNP.js +2 -0
  81. package/dist/query-FZAL7AQD.js +2 -0
  82. package/dist/recipes-LZ56TA3X.js +2 -0
  83. package/dist/registry-ONJSILH4.js +2 -0
  84. package/dist/scheduler-XRM2RJIV.js +2 -0
  85. package/dist/slack-D27BE37Q.js +3 -0
  86. package/dist/slack-D27BE37Q.js.map +1 -0
  87. package/dist/store-4UCO56K2.js +2 -0
  88. package/dist/store-4UCO56K2.js.map +1 -0
  89. package/dist/{subagent-2SJHSSJS.js → subagent-EPOT3QDM.js} +2 -2
  90. package/dist/task-store-3NUWLYRY.js +2 -0
  91. package/dist/task-store-3NUWLYRY.js.map +1 -0
  92. package/dist/telegram-UWV67KWG.js +3 -0
  93. package/dist/telegram-UWV67KWG.js.map +1 -0
  94. package/dist/timers-QB4KYNAE.js +2 -0
  95. package/dist/timers-QB4KYNAE.js.map +1 -0
  96. package/dist/types-ECMEC5BZ.js +2 -0
  97. package/dist/types-ECMEC5BZ.js.map +1 -0
  98. package/dist/types-TTB6DJUE.js +2 -0
  99. package/dist/types-TTB6DJUE.js.map +1 -0
  100. package/dist/usage-dashboard-FQGPPABD.js +803 -0
  101. package/dist/usage-dashboard-FQGPPABD.js.map +1 -0
  102. package/dist/web/workflow-editor.global.js +1450 -0
  103. package/dist/web/workflow-editor.global.js.map +1 -0
  104. package/dist/whatsapp-KJ2NRKKQ.js +3 -0
  105. package/dist/whatsapp-KJ2NRKKQ.js.map +1 -0
  106. package/dist/{whatsapp-state-6D6FHHD2.js → whatsapp-state-3ZVQ6MQD.js} +2 -2
  107. package/dist/{wiki-UDPYFJBL.js → wiki-OUYKM7MB.js} +2 -2
  108. package/dist/wiki-OUYKM7MB.js.map +1 -0
  109. package/dist/workspace-setup-6GDBEORT.js +2 -0
  110. package/dist/workspace-setup-6GDBEORT.js.map +1 -0
  111. package/package.json +19 -2
  112. package/dist/agent-BCDPSPKU.js +0 -2
  113. package/dist/board-dashboard-LA7WW56M.js +0 -5668
  114. package/dist/board-dashboard-LA7WW56M.js.map +0 -1
  115. package/dist/chunk-6U2XOQHU.js +0 -7
  116. package/dist/chunk-6U2XOQHU.js.map +0 -1
  117. package/dist/chunk-7FJQGD6U.js +0 -6
  118. package/dist/chunk-7FJQGD6U.js.map +0 -1
  119. package/dist/chunk-ABDP7TDL.js +0 -71
  120. package/dist/chunk-ABDP7TDL.js.map +0 -1
  121. package/dist/chunk-CXY2RYNI.js +0 -11
  122. package/dist/chunk-CXY2RYNI.js.map +0 -1
  123. package/dist/chunk-FIOB3MEX.js +0 -2
  124. package/dist/chunk-FLOGK2U7.js.map +0 -1
  125. package/dist/chunk-HVC6FJNP.js +0 -108
  126. package/dist/chunk-HVC6FJNP.js.map +0 -1
  127. package/dist/chunk-K7BE4E35.js +0 -138
  128. package/dist/chunk-K7BE4E35.js.map +0 -1
  129. package/dist/chunk-KXJSLLSQ.js +0 -199
  130. package/dist/chunk-KXJSLLSQ.js.map +0 -1
  131. package/dist/chunk-KXZMYLHQ.js +0 -46
  132. package/dist/chunk-KXZMYLHQ.js.map +0 -1
  133. package/dist/chunk-M7HKBG3V.js +0 -2
  134. package/dist/chunk-M7HKBG3V.js.map +0 -1
  135. package/dist/chunk-MCJUAE6V.js +0 -6
  136. package/dist/chunk-MCJUAE6V.js.map +0 -1
  137. package/dist/chunk-RB7265LO.js +0 -12
  138. package/dist/chunk-RB7265LO.js.map +0 -1
  139. package/dist/chunk-YI2T5QYB.js +0 -5
  140. package/dist/compaction-JBZZ7I7Y.js.map +0 -1
  141. package/dist/config-LN6JEHMF.js +0 -2
  142. package/dist/config-mutator-24TH7PHM.js +0 -2
  143. package/dist/debug-3MEUO2P2.js +0 -2
  144. package/dist/heal-WKY5I4KB.js +0 -2
  145. package/dist/loader-PTCXLJEX.js +0 -2
  146. package/dist/memory-extract-AD7KMRPC.js +0 -2
  147. package/dist/providers-VUIWO3ZK.js +0 -2
  148. package/dist/query-PKGYE5HR.js +0 -2
  149. package/dist/registry-ASC2QS5K.js +0 -2
  150. package/dist/scheduler-A3TQOCKT.js +0 -2
  151. package/dist/types-OIFU3KSQ.js +0 -2
  152. package/dist/usage-dashboard-QX3CF6KK.js +0 -404
  153. package/dist/usage-dashboard-QX3CF6KK.js.map +0 -1
  154. package/dist/workspace-setup-ZWTT42XT.js +0 -2
  155. /package/dist/{agent-BCDPSPKU.js.map → agent-RDVGL2TW.js.map} +0 -0
  156. /package/dist/{chunk-FIOB3MEX.js.map → chunk-HPDHNIA3.js.map} +0 -0
  157. /package/dist/{chunk-7MBTMCKY.js.map → chunk-TRQSP67X.js.map} +0 -0
  158. /package/dist/{chunk-QZP65I2H.js.map → chunk-ZE2YFX4K.js.map} +0 -0
  159. /package/dist/{config-LN6JEHMF.js.map → config-UOHEG4BW.js.map} +0 -0
  160. /package/dist/{config-mutator-24TH7PHM.js.map → config-mutator-KSEBWKJH.js.map} +0 -0
  161. /package/dist/{debug-3MEUO2P2.js.map → debug-TGAP7E7W.js.map} +0 -0
  162. /package/dist/{heal-WKY5I4KB.js.map → heal-YP7QI7D3.js.map} +0 -0
  163. /package/dist/{loader-PTCXLJEX.js.map → loader-BGWA7IRY.js.map} +0 -0
  164. /package/dist/{memory-extract-AD7KMRPC.js.map → loader-LBHKSXBK.js.map} +0 -0
  165. /package/dist/{providers-VUIWO3ZK.js.map → memory-extract-KKPKAOPH.js.map} +0 -0
  166. /package/dist/{query-PKGYE5HR.js.map → program-2MDELQLX.js.map} +0 -0
  167. /package/dist/{registry-ASC2QS5K.js.map → providers-WCQSKTNP.js.map} +0 -0
  168. /package/dist/{scheduler-A3TQOCKT.js.map → query-FZAL7AQD.js.map} +0 -0
  169. /package/dist/{types-OIFU3KSQ.js.map → recipes-LZ56TA3X.js.map} +0 -0
  170. /package/dist/{wiki-UDPYFJBL.js.map → registry-ONJSILH4.js.map} +0 -0
  171. /package/dist/{workspace-setup-ZWTT42XT.js.map → scheduler-XRM2RJIV.js.map} +0 -0
  172. /package/dist/{subagent-2SJHSSJS.js.map → subagent-EPOT3QDM.js.map} +0 -0
  173. /package/dist/{whatsapp-state-6D6FHHD2.js.map → whatsapp-state-3ZVQ6MQD.js.map} +0 -0
@@ -0,0 +1,2 @@
1
+ import n from"chalk";var l={error(...o){console.log(n.red(...o))},warn(...o){console.log(n.yellow(...o))},info(...o){console.log(n.cyan(...o))},success(...o){console.log(n.green(...o))},break(){console.log("")}};export{l as a};
2
+ //# sourceMappingURL=chunk-VJUTQAPJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/logger.ts"],"sourcesContent":["import chalk from \"chalk\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(chalk.red(...args))\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(...args))\n },\n info(...args: unknown[]) {\n console.log(chalk.cyan(...args))\n },\n success(...args: unknown[]) {\n console.log(chalk.green(...args))\n },\n break() {\n console.log(\"\")\n },\n}\n"],"mappings":"AAAA,OAAOA,MAAW,QAEX,IAAMC,EAAS,CACpB,SAASC,EAAiB,CACxB,QAAQ,IAAIF,EAAM,IAAI,GAAGE,CAAI,CAAC,CAChC,EACA,QAAQA,EAAiB,CACvB,QAAQ,IAAIF,EAAM,OAAO,GAAGE,CAAI,CAAC,CACnC,EACA,QAAQA,EAAiB,CACvB,QAAQ,IAAIF,EAAM,KAAK,GAAGE,CAAI,CAAC,CACjC,EACA,WAAWA,EAAiB,CAC1B,QAAQ,IAAIF,EAAM,MAAM,GAAGE,CAAI,CAAC,CAClC,EACA,OAAQ,CACN,QAAQ,IAAI,EAAE,CAChB,CACF","names":["chalk","logger","args"]}
@@ -1,7 +1,6 @@
1
- import{readFileSync as a,existsSync as c,unlinkSync as u,readdirSync as g}from"fs";import{resolve as o}from"path";function p(t,e){let n={},s=r=>{let i=o(t,r);if(c(i))try{return a(i,"utf-8").trim()||void 0}catch{return}};if(e){let r=s(`SOUL.${e}.md`);r?(n.soul=r,n.soulProfile=e):n.soul=s("SOUL.md")}else n.soul=s("SOUL.md");if(n.identity=s("IDENTITY.md"),n.user=s("USER.md"),n.agents=s("AGENTS.md"),n.bootstrap=s("BOOTSTRAP.md"),n.bootstrap)try{u(o(t,"BOOTSTRAP.md"))}catch{}return n}function h(t){let e=[];return t.identity&&e.push(`[Identity]
1
+ import{readFileSync as a,existsSync as c,unlinkSync as d,readdirSync as g}from"fs";import{resolve as o}from"path";function p(t,e){let n={},s=r=>{let i=o(t,r);if(c(i))try{return a(i,"utf-8").trim()||void 0}catch{return}};if(e){let r=s(`SOUL.${e}.md`);r?(n.soul=r,n.soulProfile=e):n.soul=s("SOUL.md")}else n.soul=s("SOUL.md");if(n.identity=s("IDENTITY.md"),n.user=s("USER.md"),n.agents=s("AGENTS.md"),n.bootstrap=s("BOOTSTRAP.md"),n.bootstrap)try{d(o(t,"BOOTSTRAP.md"))}catch{}return n}function h(t){let e=[];return t.identity&&e.push(`[Identity]
2
2
  ${t.identity}`),t.soul&&e.push(`[Personality & Boundaries]
3
- ${t.soul}`),t.agents&&e.push(`[Operating Rules]
4
- ${t.agents}`),t.user&&e.push(`[User Profile]
3
+ ${t.soul}`),t.user&&e.push(`[User Profile]
5
4
  ${t.user}`),t.bootstrap&&e.push(`[First-Run Instructions \u2014 one time only]
6
5
  ${t.bootstrap}`),e.length===0?"":e.join(`
7
6
 
@@ -51,4 +50,4 @@ This agent is part of an AgentX mesh. It can:
51
50
  - Send cross-channel messages via the /send API
52
51
  - Access its wiki knowledge base for context
53
52
  `}function S(t){let e=t.match(/\/soul\s+(\w+)/i);return e?e[1].toLowerCase():/\/soul\s*$/i.test(t)?"default":null}export{p as a,h as b,f as c,S as d};
54
- //# sourceMappingURL=chunk-HI24KAEY.js.map
53
+ //# sourceMappingURL=chunk-WJXU5F4Z.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agents/bootstrap.ts"],"sourcesContent":["import { readFileSync, existsSync, unlinkSync, readdirSync } from \"fs\"\nimport { resolve } from \"path\"\n\n// --- Bootstrap Identity Files ---\n//\n// Support for structured workspace identity files (inspired by OpenClaw).\n// These files live in the agent's workspace and are auto-loaded into context.\n//\n// Supported files:\n// SOUL.md — default personality, tone, boundaries\n// SOUL.{profile}.md — named soul profiles (e.g. SOUL.finance.md, SOUL.legal.md)\n// IDENTITY.md — name, role, emoji, tagline (persistent)\n// USER.md — user profile, preferences (persistent)\n// AGENTS.md — operating rules, standing orders (persistent)\n// BOOTSTRAP.md — one-time first-run ritual (auto-deleted after first load)\n//\n// Soul switching: send \"/soul finance\" to swap to SOUL.finance.md mid-session.\n\nexport interface BootstrapFiles {\n soul?: string\n /** Active soul profile name (undefined = default SOUL.md) */\n soulProfile?: string\n identity?: string\n user?: string\n agents?: string\n bootstrap?: string\n}\n\nconst BOOTSTRAP_FILE_NAMES = [\n \"SOUL.md\",\n \"IDENTITY.md\",\n \"USER.md\",\n \"AGENTS.md\",\n \"BOOTSTRAP.md\",\n] as const\n\n/**\n * Load bootstrap identity files from an agent's workspace.\n * @param soulProfile — optional soul profile name (e.g. \"finance\" loads SOUL.finance.md)\n */\nexport function loadBootstrapFiles(workspace: string, soulProfile?: string): BootstrapFiles {\n const result: BootstrapFiles = {}\n\n const tryLoad = (filename: string): string | undefined => {\n const filePath = resolve(workspace, filename)\n if (!existsSync(filePath)) return undefined\n try {\n const content = readFileSync(filePath, \"utf-8\").trim()\n return content || undefined\n } catch {\n return undefined\n }\n }\n\n // Load soul: profile-specific if requested, fallback to default\n if (soulProfile) {\n const profileSoul = tryLoad(`SOUL.${soulProfile}.md`)\n if (profileSoul) {\n result.soul = profileSoul\n result.soulProfile = soulProfile\n } else {\n // Profile not found — fall back to default and note it\n result.soul = tryLoad(\"SOUL.md\")\n }\n } else {\n result.soul = tryLoad(\"SOUL.md\")\n }\n\n result.identity = tryLoad(\"IDENTITY.md\")\n result.user = tryLoad(\"USER.md\")\n result.agents = tryLoad(\"AGENTS.md\")\n result.bootstrap = tryLoad(\"BOOTSTRAP.md\")\n\n // BOOTSTRAP.md is one-time: delete after loading\n if (result.bootstrap) {\n try {\n unlinkSync(resolve(workspace, \"BOOTSTRAP.md\"))\n } catch {\n // Best-effort deletion\n }\n }\n\n return result\n}\n\n/**\n * Build context string from bootstrap files.\n * Returns empty string if no files found.\n */\nexport function buildBootstrapContext(files: BootstrapFiles): string {\n const sections: string[] = []\n\n if (files.identity) {\n sections.push(`[Identity]\\n${files.identity}`)\n }\n\n if (files.soul) {\n sections.push(`[Personality & Boundaries]\\n${files.soul}`)\n }\n\n if (files.agents) {\n sections.push(`[Operating Rules]\\n${files.agents}`)\n }\n\n if (files.user) {\n sections.push(`[User Profile]\\n${files.user}`)\n }\n\n if (files.bootstrap) {\n sections.push(`[First-Run Instructions — one time only]\\n${files.bootstrap}`)\n }\n\n if (sections.length === 0) return \"\"\n\n return sections.join(\"\\n\\n\")\n}\n\n/**\n * Check which bootstrap files exist in a workspace (for status/diagnostics).\n */\nexport function listBootstrapFiles(workspace: string): string[] {\n return BOOTSTRAP_FILE_NAMES.filter((name) =>\n existsSync(resolve(workspace, name))\n )\n}\n\n/**\n * List available soul profiles in a workspace.\n * Returns profile names (e.g. [\"finance\", \"legal\", \"creative\"]).\n */\nexport function listSoulProfiles(workspace: string): string[] {\n try {\n return readdirSync(workspace)\n .filter(f => f.startsWith(\"SOUL.\") && f.endsWith(\".md\") && f !== \"SOUL.md\")\n .map(f => f.slice(5, -3)) // \"SOUL.finance.md\" → \"finance\"\n } catch {\n return []\n }\n}\n\n/**\n * Generate a standard AGENTS.md for a new agent workspace.\n * Follows the agents.md community convention (https://agents.md/).\n * Readable by Claude Code, Codex, Cursor, Amp, Gemini CLI, etc.\n */\nexport function generateAgentsMd(agent: {\n name: string\n id: string\n role?: string\n workspace: string\n tier?: string\n}): string {\n return `# ${agent.name}\n\n> Agent ID: \\`${agent.id}\\` | Tier: ${agent.tier || \"claude-code\"}\n\n## Role\n\n${agent.role || \"AI agent managed by AgentX orchestrator.\"}\n\n## Setup\n\nThis workspace is managed by AgentX. The agent runs via:\n\\`\\`\\`bash\n# Direct execution\nagentx daemon send ${agent.id} \"your task here\"\n\n# Or via any connected channel (Telegram, WhatsApp, GitLab)\n\\`\\`\\`\n\n## Code Style\n\n- Follow existing patterns in the codebase\n- Use the language and framework conventions already present\n- Keep changes minimal and focused\n\n## Testing\n\nRun tests before committing:\n\\`\\`\\`bash\nnpm test # or the project's test command\n\\`\\`\\`\n\n## PR Guidelines\n\n- One logical change per commit\n- Reference issue numbers when applicable\n- Keep PR descriptions concise\n\n## AgentX Integration\n\nThis agent is part of an AgentX mesh. It can:\n- Receive tasks from messaging channels (Telegram, WhatsApp, Discord)\n- Respond to GitLab @mentions on issues and MRs\n- Delegate to other agents by mentioning their handles\n- Send cross-channel messages via the /send API\n- Access its wiki knowledge base for context\n`\n}\n\n/**\n * Detect a /soul command in a message.\n * Returns the requested profile name, or null if no /soul command found.\n * \"/soul finance\" → \"finance\"\n * \"/soul\" or \"/soul default\" → \"default\" (reset to SOUL.md)\n */\nexport function detectSoulSwitch(message: string): string | null {\n const match = message.match(/\\/soul\\s+(\\w+)/i)\n if (match) return match[1].toLowerCase()\n if (/\\/soul\\s*$/i.test(message)) return \"default\"\n return null\n}\n"],"mappings":"AAAA,OAAS,gBAAAA,EAAc,cAAAC,EAAY,cAAAC,EAAY,eAAAC,MAAmB,KAClE,OAAS,WAAAC,MAAe,OAuCjB,SAASC,EAAmBC,EAAmBC,EAAsC,CAC1F,IAAMC,EAAyB,CAAC,EAE1BC,EAAWC,GAAyC,CACxD,IAAMC,EAAWC,EAAQN,EAAWI,CAAQ,EAC5C,GAAKG,EAAWF,CAAQ,EACxB,GAAI,CAEF,OADgBG,EAAaH,EAAU,OAAO,EAAE,KAAK,GACnC,MACpB,MAAE,CACA,MACF,CACF,EAGA,GAAIJ,EAAa,CACf,IAAMQ,EAAcN,EAAQ,QAAQF,MAAgB,EAChDQ,GACFP,EAAO,KAAOO,EACdP,EAAO,YAAcD,GAGrBC,EAAO,KAAOC,EAAQ,SAAS,OAGjCD,EAAO,KAAOC,EAAQ,SAAS,EASjC,GANAD,EAAO,SAAWC,EAAQ,aAAa,EACvCD,EAAO,KAAOC,EAAQ,SAAS,EAC/BD,EAAO,OAASC,EAAQ,WAAW,EACnCD,EAAO,UAAYC,EAAQ,cAAc,EAGrCD,EAAO,UACT,GAAI,CACFQ,EAAWJ,EAAQN,EAAW,cAAc,CAAC,CAC/C,MAAE,CAEF,CAGF,OAAOE,CACT,CAMO,SAASS,EAAsBC,EAA+B,CACnE,IAAMC,EAAqB,CAAC,EAsB5B,OApBID,EAAM,UACRC,EAAS,KAAK;AAAA,EAAeD,EAAM,UAAU,EAG3CA,EAAM,MACRC,EAAS,KAAK;AAAA,EAA+BD,EAAM,MAAM,EAGvDA,EAAM,QACRC,EAAS,KAAK;AAAA,EAAsBD,EAAM,QAAQ,EAGhDA,EAAM,MACRC,EAAS,KAAK;AAAA,EAAmBD,EAAM,MAAM,EAG3CA,EAAM,WACRC,EAAS,KAAK;AAAA,EAA6CD,EAAM,WAAW,EAG1EC,EAAS,SAAW,EAAU,GAE3BA,EAAS,KAAK;AAAA;AAAA,CAAM,CAC7B,CA8BO,SAASC,EAAiBC,EAMtB,CACT,MAAO,KAAKA,EAAM;AAAA;AAAA,gBAEJA,EAAM,gBAAgBA,EAAM,MAAQ;AAAA;AAAA;AAAA;AAAA,EAIlDA,EAAM,MAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAOKA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAiC3B,CAQO,SAASC,EAAiBC,EAAgC,CAC/D,IAAMC,EAAQD,EAAQ,MAAM,iBAAiB,EAC7C,OAAIC,EAAcA,EAAM,CAAC,EAAE,YAAY,EACnC,cAAc,KAAKD,CAAO,EAAU,UACjC,IACT","names":["readFileSync","existsSync","unlinkSync","readdirSync","resolve","loadBootstrapFiles","workspace","soulProfile","result","tryLoad","filename","filePath","resolve","existsSync","readFileSync","profileSoul","unlinkSync","buildBootstrapContext","files","sections","generateAgentsMd","agent","detectSoulSwitch","message","match"]}
1
+ {"version":3,"sources":["../src/agents/bootstrap.ts"],"sourcesContent":["import { readFileSync, existsSync, unlinkSync, readdirSync } from \"fs\"\nimport { resolve } from \"path\"\n\n// --- Bootstrap Identity Files ---\n//\n// Support for structured workspace identity files (inspired by OpenClaw).\n// These files live in the agent's workspace and are auto-loaded into context.\n//\n// Supported files:\n// SOUL.md — default personality, tone, boundaries\n// SOUL.{profile}.md — named soul profiles (e.g. SOUL.finance.md, SOUL.legal.md)\n// IDENTITY.md — name, role, emoji, tagline (persistent)\n// USER.md — user profile, preferences (persistent)\n// AGENTS.md — operating rules, standing orders (persistent)\n// BOOTSTRAP.md — one-time first-run ritual (auto-deleted after first load)\n//\n// Soul switching: send \"/soul finance\" to swap to SOUL.finance.md mid-session.\n\nexport interface BootstrapFiles {\n soul?: string\n /** Active soul profile name (undefined = default SOUL.md) */\n soulProfile?: string\n identity?: string\n user?: string\n agents?: string\n bootstrap?: string\n}\n\nconst BOOTSTRAP_FILE_NAMES = [\n \"SOUL.md\",\n \"IDENTITY.md\",\n \"USER.md\",\n \"AGENTS.md\",\n \"BOOTSTRAP.md\",\n] as const\n\n/**\n * Load bootstrap identity files from an agent's workspace.\n * @param soulProfile — optional soul profile name (e.g. \"finance\" loads SOUL.finance.md)\n */\nexport function loadBootstrapFiles(workspace: string, soulProfile?: string): BootstrapFiles {\n const result: BootstrapFiles = {}\n\n const tryLoad = (filename: string): string | undefined => {\n const filePath = resolve(workspace, filename)\n if (!existsSync(filePath)) return undefined\n try {\n const content = readFileSync(filePath, \"utf-8\").trim()\n return content || undefined\n } catch {\n return undefined\n }\n }\n\n // Load soul: profile-specific if requested, fallback to default\n if (soulProfile) {\n const profileSoul = tryLoad(`SOUL.${soulProfile}.md`)\n if (profileSoul) {\n result.soul = profileSoul\n result.soulProfile = soulProfile\n } else {\n // Profile not found — fall back to default and note it\n result.soul = tryLoad(\"SOUL.md\")\n }\n } else {\n result.soul = tryLoad(\"SOUL.md\")\n }\n\n result.identity = tryLoad(\"IDENTITY.md\")\n result.user = tryLoad(\"USER.md\")\n result.agents = tryLoad(\"AGENTS.md\")\n result.bootstrap = tryLoad(\"BOOTSTRAP.md\")\n\n // BOOTSTRAP.md is one-time: delete after loading\n if (result.bootstrap) {\n try {\n unlinkSync(resolve(workspace, \"BOOTSTRAP.md\"))\n } catch {\n // Best-effort deletion\n }\n }\n\n return result\n}\n\n/**\n * Build context string from bootstrap files.\n * Returns empty string if no files found.\n */\nexport function buildBootstrapContext(files: BootstrapFiles): string {\n const sections: string[] = []\n\n if (files.identity) {\n sections.push(`[Identity]\\n${files.identity}`)\n }\n\n if (files.soul) {\n sections.push(`[Personality & Boundaries]\\n${files.soul}`)\n }\n\n // AGENTS.md is intentionally NOT injected into AgentX's --append-system-prompt\n // anymore. It's loaded natively by Claude Code via `@AGENTS.md` in the\n // workspace's CLAUDE.md (generated by workspace-setup.ts for new workspaces;\n // added to existing workspaces by the 2026-04-24 distribution). Injecting it\n // here on top of the native CLAUDE.md path would double the bytes. Keeping\n // the load in BootstrapFiles for diagnostic/listing purposes only.\n\n if (files.user) {\n sections.push(`[User Profile]\\n${files.user}`)\n }\n\n if (files.bootstrap) {\n sections.push(`[First-Run Instructions — one time only]\\n${files.bootstrap}`)\n }\n\n if (sections.length === 0) return \"\"\n\n return sections.join(\"\\n\\n\")\n}\n\n/**\n * Check which bootstrap files exist in a workspace (for status/diagnostics).\n */\nexport function listBootstrapFiles(workspace: string): string[] {\n return BOOTSTRAP_FILE_NAMES.filter((name) =>\n existsSync(resolve(workspace, name))\n )\n}\n\n/**\n * List available soul profiles in a workspace.\n * Returns profile names (e.g. [\"finance\", \"legal\", \"creative\"]).\n */\nexport function listSoulProfiles(workspace: string): string[] {\n try {\n return readdirSync(workspace)\n .filter(f => f.startsWith(\"SOUL.\") && f.endsWith(\".md\") && f !== \"SOUL.md\")\n .map(f => f.slice(5, -3)) // \"SOUL.finance.md\" → \"finance\"\n } catch {\n return []\n }\n}\n\n/**\n * Generate a standard AGENTS.md for a new agent workspace.\n * Follows the agents.md community convention (https://agents.md/).\n * Readable by Claude Code, Codex, Cursor, Amp, Gemini CLI, etc.\n */\nexport function generateAgentsMd(agent: {\n name: string\n id: string\n role?: string\n workspace: string\n tier?: string\n}): string {\n return `# ${agent.name}\n\n> Agent ID: \\`${agent.id}\\` | Tier: ${agent.tier || \"claude-code\"}\n\n## Role\n\n${agent.role || \"AI agent managed by AgentX orchestrator.\"}\n\n## Setup\n\nThis workspace is managed by AgentX. The agent runs via:\n\\`\\`\\`bash\n# Direct execution\nagentx daemon send ${agent.id} \"your task here\"\n\n# Or via any connected channel (Telegram, WhatsApp, GitLab)\n\\`\\`\\`\n\n## Code Style\n\n- Follow existing patterns in the codebase\n- Use the language and framework conventions already present\n- Keep changes minimal and focused\n\n## Testing\n\nRun tests before committing:\n\\`\\`\\`bash\nnpm test # or the project's test command\n\\`\\`\\`\n\n## PR Guidelines\n\n- One logical change per commit\n- Reference issue numbers when applicable\n- Keep PR descriptions concise\n\n## AgentX Integration\n\nThis agent is part of an AgentX mesh. It can:\n- Receive tasks from messaging channels (Telegram, WhatsApp, Discord)\n- Respond to GitLab @mentions on issues and MRs\n- Delegate to other agents by mentioning their handles\n- Send cross-channel messages via the /send API\n- Access its wiki knowledge base for context\n`\n}\n\n/**\n * Detect a /soul command in a message.\n * Returns the requested profile name, or null if no /soul command found.\n * \"/soul finance\" → \"finance\"\n * \"/soul\" or \"/soul default\" → \"default\" (reset to SOUL.md)\n */\nexport function detectSoulSwitch(message: string): string | null {\n const match = message.match(/\\/soul\\s+(\\w+)/i)\n if (match) return match[1].toLowerCase()\n if (/\\/soul\\s*$/i.test(message)) return \"default\"\n return null\n}\n"],"mappings":"AAAA,OAAS,gBAAAA,EAAc,cAAAC,EAAY,cAAAC,EAAY,eAAAC,MAAmB,KAClE,OAAS,WAAAC,MAAe,OAuCjB,SAASC,EAAmBC,EAAmBC,EAAsC,CAC1F,IAAMC,EAAyB,CAAC,EAE1BC,EAAWC,GAAyC,CACxD,IAAMC,EAAWC,EAAQN,EAAWI,CAAQ,EAC5C,GAAKG,EAAWF,CAAQ,EACxB,GAAI,CAEF,OADgBG,EAAaH,EAAU,OAAO,EAAE,KAAK,GACnC,MACpB,MAAE,CACA,MACF,CACF,EAGA,GAAIJ,EAAa,CACf,IAAMQ,EAAcN,EAAQ,QAAQF,MAAgB,EAChDQ,GACFP,EAAO,KAAOO,EACdP,EAAO,YAAcD,GAGrBC,EAAO,KAAOC,EAAQ,SAAS,OAGjCD,EAAO,KAAOC,EAAQ,SAAS,EASjC,GANAD,EAAO,SAAWC,EAAQ,aAAa,EACvCD,EAAO,KAAOC,EAAQ,SAAS,EAC/BD,EAAO,OAASC,EAAQ,WAAW,EACnCD,EAAO,UAAYC,EAAQ,cAAc,EAGrCD,EAAO,UACT,GAAI,CACFQ,EAAWJ,EAAQN,EAAW,cAAc,CAAC,CAC/C,MAAE,CAEF,CAGF,OAAOE,CACT,CAMO,SAASS,EAAsBC,EAA+B,CACnE,IAAMC,EAAqB,CAAC,EAyB5B,OAvBID,EAAM,UACRC,EAAS,KAAK;AAAA,EAAeD,EAAM,UAAU,EAG3CA,EAAM,MACRC,EAAS,KAAK;AAAA,EAA+BD,EAAM,MAAM,EAUvDA,EAAM,MACRC,EAAS,KAAK;AAAA,EAAmBD,EAAM,MAAM,EAG3CA,EAAM,WACRC,EAAS,KAAK;AAAA,EAA6CD,EAAM,WAAW,EAG1EC,EAAS,SAAW,EAAU,GAE3BA,EAAS,KAAK;AAAA;AAAA,CAAM,CAC7B,CA8BO,SAASC,EAAiBC,EAMtB,CACT,MAAO,KAAKA,EAAM;AAAA;AAAA,gBAEJA,EAAM,gBAAgBA,EAAM,MAAQ;AAAA;AAAA;AAAA;AAAA,EAIlDA,EAAM,MAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAOKA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAiC3B,CAQO,SAASC,EAAiBC,EAAgC,CAC/D,IAAMC,EAAQD,EAAQ,MAAM,iBAAiB,EAC7C,OAAIC,EAAcA,EAAM,CAAC,EAAE,YAAY,EACnC,cAAc,KAAKD,CAAO,EAAU,UACjC,IACT","names":["readFileSync","existsSync","unlinkSync","readdirSync","resolve","loadBootstrapFiles","workspace","soulProfile","result","tryLoad","filename","filePath","resolve","existsSync","readFileSync","profileSoul","unlinkSync","buildBootstrapContext","files","sections","generateAgentsMd","agent","detectSoulSwitch","message","match"]}
@@ -1,4 +1,4 @@
1
- import{c as m}from"./chunk-HI24KAEY.js";import{existsSync as u,mkdirSync as y,writeFileSync as h,readFileSync as k}from"fs";import{resolve as p}from"path";function d(o,s){let n=`${o} ${s.systemPrompt||""} ${s.name}`.toLowerCase();return/cod(e|ing|er)|develop|engineer|program/.test(n)?"coding":/pm|project.?manag|product|scrum/.test(n)?"pm":/devops|deploy|infra|ops|sre|ci.?cd/.test(n)?"devops":/qa|test|quality|forensic/.test(n)?"qa":"general"}function b(o,s,n){let t=d(o,s),e=[];if(e.push(`# ${s.name}`),e.push(""),e.push("@AGENTS.md"),e.push(""),s.systemPrompt){let i=s.systemPrompt.split(`
1
+ import{c as m}from"./chunk-WJXU5F4Z.js";import{existsSync as u,mkdirSync as y,writeFileSync as h,readFileSync as k}from"fs";import{resolve as p}from"path";function d(o,s){let n=`${o} ${s.systemPrompt||""} ${s.name}`.toLowerCase();return/cod(e|ing|er)|develop|engineer|program/.test(n)?"coding":/pm|project.?manag|product|scrum/.test(n)?"pm":/devops|deploy|infra|ops|sre|ci.?cd/.test(n)?"devops":/qa|test|quality|forensic/.test(n)?"qa":"general"}function b(o,s,n){let t=d(o,s),e=[];if(e.push(`# ${s.name}`),e.push(""),e.push("@AGENTS.md"),e.push(""),s.systemPrompt){let i=s.systemPrompt.split(`
2
2
  `).slice(0,3).join(`
3
3
  `);e.push("## Role"),e.push(i),e.push("")}switch(e.push("## Commands"),e.push(""),u(p(s.workspace,"package.json"))?(e.push("```bash"),e.push("npm install # install dependencies"),e.push("npm test # run tests"),e.push("npm run build # build project"),e.push("```")):u(p(s.workspace,"requirements.txt"))&&(e.push("```bash"),e.push("pip install -r requirements.txt"),e.push("pytest"),e.push("```")),e.push(""),e.push("## Conventions"),e.push(""),t){case"coding":e.push("- Write tests for new code before committing"),e.push("- Keep functions small and focused"),e.push("- Follow existing patterns in the codebase"),e.push("- Run tests before pushing");break;case"pm":e.push("- Keep responses concise (3-5 lines main message)"),e.push("- Reference issues with #IID and MRs with !IID"),e.push("- Update issue labels and milestones when relevant"),e.push("- Summarize decisions, don't narrate process");break;case"devops":e.push("- Always check service status before making changes"),e.push("- Never run destructive commands without confirmation"),e.push("- Log all deployment actions"),e.push("- Verify changes in staging before production");break;case"qa":e.push("- Document reproduction steps for every bug"),e.push("- Include expected vs actual behavior"),e.push("- Check both happy path and edge cases"),e.push("- Attach screenshots when reporting UI issues");break;default:e.push("- Be concise \u2014 lead with the answer, skip preamble"),e.push("- Follow existing patterns in the codebase")}return e.push(""),e.push("## Cross-Channel Messaging"),e.push(""),e.push("You can send messages to any channel proactively:"),e.push("```bash"),e.push(`curl -X POST http://localhost:${n}/send \\`),e.push(' -H "Content-Type: application/json" \\'),e.push(` -d '{"channel":"telegram","chatId":"<id>","text":"<message>","agentId":"${o}"}'`),e.push("```"),e.push("Channels: telegram, whatsapp, gitlab, discord"),e.push(""),e.join(`
4
4
  `)}function w(o,s){let n={autoMemoryEnabled:!0,env:{CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:"1"}};s.permissionMode==="bypassPermissions"||(s.permissionMode==="plan"?n.permissions={deny:["Bash(rm -rf *)","Bash(drop *)","Bash(DELETE *)"]}:n.permissions={deny:["Bash(rm -rf /)","Bash(> /dev/sda*)","Bash(mkfs*)"]});let t={};return t.Notification=[{matcher:"",hooks:[{type:"command",command:`echo "[${o}] notification: $(jq -r '.type // "unknown"')" >> /tmp/agentx-${o}.log`}]}],t.PostToolUse=[{matcher:"Bash",hooks:[{type:"command",command:`jq -r '.tool_input.command // empty' >> /tmp/agentx-${o}-commands.log`}]}],t.SessionStart=[{matcher:"compact",hooks:[{type:"command",command:`echo "Reminder: You are ${s.name} (${o}). Follow the conventions in CLAUDE.md."`}]}],n.hooks=t,n}function v(o,s){let n=d(o,s),t=[];switch(n){case"coding":t.push({name:"testing.md",content:`---
@@ -42,4 +42,4 @@ Always include:
42
42
  5. Screenshots if applicable
43
43
  `});break}return t}function A(o,s,n="19900",t=console.error){let e=[],i=[],r=s.workspace;if(!u(r))return t(`Workspace not found: ${r}`),{created:e,skipped:i};if(s.tier!=="claude-code")return{created:e,skipped:i};let a=(c,f)=>{u(c)?i.push(c):(y(p(c,".."),{recursive:!0}),h(c,f),e.push(c))};a(p(r,"AGENTS.md"),m({name:s.name,id:o,role:s.systemPrompt?.split(`
44
44
  `)[0],workspace:r,tier:s.tier})),a(p(r,"CLAUDE.md"),b(o,s,n));let l=p(r,".claude/settings.json");a(l,JSON.stringify(w(o,s),null,2));let g=v(o,s);for(let c of g)a(p(r,".claude/rules",c.name),c.content);return e.length>0&&t(`[${o}] workspace setup: created ${e.length} file(s)`),{created:e,skipped:i}}function E(o,s){let n=p(o,".claude/settings.json");if(!u(n))return!1;try{let t=JSON.parse(k(n,"utf-8")),e=!1;for(let[i,r]of Object.entries(s))if(typeof r=="object"&&r!==null&&!Array.isArray(r)){t[i]||(t[i]={});for(let[a,l]of Object.entries(r))t[i][a]===void 0&&(t[i][a]=l,e=!0)}else t[i]===void 0&&(t[i]=r,e=!0);return e&&h(n,JSON.stringify(t,null,2)),e}catch{return!1}}function C(o,s="19900",n=console.error){let t=0,e=0;for(let[i,r]of Object.entries(o)){if(r.tier!=="claude-code")continue;let a=A(i,r,s,n);t+=a.created.length,E(r.workspace,{env:{CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:"1"}})&&e++}t>0&&n(`Workspace setup: ${t} file(s) created across agent workspaces`),e>0&&n(`Workspace patch: ${e} workspace(s) updated with agent teams support`)}export{A as a,C as b};
45
- //# sourceMappingURL=chunk-QZP65I2H.js.map
45
+ //# sourceMappingURL=chunk-ZE2YFX4K.js.map