agentix-cli 0.82.0 → 0.83.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 (150) hide show
  1. package/dist/{App-3AZUZJPW.js → App-CREMUAHS.js} +2 -2
  2. package/dist/{App-3AZUZJPW.js.map → App-CREMUAHS.js.map} +1 -1
  3. package/dist/ChatApp-YX3YNPNS.js +7 -0
  4. package/dist/{ChatApp-ACIKF3GC.js.map → ChatApp-YX3YNPNS.js.map} +1 -1
  5. package/dist/{agent-X2UYZ3ZE.js → agent-3PJF4PUE.js} +2 -2
  6. package/dist/{board-dashboard-65HGTFRC.js → board-dashboard-7B2GNISR.js} +311 -241
  7. package/dist/board-dashboard-7B2GNISR.js.map +1 -0
  8. package/dist/chunk-2QNT5JDS.js +4 -0
  9. package/dist/chunk-2QNT5JDS.js.map +1 -0
  10. package/dist/{chunk-6G72CCT2.js → chunk-2W3UVIEG.js} +2 -2
  11. package/dist/{chunk-ISRGFMQC.js → chunk-3AXSSYSY.js} +2 -2
  12. package/dist/chunk-4L244AW4.js +3 -0
  13. package/dist/chunk-4L244AW4.js.map +1 -0
  14. package/dist/{chunk-PLTX6YGD.js → chunk-AACJ62ID.js} +2 -2
  15. package/dist/chunk-ACFQBLPX.js +3 -0
  16. package/dist/chunk-ACFQBLPX.js.map +1 -0
  17. package/dist/{chunk-ONGL6EKZ.js → chunk-AK5J3DQY.js} +2 -2
  18. package/dist/{chunk-ONGL6EKZ.js.map → chunk-AK5J3DQY.js.map} +1 -1
  19. package/dist/{chunk-LQLMNBJS.js → chunk-AXQIFHOX.js} +2 -2
  20. package/dist/{chunk-UCKKAWLZ.js → chunk-BRK6M6LA.js} +2 -2
  21. package/dist/chunk-BRK6M6LA.js.map +1 -0
  22. package/dist/{chunk-AW3YGAVS.js → chunk-DND5VBG5.js} +204 -204
  23. package/dist/chunk-DND5VBG5.js.map +1 -0
  24. package/dist/chunk-EBDUPZ7C.js +750 -0
  25. package/dist/chunk-EBDUPZ7C.js.map +1 -0
  26. package/dist/{chunk-X7STXQOX.js → chunk-HJZFDQKD.js} +2 -2
  27. package/dist/{chunk-E3SVSIUU.js → chunk-IMFB2KTJ.js} +55 -58
  28. package/dist/chunk-IMFB2KTJ.js.map +1 -0
  29. package/dist/{chunk-CG3FSQ23.js → chunk-IUQOOSD4.js} +2 -2
  30. package/dist/chunk-JDXNHBGR.js +49 -0
  31. package/dist/chunk-JDXNHBGR.js.map +1 -0
  32. package/dist/{chunk-C4YY6746.js → chunk-K2NFNNDB.js} +2 -2
  33. package/dist/{chunk-ZUCJK5PL.js → chunk-KNSYKQKB.js} +2 -2
  34. package/dist/chunk-LQE73AZR.js +3 -0
  35. package/dist/chunk-LQE73AZR.js.map +1 -0
  36. package/dist/{chunk-E63BQ6VJ.js → chunk-MDYARXA4.js} +2 -2
  37. package/dist/chunk-PPUN7YHA.js +5 -0
  38. package/dist/chunk-PPUN7YHA.js.map +1 -0
  39. package/dist/{chunk-BM6ZLX6F.js → chunk-QZ3CLHGL.js} +2 -2
  40. package/dist/chunk-VZLIBDLH.js +3 -0
  41. package/dist/chunk-VZLIBDLH.js.map +1 -0
  42. package/dist/{chunk-6PTO6DWW.js → chunk-WGZPKQNI.js} +2 -2
  43. package/dist/chunk-WMIQHJB5.js +5 -0
  44. package/dist/{chunk-FSHQMXM3.js.map → chunk-WMIQHJB5.js.map} +1 -1
  45. package/dist/{chunk-KUUIIZEH.js → chunk-WYYNJTDC.js} +67 -67
  46. package/dist/chunk-WYYNJTDC.js.map +1 -0
  47. package/dist/{chunk-WIGJ5BVG.js → chunk-XGTZMJUI.js} +2 -2
  48. package/dist/chunk-XIYWXCNU.js +4 -0
  49. package/dist/chunk-XIYWXCNU.js.map +1 -0
  50. package/dist/chunk-ZNLBF4ED.js +5 -0
  51. package/dist/{chunk-CT36XINH.js.map → chunk-ZNLBF4ED.js.map} +1 -1
  52. package/dist/{chunk-5LD6TA4A.js → chunk-ZUINXZPI.js} +2 -2
  53. package/dist/cli.js +1 -1
  54. package/dist/client-K5ZISLAI.js +2 -0
  55. package/dist/config-ZBNH2DMN.js +2 -0
  56. package/dist/config-mutator-ENWFEDFU.js +2 -0
  57. package/dist/doctor-Y3GPTM3C.js +2 -0
  58. package/dist/{facts-5T5GRUTG.js → facts-ROUMKS7I.js} +2 -2
  59. package/dist/grants-N7XC7NLS.js +2 -0
  60. package/dist/hosts-NFNCYKGY.js +2 -0
  61. package/dist/index.d.ts +34 -6
  62. package/dist/index.js +1 -1
  63. package/dist/index.js.map +1 -1
  64. package/dist/pair-codes-EYGELBPD.js +2 -0
  65. package/dist/{program-R646G4NP.js → program-Y5BSOGQQ.js} +197 -186
  66. package/dist/program-Y5BSOGQQ.js.map +1 -0
  67. package/dist/promote-KLA3DBKX.js +2 -0
  68. package/dist/query-N3BRQU6S.js +2 -0
  69. package/dist/registry-GHOOAS2Z.js +2 -0
  70. package/dist/request-planner-ABXJ35NE.js +2 -0
  71. package/dist/{request-planner-L2S4KMMU.js.map → request-planner-ABXJ35NE.js.map} +1 -1
  72. package/dist/review-candidates-UFVMO3IT.js +4 -0
  73. package/dist/{review-candidates-R23QNJ2Q.js.map → review-candidates-UFVMO3IT.js.map} +1 -1
  74. package/dist/routing-GOOV7H7I.js +2 -0
  75. package/dist/schedule-tool-KKH32REI.js +2 -0
  76. package/dist/scheduler-NBRWUJAD.js +2 -0
  77. package/dist/scheduler-NBRWUJAD.js.map +1 -0
  78. package/dist/seat-E4FYHBIC.js +2 -0
  79. package/dist/seat-E4FYHBIC.js.map +1 -0
  80. package/dist/select-6QI65HKR.js +2 -0
  81. package/dist/{select-KCCT7OJZ.js.map → select-6QI65HKR.js.map} +1 -1
  82. package/dist/set-enabled-XPIHHOPT.js +2 -0
  83. package/dist/{set-enabled-FEUPS2WI.js.map → set-enabled-XPIHHOPT.js.map} +1 -1
  84. package/dist/store-7W2AP5H4.js +2 -0
  85. package/dist/store-7W2AP5H4.js.map +1 -0
  86. package/dist/token-store-YBSU2DTV.js +2 -0
  87. package/dist/token-store-YBSU2DTV.js.map +1 -0
  88. package/dist/{tool-YOXUNCTU.js → tool-IX7B5CYT.js} +2 -2
  89. package/dist/{tool-YOXUNCTU.js.map → tool-IX7B5CYT.js.map} +1 -1
  90. package/dist/{tool-WGPZW3SR.js → tool-UK5MDLBQ.js} +2 -2
  91. package/dist/{tool-WGPZW3SR.js.map → tool-UK5MDLBQ.js.map} +1 -1
  92. package/dist/wiki-XSK3IIZE.js +2 -0
  93. package/dist/wiki-XSK3IIZE.js.map +1 -0
  94. package/package.json +1 -1
  95. package/dist/ChatApp-ACIKF3GC.js +0 -7
  96. package/dist/board-dashboard-65HGTFRC.js.map +0 -1
  97. package/dist/chunk-AW3YGAVS.js.map +0 -1
  98. package/dist/chunk-CT36XINH.js +0 -5
  99. package/dist/chunk-E3SVSIUU.js.map +0 -1
  100. package/dist/chunk-FSHQMXM3.js +0 -5
  101. package/dist/chunk-KUUIIZEH.js.map +0 -1
  102. package/dist/chunk-UCKKAWLZ.js.map +0 -1
  103. package/dist/chunk-VQN36LEB.js +0 -51
  104. package/dist/chunk-VQN36LEB.js.map +0 -1
  105. package/dist/chunk-XMDA4JYK.js +0 -748
  106. package/dist/chunk-XMDA4JYK.js.map +0 -1
  107. package/dist/client-QE4D43K3.js +0 -2
  108. package/dist/config-ME774GIO.js +0 -2
  109. package/dist/config-mutator-2AUDHSVD.js +0 -2
  110. package/dist/doctor-GS2ZHLWU.js +0 -2
  111. package/dist/program-R646G4NP.js.map +0 -1
  112. package/dist/promote-ZJCGGVRD.js +0 -2
  113. package/dist/query-UMGPOBEJ.js +0 -2
  114. package/dist/registry-WD5B2DQQ.js +0 -2
  115. package/dist/request-planner-L2S4KMMU.js +0 -2
  116. package/dist/review-candidates-R23QNJ2Q.js +0 -4
  117. package/dist/routing-PUQUADQ6.js +0 -2
  118. package/dist/schedule-tool-3DAJU764.js +0 -2
  119. package/dist/scheduler-JTPIGC5K.js +0 -2
  120. package/dist/seat-O5IC5M5D.js +0 -2
  121. package/dist/select-KCCT7OJZ.js +0 -2
  122. package/dist/set-enabled-FEUPS2WI.js +0 -2
  123. package/dist/wiki-QSBAE5ZK.js +0 -2
  124. /package/dist/{agent-X2UYZ3ZE.js.map → agent-3PJF4PUE.js.map} +0 -0
  125. /package/dist/{chunk-6G72CCT2.js.map → chunk-2W3UVIEG.js.map} +0 -0
  126. /package/dist/{chunk-ISRGFMQC.js.map → chunk-3AXSSYSY.js.map} +0 -0
  127. /package/dist/{chunk-PLTX6YGD.js.map → chunk-AACJ62ID.js.map} +0 -0
  128. /package/dist/{chunk-LQLMNBJS.js.map → chunk-AXQIFHOX.js.map} +0 -0
  129. /package/dist/{chunk-X7STXQOX.js.map → chunk-HJZFDQKD.js.map} +0 -0
  130. /package/dist/{chunk-CG3FSQ23.js.map → chunk-IUQOOSD4.js.map} +0 -0
  131. /package/dist/{chunk-C4YY6746.js.map → chunk-K2NFNNDB.js.map} +0 -0
  132. /package/dist/{chunk-ZUCJK5PL.js.map → chunk-KNSYKQKB.js.map} +0 -0
  133. /package/dist/{chunk-E63BQ6VJ.js.map → chunk-MDYARXA4.js.map} +0 -0
  134. /package/dist/{chunk-BM6ZLX6F.js.map → chunk-QZ3CLHGL.js.map} +0 -0
  135. /package/dist/{chunk-6PTO6DWW.js.map → chunk-WGZPKQNI.js.map} +0 -0
  136. /package/dist/{chunk-WIGJ5BVG.js.map → chunk-XGTZMJUI.js.map} +0 -0
  137. /package/dist/{chunk-5LD6TA4A.js.map → chunk-ZUINXZPI.js.map} +0 -0
  138. /package/dist/{client-QE4D43K3.js.map → client-K5ZISLAI.js.map} +0 -0
  139. /package/dist/{config-ME774GIO.js.map → config-ZBNH2DMN.js.map} +0 -0
  140. /package/dist/{config-mutator-2AUDHSVD.js.map → config-mutator-ENWFEDFU.js.map} +0 -0
  141. /package/dist/{doctor-GS2ZHLWU.js.map → doctor-Y3GPTM3C.js.map} +0 -0
  142. /package/dist/{facts-5T5GRUTG.js.map → facts-ROUMKS7I.js.map} +0 -0
  143. /package/dist/{promote-ZJCGGVRD.js.map → grants-N7XC7NLS.js.map} +0 -0
  144. /package/dist/{query-UMGPOBEJ.js.map → hosts-NFNCYKGY.js.map} +0 -0
  145. /package/dist/{registry-WD5B2DQQ.js.map → pair-codes-EYGELBPD.js.map} +0 -0
  146. /package/dist/{routing-PUQUADQ6.js.map → promote-KLA3DBKX.js.map} +0 -0
  147. /package/dist/{schedule-tool-3DAJU764.js.map → query-N3BRQU6S.js.map} +0 -0
  148. /package/dist/{scheduler-JTPIGC5K.js.map → registry-GHOOAS2Z.js.map} +0 -0
  149. /package/dist/{seat-O5IC5M5D.js.map → routing-GOOV7H7I.js.map} +0 -0
  150. /package/dist/{wiki-QSBAE5ZK.js.map → schedule-tool-KKH32REI.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/a2a/initiator.ts"],"sourcesContent":["// --- Who started this work: a person or an agent ---\n//\n// One place answers \"is the root of this chain a human?\" so every caller\n// (A2A delegation today, the activity graph and ledger next) agrees. Keep\n// all human-vs-agent detection here; do not re-derive it from\n// `senderAgentId` at call sites, because relays such as the phone app set\n// fields that look agent-shaped for a turn a person started.\n//\n// The rules, in order:\n// 1. A propagated root (`context.initiator`) wins. It is stamped on the\n// first hop of a delegation and travels with the context, including\n// across mesh peers (sendTask forwards the context verbatim).\n// 2. Machine channels (cron, workflow, a2a, mcp, mesh, api, ...) are agent.\n// 3. A machine-shaped sender (\"agent:x\", \"cron:y\", ...) is agent. This is\n// how router bot-to-bot chains and callback turns are marked, and how\n// the GitHub/GitLab adapters mark an agent's comment posted with a\n// person's account (forgeSender in channels/outbound-marker.ts).\n// 4. Channels a person types or speaks on are human.\n// 5. Anything else is agent: unknown traffic keeps today's behaviour.\n\nexport type InitiatorKind = \"human\" | \"agent\"\n\n/** The root of a chain, carried in `context.initiator` on every hop after\n * the first. Only small identifying fields: it crosses the mesh. */\nexport interface RootInitiator {\n kind: InitiatorKind\n /** Channel the root turn arrived on (telegram, app, cron, ...). */\n channel: string\n chatId?: string\n sender?: string\n /** The agent that was talking to the person when the chain started. */\n agentId?: string\n /** The known person behind the root turn (people, #384). */\n person?: string\n}\n\n/** The subset of AgentTask.context this module reads. */\nexport interface InitiatorContext {\n channel?: string\n chatId?: string\n sender?: string\n initiator?: unknown\n delegation?: unknown\n person?: unknown\n [k: string]: unknown\n}\n\n/** Channels a person writes or speaks on. */\nexport const HUMAN_CHANNELS: ReadonlySet<string> = new Set([\n \"telegram\", \"whatsapp\", \"slack\", \"discord\",\n \"gitlab\", \"github\",\n \"app\", \"voice\", \"dashboard\", \"webrtc\",\n])\n\n/** Channels only software writes on. `api` is here on purpose: a bare API\n * call has no conversation to come back to. */\nexport const AGENT_CHANNELS: ReadonlySet<string> = new Set([\n \"a2a\", \"mcp\", \"mesh\", \"api\",\n \"cron\", \"workflow\", \"events\", \"reminder\", \"heartbeat\",\n \"system\", \"internal\", \"business\",\n])\n\nconst AGENT_SENDER_PREFIXES = [\"agent:\", \"cron:\", \"workflow:\", \"mesh:\", \"system:\", \"internal:\"]\n\nfunction validRoot(v: unknown): RootInitiator | null {\n if (!v || typeof v !== \"object\") return null\n const o = v as Record<string, unknown>\n if (o.kind !== \"human\" && o.kind !== \"agent\") return null\n if (typeof o.channel !== \"string\" || !o.channel) return null\n const root: RootInitiator = { kind: o.kind, channel: o.channel.slice(0, 40) }\n if (typeof o.chatId === \"string\") root.chatId = o.chatId.slice(0, 200)\n if (typeof o.sender === \"string\") root.sender = o.sender.slice(0, 120)\n if (typeof o.agentId === \"string\") root.agentId = o.agentId.slice(0, 80)\n if (typeof o.person === \"string\" && o.person) root.person = o.person.slice(0, 40)\n return root\n}\n\n/** The root a delegated hop carries in `context.initiator`, or null on a\n * turn that is itself a root (read-only views such as the activity map). */\nexport function propagatedRootOf(ctx: InitiatorContext | undefined | null): RootInitiator | null {\n return validRoot(ctx?.initiator)\n}\n\n/** True for senders that name software rather than a person. */\nexport function isAgentSender(sender: unknown): boolean {\n if (typeof sender !== \"string\") return false\n const s = sender.trim().toLowerCase()\n return s === \"agent\" || AGENT_SENDER_PREFIXES.some((p) => s.startsWith(p))\n}\n\n/** Human or agent, for the chain this turn belongs to. */\nexport function classifyInitiator(ctx: InitiatorContext | undefined | null): InitiatorKind {\n const root = validRoot(ctx?.initiator)\n if (root) return root.kind\n const channel = (ctx?.channel || \"api\").toLowerCase()\n if (AGENT_CHANNELS.has(channel)) return \"agent\"\n if (isAgentSender(ctx?.sender)) return \"agent\"\n if (HUMAN_CHANNELS.has(channel)) return \"human\"\n return \"agent\"\n}\n\n/** The root to stamp on the next hop. An existing root is passed on\n * unchanged; otherwise this turn is the root. */\nexport function rootInitiatorOf(ctx: InitiatorContext | undefined | null, agentId?: string): RootInitiator {\n const existing = validRoot(ctx?.initiator)\n if (existing) return existing\n const root: RootInitiator = { kind: classifyInitiator(ctx), channel: ctx?.channel || \"api\" }\n if (ctx?.chatId) root.chatId = String(ctx.chatId)\n if (ctx?.sender) root.sender = String(ctx.sender)\n if (agentId) root.agentId = agentId\n if (typeof ctx?.person === \"string\" && ctx.person) root.person = ctx.person\n return root\n}\n\n/** True for a delegated hop (it carries a valid root) or a callback turn\n * (it carries `delegation`). Neither may hand work off asynchronously:\n * a hop has a caller waiting on its answer, and a callback must not fan\n * out into another callback. */\nexport function isInsideDelegation(ctx: InitiatorContext | undefined | null): boolean {\n if (!ctx) return false\n return validRoot(ctx.initiator) !== null || !!ctx.delegation\n}\n\n/** Is this turn the one talking to the person? Only that turn may hand\n * work off and end: a delegated turn (it carries a root) has a caller\n * waiting on its answer, and a callback turn (it carries `delegation`)\n * must not fan out again. */\nexport function isHumanFacingTurn(ctx: InitiatorContext | undefined | null): boolean {\n if (!ctx || isInsideDelegation(ctx)) return false\n return classifyInitiator(ctx) === \"human\"\n}\n"],"mappings":"mCAgEA,SAASA,EAAUC,EAAkC,CACnD,GAAI,CAACA,GAAK,OAAOA,GAAM,SAAU,OAAO,KACxC,IAAMC,EAAID,EAEV,GADIC,EAAE,OAAS,SAAWA,EAAE,OAAS,SACjC,OAAOA,EAAE,SAAY,UAAY,CAACA,EAAE,QAAS,OAAO,KACxD,IAAMC,EAAsB,CAAE,KAAMD,EAAE,KAAM,QAASA,EAAE,QAAQ,MAAM,EAAG,EAAE,CAAE,EAC5E,OAAI,OAAOA,EAAE,QAAW,WAAUC,EAAK,OAASD,EAAE,OAAO,MAAM,EAAG,GAAG,GACjE,OAAOA,EAAE,QAAW,WAAUC,EAAK,OAASD,EAAE,OAAO,MAAM,EAAG,GAAG,GACjE,OAAOA,EAAE,SAAY,WAAUC,EAAK,QAAUD,EAAE,QAAQ,MAAM,EAAG,EAAE,GACnE,OAAOA,EAAE,QAAW,UAAYA,EAAE,SAAQC,EAAK,OAASD,EAAE,OAAO,MAAM,EAAG,EAAE,GACzEC,CACT,CAIO,SAASC,EAAiBC,EAAgE,CAC/F,OAAOL,EAAUK,GAAK,SAAS,CACjC,CAGO,SAASC,EAAcC,EAA0B,CACtD,GAAI,OAAOA,GAAW,SAAU,MAAO,GACvC,IAAMC,EAAID,EAAO,KAAK,EAAE,YAAY,EACpC,OAAOC,IAAM,SAAWC,EAAsB,KAAMC,GAAMF,EAAE,WAAWE,CAAC,CAAC,CAC3E,CAGO,SAASC,EAAkBN,EAAyD,CACzF,IAAMF,EAAOH,EAAUK,GAAK,SAAS,EACrC,GAAIF,EAAM,OAAOA,EAAK,KACtB,IAAMS,GAAWP,GAAK,SAAW,OAAO,YAAY,EAEpD,OADIQ,EAAe,IAAID,CAAO,GAC1BN,EAAcD,GAAK,MAAM,EAAU,QACnCS,EAAe,IAAIF,CAAO,EAAU,QACjC,OACT,CAIO,SAASG,EAAgBV,EAA0CW,EAAiC,CACzG,IAAMC,EAAWjB,EAAUK,GAAK,SAAS,EACzC,GAAIY,EAAU,OAAOA,EACrB,IAAMd,EAAsB,CAAE,KAAMQ,EAAkBN,CAAG,EAAG,QAASA,GAAK,SAAW,KAAM,EAC3F,OAAIA,GAAK,SAAQF,EAAK,OAAS,OAAOE,EAAI,MAAM,GAC5CA,GAAK,SAAQF,EAAK,OAAS,OAAOE,EAAI,MAAM,GAC5CW,IAASb,EAAK,QAAUa,GACxB,OAAOX,GAAK,QAAW,UAAYA,EAAI,SAAQF,EAAK,OAASE,EAAI,QAC9DF,CACT,CAMO,SAASe,EAAmBb,EAAmD,CACpF,OAAKA,EACEL,EAAUK,EAAI,SAAS,IAAM,MAAQ,CAAC,CAACA,EAAI,WADjC,EAEnB,CAMO,SAASc,EAAkBd,EAAmD,CACnF,MAAI,CAACA,GAAOa,EAAmBb,CAAG,EAAU,GACrCM,EAAkBN,CAAG,IAAM,OACpC,CAlIA,IAgDaS,EAQAD,EAMPJ,EA9DNW,EAAAC,EAAA,kBAgDaP,EAAsC,IAAI,IAAI,CACzD,WAAY,WAAY,QAAS,UACjC,SAAU,SACV,MAAO,QAAS,YAAa,QAC/B,CAAC,EAIYD,EAAsC,IAAI,IAAI,CACzD,MAAO,MAAO,OAAQ,MACtB,OAAQ,WAAY,SAAU,WAAY,YAC1C,SAAU,WAAY,UACxB,CAAC,EAEKJ,EAAwB,CAAC,SAAU,QAAS,YAAa,QAAS,UAAW,WAAW","names":["validRoot","v","o","root","propagatedRootOf","ctx","isAgentSender","sender","s","AGENT_SENDER_PREFIXES","p","classifyInitiator","channel","AGENT_CHANNELS","HUMAN_CHANNELS","rootInitiatorOf","agentId","existing","isInsideDelegation","isHumanFacingTurn","init_initiator","__esmMin"]}
@@ -1,51 +0,0 @@
1
- import{b as N,d as P,h as Ue}from"./chunk-UCKKAWLZ.js";import{g as M,h as B,i as Fe}from"./chunk-PN6XHTG5.js";import{a as f,b as Be}from"./chunk-QIJLFPWE.js";import{z as i}from"zod";var He,ze,We,Ke,Xe,Ge,Ze,Ye,Ve,U,F=f(()=>{"use strict";He=i.enum(["mon","tue","wed","thu","fri","sat","sun"]),ze=i.object({days:i.array(He).default(["mon","tue","wed","thu","fri"]),start:i.string().regex(/^\d{2}:\d{2}$/),end:i.string().regex(/^\d{2}:\d{2}$/),lunch:i.object({start:i.string().regex(/^\d{2}:\d{2}$/),end:i.string().regex(/^\d{2}:\d{2}$/)}).optional()}),We=i.object({title:i.string(),responsibilities:i.array(i.string()).default([]),sopPath:i.string().optional(),kpis:i.array(i.string()).default([])}),Ke=i.object({role:i.string(),reportsTo:i.string().optional(),schedule:ze,utilizationTarget:i.number().min(0).max(1).default(.8)}),Xe=i.object({channel:i.string(),chatId:i.string(),accountId:i.string().optional()}),Ge=i.discriminatedUnion("type",[i.object({type:i.literal("backlog"),path:i.string().default(".agentx/backlog.md")}),i.object({type:i.literal("gitlab"),projects:i.array(i.string()).default([])}),i.object({type:i.literal("wiki"),path:i.string(),glob:i.string().default("**/*.md")})]),Ze=i.object({id:i.string(),pm:i.string().optional(),client:i.string().optional()}),Ye=i.object({channel:i.string().optional(),chatId:i.string().optional(),username:i.string().optional(),senderId:i.string().optional(),client:i.string(),project:i.string().optional(),displayName:i.string().optional()}),Ve=i.object({name:i.string().optional(),kind:i.enum(["client","internal","own"]).optional(),respondWithin:i.string().optional(),standing:i.array(i.string()).default([])}),U=i.object({enabled:i.boolean().default(!1),timezone:i.string().default("UTC"),mainChannel:Xe,workSource:Ge,roles:i.record(i.string(),We).default({}),orgChart:i.record(i.string(),Ke).default({}),projects:i.array(Ze).default([]),contactMap:i.array(Ye).default([]),clients:i.record(i.string(),Ve).default({}),workTickMinutes:i.number().int().min(1).max(60).default(15),idleQueueThreshold:i.number().int().min(0).default(0),standup:i.object({enabled:i.boolean().default(!0),plansDir:i.string().default(".agentx/plans"),maxAgentsPerDay:i.number().int().min(1).max(100).default(20),dryRun:i.boolean().default(!1)}).default({})})});import{z as u}from"zod";function jn(r,t){let n=new Set(r.labels||[]);if(r.state==="closed"){let a=t.find(s=>s.kind==="closed");if(a)return a.id}for(let a of t)if(a.kind==="scoped-label"&&a.scopedLabel&&n.has(a.scopedLabel))return a.id;for(let a of t)if(a.kind==="label"&&a.mapsToLabel&&n.has(a.mapsToLabel))return a.id;let o=t.find(a=>a.kind==="open-backlog");if(o){let a=o.scopedPrefix+"::";return[...n].some(l=>l.startsWith(a))?null:o.id}return t[0]?.id??null}function qn(r,t){let n=[],o=[],a=!1,s=!1;return t.kind==="scoped-label"&&t.scopedLabel?n.push(t.scopedLabel):t.kind==="label"&&t.mapsToLabel?n.push(t.mapsToLabel):t.kind==="closed"&&(a=!0),r&&(r.kind==="scoped-label"&&r.scopedLabel?o.push(r.scopedLabel):r.kind==="label"&&r.mapsToLabel?o.push(r.mapsToLabel):r.kind==="closed"&&t.kind!=="closed"&&(s=!0)),{addLabels:n.length?n:void 0,removeLabels:o.length?o:void 0,closeIssue:a||void 0,reopen:s||void 0}}var Je,Qe,et,tt,nt,rt,H,ot,z,W=f(()=>{"use strict";Je=u.object({name:u.string(),color:u.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:u.string().optional()}),Qe=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:u.string(),kind:u.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:u.string().optional(),scopedLabel:u.string().optional(),scopedPrefix:u.string().default("Status"),accent:u.string().optional()}),et=u.object({enabled:u.boolean().default(!0),staleDoingMinutes:u.number().int().min(1).default(45),respectLunchBreak:u.boolean().default(!0),respectSchedule:u.boolean().default(!0),action:u.enum(["badge","notify"]).default("badge")}),tt=u.discriminatedUnion("type",[u.object({type:u.literal("gitlab"),projects:u.array(u.string()).min(1)})]),nt=[{id:"open",title:"Open",kind:"open-backlog",scopedPrefix:"Status",accent:"#6b7280"},{id:"todo",title:"To Do",kind:"scoped-label",scopedLabel:"Status::To Do",scopedPrefix:"Status",accent:"#fb7a35"},{id:"doing",title:"Doing",kind:"scoped-label",scopedLabel:"Status::Doing",scopedPrefix:"Status",accent:"#22c55e"},{id:"onhold",title:"On Hold",kind:"scoped-label",scopedLabel:"Status::On Hold",scopedPrefix:"Status",accent:"#f59e0b"},{id:"review",title:"Review",kind:"scoped-label",scopedLabel:"Status::Review",scopedPrefix:"Status",accent:"#3b82f6"},{id:"closed",title:"Closed",kind:"closed",scopedPrefix:"Status",accent:"#6b7280"}],rt=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:u.string(),source:tt,primaryToolLabel:u.string().optional(),labels:u.array(Je).default([]),columns:u.array(Qe).min(1).default(nt),timeRangeDays:u.number().int().min(1).max(365).default(30),closedWindowDays:u.number().int().min(1).max(365).default(30),reconciliation:et.default({})}),H=u.array(rt).default([]),ot=u.object({name:u.string(),url:u.string(),dashboardUrl:u.string().optional(),token:u.string().optional(),dashboardToken:u.string().optional()}),z=u.object({enabled:u.boolean().default(!1),port:u.number().int().default(4202),bind:u.string().default("127.0.0.1"),token:u.string().optional(),daemonUrl:u.string().default("http://localhost:18800"),daemons:u.array(ot).default([]),draftAgent:u.string().optional()}).default({})});import{z as at}from"zod";function Pn(r){return r==="report"||r==="propose"}function lt(r){return r.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[^A-Za-z0-9]+/).filter(Boolean).map(t=>t.toLowerCase())}function C(r){return lt(r).slice(2).join(" ").replace(/\b(merge|pull)\s+requests?\b/g,"mergerequest").split(" ").filter(Boolean)}function Y(r){let t=r.replace(/<<-?\s*(['"]?)([A-Za-z_][A-Za-z0-9_]*)\1([\s\S]*?)^\s*\2\s*$/gm,(a,s,l,d)=>!s&&/\$\(|`/.test(d)?a:a.split(`
2
- `)[0]+`
3
- `),n="",o=0;for(;o<t.length;){let a=t[o];if(a==="\\"){n+=t.slice(o,o+2),o+=2;continue}if(a==="'"){let s=t.indexOf("'",o+1);if(s<0)return null;n+="''",o=s+1;continue}if(a==='"'){let s=o+1;for(;s<t.length&&t[s]!=='"';)s+=t[s]==="\\"?2:1;if(s>=t.length)return null;let l=t.slice(o+1,s);n+=/\$\(|`/.test(l)?` ${l} `:'""',o=s+1;continue}n+=a,o++}return n}function V(r){return r.split(/\|\||&&|[;|&\n`()]|\$\(|<\(|>\(/).map(t=>t.trim().split(/\s+/).filter(Boolean)).filter(t=>t.length>0)}function J(r){let t=0;for(;t<r.length;){let n=r[t];if(ct.has(n))return[];if(ut.has(n)||/^[A-Za-z_][A-Za-z0-9_]*=/.test(n)){t++;continue}break}return r.slice(t)}function Q(r){let t=0;for(;t<r.length&&r[t].startsWith("-");)t+=/^-(C|c)$|^--(git-dir|work-tree|namespace)$/.test(r[t])?2:1;return{sub:r[t],rest:r.slice(t+1)}}function mt(r){let[t,...n]=r,o=t.replace(/^.*\//,"");if(!pt.has(o))return`\`${o}\` is not a read-only command`;let a=s=>n.some(l=>s.test(l));switch(o){case"find":return a(/^-(exec|execdir|ok|okdir|delete|fprint|fprint0|fprintf|fls)$/)?"find with -exec/-delete":null;case"sort":return a(/^(-o|--output)/)?"sort -o writes a file":null;case"git":{if(a(/^(-c|--exec-path|--output)/))return"git option that can execute or write";let{sub:s,rest:l}=Q(n);return!s||!gt.has(s)?`git ${s??""} is not read-only`.trim():s==="branch"&&l.some(d=>/^-(d|D|m|M|c|C|f|u)$|^--(delete|move|copy|force|set-upstream|unset-upstream|edit-description)/.test(d)||!d.startsWith("-"))?"git branch that changes branches":s==="tag"&&l.some(d=>!/^(-l|--list|-n\d*|--contains|--points-at|--sort=.*|--merged|--no-merged)$/.test(d))?"git tag that creates or deletes tags":s==="remote"&&l.length>0&&!/^(-v|--verbose|show|get-url)$/.test(l[0])?"git remote that changes remotes":s==="config"&&!l.some(d=>/^(--get|--get-all|--get-regexp|--list|-l)$/.test(d))?"git config write":s==="reflog"&&l.length>0&&!/^(show|-)/.test(l[0])?"git reflog that expires or deletes":null}case"gh":case"glab":{let[s,l]=n.filter(d=>!d.startsWith("-"));if(s==="search")return null;if(s==="api"){let d=n.findIndex(p=>/^(-X|--method)$/.test(p));return d>=0&&!/^GET$/i.test(n[d+1]??"")?`${o} api with a non-GET method`:a(/^-X(?!GET$)\w+|^--method=(?!GET$)/i)?`${o} api with a non-GET method`:a(/^(-f|-F|--field|--raw-field|--input)/)?`${o} api with a request body`:null}return!l||!ft.has(l)?`${o} ${s??""} ${l??""} is not read-only`.replace(/\s+/g," ").trim():null}case"curl":{let s=n.findIndex(l=>/^(-X|--request)$/.test(l));return s>=0&&!/^(GET|HEAD|OPTIONS)$/i.test(n[s+1]??"")||a(/^-X(?!GET$|HEAD$)\w+|^--request=(?!GET$|HEAD$)/i)?"curl with a non-GET method":a(/^(-d|--data|--data-\w+|--json|-F|--form|-T|--upload-file|-o|--output|-O|--remote-name|-K|--config)/)?"curl that sends a body or writes a file":null}default:return null}}function ht(r){let t=r.replace(/\d*>>?\s*\/dev\/null/g," ").replace(/&>>?\s*\/dev\/null/g," ").replace(/\d*>&\s*\d+/g," ");return/[>]/.test(t)}function bt(r){let t=Y(r);if(t===null)return g("report","shell","command too irregular to verify as read-only");if(ht(t))return g("report","shell","output redirection writes a file");for(let n of V(t)){let o=J(n);if(o.length===0)continue;let a=mt(o);if(a)return g("report","shell",a)}return x}function yt(r){if(st.has(r.tool))return g("report","write",`${r.tool} modifies files`);if(r.tool==="Bash")return bt(r.command??"");if(it.has(r.tool))return x;if(r.tool.startsWith("mcp__")){let t=C(r.tool),n=t.find(o=>dt.has(o));return n?g("report","outward",`tool "${r.tool}" can change state (${n})`):t.some(o=>G.has(o))?x:g("report","outward",`tool "${r.tool}" is not recognisably read-only`)}return g("report","tool",`tool "${r.tool}" is not on the read-only list`)}function kt(r){let t=[];for(let o=0;o<r.length;o++){let a=r[o];if(Et.test(a)){o++;continue}if(/^(--force.*|-d|--delete|--mirror|--all|--tags|--prune)$/.test(a)||/^-[a-zA-Z]*f/.test(a))return g("propose","push","force, delete, mirror and tag pushes are act-level actions");a.startsWith("-")||t.push(a)}let n=t.slice(1);if(n.length===0)return g("propose","push","name the feature branch explicitly: git push <remote> <branch>");for(let o of n){if(o.startsWith("+")||o.startsWith(":"))return g("propose","push",`refspec "${o}" force-pushes or deletes`);let a=(o.includes(":")?o.slice(o.indexOf(":")+1):o).replace(/^refs\/heads\//,"");if(wt.test(a))return g("propose","push",`pushing to "${a}" is an act-level action; push a feature branch and open a merge request`)}return null}function vt(r){for(let n of xt)if(n.re.test(r))return g("propose",n.id,n.reason);let t=Y(r);if(t===null)return g("propose","shell","command too irregular to verify");for(let n of V(t)){let o=J(n);if(o.length===0)continue;let a=[K(o[0]),...o.slice(1)].join(" ");for(let s of St)if(s.re.test(a))return g("propose",s.id,s.reason);if(K(o[0])==="git"){let{sub:s,rest:l}=Q(o.slice(1));if(s==="push"){let d=kt(l);if(d)return d}}}return x}function Tt(r){if(r.tool==="Bash")return vt(r.command??"");if(r.tool.startsWith("mcp__")){let t=C(r.tool).find(n=>Z.has(n));if(t)return g("propose","outward",`tool "${r.tool}" performs an act-level action (${t})`);if(Rt(C(r.tool)))return g("propose","delegate",`tool "${r.tool}" hands work to another agent, which would run at its own full autonomy`)}return x}function Rt(r){return r.includes("delegate")||r.includes("handoff")||r.includes("agent")&&r.some(t=>t==="send"||t==="ask"||t==="message"||t==="task")?!0:r.includes("task")&&!r.some(t=>G.has(t))}function Mn(r,t){return r==="report"?yt(t):r==="propose"?Tt(t):x}function Bn(r){return r==="report"?"[Autonomy: report] This routine runs read-only. Investigate and report; do not modify files, run mutating commands, or post anywhere. Your final answer is the deliverable. Blocked actions are enforced and logged; if something needs doing, describe it in the report instead.":r==="propose"?"[Autonomy: propose] You may edit files, commit, push a named feature branch, and open a merge request or draft. You may not merge, deploy, delete, force-push, push to protected branches, or operate hosts. These limits are enforced and logged; leave act-level steps as clear recommendations.":""}var X,x,g,st,it,G,Z,dt,ut,ct,K,pt,gt,ft,xt,St,wt,Et,ee=f(()=>{"use strict";X=at.enum(["report","propose","act"]);x={allowed:!0,ruleId:null,reason:null},g=(r,t,n)=>({allowed:!1,ruleId:`autonomy.${r}.${t}`,reason:n}),st=new Set(["Write","Edit","MultiEdit","NotebookEdit"]),it=new Set(["Read","Glob","Grep","LS","NotebookRead","WebFetch","WebSearch","TodoWrite","TodoRead","Task","Agent","Skill","ToolSearch","BashOutput","KillShell","ExitPlanMode","EnterPlanMode","ListMcpResourcesTool","ReadMcpResourceTool"]);G=new Set(["get","list","search","read","view","fetch","query","find","show","describe","status","diff","inspect","lookup","count","stats","browse","whoami","download"]),Z=new Set(["merge","delete","remove","destroy","drop","deploy","publish","release","approve","archive","revoke","purge","close","transfer","force","rollback","restart","erase","unprotect","truncate","wipe","kill","terminate","unpublish","promote"]),dt=new Set([...Z,"create","update","post","send","write","edit","add","set","comment","reply","push","run","execute","exec","trigger","upload","move","rename","cancel","retry","assign","label","react","invite","notify","schedule","start","stop","submit","save","patch","put","insert","upsert","apply","install","import","mark","toggle","enable","disable","open","commit","sync","reset","store","remember","forget","broadcast","message","call","dispatch","enqueue","resolve","unassign","lock","unlock","pin"]);ut=new Set(["then","do","else","elif","if","while","until","!","{","}","time"]),ct=new Set(["done","fi","esac","for","case","select","in",";;"]);K=r=>r.replace(/^.*\//,""),pt=new Set(["ls","pwd","cd","cat","head","tail","wc","grep","egrep","fgrep","rg","fd","tree","stat","file","du","df","date","whoami","id","hostname","uname","which","type","sort","uniq","cut","tr","diff","cmp","comm","basename","dirname","realpath","readlink","jq","column","nl","seq","true","false","test","[","sleep","ps","uptime","echo","printf","base64","md5","md5sum","shasum","sha256sum","less","more","printenv","dig","nslookup","host","find","git","gh","glab","curl"]),gt=new Set(["status","log","diff","show","rev-parse","ls-files","ls-tree","blame","shortlog","describe","cat-file","grep","branch","tag","remote","config","reflog","rev-list","merge-base","name-rev","show-ref","for-each-ref","whatchanged"]),ft=new Set(["view","list","diff","status","checks","ls"]);xt=[{id:"merge",re:/merge_when_pipeline_succeeds|\bauto[_-]merge\b/i,reason:"auto-merging is an act-level action"},{id:"merge",re:/\b(curl|wget|http|gh\s+api|glab\s+api)\b[^\n]*\/merges?\b/i,reason:"calling a merge endpoint is an act-level action"},{id:"delete",re:/(?:^|\W)(drop|truncate)\s+(table|database|schema|index|collection)\b|(?:^|\W)delete\s+from\b|\bflushall\b|\bflushdb\b/i,reason:"destroying data is an act-level action"},{id:"delete",re:/(-X|--request)[\s=]*['"]?DELETE\b/i,reason:"HTTP DELETE is an act-level action"},{id:"delegate",re:/\b(curl|wget|http)\b[^\n]*(localhost|127\.0\.0\.1|\[::1\])[^\n]*\/(ask|task|send|chat|mesh|workflows?|crons?|reload|config)\b/i,reason:"calling the local daemon to dispatch work escapes this routine's limit"}],St=[{id:"merge",re:/^(gh\s+pr\s+merge|glab\s+mr\s+merge)\b/i,reason:"merging is an act-level action"},{id:"delete",re:/^rm\s+(.*\s)?(-\w*[rR]\w*|--recursive)\b|^(shred|dropdb)\b|^find\b.*\s-delete\b/i,reason:"deleting is an act-level action"},{id:"delete",re:/^git\s+(clean\s+-\w*f|reset\s+--hard|branch\s+(-\w*[dD]\w*|--delete)|tag\s+(-d|--delete)|stash\s+(drop|clear)|remote\s+(remove|rm))\b/i,reason:"deleting is an act-level action"},{id:"delete",re:/^(gh|glab)\s+\S+\s+delete\b|^docker\s+(rm|rmi|volume\s+rm|system\s+prune)\b|^(kubectl\s+delete|aws\s+s3\s+(rm|rb)|gsutil\s+rm)\b|^doctl\s+.*\sdelete\b/i,reason:"deleting is an act-level action"},{id:"deploy",re:/^(kubectl\s+(apply|rollout|scale|set|patch|replace|create|edit)|helm\s+(install|upgrade|rollback|uninstall|delete)|terraform\s+(apply|destroy|import|taint)|pulumi\s+(up|destroy)|docker\s+push|netlify\s+deploy|fly(ctl)?\s+deploy|serverless\s+deploy|vercel\b.*--prod)\b/i,reason:"deploying is an act-level action"},{id:"deploy",re:/^((npm|pnpm|yarn|bun)(\s+run)?|make|just|task|rake)\s+(\S+:)?deploy\b|^((ba|z)?sh|node|python3?)\s+\S*deploy[^\s/]*$|^\S*\/deploy(\.\w+)?\b|^deploy(\.\w+)?\b/i,reason:"deploying is an act-level action"},{id:"deploy",re:/^((npm|pnpm|yarn|bun)\s+publish|cargo\s+publish|twine\s+upload|(gh|glab)\s+release\s+(create|upload|edit)|(npx\s+)?prisma\s+(migrate\s+(deploy|reset)|db\s+push))\b/i,reason:"publishing or migrating is an act-level action"},{id:"prod",re:/^(ssh|scp|sudo|doas|systemctl|launchctl|service|kill|pkill|killall|reboot|shutdown)\b|^rsync\b.*\s\S+:\S*/i,reason:"operating hosts and services is an act-level action"},{id:"delegate",re:/^(agentx|agentix)\s+(ask|send|task|exec|run|chat|mesh|cron|workflow|daemon|config)\b/i,reason:"handing work to another agent or reconfiguring the daemon escapes this routine's limit"}],wt=/^(main|master|trunk|develop|development|prod|production|staging|stable|release([/-].*)?|HEAD|@)$/i,Et=/^(-o|--push-option|--repo|--receive-pack|--exec)$/});function Lt(r){let t=String(r??"").trim().toLowerCase();if(!t)return{ok:!1,error:"is empty"};let n=t.split("+").map(s=>s.trim());if(n.some(s=>!s))return{ok:!1,error:`"${r}" has an empty part; write it like opt+space`};let o=$t[n[n.length-1]]??n[n.length-1],a=new Set;for(let s of n.slice(0,-1)){let l=_t[s];if(!l)return{ok:!1,error:`"${s}" is not a modifier; use ctrl, opt, shift or cmd`};if(a.has(l))return{ok:!1,error:`"${r}" names ${l} twice`};a.add(l)}return Ct(o)?!te(o)&&!["ctrl","opt","cmd"].some(s=>a.has(s))?{ok:!1,error:`"${r}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...At.filter(s=>a.has(s)),o].join("+")}:{ok:!1,error:`"${o}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function ne(r){let t=Lt(r);return t.ok?void 0:t.error}function Fn(r){let t={ctrl:"\u2303",opt:"\u2325",shift:"\u21E7",cmd:"\u2318"},n={space:"Space",period:".",comma:",",slash:"/",semicolon:";",quote:"'",minus:"-",equal:"=",leftbracket:"[",rightbracket:"]",backslash:"\\",grave:"`",return:"Return",tab:"Tab"},o=r.split("+"),a=o.pop()??"";return o.map(s=>t[s]??s).join("")+(n[a]??a.toUpperCase())}var _t,At,It,$t,te,Ct,E,re=f(()=>{"use strict";_t={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},At=["ctrl","opt","shift","cmd"],It=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],$t={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},te=r=>/^f([1-9]|1[0-9]|20)$/.test(r),Ct=r=>/^[a-z0-9]$/.test(r)||It.includes(r)||te(r);E={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function Ot(r){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!t)return null;let[n,o,a]=t.slice(1).map(h=>parseInt(h,16)/255),s=Math.max(n,o,a),l=Math.min(n,o,a),d=s-l;return d<.04?null:((s===n?(o-a)/d%6:s===o?(a-n)/d+2:(n-o)/d+4)*60+360)%360}function jt(r){let t=Ot(r);if(t===null)return S.find(a=>a.id==="lagoon");let n=S[0],o=360;for(let a of S){let s=Math.abs(a.hue-t),l=Math.min(s,360-s);l<o&&(n=a,o=l)}return n}function zn(r,t){let n=S.find(o=>o.id===r);return n?{...n,set:!0}:{...jt(t),set:!1}}var S,oe,ae=f(()=>{"use strict";S=[{id:"sunrise",label:"Sunrise",hue:18,colors:["#E8505B","#F2726F","#F79A5A","#FBBF4A","#FFE3A3"]},{id:"desert",label:"Desert",hue:36,colors:["#A4492C","#C8683E","#D9905E","#E7B98A","#F6E3C4"]},{id:"forest",label:"Forest",hue:100,colors:["#2F5D34","#4C7D3A","#6FA046","#9CC25E","#D5EBA4"]},{id:"lagoon",label:"Lagoon",hue:172,colors:["#0B6E73","#0E9594","#1FBFB2","#56DCCB","#B8F4EA"]},{id:"ocean",label:"Ocean",hue:205,colors:["#15457E","#1C6BA8","#2B93CF","#5DBBE8","#BFE6FA"]},{id:"dusk",label:"Dusk",hue:268,colors:["#2E2A7A","#5B3E9E","#8C4FB0","#C8649E","#F4A7B9"]},{id:"blossom",label:"Blossom",hue:330,colors:["#A3245B","#CF3F78","#E8699A","#F49BB8","#FFD6E0"]}],oe=S.map(r=>r.id)});function se(r){let t=(r.match(/[؀-ۿ]/g)??[]).length,n=(r.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(t&&t>=n)return"ar";let o=0,a=0;for(let s of r.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])qt.has(s)&&o++,Dt.has(s)||s.startsWith("l'")||s.startsWith("d'")||s.startsWith("qu'")?a++:Nt.test(s)&&(a+=.5);return o===a?null:o>a?"en":"fr"}var qt,Dt,Nt,ie=f(()=>{"use strict";qt=new Set("the and is are was were i you he she we they it this that to of in for with not but yes what have has will would can your my".split(" ")),Dt=new Set("le la les des du de un une et est sont je tu il elle nous vous ils elles ce cette c'est pas pour que qui avec dans sur au aux mais tr\xE8s oui non merci bonjour votre mon".split(" ")),Nt=/[éèêëàâçùûîïôœ]/});function Gn(r,t=L){let n=r;if(n=n.replace(/```[\s\S]*?```/g,". "),n=n.replace(/`[^`]*`/g,""),n=n.replace(/\*\*(.*?)\*\*/g,"$1"),n=n.replace(/__(.*?)__/g,"$1"),n=n.replace(/\*([^*]+)\*/g,"$1"),n=n.replace(/_([^_]+)_/g,"$1"),n=n.replace(/~~(.*?)~~/g,"$1"),n=n.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),n=n.replace(/!\[([^\]]*)\]\([^)]+\)/g,"image$1 "),n=n.replace(/^#{1,6}\s+/gm,""),n=n.replace(/^[\s]*[-*+]\s+/gm,". "),n=n.replace(/^[\s]*\d+\.\s+/gm,". "),n=n.replace(/^[-=_]{3,}$/gm,""),n=n.replace(/^>\s*/gm,""),n=n.replace(/https?:\/\/\S+/g,"link"),n=n.replace(/\/\w+(\/\w+)+/g,o=>o.split("/").filter(Boolean).join(" slash ")),n=n.replace(/&/g," and "),n=n.replace(/@/g," at "),n=n.replace(/=>/g," returns "),n=n.replace(/->/g," to "),n=n.replace(/\|/g," or "),n=n.replace(/\be\.g\./gi,"for example"),n=n.replace(/\bi\.e\./gi,"that is"),n=n.replace(/\betc\./gi,"etcetera"),n=n.replace(/\bvs\.?\b/gi,"versus"),n=n.replace(/\n{2,}/g,". "),n=n.replace(/\n/g," "),n=n.replace(/\s+/g," "),n=n.replace(/\.\s*\./g,"."),n=n.replace(/\s+([.,!?])/g,"$1"),n=n.trim().replace(/^[.,:;]+\s*/,""),n.length>t){let o=n.slice(0,t),a=([...n.slice(0,t+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;n=(a>=t/2?o.slice(0,a):o.replace(/\s+\S*$/,"")+"...")+" "+Pt[se(o)??"en"]}return n}var L,Pt,le=f(()=>{"use strict";ie();L=500,Pt={en:"The rest is on screen.",fr:"La suite est \xE0 l'\xE9cran.",ar:"\u0627\u0644\u0628\u0627\u0642\u064A \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629."}});import{z as c}from"zod";var de,Mt,ue,ce=f(()=>{"use strict";de=c.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),Mt=c.object({id:c.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:c.boolean().default(!0),chats:c.array(c.string().min(1)).default([]),senders:c.array(c.string().min(1)).default([]),agent:c.string().min(1),prompt:c.string().max(4e3).optional(),quietHours:c.object({start:de,end:de}).optional(),autoAck:c.boolean().default(!1)}).refine(r=>r.chats.length>0||r.senders.length>0,{message:"a rule needs at least one chat or sender"}),ue=c.object({enabled:c.boolean().default(!1),secretEnv:c.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:c.number().int().min(0).max(600).default(20),timezone:c.string().optional(),allowAutoAck:c.boolean().default(!1),describeMedia:c.boolean().default(!0),wacli:c.object({bin:c.string().default("wacli"),account:c.string().optional(),store:c.string().optional()}).default({}),rules:c.array(Mt).default([])}).default({})});function Bt(r){if(r.exec(`
4
- CREATE TABLE IF NOT EXISTS requests (
5
- id TEXT PRIMARY KEY,
6
- state TEXT NOT NULL,
7
- channel TEXT NOT NULL,
8
- chat_id TEXT NOT NULL,
9
- sender TEXT,
10
- agent_id TEXT NOT NULL,
11
- text TEXT NOT NULL,
12
- created_at INTEGER NOT NULL,
13
- updated_at INTEGER NOT NULL,
14
- attention_reason TEXT,
15
- notified_at INTEGER,
16
- question TEXT,
17
- closed_at INTEGER,
18
- evidence TEXT,
19
- close_reason TEXT
20
- );
21
- CREATE INDEX IF NOT EXISTS idx_requests_state_created ON requests(state, created_at);
22
- CREATE INDEX IF NOT EXISTS idx_requests_chat ON requests(agent_id, channel, chat_id, created_at);
23
- CREATE TABLE IF NOT EXISTS request_links (
24
- request_id TEXT NOT NULL,
25
- kind TEXT NOT NULL,
26
- ref TEXT NOT NULL,
27
- at INTEGER NOT NULL,
28
- PRIMARY KEY (kind, ref),
29
- FOREIGN KEY (request_id) REFERENCES requests(id) ON DELETE CASCADE
30
- );
31
- CREATE INDEX IF NOT EXISTS idx_request_links_request ON request_links(request_id);
32
- `),B(r,"requests",M),!r.prepare("PRAGMA table_info(requests)").all().some(n=>n.name==="pickup_at"))try{r.exec("ALTER TABLE requests ADD COLUMN pickup_at INTEGER")}catch(n){if(!/duplicate column name/i.test(String(n?.message)))throw n}}function Qn(r){return!!r.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'requests'").get()}function b(r){return{id:r.id,state:r.state,channel:r.channel,chatId:r.chat_id,sender:r.sender??null,person:r.person??null,agentId:r.agent_id,text:r.text,createdAt:r.created_at,updatedAt:r.updated_at,attentionReason:r.attention_reason??null,notifiedAt:r.notified_at??null,question:r.question??null,closedAt:r.closed_at??null,evidence:r.evidence??null,closeReason:r.close_reason??null}}var k,m,pe,O,y,ge,fe=f(()=>{"use strict";Fe();k=["in_progress","waiting_owner","waiting_other","needs_attention"],m=["done","declined","dropped"],pe=4e3,O=500;y=r=>Array(r).fill("?").join(","),ge=class{constructor(t){this.db=t;Bt(t),t.pragma("foreign_keys = ON")}addCandidate(t){this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at)
33
- VALUES (?, 'candidate', ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.sender??null,t.person??null,t.agentId,t.text.slice(0,pe),t.now,t.now),this.link(t.id,"run",t.runId,t.now)}get(t){let n=this.db.prepare("SELECT * FROM requests WHERE id = ?").get(t);return n?b(n):null}byLink(t,n){let o=this.db.prepare("SELECT r.* FROM requests r JOIN request_links l ON l.request_id = r.id WHERE l.kind = ? AND l.ref = ?").get(t,n);return o?b(o):null}link(t,n,o,a){this.db.prepare("INSERT OR IGNORE INTO request_links (request_id, kind, ref, at) VALUES (?, ?, ?, ?)").run(t,n,o,a)}links(t){return this.db.prepare("SELECT kind, ref, at FROM request_links WHERE request_id = ? ORDER BY at, rowid").all(t)}touch(t,n){this.db.prepare("UPDATE requests SET updated_at = ? WHERE id = ?").run(n,t)}progress(t,n,o="in_progress"){this.db.prepare(`UPDATE requests SET state = ?, updated_at = ?, attention_reason = NULL, notified_at = NULL, question = NULL
34
- WHERE id = ? AND state NOT IN (${y(m.length)})`).run(o,n,t,...m)}waitOnOwner(t,n,o){this.db.prepare(`UPDATE requests SET state = 'waiting_owner', updated_at = ?, question = ?, attention_reason = NULL, notified_at = NULL
35
- WHERE id = ? AND state NOT IN (${y(m.length)})`).run(o,n.slice(0,pe),t,...m)}needsAttention(t,n,o){return this.db.prepare(`UPDATE requests SET state = 'needs_attention', updated_at = ?, attention_reason = ?, notified_at = NULL
36
- WHERE id = ? AND state NOT IN ('needs_attention', ${y(m.length)})`).run(o,n.replace(/\s+/g," ").trim().slice(0,O),t,...m).changes>0}close(t,n,o,a){let s=o.trim();if(!s)throw new Error(n==="done"?"a finished request needs a link to the evidence":`a ${n} request needs a reason`);return this.db.prepare(`UPDATE requests SET state = ?, closed_at = ?, updated_at = ?, evidence = ?, close_reason = ?
37
- WHERE id = ? AND state NOT IN (${y(m.length)})`).run(n,a,a,n==="done"?s.slice(0,O):null,n==="done"?null:s.slice(0,O),t,...m).changes>0}discardCandidate(t){return this.db.prepare("DELETE FROM requests WHERE id = ? AND state = 'candidate'").run(t).changes>0}listOpen(){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${y(k.length)}) ORDER BY created_at, rowid`).all(...k).map(b)}quietSince(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${y(t.length)}) AND updated_at < ? ORDER BY created_at, rowid`).all(...t,n).map(b)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(b)}markNotified(t,n){this.db.prepare("UPDATE requests SET notified_at = ? WHERE id = ?").run(n,t)}listByState(t){return this.db.prepare("SELECT * FROM requests WHERE state = ? ORDER BY created_at, rowid").all(t).map(b)}requestPickup(t,n){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?
38
- WHERE id = ? AND state = 'needs_attention'`).run(n,n,t).changes>0}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(b).filter(t=>t.state==="in_progress").sort((t,n)=>t.createdAt-n.createdAt)}pruneClosed(t){return this.db.prepare(`DELETE FROM requests WHERE state IN (${y(m.length)}) AND closed_at < ?`).run(...m,t).changes}}});function nr(r){return Object.assign({channel:be,chatId:r,sender:"operator"},{[ye]:!0})}function rr(r){return!!r&&r[ye]===!0}function Ht(r,t,n,o=!1){let a=T(t);if(r.channels.length&&!r.channels.map(T).includes(a))return!1;if(R.has(a))return o&&!Ut.has((n?.name??"").toLowerCase());let s=Ft.has(a)?n?.username:n?.id,l=s?me(a,s):"";return l?r.from.some(d=>{let p=d.trim().toLowerCase(),h=p.indexOf(":");return h>0&&p.slice(0,h)===a&&me(a,p.slice(h+1))===l}):!1}function or(r){if(!r)return;let t=o=>typeof o=="string"&&o?o.slice(0,120):void 0,n={name:t(r.sender),id:t(r.senderId),username:t(r.senderUsername)};return n.name||n.id||n.username?n:void 0}function zt(r){return/\btimed? ?out\b|timeout/i.test(r)?"timed out":"failed"}var be,ye,R,Ut,T,Ft,me,v,w,he,xe=f(()=>{"use strict";fe();be="requests",ye=Symbol("requests.pickup");R=new Set(["voice","app","dashboard","webrtc"]),Ut=new Set(["camera"]),T=r=>r.toLowerCase().split("@")[0],Ft=new Set(["github","gitlab"]),me=(r,t)=>r==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.trim().toLowerCase().replace(/^@/,"");v=(r,t=200)=>{let n=r.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n},w=(r,t,n)=>`${r}\0${t}\0${n}`,he=class{constructor(t,n,o,a=Date.now){this.store=t;this.settings=n;this.log=o;this.now=a}live=new Map;guard(t,n){try{n()}catch(o){this.log(`[requests] ${t} failed: ${o?.message??o}`)}}isListedOwner(t){let n=T(t.channel),o=this.settings().channels;return o.length&&!o.map(T).includes(n)?!1:t.person?.role==="owner"&&!R.has(n)}liveRequestId(t,n,o){return this.live.get(w(t,n,o))?.requestId??null}taskStarted(t){t.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let n=this.now(),o=t.resumedFrom?this.store.byLink("run",t.resumedFrom):null,a=w(t.agentId,t.channel,t.chatId);if(o){this.store.link(o.id,"run",t.taskId,n),o.state==="candidate"?this.store.touch(o.id,n):this.store.progress(o.id,n),this.live.set(a,{requestId:o.id,runId:t.taskId});return}let s=t.pickup&&t.channel===be?this.store.get(t.chatId):null;if(s&&s.agentId===t.agentId){this.store.link(s.id,"run",t.taskId,n),this.store.touch(s.id,n),this.live.set(a,{requestId:s.id,runId:t.taskId});return}!t.humanRoot||!(Ht(this.settings(),t.channel,t.sender,t.operator===!0)||this.isListedOwner(t))||(this.live.set(a,{requestId:`req-${t.taskId}`,runId:t.taskId}),this.store.addCandidate({id:`req-${t.taskId}`,runId:t.taskId,channel:t.channel,chatId:t.chatId,sender:t.sender?.name??t.sender?.username??t.sender?.id??null,person:t.person?.id??null,agentId:t.agentId,text:t.requestText??t.fullMessage??t.messagePreview,now:n}))})}taskCompleted(t){t.taskId&&this.guard("run end",()=>{let n=w(t.agentId,t.channel,t.chatId);this.live.get(n)?.runId===t.taskId&&this.live.delete(n);let o=this.store.byLink("run",t.taskId);if(!o)return;let a=this.now();if(!t.interrupted){if(t.error&&t.errorKind!=="cancelled"){let s=zt(t.error);this.store.needsAttention(o.id,`${t.agentId} ${s}: ${v(t.error)}`,a)&&this.log(`[requests] ${o.id} needs attention: run ${t.taskId} ${s}`);return}o.state==="candidate"?this.store.discardCandidate(o.id):this.store.touch(o.id,a)}})}delegationStarted(t){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let n=this.live.get(w(t.caller,t.origin.channel,t.origin.chatId));if(!n)return;let o=this.now();this.store.link(n.requestId,"delegation",t.id,o),this.store.progress(n.requestId,o,"waiting_other")})}delegationDone(t,n,o){this.guard("delegation end",()=>{let a=this.store.byLink("delegation",t.id);if(!a)return;let s=this.now(),l=t.peer?`${t.callee} on ${t.peer}`:t.callee;if(n==="done"){this.store.progress(a.id,s);return}let d={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[n];this.store.needsAttention(a.id,`The work handed to ${l} ${d}: ${v(o)}`,s)&&this.log(`[requests] ${a.id} needs attention: delegation ${t.id} ${n}`)})}cardRaised(t,n){n&&this.guard("card",()=>{if(!this.settings().enabled)return;let o=this.live.get(w(t.raised_by,n.channel,n.chatId))?.requestId;if(!o)return;let a=this.now();this.store.link(o,"card",t.id,a),this.store.waitOnOwner(o,t.ask,a)})}cardResolved(t){this.guard("card result",()=>{let n=this.store.byLink("card",t.id);if(!n)return;let o=this.now(),a=t.outcome??t.if_silent;t.status==="decided"||a==="approve"?n.state==="waiting_owner"&&this.store.progress(n.id,o):this.store.needsAttention(n.id,`Your answer did not come before the card expired (${v(t.ask)}); "${a}" was applied`,o)&&this.log(`[requests] ${n.id} needs attention: card ${t.id} expired unanswered`)})}closingNote(t){try{let n=this.store.byLink("delegation",t);return!n||!k.includes(n.state)?void 0:`This is part of the owner's open request ${n.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${n.id}", evidence:"<link to the proof>"}. If you will not do it, use decline with the reason. If work goes on, leave it open.`}catch{return}}resumeOutcome(t){this.guard("restart",()=>{let n=this.store.byLink("run",t.taskId);if(!n)return;let o=this.now();t.decision==="resumed"?n.state==="candidate"?this.store.touch(n.id,o):this.store.progress(n.id,o):(t.decision==="reported"||t.decision==="resume-failed"||t.decision==="skipped")&&this.store.needsAttention(n.id,`Cut off by a restart and not picked up again (${v(t.reason)})`,o)&&this.log(`[requests] ${n.id} needs attention: run ${t.taskId} cut off by a restart`)})}}});import{randomBytes as Wt,timingSafeEqual as Kt}from"crypto";import{chmodSync as Xt,existsSync as Gt,mkdirSync as Zt,readFileSync as Yt,writeFileSync as Vt}from"fs";import{dirname as Jt,resolve as Qt}from"path";function ur(r){return Object.assign(r,{[Se]:!0})}function we(r){return!!r&&r[Se]===!0}function en(r=process.cwd()){return Qt(r,".agentx","operator.key")}function cr(r=process.cwd(),t={}){let n=en(r);try{if(Gt(n)){let a=Yt(n,"utf-8").trim();if(a)return a}if(!t.create)return null;let o=Wt(32).toString("hex");return Zt(Jt(n),{recursive:!0}),Vt(n,o+`
39
- `,{mode:384}),Xt(n,384),o}catch{return null}}function pr(r,t){let n=Array.isArray(t)?t[0]:t;if(!r||!n)return!1;let o=Buffer.from(r),a=Buffer.from(n.trim());return o.length===a.length&&Kt(o,a)}var dr,Se,Ee=f(()=>{"use strict";dr="x-agentx-operator",Se=Symbol("requests.operator")});function ke(r,t){let n=t.trim().toLowerCase();return r==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.replace(/^@/,"")}function ve(r){let t=r.indexOf(":");if(t<=0||t===r.length-1)return null;let n=q(r.slice(0,t).trim()),o=ke(n,r.slice(t+1));return o?{channel:n,value:o}:null}function Te(r){let t=new Set,n=new Map;for(let o of r){if(t.has(o.id))return`person "${o.id}" is listed twice`;if(t.add(o.id),o.id===j&&o.role!=="owner")return`the id "${j}" is kept for a person with the owner role`;for(let a of o.identities){let s=ve(a);if(!s)return`identity "${a}" of "${o.id}" must be written channel:id`;let l=`${s.channel}:${s.value}`,d=n.get(l);if(d&&d!==o.id)return`identity "${a}" belongs to both "${d}" and "${o.id}"`;n.set(l,o.id)}}return null}function tn(r,t,n){let o=q(t),s=(o==="whatsapp"?[n?.id]:[n?.id,n?.username]).filter(l=>typeof l=="string"&&!!l).map(l=>ke(o,l)).filter(Boolean);return s.length?r.find(l=>l.identities.some(d=>{let p=ve(d);return!!p&&p.channel===o&&s.includes(p.value)}))??null:null}function nn(r){let t=r.filter(n=>n.role==="owner");return t.length===0?{id:j,role:"owner"}:t.length===1?{id:t[0].id,role:"owner"}:null}function br(r,t){let n=N(t);if(n)return n.person?{id:n.person}:null;if(!t||P(t)!=="human")return null;let o=String(t.channel??"");if(R.has(q(o)))return we(t)?nn(r):null;let a=l=>typeof l=="string"?l:void 0,s=tn(r,o,{id:a(t.senderId),username:a(t.senderUsername)});return s?{id:s.id,role:s.role}:null}var j,q,Re=f(()=>{"use strict";Ue();xe();Ee();j="owner",q=r=>r.toLowerCase().split("@")[0]});var In={};Be(In,{INTEGRATION_KINDS:()=>cn,approvalsConfigSchema:()=>Pe,callsSchema:()=>Oe,cameraBotSchema:()=>Le,daemonConfigSchema:()=>Me,eventSubscriptionSchema:()=>Ce,expandEnvVars:()=>$,loadDaemonConfig:()=>_n,peopleConfigSchema:()=>De,personSchema:()=>qe,requestStatusConfigSchema:()=>Ne,requestsConfigSchema:()=>je,validateWorkspaces:()=>An});import{z as e}from"zod";import{readFileSync as _e,existsSync as A}from"fs";import{resolve as I}from"path";function rn(r){let t=I(r,".env");if(!A(t))return;let n=_e(t,"utf-8");for(let o of n.split(`
40
- `)){let a=o.trim();if(!a||a.startsWith("#"))continue;let s=a.indexOf("=");if(s===-1)continue;let l=a.slice(0,s).trim(),d=a.slice(s+1).trim();process.env[l]||(process.env[l]=d)}}function $(r){if(typeof r=="string")return r.replace(/\$\{(\w+)\}/g,(t,n)=>process.env[n]||"");if(Array.isArray(r))return r.map($);if(r!==null&&typeof r=="object"){let t={};for(let[n,o]of Object.entries(r))t[n]=$(o);return t}return r}function Rn(r,t){let n=[],o=new Set;for(let a of r){let s=a.path.join("."),l=/^channels\.telegram\.accounts\.([^.]+)\.token$/.exec(s);if(l&&a.message.toLowerCase().includes("required")){let d=l[1],p=`tg:${d}`;if(o.has(p))continue;o.add(p),n.push(`Hint: Telegram account "${d}" is enabled but has no bot token.
41
- Either:
42
- A) Open ${t} and set channels.telegram.accounts.${d}.token to your bot token (or "\${TG_${d.toUpperCase()}_BOT_TOKEN}" + the matching .env entry).
43
- B) If you don't need Telegram on this instance, remove the entire "telegram" block under "channels" (or set channels.telegram.enabled to false AND drop accounts.${d}).`)}}return n}function _n(r){let t=r?[r]:[I(process.cwd(),"agentx.json"),I(process.cwd(),".agentx/config.json")];rn(process.cwd());let n,o;for(let d of t)if(A(d)){n=_e(d,"utf-8"),o=d;break}if(!n||!o)throw new Error(`No config found. Create agentx.json or .agentx/config.json
44
- Searched: ${t.join(", ")}`);let a;try{a=JSON.parse(n)}catch(d){throw new Error(`Invalid JSON in ${o}: ${d.message}`)}let s=$(a),l=Me.safeParse(s);if(!l.success){let d=l.error.issues.map(D=>` ${D.path.join(".")}: ${D.message}`).join(`
45
- `),p=Rn(l.error.issues,o),h=p.length?`
46
-
47
- ${p.join(`
48
-
49
- `)}`:"";throw new Error(`Config validation failed (${o}):
50
- ${d}${h}`)}return l.data}function An(r){let t=[];for(let[n,o]of Object.entries(r.agents)){if(!A(o.workspace)){t.push(`Agent "${n}": workspace not found at ${o.workspace}`);continue}if(o.tier==="claude-code"){let l=I(o.workspace,".claude");A(l)||t.push(`Agent "${n}": no .claude/ directory in workspace ${o.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let a=o.provider||"claude",s=r.providers[a];!["claude-code","codex-cli","opencode"].includes(o.tier)&&(!s||!s.apiKey)&&t.push(`Agent "${n}": provider "${a}" has no API key configured. Set providers.${a}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[n,o]of Object.entries(r.crons))r.agents[o.agent]||t.push(`Cron "${n}": references unknown agent "${o.agent}"`);if(r.channels.telegram.enabled)for(let[n,o]of Object.entries(r.channels.telegram.accounts))r.agents[o.agentBinding]||t.push(`Telegram account "${n}": references unknown agent "${o.agentBinding}"`);return t}var on,an,sn,ln,dn,un,cn,Ae,Ie,_,$e,Ce,pn,gn,Le,fn,mn,hn,bn,yn,xn,Sn,wn,En,Oe,kn,vn,Tn,je,qe,De,Ne,Pe,Me,$n=f(()=>{F();W();ee();re();ae();le();ce();Re();on=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),an=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),sn=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),ln=e.union([sn,an]),dn=e.object({tokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),privateAppTokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),apiKeyEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),refreshTokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),clientIdEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),clientSecretEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),auth:e.literal("keyring").optional(),sessionDir:e.string().optional()}).strict(),un=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:dn.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),cn=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],Ae=e.enum(["system","elevenlabs"]),Ie=e.union([e.string(),e.record(e.string(),e.string())]),_=e.string().superRefine((r,t)=>{let n=ne(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${n}`})}),$e=e.object({provider:Ae.optional(),system:Ie.optional(),fallbacks:e.array(e.string().min(1)).optional(),elevenlabsVoiceId:e.string().optional(),gender:e.enum(["female","male","neutral"]).optional(),style:e.string().optional(),intro:e.string().optional(),narrate:e.enum(["off","on","all"]).optional(),rate:e.number().min(.75).max(1.5).optional(),priority:e.enum(["high","normal","low"]).optional(),hotkey:_.optional()}),Ce=e.object({kinds:e.array(e.string().min(1)).min(1),agents:e.array(e.string().min(1)).optional(),nodes:e.array(e.string().min(1)).optional(),match:e.string().min(1).optional(),delivery:e.enum(["pull","digest","wake"]).default("pull"),maxPerHour:e.number().int().min(1).max(60).default(4)}),pn=e.object({name:e.string(),workspace:e.string(),tier:e.enum(["claude-code","codex-cli","opencode","sdk","orchestrator"]).default("claude-code"),provider:e.string().optional(),model:e.string().optional(),systemPrompt:e.string().optional(),mentions:e.array(e.string()).default([]),intents:e.array(e.string()).default([]),maxDelegationDepth:e.number().int().min(0).max(50).default(5),mcp:e.record(e.string(),ln).optional(),codegraph:e.boolean().default(!1),contextStrategy:e.enum(["layered","planner"]).optional(),contextReferences:e.boolean().default(!1),richMessages:e.boolean().default(!0),maxConcurrent:e.number().default(1),maxExecutionMinutes:e.number().int().min(1).max(240).default(20),preSpawnTimeoutSec:e.number().int().min(10).max(3600).default(300),drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),permissionMode:e.string().default("default"),billing:e.enum(["subscription","api"]).default("subscription"),toolUseRequired:e.array(e.string()).default([]),gitlabAutoReply:e.boolean().optional(),persistentProcess:e.boolean().default(!1),queueMode:e.enum(["collect","followup","drop"]).default("collect"),heartbeat:e.object({enabled:e.boolean().default(!1),intervalMinutes:e.number().default(30),prompt:e.string().default("Check inbox, pending tasks, and system health. Report anything that needs attention."),channel:e.string().default("heartbeat")}).default({}),access:e.enum(["private","public"]).default("private"),admin:e.boolean().optional(),subscriptions:e.array(Ce).default([]),integrations:e.array(un).default([]),voice:$e.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(oe).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),gn=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),Le=e.object({frameIntervalSeconds:e.number().int().min(0).max(3600).default(0),maxSessionMinutes:e.number().int().min(1).max(240).default(10),maxFrameEdge:e.number().int().min(160).max(3840).default(1024),keepFrames:e.boolean().default(!1)}).default({}),fn=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),gn).default({}),policy:e.object({dm:e.enum(["pair","block"]).default("pair"),group:e.enum(["mention-required","all"]).default("mention-required"),allowFrom:e.array(e.string()).optional()}).default({})}).default({}),whatsapp:e.object({enabled:e.boolean().default(!1),sessionDir:e.string().default(".agentx/whatsapp-sessions"),defaultAgent:e.string().optional(),allowFrom:e.array(e.string()).optional(),routes:e.array(e.object({contact:e.string().optional(),group:e.string().optional(),agent:e.string()})).default([]),ingest:e.object({enabled:e.boolean().default(!1),mode:e.enum(["metadata-only","messages"]).default("metadata-only"),allowContacts:e.array(e.string()).default([]),allowGroups:e.array(e.string()).default([]),denyContacts:e.array(e.string()).default([]),denyGroups:e.array(e.string()).default([]),messageCap:e.number().int().min(1).max(500).default(50),historyDays:e.number().int().min(1).max(365).default(30),contactRefreshDays:e.number().int().min(1).max(90).default(7),throttle:e.object({minMsBetweenCalls:e.number().int().min(100).default(1500),maxCallsPerMinute:e.number().int().min(1).default(20),maxChatsPerSweep:e.number().int().min(1).default(25)}).default({}),retentionDays:e.number().int().min(0).default(0)}).default({})}).default({}),gitlab:e.object({enabled:e.boolean().default(!1),webhookPort:e.number().default(18810),webhookSecret:e.string().optional(),host:e.string().default("https://gitlab.com"),token:e.string().optional(),autoReplyLegacy:e.boolean().default(!0),routes:e.array(e.object({project:e.string(),agent:e.string()})).default([]),agentMappings:e.array(e.object({agentId:e.string(),gitlabUsernames:e.array(e.string()).default([]),keywords:e.array(e.string()).default([]),token:e.string().optional(),node:e.string().optional()})).default([]),agentUsernamePrefixes:e.array(e.string().min(1)).default([])}).default({}),github:e.object({enabled:e.boolean().default(!1),autoReplyLegacy:e.boolean().default(!0),token:e.string().optional(),tokenFile:e.string().optional(),appId:e.number().optional(),clientId:e.string().optional(),privateKeyFile:e.string().optional(),webhookSecret:e.string().optional(),routes:e.array(e.object({repo:e.string(),agent:e.string()})).default([]),agentMappings:e.array(e.object({agentId:e.string(),githubUsernames:e.array(e.string()).default([]),token:e.string().optional(),tokenFile:e.string().optional(),node:e.string().optional()})).default([])}).default({}),ntfy:e.object({enabled:e.boolean().default(!1),server:e.string().default("https://ntfy.sh"),topic:e.string().optional(),token:e.string().optional(),defaultPriority:e.number().int().min(1).max(5).default(3),defaultTitle:e.string().optional()}).default({}),push:e.object({enabled:e.boolean().default(!1),keysFile:e.string().default(".agentx/push-keys.json"),subject:e.string().regex(/^(mailto:|https:\/\/)/,"must start with mailto: or https://").optional(),relayTo:e.string().optional(),ttlSeconds:e.number().int().min(0).max(2419200).default(86400),keepRecent:e.number().int().min(0).max(1e3).default(50),allowedHosts:e.array(e.string().min(1)).default(["fcm.googleapis.com","push.services.mozilla.com","push.apple.com","notify.windows.com"])}).default({}),webrtc:e.object({enabled:e.boolean().default(!1),stunServers:e.array(e.string()).default(["stun:stun.l.google.com:19302"]),turnServers:e.array(e.object({urls:e.string(),username:e.string().optional(),credential:e.string().optional()})).default([]),allowedCallers:e.array(e.string()).default([]),ringNotify:e.array(e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()})).default([]),callUrlBase:e.string().optional(),bot:e.object({enabled:e.boolean().default(!1),defaultAgentId:e.string().optional(),whisperBackend:e.enum(["auto","mlx","openai"]).default("auto"),whisperModel:e.string().optional(),whisperLanguage:e.string().default("auto"),mlxBinary:e.string().optional(),transcriptChannel:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),maxCallMinutes:e.number().int().min(1).max(240).default(30)}).default({}),camera:e.object({width:e.number().int().min(160).max(3840).default(1280),height:e.number().int().min(120).max(2160).default(720),frameRate:e.number().int().min(1).max(60).default(15),maxSeconds:e.number().int().min(10).max(7200).default(600),bot:Le}).default({})}).default({})}),mn=e.object({enabled:e.boolean().default(!0),schedule:e.string(),timezone:e.string().default("UTC"),agent:e.string(),prompt:e.string().default(""),command:e.string().optional(),timeout:e.number().default(600),model:e.string().optional(),maxOutputTokens:e.number().int().min(50).max(8e3).optional(),autonomy:X.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(r=>Array.isArray(r)?r:[r]),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),fireToken:e.string().optional(),createdBy:e.string().optional(),approval:e.object({action:e.enum(["create","delete"]),requestedBy:e.string(),requestedAt:e.string()}).optional()}).refine(r=>!!(r.command?.trim()||r.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(r=>!(r.command?.trim()&&r.autonomy&&r.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"}),hn=e.object({name:e.string(),triggers:e.array(e.object({pattern:e.string(),channel:e.string().optional()})),allowedContacts:e.array(e.string()).optional(),agent:e.string(),prompt:e.string(),schedule:e.string().optional(),timezone:e.string().default("UTC"),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}),bn=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),yn=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),xn=e.object({enabled:e.boolean().default(!1),peers:e.array(bn).default([]),inboxes:e.array(yn).default([]),discovery:e.enum(["static","mdns"]).default("static"),healthCheck:e.object({interval:e.number().default(60),timeout:e.number().default(10)}).default({}),feed:e.object({enabled:e.boolean().default(!0),skipTypes:e.array(e.string().min(1)).default(["task:step"])}).default({}),delegation:e.object({asyncWhenHuman:e.boolean().default(!0),timeoutMinutes:e.number().int().min(1).max(240).default(30)}).default({})}),Sn=e.object({enabled:e.boolean().default(!1),baseDir:e.string().default(".agentx/graph"),draftAgent:e.string().optional(),reviewAgent:e.string().optional(),autoApproveStructure:e.enum(["strict","extend-leaves","any"]).default("extend-leaves"),autoApproveConfidence:e.number().min(0).max(1).default(1),classifierModel:e.string().default("claude-haiku-4-5-20251001"),retrievalWeights:e.object({graph:e.number().min(0).default(.6),bm25:e.number().min(0).default(.4)}).default({})}).default({}),wn=e.object({mode:e.enum(["off","shadow","active"]).default("off"),backend:e.string().optional(),model:e.string().optional(),timeoutMs:e.number().int().min(100).default(1e4),temperature:e.number().min(.01).default(1),explore:e.number().min(0).max(1).default(.15),holdout:e.number().min(0).max(1).optional()}).default({}),En=e.object({enabled:e.boolean().default(!1),dbPath:e.string().default(".agentx/decisions/decisions.sqlite"),redactState:e.boolean().default(!1),keepStateRows:e.number().int().min(0).default(2e3),defaultBackend:e.string().default("local"),backends:e.object({local:e.object({provider:e.string().default("claude-code"),model:e.string().default("claude-haiku-4-5-20251001"),structureMode:e.enum(["auto","tool","text"]).default("auto"),normalizeProbabilities:e.boolean().default(!0),nRetryMalformedStructure:e.number().int().min(0).max(3).default(1),maxStateChars:e.number().int().min(500).default(24e3)}).default({}),simpleJev:e.object({baseUrl:e.string().default("http://127.0.0.1:8000/v1"),model:e.string().optional(),apiKeyEnv:e.string().optional(),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(6e3),maxChoiceOptions:e.number().int().min(2).max(255).default(50)}).default({}),jev:e.object({baseUrl:e.string().default("https://openrouter.ai/api/alpha"),path:e.string().default("/decisions"),model:e.string().default("jev-latest"),apiKeyEnv:e.string().default("OPENROUTER_API_KEY"),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(9e4),maxChoiceOptions:e.number().int().min(2).max(255).default(255)}).default({}),typesafe:e.object({baseUrl:e.string().default("https://api.typesafe.ai/v1"),path:e.string().default("/systemone"),model:e.string().default("jev-latest"),apiKeyEnv:e.string().default("TYPESAFE_API_KEY"),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(9e4),maxChoiceOptions:e.number().int().min(2).max(255).default(255)}).default({})}).default({}),seats:e.record(e.string(),wn).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),Oe=e.object({allow:e.array(e.string()).default([]),maxPerHour:e.number().int().min(1).max(60).default(3),ringSeconds:e.number().int().min(10).max(300).default(45),maxCallMinutes:e.number().int().min(1).max(240).default(30),ringSound:e.string().regex(/^[\w -]+$/).default("Submarine"),summary:e.boolean().default(!0)}).default({}),kn=e.object({longTaskThreshold:e.number().default(30),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),channel:e.string().optional(),on:e.object({taskComplete:e.boolean().default(!0),taskError:e.boolean().default(!0),taskQueued:e.boolean().default(!1)}).default({}),local:e.object({banner:e.boolean().default(!0),sound:e.boolean().default(!0),soundName:e.string().regex(/^[\w -]+$/).default("Glass"),volume:e.number().min(0).max(1).default(.4),icon:e.string().optional()}).default({})}).default({}),vn=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Tn=e.object({maxPixels:e.number().int().positive().default(12e5),timeoutMs:e.number().int().positive().default(5e3),intervalMs:e.number().int().positive().default(100),changeThreshold:e.number().min(0).max(1).default(.015),stableMs:e.number().int().nonnegative().default(400),regions:e.record(e.string().regex(/^[a-z][\w-]*$/),vn).default({}),buffer:e.object({enabled:e.boolean().default(!1),seconds:e.number().positive().max(120).default(10),fps:e.number().positive().max(10).default(2),region:e.string().default("screen"),maxPixels:e.number().int().positive().default(3e5)}).default({})}).default({}),je=e.object({enabled:e.boolean().default(!1),channels:e.array(e.string().min(1)).default([]),from:e.array(e.string().regex(/^[a-z0-9_-]+:\S+$/i,"use channel:id, for example telegram:123456789")).default([]),staleAfterHours:e.number().positive().max(24*365).default(24),retentionDays:e.number().positive().max(3650).default(90)}).default({}),qe=e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]{0,39}$/,"lower-case letters, digits, - and _"),name:e.string().min(1).max(80),role:e.enum(["owner","member","guest"]).default("member"),identities:e.array(e.string().regex(/^[A-Za-z][\w-]*:\S.*$/,"write it as channel:id")).default([])}),De=e.array(qe).default([]).superRefine((r,t)=>{let n=Te(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:n})}),Ne=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),Pe=e.object({defaultExpiryDays:e.number().positive().max(365).default(3),maxExpiryDays:e.number().positive().max(365).default(30),laterHours:e.number().positive().max(24*30).default(24),notifyAgent:e.boolean().default(!0),digest:e.object({enabled:e.boolean().default(!0),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}).default({}),popup:e.object({enabled:e.boolean().default(!1),style:e.enum(["card","dialog"]).default("card"),theme:e.enum(["system","light","dark"]).default("system"),speak:e.boolean().default(!0),voice:e.string().regex(/^[\w .()-]+$/,"a voice name, as `say -v '?'` lists them").optional(),sound:e.string().regex(/^[\w -]*$/,"a sound name, like chime or Glass").default("chime"),volume:e.number().min(0).max(1).default(.4),timeoutSeconds:e.number().int().min(10).max(3600).default(600)}).default({}),checkin:e.object({enabled:e.boolean().default(!1),times:e.array(e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour")).default(["11:00","14:00","17:00"]),dailyAt:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),lists:e.array(e.string().min(1)).default(["Reminders"]),agent:e.string().min(1).optional(),dueWithinHours:e.number().positive().max(24*30).default(24),maxAsksPerPass:e.number().int().min(1).max(20).default(5),composeTimeoutSeconds:e.number().int().min(30).max(3600).default(300)}).default({})}).default({}),Me=e.object({node:e.object({id:e.string(),name:e.string(),bind:e.string().default("127.0.0.1:18800"),defaultAgent:e.string().optional()}),providers:e.record(e.string(),on).default({}),agents:e.record(e.string(),pn).default({}),channels:fn.default({}),crons:e.record(e.string(),mn).default({}),services:e.record(e.string(),hn).default({}),notifications:kn,calls:Oe,whatsappTriage:ue,approvals:Pe,shutdown:e.object({drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),restart:e.object({allowBy:e.string().optional(),window:e.string().regex(/^\d{1,2}:\d{2}$/,"window must be HH:MM").optional(),windowWaitMinutes:e.number().int().min(1).max(1440).default(180),forbidOnTimeoutRestart:e.boolean().default(!1)}).default({})}).default({}),resume:e.object({enabled:e.boolean().default(!0),maxAgeMinutes:e.number().int().positive().default(30),maxAttempts:e.number().int().min(0).default(1),reportOnlyChannels:e.array(e.string()).default([]),directChannels:e.array(e.string()).default([]),crashLoop:e.object({restarts:e.number().int().positive().default(3),windowMinutes:e.number().positive().default(10)}).default({})}).default({}),requests:je,people:De,requestStatus:Ne,reminders:e.object({enabled:e.boolean().default(!1),lists:e.array(e.string().min(1)).default(["AgentX"]),pollSeconds:e.number().int().min(15).default(60),lookbackHours:e.number().positive().default(24),command:e.string().min(1).default("remindctl")}).default({}),demo:e.object({startupTimeoutSeconds:e.number().int().positive().max(3600).optional()}).default({}),events:e.object({ringSize:e.number().int().min(1).max(1e5).default(1e3)}).default({}),screen:Tn,mesh:xn.default({}),meshVoices:e.record(e.string(),$e.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:Ae.default("system"),fallback:e.enum(["system","none"]).default("system"),system:Ie.optional(),locale:e.string().default("en"),listener:e.string().optional(),stt:e.enum(["auto","elevenlabs","local"]).default("auto"),allowUnmeasured:e.boolean().default(!1),spokenMaxChars:e.number().int().min(300).max(1500).default(L),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:_.default(E.talk),stop:_.default(E.stop),paste:_.default(E.paste)}).default({}),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:U.optional(),boards:H,dashboard:z,graph:Sn,decisions:En,workflows:e.object({enabled:e.boolean().default(!1),dir:e.string().default(".agentx/workflows"),n8n:e.object({baseUrl:e.string().default(""),apiKey:e.string().default("")}).default({baseUrl:"",apiKey:""}),matching:e.object({enabled:e.boolean().default(!1),mode:e.enum(["suggest","auto"]).default("suggest"),autoRunThreshold:e.number().min(0).max(1).default(.85),suggestThreshold:e.number().min(0).max(1).default(.65)}).default({}),editor:e.enum(["disabled","readonly","edit"]).default("edit")}).default({}),procedures:e.object({enabled:e.boolean().default(!0),dir:e.string().default(".agentx/procedures"),extraction:e.object({enabled:e.boolean().default(!1),onTaskCompletion:e.boolean().default(!1),minOccurrences:e.number().int().min(2).default(3),sinceDays:e.number().int().min(1).default(7),maxClusters:e.number().int().min(1).default(5),via:e.string().optional()}).default({}),injection:e.object({enabled:e.boolean().default(!0),maxProcedures:e.number().int().min(1).default(2),minScore:e.number().min(0).max(1).default(.5)}).default({})}).default({}),webhooks:e.array(e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]*$/,"webhook id must be lowercase slug"),source:e.string().min(1),agentId:e.string(),secretEnv:e.string().optional(),description:e.string().optional(),enabled:e.boolean().default(!0),node:e.string().optional(),triggers:e.record(e.string(),e.string()).optional(),defaultWorkflow:e.string().optional()})).default([]),session:e.object({staleMinutes:e.number().int().min(1).max(1440).default(720),maxTurnsPerSession:e.number().int().min(2).max(200).default(40),tierTwoThresholdTokens:e.number().int().min(5e4).max(2e5).default(18e4),contextStrategy:e.enum(["layered","planner"]).default("layered"),maxClaudeCodeDispatchesPerHour:e.number().int().min(1).max(1e4).default(80),maxClaudeCodeDispatchesPer5h:e.number().int().min(1).max(5e4).default(180),continuityStateTurns:e.number().int().min(0).max(5).default(0)}).default({}),plugins:e.array(e.string()).default([]),processPool:e.object({maxIdleSeconds:e.number().int().min(5).max(86400).default(30),maxAgeSeconds:e.number().int().min(60).max(86400).default(2700),sweepIntervalSeconds:e.number().int().min(1).max(300).default(5)}).default({})})});export{jn as a,qn as b,W as c,X as d,Pn as e,Mn as f,Bn as g,ee as h,Lt as i,Fn as j,E as k,re as l,S as m,oe as n,jt as o,zn as p,ae as q,se as r,ie as s,Gn as t,le as u,ue as v,ce as w,k as x,m as y,Qn as z,ge as A,fe as B,nr as C,rr as D,R as E,or as F,he as G,xe as H,dr as I,ur as J,we as K,cr as L,pr as M,Ee as N,j as O,ve as P,br as Q,Re as R,cn as S,Ce as T,Le as U,Oe as V,je as W,qe as X,De as Y,Ne as Z,Pe as _,Me as $,$ as aa,_n as ba,An as ca,In as da,$n as ea};
51
- //# sourceMappingURL=chunk-VQN36LEB.js.map