@rubytech/create-realagent-code 0.1.579 → 0.1.581

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 (221) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/telegram-media/dist/index.d.ts +45 -0
  3. package/payload/platform/lib/telegram-media/dist/index.d.ts.map +1 -0
  4. package/payload/platform/lib/telegram-media/dist/index.js +89 -0
  5. package/payload/platform/lib/telegram-media/dist/index.js.map +1 -0
  6. package/payload/platform/lib/telegram-media/src/__tests__/telegram-media.test.ts +104 -0
  7. package/payload/platform/lib/telegram-media/src/index.ts +102 -0
  8. package/payload/platform/lib/telegram-media/tsconfig.json +9 -0
  9. package/payload/platform/lib/telegram-media/vitest.config.ts +9 -0
  10. package/payload/platform/package.json +2 -2
  11. package/payload/platform/plugins/admin/PLUGIN.md +2 -2
  12. package/payload/platform/plugins/admin/hooks/__tests__/archive-ingest-surface-gate.test.sh +22 -0
  13. package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +34 -0
  14. package/payload/platform/plugins/admin/hooks/__tests__/quote-path-write-gate.test.sh +25 -0
  15. package/payload/platform/plugins/admin/hooks/archive-ingest-surface-gate.sh +11 -4
  16. package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +2 -2
  17. package/payload/platform/plugins/admin/hooks/quote-path-write-gate.sh +6 -3
  18. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +13 -1
  19. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +16 -0
  20. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-schema-shape.test.ts +23 -0
  21. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visit-status-write.test.ts +175 -3
  22. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visits-scope.test.ts +101 -0
  23. package/payload/platform/plugins/cloudflare/skills/data-portal/schema.sql +35 -1
  24. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visit-status.ts +73 -8
  25. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visits.ts +59 -8
  26. package/payload/platform/plugins/docs/references/telegram-guide.md +12 -0
  27. package/payload/platform/scripts/__tests__/hook-matcher-dispatch.test.sh +163 -0
  28. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  29. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +7 -1
  30. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  31. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  32. package/payload/platform/services/telegram-channel/dist/instructions.js +15 -1
  33. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  34. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  35. package/payload/server/{adminuser-self-heal-Y4U3UNKF.js → adminuser-self-heal-ZHFNDKJK.js} +2 -10
  36. package/payload/server/{chunk-637C2FGE.js → chunk-BFRB2U75.js} +3278 -3381
  37. package/payload/server/{chunk-6DQCFP2E.js → chunk-BTXRBXMU.js} +3785 -4090
  38. package/payload/server/{chunk-KVR2FT6O.js → chunk-HYQNUVGO.js} +1 -12
  39. package/payload/server/{chunk-PGGGWUBM.js → chunk-SKYZG6OT.js} +224 -372
  40. package/payload/server/{manager-R3XH3BNM.js → manager-CTVTF4YB.js} +3 -3
  41. package/payload/server/maxy-edge.js +4 -27
  42. package/payload/server/public/activity.html +6 -6
  43. package/payload/server/public/agents.html +5 -5
  44. package/payload/server/public/assets/{AdminLoginScreens-Bus-Y-rG.js → AdminLoginScreens-B1lu4-_F.js} +1 -1
  45. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.br +0 -0
  46. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.gz +0 -0
  47. package/payload/server/public/assets/{AdminShell-Bsm7q3CW.js → AdminShell-BMslfZxN.js} +1 -1
  48. package/payload/server/public/assets/AdminShell-BMslfZxN.js.br +0 -0
  49. package/payload/server/public/assets/AdminShell-BMslfZxN.js.gz +0 -0
  50. package/payload/server/public/assets/{activity-BWqrCyYM.js → activity-kQ3w70LJ.js} +1 -1
  51. package/payload/server/public/assets/activity-kQ3w70LJ.js.br +0 -0
  52. package/payload/server/public/assets/activity-kQ3w70LJ.js.gz +0 -0
  53. package/payload/server/public/assets/{admin-zly7Y6EZ.js → admin-CkASgYA7.js} +1 -1
  54. package/payload/server/public/assets/admin-CkASgYA7.js.br +0 -0
  55. package/payload/server/public/assets/admin-CkASgYA7.js.gz +0 -0
  56. package/payload/server/public/assets/{agents-BsxGD1V1.js → agents-Cn_bZgnD.js} +1 -1
  57. package/payload/server/public/assets/agents-Cn_bZgnD.js.br +0 -0
  58. package/payload/server/public/assets/agents-Cn_bZgnD.js.gz +0 -0
  59. package/payload/server/public/assets/{browser-CRLxTaw2.js → browser-BE-GDk5-.js} +1 -1
  60. package/payload/server/public/assets/browser-BE-GDk5-.js.br +0 -0
  61. package/payload/server/public/assets/browser-BE-GDk5-.js.gz +0 -0
  62. package/payload/server/public/assets/{calendar-Bmp6qI_P.js → calendar-Di7BEHHN.js} +1 -1
  63. package/payload/server/public/assets/calendar-Di7BEHHN.js.br +0 -0
  64. package/payload/server/public/assets/calendar-Di7BEHHN.js.gz +0 -0
  65. package/payload/server/public/assets/chat-CKyMT5Ai.js +1 -0
  66. package/payload/server/public/assets/chat-CKyMT5Ai.js.br +1 -0
  67. package/payload/server/public/assets/chat-CKyMT5Ai.js.gz +0 -0
  68. package/payload/server/public/assets/chevron-left-Id9VAZAz.js +1 -0
  69. package/payload/server/public/assets/chevron-left-Id9VAZAz.js.br +0 -0
  70. package/payload/server/public/assets/clock-DKpWWJbJ.js +1 -0
  71. package/payload/server/public/assets/clock-DKpWWJbJ.js.br +0 -0
  72. package/payload/server/public/assets/{copy-Bcjpxqzn.js → copy-nkxspu2J.js} +1 -1
  73. package/payload/server/public/assets/copy-nkxspu2J.js.br +0 -0
  74. package/payload/server/public/assets/copy-nkxspu2J.js.gz +0 -0
  75. package/payload/server/public/assets/data-1c33cAHp.js +1 -0
  76. package/payload/server/public/assets/data-1c33cAHp.js.br +2 -0
  77. package/payload/server/public/assets/data-1c33cAHp.js.gz +0 -0
  78. package/payload/server/public/assets/{field-ChKB2l_d.js → field-2rIXxGMt.js} +1 -1
  79. package/payload/server/public/assets/field-2rIXxGMt.js.br +0 -0
  80. package/payload/server/public/assets/field-2rIXxGMt.js.gz +0 -0
  81. package/payload/server/public/assets/{file-text-COZcf7mU.js → file-text-CdSqrscg.js} +1 -1
  82. package/payload/server/public/assets/file-text-CdSqrscg.js.br +0 -0
  83. package/payload/server/public/assets/file-text-CdSqrscg.js.gz +0 -0
  84. package/payload/server/public/assets/{graph-nnV47iqM.js → graph-BfBHHXaC.js} +1 -1
  85. package/payload/server/public/assets/graph-BfBHHXaC.js.br +0 -0
  86. package/payload/server/public/assets/graph-BfBHHXaC.js.gz +0 -0
  87. package/payload/server/public/assets/{graph-labels-x-1MT-3c.js → graph-labels-CHW2aBke.js} +1 -1
  88. package/payload/server/public/assets/graph-labels-CHW2aBke.js.br +0 -0
  89. package/payload/server/public/assets/graph-labels-CHW2aBke.js.gz +0 -0
  90. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css +1 -0
  91. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.br +0 -0
  92. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.gz +0 -0
  93. package/payload/server/public/assets/{operator-BAO0-mjU.js → operator-DRn9LITC.js} +1 -1
  94. package/payload/server/public/assets/operator-DRn9LITC.js.br +0 -0
  95. package/payload/server/public/assets/operator-DRn9LITC.js.gz +0 -0
  96. package/payload/server/public/assets/page-BwqQsoU8.js +1 -0
  97. package/payload/server/public/assets/page-BwqQsoU8.js.br +0 -0
  98. package/payload/server/public/assets/page-BwqQsoU8.js.gz +0 -0
  99. package/payload/server/public/assets/{page-B-F08pod.js → page-D_9mPS6W.js} +1 -1
  100. package/payload/server/public/assets/page-D_9mPS6W.js.br +0 -0
  101. package/payload/server/public/assets/page-D_9mPS6W.js.gz +0 -0
  102. package/payload/server/public/assets/play-7LTxCuLX.js +1 -0
  103. package/payload/server/public/assets/play-7LTxCuLX.js.br +0 -0
  104. package/payload/server/public/assets/play-7LTxCuLX.js.gz +0 -0
  105. package/payload/server/public/assets/{public-_HJsUohA.js → public-CrjZYpdW.js} +1 -1
  106. package/payload/server/public/assets/public-CrjZYpdW.js.br +0 -0
  107. package/payload/server/public/assets/public-CrjZYpdW.js.gz +0 -0
  108. package/payload/server/public/assets/{rotate-ccw-DJeAnYLQ.js → rotate-ccw-J9f-GWjm.js} +1 -1
  109. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.br +0 -0
  110. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.gz +0 -0
  111. package/payload/server/public/assets/{routines-CoIVXRCB.js → routines-C1AB-3FR.js} +1 -1
  112. package/payload/server/public/assets/routines-C1AB-3FR.js.br +0 -0
  113. package/payload/server/public/assets/routines-C1AB-3FR.js.gz +0 -0
  114. package/payload/server/public/assets/{skills-BjHt5lDG.js → skills-C4EfNKEx.js} +1 -1
  115. package/payload/server/public/assets/skills-C4EfNKEx.js.br +0 -0
  116. package/payload/server/public/assets/skills-C4EfNKEx.js.gz +0 -0
  117. package/payload/server/public/assets/{tasks-iUFfeA9_.js → tasks-DszD3aZl.js} +1 -1
  118. package/payload/server/public/assets/tasks-DszD3aZl.js.br +0 -0
  119. package/payload/server/public/assets/tasks-DszD3aZl.js.gz +0 -0
  120. package/payload/server/public/assets/{triangle-alert-Dwa986Gg.js → triangle-alert-B5WAyAkC.js} +1 -1
  121. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.br +4 -0
  122. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.gz +0 -0
  123. package/payload/server/public/assets/{useCopyFeedback-B1Jp6CsE.js → useCopyFeedback-B2nuNNJw.js} +1 -1
  124. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.br +0 -0
  125. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.gz +0 -0
  126. package/payload/server/public/assets/{useMediaQuery-CVZYjRf6.js → useMediaQuery-DUPJPHQt.js} +1 -1
  127. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.br +0 -0
  128. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.gz +0 -0
  129. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js +2 -0
  130. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.br +0 -0
  131. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.gz +0 -0
  132. package/payload/server/public/assets/{wrench-BD7xwbV1.js → wrench-DZJZm17j.js} +1 -1
  133. package/payload/server/public/assets/wrench-DZJZm17j.js.br +0 -0
  134. package/payload/server/public/assets/wrench-DZJZm17j.js.gz +0 -0
  135. package/payload/server/public/browser.html +5 -5
  136. package/payload/server/public/calendar.html +8 -8
  137. package/payload/server/public/chat.html +14 -14
  138. package/payload/server/public/data.html +12 -12
  139. package/payload/server/public/field.html +3 -3
  140. package/payload/server/public/graph.html +10 -10
  141. package/payload/server/public/index.html +14 -14
  142. package/payload/server/public/operator.html +16 -16
  143. package/payload/server/public/public.html +14 -14
  144. package/payload/server/public/routines.html +8 -8
  145. package/payload/server/public/skills.html +6 -6
  146. package/payload/server/public/tasks.html +7 -7
  147. package/payload/server/server.js +10561 -10491
  148. package/payload/server/{src-IJCLNFYU.js → src-MM64CYYZ.js} +1 -1
  149. package/payload/server/{userprofile-reconcile-PUA657YX.js → userprofile-reconcile-TL4JKBPG.js} +1 -8
  150. package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.br +0 -0
  151. package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.gz +0 -0
  152. package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.br +0 -0
  153. package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.gz +0 -0
  154. package/payload/server/public/assets/activity-BWqrCyYM.js.br +0 -0
  155. package/payload/server/public/assets/activity-BWqrCyYM.js.gz +0 -0
  156. package/payload/server/public/assets/admin-zly7Y6EZ.js.br +0 -0
  157. package/payload/server/public/assets/admin-zly7Y6EZ.js.gz +0 -0
  158. package/payload/server/public/assets/agents-BsxGD1V1.js.br +0 -0
  159. package/payload/server/public/assets/agents-BsxGD1V1.js.gz +0 -0
  160. package/payload/server/public/assets/browser-CRLxTaw2.js.br +0 -0
  161. package/payload/server/public/assets/browser-CRLxTaw2.js.gz +0 -0
  162. package/payload/server/public/assets/calendar-Bmp6qI_P.js.br +0 -0
  163. package/payload/server/public/assets/calendar-Bmp6qI_P.js.gz +0 -0
  164. package/payload/server/public/assets/chat-ChObDKHy.js +0 -1
  165. package/payload/server/public/assets/chat-ChObDKHy.js.br +0 -0
  166. package/payload/server/public/assets/chat-ChObDKHy.js.gz +0 -0
  167. package/payload/server/public/assets/chevron-left-D2l4jMcd.js +0 -1
  168. package/payload/server/public/assets/chevron-left-D2l4jMcd.js.br +0 -0
  169. package/payload/server/public/assets/clock-CMdfsroW.js +0 -1
  170. package/payload/server/public/assets/clock-CMdfsroW.js.br +0 -0
  171. package/payload/server/public/assets/clock-CMdfsroW.js.gz +0 -0
  172. package/payload/server/public/assets/copy-Bcjpxqzn.js.br +0 -0
  173. package/payload/server/public/assets/copy-Bcjpxqzn.js.gz +0 -0
  174. package/payload/server/public/assets/data-CFB5Lgw-.js +0 -1
  175. package/payload/server/public/assets/data-CFB5Lgw-.js.br +0 -0
  176. package/payload/server/public/assets/data-CFB5Lgw-.js.gz +0 -0
  177. package/payload/server/public/assets/field-ChKB2l_d.js.br +0 -0
  178. package/payload/server/public/assets/field-ChKB2l_d.js.gz +0 -0
  179. package/payload/server/public/assets/file-text-COZcf7mU.js.br +0 -0
  180. package/payload/server/public/assets/file-text-COZcf7mU.js.gz +0 -0
  181. package/payload/server/public/assets/graph-labels-x-1MT-3c.js.br +0 -0
  182. package/payload/server/public/assets/graph-labels-x-1MT-3c.js.gz +0 -0
  183. package/payload/server/public/assets/graph-nnV47iqM.js.br +0 -0
  184. package/payload/server/public/assets/graph-nnV47iqM.js.gz +0 -0
  185. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css +0 -1
  186. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.br +0 -0
  187. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.gz +0 -0
  188. package/payload/server/public/assets/operator-BAO0-mjU.js.br +0 -0
  189. package/payload/server/public/assets/operator-BAO0-mjU.js.gz +0 -0
  190. package/payload/server/public/assets/page-B-F08pod.js.br +0 -0
  191. package/payload/server/public/assets/page-B-F08pod.js.gz +0 -0
  192. package/payload/server/public/assets/page-BMOCy2aD.js +0 -1
  193. package/payload/server/public/assets/page-BMOCy2aD.js.br +0 -0
  194. package/payload/server/public/assets/page-BMOCy2aD.js.gz +0 -0
  195. package/payload/server/public/assets/play-DFtlk8Zs.js +0 -1
  196. package/payload/server/public/assets/play-DFtlk8Zs.js.br +0 -0
  197. package/payload/server/public/assets/play-DFtlk8Zs.js.gz +0 -0
  198. package/payload/server/public/assets/public-_HJsUohA.js.br +0 -0
  199. package/payload/server/public/assets/public-_HJsUohA.js.gz +0 -0
  200. package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.br +0 -0
  201. package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.gz +0 -0
  202. package/payload/server/public/assets/routines-CoIVXRCB.js.br +0 -0
  203. package/payload/server/public/assets/routines-CoIVXRCB.js.gz +0 -0
  204. package/payload/server/public/assets/skills-BjHt5lDG.js.br +0 -0
  205. package/payload/server/public/assets/skills-BjHt5lDG.js.gz +0 -0
  206. package/payload/server/public/assets/tasks-iUFfeA9_.js.br +0 -0
  207. package/payload/server/public/assets/tasks-iUFfeA9_.js.gz +0 -0
  208. package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.br +0 -0
  209. package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.gz +0 -0
  210. package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.br +0 -0
  211. package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.gz +0 -0
  212. package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.br +0 -0
  213. package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.gz +0 -0
  214. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js +0 -2
  215. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.br +0 -0
  216. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.gz +0 -0
  217. package/payload/server/public/assets/wrench-BD7xwbV1.js.br +0 -0
  218. package/payload/server/public/assets/wrench-BD7xwbV1.js.gz +0 -0
  219. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js → jsx-runtime-Cjug_Cyb.js} +0 -0
  220. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.br → jsx-runtime-Cjug_Cyb.js.br} +0 -0
  221. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.gz → jsx-runtime-Cjug_Cyb.js.gz} +0 -0
@@ -3,14 +3,18 @@ import { readSessionCookie, resolveSession } from './_lib/session'
3
3
  import { q } from './_lib/log'
4
4
 
5
5
  /**
6
- * One published visit, as an account's own page renders it.
6
+ * One published row: ONE VISIT, ONE ATTENDING WORKER (Task 2551).
7
+ *
8
+ * The `visits` table is keyed on the attendance, so a visit two workers share is
9
+ * two rows here. `processVisits` folds them into the `VisitRow` below; nothing
10
+ * outside this file sees this shape.
7
11
  *
8
12
  * The ontology's own fields (`schema-construction.md`) and the portal person the
9
- * visit is assigned to, and nothing else. A job sheet's contents are the
10
- * account's to design, and they are files, which the Task 1910 exchange already
11
- * carries — so nothing of theirs belongs in this shape.
13
+ * row is assigned to, and nothing else. A job sheet's contents are the account's
14
+ * to design, and they are files, which the Task 1910 exchange already carries —
15
+ * so nothing of theirs belongs in this shape.
12
16
  */
13
- export interface VisitRow {
17
+ export interface VisitReadRow {
14
18
  visitId: string
15
19
  ownerId: string
16
20
  jobId: string
@@ -38,6 +42,23 @@ export interface VisitRow {
38
42
  signatures: number
39
43
  }
40
44
 
45
+ /**
46
+ * One visit, as an account's own page renders it: one card naming every worker
47
+ * on it (Task 2551).
48
+ *
49
+ * `owners` is who is attending. It holds one id for an ordinary visit, two for a
50
+ * visit two workers share, and one empty string for a visit whose engineer
51
+ * carries no `portalOwnerId` — the unbound sentinel `visits.ownerId` has always
52
+ * used.
53
+ *
54
+ * `ownerId` is `owners[0]` and is DERIVED, not authoritative. It stays because
55
+ * the planner groups cards onto worker rows by it and that page is not this
56
+ * task's to change; `owners` is what says who is actually on the job.
57
+ */
58
+ export interface VisitRow extends VisitReadRow {
59
+ owners: string[]
60
+ }
61
+
41
62
  /**
42
63
  * One candidate for one unallocated visit (Task 2511).
43
64
  *
@@ -117,6 +138,33 @@ function parseJson<T>(raw: string, fallback: T): T {
117
138
  }
118
139
  }
119
140
 
141
+ /**
142
+ * The attendance rows for one visit, as one card (Task 2551).
143
+ *
144
+ * CALLED AFTER THE SQL FILTER, NEVER BEFORE. An own-scoped person's read already
145
+ * returned only their own attendance, so their card names them and nobody else.
146
+ * Folding first would hand them the colleague names the file drop deliberately
147
+ * withholds, which is the rule `processVisits` states below.
148
+ *
149
+ * The order of `owners` is the read's `ORDER BY`, so the same set always renders
150
+ * the same way rather than in whatever order D1 happened to answer in.
151
+ */
152
+ export function foldOwners(rows: readonly VisitReadRow[]): VisitRow[] {
153
+ const out: VisitRow[] = []
154
+ const at = new Map<string, VisitRow>()
155
+ for (const r of rows) {
156
+ const held = at.get(r.visitId)
157
+ if (held) {
158
+ if (!held.owners.includes(r.ownerId)) held.owners.push(r.ownerId)
159
+ continue
160
+ }
161
+ const card: VisitRow = { ...r, owners: [r.ownerId] }
162
+ at.set(r.visitId, card)
163
+ out.push(card)
164
+ }
165
+ return out
166
+ }
167
+
120
168
  /**
121
169
  * The visits a signed-in person may read.
122
170
  *
@@ -160,13 +208,16 @@ export async function processVisits(
160
208
  ON s.accountId = v.accountId AND s.currentGeneration = v.generation
161
209
  WHERE v.accountId = ?` +
162
210
  (scoped ? ' AND v.ownerId = ?' : '') +
163
- ' ORDER BY v.startDate ASC, v.visitId ASC'
211
+ // ownerId joins the ORDER BY because the table is keyed on the attendance
212
+ // (Task 2551): the rows for one visit arrive together and in a fixed order,
213
+ // so the worker list on a shared card does not vary between reads.
214
+ ' ORDER BY v.startDate ASC, v.visitId ASC, v.ownerId ASC'
164
215
  const stmt = env.DB.prepare(sql)
165
216
  const bound = scoped
166
217
  ? stmt.bind(env.PORTAL_ACCOUNT_ID, session.ownerId)
167
218
  : stmt.bind(env.PORTAL_ACCOUNT_ID)
168
- const rows = await bound.all<VisitRow>()
169
- const visits = rows.results ?? []
219
+ const rows = await bound.all<VisitReadRow>()
220
+ const visits = foldOwners(rows.results ?? [])
170
221
 
171
222
  // THE SAME TWO FILTERS, and the owner one for the same reason: an own-scoped
172
223
  // person may see their own row and no other, or this page becomes a way to
@@ -90,6 +90,18 @@ Just ask for what you want. "Send the team a message with Yes and No buttons",
90
90
  {{productName}} loads its Telegram build skill, which lists every available
91
91
  method and how to call it.
92
92
 
93
+ When somebody presses one of those buttons or votes in one of those polls,
94
+ {{productName}} hears it and can answer. Before, a press was recorded but reached
95
+ nobody, and a vote was dropped without a trace. A press on a job-sheet card is the
96
+ one exception: the dispatch plugin applies the change and tells the presser
97
+ itself, so {{productName}} does not answer a second time.
98
+
99
+ One limit worth knowing, and it is Telegram's rather than ours. Telegram only
100
+ reports who voted in a poll that is **not** anonymous, and polls are anonymous
101
+ unless you say otherwise. Ask for a poll where you can see who chose what, and
102
+ {{productName}} will send it that way; ask for a plain poll and Telegram will tell
103
+ nobody how anyone voted, so no reply is possible.
104
+
93
105
  Five of the 185 are deliberately refused, because they would break your own
94
106
  inbound messages: setting or deleting the webhook by hand, polling Telegram for
95
107
  updates instead, and the two that move the bot off Telegram's cloud servers.
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env bash
2
+ # Task 2545 — a hook registered on a literal tool-name matcher in
3
+ # account-settings.json must name that tool in its own dispatch.
4
+ #
5
+ # Three hooks were registered on a matcher they sent straight to a catch-all
6
+ # unread, so the fences they enforce were reachable by choosing the other write
7
+ # tool. The registration side cannot see it: the reconcile's hookRegistration
8
+ # audit checks that a hook IS registered for a matcher, never that it reads it.
9
+ #
10
+ # The rule: a hook that gates on an explicit set of LITERAL tool names must
11
+ # carry, in that set, every literal matcher it is registered on.
12
+ #
13
+ # - A matcher is literal when it is one tool name with no regex metacharacter.
14
+ # An alternation matcher is split on `|` and each literal part checked.
15
+ # Regex matchers and matcher-less entries name no tool, so they are skipped.
16
+ # - A hook's literal set is read from four constructs: bash
17
+ # `case "$TOOL_NAME" in <arms>`, bash `[ "$TOOL_NAME" = "X" ]` and `!=`,
18
+ # embedded-python `== "X"` / `!= "X"` against tool_name, and embedded-python
19
+ # `in` / `not in ("A", "B")`. A case arm carrying a glob is not a literal.
20
+ # - A hook whose set comes out empty gates on no literal set at all: it either
21
+ # matches by suffix or reads the name only to log it, so it acts on whatever
22
+ # it is registered for and there is nothing here to compare. Skipped.
23
+ #
24
+ # Comments are stripped before the scan. A tool name in a header paragraph is
25
+ # prose, not dispatch, and counting it would report green on a hook that still
26
+ # exits 0 unread.
27
+ #
28
+ # The pair count and the pin below exist because a check that passes on a zero
29
+ # count cannot tell healthy from not-measuring: a refactor that made every hook
30
+ # unparseable would otherwise report success having compared nothing.
31
+ set -uo pipefail
32
+ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
33
+ PLATFORM="$DIR/../.."
34
+ SETTINGS="$PLATFORM/templates/account-settings.json"
35
+ [ -f "$SETTINGS" ] || { echo "FAIL: $SETTINGS is missing" >&2; exit 1; }
36
+
37
+ python3 - "$SETTINGS" "$PLATFORM" <<'PY'
38
+ import json, os, re, sys
39
+
40
+ settings_path, platform_root = sys.argv[1], sys.argv[2]
41
+ settings = json.load(open(settings_path, encoding="utf-8"))
42
+
43
+ LITERAL = re.compile(r"\A[A-Za-z0-9_-]+\Z")
44
+ # The one hook this check was written for. If a refactor makes its dispatch
45
+ # unreadable to the parser below, coverage is lost silently; this pin says so.
46
+ PINNED = "fs-schema-guard.sh"
47
+
48
+
49
+ def strip_comments(src):
50
+ keep = []
51
+ for line in src.splitlines():
52
+ s = line.lstrip()
53
+ keep.append("" if s.startswith("#") or s.startswith("//") else line)
54
+ return "\n".join(keep)
55
+
56
+
57
+ def tool_case_blocks(src):
58
+ """Body text of every `case "$TOOL_NAME" in` block, depth-counted so a nested
59
+ case on a different variable cannot end the scan at the wrong esac."""
60
+ blocks = []
61
+ for m in re.finditer(r'case\s+"\$TOOL_NAME"\s+in', src):
62
+ start, depth, end = m.end(), 1, len(src)
63
+ for t in re.finditer(r"\bcase\b|\besac\b", src[start:]):
64
+ depth += 1 if t.group() == "case" else -1
65
+ if depth == 0:
66
+ end = start + t.start()
67
+ break
68
+ blocks.append(src[start:end])
69
+ return blocks
70
+
71
+
72
+ def literal_tool_names(src):
73
+ """Every literal tool name the source gates on. Empty means it gates on no
74
+ literal set."""
75
+ names = set()
76
+
77
+ def add(word):
78
+ w = word.strip().strip('"').strip("'")
79
+ if LITERAL.match(w):
80
+ names.add(w)
81
+
82
+ for block in tool_case_blocks(src):
83
+ for arm in re.finditer(r"(?:\A|;;)\s*\(?\s*([^()\n;]+?)\)", block):
84
+ for part in arm.group(1).split("|"):
85
+ add(part)
86
+
87
+ for m in re.finditer(r'"\$TOOL_NAME"\s*(?:!=|==|=)\s*"?([A-Za-z0-9_-]+)"?', src):
88
+ add(m.group(1))
89
+
90
+ for line in src.splitlines():
91
+ if "tool_name" not in line:
92
+ continue
93
+ for m in re.finditer(r'tool_name.*?(?:==|!=)\s*"([^"]+)"', line):
94
+ add(m.group(1))
95
+ for m in re.finditer(r"tool_name.*?\b(?:not\s+in|in)\s*\(([^)]*)\)", line):
96
+ for q in re.findall(r'"([^"]*)"', m.group(1)):
97
+ add(q)
98
+ return names
99
+
100
+
101
+ def literal_matchers(matcher):
102
+ """Literal tool names a matcher string names. A regex part names none."""
103
+ if not matcher:
104
+ return []
105
+ return [p for p in matcher.split("|") if LITERAL.match(p)]
106
+
107
+
108
+ sources = {}
109
+ pairs = 0
110
+ skipped_hooks = set()
111
+ failures = []
112
+
113
+ for event, entries in settings.get("hooks", {}).items():
114
+ for entry in entries:
115
+ tools = literal_matchers(entry.get("matcher", ""))
116
+ if not tools:
117
+ continue
118
+ for hook in entry.get("hooks", []):
119
+ cmd = hook.get("command", "")
120
+ m = re.search(r"\$PLATFORM_ROOT/(\S+)", cmd)
121
+ if not m:
122
+ continue
123
+ rel = m.group(1)
124
+ path = os.path.join(platform_root, rel)
125
+ name = os.path.basename(rel)
126
+ # Keyed on the path, not the basename: two plugins may each ship a
127
+ # hook of the same name, and reusing one's parsed set for the other
128
+ # would report on a file that was never read.
129
+ if rel not in sources:
130
+ try:
131
+ sources[rel] = literal_tool_names(
132
+ strip_comments(open(path, encoding="utf-8").read())
133
+ )
134
+ except OSError:
135
+ failures.append(f"{name}: registered in {event} but not readable at {path}")
136
+ sources[rel] = set()
137
+ gated = sources[rel]
138
+ if not gated:
139
+ skipped_hooks.add(rel)
140
+ continue
141
+ for tool in tools:
142
+ pairs += 1
143
+ if tool not in gated:
144
+ failures.append(
145
+ f"{name}: registered on {event} matcher '{tool}' but its dispatch "
146
+ f"names only {sorted(gated)} — every '{tool}' reaches the catch-all unread"
147
+ )
148
+
149
+ for f in failures:
150
+ print(f"FAIL: {f}", file=sys.stderr)
151
+
152
+ print(f"[hook-matcher-dispatch] pairs={pairs} literal-set-hooks={len(sources) - len(skipped_hooks)} "
153
+ f"skipped={len(skipped_hooks)} failures={len(failures)}")
154
+
155
+ if pairs == 0:
156
+ print("FAIL: no (hook, matcher) pair was compared — the parser reads nothing", file=sys.stderr)
157
+ sys.exit(1)
158
+ compared = {os.path.basename(r) for r in sources if r not in skipped_hooks}
159
+ if PINNED not in compared:
160
+ print(f"FAIL: {PINNED} was not compared against any matcher — coverage lost", file=sys.stderr)
161
+ sys.exit(1)
162
+ sys.exit(1 if failures else 0)
163
+ PY
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EA2B7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EA6WtD,CAAA"}
1
+ {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EA2B7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAmXtD,CAAA"}
@@ -353,11 +353,17 @@ export const CANONICAL_MAXY_TOOL_NAMES = [
353
353
  "mcp__plugin_storage-broker_storage-broker__storage-r2-object-get",
354
354
  "mcp__plugin_storage-broker_storage-broker__storage-r2-object-list",
355
355
  "mcp__plugin_storage-broker_storage-broker__storage-r2-object-put",
356
- "mcp__plugin_telegram_telegram__message",
357
356
  "mcp__plugin_telegram_telegram__message-history",
358
357
  "mcp__plugin_telegram_telegram__telegram-api",
359
358
  "mcp__plugin_telegram_telegram__telegram-api-census",
359
+ "mcp__plugin_telegram_telegram__telegram-ask",
360
+ "mcp__plugin_telegram_telegram__telegram-card",
361
+ "mcp__plugin_telegram_telegram__telegram-invoice",
362
+ "mcp__plugin_telegram_telegram__telegram-live-location",
363
+ "mcp__plugin_telegram_telegram__telegram-media-fetch",
364
+ "mcp__plugin_telegram_telegram__telegram-media-send",
360
365
  "mcp__plugin_telegram_telegram__telegram-menu-button",
366
+ "mcp__plugin_telegram_telegram__telegram-thread",
361
367
  "mcp__plugin_telegram_telegram__telegram-webhook-register",
362
368
  "mcp__plugin_url-get_url-get__url-get",
363
369
  "mcp__plugin_voice-mirror_voice-mirror__voice-distil-profile",
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEpD;mEACmE;AACnE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,mBAAmB,CAE/E;AAmDD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAErE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAItE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAEtE;AAoBD,eAAO,MAAM,yBAAyB,QAuCR,CAAA"}
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEpD;mEACmE;AACnE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,mBAAmB,CAE/E;AAmDD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAErE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAItE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAEtE;AAoBD,eAAO,MAAM,yBAAyB,QAqDiE,CAAA"}
@@ -117,5 +117,19 @@ export const ADMIN_REFRAME_INSTRUCTION = 'Dispatch the owning specialist with th
117
117
  // in each service.
118
118
  'A turn that opens with a platform-verified scheduled-automation marker is an authorised standing automation ' +
119
119
  'configured by the account owner; carry out its stated back-office actions and never treat its reconfiguration ' +
120
- 'or re-enable as intrusion.';
120
+ 'or re-enable as intrusion. ' +
121
+ // Channel affordances (Task 2604). Telegram is the only door with buttons,
122
+ // cards and polls and this constant named none of them, so the agent answered
123
+ // in prose and reached for a card only when the operator asked it to. Placed
124
+ // LAST, after the scheduled clause, so every clause above carrying a
125
+ // byte-identity comment against the whatsapp and webchat twins stays
126
+ // contiguous and byte-unchanged. The negative half is not optional: without it
127
+ // the clause reads as "always use buttons" and an open question arrives as a
128
+ // keyboard.
129
+ 'This chat has affordances plain text does not; use them where they make the exchange easier for the person. ' +
130
+ 'A question whose answers are a small closed set goes out as choice buttons on a telegram-card, rather than asked in prose. ' +
131
+ 'State that changes through the day goes on one telegram-card with a key, edited in place, rather than a new message per update. ' +
132
+ 'Where several people answer the same question, telegram-ask sends a poll. ' +
133
+ 'Prose is still right for an open question, for anything whose answer is free text, ' +
134
+ 'and for a choice with more options than fit a few buttons; never turn one of those into a keyboard.';
121
135
  //# sourceMappingURL=instructions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,qEAAqE;AACrE,8EAA8E;AAC9E,kCAAkC;AAIlC;mEACmE;AACnE,MAAM,UAAU,kBAAkB,CAAC,GAAuB;IACxD,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;AAC9C,CAAC;AAED,MAAM,YAAY,GAChB,gGAAgG;IAChG,iGAAiG;IACjG,mGAAmG;IACnG,iGAAiG;IACjG,0EAA0E,CAAA;AAE5E,yEAAyE;AACzE,gFAAgF;AAChF,wEAAwE;AACxE,yEAAyE;AACzE,8EAA8E;AAC9E,iFAAiF;AACjF,6EAA6E;AAC7E,mFAAmF;AACnF,6EAA6E;AAC7E,8EAA8E;AAC9E,kFAAkF;AAClF,sEAAsE;AACtE,MAAM,mBAAmB,GACvB,iGAAiG;IACjG,wFAAwF;IACxF,kGAAkG;IAClG,4GAA4G,CAAA;AAE9G,MAAM,kBAAkB,GACtB,mBAAmB;IACnB,iEAAiE;IACjE,mGAAmG;IACnG,+FAA+F;IAC/F,8FAA8F;IAC9F,kGAAkG;IAClG,2FAA2F;IAC3F,yFAAyF;IACzF,0FAA0F;IAC1F,yFAAyF;IACzF,YAAY,CAAA;AAEd,MAAM,mBAAmB,GACvB,mBAAmB;IACnB,uEAAuE;IACvE,oGAAoG;IACpG,iGAAiG;IACjG,4FAA4F;IAC5F,6FAA6F;IAC7F,6FAA6F;IAC7F,+DAA+D;IAC/D,YAAY,CAAA;AAEd,MAAM,UAAU,mBAAmB,CAAC,IAAyB;IAC3D,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAyB;IAC5D,OAAO,IAAI,KAAK,QAAQ;QACtB,CAAC,CAAC,2EAA2E;QAC7E,CAAC,CAAC,2EAA2E,CAAA;AACjF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAyB;IAC5D,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,qCAAqC,CAAA;AACzG,CAAC;AAED,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,EAAE;AACF,2EAA2E;AAC3E,iFAAiF;AACjF,kFAAkF;AAClF,wDAAwD;AACxD,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,sEAAsE;AACtE,4EAA4E;AAC5E,kDAAkD;AAClD,EAAE;AACF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,yBAAyB,GACpC,sDAAsD;IACtD,8NAA8N;IAC9N,8EAA8E;IAC9E,2FAA2F;IAC3F,mEAAmE;IACnE,sGAAsG;IACtG,oHAAoH;IACpH,yEAAyE;IACzE,yEAAyE;IACzE,uEAAuE;IACvE,6EAA6E;IAC7E,wBAAwB;IACxB,uFAAuF;IACvF,0EAA0E;IAC1E,8EAA8E;IAC9E,4EAA4E;IAC5E,4EAA4E;IAC5E,gBAAgB;IAChB,sFAAsF;IACtF,6FAA6F;IAC7F,+EAA+E;IAC/E,wEAAwE;IACxE,sBAAsB;IACtB,uGAAuG;IACvG,8EAA8E;IAC9E,0EAA0E;IAC1E,uGAAuG;IACvG,iDAAiD;IACjD,gFAAgF;IAChF,mFAAmF;IACnF,oHAAoH;IACpH,yBAAyB;IACzB,+EAA+E;IAC/E,iFAAiF;IACjF,iFAAiF;IACjF,mBAAmB;IACnB,8GAA8G;IAC9G,gHAAgH;IAChH,4BAA4B,CAAA"}
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ name: personal-assistant
3
3
  description: "Platform settings, messaging channels (Telegram, WhatsApp, email, Outlook), and browser automation, plus mechanical calendar subtasks you hand it with the facts already resolved (export these event IDs to .ics, parse this inbound .ics). Delegate when the work is configuring the platform, sending or reading messages, or driving a browser. Do not delegate calendar reasoning or an availability-affecting booking: only your admin session sees the connector-backed real calendar, so the specialist would answer from the internal scheduling store alone and miss it. You own what is on the calendar and what booking against it does."
4
4
  summary: "Handles the operational tasks you'd give a personal assistant: scheduling meetings, managing your platform settings, connecting messaging channels, and completing browser-based tasks on your behalf."
5
5
  model: claude-sonnet-5
6
- tools: Skill, mcp__plugin_admin_admin__system-status, mcp__plugin_admin_admin__brand-settings, mcp__plugin_admin_admin__account-manage, mcp__plugin_admin_admin__account-update, mcp__plugin_admin_admin__logs-read, mcp__plugin_admin_admin__plugin-read, mcp__plugin_admin_admin__wifi, mcp__plugin_contacts_contacts__contact-create, mcp__plugin_contacts_contacts__contact-lookup, mcp__plugin_contacts_contacts__contact-update, mcp__plugin_contacts_contacts__contact-delete, mcp__plugin_contacts_contacts__contact-list, mcp__plugin_contacts_contacts__contact-export, mcp__plugin_contacts_contacts__contact-erase, mcp__plugin_contacts_contacts__group-create, mcp__plugin_contacts_contacts__group-manage, mcp__plugin_telegram_telegram__message, mcp__plugin_telegram_telegram__message-history, mcp__plugin_telegram_telegram__telegram-webhook-register, mcp__plugin_whatsapp_whatsapp__whatsapp-login-start, mcp__plugin_whatsapp_whatsapp__whatsapp-login-wait, mcp__plugin_whatsapp_whatsapp__whatsapp-status, mcp__plugin_whatsapp_whatsapp__whatsapp-disconnect, mcp__plugin_whatsapp_whatsapp__whatsapp-config, mcp__plugin_whatsapp_whatsapp__whatsapp-activity, mcp__plugin_whatsapp_whatsapp__whatsapp-conversations, mcp__plugin_whatsapp_whatsapp__whatsapp-messages, mcp__plugin_whatsapp_whatsapp__whatsapp-conversation-graph-state, mcp__plugin_whatsapp_whatsapp__whatsapp-group-info, mcp__plugin_whatsapp_whatsapp__whatsapp-send-admin, mcp__plugin_whatsapp_whatsapp__whatsapp-reply, mcp__plugin_email_email__email-provider-info, mcp__plugin_email_email__email-setup, mcp__plugin_email_email__email-signature-set, mcp__plugin_email_email__email-sending-identity-set, mcp__plugin_email_email__email-read, mcp__plugin_email_email__email-fetch-body, mcp__plugin_email_email__email-fetch-attachment, mcp__plugin_email_email__email-send, mcp__plugin_email_email__email-draft, mcp__plugin_email_email__email-draft-edit, mcp__plugin_email_email__email-draft-send, mcp__plugin_email_email__email-draft-list, mcp__plugin_email_email__email-reply, mcp__plugin_email_email__email-search, mcp__plugin_email_email__email-delete, mcp__plugin_email_email__email-graph-query, mcp__plugin_email_email__email-otp-extract, mcp__plugin_email_email__email-status, mcp__plugin_email_email__email-fetch, mcp__plugin_email_email__email-ingest, mcp__plugin_outlook_outlook__outlook-account-register, mcp__plugin_outlook_outlook__outlook-account-register-poll, mcp__plugin_outlook_outlook__outlook-mail-list, mcp__plugin_outlook_outlook__outlook-mail-search, mcp__plugin_outlook_outlook__outlook-mail-fetch-body, mcp__plugin_outlook_outlook__outlook-mail-attachment, mcp__plugin_outlook_outlook__outlook-mail-reply, mcp__plugin_outlook_outlook__outlook-mail-delete, mcp__plugin_outlook_outlook__outlook-mail-ingest, mcp__plugin_outlook_outlook__outlook-mail-otp-extract, mcp__plugin_outlook_outlook__outlook-mail-send, mcp__plugin_outlook_outlook__outlook-draft, mcp__plugin_outlook_outlook__outlook-draft-edit, mcp__plugin_outlook_outlook__outlook-draft-send, mcp__plugin_outlook_outlook__outlook-calendar-list, mcp__plugin_outlook_outlook__outlook-calendar-event, mcp__plugin_outlook_outlook__outlook-calendar-create, mcp__plugin_outlook_outlook__outlook-calendar-update, mcp__plugin_outlook_outlook__outlook-calendar-cancel, mcp__plugin_outlook_outlook__outlook-calendar-respond, mcp__plugin_outlook_outlook__outlook-calendar-freebusy, mcp__plugin_outlook_outlook__outlook-contacts-list, mcp__plugin_outlook_outlook__outlook-mailbox-info, mcp__plugin_outlook_outlook__outlook-mailbox-list, mcp__plugin_outlook_outlook__outlook-shared-mailbox-add, mcp__plugin_outlook_outlook__outlook-shared-mailbox-remove, mcp__plugin_google_google__google-account-register, mcp__plugin_google_google__google-account-register-poll, mcp__plugin_google_google__google-account-register-submit, mcp__plugin_google_google__google-calendar-list, mcp__plugin_google_google__google-calendar-event, mcp__plugin_google_google__google-calendar-create, mcp__plugin_google_google__google-calendar-update, mcp__plugin_google_google__google-calendar-cancel, mcp__plugin_google_google__google-calendar-respond, mcp__plugin_google_google__google-calendar-freebusy, mcp__plugin_google_google__google-account-info, mcp__plugin_google_google__google-account-list, mcp__plugin_scheduling_scheduling__schedule-event, mcp__plugin_scheduling_scheduling__schedule-list, mcp__plugin_scheduling_scheduling__schedule-get, mcp__plugin_scheduling_scheduling__schedule-runs, mcp__plugin_scheduling_scheduling__schedule-update, mcp__plugin_scheduling_scheduling__schedule-cancel, mcp__plugin_scheduling_scheduling__schedule-export-ics, mcp__plugin_scheduling_scheduling__schedule-import-ics, mcp__plugin_scheduling_scheduling__time-resolve, mcp__plugin_memory_memory__memory-search, mcp__plugin_memory_memory__profile-update, mcp__plugin_url-get_url-get__url-get, mcp__plugin_browser_browser__browser-render, mcp__plugin_browser_browser__browser-navigate, mcp__plugin_browser_browser__browser-snapshot, mcp__plugin_browser_browser__browser-click, mcp__plugin_browser_browser__browser-fill, mcp__plugin_browser_browser__browser-fill-form, mcp__plugin_browser_browser__browser-type, mcp__plugin_browser_browser__browser-press-key, mcp__plugin_browser_browser__browser-hover, mcp__plugin_browser_browser__browser-select-option, mcp__plugin_browser_browser__browser-wait-for, mcp__plugin_browser_browser__browser-handle-dialog, mcp__plugin_browser_browser__browser-evaluate, mcp__plugin_browser_browser__browser-console-messages, mcp__plugin_browser_browser__browser-tabs, mcp__plugin_browser_browser__browser-pdf-save, mcp__plugin_browser_browser__browser-screenshot, mcp__plugin_browser_browser__browser-resize
6
+ tools: Skill, mcp__plugin_admin_admin__system-status, mcp__plugin_admin_admin__brand-settings, mcp__plugin_admin_admin__account-manage, mcp__plugin_admin_admin__account-update, mcp__plugin_admin_admin__logs-read, mcp__plugin_admin_admin__plugin-read, mcp__plugin_admin_admin__wifi, mcp__plugin_contacts_contacts__contact-create, mcp__plugin_contacts_contacts__contact-lookup, mcp__plugin_contacts_contacts__contact-update, mcp__plugin_contacts_contacts__contact-delete, mcp__plugin_contacts_contacts__contact-list, mcp__plugin_contacts_contacts__contact-export, mcp__plugin_contacts_contacts__contact-erase, mcp__plugin_contacts_contacts__group-create, mcp__plugin_contacts_contacts__group-manage, mcp__plugin_telegram_telegram__telegram-card, mcp__plugin_telegram_telegram__message-history, mcp__plugin_telegram_telegram__telegram-live-location, mcp__plugin_telegram_telegram__telegram-webhook-register, mcp__plugin_whatsapp_whatsapp__whatsapp-login-start, mcp__plugin_whatsapp_whatsapp__whatsapp-login-wait, mcp__plugin_whatsapp_whatsapp__whatsapp-status, mcp__plugin_whatsapp_whatsapp__whatsapp-disconnect, mcp__plugin_whatsapp_whatsapp__whatsapp-config, mcp__plugin_whatsapp_whatsapp__whatsapp-activity, mcp__plugin_whatsapp_whatsapp__whatsapp-conversations, mcp__plugin_whatsapp_whatsapp__whatsapp-messages, mcp__plugin_whatsapp_whatsapp__whatsapp-conversation-graph-state, mcp__plugin_whatsapp_whatsapp__whatsapp-group-info, mcp__plugin_whatsapp_whatsapp__whatsapp-send-admin, mcp__plugin_whatsapp_whatsapp__whatsapp-reply, mcp__plugin_email_email__email-provider-info, mcp__plugin_email_email__email-setup, mcp__plugin_email_email__email-signature-set, mcp__plugin_email_email__email-sending-identity-set, mcp__plugin_email_email__email-read, mcp__plugin_email_email__email-fetch-body, mcp__plugin_email_email__email-fetch-attachment, mcp__plugin_email_email__email-send, mcp__plugin_email_email__email-draft, mcp__plugin_email_email__email-draft-edit, mcp__plugin_email_email__email-draft-send, mcp__plugin_email_email__email-draft-list, mcp__plugin_email_email__email-reply, mcp__plugin_email_email__email-search, mcp__plugin_email_email__email-delete, mcp__plugin_email_email__email-graph-query, mcp__plugin_email_email__email-otp-extract, mcp__plugin_email_email__email-status, mcp__plugin_email_email__email-fetch, mcp__plugin_email_email__email-ingest, mcp__plugin_outlook_outlook__outlook-account-register, mcp__plugin_outlook_outlook__outlook-account-register-poll, mcp__plugin_outlook_outlook__outlook-mail-list, mcp__plugin_outlook_outlook__outlook-mail-search, mcp__plugin_outlook_outlook__outlook-mail-fetch-body, mcp__plugin_outlook_outlook__outlook-mail-attachment, mcp__plugin_outlook_outlook__outlook-mail-reply, mcp__plugin_outlook_outlook__outlook-mail-delete, mcp__plugin_outlook_outlook__outlook-mail-ingest, mcp__plugin_outlook_outlook__outlook-mail-otp-extract, mcp__plugin_outlook_outlook__outlook-mail-send, mcp__plugin_outlook_outlook__outlook-draft, mcp__plugin_outlook_outlook__outlook-draft-edit, mcp__plugin_outlook_outlook__outlook-draft-send, mcp__plugin_outlook_outlook__outlook-calendar-list, mcp__plugin_outlook_outlook__outlook-calendar-event, mcp__plugin_outlook_outlook__outlook-calendar-create, mcp__plugin_outlook_outlook__outlook-calendar-update, mcp__plugin_outlook_outlook__outlook-calendar-cancel, mcp__plugin_outlook_outlook__outlook-calendar-respond, mcp__plugin_outlook_outlook__outlook-calendar-freebusy, mcp__plugin_outlook_outlook__outlook-contacts-list, mcp__plugin_outlook_outlook__outlook-mailbox-info, mcp__plugin_outlook_outlook__outlook-mailbox-list, mcp__plugin_outlook_outlook__outlook-shared-mailbox-add, mcp__plugin_outlook_outlook__outlook-shared-mailbox-remove, mcp__plugin_google_google__google-account-register, mcp__plugin_google_google__google-account-register-poll, mcp__plugin_google_google__google-account-register-submit, mcp__plugin_google_google__google-calendar-list, mcp__plugin_google_google__google-calendar-event, mcp__plugin_google_google__google-calendar-create, mcp__plugin_google_google__google-calendar-update, mcp__plugin_google_google__google-calendar-cancel, mcp__plugin_google_google__google-calendar-respond, mcp__plugin_google_google__google-calendar-freebusy, mcp__plugin_google_google__google-account-info, mcp__plugin_google_google__google-account-list, mcp__plugin_scheduling_scheduling__schedule-event, mcp__plugin_scheduling_scheduling__schedule-list, mcp__plugin_scheduling_scheduling__schedule-get, mcp__plugin_scheduling_scheduling__schedule-runs, mcp__plugin_scheduling_scheduling__schedule-update, mcp__plugin_scheduling_scheduling__schedule-cancel, mcp__plugin_scheduling_scheduling__schedule-export-ics, mcp__plugin_scheduling_scheduling__schedule-import-ics, mcp__plugin_scheduling_scheduling__time-resolve, mcp__plugin_memory_memory__memory-search, mcp__plugin_memory_memory__profile-update, mcp__plugin_url-get_url-get__url-get, mcp__plugin_browser_browser__browser-render, mcp__plugin_browser_browser__browser-navigate, mcp__plugin_browser_browser__browser-snapshot, mcp__plugin_browser_browser__browser-click, mcp__plugin_browser_browser__browser-fill, mcp__plugin_browser_browser__browser-fill-form, mcp__plugin_browser_browser__browser-type, mcp__plugin_browser_browser__browser-press-key, mcp__plugin_browser_browser__browser-hover, mcp__plugin_browser_browser__browser-select-option, mcp__plugin_browser_browser__browser-wait-for, mcp__plugin_browser_browser__browser-handle-dialog, mcp__plugin_browser_browser__browser-evaluate, mcp__plugin_browser_browser__browser-console-messages, mcp__plugin_browser_browser__browser-tabs, mcp__plugin_browser_browser__browser-pdf-save, mcp__plugin_browser_browser__browser-screenshot, mcp__plugin_browser_browser__browser-resize
7
7
  pattern_deliverable: false
8
8
  ---
9
9
 
@@ -1,9 +1,8 @@
1
1
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
- import {
3
- __esm
4
- } from "./chunk-KVR2FT6O.js";
2
+ import "./chunk-HYQNUVGO.js";
5
3
 
6
4
  // app/lib/adminuser-self-heal.ts
5
+ var UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
7
6
  function toNum(raw) {
8
7
  if (typeof raw === "number") return raw;
9
8
  if (raw && typeof raw.toNumber === "function") {
@@ -50,13 +49,6 @@ async function selfHealAdminUser(args) {
50
49
  await session.close();
51
50
  }
52
51
  }
53
- var UUID_REGEX;
54
- var init_adminuser_self_heal = __esm({
55
- "app/lib/adminuser-self-heal.ts"() {
56
- UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
57
- }
58
- });
59
- init_adminuser_self_heal();
60
52
  export {
61
53
  selfHealAdminUser
62
54
  };