@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
@@ -1,7 +1,7 @@
1
1
  export type EffectiveAccount = {
2
2
  accountId: string;
3
3
  } | {
4
- reject: "cross-account-denied" | "cross-account-invalid-target";
4
+ reject: "cross-account-denied" | "cross-account-invalid-target" | "cross-account-target-not-provisioned";
5
5
  };
6
6
  /**
7
7
  * Resolve the account a call acts on. Fail-closed: only a house-scoped session
@@ -10,15 +10,24 @@ export type EffectiveAccount = {
10
10
  * downgraded to its own account.
11
11
  *
12
12
  * `isValidAccountId` is injected (required, no default): the UI passes its
13
- * fs-backed `isValidAccountId`; the `filesystem` plugin passes a check over
14
- * `enumerateValidAccountIds`. Keeping validity injected is what lets this
15
- * module stay pure.
13
+ * fs-backed `isValidAccountId` (reads disk fresh every call); the `memory` and
14
+ * `filesystem` plugins pass `isProvisionedAccount` (cached-hit, re-scan-on-miss).
15
+ * Keeping validity injected is what lets this module stay pure.
16
+ *
17
+ * `notProvisionedReason` names the reject emitted when the injected check fails.
18
+ * It defaults to `cross-account-invalid-target` (the UI path, byte-identical to
19
+ * the 1440 landing). The MCP plugins pass `cross-account-target-not-provisioned`
20
+ * because their injected check re-scans disk on a miss (Task 1471) — so a false
21
+ * from it means the id is genuinely not on disk, distinct from a stale-cache
22
+ * miss (which no longer rejects). The distinct reason lets an operator tell a
23
+ * wrong/typo id from the (now-eliminated) created-after-boot case in the
24
+ * `[xacct] op=call … reason=` line.
16
25
  */
17
26
  export declare function resolveEffectiveAccountCore(input: {
18
27
  ownAccountId: string;
19
28
  houseScope: string | null;
20
29
  targetAccountId?: string | null;
21
- }, isValidAccountId: (id: string) => boolean): EffectiveAccount;
30
+ }, isValidAccountId: (id: string) => boolean, notProvisionedReason?: "cross-account-invalid-target" | "cross-account-target-not-provisioned"): EffectiveAccount;
22
31
  /**
23
32
  * Boot-reader that consumers import to learn their house scope from the spawn
24
33
  * env. An empty value reads as null — a non-house session carries no scope.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,gBAAgB,GACxB;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,sBAAsB,GAAG,8BAA8B,CAAA;CAAE,CAAC;AAExE;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC3F,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GACxC,gBAAgB,CAMlB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,IAAI,CAEvF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,gBAAgB,GACxB;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GACrB;IACE,MAAM,EACF,sBAAsB,GACtB,8BAA8B,GAC9B,sCAAsC,CAAC;CAC5C,CAAC;AAEN;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC3F,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,EACzC,oBAAoB,GAChB,8BAA8B,GAC9B,sCAAuE,GAC1E,gBAAgB,CAMlB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,IAAI,CAEvF"}
@@ -9,18 +9,27 @@ exports.readHouseAdminScope = readHouseAdminScope;
9
9
  * downgraded to its own account.
10
10
  *
11
11
  * `isValidAccountId` is injected (required, no default): the UI passes its
12
- * fs-backed `isValidAccountId`; the `filesystem` plugin passes a check over
13
- * `enumerateValidAccountIds`. Keeping validity injected is what lets this
14
- * module stay pure.
12
+ * fs-backed `isValidAccountId` (reads disk fresh every call); the `memory` and
13
+ * `filesystem` plugins pass `isProvisionedAccount` (cached-hit, re-scan-on-miss).
14
+ * Keeping validity injected is what lets this module stay pure.
15
+ *
16
+ * `notProvisionedReason` names the reject emitted when the injected check fails.
17
+ * It defaults to `cross-account-invalid-target` (the UI path, byte-identical to
18
+ * the 1440 landing). The MCP plugins pass `cross-account-target-not-provisioned`
19
+ * because their injected check re-scans disk on a miss (Task 1471) — so a false
20
+ * from it means the id is genuinely not on disk, distinct from a stale-cache
21
+ * miss (which no longer rejects). The distinct reason lets an operator tell a
22
+ * wrong/typo id from the (now-eliminated) created-after-boot case in the
23
+ * `[xacct] op=call … reason=` line.
15
24
  */
16
- function resolveEffectiveAccountCore(input, isValidAccountId) {
25
+ function resolveEffectiveAccountCore(input, isValidAccountId, notProvisionedReason = "cross-account-invalid-target") {
17
26
  const { ownAccountId, houseScope, targetAccountId } = input;
18
27
  if (!targetAccountId)
19
28
  return { accountId: ownAccountId };
20
29
  if (!houseScope)
21
30
  return { reject: "cross-account-denied" };
22
31
  if (!isValidAccountId(targetAccountId))
23
- return { reject: "cross-account-invalid-target" };
32
+ return { reject: notProvisionedReason };
24
33
  return { accountId: targetAccountId };
25
34
  }
26
35
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAyBA,kEASC;AAMD,kDAEC;AA5BD;;;;;;;;;;GAUG;AACH,SAAgB,2BAA2B,CACzC,KAA2F,EAC3F,gBAAyC;IAEzC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAC5D,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IACzD,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAC3D,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IAC1F,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAuCA,kEAYC;AAMD,kDAEC;AAxCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,2BAA2B,CACzC,KAA2F,EAC3F,gBAAyC,EACzC,uBAE6C,8BAA8B;IAE3E,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAC5D,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IACzD,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAC3D,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAChF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC"}
@@ -10,7 +10,12 @@
10
10
  // with empty env during plugin-system `tools/list` enumeration.
11
11
  export type EffectiveAccount =
12
12
  | { accountId: string }
13
- | { reject: "cross-account-denied" | "cross-account-invalid-target" };
13
+ | {
14
+ reject:
15
+ | "cross-account-denied"
16
+ | "cross-account-invalid-target"
17
+ | "cross-account-target-not-provisioned";
18
+ };
14
19
 
15
20
  /**
16
21
  * Resolve the account a call acts on. Fail-closed: only a house-scoped session
@@ -19,18 +24,30 @@ export type EffectiveAccount =
19
24
  * downgraded to its own account.
20
25
  *
21
26
  * `isValidAccountId` is injected (required, no default): the UI passes its
22
- * fs-backed `isValidAccountId`; the `filesystem` plugin passes a check over
23
- * `enumerateValidAccountIds`. Keeping validity injected is what lets this
24
- * module stay pure.
27
+ * fs-backed `isValidAccountId` (reads disk fresh every call); the `memory` and
28
+ * `filesystem` plugins pass `isProvisionedAccount` (cached-hit, re-scan-on-miss).
29
+ * Keeping validity injected is what lets this module stay pure.
30
+ *
31
+ * `notProvisionedReason` names the reject emitted when the injected check fails.
32
+ * It defaults to `cross-account-invalid-target` (the UI path, byte-identical to
33
+ * the 1440 landing). The MCP plugins pass `cross-account-target-not-provisioned`
34
+ * because their injected check re-scans disk on a miss (Task 1471) — so a false
35
+ * from it means the id is genuinely not on disk, distinct from a stale-cache
36
+ * miss (which no longer rejects). The distinct reason lets an operator tell a
37
+ * wrong/typo id from the (now-eliminated) created-after-boot case in the
38
+ * `[xacct] op=call … reason=` line.
25
39
  */
26
40
  export function resolveEffectiveAccountCore(
27
41
  input: { ownAccountId: string; houseScope: string | null; targetAccountId?: string | null },
28
42
  isValidAccountId: (id: string) => boolean,
43
+ notProvisionedReason:
44
+ | "cross-account-invalid-target"
45
+ | "cross-account-target-not-provisioned" = "cross-account-invalid-target",
29
46
  ): EffectiveAccount {
30
47
  const { ownAccountId, houseScope, targetAccountId } = input;
31
48
  if (!targetAccountId) return { accountId: ownAccountId };
32
49
  if (!houseScope) return { reject: "cross-account-denied" };
33
- if (!isValidAccountId(targetAccountId)) return { reject: "cross-account-invalid-target" };
50
+ if (!isValidAccountId(targetAccountId)) return { reject: notProvisionedReason };
34
51
  return { accountId: targetAccountId };
35
52
  }
36
53
 
@@ -0,0 +1,35 @@
1
+ export declare const SAME_SUBJECT_COSINE = 0.85;
2
+ export declare const INJECTION_RULE_CAP = 12;
3
+ export declare const ACTIVE_CANDIDATE_FLOOR = 0.4;
4
+ export declare const ACTIVE_CANDIDATE_LIMIT = 30;
5
+ export interface RuleCandidate {
6
+ preferenceId: string;
7
+ category: string;
8
+ key: string;
9
+ value: string;
10
+ confidence: number;
11
+ observedAt: string;
12
+ embedding: number[] | null;
13
+ }
14
+ export interface ActiveRule {
15
+ preferenceId: string;
16
+ category: string;
17
+ key: string;
18
+ value: string;
19
+ confidence: number;
20
+ observedAt: string;
21
+ }
22
+ export declare function cosine(a: number[], b: number[]): number;
23
+ export declare function deconflictBySubject(records: RuleCandidate[], cosineThreshold?: number): ActiveRule[];
24
+ export declare function formatStandingRulesBlock(rules: ActiveRule[], cap?: number): string;
25
+ interface MinimalSession {
26
+ run: (q: string, p: Record<string, unknown>) => Promise<{
27
+ records: Array<{
28
+ get(k: string): unknown;
29
+ }>;
30
+ }>;
31
+ }
32
+ export declare function queryActiveRuleCandidates(session: MinimalSession, accountId: string): Promise<RuleCandidate[]>;
33
+ export declare function activeRuleSet(session: MinimalSession, accountId: string, cap?: number): Promise<ActiveRule[]>;
34
+ export {};
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYvD;AAOD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EAAE,EACxB,eAAe,GAAE,MAA4B,GAC5C,UAAU,EAAE,CAgBd;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,UAAU,EAAE,EACnB,GAAG,GAAE,MAA2B,GAC/B,MAAM,CAIR;AAED,UAAU,cAAc;IACtB,GAAG,EAAE,CACH,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACvB,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAC/D;AAOD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC,CA6B1B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAA2B,GAC/B,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ // The one definition of "this account's active, de-conflicted, bounded
3
+ // rule-set" (Task 1486). Consumed by the memory plugin's profile-read
4
+ // (agent-callable) and by the three inbound gateways (per-turn injection). Kept
5
+ // free of neo4j-driver types so both an MCP process and the UI can import the
6
+ // built dist.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ACTIVE_CANDIDATE_LIMIT = exports.ACTIVE_CANDIDATE_FLOOR = exports.INJECTION_RULE_CAP = exports.SAME_SUBJECT_COSINE = void 0;
9
+ exports.cosine = cosine;
10
+ exports.deconflictBySubject = deconflictBySubject;
11
+ exports.formatStandingRulesBlock = formatStandingRulesBlock;
12
+ exports.queryActiveRuleCandidates = queryActiveRuleCandidates;
13
+ exports.activeRuleSet = activeRuleSet;
14
+ exports.SAME_SUBJECT_COSINE = 0.85;
15
+ exports.INJECTION_RULE_CAP = 12;
16
+ exports.ACTIVE_CANDIDATE_FLOOR = 0.4;
17
+ exports.ACTIVE_CANDIDATE_LIMIT = 30;
18
+ function cosine(a, b) {
19
+ if (!a.length || !b.length || a.length !== b.length)
20
+ return 0;
21
+ let dot = 0;
22
+ let na = 0;
23
+ let nb = 0;
24
+ for (let i = 0; i < a.length; i++) {
25
+ dot += a[i] * b[i];
26
+ na += a[i] * a[i];
27
+ nb += b[i] * b[i];
28
+ }
29
+ if (na === 0 || nb === 0)
30
+ return 0;
31
+ return dot / (Math.sqrt(na) * Math.sqrt(nb));
32
+ }
33
+ // records MUST be confidence-desc on entry. Greedy: the first record of a
34
+ // cluster is the winner; any later record within cosineThreshold of an
35
+ // already-kept winner is a rephrasing and is dropped. A record with no usable
36
+ // embedding is never folded — it is kept as its own subject (we cannot prove it
37
+ // is a duplicate).
38
+ function deconflictBySubject(records, cosineThreshold = exports.SAME_SUBJECT_COSINE) {
39
+ const winners = [];
40
+ for (const r of records) {
41
+ const emb = r.embedding;
42
+ const isDup = Array.isArray(emb) &&
43
+ emb.length > 0 &&
44
+ winners.some((w) => Array.isArray(w.embedding) &&
45
+ w.embedding.length > 0 &&
46
+ cosine(emb, w.embedding) >= cosineThreshold);
47
+ if (!isDup)
48
+ winners.push(r);
49
+ }
50
+ return winners.map(({ embedding: _embedding, ...rest }) => rest);
51
+ }
52
+ function formatStandingRulesBlock(rules, cap = exports.INJECTION_RULE_CAP) {
53
+ if (rules.length === 0)
54
+ return "";
55
+ const lines = rules.slice(0, cap).map((r) => `- ${r.value}`);
56
+ return `## Standing rules\n${lines.join("\n")}`;
57
+ }
58
+ // The candidate query: this account's admin-scope preferences, not trashed, not
59
+ // a "does not apply" declination, above the injection floor, ordered so the
60
+ // highest-confidence / most-recent wins de-confliction. Returns `embedding` for
61
+ // the clustering step. The trashed predicate mirrors graph-trash's
62
+ // `notTrashed()` exactly (label + deletedAt) so this lib stays dependency-free.
63
+ async function queryActiveRuleCandidates(session, accountId) {
64
+ // ACTIVE_CANDIDATE_LIMIT is inlined as a Cypher literal rather than bound as a
65
+ // param: a plain JS number bound to `LIMIT $p` serializes as a FLOAT and Neo4j
66
+ // rejects it ("not a valid value. Must be a non-negative integer"). This lib
67
+ // is dependency-free (no neo4j-driver), so it cannot call `neo4j.int()`; the
68
+ // constant is a hardcoded integer, so inlining it is safe and gate-clean.
69
+ const result = await session.run(`
70
+ MATCH (pref:Preference {accountId: $accountId, scope: 'admin'})
71
+ WHERE NOT pref:Trashed AND pref.deletedAt IS NULL
72
+ AND coalesce(pref.notApplicable, false) = false
73
+ AND pref.confidence >= $floor
74
+ RETURN pref.preferenceId AS preferenceId, pref.category AS category,
75
+ pref.key AS key, pref.value AS value, pref.confidence AS confidence,
76
+ pref.observedAt AS observedAt, pref.embedding AS embedding
77
+ ORDER BY pref.confidence DESC, pref.observedAt DESC
78
+ LIMIT ${exports.ACTIVE_CANDIDATE_LIMIT}
79
+ `, { accountId, floor: exports.ACTIVE_CANDIDATE_FLOOR });
80
+ return result.records.map((r) => ({
81
+ preferenceId: r.get("preferenceId"),
82
+ category: r.get("category"),
83
+ key: r.get("key"),
84
+ value: r.get("value"),
85
+ confidence: r.get("confidence"),
86
+ observedAt: r.get("observedAt") ?? "",
87
+ embedding: r.get("embedding") ?? null,
88
+ }));
89
+ }
90
+ async function activeRuleSet(session, accountId, cap = exports.INJECTION_RULE_CAP) {
91
+ const candidates = await queryActiveRuleCandidates(session, accountId);
92
+ return deconflictBySubject(candidates).slice(0, cap);
93
+ }
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@maxy/active-rules",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "commonjs",
6
+ "main": "dist/index.js"
7
+ }
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ cosine,
4
+ deconflictBySubject,
5
+ formatStandingRulesBlock,
6
+ INJECTION_RULE_CAP,
7
+ type RuleCandidate,
8
+ } from "./index.js";
9
+
10
+ const vec = (n: number, fill: number): number[] => Array(n).fill(fill);
11
+
12
+ function cand(over: Partial<RuleCandidate>): RuleCandidate {
13
+ return {
14
+ preferenceId: "p",
15
+ category: "communication",
16
+ key: "k",
17
+ value: "v",
18
+ confidence: 0.5,
19
+ observedAt: "2026-07-01T00:00:00Z",
20
+ embedding: vec(4, 1),
21
+ ...over,
22
+ };
23
+ }
24
+
25
+ describe("cosine", () => {
26
+ it("is 1 for identical vectors and 0 for an empty one", () => {
27
+ expect(cosine([1, 0, 0], [1, 0, 0])).toBeCloseTo(1, 6);
28
+ expect(cosine([], [1, 2, 3])).toBe(0);
29
+ });
30
+ });
31
+
32
+ describe("deconflictBySubject", () => {
33
+ it("folds a near-duplicate into the higher-confidence winner", () => {
34
+ const a = cand({
35
+ preferenceId: "a",
36
+ key: "header_rule",
37
+ value: "use header A",
38
+ confidence: 0.8,
39
+ embedding: [1, 0, 0, 0],
40
+ });
41
+ const b = cand({
42
+ preferenceId: "b",
43
+ key: "doc_header",
44
+ value: "use header A restated",
45
+ confidence: 0.5,
46
+ embedding: [0.99, 0.01, 0, 0],
47
+ });
48
+ const out = deconflictBySubject([a, b], 0.85);
49
+ expect(out.map((r) => r.preferenceId)).toEqual(["a"]);
50
+ });
51
+
52
+ it("keeps genuinely different subjects", () => {
53
+ const a = cand({ preferenceId: "a", embedding: [1, 0, 0, 0] });
54
+ const b = cand({ preferenceId: "b", embedding: [0, 1, 0, 0] });
55
+ expect(deconflictBySubject([a, b], 0.85).map((r) => r.preferenceId)).toEqual([
56
+ "a",
57
+ "b",
58
+ ]);
59
+ });
60
+
61
+ it("never folds a candidate with no embedding", () => {
62
+ const a = cand({ preferenceId: "a", embedding: [1, 0, 0, 0] });
63
+ const b = cand({ preferenceId: "b", embedding: null });
64
+ expect(deconflictBySubject([a, b], 0.85).map((r) => r.preferenceId)).toEqual([
65
+ "a",
66
+ "b",
67
+ ]);
68
+ });
69
+ });
70
+
71
+ describe("formatStandingRulesBlock", () => {
72
+ it("returns empty string for no rules", () => {
73
+ expect(formatStandingRulesBlock([], INJECTION_RULE_CAP)).toBe("");
74
+ });
75
+
76
+ it("caps the number of rendered rules", () => {
77
+ const rules = Array.from({ length: 20 }, (_, i) => ({
78
+ preferenceId: `p${i}`,
79
+ category: "communication",
80
+ key: `k${i}`,
81
+ value: `rule ${i}`,
82
+ confidence: 1 - i * 0.01,
83
+ observedAt: "2026-07-01T00:00:00Z",
84
+ }));
85
+ const block = formatStandingRulesBlock(rules, 12);
86
+ expect(block).toContain("## Standing rules");
87
+ expect((block.match(/^- /gm) ?? []).length).toBe(12);
88
+ });
89
+ });
@@ -0,0 +1,133 @@
1
+ // The one definition of "this account's active, de-conflicted, bounded
2
+ // rule-set" (Task 1486). Consumed by the memory plugin's profile-read
3
+ // (agent-callable) and by the three inbound gateways (per-turn injection). Kept
4
+ // free of neo4j-driver types so both an MCP process and the UI can import the
5
+ // built dist.
6
+
7
+ export const SAME_SUBJECT_COSINE = 0.85;
8
+ export const INJECTION_RULE_CAP = 12;
9
+ export const ACTIVE_CANDIDATE_FLOOR = 0.4;
10
+ export const ACTIVE_CANDIDATE_LIMIT = 30;
11
+
12
+ export interface RuleCandidate {
13
+ preferenceId: string;
14
+ category: string;
15
+ key: string;
16
+ value: string;
17
+ confidence: number;
18
+ observedAt: string;
19
+ embedding: number[] | null;
20
+ }
21
+
22
+ export interface ActiveRule {
23
+ preferenceId: string;
24
+ category: string;
25
+ key: string;
26
+ value: string;
27
+ confidence: number;
28
+ observedAt: string;
29
+ }
30
+
31
+ export function cosine(a: number[], b: number[]): number {
32
+ if (!a.length || !b.length || a.length !== b.length) return 0;
33
+ let dot = 0;
34
+ let na = 0;
35
+ let nb = 0;
36
+ for (let i = 0; i < a.length; i++) {
37
+ dot += a[i] * b[i];
38
+ na += a[i] * a[i];
39
+ nb += b[i] * b[i];
40
+ }
41
+ if (na === 0 || nb === 0) return 0;
42
+ return dot / (Math.sqrt(na) * Math.sqrt(nb));
43
+ }
44
+
45
+ // records MUST be confidence-desc on entry. Greedy: the first record of a
46
+ // cluster is the winner; any later record within cosineThreshold of an
47
+ // already-kept winner is a rephrasing and is dropped. A record with no usable
48
+ // embedding is never folded — it is kept as its own subject (we cannot prove it
49
+ // is a duplicate).
50
+ export function deconflictBySubject(
51
+ records: RuleCandidate[],
52
+ cosineThreshold: number = SAME_SUBJECT_COSINE,
53
+ ): ActiveRule[] {
54
+ const winners: RuleCandidate[] = [];
55
+ for (const r of records) {
56
+ const emb = r.embedding;
57
+ const isDup =
58
+ Array.isArray(emb) &&
59
+ emb.length > 0 &&
60
+ winners.some(
61
+ (w) =>
62
+ Array.isArray(w.embedding) &&
63
+ w.embedding.length > 0 &&
64
+ cosine(emb, w.embedding) >= cosineThreshold,
65
+ );
66
+ if (!isDup) winners.push(r);
67
+ }
68
+ return winners.map(({ embedding: _embedding, ...rest }) => rest);
69
+ }
70
+
71
+ export function formatStandingRulesBlock(
72
+ rules: ActiveRule[],
73
+ cap: number = INJECTION_RULE_CAP,
74
+ ): string {
75
+ if (rules.length === 0) return "";
76
+ const lines = rules.slice(0, cap).map((r) => `- ${r.value}`);
77
+ return `## Standing rules\n${lines.join("\n")}`;
78
+ }
79
+
80
+ interface MinimalSession {
81
+ run: (
82
+ q: string,
83
+ p: Record<string, unknown>,
84
+ ) => Promise<{ records: Array<{ get(k: string): unknown }> }>;
85
+ }
86
+
87
+ // The candidate query: this account's admin-scope preferences, not trashed, not
88
+ // a "does not apply" declination, above the injection floor, ordered so the
89
+ // highest-confidence / most-recent wins de-confliction. Returns `embedding` for
90
+ // the clustering step. The trashed predicate mirrors graph-trash's
91
+ // `notTrashed()` exactly (label + deletedAt) so this lib stays dependency-free.
92
+ export async function queryActiveRuleCandidates(
93
+ session: MinimalSession,
94
+ accountId: string,
95
+ ): Promise<RuleCandidate[]> {
96
+ // ACTIVE_CANDIDATE_LIMIT is inlined as a Cypher literal rather than bound as a
97
+ // param: a plain JS number bound to `LIMIT $p` serializes as a FLOAT and Neo4j
98
+ // rejects it ("not a valid value. Must be a non-negative integer"). This lib
99
+ // is dependency-free (no neo4j-driver), so it cannot call `neo4j.int()`; the
100
+ // constant is a hardcoded integer, so inlining it is safe and gate-clean.
101
+ const result = await session.run(
102
+ `
103
+ MATCH (pref:Preference {accountId: $accountId, scope: 'admin'})
104
+ WHERE NOT pref:Trashed AND pref.deletedAt IS NULL
105
+ AND coalesce(pref.notApplicable, false) = false
106
+ AND pref.confidence >= $floor
107
+ RETURN pref.preferenceId AS preferenceId, pref.category AS category,
108
+ pref.key AS key, pref.value AS value, pref.confidence AS confidence,
109
+ pref.observedAt AS observedAt, pref.embedding AS embedding
110
+ ORDER BY pref.confidence DESC, pref.observedAt DESC
111
+ LIMIT ${ACTIVE_CANDIDATE_LIMIT}
112
+ `,
113
+ { accountId, floor: ACTIVE_CANDIDATE_FLOOR },
114
+ );
115
+ return result.records.map((r) => ({
116
+ preferenceId: r.get("preferenceId") as string,
117
+ category: r.get("category") as string,
118
+ key: r.get("key") as string,
119
+ value: r.get("value") as string,
120
+ confidence: r.get("confidence") as number,
121
+ observedAt: (r.get("observedAt") as string) ?? "",
122
+ embedding: (r.get("embedding") as number[] | null) ?? null,
123
+ }));
124
+ }
125
+
126
+ export async function activeRuleSet(
127
+ session: MinimalSession,
128
+ accountId: string,
129
+ cap: number = INJECTION_RULE_CAP,
130
+ ): Promise<ActiveRule[]> {
131
+ const candidates = await queryActiveRuleCandidates(session, accountId);
132
+ return deconflictBySubject(candidates).slice(0, cap);
133
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src"
6
+ },
7
+ "include": ["src"],
8
+ "exclude": ["src/**/*.test.ts"]
9
+ }
@@ -6,8 +6,8 @@
6
6
  "services/*"
7
7
  ],
8
8
  "scripts": {
9
- "build": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-stderr-tee/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && tsc -p services/webchat-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
10
- "build:lib": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-stderr-tee/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json",
9
+ "build": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-stderr-tee/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && tsc -p services/webchat-channel/tsconfig.json && tsc -p services/telegram-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
10
+ "build:lib": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-stderr-tee/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json",
11
11
  "gen:canonical-tools": "node scripts/generate-canonical-tool-names.mjs",
12
12
  "build:memory": "tsc -p plugins/memory/mcp/tsconfig.json",
13
13
  "build:contacts": "tsc -p plugins/contacts/mcp/tsconfig.json",
@@ -23,7 +23,8 @@
23
23
  "build:graph-viewer": "tsc -p plugins/graph-viewer/mcp/tsconfig.json",
24
24
  "build:claude-session-manager": "tsc -p services/claude-session-manager/tsconfig.json",
25
25
  "build:whatsapp-channel": "tsc -p services/whatsapp-channel/tsconfig.json",
26
- "build:webchat-channel": "tsc -p services/webchat-channel/tsconfig.json"
26
+ "build:webchat-channel": "tsc -p services/webchat-channel/tsconfig.json",
27
+ "build:telegram-channel": "tsc -p services/telegram-channel/tsconfig.json"
27
28
  },
28
29
  "overrides": {
29
30
  "zod": "3.x"