@spinabot/brigade 1.6.1 → 1.8.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 (339) hide show
  1. package/dist/agents/agent-loop.d.ts +13 -0
  2. package/dist/agents/agent-loop.d.ts.map +1 -1
  3. package/dist/agents/agent-loop.js +5 -0
  4. package/dist/agents/agent-loop.js.map +1 -1
  5. package/dist/agents/channels/access-control/group-tool-policy.d.ts +73 -0
  6. package/dist/agents/channels/access-control/group-tool-policy.d.ts.map +1 -0
  7. package/dist/agents/channels/access-control/group-tool-policy.js +193 -0
  8. package/dist/agents/channels/access-control/group-tool-policy.js.map +1 -0
  9. package/dist/agents/channels/access-control/index.d.ts +1 -0
  10. package/dist/agents/channels/access-control/index.d.ts.map +1 -1
  11. package/dist/agents/channels/access-control/index.js +1 -0
  12. package/dist/agents/channels/access-control/index.js.map +1 -1
  13. package/dist/agents/channels/bluebubbles/account-config.d.ts +253 -0
  14. package/dist/agents/channels/bluebubbles/account-config.d.ts.map +1 -0
  15. package/dist/agents/channels/bluebubbles/account-config.js +486 -0
  16. package/dist/agents/channels/bluebubbles/account-config.js.map +1 -0
  17. package/dist/agents/channels/bluebubbles/account-registry.d.ts +33 -0
  18. package/dist/agents/channels/bluebubbles/account-registry.d.ts.map +1 -0
  19. package/dist/agents/channels/bluebubbles/account-registry.js +46 -0
  20. package/dist/agents/channels/bluebubbles/account-registry.js.map +1 -0
  21. package/dist/agents/channels/bluebubbles/adapter.d.ts +45 -0
  22. package/dist/agents/channels/bluebubbles/adapter.d.ts.map +1 -0
  23. package/dist/agents/channels/bluebubbles/adapter.js +366 -0
  24. package/dist/agents/channels/bluebubbles/adapter.js.map +1 -0
  25. package/dist/agents/channels/bluebubbles/catchup-cursor.d.ts +52 -0
  26. package/dist/agents/channels/bluebubbles/catchup-cursor.d.ts.map +1 -0
  27. package/dist/agents/channels/bluebubbles/catchup-cursor.js +118 -0
  28. package/dist/agents/channels/bluebubbles/catchup-cursor.js.map +1 -0
  29. package/dist/agents/channels/bluebubbles/catchup.d.ts +114 -0
  30. package/dist/agents/channels/bluebubbles/catchup.d.ts.map +1 -0
  31. package/dist/agents/channels/bluebubbles/catchup.js +220 -0
  32. package/dist/agents/channels/bluebubbles/catchup.js.map +1 -0
  33. package/dist/agents/channels/bluebubbles/chat.d.ts +75 -0
  34. package/dist/agents/channels/bluebubbles/chat.d.ts.map +1 -0
  35. package/dist/agents/channels/bluebubbles/chat.js +182 -0
  36. package/dist/agents/channels/bluebubbles/chat.js.map +1 -0
  37. package/dist/agents/channels/bluebubbles/connection.d.ts +95 -0
  38. package/dist/agents/channels/bluebubbles/connection.d.ts.map +1 -0
  39. package/dist/agents/channels/bluebubbles/connection.js +413 -0
  40. package/dist/agents/channels/bluebubbles/connection.js.map +1 -0
  41. package/dist/agents/channels/bluebubbles/contact-names.d.ts +79 -0
  42. package/dist/agents/channels/bluebubbles/contact-names.d.ts.map +1 -0
  43. package/dist/agents/channels/bluebubbles/contact-names.js +188 -0
  44. package/dist/agents/channels/bluebubbles/contact-names.js.map +1 -0
  45. package/dist/agents/channels/bluebubbles/debounce.d.ts +78 -0
  46. package/dist/agents/channels/bluebubbles/debounce.d.ts.map +1 -0
  47. package/dist/agents/channels/bluebubbles/debounce.js +173 -0
  48. package/dist/agents/channels/bluebubbles/debounce.js.map +1 -0
  49. package/dist/agents/channels/bluebubbles/dedupe.d.ts +25 -0
  50. package/dist/agents/channels/bluebubbles/dedupe.d.ts.map +1 -0
  51. package/dist/agents/channels/bluebubbles/dedupe.js +35 -0
  52. package/dist/agents/channels/bluebubbles/dedupe.js.map +1 -0
  53. package/dist/agents/channels/bluebubbles/effects.d.ts +17 -0
  54. package/dist/agents/channels/bluebubbles/effects.d.ts.map +1 -0
  55. package/dist/agents/channels/bluebubbles/effects.js +57 -0
  56. package/dist/agents/channels/bluebubbles/effects.js.map +1 -0
  57. package/dist/agents/channels/bluebubbles/history.d.ts +56 -0
  58. package/dist/agents/channels/bluebubbles/history.d.ts.map +1 -0
  59. package/dist/agents/channels/bluebubbles/history.js +140 -0
  60. package/dist/agents/channels/bluebubbles/history.js.map +1 -0
  61. package/dist/agents/channels/bluebubbles/index.d.ts +18 -0
  62. package/dist/agents/channels/bluebubbles/index.d.ts.map +1 -0
  63. package/dist/agents/channels/bluebubbles/index.js +18 -0
  64. package/dist/agents/channels/bluebubbles/index.js.map +1 -0
  65. package/dist/agents/channels/bluebubbles/media.d.ts +104 -0
  66. package/dist/agents/channels/bluebubbles/media.d.ts.map +1 -0
  67. package/dist/agents/channels/bluebubbles/media.js +222 -0
  68. package/dist/agents/channels/bluebubbles/media.js.map +1 -0
  69. package/dist/agents/channels/bluebubbles/messaging.d.ts +13 -0
  70. package/dist/agents/channels/bluebubbles/messaging.d.ts.map +1 -0
  71. package/dist/agents/channels/bluebubbles/messaging.js +36 -0
  72. package/dist/agents/channels/bluebubbles/messaging.js.map +1 -0
  73. package/dist/agents/channels/bluebubbles/module.d.ts +24 -0
  74. package/dist/agents/channels/bluebubbles/module.d.ts.map +1 -0
  75. package/dist/agents/channels/bluebubbles/module.js +52 -0
  76. package/dist/agents/channels/bluebubbles/module.js.map +1 -0
  77. package/dist/agents/channels/bluebubbles/normalize.d.ts +111 -0
  78. package/dist/agents/channels/bluebubbles/normalize.d.ts.map +1 -0
  79. package/dist/agents/channels/bluebubbles/normalize.js +239 -0
  80. package/dist/agents/channels/bluebubbles/normalize.js.map +1 -0
  81. package/dist/agents/channels/bluebubbles/plugin.d.ts +46 -0
  82. package/dist/agents/channels/bluebubbles/plugin.d.ts.map +1 -0
  83. package/dist/agents/channels/bluebubbles/plugin.js +242 -0
  84. package/dist/agents/channels/bluebubbles/plugin.js.map +1 -0
  85. package/dist/agents/channels/bluebubbles/probe.d.ts +79 -0
  86. package/dist/agents/channels/bluebubbles/probe.d.ts.map +1 -0
  87. package/dist/agents/channels/bluebubbles/probe.js +138 -0
  88. package/dist/agents/channels/bluebubbles/probe.js.map +1 -0
  89. package/dist/agents/channels/bluebubbles/reactions.d.ts +46 -0
  90. package/dist/agents/channels/bluebubbles/reactions.d.ts.map +1 -0
  91. package/dist/agents/channels/bluebubbles/reactions.js +207 -0
  92. package/dist/agents/channels/bluebubbles/reactions.js.map +1 -0
  93. package/dist/agents/channels/bluebubbles/send.d.ts +132 -0
  94. package/dist/agents/channels/bluebubbles/send.d.ts.map +1 -0
  95. package/dist/agents/channels/bluebubbles/send.js +327 -0
  96. package/dist/agents/channels/bluebubbles/send.js.map +1 -0
  97. package/dist/agents/channels/bluebubbles/status-issues.d.ts +57 -0
  98. package/dist/agents/channels/bluebubbles/status-issues.d.ts.map +1 -0
  99. package/dist/agents/channels/bluebubbles/status-issues.js +93 -0
  100. package/dist/agents/channels/bluebubbles/status-issues.js.map +1 -0
  101. package/dist/agents/channels/bluebubbles/types.d.ts +69 -0
  102. package/dist/agents/channels/bluebubbles/types.d.ts.map +1 -0
  103. package/dist/agents/channels/bluebubbles/types.js +118 -0
  104. package/dist/agents/channels/bluebubbles/types.js.map +1 -0
  105. package/dist/agents/channels/bluebubbles/webhook.d.ts +97 -0
  106. package/dist/agents/channels/bluebubbles/webhook.d.ts.map +1 -0
  107. package/dist/agents/channels/bluebubbles/webhook.js +249 -0
  108. package/dist/agents/channels/bluebubbles/webhook.js.map +1 -0
  109. package/dist/agents/channels/bundled-channel-metas.d.ts +13 -0
  110. package/dist/agents/channels/bundled-channel-metas.d.ts.map +1 -1
  111. package/dist/agents/channels/bundled-channel-metas.js +33 -0
  112. package/dist/agents/channels/bundled-channel-metas.js.map +1 -1
  113. package/dist/agents/channels/discord/account-config.d.ts +60 -0
  114. package/dist/agents/channels/discord/account-config.d.ts.map +1 -1
  115. package/dist/agents/channels/discord/account-config.js +89 -0
  116. package/dist/agents/channels/discord/account-config.js.map +1 -1
  117. package/dist/agents/channels/discord/adapter.d.ts +24 -1
  118. package/dist/agents/channels/discord/adapter.d.ts.map +1 -1
  119. package/dist/agents/channels/discord/adapter.js +208 -41
  120. package/dist/agents/channels/discord/adapter.js.map +1 -1
  121. package/dist/agents/channels/discord/component-blocks.d.ts +108 -0
  122. package/dist/agents/channels/discord/component-blocks.d.ts.map +1 -0
  123. package/dist/agents/channels/discord/component-blocks.js +113 -0
  124. package/dist/agents/channels/discord/component-blocks.js.map +1 -0
  125. package/dist/agents/channels/discord/components.d.ts +78 -0
  126. package/dist/agents/channels/discord/components.d.ts.map +1 -1
  127. package/dist/agents/channels/discord/components.js +89 -0
  128. package/dist/agents/channels/discord/components.js.map +1 -1
  129. package/dist/agents/channels/discord/connection.d.ts +195 -12
  130. package/dist/agents/channels/discord/connection.d.ts.map +1 -1
  131. package/dist/agents/channels/discord/connection.js +852 -38
  132. package/dist/agents/channels/discord/connection.js.map +1 -1
  133. package/dist/agents/channels/discord/directory-cache.d.ts +47 -0
  134. package/dist/agents/channels/discord/directory-cache.d.ts.map +1 -0
  135. package/dist/agents/channels/discord/directory-cache.js +131 -0
  136. package/dist/agents/channels/discord/directory-cache.js.map +1 -0
  137. package/dist/agents/channels/discord/directory-live.d.ts +61 -0
  138. package/dist/agents/channels/discord/directory-live.d.ts.map +1 -0
  139. package/dist/agents/channels/discord/directory-live.js +140 -0
  140. package/dist/agents/channels/discord/directory-live.js.map +1 -0
  141. package/dist/agents/channels/discord/format.d.ts +15 -0
  142. package/dist/agents/channels/discord/format.d.ts.map +1 -1
  143. package/dist/agents/channels/discord/format.js +56 -0
  144. package/dist/agents/channels/discord/format.js.map +1 -1
  145. package/dist/agents/channels/discord/guilds.d.ts +25 -0
  146. package/dist/agents/channels/discord/guilds.d.ts.map +1 -0
  147. package/dist/agents/channels/discord/guilds.js +46 -0
  148. package/dist/agents/channels/discord/guilds.js.map +1 -0
  149. package/dist/agents/channels/discord/inbound-extras.d.ts +166 -9
  150. package/dist/agents/channels/discord/inbound-extras.d.ts.map +1 -1
  151. package/dist/agents/channels/discord/inbound-extras.js +246 -8
  152. package/dist/agents/channels/discord/inbound-extras.js.map +1 -1
  153. package/dist/agents/channels/discord/index.d.ts +10 -3
  154. package/dist/agents/channels/discord/index.d.ts.map +1 -1
  155. package/dist/agents/channels/discord/index.js +10 -3
  156. package/dist/agents/channels/discord/index.js.map +1 -1
  157. package/dist/agents/channels/discord/modal-registry.d.ts +89 -0
  158. package/dist/agents/channels/discord/modal-registry.d.ts.map +1 -0
  159. package/dist/agents/channels/discord/modal-registry.js +104 -0
  160. package/dist/agents/channels/discord/modal-registry.js.map +1 -0
  161. package/dist/agents/channels/discord/modals.d.ts +100 -0
  162. package/dist/agents/channels/discord/modals.d.ts.map +1 -0
  163. package/dist/agents/channels/discord/modals.js +124 -0
  164. package/dist/agents/channels/discord/modals.js.map +1 -0
  165. package/dist/agents/channels/discord/permission-audit.d.ts +43 -0
  166. package/dist/agents/channels/discord/permission-audit.d.ts.map +1 -0
  167. package/dist/agents/channels/discord/permission-audit.js +192 -0
  168. package/dist/agents/channels/discord/permission-audit.js.map +1 -0
  169. package/dist/agents/channels/discord/plugin.d.ts +18 -2
  170. package/dist/agents/channels/discord/plugin.d.ts.map +1 -1
  171. package/dist/agents/channels/discord/plugin.js +73 -4
  172. package/dist/agents/channels/discord/plugin.js.map +1 -1
  173. package/dist/agents/channels/discord/probe.d.ts +23 -1
  174. package/dist/agents/channels/discord/probe.d.ts.map +1 -1
  175. package/dist/agents/channels/discord/probe.js +40 -5
  176. package/dist/agents/channels/discord/probe.js.map +1 -1
  177. package/dist/agents/channels/discord/rest-actions.d.ts +346 -0
  178. package/dist/agents/channels/discord/rest-actions.d.ts.map +1 -0
  179. package/dist/agents/channels/discord/rest-actions.js +559 -0
  180. package/dist/agents/channels/discord/rest-actions.js.map +1 -0
  181. package/dist/agents/channels/discord/rest-components.d.ts +122 -0
  182. package/dist/agents/channels/discord/rest-components.d.ts.map +1 -0
  183. package/dist/agents/channels/discord/rest-components.js +243 -0
  184. package/dist/agents/channels/discord/rest-components.js.map +1 -0
  185. package/dist/agents/channels/discord/security-audit.d.ts +29 -0
  186. package/dist/agents/channels/discord/security-audit.d.ts.map +1 -0
  187. package/dist/agents/channels/discord/security-audit.js +94 -0
  188. package/dist/agents/channels/discord/security-audit.js.map +1 -0
  189. package/dist/agents/channels/discord/security-doctor.d.ts +43 -0
  190. package/dist/agents/channels/discord/security-doctor.d.ts.map +1 -0
  191. package/dist/agents/channels/discord/security-doctor.js +83 -0
  192. package/dist/agents/channels/discord/security-doctor.js.map +1 -0
  193. package/dist/agents/channels/discord/status-issues.d.ts +37 -0
  194. package/dist/agents/channels/discord/status-issues.d.ts.map +1 -0
  195. package/dist/agents/channels/discord/status-issues.js +66 -0
  196. package/dist/agents/channels/discord/status-issues.js.map +1 -0
  197. package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts +57 -0
  198. package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts.map +1 -0
  199. package/dist/agents/channels/discord/subagent-thread-binding-store.js +98 -0
  200. package/dist/agents/channels/discord/subagent-thread-binding-store.js.map +1 -0
  201. package/dist/agents/channels/discord/subagent-thread-binding.d.ts +95 -0
  202. package/dist/agents/channels/discord/subagent-thread-binding.d.ts.map +1 -0
  203. package/dist/agents/channels/discord/subagent-thread-binding.js +208 -0
  204. package/dist/agents/channels/discord/subagent-thread-binding.js.map +1 -0
  205. package/dist/agents/channels/discord/system-events.d.ts +31 -0
  206. package/dist/agents/channels/discord/system-events.d.ts.map +1 -0
  207. package/dist/agents/channels/discord/system-events.js +74 -0
  208. package/dist/agents/channels/discord/system-events.js.map +1 -0
  209. package/dist/agents/channels/general-callback.d.ts +12 -0
  210. package/dist/agents/channels/general-callback.d.ts.map +1 -1
  211. package/dist/agents/channels/general-callback.js +18 -0
  212. package/dist/agents/channels/general-callback.js.map +1 -1
  213. package/dist/agents/channels/imessage/account-config.d.ts +178 -0
  214. package/dist/agents/channels/imessage/account-config.d.ts.map +1 -0
  215. package/dist/agents/channels/imessage/account-config.js +371 -0
  216. package/dist/agents/channels/imessage/account-config.js.map +1 -0
  217. package/dist/agents/channels/imessage/adapter.d.ts +36 -0
  218. package/dist/agents/channels/imessage/adapter.d.ts.map +1 -0
  219. package/dist/agents/channels/imessage/adapter.js +286 -0
  220. package/dist/agents/channels/imessage/adapter.js.map +1 -0
  221. package/dist/agents/channels/imessage/client.d.ts +99 -0
  222. package/dist/agents/channels/imessage/client.d.ts.map +1 -0
  223. package/dist/agents/channels/imessage/client.js +231 -0
  224. package/dist/agents/channels/imessage/client.js.map +1 -0
  225. package/dist/agents/channels/imessage/connection.d.ts +101 -0
  226. package/dist/agents/channels/imessage/connection.d.ts.map +1 -0
  227. package/dist/agents/channels/imessage/connection.js +367 -0
  228. package/dist/agents/channels/imessage/connection.js.map +1 -0
  229. package/dist/agents/channels/imessage/format.d.ts +45 -0
  230. package/dist/agents/channels/imessage/format.d.ts.map +1 -0
  231. package/dist/agents/channels/imessage/format.js +170 -0
  232. package/dist/agents/channels/imessage/format.js.map +1 -0
  233. package/dist/agents/channels/imessage/history.d.ts +49 -0
  234. package/dist/agents/channels/imessage/history.d.ts.map +1 -0
  235. package/dist/agents/channels/imessage/history.js +74 -0
  236. package/dist/agents/channels/imessage/history.js.map +1 -0
  237. package/dist/agents/channels/imessage/index.d.ts +25 -0
  238. package/dist/agents/channels/imessage/index.d.ts.map +1 -0
  239. package/dist/agents/channels/imessage/index.js +25 -0
  240. package/dist/agents/channels/imessage/index.js.map +1 -0
  241. package/dist/agents/channels/imessage/media.d.ts +92 -0
  242. package/dist/agents/channels/imessage/media.d.ts.map +1 -0
  243. package/dist/agents/channels/imessage/media.js +196 -0
  244. package/dist/agents/channels/imessage/media.js.map +1 -0
  245. package/dist/agents/channels/imessage/messaging.d.ts +14 -0
  246. package/dist/agents/channels/imessage/messaging.d.ts.map +1 -0
  247. package/dist/agents/channels/imessage/messaging.js +37 -0
  248. package/dist/agents/channels/imessage/messaging.js.map +1 -0
  249. package/dist/agents/channels/imessage/module.d.ts +16 -0
  250. package/dist/agents/channels/imessage/module.d.ts.map +1 -0
  251. package/dist/agents/channels/imessage/module.js +23 -0
  252. package/dist/agents/channels/imessage/module.js.map +1 -0
  253. package/dist/agents/channels/imessage/monitor.d.ts +207 -0
  254. package/dist/agents/channels/imessage/monitor.d.ts.map +1 -0
  255. package/dist/agents/channels/imessage/monitor.js +504 -0
  256. package/dist/agents/channels/imessage/monitor.js.map +1 -0
  257. package/dist/agents/channels/imessage/plugin.d.ts +53 -0
  258. package/dist/agents/channels/imessage/plugin.d.ts.map +1 -0
  259. package/dist/agents/channels/imessage/plugin.js +215 -0
  260. package/dist/agents/channels/imessage/plugin.js.map +1 -0
  261. package/dist/agents/channels/imessage/probe.d.ts +68 -0
  262. package/dist/agents/channels/imessage/probe.d.ts.map +1 -0
  263. package/dist/agents/channels/imessage/probe.js +134 -0
  264. package/dist/agents/channels/imessage/probe.js.map +1 -0
  265. package/dist/agents/channels/imessage/remote-attachments.d.ts +61 -0
  266. package/dist/agents/channels/imessage/remote-attachments.d.ts.map +1 -0
  267. package/dist/agents/channels/imessage/remote-attachments.js +131 -0
  268. package/dist/agents/channels/imessage/remote-attachments.js.map +1 -0
  269. package/dist/agents/channels/imessage/send.d.ts +61 -0
  270. package/dist/agents/channels/imessage/send.d.ts.map +1 -0
  271. package/dist/agents/channels/imessage/send.js +108 -0
  272. package/dist/agents/channels/imessage/send.js.map +1 -0
  273. package/dist/agents/channels/imessage/targets.d.ts +91 -0
  274. package/dist/agents/channels/imessage/targets.d.ts.map +1 -0
  275. package/dist/agents/channels/imessage/targets.js +245 -0
  276. package/dist/agents/channels/imessage/targets.js.map +1 -0
  277. package/dist/agents/channels/imessage/watch-error.d.ts +23 -0
  278. package/dist/agents/channels/imessage/watch-error.d.ts.map +1 -0
  279. package/dist/agents/channels/imessage/watch-error.js +69 -0
  280. package/dist/agents/channels/imessage/watch-error.js.map +1 -0
  281. package/dist/agents/channels/inbound-pipeline.d.ts +11 -0
  282. package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
  283. package/dist/agents/channels/inbound-pipeline.js +25 -4
  284. package/dist/agents/channels/inbound-pipeline.js.map +1 -1
  285. package/dist/agents/channels/manager.d.ts +9 -0
  286. package/dist/agents/channels/manager.d.ts.map +1 -1
  287. package/dist/agents/channels/manager.js.map +1 -1
  288. package/dist/agents/channels/sdk.d.ts +4 -0
  289. package/dist/agents/channels/sdk.d.ts.map +1 -1
  290. package/dist/agents/channels/sdk.js +4 -0
  291. package/dist/agents/channels/sdk.js.map +1 -1
  292. package/dist/agents/extensions/modules/index.d.ts.map +1 -1
  293. package/dist/agents/extensions/modules/index.js +12 -0
  294. package/dist/agents/extensions/modules/index.js.map +1 -1
  295. package/dist/agents/extensions/types.d.ts +7 -0
  296. package/dist/agents/extensions/types.d.ts.map +1 -1
  297. package/dist/agents/extensions/types.js.map +1 -1
  298. package/dist/agents/session-wiring.d.ts +31 -0
  299. package/dist/agents/session-wiring.d.ts.map +1 -1
  300. package/dist/agents/session-wiring.js +45 -2
  301. package/dist/agents/session-wiring.js.map +1 -1
  302. package/dist/agents/subagent-announce-delivery.d.ts +10 -0
  303. package/dist/agents/subagent-announce-delivery.d.ts.map +1 -1
  304. package/dist/agents/subagent-announce-delivery.js +1 -0
  305. package/dist/agents/subagent-announce-delivery.js.map +1 -1
  306. package/dist/agents/subagent-completion-bridge.d.ts.map +1 -1
  307. package/dist/agents/subagent-completion-bridge.js +81 -0
  308. package/dist/agents/subagent-completion-bridge.js.map +1 -1
  309. package/dist/agents/subagent-spawn.d.ts.map +1 -1
  310. package/dist/agents/subagent-spawn.js +57 -4
  311. package/dist/agents/subagent-spawn.js.map +1 -1
  312. package/dist/agents/tools/bluebubbles-action-tool.d.ts +66 -0
  313. package/dist/agents/tools/bluebubbles-action-tool.d.ts.map +1 -0
  314. package/dist/agents/tools/bluebubbles-action-tool.js +234 -0
  315. package/dist/agents/tools/bluebubbles-action-tool.js.map +1 -0
  316. package/dist/agents/tools/discord-action-tool.d.ts +224 -0
  317. package/dist/agents/tools/discord-action-tool.d.ts.map +1 -0
  318. package/dist/agents/tools/discord-action-tool.js +848 -0
  319. package/dist/agents/tools/discord-action-tool.js.map +1 -0
  320. package/dist/agents/tools/registry.d.ts.map +1 -1
  321. package/dist/agents/tools/registry.js +39 -0
  322. package/dist/agents/tools/registry.js.map +1 -1
  323. package/dist/agents/tools/sessions/index.d.ts +8 -0
  324. package/dist/agents/tools/sessions/index.d.ts.map +1 -1
  325. package/dist/agents/tools/sessions/index.js +15 -3
  326. package/dist/agents/tools/sessions/index.js.map +1 -1
  327. package/dist/buildstamp.json +1 -1
  328. package/dist/cli/commands/channels.d.ts +2 -0
  329. package/dist/cli/commands/channels.d.ts.map +1 -1
  330. package/dist/cli/commands/channels.js +58 -1
  331. package/dist/cli/commands/channels.js.map +1 -1
  332. package/dist/core/server.d.ts.map +1 -1
  333. package/dist/core/server.js +48 -2
  334. package/dist/core/server.js.map +1 -1
  335. package/dist/infra/net/fetch-guard.d.ts +24 -2
  336. package/dist/infra/net/fetch-guard.d.ts.map +1 -1
  337. package/dist/infra/net/fetch-guard.js +78 -31
  338. package/dist/infra/net/fetch-guard.js.map +1 -1
  339. package/package.json +1 -1
@@ -0,0 +1,61 @@
1
+ /**
2
+ * iMessage outbound send — assemble + dispatch a `send` RPC.
3
+ *
4
+ * `sendMessageIMessage` parses the target (handle / chat_id / chat_guid /
5
+ * chat_identifier), converts markdown tables to plain text, resolves an optional
6
+ * media attachment to a local path (through the exfil guard), sanitizes a
7
+ * reply-to id, and writes the `send` JSON-RPC call. When the message has media
8
+ * but no text it delivers a `<media:kind>` placeholder so the echo cache + the
9
+ * transcript have a body.
10
+ *
11
+ * The RPC client is INJECTABLE (`opts.client`) — that is the test seam: a unit
12
+ * test passes a fake {@link IMessageRpcLike} and exercises every target kind +
13
+ * media + reply with NO real `imsg` binary. A client WE created here is stopped
14
+ * in the `finally`; an injected one is left for the caller to own.
15
+ */
16
+ import { type IMessageRpcLike } from "./client.js";
17
+ import { type IMessageMediaKind } from "./format.js";
18
+ import type { IMessageService } from "./account-config.js";
19
+ /** Options for {@link sendMessageIMessage}. */
20
+ export interface IMessageSendOpts {
21
+ /** `imsg` binary path (only used when constructing a client ourselves). */
22
+ cliPath?: string;
23
+ /** Optional chat.db override. */
24
+ dbPath?: string;
25
+ /** Default send service when the target doesn't pin one (`auto`). */
26
+ service?: IMessageService;
27
+ /** Phone-number region for E.164 normalisation (default `US`). */
28
+ region?: string;
29
+ /** Native reply-to message id (sanitized before send). */
30
+ replyToId?: string;
31
+ /** Local media path to attach (validated through the exfil guard). */
32
+ mediaPath?: string;
33
+ /** Pre-inferred media kind for the `<media:kind>` placeholder (else inferred). */
34
+ mediaKind?: IMessageMediaKind;
35
+ /** Outbound media size cap (bytes). */
36
+ maxBytes?: number;
37
+ /** RPC timeout (ms). */
38
+ timeoutMs?: number;
39
+ /** Force a numeric chat-id target (wins over `to`). */
40
+ chatId?: number;
41
+ /** Inject a live RPC client (the test seam). When set, it is NOT stopped here. */
42
+ client?: IMessageRpcLike;
43
+ /** Inject a client factory (production default constructs the real one). */
44
+ createClient?: (args: {
45
+ cliPath?: string;
46
+ dbPath?: string;
47
+ }) => Promise<IMessageRpcLike>;
48
+ }
49
+ /** Result of a successful send. */
50
+ export interface IMessageSendResult {
51
+ /** Resolved message id from the bridge, or a coarse fallback (`ok` / `unknown`). */
52
+ messageId: string;
53
+ /** The text actually delivered (post markdown-table conversion + placeholder). */
54
+ sentText: string;
55
+ }
56
+ /**
57
+ * Send an iMessage. `to` is the target string; `opts.chatId` (when set) wins and
58
+ * forces a `chat_id:` target. Resolves the message id (or a coarse fallback).
59
+ */
60
+ export declare function sendMessageIMessage(to: string, text: string, opts?: IMessageSendOpts): Promise<IMessageSendResult>;
61
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/imessage/send.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEN,KAAK,eAAe,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAKN,KAAK,iBAAiB,EACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAChC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;CACzF;AAED,mCAAmC;AACnC,MAAM,WAAW,kBAAkB;IAClC,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;CACjB;AAcD;;;GAGG;AACH,wBAAsB,mBAAmB,CACxC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,gBAAqB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAsE7B"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * iMessage outbound send — assemble + dispatch a `send` RPC.
3
+ *
4
+ * `sendMessageIMessage` parses the target (handle / chat_id / chat_guid /
5
+ * chat_identifier), converts markdown tables to plain text, resolves an optional
6
+ * media attachment to a local path (through the exfil guard), sanitizes a
7
+ * reply-to id, and writes the `send` JSON-RPC call. When the message has media
8
+ * but no text it delivers a `<media:kind>` placeholder so the echo cache + the
9
+ * transcript have a body.
10
+ *
11
+ * The RPC client is INJECTABLE (`opts.client`) — that is the test seam: a unit
12
+ * test passes a fake {@link IMessageRpcLike} and exercises every target kind +
13
+ * media + reply with NO real `imsg` binary. A client WE created here is stopped
14
+ * in the `finally`; an injected one is left for the caller to own.
15
+ */
16
+ import { createIMessageRpcClient, } from "./client.js";
17
+ import { markdownToIMessageText, resolveDeliveredText, sanitizeOutboundIMessageText, sanitizeReplyToId, } from "./format.js";
18
+ import { resolveOutboundAttachment } from "./media.js";
19
+ import { formatIMessageChatTarget, parseIMessageTarget } from "./targets.js";
20
+ /** Extract a message id from the bridge's `send` result, trying common keys. */
21
+ function resolveMessageId(result) {
22
+ if (!result || typeof result !== "object")
23
+ return null;
24
+ const r = result;
25
+ for (const key of ["messageId", "message_id", "id", "guid"]) {
26
+ const v = r[key];
27
+ if (typeof v === "string" && v.trim())
28
+ return v.trim();
29
+ if (typeof v === "number" && Number.isFinite(v))
30
+ return String(v);
31
+ }
32
+ return null;
33
+ }
34
+ /**
35
+ * Send an iMessage. `to` is the target string; `opts.chatId` (when set) wins and
36
+ * forces a `chat_id:` target. Resolves the message id (or a coarse fallback).
37
+ */
38
+ export async function sendMessageIMessage(to, text, opts = {}) {
39
+ const cliPath = opts.cliPath?.trim() || "imsg";
40
+ const dbPath = opts.dbPath?.trim() || undefined;
41
+ // Target — an explicit chatId wins, else parse the `to` string.
42
+ const target = parseIMessageTarget(opts.chatId ? formatIMessageChatTarget(opts.chatId) : to);
43
+ // Service — explicit opt → the handle's parsed service → the account default.
44
+ const service = opts.service ?? (target.kind === "handle" ? target.service : undefined) ?? "auto";
45
+ const region = opts.region?.trim() || "US";
46
+ const maxBytes = typeof opts.maxBytes === "number" ? opts.maxBytes : 16 * 1024 * 1024;
47
+ let message = text ?? "";
48
+ let filePath;
49
+ let mediaKind = opts.mediaKind;
50
+ // Media resolution — validate the local path, infer the kind.
51
+ if (opts.mediaPath?.trim()) {
52
+ const resolved = resolveOutboundAttachment(opts.mediaPath.trim(), maxBytes);
53
+ filePath = resolved.path;
54
+ mediaKind = mediaKind ?? resolved.kind;
55
+ message = resolveDeliveredText(message, mediaKind);
56
+ }
57
+ if (!message.trim() && !filePath)
58
+ throw new Error("iMessage send requires text or media");
59
+ // Plain-text-ify markdown tables when there is text.
60
+ if (message.trim())
61
+ message = markdownToIMessageText(message);
62
+ // Last gate before the wire — strip any internal directive tags / role
63
+ // scaffolding / reasoning residue (the outbound twin of the reflection guard).
64
+ if (message.trim())
65
+ message = sanitizeOutboundIMessageText(message);
66
+ if (!message.trim() && !filePath)
67
+ throw new Error("iMessage send requires text or media");
68
+ const replyTo = sanitizeReplyToId(opts.replyToId);
69
+ // Assemble the wire params.
70
+ const params = {
71
+ text: message,
72
+ service: service || "auto",
73
+ region,
74
+ };
75
+ if (replyTo)
76
+ params.reply_to = replyTo;
77
+ if (filePath)
78
+ params.file = filePath;
79
+ if (target.kind === "chat_id")
80
+ params.chat_id = target.chatId;
81
+ else if (target.kind === "chat_guid")
82
+ params.chat_guid = target.chatGuid;
83
+ else if (target.kind === "chat_identifier")
84
+ params.chat_identifier = target.chatIdentifier;
85
+ else
86
+ params.to = target.to;
87
+ // Client lifecycle — an injected client is owned by the caller.
88
+ const client = opts.client ??
89
+ (opts.createClient
90
+ ? await opts.createClient({ cliPath, dbPath })
91
+ : await createIMessageRpcClient({ cliPath, dbPath }));
92
+ const shouldClose = !opts.client;
93
+ try {
94
+ const result = await client.request("send", params, {
95
+ ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),
96
+ });
97
+ const resolvedId = resolveMessageId(result);
98
+ return {
99
+ messageId: resolvedId ?? (result && result.ok ? "ok" : "unknown"),
100
+ sentText: message,
101
+ };
102
+ }
103
+ finally {
104
+ if (shouldClose)
105
+ await client.stop();
106
+ }
107
+ }
108
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../../../src/agents/channels/imessage/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * iMessage target parsing + handle normalisation.
3
+ *
4
+ * An iMessage send can address four kinds of target, distinguished by a leading
5
+ * prefix (case-insensitive):
6
+ *
7
+ * - `handle` a phone number (`+15551234567`) or email
8
+ * (`user@example.com`), optionally service-prefixed
9
+ * (`imessage:`, `sms:`, `auto:`).
10
+ * - `chat_id` a numeric SQLite thread id (`chat_id:42`, `chat:42`).
11
+ * - `chat_guid` a stable thread GUID (`chat_guid:ABC-…`).
12
+ * - `chat_identifier` a thread identifier (`chat_identifier:…`).
13
+ *
14
+ * `parseIMessageTarget` (the SEND path) is STRICT — it throws on a malformed
15
+ * `chat_id`. `parseIMessageAllowTarget` (the ALLOW-LIST path) is LENIENT — it
16
+ * skips a malformed prefix rather than throwing. `normalizeIMessageHandle`
17
+ * canonicalises a handle (lowercase email, E.164 phone, chat prefixes preserved)
18
+ * so inbound senders and allow-list entries compare consistently.
19
+ *
20
+ * Condensed from the upstream `targets.ts` + `target-parsing-helpers.ts` +
21
+ * `normalize.ts` trio into one self-contained module (the brand-neutral
22
+ * chat-target-prefix engine lived in a shared SDK file there).
23
+ */
24
+ import type { IMessageService } from "./account-config.js";
25
+ /** A parsed outbound target. */
26
+ export type IMessageTarget = {
27
+ kind: "chat_id";
28
+ chatId: number;
29
+ } | {
30
+ kind: "chat_guid";
31
+ chatGuid: string;
32
+ } | {
33
+ kind: "chat_identifier";
34
+ chatIdentifier: string;
35
+ } | {
36
+ kind: "handle";
37
+ to: string;
38
+ service: IMessageService;
39
+ };
40
+ /** A parsed allow-list target (lenient — a bare handle string is the fallback). */
41
+ export type IMessageAllowTarget = {
42
+ kind: "chat_id";
43
+ chatId: number;
44
+ } | {
45
+ kind: "chat_guid";
46
+ chatGuid: string;
47
+ } | {
48
+ kind: "chat_identifier";
49
+ chatIdentifier: string;
50
+ } | {
51
+ kind: "handle";
52
+ handle: string;
53
+ };
54
+ /**
55
+ * Normalise a phone-ish string to E.164. Strips a leading `scheme:`, removes
56
+ * everything but digits and `+`, and prepends `+` when missing.
57
+ */
58
+ export declare function normalizeE164(raw: string): string;
59
+ /**
60
+ * Canonicalise an iMessage handle for comparison. Service prefixes are stripped
61
+ * (and re-applied by callers that care); chat prefixes are lowercased on the
62
+ * prefix only; an email lowercases whole; a phone becomes E.164; anything else
63
+ * has its whitespace stripped.
64
+ */
65
+ export declare function normalizeIMessageHandle(raw: string): string;
66
+ /**
67
+ * Parse an outbound target (SEND path). Throws when the target is empty or a
68
+ * chat prefix is malformed. A service-prefixed handle keeps its service; a bare
69
+ * handle defaults to `auto`.
70
+ */
71
+ export declare function parseIMessageTarget(raw: string): IMessageTarget;
72
+ /** Parse an allow-list target (LENIENT). A bare/unparseable string is a normalized handle. */
73
+ export declare function parseIMessageAllowTarget(raw: string): IMessageAllowTarget;
74
+ /** Format a numeric chat id into the canonical `chat_id:N` target form. */
75
+ export declare function formatIMessageChatTarget(chatId?: number): string;
76
+ /** True iff a string carries an explicit chat / service prefix (vs a bare name). */
77
+ export declare function looksLikeIMessageTargetId(raw: string): boolean;
78
+ /** Advisory chat-type guess from a (parsed) target — never throws. */
79
+ export declare function inferIMessageTargetChatType(raw: string): "dm" | "group" | undefined;
80
+ /**
81
+ * Decide whether a (normalized) inbound sender is allowed given a list of
82
+ * allow-from entries. `*` is a wildcard. Returns false on an empty list.
83
+ */
84
+ export declare function isAllowedIMessageSender(params: {
85
+ allowFrom: ReadonlyArray<string | number>;
86
+ sender: string;
87
+ chatId?: number;
88
+ chatGuid?: string;
89
+ chatIdentifier?: string;
90
+ }): boolean;
91
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/imessage/targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,gCAAgC;AAChC,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAE5D,mFAAmF;AACnF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAmBtC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmB3D;AAqDD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAiB/D;AAED,8FAA8F;AAC9F,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAgBzE;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO9D;AAED,sEAAsE;AACtE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,CAOnF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC/C,SAAS,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAuBV"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * iMessage target parsing + handle normalisation.
3
+ *
4
+ * An iMessage send can address four kinds of target, distinguished by a leading
5
+ * prefix (case-insensitive):
6
+ *
7
+ * - `handle` a phone number (`+15551234567`) or email
8
+ * (`user@example.com`), optionally service-prefixed
9
+ * (`imessage:`, `sms:`, `auto:`).
10
+ * - `chat_id` a numeric SQLite thread id (`chat_id:42`, `chat:42`).
11
+ * - `chat_guid` a stable thread GUID (`chat_guid:ABC-…`).
12
+ * - `chat_identifier` a thread identifier (`chat_identifier:…`).
13
+ *
14
+ * `parseIMessageTarget` (the SEND path) is STRICT — it throws on a malformed
15
+ * `chat_id`. `parseIMessageAllowTarget` (the ALLOW-LIST path) is LENIENT — it
16
+ * skips a malformed prefix rather than throwing. `normalizeIMessageHandle`
17
+ * canonicalises a handle (lowercase email, E.164 phone, chat prefixes preserved)
18
+ * so inbound senders and allow-list entries compare consistently.
19
+ *
20
+ * Condensed from the upstream `targets.ts` + `target-parsing-helpers.ts` +
21
+ * `normalize.ts` trio into one self-contained module (the brand-neutral
22
+ * chat-target-prefix engine lived in a shared SDK file there).
23
+ */
24
+ const CHAT_ID_PREFIXES = ["chat_id:", "chatid:", "chat:"];
25
+ const CHAT_GUID_PREFIXES = ["chat_guid:", "chatguid:", "guid:"];
26
+ const CHAT_IDENTIFIER_PREFIXES = ["chat_identifier:", "chatidentifier:", "chatident:"];
27
+ const SERVICE_PREFIXES = [
28
+ { prefix: "imessage:", service: "imessage" },
29
+ { prefix: "sms:", service: "sms" },
30
+ { prefix: "auto:", service: "auto" },
31
+ ];
32
+ const CHAT_TARGET_PREFIX_RE = /^(chat_id:|chatid:|chat:|chat_guid:|chatguid:|guid:|chat_identifier:|chatidentifier:|chatident:)/i;
33
+ const SERVICE_PREFIX_RE = /^(imessage:|sms:|auto:)/i;
34
+ function stripPrefix(value, prefix) {
35
+ return value.slice(prefix.length).trim();
36
+ }
37
+ /**
38
+ * Normalise a phone-ish string to E.164. Strips a leading `scheme:`, removes
39
+ * everything but digits and `+`, and prepends `+` when missing.
40
+ */
41
+ export function normalizeE164(raw) {
42
+ let v = raw.trim().replace(/^[a-z][a-z0-9-]*:/i, "");
43
+ v = v.replace(/[^0-9+]/g, "");
44
+ if (!v)
45
+ return "";
46
+ if (v.startsWith("+"))
47
+ return `+${v.slice(1).replace(/\+/g, "")}`;
48
+ return `+${v.replace(/\+/g, "")}`;
49
+ }
50
+ /**
51
+ * Canonicalise an iMessage handle for comparison. Service prefixes are stripped
52
+ * (and re-applied by callers that care); chat prefixes are lowercased on the
53
+ * prefix only; an email lowercases whole; a phone becomes E.164; anything else
54
+ * has its whitespace stripped.
55
+ */
56
+ export function normalizeIMessageHandle(raw) {
57
+ const trimmed = (raw ?? "").trim();
58
+ if (!trimmed)
59
+ return "";
60
+ const lower = trimmed.toLowerCase();
61
+ // Strip a service prefix and recurse on the remainder.
62
+ for (const { prefix } of SERVICE_PREFIXES) {
63
+ if (lower.startsWith(prefix))
64
+ return normalizeIMessageHandle(trimmed.slice(prefix.length));
65
+ }
66
+ // Chat prefixes — lowercase the prefix, keep the value's case.
67
+ for (const prefix of [...CHAT_ID_PREFIXES, ...CHAT_GUID_PREFIXES, ...CHAT_IDENTIFIER_PREFIXES]) {
68
+ if (lower.startsWith(prefix)) {
69
+ const value = trimmed.slice(prefix.length).trim();
70
+ return `${prefix}${value}`;
71
+ }
72
+ }
73
+ if (trimmed.includes("@"))
74
+ return lower; // email handle
75
+ const e164 = normalizeE164(trimmed);
76
+ if (e164)
77
+ return e164;
78
+ return trimmed.replace(/\s+/g, "");
79
+ }
80
+ /** Strict chat-prefix parse — throws on a malformed `chat_id`. Returns null when no chat prefix matched. */
81
+ function parseChatTargetStrict(trimmed, lower) {
82
+ for (const prefix of CHAT_ID_PREFIXES) {
83
+ if (lower.startsWith(prefix)) {
84
+ const value = stripPrefix(trimmed, prefix);
85
+ const chatId = Number.parseInt(value, 10);
86
+ if (!Number.isFinite(chatId))
87
+ throw new Error(`Invalid chat_id: ${value}`);
88
+ return { kind: "chat_id", chatId };
89
+ }
90
+ }
91
+ for (const prefix of CHAT_GUID_PREFIXES) {
92
+ if (lower.startsWith(prefix)) {
93
+ const value = stripPrefix(trimmed, prefix);
94
+ if (!value)
95
+ throw new Error("chat_guid is required");
96
+ return { kind: "chat_guid", chatGuid: value };
97
+ }
98
+ }
99
+ for (const prefix of CHAT_IDENTIFIER_PREFIXES) {
100
+ if (lower.startsWith(prefix)) {
101
+ const value = stripPrefix(trimmed, prefix);
102
+ if (!value)
103
+ throw new Error("chat_identifier is required");
104
+ return { kind: "chat_identifier", chatIdentifier: value };
105
+ }
106
+ }
107
+ return null;
108
+ }
109
+ /** Lenient chat-prefix parse — skips a malformed prefix (returns null). */
110
+ function parseChatTargetLenient(trimmed, lower) {
111
+ for (const prefix of CHAT_ID_PREFIXES) {
112
+ if (lower.startsWith(prefix)) {
113
+ const chatId = Number.parseInt(stripPrefix(trimmed, prefix), 10);
114
+ if (!Number.isFinite(chatId))
115
+ return null;
116
+ return { kind: "chat_id", chatId };
117
+ }
118
+ }
119
+ for (const prefix of CHAT_GUID_PREFIXES) {
120
+ if (lower.startsWith(prefix)) {
121
+ const value = stripPrefix(trimmed, prefix);
122
+ return value ? { kind: "chat_guid", chatGuid: value } : null;
123
+ }
124
+ }
125
+ for (const prefix of CHAT_IDENTIFIER_PREFIXES) {
126
+ if (lower.startsWith(prefix)) {
127
+ const value = stripPrefix(trimmed, prefix);
128
+ return value ? { kind: "chat_identifier", chatIdentifier: value } : null;
129
+ }
130
+ }
131
+ return null;
132
+ }
133
+ /**
134
+ * Parse an outbound target (SEND path). Throws when the target is empty or a
135
+ * chat prefix is malformed. A service-prefixed handle keeps its service; a bare
136
+ * handle defaults to `auto`.
137
+ */
138
+ export function parseIMessageTarget(raw) {
139
+ const trimmed = (raw ?? "").trim();
140
+ if (!trimmed)
141
+ throw new Error("iMessage target is required");
142
+ const lower = trimmed.toLowerCase();
143
+ // Service-prefixed: strip it, then either parse a chat target or a bare handle.
144
+ for (const { prefix, service } of SERVICE_PREFIXES) {
145
+ if (lower.startsWith(prefix)) {
146
+ const remainder = stripPrefix(trimmed, prefix);
147
+ if (!remainder)
148
+ throw new Error(`${prefix} target is required`);
149
+ const chat = parseChatTargetStrict(remainder, remainder.toLowerCase());
150
+ if (chat)
151
+ return chat;
152
+ return { kind: "handle", to: remainder, service };
153
+ }
154
+ }
155
+ const chat = parseChatTargetStrict(trimmed, lower);
156
+ if (chat)
157
+ return chat;
158
+ return { kind: "handle", to: trimmed, service: "auto" };
159
+ }
160
+ /** Parse an allow-list target (LENIENT). A bare/unparseable string is a normalized handle. */
161
+ export function parseIMessageAllowTarget(raw) {
162
+ const trimmed = (raw ?? "").trim();
163
+ if (!trimmed)
164
+ return { kind: "handle", handle: "" };
165
+ const lower = trimmed.toLowerCase();
166
+ for (const { prefix } of SERVICE_PREFIXES) {
167
+ if (lower.startsWith(prefix)) {
168
+ const remainder = stripPrefix(trimmed, prefix);
169
+ if (!remainder)
170
+ return { kind: "handle", handle: "" };
171
+ const chat = parseChatTargetLenient(remainder, remainder.toLowerCase());
172
+ if (chat)
173
+ return chat;
174
+ return { kind: "handle", handle: normalizeIMessageHandle(remainder) };
175
+ }
176
+ }
177
+ const chat = parseChatTargetLenient(trimmed, lower);
178
+ if (chat)
179
+ return chat;
180
+ return { kind: "handle", handle: normalizeIMessageHandle(trimmed) };
181
+ }
182
+ /** Format a numeric chat id into the canonical `chat_id:N` target form. */
183
+ export function formatIMessageChatTarget(chatId) {
184
+ if (chatId === undefined || chatId === null || !Number.isFinite(chatId))
185
+ return "";
186
+ return `chat_id:${chatId}`;
187
+ }
188
+ /** True iff a string carries an explicit chat / service prefix (vs a bare name). */
189
+ export function looksLikeIMessageTargetId(raw) {
190
+ const trimmed = (raw ?? "").trim();
191
+ if (!trimmed)
192
+ return false;
193
+ if (CHAT_TARGET_PREFIX_RE.test(trimmed))
194
+ return true;
195
+ if (SERVICE_PREFIX_RE.test(trimmed))
196
+ return true;
197
+ if (trimmed.includes("@"))
198
+ return true;
199
+ return /^\+?\d{3,}$/.test(trimmed);
200
+ }
201
+ /** Advisory chat-type guess from a (parsed) target — never throws. */
202
+ export function inferIMessageTargetChatType(raw) {
203
+ try {
204
+ const t = parseIMessageTarget(raw);
205
+ return t.kind === "handle" ? "dm" : "group";
206
+ }
207
+ catch {
208
+ return undefined;
209
+ }
210
+ }
211
+ /**
212
+ * Decide whether a (normalized) inbound sender is allowed given a list of
213
+ * allow-from entries. `*` is a wildcard. Returns false on an empty list.
214
+ */
215
+ export function isAllowedIMessageSender(params) {
216
+ const entries = params.allowFrom.map((e) => String(e).trim()).filter(Boolean);
217
+ if (entries.length === 0)
218
+ return false;
219
+ if (entries.includes("*"))
220
+ return true;
221
+ const senderNorm = normalizeIMessageHandle(params.sender);
222
+ for (const entry of entries) {
223
+ const target = parseIMessageAllowTarget(entry);
224
+ switch (target.kind) {
225
+ case "chat_id":
226
+ if (params.chatId !== undefined && target.chatId === params.chatId)
227
+ return true;
228
+ break;
229
+ case "chat_guid":
230
+ if (params.chatGuid && target.chatGuid === params.chatGuid)
231
+ return true;
232
+ break;
233
+ case "chat_identifier":
234
+ if (params.chatIdentifier && target.chatIdentifier === params.chatIdentifier)
235
+ return true;
236
+ break;
237
+ case "handle":
238
+ if (target.handle && target.handle === senderNorm)
239
+ return true;
240
+ break;
241
+ }
242
+ }
243
+ return false;
244
+ }
245
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../../../src/agents/channels/imessage/targets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * iMessage watch-error payload sanitization.
3
+ *
4
+ * The `imsg rpc` stream can emit an `error` notification whose `params` is an
5
+ * arbitrary, attacker-influenced object (a remote bridge, a malformed row). The
6
+ * connection logs it — so before logging we reduce it to a finite, bounded shape:
7
+ * a numeric `code` (only when finite) + a sanitized, length-capped `message`
8
+ * (terminal control chars stripped so a crafted payload can't smuggle ANSI /
9
+ * cursor escapes into the operator's terminal or log file).
10
+ *
11
+ * Ported from the upstream `sanitizeIMessageWatchErrorPayload`.
12
+ */
13
+ /** The safe, bounded watch-error shape that is logged. */
14
+ export interface SanitizedIMessageWatchErrorPayload {
15
+ code?: number;
16
+ message?: string;
17
+ }
18
+ /**
19
+ * Reduce a raw watch `error` notification's `params` to a finite `code` +
20
+ * sanitized/truncated `message`. Anything that isn't a plain object → `{}`.
21
+ */
22
+ export declare function sanitizeIMessageWatchErrorPayload(payload: unknown): SanitizedIMessageWatchErrorPayload;
23
+ //# sourceMappingURL=watch-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-error.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/imessage/watch-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,0DAA0D;AAC1D,MAAM,WAAW,kCAAkC;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAiCD;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,kCAAkC,CAgBtG"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * iMessage watch-error payload sanitization.
3
+ *
4
+ * The `imsg rpc` stream can emit an `error` notification whose `params` is an
5
+ * arbitrary, attacker-influenced object (a remote bridge, a malformed row). The
6
+ * connection logs it — so before logging we reduce it to a finite, bounded shape:
7
+ * a numeric `code` (only when finite) + a sanitized, length-capped `message`
8
+ * (terminal control chars stripped so a crafted payload can't smuggle ANSI /
9
+ * cursor escapes into the operator's terminal or log file).
10
+ *
11
+ * Ported from the upstream `sanitizeIMessageWatchErrorPayload`.
12
+ */
13
+ /** Max retained chars of a watch-error message before truncation. */
14
+ const MAX_WATCH_ERROR_MESSAGE_CHARS = 200;
15
+ function isRecord(v) {
16
+ return Boolean(v) && typeof v === "object" && !Array.isArray(v);
17
+ }
18
+ /**
19
+ * Strip terminal/control characters from untrusted text for single-line log
20
+ * rendering: CR/LF/TAB become visible escapes, then every remaining C0/C1
21
+ * control char (incl. ANSI ESC 0x1b) is removed.
22
+ */
23
+ function sanitizeTerminalText(input) {
24
+ const normalized = input.replace(/\r/g, "\\r").replace(/\n/g, "\\n").replace(/\t/g, "\\t");
25
+ let sanitized = "";
26
+ for (const char of normalized) {
27
+ const code = char.charCodeAt(0);
28
+ const isControl = (code >= 0x00 && code <= 0x1f) || (code >= 0x7f && code <= 0x9f);
29
+ if (!isControl)
30
+ sanitized += char;
31
+ }
32
+ return sanitized;
33
+ }
34
+ /** Truncate to `max` UTF-16 code units without splitting a surrogate pair. */
35
+ function truncateUtf16Safe(text, max) {
36
+ if (max <= 0)
37
+ return "";
38
+ if (text.length <= max)
39
+ return text;
40
+ let end = max;
41
+ // Don't cut between a high + low surrogate.
42
+ const code = text.charCodeAt(end - 1);
43
+ if (code >= 0xd800 && code <= 0xdbff)
44
+ end -= 1;
45
+ return text.slice(0, end);
46
+ }
47
+ /**
48
+ * Reduce a raw watch `error` notification's `params` to a finite `code` +
49
+ * sanitized/truncated `message`. Anything that isn't a plain object → `{}`.
50
+ */
51
+ export function sanitizeIMessageWatchErrorPayload(payload) {
52
+ if (!isRecord(payload))
53
+ return {};
54
+ const safe = {};
55
+ if (typeof payload.code === "number" && Number.isFinite(payload.code)) {
56
+ safe.code = payload.code;
57
+ }
58
+ if (typeof payload.message === "string") {
59
+ const sanitized = sanitizeTerminalText(payload.message);
60
+ if (sanitized) {
61
+ safe.message =
62
+ sanitized.length > MAX_WATCH_ERROR_MESSAGE_CHARS
63
+ ? `${truncateUtf16Safe(sanitized, MAX_WATCH_ERROR_MESSAGE_CHARS - 1)}…`
64
+ : sanitized;
65
+ }
66
+ }
67
+ return safe;
68
+ }
69
+ //# sourceMappingURL=watch-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-error.js","sourceRoot":"","sources":["../../../../src/agents/channels/imessage/watch-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,qEAAqE;AACrE,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAQ1C,SAAS,QAAQ,CAAC,CAAU;IAC3B,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,KAAa;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3F,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;QACnF,IAAI,CAAC,SAAS;YAAE,SAAS,IAAI,IAAI,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,SAAS,iBAAiB,CAAC,IAAY,EAAE,GAAW;IACnD,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,4CAA4C;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACtC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;QAAE,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,OAAgB;IACjE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,GAAuC,EAAE,CAAC;IACpD,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,OAAO;gBACX,SAAS,CAAC,MAAM,GAAG,6BAA6B;oBAC/C,CAAC,CAAC,GAAG,iBAAiB,CAAC,SAAS,EAAE,6BAA6B,GAAG,CAAC,CAAC,GAAG;oBACvE,CAAC,CAAC,SAAS,CAAC;QACf,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC"}