@rubytech/create-realagent-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 (345) 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/whatsapp/references/channels-whatsapp.md +12 -0
  134. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts +36 -5
  135. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts.map +1 -1
  136. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js +103 -10
  137. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js.map +1 -1
  138. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  139. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +2 -0
  140. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  141. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  142. package/payload/platform/services/claude-session-manager/dist/http-server.js +42 -4
  143. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  144. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  145. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +19 -5
  146. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  147. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +9 -0
  148. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  149. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +5 -1
  150. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  151. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  152. package/payload/platform/services/telegram-channel/dist/instructions.js +13 -0
  153. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  154. package/payload/platform/services/telegram-channel/dist/notification.d.ts +40 -0
  155. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  156. package/payload/platform/services/telegram-channel/dist/notification.js +41 -4
  157. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  158. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +52 -0
  159. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  160. package/payload/platform/services/whatsapp-channel/dist/notification.js +64 -1
  161. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  162. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  163. package/payload/platform/services/whatsapp-channel/dist/server.js +14 -2
  164. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  165. package/payload/platform/templates/account-schema/SCHEMA.md +17 -10
  166. package/payload/platform/templates/agents/admin/IDENTITY.md +5 -0
  167. package/payload/platform/templates/specialists/agents/data-manager.md +2 -2
  168. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  169. package/payload/server/{chunk-BFRB2U75.js → chunk-CV6AEMKH.js} +1 -0
  170. package/payload/server/{manager-CTVTF4YB.js → manager-FQSQSSJ3.js} +1 -1
  171. package/payload/server/public/activity.html +6 -6
  172. package/payload/server/public/agents.html +5 -5
  173. package/payload/server/public/assets/{AdminLoginScreens-B1lu4-_F.js → AdminLoginScreens-BLsDYWVi.js} +1 -1
  174. package/payload/server/public/assets/AdminLoginScreens-BLsDYWVi.js.br +0 -0
  175. package/payload/server/public/assets/AdminLoginScreens-BLsDYWVi.js.gz +0 -0
  176. package/payload/server/public/assets/{AdminShell-BMslfZxN.js → AdminShell-BZS8jzFA.js} +1 -1
  177. package/payload/server/public/assets/AdminShell-BZS8jzFA.js.br +0 -0
  178. package/payload/server/public/assets/AdminShell-BZS8jzFA.js.gz +0 -0
  179. package/payload/server/public/assets/{activity-kQ3w70LJ.js → activity-DOjvoLdd.js} +1 -1
  180. package/payload/server/public/assets/activity-DOjvoLdd.js.br +0 -0
  181. package/payload/server/public/assets/activity-DOjvoLdd.js.gz +0 -0
  182. package/payload/server/public/assets/{admin-CkASgYA7.js → admin-JrSNg29g.js} +1 -1
  183. package/payload/server/public/assets/admin-JrSNg29g.js.br +0 -0
  184. package/payload/server/public/assets/admin-JrSNg29g.js.gz +0 -0
  185. package/payload/server/public/assets/{agents-Cn_bZgnD.js → agents--9WMJVLC.js} +1 -1
  186. package/payload/server/public/assets/agents--9WMJVLC.js.br +0 -0
  187. package/payload/server/public/assets/agents--9WMJVLC.js.gz +0 -0
  188. package/payload/server/public/assets/{browser-BE-GDk5-.js → browser-DiiMmTrM.js} +1 -1
  189. package/payload/server/public/assets/browser-DiiMmTrM.js.br +0 -0
  190. package/payload/server/public/assets/browser-DiiMmTrM.js.gz +0 -0
  191. package/payload/server/public/assets/{calendar-Di7BEHHN.js → calendar-CazmCzgO.js} +1 -1
  192. package/payload/server/public/assets/calendar-CazmCzgO.js.br +0 -0
  193. package/payload/server/public/assets/calendar-CazmCzgO.js.gz +0 -0
  194. package/payload/server/public/assets/chat-CB0TcyXX.js +1 -0
  195. package/payload/server/public/assets/chat-CB0TcyXX.js.br +0 -0
  196. package/payload/server/public/assets/chat-CB0TcyXX.js.gz +0 -0
  197. package/payload/server/public/assets/chevron-left-0tVo23Dh.js +1 -0
  198. package/payload/server/public/assets/chevron-left-0tVo23Dh.js.br +0 -0
  199. package/payload/server/public/assets/clock-D2cZ0sge.js +1 -0
  200. package/payload/server/public/assets/clock-D2cZ0sge.js.br +0 -0
  201. package/payload/server/public/assets/clock-D2cZ0sge.js.gz +0 -0
  202. package/payload/server/public/assets/{copy-nkxspu2J.js → copy-C87QIN_o.js} +1 -1
  203. package/payload/server/public/assets/copy-C87QIN_o.js.br +0 -0
  204. package/payload/server/public/assets/copy-C87QIN_o.js.gz +0 -0
  205. package/payload/server/public/assets/data-CK7AMxPt.js +1 -0
  206. package/payload/server/public/assets/data-CK7AMxPt.js.br +0 -0
  207. package/payload/server/public/assets/data-CK7AMxPt.js.gz +0 -0
  208. package/payload/server/public/assets/{field-2rIXxGMt.js → field-C3kQgGWE.js} +1 -1
  209. package/payload/server/public/assets/field-C3kQgGWE.js.br +0 -0
  210. package/payload/server/public/assets/field-C3kQgGWE.js.gz +0 -0
  211. package/payload/server/public/assets/{file-text-CdSqrscg.js → file-text-rWowl9RN.js} +1 -1
  212. package/payload/server/public/assets/file-text-rWowl9RN.js.br +0 -0
  213. package/payload/server/public/assets/file-text-rWowl9RN.js.gz +0 -0
  214. package/payload/server/public/assets/{graph-BfBHHXaC.js → graph-CVJKz1Uo.js} +1 -1
  215. package/payload/server/public/assets/graph-CVJKz1Uo.js.br +0 -0
  216. package/payload/server/public/assets/graph-CVJKz1Uo.js.gz +0 -0
  217. package/payload/server/public/assets/{graph-labels-CHW2aBke.js → graph-labels-kneGnsHB.js} +1 -1
  218. package/payload/server/public/assets/graph-labels-kneGnsHB.js.br +0 -0
  219. package/payload/server/public/assets/graph-labels-kneGnsHB.js.gz +0 -0
  220. package/payload/server/public/assets/{jsx-runtime-D43jgaWP.css → jsx-runtime-rMaiYjNu.css} +1 -1
  221. package/payload/server/public/assets/jsx-runtime-rMaiYjNu.css.br +0 -0
  222. package/payload/server/public/assets/{jsx-runtime-D43jgaWP.css.gz → jsx-runtime-rMaiYjNu.css.gz} +0 -0
  223. package/payload/server/public/assets/{operator-DRn9LITC.js → operator-BGvB4hu4.js} +1 -1
  224. package/payload/server/public/assets/operator-BGvB4hu4.js.br +0 -0
  225. package/payload/server/public/assets/operator-BGvB4hu4.js.gz +0 -0
  226. package/payload/server/public/assets/{page-D_9mPS6W.js → page-DBQLOasI.js} +1 -1
  227. package/payload/server/public/assets/page-DBQLOasI.js.br +0 -0
  228. package/payload/server/public/assets/page-DBQLOasI.js.gz +0 -0
  229. package/payload/server/public/assets/{page-BwqQsoU8.js → page-DyVAu7tm.js} +1 -1
  230. package/payload/server/public/assets/page-DyVAu7tm.js.br +0 -0
  231. package/payload/server/public/assets/page-DyVAu7tm.js.gz +0 -0
  232. package/payload/server/public/assets/play-DgP7vl0r.js +1 -0
  233. package/payload/server/public/assets/play-DgP7vl0r.js.br +0 -0
  234. package/payload/server/public/assets/play-DgP7vl0r.js.gz +0 -0
  235. package/payload/server/public/assets/{public-CrjZYpdW.js → public-BvUQR3hd.js} +1 -1
  236. package/payload/server/public/assets/public-BvUQR3hd.js.br +0 -0
  237. package/payload/server/public/assets/public-BvUQR3hd.js.gz +0 -0
  238. package/payload/server/public/assets/{rotate-ccw-J9f-GWjm.js → rotate-ccw-Dnn7gbPh.js} +1 -1
  239. package/payload/server/public/assets/rotate-ccw-Dnn7gbPh.js.br +0 -0
  240. package/payload/server/public/assets/rotate-ccw-Dnn7gbPh.js.gz +0 -0
  241. package/payload/server/public/assets/{routines-C1AB-3FR.js → routines-N8NmxPOZ.js} +1 -1
  242. package/payload/server/public/assets/routines-N8NmxPOZ.js.br +0 -0
  243. package/payload/server/public/assets/routines-N8NmxPOZ.js.gz +0 -0
  244. package/payload/server/public/assets/{skills-C4EfNKEx.js → skills-B2CRgO-U.js} +1 -1
  245. package/payload/server/public/assets/skills-B2CRgO-U.js.br +0 -0
  246. package/payload/server/public/assets/skills-B2CRgO-U.js.gz +0 -0
  247. package/payload/server/public/assets/{tasks-DszD3aZl.js → tasks-8QLGtlSj.js} +1 -1
  248. package/payload/server/public/assets/tasks-8QLGtlSj.js.br +0 -0
  249. package/payload/server/public/assets/tasks-8QLGtlSj.js.gz +0 -0
  250. package/payload/server/public/assets/{triangle-alert-B5WAyAkC.js → triangle-alert-el772yUQ.js} +1 -1
  251. package/payload/server/public/assets/triangle-alert-el772yUQ.js.br +0 -0
  252. package/payload/server/public/assets/triangle-alert-el772yUQ.js.gz +0 -0
  253. package/payload/server/public/assets/{useCopyFeedback-B2nuNNJw.js → useCopyFeedback-DfNAu8hQ.js} +1 -1
  254. package/payload/server/public/assets/useCopyFeedback-DfNAu8hQ.js.br +0 -0
  255. package/payload/server/public/assets/useCopyFeedback-DfNAu8hQ.js.gz +0 -0
  256. package/payload/server/public/assets/{useMediaQuery-DUPJPHQt.js → useMediaQuery-B469O83-.js} +1 -1
  257. package/payload/server/public/assets/useMediaQuery-B469O83-.js.br +0 -0
  258. package/payload/server/public/assets/useMediaQuery-B469O83-.js.gz +0 -0
  259. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js +2 -0
  260. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js.br +0 -0
  261. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js.gz +0 -0
  262. package/payload/server/public/assets/{wrench-DZJZm17j.js → wrench-Ck4phkdB.js} +1 -1
  263. package/payload/server/public/assets/wrench-Ck4phkdB.js.br +0 -0
  264. package/payload/server/public/assets/wrench-Ck4phkdB.js.gz +0 -0
  265. package/payload/server/public/browser.html +5 -5
  266. package/payload/server/public/calendar.html +8 -8
  267. package/payload/server/public/chat.html +14 -14
  268. package/payload/server/public/data.html +12 -12
  269. package/payload/server/public/field.html +3 -3
  270. package/payload/server/public/graph.html +10 -10
  271. package/payload/server/public/index.html +14 -14
  272. package/payload/server/public/operator.html +15 -15
  273. package/payload/server/public/public.html +14 -14
  274. package/payload/server/public/routines.html +8 -8
  275. package/payload/server/public/skills.html +6 -6
  276. package/payload/server/public/tasks.html +7 -7
  277. package/payload/server/server.js +3777 -1258
  278. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.br +0 -0
  279. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.gz +0 -0
  280. package/payload/server/public/assets/AdminShell-BMslfZxN.js.br +0 -0
  281. package/payload/server/public/assets/AdminShell-BMslfZxN.js.gz +0 -0
  282. package/payload/server/public/assets/activity-kQ3w70LJ.js.br +0 -0
  283. package/payload/server/public/assets/activity-kQ3w70LJ.js.gz +0 -0
  284. package/payload/server/public/assets/admin-CkASgYA7.js.br +0 -0
  285. package/payload/server/public/assets/admin-CkASgYA7.js.gz +0 -0
  286. package/payload/server/public/assets/agents-Cn_bZgnD.js.br +0 -0
  287. package/payload/server/public/assets/agents-Cn_bZgnD.js.gz +0 -0
  288. package/payload/server/public/assets/browser-BE-GDk5-.js.br +0 -0
  289. package/payload/server/public/assets/browser-BE-GDk5-.js.gz +0 -0
  290. package/payload/server/public/assets/calendar-Di7BEHHN.js.br +0 -0
  291. package/payload/server/public/assets/calendar-Di7BEHHN.js.gz +0 -0
  292. package/payload/server/public/assets/chat-CKyMT5Ai.js +0 -1
  293. package/payload/server/public/assets/chat-CKyMT5Ai.js.br +0 -1
  294. package/payload/server/public/assets/chat-CKyMT5Ai.js.gz +0 -0
  295. package/payload/server/public/assets/chevron-left-Id9VAZAz.js +0 -1
  296. package/payload/server/public/assets/chevron-left-Id9VAZAz.js.br +0 -0
  297. package/payload/server/public/assets/clock-DKpWWJbJ.js +0 -1
  298. package/payload/server/public/assets/clock-DKpWWJbJ.js.br +0 -0
  299. package/payload/server/public/assets/copy-nkxspu2J.js.br +0 -0
  300. package/payload/server/public/assets/copy-nkxspu2J.js.gz +0 -0
  301. package/payload/server/public/assets/data-1c33cAHp.js +0 -1
  302. package/payload/server/public/assets/data-1c33cAHp.js.br +0 -2
  303. package/payload/server/public/assets/data-1c33cAHp.js.gz +0 -0
  304. package/payload/server/public/assets/field-2rIXxGMt.js.br +0 -0
  305. package/payload/server/public/assets/field-2rIXxGMt.js.gz +0 -0
  306. package/payload/server/public/assets/file-text-CdSqrscg.js.br +0 -0
  307. package/payload/server/public/assets/file-text-CdSqrscg.js.gz +0 -0
  308. package/payload/server/public/assets/graph-BfBHHXaC.js.br +0 -0
  309. package/payload/server/public/assets/graph-BfBHHXaC.js.gz +0 -0
  310. package/payload/server/public/assets/graph-labels-CHW2aBke.js.br +0 -0
  311. package/payload/server/public/assets/graph-labels-CHW2aBke.js.gz +0 -0
  312. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.br +0 -0
  313. package/payload/server/public/assets/operator-DRn9LITC.js.br +0 -0
  314. package/payload/server/public/assets/operator-DRn9LITC.js.gz +0 -0
  315. package/payload/server/public/assets/page-BwqQsoU8.js.br +0 -0
  316. package/payload/server/public/assets/page-BwqQsoU8.js.gz +0 -0
  317. package/payload/server/public/assets/page-D_9mPS6W.js.br +0 -0
  318. package/payload/server/public/assets/page-D_9mPS6W.js.gz +0 -0
  319. package/payload/server/public/assets/play-7LTxCuLX.js +0 -1
  320. package/payload/server/public/assets/play-7LTxCuLX.js.br +0 -0
  321. package/payload/server/public/assets/play-7LTxCuLX.js.gz +0 -0
  322. package/payload/server/public/assets/public-CrjZYpdW.js.br +0 -0
  323. package/payload/server/public/assets/public-CrjZYpdW.js.gz +0 -0
  324. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.br +0 -0
  325. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.gz +0 -0
  326. package/payload/server/public/assets/routines-C1AB-3FR.js.br +0 -0
  327. package/payload/server/public/assets/routines-C1AB-3FR.js.gz +0 -0
  328. package/payload/server/public/assets/skills-C4EfNKEx.js.br +0 -0
  329. package/payload/server/public/assets/skills-C4EfNKEx.js.gz +0 -0
  330. package/payload/server/public/assets/tasks-DszD3aZl.js.br +0 -0
  331. package/payload/server/public/assets/tasks-DszD3aZl.js.gz +0 -0
  332. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.br +0 -4
  333. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.gz +0 -0
  334. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.br +0 -0
  335. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.gz +0 -0
  336. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.br +0 -0
  337. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.gz +0 -0
  338. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js +0 -2
  339. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.br +0 -0
  340. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.gz +0 -0
  341. package/payload/server/public/assets/wrench-DZJZm17j.js.br +0 -0
  342. package/payload/server/public/assets/wrench-DZJZm17j.js.gz +0 -0
  343. /package/payload/server/public/assets/{jsx-runtime-Cjug_Cyb.js → jsx-runtime-BmNepPEn.js} +0 -0
  344. /package/payload/server/public/assets/{jsx-runtime-Cjug_Cyb.js.br → jsx-runtime-BmNepPEn.js.br} +0 -0
  345. /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":"AAAA,8EAA8E;AAC9E,kFAAkF;AAClF,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,gFAAgF;AAChF,6DAA6D;AAC7D,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,kFAAkF;AAClF,gFAAgF;AAChF,kFAAkF;AAClF,QAAQ;AACR,EAAE;AACF,8EAA8E;AAC9E,kFAAkF;AAClF,4DAA4D;AAC5D,EAAE;AACF,iFAAiF;AACjF,kFAAkF;AAClF,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepD;0EAC0E;AAC1E,SAAS,KAAK,CAAC,MAAc,EAAE,IAAY;IACzC,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IAClD,IAAI,EAAE,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,OAAO,MAAM;SACV,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;SACxB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;yBAEyB;AACzB,SAAS,MAAM,CAAC,KAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;;YAC7B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,SAAS,GAAG,cAAc,CAAC;AACjC,MAAM,OAAO,GAAG,6BAA6B,CAAC;AAC9C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AAExE,MAAM,MAAM,GAAG,CAAC,MAAoB,EAAE,OAAe,EAAE,OAAe,EAAiB,EAAE;IACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,WAAW,MAAM,IAAI,CAAC,CAAC;IAC9E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,SAAiB;IACxD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7D,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,aAAqB;IACpE,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAErB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CACX,WAAW,EACX,OAAO,EACP,IAAI,IAAI,6OAA6O,CACtP,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,MAAM,CACX,mBAAmB,EACnB,OAAO,EACP,IAAI,IAAI,yDAAyD,GAAG,4CAA4C,CACjH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,MAAM,CACX,eAAe,EACf,OAAO,EACP,IAAI,IAAI,qCAAqC,KAAK,oNAAoN,CACvQ,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,2EAA2E;IAC3E,2CAA2C;IAC3C,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;QAC5D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,OAAO,MAAM,CACX,WAAW,EACX,OAAO,EACP,GAAG,IAAI,qHAAqH,OAAO,wFAAwF,IAAI,kBAAkB,IAAI,kFAAkF,CACxU,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,MAAM,CACX,WAAW,EACX,OAAO,EACP,+CAA+C,OAAO,uHAAuH,CAC9K,CAAC;QACJ,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,2CAA2C;IAC3C,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAChC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,MAAM,CACX,UAAU,EACV,OAAO,EACP,IAAI,CAAC,6RAA6R,CACnS,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -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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"}