botmancers 0.6.1 → 0.7.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 (244) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +13 -12
  3. package/app/.next/BUILD_ID +1 -1
  4. package/app/.next/app-path-routes-manifest.json +0 -2
  5. package/app/.next/build-manifest.json +3 -3
  6. package/app/.next/prerender-manifest.json +4 -4
  7. package/app/.next/required-server-files.json +2 -2
  8. package/app/.next/routes-manifest.json +0 -12
  9. package/app/.next/server/app/_global-error.html +1 -1
  10. package/app/.next/server/app/_global-error.rsc +1 -1
  11. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/_not-found.html +1 -1
  17. package/app/.next/server/app/_not-found.rsc +2 -2
  18. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  19. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  20. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/app/.next/server/app/api/bots/[id]/config/route.js.nft.json +1 -1
  22. package/app/.next/server/app/api/bots/[id]/sessions/[ref]/pins/route.js +2 -2
  23. package/app/.next/server/app/api/bots/[id]/sessions/[ref]/pins/route.js.nft.json +1 -1
  24. package/app/.next/server/app/api/bots/[id]/sessions/[ref]/route.js.nft.json +1 -1
  25. package/app/.next/server/app/api/bots/[id]/sessions/[ref]/shares/route.js +3 -3
  26. package/app/.next/server/app/api/bots/[id]/sessions/[ref]/shares/route.js.nft.json +1 -1
  27. package/app/.next/server/app/api/bots/[id]/sessions/route.js +2 -2
  28. package/app/.next/server/app/api/bots/[id]/sessions/route.js.nft.json +1 -1
  29. package/app/.next/server/app/api/bots/[id]/share-policy/route.js +3 -3
  30. package/app/.next/server/app/api/bots/[id]/share-policy/route.js.nft.json +1 -1
  31. package/app/.next/server/app/api/bots/[id]/skill/route.js.nft.json +1 -1
  32. package/app/.next/server/app/api/bots/availability/route.js +3 -2
  33. package/app/.next/server/app/api/bots/availability/route.js.nft.json +1 -1
  34. package/app/.next/server/app/api/bots/delete-preview/route.js.nft.json +1 -1
  35. package/app/.next/server/app/api/bots/import/route.js.nft.json +1 -1
  36. package/app/.next/server/app/api/bots/manage/route.js.nft.json +1 -1
  37. package/app/.next/server/app/api/bots/name-migrations/route.js.nft.json +1 -1
  38. package/app/.next/server/app/api/bots/route.js +5 -5
  39. package/app/.next/server/app/api/bots/route.js.nft.json +1 -1
  40. package/app/.next/server/app/api/conversations/[id]/approve/route.js.nft.json +1 -1
  41. package/app/.next/server/app/api/conversations/[id]/deny/route.js.nft.json +1 -1
  42. package/app/.next/server/app/api/conversations/[id]/draft/route.js.nft.json +1 -1
  43. package/app/.next/server/app/api/conversations/[id]/messages/[messageId]/stop/route.js.nft.json +1 -1
  44. package/app/.next/server/app/api/conversations/[id]/messages/route.js +5 -5
  45. package/app/.next/server/app/api/conversations/[id]/messages/route.js.nft.json +1 -1
  46. package/app/.next/server/app/api/conversations/[id]/route.js.nft.json +1 -1
  47. package/app/.next/server/app/api/conversations/[id]/stop/route.js +5 -5
  48. package/app/.next/server/app/api/conversations/[id]/stop/route.js.nft.json +1 -1
  49. package/app/.next/server/app/api/conversations/route.js.nft.json +1 -1
  50. package/app/.next/server/app/api/exchanges/[id]/cancel/route.js +2 -2
  51. package/app/.next/server/app/api/exchanges/[id]/cancel/route.js.nft.json +1 -1
  52. package/app/.next/server/app/api/exchanges/[id]/route.js +3 -3
  53. package/app/.next/server/app/api/exchanges/[id]/route.js.nft.json +1 -1
  54. package/app/.next/server/app/api/exchanges/route.js +3 -3
  55. package/app/.next/server/app/api/exchanges/route.js.nft.json +1 -1
  56. package/app/.next/server/app/api/files/[name]/route.js.nft.json +1 -1
  57. package/app/.next/server/app/api/groups/route.js.nft.json +1 -1
  58. package/app/.next/server/app/api/health/route.js +3 -3
  59. package/app/.next/server/app/api/health/route.js.nft.json +1 -1
  60. package/app/.next/server/app/api/mcp/route.js.nft.json +1 -1
  61. package/app/.next/server/app/api/messages/[id]/between/route.js.nft.json +1 -1
  62. package/app/.next/server/app/api/runtime-connections/route.js.nft.json +1 -1
  63. package/app/.next/server/app/api/service-grants/route.js.nft.json +1 -1
  64. package/app/.next/server/app/api/shares/[shareRef]/revoke/route.js +3 -3
  65. package/app/.next/server/app/api/shares/[shareRef]/revoke/route.js.nft.json +1 -1
  66. package/app/.next/server/app/api/shares/route.js +3 -3
  67. package/app/.next/server/app/api/shares/route.js.nft.json +1 -1
  68. package/app/.next/server/app/api/v0/agents/[agentId]/conversations/[conversationId]/route.js +3 -3
  69. package/app/.next/server/app/api/v0/agents/[agentId]/conversations/[conversationId]/route.js.nft.json +1 -1
  70. package/app/.next/server/app/api/v0/agents/[agentId]/conversations/route.js +3 -3
  71. package/app/.next/server/app/api/v0/agents/[agentId]/conversations/route.js.nft.json +1 -1
  72. package/app/.next/server/app/api/v0/agents/[agentId]/messages/route.js +2 -2
  73. package/app/.next/server/app/api/v0/agents/[agentId]/messages/route.js.nft.json +1 -1
  74. package/app/.next/server/app/api/v0/agents/[agentId]/pins/route.js +3 -3
  75. package/app/.next/server/app/api/v0/agents/[agentId]/pins/route.js.nft.json +1 -1
  76. package/app/.next/server/app/api/v0/agents/[agentId]/route.js +3 -3
  77. package/app/.next/server/app/api/v0/agents/[agentId]/route.js.nft.json +1 -1
  78. package/app/.next/server/app/api/v0/agents/[agentId]/sessions/[ref]/route.js +3 -3
  79. package/app/.next/server/app/api/v0/agents/[agentId]/sessions/[ref]/route.js.nft.json +1 -1
  80. package/app/.next/server/app/api/v0/agents/[agentId]/sessions/route.js +3 -3
  81. package/app/.next/server/app/api/v0/agents/[agentId]/sessions/route.js.nft.json +1 -1
  82. package/app/.next/server/app/api/v0/agents/route.js +3 -3
  83. package/app/.next/server/app/api/v0/agents/route.js.nft.json +1 -1
  84. package/app/.next/server/app/api/v0/capabilities/route.js +3 -3
  85. package/app/.next/server/app/api/v0/capabilities/route.js.nft.json +1 -1
  86. package/app/.next/server/app/api/v0/conversations/[id]/route.js +2 -2
  87. package/app/.next/server/app/api/v0/conversations/[id]/route.js.nft.json +1 -1
  88. package/app/.next/server/app/api/v0/exchanges/[id]/cancel/route.js +3 -3
  89. package/app/.next/server/app/api/v0/exchanges/[id]/cancel/route.js.nft.json +1 -1
  90. package/app/.next/server/app/api/v0/exchanges/[id]/route.js +3 -3
  91. package/app/.next/server/app/api/v0/exchanges/[id]/route.js.nft.json +1 -1
  92. package/app/.next/server/app/api/v0/exchanges/route.js +3 -3
  93. package/app/.next/server/app/api/v0/exchanges/route.js.nft.json +1 -1
  94. package/app/.next/server/app/api/v0/mcp/route.js +3 -3
  95. package/app/.next/server/app/api/v0/mcp/route.js.nft.json +1 -1
  96. package/app/.next/server/app/api/v0/pins/[pinRef]/detach/route.js +3 -3
  97. package/app/.next/server/app/api/v0/pins/[pinRef]/detach/route.js.nft.json +1 -1
  98. package/app/.next/server/app/api/v0/pins/[pinRef]/messages/route.js +3 -3
  99. package/app/.next/server/app/api/v0/pins/[pinRef]/messages/route.js.nft.json +1 -1
  100. package/app/.next/server/app/api/v0/pins/[pinRef]/route.js +3 -3
  101. package/app/.next/server/app/api/v0/pins/[pinRef]/route.js.nft.json +1 -1
  102. package/app/.next/server/app/api/v0/requests/[id]/route.js +2 -2
  103. package/app/.next/server/app/api/v0/requests/[id]/route.js.nft.json +1 -1
  104. package/app/.next/server/app/api/v0/sessions/[ref]/messages/route.js +3 -3
  105. package/app/.next/server/app/api/v0/sessions/[ref]/messages/route.js.nft.json +1 -1
  106. package/app/.next/server/app/api/v0/sessions/[ref]/pins/route.js +3 -3
  107. package/app/.next/server/app/api/v0/sessions/[ref]/pins/route.js.nft.json +1 -1
  108. package/app/.next/server/app/api/v0/sessions/[ref]/shares/route.js +3 -3
  109. package/app/.next/server/app/api/v0/sessions/[ref]/shares/route.js.nft.json +1 -1
  110. package/app/.next/server/app/api/v0/shares/[shareRef]/revoke/route.js +3 -3
  111. package/app/.next/server/app/api/v0/shares/[shareRef]/revoke/route.js.nft.json +1 -1
  112. package/app/.next/server/app/api/v0/shares/[shareRef]/route.js +3 -3
  113. package/app/.next/server/app/api/v0/shares/[shareRef]/route.js.nft.json +1 -1
  114. package/app/.next/server/app/api/v0/shares/current/route.js +3 -3
  115. package/app/.next/server/app/api/v0/shares/current/route.js.nft.json +1 -1
  116. package/app/.next/server/app/api/v0/shares/route.js +3 -3
  117. package/app/.next/server/app/api/v0/shares/route.js.nft.json +1 -1
  118. package/app/.next/server/app/api/wake-grants/[id]/revoke/route.js +2 -2
  119. package/app/.next/server/app/api/wake-grants/[id]/revoke/route.js.nft.json +1 -1
  120. package/app/.next/server/app/api/wakes/[id]/decision/route.js +2 -2
  121. package/app/.next/server/app/api/wakes/[id]/decision/route.js.nft.json +1 -1
  122. package/app/.next/server/app/api/wakes/[id]/retry/route.js +2 -2
  123. package/app/.next/server/app/api/wakes/[id]/retry/route.js.nft.json +1 -1
  124. package/app/.next/server/app/bots/[id]/config/page.js.nft.json +1 -1
  125. package/app/.next/server/app/bots/[id]/config/page_client-reference-manifest.js +1 -1
  126. package/app/.next/server/app/exchanges/page.js.nft.json +1 -1
  127. package/app/.next/server/app/exchanges/page_client-reference-manifest.js +1 -1
  128. package/app/.next/server/app/exchanges.html +1 -1
  129. package/app/.next/server/app/exchanges.rsc +3 -3
  130. package/app/.next/server/app/exchanges.segments/_full.segment.rsc +3 -3
  131. package/app/.next/server/app/exchanges.segments/_tree.segment.rsc +2 -2
  132. package/app/.next/server/app/exchanges.segments/exchanges/__PAGE__.segment.rsc +3 -3
  133. package/app/.next/server/app/index.html +1 -1
  134. package/app/.next/server/app/index.rsc +3 -3
  135. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  136. package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
  137. package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  138. package/app/.next/server/app/page.js.nft.json +1 -1
  139. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  140. package/app/.next/server/app/settings/page.js.nft.json +1 -1
  141. package/app/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  142. package/app/.next/server/app/settings.html +1 -1
  143. package/app/.next/server/app/settings.rsc +3 -3
  144. package/app/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  145. package/app/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  146. package/app/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +3 -3
  147. package/app/.next/server/app/threads/[id]/page.js.nft.json +1 -1
  148. package/app/.next/server/app/threads/[id]/page_client-reference-manifest.js +1 -1
  149. package/app/.next/server/app-paths-manifest.json +0 -2
  150. package/app/.next/server/chunks/[root-of-the-server]__0792yb1._.js +44 -0
  151. package/app/.next/server/chunks/[root-of-the-server]__0d3fjix._.js +1 -1
  152. package/app/.next/server/chunks/[root-of-the-server]__0mp8bap._.js +1 -1
  153. package/app/.next/server/chunks/[root-of-the-server]__0qaiqut._.js +4 -4
  154. package/app/.next/server/chunks/[root-of-the-server]__0zrx1iz._.js +1 -1
  155. package/app/.next/server/chunks/[root-of-the-server]__10b5-i-._.js +1 -1
  156. package/app/.next/server/chunks/[root-of-the-server]__17mum5-._.js +1 -1
  157. package/app/.next/server/chunks/[root-of-the-server]__17xl_55._.js +1 -1
  158. package/app/.next/server/chunks/[root-of-the-server]__1j8fg_n._.js +3 -0
  159. package/app/.next/server/chunks/[root-of-the-server]__1x8phwp._.js +44 -0
  160. package/app/.next/server/chunks/[root-of-the-server]__200ep0k._.js +1 -1
  161. package/app/.next/server/chunks/_0061c2q._.js +1 -1
  162. package/app/.next/server/chunks/_057h7zr._.js +3 -0
  163. package/app/.next/server/chunks/_0a2do3x._.js +1 -1
  164. package/app/.next/server/chunks/_1-5mthb._.js +1 -1
  165. package/app/.next/server/chunks/lib_0-opbv7._.js +316 -0
  166. package/app/.next/server/chunks/lib_0aejojj._.js +316 -0
  167. package/app/.next/server/chunks/lib_0il0ml1._.js +316 -0
  168. package/app/.next/server/chunks/lib_0iujsdg._.js +316 -0
  169. package/app/.next/server/chunks/lib_0kik6bx._.js +20 -20
  170. package/app/.next/server/chunks/lib_0pe3tiv._.js +20 -20
  171. package/app/.next/server/chunks/lib_15adnlz._.js +109 -126
  172. package/app/.next/server/chunks/lib_1dehbst._.js +316 -0
  173. package/app/.next/server/chunks/lib_1z4vnh4._.js +316 -0
  174. package/app/.next/server/chunks/lib_1zc7-gl._.js +109 -126
  175. package/app/.next/server/chunks/lib_db_ts_1ttuckb._.js +58 -56
  176. package/app/.next/server/chunks/ssr/_0_fa0na._.js +1 -1
  177. package/app/.next/server/chunks/ssr/_0a6r_bx._.js +3 -0
  178. package/app/.next/server/chunks/ssr/_14d-lxn._.js +3 -0
  179. package/app/.next/server/chunks/ssr/_1cvuhjt._.js +1 -1
  180. package/app/.next/server/chunks/ssr/_1is_iwu._.js +3 -0
  181. package/app/.next/server/chunks/ssr/_1n5mvo5._.js +1 -1
  182. package/app/.next/server/chunks/ssr/_1o94bnv._.js +1 -1
  183. package/app/.next/server/chunks/ssr/app_bots_[id]_config_page_tsx_1e0uue9._.js +1 -1
  184. package/app/.next/server/middleware-build-manifest.js +3 -3
  185. package/app/.next/server/pages/404.html +1 -1
  186. package/app/.next/server/pages/500.html +1 -1
  187. package/app/.next/server/server-reference-manifest.js +1 -1
  188. package/app/.next/server/server-reference-manifest.json +1 -1
  189. package/app/.next/static/chunks/{22xbkclbkct3s.js → 1ouuczm-gmvxs.js} +1 -1
  190. package/app/.next/static/chunks/{2c953okoei6ip.js → 1w72fds3-utrx.js} +1 -1
  191. package/app/.next/static/chunks/2095-o17ji0fs.css +3 -0
  192. package/app/.next/static/chunks/2q-tgwkalrnms.js +1 -0
  193. package/app/.next/static/chunks/34bv9o9bjkwk0.js +3 -0
  194. package/app/.next/static/chunks/3rwwunh5sdjzg.js +1 -0
  195. package/app/.next/static/chunks/3whw2-l4a2sli.js +1 -0
  196. package/app/.next/static/chunks/3z3mn526_3fwd.js +1 -0
  197. package/app/BUILD_INFO.json +2 -2
  198. package/app/package.json +1 -1
  199. package/app/server.js +1 -1
  200. package/dist/cli.d.ts +1 -1
  201. package/dist/cli.js +2 -2
  202. package/dist/product.d.ts +0 -1
  203. package/dist/product.js +12 -22
  204. package/dist/setup.js +9 -9
  205. package/package.json +1 -2
  206. package/schemas/botmancers.mcp.v2.tools.json +3 -3
  207. package/app/.next/server/app/api/agent-deck/decks/route/app-paths-manifest.json +0 -3
  208. package/app/.next/server/app/api/agent-deck/decks/route/build-manifest.json +0 -12
  209. package/app/.next/server/app/api/agent-deck/decks/route/server-reference-manifest.json +0 -4
  210. package/app/.next/server/app/api/agent-deck/decks/route.js +0 -9
  211. package/app/.next/server/app/api/agent-deck/decks/route.js.nft.json +0 -1
  212. package/app/.next/server/app/api/agent-deck/decks/route_client-reference-manifest.js +0 -3
  213. package/app/.next/server/app/api/agent-deck/settings/route/app-paths-manifest.json +0 -3
  214. package/app/.next/server/app/api/agent-deck/settings/route/build-manifest.json +0 -12
  215. package/app/.next/server/app/api/agent-deck/settings/route/server-reference-manifest.json +0 -4
  216. package/app/.next/server/app/api/agent-deck/settings/route.js +0 -9
  217. package/app/.next/server/app/api/agent-deck/settings/route.js.nft.json +0 -1
  218. package/app/.next/server/app/api/agent-deck/settings/route_client-reference-manifest.js +0 -3
  219. package/app/.next/server/chunks/[root-of-the-server]__0j4pjyg._.js +0 -3
  220. package/app/.next/server/chunks/[root-of-the-server]__0mo_kn3._.js +0 -48
  221. package/app/.next/server/chunks/[root-of-the-server]__1bhzfu_._.js +0 -7
  222. package/app/.next/server/chunks/[root-of-the-server]__1g_n99l._.js +0 -3
  223. package/app/.next/server/chunks/[root-of-the-server]__1t4ybp2._.js +0 -48
  224. package/app/.next/server/chunks/_next-internal_server_app_api_agent-deck_decks_route_actions_0yguyfv.js +0 -3
  225. package/app/.next/server/chunks/_next-internal_server_app_api_agent-deck_settings_route_actions_0z_nbkb.js +0 -3
  226. package/app/.next/server/chunks/lib_0v4d9w0._.js +0 -339
  227. package/app/.next/server/chunks/lib_0zzo6zb._.js +0 -339
  228. package/app/.next/server/chunks/lib_1_u7n-u._.js +0 -339
  229. package/app/.next/server/chunks/lib_1muhwn7._.js +0 -339
  230. package/app/.next/server/chunks/lib_1xnxg-q._.js +0 -339
  231. package/app/.next/server/chunks/ssr/_1i02yyi._.js +0 -3
  232. package/app/.next/server/chunks/ssr/app_components_AgentDeckRuntime_tsx_024janf._.js +0 -3
  233. package/app/.next/server/chunks/ssr/app_settings_page_tsx_1t-rdz-._.js +0 -3
  234. package/app/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_1ztp13a._.js +0 -3
  235. package/app/.next/static/chunks/0jon21u-9j2aw.css +0 -3
  236. package/app/.next/static/chunks/14k6cvywgknx2.js +0 -3
  237. package/app/.next/static/chunks/1ku9himlsx-hn.js +0 -1
  238. package/app/.next/static/chunks/1r5tqd-7h1xjn.js +0 -1
  239. package/app/.next/static/chunks/21aqekm5z0j47.js +0 -1
  240. package/app/.next/static/chunks/2t_2gf3xoxz_m.js +0 -1
  241. package/app/.next/static/chunks/34vnvo1qssbaj.js +0 -1
  242. /package/app/.next/static/{_yrIZIFsIbXA0Gaxkytjd → A9sQnaf9i6YzjHNoPgRfU}/_buildManifest.js +0 -0
  243. /package/app/.next/static/{_yrIZIFsIbXA0Gaxkytjd → A9sQnaf9i6YzjHNoPgRfU}/_clientMiddlewareManifest.js +0 -0
  244. /package/app/.next/static/{_yrIZIFsIbXA0Gaxkytjd → A9sQnaf9i6YzjHNoPgRfU}/_ssgManifest.js +0 -0
@@ -1,23 +1,23 @@
1
- module.exports=[52694,e=>{"use strict";var t=e.i(22734),n=e.i(62294),r=e.i(57147),i=e.i(43084),o=e.i(25211),a=e.i(3620),s=e.i(85072),d=e.i(1912),l=e.i(10860),u=e.i(38636),c=e.i(51749),f=e.i(77099),p=e.i(2803),m=e.i(51714),g=e.i(15467),_=e.i(88355),h=e.i(64909),v=e.i(39229),y=e.i(45383),b=e.i(64974),k=e.i(62349),E=e.i(67505);let w="[Delegation limit] Depth limit reached (max 3 handoffs). No further handoff.",S="[Delegation limit] Budget limit reached (max 12 delegated turns per user message). No further delegated turn.",A="hermes-gateway",T="agent-deck",R=new Map;function I(e,t){let n=R.get(e);n||(n=new Set,R.set(e,n)),n.add(t)}function $(e,t){let n=R.get(e);n&&(n.delete(t),0===n.size&&R.delete(e))}function C(e,t,n){if(!t||t.stopped)return;let i=t.popCaller(n);i&&r.uiTurns.enqueue(e.conversation_id,i,{reason:"report_back",parentRequestId:e.id})}function D(e,t){r.uiTurns.enqueue(e.conversation_id,t,{reason:"handoff",parentRequestId:e.id,delegated:!0})}function N(e){let t=[...n.messages.getByConversation(e)].reverse().find(e=>"user"===e.sender_type);if(!t)return!1;let r=(0,i.existingChain)(e,t.id);return!!r&&r.stopped}function q(e){let t=[...n.messages.getByConversation(e)].reverse().find(e=>"user"===e.sender_type);if(!t)return!1;let r=(0,i.existingChain)(e,t.id);return!!r&&r.turns>=12}function x(e,t,r){if(!r||!function(e,t){if(!t)return!1;let n=e.findIndex(e=>e.id===t.id);return n>=0&&!e.slice(n+1).some(e=>"bot"===e.sender_type)}(t,r))return!1;let i=n.conversations.getById(e);return i?.type!=="bot"||null===H(r.content)&&null===U(r.content)}let M=new Set,P=new Set;function O(e,t){N(e)||q(e)||r.uiTurns.countPending(e)>0||(r.uiTurns.enqueue(e,t,{reason:"tick"}),K())}function W(e){e.fired||M.has(e.id)||N(e.conversation_id)||q(e.conversation_id)||r.uiTurns.countPending(e.conversation_id)>0||(M.add(e.id),setTimeout(()=>{M.delete(e.id),O(e.conversation_id,e.bot_id)},Math.max(0,e.due_at-Date.now())))}function B(e){P.has(e.id)||N(e.conversation_id)||q(e.conversation_id)||r.uiTurns.countPending(e.conversation_id)>0||(P.add(e.id),setTimeout(()=>{P.delete(e.id),O(e.conversation_id,e.bot_id)},Math.max(0,e.next_due_at-Date.now())))}function F(){for(let e of n.oneShots.unfired())W(e);for(let e of n.routines.all())B(e)}function H(e){let t=e.trim().match(/^reply with the word (\S+?)\.?$/i);return t&&t[1].replace(/^[`"'"]+|[`"'"]+$/g,"")||null}function U(e){let t=e.trim().match(/^set a one-shot(?: in (\d+) seconds?)?\.?$/i);return t?t[1]?1e3*Number(t[1]):6e4:null}let L="1"!==process.env.BOTMANCERS_NO_AUTOPROCESS;function K(){L&&setImmediate(()=>en())}let j=!1,z=new Map;function Y(e,t,n,r=null,i=function(e){return"hermes-gateway"===(0,k.agentTransport)((0,k.resolveAgent)(e).agent)?A:T}(t)){let o=(0,u.buildSnapshotInput)(t,n,r);z.set(e.id,{json:JSON.stringify(o),hash:(0,u.hashSnapshot)(o),transport:i})}function J(e){let t=z.get(e.id);if(z.delete(e.id),t)try{n.launchSnapshots.record(e.id,e.bot_id,t.hash,t.json,t.transport)}catch(e){console.error("Error recording launch snapshot:",e)}}function Q(e){z.delete(e.id)}function V(e,t,r){n.messages.create(e.conversation_id,"bot",function(e){let t=(0,k.resolveAgent)(e);switch(t.launch_blocker){case"session_scope":return`[Session scope needed] ${e.name} cannot launch: select its session scope in Config.`;case"direct_runtime":return`[Direct launch unavailable] ${e.name} is registered for direct launch; direct ${(0,k.agentLabel)(t.agent)} sessions are not available in this Botmancers version yet.`;case"agent":return`[Launch blocked] ${e.name} has an unsupported Agent type.`;default:var n,r;let i;return n=e.name,i=(r=t.deck_name)?` (legacy deck "${r}")`:"",`[Deck needs selection] ${n} cannot launch: no Agent Deck is selected${i}. Select a deck, or choose the Direct launch profile in Config, before launching.`}}(t),t.id),C(e,r,t.id),K()}async function Z(e){let t,i,{item:o,bot:a,conversationMessages:s,latestUser:d,chain:u,openGroupTurn:c,delegated:f}=e;if(Y(o,a,{path:null,present:null,content:null},null,T),c){Q(o),K();return}if(u&&u.turns>=12){n.messages.create(o.conversation_id,"bot",S,a.id),r.uiTurns.cancelPending(o.conversation_id),K();return}let p=(0,k.resolveAgent)(a);if(!p.launchable||!p.deck_id){if("direct"===p.launch_profile&&!d&&!f){Q(o),K();return}V(o,a,u);return}try{t=(0,v.parseDeckRuntime)(p.agent)}catch{n.messages.create(o.conversation_id,"bot",`[Deck failed] agent=${p.agent} deck=${p.deck_id} error=Invalid agent-deck run client.`,a.id),C(o,u,a.id),K();return}let m=(f?function(e,t){let n=-1;for(let t=0;t<e.length;t++)"user"===e[t].sender_type&&(n=t);if(n<0)return null;let r=`[Handing off to ${t}]`;for(let t=e.length-1;t>n;t--){let n=e[t];if("bot"===n.sender_type&&n.content.includes(r))return n.content.slice(n.content.indexOf(r)+r.length).trim()||null}return null}(s,a.name):null)??d?.content??null;if(!m||!m.trim()||u?.stopped){Q(o),K();return}let g=(0,E.getAgentDeckServerUrl)();if(!(0,E.isLocalAgentDeckUrl)(g)){n.messages.create(o.conversation_id,"bot",(0,E.remoteLaunchUnsupportedMessage)(g),a.id),C(o,u,a.id),K();return}try{i=(0,E.resolveAndEnsureBotWorkdir)(a.id,p.working_directory)}catch(e){n.messages.create(o.conversation_id,"bot",`[Deck failed] agent=${t} deck=${p.deck_id} error=${String(e instanceof Error?e.message:e).slice(0,300)}`,a.id),C(o,u,a.id),K();return}u?.addTurns(1);let _=(0,l.readSkillState)(a.name),h=n.memories.latestFacts(a.id);Y(o,{...a,agent:t,deck_id:p.deck_id,working_directory:i},_,h,T),("message"===o.kind?await X(o,a,t,p.deck_id):await ee({item:o,bot:a,client:t,deck:p.deck_id,cwd:i,task:m.trim(),chain:u,delegated:f}))&&C(o,u,a.id),K()}function G(e,t,r,i,o){n.messages.create(e.conversation_id,"bot",`[Deck failed] agent=${r} deck=${i} error=${o.slice(0,300)}`,t.id)}async function X(e,t,i,o){let a=e.id;r.uiTurns.handOff(a),await (0,y.startAgentDispatch)(a);let s=n.engine.getWorkRequest(a);return s?.state==="failed"?(G(e,t,i,o,s.error_message??s.error_code??"The agent runtime did not complete the turn."),!0):s?.state==="completed"}async function ee(e){let{item:t,bot:r,client:i,deck:o,cwd:a,task:s,chain:d,delegated:l}=e,u=(0,b.selectExecutionPolicy)(l?{entryPoint:"wake",executionKind:"conversation",wakeSyntax:"legacy"}:{entryPoint:"ui",executionKind:"conversation"});if(!u.ok)return G(t,r,i,o,u.reason),!0;let c=await (0,v.createAgentDeckAttemptAdapter)().run({target:{agentId:r.id,agent:i},prompt:{kind:"text",text:s},cwd:a,deck:o,toolProfile:u.policy.tool_profile,sessionBinding:null,correlation:{conversationId:t.conversation_id}});return!d?.stopped&&("completed"!==c.status||null===c.output?G(t,r,i,o,c.failure?.message??`agent-deck run ${c.externalRunId??"unknown"} failed`):n.messages.create(t.conversation_id,"bot",c.output,r.id),!0)}async function et(){let e=r.uiTurns.next();if(!e)return!1;if(!r.uiTurns.start(e.id))return!0;try{await eo(e),r.uiTurns.finish(e.id,"completed"),J(e)}catch(t){console.error("Error processing UI turn:",t),r.uiTurns.finish(e.id,"failed"),J(e)}return!0}async function en(){if(!j){j=!0;try{for(;await et(););}finally{j=!1}}}async function er(e){let{caller:t,callerTurnId:i,target:o,conversationId:a,taskMessage:s,chain:d,hermesConfig:u}=e,f=r.uiTurns.enqueue(a,o.id,{reason:"gateway_poke",parentRequestId:i,delegated:!0,start:!0});if(!f)return;let p=Date.now();(0,c.appendHermesWaitLog)({event:"wait_start",wait_id:f.id,bot:o.name,bot_id:o.id,conversation_id:a,caller:t.name,started_at:p});let m=`Standing rules, verbatim. They are a hard constraint on this reply. They beat the user's request for detail, length, or thoroughness, and they beat every earlier reply:
1
+ module.exports=[52694,e=>{"use strict";var t=e.i(22734),n=e.i(62294),r=e.i(57147),i=e.i(43084),o=e.i(25211),a=e.i(3620),s=e.i(85072),d=e.i(1912),l=e.i(10860),u=e.i(38636),c=e.i(51749),f=e.i(77099),p=e.i(2803),m=e.i(51714),g=e.i(15467),h=e.i(88355),_=e.i(64909),v=e.i(6200),y=e.i(45383),b=e.i(64974),k=e.i(62349),w=e.i(18966),E=e.i(93029);let S="[Delegation limit] Depth limit reached (max 3 handoffs). No further handoff.",T="[Delegation limit] Budget limit reached (max 12 delegated turns per user message). No further delegated turn.",A="hermes-gateway",R="session-provider",I=new Map;function C(e,t){let n=I.get(e);n||(n=new Set,I.set(e,n)),n.add(t)}function $(e,t){let n=I.get(e);n&&(n.delete(t),0===n.size&&I.delete(e))}function N(e,t,n){if(!t||t.stopped)return;let i=t.popCaller(n);i&&r.uiTurns.enqueue(e.conversation_id,i,{reason:"report_back",parentRequestId:e.id})}function D(e,t){r.uiTurns.enqueue(e.conversation_id,t,{reason:"handoff",parentRequestId:e.id,delegated:!0})}function q(e){let t=[...n.messages.getByConversation(e)].reverse().find(e=>"user"===e.sender_type);if(!t)return!1;let r=(0,i.existingChain)(e,t.id);return!!r&&r.stopped}function x(e){let t=[...n.messages.getByConversation(e)].reverse().find(e=>"user"===e.sender_type);if(!t)return!1;let r=(0,i.existingChain)(e,t.id);return!!r&&r.turns>=12}function P(e,t,r){if(!r||!function(e,t){if(!t)return!1;let n=e.findIndex(e=>e.id===t.id);return n>=0&&!e.slice(n+1).some(e=>"bot"===e.sender_type)}(t,r))return!1;let i=n.conversations.getById(e);return i?.type!=="bot"||null===L(r.content)&&null===U(r.content)}let M=new Set,O=new Set;function W(e,t){q(e)||x(e)||r.uiTurns.countPending(e)>0||(r.uiTurns.enqueue(e,t,{reason:"tick"}),j())}function B(e){e.fired||M.has(e.id)||q(e.conversation_id)||x(e.conversation_id)||r.uiTurns.countPending(e.conversation_id)>0||(M.add(e.id),setTimeout(()=>{M.delete(e.id),W(e.conversation_id,e.bot_id)},Math.max(0,e.due_at-Date.now())))}function F(e){O.has(e.id)||q(e.conversation_id)||x(e.conversation_id)||r.uiTurns.countPending(e.conversation_id)>0||(O.add(e.id),setTimeout(()=>{O.delete(e.id),W(e.conversation_id,e.bot_id)},Math.max(0,e.next_due_at-Date.now())))}function H(){for(let e of n.oneShots.unfired())B(e);for(let e of n.routines.all())F(e)}function L(e){let t=e.trim().match(/^reply with the word (\S+?)\.?$/i);return t&&t[1].replace(/^[`"'"]+|[`"'"]+$/g,"")||null}function U(e){let t=e.trim().match(/^set a one-shot(?: in (\d+) seconds?)?\.?$/i);return t?t[1]?1e3*Number(t[1]):6e4:null}let K="1"!==process.env.BOTMANCERS_NO_AUTOPROCESS;function j(){K&&setImmediate(()=>er())}let z=!1,Y=new Map;function J(e,t,n,r=null,i=function(e){return"hermes-gateway"===(0,k.agentTransport)((0,k.resolveAgent)(e).agent)?A:R}(t)){let o=(0,u.buildSnapshotInput)(t,n,r);Y.set(e.id,{json:JSON.stringify(o),hash:(0,u.hashSnapshot)(o),transport:i})}function Q(e){let t=Y.get(e.id);if(Y.delete(e.id),t)try{n.launchSnapshots.record(e.id,e.bot_id,t.hash,t.json,t.transport)}catch(e){console.error("Error recording launch snapshot:",e)}}function V(e){Y.delete(e.id)}function Z(e,t,r){n.messages.create(e.conversation_id,"bot",function(e){switch((0,k.resolveAgent)(e).launch_blocker){case"connection":return`[Agent unavailable] ${e.name} cannot launch: no runtime connection. Choose one in Config.`;case"session_scope":return`[Session scope needed] ${e.name} cannot launch: select its session scope in Config.`;case"agent":return`[Launch blocked] ${e.name} has an unsupported Agent type.`;default:return`[Launch blocked] ${e.name} cannot launch. Check its registration in Config.`}}(t),t.id),N(e,r,t.id),j()}async function G(e){let{item:t,bot:i,conversationMessages:o,latestUser:a,chain:s,openGroupTurn:d,delegated:u}=e;if(J(t,i,{path:null,present:null,content:null},null,R),d){V(t),j();return}if(s&&s.turns>=12){n.messages.create(t.conversation_id,"bot",T,i.id),r.uiTurns.cancelPending(t.conversation_id),j();return}let c=(0,k.resolveAgent)(i);if(!c.launchable){if(!a&&!u){V(t),j();return}Z(t,i,s);return}let f=c.agent,p=(u?function(e,t){let n=-1;for(let t=0;t<e.length;t++)"user"===e[t].sender_type&&(n=t);if(n<0)return null;let r=`[Handing off to ${t}]`;for(let t=e.length-1;t>n;t--){let n=e[t];if("bot"===n.sender_type&&n.content.includes(r))return n.content.slice(n.content.indexOf(r)+r.length).trim()||null}return null}(o,i.name):null)??a?.content??null;if(!p||!p.trim()||s?.stopped){V(t),j();return}s?.addTurns(1);let m=(0,l.readSkillState)(i.name),g=n.memories.latestFacts(i.id);J(t,{...i,agent:f},m,g,R),("message"===t.kind?await ee(t,i,f):await et({item:t,bot:i,client:f,task:p.trim(),chain:s,delegated:u}))&&N(t,s,i.id),j()}function X(e,t,r,i){n.messages.create(e.conversation_id,"bot",`[Agent failed] agent=${r} error=${i.slice(0,300)}`,t.id)}async function ee(e,t,i){let o=e.id;r.uiTurns.handOff(o),await (0,y.startAgentDispatch)(o);let a=n.engine.getWorkRequest(o);return a?.state==="failed"?(X(e,t,i,a.error_message??a.error_code??"The agent runtime did not complete the turn."),!0):a?.state==="completed"}async function et(e){let{item:t,bot:r,client:i,task:o,chain:a,delegated:s}=e,d=(0,b.selectExecutionPolicy)(s?{entryPoint:"wake",executionKind:"conversation",wakeSyntax:"legacy"}:{entryPoint:"ui",executionKind:"conversation"});if(!d.ok)return X(t,r,i,d.reason),!0;let l=function(e){let t=(0,w.directLaunchWorkspace)(e);if(!t)return null;try{return(0,E.ensureBotWorkdir)(t)}catch{return null}}(r);if(!l){let e=(0,w.readStoredScope)(r);return X(t,r,i,e?.kind==="sessions"?"This turn starts a new session but the agent is limited to selected sessions.":"The agent has no default workspace for a new session. Set one in Config."),!0}let u=await (0,v.createSessionProviderAttemptAdapter)().run({target:{agentId:r.id,agent:i},prompt:{kind:"text",text:o},cwd:l,toolProfile:d.policy.tool_profile,sessionBinding:null,correlation:{conversationId:t.conversation_id}});return!a?.stopped&&("completed"!==u.status||null===u.output?X(t,r,i,u.failure?.message??`provider turn ${u.externalRunId??"unknown"} failed`):n.messages.create(t.conversation_id,"bot",u.output,r.id),!0)}async function en(){let e=r.uiTurns.next();if(!e)return!1;if(!r.uiTurns.start(e.id))return!0;try{await ea(e),r.uiTurns.finish(e.id,"completed"),Q(e)}catch(t){console.error("Error processing UI turn:",t),r.uiTurns.finish(e.id,"failed"),Q(e)}return!0}async function er(){if(!z){z=!0;try{for(;await en(););}finally{z=!1}}}async function ei(e){let{caller:t,callerTurnId:i,target:o,conversationId:a,taskMessage:s,chain:d,hermesConfig:u}=e,f=r.uiTurns.enqueue(a,o.id,{reason:"gateway_poke",parentRequestId:i,delegated:!0,start:!0});if(!f)return;let p=Date.now();(0,c.appendHermesWaitLog)({event:"wait_start",wait_id:f.id,bot:o.name,bot_id:o.id,conversation_id:a,caller:t.name,started_at:p});let m=`Standing rules, verbatim. They are a hard constraint on this reply. They beat the user's request for detail, length, or thoroughness, and they beat every earlier reply:
2
2
  ${o.description}
3
3
  If those rules limit the reply to one short sentence, the whole reply is that one short sentence and nothing more.`,g=`You are ${o.name}, ${o.title}.
4
4
 
5
5
  You were delegated by @${t.name}. Complete the task in your context and reply with your result in this thread.
6
6
  Do not use WAKE on this turn. Do not hand off. Do not call tools. Answer only from the standing rules and the latest handoff message.
7
7
 
8
- ${m}`,_=`Standing rules for the reply you are about to write, verbatim:
8
+ ${m}`,h=`Standing rules for the reply you are about to write, verbatim:
9
9
  ${o.description}
10
- The standing rules decide the whole reply. If they require one short sentence, write one short clause and stop. Do not answer with a long sentence, a list, or extra detail.`,h=n.memories.latestFacts(o.id),v=(0,l.readSkillState)(o.name);Y(f,o,v,h,A);let y=[{role:"system",content:g},{role:"user",content:`Peer handoff from @${t.name}:
11
- ${s}`},{role:"system",content:_}];h.length>0&&y.push({role:"system",content:["Remembered facts:",...h.map(e=>"- "+e)].join("\n")}),v.content&&y.push({role:"system",content:v.content});let b=new AbortController;I(a,b);try{let e=await (0,c.hermesChat)({config:u,profilePath:(0,c.hermesProfilePathForBot)(o),sessionId:(0,c.hermesSessionIdForBot)(o.id,u),messages:y,signal:b.signal}),i=Date.now();if(d?.stopped){r.uiTurns.finish(f.id,"completed"),J(f),(0,c.appendHermesWaitLog)({event:"wait_finish",wait_id:f.id,bot:o.name,bot_id:o.id,conversation_id:a,started_at:p,finished_at:i,delivered:!1});return}let{callerMessageId:m}=function(e){let{callerConversationId:t,caller:r,target:i,taskMessage:o,reply:a}=e,s=(0,l.applySkillEndToken)(i.name,a),d=null,u=null,c=`[Handing off to ${i.name}]
10
+ The standing rules decide the whole reply. If they require one short sentence, write one short clause and stop. Do not answer with a long sentence, a list, or extra detail.`,_=n.memories.latestFacts(o.id),v=(0,l.readSkillState)(o.name);J(f,o,v,_,A);let y=[{role:"system",content:g},{role:"user",content:`Peer handoff from @${t.name}:
11
+ ${s}`},{role:"system",content:h}];_.length>0&&y.push({role:"system",content:["Remembered facts:",..._.map(e=>"- "+e)].join("\n")}),v.content&&y.push({role:"system",content:v.content});let b=new AbortController;C(a,b);try{let e=await (0,c.hermesChat)({config:u,profilePath:(0,c.hermesProfilePathForBot)(o),sessionId:(0,c.hermesSessionIdForBot)(o.id,u),messages:y,signal:b.signal}),i=Date.now();if(d?.stopped){r.uiTurns.finish(f.id,"completed"),Q(f),(0,c.appendHermesWaitLog)({event:"wait_finish",wait_id:f.id,bot:o.name,bot_id:o.id,conversation_id:a,started_at:p,finished_at:i,delivered:!1});return}let{callerMessageId:m}=function(e){let{callerConversationId:t,caller:r,target:i,taskMessage:o,reply:a}=e,s=(0,l.applySkillEndToken)(i.name,a),d=null,u=null,c=`[Handing off to ${i.name}]
12
12
  ${o}`,f=n.messages.getByConversation(t),p=[...f].reverse().find(e=>"bot"===e.sender_type&&e.sender_id===r.id&&e.content===c),m=p?p.created_at:0,g=n.conversations.getByBotId(i.id);if(g&&g.id!==t){let e=`[From ${r.name}]
13
- ${o}`,t=n.messages.getByConversation(g.id),a=[...t].reverse().find(t=>"bot"===t.sender_type&&t.sender_id===r.id&&t.content===e&&t.created_at>=m);a||(a=n.messages.create(g.id,"bot",e,r.id),t=n.messages.getByConversation(g.id)),t.some(e=>"bot"===e.sender_type&&e.sender_id===i.id&&e.content===s&&e.created_at>=a.created_at)||(u=n.messages.create(g.id,"bot",s,i.id).id)}return f.some(e=>"bot"===e.sender_type&&e.sender_id===i.id&&e.content===s&&e.created_at>=m)||(d=n.messages.create(t,"bot",s,i.id).id),{callerMessageId:d,targetMessageId:u}}({callerConversationId:a,caller:t,target:o,taskMessage:s,reply:e});r.uiTurns.finish(f.id,"completed"),J(f),(0,c.appendHermesWaitLog)({event:"wait_finish",wait_id:f.id,bot:o.name,bot_id:o.id,conversation_id:a,started_at:p,finished_at:i,message_id:m,reply:e})}catch(l){var k;let e,i,s=Date.now();r.uiTurns.finish(f.id,"failed"),J(f),(0,c.appendHermesWaitLog)({event:"wait_failed",wait_id:f.id,bot:o.name,bot_id:o.id,conversation_id:a,started_at:p,finished_at:s,code:l instanceof c.HermesError?l.code:"unknown",error:String(l)}),l instanceof c.HermesError&&"aborted"===l.code||d?.stopped||n.messages.create(a,"bot",(k=o.name,i=(e=l instanceof c.HermesError?l.message:String(l)).length>160?e.slice(0,157)+"...":e,`[Specialist ${k} failed: ${i}]`),t.id)}finally{$(a,b)}}async function ei(e){let{item:t,bot:i,conversation:o,chain:a,responseContent:s,targets:d,hermesConfig:u}=e;if(a?.stopped)return void K();if(a&&a.handoffs>=3){n.messages.create(o.id,"bot",w,i.id),K();return}let c=a?3-a.handoffs:d.length,f=a?12-a.turns:d.length,p=Math.max(0,Math.min(c,f,d.length)),m=d.slice(0,p);if(0===m.length){c<=0||c<=f?n.messages.create(o.id,"bot",w,i.id):(n.messages.create(o.id,"bot",S,i.id),r.uiTurns.cancelPending(o.id)),K();return}let g=s.search(/WAKE\s+[A-Za-z0-9_-]+\s*:/i),_=(g>=0?s.slice(0,g):"").trim();for(let{directive:e,bot:t}of(_&&ea(o.id,n.messages.create(o.id,"bot",(0,l.applySkillEndToken)(i.name,_),i.id)),m)){let r=n.messages.create(o.id,"bot",`[Handing off to ${t.name}]
14
- ${e.message}`,i.id);ea(o.id,r),n.wakeTargets.accept({conversationId:o.id,requestedTarget:e.target,sourceBotId:i.id,sourceMessageId:r.id})}if(a&&(a.addHandoffs(m.length),a.addTurns(m.length)),await Promise.allSettled(m.map(({directive:e,bot:n})=>er({caller:i,callerTurnId:t.id,target:n,conversationId:o.id,taskMessage:e.message,chain:a,hermesConfig:u}))),m.length<d.length)if(c<=f)n.messages.create(o.id,"bot",w,i.id);else{n.messages.create(o.id,"bot",S,i.id),r.uiTurns.cancelPending(o.id),K();return}a&&!a.stopped&&r.uiTurns.enqueue(o.id,i.id,{reason:"report_back",parentRequestId:t.id}),K()}async function eo(e){var u,v,y,b,E,T,R;let N,q,M=n.bots.getById(e.bot_id);if(!M)return void console.error("Bot not found:",e.bot_id);Y(e,M,{path:null,present:null,content:null});let P=n.conversations.getById(e.conversation_id);if(!P)return void console.error("Conversation not found:",e.conversation_id);let O=n.messages.getByConversation(e.conversation_id),F=[...O].reverse().find(e=>"user"===e.sender_type),L=F?(0,i.chainFor)(e.conversation_id,F.id):null;if(L?.stopped)return void K();let j=null;if(F){let t=(0,_.pendingForBot)(e.conversation_id,M.id);if(t){if(F.id===t.task_message_id)return void K();let e=(0,_.resolveQuestion)(t.id,F.id,F.content);if(!e||!e.answer)return void K();j={question:e.question,answer:e.answer,taskContent:e.task_content}}else if((0,_.findAnsweredByAnswer)(e.conversation_id,M.id,F.id))return void K()}let z=el(O,M.name),J=L?.callerFor(M.id)??null,G=J?eg(J):null;if(!j&&!z&&function(e,t,r,i){if(x(e,r,i))return!1;let o=Date.now(),a=n.oneShots.pending(e);if(a&&a.bot_id===t&&a.due_at<=o)return!0;let s=n.routines.forConversation(e);return!!s&&s.bot_id===t&&!!(s.next_due_at<=o)}(e.conversation_id,M.id,O,F??null)){if(L&&L.turns>=12){n.messages.create(e.conversation_id,"bot",S,M.id),r.uiTurns.cancelPending(e.conversation_id),K();return}if(function(e,t,r,i){if(x(e,r,i))return!1;let o=Date.now(),a=n.oneShots.pending(e);if(a&&a.bot_id===t&&a.due_at<=o&&n.oneShots.claim(a.id))return n.messages.create(e,"bot","[one-shot]",t),!0;let s=n.routines.forConversation(e);return!!s&&s.bot_id===t&&s.next_due_at<=o&&n.routines.postIfDue(s.id,o)}(e.conversation_id,M.id,O,F??null)){L?.addTurns(1),K();return}K();return}if(!j&&"chief-of-staff"===M.name.toLowerCase()&&F&&!z&&await (0,g.handleCosBirthRequest)(e.conversation_id,M.id,F,O))return void K();if(!j&&"bot"===P.type&&F){let t=(0,a.parseDraftRequest)(F.content);if(t){let r=O.findIndex(e=>e.id===F.id);r>=0&&O.slice(r+1).some(e=>"bot"===e.sender_type)||n.messages.create(e.conversation_id,"bot",(0,o.serializeDraft)((0,a.createDraft)(t)),M.id),K();return}}if(!j&&"bot"===P.type&&F){let r=(0,s.parseFileWriteRequest)(F.content);if(r){let i;try{i=(0,s.validateArtifact)(r)}catch{K();return}let o=O.findIndex(e=>e.id===F.id),a=o>=0?O.slice(o+1):[];if(a.some(e=>"bot"===e.sender_type&&e.sender_id===M.id&&e.content.startsWith((0,s.artifactCardText)(i.name))))return void K();let d=!1;try{d=t.default.existsSync((0,s.resolveArtifactPath)(i.name))}catch{K();return}if(d){if(!es(e.conversation_id,a,M.id)){let t=ed(e.conversation_id,i.name);try{(0,h.createApprovalRequest)({conversationId:e.conversation_id,botId:M.id,code:t,actionType:"write_file",actionArgs:{name:i.name,content:i.content}})}catch(e){if(e instanceof h.ApprovalActionRefused)return void K();throw e}let r=(0,l.applySkillEndToken)(M.name,(0,h.approvalCardText)(t)),o=n.messages.create(e.conversation_id,"bot",r,M.id);(0,h.setApprovalMessage)(e.conversation_id,t,o.id)}K();return}try{(0,s.writeArtifactFile)(i.name,i.content,{allowOverwrite:!1})}catch{K();return}return n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(M.name,(0,s.artifactCardText)(i.name)),M.id),void K()}}if(!j&&"bot"===P.type&&F){let t=U(F.content);if(null!==t){let r;u=e.conversation_id,v=M.id,(r=n.oneShots.pending(u))?W(r):W(n.oneShots.create(u,v,Date.now()+t)),K();return}let r=H(F.content);if(r){!function(e,t,r){let i,o=n.routines.forConversation(e);if(o)return B(o);B(n.routines.create(e,t,r,Date.now()+(Number.isFinite(i=Number(process.env.BOTMANCERS_ROUTINE_FIRST_DUE_MS))&&i>=0?i:8e3),864e5))}(e.conversation_id,M.id,r),K();return}}if(!j&&"chief-of-staff"===M.name.toLowerCase()&&F){let t=(0,m.parseCommandAsk)(F.content);if(t){let r=n.messages.create(e.conversation_id,"bot",(0,f.serializeRun)({state:"running",page:(0,m.commandRunPage)(t,null)}),M.id);(0,p.beginCommandRun)(r.id,t),K();return}let r=(0,f.parseFileReadAsk)(F.content);if(r){let t=n.messages.create(e.conversation_id,"bot",(0,f.serializeRun)({state:"running"}),M.id);(0,p.beginFileReadRun)(t.id,r.seconds),K();return}let i=(0,f.parsePublicPageReadAsk)(F.content);if(i){let t=n.messages.create(e.conversation_id,"bot",(0,f.serializeRun)({state:"running"}),M.id);(0,p.beginPublicPageReadRun)(t.id,i.seconds,i.url),K();return}let o=(0,f.parseCodingLimbAsk)(F.content);if(o){let t=n.messages.create(e.conversation_id,"bot",(0,f.serializeRun)({state:"running"}),M.id);(0,p.beginCodingLimbRun)(t.id,o.seconds),K();return}}if(!j&&"bot"===P.type&&F&&(0,h.raiseApprovalFromUserInstruction)({conversationId:e.conversation_id,botId:M.id,botName:M.name,userMessage:F,thread:O}))return void K();if(!j&&F){let t=(0,_.parseAskRequest)(F.content);if(t){if((0,_.listAskedForConversation)(e.conversation_id).some(e=>e.task_message_id===F.id)||(0,_.findByTask)(e.conversation_id,M.id,F.id))return void K();let r=(0,_.createPendingQuestion)({conversationId:e.conversation_id,botId:M.id,question:t,taskMessageId:F.id,taskContent:F.content}),i=n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(M.name,t),M.id);return(0,_.setQuestionMessage)(r.id,i.id),ea(e.conversation_id,i),void K()}}let X=!1;j||"group"!==P.type||!F||z||eu(F,M)||(X=!O.some(t=>"bot"===t.sender_type&&!!t.sender_id&&t.sender_id!==M.id&&t.created_at>F.created_at&&t.created_at<=e.created_at));let ee=null;if(!j&&F&&F.content.includes("{"))for(let t of n.mcpServers.list()){let r=[];try{let e=JSON.parse(t.args);Array.isArray(e)&&(r=e.map(e=>String(e)))}catch{r=[]}let i=await (0,d.mcpTurn)(t.command,r,F.content);if(i?.invocation){n.messages.create(e.conversation_id,"bot",`[mcp] tools: ${i.tools.join(", ")}`,M.id),n.messages.create(e.conversation_id,"bot",`[tool call] ${i.invocation.name} ${JSON.stringify(i.invocation.args)}`,M.id),n.messages.create(e.conversation_id,"bot",`[tool result] ${i.invocation.text}`,M.id),ee={role:"user",content:`Tool result ${i.invocation.name} ${JSON.stringify(i.invocation.args)} = ${i.invocation.text}`};break}}if(!j&&"group"===P.type&&F&&P.group_id){let t=ef(F.content);if(t){let i=n.groups.getMembers(P.group_id).find(e=>ep(e,t.toName));if(eu(F,M)&&ep(M,t.fromName)){if(L?.stopped||!i||i.id===M.id)return void K();if(L&&L.handoffs>=3){O.some(e=>"bot"===e.sender_type&&e.sender_id===M.id&&e.created_at>F.created_at&&e.content===w)||n.messages.create(e.conversation_id,"bot",w,M.id),K();return}if(L&&L.turns>=12){O.some(e=>"bot"===e.sender_type&&e.sender_id===M.id&&e.created_at>F.created_at&&e.content===S)||n.messages.create(e.conversation_id,"bot",S,M.id),r.uiTurns.cancelPending(e.conversation_id),K();return}if(!O.some(e=>"bot"===e.sender_type&&e.sender_id===M.id&&e.created_at>F.created_at&&e.content.startsWith(`[Handing off to ${i.name}]`))){n.messages.create(e.conversation_id,"bot",`[Handing off to ${i.name}]
15
- ${t.task}`,M.id),D(e,i.id),L?.addHandoffs(1),K();return}if(!el(O,M.name))return void K();{let e=Math.max(0,...O.filter(e=>"bot"===e.sender_type&&e.created_at>F.created_at&&e.content.includes(`[Handing off to ${M.name}]`)).map(e=>e.created_at));if(O.some(t=>"bot"===t.sender_type&&t.sender_id===M.id&&t.created_at>e))return void K()}}else{if(!i||M.id!==i.id||L?.stopped||!O.some(e=>"bot"===e.sender_type&&!!e.sender_id&&e.sender_id!==M.id&&e.created_at>F.created_at&&e.content.startsWith(`[Handing off to ${M.name}]`)))return void K();let o=ec(t.task);if(o&&(!o.named||ep(M,o.named))){if(O.some(e=>"bot"===e.sender_type&&e.sender_id===M.id&&e.created_at>F.created_at&&e.content.trim()===o.word))return void K();if(L&&L.turns>=12){n.messages.create(e.conversation_id,"bot",S,M.id),r.uiTurns.cancelPending(e.conversation_id),K();return}return n.messages.create(e.conversation_id,"bot",o.word,M.id),L?.addTurns(1),void K()}let a=Math.max(0,...O.filter(e=>"bot"===e.sender_type&&e.created_at>F.created_at&&e.content.includes(`[Handing off to ${M.name}]`)).map(e=>e.created_at));if(O.some(e=>"bot"===e.sender_type&&e.sender_id===M.id&&e.created_at>a))return void K()}}}let et=(0,k.resolveAgent)(M);if("agent-deck-run"===(0,k.agentTransport)(et.agent))return void await Z({item:e,bot:M,conversationMessages:O,latestUser:F??null,chain:L,openGroupTurn:X,delegated:z});if(!et.launchable){if(X){Q(e),K();return}V(e,M,L);return}if(X&&F&&P.group_id){let t=ec(F.content);if(t){return(b=M,E=n.groups.getMembers(P.group_id),(T=t).named?ep(b,T.named):!em(b.description)||!E.some(e=>e.id!==b.id&&!em(e.description)))?(n.messages.create(e.conversation_id,"bot",t.word,M.id),void K()):void K()}}let en=(X&&F?[F]:O).flatMap(e=>{let t=function(e,t){if("user"===e.sender_type){let t=function(e){if(!e.handoff_targets)return null;try{let t=JSON.parse(e.handoff_targets);if(!Array.isArray(t))return null;let r=t.map(e=>n.bots.getById(String(e))?.name).filter(e=>!!e);if(0===r.length)return null;return`Peer handoff: ${r.map(e=>"@"+e).join(" ")}`}catch{return null}}(e);if(!t)return{role:"user",content:e.content};let r=n.messages.priorSentenceForHandoff(e);return r?{role:"user",content:`${t}
13
+ ${o}`,t=n.messages.getByConversation(g.id),a=[...t].reverse().find(t=>"bot"===t.sender_type&&t.sender_id===r.id&&t.content===e&&t.created_at>=m);a||(a=n.messages.create(g.id,"bot",e,r.id),t=n.messages.getByConversation(g.id)),t.some(e=>"bot"===e.sender_type&&e.sender_id===i.id&&e.content===s&&e.created_at>=a.created_at)||(u=n.messages.create(g.id,"bot",s,i.id).id)}return f.some(e=>"bot"===e.sender_type&&e.sender_id===i.id&&e.content===s&&e.created_at>=m)||(d=n.messages.create(t,"bot",s,i.id).id),{callerMessageId:d,targetMessageId:u}}({callerConversationId:a,caller:t,target:o,taskMessage:s,reply:e});r.uiTurns.finish(f.id,"completed"),Q(f),(0,c.appendHermesWaitLog)({event:"wait_finish",wait_id:f.id,bot:o.name,bot_id:o.id,conversation_id:a,started_at:p,finished_at:i,message_id:m,reply:e})}catch(l){var k;let e,i,s=Date.now();r.uiTurns.finish(f.id,"failed"),Q(f),(0,c.appendHermesWaitLog)({event:"wait_failed",wait_id:f.id,bot:o.name,bot_id:o.id,conversation_id:a,started_at:p,finished_at:s,code:l instanceof c.HermesError?l.code:"unknown",error:String(l)}),l instanceof c.HermesError&&"aborted"===l.code||d?.stopped||n.messages.create(a,"bot",(k=o.name,i=(e=l instanceof c.HermesError?l.message:String(l)).length>160?e.slice(0,157)+"...":e,`[Specialist ${k} failed: ${i}]`),t.id)}finally{$(a,b)}}async function eo(e){let{item:t,bot:i,conversation:o,chain:a,responseContent:s,targets:d,hermesConfig:u}=e;if(a?.stopped)return void j();if(a&&a.handoffs>=3){n.messages.create(o.id,"bot",S,i.id),j();return}let c=a?3-a.handoffs:d.length,f=a?12-a.turns:d.length,p=Math.max(0,Math.min(c,f,d.length)),m=d.slice(0,p);if(0===m.length){c<=0||c<=f?n.messages.create(o.id,"bot",S,i.id):(n.messages.create(o.id,"bot",T,i.id),r.uiTurns.cancelPending(o.id)),j();return}let g=s.search(/WAKE\s+[A-Za-z0-9_-]+\s*:/i),h=(g>=0?s.slice(0,g):"").trim();for(let{directive:e,bot:t}of(h&&es(o.id,n.messages.create(o.id,"bot",(0,l.applySkillEndToken)(i.name,h),i.id)),m)){let r=n.messages.create(o.id,"bot",`[Handing off to ${t.name}]
14
+ ${e.message}`,i.id);es(o.id,r),n.wakeTargets.accept({conversationId:o.id,requestedTarget:e.target,sourceBotId:i.id,sourceMessageId:r.id})}if(a&&(a.addHandoffs(m.length),a.addTurns(m.length)),await Promise.allSettled(m.map(({directive:e,bot:n})=>ei({caller:i,callerTurnId:t.id,target:n,conversationId:o.id,taskMessage:e.message,chain:a,hermesConfig:u}))),m.length<d.length)if(c<=f)n.messages.create(o.id,"bot",S,i.id);else{n.messages.create(o.id,"bot",T,i.id),r.uiTurns.cancelPending(o.id),j();return}a&&!a.stopped&&r.uiTurns.enqueue(o.id,i.id,{reason:"report_back",parentRequestId:t.id}),j()}async function ea(e){var u,v,y,b,w,E,R;let I,q,x=n.bots.getById(e.bot_id);if(!x)return void console.error("Bot not found:",e.bot_id);J(e,x,{path:null,present:null,content:null});let M=n.conversations.getById(e.conversation_id);if(!M)return void console.error("Conversation not found:",e.conversation_id);let O=n.messages.getByConversation(e.conversation_id),W=[...O].reverse().find(e=>"user"===e.sender_type),H=W?(0,i.chainFor)(e.conversation_id,W.id):null;if(H?.stopped)return void j();let K=null;if(W){let t=(0,h.pendingForBot)(e.conversation_id,x.id);if(t){if(W.id===t.task_message_id)return void j();let e=(0,h.resolveQuestion)(t.id,W.id,W.content);if(!e||!e.answer)return void j();K={question:e.question,answer:e.answer,taskContent:e.task_content}}else if((0,h.findAnsweredByAnswer)(e.conversation_id,x.id,W.id))return void j()}let z=eu(O,x.name),Y=H?.callerFor(x.id)??null,Q=Y?eh(Y):null;if(!K&&!z&&function(e,t,r,i){if(P(e,r,i))return!1;let o=Date.now(),a=n.oneShots.pending(e);if(a&&a.bot_id===t&&a.due_at<=o)return!0;let s=n.routines.forConversation(e);return!!s&&s.bot_id===t&&!!(s.next_due_at<=o)}(e.conversation_id,x.id,O,W??null)){if(H&&H.turns>=12){n.messages.create(e.conversation_id,"bot",T,x.id),r.uiTurns.cancelPending(e.conversation_id),j();return}if(function(e,t,r,i){if(P(e,r,i))return!1;let o=Date.now(),a=n.oneShots.pending(e);if(a&&a.bot_id===t&&a.due_at<=o&&n.oneShots.claim(a.id))return n.messages.create(e,"bot","[one-shot]",t),!0;let s=n.routines.forConversation(e);return!!s&&s.bot_id===t&&s.next_due_at<=o&&n.routines.postIfDue(s.id,o)}(e.conversation_id,x.id,O,W??null)){H?.addTurns(1),j();return}j();return}if(!K&&"chief-of-staff"===x.name.toLowerCase()&&W&&!z&&await (0,g.handleCosBirthRequest)(e.conversation_id,x.id,W,O))return void j();if(!K&&"bot"===M.type&&W){let t=(0,a.parseDraftRequest)(W.content);if(t){let r=O.findIndex(e=>e.id===W.id);r>=0&&O.slice(r+1).some(e=>"bot"===e.sender_type)||n.messages.create(e.conversation_id,"bot",(0,o.serializeDraft)((0,a.createDraft)(t)),x.id),j();return}}if(!K&&"bot"===M.type&&W){let r=(0,s.parseFileWriteRequest)(W.content);if(r){let i;try{i=(0,s.validateArtifact)(r)}catch{j();return}let o=O.findIndex(e=>e.id===W.id),a=o>=0?O.slice(o+1):[];if(a.some(e=>"bot"===e.sender_type&&e.sender_id===x.id&&e.content.startsWith((0,s.artifactCardText)(i.name))))return void j();let d=!1;try{d=t.default.existsSync((0,s.resolveArtifactPath)(i.name))}catch{j();return}if(d){if(!ed(e.conversation_id,a,x.id)){let t=el(e.conversation_id,i.name);try{(0,_.createApprovalRequest)({conversationId:e.conversation_id,botId:x.id,code:t,actionType:"write_file",actionArgs:{name:i.name,content:i.content}})}catch(e){if(e instanceof _.ApprovalActionRefused)return void j();throw e}let r=(0,l.applySkillEndToken)(x.name,(0,_.approvalCardText)(t)),o=n.messages.create(e.conversation_id,"bot",r,x.id);(0,_.setApprovalMessage)(e.conversation_id,t,o.id)}j();return}try{(0,s.writeArtifactFile)(i.name,i.content,{allowOverwrite:!1})}catch{j();return}return n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(x.name,(0,s.artifactCardText)(i.name)),x.id),void j()}}if(!K&&"bot"===M.type&&W){let t=U(W.content);if(null!==t){let r;u=e.conversation_id,v=x.id,(r=n.oneShots.pending(u))?B(r):B(n.oneShots.create(u,v,Date.now()+t)),j();return}let r=L(W.content);if(r){!function(e,t,r){let i,o=n.routines.forConversation(e);if(o)return F(o);F(n.routines.create(e,t,r,Date.now()+(Number.isFinite(i=Number(process.env.BOTMANCERS_ROUTINE_FIRST_DUE_MS))&&i>=0?i:8e3),864e5))}(e.conversation_id,x.id,r),j();return}}if(!K&&"chief-of-staff"===x.name.toLowerCase()&&W){let t=(0,m.parseCommandAsk)(W.content);if(t){let r=n.messages.create(e.conversation_id,"bot",(0,f.serializeRun)({state:"running",page:(0,m.commandRunPage)(t,null)}),x.id);(0,p.beginCommandRun)(r.id,t),j();return}let r=(0,f.parseFileReadAsk)(W.content);if(r){let t=n.messages.create(e.conversation_id,"bot",(0,f.serializeRun)({state:"running"}),x.id);(0,p.beginFileReadRun)(t.id,r.seconds),j();return}let i=(0,f.parsePublicPageReadAsk)(W.content);if(i){let t=n.messages.create(e.conversation_id,"bot",(0,f.serializeRun)({state:"running"}),x.id);(0,p.beginPublicPageReadRun)(t.id,i.seconds,i.url),j();return}let o=(0,f.parseCodingLimbAsk)(W.content);if(o){let t=n.messages.create(e.conversation_id,"bot",(0,f.serializeRun)({state:"running"}),x.id);(0,p.beginCodingLimbRun)(t.id,o.seconds),j();return}}if(!K&&"bot"===M.type&&W&&(0,_.raiseApprovalFromUserInstruction)({conversationId:e.conversation_id,botId:x.id,botName:x.name,userMessage:W,thread:O}))return void j();if(!K&&W){let t=(0,h.parseAskRequest)(W.content);if(t){if((0,h.listAskedForConversation)(e.conversation_id).some(e=>e.task_message_id===W.id)||(0,h.findByTask)(e.conversation_id,x.id,W.id))return void j();let r=(0,h.createPendingQuestion)({conversationId:e.conversation_id,botId:x.id,question:t,taskMessageId:W.id,taskContent:W.content}),i=n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(x.name,t),x.id);return(0,h.setQuestionMessage)(r.id,i.id),es(e.conversation_id,i),void j()}}let X=!1;K||"group"!==M.type||!W||z||ec(W,x)||(X=!O.some(t=>"bot"===t.sender_type&&!!t.sender_id&&t.sender_id!==x.id&&t.created_at>W.created_at&&t.created_at<=e.created_at));let ee=null;if(!K&&W&&W.content.includes("{"))for(let t of n.mcpServers.list()){let r=[];try{let e=JSON.parse(t.args);Array.isArray(e)&&(r=e.map(e=>String(e)))}catch{r=[]}let i=await (0,d.mcpTurn)(t.command,r,W.content);if(i?.invocation){n.messages.create(e.conversation_id,"bot",`[mcp] tools: ${i.tools.join(", ")}`,x.id),n.messages.create(e.conversation_id,"bot",`[tool call] ${i.invocation.name} ${JSON.stringify(i.invocation.args)}`,x.id),n.messages.create(e.conversation_id,"bot",`[tool result] ${i.invocation.text}`,x.id),ee={role:"user",content:`Tool result ${i.invocation.name} ${JSON.stringify(i.invocation.args)} = ${i.invocation.text}`};break}}if(!K&&"group"===M.type&&W&&M.group_id){let t=ep(W.content);if(t){let i=n.groups.getMembers(M.group_id).find(e=>em(e,t.toName));if(ec(W,x)&&em(x,t.fromName)){if(H?.stopped||!i||i.id===x.id)return void j();if(H&&H.handoffs>=3){O.some(e=>"bot"===e.sender_type&&e.sender_id===x.id&&e.created_at>W.created_at&&e.content===S)||n.messages.create(e.conversation_id,"bot",S,x.id),j();return}if(H&&H.turns>=12){O.some(e=>"bot"===e.sender_type&&e.sender_id===x.id&&e.created_at>W.created_at&&e.content===T)||n.messages.create(e.conversation_id,"bot",T,x.id),r.uiTurns.cancelPending(e.conversation_id),j();return}if(!O.some(e=>"bot"===e.sender_type&&e.sender_id===x.id&&e.created_at>W.created_at&&e.content.startsWith(`[Handing off to ${i.name}]`))){n.messages.create(e.conversation_id,"bot",`[Handing off to ${i.name}]
15
+ ${t.task}`,x.id),D(e,i.id),H?.addHandoffs(1),j();return}if(!eu(O,x.name))return void j();{let e=Math.max(0,...O.filter(e=>"bot"===e.sender_type&&e.created_at>W.created_at&&e.content.includes(`[Handing off to ${x.name}]`)).map(e=>e.created_at));if(O.some(t=>"bot"===t.sender_type&&t.sender_id===x.id&&t.created_at>e))return void j()}}else{if(!i||x.id!==i.id||H?.stopped||!O.some(e=>"bot"===e.sender_type&&!!e.sender_id&&e.sender_id!==x.id&&e.created_at>W.created_at&&e.content.startsWith(`[Handing off to ${x.name}]`)))return void j();let o=ef(t.task);if(o&&(!o.named||em(x,o.named))){if(O.some(e=>"bot"===e.sender_type&&e.sender_id===x.id&&e.created_at>W.created_at&&e.content.trim()===o.word))return void j();if(H&&H.turns>=12){n.messages.create(e.conversation_id,"bot",T,x.id),r.uiTurns.cancelPending(e.conversation_id),j();return}return n.messages.create(e.conversation_id,"bot",o.word,x.id),H?.addTurns(1),void j()}let a=Math.max(0,...O.filter(e=>"bot"===e.sender_type&&e.created_at>W.created_at&&e.content.includes(`[Handing off to ${x.name}]`)).map(e=>e.created_at));if(O.some(e=>"bot"===e.sender_type&&e.sender_id===x.id&&e.created_at>a))return void j()}}}let et=(0,k.resolveAgent)(x);if("session-provider"===(0,k.agentTransport)(et.agent))return void await G({item:e,bot:x,conversationMessages:O,latestUser:W??null,chain:H,openGroupTurn:X,delegated:z});if(!et.launchable){if(X){V(e),j();return}Z(e,x,H);return}if(X&&W&&M.group_id){let t=ef(W.content);if(t){return(b=x,w=n.groups.getMembers(M.group_id),(E=t).named?em(b,E.named):!eg(b.description)||!w.some(e=>e.id!==b.id&&!eg(e.description)))?(n.messages.create(e.conversation_id,"bot",t.word,x.id),void j()):void j()}}let en=(X&&W?[W]:O).flatMap(e=>{let t=function(e,t){if("user"===e.sender_type){let t=function(e){if(!e.handoff_targets)return null;try{let t=JSON.parse(e.handoff_targets);if(!Array.isArray(t))return null;let r=t.map(e=>n.bots.getById(String(e))?.name).filter(e=>!!e);if(0===r.length)return null;return`Peer handoff: ${r.map(e=>"@"+e).join(" ")}`}catch{return null}}(e);if(!t)return{role:"user",content:e.content};let r=n.messages.priorSentenceForHandoff(e);return r?{role:"user",content:`${t}
16
16
  ${r}
17
17
  ${e.content}`}:{role:"user",content:`${t}
18
- ${e.content}`}}return"bot"===e.sender_type&&e.sender_id&&e.sender_id!==t?{role:"user",content:`Peer handoff from @${eg(e.sender_id)}:
19
- ${e.content}`}:null}(e,M.id);return t?[t]:[]});0===en.length&&en.push({role:"user",content:"You were just created. Greet in one short sentence and include your name. Do not use WAKE."}),ee&&en.push(ee),j&&en.push({role:"user",content:(0,_.resumePrompt)({question:j.question,answer:j.answer,taskContent:j.taskContent})});let er=G?`You were delegated by @${G}. Complete the task in your context and reply with your result in this thread.
20
- Your reply will be returned to @${G}, who manages the sequence and reports back.
18
+ ${e.content}`}}return"bot"===e.sender_type&&e.sender_id&&e.sender_id!==t?{role:"user",content:`Peer handoff from @${eh(e.sender_id)}:
19
+ ${e.content}`}:null}(e,x.id);return t?[t]:[]});0===en.length&&en.push({role:"user",content:"You were just created. Greet in one short sentence and include your name. Do not use WAKE."}),ee&&en.push(ee),K&&en.push({role:"user",content:(0,h.resumePrompt)({question:K.question,answer:K.answer,taskContent:K.taskContent})});let er=Q?`You were delegated by @${Q}. Complete the task in your context and reply with your result in this thread.
20
+ Your reply will be returned to @${Q}, who manages the sequence and reports back.
21
21
  Only use WAKE to sub-delegate part of this task to another bot:
22
22
  - WAKE <bot_name>: <message>
23
23
  Otherwise reply normally with your result; do not WAKE your caller back.`:`You can communicate with other bots by using the WAKE command:
@@ -28,19 +28,19 @@ Examples:
28
28
  - WAKE Alice: Can you research this topic?
29
29
  - WAKE GROUP: I've completed my analysis.
30
30
 
31
- Important: Only use WAKE when you need to hand off work to another bot or inform the group. When you hand off, you stay the caller: the delegate's reply will come back to you, and you decide the next step and the final report. For regular responses to the user, just reply normally.`,eo=X?"Do not use WAKE on this turn. Do not hand off. Do not repeat an earlier handoff.":er,e_=X?`Standing description, verbatim. It does not decide this reply. The open-group instruction beats it, including any rule inside it that says to WAKE, hand off, or acknowledge a handoff:
32
- ${M.description}`:`Standing rules, verbatim. They are a hard constraint on this reply. They beat the user's request for detail, length, or thoroughness, and they beat every earlier reply:
33
- ${M.description}
34
- If those rules limit the reply to one short sentence, the whole reply is that one short sentence and nothing more.`,eh=n.memories.latestFacts(M.id),ev=0===eh.length?"":["Remembered facts:",...eh.map(e=>"- "+e),"These saved facts belong to this bot only. When the user asks about one of them, put that remembered fact in the reply even if the question does not repeat it. If the user is not asking about a remembered fact, do not recite this list. Do not store or invent facts from your own replies, tool lines, or group handoff lines. Standing rules and open-group instructions still apply."].join("\n"),ey=`You are ${M.name}, ${M.title}.
31
+ Important: Only use WAKE when you need to hand off work to another bot or inform the group. When you hand off, you stay the caller: the delegate's reply will come back to you, and you decide the next step and the final report. For regular responses to the user, just reply normally.`,ei=X?"Do not use WAKE on this turn. Do not hand off. Do not repeat an earlier handoff.":er,ea=X?`Standing description, verbatim. It does not decide this reply. The open-group instruction beats it, including any rule inside it that says to WAKE, hand off, or acknowledge a handoff:
32
+ ${x.description}`:`Standing rules, verbatim. They are a hard constraint on this reply. They beat the user's request for detail, length, or thoroughness, and they beat every earlier reply:
33
+ ${x.description}
34
+ If those rules limit the reply to one short sentence, the whole reply is that one short sentence and nothing more.`,e_=n.memories.latestFacts(x.id),ev=0===e_.length?"":["Remembered facts:",...e_.map(e=>"- "+e),"These saved facts belong to this bot only. When the user asks about one of them, put that remembered fact in the reply even if the question does not repeat it. If the user is not asking about a remembered fact, do not recite this list. Do not store or invent facts from your own replies, tool lines, or group handoff lines. Standing rules and open-group instructions still apply."].join("\n"),ey=`You are ${x.name}, ${x.title}.
35
35
 
36
- ${eo}
36
+ ${ei}
37
37
 
38
- ${e_}${ev?`
38
+ ${ea}${ev?`
39
39
 
40
40
  ${ev}`:""}`,eb=X?'This plain group turn is decided by the open-group instruction, not by your standing description. Do not use WAKE. Do not repeat an earlier handoff. Do not post "Please review my research". Do not acknowledge a handoff.':`Standing rules for the reply you are about to write, verbatim:
41
- ${M.description}
42
- The standing rules decide the whole reply. If they require one short sentence, write one short clause and stop. Do not answer with a long sentence, a list, or extra detail.`;if(L&&L.turns>=12){n.messages.create(e.conversation_id,"bot",S,M.id),r.uiTurns.cancelPending(e.conversation_id),K();return}L?.addTurns(1);let ek=[{role:"system",content:ey},...en,{role:"system",content:eb}];ev&&ek.push({role:"system",content:ev});let eE=(0,l.readSkillState)(M.name);Y(e,M,eE,eh,A);let ew=eE.content;if(ew&&ek.push({role:"system",content:ew}),X&&P.group_id&&F){let e=n.groups.getMembers(P.group_id).filter(e=>e.id!==M.id).map(e=>e.title?e.name+" ("+e.title+")":e.name),t=O.some(e=>"bot"===e.sender_type&&!!e.sender_id&&e.sender_id!==M.id&&e.created_at>F.created_at),r=M.title?M.name+" ("+M.title+")":M.name;ek.push({role:"system",content:["Open group turn. Nobody used @. This instruction beats your standing description, the WAKE rules, and every earlier message.\nDecide only from the latest user message:",F.content,'Do not use WAKE. Do not repeat an earlier handoff. Do not post "Please review my research". Do not acknowledge a handoff.',"You are "+r+".",e.length?"Other members: "+e.join(", ")+".":"You are the only member.",t?"A peer may already have posted. Ignore that if it is an earlier handoff. Still decide from the latest user message.":"No peer has replied yet.","If the latest message asks a named role or person to say an exact word, only the member whose name or role fits replies, and the entire reply is that word and nothing else. Everyone else replies exactly PASS.\nIf it asks for an exact word and names nobody: reply exactly PASS when your standing description tells you to WAKE or to hand off research. Otherwise the entire reply is that word and nothing else.\nIf you stay silent, the entire reply is exactly PASS. PASS is discarded and not shown.\nIf you reply, write the reply only. Do not include PASS."].join("\n")})}{let t=(0,c.loadHermesConfig)(),r=t?(0,c.hermesSessionIdForBot)(M.id,t):null;{if(!t){n.messages.create(e.conversation_id,"bot","[Hermes configuration missing: HERMES_API_SERVER_KEY is not set. Set it to enable persistent Hermes turns. No fallback transport attempted.]",M.id),K();return}let i=new AbortController;I(e.conversation_id,i);try{q=await (0,c.hermesChat)({config:t,profilePath:(0,c.hermesProfilePathForBot)(M),sessionId:r,messages:ek.map(e=>({role:e.role,content:e.content})),signal:i.signal})}catch(i){let t,r;i instanceof c.HermesError&&"aborted"===i.code||L?.stopped||n.messages.create(e.conversation_id,"bot",(y=M.name,r=(t=i instanceof c.HermesError?i.message:String(i)).length>200?t.slice(0,197)+"...":t,`[Hermes turn failed for ${y}: ${r}]`),M.id),K();return}finally{$(e.conversation_id,i)}}}if(L?.stopped||X&&(N=q.trim().replace(/^`+|`+$/g,"").trim(),/^pass[.!]?$/i.test(N)||(R=q,/WAKE\s+\w+\s*:/.test(R)||/please review my research/i.test(R)||/\[Handing off to\b/i.test(R))))return void K();!function(e){try{let t=(0,o.parseFileNames)(e);if(0===t.length)return;for(let n of t){let t=function(e,t){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=e.split("\n"),i=r.findIndex(e=>RegExp(`^\\s*\\[file\\]\\s*${n}\\s*$`,"i").test(e));if(i<0)return null;let o=r.slice(i+1).join("\n").match(/```(?:[a-zA-Z0-9_-]+)?\r?\n([\s\S]*?)```/);return o?o[1].replace(/\r\n/g,"\n"):null}(e,n);if(null!==t)try{(0,s.writeArtifactFile)(n,t,{allowOverwrite:!1})}catch{continue}}}catch(e){console.error("Error materializing file artifact:",e)}}(q);let eS=(0,s.parseTypedResult)(q);if(eS){let r=F?O.findIndex(e=>e.id===F.id):-1,i=r>=0?O.slice(r+1):[];if("draft"===eS.kind){i.some(e=>"bot"===e.sender_type&&e.sender_id===M.id&&(0,o.parseDraft)(e.content))||n.messages.create(e.conversation_id,"bot",(0,o.serializeDraft)((0,a.createDraft)(eS.draft)),M.id),K();return}let d=eS.file;if(i.some(e=>"bot"===e.sender_type&&e.sender_id===M.id&&e.content.startsWith((0,s.artifactCardText)(d.name))))return void K();let u=!1;try{u=t.default.existsSync((0,s.resolveArtifactPath)(d.name))}catch{K();return}if(u){if(!es(e.conversation_id,i,M.id)){let t=ed(e.conversation_id,d.name);try{(0,h.createApprovalRequest)({conversationId:e.conversation_id,botId:M.id,code:t,actionType:"write_file",actionArgs:{name:d.name,content:d.content}})}catch(e){if(e instanceof h.ApprovalActionRefused)return void K();throw e}let r=(0,l.applySkillEndToken)(M.name,(0,h.approvalCardText)(t)),i=n.messages.create(e.conversation_id,"bot",r,M.id);(0,h.setApprovalMessage)(e.conversation_id,t,i.id)}K();return}try{(0,s.writeArtifactFile)(d.name,d.content,{allowOverwrite:!1})}catch{K();return}return n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(M.name,(0,s.artifactCardText)(d.name)),M.id),void K()}let eA=(0,_.parseAskMarker)(q);if(eA){let t=F?F.id:null,r=(0,_.pendingForBot)(e.conversation_id,M.id);if(r&&t&&r.task_message_id===t)return void K();let i=(0,_.createPendingQuestion)({conversationId:e.conversation_id,botId:M.id,question:eA,taskMessageId:t,taskContent:F?F.content:null}),o=n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(M.name,eA),M.id);return(0,_.setQuestionMessage)(i.id,o.id),ea(e.conversation_id,o),void K()}let eT=(0,c.loadHermesConfig)();if(eT&&!X){let t=q.split(/(?=WAKE\s+[A-Za-z0-9_-]+\s*:)/gi).map(e=>e.match(/WAKE\s+([A-Za-z0-9_-]+)\s*:\s*([\s\S]*)/i)).filter(e=>!!e).map(e=>({target:e[1],message:(e[2]||"").trim()})).filter(e=>e.message.length>0);if(t.length>0){let r=t.map(e=>{if("GROUP"===e.target.toUpperCase()&&"group"===P.type)return{directive:e,bot:null,group:!0,unknown:!1};let t=n.bots.getByName(e.target);return t?{directive:e,bot:t,group:!1,unknown:!1}:{directive:e,bot:null,group:!1,unknown:!0}}),i=r.filter(e=>!e.group&&!e.unknown&&"hermes-gateway"===(0,k.agentTransport)((0,k.resolveAgent)(e.bot).agent)&&(0,k.resolveAgent)(e.bot).launchable);if(i.length===r.length)return void await ei({item:e,bot:M,conversation:P,chain:L,responseContent:q,targets:i.map(e=>({directive:e.directive,bot:e.bot})),hermesConfig:eT})}}let eR=q.match(/WAKE\s+(\w+):\s*([\s\S]+)/);if(eR){let[,t,r]=eR,i="GROUP"===t.toUpperCase()&&"group"===P.type,o=i?null:n.bots.getByName(t);if(i||o){let a=eR.index??q.indexOf(eR[0]),s=q.slice(0,a).trim();if(s&&ea(e.conversation_id,n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(M.name,s),M.id)),L?.stopped)return void K();if(L&&L.handoffs>=3){n.messages.create(e.conversation_id,"bot",w,M.id),K();return}if(i){let t=r.replace(/data:image\/[a-zA-Z0-9.+-]+;base64,[A-Za-z0-9+/=\s]+/g,"").trim();if(t){ea(e.conversation_id,n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(M.name,t),M.id));let r=n.groups.getMembers(P.group_id).find(e=>e.id!==M.id);r&&(D(e,r.id),L&&(L.addHandoffs(1),L.pushFrame({delegateId:r.id,callerId:M.id})))}}else if(o){let i=n.messages.create(e.conversation_id,"bot",`[Handing off to ${o.name}]
43
- ${r.trim()}`,M.id);ea(e.conversation_id,i),n.wakeTargets.accept({conversationId:e.conversation_id,requestedTarget:t,sourceBotId:M.id,sourceMessageId:i.id}),D(e,o.id),L&&(L.addHandoffs(1),L.pushFrame({delegateId:o.id,callerId:M.id}))}}else ea(e.conversation_id,n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(M.name,q),M.id)),C(e,L,M.id)}else ea(e.conversation_id,n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(M.name,q),M.id)),C(e,L,M.id);K()}function ea(e,t){try{(0,h.recordModelApproval)(e,t)}catch(e){console.error("Error recording approval:",e)}}function es(e,t,n){return t.some(t=>{if("bot"!==t.sender_type||t.sender_id!==n)return!1;let r=(0,o.parseApprovalCode)(t.content);return!!r&&!!(0,h.getApprovalByCode)(e,r)})}function ed(e,t){for(let n=0;n<8;n++){let n=(0,h.mintApprovalCode)(`write-${t}`);if(!(0,h.getApprovalByCode)(e,n))return n}return(0,h.mintApprovalCode)(`write-${t}-${Date.now().toString(36)}`)}function el(e,t){let n=-1;for(let t=0;t<e.length;t++)"user"===e[t].sender_type&&(n=t);if(n<0)return!1;let r=`[Handing off to ${t}]`;for(let t=n+1;t<e.length;t++){let n=e[t];if("bot"===n.sender_type&&n.content.includes(r))return!0}return!1}function eu(e,t){if(e.handoff_targets)try{let n=JSON.parse(e.handoff_targets);if(Array.isArray(n)&&n.map(e=>String(e)).includes(t.id))return!0}catch{}let n="@"+t.name,r=0;for(;r<e.content.length;){let t=e.content.indexOf(n,r);if(t<0)break;let i=e.content[t+n.length];if(!i||/[\s.,!?:;]/.test(i))return!0;r=t+n.length}return!1}function ec(e){if(ef(e))return null;let t=e.trim().replace(/[.!\s]+$/,"").match(/^(?:(.+?),\s*)?reply with exactly the (?:word|token)\s+(\S+)$/i);if(!t)return null;let n=t[2].replace(/^[`"']+|[`"']+$/g,"");return n?{word:n,named:(t[1]?t[1].trim():null)||null}:null}function ef(e){let t=e.trim().replace(/[.!\s]+$/,"").match(/^@(\S+)\s+(?:hand this to|hand off to|pass this to)\s+(.+?):\s*(.+)$/i);if(!t)return null;let n=t[1].replace(/^[`"'"]+|[`"'"]+$/g,"").trim(),r=t[2].trim().replace(/^[`"'"]+|[`"'"]+$/g,"").trim(),i=t[3].trim();return n&&r&&i?{fromName:n,toName:r,task:i}:null}function ep(e,t){let n=t.trim().toLowerCase().replace(/^the\s+/,"");return!!n&&(e.name.toLowerCase()===n||(e.title||"").trim().toLowerCase()===n)}function em(e){return/WAKE\s+\w+\s*:/.test(e)||/please review my research/i.test(e)}function eg(e){let t=n.bots.getById(e);return t?.name||"Unknown"}L&&(n.bots.touchSeen(),r.uiTurns.recoverInterrupted(),F(),(0,y.recoverCoordinatorLoops)().catch(console.error),setInterval(()=>{n.bots.touchSeen(),F(),en().catch(console.error),(0,y.sweepDispatch)().catch(console.error)},2e3)),e.s(["processUiTurns",0,en,"stopDelegation",0,function(e){let t=[...n.messages.getByConversation(e)].reverse().find(e=>"user"===e.sender_type),o=t?(0,i.chainFor)(e,t.id):null,a=o?.stopped??!1,s=!!o&&(o.turns>0||o.handoffs>0),d=r.uiTurns.cancelPending(e),l=function(e){let t=R.get(e);if(!t||0===t.size)return 0;let n=t.size;for(let e of t)try{e.abort()}catch{}return R.delete(e),n}(e),u=0;try{u=(0,_.clearForConversation)(e)}catch(e){console.error("Error clearing pending questions:",e)}o&&o.stop();let c=d>0||l>0||u>0||s&&!a;return c&&n.messages.create(e,"bot","[Delegation stopped] Delegation stopped. No further handoffs or delegated turns."),c}])},88355,e=>{"use strict";var t=e.i(54799),n=e.i(62294);function r(e){return{id:String(e.id),conversation_id:String(e.conversation_id),bot_id:String(e.bot_id),question:String(e.question),task_message_id:e.task_message_id??null,task_content:e.task_content??null,question_message_id:e.question_message_id??null,answer_message_id:e.answer_message_id??null,answer:e.answer??null,status:e.status,created_at:Number(e.created_at),resolved_at:e.resolved_at??null}}function i(e){let t=n.default.prepare("SELECT * FROM pending_questions WHERE id = ?").get(e);return t?r(t):void 0}function o(e){return n.default.prepare("SELECT * FROM pending_questions WHERE conversation_id = ? AND status = 'asked' ORDER BY created_at ASC, rowid ASC").all(e).map(r)}function a(e){let t=e.trim().replace(/\s+/g," ");return(t=(t=t.replace(/^—\s*/,"").replace(/\s*—\s*$/,"").trim()).replace(/\s*,?\s*(?:then|and)\s+wait(?:\s+for\s+my\s+answer)?\s*[.!]?\s*$/i,"").trim())?t:null}e.s(["clearForConversation",0,function(e){return Number(n.default.prepare("UPDATE pending_questions SET status = 'expired', resolved_at = ? WHERE conversation_id = ? AND status = 'asked'").run(Date.now(),e).changes)},"createPendingQuestion",0,function(e){let r=e.question.trim();if(!r)throw Error("question is required");let o=Date.now();return n.default.transaction(()=>{n.default.prepare("UPDATE pending_questions SET status = 'expired', resolved_at = ? WHERE conversation_id = ? AND bot_id = ? AND status = 'asked'").run(o,e.conversationId,e.botId);let a=(0,t.randomUUID)();return n.default.prepare(`INSERT INTO pending_questions
41
+ ${x.description}
42
+ The standing rules decide the whole reply. If they require one short sentence, write one short clause and stop. Do not answer with a long sentence, a list, or extra detail.`;if(H&&H.turns>=12){n.messages.create(e.conversation_id,"bot",T,x.id),r.uiTurns.cancelPending(e.conversation_id),j();return}H?.addTurns(1);let ek=[{role:"system",content:ey},...en,{role:"system",content:eb}];ev&&ek.push({role:"system",content:ev});let ew=(0,l.readSkillState)(x.name);J(e,x,ew,e_,A);let eE=ew.content;if(eE&&ek.push({role:"system",content:eE}),X&&M.group_id&&W){let e=n.groups.getMembers(M.group_id).filter(e=>e.id!==x.id).map(e=>e.title?e.name+" ("+e.title+")":e.name),t=O.some(e=>"bot"===e.sender_type&&!!e.sender_id&&e.sender_id!==x.id&&e.created_at>W.created_at),r=x.title?x.name+" ("+x.title+")":x.name;ek.push({role:"system",content:["Open group turn. Nobody used @. This instruction beats your standing description, the WAKE rules, and every earlier message.\nDecide only from the latest user message:",W.content,'Do not use WAKE. Do not repeat an earlier handoff. Do not post "Please review my research". Do not acknowledge a handoff.',"You are "+r+".",e.length?"Other members: "+e.join(", ")+".":"You are the only member.",t?"A peer may already have posted. Ignore that if it is an earlier handoff. Still decide from the latest user message.":"No peer has replied yet.","If the latest message asks a named role or person to say an exact word, only the member whose name or role fits replies, and the entire reply is that word and nothing else. Everyone else replies exactly PASS.\nIf it asks for an exact word and names nobody: reply exactly PASS when your standing description tells you to WAKE or to hand off research. Otherwise the entire reply is that word and nothing else.\nIf you stay silent, the entire reply is exactly PASS. PASS is discarded and not shown.\nIf you reply, write the reply only. Do not include PASS."].join("\n")})}{let t=(0,c.loadHermesConfig)(),r=t?(0,c.hermesSessionIdForBot)(x.id,t):null;{if(!t){n.messages.create(e.conversation_id,"bot","[Hermes configuration missing: HERMES_API_SERVER_KEY is not set. Set it to enable persistent Hermes turns. No fallback transport attempted.]",x.id),j();return}let i=new AbortController;C(e.conversation_id,i);try{q=await (0,c.hermesChat)({config:t,profilePath:(0,c.hermesProfilePathForBot)(x),sessionId:r,messages:ek.map(e=>({role:e.role,content:e.content})),signal:i.signal})}catch(i){let t,r;i instanceof c.HermesError&&"aborted"===i.code||H?.stopped||n.messages.create(e.conversation_id,"bot",(y=x.name,r=(t=i instanceof c.HermesError?i.message:String(i)).length>200?t.slice(0,197)+"...":t,`[Hermes turn failed for ${y}: ${r}]`),x.id),j();return}finally{$(e.conversation_id,i)}}}if(H?.stopped||X&&(I=q.trim().replace(/^`+|`+$/g,"").trim(),/^pass[.!]?$/i.test(I)||(R=q,/WAKE\s+\w+\s*:/.test(R)||/please review my research/i.test(R)||/\[Handing off to\b/i.test(R))))return void j();!function(e){try{let t=(0,o.parseFileNames)(e);if(0===t.length)return;for(let n of t){let t=function(e,t){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=e.split("\n"),i=r.findIndex(e=>RegExp(`^\\s*\\[file\\]\\s*${n}\\s*$`,"i").test(e));if(i<0)return null;let o=r.slice(i+1).join("\n").match(/```(?:[a-zA-Z0-9_-]+)?\r?\n([\s\S]*?)```/);return o?o[1].replace(/\r\n/g,"\n"):null}(e,n);if(null!==t)try{(0,s.writeArtifactFile)(n,t,{allowOverwrite:!1})}catch{continue}}}catch(e){console.error("Error materializing file artifact:",e)}}(q);let eS=(0,s.parseTypedResult)(q);if(eS){let r=W?O.findIndex(e=>e.id===W.id):-1,i=r>=0?O.slice(r+1):[];if("draft"===eS.kind){i.some(e=>"bot"===e.sender_type&&e.sender_id===x.id&&(0,o.parseDraft)(e.content))||n.messages.create(e.conversation_id,"bot",(0,o.serializeDraft)((0,a.createDraft)(eS.draft)),x.id),j();return}let d=eS.file;if(i.some(e=>"bot"===e.sender_type&&e.sender_id===x.id&&e.content.startsWith((0,s.artifactCardText)(d.name))))return void j();let u=!1;try{u=t.default.existsSync((0,s.resolveArtifactPath)(d.name))}catch{j();return}if(u){if(!ed(e.conversation_id,i,x.id)){let t=el(e.conversation_id,d.name);try{(0,_.createApprovalRequest)({conversationId:e.conversation_id,botId:x.id,code:t,actionType:"write_file",actionArgs:{name:d.name,content:d.content}})}catch(e){if(e instanceof _.ApprovalActionRefused)return void j();throw e}let r=(0,l.applySkillEndToken)(x.name,(0,_.approvalCardText)(t)),i=n.messages.create(e.conversation_id,"bot",r,x.id);(0,_.setApprovalMessage)(e.conversation_id,t,i.id)}j();return}try{(0,s.writeArtifactFile)(d.name,d.content,{allowOverwrite:!1})}catch{j();return}return n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(x.name,(0,s.artifactCardText)(d.name)),x.id),void j()}let eT=(0,h.parseAskMarker)(q);if(eT){let t=W?W.id:null,r=(0,h.pendingForBot)(e.conversation_id,x.id);if(r&&t&&r.task_message_id===t)return void j();let i=(0,h.createPendingQuestion)({conversationId:e.conversation_id,botId:x.id,question:eT,taskMessageId:t,taskContent:W?W.content:null}),o=n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(x.name,eT),x.id);return(0,h.setQuestionMessage)(i.id,o.id),es(e.conversation_id,o),void j()}let eA=(0,c.loadHermesConfig)();if(eA&&!X){let t=q.split(/(?=WAKE\s+[A-Za-z0-9_-]+\s*:)/gi).map(e=>e.match(/WAKE\s+([A-Za-z0-9_-]+)\s*:\s*([\s\S]*)/i)).filter(e=>!!e).map(e=>({target:e[1],message:(e[2]||"").trim()})).filter(e=>e.message.length>0);if(t.length>0){let r=t.map(e=>{if("GROUP"===e.target.toUpperCase()&&"group"===M.type)return{directive:e,bot:null,group:!0,unknown:!1};let t=n.bots.getByName(e.target);return t?{directive:e,bot:t,group:!1,unknown:!1}:{directive:e,bot:null,group:!1,unknown:!0}}),i=r.filter(e=>!e.group&&!e.unknown&&"hermes-gateway"===(0,k.agentTransport)((0,k.resolveAgent)(e.bot).agent)&&(0,k.resolveAgent)(e.bot).launchable);if(i.length===r.length)return void await eo({item:e,bot:x,conversation:M,chain:H,responseContent:q,targets:i.map(e=>({directive:e.directive,bot:e.bot})),hermesConfig:eA})}}let eR=q.match(/WAKE\s+(\w+):\s*([\s\S]+)/);if(eR){let[,t,r]=eR,i="GROUP"===t.toUpperCase()&&"group"===M.type,o=i?null:n.bots.getByName(t);if(i||o){let a=eR.index??q.indexOf(eR[0]),s=q.slice(0,a).trim();if(s&&es(e.conversation_id,n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(x.name,s),x.id)),H?.stopped)return void j();if(H&&H.handoffs>=3){n.messages.create(e.conversation_id,"bot",S,x.id),j();return}if(i){let t=r.replace(/data:image\/[a-zA-Z0-9.+-]+;base64,[A-Za-z0-9+/=\s]+/g,"").trim();if(t){es(e.conversation_id,n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(x.name,t),x.id));let r=n.groups.getMembers(M.group_id).find(e=>e.id!==x.id);r&&(D(e,r.id),H&&(H.addHandoffs(1),H.pushFrame({delegateId:r.id,callerId:x.id})))}}else if(o){let i=n.messages.create(e.conversation_id,"bot",`[Handing off to ${o.name}]
43
+ ${r.trim()}`,x.id);es(e.conversation_id,i),n.wakeTargets.accept({conversationId:e.conversation_id,requestedTarget:t,sourceBotId:x.id,sourceMessageId:i.id}),D(e,o.id),H&&(H.addHandoffs(1),H.pushFrame({delegateId:o.id,callerId:x.id}))}}else es(e.conversation_id,n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(x.name,q),x.id)),N(e,H,x.id)}else es(e.conversation_id,n.messages.create(e.conversation_id,"bot",(0,l.applySkillEndToken)(x.name,q),x.id)),N(e,H,x.id);j()}function es(e,t){try{(0,_.recordModelApproval)(e,t)}catch(e){console.error("Error recording approval:",e)}}function ed(e,t,n){return t.some(t=>{if("bot"!==t.sender_type||t.sender_id!==n)return!1;let r=(0,o.parseApprovalCode)(t.content);return!!r&&!!(0,_.getApprovalByCode)(e,r)})}function el(e,t){for(let n=0;n<8;n++){let n=(0,_.mintApprovalCode)(`write-${t}`);if(!(0,_.getApprovalByCode)(e,n))return n}return(0,_.mintApprovalCode)(`write-${t}-${Date.now().toString(36)}`)}function eu(e,t){let n=-1;for(let t=0;t<e.length;t++)"user"===e[t].sender_type&&(n=t);if(n<0)return!1;let r=`[Handing off to ${t}]`;for(let t=n+1;t<e.length;t++){let n=e[t];if("bot"===n.sender_type&&n.content.includes(r))return!0}return!1}function ec(e,t){if(e.handoff_targets)try{let n=JSON.parse(e.handoff_targets);if(Array.isArray(n)&&n.map(e=>String(e)).includes(t.id))return!0}catch{}let n="@"+t.name,r=0;for(;r<e.content.length;){let t=e.content.indexOf(n,r);if(t<0)break;let i=e.content[t+n.length];if(!i||/[\s.,!?:;]/.test(i))return!0;r=t+n.length}return!1}function ef(e){if(ep(e))return null;let t=e.trim().replace(/[.!\s]+$/,"").match(/^(?:(.+?),\s*)?reply with exactly the (?:word|token)\s+(\S+)$/i);if(!t)return null;let n=t[2].replace(/^[`"']+|[`"']+$/g,"");return n?{word:n,named:(t[1]?t[1].trim():null)||null}:null}function ep(e){let t=e.trim().replace(/[.!\s]+$/,"").match(/^@(\S+)\s+(?:hand this to|hand off to|pass this to)\s+(.+?):\s*(.+)$/i);if(!t)return null;let n=t[1].replace(/^[`"'"]+|[`"'"]+$/g,"").trim(),r=t[2].trim().replace(/^[`"'"]+|[`"'"]+$/g,"").trim(),i=t[3].trim();return n&&r&&i?{fromName:n,toName:r,task:i}:null}function em(e,t){let n=t.trim().toLowerCase().replace(/^the\s+/,"");return!!n&&(e.name.toLowerCase()===n||(e.title||"").trim().toLowerCase()===n)}function eg(e){return/WAKE\s+\w+\s*:/.test(e)||/please review my research/i.test(e)}function eh(e){let t=n.bots.getById(e);return t?.name||"Unknown"}K&&(n.bots.touchSeen(),r.uiTurns.recoverInterrupted(),H(),(0,y.recoverCoordinatorLoops)().catch(console.error),setInterval(()=>{n.bots.touchSeen(),H(),er().catch(console.error),(0,y.sweepDispatch)().catch(console.error)},2e3)),e.s(["processUiTurns",0,er,"stopDelegation",0,function(e){let t=[...n.messages.getByConversation(e)].reverse().find(e=>"user"===e.sender_type),o=t?(0,i.chainFor)(e,t.id):null,a=o?.stopped??!1,s=!!o&&(o.turns>0||o.handoffs>0),d=r.uiTurns.cancelPending(e),l=function(e){let t=I.get(e);if(!t||0===t.size)return 0;let n=t.size;for(let e of t)try{e.abort()}catch{}return I.delete(e),n}(e),u=0;try{u=(0,h.clearForConversation)(e)}catch(e){console.error("Error clearing pending questions:",e)}o&&o.stop();let c=d>0||l>0||u>0||s&&!a;return c&&n.messages.create(e,"bot","[Delegation stopped] Delegation stopped. No further handoffs or delegated turns."),c}])},88355,e=>{"use strict";var t=e.i(54799),n=e.i(62294);function r(e){return{id:String(e.id),conversation_id:String(e.conversation_id),bot_id:String(e.bot_id),question:String(e.question),task_message_id:e.task_message_id??null,task_content:e.task_content??null,question_message_id:e.question_message_id??null,answer_message_id:e.answer_message_id??null,answer:e.answer??null,status:e.status,created_at:Number(e.created_at),resolved_at:e.resolved_at??null}}function i(e){let t=n.default.prepare("SELECT * FROM pending_questions WHERE id = ?").get(e);return t?r(t):void 0}function o(e){return n.default.prepare("SELECT * FROM pending_questions WHERE conversation_id = ? AND status = 'asked' ORDER BY created_at ASC, rowid ASC").all(e).map(r)}function a(e){let t=e.trim().replace(/\s+/g," ");return(t=(t=t.replace(/^—\s*/,"").replace(/\s*—\s*$/,"").trim()).replace(/\s*,?\s*(?:then|and)\s+wait(?:\s+for\s+my\s+answer)?\s*[.!]?\s*$/i,"").trim())?t:null}e.s(["clearForConversation",0,function(e){return Number(n.default.prepare("UPDATE pending_questions SET status = 'expired', resolved_at = ? WHERE conversation_id = ? AND status = 'asked'").run(Date.now(),e).changes)},"createPendingQuestion",0,function(e){let r=e.question.trim();if(!r)throw Error("question is required");let o=Date.now();return n.default.transaction(()=>{n.default.prepare("UPDATE pending_questions SET status = 'expired', resolved_at = ? WHERE conversation_id = ? AND bot_id = ? AND status = 'asked'").run(o,e.conversationId,e.botId);let a=(0,t.randomUUID)();return n.default.prepare(`INSERT INTO pending_questions
44
44
  (id, conversation_id, bot_id, question, task_message_id, task_content, question_message_id, status, created_at)
45
45
  VALUES (?, ?, ?, ?, ?, ?, ?, 'asked', ?)`).run(a,e.conversationId,e.botId,r,e.taskMessageId??null,e.taskContent??null,e.questionMessageId??null,o),i(a)})()},"findAnsweredByAnswer",0,function(e,t,i){let o=n.default.prepare("SELECT * FROM pending_questions WHERE conversation_id = ? AND bot_id = ? AND answer_message_id = ? AND status = 'answered' ORDER BY created_at DESC LIMIT 1").get(e,t,i);return o?r(o):void 0},"findByTask",0,function(e,t,i){let o=n.default.prepare("SELECT * FROM pending_questions WHERE conversation_id = ? AND bot_id = ? AND task_message_id = ? ORDER BY created_at DESC LIMIT 1").get(e,t,i);return o?r(o):void 0},"listAskedForConversation",0,o,"parseAskMarker",0,function(e){if(!e)return null;let t=e.match(/<ask>\s*([\s\S]*?)\s*<\/ask>/i);if(t)return t[1].trim()||null;for(let t of e.split(/\r?\n/)){let e=t.match(/^\s*\[ask\]\s*(.+?)\s*$/i);if(e){let t=e[1].trim();if(t)return t}}return null},"parseAskRequest",0,function(e){let t=(e||"").trim();if(!t||!/\bask\b/i.test(t)||!/\bwait\b/i.test(t))return null;let n=t.match(/ask\b[^:—]*[:—]\s*(.+?)\s*(?:then|and)\s+wait\b/is);if(n){let e=a(n[1]||"");if(e)return e}let r=t.match(/ask\b(.+?)\bthen\s+wait\b/is);if(r){let e=(r[1]||"").trim(),t=a(e=e.replace(/^me\b\s*/i,"").replace(/^(?:this|that|one|a)\b\s*/i,"").replace(/^(?:question|thing)\b\s*/i,"").replace(/^first\b\s*/i,"").replace(/^[:—,\-\s]+/,"").trim());if(t&&t.length>=2)return t}let i=t.match(/first\b\s*[:—]?\s*(.+?)\s*(?:then|and)\s+wait\b/is);if(i){let e=a(i[1]||"");if(e)return e}return null},"pendingForBot",0,function(e,t){let i=n.default.prepare("SELECT * FROM pending_questions WHERE conversation_id = ? AND bot_id = ? AND status = 'asked' ORDER BY created_at DESC LIMIT 1").get(e,t);return i?r(i):void 0},"resolveQuestion",0,function(e,t,r){let o=r.trim();if(!o)return null;let a=Date.now();return 1!==n.default.prepare(`UPDATE pending_questions SET status = 'answered', answer_message_id = ?, answer = ?, resolved_at = ?
46
46
  WHERE id = ? AND status = 'asked'`).run(t,o,a,e).changes?null:i(e)??null},"resumeBotIdsForConversation",0,function(e){let t=o(e);return 0===t.length?null:[...new Set(t.map(e=>e.bot_id))]},"resumePrompt",0,function(e){let t=(e.taskContent||"").trim(),n=["[ask-resume] The person answered your parked question. Continue the original task using the answer exactly once.",`Question: ${e.question.trim()}`,`Answer: ${e.answer.trim()}`];return t&&n.push(`Original task: ${t}`),n.push("Reply with the continued task result. Do not ask the question again."),n.join("\n")},"setQuestionMessage",0,function(e,t){n.default.prepare("UPDATE pending_questions SET question_message_id = ? WHERE id = ?").run(t,e)}])},57147,43084,1912,15467,e=>{"use strict";var t=e.i(54799),n=e.i(62294),r=e.i(35613);let i="('ui_message', 'ui_continuation')";function o(e){return{id:e.id,conversation_id:e.source_conversation_id,bot_id:e.target_agent_id,created_at:e.created_at,kind:"ui_continuation"===e.executor?"continuation":"message"}}function a(e){return!!e&&("ui_message"===e.executor||"ui_continuation"===e.executor)}function s(e){try{return e(),!0}catch(e){if(e instanceof r.EngineStoreError&&"stale_state"===e.code)return!1;throw e}}let d={get(e){let t=n.engine.getWorkRequest(e);return a(t)?o(t):void 0},listByConversation:e=>n.default.prepare(`
@@ -54,6 +54,6 @@ ${r.trim()}`,M.id);ea(e.conversation_id,i),n.wakeTargets.accept({conversationId:
54
54
  VALUES (?, ?, ?, ?)
55
55
  `).run(e,t,r,r),new c(e,t)},"existingChain",0,function(e,t){return n.default.prepare("SELECT 1 FROM delegation_chains WHERE conversation_id = ? AND user_message_id = ?").get(e,t)?new c(e,t):null}],43084);var f=e.i(33405);async function p(e,t,n){return n.includes("{")?new Promise((r,i)=>{let o=(0,f.spawn)(e,t,{stdio:["pipe","pipe","pipe"]}),a=Buffer.alloc(0),s=1,d=new Map,l=!1,u=e=>{l||(l=!0,clearTimeout(p),o.kill(),i(e))},c=e=>{l||(l=!0,clearTimeout(p),o.kill(),r(e))},p=setTimeout(()=>u(Error("MCP server timed out")),8e3);o.stdin.on("error",()=>void 0),o.on("error",e=>u(e)),o.on("exit",e=>{l||u(Error(`MCP server exited ${e}`))});let m=e=>{let t;o.stdin.write((t=JSON.stringify(e),`Content-Length: ${Buffer.byteLength(t,"utf8")}\r
56
56
  \r
57
- ${t}`))},g=(e,t)=>{let n=s++;return new Promise((r,i)=>{d.set(n,e=>{e.error?i(Error(e.error.message||"MCP error")):r(e)}),m({jsonrpc:"2.0",id:n,method:e,params:t})})};o.stdout.on("data",e=>{for(a=Buffer.concat([a,e]);;){let e,t=a.indexOf("\r\n\r\n");if(t<0)break;let n=a.slice(0,t).toString("utf8").match(/Content-Length:\s*(\d+)/i);if(!n)return void u(Error("MCP response missing Content-Length"));let r=Number(n[1]),i=t+4;if(a.length<i+r)break;let o=a.slice(i,i+r).toString("utf8");a=a.slice(i+r);try{e=JSON.parse(o)}catch(e){u(e instanceof Error?e:Error("Bad MCP JSON"));return}if("number"==typeof e.id&&d.has(e.id)){let t=d.get(e.id);d.delete(e.id),t&&t(e)}}}),(async()=>{try{await g("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"botmancers",version:"0.1.0"}}),m({jsonrpc:"2.0",method:"notifications/initialized"});let e=(await g("tools/list")).result,t=(e?.tools||[]).map(e=>e.name).filter(Boolean),r=function(e,t){let n,r=e.match(/\{[\s\S]*\}/);if(!r)return null;try{let e=JSON.parse(r[0]);if(!e||"object"!=typeof e||Array.isArray(e))return null;n=e}catch{return null}for(let r of[...t].sort((e,t)=>t.length-e.length)){let t=e.indexOf(r);if(t<0)continue;let i=0===t?"":e[t-1],o=e[t+r.length]||"";if(!(i&&/[A-Za-z0-9_]/.test(i))&&!(o&&/[A-Za-z0-9_]/.test(o)))return{name:r,args:n}}return null}(n,t);if(!r)return void c({tools:t});let i=(await g("tools/call",{name:r.name,arguments:r.args})).result,o=(i?.content||[]).map(e=>e.text||"").join("");if(i?.isError)return void u(Error(o||"MCP tool error"));c({tools:t,invocation:{name:r.name,args:r.args,text:o}})}catch(e){u(e instanceof Error?e:Error("MCP failed"))}})()}):null}e.s(["mcpTurn",0,p],1912);var m=e.i(30098),g=e.i(10860);let _=e.i(49166).IMPORT_SCHEMA_VERSION,h="[A-Za-z0-9_-]+";function v(e){return e.trim().replace(/[.?!;,:'"`]+$/g,"").trim()}function y(e){return e.trim().replace(/\s+/g," ").replace(/[.?!]+$/g,"").trim()}function b(e){return e.trim().replace(/[.?!;,:'"`]+$/g,"").trim()}async function k(e){let t=e.trim();if(!t)return{kind:"none"};let n=function(e){for(let t of[RegExp(`^duplicate\\s+(${h})\\s+as\\s+(${h})\\.?\\s*$`,"i"),RegExp(`\\bmake\\s+(?:me\\s+)?a\\s+copy\\s+of\\s+(?:(?:bot|specialist)\\s+)?(${h})\\s+(?:called|named|as)\\s+(${h})\\b`,"i"),RegExp(`\\b(?:duplicate|copy|clone)\\s+(?:(?:bot|specialist)\\s+)?(${h})\\s+(?:as|to|into)\\s+(?:(?:bot|specialist)\\s+)?(?:called\\s+|named\\s+)?(${h})\\b`,"i")]){let n=e.match(t);if(!n)continue;let r=b(n[1]||""),i=b(n[2]||"");if(r&&i)return{kind:"duplicate",sourceName:r,newName:i}}return{kind:"none"}}(t);if("none"!==n.kind)return n;let r=function(e){let t=e.match(RegExp(`^create a specialist named\\s+(${h})\\.?\\s*the job is:\\s*(.+)$`,"is"));if(t){let e=v(t[1]||""),n=y(t[2]||"");return e&&n?{kind:"create",name:e,job:n}:{kind:"none"}}let n=e.match(RegExp(`\\b(?:create|make|build|spin\\s+up|add)\\s+(?:me\\s+)?(?:a\\s+)?(?:new\\s+)?(?:specialist|bot|assistant|agent)\\s+(?:called\\s+|named\\s+)?(${h})\\s*([\\s\\S]*)$`,"i"));if(!n)return{kind:"none"};let r=v(n[1]||"");if(!r)return{kind:"none"};let i=(n[2]||"").trim();if(!i)return{kind:"none"};let o=y(i=i.replace(/^[.,:;]+\s*/,"").replace(/^(?:that|which|who|to|for|with)\b\s*:?\s*/i,"").replace(/^whose\s+job\s+is\s*:?\s*/i,"").replace(/^the\s+job\s+is\s*:?\s*/i,"").replace(/^is\s*:?\s*/i,"").trim());return o?{kind:"create",name:r,job:o}:{kind:"none"}}(t);return"none"!==r.kind?r:{kind:"none"}}async function E(e){let t=(process.env.CLONE_MARKET_SEARCH_URL||"").trim();if(!t)return null;try{let r=t+(t.includes("?")?"&":"?")+"q="+encodeURIComponent(e),i=await fetch(r,{signal:AbortSignal.timeout(1e4)});if(!i.ok)return null;var n=await i.json();if(!n||"object"!=typeof n)return null;if(n.template&&"object"==typeof n.template)return w(n.template);if(Array.isArray(n.templates)&&n.templates.length>0){let e=n.templates[0];if(e&&"object"==typeof e)return w({template_id:String(e.id??e.template_id??""),template_url:String(e.url??e.template_url??""),source_provider:String(e.provider??e.source_provider??""),title:String(e.title??e.name??""),description:String(e.description??""),avatar:"string"==typeof e.avatar?e.avatar:void 0})}return null}catch{return null}}function w(e){if(!e||"object"!=typeof e)return null;let t=String(e.template_id||"").trim();if(!t)return null;let n=String(e.template_url||"").trim()||(process.env.CLONE_MARKET_URL||"").trim();return n?{template_id:t,template_url:n,source_provider:String(e.source_provider||"").trim()||"clone-market",title:String(e.title||"").trim(),description:String(e.description||"").trim(),avatar:"string"==typeof e.avatar&&e.avatar?e.avatar:void 0}:null}function S(e){return n.bots.getByName(e)}function A(e){try{return e()}catch(e){if(e instanceof m.AgentNameConflictError)return{ok:!1,reason:"collision"};throw e}}function T(e){let n={schema_version:e.schema_version,source_provider:e.source_provider,template_id:e.template_id,template_url:e.template_url,bot:{name:e.bot.name,title:e.bot.title||"",description:e.bot.description||"",avatar:e.bot.avatar||null}};return(0,t.createHash)("sha256").update(JSON.stringify(n)).digest("hex")}function R(e){d.cancelPendingForBot(e);let t=n.conversations.getByBotId(e);t&&d.cancelPending(t.id)}async function I(e,t){let r=e.trim();if(!r)return{ok:!1,reason:"invalid"};if(S(r))return{ok:!1,reason:"collision"};let i=A(()=>n.bots.create({name:r,title:"",description:t,avatar:void 0}));return"ok"in i?i:(R(i.id),{ok:!0,bot:i})}async function $(e,r,i){let o=e.trim();if(!o)return{ok:!1,reason:"invalid"};let a=w(r);if(!a)return{ok:!1,reason:"invalid"};let s=i?.operationId?.trim()||(0,t.randomUUID)(),d={schema_version:_,source_provider:a.source_provider,template_id:a.template_id,template_url:a.template_url,bot:{name:o,title:a.title,description:a.description,avatar:a.avatar}},l=n.bots.getByImportOperationId(s);if(l)return T({schema_version:l.import_schema_version||_,source_provider:l.source_provider||"",template_id:l.template_id||"",template_url:l.template_url||"",bot:{name:l.name,title:l.title,description:l.description,avatar:l.avatar||void 0}})!==T(d)?{ok:!1,reason:"conflict",existingBotId:l.id}:{ok:!0,bot:l,created:!1};if(S(o))return{ok:!1,reason:"collision"};let u=A(()=>n.bots.createFromImport({name:o,title:a.title,description:a.description,avatar:a.avatar},{source_provider:a.source_provider,template_id:a.template_id,template_url:a.template_url,import_schema_version:_,import_operation_id:s,import_timestamp:Date.now()}));return"ok"in u?u:(R(u.id),{ok:!0,bot:u,created:!0})}async function C(e,t){let r=S(e);if(!r)return{ok:!1,reason:"not-found"};let i=t.trim();if(!i)return{ok:!1,reason:"invalid"};if(S(i))return{ok:!1,reason:"collision"};let o=A(()=>n.bots.create({name:i,title:r.title,description:r.description,avatar:void 0}));if("ok"in o)return o;let a=(0,g.localSkillForBot)(r.name);if(a&&(0,g.isSupportedSkillName)(i))try{(0,g.writeSkillForBot)(i,a)}catch{}return R(o.id),{ok:!0,bot:o,source:r}}async function D(e,t,r,i,o){let a,s=await k(r.content);if("none"===s.kind)return!1;if((a=i.findIndex(e=>e.id===r.id))<0?i.some(e=>"bot"===e.sender_type&&e.sender_id===t&&e.created_at>r.created_at):i.slice(a+1).some(e=>"bot"===e.sender_type&&e.sender_id===t))return!0;let d=n.bots.getById(t)?.name??null;if("duplicate"===s.kind){let r=await C(s.sourceName,s.newName);return r.ok||"not-found"!==r.reason?r.ok||"collision"!==r.reason?r.ok?n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Duplicated ${r.source.name} as ${r.bot.name}. Title, description and skill copied; only the name changed. Avatar starts blank. Path: duplicate. New bot id: ${r.bot.id}.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Failed to duplicate ${s.sourceName} as ${s.newName}.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`${(0,m.agentNameConflictMessage)(s.newName)} No bot created.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`I could not find ${s.sourceName} to duplicate. No bot created.`),t),!0}if(S(s.name))return n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`${(0,m.agentNameConflictMessage)(s.name)} No bot created.`),t),!0;let l=await E(s.job);if(l){let r=await $(s.name,l,o);return r.ok||"collision"!==r.reason?r.ok?n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Created ${r.bot.name} from the matching marketplace template (${l.template_id}). Path: template. New bot id: ${r.bot.id}.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Failed to import ${s.name} from the matching template.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`${(0,m.agentNameConflictMessage)(s.name)} No bot created.`),t),!0}let u=await I(s.name,s.job);return u.ok||"collision"!==u.reason?u.ok?n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`None of the templates fit. Created ${u.bot.name} with that job as its description. Path: plain. New bot id: ${u.bot.id}.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Failed to create ${s.name}: invalid name.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`${(0,m.agentNameConflictMessage)(s.name)} No bot created.`),t),!0}e.s(["handleCosBirthRequest",0,D],15467)}];
57
+ ${t}`))},g=(e,t)=>{let n=s++;return new Promise((r,i)=>{d.set(n,e=>{e.error?i(Error(e.error.message||"MCP error")):r(e)}),m({jsonrpc:"2.0",id:n,method:e,params:t})})};o.stdout.on("data",e=>{for(a=Buffer.concat([a,e]);;){let e,t=a.indexOf("\r\n\r\n");if(t<0)break;let n=a.slice(0,t).toString("utf8").match(/Content-Length:\s*(\d+)/i);if(!n)return void u(Error("MCP response missing Content-Length"));let r=Number(n[1]),i=t+4;if(a.length<i+r)break;let o=a.slice(i,i+r).toString("utf8");a=a.slice(i+r);try{e=JSON.parse(o)}catch(e){u(e instanceof Error?e:Error("Bad MCP JSON"));return}if("number"==typeof e.id&&d.has(e.id)){let t=d.get(e.id);d.delete(e.id),t&&t(e)}}}),(async()=>{try{await g("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"botmancers",version:"0.1.0"}}),m({jsonrpc:"2.0",method:"notifications/initialized"});let e=(await g("tools/list")).result,t=(e?.tools||[]).map(e=>e.name).filter(Boolean),r=function(e,t){let n,r=e.match(/\{[\s\S]*\}/);if(!r)return null;try{let e=JSON.parse(r[0]);if(!e||"object"!=typeof e||Array.isArray(e))return null;n=e}catch{return null}for(let r of[...t].sort((e,t)=>t.length-e.length)){let t=e.indexOf(r);if(t<0)continue;let i=0===t?"":e[t-1],o=e[t+r.length]||"";if(!(i&&/[A-Za-z0-9_]/.test(i))&&!(o&&/[A-Za-z0-9_]/.test(o)))return{name:r,args:n}}return null}(n,t);if(!r)return void c({tools:t});let i=(await g("tools/call",{name:r.name,arguments:r.args})).result,o=(i?.content||[]).map(e=>e.text||"").join("");if(i?.isError)return void u(Error(o||"MCP tool error"));c({tools:t,invocation:{name:r.name,args:r.args,text:o}})}catch(e){u(e instanceof Error?e:Error("MCP failed"))}})()}):null}e.s(["mcpTurn",0,p],1912);var m=e.i(30098),g=e.i(10860);let h=e.i(49166).IMPORT_SCHEMA_VERSION,_="[A-Za-z0-9_-]+";function v(e){return e.trim().replace(/[.?!;,:'"`]+$/g,"").trim()}function y(e){return e.trim().replace(/\s+/g," ").replace(/[.?!]+$/g,"").trim()}function b(e){return e.trim().replace(/[.?!;,:'"`]+$/g,"").trim()}async function k(e){let t=e.trim();if(!t)return{kind:"none"};let n=function(e){for(let t of[RegExp(`^duplicate\\s+(${_})\\s+as\\s+(${_})\\.?\\s*$`,"i"),RegExp(`\\bmake\\s+(?:me\\s+)?a\\s+copy\\s+of\\s+(?:(?:bot|specialist)\\s+)?(${_})\\s+(?:called|named|as)\\s+(${_})\\b`,"i"),RegExp(`\\b(?:duplicate|copy|clone)\\s+(?:(?:bot|specialist)\\s+)?(${_})\\s+(?:as|to|into)\\s+(?:(?:bot|specialist)\\s+)?(?:called\\s+|named\\s+)?(${_})\\b`,"i")]){let n=e.match(t);if(!n)continue;let r=b(n[1]||""),i=b(n[2]||"");if(r&&i)return{kind:"duplicate",sourceName:r,newName:i}}return{kind:"none"}}(t);if("none"!==n.kind)return n;let r=function(e){let t=e.match(RegExp(`^create a specialist named\\s+(${_})\\.?\\s*the job is:\\s*(.+)$`,"is"));if(t){let e=v(t[1]||""),n=y(t[2]||"");return e&&n?{kind:"create",name:e,job:n}:{kind:"none"}}let n=e.match(RegExp(`\\b(?:create|make|build|spin\\s+up|add)\\s+(?:me\\s+)?(?:a\\s+)?(?:new\\s+)?(?:specialist|bot|assistant|agent)\\s+(?:called\\s+|named\\s+)?(${_})\\s*([\\s\\S]*)$`,"i"));if(!n)return{kind:"none"};let r=v(n[1]||"");if(!r)return{kind:"none"};let i=(n[2]||"").trim();if(!i)return{kind:"none"};let o=y(i=i.replace(/^[.,:;]+\s*/,"").replace(/^(?:that|which|who|to|for|with)\b\s*:?\s*/i,"").replace(/^whose\s+job\s+is\s*:?\s*/i,"").replace(/^the\s+job\s+is\s*:?\s*/i,"").replace(/^is\s*:?\s*/i,"").trim());return o?{kind:"create",name:r,job:o}:{kind:"none"}}(t);return"none"!==r.kind?r:{kind:"none"}}async function w(e){let t=(process.env.CLONE_MARKET_SEARCH_URL||"").trim();if(!t)return null;try{let r=t+(t.includes("?")?"&":"?")+"q="+encodeURIComponent(e),i=await fetch(r,{signal:AbortSignal.timeout(1e4)});if(!i.ok)return null;var n=await i.json();if(!n||"object"!=typeof n)return null;if(n.template&&"object"==typeof n.template)return E(n.template);if(Array.isArray(n.templates)&&n.templates.length>0){let e=n.templates[0];if(e&&"object"==typeof e)return E({template_id:String(e.id??e.template_id??""),template_url:String(e.url??e.template_url??""),source_provider:String(e.provider??e.source_provider??""),title:String(e.title??e.name??""),description:String(e.description??""),avatar:"string"==typeof e.avatar?e.avatar:void 0})}return null}catch{return null}}function E(e){if(!e||"object"!=typeof e)return null;let t=String(e.template_id||"").trim();if(!t)return null;let n=String(e.template_url||"").trim()||(process.env.CLONE_MARKET_URL||"").trim();return n?{template_id:t,template_url:n,source_provider:String(e.source_provider||"").trim()||"clone-market",title:String(e.title||"").trim(),description:String(e.description||"").trim(),avatar:"string"==typeof e.avatar&&e.avatar?e.avatar:void 0}:null}function S(e){return n.bots.getByName(e)}function T(e){try{return e()}catch(e){if(e instanceof m.AgentNameConflictError)return{ok:!1,reason:"collision"};throw e}}function A(e){let n={schema_version:e.schema_version,source_provider:e.source_provider,template_id:e.template_id,template_url:e.template_url,bot:{name:e.bot.name,title:e.bot.title||"",description:e.bot.description||"",avatar:e.bot.avatar||null}};return(0,t.createHash)("sha256").update(JSON.stringify(n)).digest("hex")}function R(e){d.cancelPendingForBot(e);let t=n.conversations.getByBotId(e);t&&d.cancelPending(t.id)}async function I(e,t){let r=e.trim();if(!r)return{ok:!1,reason:"invalid"};if(S(r))return{ok:!1,reason:"collision"};let i=T(()=>n.bots.create({name:r,title:"",description:t,avatar:void 0}));return"ok"in i?i:(R(i.id),{ok:!0,bot:i})}async function C(e,r,i){let o=e.trim();if(!o)return{ok:!1,reason:"invalid"};let a=E(r);if(!a)return{ok:!1,reason:"invalid"};let s=i?.operationId?.trim()||(0,t.randomUUID)(),d={schema_version:h,source_provider:a.source_provider,template_id:a.template_id,template_url:a.template_url,bot:{name:o,title:a.title,description:a.description,avatar:a.avatar}},l=n.bots.getByImportOperationId(s);if(l)return A({schema_version:l.import_schema_version||h,source_provider:l.source_provider||"",template_id:l.template_id||"",template_url:l.template_url||"",bot:{name:l.name,title:l.title,description:l.description,avatar:l.avatar||void 0}})!==A(d)?{ok:!1,reason:"conflict",existingBotId:l.id}:{ok:!0,bot:l,created:!1};if(S(o))return{ok:!1,reason:"collision"};let u=T(()=>n.bots.createFromImport({name:o,title:a.title,description:a.description,avatar:a.avatar},{source_provider:a.source_provider,template_id:a.template_id,template_url:a.template_url,import_schema_version:h,import_operation_id:s,import_timestamp:Date.now()}));return"ok"in u?u:(R(u.id),{ok:!0,bot:u,created:!0})}async function $(e,t){let r=S(e);if(!r)return{ok:!1,reason:"not-found"};let i=t.trim();if(!i)return{ok:!1,reason:"invalid"};if(S(i))return{ok:!1,reason:"collision"};let o=T(()=>n.bots.create({name:i,title:r.title,description:r.description,avatar:void 0}));if("ok"in o)return o;let a=(0,g.localSkillForBot)(r.name);if(a&&(0,g.isSupportedSkillName)(i))try{(0,g.writeSkillForBot)(i,a)}catch{}return R(o.id),{ok:!0,bot:o,source:r}}async function N(e,t,r,i,o){let a,s=await k(r.content);if("none"===s.kind)return!1;if((a=i.findIndex(e=>e.id===r.id))<0?i.some(e=>"bot"===e.sender_type&&e.sender_id===t&&e.created_at>r.created_at):i.slice(a+1).some(e=>"bot"===e.sender_type&&e.sender_id===t))return!0;let d=n.bots.getById(t)?.name??null;if("duplicate"===s.kind){let r=await $(s.sourceName,s.newName);return r.ok||"not-found"!==r.reason?r.ok||"collision"!==r.reason?r.ok?n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Duplicated ${r.source.name} as ${r.bot.name}. Title, description and skill copied; only the name changed. Avatar starts blank. Path: duplicate. New bot id: ${r.bot.id}.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Failed to duplicate ${s.sourceName} as ${s.newName}.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`${(0,m.agentNameConflictMessage)(s.newName)} No bot created.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`I could not find ${s.sourceName} to duplicate. No bot created.`),t),!0}if(S(s.name))return n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`${(0,m.agentNameConflictMessage)(s.name)} No bot created.`),t),!0;let l=await w(s.job);if(l){let r=await C(s.name,l,o);return r.ok||"collision"!==r.reason?r.ok?n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Created ${r.bot.name} from the matching marketplace template (${l.template_id}). Path: template. New bot id: ${r.bot.id}.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Failed to import ${s.name} from the matching template.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`${(0,m.agentNameConflictMessage)(s.name)} No bot created.`),t),!0}let u=await I(s.name,s.job);return u.ok||"collision"!==u.reason?u.ok?n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`None of the templates fit. Created ${u.bot.name} with that job as its description. Path: plain. New bot id: ${u.bot.id}.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`Failed to create ${s.name}: invalid name.`),t):n.messages.create(e,"bot",(0,g.applySkillEndToken)(d,`${(0,m.agentNameConflictMessage)(s.name)} No bot created.`),t),!0}e.s(["handleCosBirthRequest",0,N],15467)}];
58
58
 
59
59
  //# sourceMappingURL=lib_0kik6bx._.js.map