agiagent-dev 2026.1.36 → 2026.1.38

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 (609) hide show
  1. package/dist/agents/agiagent-tools.js +1 -0
  2. package/dist/agents/system-prompt.js +104 -1
  3. package/dist/agents/tools/browser-tool.d.ts +2 -0
  4. package/dist/agents/tools/browser-tool.js +24 -5
  5. package/dist/agents/workspace.d.ts +3 -1
  6. package/dist/agents/workspace.js +5 -0
  7. package/dist/auto-reply/reply/mentions.js +5 -1
  8. package/dist/build-info.json +3 -3
  9. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  10. package/dist/cli/program/command-registry.js +5 -0
  11. package/dist/cli/program/register.connect-gmail.d.ts +2 -0
  12. package/dist/cli/program/register.connect-gmail.js +89 -0
  13. package/dist/cli/run-main.js +21 -1
  14. package/dist/config/plugin-auto-enable.js +5 -14
  15. package/dist/gateway/hosted-db.d.ts +29 -0
  16. package/dist/gateway/hosted-db.js +73 -0
  17. package/dist/gateway/hosted-telegram.js +5 -1
  18. package/dist/gateway/hosted-whatsapp.js +2 -3
  19. package/dist/gateway/server-methods/composio.d.ts +2 -0
  20. package/dist/gateway/server-methods/composio.js +120 -0
  21. package/dist/gateway/server-methods-list.js +2 -0
  22. package/dist/gateway/server-methods.js +4 -0
  23. package/dist/infra/composio.d.ts +21 -0
  24. package/dist/infra/composio.js +76 -0
  25. package/dist/infra/node-shell.js +6 -1
  26. package/extensions/bluebubbles/agiagent.plugin.json +9 -0
  27. package/extensions/bluebubbles/index.ts +19 -0
  28. package/extensions/bluebubbles/node_modules/.bin/agiagent +21 -0
  29. package/extensions/bluebubbles/package.json +36 -0
  30. package/extensions/bluebubbles/src/accounts.ts +88 -0
  31. package/extensions/bluebubbles/src/actions.test.ts +650 -0
  32. package/extensions/bluebubbles/src/actions.ts +438 -0
  33. package/extensions/bluebubbles/src/attachments.test.ts +345 -0
  34. package/extensions/bluebubbles/src/attachments.ts +300 -0
  35. package/extensions/bluebubbles/src/channel.ts +414 -0
  36. package/extensions/bluebubbles/src/chat.test.ts +461 -0
  37. package/extensions/bluebubbles/src/chat.ts +378 -0
  38. package/extensions/bluebubbles/src/config-schema.ts +51 -0
  39. package/extensions/bluebubbles/src/media-send.ts +174 -0
  40. package/extensions/bluebubbles/src/monitor.test.ts +2340 -0
  41. package/extensions/bluebubbles/src/monitor.ts +2469 -0
  42. package/extensions/bluebubbles/src/onboarding.ts +352 -0
  43. package/extensions/bluebubbles/src/probe.ts +135 -0
  44. package/extensions/bluebubbles/src/reactions.test.ts +392 -0
  45. package/extensions/bluebubbles/src/reactions.ts +188 -0
  46. package/extensions/bluebubbles/src/runtime.ts +14 -0
  47. package/extensions/bluebubbles/src/send.test.ts +808 -0
  48. package/extensions/bluebubbles/src/send.ts +467 -0
  49. package/extensions/bluebubbles/src/targets.test.ts +183 -0
  50. package/extensions/bluebubbles/src/targets.ts +422 -0
  51. package/extensions/bluebubbles/src/types.ts +127 -0
  52. package/extensions/copilot-proxy/README.md +24 -0
  53. package/extensions/copilot-proxy/agiagent.plugin.json +9 -0
  54. package/extensions/copilot-proxy/index.ts +148 -0
  55. package/extensions/copilot-proxy/node_modules/.bin/agiagent +21 -0
  56. package/extensions/copilot-proxy/package.json +14 -0
  57. package/extensions/diagnostics-otel/agiagent.plugin.json +8 -0
  58. package/extensions/diagnostics-otel/index.ts +15 -0
  59. package/extensions/diagnostics-otel/node_modules/.bin/agiagent +21 -0
  60. package/extensions/diagnostics-otel/package.json +27 -0
  61. package/extensions/diagnostics-otel/src/service.test.ts +226 -0
  62. package/extensions/diagnostics-otel/src/service.ts +635 -0
  63. package/extensions/discord/agiagent.plugin.json +9 -0
  64. package/extensions/discord/index.ts +17 -0
  65. package/extensions/discord/node_modules/.bin/agiagent +21 -0
  66. package/extensions/discord/package.json +14 -0
  67. package/extensions/discord/src/channel.ts +422 -0
  68. package/extensions/discord/src/runtime.ts +14 -0
  69. package/extensions/google-antigravity-auth/README.md +24 -0
  70. package/extensions/google-antigravity-auth/agiagent.plugin.json +9 -0
  71. package/extensions/google-antigravity-auth/index.ts +461 -0
  72. package/extensions/google-antigravity-auth/node_modules/.bin/agiagent +21 -0
  73. package/extensions/google-antigravity-auth/package.json +14 -0
  74. package/extensions/google-gemini-cli-auth/README.md +35 -0
  75. package/extensions/google-gemini-cli-auth/agiagent.plugin.json +9 -0
  76. package/extensions/google-gemini-cli-auth/index.ts +88 -0
  77. package/extensions/google-gemini-cli-auth/node_modules/.bin/agiagent +21 -0
  78. package/extensions/google-gemini-cli-auth/oauth.test.ts +240 -0
  79. package/extensions/google-gemini-cli-auth/oauth.ts +662 -0
  80. package/extensions/google-gemini-cli-auth/package.json +14 -0
  81. package/extensions/googlechat/agiagent.plugin.json +9 -0
  82. package/extensions/googlechat/index.ts +19 -0
  83. package/extensions/googlechat/node_modules/.bin/agiagent +21 -0
  84. package/extensions/googlechat/package.json +39 -0
  85. package/extensions/googlechat/src/accounts.ts +147 -0
  86. package/extensions/googlechat/src/actions.ts +181 -0
  87. package/extensions/googlechat/src/api.test.ts +61 -0
  88. package/extensions/googlechat/src/api.ts +282 -0
  89. package/extensions/googlechat/src/auth.ts +123 -0
  90. package/extensions/googlechat/src/channel.ts +583 -0
  91. package/extensions/googlechat/src/monitor.test.ts +22 -0
  92. package/extensions/googlechat/src/monitor.ts +949 -0
  93. package/extensions/googlechat/src/onboarding.ts +269 -0
  94. package/extensions/googlechat/src/runtime.ts +14 -0
  95. package/extensions/googlechat/src/targets.test.ts +32 -0
  96. package/extensions/googlechat/src/targets.ts +65 -0
  97. package/extensions/googlechat/src/types.config.ts +3 -0
  98. package/extensions/googlechat/src/types.ts +73 -0
  99. package/extensions/imessage/agiagent.plugin.json +9 -0
  100. package/extensions/imessage/index.ts +17 -0
  101. package/extensions/imessage/node_modules/.bin/agiagent +21 -0
  102. package/extensions/imessage/package.json +14 -0
  103. package/extensions/imessage/src/channel.ts +294 -0
  104. package/extensions/imessage/src/runtime.ts +14 -0
  105. package/extensions/line/agiagent.plugin.json +9 -0
  106. package/extensions/line/index.ts +19 -0
  107. package/extensions/line/node_modules/.bin/agiagent +21 -0
  108. package/extensions/line/package.json +29 -0
  109. package/extensions/line/src/card-command.ts +344 -0
  110. package/extensions/line/src/channel.logout.test.ts +97 -0
  111. package/extensions/line/src/channel.sendPayload.test.ts +306 -0
  112. package/extensions/line/src/channel.ts +781 -0
  113. package/extensions/line/src/runtime.ts +14 -0
  114. package/extensions/llm-task/README.md +97 -0
  115. package/extensions/llm-task/agiagent.plugin.json +21 -0
  116. package/extensions/llm-task/index.ts +6 -0
  117. package/extensions/llm-task/node_modules/.bin/agiagent +21 -0
  118. package/extensions/llm-task/package.json +14 -0
  119. package/extensions/llm-task/src/llm-task-tool.test.ts +124 -0
  120. package/extensions/llm-task/src/llm-task-tool.ts +237 -0
  121. package/extensions/lobster/README.md +75 -0
  122. package/extensions/lobster/SKILL.md +97 -0
  123. package/extensions/lobster/agiagent.plugin.json +10 -0
  124. package/extensions/lobster/index.ts +14 -0
  125. package/extensions/lobster/node_modules/.bin/agiagent +21 -0
  126. package/extensions/lobster/package.json +14 -0
  127. package/extensions/lobster/src/lobster-tool.test.ts +246 -0
  128. package/extensions/lobster/src/lobster-tool.ts +328 -0
  129. package/extensions/matrix/CHANGELOG.md +75 -0
  130. package/extensions/matrix/agiagent.plugin.json +9 -0
  131. package/extensions/matrix/index.ts +17 -0
  132. package/extensions/matrix/node_modules/.bin/agiagent +21 -0
  133. package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
  134. package/extensions/matrix/package.json +36 -0
  135. package/extensions/matrix/src/actions.ts +195 -0
  136. package/extensions/matrix/src/channel.directory.test.ts +64 -0
  137. package/extensions/matrix/src/channel.ts +443 -0
  138. package/extensions/matrix/src/config-schema.ts +62 -0
  139. package/extensions/matrix/src/directory-live.ts +188 -0
  140. package/extensions/matrix/src/group-mentions.ts +66 -0
  141. package/extensions/matrix/src/matrix/accounts.test.ts +82 -0
  142. package/extensions/matrix/src/matrix/accounts.ts +65 -0
  143. package/extensions/matrix/src/matrix/actions/client.ts +57 -0
  144. package/extensions/matrix/src/matrix/actions/messages.ts +128 -0
  145. package/extensions/matrix/src/matrix/actions/pins.ts +76 -0
  146. package/extensions/matrix/src/matrix/actions/reactions.ts +96 -0
  147. package/extensions/matrix/src/matrix/actions/room.ts +85 -0
  148. package/extensions/matrix/src/matrix/actions/summary.ts +75 -0
  149. package/extensions/matrix/src/matrix/actions/types.ts +84 -0
  150. package/extensions/matrix/src/matrix/actions.ts +15 -0
  151. package/extensions/matrix/src/matrix/active-client.ts +11 -0
  152. package/extensions/matrix/src/matrix/client/config.ts +160 -0
  153. package/extensions/matrix/src/matrix/client/create-client.ts +123 -0
  154. package/extensions/matrix/src/matrix/client/logging.ts +36 -0
  155. package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
  156. package/extensions/matrix/src/matrix/client/shared.ts +170 -0
  157. package/extensions/matrix/src/matrix/client/storage.ts +131 -0
  158. package/extensions/matrix/src/matrix/client/types.ts +34 -0
  159. package/extensions/matrix/src/matrix/client.test.ts +56 -0
  160. package/extensions/matrix/src/matrix/client.ts +5 -0
  161. package/extensions/matrix/src/matrix/credentials.ts +105 -0
  162. package/extensions/matrix/src/matrix/deps.ts +60 -0
  163. package/extensions/matrix/src/matrix/format.test.ts +33 -0
  164. package/extensions/matrix/src/matrix/format.ts +22 -0
  165. package/extensions/matrix/src/matrix/index.ts +11 -0
  166. package/extensions/matrix/src/matrix/monitor/allowlist.ts +62 -0
  167. package/extensions/matrix/src/matrix/monitor/auto-join.ts +71 -0
  168. package/extensions/matrix/src/matrix/monitor/direct.ts +104 -0
  169. package/extensions/matrix/src/matrix/monitor/events.ts +101 -0
  170. package/extensions/matrix/src/matrix/monitor/handler.ts +670 -0
  171. package/extensions/matrix/src/matrix/monitor/index.ts +291 -0
  172. package/extensions/matrix/src/matrix/monitor/location.ts +100 -0
  173. package/extensions/matrix/src/matrix/monitor/media.test.ts +102 -0
  174. package/extensions/matrix/src/matrix/monitor/media.ts +113 -0
  175. package/extensions/matrix/src/matrix/monitor/mentions.ts +31 -0
  176. package/extensions/matrix/src/matrix/monitor/replies.ts +97 -0
  177. package/extensions/matrix/src/matrix/monitor/room-info.ts +55 -0
  178. package/extensions/matrix/src/matrix/monitor/rooms.ts +48 -0
  179. package/extensions/matrix/src/matrix/monitor/threads.ts +68 -0
  180. package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
  181. package/extensions/matrix/src/matrix/poll-types.test.ts +21 -0
  182. package/extensions/matrix/src/matrix/poll-types.ts +166 -0
  183. package/extensions/matrix/src/matrix/probe.ts +70 -0
  184. package/extensions/matrix/src/matrix/send/client.ts +66 -0
  185. package/extensions/matrix/src/matrix/send/formatting.ts +89 -0
  186. package/extensions/matrix/src/matrix/send/media.ts +229 -0
  187. package/extensions/matrix/src/matrix/send/targets.test.ts +98 -0
  188. package/extensions/matrix/src/matrix/send/targets.ts +136 -0
  189. package/extensions/matrix/src/matrix/send/types.ts +109 -0
  190. package/extensions/matrix/src/matrix/send.test.ts +171 -0
  191. package/extensions/matrix/src/matrix/send.ts +260 -0
  192. package/extensions/matrix/src/onboarding.ts +442 -0
  193. package/extensions/matrix/src/outbound.ts +52 -0
  194. package/extensions/matrix/src/resolve-targets.ts +89 -0
  195. package/extensions/matrix/src/runtime.ts +14 -0
  196. package/extensions/matrix/src/tool-actions.ts +164 -0
  197. package/extensions/matrix/src/types.ts +95 -0
  198. package/extensions/mattermost/agiagent.plugin.json +9 -0
  199. package/extensions/mattermost/index.ts +17 -0
  200. package/extensions/mattermost/node_modules/.bin/agiagent +21 -0
  201. package/extensions/mattermost/package.json +28 -0
  202. package/extensions/mattermost/src/channel.test.ts +48 -0
  203. package/extensions/mattermost/src/channel.ts +337 -0
  204. package/extensions/mattermost/src/config-schema.ts +55 -0
  205. package/extensions/mattermost/src/group-mentions.ts +15 -0
  206. package/extensions/mattermost/src/mattermost/accounts.ts +128 -0
  207. package/extensions/mattermost/src/mattermost/client.ts +220 -0
  208. package/extensions/mattermost/src/mattermost/index.ts +9 -0
  209. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +166 -0
  210. package/extensions/mattermost/src/mattermost/monitor.ts +987 -0
  211. package/extensions/mattermost/src/mattermost/probe.ts +74 -0
  212. package/extensions/mattermost/src/mattermost/send.ts +231 -0
  213. package/extensions/mattermost/src/normalize.ts +46 -0
  214. package/extensions/mattermost/src/onboarding-helpers.ts +44 -0
  215. package/extensions/mattermost/src/onboarding.ts +186 -0
  216. package/extensions/mattermost/src/runtime.ts +14 -0
  217. package/extensions/mattermost/src/types.ts +50 -0
  218. package/extensions/memory-core/agiagent.plugin.json +9 -0
  219. package/extensions/memory-core/index.ts +38 -0
  220. package/extensions/memory-core/node_modules/.bin/agiagent +21 -0
  221. package/extensions/memory-core/package.json +17 -0
  222. package/extensions/memory-lancedb/agiagent.plugin.json +60 -0
  223. package/extensions/memory-lancedb/config.ts +139 -0
  224. package/extensions/memory-lancedb/index.test.ts +286 -0
  225. package/extensions/memory-lancedb/index.ts +608 -0
  226. package/extensions/memory-lancedb/node_modules/.bin/agiagent +21 -0
  227. package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
  228. package/extensions/memory-lancedb/package.json +19 -0
  229. package/extensions/minimax-portal-auth/README.md +33 -0
  230. package/extensions/minimax-portal-auth/agiagent.plugin.json +9 -0
  231. package/extensions/minimax-portal-auth/index.ts +155 -0
  232. package/extensions/minimax-portal-auth/node_modules/.bin/agiagent +21 -0
  233. package/extensions/minimax-portal-auth/oauth.ts +247 -0
  234. package/extensions/minimax-portal-auth/package.json +14 -0
  235. package/extensions/msteams/CHANGELOG.md +71 -0
  236. package/extensions/msteams/agiagent.plugin.json +9 -0
  237. package/extensions/msteams/index.ts +17 -0
  238. package/extensions/msteams/node_modules/.bin/agiagent +21 -0
  239. package/extensions/msteams/package.json +39 -0
  240. package/extensions/msteams/src/attachments/download.ts +238 -0
  241. package/extensions/msteams/src/attachments/graph.ts +351 -0
  242. package/extensions/msteams/src/attachments/html.ts +90 -0
  243. package/extensions/msteams/src/attachments/payload.ts +22 -0
  244. package/extensions/msteams/src/attachments/shared.ts +271 -0
  245. package/extensions/msteams/src/attachments/types.ts +37 -0
  246. package/extensions/msteams/src/attachments.test.ts +423 -0
  247. package/extensions/msteams/src/attachments.ts +18 -0
  248. package/extensions/msteams/src/channel.directory.test.ts +48 -0
  249. package/extensions/msteams/src/channel.ts +459 -0
  250. package/extensions/msteams/src/conversation-store-fs.test.ts +88 -0
  251. package/extensions/msteams/src/conversation-store-fs.ts +165 -0
  252. package/extensions/msteams/src/conversation-store-memory.ts +47 -0
  253. package/extensions/msteams/src/conversation-store.ts +41 -0
  254. package/extensions/msteams/src/directory-live.ts +205 -0
  255. package/extensions/msteams/src/errors.test.ts +45 -0
  256. package/extensions/msteams/src/errors.ts +190 -0
  257. package/extensions/msteams/src/file-consent-helpers.test.ts +243 -0
  258. package/extensions/msteams/src/file-consent-helpers.ts +73 -0
  259. package/extensions/msteams/src/file-consent.ts +126 -0
  260. package/extensions/msteams/src/graph-chat.ts +53 -0
  261. package/extensions/msteams/src/graph-upload.ts +453 -0
  262. package/extensions/msteams/src/inbound.test.ts +66 -0
  263. package/extensions/msteams/src/inbound.ts +48 -0
  264. package/extensions/msteams/src/index.ts +4 -0
  265. package/extensions/msteams/src/media-helpers.test.ts +189 -0
  266. package/extensions/msteams/src/media-helpers.ts +86 -0
  267. package/extensions/msteams/src/messenger.test.ts +248 -0
  268. package/extensions/msteams/src/messenger.ts +495 -0
  269. package/extensions/msteams/src/monitor-handler/inbound-media.ts +125 -0
  270. package/extensions/msteams/src/monitor-handler/message-handler.ts +639 -0
  271. package/extensions/msteams/src/monitor-handler.ts +162 -0
  272. package/extensions/msteams/src/monitor-types.ts +5 -0
  273. package/extensions/msteams/src/monitor.ts +295 -0
  274. package/extensions/msteams/src/onboarding.ts +431 -0
  275. package/extensions/msteams/src/outbound.ts +46 -0
  276. package/extensions/msteams/src/pending-uploads.ts +89 -0
  277. package/extensions/msteams/src/policy.test.ts +209 -0
  278. package/extensions/msteams/src/policy.ts +273 -0
  279. package/extensions/msteams/src/polls-store-memory.ts +32 -0
  280. package/extensions/msteams/src/polls-store.test.ts +38 -0
  281. package/extensions/msteams/src/polls.test.ts +72 -0
  282. package/extensions/msteams/src/polls.ts +315 -0
  283. package/extensions/msteams/src/probe.test.ts +58 -0
  284. package/extensions/msteams/src/probe.ts +107 -0
  285. package/extensions/msteams/src/reply-dispatcher.ts +130 -0
  286. package/extensions/msteams/src/resolve-allowlist.ts +297 -0
  287. package/extensions/msteams/src/runtime.ts +14 -0
  288. package/extensions/msteams/src/sdk-types.ts +19 -0
  289. package/extensions/msteams/src/sdk.ts +33 -0
  290. package/extensions/msteams/src/send-context.ts +164 -0
  291. package/extensions/msteams/src/send.ts +519 -0
  292. package/extensions/msteams/src/sent-message-cache.test.ts +15 -0
  293. package/extensions/msteams/src/sent-message-cache.ts +47 -0
  294. package/extensions/msteams/src/storage.ts +25 -0
  295. package/extensions/msteams/src/store-fs.ts +83 -0
  296. package/extensions/msteams/src/token.ts +19 -0
  297. package/extensions/nextcloud-talk/agiagent.plugin.json +9 -0
  298. package/extensions/nextcloud-talk/index.ts +17 -0
  299. package/extensions/nextcloud-talk/node_modules/.bin/agiagent +21 -0
  300. package/extensions/nextcloud-talk/package.json +33 -0
  301. package/extensions/nextcloud-talk/src/accounts.ts +174 -0
  302. package/extensions/nextcloud-talk/src/channel.ts +409 -0
  303. package/extensions/nextcloud-talk/src/config-schema.ts +78 -0
  304. package/extensions/nextcloud-talk/src/format.ts +79 -0
  305. package/extensions/nextcloud-talk/src/inbound.ts +320 -0
  306. package/extensions/nextcloud-talk/src/monitor.ts +246 -0
  307. package/extensions/nextcloud-talk/src/normalize.ts +39 -0
  308. package/extensions/nextcloud-talk/src/onboarding.ts +343 -0
  309. package/extensions/nextcloud-talk/src/policy.ts +188 -0
  310. package/extensions/nextcloud-talk/src/room-info.ts +125 -0
  311. package/extensions/nextcloud-talk/src/runtime.ts +14 -0
  312. package/extensions/nextcloud-talk/src/send.ts +210 -0
  313. package/extensions/nextcloud-talk/src/signature.ts +72 -0
  314. package/extensions/nextcloud-talk/src/types.ts +179 -0
  315. package/extensions/nostr/CHANGELOG.md +62 -0
  316. package/extensions/nostr/README.md +136 -0
  317. package/extensions/nostr/agiagent.plugin.json +9 -0
  318. package/extensions/nostr/index.ts +68 -0
  319. package/extensions/nostr/node_modules/.bin/agiagent +21 -0
  320. package/extensions/nostr/package.json +34 -0
  321. package/extensions/nostr/src/channel.test.ts +151 -0
  322. package/extensions/nostr/src/channel.ts +353 -0
  323. package/extensions/nostr/src/config-schema.ts +90 -0
  324. package/extensions/nostr/src/metrics.ts +478 -0
  325. package/extensions/nostr/src/nostr-bus.fuzz.test.ts +533 -0
  326. package/extensions/nostr/src/nostr-bus.integration.test.ts +448 -0
  327. package/extensions/nostr/src/nostr-bus.test.ts +199 -0
  328. package/extensions/nostr/src/nostr-bus.ts +715 -0
  329. package/extensions/nostr/src/nostr-profile-http.test.ts +378 -0
  330. package/extensions/nostr/src/nostr-profile-http.ts +519 -0
  331. package/extensions/nostr/src/nostr-profile-import.test.ts +119 -0
  332. package/extensions/nostr/src/nostr-profile-import.ts +262 -0
  333. package/extensions/nostr/src/nostr-profile.fuzz.test.ts +477 -0
  334. package/extensions/nostr/src/nostr-profile.test.ts +410 -0
  335. package/extensions/nostr/src/nostr-profile.ts +277 -0
  336. package/extensions/nostr/src/nostr-state-store.test.ts +131 -0
  337. package/extensions/nostr/src/nostr-state-store.ts +226 -0
  338. package/extensions/nostr/src/runtime.ts +14 -0
  339. package/extensions/nostr/src/seen-tracker.ts +303 -0
  340. package/extensions/nostr/src/types.test.ts +157 -0
  341. package/extensions/nostr/src/types.ts +101 -0
  342. package/extensions/nostr/test/setup.ts +5 -0
  343. package/extensions/open-prose/README.md +25 -0
  344. package/extensions/open-prose/agiagent.plugin.json +11 -0
  345. package/extensions/open-prose/index.ts +5 -0
  346. package/extensions/open-prose/node_modules/.bin/agiagent +21 -0
  347. package/extensions/open-prose/package.json +14 -0
  348. package/extensions/open-prose/skills/prose/LICENSE +21 -0
  349. package/extensions/open-prose/skills/prose/SKILL.md +323 -0
  350. package/extensions/open-prose/skills/prose/alt-borges.md +141 -0
  351. package/extensions/open-prose/skills/prose/alts/arabian-nights.md +358 -0
  352. package/extensions/open-prose/skills/prose/alts/borges.md +360 -0
  353. package/extensions/open-prose/skills/prose/alts/folk.md +322 -0
  354. package/extensions/open-prose/skills/prose/alts/homer.md +346 -0
  355. package/extensions/open-prose/skills/prose/alts/kafka.md +373 -0
  356. package/extensions/open-prose/skills/prose/compiler.md +2971 -0
  357. package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +4 -0
  358. package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +6 -0
  359. package/extensions/open-prose/skills/prose/examples/03-code-review.prose +17 -0
  360. package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +14 -0
  361. package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +20 -0
  362. package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +17 -0
  363. package/extensions/open-prose/skills/prose/examples/07-refactor.prose +20 -0
  364. package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +20 -0
  365. package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +25 -0
  366. package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +32 -0
  367. package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +27 -0
  368. package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +43 -0
  369. package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +51 -0
  370. package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +48 -0
  371. package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +23 -0
  372. package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +19 -0
  373. package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +19 -0
  374. package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +36 -0
  375. package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +71 -0
  376. package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +20 -0
  377. package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +35 -0
  378. package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +51 -0
  379. package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +63 -0
  380. package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +86 -0
  381. package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +114 -0
  382. package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +100 -0
  383. package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +105 -0
  384. package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +37 -0
  385. package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +1572 -0
  386. package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +218 -0
  387. package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +42 -0
  388. package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +145 -0
  389. package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +168 -0
  390. package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +204 -0
  391. package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +296 -0
  392. package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +237 -0
  393. package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +1474 -0
  394. package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +455 -0
  395. package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +277 -0
  396. package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +32 -0
  397. package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +38 -0
  398. package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +46 -0
  399. package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +50 -0
  400. package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +261 -0
  401. package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +159 -0
  402. package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +637 -0
  403. package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +148 -0
  404. package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +225 -0
  405. package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +356 -0
  406. package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +445 -0
  407. package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +210 -0
  408. package/extensions/open-prose/skills/prose/examples/README.md +391 -0
  409. package/extensions/open-prose/skills/prose/examples/roadmap/README.md +22 -0
  410. package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +20 -0
  411. package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +18 -0
  412. package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +17 -0
  413. package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +223 -0
  414. package/extensions/open-prose/skills/prose/guidance/antipatterns.md +951 -0
  415. package/extensions/open-prose/skills/prose/guidance/patterns.md +700 -0
  416. package/extensions/open-prose/skills/prose/guidance/system-prompt.md +180 -0
  417. package/extensions/open-prose/skills/prose/help.md +144 -0
  418. package/extensions/open-prose/skills/prose/lib/README.md +108 -0
  419. package/extensions/open-prose/skills/prose/lib/calibrator.prose +215 -0
  420. package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +174 -0
  421. package/extensions/open-prose/skills/prose/lib/error-forensics.prose +250 -0
  422. package/extensions/open-prose/skills/prose/lib/inspector.prose +196 -0
  423. package/extensions/open-prose/skills/prose/lib/profiler.prose +460 -0
  424. package/extensions/open-prose/skills/prose/lib/program-improver.prose +275 -0
  425. package/extensions/open-prose/skills/prose/lib/project-memory.prose +118 -0
  426. package/extensions/open-prose/skills/prose/lib/user-memory.prose +93 -0
  427. package/extensions/open-prose/skills/prose/lib/vm-improver.prose +243 -0
  428. package/extensions/open-prose/skills/prose/primitives/session.md +593 -0
  429. package/extensions/open-prose/skills/prose/prose.md +1237 -0
  430. package/extensions/open-prose/skills/prose/state/filesystem.md +498 -0
  431. package/extensions/open-prose/skills/prose/state/in-context.md +384 -0
  432. package/extensions/open-prose/skills/prose/state/postgres.md +880 -0
  433. package/extensions/open-prose/skills/prose/state/sqlite.md +574 -0
  434. package/extensions/qwen-portal-auth/README.md +24 -0
  435. package/extensions/qwen-portal-auth/agiagent.plugin.json +9 -0
  436. package/extensions/qwen-portal-auth/index.ts +130 -0
  437. package/extensions/qwen-portal-auth/oauth.ts +190 -0
  438. package/extensions/signal/agiagent.plugin.json +9 -0
  439. package/extensions/signal/index.ts +17 -0
  440. package/extensions/signal/node_modules/.bin/agiagent +21 -0
  441. package/extensions/signal/package.json +14 -0
  442. package/extensions/signal/src/channel.ts +315 -0
  443. package/extensions/signal/src/runtime.ts +14 -0
  444. package/extensions/slack/agiagent.plugin.json +9 -0
  445. package/extensions/slack/index.ts +17 -0
  446. package/extensions/slack/node_modules/.bin/agiagent +21 -0
  447. package/extensions/slack/package.json +14 -0
  448. package/extensions/slack/src/channel.ts +604 -0
  449. package/extensions/slack/src/runtime.ts +14 -0
  450. package/extensions/telegram/agiagent.plugin.json +9 -0
  451. package/extensions/telegram/index.ts +17 -0
  452. package/extensions/telegram/node_modules/.bin/agiagent +21 -0
  453. package/extensions/telegram/package.json +14 -0
  454. package/extensions/telegram/src/channel.ts +491 -0
  455. package/extensions/telegram/src/runtime.ts +14 -0
  456. package/extensions/tlon/README.md +5 -0
  457. package/extensions/tlon/agiagent.plugin.json +9 -0
  458. package/extensions/tlon/index.ts +17 -0
  459. package/extensions/tlon/node_modules/.bin/agiagent +21 -0
  460. package/extensions/tlon/package.json +33 -0
  461. package/extensions/tlon/src/channel.ts +392 -0
  462. package/extensions/tlon/src/config-schema.test.ts +31 -0
  463. package/extensions/tlon/src/config-schema.ts +43 -0
  464. package/extensions/tlon/src/monitor/discovery.ts +74 -0
  465. package/extensions/tlon/src/monitor/history.ts +88 -0
  466. package/extensions/tlon/src/monitor/index.ts +551 -0
  467. package/extensions/tlon/src/monitor/processed-messages.test.ts +23 -0
  468. package/extensions/tlon/src/monitor/processed-messages.ts +46 -0
  469. package/extensions/tlon/src/monitor/utils.ts +99 -0
  470. package/extensions/tlon/src/onboarding.ts +214 -0
  471. package/extensions/tlon/src/runtime.ts +14 -0
  472. package/extensions/tlon/src/targets.ts +89 -0
  473. package/extensions/tlon/src/types.ts +92 -0
  474. package/extensions/tlon/src/urbit/auth.ts +18 -0
  475. package/extensions/tlon/src/urbit/http-api.ts +38 -0
  476. package/extensions/tlon/src/urbit/send.test.ts +38 -0
  477. package/extensions/tlon/src/urbit/send.ts +131 -0
  478. package/extensions/tlon/src/urbit/sse-client.test.ts +40 -0
  479. package/extensions/tlon/src/urbit/sse-client.ts +379 -0
  480. package/extensions/twitch/CHANGELOG.md +33 -0
  481. package/extensions/twitch/README.md +89 -0
  482. package/extensions/twitch/agiagent.plugin.json +9 -0
  483. package/extensions/twitch/index.ts +19 -0
  484. package/extensions/twitch/node_modules/.bin/agiagent +21 -0
  485. package/extensions/twitch/package.json +20 -0
  486. package/extensions/twitch/src/access-control.test.ts +489 -0
  487. package/extensions/twitch/src/access-control.ts +162 -0
  488. package/extensions/twitch/src/actions.ts +173 -0
  489. package/extensions/twitch/src/client-manager-registry.ts +115 -0
  490. package/extensions/twitch/src/config-schema.ts +82 -0
  491. package/extensions/twitch/src/config.test.ts +87 -0
  492. package/extensions/twitch/src/config.ts +116 -0
  493. package/extensions/twitch/src/monitor.ts +261 -0
  494. package/extensions/twitch/src/onboarding.test.ts +311 -0
  495. package/extensions/twitch/src/onboarding.ts +417 -0
  496. package/extensions/twitch/src/outbound.test.ts +373 -0
  497. package/extensions/twitch/src/outbound.ts +186 -0
  498. package/extensions/twitch/src/plugin.test.ts +39 -0
  499. package/extensions/twitch/src/plugin.ts +274 -0
  500. package/extensions/twitch/src/probe.test.ts +195 -0
  501. package/extensions/twitch/src/probe.ts +120 -0
  502. package/extensions/twitch/src/resolver.ts +137 -0
  503. package/extensions/twitch/src/runtime.ts +14 -0
  504. package/extensions/twitch/src/send.test.ts +289 -0
  505. package/extensions/twitch/src/send.ts +136 -0
  506. package/extensions/twitch/src/status.test.ts +270 -0
  507. package/extensions/twitch/src/status.ts +178 -0
  508. package/extensions/twitch/src/token.test.ts +171 -0
  509. package/extensions/twitch/src/token.ts +91 -0
  510. package/extensions/twitch/src/twitch-client.test.ts +580 -0
  511. package/extensions/twitch/src/twitch-client.ts +277 -0
  512. package/extensions/twitch/src/types.ts +141 -0
  513. package/extensions/twitch/src/utils/markdown.ts +98 -0
  514. package/extensions/twitch/src/utils/twitch.ts +78 -0
  515. package/extensions/twitch/test/setup.ts +7 -0
  516. package/extensions/voice-call/CHANGELOG.md +97 -0
  517. package/extensions/voice-call/README.md +139 -0
  518. package/extensions/voice-call/agiagent.plugin.json +559 -0
  519. package/extensions/voice-call/index.ts +493 -0
  520. package/extensions/voice-call/node_modules/.bin/agiagent +21 -0
  521. package/extensions/voice-call/package.json +19 -0
  522. package/extensions/voice-call/src/cli.ts +279 -0
  523. package/extensions/voice-call/src/config.test.ts +201 -0
  524. package/extensions/voice-call/src/config.ts +480 -0
  525. package/extensions/voice-call/src/core-bridge.ts +200 -0
  526. package/extensions/voice-call/src/manager/context.ts +21 -0
  527. package/extensions/voice-call/src/manager/events.ts +186 -0
  528. package/extensions/voice-call/src/manager/lookup.ts +35 -0
  529. package/extensions/voice-call/src/manager/outbound.ts +275 -0
  530. package/extensions/voice-call/src/manager/state.ts +48 -0
  531. package/extensions/voice-call/src/manager/store.ts +91 -0
  532. package/extensions/voice-call/src/manager/timers.ts +89 -0
  533. package/extensions/voice-call/src/manager/twiml.ts +9 -0
  534. package/extensions/voice-call/src/manager.test.ts +105 -0
  535. package/extensions/voice-call/src/manager.ts +866 -0
  536. package/extensions/voice-call/src/media-stream.test.ts +96 -0
  537. package/extensions/voice-call/src/media-stream.ts +379 -0
  538. package/extensions/voice-call/src/providers/base.ts +67 -0
  539. package/extensions/voice-call/src/providers/index.ts +10 -0
  540. package/extensions/voice-call/src/providers/mock.ts +165 -0
  541. package/extensions/voice-call/src/providers/plivo.test.ts +27 -0
  542. package/extensions/voice-call/src/providers/plivo.ts +502 -0
  543. package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
  544. package/extensions/voice-call/src/providers/telnyx.ts +358 -0
  545. package/extensions/voice-call/src/providers/tts-openai.ts +259 -0
  546. package/extensions/voice-call/src/providers/twilio/api.ts +42 -0
  547. package/extensions/voice-call/src/providers/twilio/webhook.ts +28 -0
  548. package/extensions/voice-call/src/providers/twilio.test.ts +60 -0
  549. package/extensions/voice-call/src/providers/twilio.ts +583 -0
  550. package/extensions/voice-call/src/response-generator.ts +158 -0
  551. package/extensions/voice-call/src/runtime.ts +204 -0
  552. package/extensions/voice-call/src/telephony-audio.ts +90 -0
  553. package/extensions/voice-call/src/telephony-tts.ts +104 -0
  554. package/extensions/voice-call/src/tunnel.ts +314 -0
  555. package/extensions/voice-call/src/types.ts +272 -0
  556. package/extensions/voice-call/src/utils.ts +14 -0
  557. package/extensions/voice-call/src/voice-mapping.ts +67 -0
  558. package/extensions/voice-call/src/webhook-security.test.ts +251 -0
  559. package/extensions/voice-call/src/webhook-security.ts +465 -0
  560. package/extensions/voice-call/src/webhook.ts +456 -0
  561. package/extensions/whatsapp/agiagent.plugin.json +9 -0
  562. package/extensions/whatsapp/index.ts +17 -0
  563. package/extensions/whatsapp/node_modules/.bin/agiagent +21 -0
  564. package/extensions/whatsapp/package.json +14 -0
  565. package/extensions/whatsapp/src/channel.ts +508 -0
  566. package/extensions/whatsapp/src/runtime.ts +14 -0
  567. package/extensions/zalo/CHANGELOG.md +77 -0
  568. package/extensions/zalo/README.md +50 -0
  569. package/extensions/zalo/agiagent.plugin.json +9 -0
  570. package/extensions/zalo/index.ts +19 -0
  571. package/extensions/zalo/node_modules/.bin/agiagent +21 -0
  572. package/extensions/zalo/package.json +36 -0
  573. package/extensions/zalo/src/accounts.ts +80 -0
  574. package/extensions/zalo/src/actions.ts +67 -0
  575. package/extensions/zalo/src/api.ts +208 -0
  576. package/extensions/zalo/src/channel.directory.test.ts +43 -0
  577. package/extensions/zalo/src/channel.ts +414 -0
  578. package/extensions/zalo/src/config-schema.ts +24 -0
  579. package/extensions/zalo/src/monitor.ts +753 -0
  580. package/extensions/zalo/src/monitor.webhook.test.ts +73 -0
  581. package/extensions/zalo/src/onboarding.ts +401 -0
  582. package/extensions/zalo/src/probe.ts +46 -0
  583. package/extensions/zalo/src/proxy.ts +21 -0
  584. package/extensions/zalo/src/runtime.ts +14 -0
  585. package/extensions/zalo/src/send.ts +124 -0
  586. package/extensions/zalo/src/status-issues.ts +53 -0
  587. package/extensions/zalo/src/token.ts +63 -0
  588. package/extensions/zalo/src/types.ts +42 -0
  589. package/extensions/zalouser/CHANGELOG.md +49 -0
  590. package/extensions/zalouser/README.md +225 -0
  591. package/extensions/zalouser/agiagent.plugin.json +9 -0
  592. package/extensions/zalouser/index.ts +31 -0
  593. package/extensions/zalouser/node_modules/.bin/agiagent +21 -0
  594. package/extensions/zalouser/package.json +36 -0
  595. package/extensions/zalouser/src/accounts.ts +135 -0
  596. package/extensions/zalouser/src/channel.test.ts +18 -0
  597. package/extensions/zalouser/src/channel.ts +686 -0
  598. package/extensions/zalouser/src/config-schema.ts +27 -0
  599. package/extensions/zalouser/src/monitor.ts +590 -0
  600. package/extensions/zalouser/src/onboarding.ts +504 -0
  601. package/extensions/zalouser/src/probe.ts +28 -0
  602. package/extensions/zalouser/src/runtime.ts +14 -0
  603. package/extensions/zalouser/src/send.ts +160 -0
  604. package/extensions/zalouser/src/status-issues.test.ts +57 -0
  605. package/extensions/zalouser/src/status-issues.ts +89 -0
  606. package/extensions/zalouser/src/tool.ts +164 -0
  607. package/extensions/zalouser/src/types.ts +108 -0
  608. package/extensions/zalouser/src/zca.ts +202 -0
  609. package/package.json +2 -1
@@ -36,6 +36,7 @@ export function createAGIAgentTools(options) {
36
36
  createBrowserTool({
37
37
  sandboxBridgeUrl: options?.sandboxBrowserBridgeUrl,
38
38
  allowHostControl: options?.allowHostBrowserControl,
39
+ config: options?.config,
39
40
  }),
40
41
  createCanvasTool(),
41
42
  createNodesTool({
@@ -72,6 +72,20 @@ function buildReplyTagsSection(isMinimal) {
72
72
  "",
73
73
  ];
74
74
  }
75
+ function buildOutputFormattingSection(params) {
76
+ if (params.isMinimal) {
77
+ return [];
78
+ }
79
+ return [
80
+ "## Output Formatting (mandatory)",
81
+ "User-visible replies must be plain, easy-to-render text:",
82
+ "- ASCII only (no emojis, no Unicode bullets, no special symbols).",
83
+ "- Avoid Markdown formatting (no bold/italics/headers/tables).",
84
+ "- Prefer short paragraphs and simple lists using `1.` / `2.` or `-` (ASCII hyphen).",
85
+ '- Use normal quotes and dashes only: `"` and `-` (avoid smart quotes and en/em dashes).',
86
+ "",
87
+ ];
88
+ }
75
89
  function buildMessagingSection(params) {
76
90
  if (params.isMinimal) {
77
91
  return [];
@@ -129,6 +143,85 @@ function buildDocsSection(params) {
129
143
  "",
130
144
  ];
131
145
  }
146
+ function buildResumeTailoringSection(params) {
147
+ if (params.isMinimal) {
148
+ return [];
149
+ }
150
+ return [
151
+ "## Resume Tailoring (mandatory)",
152
+ "When the user asks to tailor/customize/update a resume (.docx) for a job description/link:",
153
+ `- ALWAYS use the \`resume-docx\` skill if available. First, read its SKILL.md with \`${params.readToolName}\`, then follow it exactly (extract -> patch -> apply).`,
154
+ "- NEVER use the generic `docx` skill for resume tailoring. If you did, that is a mistake; redo using `resume-docx`.",
155
+ "- Goal: maximize ATS match while preserving the resume's structure and the candidate's overall identity (do not rewrite the entire resume into a different persona).",
156
+ "",
157
+ "Hard rules:",
158
+ "- Do NOT rewrite ABOUT ME, the title/header, or any existing bullets unless the user explicitly asks for a rewrite.",
159
+ "- Do NOT create new tables/sections. Do NOT add a second Category|Skills header row.",
160
+ "- Do NOT shorten existing bullets. New bullets must be similar in length/style to nearby bullets (avoid short one-liners).",
161
+ "- New bullets MUST be real list items (numbered/bulleted). If additions appear as plain paragraphs, redo using `resume-docx` so list numbering is cloned correctly.",
162
+ "- Tailoring is additive: keep all existing content, and append a small number of JD-aligned additions.",
163
+ "",
164
+ "Allowed changes (additive only):",
165
+ "- Skills table: add missing skills by merging into existing categories or appending normal rows to the existing skills table.",
166
+ "- PROFESSIONAL SUMMARY: append up to 4 new bullets (keep all existing bullets; do not replace).",
167
+ "- PROFESSIONAL EXPERIENCE: append up to 4 new bullets per relevant experience block (keep all existing bullets; do not replace).",
168
+ '- Do not ask the user to say "rewrite bullets". If they asked to tailor the resume, update skills + summary bullets + experience bullets by default.',
169
+ "- ATS: include key JD skills/keywords even if the original resume did not mention them; add them to the skills table and add corresponding experience bullets.",
170
+ "",
171
+ ];
172
+ }
173
+ function buildJobApplicationsSection(params) {
174
+ if (params.isMinimal) {
175
+ return [];
176
+ }
177
+ const hasBrowser = params.availableTools.has("browser");
178
+ return [
179
+ "## Job Applications (mandatory)",
180
+ "AGIAgent is a job-seeker assistant. Treat user messages as application workflow triggers.",
181
+ "",
182
+ "### Normalize the user's input (required)",
183
+ "User input can be any combination of:",
184
+ "- A job description (JD) pasted as text",
185
+ "- An email thread/paste (the JD is embedded)",
186
+ "- A job link (open it, read the JD)",
187
+ '- A directive like "apply to the latest jobs on <site> with these filters"',
188
+ "",
189
+ "Always produce a short plan with the minimum missing inputs, then execute.",
190
+ "",
191
+ "### Required inputs (ask only if missing)",
192
+ "- Resume path (.docx) OR ask the user to provide it.",
193
+ "- Confirmation policy: If user intent is clearly to submit/apply/send, proceed. If ambiguous, ask a 1-line confirmation.",
194
+ "",
195
+ "### Intent rules for auto-submit",
196
+ "Proceed without extra confirmation when the user says (or clearly implies) any of:",
197
+ '- "apply", "submit", "go ahead", "send it", "do it", "yes proceed", "go ahead and apply"',
198
+ "If the user is not explicit, stop at a draft/ready-to-submit state and ask.",
199
+ "",
200
+ "### Execution defaults",
201
+ "- Always tailor the resume to the JD (use the resume-docx skill; see Resume Tailoring section).",
202
+ "- If the JD includes a recruiter email: draft the email in Gmail and attach the tailored resume.",
203
+ "- If the link is an application form: fill the form, attach the tailored resume, and submit based on intent rules.",
204
+ "",
205
+ "### Missing form fields",
206
+ "If you do not know an answer for an application field:",
207
+ "- Ask the user the smallest possible set of questions to continue (batch them).",
208
+ "- Remember durable answers in a workspace file `CAREER_PROFILE.json` (main session only).",
209
+ "- Never guess sensitive facts (legal name, address, work authorization, compensation). Ask.",
210
+ "",
211
+ ...(hasBrowser
212
+ ? [
213
+ "### Browser requirements",
214
+ "- Use the browser tool to open links, read JDs, draft Gmail, and fill portals.",
215
+ "- For file uploads: arm upload via the browser upload hook, then click the site upload control.",
216
+ "",
217
+ ]
218
+ : [
219
+ "### Browser requirements",
220
+ "- Browser tool is unavailable in this session. You can still tailor the resume, but you must ask the user to handle drafting/submission manually or switch to a session with browser access.",
221
+ "",
222
+ ]),
223
+ ];
224
+ }
132
225
  export function buildAgentSystemPrompt(params) {
133
226
  const coreToolSummaries = {
134
227
  read: "Read file contents",
@@ -264,6 +357,13 @@ export function buildAgentSystemPrompt(params) {
264
357
  isMinimal,
265
358
  readToolName,
266
359
  });
360
+ const resumeTailoringSection = buildResumeTailoringSection({ isMinimal, readToolName });
361
+ const jobApplicationsSection = buildJobApplicationsSection({
362
+ isMinimal,
363
+ availableTools,
364
+ readToolName,
365
+ });
366
+ const outputFormattingSection = buildOutputFormattingSection({ isMinimal });
267
367
  const workspaceNotes = (params.workspaceNotes ?? []).map((note) => note.trim()).filter(Boolean);
268
368
  // For "none" mode, return just the basic identity line
269
369
  if (promptMode === "none") {
@@ -314,6 +414,9 @@ export function buildAgentSystemPrompt(params) {
314
414
  "",
315
415
  ...skillsSection,
316
416
  ...memorySection,
417
+ ...resumeTailoringSection,
418
+ ...jobApplicationsSection,
419
+ ...outputFormattingSection,
317
420
  // File type guidance for document handling
318
421
  !isMinimal ? "## File Type Guidance" : "",
319
422
  !isMinimal
@@ -466,7 +569,7 @@ export function buildAgentSystemPrompt(params) {
466
569
  }
467
570
  // Skip silent replies for subagent/none modes
468
571
  if (!isMinimal) {
469
- lines.push("## Silent Replies", `When you have nothing to say, respond with ONLY: ${SILENT_REPLY_TOKEN}`, "", "⚠️ Rules:", "- It must be your ENTIRE message nothing else", `- Never append it to an actual response (never include "${SILENT_REPLY_TOKEN}" in real replies)`, "- Never wrap it in markdown or code blocks", "", `❌ Wrong: "Here's help... ${SILENT_REPLY_TOKEN}"`, `❌ Wrong: "${SILENT_REPLY_TOKEN}"`, `✅ Right: ${SILENT_REPLY_TOKEN}`, "");
572
+ lines.push("## Silent Replies", `When you have nothing to say, respond with ONLY: ${SILENT_REPLY_TOKEN}`, "", "Rules:", "- It must be your ENTIRE message - nothing else", `- Never append it to an actual response (never include "${SILENT_REPLY_TOKEN}" in real replies)`, "- Never wrap it in markdown or code blocks", "", `Wrong: "Here's help... ${SILENT_REPLY_TOKEN}"`, `Wrong: "${SILENT_REPLY_TOKEN}"`, `Right: ${SILENT_REPLY_TOKEN}`, "");
470
573
  }
471
574
  // Skip heartbeats for subagent/none modes
472
575
  if (!isMinimal) {
@@ -1,5 +1,7 @@
1
+ import { type AGIAgentConfig } from "../../config/config.js";
1
2
  import { type AnyAgentTool } from "./common.js";
2
3
  export declare function createBrowserTool(opts?: {
3
4
  sandboxBridgeUrl?: string;
4
5
  allowHostControl?: boolean;
6
+ config?: AGIAgentConfig;
5
7
  }): AnyAgentTool;
@@ -15,8 +15,9 @@ function isBrowserNode(node) {
15
15
  const commands = Array.isArray(node.commands) ? node.commands : [];
16
16
  return caps.includes("browser") || commands.includes("browser.proxy");
17
17
  }
18
+ const HOSTED_BROWSER_REQUIRED_MESSAGE = "No connected device for browser control. Ask the user to run `agiagent connect --token <token>` on their device and keep it running.";
18
19
  async function resolveBrowserNodeTarget(params) {
19
- const cfg = loadConfig();
20
+ const cfg = params.config ?? loadConfig();
20
21
  const policy = cfg.gateway?.nodes?.browser;
21
22
  const mode = policy?.mode ?? "auto";
22
23
  // In hosted mode, prefer node browser since there's no local browser on the gateway
@@ -57,13 +58,25 @@ async function resolveBrowserNodeTarget(params) {
57
58
  }
58
59
  // In hosted mode, we need a node browser but none available
59
60
  if (isHostedMode) {
60
- throw new Error("No connected browser-capable nodes. Connect a device with browser support to use browser features.");
61
+ throw new Error(HOSTED_BROWSER_REQUIRED_MESSAGE);
61
62
  }
62
63
  return null;
63
64
  }
64
65
  const requested = params.requestedNode?.trim() || policy?.node?.trim();
66
+ if (isHostedMode && !requested) {
67
+ throw new Error(HOSTED_BROWSER_REQUIRED_MESSAGE);
68
+ }
65
69
  if (requested) {
66
- const nodeId = resolveNodeIdFromList(browserNodes, requested, false);
70
+ let nodeId;
71
+ try {
72
+ nodeId = resolveNodeIdFromList(browserNodes, requested, false);
73
+ }
74
+ catch (err) {
75
+ if (isHostedMode) {
76
+ throw new Error(HOSTED_BROWSER_REQUIRED_MESSAGE, { cause: err });
77
+ }
78
+ throw err;
79
+ }
67
80
  const node = browserNodes.find((entry) => entry.nodeId === nodeId);
68
81
  return { nodeId, label: node?.displayName ?? node?.remoteIp ?? nodeId };
69
82
  }
@@ -141,10 +154,13 @@ function applyProxyPaths(result, mapping) {
141
154
  }
142
155
  }
143
156
  function resolveBrowserBaseUrl(params) {
144
- const cfg = loadConfig();
157
+ const cfg = params.config ?? loadConfig();
145
158
  const resolved = resolveBrowserConfig(cfg.browser, cfg);
146
159
  const normalizedSandbox = params.sandboxBridgeUrl?.trim() ?? "";
147
160
  const target = params.target ?? (normalizedSandbox ? "sandbox" : "host");
161
+ if (process.env.AGIAGENT_HOSTED_MODE === "1" && target === "host") {
162
+ throw new Error(HOSTED_BROWSER_REQUIRED_MESSAGE);
163
+ }
148
164
  if (target === "sandbox") {
149
165
  if (!normalizedSandbox) {
150
166
  throw new Error('Sandbox browser is unavailable. Enable agents.defaults.sandbox.browser.enabled or use target="host" if allowed.');
@@ -167,7 +183,8 @@ export function createBrowserTool(opts) {
167
183
  name: "browser",
168
184
  description: [
169
185
  "Control the browser via AGIAgent's browser control server (status/start/stop/profiles/tabs/open/snapshot/screenshot/actions/list_upload_inputs/attach_file).",
170
- 'ALWAYS use profile="agiagent". This is the isolated agiagent-managed browser. Do NOT use any other profile. Never use profile="chrome".',
186
+ 'Default profile: profile="agiagent" (isolated agiagent-managed browser).',
187
+ 'Chrome extension relay profile: profile="chrome" (attach to an existing Chrome tab via the AGIAgent Chrome extension). Use only when explicitly needed.',
171
188
  'When a node-hosted browser proxy is available, the tool may auto-route to it. Pin a node with node=<id|name> or target="node".',
172
189
  "When using refs from snapshot (e.g. e12), keep the same tab: prefer passing targetId from the snapshot response into subsequent actions (act/click/type/etc).",
173
190
  'For stable, self-resolving refs across calls, use snapshot with refs="aria" (Playwright aria-ref ids). Default refs="role" are role+name-based.',
@@ -193,6 +210,7 @@ export function createBrowserTool(opts) {
193
210
  requestedNode: requestedNode ?? undefined,
194
211
  target,
195
212
  sandboxBridgeUrl: opts?.sandboxBridgeUrl,
213
+ config: opts?.config,
196
214
  });
197
215
  const resolvedTarget = target === "node" ? undefined : target;
198
216
  const baseUrl = nodeTarget
@@ -201,6 +219,7 @@ export function createBrowserTool(opts) {
201
219
  target: resolvedTarget,
202
220
  sandboxBridgeUrl: opts?.sandboxBridgeUrl,
203
221
  allowHostControl: opts?.allowHostControl,
222
+ config: opts?.config,
204
223
  });
205
224
  const proxyRequest = nodeTarget
206
225
  ? async (opts) => {
@@ -9,7 +9,8 @@ export declare const DEFAULT_HEARTBEAT_FILENAME = "HEARTBEAT.md";
9
9
  export declare const DEFAULT_BOOTSTRAP_FILENAME = "BOOTSTRAP.md";
10
10
  export declare const DEFAULT_MEMORY_FILENAME = "MEMORY.md";
11
11
  export declare const DEFAULT_MEMORY_ALT_FILENAME = "memory.md";
12
- export type WorkspaceBootstrapFileName = typeof DEFAULT_AGENTS_FILENAME | typeof DEFAULT_SOUL_FILENAME | typeof DEFAULT_TOOLS_FILENAME | typeof DEFAULT_IDENTITY_FILENAME | typeof DEFAULT_USER_FILENAME | typeof DEFAULT_HEARTBEAT_FILENAME | typeof DEFAULT_BOOTSTRAP_FILENAME | typeof DEFAULT_MEMORY_FILENAME | typeof DEFAULT_MEMORY_ALT_FILENAME;
12
+ export declare const DEFAULT_CAREER_PROFILE_FILENAME = "CAREER_PROFILE.json";
13
+ export type WorkspaceBootstrapFileName = typeof DEFAULT_AGENTS_FILENAME | typeof DEFAULT_SOUL_FILENAME | typeof DEFAULT_TOOLS_FILENAME | typeof DEFAULT_IDENTITY_FILENAME | typeof DEFAULT_USER_FILENAME | typeof DEFAULT_HEARTBEAT_FILENAME | typeof DEFAULT_BOOTSTRAP_FILENAME | typeof DEFAULT_MEMORY_FILENAME | typeof DEFAULT_MEMORY_ALT_FILENAME | typeof DEFAULT_CAREER_PROFILE_FILENAME;
13
14
  export type WorkspaceBootstrapFile = {
14
15
  name: WorkspaceBootstrapFileName;
15
16
  path: string;
@@ -28,6 +29,7 @@ export declare function ensureAgentWorkspace(params?: {
28
29
  userPath?: string;
29
30
  heartbeatPath?: string;
30
31
  bootstrapPath?: string;
32
+ careerProfilePath?: string;
31
33
  }>;
32
34
  export declare function loadWorkspaceBootstrapFiles(dir: string): Promise<WorkspaceBootstrapFile[]>;
33
35
  export declare function filterBootstrapFilesForSession(files: WorkspaceBootstrapFile[], sessionKey?: string): WorkspaceBootstrapFile[];
@@ -22,6 +22,7 @@ export const DEFAULT_HEARTBEAT_FILENAME = "HEARTBEAT.md";
22
22
  export const DEFAULT_BOOTSTRAP_FILENAME = "BOOTSTRAP.md";
23
23
  export const DEFAULT_MEMORY_FILENAME = "MEMORY.md";
24
24
  export const DEFAULT_MEMORY_ALT_FILENAME = "memory.md";
25
+ export const DEFAULT_CAREER_PROFILE_FILENAME = "CAREER_PROFILE.json";
25
26
  function stripFrontMatter(content) {
26
27
  if (!content.startsWith("---")) {
27
28
  return content;
@@ -109,6 +110,7 @@ export async function ensureAgentWorkspace(params) {
109
110
  const userPath = path.join(dir, DEFAULT_USER_FILENAME);
110
111
  const heartbeatPath = path.join(dir, DEFAULT_HEARTBEAT_FILENAME);
111
112
  const bootstrapPath = path.join(dir, DEFAULT_BOOTSTRAP_FILENAME);
113
+ const careerProfilePath = path.join(dir, DEFAULT_CAREER_PROFILE_FILENAME);
112
114
  const isBrandNewWorkspace = await (async () => {
113
115
  const paths = [agentsPath, soulPath, toolsPath, identityPath, userPath, heartbeatPath];
114
116
  const existing = await Promise.all(paths.map(async (p) => {
@@ -129,12 +131,14 @@ export async function ensureAgentWorkspace(params) {
129
131
  const userTemplate = await loadTemplate(DEFAULT_USER_FILENAME);
130
132
  const heartbeatTemplate = await loadTemplate(DEFAULT_HEARTBEAT_FILENAME);
131
133
  const bootstrapTemplate = await loadTemplate(DEFAULT_BOOTSTRAP_FILENAME);
134
+ const careerProfileTemplate = await loadTemplate(DEFAULT_CAREER_PROFILE_FILENAME);
132
135
  await writeFileIfMissing(agentsPath, agentsTemplate);
133
136
  await writeFileIfMissing(soulPath, soulTemplate);
134
137
  await writeFileIfMissing(toolsPath, toolsTemplate);
135
138
  await writeFileIfMissing(identityPath, identityTemplate);
136
139
  await writeFileIfMissing(userPath, userTemplate);
137
140
  await writeFileIfMissing(heartbeatPath, heartbeatTemplate);
141
+ await writeFileIfMissing(careerProfilePath, careerProfileTemplate);
138
142
  if (isBrandNewWorkspace) {
139
143
  await writeFileIfMissing(bootstrapPath, bootstrapTemplate);
140
144
  }
@@ -148,6 +152,7 @@ export async function ensureAgentWorkspace(params) {
148
152
  userPath,
149
153
  heartbeatPath,
150
154
  bootstrapPath,
155
+ careerProfilePath,
151
156
  };
152
157
  }
153
158
  async function resolveMemoryBootstrapEntries(resolvedDir) {
@@ -59,7 +59,11 @@ export function buildMentionRegexes(cfg, agentId) {
59
59
  .filter((value) => Boolean(value));
60
60
  }
61
61
  export function normalizeMentionText(text) {
62
- return (text ?? "").replace(/[\u200b-\u200f\u202a-\u202e\u2060-\u206f]/g, "").toLowerCase();
62
+ const cleaned = (text ?? "")
63
+ .replace(/[\u200b-\u200f\u202a-\u202e\u2060-\u206f]/g, "")
64
+ .toLowerCase();
65
+ // Back-compat: legacy name used in older configs/patterns.
66
+ return cleaned.replace(/\bopenclaw\b/g, "agiagent");
63
67
  }
64
68
  export function matchesMentionPatterns(text, mentionRegexes) {
65
69
  if (mentionRegexes.length === 0) {
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.1.36",
3
- "commit": "bd48d68889d7bf0fefe9806820dc64ac535b764e",
4
- "builtAt": "2026-02-04T06:19:26.671Z"
2
+ "version": "2026.1.38",
3
+ "commit": "a6a4a71ceec7ce19a7361b73cbb7a54a676bba23",
4
+ "builtAt": "2026-02-06T01:04:26.389Z"
5
5
  }
@@ -1 +1 @@
1
- 6501b8ff92b04fbf4088b742a68e2e4f6339f3f5ee75fe23c1e2dc6c8ea9fb70
1
+ cbf54e0ae626d938f4667e93e788fd7ea04b7dac63d934f0c14d3ab4930fdbb4
@@ -9,6 +9,7 @@ import { registerConfigCli } from "../config-cli.js";
9
9
  import { registerMemoryCli, runMemoryStatus } from "../memory-cli.js";
10
10
  import { registerAgentCommands } from "./register.agent.js";
11
11
  import { registerConfigureCommand } from "./register.configure.js";
12
+ import { registerConnectGmailCommand } from "./register.connect-gmail.js";
12
13
  import { registerMaintenanceCommands } from "./register.maintenance.js";
13
14
  import { registerMessageCommands } from "./register.message.js";
14
15
  import { registerOnboardCommand } from "./register.onboard.js";
@@ -87,6 +88,10 @@ const routeMemoryStatus = {
87
88
  },
88
89
  };
89
90
  export const commandRegistry = [
91
+ {
92
+ id: "connect-gmail",
93
+ register: ({ program }) => registerConnectGmailCommand(program),
94
+ },
90
95
  {
91
96
  id: "setup",
92
97
  register: ({ program }) => registerSetupCommand(program),
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerConnectGmailCommand(program: Command): void;
@@ -0,0 +1,89 @@
1
+ import { callGatewayFromCli } from "../gateway-rpc.js";
2
+ import { theme } from "../../terminal/theme.js";
3
+ const DEFAULT_HOSTED_GATEWAY_URL = "wss://agiagent-hosted.fly.dev";
4
+ function formatStatus(status) {
5
+ const key = status.trim().toUpperCase();
6
+ if (key === "ACTIVE") {
7
+ return theme.success(key);
8
+ }
9
+ if (key === "FAILED" || key === "ERROR" || key === "DISABLED") {
10
+ return theme.error(key);
11
+ }
12
+ return theme.muted(key);
13
+ }
14
+ export function registerConnectGmailCommand(program) {
15
+ program
16
+ .command("connect-gmail")
17
+ .description("Connect Gmail via Composio OAuth (hosted mode)")
18
+ .requiredOption("--token <token>", "Hosted connection token")
19
+ .option("--url <url>", "Gateway WebSocket URL (optional)")
20
+ .option("--timeout <ms>", "Gateway call timeout in ms", "10000")
21
+ .option("--json", "Output machine-readable JSON", false)
22
+ .option("--no-wait", "Only print the OAuth URL (do not wait for completion)")
23
+ .action(async (optsRaw) => {
24
+ const opts = {
25
+ ...optsRaw,
26
+ url: optsRaw.url?.trim() ? optsRaw.url : DEFAULT_HOSTED_GATEWAY_URL,
27
+ };
28
+ const link = (await callGatewayFromCli("integrations.composio.gmail.link", {
29
+ url: opts.url,
30
+ token: opts.token,
31
+ timeout: opts.timeout,
32
+ json: opts.json,
33
+ }, {}));
34
+ if (opts.json) {
35
+ // Keep it stable for scripting.
36
+ console.log(JSON.stringify({
37
+ redirectUrl: link.redirectUrl,
38
+ expiresAt: link.expiresAt,
39
+ connectedAccountId: link.connectedAccountId,
40
+ }, null, 2));
41
+ }
42
+ else {
43
+ console.log(`${theme.heading("Gmail OAuth URL")}`);
44
+ console.log(link.redirectUrl);
45
+ console.log(theme.muted(`Expires: ${link.expiresAt}`));
46
+ }
47
+ if (opts.wait === false) {
48
+ return;
49
+ }
50
+ const start = Date.now();
51
+ const maxWaitMs = 5 * 60_000;
52
+ const pollEveryMs = 2000;
53
+ const terminal = new Set(["ACTIVE", "FAILED", "ERROR", "DISABLED"]);
54
+ let lastStatus = null;
55
+ for (;;) {
56
+ const statusRes = (await callGatewayFromCli("integrations.composio.gmail.status", {
57
+ url: opts.url,
58
+ token: opts.token,
59
+ timeout: opts.timeout,
60
+ json: true, // always quiet polling; we render ourselves
61
+ }, {}, { progress: false }));
62
+ const statusKey = (statusRes.status ?? "").trim().toUpperCase();
63
+ if (!opts.json && statusKey && statusKey !== lastStatus) {
64
+ lastStatus = statusKey;
65
+ const reason = statusRes.statusReason?.trim();
66
+ const suffix = reason ? ` (${reason})` : "";
67
+ console.log(`${theme.muted("Status:")} ${formatStatus(statusKey)}${suffix}`);
68
+ }
69
+ if (terminal.has(statusKey)) {
70
+ if (!opts.json) {
71
+ if (statusKey === "ACTIVE") {
72
+ console.log(theme.success("Gmail connected."));
73
+ }
74
+ else {
75
+ console.log(theme.error(`Gmail connection ended with status: ${statusKey}`));
76
+ }
77
+ }
78
+ return;
79
+ }
80
+ if (Date.now() - start > maxWaitMs) {
81
+ if (!opts.json) {
82
+ console.log(theme.error("Timed out waiting for Gmail connection to complete."));
83
+ }
84
+ return;
85
+ }
86
+ await new Promise((r) => setTimeout(r, pollEveryMs));
87
+ }
88
+ });
89
+ }
@@ -21,6 +21,26 @@ export function rewriteUpdateFlagArgv(argv) {
21
21
  next.splice(index, 1, "update");
22
22
  return next;
23
23
  }
24
+ function rewriteConnectGmailFlagArgv(argv) {
25
+ const flagIndex = argv.indexOf("--connect-gmail");
26
+ if (flagIndex === -1) {
27
+ return argv;
28
+ }
29
+ // Transform:
30
+ // agiagent --token XYZ --connect-gmail
31
+ // into:
32
+ // agiagent connect-gmail --token XYZ
33
+ //
34
+ // This keeps the requested UX while fitting Commander (commands before options).
35
+ const next = argv.filter((_, idx) => idx !== flagIndex);
36
+ if (next.length < 2) {
37
+ return next;
38
+ }
39
+ if (next[2] !== "connect-gmail") {
40
+ next.splice(2, 0, "connect-gmail");
41
+ }
42
+ return next;
43
+ }
24
44
  export async function runCli(argv = process.argv) {
25
45
  const normalizedArgv = stripWindowsNodeExec(argv);
26
46
  loadDotEnv({ quiet: true });
@@ -42,7 +62,7 @@ export async function runCli(argv = process.argv) {
42
62
  console.error("[agiagent] Uncaught exception:", formatUncaughtError(error));
43
63
  process.exit(1);
44
64
  });
45
- const parseArgv = rewriteUpdateFlagArgv(normalizedArgv);
65
+ const parseArgv = rewriteUpdateFlagArgv(rewriteConnectGmailFlagArgv(normalizedArgv));
46
66
  // Register the primary subcommand if one exists (for lazy-loading)
47
67
  const primary = getPrimaryCommand(parseArgv);
48
68
  if (primary) {
@@ -2,11 +2,8 @@ import { normalizeProviderId } from "../agents/model-selection.js";
2
2
  import { getChannelPluginCatalogEntry, listChannelPluginCatalogEntries, } from "../channels/plugins/catalog.js";
3
3
  import { CHAT_CHANNEL_ORDER, getChatChannelMeta, normalizeChatChannelId, } from "../channels/registry.js";
4
4
  import { hasAnyWhatsAppAuth } from "../web/accounts.js";
5
- // Core/built-in channels are part of the main codebase and don't need plugin entries.
6
- // Only extension channels (actual plugins) should be auto-enabled via plugins.entries.
7
- const CORE_CHANNEL_IDS = new Set(CHAT_CHANNEL_ORDER);
8
- // Extension channel plugins that can be auto-enabled
9
- const CHANNEL_PLUGIN_IDS = Array.from(new Set([...listChannelPluginCatalogEntries().map((entry) => entry.id)]));
5
+ // Channel plugins that can be auto-enabled (bundled or external).
6
+ const CHANNEL_PLUGIN_IDS = Array.from(new Set(listChannelPluginCatalogEntries().map((entry) => entry.id)));
10
7
  const PROVIDER_PLUGIN_IDS = [
11
8
  { pluginId: "google-antigravity-auth", providerId: "google-antigravity" },
12
9
  { pluginId: "google-gemini-cli-auth", providerId: "google-gemini-cli" },
@@ -239,27 +236,21 @@ function isProviderConfigured(cfg, providerId) {
239
236
  }
240
237
  function resolveConfiguredPlugins(cfg, env) {
241
238
  const changes = [];
242
- const channelIds = new Set(CHANNEL_PLUGIN_IDS);
239
+ const channelIds = new Set([...CHAT_CHANNEL_ORDER, ...CHANNEL_PLUGIN_IDS]);
243
240
  const configuredChannels = cfg.channels;
244
241
  if (configuredChannels && typeof configuredChannels === "object") {
245
242
  for (const key of Object.keys(configuredChannels)) {
246
243
  if (key === "defaults") {
247
244
  continue;
248
245
  }
249
- // Only add extension channels, not core channels
250
- if (!CORE_CHANNEL_IDS.has(key)) {
251
- channelIds.add(key);
252
- }
246
+ const normalizedCore = normalizeChatChannelId(key);
247
+ channelIds.add(normalizedCore ?? key);
253
248
  }
254
249
  }
255
250
  for (const channelId of channelIds) {
256
251
  if (!channelId) {
257
252
  continue;
258
253
  }
259
- // Skip core channels - they're built-in and don't need plugin entries
260
- if (CORE_CHANNEL_IDS.has(channelId)) {
261
- continue;
262
- }
263
254
  if (isChannelConfigured(cfg, channelId, env)) {
264
255
  changes.push({
265
256
  pluginId: channelId,
@@ -17,6 +17,16 @@ export type ConnectionToken = {
17
17
  createdAt: Date;
18
18
  lastConnectedAt: Date | null;
19
19
  };
20
+ export type ComposioConnectedAccountRecord = {
21
+ userId: string;
22
+ toolkitSlug: string;
23
+ authConfigId: string;
24
+ connectedAccountId: string;
25
+ status: string | null;
26
+ statusReason: string | null;
27
+ createdAt: Date;
28
+ updatedAt: Date;
29
+ };
20
30
  export type HostedDbClient = {
21
31
  /** Look up a connection token and return the associated user */
22
32
  lookupToken: (token: string) => Promise<{
@@ -31,6 +41,25 @@ export type HostedDbClient = {
31
41
  setWhatsAppAccountId: (tokenId: string, accountId: string) => Promise<void>;
32
42
  /** Set the Telegram owner id for a token */
33
43
  setTelegramOwnerId: (tokenId: string, ownerId: string) => Promise<void>;
44
+ /** Upsert a Composio connected account record for a user/toolkit */
45
+ upsertComposioConnectedAccount: (params: {
46
+ userId: string;
47
+ toolkitSlug: string;
48
+ authConfigId: string;
49
+ connectedAccountId: string;
50
+ }) => Promise<void>;
51
+ /** Get a Composio connected account record for a user/toolkit */
52
+ getComposioConnectedAccount: (params: {
53
+ userId: string;
54
+ toolkitSlug: string;
55
+ }) => Promise<ComposioConnectedAccountRecord | null>;
56
+ /** Update status fields for a Composio connected account record */
57
+ updateComposioConnectedAccountStatus: (params: {
58
+ userId: string;
59
+ toolkitSlug: string;
60
+ status: string;
61
+ statusReason: string | null;
62
+ }) => Promise<void>;
34
63
  /** Close the database connection */
35
64
  close: () => Promise<void>;
36
65
  };
@@ -36,6 +36,20 @@ export async function initHostedDb() {
36
36
  // Test the connection
37
37
  await sql `SELECT 1`;
38
38
  log.info("Connected to hosted database");
39
+ // Ensure hosted-mode auxiliary tables exist (best-effort).
40
+ await sql `
41
+ CREATE TABLE IF NOT EXISTS composio_connected_accounts (
42
+ user_id UUID REFERENCES users(id),
43
+ toolkit_slug TEXT NOT NULL,
44
+ auth_config_id TEXT NOT NULL,
45
+ connected_account_id TEXT NOT NULL,
46
+ status TEXT,
47
+ status_reason TEXT,
48
+ created_at TIMESTAMPTZ DEFAULT now(),
49
+ updated_at TIMESTAMPTZ DEFAULT now(),
50
+ PRIMARY KEY (user_id, toolkit_slug)
51
+ )
52
+ `;
39
53
  dbClient = {
40
54
  lookupToken: async (token) => {
41
55
  const rows = await sql `
@@ -127,6 +141,65 @@ export async function initHostedDb() {
127
141
  UPDATE connection_tokens
128
142
  SET telegram_owner_id = ${ownerId}
129
143
  WHERE id = ${tokenId}
144
+ `;
145
+ },
146
+ upsertComposioConnectedAccount: async (params) => {
147
+ await sql `
148
+ INSERT INTO composio_connected_accounts (
149
+ user_id,
150
+ toolkit_slug,
151
+ auth_config_id,
152
+ connected_account_id,
153
+ updated_at
154
+ )
155
+ VALUES (
156
+ ${params.userId},
157
+ ${params.toolkitSlug},
158
+ ${params.authConfigId},
159
+ ${params.connectedAccountId},
160
+ now()
161
+ )
162
+ ON CONFLICT (user_id, toolkit_slug) DO UPDATE SET
163
+ auth_config_id = EXCLUDED.auth_config_id,
164
+ connected_account_id = EXCLUDED.connected_account_id,
165
+ updated_at = now()
166
+ `;
167
+ },
168
+ getComposioConnectedAccount: async (params) => {
169
+ const rows = await sql `
170
+ SELECT
171
+ user_id,
172
+ toolkit_slug,
173
+ auth_config_id,
174
+ connected_account_id,
175
+ status,
176
+ status_reason,
177
+ created_at,
178
+ updated_at
179
+ FROM composio_connected_accounts
180
+ WHERE user_id = ${params.userId} AND toolkit_slug = ${params.toolkitSlug}
181
+ LIMIT 1
182
+ `;
183
+ if (rows.length === 0) {
184
+ return null;
185
+ }
186
+ const row = rows[0];
187
+ return {
188
+ userId: row.user_id,
189
+ toolkitSlug: row.toolkit_slug,
190
+ authConfigId: row.auth_config_id,
191
+ connectedAccountId: row.connected_account_id,
192
+ status: row.status,
193
+ statusReason: row.status_reason,
194
+ createdAt: row.created_at,
195
+ updatedAt: row.updated_at,
196
+ };
197
+ },
198
+ updateComposioConnectedAccountStatus: async (params) => {
199
+ await sql `
200
+ UPDATE composio_connected_accounts
201
+ SET status = ${params.status}, status_reason = ${params.statusReason}, updated_at = now()
202
+ WHERE user_id = ${params.userId} AND toolkit_slug = ${params.toolkitSlug}
130
203
  `;
131
204
  },
132
205
  close: async () => {