@rubytech/create-maxy-code 0.1.542 → 0.1.543

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 (320) hide show
  1. package/dist/index.js +37 -0
  2. package/package.json +1 -1
  3. package/payload/platform/lib/shared-folder/dist/index.d.ts +47 -0
  4. package/payload/platform/lib/shared-folder/dist/index.d.ts.map +1 -0
  5. package/payload/platform/lib/shared-folder/dist/index.js +93 -0
  6. package/payload/platform/lib/shared-folder/dist/index.js.map +1 -0
  7. package/payload/platform/lib/shared-folder/src/index.ts +92 -0
  8. package/payload/platform/lib/shared-folder/tsconfig.json +5 -0
  9. package/payload/platform/package.json +2 -2
  10. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +15 -1
  11. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +8 -0
  12. package/payload/platform/plugins/docs/references/access-control.md +14 -0
  13. package/payload/platform/plugins/filesystem/.claude-plugin/plugin.json +1 -1
  14. package/payload/platform/plugins/filesystem/PLUGIN.md +11 -1
  15. package/payload/platform/plugins/filesystem/mcp/dist/index.js +23 -7
  16. package/payload/platform/plugins/filesystem/mcp/dist/index.js.map +1 -1
  17. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js +104 -4
  18. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js.map +1 -1
  19. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.d.ts +2 -0
  20. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.d.ts.map +1 -0
  21. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.js +67 -0
  22. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.js.map +1 -0
  23. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts +16 -2
  24. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts.map +1 -1
  25. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js +54 -1
  26. package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js.map +1 -1
  27. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js +76 -2
  28. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js.map +1 -1
  29. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts +1 -0
  30. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts.map +1 -1
  31. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js +3 -3
  32. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js.map +1 -1
  33. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.d.ts +1 -0
  34. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.d.ts.map +1 -1
  35. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.js +1 -1
  36. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.js.map +1 -1
  37. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.d.ts +1 -0
  38. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.d.ts.map +1 -1
  39. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.js +3 -3
  40. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.js.map +1 -1
  41. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.d.ts +1 -0
  42. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.d.ts.map +1 -1
  43. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.js +3 -3
  44. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.js.map +1 -1
  45. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.d.ts +1 -0
  46. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.d.ts.map +1 -1
  47. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.js +3 -3
  48. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.js.map +1 -1
  49. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts +1 -0
  50. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts.map +1 -1
  51. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js +3 -3
  52. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js.map +1 -1
  53. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +81 -1
  54. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
  55. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +22 -0
  56. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  57. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +80 -0
  58. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  59. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +13 -1
  60. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  61. package/payload/platform/plugins/whatsapp/PLUGIN.md +2 -2
  62. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +1 -1
  63. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  64. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +1 -1
  65. package/payload/platform/scripts/check-no-esm-require.mjs +5 -0
  66. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +8 -4
  67. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -1
  68. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +27 -7
  69. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -1
  70. package/payload/platform/services/claude-session-manager/dist/config.d.ts +11 -6
  71. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  72. package/payload/platform/services/claude-session-manager/dist/config.js +8 -4
  73. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  74. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +2 -2
  75. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
  76. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +35 -0
  77. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  78. package/payload/platform/services/claude-session-manager/dist/http-server.js +136 -19
  79. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  80. package/payload/platform/services/claude-session-manager/dist/index.js +98 -26
  81. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  82. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +24 -12
  83. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  84. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +130 -27
  85. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  86. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
  87. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +4 -0
  88. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
  89. package/payload/platform/services/claude-session-manager/dist/role-census.d.ts +24 -0
  90. package/payload/platform/services/claude-session-manager/dist/role-census.d.ts.map +1 -0
  91. package/payload/platform/services/claude-session-manager/dist/role-census.js +50 -0
  92. package/payload/platform/services/claude-session-manager/dist/role-census.js.map +1 -0
  93. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +9 -2
  94. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
  95. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +13 -0
  96. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
  97. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.d.ts +67 -0
  98. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.d.ts.map +1 -1
  99. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.js +101 -19
  100. package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.js.map +1 -1
  101. package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts +19 -0
  102. package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts.map +1 -1
  103. package/payload/platform/services/claude-session-manager/dist/stuck-turn.js +37 -2
  104. package/payload/platform/services/claude-session-manager/dist/stuck-turn.js.map +1 -1
  105. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +1 -1
  106. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  107. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +9 -1
  108. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  109. package/payload/platform/services/claude-session-manager/dist/types.d.ts +9 -3
  110. package/payload/platform/services/claude-session-manager/dist/types.d.ts.map +1 -1
  111. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +105 -8
  112. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  113. package/payload/platform/services/whatsapp-channel/dist/notification.js +108 -10
  114. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  115. package/payload/platform/services/whatsapp-channel/dist/server.d.ts +18 -0
  116. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  117. package/payload/platform/services/whatsapp-channel/dist/server.js +86 -5
  118. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  119. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +38 -7
  120. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  121. package/payload/platform/services/whatsapp-channel/dist/targets.js +42 -7
  122. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  123. package/payload/platform/templates/agents/admin/INSTRUCTION.md +15 -0
  124. package/payload/server/{adminuser-self-heal-LC7HZAC6.js → adminuser-self-heal-ZHFNDKJK.js} +1 -1
  125. package/payload/server/{chunk-CKTHAHL4.js → chunk-BIHII3CT.js} +3 -2
  126. package/payload/server/{chunk-PFF6I7KP.js → chunk-HYQNUVGO.js} +8 -1
  127. package/payload/server/{chunk-HZP7BKBF.js → chunk-MGW536C5.js} +128 -4
  128. package/payload/server/{chunk-ERIM3EFB.js → chunk-RSNVIN4G.js} +1 -1
  129. package/payload/server/{manager-CM55K4J2.js → manager-GJHKO7WW.js} +3 -3
  130. package/payload/server/maxy-edge.js +3 -3
  131. package/payload/server/public/activity.html +5 -5
  132. package/payload/server/public/agents.html +4 -4
  133. package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js +1 -0
  134. package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js.br +0 -0
  135. package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js.gz +0 -0
  136. package/payload/server/public/assets/AdminShell-BeIGNC1Q.js +2 -0
  137. package/payload/server/public/assets/AdminShell-BeIGNC1Q.js.br +0 -0
  138. package/payload/server/public/assets/AdminShell-BeIGNC1Q.js.gz +0 -0
  139. package/payload/server/public/assets/activity-AaFvfwrZ.js +1 -0
  140. package/payload/server/public/assets/activity-AaFvfwrZ.js.br +0 -0
  141. package/payload/server/public/assets/activity-AaFvfwrZ.js.gz +0 -0
  142. package/payload/server/public/assets/admin-Bz34CZqL.js +1 -0
  143. package/payload/server/public/assets/admin-Bz34CZqL.js.br +0 -0
  144. package/payload/server/public/assets/admin-Bz34CZqL.js.gz +0 -0
  145. package/payload/server/public/assets/agents-N0z7qg8a.js +1 -0
  146. package/payload/server/public/assets/agents-N0z7qg8a.js.br +0 -0
  147. package/payload/server/public/assets/agents-N0z7qg8a.js.gz +0 -0
  148. package/payload/server/public/assets/browser-_k-v0iky.js +1 -0
  149. package/payload/server/public/assets/browser-_k-v0iky.js.br +0 -0
  150. package/payload/server/public/assets/browser-_k-v0iky.js.gz +0 -0
  151. package/payload/server/public/assets/calendar-D_DvVRJS.js +1 -0
  152. package/payload/server/public/assets/calendar-D_DvVRJS.js.br +0 -0
  153. package/payload/server/public/assets/calendar-D_DvVRJS.js.gz +0 -0
  154. package/payload/server/public/assets/chat-BbAsvXL_.js +1 -0
  155. package/payload/server/public/assets/chat-BbAsvXL_.js.br +1 -0
  156. package/payload/server/public/assets/chat-BbAsvXL_.js.gz +0 -0
  157. package/payload/server/public/assets/chevron-left-trZmu0ZU.js +1 -0
  158. package/payload/server/public/assets/chevron-left-trZmu0ZU.js.br +0 -0
  159. package/payload/server/public/assets/chevron-right-BiGJuNSX.js +1 -0
  160. package/payload/server/public/assets/chevron-right-BiGJuNSX.js.br +0 -0
  161. package/payload/server/public/assets/clock-DAeRdj4p.js +1 -0
  162. package/payload/server/public/assets/clock-DAeRdj4p.js.br +0 -0
  163. package/payload/server/public/assets/clock-DAeRdj4p.js.gz +0 -0
  164. package/payload/server/public/assets/{copy-3kj9Oaoc.js → copy-BDoxl3Oi.js} +1 -1
  165. package/payload/server/public/assets/copy-BDoxl3Oi.js.br +0 -0
  166. package/payload/server/public/assets/copy-BDoxl3Oi.js.gz +0 -0
  167. package/payload/server/public/assets/data-DB6T1I-w.js +1 -0
  168. package/payload/server/public/assets/data-DB6T1I-w.js.br +1 -0
  169. package/payload/server/public/assets/data-DB6T1I-w.js.gz +0 -0
  170. package/payload/server/public/assets/{file-text-CBaewT76.js → file-text-DRGn4gjH.js} +1 -1
  171. package/payload/server/public/assets/file-text-DRGn4gjH.js.br +0 -0
  172. package/payload/server/public/assets/file-text-DRGn4gjH.js.gz +0 -0
  173. package/payload/server/public/assets/{graph-B8-e2_Z-.js → graph-D7ECsLPs.js} +3 -3
  174. package/payload/server/public/assets/graph-D7ECsLPs.js.br +0 -0
  175. package/payload/server/public/assets/graph-D7ECsLPs.js.gz +0 -0
  176. package/payload/server/public/assets/{graph-labels-Bsc23eZU.js → graph-labels-ClzmLEoK.js} +1 -1
  177. package/payload/server/public/assets/graph-labels-ClzmLEoK.js.br +0 -0
  178. package/payload/server/public/assets/graph-labels-ClzmLEoK.js.gz +0 -0
  179. package/payload/server/public/assets/operator-jSdha7TP.js +1 -0
  180. package/payload/server/public/assets/operator-jSdha7TP.js.br +0 -0
  181. package/payload/server/public/assets/operator-jSdha7TP.js.gz +0 -0
  182. package/payload/server/public/assets/page-Cq4SkWbr.js +1 -0
  183. package/payload/server/public/assets/page-Cq4SkWbr.js.br +0 -0
  184. package/payload/server/public/assets/page-Cq4SkWbr.js.gz +0 -0
  185. package/payload/server/public/assets/page-DrwRXi3K.js +32 -0
  186. package/payload/server/public/assets/page-DrwRXi3K.js.br +0 -0
  187. package/payload/server/public/assets/page-DrwRXi3K.js.gz +0 -0
  188. package/payload/server/public/assets/play-CWyPEXiB.js +1 -0
  189. package/payload/server/public/assets/play-CWyPEXiB.js.br +0 -0
  190. package/payload/server/public/assets/play-CWyPEXiB.js.gz +0 -0
  191. package/payload/server/public/assets/public-D7MfkWvM.js +1 -0
  192. package/payload/server/public/assets/public-D7MfkWvM.js.br +0 -0
  193. package/payload/server/public/assets/public-D7MfkWvM.js.gz +0 -0
  194. package/payload/server/public/assets/{rotate-ccw-FZW7c8p8.js → rotate-ccw-CaWP-njL.js} +1 -1
  195. package/payload/server/public/assets/rotate-ccw-CaWP-njL.js.br +0 -0
  196. package/payload/server/public/assets/rotate-ccw-CaWP-njL.js.gz +0 -0
  197. package/payload/server/public/assets/routines-XTk0vJUD.js +2 -0
  198. package/payload/server/public/assets/routines-XTk0vJUD.js.br +0 -0
  199. package/payload/server/public/assets/routines-XTk0vJUD.js.gz +0 -0
  200. package/payload/server/public/assets/skills-sjTaAr0v.js +1 -0
  201. package/payload/server/public/assets/skills-sjTaAr0v.js.br +0 -0
  202. package/payload/server/public/assets/skills-sjTaAr0v.js.gz +0 -0
  203. package/payload/server/public/assets/tasks-D0-qwWZR.js +3 -0
  204. package/payload/server/public/assets/tasks-D0-qwWZR.js.br +0 -0
  205. package/payload/server/public/assets/tasks-D0-qwWZR.js.gz +0 -0
  206. package/payload/server/public/assets/{triangle-alert-CR-jRJdI.js → triangle-alert-BCndBPvE.js} +1 -1
  207. package/payload/server/public/assets/triangle-alert-BCndBPvE.js.br +0 -0
  208. package/payload/server/public/assets/triangle-alert-BCndBPvE.js.gz +0 -0
  209. package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js +1 -0
  210. package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js.br +0 -0
  211. package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js.gz +0 -0
  212. package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css +1 -0
  213. package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css.br +0 -0
  214. package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css.gz +0 -0
  215. package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js +14 -0
  216. package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js.br +0 -0
  217. package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js.gz +0 -0
  218. package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js +2 -0
  219. package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js.br +0 -0
  220. package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js.gz +0 -0
  221. package/payload/server/public/assets/{wrench-CpCOYUBc.js → wrench-BBl51xDU.js} +1 -1
  222. package/payload/server/public/assets/wrench-BBl51xDU.js.br +0 -0
  223. package/payload/server/public/assets/wrench-BBl51xDU.js.gz +0 -0
  224. package/payload/server/public/browser.html +4 -4
  225. package/payload/server/public/calendar.html +8 -8
  226. package/payload/server/public/chat.html +13 -13
  227. package/payload/server/public/data.html +11 -11
  228. package/payload/server/public/graph.html +9 -9
  229. package/payload/server/public/index.html +14 -14
  230. package/payload/server/public/operator.html +14 -14
  231. package/payload/server/public/public.html +13 -13
  232. package/payload/server/public/routines.html +6 -6
  233. package/payload/server/public/skills.html +5 -5
  234. package/payload/server/public/tasks.html +6 -6
  235. package/payload/server/server.js +474 -254
  236. package/payload/server/{src-JN6PIAJN.js → src-MM64CYYZ.js} +1 -1
  237. package/payload/server/{userprofile-reconcile-QHVLY2AH.js → userprofile-reconcile-TL4JKBPG.js} +1 -1
  238. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js +0 -1
  239. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.br +0 -0
  240. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.gz +0 -0
  241. package/payload/server/public/assets/AdminShell-DJL5DzRX.js +0 -2
  242. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.br +0 -0
  243. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.gz +0 -0
  244. package/payload/server/public/assets/activity-CpMnNr5c.js +0 -1
  245. package/payload/server/public/assets/activity-CpMnNr5c.js.br +0 -0
  246. package/payload/server/public/assets/activity-CpMnNr5c.js.gz +0 -0
  247. package/payload/server/public/assets/admin-CBwKIfaI.js +0 -1
  248. package/payload/server/public/assets/admin-CBwKIfaI.js.br +0 -0
  249. package/payload/server/public/assets/admin-CBwKIfaI.js.gz +0 -0
  250. package/payload/server/public/assets/agents-C4LmSKjb.js +0 -1
  251. package/payload/server/public/assets/agents-C4LmSKjb.js.br +0 -0
  252. package/payload/server/public/assets/agents-C4LmSKjb.js.gz +0 -0
  253. package/payload/server/public/assets/browser-Bm9xm_yc.js +0 -1
  254. package/payload/server/public/assets/browser-Bm9xm_yc.js.br +0 -0
  255. package/payload/server/public/assets/browser-Bm9xm_yc.js.gz +0 -0
  256. package/payload/server/public/assets/calendar-CNY9FTWe.js +0 -1
  257. package/payload/server/public/assets/calendar-CNY9FTWe.js.br +0 -0
  258. package/payload/server/public/assets/calendar-CNY9FTWe.js.gz +0 -0
  259. package/payload/server/public/assets/chat-3WoUGCTd.js +0 -1
  260. package/payload/server/public/assets/chat-3WoUGCTd.js.br +0 -0
  261. package/payload/server/public/assets/chat-3WoUGCTd.js.gz +0 -0
  262. package/payload/server/public/assets/chevron-left-BE16BJnw.js +0 -1
  263. package/payload/server/public/assets/chevron-left-BE16BJnw.js.br +0 -0
  264. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js +0 -1
  265. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js.br +0 -0
  266. package/payload/server/public/assets/clock-C4Nu2aRV.js +0 -1
  267. package/payload/server/public/assets/clock-C4Nu2aRV.js.br +0 -0
  268. package/payload/server/public/assets/copy-3kj9Oaoc.js.br +0 -0
  269. package/payload/server/public/assets/copy-3kj9Oaoc.js.gz +0 -0
  270. package/payload/server/public/assets/data-C-x5EHyi.js +0 -1
  271. package/payload/server/public/assets/data-C-x5EHyi.js.br +0 -1
  272. package/payload/server/public/assets/data-C-x5EHyi.js.gz +0 -0
  273. package/payload/server/public/assets/file-text-CBaewT76.js.br +0 -0
  274. package/payload/server/public/assets/file-text-CBaewT76.js.gz +0 -0
  275. package/payload/server/public/assets/graph-B8-e2_Z-.js.br +0 -0
  276. package/payload/server/public/assets/graph-B8-e2_Z-.js.gz +0 -0
  277. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.br +0 -0
  278. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.gz +0 -0
  279. package/payload/server/public/assets/operator-Cve0-qfO.js +0 -1
  280. package/payload/server/public/assets/operator-Cve0-qfO.js.br +0 -0
  281. package/payload/server/public/assets/operator-Cve0-qfO.js.gz +0 -0
  282. package/payload/server/public/assets/page-BgVMs6Vf.js +0 -1
  283. package/payload/server/public/assets/page-BgVMs6Vf.js.br +0 -0
  284. package/payload/server/public/assets/page-BgVMs6Vf.js.gz +0 -0
  285. package/payload/server/public/assets/page-fABub-w8.js +0 -32
  286. package/payload/server/public/assets/page-fABub-w8.js.br +0 -0
  287. package/payload/server/public/assets/page-fABub-w8.js.gz +0 -0
  288. package/payload/server/public/assets/play-B6zXB9K7.js +0 -1
  289. package/payload/server/public/assets/play-B6zXB9K7.js.br +0 -0
  290. package/payload/server/public/assets/play-B6zXB9K7.js.gz +0 -0
  291. package/payload/server/public/assets/public--R2DbdWs.js +0 -1
  292. package/payload/server/public/assets/public--R2DbdWs.js.br +0 -0
  293. package/payload/server/public/assets/public--R2DbdWs.js.gz +0 -0
  294. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.br +0 -0
  295. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.gz +0 -0
  296. package/payload/server/public/assets/routines-BpZs2SaT.js +0 -2
  297. package/payload/server/public/assets/routines-BpZs2SaT.js.br +0 -0
  298. package/payload/server/public/assets/routines-BpZs2SaT.js.gz +0 -0
  299. package/payload/server/public/assets/skills-DF7uyEEz.js +0 -1
  300. package/payload/server/public/assets/skills-DF7uyEEz.js.br +0 -0
  301. package/payload/server/public/assets/skills-DF7uyEEz.js.gz +0 -0
  302. package/payload/server/public/assets/tasks-BfJJmoWO.js +0 -3
  303. package/payload/server/public/assets/tasks-BfJJmoWO.js.br +0 -0
  304. package/payload/server/public/assets/tasks-BfJJmoWO.js.gz +0 -0
  305. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.br +0 -0
  306. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.gz +0 -0
  307. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js +0 -1
  308. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.br +0 -0
  309. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.gz +0 -0
  310. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js +0 -14
  311. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.br +0 -0
  312. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.gz +0 -0
  313. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css +0 -1
  314. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.br +0 -0
  315. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.gz +0 -0
  316. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js +0 -2
  317. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.br +0 -0
  318. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.gz +0 -0
  319. package/payload/server/public/assets/wrench-CpCOYUBc.js.br +0 -0
  320. package/payload/server/public/assets/wrench-CpCOYUBc.js.gz +0 -0
package/dist/index.js CHANGED
@@ -2577,6 +2577,12 @@ function deployPayload() {
2577
2577
  // User data lives at {installDir}/data/ — outside the platform/ wipe zone.
2578
2578
  // Install path creates this fresh; runtime writers populate it on demand.
2579
2579
  mkdirSync(join(INSTALL_DIR, "data"), { recursive: true });
2580
+ // Task 2323 — the install-wide shared folder: written by the house account,
2581
+ // read by every account. Created here rather than lazily by a writer so the
2582
+ // standing census reports exists=true from first boot, and so the pty-spawner's
2583
+ // existsSync-guarded --add-dir and write-deny are live on the first spawn.
2584
+ // Idempotent: an upgrade over an existing install leaves its contents alone.
2585
+ mkdirSync(join(INSTALL_DIR, "data", "shared"), { recursive: true });
2580
2586
  // Task 848 — on upgrade the prior server/, platform/, premium-plugins/ trees are
2581
2587
  // immutable (chattr +i). Clear all three BEFORE the wipe loop, or the rmSync of
2582
2588
  // those dirs below fails with EPERM. Gate on INSTALL_DIR existence (any prior
@@ -3480,6 +3486,37 @@ function writeInstallDefaults(accountId) {
3480
3486
  console.log(` [install-defaults] soul-md created path=${soulPath} bytes=${soulContent.length}`);
3481
3487
  logFile(` [install-defaults] soul-md created path=${soulPath} bytes=${soulContent.length}`);
3482
3488
  }
3489
+ // Admin INSTRUCTION.md is operator-controlled: it is the `## Instruction` body
3490
+ // every WhatsApp channel turn carries, so the operator owns what their agent
3491
+ // does with an inbound and can change it on disk without a publish. Create it
3492
+ // from the bundled template on a fresh install and never overwrite it, exactly
3493
+ // as SOUL.md above. install-defaults runs on upgrades too, which is what
3494
+ // backfills accounts provisioned before this file existed. There is no
3495
+ // code-level default downstream: an account with no such file has its channel
3496
+ // turns refused, so this seeding is what keeps an upgraded install working.
3497
+ //
3498
+ // Unlike the SOUL.md branch above, a missing template here logs and continues
3499
+ // rather than returning: returning would skip the public-agent seeding below.
3500
+ const instructionPath = join(accountDir, "agents/admin/INSTRUCTION.md");
3501
+ mkdirSync(dirname(instructionPath), { recursive: true });
3502
+ if (existsSync(instructionPath)) {
3503
+ const preservedBytes = statSync(instructionPath).size;
3504
+ console.log(` [install-defaults] instruction-md preserved path=${instructionPath} bytes=${preservedBytes}`);
3505
+ logFile(` [install-defaults] instruction-md preserved path=${instructionPath} bytes=${preservedBytes}`);
3506
+ }
3507
+ else {
3508
+ const instructionTemplate = join(INSTALL_DIR, "platform/templates/agents/admin/INSTRUCTION.md");
3509
+ try {
3510
+ const content = readFileSync(instructionTemplate, "utf-8").replace(/\$\{PRODUCT_NAME\}/g, BRAND.productName);
3511
+ writeFileSync(instructionPath, content);
3512
+ console.log(` [install-defaults] instruction-md created path=${instructionPath} bytes=${content.length}`);
3513
+ logFile(` [install-defaults] instruction-md created path=${instructionPath} bytes=${content.length}`);
3514
+ }
3515
+ catch (err) {
3516
+ console.error(` [install-defaults] admin-instruction template missing at ${instructionTemplate}: ${err.message}`);
3517
+ logFile(` [install-defaults] admin-instruction template missing: ${err.message}`);
3518
+ }
3519
+ }
3483
3520
  // Public agent IDENTITY.md — the only template-seeded public file, always
3484
3521
  // overwritten (Rubytech-controlled toolless directive). Per Task 618/623,
3485
3522
  // each public agent's SOUL.md, KNOWLEDGE.md, and config.json are authored
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.542",
3
+ "version": "0.1.543",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -0,0 +1,47 @@
1
+ /** The one literal. The shared root is `<dataRoot>/shared`, a sibling of
2
+ * `<dataRoot>/accounts`, so it is inside DATA_ROOT (which is what lets the
3
+ * /data browser reach it at all) but outside every account partition. */
4
+ export declare const SHARED_DIR_NAME = "shared";
5
+ /** Absolute path of the shared root. `dataRoot` is `<install>/data`. */
6
+ export declare function sharedRoot(dataRoot: string): string;
7
+ /**
8
+ * True when a DATA_ROOT-relative path is inside the shared root.
9
+ *
10
+ * FIRST SEGMENT ONLY. `accounts/<id>/shared` is an account's own directory that
11
+ * happens to be called `shared` and must keep account semantics; a deeper
12
+ * `shared` segment is likewise ordinary content. Callers pass the `relative`
13
+ * that `resolveDataPath` already produces, which is DATA_ROOT-relative.
14
+ *
15
+ * The filesystem plugin does NOT call this: its tool paths are account-relative,
16
+ * so it selects the shared root with an explicit `shared` flag instead.
17
+ */
18
+ export declare function isSharedPath(relPath: string): boolean;
19
+ export type SharedWriteDecision = {
20
+ allow: true;
21
+ } | {
22
+ reject: "shared-folder-read-only";
23
+ };
24
+ /**
25
+ * The write decision. `isHouse` is INJECTED rather than resolved here so the
26
+ * decision stays pure and unit-testable without a filesystem — the same reason
27
+ * `resolveEffectiveAccountCore` takes an injected `isValidAccountId`.
28
+ */
29
+ export declare function decideSharedWrite(isHouse: boolean): SharedWriteDecision;
30
+ /**
31
+ * Disk-backed house check for the two surfaces that have none: the `filesystem`
32
+ * plugin and the `/data` browser. Drift-safe, matching
33
+ * claude-session-manager/src/config.ts:464 — false when the census shows zero
34
+ * or more than one `role:"house"` account, because under drift there is no
35
+ * single house to grant write to.
36
+ *
37
+ * `platform/plugins/admin/mcp/src/tools/account-lifecycle.ts:85` is a SECOND,
38
+ * different definition (true for any role-house account). It is deliberately
39
+ * not consolidated here: it guards account deletion, where `true` means refuse,
40
+ * so giving it these drift semantics would make a drifted install start
41
+ * ALLOWING deletion of a house account. Consolidation is its own task.
42
+ *
43
+ * Never throws: an unreadable accounts dir or an unparseable account.json reads
44
+ * as "not house", which is the fail-closed answer for a write gate.
45
+ */
46
+ export declare function isHouseAccountDir(accountsDir: string, accountId: string): boolean;
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA;;0EAE0E;AAC1E,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,MAAM,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAE1C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAEvE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAuBjF"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SHARED_DIR_NAME = void 0;
4
+ exports.sharedRoot = sharedRoot;
5
+ exports.isSharedPath = isSharedPath;
6
+ exports.decideSharedWrite = decideSharedWrite;
7
+ exports.isHouseAccountDir = isHouseAccountDir;
8
+ // shared-folder — the single definition of the install-wide shared directory.
9
+ //
10
+ // Task 2323. Three surfaces gate on this module: the `filesystem` plugin, the
11
+ // `/data` admin browser, and the pty-spawner's native --add-dir + deny push.
12
+ // One definition, no drift — the same discipline as platform/lib/account-scope.
13
+ //
14
+ // The pure predicates never touch the filesystem, so this module is safe to
15
+ // import into an MCP server that boots with empty env during plugin-system
16
+ // `tools/list` enumeration. `isHouseAccountDir` DOES read disk, but only when
17
+ // called — nothing runs at module load.
18
+ const node_fs_1 = require("node:fs");
19
+ const node_path_1 = require("node:path");
20
+ /** The one literal. The shared root is `<dataRoot>/shared`, a sibling of
21
+ * `<dataRoot>/accounts`, so it is inside DATA_ROOT (which is what lets the
22
+ * /data browser reach it at all) but outside every account partition. */
23
+ exports.SHARED_DIR_NAME = "shared";
24
+ /** Absolute path of the shared root. `dataRoot` is `<install>/data`. */
25
+ function sharedRoot(dataRoot) {
26
+ return (0, node_path_1.resolve)(dataRoot, exports.SHARED_DIR_NAME);
27
+ }
28
+ /**
29
+ * True when a DATA_ROOT-relative path is inside the shared root.
30
+ *
31
+ * FIRST SEGMENT ONLY. `accounts/<id>/shared` is an account's own directory that
32
+ * happens to be called `shared` and must keep account semantics; a deeper
33
+ * `shared` segment is likewise ordinary content. Callers pass the `relative`
34
+ * that `resolveDataPath` already produces, which is DATA_ROOT-relative.
35
+ *
36
+ * The filesystem plugin does NOT call this: its tool paths are account-relative,
37
+ * so it selects the shared root with an explicit `shared` flag instead.
38
+ */
39
+ function isSharedPath(relPath) {
40
+ const segs = relPath.split("/").filter(Boolean);
41
+ return segs.length >= 1 && segs[0] === exports.SHARED_DIR_NAME;
42
+ }
43
+ /**
44
+ * The write decision. `isHouse` is INJECTED rather than resolved here so the
45
+ * decision stays pure and unit-testable without a filesystem — the same reason
46
+ * `resolveEffectiveAccountCore` takes an injected `isValidAccountId`.
47
+ */
48
+ function decideSharedWrite(isHouse) {
49
+ return isHouse ? { allow: true } : { reject: "shared-folder-read-only" };
50
+ }
51
+ /**
52
+ * Disk-backed house check for the two surfaces that have none: the `filesystem`
53
+ * plugin and the `/data` browser. Drift-safe, matching
54
+ * claude-session-manager/src/config.ts:464 — false when the census shows zero
55
+ * or more than one `role:"house"` account, because under drift there is no
56
+ * single house to grant write to.
57
+ *
58
+ * `platform/plugins/admin/mcp/src/tools/account-lifecycle.ts:85` is a SECOND,
59
+ * different definition (true for any role-house account). It is deliberately
60
+ * not consolidated here: it guards account deletion, where `true` means refuse,
61
+ * so giving it these drift semantics would make a drifted install start
62
+ * ALLOWING deletion of a house account. Consolidation is its own task.
63
+ *
64
+ * Never throws: an unreadable accounts dir or an unparseable account.json reads
65
+ * as "not house", which is the fail-closed answer for a write gate.
66
+ */
67
+ function isHouseAccountDir(accountsDir, accountId) {
68
+ let entries;
69
+ try {
70
+ entries = (0, node_fs_1.readdirSync)(accountsDir, { withFileTypes: true })
71
+ .filter((d) => d.isDirectory())
72
+ .map((d) => d.name);
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ const houses = [];
78
+ for (const name of entries) {
79
+ let cfg;
80
+ try {
81
+ cfg = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(accountsDir, name, "account.json"), "utf-8"));
82
+ }
83
+ catch {
84
+ continue;
85
+ }
86
+ if (cfg.role === "house")
87
+ houses.push(name);
88
+ }
89
+ if (houses.length !== 1)
90
+ return false;
91
+ return houses[0] === accountId;
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAmBA,gCAEC;AAaD,oCAGC;AAWD,8CAEC;AAkBD,8CAuBC;AA3FD,8EAA8E;AAC9E,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,gFAAgF;AAChF,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,8EAA8E;AAC9E,wCAAwC;AACxC,qCAAoD;AACpD,yCAA0C;AAE1C;;0EAE0E;AAC7D,QAAA,eAAe,GAAG,QAAQ,CAAC;AAExC,wEAAwE;AACxE,SAAgB,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAA,mBAAO,EAAC,QAAQ,EAAE,uBAAe,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,YAAY,CAAC,OAAe;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,uBAAe,CAAC;AACzD,CAAC;AAMD;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,OAAgB;IAChD,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,iBAAiB,CAAC,WAAmB,EAAE,SAAiB;IACtE,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,IAAA,qBAAW,EAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACxD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,GAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAA,gBAAI,EAAC,WAAW,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAE9E,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;AACjC,CAAC"}
@@ -0,0 +1,92 @@
1
+ // shared-folder — the single definition of the install-wide shared directory.
2
+ //
3
+ // Task 2323. Three surfaces gate on this module: the `filesystem` plugin, the
4
+ // `/data` admin browser, and the pty-spawner's native --add-dir + deny push.
5
+ // One definition, no drift — the same discipline as platform/lib/account-scope.
6
+ //
7
+ // The pure predicates never touch the filesystem, so this module is safe to
8
+ // import into an MCP server that boots with empty env during plugin-system
9
+ // `tools/list` enumeration. `isHouseAccountDir` DOES read disk, but only when
10
+ // called — nothing runs at module load.
11
+ import { readFileSync, readdirSync } from "node:fs";
12
+ import { join, resolve } from "node:path";
13
+
14
+ /** The one literal. The shared root is `<dataRoot>/shared`, a sibling of
15
+ * `<dataRoot>/accounts`, so it is inside DATA_ROOT (which is what lets the
16
+ * /data browser reach it at all) but outside every account partition. */
17
+ export const SHARED_DIR_NAME = "shared";
18
+
19
+ /** Absolute path of the shared root. `dataRoot` is `<install>/data`. */
20
+ export function sharedRoot(dataRoot: string): string {
21
+ return resolve(dataRoot, SHARED_DIR_NAME);
22
+ }
23
+
24
+ /**
25
+ * True when a DATA_ROOT-relative path is inside the shared root.
26
+ *
27
+ * FIRST SEGMENT ONLY. `accounts/<id>/shared` is an account's own directory that
28
+ * happens to be called `shared` and must keep account semantics; a deeper
29
+ * `shared` segment is likewise ordinary content. Callers pass the `relative`
30
+ * that `resolveDataPath` already produces, which is DATA_ROOT-relative.
31
+ *
32
+ * The filesystem plugin does NOT call this: its tool paths are account-relative,
33
+ * so it selects the shared root with an explicit `shared` flag instead.
34
+ */
35
+ export function isSharedPath(relPath: string): boolean {
36
+ const segs = relPath.split("/").filter(Boolean);
37
+ return segs.length >= 1 && segs[0] === SHARED_DIR_NAME;
38
+ }
39
+
40
+ export type SharedWriteDecision =
41
+ | { allow: true }
42
+ | { reject: "shared-folder-read-only" };
43
+
44
+ /**
45
+ * The write decision. `isHouse` is INJECTED rather than resolved here so the
46
+ * decision stays pure and unit-testable without a filesystem — the same reason
47
+ * `resolveEffectiveAccountCore` takes an injected `isValidAccountId`.
48
+ */
49
+ export function decideSharedWrite(isHouse: boolean): SharedWriteDecision {
50
+ return isHouse ? { allow: true } : { reject: "shared-folder-read-only" };
51
+ }
52
+
53
+ /**
54
+ * Disk-backed house check for the two surfaces that have none: the `filesystem`
55
+ * plugin and the `/data` browser. Drift-safe, matching
56
+ * claude-session-manager/src/config.ts:464 — false when the census shows zero
57
+ * or more than one `role:"house"` account, because under drift there is no
58
+ * single house to grant write to.
59
+ *
60
+ * `platform/plugins/admin/mcp/src/tools/account-lifecycle.ts:85` is a SECOND,
61
+ * different definition (true for any role-house account). It is deliberately
62
+ * not consolidated here: it guards account deletion, where `true` means refuse,
63
+ * so giving it these drift semantics would make a drifted install start
64
+ * ALLOWING deletion of a house account. Consolidation is its own task.
65
+ *
66
+ * Never throws: an unreadable accounts dir or an unparseable account.json reads
67
+ * as "not house", which is the fail-closed answer for a write gate.
68
+ */
69
+ export function isHouseAccountDir(accountsDir: string, accountId: string): boolean {
70
+ let entries: string[];
71
+ try {
72
+ entries = readdirSync(accountsDir, { withFileTypes: true })
73
+ .filter((d) => d.isDirectory())
74
+ .map((d) => d.name);
75
+ } catch {
76
+ return false;
77
+ }
78
+ const houses: string[] = [];
79
+ for (const name of entries) {
80
+ let cfg: { role?: unknown };
81
+ try {
82
+ cfg = JSON.parse(readFileSync(join(accountsDir, name, "account.json"), "utf-8")) as {
83
+ role?: unknown;
84
+ };
85
+ } catch {
86
+ continue;
87
+ }
88
+ if (cfg.role === "house") houses.push(name);
89
+ }
90
+ if (houses.length !== 1) return false;
91
+ return houses[0] === accountId;
92
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": { "outDir": "dist", "rootDir": "src" },
4
+ "include": ["src"]
5
+ }
@@ -10,8 +10,8 @@
10
10
  "pdf-lib": "^1.17.1"
11
11
  },
12
12
  "scripts": {
13
- "build": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/account-ingest-token/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/agent-slug/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p lib/routine-templates/tsconfig.json && tsc -p lib/agent-dispatch-rule/tsconfig.json && tsc -p lib/learning-constants/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && tsc -p services/webchat-channel/tsconfig.json && tsc -p services/telegram-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
14
- "build:lib": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/account-ingest-token/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/agent-slug/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p lib/routine-templates/tsconfig.json && tsc -p lib/agent-dispatch-rule/tsconfig.json",
13
+ "build": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/account-ingest-token/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/agent-slug/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/shared-folder/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p lib/routine-templates/tsconfig.json && tsc -p lib/agent-dispatch-rule/tsconfig.json && tsc -p lib/learning-constants/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && tsc -p services/webchat-channel/tsconfig.json && tsc -p services/telegram-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
14
+ "build:lib": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/account-ingest-token/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/agent-slug/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/shared-folder/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p lib/routine-templates/tsconfig.json && tsc -p lib/agent-dispatch-rule/tsconfig.json && tsc -p lib/shared-folder/tsconfig.json",
15
15
  "gen:canonical-tools": "node scripts/generate-canonical-tool-names.mjs",
16
16
  "build:memory": "tsc -p plugins/memory/mcp/tsconfig.json",
17
17
  "build:contacts": "tsc -p plugins/contacts/mcp/tsconfig.json",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what Maxy ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
4
- content-hash: sha256:4140a189871ed59fff6f5edd3c48c8836a40f6999c584a611164533d12021cd2
4
+ content-hash: sha256:16c402596ec41a4862a881217aada22c79ea15e59da8e41c624a0ab494952fc9
5
5
  brand: maxy-code
6
6
  product-name: Maxy
7
7
  ---
@@ -1661,6 +1661,20 @@ Changes are per-account and take effect immediately.
1661
1661
 
1662
1662
  Brand isolation extends to the device filesystem. Every Maxy install provisions an SMB share scoped to that brand's install folder, credentialled by the brand's install owner and the Maxy PIN. A device that hosts more than one brand carries one share per brand; tearing one brand down never exposes another brand's files. See [Samba Share](./samba.md) for the credential model, per-OS mount syntax, and peer-brand lifecycle.
1663
1663
 
1664
+ ## The Shared Folder
1665
+
1666
+ Every install has one shared folder that all accounts can see. The house account writes it; every other account reads it.
1667
+
1668
+ It exists so the house can publish something once and have every sub-account use it. Brand tokens are the first use: put the house palette, typography and report template in the shared folder, and a sub-account can produce a report in the house format without being sent a copy.
1669
+
1670
+ Ask Maxy to "put this in the shared folder" from the house account, or "read the brand tokens from the shared folder" from any account.
1671
+
1672
+ A sub-account that tries to write there is refused, and says the folder is read-only. That refusal is the correct behaviour, not a fault. If a sub-account needs something changed in the shared folder, the change is made from the house account.
1673
+
1674
+ If the install's account records are in an odd state — no house account, or more than one — the folder becomes read-only for everyone until that is resolved. This is deliberate: with no single house account there is no one whose writes should be trusted.
1675
+
1676
+ One limit worth knowing. The read-only rule covers Maxy's file tools and the Data page. It does not cover shell commands, which an account's own operator can still run against the folder on their own install. The rule is there to stop accounts from changing shared material by accident, not to defend against the person who owns the install.
1677
+
1664
1678
  ---
1665
1679
  # What Wakes a Session
1666
1680
  Source: https://docs.getmaxy.com/channel-wake-and-prompt.md
@@ -9,6 +9,14 @@ Invoked by the admin agent directly.
9
9
 
10
10
  This is the platform's release timeline, newest first. Each entry shows the date it shipped and the version it shipped in, so you can tell the operator how current their install is. To compare, read the installed version from `capabilities-here` and match it against the versions below. Keep answers high level and in plain English; this is a summary, not a full commit log.
11
11
 
12
+ ## 2026-08-01 (0.1.543)
13
+
14
+ - There is now a shared folder every account can read and only the main account can write to, and an upload route that could reach out of an account into it has been closed.
15
+ - Every timestamp on screen now shows in the account's own timezone, with a build check that stops a new one slipping back to the browser's.
16
+ - A sub-account reading its WhatsApp now resolves its own conversations, and past messages that arrived on its connection have been filed to it.
17
+ - How the assistant is told to handle a WhatsApp turn is now set per account rather than fixed in the code, seeded on install.
18
+ - A chat session that freezes is now set aside and restarted rather than left stuck.
19
+
12
20
  ## 2026-08-01 (0.1.542)
13
21
 
14
22
  - A public agent's web chat now runs in the account that owns it, including its branding, rather than always the main account. A standing check reports the same agent name claimed by two accounts.
@@ -82,3 +82,17 @@ Changes are per-account and take effect immediately.
82
82
  ## Filesystem Access (SMB Share)
83
83
 
84
84
  Brand isolation extends to the device filesystem. Every {{productName}} install provisions an SMB share scoped to that brand's install folder, credentialled by the brand's install owner and the {{productName}} PIN. A device that hosts more than one brand carries one share per brand; tearing one brand down never exposes another brand's files. See [Samba Share](./samba.md) for the credential model, per-OS mount syntax, and peer-brand lifecycle.
85
+
86
+ ## The Shared Folder
87
+
88
+ Every install has one shared folder that all accounts can see. The house account writes it; every other account reads it.
89
+
90
+ It exists so the house can publish something once and have every sub-account use it. Brand tokens are the first use: put the house palette, typography and report template in the shared folder, and a sub-account can produce a report in the house format without being sent a copy.
91
+
92
+ Ask {{productName}} to "put this in the shared folder" from the house account, or "read the brand tokens from the shared folder" from any account.
93
+
94
+ A sub-account that tries to write there is refused, and says the folder is read-only. That refusal is the correct behaviour, not a fault. If a sub-account needs something changed in the shared folder, the change is made from the house account.
95
+
96
+ If the install's account records are in an odd state — no house account, or more than one — the folder becomes read-only for everyone until that is resolved. This is deliberate: with no single house account there is no one whose writes should be trusted.
97
+
98
+ One limit worth knowing. The read-only rule covers {{productName}}'s file tools and the Data page. It does not cover shell commands, which an account's own operator can still run against the folder on their own install. The rule is there to stop accounts from changing shared material by accident, not to defend against the person who owns the install.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "filesystem",
3
- "description": "Account-scoped file access. Read, write, edit, list, glob, and grep files under the session's own account directory; the house admin may reach any sub-account's files by naming targetAccountId, gated fail-closed and confined to that account's directory.",
3
+ "description": "Account-scoped file access. Read, write, edit, list, glob, and grep files under the session's own account directory; the house admin may reach any sub-account's files by naming targetAccountId, gated fail-closed and confined to that account's directory; every account may read the install-wide shared folder via shared:true, and only the house account may write it.",
4
4
  "version": "0.1.0",
5
5
  "author": {
6
6
  "name": "Rubytech LLC"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: filesystem
3
- description: "Account-scoped file access. Read, write, edit, list, glob, and grep files under the session's own account directory; the house admin may reach any sub-account's files by naming targetAccountId, gated fail-closed and confined to that account's directory."
3
+ description: "Account-scoped file access. Read, write, edit, list, glob, and grep files under the session's own account directory; the house admin may reach any sub-account's files by naming targetAccountId, gated fail-closed and confined to that account's directory; every account may read the install-wide shared folder via shared:true, and only the house account may write it."
4
4
  tools:
5
5
  - name: file-read
6
6
  publicAllowlist: false
@@ -54,6 +54,16 @@ Omit `targetAccountId`. Every tool takes a `path` relative to your account direc
54
54
 
55
55
  Pass `targetAccountId` to operate on a sub-account's directory. This is honoured only for a house-scoped admin session. A sub-account, specialist, or public session that passes `targetAccountId` is refused with `cross-account-denied`; an account id that is not provisioned on disk is refused with `cross-account-target-not-provisioned`. The validity check re-scans the accounts dir on a miss, so a sub-account created at runtime this session resolves without a service restart (a stale boot-time cache no longer masks it). Use this to inspect or repair a client account's files from the house session without switching accounts.
56
56
 
57
+ ## Shared folder
58
+
59
+ Pass `shared: true` to operate on the install-wide shared folder at `data/shared/` instead of an account directory. `path` is then relative to the shared root.
60
+
61
+ Every account reads it: `file-read`, `file-list`, `file-glob` and `file-grep` are open to any session. Only the house account writes it: `file-write` and `file-edit` from any other account are refused with `shared-folder-read-only`. House-ness here is the account, not the session role, so a house specialist writes too. Under account-census drift (no house, or more than one) no account may write.
62
+
63
+ `shared: true` together with `targetAccountId` is refused with `shared-and-target-exclusive` — `targetAccountId` selects an account root, and the shared folder is not an account. An install whose shared folder is missing refuses every shared call with `shared-folder-absent`; the installer creates the folder, and no tool call creates it on demand.
64
+
65
+ Containment is identical to the account case: a path that escapes the shared root, including through a symlink into an account directory, is rejected before any filesystem operation.
66
+
57
67
  ## Boundaries
58
68
 
59
69
  Every path is confined to the resolved account directory. A path that escapes it — `../`, an absolute path outside the account root, or a symlink pointing out — is rejected before any filesystem operation. Reads and greps skip files over 5 MB; grep skips binary files.
@@ -22,6 +22,10 @@ const ownAccountId = process.env.ACCOUNT_ID ?? null;
22
22
  // literal ${HOUSE_ADMIN_SCOPE} placeholder or an empty value as a real scope.
23
23
  const houseScope = readPluginHouseScope(process.env);
24
24
  const platformRoot = process.env.PLATFORM_ROOT ?? "";
25
+ // Task 2323 — the `sid=` correlation key on every [shared] line. Declared in
26
+ // this plugin's PLUGIN.md env block, so it is present on a real spawn and
27
+ // absent only in the metadata-only boot, where no call reaches a file op.
28
+ const sessionId = process.env.SESSION_ID ?? null;
25
29
  process.stderr.write(`[filesystem] boot accountId=${ownAccountId ?? "null"} houseScope=${houseScope ? "set" : "null"}\n`);
26
30
  function refuseNoAccount(toolName) {
27
31
  process.stderr.write(`[filesystem] tool=${toolName} refuse reason=no-account-context\n`);
@@ -41,45 +45,57 @@ function refuseNoAccount(toolName) {
41
45
  function ctx() {
42
46
  if (!ownAccountId || !platformRoot)
43
47
  return null;
44
- return { ownAccountId, houseScope, accountsDir: resolve(platformRoot, "..", "data/accounts") };
48
+ return {
49
+ ownAccountId,
50
+ houseScope,
51
+ accountsDir: resolve(platformRoot, "..", "data/accounts"),
52
+ sessionId,
53
+ };
45
54
  }
46
55
  const targetArg = z
47
56
  .string()
48
57
  .optional()
49
58
  .describe("House admin only: a sub-account ID to operate on. Omit to operate on your own account. A non-house session that passes this is denied (cross-account-denied).");
50
- eagerTool(server, "file-read", "Read a UTF-8 file under the account directory. Pass a path relative to the account root; pass targetAccountId (house admin only) to read a sub-account's file.", { path: z.string().describe("Path relative to the account directory"), targetAccountId: targetArg }, async (a) => {
59
+ const sharedArg = z
60
+ .boolean()
61
+ .optional()
62
+ .describe("Operate on the install-wide shared folder instead of an account directory. Every account may read it; only the house account may write. Cannot be combined with targetAccountId (shared-and-target-exclusive).");
63
+ eagerTool(server, "file-read", "Read a UTF-8 file under the account directory. Pass a path relative to the account root; pass targetAccountId (house admin only) to read a sub-account's file; pass shared:true to read the install-wide shared folder, which every account may read.", { path: z.string().describe("Path relative to the account directory"), targetAccountId: targetArg, shared: sharedArg }, async (a) => {
51
64
  const c = ctx();
52
65
  return c ? fileRead(a, c) : refuseNoAccount("file-read");
53
66
  });
54
- eagerTool(server, "file-write", "Write (create or overwrite) a UTF-8 file under the account directory, creating parent directories as needed.", {
67
+ eagerTool(server, "file-write", "Write (create or overwrite) a UTF-8 file under the account directory, creating parent directories as needed. With shared:true the target is the install-wide shared folder, which is read-only unless you are the house account.", {
55
68
  path: z.string().describe("Path relative to the account directory"),
56
69
  content: z.string().describe("Full file contents to write"),
57
70
  targetAccountId: targetArg,
71
+ shared: sharedArg,
58
72
  }, async (a) => {
59
73
  const c = ctx();
60
74
  return c ? fileWrite(a, c) : refuseNoAccount("file-write");
61
75
  });
62
- eagerTool(server, "file-edit", "Replace a single unique occurrence of oldString with newString in a file under the account directory. Fails if oldString is absent or matches more than once.", {
76
+ eagerTool(server, "file-edit", "Replace a single unique occurrence of oldString with newString in a file under the account directory. Fails if oldString is absent or matches more than once. With shared:true the target is the install-wide shared folder, which is read-only unless you are the house account.", {
63
77
  path: z.string().describe("Path relative to the account directory"),
64
78
  oldString: z.string().describe("Exact text to replace (must occur exactly once)"),
65
79
  newString: z.string().describe("Replacement text"),
66
80
  targetAccountId: targetArg,
81
+ shared: sharedArg,
67
82
  }, async (a) => {
68
83
  const c = ctx();
69
84
  return c ? fileEdit(a, c) : refuseNoAccount("file-edit");
70
85
  });
71
- eagerTool(server, "file-list", "List the entries of a directory under the account directory (name + type). Omit path to list the account root.", { path: z.string().optional().describe("Directory relative to the account root"), targetAccountId: targetArg }, async (a) => {
86
+ eagerTool(server, "file-list", "List the entries of a directory under the account directory (name + type). Omit path to list the account root; pass shared:true to list the install-wide shared folder.", { path: z.string().optional().describe("Directory relative to the account root"), targetAccountId: targetArg, shared: sharedArg }, async (a) => {
72
87
  const c = ctx();
73
88
  return c ? fileList(a, c) : refuseNoAccount("file-list");
74
89
  });
75
- eagerTool(server, "file-glob", "List files under the account directory matching a glob (**, *, ?), returned as paths relative to the account root.", { pattern: z.string().describe("Glob pattern, e.g. **/*.md"), targetAccountId: targetArg }, async (a) => {
90
+ eagerTool(server, "file-glob", "List files under the account directory matching a glob (**, *, ?), returned as paths relative to the account root; pass shared:true to glob the install-wide shared folder.", { pattern: z.string().describe("Glob pattern, e.g. **/*.md"), targetAccountId: targetArg, shared: sharedArg }, async (a) => {
76
91
  const c = ctx();
77
92
  return c ? fileGlob(a, c) : refuseNoAccount("file-glob");
78
93
  });
79
- eagerTool(server, "file-grep", "Search file contents under the account directory for a JavaScript regular expression, returning file:line:preview matches. Omit path to search the whole account.", {
94
+ eagerTool(server, "file-grep", "Search file contents under the account directory for a JavaScript regular expression, returning file:line:preview matches. Omit path to search the whole account; pass shared:true to search the install-wide shared folder.", {
80
95
  pattern: z.string().describe("JavaScript regular expression"),
81
96
  path: z.string().optional().describe("Subdirectory (relative) to limit the search"),
82
97
  targetAccountId: targetArg,
98
+ shared: sharedArg,
83
99
  }, async (a) => {
84
100
  const c = ctx();
85
101
  return c ? fileGrep(a, c) : refuseNoAccount("file-grep");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}