@rubytech/create-maxy-code 0.1.581 → 0.1.583

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 (453) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/routine-templates/dist/index.d.ts +1 -1
  3. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/routine-templates/dist/index.js +5 -1
  5. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
  6. package/payload/platform/lib/routine-templates/src/index.ts +4 -0
  7. package/payload/platform/lib/telegram-managed-bot/dist/index.d.ts +269 -0
  8. package/payload/platform/lib/telegram-managed-bot/dist/index.d.ts.map +1 -0
  9. package/payload/platform/lib/telegram-managed-bot/dist/index.js +351 -0
  10. package/payload/platform/lib/telegram-managed-bot/dist/index.js.map +1 -0
  11. package/payload/platform/lib/telegram-managed-bot/src/__tests__/managed-bot.test.ts +251 -0
  12. package/payload/platform/lib/telegram-managed-bot/src/index.ts +529 -0
  13. package/payload/platform/lib/telegram-managed-bot/tsconfig.json +9 -0
  14. package/payload/platform/lib/telegram-managed-bot/vitest.config.ts +9 -0
  15. package/payload/platform/lib/telegram-reach/dist/index.d.ts +80 -0
  16. package/payload/platform/lib/telegram-reach/dist/index.d.ts.map +1 -0
  17. package/payload/platform/lib/telegram-reach/dist/index.js +211 -0
  18. package/payload/platform/lib/telegram-reach/dist/index.js.map +1 -0
  19. package/payload/platform/lib/telegram-reach/src/__tests__/telegram-reach.test.ts +216 -0
  20. package/payload/platform/lib/telegram-reach/src/index.ts +262 -0
  21. package/payload/platform/lib/telegram-reach/tsconfig.json +9 -0
  22. package/payload/platform/lib/telegram-reach/vitest.config.ts +9 -0
  23. package/payload/platform/package.json +2 -2
  24. package/payload/platform/plugins/admin/PLUGIN.md +1 -1
  25. package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +9 -0
  26. package/payload/platform/plugins/admin/hooks/__tests__/preference-consult-directive.test.sh +26 -0
  27. package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +20 -3
  28. package/payload/platform/plugins/admin/hooks/preference-consult-directive.sh +50 -5
  29. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +181 -9
  30. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +17 -0
  31. package/payload/platform/plugins/contacts/mcp/dist/__tests__/telegram-user-id.test.d.ts +2 -0
  32. package/payload/platform/plugins/contacts/mcp/dist/__tests__/telegram-user-id.test.d.ts.map +1 -0
  33. package/payload/platform/plugins/contacts/mcp/dist/__tests__/telegram-user-id.test.js +100 -0
  34. package/payload/platform/plugins/contacts/mcp/dist/__tests__/telegram-user-id.test.js.map +1 -0
  35. package/payload/platform/plugins/contacts/mcp/dist/index.js +11 -5
  36. package/payload/platform/plugins/contacts/mcp/dist/index.js.map +1 -1
  37. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.d.ts +5 -0
  38. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.d.ts.map +1 -1
  39. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js +21 -4
  40. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js.map +1 -1
  41. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.d.ts +5 -0
  42. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.d.ts.map +1 -1
  43. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.js +29 -1
  44. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.js.map +1 -1
  45. package/payload/platform/plugins/contacts/mcp/vitest.config.ts +14 -0
  46. package/payload/platform/plugins/docs/references/admin-ui.md +20 -4
  47. package/payload/platform/plugins/docs/references/calendar-booking.md +2 -0
  48. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +15 -0
  49. package/payload/platform/plugins/docs/references/telegram-guide.md +143 -4
  50. package/payload/platform/plugins/filesystem/PLUGIN.md +2 -2
  51. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.d.ts +2 -0
  52. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.d.ts.map +1 -0
  53. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.js +108 -0
  54. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.js.map +1 -0
  55. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.d.ts +17 -0
  56. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.d.ts.map +1 -0
  57. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.js +162 -0
  58. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.js.map +1 -0
  59. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.d.ts +2 -0
  60. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.d.ts.map +1 -0
  61. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.js +116 -0
  62. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.js.map +1 -0
  63. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts.map +1 -1
  64. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js +9 -0
  65. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js.map +1 -1
  66. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts.map +1 -1
  67. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js +10 -0
  68. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js.map +1 -1
  69. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/label-origin-gate.test.js +64 -1
  70. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/label-origin-gate.test.js.map +1 -1
  71. package/payload/platform/plugins/memory/mcp/dist/lib/label-origin-gate.d.ts +5 -0
  72. package/payload/platform/plugins/memory/mcp/dist/lib/label-origin-gate.d.ts.map +1 -1
  73. package/payload/platform/plugins/memory/mcp/dist/lib/label-origin-gate.js +28 -6
  74. package/payload/platform/plugins/memory/mcp/dist/lib/label-origin-gate.js.map +1 -1
  75. package/payload/platform/plugins/memory/references/schema-knowledge-work.md +1 -1
  76. package/payload/platform/plugins/scheduling/PLUGIN.md +19 -3
  77. package/payload/platform/plugins/scheduling/mcp/dist/index.js +7 -2
  78. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  79. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js +53 -6
  80. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js.map +1 -1
  81. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js +38 -0
  82. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js.map +1 -1
  83. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-uid-stamp.test.d.ts +2 -0
  84. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-uid-stamp.test.d.ts.map +1 -0
  85. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-uid-stamp.test.js +102 -0
  86. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-uid-stamp.test.js.map +1 -0
  87. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js +43 -9
  88. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map +1 -1
  89. package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.d.ts +50 -0
  90. package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.d.ts.map +1 -1
  91. package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.js +47 -1
  92. package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.js.map +1 -1
  93. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +5 -3
  94. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -1
  95. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +18 -3
  96. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -1
  97. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +40 -0
  98. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
  99. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +132 -41
  100. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
  101. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +14 -1
  102. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  103. package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js +61 -1
  104. package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js.map +1 -1
  105. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +258 -8
  106. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
  107. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-trash-filter.test.d.ts +2 -0
  108. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-trash-filter.test.d.ts.map +1 -0
  109. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-trash-filter.test.js +67 -0
  110. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-trash-filter.test.js.map +1 -0
  111. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +206 -3
  112. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
  113. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.d.ts.map +1 -1
  114. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.js +8 -1
  115. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.js.map +1 -1
  116. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +29 -21
  117. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  118. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +94 -14
  119. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  120. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts.map +1 -1
  121. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js +6 -1
  122. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js.map +1 -1
  123. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.d.ts.map +1 -1
  124. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.js +7 -2
  125. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.js.map +1 -1
  126. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  127. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +46 -3
  128. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  129. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +30 -0
  130. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
  131. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +69 -6
  132. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
  133. package/payload/platform/plugins/telegram/PLUGIN.md +49 -1
  134. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js +3 -3
  135. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.js +28 -2
  136. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.js.map +1 -1
  137. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-business-connection.test.d.ts +2 -0
  138. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-business-connection.test.d.ts.map +1 -0
  139. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-business-connection.test.js +140 -0
  140. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-business-connection.test.js.map +1 -0
  141. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js +93 -5
  142. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js.map +1 -1
  143. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.d.ts +2 -0
  144. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.d.ts.map +1 -0
  145. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.js +326 -0
  146. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.js.map +1 -0
  147. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.d.ts +2 -0
  148. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.d.ts.map +1 -0
  149. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.js +173 -0
  150. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.js.map +1 -0
  151. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +79 -0
  152. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -1
  153. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.d.ts +2 -0
  154. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.d.ts.map +1 -0
  155. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.js +34 -0
  156. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.js.map +1 -0
  157. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.d.ts +2 -0
  158. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.d.ts.map +1 -0
  159. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.js +93 -0
  160. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.js.map +1 -0
  161. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js +15 -1
  162. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js.map +1 -1
  163. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.js +245 -0
  164. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.js.map +1 -1
  165. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-verdict.test.js +10 -1
  166. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-verdict.test.js.map +1 -1
  167. package/payload/platform/plugins/telegram/mcp/dist/index.js +26 -4
  168. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  169. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.d.ts +19 -0
  170. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.d.ts.map +1 -1
  171. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.js +41 -1
  172. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.js.map +1 -1
  173. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts +15 -20
  174. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts.map +1 -1
  175. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js +27 -32
  176. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js.map +1 -1
  177. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.d.ts +13 -0
  178. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.d.ts.map +1 -1
  179. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.js +22 -1
  180. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.js.map +1 -1
  181. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts.map +1 -1
  182. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js +6 -0
  183. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js.map +1 -1
  184. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.d.ts +1 -1
  185. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.d.ts.map +1 -1
  186. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.js +22 -2
  187. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.js.map +1 -1
  188. package/payload/platform/plugins/telegram/mcp/dist/lib/business-connection-store.d.ts +38 -0
  189. package/payload/platform/plugins/telegram/mcp/dist/lib/business-connection-store.d.ts.map +1 -0
  190. package/payload/platform/plugins/telegram/mcp/dist/lib/business-connection-store.js +56 -0
  191. package/payload/platform/plugins/telegram/mcp/dist/lib/business-connection-store.js.map +1 -0
  192. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.d.ts +55 -0
  193. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.d.ts.map +1 -0
  194. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.js +116 -0
  195. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.js.map +1 -0
  196. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.d.ts +54 -0
  197. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.d.ts.map +1 -0
  198. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.js +90 -0
  199. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.js.map +1 -0
  200. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts +2 -28
  201. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts.map +1 -1
  202. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js +8 -53
  203. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js.map +1 -1
  204. package/payload/platform/plugins/telegram/mcp/dist/tools/api.d.ts.map +1 -1
  205. package/payload/platform/plugins/telegram/mcp/dist/tools/api.js +19 -0
  206. package/payload/platform/plugins/telegram/mcp/dist/tools/api.js.map +1 -1
  207. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts.map +1 -1
  208. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js +79 -10
  209. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js.map +1 -1
  210. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.d.ts +64 -0
  211. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.d.ts.map +1 -0
  212. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.js +217 -0
  213. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.js.map +1 -0
  214. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts +7 -0
  215. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -1
  216. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js +56 -0
  217. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -1
  218. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts.map +1 -1
  219. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js +15 -0
  220. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js.map +1 -1
  221. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts.map +1 -1
  222. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js +12 -0
  223. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js.map +1 -1
  224. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.d.ts +22 -0
  225. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.d.ts.map +1 -0
  226. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.js +67 -0
  227. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.js.map +1 -0
  228. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts +21 -2
  229. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts.map +1 -1
  230. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js +47 -2
  231. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js.map +1 -1
  232. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts.map +1 -1
  233. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js +12 -0
  234. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js.map +1 -1
  235. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.d.ts +4 -1
  236. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.d.ts.map +1 -1
  237. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.js +73 -6
  238. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.js.map +1 -1
  239. package/payload/platform/plugins/telegram/skills/build/SKILL.md +217 -11
  240. package/payload/platform/plugins/telegram/skills/configure/SKILL.md +87 -6
  241. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +12 -0
  242. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts +36 -5
  243. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts.map +1 -1
  244. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js +103 -10
  245. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js.map +1 -1
  246. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  247. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +2 -0
  248. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  249. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  250. package/payload/platform/services/claude-session-manager/dist/http-server.js +42 -4
  251. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  252. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  253. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +19 -5
  254. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  255. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +9 -0
  256. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  257. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +5 -1
  258. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  259. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  260. package/payload/platform/services/telegram-channel/dist/instructions.js +13 -0
  261. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  262. package/payload/platform/services/telegram-channel/dist/notification.d.ts +40 -0
  263. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  264. package/payload/platform/services/telegram-channel/dist/notification.js +41 -4
  265. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  266. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +52 -0
  267. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  268. package/payload/platform/services/whatsapp-channel/dist/notification.js +64 -1
  269. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  270. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  271. package/payload/platform/services/whatsapp-channel/dist/server.js +14 -2
  272. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  273. package/payload/platform/templates/account-schema/SCHEMA.md +17 -10
  274. package/payload/platform/templates/agents/admin/IDENTITY.md +5 -0
  275. package/payload/platform/templates/specialists/agents/data-manager.md +2 -2
  276. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  277. package/payload/server/{chunk-BFRB2U75.js → chunk-CV6AEMKH.js} +1 -0
  278. package/payload/server/{manager-CTVTF4YB.js → manager-FQSQSSJ3.js} +1 -1
  279. package/payload/server/public/activity.html +6 -6
  280. package/payload/server/public/agents.html +5 -5
  281. package/payload/server/public/assets/{AdminLoginScreens-B1lu4-_F.js → AdminLoginScreens-BLsDYWVi.js} +1 -1
  282. package/payload/server/public/assets/AdminLoginScreens-BLsDYWVi.js.br +0 -0
  283. package/payload/server/public/assets/AdminLoginScreens-BLsDYWVi.js.gz +0 -0
  284. package/payload/server/public/assets/{AdminShell-BMslfZxN.js → AdminShell-BZS8jzFA.js} +1 -1
  285. package/payload/server/public/assets/AdminShell-BZS8jzFA.js.br +0 -0
  286. package/payload/server/public/assets/AdminShell-BZS8jzFA.js.gz +0 -0
  287. package/payload/server/public/assets/{activity-kQ3w70LJ.js → activity-DOjvoLdd.js} +1 -1
  288. package/payload/server/public/assets/activity-DOjvoLdd.js.br +0 -0
  289. package/payload/server/public/assets/activity-DOjvoLdd.js.gz +0 -0
  290. package/payload/server/public/assets/{admin-CkASgYA7.js → admin-JrSNg29g.js} +1 -1
  291. package/payload/server/public/assets/admin-JrSNg29g.js.br +0 -0
  292. package/payload/server/public/assets/admin-JrSNg29g.js.gz +0 -0
  293. package/payload/server/public/assets/{agents-Cn_bZgnD.js → agents--9WMJVLC.js} +1 -1
  294. package/payload/server/public/assets/agents--9WMJVLC.js.br +0 -0
  295. package/payload/server/public/assets/agents--9WMJVLC.js.gz +0 -0
  296. package/payload/server/public/assets/{browser-BE-GDk5-.js → browser-DiiMmTrM.js} +1 -1
  297. package/payload/server/public/assets/browser-DiiMmTrM.js.br +0 -0
  298. package/payload/server/public/assets/browser-DiiMmTrM.js.gz +0 -0
  299. package/payload/server/public/assets/{calendar-Di7BEHHN.js → calendar-CazmCzgO.js} +1 -1
  300. package/payload/server/public/assets/calendar-CazmCzgO.js.br +0 -0
  301. package/payload/server/public/assets/calendar-CazmCzgO.js.gz +0 -0
  302. package/payload/server/public/assets/chat-CB0TcyXX.js +1 -0
  303. package/payload/server/public/assets/chat-CB0TcyXX.js.br +0 -0
  304. package/payload/server/public/assets/chat-CB0TcyXX.js.gz +0 -0
  305. package/payload/server/public/assets/chevron-left-0tVo23Dh.js +1 -0
  306. package/payload/server/public/assets/chevron-left-0tVo23Dh.js.br +0 -0
  307. package/payload/server/public/assets/clock-D2cZ0sge.js +1 -0
  308. package/payload/server/public/assets/clock-D2cZ0sge.js.br +0 -0
  309. package/payload/server/public/assets/clock-D2cZ0sge.js.gz +0 -0
  310. package/payload/server/public/assets/{copy-nkxspu2J.js → copy-C87QIN_o.js} +1 -1
  311. package/payload/server/public/assets/copy-C87QIN_o.js.br +0 -0
  312. package/payload/server/public/assets/copy-C87QIN_o.js.gz +0 -0
  313. package/payload/server/public/assets/data-CK7AMxPt.js +1 -0
  314. package/payload/server/public/assets/data-CK7AMxPt.js.br +0 -0
  315. package/payload/server/public/assets/data-CK7AMxPt.js.gz +0 -0
  316. package/payload/server/public/assets/{field-2rIXxGMt.js → field-C3kQgGWE.js} +1 -1
  317. package/payload/server/public/assets/field-C3kQgGWE.js.br +0 -0
  318. package/payload/server/public/assets/field-C3kQgGWE.js.gz +0 -0
  319. package/payload/server/public/assets/{file-text-CdSqrscg.js → file-text-rWowl9RN.js} +1 -1
  320. package/payload/server/public/assets/file-text-rWowl9RN.js.br +0 -0
  321. package/payload/server/public/assets/file-text-rWowl9RN.js.gz +0 -0
  322. package/payload/server/public/assets/{graph-BfBHHXaC.js → graph-CVJKz1Uo.js} +1 -1
  323. package/payload/server/public/assets/graph-CVJKz1Uo.js.br +0 -0
  324. package/payload/server/public/assets/graph-CVJKz1Uo.js.gz +0 -0
  325. package/payload/server/public/assets/{graph-labels-CHW2aBke.js → graph-labels-kneGnsHB.js} +1 -1
  326. package/payload/server/public/assets/graph-labels-kneGnsHB.js.br +0 -0
  327. package/payload/server/public/assets/graph-labels-kneGnsHB.js.gz +0 -0
  328. package/payload/server/public/assets/{jsx-runtime-D43jgaWP.css → jsx-runtime-rMaiYjNu.css} +1 -1
  329. package/payload/server/public/assets/jsx-runtime-rMaiYjNu.css.br +0 -0
  330. package/payload/server/public/assets/{jsx-runtime-D43jgaWP.css.gz → jsx-runtime-rMaiYjNu.css.gz} +0 -0
  331. package/payload/server/public/assets/{operator-DRn9LITC.js → operator-BGvB4hu4.js} +1 -1
  332. package/payload/server/public/assets/operator-BGvB4hu4.js.br +0 -0
  333. package/payload/server/public/assets/operator-BGvB4hu4.js.gz +0 -0
  334. package/payload/server/public/assets/{page-D_9mPS6W.js → page-DBQLOasI.js} +1 -1
  335. package/payload/server/public/assets/page-DBQLOasI.js.br +0 -0
  336. package/payload/server/public/assets/page-DBQLOasI.js.gz +0 -0
  337. package/payload/server/public/assets/{page-BwqQsoU8.js → page-DyVAu7tm.js} +1 -1
  338. package/payload/server/public/assets/page-DyVAu7tm.js.br +0 -0
  339. package/payload/server/public/assets/page-DyVAu7tm.js.gz +0 -0
  340. package/payload/server/public/assets/play-DgP7vl0r.js +1 -0
  341. package/payload/server/public/assets/play-DgP7vl0r.js.br +0 -0
  342. package/payload/server/public/assets/play-DgP7vl0r.js.gz +0 -0
  343. package/payload/server/public/assets/{public-CrjZYpdW.js → public-BvUQR3hd.js} +1 -1
  344. package/payload/server/public/assets/public-BvUQR3hd.js.br +0 -0
  345. package/payload/server/public/assets/public-BvUQR3hd.js.gz +0 -0
  346. package/payload/server/public/assets/{rotate-ccw-J9f-GWjm.js → rotate-ccw-Dnn7gbPh.js} +1 -1
  347. package/payload/server/public/assets/rotate-ccw-Dnn7gbPh.js.br +0 -0
  348. package/payload/server/public/assets/rotate-ccw-Dnn7gbPh.js.gz +0 -0
  349. package/payload/server/public/assets/{routines-C1AB-3FR.js → routines-N8NmxPOZ.js} +1 -1
  350. package/payload/server/public/assets/routines-N8NmxPOZ.js.br +0 -0
  351. package/payload/server/public/assets/routines-N8NmxPOZ.js.gz +0 -0
  352. package/payload/server/public/assets/{skills-C4EfNKEx.js → skills-B2CRgO-U.js} +1 -1
  353. package/payload/server/public/assets/skills-B2CRgO-U.js.br +0 -0
  354. package/payload/server/public/assets/skills-B2CRgO-U.js.gz +0 -0
  355. package/payload/server/public/assets/{tasks-DszD3aZl.js → tasks-8QLGtlSj.js} +1 -1
  356. package/payload/server/public/assets/tasks-8QLGtlSj.js.br +0 -0
  357. package/payload/server/public/assets/tasks-8QLGtlSj.js.gz +0 -0
  358. package/payload/server/public/assets/{triangle-alert-B5WAyAkC.js → triangle-alert-el772yUQ.js} +1 -1
  359. package/payload/server/public/assets/triangle-alert-el772yUQ.js.br +0 -0
  360. package/payload/server/public/assets/triangle-alert-el772yUQ.js.gz +0 -0
  361. package/payload/server/public/assets/{useCopyFeedback-B2nuNNJw.js → useCopyFeedback-DfNAu8hQ.js} +1 -1
  362. package/payload/server/public/assets/useCopyFeedback-DfNAu8hQ.js.br +0 -0
  363. package/payload/server/public/assets/useCopyFeedback-DfNAu8hQ.js.gz +0 -0
  364. package/payload/server/public/assets/{useMediaQuery-DUPJPHQt.js → useMediaQuery-B469O83-.js} +1 -1
  365. package/payload/server/public/assets/useMediaQuery-B469O83-.js.br +0 -0
  366. package/payload/server/public/assets/useMediaQuery-B469O83-.js.gz +0 -0
  367. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js +2 -0
  368. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js.br +0 -0
  369. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js.gz +0 -0
  370. package/payload/server/public/assets/{wrench-DZJZm17j.js → wrench-Ck4phkdB.js} +1 -1
  371. package/payload/server/public/assets/wrench-Ck4phkdB.js.br +0 -0
  372. package/payload/server/public/assets/wrench-Ck4phkdB.js.gz +0 -0
  373. package/payload/server/public/browser.html +5 -5
  374. package/payload/server/public/calendar.html +8 -8
  375. package/payload/server/public/chat.html +14 -14
  376. package/payload/server/public/data.html +12 -12
  377. package/payload/server/public/field.html +3 -3
  378. package/payload/server/public/graph.html +10 -10
  379. package/payload/server/public/index.html +14 -14
  380. package/payload/server/public/operator.html +16 -16
  381. package/payload/server/public/public.html +14 -14
  382. package/payload/server/public/routines.html +8 -8
  383. package/payload/server/public/skills.html +6 -6
  384. package/payload/server/public/tasks.html +7 -7
  385. package/payload/server/server.js +3777 -1258
  386. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.br +0 -0
  387. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.gz +0 -0
  388. package/payload/server/public/assets/AdminShell-BMslfZxN.js.br +0 -0
  389. package/payload/server/public/assets/AdminShell-BMslfZxN.js.gz +0 -0
  390. package/payload/server/public/assets/activity-kQ3w70LJ.js.br +0 -0
  391. package/payload/server/public/assets/activity-kQ3w70LJ.js.gz +0 -0
  392. package/payload/server/public/assets/admin-CkASgYA7.js.br +0 -0
  393. package/payload/server/public/assets/admin-CkASgYA7.js.gz +0 -0
  394. package/payload/server/public/assets/agents-Cn_bZgnD.js.br +0 -0
  395. package/payload/server/public/assets/agents-Cn_bZgnD.js.gz +0 -0
  396. package/payload/server/public/assets/browser-BE-GDk5-.js.br +0 -0
  397. package/payload/server/public/assets/browser-BE-GDk5-.js.gz +0 -0
  398. package/payload/server/public/assets/calendar-Di7BEHHN.js.br +0 -0
  399. package/payload/server/public/assets/calendar-Di7BEHHN.js.gz +0 -0
  400. package/payload/server/public/assets/chat-CKyMT5Ai.js +0 -1
  401. package/payload/server/public/assets/chat-CKyMT5Ai.js.br +0 -1
  402. package/payload/server/public/assets/chat-CKyMT5Ai.js.gz +0 -0
  403. package/payload/server/public/assets/chevron-left-Id9VAZAz.js +0 -1
  404. package/payload/server/public/assets/chevron-left-Id9VAZAz.js.br +0 -0
  405. package/payload/server/public/assets/clock-DKpWWJbJ.js +0 -1
  406. package/payload/server/public/assets/clock-DKpWWJbJ.js.br +0 -0
  407. package/payload/server/public/assets/copy-nkxspu2J.js.br +0 -0
  408. package/payload/server/public/assets/copy-nkxspu2J.js.gz +0 -0
  409. package/payload/server/public/assets/data-1c33cAHp.js +0 -1
  410. package/payload/server/public/assets/data-1c33cAHp.js.br +0 -2
  411. package/payload/server/public/assets/data-1c33cAHp.js.gz +0 -0
  412. package/payload/server/public/assets/field-2rIXxGMt.js.br +0 -0
  413. package/payload/server/public/assets/field-2rIXxGMt.js.gz +0 -0
  414. package/payload/server/public/assets/file-text-CdSqrscg.js.br +0 -0
  415. package/payload/server/public/assets/file-text-CdSqrscg.js.gz +0 -0
  416. package/payload/server/public/assets/graph-BfBHHXaC.js.br +0 -0
  417. package/payload/server/public/assets/graph-BfBHHXaC.js.gz +0 -0
  418. package/payload/server/public/assets/graph-labels-CHW2aBke.js.br +0 -0
  419. package/payload/server/public/assets/graph-labels-CHW2aBke.js.gz +0 -0
  420. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.br +0 -0
  421. package/payload/server/public/assets/operator-DRn9LITC.js.br +0 -0
  422. package/payload/server/public/assets/operator-DRn9LITC.js.gz +0 -0
  423. package/payload/server/public/assets/page-BwqQsoU8.js.br +0 -0
  424. package/payload/server/public/assets/page-BwqQsoU8.js.gz +0 -0
  425. package/payload/server/public/assets/page-D_9mPS6W.js.br +0 -0
  426. package/payload/server/public/assets/page-D_9mPS6W.js.gz +0 -0
  427. package/payload/server/public/assets/play-7LTxCuLX.js +0 -1
  428. package/payload/server/public/assets/play-7LTxCuLX.js.br +0 -0
  429. package/payload/server/public/assets/play-7LTxCuLX.js.gz +0 -0
  430. package/payload/server/public/assets/public-CrjZYpdW.js.br +0 -0
  431. package/payload/server/public/assets/public-CrjZYpdW.js.gz +0 -0
  432. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.br +0 -0
  433. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.gz +0 -0
  434. package/payload/server/public/assets/routines-C1AB-3FR.js.br +0 -0
  435. package/payload/server/public/assets/routines-C1AB-3FR.js.gz +0 -0
  436. package/payload/server/public/assets/skills-C4EfNKEx.js.br +0 -0
  437. package/payload/server/public/assets/skills-C4EfNKEx.js.gz +0 -0
  438. package/payload/server/public/assets/tasks-DszD3aZl.js.br +0 -0
  439. package/payload/server/public/assets/tasks-DszD3aZl.js.gz +0 -0
  440. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.br +0 -4
  441. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.gz +0 -0
  442. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.br +0 -0
  443. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.gz +0 -0
  444. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.br +0 -0
  445. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.gz +0 -0
  446. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js +0 -2
  447. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.br +0 -0
  448. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.gz +0 -0
  449. package/payload/server/public/assets/wrench-DZJZm17j.js.br +0 -0
  450. package/payload/server/public/assets/wrench-DZJZm17j.js.gz +0 -0
  451. /package/payload/server/public/assets/{jsx-runtime-Cjug_Cyb.js → jsx-runtime-BmNepPEn.js} +0 -0
  452. /package/payload/server/public/assets/{jsx-runtime-Cjug_Cyb.js.br → jsx-runtime-BmNepPEn.js.br} +0 -0
  453. /package/payload/server/public/assets/{jsx-runtime-Cjug_Cyb.js.gz → jsx-runtime-BmNepPEn.js.gz} +0 -0
@@ -0,0 +1,108 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, writeFileSync, rmSync, readFileSync, realpathSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { checkAccountSchema } from "../account-schema.js";
7
+ let root;
8
+ // Six levels up from src/lib/__tests__/ reaches platform/. Counted from this
9
+ // file's own URL, not from cwd, because vitest runs from the package dir.
10
+ const TEMPLATE = fileURLToPath(new URL("../../../../../../templates/account-schema/SCHEMA.md", import.meta.url));
11
+ beforeEach(() => {
12
+ root = mkdtempSync(join(tmpdir(), "acct-schema-"));
13
+ });
14
+ afterEach(() => rmSync(root, { recursive: true, force: true }));
15
+ const seed = () => writeFileSync(join(root, "SCHEMA.md"), readFileSync(TEMPLATE, "utf-8"));
16
+ describe("checkAccountSchema — fail-open", () => {
17
+ it("allows every path when SCHEMA.md is absent", () => {
18
+ expect(checkAccountSchema(root, "nonsense/x.md")).toBeNull();
19
+ expect(checkAccountSchema(root, "projects/acme/insights/x.md")).toBeNull();
20
+ });
21
+ it("allows every path when the allowed fence is empty", () => {
22
+ writeFileSync(join(root, "SCHEMA.md"), "# empty\n\n```allowed-top-level\n```\n");
23
+ expect(checkAccountSchema(root, "nonsense/x.md")).toBeNull();
24
+ });
25
+ });
26
+ describe("checkAccountSchema — the five refusals", () => {
27
+ beforeEach(seed);
28
+ it("refuses a first segment outside the allowed set", () => {
29
+ expect(checkAccountSchema(root, "nonsense/x.md")?.reason).toBe("top-level");
30
+ });
31
+ it("refuses the account's own machinery and quotes the fence reason", () => {
32
+ const r = checkAccountSchema(root, "secrets/x");
33
+ expect(r?.reason).toBe("account-machinery");
34
+ expect(r?.message).toContain("provisioned credentials");
35
+ });
36
+ it("refuses an over-deep entity path", () => {
37
+ expect(checkAccountSchema(root, "projects/acme-corp/insights/x.md")?.reason).toBe("over-deep");
38
+ });
39
+ it("refuses a bad name", () => {
40
+ expect(checkAccountSchema(root, "projects/ACME Corp/x.md")?.reason).toBe("bad-name");
41
+ });
42
+ it("allows a flat entity file and an archived one", () => {
43
+ expect(checkAccountSchema(root, "projects/acme-corp/quote.pdf")).toBeNull();
44
+ expect(checkAccountSchema(root, "projects/acme-corp/archive/quote-v1.pdf")).toBeNull();
45
+ expect(checkAccountSchema(root, "contacts/jane-doe/archive/profile.pdf")).toBeNull();
46
+ });
47
+ it("refuses a second folder beneath archive", () => {
48
+ expect(checkAccountSchema(root, "projects/acme-corp/archive/old/quote.pdf")?.reason).toBe("over-deep");
49
+ });
50
+ it("refuses any other entity subfolder at the same depth", () => {
51
+ expect(checkAccountSchema(root, "projects/acme-corp/invoices/quote.pdf")?.reason).toBe("over-deep");
52
+ });
53
+ it("keeps documents at one folder deep", () => {
54
+ expect(checkAccountSchema(root, "documents/site-survey/notes.md")).toBeNull();
55
+ expect(checkAccountSchema(root, "documents/a/b/notes.md")?.reason).toBe("over-deep");
56
+ });
57
+ it("leaves tool-owned buckets unbounded", () => {
58
+ expect(checkAccountSchema(root, "output/deep/nested/x.png")).toBeNull();
59
+ });
60
+ // The hook resolves its target before counting segments, so a dot segment or a
61
+ // doubled slash never inflates the depth there. Counting raw segments here
62
+ // would refuse a legitimate flat write.
63
+ it("normalises a dot segment rather than counting it as depth", () => {
64
+ expect(checkAccountSchema(root, "projects/acme-corp/./quote.pdf")).toBeNull();
65
+ expect(checkAccountSchema(root, "./projects/acme-corp/quote.pdf")).toBeNull();
66
+ });
67
+ // An absolute path inside the account passes containedPath on a real install,
68
+ // where the accounts root is not a symlink, and reaches this check. Splitting
69
+ // it raw makes the first segment a filesystem root name and refuses a
70
+ // legitimate write with a message naming 'Users'. The absolute path is built
71
+ // from the REAL root because that is what containedPath roots the write at,
72
+ // and os.tmpdir() is a symlink on macOS.
73
+ it("judges an absolute in-account path by its in-account portion", () => {
74
+ const real = realpathSync(root);
75
+ expect(checkAccountSchema(root, join(real, "projects/acme-corp/quote.pdf"))).toBeNull();
76
+ expect(checkAccountSchema(root, join(real, "projects/acme-corp/insights/x.md"))?.reason).toBe("over-deep");
77
+ });
78
+ // A path that resolves outside the account is containedPath's refusal, not
79
+ // this module's; judging it here would produce a second, differently-worded
80
+ // verdict for one condition.
81
+ it("leaves an escaping path to the containment check", () => {
82
+ expect(checkAccountSchema(root, "../elsewhere/x.md")).toBeNull();
83
+ });
84
+ it("emits one [fs-guard] blocked line per refusal", () => {
85
+ const seen = [];
86
+ const orig = process.stderr.write;
87
+ process.stderr.write = ((s) => {
88
+ seen.push(String(s));
89
+ return true;
90
+ });
91
+ try {
92
+ checkAccountSchema(root, "nonsense/x.md");
93
+ }
94
+ finally {
95
+ process.stderr.write = orig;
96
+ }
97
+ expect(seen.join("")).toContain("[fs-guard] blocked path=nonsense/x.md reason=top-level");
98
+ });
99
+ });
100
+ describe("checkAccountSchema — declared files", () => {
101
+ it("refuses a first segment named in the declared-files fence", () => {
102
+ writeFileSync(join(root, "SCHEMA.md"), "```allowed-top-level\nprojects\nportal.json\n```\n\n```declared-files\nportal.json\tdata-portal\n```\n");
103
+ const r = checkAccountSchema(root, "portal.json");
104
+ expect(r?.reason).toBe("declared-file");
105
+ expect(r?.message).toContain("data-portal");
106
+ });
107
+ });
108
+ //# sourceMappingURL=account-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-schema.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/account-schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type SchemaReason = "top-level" | "account-machinery" | "declared-file" | "over-deep" | "bad-name";
2
+ export interface SchemaRefusal {
3
+ reason: SchemaReason;
4
+ /** Agent-facing text, with no leading label; each tool prefixes its own name. */
5
+ message: string;
6
+ }
7
+ /**
8
+ * Apply the account's own file schema to the caller's `path`. Returns null to
9
+ * allow.
10
+ *
11
+ * `root` is the resolved ACCOUNT directory, so a cross-account write is checked
12
+ * against the target account's SCHEMA.md, which is the layout that governs where
13
+ * the bytes land. Callers skip this entirely for the shared root: data/shared is
14
+ * not an account and carries no account layout contract.
15
+ */
16
+ export declare function checkAccountSchema(root: string, requestedPath: string): SchemaRefusal | null;
17
+ //# sourceMappingURL=account-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-schema.d.ts","sourceRoot":"","sources":["../../src/lib/account-schema.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,mBAAmB,GACnB,eAAe,GACf,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;CACjB;AAoED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAqF5F"}
@@ -0,0 +1,162 @@
1
+ // account-schema.ts — the account file-schema fence for the two mutating file
2
+ // tools, mirroring platform/plugins/admin/hooks/fs-schema-guard.sh rule for rule.
3
+ //
4
+ // The hook governs the NATIVE tools (Write/Edit/MultiEdit/NotebookEdit) by
5
+ // matching on tool_name; an MCP tool name matches none of its four matchers, so
6
+ // file-write and file-edit reached the account dir with a containment check and
7
+ // nothing else. This module is the same fence on that route.
8
+ //
9
+ // It is deliberately a second implementation rather than a shared one: the hook
10
+ // is bash and awk running in the agent's PTY with the account dir as cwd, while
11
+ // this is in-process TypeScript that must also serve a CROSS-ACCOUNT write, where
12
+ // the schema to read is the TARGET account's. The one thing that must not drift
13
+ // is the rule set, which the tests pin by parsing the shipped template both sides
14
+ // read.
15
+ //
16
+ // The parse is local rather than reusing lib/account-schema-regions: that lib
17
+ // parses the allowed fence only, so two of the three fences would still be parsed
18
+ // here and a reader would have to hold two parsers in mind.
19
+ //
20
+ // Fail-open on an absent, unreadable, or empty-fence schema, exactly as the hook
21
+ // does at fs-schema-guard.sh:136. An un-seeded legacy account must not have every
22
+ // write blocked.
23
+ import { readFileSync, realpathSync } from "node:fs";
24
+ import { join, relative, resolve } from "node:path";
25
+ /** Lines of a fenced block, e.g. ```allowed-top-level ... ```. Empty when the
26
+ * fence is absent, which every caller treats as "nothing to enforce". */
27
+ function fence(schema, name) {
28
+ const open = "```" + name;
29
+ const from = schema.indexOf(open + "\n");
30
+ if (from === -1)
31
+ return [];
32
+ const bodyStart = from + open.length + 1;
33
+ const to = schema.indexOf("\n```", bodyStart - 1);
34
+ if (to === -1)
35
+ return [];
36
+ return schema
37
+ .slice(bodyStart, to + 1)
38
+ .split("\n")
39
+ .map((s) => s.trim())
40
+ .filter((s) => s.length > 0);
41
+ }
42
+ /** A tab-separated fence read as name -> second column, the shape the
43
+ * agent-denied-top-level (name, reason) and declared-files (name, owner)
44
+ * fences both carry. */
45
+ function tabbed(lines) {
46
+ const out = new Map();
47
+ for (const line of lines) {
48
+ const tab = line.indexOf("\t");
49
+ if (tab === -1)
50
+ out.set(line, "");
51
+ else
52
+ out.set(line.slice(0, tab), line.slice(tab + 1).trim());
53
+ }
54
+ return out;
55
+ }
56
+ const FOLDER_RE = /^[a-z0-9-]+$/;
57
+ const FILE_RE = /^[a-z0-9-]+(\.[a-z0-9-]+)*$/;
58
+ const OPERATOR_BUCKETS = new Set(["projects", "contacts", "documents"]);
59
+ const refuse = (reason, relPath, message) => {
60
+ process.stderr.write(`[fs-guard] blocked path=${relPath} reason=${reason}\n`);
61
+ return { reason, message };
62
+ };
63
+ /**
64
+ * Resolve the caller's `path` argument to a path relative to the account root,
65
+ * the same way fs-schema-guard.sh's python resolver does before it counts
66
+ * segments.
67
+ *
68
+ * Two shapes reach here that a raw split would misjudge. A dot or doubled-slash
69
+ * segment (`projects/acme/./quote.pdf`) inflates the raw segment count and would
70
+ * be refused over-deep though it is a flat write. An ABSOLUTE in-account path
71
+ * passes `containedPath` on a real install, where the accounts root is not a
72
+ * symlink, and a raw split would make its first segment a filesystem root name
73
+ * and refuse it as an unlisted top-level entry.
74
+ *
75
+ * The realpath matches what `containedPath` roots the write at, so the two agree
76
+ * on a symlinked accounts root. Containment is already decided by the time this
77
+ * runs; a result that still escapes returns null rather than being judged here.
78
+ */
79
+ function toAccountRelative(root, requested) {
80
+ let realRoot;
81
+ try {
82
+ realRoot = realpathSync(root);
83
+ }
84
+ catch {
85
+ realRoot = root;
86
+ }
87
+ const rel = relative(realRoot, resolve(realRoot, requested));
88
+ if (rel === "" || rel === ".." || rel.startsWith(".." + "/"))
89
+ return null;
90
+ return rel;
91
+ }
92
+ /**
93
+ * Apply the account's own file schema to the caller's `path`. Returns null to
94
+ * allow.
95
+ *
96
+ * `root` is the resolved ACCOUNT directory, so a cross-account write is checked
97
+ * against the target account's SCHEMA.md, which is the layout that governs where
98
+ * the bytes land. Callers skip this entirely for the shared root: data/shared is
99
+ * not an account and carries no account layout contract.
100
+ */
101
+ export function checkAccountSchema(root, requestedPath) {
102
+ let schema;
103
+ try {
104
+ schema = readFileSync(join(root, "SCHEMA.md"), "utf-8");
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ const allowed = fence(schema, "allowed-top-level");
110
+ if (allowed.length === 0)
111
+ return null;
112
+ const relPath = toAccountRelative(root, requestedPath);
113
+ if (relPath === null)
114
+ return null;
115
+ const segs = relPath.split("/").filter((s) => s.length > 0);
116
+ if (segs.length === 0)
117
+ return null;
118
+ const seg0 = segs[0];
119
+ if (!allowed.includes(seg0)) {
120
+ return refuse("top-level", relPath, `'${seg0}' is not an allowed top-level entry in this account's data directory. The layout is fixed by SCHEMA.md, so place operator data under projects/, contacts/, or documents/, and route any reorganisation through the data-manager specialist.`);
121
+ }
122
+ const denied = tabbed(fence(schema, "agent-denied-top-level"));
123
+ const why = denied.get(seg0);
124
+ if (why !== undefined) {
125
+ return refuse("account-machinery", relPath, `'${seg0}' is this account's own machinery, not operator data: ${why}. Change it through the code that owns it.`);
126
+ }
127
+ const declared = tabbed(fence(schema, "declared-files"));
128
+ const owner = declared.get(seg0);
129
+ if (owner !== undefined) {
130
+ return refuse("declared-file", relPath, `'${seg0}' is a declared file owned by the ${owner} plugin. The platform writes it whole, so it is control-plane state, not operator data, and a hand-written copy is overwritten by the next platform write. Change it through the code that owns it, never by hand.`);
131
+ }
132
+ // Depth. projects/ and contacts/ are flat, with archive/ the one permitted
133
+ // subfolder; documents/ allows one document-folder. Tool-owned buckets are
134
+ // unbounded and are not named here at all.
135
+ if (seg0 === "projects" || seg0 === "contacts") {
136
+ const archived = segs.length === 4 && segs[2] === "archive";
137
+ if (segs.length > 3 && !archived) {
138
+ return refuse("over-deep", relPath, `${seg0}/ is flat: one folder per entity, then files, with archive/ the one permitted subfolder for superseded versions. '${relPath}' nests a subtree that has no basis in the graph ontology. Keep files directly under ${seg0}/<name>/ or in ${seg0}/<name>/archive/, or route a reorganisation through the data-manager specialist.`);
139
+ }
140
+ }
141
+ else if (seg0 === "documents") {
142
+ if (segs.length > 3) {
143
+ return refuse("over-deep", relPath, `documents/ holds files or one folder deep. '${relPath}' nests deeper, which has no basis in the graph ontology. Route a reorganisation through the data-manager specialist.`);
144
+ }
145
+ }
146
+ // Names, under the three operator buckets only. Index 0 is the bucket (the
147
+ // top-level rule above governs it) and dot-prefixed entries are exempt at
148
+ // every level, exactly as the hook has it.
149
+ if (OPERATOR_BUCKETS.has(seg0)) {
150
+ for (let i = 1; i < segs.length; i++) {
151
+ const s = segs[i];
152
+ if (s.startsWith("."))
153
+ continue;
154
+ const ok = i === segs.length - 1 ? FILE_RE.test(s) : FOLDER_RE.test(s);
155
+ if (!ok) {
156
+ return refuse("bad-name", relPath, `'${s}' is not a valid name in this account's data directory. Folder and file names under projects/, contacts/, and documents/ use lowercase letters, digits, and hyphens only, with a lowercase file extension. Rename it to fit, or route a reorganisation through the data-manager specialist.`);
157
+ }
158
+ }
159
+ }
160
+ return null;
161
+ }
162
+ //# sourceMappingURL=account-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-schema.js","sourceRoot":"","sources":["../../src/lib/account-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema-fence.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-fence.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/schema-fence.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, existsSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { fileWrite } from "../file-write.js";
7
+ import { fileEdit } from "../file-edit.js";
8
+ const HOUSE = "11111111-1111-4111-8111-111111111111";
9
+ const CLIENT = "22222222-2222-4222-8222-222222222222";
10
+ // Six levels up from src/tools/__tests__/ reaches platform/.
11
+ const TEMPLATE = fileURLToPath(new URL("../../../../../../templates/account-schema/SCHEMA.md", import.meta.url));
12
+ let accountsDir;
13
+ let acct;
14
+ beforeEach(() => {
15
+ accountsDir = mkdtempSync(join(tmpdir(), "fence-"));
16
+ for (const id of [HOUSE, CLIENT]) {
17
+ mkdirSync(join(accountsDir, id), { recursive: true });
18
+ writeFileSync(join(accountsDir, id, "account.json"), JSON.stringify({ accountId: id }));
19
+ writeFileSync(join(accountsDir, id, "SCHEMA.md"), readFileSync(TEMPLATE, "utf-8"));
20
+ }
21
+ acct = join(accountsDir, HOUSE);
22
+ });
23
+ afterEach(() => rmSync(accountsDir, { recursive: true, force: true }));
24
+ const house = () => ({ ownAccountId: HOUSE, houseScope: HOUSE, accountsDir, sessionId: null });
25
+ const text = (r) => r.content[0].text;
26
+ describe("file-write honours the account file schema", () => {
27
+ it("refuses an over-deep entity path and creates nothing", () => {
28
+ const r = fileWrite({ path: "projects/acme-corp/insights/x.md", content: "x" }, house());
29
+ expect(r.isError).toBe(true);
30
+ expect(text(r)).toContain("archive/");
31
+ expect(existsSync(join(acct, "projects", "acme-corp", "insights"))).toBe(false);
32
+ expect(existsSync(join(acct, "projects", "acme-corp"))).toBe(false);
33
+ });
34
+ it("refuses the account's own machinery", () => {
35
+ const r = fileWrite({ path: "secrets/x", content: "x" }, house());
36
+ expect(r.isError).toBe(true);
37
+ expect(existsSync(join(acct, "secrets"))).toBe(false);
38
+ });
39
+ it("refuses a novel top-level entry", () => {
40
+ const r = fileWrite({ path: "nonsense/x.md", content: "x" }, house());
41
+ expect(r.isError).toBe(true);
42
+ expect(existsSync(join(acct, "nonsense"))).toBe(false);
43
+ });
44
+ it("refuses a bad name", () => {
45
+ const r = fileWrite({ path: "projects/ACME Corp/x.md", content: "x" }, house());
46
+ expect(r.isError).toBe(true);
47
+ });
48
+ it("allows an archived version", () => {
49
+ const r = fileWrite({ path: "projects/acme-corp/archive/quote-v1.pdf", content: "x" }, house());
50
+ expect(r.isError).toBeUndefined();
51
+ expect(existsSync(join(acct, "projects", "acme-corp", "archive", "quote-v1.pdf"))).toBe(true);
52
+ });
53
+ });
54
+ describe("file-edit honours the same schema", () => {
55
+ it("refuses an over-deep target even when the file exists", () => {
56
+ mkdirSync(join(acct, "projects", "acme-corp", "insights"), { recursive: true });
57
+ writeFileSync(join(acct, "projects", "acme-corp", "insights", "x.md"), "alpha");
58
+ const r = fileEdit({ path: "projects/acme-corp/insights/x.md", oldString: "alpha", newString: "beta" }, house());
59
+ expect(r.isError).toBe(true);
60
+ expect(readFileSync(join(acct, "projects", "acme-corp", "insights", "x.md"), "utf-8")).toBe("alpha");
61
+ });
62
+ it("allows an edit inside archive/", () => {
63
+ mkdirSync(join(acct, "projects", "acme-corp", "archive"), { recursive: true });
64
+ writeFileSync(join(acct, "projects", "acme-corp", "archive", "note.md"), "alpha");
65
+ const r = fileEdit({ path: "projects/acme-corp/archive/note.md", oldString: "alpha", newString: "beta" }, house());
66
+ expect(r.isError).toBeUndefined();
67
+ });
68
+ });
69
+ // The shared folder is a sibling of accounts/, not an account, so it carries no
70
+ // account layout contract. Without a SCHEMA.md there the exemption and the
71
+ // missing-schema fail-open are indistinguishable, so this case plants one that
72
+ // WOULD refuse and proves the write still lands. The fixture mirrors the landed
73
+ // shared-folder suite: the gate needs a dataRoot/accounts layout and a house
74
+ // role marker.
75
+ describe("the shared root is exempt from the account schema", () => {
76
+ let dataRoot;
77
+ let sharedAccountsDir;
78
+ beforeEach(() => {
79
+ dataRoot = mkdtempSync(join(tmpdir(), "fence-shared-"));
80
+ sharedAccountsDir = join(dataRoot, "accounts");
81
+ mkdirSync(join(sharedAccountsDir, HOUSE), { recursive: true });
82
+ writeFileSync(join(sharedAccountsDir, HOUSE, "account.json"), JSON.stringify({ accountId: HOUSE, role: "house" }));
83
+ mkdirSync(join(dataRoot, "shared"), { recursive: true });
84
+ writeFileSync(join(dataRoot, "shared", "SCHEMA.md"), readFileSync(TEMPLATE, "utf-8"));
85
+ });
86
+ afterEach(() => rmSync(dataRoot, { recursive: true, force: true }));
87
+ it("writes a path the account schema would refuse", () => {
88
+ const ctx = {
89
+ ownAccountId: HOUSE,
90
+ houseScope: HOUSE,
91
+ accountsDir: sharedAccountsDir,
92
+ sessionId: "sid-shared",
93
+ };
94
+ const r = fileWrite({ path: "nonsense/x.md", content: "x", shared: true }, ctx);
95
+ expect(r.isError).toBeUndefined();
96
+ expect(existsSync(join(dataRoot, "shared", "nonsense", "x.md"))).toBe(true);
97
+ });
98
+ });
99
+ describe("a cross-account write is judged by the target's schema", () => {
100
+ it("refuses an over-deep path in the target account and creates nothing there", () => {
101
+ const r = fileWrite({ path: "projects/acme-corp/insights/x.md", content: "x", targetAccountId: CLIENT }, house());
102
+ expect(r.isError).toBe(true);
103
+ expect(existsSync(join(accountsDir, CLIENT, "projects", "acme-corp"))).toBe(false);
104
+ });
105
+ it("allows a flat path in the target account", () => {
106
+ const r = fileWrite({ path: "projects/acme-corp/quote.pdf", content: "x", targetAccountId: CLIENT }, house());
107
+ expect(r.isError).toBeUndefined();
108
+ expect(existsSync(join(accountsDir, CLIENT, "projects", "acme-corp", "quote.pdf"))).toBe(true);
109
+ });
110
+ it("falls open when the target account carries no schema", () => {
111
+ rmSync(join(accountsDir, CLIENT, "SCHEMA.md"));
112
+ const r = fileWrite({ path: "nonsense/x.md", content: "x", targetAccountId: CLIENT }, house());
113
+ expect(r.isError).toBeUndefined();
114
+ });
115
+ });
116
+ //# sourceMappingURL=schema-fence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-fence.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/schema-fence.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-edit.d.ts","sourceRoot":"","sources":["../../src/tools/file-edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAiD,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAG1F,wBAAgB,QAAQ,CACtB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EACxG,GAAG,EAAE,GAAG,yCA+BT"}
1
+ {"version":3,"file":"file-edit.d.ts","sourceRoot":"","sources":["../../src/tools/file-edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAiD,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI1F,wBAAgB,QAAQ,CACtB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EACxG,GAAG,EAAE,GAAG,yCAsCT"}
@@ -1,5 +1,6 @@
1
1
  import { readFileSync, writeFileSync } from "node:fs";
2
2
  import { resolveRoot, containedPath, SHARED_ROOT_LABEL } from "../lib/scope.js";
3
+ import { checkAccountSchema } from "../lib/account-schema.js";
3
4
  import { ok, err } from "../lib/result.js";
4
5
  export function fileEdit(args, ctx) {
5
6
  const r = resolveRoot(ctx, args.targetAccountId, "file-edit", args.shared);
@@ -16,6 +17,14 @@ export function fileEdit(args, ctx) {
16
17
  catch {
17
18
  return err(`file-edit rejected: path escapes the ${r.resolved === SHARED_ROOT_LABEL ? "shared" : "account"} directory`);
18
19
  }
20
+ // Same fence as file-write, and the same five rules the native Edit route
21
+ // gets. An existing over-deep file is refused here too: one rule, one answer,
22
+ // whichever route the agent takes.
23
+ if (r.resolved !== SHARED_ROOT_LABEL) {
24
+ const refusal = checkAccountSchema(r.root, args.path);
25
+ if (refusal)
26
+ return err(`file-edit blocked: ${refusal.message}`);
27
+ }
19
28
  let content;
20
29
  try {
21
30
  content = readFileSync(abs, "utf-8");
@@ -1 +1 @@
1
- {"version":3,"file":"file-edit.js","sourceRoot":"","sources":["../../src/tools/file-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAY,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,UAAU,QAAQ,CACtB,IAAwG,EACxG,GAAQ;IAER,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,6EAA6E;IAC7E,8EAA8E;IAC9E,IAAI,IAAI,CAAC,SAAS,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAChF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CACR,wCAAwC,CAAC,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,CAC5G,CAAC;IACJ,CAAC;IACD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,cAAe,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,qCAAqC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,yCAAyC,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC;IACnG,IAAI,CAAC;QACH,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,cAAe,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"file-edit.js","sourceRoot":"","sources":["../../src/tools/file-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAY,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,UAAU,QAAQ,CACtB,IAAwG,EACxG,GAAQ;IAER,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,6EAA6E;IAC7E,8EAA8E;IAC9E,IAAI,IAAI,CAAC,SAAS,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAChF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CACR,wCAAwC,CAAC,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,CAC5G,CAAC;IACJ,CAAC;IACD,0EAA0E;IAC1E,8EAA8E;IAC9E,mCAAmC;IACnC,IAAI,CAAC,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,OAAO;YAAE,OAAO,GAAG,CAAC,sBAAsB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,cAAe,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,qCAAqC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,yCAAyC,IAAI,CAAC,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC;IACnG,IAAI,CAAC;QACH,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,cAAe,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-write.d.ts","sourceRoot":"","sources":["../../src/tools/file-write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiD,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAG1F,wBAAgB,SAAS,CACvB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EACnF,GAAG,EAAE,GAAG,yCAoBT"}
1
+ {"version":3,"file":"file-write.d.ts","sourceRoot":"","sources":["../../src/tools/file-write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiD,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI1F,wBAAgB,SAAS,CACvB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EACnF,GAAG,EAAE,GAAG,yCA4BT"}
@@ -1,6 +1,7 @@
1
1
  import { mkdirSync, writeFileSync } from "node:fs";
2
2
  import { dirname } from "node:path";
3
3
  import { resolveRoot, containedPath, SHARED_ROOT_LABEL } from "../lib/scope.js";
4
+ import { checkAccountSchema } from "../lib/account-schema.js";
4
5
  import { ok, err } from "../lib/result.js";
5
6
  export function fileWrite(args, ctx) {
6
7
  const r = resolveRoot(ctx, args.targetAccountId, "file-write", args.shared);
@@ -13,6 +14,15 @@ export function fileWrite(args, ctx) {
13
14
  catch {
14
15
  return err(`file-write rejected: path escapes the ${r.resolved === SHARED_ROOT_LABEL ? "shared" : "account"} directory`);
15
16
  }
17
+ // The account file schema, before any mkdir. The shared root is not an account
18
+ // and carries no account layout contract, so it is exempt. On an account root
19
+ // this is the same fence fs-schema-guard.sh puts on the native tools, which
20
+ // never saw an MCP tool name.
21
+ if (r.resolved !== SHARED_ROOT_LABEL) {
22
+ const refusal = checkAccountSchema(r.root, args.path);
23
+ if (refusal)
24
+ return err(`file-write blocked: ${refusal.message}`);
25
+ }
16
26
  try {
17
27
  mkdirSync(dirname(abs), { recursive: true });
18
28
  writeFileSync(abs, args.content, "utf-8");
@@ -1 +1 @@
1
- {"version":3,"file":"file-write.js","sourceRoot":"","sources":["../../src/tools/file-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAY,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,UAAU,SAAS,CACvB,IAAmF,EACnF,GAAQ;IAER,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,sBAAsB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAChE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CACR,yCAAyC,CAAC,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,CAC7G,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC,SAAS,KAAK,aAAa,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,eAAgB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"file-write.js","sourceRoot":"","sources":["../../src/tools/file-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAY,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,UAAU,SAAS,CACvB,IAAmF,EACnF,GAAQ;IAER,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,sBAAsB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAChE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CACR,yCAAyC,CAAC,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,CAC7G,CAAC;IACJ,CAAC;IACD,+EAA+E;IAC/E,8EAA8E;IAC9E,4EAA4E;IAC5E,8BAA8B;IAC9B,IAAI,CAAC,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,OAAO;YAAE,OAAO,GAAG,CAAC,uBAAuB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC,SAAS,KAAK,aAAa,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,eAAgB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -1,6 +1,7 @@
1
1
  // Task 350 — tests for the per-account-root reservation gate.
2
+ // Task 2613 — plus the calendar-label reservation, below.
2
3
  import { describe, it, expect } from "vitest";
3
- import { checkLabelOriginGate, RESERVED_LABEL_REFUSAL } from "../label-origin-gate.js";
4
+ import { checkLabelOriginGate, RESERVED_LABEL_REFUSAL, CALENDAR_LABEL_REFUSAL, } from "../label-origin-gate.js";
4
5
  describe("checkLabelOriginGate", () => {
5
6
  it("(a) system origin writing LocalBusiness → ok", () => {
6
7
  const r = checkLabelOriginGate({
@@ -47,4 +48,66 @@ describe("checkLabelOriginGate", () => {
47
48
  expect(r.ok).toBe(false);
48
49
  });
49
50
  });
51
+ // Task 2613 — memory-write created :Meeting rows carrying no uid. A meeting's
52
+ // only handle IS its uid, so schedule-list returned eventId:null for them and
53
+ // schedule-get/update/cancel, which all resolve MATCH (m:Meeting {uid: $id}),
54
+ // could never match. 37 untrashed rows on one install were unreachable, and
55
+ // with no key there was no MERGE collision either, so the same appointment was
56
+ // written twice three weeks apart.
57
+ describe("checkLabelOriginGate — :Meeting is scheduling-owned", () => {
58
+ it("refuses a Meeting create and names schedule-event", () => {
59
+ const r = checkLabelOriginGate({
60
+ labels: ["Meeting"],
61
+ createdBy: { agent: "admin" },
62
+ accountId: "acct-12345678",
63
+ tool: "memory-write",
64
+ });
65
+ expect(r.ok).toBe(false);
66
+ if (r.ok)
67
+ return;
68
+ expect(r.reason).toBe("calendar-label");
69
+ expect(r.message).toBe(CALENDAR_LABEL_REFUSAL);
70
+ expect(r.message).toContain("schedule-event");
71
+ expect(r.message).toContain("uid");
72
+ });
73
+ it("refuses Meeting even from system origin", () => {
74
+ // No exemption: meeting-write.ts, reconcile-bookings.ts and
75
+ // ics-graph-ingest.ts each run their own Cypher and none routes through
76
+ // memoryWrite, so nothing legitimate needs a bypass here.
77
+ const r = checkLabelOriginGate({
78
+ labels: ["Meeting"],
79
+ createdBy: { agent: "system" },
80
+ accountId: "acct-12345678",
81
+ tool: "memory-write",
82
+ });
83
+ expect(r.ok).toBe(false);
84
+ });
85
+ it("refuses Meeting when it rides along with another label", () => {
86
+ const r = checkLabelOriginGate({
87
+ labels: ["KnowledgeDocument", "Meeting"],
88
+ createdBy: { agent: "admin" },
89
+ accountId: "acct-12345678",
90
+ tool: "memory-write",
91
+ });
92
+ expect(r.ok).toBe(false);
93
+ });
94
+ it("still allows Note, the redirect target", () => {
95
+ const r = checkLabelOriginGate({
96
+ labels: ["Note"],
97
+ createdBy: { agent: "admin" },
98
+ accountId: "acct-12345678",
99
+ tool: "memory-write",
100
+ });
101
+ expect(r.ok).toBe(true);
102
+ });
103
+ it("leaves the LocalBusiness rule exactly as it was", () => {
104
+ const system = checkLabelOriginGate({
105
+ labels: ["LocalBusiness"],
106
+ createdBy: { agent: "system" },
107
+ accountId: "acct-12345678",
108
+ tool: "memory-write",
109
+ });
110
+ expect(system.ok).toBe(true);
111
+ });
112
+ });
50
113
  //# sourceMappingURL=label-origin-gate.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"label-origin-gate.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/label-origin-gate.test.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,GAAG,oBAAoB,CAAC;YAC7B,MAAM,EAAE,CAAC,eAAe,CAAC;YACzB,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAW;YACvC,SAAS,EAAE,eAAe;YAC1B,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,CAAC,GAAG,oBAAoB,CAAC;YAC7B,MAAM,EAAE,CAAC,eAAe,CAAC;YACzB,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAW;YACtC,SAAS,EAAE,eAAe;YAC1B,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,CAAC,EAAE;YAAE,OAAO;QACjB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC/D,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAChD,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,oBAAoB,CAAC;YAC7B,MAAM,EAAE,CAAC,cAAc,CAAC;YACxB,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAW;YACtC,SAAS,EAAE,eAAe;YAC1B,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,4EAA4E;QAC5E,MAAM,CAAC,GAAG,oBAAoB,CAAC;YAC7B,MAAM,EAAE,CAAC,eAAe,CAAC;YACzB,SAAS,EAAE,EAAW;YACtB,SAAS,EAAE,eAAe;YAC1B,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"label-origin-gate.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/label-origin-gate.test.ts"],"names":[],"mappings":"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"}