@rubytech/create-maxy-code 0.1.416 → 0.1.419

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 (282) hide show
  1. package/dist/__tests__/brand-port-uniqueness.test.js +74 -0
  2. package/dist/__tests__/outlook-client-id-env.test.js +46 -0
  3. package/dist/index.js +31 -0
  4. package/dist/known-brands.js +1 -0
  5. package/dist/port-resolution.js +8 -1
  6. package/package.json +1 -1
  7. package/payload/platform/config/brand-registry.json +8 -0
  8. package/payload/platform/config/brand.json +1 -0
  9. package/payload/platform/lib/account-enumeration/dist/__tests__/is-provisioned.test.d.ts +2 -0
  10. package/payload/platform/lib/account-enumeration/dist/__tests__/is-provisioned.test.d.ts.map +1 -0
  11. package/payload/platform/lib/account-enumeration/dist/__tests__/is-provisioned.test.js +81 -0
  12. package/payload/platform/lib/account-enumeration/dist/__tests__/is-provisioned.test.js.map +1 -0
  13. package/payload/platform/lib/account-enumeration/dist/index.d.ts +17 -0
  14. package/payload/platform/lib/account-enumeration/dist/index.d.ts.map +1 -1
  15. package/payload/platform/lib/account-enumeration/dist/index.js +46 -9
  16. package/payload/platform/lib/account-enumeration/dist/index.js.map +1 -1
  17. package/payload/platform/lib/account-enumeration/src/__tests__/is-provisioned.test.ts +86 -0
  18. package/payload/platform/lib/account-enumeration/src/index.ts +45 -9
  19. package/payload/platform/lib/account-scope/dist/index.d.ts +14 -5
  20. package/payload/platform/lib/account-scope/dist/index.d.ts.map +1 -1
  21. package/payload/platform/lib/account-scope/dist/index.js +14 -5
  22. package/payload/platform/lib/account-scope/dist/index.js.map +1 -1
  23. package/payload/platform/lib/account-scope/src/index.ts +22 -5
  24. package/payload/platform/lib/active-rules/dist/index.d.ts +35 -0
  25. package/payload/platform/lib/active-rules/dist/index.d.ts.map +1 -0
  26. package/payload/platform/lib/active-rules/dist/index.js +94 -0
  27. package/payload/platform/lib/active-rules/dist/index.js.map +1 -0
  28. package/payload/platform/lib/active-rules/package.json +7 -0
  29. package/payload/platform/lib/active-rules/src/index.test.ts +89 -0
  30. package/payload/platform/lib/active-rules/src/index.ts +133 -0
  31. package/payload/platform/lib/active-rules/tsconfig.json +9 -0
  32. package/payload/platform/package.json +4 -3
  33. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +55 -10
  34. package/payload/platform/plugins/docs/references/internals.md +10 -0
  35. package/payload/platform/plugins/docs/references/memory-guide.md +2 -0
  36. package/payload/platform/plugins/docs/references/outlook-guide.md +42 -9
  37. package/payload/platform/plugins/email/references/email-reference.md +1 -1
  38. package/payload/platform/plugins/filesystem/PLUGIN.md +1 -1
  39. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js +16 -2
  40. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js.map +1 -1
  41. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts +1 -1
  42. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts.map +1 -1
  43. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js +8 -3
  44. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js.map +1 -1
  45. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js +2 -2
  46. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js.map +1 -1
  47. package/payload/platform/plugins/memory/PLUGIN.md +1 -1
  48. package/payload/platform/plugins/memory/mcp/dist/index-testable.d.ts.map +1 -1
  49. package/payload/platform/plugins/memory/mcp/dist/index-testable.js +14 -5
  50. package/payload/platform/plugins/memory/mcp/dist/index-testable.js.map +1 -1
  51. package/payload/platform/plugins/memory/mcp/dist/index.js +5 -2
  52. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  53. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j-constraint.d.ts +29 -0
  54. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j-constraint.d.ts.map +1 -0
  55. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j-constraint.js +44 -0
  56. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j-constraint.js.map +1 -0
  57. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/owner-person-embed-text.test.d.ts +2 -0
  58. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/owner-person-embed-text.test.d.ts.map +1 -0
  59. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/owner-person-embed-text.test.js +22 -0
  60. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/owner-person-embed-text.test.js.map +1 -0
  61. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-read-active-rules.test.d.ts +2 -0
  62. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-read-active-rules.test.d.ts.map +1 -0
  63. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-read-active-rules.test.js +49 -0
  64. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-read-active-rules.test.js.map +1 -0
  65. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-personfields-bootstrap.test.js +105 -0
  66. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-personfields-bootstrap.test.js.map +1 -1
  67. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-personfields-embed.test.d.ts +2 -0
  68. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-personfields-embed.test.d.ts.map +1 -0
  69. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-personfields-embed.test.js +78 -0
  70. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-personfields-embed.test.js.map +1 -0
  71. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-reconcile.test.d.ts +2 -0
  72. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-reconcile.test.d.ts.map +1 -0
  73. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-reconcile.test.js +99 -0
  74. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-reconcile.test.js.map +1 -0
  75. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-tool-account.test.js +2 -2
  76. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-tool-account.test.js.map +1 -1
  77. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts +0 -5
  78. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  79. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +2 -12
  80. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  81. package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.d.ts +3 -0
  82. package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.d.ts.map +1 -1
  83. package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.js +11 -3
  84. package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.js.map +1 -1
  85. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts +22 -0
  86. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts.map +1 -1
  87. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +212 -24
  88. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
  89. package/payload/platform/plugins/outlook/.claude-plugin/plugin.json +1 -1
  90. package/payload/platform/plugins/outlook/PLUGIN.md +40 -7
  91. package/payload/platform/plugins/outlook/mcp/dist/__tests__/account-register.test.d.ts +2 -0
  92. package/payload/platform/plugins/outlook/mcp/dist/__tests__/account-register.test.d.ts.map +1 -0
  93. package/payload/platform/plugins/outlook/mcp/dist/__tests__/account-register.test.js +137 -0
  94. package/payload/platform/plugins/outlook/mcp/dist/__tests__/account-register.test.js.map +1 -0
  95. package/payload/platform/plugins/outlook/mcp/dist/__tests__/calendar-write.test.d.ts +2 -0
  96. package/payload/platform/plugins/outlook/mcp/dist/__tests__/calendar-write.test.d.ts.map +1 -0
  97. package/payload/platform/plugins/outlook/mcp/dist/__tests__/calendar-write.test.js +210 -0
  98. package/payload/platform/plugins/outlook/mcp/dist/__tests__/calendar-write.test.js.map +1 -0
  99. package/payload/platform/plugins/outlook/mcp/dist/__tests__/device-flow.test.d.ts +2 -0
  100. package/payload/platform/plugins/outlook/mcp/dist/__tests__/device-flow.test.d.ts.map +1 -0
  101. package/payload/platform/plugins/outlook/mcp/dist/__tests__/device-flow.test.js +110 -0
  102. package/payload/platform/plugins/outlook/mcp/dist/__tests__/device-flow.test.js.map +1 -0
  103. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-retry.test.d.ts +2 -0
  104. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-retry.test.d.ts.map +1 -0
  105. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-retry.test.js +108 -0
  106. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-retry.test.js.map +1 -0
  107. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client.test.js +13 -0
  108. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client.test.js.map +1 -1
  109. package/payload/platform/plugins/outlook/mcp/dist/__tests__/message.test.d.ts +2 -0
  110. package/payload/platform/plugins/outlook/mcp/dist/__tests__/message.test.d.ts.map +1 -0
  111. package/payload/platform/plugins/outlook/mcp/dist/__tests__/message.test.js +32 -0
  112. package/payload/platform/plugins/outlook/mcp/dist/__tests__/message.test.js.map +1 -0
  113. package/payload/platform/plugins/outlook/mcp/dist/__tests__/pending-store.test.d.ts +2 -0
  114. package/payload/platform/plugins/outlook/mcp/dist/__tests__/pending-store.test.d.ts.map +1 -0
  115. package/payload/platform/plugins/outlook/mcp/dist/__tests__/pending-store.test.js +67 -0
  116. package/payload/platform/plugins/outlook/mcp/dist/__tests__/pending-store.test.js.map +1 -0
  117. package/payload/platform/plugins/outlook/mcp/dist/__tests__/pkce-flow.test.js +7 -5
  118. package/payload/platform/plugins/outlook/mcp/dist/__tests__/pkce-flow.test.js.map +1 -1
  119. package/payload/platform/plugins/outlook/mcp/dist/__tests__/write-tools.test.d.ts +2 -0
  120. package/payload/platform/plugins/outlook/mcp/dist/__tests__/write-tools.test.d.ts.map +1 -0
  121. package/payload/platform/plugins/outlook/mcp/dist/__tests__/write-tools.test.js +141 -0
  122. package/payload/platform/plugins/outlook/mcp/dist/__tests__/write-tools.test.js.map +1 -0
  123. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.d.ts +69 -0
  124. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.d.ts.map +1 -0
  125. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.js +129 -0
  126. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.js.map +1 -0
  127. package/payload/platform/plugins/outlook/mcp/dist/auth/pending-store.d.ts +39 -0
  128. package/payload/platform/plugins/outlook/mcp/dist/auth/pending-store.d.ts.map +1 -0
  129. package/payload/platform/plugins/outlook/mcp/dist/auth/pending-store.js +101 -0
  130. package/payload/platform/plugins/outlook/mcp/dist/auth/pending-store.js.map +1 -0
  131. package/payload/platform/plugins/outlook/mcp/dist/auth/pkce-flow.d.ts.map +1 -1
  132. package/payload/platform/plugins/outlook/mcp/dist/auth/pkce-flow.js +3 -2
  133. package/payload/platform/plugins/outlook/mcp/dist/auth/pkce-flow.js.map +1 -1
  134. package/payload/platform/plugins/outlook/mcp/dist/index.js +187 -5
  135. package/payload/platform/plugins/outlook/mcp/dist/index.js.map +1 -1
  136. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.d.ts +34 -1
  137. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.d.ts.map +1 -1
  138. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js +96 -7
  139. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js.map +1 -1
  140. package/payload/platform/plugins/outlook/mcp/dist/lib/message.d.ts +31 -0
  141. package/payload/platform/plugins/outlook/mcp/dist/lib/message.d.ts.map +1 -0
  142. package/payload/platform/plugins/outlook/mcp/dist/lib/message.js +30 -0
  143. package/payload/platform/plugins/outlook/mcp/dist/lib/message.js.map +1 -0
  144. package/payload/platform/plugins/outlook/mcp/dist/tools/account-register.d.ts +41 -17
  145. package/payload/platform/plugins/outlook/mcp/dist/tools/account-register.d.ts.map +1 -1
  146. package/payload/platform/plugins/outlook/mcp/dist/tools/account-register.js +87 -28
  147. package/payload/platform/plugins/outlook/mcp/dist/tools/account-register.js.map +1 -1
  148. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-cancel.d.ts +17 -0
  149. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-cancel.d.ts.map +1 -0
  150. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-cancel.js +38 -0
  151. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-cancel.js.map +1 -0
  152. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-create.d.ts +42 -0
  153. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-create.d.ts.map +1 -0
  154. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-create.js +59 -0
  155. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-create.js.map +1 -0
  156. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-freebusy.d.ts +34 -0
  157. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-freebusy.d.ts.map +1 -0
  158. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-freebusy.js +46 -0
  159. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-freebusy.js.map +1 -0
  160. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-respond.d.ts +15 -0
  161. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-respond.d.ts.map +1 -0
  162. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-respond.js +27 -0
  163. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-respond.js.map +1 -0
  164. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-update.d.ts +11 -0
  165. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-update.d.ts.map +1 -0
  166. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-update.js +20 -0
  167. package/payload/platform/plugins/outlook/mcp/dist/tools/calendar-update.js.map +1 -0
  168. package/payload/platform/plugins/outlook/mcp/dist/tools/draft-send.d.ts +17 -0
  169. package/payload/platform/plugins/outlook/mcp/dist/tools/draft-send.d.ts.map +1 -0
  170. package/payload/platform/plugins/outlook/mcp/dist/tools/draft-send.js +26 -0
  171. package/payload/platform/plugins/outlook/mcp/dist/tools/draft-send.js.map +1 -0
  172. package/payload/platform/plugins/outlook/mcp/dist/tools/draft.d.ts +11 -0
  173. package/payload/platform/plugins/outlook/mcp/dist/tools/draft.d.ts.map +1 -0
  174. package/payload/platform/plugins/outlook/mcp/dist/tools/draft.js +26 -0
  175. package/payload/platform/plugins/outlook/mcp/dist/tools/draft.js.map +1 -0
  176. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-send.d.ts +14 -0
  177. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-send.d.ts.map +1 -0
  178. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-send.js +26 -0
  179. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-send.js.map +1 -0
  180. package/payload/platform/plugins/outlook/mcp/scripts/verify-doc-impl.sh +2 -2
  181. package/payload/platform/plugins/outlook/references/auth.md +51 -54
  182. package/payload/platform/plugins/outlook/references/graph-surfaces.md +97 -4
  183. package/payload/platform/plugins/outlook/skills/outlook/SKILL.md +34 -9
  184. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +10 -5
  185. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  186. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +9 -1
  187. package/payload/platform/scripts/__tests__/provision-role-stamp.test.sh +3 -0
  188. package/payload/platform/scripts/lib/provision-account-dir.sh +9 -1
  189. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +1 -1
  190. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -1
  191. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +5 -1
  192. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -1
  193. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  194. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +9 -0
  195. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  196. package/payload/platform/services/claude-session-manager/dist/config.d.ts +18 -0
  197. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  198. package/payload/platform/services/claude-session-manager/dist/config.js +16 -0
  199. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  200. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +1 -0
  201. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  202. package/payload/platform/services/claude-session-manager/dist/http-server.js +36 -4
  203. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  204. package/payload/platform/services/claude-session-manager/dist/index.js +14 -0
  205. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  206. package/payload/platform/services/claude-session-manager/dist/preference-reconciliation-audit.d.ts +46 -0
  207. package/payload/platform/services/claude-session-manager/dist/preference-reconciliation-audit.d.ts.map +1 -0
  208. package/payload/platform/services/claude-session-manager/dist/preference-reconciliation-audit.js +96 -0
  209. package/payload/platform/services/claude-session-manager/dist/preference-reconciliation-audit.js.map +1 -0
  210. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +33 -0
  211. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  212. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +61 -7
  213. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  214. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
  215. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +5 -1
  216. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
  217. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +6 -0
  218. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  219. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +20 -0
  220. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  221. package/payload/platform/services/telegram-channel/dist/instructions.d.ts +9 -0
  222. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -0
  223. package/payload/platform/services/telegram-channel/dist/instructions.js +100 -0
  224. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -0
  225. package/payload/platform/services/telegram-channel/dist/notification.d.ts +93 -0
  226. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -0
  227. package/payload/platform/services/telegram-channel/dist/notification.js +119 -0
  228. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -0
  229. package/payload/platform/services/telegram-channel/dist/server.d.ts +40 -0
  230. package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -0
  231. package/payload/platform/services/telegram-channel/dist/server.js +291 -0
  232. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -0
  233. package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts +28 -0
  234. package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts.map +1 -0
  235. package/payload/platform/services/telegram-channel/dist/turn-follow.js +188 -0
  236. package/payload/platform/services/telegram-channel/dist/turn-follow.js.map +1 -0
  237. package/payload/platform/services/webchat-channel/dist/notification.d.ts +5 -0
  238. package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
  239. package/payload/platform/services/webchat-channel/dist/notification.js +6 -1
  240. package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
  241. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +6 -0
  242. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  243. package/payload/platform/services/whatsapp-channel/dist/notification.js +8 -1
  244. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  245. package/payload/platform/templates/agents/passive/IDENTITY.md +21 -0
  246. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  247. package/payload/server/public/assets/{AdminLoginScreens-CBlE6FB4.js → AdminLoginScreens-B1PkOF66.js} +1 -1
  248. package/payload/server/public/assets/AdminShell-D8wNArGQ.js +2 -0
  249. package/payload/server/public/assets/{Checkbox-B0pbYJDQ.js → Checkbox-Bm9Er726.js} +1 -1
  250. package/payload/server/public/assets/{Transcript-CYaAPBFX.js → Transcript-CBIyQ8T5.js} +1 -1
  251. package/payload/server/public/assets/{admin-CVh9HO-f.js → admin-CWM9G_yA.js} +1 -1
  252. package/payload/server/public/assets/{browser-C4f_D4Ih.js → browser-D8QhNffV.js} +1 -1
  253. package/payload/server/public/assets/{calendar-WUxQ4fVo.js → calendar-qob5K4t_.js} +1 -1
  254. package/payload/server/public/assets/chat-BNrxVUF6.js +1 -0
  255. package/payload/server/public/assets/chevron-left-BQThFVrd.js +1 -0
  256. package/payload/server/public/assets/data-C-EqNbRi.js +1 -0
  257. package/payload/server/public/assets/{graph-BNXE6mKP.js → graph-DZ2HMpIB.js} +1 -1
  258. package/payload/server/public/assets/{graph-labels-Csnovm_c.js → graph-labels-BFG4bjXQ.js} +1 -1
  259. package/payload/server/public/assets/{maximize-2-WRUJsg5n.js → maximize-2-DkZ40lSl.js} +1 -1
  260. package/payload/server/public/assets/{operator-CXtygMh6.js → operator-FrXrSsBj.js} +1 -1
  261. package/payload/server/public/assets/page-CHWMI9Tm.js +32 -0
  262. package/payload/server/public/assets/{page-IQDLdebG.js → page-CXKV01gT.js} +1 -1
  263. package/payload/server/public/assets/{public-DSeYu61E.js → public-2p1pJ4WF.js} +1 -1
  264. package/payload/server/public/assets/{rotate-ccw-BayMWwfc.js → rotate-ccw-D3o_bMBA.js} +1 -1
  265. package/payload/server/public/assets/useSubAccountSwitcher-8dLvF3Ux.js +9 -0
  266. package/payload/server/public/assets/useSubAccountSwitcher-BUvlETHN.css +1 -0
  267. package/payload/server/public/browser.html +4 -4
  268. package/payload/server/public/calendar.html +5 -5
  269. package/payload/server/public/chat.html +9 -9
  270. package/payload/server/public/data.html +8 -8
  271. package/payload/server/public/graph.html +9 -9
  272. package/payload/server/public/index.html +11 -11
  273. package/payload/server/public/operator.html +11 -11
  274. package/payload/server/public/public.html +9 -9
  275. package/payload/server/server.js +245 -40
  276. package/payload/server/public/assets/AdminShell-d1WQ3lLu.js +0 -2
  277. package/payload/server/public/assets/chat-NJ2HXhOf.js +0 -1
  278. package/payload/server/public/assets/chevron-left-Da-iZGi_.js +0 -1
  279. package/payload/server/public/assets/data-ZUdT44Ba.js +0 -1
  280. package/payload/server/public/assets/page-DjpQp_ir.js +0 -32
  281. package/payload/server/public/assets/useSubAccountSwitcher-C9aLg8yI.js +0 -9
  282. package/payload/server/public/assets/useSubAccountSwitcher-CRZfyJXR.css +0 -1
@@ -116,8 +116,84 @@ import {
116
116
  __toESM
117
117
  } from "./chunk-PFF6I7KP.js";
118
118
 
119
- // ../lib/graph-trash/dist/index.js
119
+ // ../lib/active-rules/dist/index.js
120
120
  var require_dist = __commonJS({
121
+ "../lib/active-rules/dist/index.js"(exports) {
122
+ "use strict";
123
+ Object.defineProperty(exports, "__esModule", { value: true });
124
+ exports.ACTIVE_CANDIDATE_LIMIT = exports.ACTIVE_CANDIDATE_FLOOR = exports.INJECTION_RULE_CAP = exports.SAME_SUBJECT_COSINE = void 0;
125
+ exports.cosine = cosine;
126
+ exports.deconflictBySubject = deconflictBySubject;
127
+ exports.formatStandingRulesBlock = formatStandingRulesBlock2;
128
+ exports.queryActiveRuleCandidates = queryActiveRuleCandidates;
129
+ exports.activeRuleSet = activeRuleSet2;
130
+ exports.SAME_SUBJECT_COSINE = 0.85;
131
+ exports.INJECTION_RULE_CAP = 12;
132
+ exports.ACTIVE_CANDIDATE_FLOOR = 0.4;
133
+ exports.ACTIVE_CANDIDATE_LIMIT = 30;
134
+ function cosine(a, b) {
135
+ if (!a.length || !b.length || a.length !== b.length)
136
+ return 0;
137
+ let dot = 0;
138
+ let na = 0;
139
+ let nb = 0;
140
+ for (let i = 0; i < a.length; i++) {
141
+ dot += a[i] * b[i];
142
+ na += a[i] * a[i];
143
+ nb += b[i] * b[i];
144
+ }
145
+ if (na === 0 || nb === 0)
146
+ return 0;
147
+ return dot / (Math.sqrt(na) * Math.sqrt(nb));
148
+ }
149
+ function deconflictBySubject(records, cosineThreshold = exports.SAME_SUBJECT_COSINE) {
150
+ const winners = [];
151
+ for (const r of records) {
152
+ const emb = r.embedding;
153
+ const isDup = Array.isArray(emb) && emb.length > 0 && winners.some((w) => Array.isArray(w.embedding) && w.embedding.length > 0 && cosine(emb, w.embedding) >= cosineThreshold);
154
+ if (!isDup)
155
+ winners.push(r);
156
+ }
157
+ return winners.map(({ embedding: _embedding, ...rest }) => rest);
158
+ }
159
+ function formatStandingRulesBlock2(rules, cap = exports.INJECTION_RULE_CAP) {
160
+ if (rules.length === 0)
161
+ return "";
162
+ const lines = rules.slice(0, cap).map((r) => `- ${r.value}`);
163
+ return `## Standing rules
164
+ ${lines.join("\n")}`;
165
+ }
166
+ async function queryActiveRuleCandidates(session, accountId) {
167
+ const result = await session.run(`
168
+ MATCH (pref:Preference {accountId: $accountId, scope: 'admin'})
169
+ WHERE NOT pref:Trashed AND pref.deletedAt IS NULL
170
+ AND coalesce(pref.notApplicable, false) = false
171
+ AND pref.confidence >= $floor
172
+ RETURN pref.preferenceId AS preferenceId, pref.category AS category,
173
+ pref.key AS key, pref.value AS value, pref.confidence AS confidence,
174
+ pref.observedAt AS observedAt, pref.embedding AS embedding
175
+ ORDER BY pref.confidence DESC, pref.observedAt DESC
176
+ LIMIT ${exports.ACTIVE_CANDIDATE_LIMIT}
177
+ `, { accountId, floor: exports.ACTIVE_CANDIDATE_FLOOR });
178
+ return result.records.map((r) => ({
179
+ preferenceId: r.get("preferenceId"),
180
+ category: r.get("category"),
181
+ key: r.get("key"),
182
+ value: r.get("value"),
183
+ confidence: r.get("confidence"),
184
+ observedAt: r.get("observedAt") ?? "",
185
+ embedding: r.get("embedding") ?? null
186
+ }));
187
+ }
188
+ async function activeRuleSet2(session, accountId, cap = exports.INJECTION_RULE_CAP) {
189
+ const candidates = await queryActiveRuleCandidates(session, accountId);
190
+ return deconflictBySubject(candidates).slice(0, cap);
191
+ }
192
+ }
193
+ });
194
+
195
+ // ../lib/graph-trash/dist/index.js
196
+ var require_dist2 = __commonJS({
121
197
  "../lib/graph-trash/dist/index.js"(exports) {
122
198
  "use strict";
123
199
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -398,7 +474,7 @@ var require_dist = __commonJS({
398
474
  });
399
475
 
400
476
  // ../lib/graph-style/dist/index.js
401
- var require_dist2 = __commonJS({
477
+ var require_dist3 = __commonJS({
402
478
  "../lib/graph-style/dist/index.js"(exports) {
403
479
  "use strict";
404
480
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -781,7 +857,7 @@ var require_conversation_provenance = __commonJS({
781
857
  "use strict";
782
858
  Object.defineProperty(exports, "__esModule", { value: true });
783
859
  exports.injectConversationProvenance = injectConversationProvenance;
784
- var index_js_1 = require_dist3();
860
+ var index_js_1 = require_dist4();
785
861
  async function injectConversationProvenance(params) {
786
862
  const { session, relationships, accountId, writeLabels, conversationNodeId, logNamespace, tool } = params;
787
863
  const original = [...relationships];
@@ -831,7 +907,7 @@ var require_conversation_provenance = __commonJS({
831
907
  });
832
908
 
833
909
  // ../lib/graph-write/dist/index.js
834
- var require_dist3 = __commonJS({
910
+ var require_dist4 = __commonJS({
835
911
  "../lib/graph-write/dist/index.js"(exports) {
836
912
  "use strict";
837
913
  var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
@@ -1308,6 +1384,7 @@ var serveStatic = (options = { root: "" }) => {
1308
1384
  // server/index.ts
1309
1385
  import { readFileSync as readFileSync35, existsSync as existsSync33, watchFile } from "fs";
1310
1386
  import { spawn as spawn3 } from "child_process";
1387
+ import { createHash as createHash6 } from "crypto";
1311
1388
  import { resolve as resolve33, join as join35, basename as basename13 } from "path";
1312
1389
  import { homedir as homedir3 } from "os";
1313
1390
  import { monitorEventLoopDelay } from "perf_hooks";
@@ -1739,7 +1816,13 @@ var WhatsAppConfigSchema = z.object({
1739
1816
  accounts: z.record(z.string(), WhatsAppAccountSchema.optional()).optional().describe("Per-account config keyed by account ID."),
1740
1817
  dmPolicy: DmPolicySchema.optional().default("disabled").describe("Who can message your public agent via WhatsApp DM. 'Open' lets anyone message. 'Allowlist' restricts to approved phone numbers. 'Disabled' blocks all public messages."),
1741
1818
  adminPhones: z.array(z.string()).optional().describe("Phone numbers (E.164) that route to the admin agent. Managed via add-admin-phone / remove-admin-phone. Authoritative only on the account that owns the WhatsApp paired socket; a list on any other account is inert and purged at boot \u2014 use accountManagers for sub-account routing."),
1742
- accountManagers: z.record(z.string(), z.string()).optional().describe("Account-manager bindings: E.164 phone \u2192 sub-account UUID. A designated phone spawns an admin session scoped to that sub-account rather than the house. Managed via add-account-manager / remove-account-manager. A phone here must not also be in adminPhones."),
1819
+ accountManagers: z.record(
1820
+ z.string(),
1821
+ z.union([
1822
+ z.string(),
1823
+ z.object({ managesAccount: z.string(), mode: z.enum(["active", "passive"]).optional() })
1824
+ ])
1825
+ ).optional().describe("Account-manager bindings: E.164 phone \u2192 sub-account. The value is a bare sub-account UUID (mode 'active', the default: a full admin session) or { managesAccount, mode } where mode 'passive' selects a constrained requirement-intake spawn (only work-create, no reply). A bare string and an object without mode both resolve to 'active'. Managed via add-account-manager / remove-account-manager. A phone here must not also be in adminPhones."),
1743
1826
  allowFrom: z.array(z.string()).optional().describe("Phone numbers allowed to message the public agent when DM policy is 'allowlist'. Add '*' for open access. Does not affect admin routing \u2014 use adminPhones for that."),
1744
1827
  sendReadReceipts: z.boolean().optional().default(true).describe("Whether to send read receipts (blue ticks) when messages are received. Disabling may feel less responsive but preserves privacy."),
1745
1828
  mediaMaxMb: z.number().int().positive().optional().default(50).describe("Maximum file size in MB for media the agent will download and process."),
@@ -2630,16 +2713,21 @@ function extractMessage(msg) {
2630
2713
  }
2631
2714
 
2632
2715
  // app/lib/whatsapp/managed-account.ts
2716
+ function normalizeEntry(v) {
2717
+ return typeof v === "string" ? { account: v, mode: "active" } : { account: v.managesAccount, mode: v.mode ?? "active" };
2718
+ }
2633
2719
  function managedAccountFor(accountManagers, phone) {
2634
- for (const [managerPhone, subAccountId] of Object.entries(accountManagers)) {
2635
- if (subAccountId && phonesMatch(managerPhone, phone)) return subAccountId;
2720
+ for (const [managerPhone, entry] of Object.entries(accountManagers)) {
2721
+ const { account, mode } = normalizeEntry(entry);
2722
+ if (account && phonesMatch(managerPhone, phone)) return { account, mode };
2636
2723
  }
2637
2724
  return null;
2638
2725
  }
2639
2726
  function managerPhonesForAccount(accountManagers, subAccountId) {
2640
2727
  const phones = [];
2641
- for (const [managerPhone, boundSub] of Object.entries(accountManagers)) {
2642
- if (boundSub && boundSub === subAccountId) phones.push(managerPhone);
2728
+ for (const [managerPhone, entry] of Object.entries(accountManagers)) {
2729
+ const { account } = normalizeEntry(entry);
2730
+ if (account && account === subAccountId) phones.push(managerPhone);
2643
2731
  }
2644
2732
  return phones;
2645
2733
  }
@@ -2670,12 +2758,12 @@ function checkDmAccess(params) {
2670
2758
  if (isAdminPhone(senderPhone, cfg.adminPhones)) {
2671
2759
  return { allowed: true, reason: "admin-binding", agentType: "admin", effectiveAccountId: accountId };
2672
2760
  }
2673
- const managedSub = managedAccountFor(cfg.accountManagers, senderPhone);
2674
- if (managedSub) {
2675
- if (params.isValidAccount && !params.isValidAccount(managedSub)) {
2761
+ const managed = managedAccountFor(cfg.accountManagers, senderPhone);
2762
+ if (managed) {
2763
+ if (params.isValidAccount && !params.isValidAccount(managed.account)) {
2676
2764
  return { allowed: false, reason: "account-manager-unresolved", agentType: "admin" };
2677
2765
  }
2678
- return { allowed: true, reason: "account-manager", agentType: "admin", effectiveAccountId: managedSub };
2766
+ return { allowed: true, reason: "account-manager", agentType: "admin", effectiveAccountId: managed.account, passive: managed.mode === "passive" };
2679
2767
  }
2680
2768
  switch (cfg.dmPolicy) {
2681
2769
  case "open":
@@ -4867,6 +4955,7 @@ async function handleInboundMessage(conn, msg) {
4867
4955
  const payload = {
4868
4956
  accountId: conn.accountId,
4869
4957
  agentType: accessResult.agentType,
4958
+ passive: accessResult.passive === true,
4870
4959
  personId: accessResult.personId ?? null,
4871
4960
  senderPhone,
4872
4961
  text: extracted.text,
@@ -6192,6 +6281,9 @@ function createScheduleInjectRoutes(deps) {
6192
6281
  return app57;
6193
6282
  }
6194
6283
 
6284
+ // server/index.ts
6285
+ var import_dist8 = __toESM(require_dist(), 1);
6286
+
6195
6287
  // app/lib/telegram/outbound/send-text.ts
6196
6288
  async function sendTelegramText(botToken, chatId, text) {
6197
6289
  try {
@@ -6414,7 +6506,7 @@ function purgeNonSocketAdminPhonesAtBoot() {
6414
6506
  purgeNonSocketAdminPhones(acct.accountDir, socketOwner);
6415
6507
  }
6416
6508
  }
6417
- function setAccountManager(accountDir, phone, subAccountId) {
6509
+ function setAccountManager(accountDir, phone, subAccountId, mode = "active") {
6418
6510
  const normalized = phone.trim();
6419
6511
  if (!E164_PATTERN.test(normalized)) {
6420
6512
  return { ok: false, error: `Invalid phone format "${normalized}". Expected E.164 (e.g. +441234567890).` };
@@ -6448,7 +6540,7 @@ function setAccountManager(accountDir, phone, subAccountId) {
6448
6540
  if (!wa.accountManagers || typeof wa.accountManagers !== "object") {
6449
6541
  wa.accountManagers = {};
6450
6542
  }
6451
- wa.accountManagers[normalized] = sub;
6543
+ wa.accountManagers[normalized] = mode === "passive" ? { managesAccount: sub, mode: "passive" } : sub;
6452
6544
  const parsed = WhatsAppConfigSchema.safeParse(wa);
6453
6545
  if (!parsed.success) {
6454
6546
  const msg = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
@@ -6456,9 +6548,10 @@ function setAccountManager(accountDir, phone, subAccountId) {
6456
6548
  }
6457
6549
  config.whatsapp = parsed.data;
6458
6550
  writeConfig(accountDir, config);
6459
- console.error(`${TAG17} bound account manager phone=${normalized} managesAccount=${sub}`);
6551
+ console.error(`${TAG17} bound account manager phone=${normalized} managesAccount=${sub} mode=${mode}`);
6460
6552
  reloadManagerConfig(accountDir);
6461
- return { ok: true, message: `Bound ${normalized} as account manager for sub-account ${sub}. Their WhatsApp messages will reach that sub-account's admin agent; replies still go out over this account's WhatsApp device.` };
6553
+ const behaviour = mode === "passive" ? `Their WhatsApp messages will each file one task scoped to that sub-account; the agent sends nothing back.` : `Their WhatsApp messages will reach that sub-account's admin agent; replies still go out over this account's WhatsApp device.`;
6554
+ return { ok: true, message: `Bound ${normalized} as ${mode} account manager for sub-account ${sub}. ${behaviour}` };
6462
6555
  } catch (err) {
6463
6556
  const msg = err instanceof Error ? err.message : String(err);
6464
6557
  console.error(`${TAG17} setAccountManager failed: ${msg}`);
@@ -6503,6 +6596,12 @@ function readAccountManagers(accountDir) {
6503
6596
  const out = {};
6504
6597
  for (const [k, v] of Object.entries(wa.accountManagers)) {
6505
6598
  if (typeof v === "string") out[k] = v;
6599
+ else if (v && typeof v === "object" && typeof v.managesAccount === "string") {
6600
+ const obj = v;
6601
+ const rawMode = obj.mode;
6602
+ const mode = rawMode === void 0 ? void 0 : rawMode === "active" ? "active" : rawMode === "passive" ? "passive" : "passive";
6603
+ out[k] = { managesAccount: obj.managesAccount, mode };
6604
+ }
6506
6605
  }
6507
6606
  return out;
6508
6607
  } catch {
@@ -7272,7 +7371,7 @@ app2.post("/reconnect", async (c) => {
7272
7371
  app2.post("/config", async (c) => {
7273
7372
  try {
7274
7373
  const body = await c.req.json().catch(() => ({}));
7275
- const { action, phone, slug, fields, accountId, managesAccount } = body;
7374
+ const { action, phone, slug, fields, accountId, managesAccount, mode } = body;
7276
7375
  if (!action || typeof action !== "string") {
7277
7376
  return c.json({ ok: false, error: 'Missing required field "action".' }, 400);
7278
7377
  }
@@ -7310,8 +7409,9 @@ app2.post("/config", async (c) => {
7310
7409
  if (!managesAccount || typeof managesAccount !== "string") {
7311
7410
  return c.json({ ok: false, error: 'Missing required field "managesAccount" (the sub-account UUID this phone should manage).' }, 400);
7312
7411
  }
7313
- const result = setAccountManager(account.accountDir, phone, managesAccount);
7314
- console.error(`${TAG21} config action=add-account-manager phone=${phone} managesAccount=${managesAccount} ok=${result.ok}`);
7412
+ const managerMode = mode === "passive" ? "passive" : "active";
7413
+ const result = setAccountManager(account.accountDir, phone, managesAccount, managerMode);
7414
+ console.error(`${TAG21} config action=add-account-manager phone=${phone} managesAccount=${managesAccount} mode=${managerMode} ok=${result.ok}`);
7315
7415
  return c.json(result, result.ok ? 200 : 400);
7316
7416
  }
7317
7417
  case "remove-account-manager": {
@@ -11482,10 +11582,16 @@ function operatorRoleFor(config, userId) {
11482
11582
  return config.admins?.find((a) => a.userId === userId)?.role ?? "admin";
11483
11583
  }
11484
11584
  async function buildAccountOptionList(accounts, userId) {
11585
+ const houseFirst = [
11586
+ ...accounts.filter((a) => a.config.role === "house"),
11587
+ ...accounts.filter((a) => a.config.role !== "house")
11588
+ ];
11589
+ const houseAccount = accounts.find((a) => a.config.role === "house");
11590
+ console.log(`[admin-accounts] op=list count=${accounts.length} house=${houseAccount?.accountId ?? "none"}`);
11485
11591
  return Promise.all(
11486
- accounts.map(async (a) => {
11592
+ houseFirst.map(async (a) => {
11487
11593
  const businessName = await fetchAccountName(a.accountId) || void 0;
11488
- return { accountId: a.accountId, businessName, role: operatorRoleFor(a.config, userId) };
11594
+ return { accountId: a.accountId, businessName, role: operatorRoleFor(a.config, userId), isHouse: a.config.role === "house" };
11489
11595
  })
11490
11596
  );
11491
11597
  }
@@ -14994,7 +15100,7 @@ app21.post("/rename", requireAdminSession, async (c) => {
14994
15100
  var files_default = app21;
14995
15101
 
14996
15102
  // ../lib/graph-search/src/index.ts
14997
- var import_dist = __toESM(require_dist());
15103
+ var import_dist = __toESM(require_dist2());
14998
15104
  import { int } from "neo4j-driver";
14999
15105
 
15000
15106
  // ../lib/graph-search/src/rrf-fusion.ts
@@ -15892,8 +15998,8 @@ var graph_search_default = app22;
15892
15998
  import neo4j2 from "neo4j-driver";
15893
15999
 
15894
16000
  // app/lib/graph-labels.ts
15895
- var import_dist2 = __toESM(require_dist2(), 1);
15896
- var import_dist3 = __toESM(require_dist2(), 1);
16001
+ var import_dist2 = __toESM(require_dist3(), 1);
16002
+ var import_dist3 = __toESM(require_dist3(), 1);
15897
16003
  var HIDDEN_BY_DEFAULT_LABELS = Object.freeze(
15898
16004
  /* @__PURE__ */ new Set(["Chunk", "GraphPreference"])
15899
16005
  );
@@ -17944,7 +18050,10 @@ async function managerSpawn(opts) {
17944
18050
  visitorId: opts.visitorId,
17945
18051
  name: opts.name,
17946
18052
  webchatChannel: opts.webchatChannel,
17947
- previousContext: opts.previousContext
18053
+ previousContext: opts.previousContext,
18054
+ initialMessage: opts.initialMessage,
18055
+ passive: opts.passive,
18056
+ targetAccountId: opts.targetAccountId
17948
18057
  })
17949
18058
  }).catch((err) => ({ __throw: err instanceof Error ? err.message : String(err) }));
17950
18059
  if ("__throw" in res) {
@@ -20432,7 +20541,7 @@ app55.get("/free-busy", async (c) => {
20432
20541
  var calendar_public_default = app55;
20433
20542
 
20434
20543
  // app/lib/graph-health.ts
20435
- var import_dist4 = __toESM(require_dist3(), 1);
20544
+ var import_dist4 = __toESM(require_dist4(), 1);
20436
20545
  var HOUR_MS = 60 * 60 * 1e3;
20437
20546
  function renderLabelTop(rows) {
20438
20547
  return rows.map((b) => {
@@ -21044,6 +21153,9 @@ var InboundHub = class {
21044
21153
  }
21045
21154
  };
21046
21155
 
21156
+ // app/lib/whatsapp/gateway/wa-gateway.ts
21157
+ var import_dist5 = __toESM(require_dist(), 1);
21158
+
21047
21159
  // node_modules/hono/dist/utils/stream.js
21048
21160
  var StreamingApi = class {
21049
21161
  writer;
@@ -21374,6 +21486,23 @@ var WaGateway = class {
21374
21486
  }
21375
21487
  /** Handle one inbound admin WhatsApp message. */
21376
21488
  async handleInbound(input) {
21489
+ if (input.passive) {
21490
+ const msgId = `wa-${++this.seq}`;
21491
+ await this.deps.ensureChannelSession({
21492
+ accountId: input.accountId,
21493
+ effectiveAccountId: input.effectiveAccountId,
21494
+ senderId: input.senderId,
21495
+ // agentType stays 'admin'; the constraint rides the passive flag.
21496
+ role: "admin",
21497
+ personId: null,
21498
+ gatewayUrl: this.deps.gatewayUrl,
21499
+ serverPath: this.deps.serverPath,
21500
+ passive: true,
21501
+ text: input.text,
21502
+ msgId
21503
+ });
21504
+ return;
21505
+ }
21377
21506
  const bytes = Buffer.byteLength(input.text, "utf8");
21378
21507
  const hadSubscriber = this.hub.hasSubscriber(input.senderId);
21379
21508
  const willDeliverNow = this.hub.isReady(input.senderId);
@@ -21382,13 +21511,22 @@ var WaGateway = class {
21382
21511
  const source = input.source ?? "user";
21383
21512
  this.replies.set(input.senderId, input.reply);
21384
21513
  this.docContexts.set(input.senderId, { accountId: input.accountId, maxyAccountId: input.effectiveAccountId });
21514
+ let standingRules;
21515
+ if (this.deps.fetchStandingRules) {
21516
+ standingRules = await this.deps.fetchStandingRules(input.effectiveAccountId) || void 0;
21517
+ const injected = standingRules ? (standingRules.match(/^- /gm) ?? []).length : 0;
21518
+ console.error(
21519
+ `[preference-inject] op=inject channel=wa accountId=${input.effectiveAccountId} injected=${injected} capped=${injected >= import_dist5.INJECTION_RULE_CAP}`
21520
+ );
21521
+ }
21385
21522
  this.hub.deliver(
21386
21523
  {
21387
21524
  senderId: input.senderId,
21388
21525
  text: input.text,
21389
21526
  waMessageId: `wa-${++this.seq}`,
21390
21527
  media: input.media,
21391
- source
21528
+ source,
21529
+ standingRules
21392
21530
  },
21393
21531
  Date.now()
21394
21532
  );
@@ -21449,8 +21587,8 @@ function buildWaSpawnRequest(input) {
21449
21587
 
21450
21588
  // app/lib/whatsapp/inbound/route-decision.ts
21451
21589
  function decideWaRoute(msg) {
21452
- if (msg.agentType === "admin") return { action: "route", role: "admin", personId: null };
21453
- if (msg.personId && msg.personId.length > 0) return { action: "route", role: "public", personId: msg.personId };
21590
+ if (msg.agentType === "admin") return { action: "route", role: "admin", personId: null, passive: msg.passive === true };
21591
+ if (msg.personId && msg.personId.length > 0) return { action: "route", role: "public", personId: msg.personId, passive: false };
21454
21592
  return { action: "drop", reason: "public-unresolved" };
21455
21593
  }
21456
21594
 
@@ -21611,6 +21749,9 @@ var InboundHub2 = class {
21611
21749
  }
21612
21750
  };
21613
21751
 
21752
+ // app/lib/webchat/gateway/webchat-gateway.ts
21753
+ var import_dist6 = __toESM(require_dist(), 1);
21754
+
21614
21755
  // app/lib/webchat/gateway/routes.ts
21615
21756
  function createWebchatChannelRoutes(deps) {
21616
21757
  const app57 = new Hono();
@@ -22045,8 +22186,16 @@ var WebchatGateway = class _WebchatGateway {
22045
22186
  const bytes = Buffer.byteLength(input.text, "utf8");
22046
22187
  const hadSubscriber = this.hub.hasSubscriber(input.key);
22047
22188
  const willDeliverNow = this.hub.isReady(input.key);
22189
+ let standingRules;
22190
+ if (input.role === "admin" && this.deps.fetchStandingRules) {
22191
+ standingRules = await this.deps.fetchStandingRules(input.accountId) || void 0;
22192
+ const injected = standingRules ? (standingRules.match(/^- /gm) ?? []).length : 0;
22193
+ console.error(
22194
+ `[preference-inject] op=inject channel=web accountId=${input.accountId} injected=${injected} capped=${injected >= import_dist6.INJECTION_RULE_CAP}`
22195
+ );
22196
+ }
22048
22197
  this.hub.deliver(
22049
- { key: input.key, text: input.text, messageId: `wc-${++this.seq}` },
22198
+ { key: input.key, text: input.text, messageId: `wc-${++this.seq}`, standingRules },
22050
22199
  Date.now()
22051
22200
  );
22052
22201
  if (willDeliverNow) this.lastDeliveredAt.set(input.key, Date.now());
@@ -22564,6 +22713,9 @@ var InboundHub3 = class {
22564
22713
  }
22565
22714
  };
22566
22715
 
22716
+ // app/lib/telegram/gateway/telegram-gateway.ts
22717
+ var import_dist7 = __toESM(require_dist(), 1);
22718
+
22567
22719
  // app/lib/telegram/gateway/routes.ts
22568
22720
  function createTelegramChannelRoutes(deps) {
22569
22721
  const app57 = new Hono();
@@ -22694,8 +22846,16 @@ var TelegramGateway = class {
22694
22846
  const willDeliverNow = this.hub.isReady(input.senderId);
22695
22847
  const source = input.source ?? "user";
22696
22848
  this.replies.set(input.senderId, input.reply);
22849
+ let standingRules;
22850
+ if (input.role === "admin" && this.deps.fetchStandingRules) {
22851
+ standingRules = await this.deps.fetchStandingRules(input.accountId) || void 0;
22852
+ const injected = standingRules ? (standingRules.match(/^- /gm) ?? []).length : 0;
22853
+ console.error(
22854
+ `[preference-inject] op=inject channel=tg accountId=${input.accountId} injected=${injected} capped=${injected >= import_dist7.INJECTION_RULE_CAP}`
22855
+ );
22856
+ }
22697
22857
  this.hub.deliver(
22698
- { key: input.senderId, text: input.text, messageId: `tg-${++this.seq}`, source },
22858
+ { key: input.senderId, text: input.text, messageId: `tg-${++this.seq}`, source, standingRules },
22699
22859
  Date.now()
22700
22860
  );
22701
22861
  console.error(
@@ -23051,7 +23211,8 @@ async function firePublicSessionEndReview(input) {
23051
23211
  // app/lib/whatsapp/inbound/channel-admin-binding-drift.ts
23052
23212
  function findAccountManagerDrift(accountManagers, adminPhones, validAccountIds) {
23053
23213
  const drift = [];
23054
- for (const [phone, managesAccount] of Object.entries(accountManagers)) {
23214
+ for (const [phone, entry] of Object.entries(accountManagers)) {
23215
+ const managesAccount = typeof entry === "string" ? entry : entry.managesAccount;
23055
23216
  if (!validAccountIds.includes(managesAccount)) {
23056
23217
  drift.push({ phone, managesAccount, reason: "not-in-registry" });
23057
23218
  } else if (adminPhones.some((a) => phonesMatch(a, phone))) {
@@ -23460,7 +23621,22 @@ function isPublicHost(host) {
23460
23621
  }
23461
23622
  var app56 = new Hono();
23462
23623
  var nativeFileFollowers = /* @__PURE__ */ new Map();
23624
+ async function fetchAccountStandingRules(accountId) {
23625
+ const session = getSession();
23626
+ try {
23627
+ const rules = await (0, import_dist8.activeRuleSet)(session, accountId);
23628
+ return (0, import_dist8.formatStandingRulesBlock)(rules);
23629
+ } catch (err) {
23630
+ console.error(
23631
+ `[preference-inject] op=fetch-failed accountId=${accountId} error=${err instanceof Error ? err.message : String(err)}`
23632
+ );
23633
+ return "";
23634
+ } finally {
23635
+ await session.close();
23636
+ }
23637
+ }
23463
23638
  var waGateway = new WaGateway({
23639
+ fetchStandingRules: fetchAccountStandingRules,
23464
23640
  gatewayUrl: `http://127.0.0.1:${process.env.MAXY_UI_INTERNAL_PORT ?? ""}`,
23465
23641
  serverPath: process.env.MAXY_WA_CHANNEL_SERVER_PATH ?? resolve33(process.env.MAXY_PLATFORM_ROOT ?? join35(__dirname, ".."), "services/whatsapp-channel/dist/server.js"),
23466
23642
  // Task 751 / 1390 — file delivery on the native channel. `maxyAccountId` (the
@@ -23481,7 +23657,30 @@ var waGateway = new WaGateway({
23481
23657
  });
23482
23658
  return result.ok ? { ok: true, messageId: result.messageId } : { ok: false, error: result.error };
23483
23659
  },
23484
- ensureChannelSession: async ({ accountId, effectiveAccountId, senderId, role, personId, gatewayUrl, serverPath }) => {
23660
+ ensureChannelSession: async ({ accountId, effectiveAccountId, senderId, role, personId, gatewayUrl, serverPath, passive, text, msgId }) => {
23661
+ if (passive) {
23662
+ const phoneHash = createHash6("sha256").update(senderId).digest("hex").slice(0, 12);
23663
+ const prompt = (text ?? "").trim();
23664
+ if (prompt.length === 0) {
23665
+ console.error(`[wa-passive] op=dropped account=${effectiveAccountId} phoneHash=${phoneHash} msgId=${msgId ?? "none"} reason=empty-text`);
23666
+ return;
23667
+ }
23668
+ console.error(`[wa-passive] op=dispatch account=${effectiveAccountId} phoneHash=${phoneHash} msgId=${msgId ?? "none"}`);
23669
+ const result2 = await managerSpawn({
23670
+ senderId,
23671
+ role: "public",
23672
+ channel: "whatsapp",
23673
+ accountId: effectiveAccountId,
23674
+ targetAccountId: effectiveAccountId,
23675
+ agentSlug: "passive",
23676
+ initialMessage: prompt,
23677
+ passive: true
23678
+ });
23679
+ if ("error" in result2) {
23680
+ console.error(`[wa-passive] op=dispatch-failed account=${effectiveAccountId} msgId=${msgId ?? "none"} error=${result2.error}`);
23681
+ }
23682
+ return;
23683
+ }
23485
23684
  if (role === "admin") {
23486
23685
  const managesAccount = effectiveAccountId !== accountId ? effectiveAccountId : "none";
23487
23686
  console.error(`[whatsapp-native] op=account-manager-route senderId=${senderId} managesAccount=${managesAccount} effectiveAccount=${effectiveAccountId} source=gate`);
@@ -23518,6 +23717,7 @@ var waGateway = new WaGateway({
23518
23717
  app56.route("/", waGateway.routes());
23519
23718
  waGateway.startSweeper();
23520
23719
  var webchatGateway = new WebchatGateway({
23720
+ fetchStandingRules: fetchAccountStandingRules,
23521
23721
  gatewayUrl: webchatGatewayUrl(),
23522
23722
  serverPath: webchatServerPath(),
23523
23723
  ensureChannelSession: async ({ accountId, key, role, adminUserId, gatewayUrl, serverPath, sessionId, public: pub }) => {
@@ -23603,6 +23803,7 @@ webchatGateway.startSweeper();
23603
23803
  webchatGateway.startPublicReaper();
23604
23804
  var telegramFileFollowers = /* @__PURE__ */ new Map();
23605
23805
  var telegramGateway = new TelegramGateway({
23806
+ fetchStandingRules: fetchAccountStandingRules,
23606
23807
  gatewayUrl: telegramGatewayUrl(),
23607
23808
  serverPath: telegramServerPath(),
23608
23809
  ensureChannelSession: async ({ accountId, senderId, role, personId, chatId, gatewayUrl, serverPath }) => {
@@ -23657,10 +23858,11 @@ var scheduleInjectRoutes = createScheduleInjectRoutes({
23657
23858
  if (!sent.ok) throw new Error(sent.error ?? "telegram send failed");
23658
23859
  },
23659
23860
  effectiveAccountFor: (accountId, accountDir, destination) => {
23660
- const managedSub = managedAccountFor(readAccountManagers(accountDir), destination);
23661
- if (managedSub === null) return accountId;
23662
- if (!isValidAccountId(managedSub)) return null;
23663
- return managedSub;
23861
+ const managed = managedAccountFor(readAccountManagers(accountDir), destination);
23862
+ if (managed === null) return accountId;
23863
+ if (managed.mode === "passive") return null;
23864
+ if (!isValidAccountId(managed.account)) return null;
23865
+ return managed.account;
23664
23866
  }
23665
23867
  });
23666
23868
  app56.route("/api/channel/schedule-inject", scheduleInjectRoutes);
@@ -24710,7 +24912,7 @@ init({
24710
24912
  console.error(`[whatsapp:route] skipped reason=owner-mirror senderId=${msg.senderPhone}`);
24711
24913
  return;
24712
24914
  }
24713
- const decision = decideWaRoute(msg);
24915
+ const decision = decideWaRoute({ agentType: msg.agentType, personId: msg.personId, passive: msg.passive });
24714
24916
  if (decision.action === "drop") {
24715
24917
  console.error(`[whatsapp:route] op=dropped reason=${decision.reason} senderId=${msg.senderPhone}`);
24716
24918
  return;
@@ -24728,7 +24930,7 @@ init({
24728
24930
  console.error(`[whatsapp:route] op=routed agentType=public personId=${decision.personId} senderId=${msg.senderPhone}`);
24729
24931
  }
24730
24932
  try {
24731
- void msg.composing().catch(() => {
24933
+ if (!decision.passive) void msg.composing().catch(() => {
24732
24934
  });
24733
24935
  await waGateway.handleInbound({
24734
24936
  accountId: msg.accountId,
@@ -24736,6 +24938,9 @@ init({
24736
24938
  senderId: msg.senderPhone,
24737
24939
  role: decision.role,
24738
24940
  personId: decision.personId,
24941
+ // Task 1483 — a passive account-manager inbound routes to a fresh
24942
+ // constrained one-shot spawn instead of the shared rc-daemon path.
24943
+ passive: decision.passive,
24739
24944
  text: msg.text,
24740
24945
  reply: msg.reply,
24741
24946
  media: msg.media