@rubytech/create-realagent-code 0.1.574 → 0.1.575

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 (793) hide show
  1. package/dist/index.js +14 -0
  2. package/package.json +1 -1
  3. package/payload/platform/lib/canonical-instant/dist/index.d.ts +57 -0
  4. package/payload/platform/lib/canonical-instant/dist/index.d.ts.map +1 -0
  5. package/payload/platform/lib/canonical-instant/dist/index.js +139 -0
  6. package/payload/platform/lib/canonical-instant/dist/index.js.map +1 -0
  7. package/payload/platform/lib/canonical-instant/src/__tests__/normalise-instant.test.ts +158 -0
  8. package/payload/platform/lib/canonical-instant/src/index.ts +147 -0
  9. package/payload/platform/lib/canonical-instant/tsconfig.json +9 -0
  10. package/payload/platform/lib/canonical-instant/vitest.config.ts +9 -0
  11. package/payload/platform/lib/dispatch-read/dist/geo.d.ts +34 -0
  12. package/payload/platform/lib/dispatch-read/dist/geo.d.ts.map +1 -0
  13. package/payload/platform/lib/dispatch-read/dist/geo.js +27 -0
  14. package/payload/platform/lib/dispatch-read/dist/geo.js.map +1 -0
  15. package/payload/platform/lib/dispatch-read/dist/index.d.ts +6 -2
  16. package/payload/platform/lib/dispatch-read/dist/index.d.ts.map +1 -1
  17. package/payload/platform/lib/dispatch-read/dist/index.js +21 -1
  18. package/payload/platform/lib/dispatch-read/dist/index.js.map +1 -1
  19. package/payload/platform/lib/dispatch-read/dist/keyboard.d.ts +66 -0
  20. package/payload/platform/lib/dispatch-read/dist/keyboard.d.ts.map +1 -0
  21. package/payload/platform/lib/dispatch-read/dist/keyboard.js +64 -0
  22. package/payload/platform/lib/dispatch-read/dist/keyboard.js.map +1 -0
  23. package/payload/platform/lib/dispatch-read/dist/read.d.ts +144 -9
  24. package/payload/platform/lib/dispatch-read/dist/read.d.ts.map +1 -1
  25. package/payload/platform/lib/dispatch-read/dist/read.js +437 -118
  26. package/payload/platform/lib/dispatch-read/dist/read.js.map +1 -1
  27. package/payload/platform/lib/dispatch-read/dist/types.d.ts +80 -11
  28. package/payload/platform/lib/dispatch-read/dist/types.d.ts.map +1 -1
  29. package/payload/platform/lib/dispatch-read/src/__tests__/geo.test.ts +86 -0
  30. package/payload/platform/lib/dispatch-read/src/__tests__/keyboard.test.ts +124 -0
  31. package/payload/platform/lib/dispatch-read/src/__tests__/previous-visit.test.ts +98 -0
  32. package/payload/platform/lib/dispatch-read/src/__tests__/read.test.ts +107 -8
  33. package/payload/platform/lib/dispatch-read/src/__tests__/worker-day.test.ts +215 -10
  34. package/payload/platform/lib/dispatch-read/src/geo.ts +56 -0
  35. package/payload/platform/lib/dispatch-read/src/index.ts +25 -1
  36. package/payload/platform/lib/dispatch-read/src/keyboard.ts +98 -0
  37. package/payload/platform/lib/dispatch-read/src/read.ts +522 -119
  38. package/payload/platform/lib/dispatch-read/src/types.ts +83 -11
  39. package/payload/platform/lib/dispatch-write/dist/write.d.ts +14 -0
  40. package/payload/platform/lib/dispatch-write/dist/write.d.ts.map +1 -1
  41. package/payload/platform/lib/dispatch-write/dist/write.js +50 -11
  42. package/payload/platform/lib/dispatch-write/dist/write.js.map +1 -1
  43. package/payload/platform/lib/dispatch-write/src/__tests__/write.test.ts +72 -2
  44. package/payload/platform/lib/dispatch-write/src/write.ts +79 -14
  45. package/payload/platform/neo4j/schema.cypher +66 -1
  46. package/payload/platform/package.json +2 -2
  47. package/payload/platform/plugins/admin/PLUGIN.md +3 -0
  48. package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard-bash.test.sh +106 -0
  49. package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +66 -0
  50. package/payload/platform/plugins/admin/hooks/fs-schema-guard-bash-post.sh +85 -12
  51. package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +18 -0
  52. package/payload/platform/plugins/admin/mcp/dist/index.js +2 -2
  53. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  54. package/payload/platform/plugins/admin/skills/admin-user-management/SKILL.md +10 -11
  55. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +106 -36
  56. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +8 -0
  57. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visits-scope.test.ts +130 -1
  58. package/payload/platform/plugins/cloudflare/skills/data-portal/schema.sql +63 -0
  59. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visits.ts +104 -3
  60. package/payload/platform/plugins/dispatch/.claude-plugin/plugin.json +1 -1
  61. package/payload/platform/plugins/dispatch/PLUGIN.md +49 -6
  62. package/payload/platform/plugins/dispatch/mcp/dist/index.js +200 -2
  63. package/payload/platform/plugins/dispatch/mcp/dist/index.js.map +1 -1
  64. package/payload/platform/plugins/dispatch/mcp/dist/lib/allocate.d.ts +22 -4
  65. package/payload/platform/plugins/dispatch/mcp/dist/lib/allocate.d.ts.map +1 -1
  66. package/payload/platform/plugins/dispatch/mcp/dist/lib/allocate.js +4 -0
  67. package/payload/platform/plugins/dispatch/mcp/dist/lib/allocate.js.map +1 -1
  68. package/payload/platform/plugins/dispatch/mcp/dist/lib/bot-token.d.ts +10 -0
  69. package/payload/platform/plugins/dispatch/mcp/dist/lib/bot-token.d.ts.map +1 -0
  70. package/payload/platform/plugins/dispatch/mcp/dist/lib/bot-token.js +47 -0
  71. package/payload/platform/plugins/dispatch/mcp/dist/lib/bot-token.js.map +1 -0
  72. package/payload/platform/plugins/dispatch/mcp/dist/lib/config.d.ts.map +1 -1
  73. package/payload/platform/plugins/dispatch/mcp/dist/lib/config.js +12 -0
  74. package/payload/platform/plugins/dispatch/mcp/dist/lib/config.js.map +1 -1
  75. package/payload/platform/plugins/dispatch/mcp/dist/lib/ids.d.ts +1 -0
  76. package/payload/platform/plugins/dispatch/mcp/dist/lib/ids.d.ts.map +1 -1
  77. package/payload/platform/plugins/dispatch/mcp/dist/lib/ids.js +1 -0
  78. package/payload/platform/plugins/dispatch/mcp/dist/lib/ids.js.map +1 -1
  79. package/payload/platform/plugins/dispatch/mcp/dist/lib/intake.d.ts +36 -0
  80. package/payload/platform/plugins/dispatch/mcp/dist/lib/intake.d.ts.map +1 -0
  81. package/payload/platform/plugins/dispatch/mcp/dist/lib/intake.js +36 -0
  82. package/payload/platform/plugins/dispatch/mcp/dist/lib/intake.js.map +1 -0
  83. package/payload/platform/plugins/dispatch/mcp/dist/lib/keyboard.d.ts +11 -0
  84. package/payload/platform/plugins/dispatch/mcp/dist/lib/keyboard.d.ts.map +1 -0
  85. package/payload/platform/plugins/dispatch/mcp/dist/lib/keyboard.js +10 -0
  86. package/payload/platform/plugins/dispatch/mcp/dist/lib/keyboard.js.map +1 -0
  87. package/payload/platform/plugins/dispatch/mcp/dist/lib/read.d.ts +2 -2
  88. package/payload/platform/plugins/dispatch/mcp/dist/lib/read.d.ts.map +1 -1
  89. package/payload/platform/plugins/dispatch/mcp/dist/lib/read.js +9 -1
  90. package/payload/platform/plugins/dispatch/mcp/dist/lib/read.js.map +1 -1
  91. package/payload/platform/plugins/dispatch/mcp/dist/lib/travel.d.ts +43 -0
  92. package/payload/platform/plugins/dispatch/mcp/dist/lib/travel.d.ts.map +1 -0
  93. package/payload/platform/plugins/dispatch/mcp/dist/lib/travel.js +53 -0
  94. package/payload/platform/plugins/dispatch/mcp/dist/lib/travel.js.map +1 -0
  95. package/payload/platform/plugins/dispatch/mcp/dist/lib/types.d.ts +13 -2
  96. package/payload/platform/plugins/dispatch/mcp/dist/lib/types.d.ts.map +1 -1
  97. package/payload/platform/plugins/dispatch/mcp/dist/scripts/converge-visit-instants.d.ts +6 -0
  98. package/payload/platform/plugins/dispatch/mcp/dist/scripts/converge-visit-instants.d.ts.map +1 -0
  99. package/payload/platform/plugins/dispatch/mcp/dist/scripts/converge-visit-instants.js +102 -0
  100. package/payload/platform/plugins/dispatch/mcp/dist/scripts/converge-visit-instants.js.map +1 -0
  101. package/payload/platform/plugins/dispatch/mcp/dist/tools/allocate.d.ts +18 -0
  102. package/payload/platform/plugins/dispatch/mcp/dist/tools/allocate.d.ts.map +1 -1
  103. package/payload/platform/plugins/dispatch/mcp/dist/tools/allocate.js +251 -40
  104. package/payload/platform/plugins/dispatch/mcp/dist/tools/allocate.js.map +1 -1
  105. package/payload/platform/plugins/dispatch/mcp/dist/tools/intake.d.ts +75 -0
  106. package/payload/platform/plugins/dispatch/mcp/dist/tools/intake.d.ts.map +1 -0
  107. package/payload/platform/plugins/dispatch/mcp/dist/tools/intake.js +194 -0
  108. package/payload/platform/plugins/dispatch/mcp/dist/tools/intake.js.map +1 -0
  109. package/payload/platform/plugins/dispatch/mcp/dist/tools/notify-worker.d.ts +61 -0
  110. package/payload/platform/plugins/dispatch/mcp/dist/tools/notify-worker.d.ts.map +1 -0
  111. package/payload/platform/plugins/dispatch/mcp/dist/tools/notify-worker.js +130 -0
  112. package/payload/platform/plugins/dispatch/mcp/dist/tools/notify-worker.js.map +1 -0
  113. package/payload/platform/plugins/dispatch/mcp/dist/tools/site-location-set.d.ts +28 -0
  114. package/payload/platform/plugins/dispatch/mcp/dist/tools/site-location-set.d.ts.map +1 -0
  115. package/payload/platform/plugins/dispatch/mcp/dist/tools/site-location-set.js +44 -0
  116. package/payload/platform/plugins/dispatch/mcp/dist/tools/site-location-set.js.map +1 -0
  117. package/payload/platform/plugins/dispatch/mcp/dist/tools/site-upsert.d.ts +43 -0
  118. package/payload/platform/plugins/dispatch/mcp/dist/tools/site-upsert.d.ts.map +1 -0
  119. package/payload/platform/plugins/dispatch/mcp/dist/tools/site-upsert.js +139 -0
  120. package/payload/platform/plugins/dispatch/mcp/dist/tools/site-upsert.js.map +1 -0
  121. package/payload/platform/plugins/dispatch/skills/dispatch-page/SKILL.md +85 -0
  122. package/payload/platform/plugins/dispatch/skills/dispatch-page/template/planner.css +97 -0
  123. package/payload/platform/plugins/dispatch/skills/dispatch-page/template/planner.html +59 -0
  124. package/payload/platform/plugins/dispatch/skills/dispatch-page/template/planner.js +343 -0
  125. package/payload/platform/plugins/dispatch/skills/dispatch-setup/SKILL.md +9 -4
  126. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +11 -20
  127. package/payload/platform/plugins/docs/references/dispatch.md +94 -15
  128. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/dispatch-vertical-coverage.test.js +4 -1
  129. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/dispatch-vertical-coverage.test.js.map +1 -1
  130. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/relationship-patterns.test.js +24 -1
  131. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/relationship-patterns.test.js.map +1 -1
  132. package/payload/platform/plugins/memory/references/schema-dispatch.md +70 -4
  133. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.d.ts +2 -35
  134. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.d.ts.map +1 -1
  135. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.js +6 -114
  136. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.js.map +1 -1
  137. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts +1 -1
  138. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js +3 -3
  139. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js.map +1 -1
  140. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +2 -2
  141. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  142. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +3 -3
  143. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  144. package/payload/platform/services/claude-session-manager/dist/blocked-tool-census.d.ts +40 -6
  145. package/payload/platform/services/claude-session-manager/dist/blocked-tool-census.d.ts.map +1 -1
  146. package/payload/platform/services/claude-session-manager/dist/blocked-tool-census.js +116 -15
  147. package/payload/platform/services/claude-session-manager/dist/blocked-tool-census.js.map +1 -1
  148. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  149. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +6 -0
  150. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  151. package/payload/platform/services/telegram-channel/dist/notification.d.ts +0 -12
  152. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  153. package/payload/platform/services/telegram-channel/dist/notification.js +8 -29
  154. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  155. package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -1
  156. package/payload/platform/services/telegram-channel/dist/server.js +8 -11
  157. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
  158. package/payload/server/public/activity.html +7 -7
  159. package/payload/server/public/agents.html +6 -6
  160. package/payload/server/public/assets/{AdminLoginScreens-Dp6k1XgD.js → AdminLoginScreens-BLGZEaKU.js} +1 -1
  161. package/payload/server/public/assets/AdminLoginScreens-BLGZEaKU.js.br +0 -0
  162. package/payload/server/public/assets/AdminLoginScreens-BLGZEaKU.js.gz +0 -0
  163. package/payload/server/public/assets/AdminShell-C_M7YE5Z.js +3 -0
  164. package/payload/server/public/assets/AdminShell-C_M7YE5Z.js.br +0 -0
  165. package/payload/server/public/assets/AdminShell-C_M7YE5Z.js.gz +0 -0
  166. package/payload/server/public/assets/{activity-BJxhblz-.js → activity-BL6qbB9a.js} +1 -1
  167. package/payload/server/public/assets/activity-BL6qbB9a.js.br +0 -0
  168. package/payload/server/public/assets/activity-BL6qbB9a.js.gz +0 -0
  169. package/payload/server/public/assets/admin-jnJ3P2u4.js +1 -0
  170. package/payload/server/public/assets/admin-jnJ3P2u4.js.br +0 -0
  171. package/payload/server/public/assets/admin-jnJ3P2u4.js.gz +0 -0
  172. package/payload/server/public/assets/{agents-DTL8kjfD.js → agents-BzhfKZDN.js} +1 -1
  173. package/payload/server/public/assets/agents-BzhfKZDN.js.br +0 -0
  174. package/payload/server/public/assets/agents-BzhfKZDN.js.gz +0 -0
  175. package/payload/server/public/assets/{arc-CWXBKNZd.js → arc-Bge2fWf4.js} +1 -1
  176. package/payload/server/public/assets/arc-Bge2fWf4.js.br +0 -0
  177. package/payload/server/public/assets/arc-Bge2fWf4.js.gz +0 -0
  178. package/payload/server/public/assets/architecture-YZFGNWBL-B9jqFTbw.js +1 -0
  179. package/payload/server/public/assets/architecture-YZFGNWBL-B9jqFTbw.js.br +0 -0
  180. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-C-KPMyG4.js → architectureDiagram-Q4EWVU46-BRauf5b8.js} +1 -1
  181. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-BRauf5b8.js.br +0 -0
  182. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-BRauf5b8.js.gz +0 -0
  183. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DkYbV9Sf.js → blockDiagram-DXYQGD6D-CUJ554WZ.js} +1 -1
  184. package/payload/server/public/assets/blockDiagram-DXYQGD6D-CUJ554WZ.js.br +0 -0
  185. package/payload/server/public/assets/blockDiagram-DXYQGD6D-CUJ554WZ.js.gz +0 -0
  186. package/payload/server/public/assets/{browser-UZp75zhx.js → browser-C-6io2B9.js} +1 -1
  187. package/payload/server/public/assets/browser-C-6io2B9.js.br +0 -0
  188. package/payload/server/public/assets/browser-C-6io2B9.js.gz +0 -0
  189. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-EYW4kdlx.js → c4Diagram-AHTNJAMY-CV9gKsKo.js} +1 -1
  190. package/payload/server/public/assets/c4Diagram-AHTNJAMY-CV9gKsKo.js.br +0 -0
  191. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-EYW4kdlx.js.gz → c4Diagram-AHTNJAMY-CV9gKsKo.js.gz} +0 -0
  192. package/payload/server/public/assets/{calendar-Dfo0O2K_.js → calendar-Dt3gS88s.js} +1 -1
  193. package/payload/server/public/assets/calendar-Dt3gS88s.js.br +0 -0
  194. package/payload/server/public/assets/calendar-Dt3gS88s.js.gz +0 -0
  195. package/payload/server/public/assets/channel-DUwJcjZw.js +1 -0
  196. package/payload/server/public/assets/channel-DUwJcjZw.js.br +0 -0
  197. package/payload/server/public/assets/chat-IUOvVkL-.js +1 -0
  198. package/payload/server/public/assets/chat-IUOvVkL-.js.br +1 -0
  199. package/payload/server/public/assets/chat-IUOvVkL-.js.gz +0 -0
  200. package/payload/server/public/assets/chevron-left-DSzR9zR7.js +1 -0
  201. package/payload/server/public/assets/chevron-left-DSzR9zR7.js.br +0 -0
  202. package/payload/server/public/assets/{chunk-2KRD3SAO-CmAF1UmH.js → chunk-2KRD3SAO-HzWGrran.js} +1 -1
  203. package/payload/server/public/assets/chunk-2KRD3SAO-HzWGrran.js.br +0 -0
  204. package/payload/server/public/assets/chunk-2KRD3SAO-HzWGrran.js.gz +0 -0
  205. package/payload/server/public/assets/{chunk-336JU56O-CyhmJeMM.js → chunk-336JU56O-ChGDYu_S.js} +2 -2
  206. package/payload/server/public/assets/chunk-336JU56O-ChGDYu_S.js.br +0 -0
  207. package/payload/server/public/assets/chunk-336JU56O-ChGDYu_S.js.gz +0 -0
  208. package/payload/server/public/assets/chunk-426QAEUC-DLLi1nAr.js +1 -0
  209. package/payload/server/public/assets/chunk-426QAEUC-DLLi1nAr.js.br +0 -0
  210. package/payload/server/public/assets/chunk-426QAEUC-DLLi1nAr.js.gz +0 -0
  211. package/payload/server/public/assets/{chunk-4BX2VUAB-DCzC40-Y.js → chunk-4BX2VUAB-BJunAy2u.js} +1 -1
  212. package/payload/server/public/assets/chunk-4BX2VUAB-BJunAy2u.js.br +0 -0
  213. package/payload/server/public/assets/chunk-4BX2VUAB-BJunAy2u.js.gz +0 -0
  214. package/payload/server/public/assets/{chunk-4TB4RGXK-D9BXrSA_.js → chunk-4TB4RGXK-Df9Ew0fN.js} +1 -1
  215. package/payload/server/public/assets/chunk-4TB4RGXK-Df9Ew0fN.js.br +0 -0
  216. package/payload/server/public/assets/chunk-4TB4RGXK-Df9Ew0fN.js.gz +0 -0
  217. package/payload/server/public/assets/{chunk-55IACEB6-BwXC-qTZ.js → chunk-55IACEB6-DtquCg7p.js} +1 -1
  218. package/payload/server/public/assets/chunk-55IACEB6-DtquCg7p.js.br +0 -0
  219. package/payload/server/public/assets/chunk-55IACEB6-DtquCg7p.js.gz +0 -0
  220. package/payload/server/public/assets/{chunk-5FUZZQ4R-De7QtXxM.js → chunk-5FUZZQ4R-B3s1YuQa.js} +1 -1
  221. package/payload/server/public/assets/chunk-5FUZZQ4R-B3s1YuQa.js.br +0 -0
  222. package/payload/server/public/assets/chunk-5FUZZQ4R-B3s1YuQa.js.gz +0 -0
  223. package/payload/server/public/assets/{chunk-5PVQY5BW-B5tsJiCq.js → chunk-5PVQY5BW-C0bRnMKQ.js} +1 -1
  224. package/payload/server/public/assets/chunk-5PVQY5BW-C0bRnMKQ.js.br +0 -0
  225. package/payload/server/public/assets/chunk-5PVQY5BW-C0bRnMKQ.js.gz +0 -0
  226. package/payload/server/public/assets/{chunk-67CJDMHE-BjTh9STV.js → chunk-67CJDMHE-B9jxnEpu.js} +1 -1
  227. package/payload/server/public/assets/chunk-67CJDMHE-B9jxnEpu.js.br +0 -0
  228. package/payload/server/public/assets/chunk-67CJDMHE-B9jxnEpu.js.gz +0 -0
  229. package/payload/server/public/assets/{chunk-7N4EOEYR-91klRswn.js → chunk-7N4EOEYR-DaimaIlO.js} +1 -1
  230. package/payload/server/public/assets/chunk-7N4EOEYR-DaimaIlO.js.br +0 -0
  231. package/payload/server/public/assets/chunk-7N4EOEYR-DaimaIlO.js.gz +0 -0
  232. package/payload/server/public/assets/{chunk-AA7GKIK3-XFPGEoBu.js → chunk-AA7GKIK3-htgz4y5z.js} +1 -1
  233. package/payload/server/public/assets/chunk-AA7GKIK3-htgz4y5z.js.br +0 -0
  234. package/payload/server/public/assets/chunk-AA7GKIK3-htgz4y5z.js.gz +0 -0
  235. package/payload/server/public/assets/{chunk-BSJP7CBP-B7wgMyWq.js → chunk-BSJP7CBP-0xBlnKJN.js} +1 -1
  236. package/payload/server/public/assets/chunk-BSJP7CBP-0xBlnKJN.js.br +0 -0
  237. package/payload/server/public/assets/chunk-BSJP7CBP-0xBlnKJN.js.gz +0 -0
  238. package/payload/server/public/assets/{chunk-CIAEETIT-WPy9vcOo.js → chunk-CIAEETIT-HZOrcAzJ.js} +1 -1
  239. package/payload/server/public/assets/chunk-CIAEETIT-HZOrcAzJ.js.br +0 -0
  240. package/payload/server/public/assets/chunk-CIAEETIT-HZOrcAzJ.js.gz +0 -0
  241. package/payload/server/public/assets/{chunk-EDXVE4YY-D_2JIFFG.js → chunk-EDXVE4YY-CC8hCcuU.js} +1 -1
  242. package/payload/server/public/assets/chunk-EDXVE4YY-CC8hCcuU.js.br +0 -0
  243. package/payload/server/public/assets/chunk-EDXVE4YY-CC8hCcuU.js.gz +0 -0
  244. package/payload/server/public/assets/{chunk-ENJZ2VHE-xORReRt0.js → chunk-ENJZ2VHE-BdPfdZYB.js} +1 -1
  245. package/payload/server/public/assets/chunk-ENJZ2VHE-BdPfdZYB.js.br +0 -0
  246. package/payload/server/public/assets/chunk-ENJZ2VHE-BdPfdZYB.js.gz +0 -0
  247. package/payload/server/public/assets/{chunk-FMBD7UC4-BZsDu4nl.js → chunk-FMBD7UC4-MHdn_KgF.js} +1 -1
  248. package/payload/server/public/assets/chunk-FMBD7UC4-MHdn_KgF.js.br +0 -0
  249. package/payload/server/public/assets/chunk-FMBD7UC4-MHdn_KgF.js.gz +0 -0
  250. package/payload/server/public/assets/{chunk-FOC6F5B3-QzUp8wXX.js → chunk-FOC6F5B3-Ti8BlQKX.js} +1 -1
  251. package/payload/server/public/assets/chunk-FOC6F5B3-Ti8BlQKX.js.br +0 -0
  252. package/payload/server/public/assets/chunk-FOC6F5B3-Ti8BlQKX.js.gz +0 -0
  253. package/payload/server/public/assets/{chunk-ICPOFSXX-B64S7i7x.js → chunk-ICPOFSXX-BP8A8zb1.js} +2 -2
  254. package/payload/server/public/assets/chunk-ICPOFSXX-BP8A8zb1.js.br +0 -0
  255. package/payload/server/public/assets/chunk-ICPOFSXX-BP8A8zb1.js.gz +0 -0
  256. package/payload/server/public/assets/{chunk-K5T4RW27-DzPc6X1_.js → chunk-K5T4RW27-F30EnSBL.js} +1 -1
  257. package/payload/server/public/assets/chunk-K5T4RW27-F30EnSBL.js.br +0 -0
  258. package/payload/server/public/assets/chunk-K5T4RW27-F30EnSBL.js.gz +0 -0
  259. package/payload/server/public/assets/{chunk-KGLVRYIC-A2rPnD7k.js → chunk-KGLVRYIC-DNSEkg2Q.js} +1 -1
  260. package/payload/server/public/assets/chunk-KGLVRYIC-DNSEkg2Q.js.br +2 -0
  261. package/payload/server/public/assets/chunk-KGLVRYIC-DNSEkg2Q.js.gz +0 -0
  262. package/payload/server/public/assets/{chunk-LIHQZDEY-CaWX327m.js → chunk-LIHQZDEY-DM7b0dec.js} +1 -1
  263. package/payload/server/public/assets/chunk-LIHQZDEY-DM7b0dec.js.br +0 -0
  264. package/payload/server/public/assets/chunk-LIHQZDEY-DM7b0dec.js.gz +0 -0
  265. package/payload/server/public/assets/{chunk-ORNJ4GCN-zrWhdmnc.js → chunk-ORNJ4GCN-B0qoI_vp.js} +1 -1
  266. package/payload/server/public/assets/chunk-ORNJ4GCN-B0qoI_vp.js.br +0 -0
  267. package/payload/server/public/assets/chunk-ORNJ4GCN-B0qoI_vp.js.gz +0 -0
  268. package/payload/server/public/assets/{chunk-OYMX7WX6-B_2qQir6.js → chunk-OYMX7WX6-Bfzo53eI.js} +1 -1
  269. package/payload/server/public/assets/chunk-OYMX7WX6-Bfzo53eI.js.br +0 -0
  270. package/payload/server/public/assets/chunk-OYMX7WX6-Bfzo53eI.js.gz +0 -0
  271. package/payload/server/public/assets/chunk-QZHKN3VN-A6b8ZN9i.js +1 -0
  272. package/payload/server/public/assets/chunk-QZHKN3VN-A6b8ZN9i.js.br +0 -0
  273. package/payload/server/public/assets/chunk-QZHKN3VN-A6b8ZN9i.js.gz +0 -0
  274. package/payload/server/public/assets/{chunk-U2HBQHQK-B-IYgxsc.js → chunk-U2HBQHQK-DcqGPXEy.js} +1 -1
  275. package/payload/server/public/assets/chunk-U2HBQHQK-DcqGPXEy.js.br +0 -0
  276. package/payload/server/public/assets/chunk-U2HBQHQK-DcqGPXEy.js.gz +0 -0
  277. package/payload/server/public/assets/{chunk-X2U36JSP-Y9Y1_EuG.js → chunk-X2U36JSP-DtRi7n5Z.js} +1 -1
  278. package/payload/server/public/assets/chunk-X2U36JSP-DtRi7n5Z.js.br +0 -0
  279. package/payload/server/public/assets/chunk-X2U36JSP-DtRi7n5Z.js.gz +0 -0
  280. package/payload/server/public/assets/{chunk-XPW4576I-C-6yETG_.js → chunk-XPW4576I-DmuDCcY3.js} +1 -1
  281. package/payload/server/public/assets/chunk-XPW4576I-DmuDCcY3.js.br +0 -0
  282. package/payload/server/public/assets/chunk-XPW4576I-DmuDCcY3.js.gz +0 -0
  283. package/payload/server/public/assets/{chunk-YZCP3GAM-KAuQIU5n.js → chunk-YZCP3GAM-oKk9Gv_e.js} +1 -1
  284. package/payload/server/public/assets/chunk-YZCP3GAM-oKk9Gv_e.js.br +0 -0
  285. package/payload/server/public/assets/chunk-YZCP3GAM-oKk9Gv_e.js.gz +0 -0
  286. package/payload/server/public/assets/{chunk-ZZ45TVLE-BJcH3KDH.js → chunk-ZZ45TVLE-teET41Yh.js} +1 -1
  287. package/payload/server/public/assets/chunk-ZZ45TVLE-teET41Yh.js.br +0 -0
  288. package/payload/server/public/assets/chunk-ZZ45TVLE-teET41Yh.js.gz +0 -0
  289. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CMXajSzA.js +1 -0
  290. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CMXajSzA.js.br +0 -0
  291. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CMXajSzA.js.gz +0 -0
  292. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Cz5Kib2r.js +1 -0
  293. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Cz5Kib2r.js.br +0 -0
  294. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Cz5Kib2r.js.gz +0 -0
  295. package/payload/server/public/assets/clock-C5xE5p2I.js +1 -0
  296. package/payload/server/public/assets/clock-C5xE5p2I.js.br +0 -0
  297. package/payload/server/public/assets/clone-BORhq8On.js +1 -0
  298. package/payload/server/public/assets/clone-BORhq8On.js.br +0 -0
  299. package/payload/server/public/assets/{copy-CGI2jioK.js → copy-TkPJgllS.js} +1 -1
  300. package/payload/server/public/assets/copy-TkPJgllS.js.br +0 -0
  301. package/payload/server/public/assets/copy-TkPJgllS.js.gz +0 -0
  302. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-CcXj8vHa.js → cose-bilkent-S5V4N54A-D1xLpHGm.js} +1 -1
  303. package/payload/server/public/assets/cose-bilkent-S5V4N54A-D1xLpHGm.js.br +0 -0
  304. package/payload/server/public/assets/cose-bilkent-S5V4N54A-D1xLpHGm.js.gz +0 -0
  305. package/payload/server/public/assets/{dagre-KV5264BT-BOhQs4rS.js → dagre-KV5264BT-Byl65NKT.js} +1 -1
  306. package/payload/server/public/assets/dagre-KV5264BT-Byl65NKT.js.br +0 -0
  307. package/payload/server/public/assets/dagre-KV5264BT-Byl65NKT.js.gz +0 -0
  308. package/payload/server/public/assets/{dagre-DOtq9kYX.js → dagre-ZzXkSDir.js} +1 -1
  309. package/payload/server/public/assets/dagre-ZzXkSDir.js.br +0 -0
  310. package/payload/server/public/assets/dagre-ZzXkSDir.js.gz +0 -0
  311. package/payload/server/public/assets/data-Bhv0Pvfl.js +1 -0
  312. package/payload/server/public/assets/data-Bhv0Pvfl.js.br +0 -0
  313. package/payload/server/public/assets/data-Bhv0Pvfl.js.gz +0 -0
  314. package/payload/server/public/assets/{diagram-5BDNPKRD-CqJFt5ZM.js → diagram-5BDNPKRD-BFNkV5GK.js} +1 -1
  315. package/payload/server/public/assets/diagram-5BDNPKRD-BFNkV5GK.js.br +0 -0
  316. package/payload/server/public/assets/diagram-5BDNPKRD-BFNkV5GK.js.gz +0 -0
  317. package/payload/server/public/assets/{diagram-G4DWMVQ6-WQIyAZMn.js → diagram-G4DWMVQ6-1n6vHXzR.js} +1 -1
  318. package/payload/server/public/assets/diagram-G4DWMVQ6-1n6vHXzR.js.br +0 -0
  319. package/payload/server/public/assets/diagram-G4DWMVQ6-1n6vHXzR.js.gz +0 -0
  320. package/payload/server/public/assets/{diagram-MMDJMWI5-jcKc4a2w.js → diagram-MMDJMWI5-D4QOzaw0.js} +1 -1
  321. package/payload/server/public/assets/diagram-MMDJMWI5-D4QOzaw0.js.br +0 -0
  322. package/payload/server/public/assets/diagram-MMDJMWI5-D4QOzaw0.js.gz +0 -0
  323. package/payload/server/public/assets/{diagram-TYMM5635-Bbt2KuWe.js → diagram-TYMM5635-z8lBRsaV.js} +1 -1
  324. package/payload/server/public/assets/diagram-TYMM5635-z8lBRsaV.js.br +0 -0
  325. package/payload/server/public/assets/diagram-TYMM5635-z8lBRsaV.js.gz +0 -0
  326. package/payload/server/public/assets/{dist-9RiN6lky.js → dist-DjYA4E4S.js} +1 -1
  327. package/payload/server/public/assets/dist-DjYA4E4S.js.br +0 -0
  328. package/payload/server/public/assets/dist-DjYA4E4S.js.gz +0 -0
  329. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BBm6azPJ.js → erDiagram-SMLLAGMA-CXj3tbtX.js} +1 -1
  330. package/payload/server/public/assets/erDiagram-SMLLAGMA-CXj3tbtX.js.br +0 -0
  331. package/payload/server/public/assets/erDiagram-SMLLAGMA-CXj3tbtX.js.gz +0 -0
  332. package/payload/server/public/assets/field-B490-evJ.js +1 -0
  333. package/payload/server/public/assets/field-B490-evJ.js.br +0 -0
  334. package/payload/server/public/assets/field-B490-evJ.js.gz +0 -0
  335. package/payload/server/public/assets/{file-text-RWintp9q.js → file-text-DyAL2DCh.js} +1 -1
  336. package/payload/server/public/assets/file-text-DyAL2DCh.js.br +0 -0
  337. package/payload/server/public/assets/file-text-DyAL2DCh.js.gz +0 -0
  338. package/payload/server/public/assets/{flatten-BurGKeIy.js → flatten-UdUTbm8v.js} +1 -1
  339. package/payload/server/public/assets/flatten-UdUTbm8v.js.br +0 -0
  340. package/payload/server/public/assets/flatten-UdUTbm8v.js.gz +0 -0
  341. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-_r45DYJ8.js → flowDiagram-DWJPFMVM-DnySI-I4.js} +1 -1
  342. package/payload/server/public/assets/flowDiagram-DWJPFMVM-DnySI-I4.js.br +0 -0
  343. package/payload/server/public/assets/flowDiagram-DWJPFMVM-DnySI-I4.js.gz +0 -0
  344. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-Bjgj9Bej.js → ganttDiagram-T4ZO3ILL-BIE2Q78F.js} +1 -1
  345. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-BIE2Q78F.js.br +0 -0
  346. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-BIE2Q78F.js.gz +0 -0
  347. package/payload/server/public/assets/gitGraph-7Q5UKJZL-Ua2z-DNt.js +1 -0
  348. package/payload/server/public/assets/gitGraph-7Q5UKJZL-Ua2z-DNt.js.br +0 -0
  349. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DTRdhGJA.js → gitGraphDiagram-UUTBAWPF-B2RTRpyG.js} +1 -1
  350. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-B2RTRpyG.js.br +0 -0
  351. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-B2RTRpyG.js.gz +0 -0
  352. package/payload/server/public/assets/{graph-CpBlfYrJ.js → graph-PiNIcCfX.js} +1 -1
  353. package/payload/server/public/assets/graph-PiNIcCfX.js.br +0 -0
  354. package/payload/server/public/assets/graph-PiNIcCfX.js.gz +0 -0
  355. package/payload/server/public/assets/{graph-labels-BOMyPppX.js → graph-labels-8jKFrLHn.js} +1 -1
  356. package/payload/server/public/assets/graph-labels-8jKFrLHn.js.br +0 -0
  357. package/payload/server/public/assets/graph-labels-8jKFrLHn.js.gz +0 -0
  358. package/payload/server/public/assets/{graphlib-DT4h6-4N.js → graphlib-SOh92ucm.js} +1 -1
  359. package/payload/server/public/assets/graphlib-SOh92ucm.js.br +0 -0
  360. package/payload/server/public/assets/graphlib-SOh92ucm.js.gz +0 -0
  361. package/payload/server/public/assets/info-OMHHGYJF-CNYp42iX.js +1 -0
  362. package/payload/server/public/assets/info-OMHHGYJF-CNYp42iX.js.br +0 -0
  363. package/payload/server/public/assets/infoDiagram-42DDH7IO-DklHffYr.js +2 -0
  364. package/payload/server/public/assets/infoDiagram-42DDH7IO-DklHffYr.js.br +0 -0
  365. package/payload/server/public/assets/infoDiagram-42DDH7IO-DklHffYr.js.gz +0 -0
  366. package/payload/server/public/assets/{isEmpty-C5v0-EY7.js → isEmpty-DY_Xp9Na.js} +1 -1
  367. package/payload/server/public/assets/isEmpty-DY_Xp9Na.js.br +0 -0
  368. package/payload/server/public/assets/isEmpty-DY_Xp9Na.js.gz +0 -0
  369. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BklHzVHm.js → ishikawaDiagram-UXIWVN3A-KAC06i3M.js} +1 -1
  370. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-KAC06i3M.js.br +0 -0
  371. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-KAC06i3M.js.gz +0 -0
  372. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-Ckxx2CmV.js → journeyDiagram-VCZTEJTY-cA37ob8S.js} +1 -1
  373. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-cA37ob8S.js.br +0 -0
  374. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-cA37ob8S.js.gz +0 -0
  375. package/payload/server/public/assets/{jsx-runtime-DxsQ5Y-z.css → jsx-runtime-ChVh0xOm.css} +1 -1
  376. package/payload/server/public/assets/jsx-runtime-ChVh0xOm.css.br +0 -0
  377. package/payload/server/public/assets/{jsx-runtime-DxsQ5Y-z.css.gz → jsx-runtime-ChVh0xOm.css.gz} +0 -0
  378. package/payload/server/public/assets/{jsx-runtime-5lmxFBIw.js → jsx-runtime-YcUntiud.js} +1 -1
  379. package/payload/server/public/assets/jsx-runtime-YcUntiud.js.br +0 -0
  380. package/payload/server/public/assets/jsx-runtime-YcUntiud.js.gz +0 -0
  381. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BLELXpqn.js → kanban-definition-6JOO6SKY-CBjL70wU.js} +1 -1
  382. package/payload/server/public/assets/kanban-definition-6JOO6SKY-CBjL70wU.js.br +0 -0
  383. package/payload/server/public/assets/kanban-definition-6JOO6SKY-CBjL70wU.js.gz +0 -0
  384. package/payload/server/public/assets/{line-BkI5icOY.js → line-K8229GLG.js} +1 -1
  385. package/payload/server/public/assets/line-K8229GLG.js.br +0 -0
  386. package/payload/server/public/assets/line-K8229GLG.js.gz +0 -0
  387. package/payload/server/public/assets/{linear-B64ANRVs.js → linear-DeX7Wdt6.js} +1 -1
  388. package/payload/server/public/assets/linear-DeX7Wdt6.js.br +0 -0
  389. package/payload/server/public/assets/linear-DeX7Wdt6.js.gz +0 -0
  390. package/payload/server/public/assets/{mermaid-parser.core-qXPKkdJe.js → mermaid-parser.core-OnNOAzPX.js} +2 -2
  391. package/payload/server/public/assets/mermaid-parser.core-OnNOAzPX.js.br +0 -0
  392. package/payload/server/public/assets/mermaid-parser.core-OnNOAzPX.js.gz +0 -0
  393. package/payload/server/public/assets/{mermaid.core-BMsz65Wy.js → mermaid.core-DA-Gezeo.js} +3 -3
  394. package/payload/server/public/assets/mermaid.core-DA-Gezeo.js.br +0 -0
  395. package/payload/server/public/assets/mermaid.core-DA-Gezeo.js.gz +0 -0
  396. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DhFTS2sx.js → mindmap-definition-QFDTVHPH-C24TcDyS.js} +1 -1
  397. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-C24TcDyS.js.br +0 -0
  398. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-C24TcDyS.js.gz +0 -0
  399. package/payload/server/public/assets/operator-DKGKGzrb.js +1 -0
  400. package/payload/server/public/assets/operator-DKGKGzrb.js.br +0 -0
  401. package/payload/server/public/assets/operator-DKGKGzrb.js.gz +0 -0
  402. package/payload/server/public/assets/{ordinal-CJ_pL32Z.js → ordinal-gnpqfIHn.js} +1 -1
  403. package/payload/server/public/assets/ordinal-gnpqfIHn.js.br +0 -0
  404. package/payload/server/public/assets/ordinal-gnpqfIHn.js.gz +0 -0
  405. package/payload/server/public/assets/packet-4T2RLAQJ-B3ZAElsg.js +1 -0
  406. package/payload/server/public/assets/packet-4T2RLAQJ-B3ZAElsg.js.br +0 -0
  407. package/payload/server/public/assets/{page-BRShHSH0.js → page-BU5vlY9Y.js} +1 -1
  408. package/payload/server/public/assets/page-BU5vlY9Y.js.br +0 -0
  409. package/payload/server/public/assets/page-BU5vlY9Y.js.gz +0 -0
  410. package/payload/server/public/assets/{page-BbBCu9iP.js → page-DXz_K10G.js} +3 -3
  411. package/payload/server/public/assets/page-DXz_K10G.js.br +0 -0
  412. package/payload/server/public/assets/page-DXz_K10G.js.gz +0 -0
  413. package/payload/server/public/assets/{pdf-render-ynIPXfRA.js → pdf-render-B5af7vu1.js} +1 -1
  414. package/payload/server/public/assets/pdf-render-B5af7vu1.js.br +0 -0
  415. package/payload/server/public/assets/pdf-render-B5af7vu1.js.gz +0 -0
  416. package/payload/server/public/assets/pie-ZZUOXDRM-BWsRCj8p.js +1 -0
  417. package/payload/server/public/assets/pie-ZZUOXDRM-BWsRCj8p.js.br +0 -0
  418. package/payload/server/public/assets/{pieDiagram-DEJITSTG-B2TxkbHK.js → pieDiagram-DEJITSTG-ChS9jalQ.js} +1 -1
  419. package/payload/server/public/assets/pieDiagram-DEJITSTG-ChS9jalQ.js.br +0 -0
  420. package/payload/server/public/assets/pieDiagram-DEJITSTG-ChS9jalQ.js.gz +0 -0
  421. package/payload/server/public/assets/play-CmSyYrB6.js +1 -0
  422. package/payload/server/public/assets/play-CmSyYrB6.js.br +0 -0
  423. package/payload/server/public/assets/play-CmSyYrB6.js.gz +0 -0
  424. package/payload/server/public/assets/{public-DkObqkzL.js → public-BmA3-jLj.js} +1 -1
  425. package/payload/server/public/assets/public-BmA3-jLj.js.br +0 -0
  426. package/payload/server/public/assets/public-BmA3-jLj.js.gz +0 -0
  427. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-GsMxIJuS.js → quadrantDiagram-34T5L4WZ-BxLfRK0z.js} +1 -1
  428. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-BxLfRK0z.js.br +0 -0
  429. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-BxLfRK0z.js.gz +0 -0
  430. package/payload/server/public/assets/radar-PYXPWWZC-Gxbt2rGT.js +1 -0
  431. package/payload/server/public/assets/radar-PYXPWWZC-Gxbt2rGT.js.br +0 -0
  432. package/payload/server/public/assets/{reduce-CfkEiHc9.js → reduce-BvezuHIe.js} +1 -1
  433. package/payload/server/public/assets/reduce-BvezuHIe.js.br +0 -0
  434. package/payload/server/public/assets/reduce-BvezuHIe.js.gz +0 -0
  435. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DqNprm-1.js → requirementDiagram-MS252O5E-CWy48VI3.js} +1 -1
  436. package/payload/server/public/assets/requirementDiagram-MS252O5E-CWy48VI3.js.br +0 -0
  437. package/payload/server/public/assets/requirementDiagram-MS252O5E-CWy48VI3.js.gz +0 -0
  438. package/payload/server/public/assets/{rotate-ccw-DgMO69nh.js → rotate-ccw-fCH0LSMq.js} +1 -1
  439. package/payload/server/public/assets/rotate-ccw-fCH0LSMq.js.br +0 -0
  440. package/payload/server/public/assets/rotate-ccw-fCH0LSMq.js.gz +0 -0
  441. package/payload/server/public/assets/{routines-D9kvg_Xu.js → routines-BeFrmkls.js} +1 -1
  442. package/payload/server/public/assets/routines-BeFrmkls.js.br +0 -0
  443. package/payload/server/public/assets/routines-BeFrmkls.js.gz +0 -0
  444. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-B-kRuiuz.js → sankeyDiagram-XADWPNL6-BBCLEJA3.js} +1 -1
  445. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-BBCLEJA3.js.br +0 -0
  446. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-BBCLEJA3.js.gz +0 -0
  447. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DEhL9g3K.js → sequenceDiagram-FGHM5R23-wu64F04G.js} +1 -1
  448. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-wu64F04G.js.br +0 -0
  449. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-wu64F04G.js.gz +0 -0
  450. package/payload/server/public/assets/{skills-l5I9HZ3D.js → skills-mjls5HBa.js} +1 -1
  451. package/payload/server/public/assets/skills-mjls5HBa.js.br +0 -0
  452. package/payload/server/public/assets/skills-mjls5HBa.js.gz +0 -0
  453. package/payload/server/public/assets/{src-BrAT6wKv.js → src-BvINb2fL.js} +1 -1
  454. package/payload/server/public/assets/src-BvINb2fL.js.br +0 -0
  455. package/payload/server/public/assets/src-BvINb2fL.js.gz +0 -0
  456. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-Q-g6BHdz.js → stateDiagram-FHFEXIEX-Bq6BFFDC.js} +1 -1
  457. package/payload/server/public/assets/stateDiagram-FHFEXIEX-Bq6BFFDC.js.br +0 -0
  458. package/payload/server/public/assets/stateDiagram-FHFEXIEX-Bq6BFFDC.js.gz +0 -0
  459. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-PxPsWt1r.js +1 -0
  460. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-PxPsWt1r.js.br +0 -0
  461. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-PxPsWt1r.js.gz +0 -0
  462. package/payload/server/public/assets/{tasks-C2qJMv6i.js → tasks-p6puHHD0.js} +1 -1
  463. package/payload/server/public/assets/tasks-p6puHHD0.js.br +0 -0
  464. package/payload/server/public/assets/tasks-p6puHHD0.js.gz +0 -0
  465. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-B3-52q4Q.js → timeline-definition-GMOUNBTQ-DTdvVZp-.js} +1 -1
  466. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-DTdvVZp-.js.br +0 -0
  467. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-DTdvVZp-.js.gz +0 -0
  468. package/payload/server/public/assets/treeView-SZITEDCU-Bl-aPmE3.js +1 -0
  469. package/payload/server/public/assets/treeView-SZITEDCU-Bl-aPmE3.js.br +0 -0
  470. package/payload/server/public/assets/treemap-W4RFUUIX-CUxE8Ofg.js +1 -0
  471. package/payload/server/public/assets/treemap-W4RFUUIX-CUxE8Ofg.js.br +0 -0
  472. package/payload/server/public/assets/{triangle-alert-BnC67uSs.js → triangle-alert-CrZ1ewbd.js} +1 -1
  473. package/payload/server/public/assets/triangle-alert-CrZ1ewbd.js.br +0 -0
  474. package/payload/server/public/assets/triangle-alert-CrZ1ewbd.js.gz +0 -0
  475. package/payload/server/public/assets/{useCopyFeedback-1RmgkTFh.js → useCopyFeedback-zOQNrIwd.js} +1 -1
  476. package/payload/server/public/assets/useCopyFeedback-zOQNrIwd.js.br +0 -0
  477. package/payload/server/public/assets/useCopyFeedback-zOQNrIwd.js.gz +0 -0
  478. package/payload/server/public/assets/{useMediaQuery-BQslddHQ.js → useMediaQuery-BmG090FR.js} +1 -1
  479. package/payload/server/public/assets/useMediaQuery-BmG090FR.js.br +0 -0
  480. package/payload/server/public/assets/useMediaQuery-BmG090FR.js.gz +0 -0
  481. package/payload/server/public/assets/{useVoiceRecorder-BeZNQEC4.js → useVoiceRecorder-9pf6FFJ-.js} +2 -2
  482. package/payload/server/public/assets/useVoiceRecorder-9pf6FFJ-.js.br +0 -0
  483. package/payload/server/public/assets/useVoiceRecorder-9pf6FFJ-.js.gz +0 -0
  484. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-Bzm1VDi1.js → vennDiagram-DHZGUBPP-CigqIBdl.js} +1 -1
  485. package/payload/server/public/assets/vennDiagram-DHZGUBPP-CigqIBdl.js.br +0 -0
  486. package/payload/server/public/assets/vennDiagram-DHZGUBPP-CigqIBdl.js.gz +0 -0
  487. package/payload/server/public/assets/wardley-RL74JXVD-DPB13D22.js +1 -0
  488. package/payload/server/public/assets/wardley-RL74JXVD-DPB13D22.js.br +0 -0
  489. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-DIqGZr4v.js → wardleyDiagram-NUSXRM2D-VhV1plUD.js} +1 -1
  490. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-VhV1plUD.js.br +0 -0
  491. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-VhV1plUD.js.gz +0 -0
  492. package/payload/server/public/assets/{wrench-D4ufQG6C.js → wrench-k4GYG5rc.js} +1 -1
  493. package/payload/server/public/assets/wrench-k4GYG5rc.js.br +0 -0
  494. package/payload/server/public/assets/wrench-k4GYG5rc.js.gz +0 -0
  495. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-0W2L2hQA.js → xychartDiagram-5P7HB3ND-DGkkNLZt.js} +1 -1
  496. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-DGkkNLZt.js.br +0 -0
  497. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-DGkkNLZt.js.gz +0 -0
  498. package/payload/server/public/browser.html +6 -6
  499. package/payload/server/public/calendar.html +9 -9
  500. package/payload/server/public/chat.html +16 -16
  501. package/payload/server/public/data.html +15 -15
  502. package/payload/server/public/field.html +4 -4
  503. package/payload/server/public/graph.html +11 -11
  504. package/payload/server/public/index.html +17 -17
  505. package/payload/server/public/operator.html +17 -17
  506. package/payload/server/public/public.html +16 -16
  507. package/payload/server/public/routines.html +10 -10
  508. package/payload/server/public/skills.html +7 -7
  509. package/payload/server/public/tasks.html +8 -8
  510. package/payload/server/server.js +2930 -2125
  511. package/payload/platform/lib/dispatch-read/src/config.d.ts +0 -26
  512. package/payload/platform/lib/dispatch-read/src/types.d.ts +0 -143
  513. package/payload/server/public/assets/AdminLoginScreens-Dp6k1XgD.js.br +0 -0
  514. package/payload/server/public/assets/AdminLoginScreens-Dp6k1XgD.js.gz +0 -0
  515. package/payload/server/public/assets/AdminShell-D-wB90c3.js +0 -3
  516. package/payload/server/public/assets/AdminShell-D-wB90c3.js.br +0 -0
  517. package/payload/server/public/assets/AdminShell-D-wB90c3.js.gz +0 -0
  518. package/payload/server/public/assets/activity-BJxhblz-.js.br +0 -0
  519. package/payload/server/public/assets/activity-BJxhblz-.js.gz +0 -0
  520. package/payload/server/public/assets/admin-DzEi8shs.js +0 -1
  521. package/payload/server/public/assets/admin-DzEi8shs.js.br +0 -0
  522. package/payload/server/public/assets/admin-DzEi8shs.js.gz +0 -0
  523. package/payload/server/public/assets/agents-DTL8kjfD.js.br +0 -0
  524. package/payload/server/public/assets/agents-DTL8kjfD.js.gz +0 -0
  525. package/payload/server/public/assets/arc-CWXBKNZd.js.br +0 -0
  526. package/payload/server/public/assets/arc-CWXBKNZd.js.gz +0 -0
  527. package/payload/server/public/assets/architecture-YZFGNWBL-CIL4I0fc.js +0 -1
  528. package/payload/server/public/assets/architecture-YZFGNWBL-CIL4I0fc.js.br +0 -0
  529. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-C-KPMyG4.js.br +0 -0
  530. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-C-KPMyG4.js.gz +0 -0
  531. package/payload/server/public/assets/blockDiagram-DXYQGD6D-DkYbV9Sf.js.br +0 -0
  532. package/payload/server/public/assets/blockDiagram-DXYQGD6D-DkYbV9Sf.js.gz +0 -0
  533. package/payload/server/public/assets/browser-UZp75zhx.js.br +0 -0
  534. package/payload/server/public/assets/browser-UZp75zhx.js.gz +0 -0
  535. package/payload/server/public/assets/c4Diagram-AHTNJAMY-EYW4kdlx.js.br +0 -0
  536. package/payload/server/public/assets/calendar-Dfo0O2K_.js.br +0 -0
  537. package/payload/server/public/assets/calendar-Dfo0O2K_.js.gz +0 -0
  538. package/payload/server/public/assets/channel-CbHmRjy_.js +0 -1
  539. package/payload/server/public/assets/channel-CbHmRjy_.js.br +0 -0
  540. package/payload/server/public/assets/chat-ByJAvEWZ.js +0 -1
  541. package/payload/server/public/assets/chat-ByJAvEWZ.js.br +0 -0
  542. package/payload/server/public/assets/chat-ByJAvEWZ.js.gz +0 -0
  543. package/payload/server/public/assets/chevron-left-iG7sYNm7.js +0 -1
  544. package/payload/server/public/assets/chevron-left-iG7sYNm7.js.br +0 -0
  545. package/payload/server/public/assets/chunk-2KRD3SAO-CmAF1UmH.js.br +0 -0
  546. package/payload/server/public/assets/chunk-2KRD3SAO-CmAF1UmH.js.gz +0 -0
  547. package/payload/server/public/assets/chunk-336JU56O-CyhmJeMM.js.br +0 -0
  548. package/payload/server/public/assets/chunk-336JU56O-CyhmJeMM.js.gz +0 -0
  549. package/payload/server/public/assets/chunk-426QAEUC-C2tnHCM7.js +0 -1
  550. package/payload/server/public/assets/chunk-426QAEUC-C2tnHCM7.js.br +0 -0
  551. package/payload/server/public/assets/chunk-426QAEUC-C2tnHCM7.js.gz +0 -0
  552. package/payload/server/public/assets/chunk-4BX2VUAB-DCzC40-Y.js.br +0 -0
  553. package/payload/server/public/assets/chunk-4BX2VUAB-DCzC40-Y.js.gz +0 -0
  554. package/payload/server/public/assets/chunk-4TB4RGXK-D9BXrSA_.js.br +0 -0
  555. package/payload/server/public/assets/chunk-4TB4RGXK-D9BXrSA_.js.gz +0 -0
  556. package/payload/server/public/assets/chunk-55IACEB6-BwXC-qTZ.js.br +0 -0
  557. package/payload/server/public/assets/chunk-55IACEB6-BwXC-qTZ.js.gz +0 -0
  558. package/payload/server/public/assets/chunk-5FUZZQ4R-De7QtXxM.js.br +0 -0
  559. package/payload/server/public/assets/chunk-5FUZZQ4R-De7QtXxM.js.gz +0 -0
  560. package/payload/server/public/assets/chunk-5PVQY5BW-B5tsJiCq.js.br +0 -0
  561. package/payload/server/public/assets/chunk-5PVQY5BW-B5tsJiCq.js.gz +0 -0
  562. package/payload/server/public/assets/chunk-67CJDMHE-BjTh9STV.js.br +0 -0
  563. package/payload/server/public/assets/chunk-67CJDMHE-BjTh9STV.js.gz +0 -0
  564. package/payload/server/public/assets/chunk-7N4EOEYR-91klRswn.js.br +0 -0
  565. package/payload/server/public/assets/chunk-7N4EOEYR-91klRswn.js.gz +0 -0
  566. package/payload/server/public/assets/chunk-AA7GKIK3-XFPGEoBu.js.br +0 -3
  567. package/payload/server/public/assets/chunk-AA7GKIK3-XFPGEoBu.js.gz +0 -0
  568. package/payload/server/public/assets/chunk-BSJP7CBP-B7wgMyWq.js.br +0 -0
  569. package/payload/server/public/assets/chunk-BSJP7CBP-B7wgMyWq.js.gz +0 -0
  570. package/payload/server/public/assets/chunk-CIAEETIT-WPy9vcOo.js.br +0 -0
  571. package/payload/server/public/assets/chunk-CIAEETIT-WPy9vcOo.js.gz +0 -0
  572. package/payload/server/public/assets/chunk-EDXVE4YY-D_2JIFFG.js.br +0 -0
  573. package/payload/server/public/assets/chunk-EDXVE4YY-D_2JIFFG.js.gz +0 -0
  574. package/payload/server/public/assets/chunk-ENJZ2VHE-xORReRt0.js.br +0 -0
  575. package/payload/server/public/assets/chunk-ENJZ2VHE-xORReRt0.js.gz +0 -0
  576. package/payload/server/public/assets/chunk-FMBD7UC4-BZsDu4nl.js.br +0 -0
  577. package/payload/server/public/assets/chunk-FMBD7UC4-BZsDu4nl.js.gz +0 -0
  578. package/payload/server/public/assets/chunk-FOC6F5B3-QzUp8wXX.js.br +0 -0
  579. package/payload/server/public/assets/chunk-FOC6F5B3-QzUp8wXX.js.gz +0 -0
  580. package/payload/server/public/assets/chunk-ICPOFSXX-B64S7i7x.js.br +0 -0
  581. package/payload/server/public/assets/chunk-ICPOFSXX-B64S7i7x.js.gz +0 -0
  582. package/payload/server/public/assets/chunk-K5T4RW27-DzPc6X1_.js.br +0 -0
  583. package/payload/server/public/assets/chunk-K5T4RW27-DzPc6X1_.js.gz +0 -0
  584. package/payload/server/public/assets/chunk-KGLVRYIC-A2rPnD7k.js.br +0 -1
  585. package/payload/server/public/assets/chunk-KGLVRYIC-A2rPnD7k.js.gz +0 -0
  586. package/payload/server/public/assets/chunk-LIHQZDEY-CaWX327m.js.br +0 -0
  587. package/payload/server/public/assets/chunk-LIHQZDEY-CaWX327m.js.gz +0 -0
  588. package/payload/server/public/assets/chunk-ORNJ4GCN-zrWhdmnc.js.br +0 -0
  589. package/payload/server/public/assets/chunk-ORNJ4GCN-zrWhdmnc.js.gz +0 -0
  590. package/payload/server/public/assets/chunk-OYMX7WX6-B_2qQir6.js.br +0 -0
  591. package/payload/server/public/assets/chunk-OYMX7WX6-B_2qQir6.js.gz +0 -0
  592. package/payload/server/public/assets/chunk-QZHKN3VN-BzgrgCTo.js +0 -1
  593. package/payload/server/public/assets/chunk-QZHKN3VN-BzgrgCTo.js.br +0 -0
  594. package/payload/server/public/assets/chunk-QZHKN3VN-BzgrgCTo.js.gz +0 -0
  595. package/payload/server/public/assets/chunk-U2HBQHQK-B-IYgxsc.js.br +0 -0
  596. package/payload/server/public/assets/chunk-U2HBQHQK-B-IYgxsc.js.gz +0 -0
  597. package/payload/server/public/assets/chunk-X2U36JSP-Y9Y1_EuG.js.br +0 -0
  598. package/payload/server/public/assets/chunk-X2U36JSP-Y9Y1_EuG.js.gz +0 -0
  599. package/payload/server/public/assets/chunk-XPW4576I-C-6yETG_.js.br +0 -0
  600. package/payload/server/public/assets/chunk-XPW4576I-C-6yETG_.js.gz +0 -0
  601. package/payload/server/public/assets/chunk-YZCP3GAM-KAuQIU5n.js.br +0 -0
  602. package/payload/server/public/assets/chunk-YZCP3GAM-KAuQIU5n.js.gz +0 -0
  603. package/payload/server/public/assets/chunk-ZZ45TVLE-BJcH3KDH.js.br +0 -0
  604. package/payload/server/public/assets/chunk-ZZ45TVLE-BJcH3KDH.js.gz +0 -0
  605. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BxvqeBEj.js +0 -1
  606. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BxvqeBEj.js.br +0 -0
  607. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BxvqeBEj.js.gz +0 -0
  608. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-R3-NzMRG.js +0 -1
  609. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-R3-NzMRG.js.br +0 -0
  610. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-R3-NzMRG.js.gz +0 -0
  611. package/payload/server/public/assets/clock-xSs0UF10.js +0 -1
  612. package/payload/server/public/assets/clock-xSs0UF10.js.br +0 -0
  613. package/payload/server/public/assets/clock-xSs0UF10.js.gz +0 -0
  614. package/payload/server/public/assets/clone-QdOE5SXR.js +0 -1
  615. package/payload/server/public/assets/copy-CGI2jioK.js.br +0 -0
  616. package/payload/server/public/assets/copy-CGI2jioK.js.gz +0 -0
  617. package/payload/server/public/assets/cose-bilkent-S5V4N54A-CcXj8vHa.js.br +0 -0
  618. package/payload/server/public/assets/cose-bilkent-S5V4N54A-CcXj8vHa.js.gz +0 -0
  619. package/payload/server/public/assets/dagre-DOtq9kYX.js.br +0 -0
  620. package/payload/server/public/assets/dagre-DOtq9kYX.js.gz +0 -0
  621. package/payload/server/public/assets/dagre-KV5264BT-BOhQs4rS.js.br +0 -0
  622. package/payload/server/public/assets/dagre-KV5264BT-BOhQs4rS.js.gz +0 -0
  623. package/payload/server/public/assets/data-dvwK4BcP.js +0 -1
  624. package/payload/server/public/assets/data-dvwK4BcP.js.br +0 -0
  625. package/payload/server/public/assets/data-dvwK4BcP.js.gz +0 -0
  626. package/payload/server/public/assets/diagram-5BDNPKRD-CqJFt5ZM.js.br +0 -0
  627. package/payload/server/public/assets/diagram-5BDNPKRD-CqJFt5ZM.js.gz +0 -0
  628. package/payload/server/public/assets/diagram-G4DWMVQ6-WQIyAZMn.js.br +0 -0
  629. package/payload/server/public/assets/diagram-G4DWMVQ6-WQIyAZMn.js.gz +0 -0
  630. package/payload/server/public/assets/diagram-MMDJMWI5-jcKc4a2w.js.br +0 -0
  631. package/payload/server/public/assets/diagram-MMDJMWI5-jcKc4a2w.js.gz +0 -0
  632. package/payload/server/public/assets/diagram-TYMM5635-Bbt2KuWe.js.br +0 -0
  633. package/payload/server/public/assets/diagram-TYMM5635-Bbt2KuWe.js.gz +0 -0
  634. package/payload/server/public/assets/dispatch-Dx9-ty1K.js +0 -1
  635. package/payload/server/public/assets/dispatch-Dx9-ty1K.js.br +0 -0
  636. package/payload/server/public/assets/dispatch-Dx9-ty1K.js.gz +0 -0
  637. package/payload/server/public/assets/dist-9RiN6lky.js.br +0 -0
  638. package/payload/server/public/assets/dist-9RiN6lky.js.gz +0 -0
  639. package/payload/server/public/assets/erDiagram-SMLLAGMA-BBm6azPJ.js.br +0 -0
  640. package/payload/server/public/assets/erDiagram-SMLLAGMA-BBm6azPJ.js.gz +0 -0
  641. package/payload/server/public/assets/field-D-P6CsWA.js +0 -1
  642. package/payload/server/public/assets/field-D-P6CsWA.js.br +0 -0
  643. package/payload/server/public/assets/field-D-P6CsWA.js.gz +0 -0
  644. package/payload/server/public/assets/file-text-RWintp9q.js.br +0 -0
  645. package/payload/server/public/assets/file-text-RWintp9q.js.gz +0 -0
  646. package/payload/server/public/assets/flatten-BurGKeIy.js.br +0 -0
  647. package/payload/server/public/assets/flatten-BurGKeIy.js.gz +0 -0
  648. package/payload/server/public/assets/flowDiagram-DWJPFMVM-_r45DYJ8.js.br +0 -0
  649. package/payload/server/public/assets/flowDiagram-DWJPFMVM-_r45DYJ8.js.gz +0 -0
  650. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-Bjgj9Bej.js.br +0 -0
  651. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-Bjgj9Bej.js.gz +0 -0
  652. package/payload/server/public/assets/gitGraph-7Q5UKJZL-DdbK59od.js +0 -1
  653. package/payload/server/public/assets/gitGraph-7Q5UKJZL-DdbK59od.js.br +0 -0
  654. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-DTRdhGJA.js.br +0 -0
  655. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-DTRdhGJA.js.gz +0 -0
  656. package/payload/server/public/assets/graph-CpBlfYrJ.js.br +0 -0
  657. package/payload/server/public/assets/graph-CpBlfYrJ.js.gz +0 -0
  658. package/payload/server/public/assets/graph-labels-BOMyPppX.js.br +0 -0
  659. package/payload/server/public/assets/graph-labels-BOMyPppX.js.gz +0 -0
  660. package/payload/server/public/assets/graphlib-DT4h6-4N.js.br +0 -0
  661. package/payload/server/public/assets/graphlib-DT4h6-4N.js.gz +0 -0
  662. package/payload/server/public/assets/info-OMHHGYJF-BR8gm0wj.js +0 -1
  663. package/payload/server/public/assets/info-OMHHGYJF-BR8gm0wj.js.br +0 -0
  664. package/payload/server/public/assets/infoDiagram-42DDH7IO-Cr3Efss6.js +0 -2
  665. package/payload/server/public/assets/infoDiagram-42DDH7IO-Cr3Efss6.js.br +0 -0
  666. package/payload/server/public/assets/infoDiagram-42DDH7IO-Cr3Efss6.js.gz +0 -0
  667. package/payload/server/public/assets/isEmpty-C5v0-EY7.js.br +0 -0
  668. package/payload/server/public/assets/isEmpty-C5v0-EY7.js.gz +0 -0
  669. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-BklHzVHm.js.br +0 -0
  670. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-BklHzVHm.js.gz +0 -0
  671. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-Ckxx2CmV.js.br +0 -0
  672. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-Ckxx2CmV.js.gz +0 -0
  673. package/payload/server/public/assets/jsx-runtime-5lmxFBIw.js.br +0 -0
  674. package/payload/server/public/assets/jsx-runtime-5lmxFBIw.js.gz +0 -0
  675. package/payload/server/public/assets/jsx-runtime-DxsQ5Y-z.css.br +0 -0
  676. package/payload/server/public/assets/kanban-definition-6JOO6SKY-BLELXpqn.js.br +0 -0
  677. package/payload/server/public/assets/kanban-definition-6JOO6SKY-BLELXpqn.js.gz +0 -0
  678. package/payload/server/public/assets/line-BkI5icOY.js.br +0 -0
  679. package/payload/server/public/assets/line-BkI5icOY.js.gz +0 -0
  680. package/payload/server/public/assets/linear-B64ANRVs.js.br +0 -0
  681. package/payload/server/public/assets/linear-B64ANRVs.js.gz +0 -0
  682. package/payload/server/public/assets/mermaid-parser.core-qXPKkdJe.js.br +0 -0
  683. package/payload/server/public/assets/mermaid-parser.core-qXPKkdJe.js.gz +0 -0
  684. package/payload/server/public/assets/mermaid.core-BMsz65Wy.js.br +0 -0
  685. package/payload/server/public/assets/mermaid.core-BMsz65Wy.js.gz +0 -0
  686. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-DhFTS2sx.js.br +0 -0
  687. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-DhFTS2sx.js.gz +0 -0
  688. package/payload/server/public/assets/operator-DFgW6GiH.js +0 -1
  689. package/payload/server/public/assets/operator-DFgW6GiH.js.br +0 -0
  690. package/payload/server/public/assets/operator-DFgW6GiH.js.gz +0 -0
  691. package/payload/server/public/assets/ordinal-CJ_pL32Z.js.br +0 -0
  692. package/payload/server/public/assets/ordinal-CJ_pL32Z.js.gz +0 -0
  693. package/payload/server/public/assets/packet-4T2RLAQJ-B31PbAeA.js +0 -1
  694. package/payload/server/public/assets/packet-4T2RLAQJ-B31PbAeA.js.br +0 -0
  695. package/payload/server/public/assets/page-BRShHSH0.js.br +0 -0
  696. package/payload/server/public/assets/page-BRShHSH0.js.gz +0 -0
  697. package/payload/server/public/assets/page-BbBCu9iP.js.br +0 -0
  698. package/payload/server/public/assets/page-BbBCu9iP.js.gz +0 -0
  699. package/payload/server/public/assets/pdf-render-ynIPXfRA.js.br +0 -0
  700. package/payload/server/public/assets/pdf-render-ynIPXfRA.js.gz +0 -0
  701. package/payload/server/public/assets/pie-ZZUOXDRM-BbSc1VXl.js +0 -1
  702. package/payload/server/public/assets/pie-ZZUOXDRM-BbSc1VXl.js.br +0 -0
  703. package/payload/server/public/assets/pieDiagram-DEJITSTG-B2TxkbHK.js.br +0 -0
  704. package/payload/server/public/assets/pieDiagram-DEJITSTG-B2TxkbHK.js.gz +0 -0
  705. package/payload/server/public/assets/play-BJxUaf6-.js +0 -1
  706. package/payload/server/public/assets/play-BJxUaf6-.js.br +0 -0
  707. package/payload/server/public/assets/play-BJxUaf6-.js.gz +0 -0
  708. package/payload/server/public/assets/public-DkObqkzL.js.br +0 -0
  709. package/payload/server/public/assets/public-DkObqkzL.js.gz +0 -0
  710. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-GsMxIJuS.js.br +0 -0
  711. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-GsMxIJuS.js.gz +0 -0
  712. package/payload/server/public/assets/radar-PYXPWWZC-B0La8_mZ.js +0 -1
  713. package/payload/server/public/assets/radar-PYXPWWZC-B0La8_mZ.js.br +0 -0
  714. package/payload/server/public/assets/reduce-CfkEiHc9.js.br +0 -0
  715. package/payload/server/public/assets/reduce-CfkEiHc9.js.gz +0 -0
  716. package/payload/server/public/assets/requirementDiagram-MS252O5E-DqNprm-1.js.br +0 -0
  717. package/payload/server/public/assets/requirementDiagram-MS252O5E-DqNprm-1.js.gz +0 -0
  718. package/payload/server/public/assets/rotate-ccw-DgMO69nh.js.br +0 -0
  719. package/payload/server/public/assets/rotate-ccw-DgMO69nh.js.gz +0 -0
  720. package/payload/server/public/assets/routines-D9kvg_Xu.js.br +0 -0
  721. package/payload/server/public/assets/routines-D9kvg_Xu.js.gz +0 -0
  722. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-B-kRuiuz.js.br +0 -0
  723. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-B-kRuiuz.js.gz +0 -0
  724. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DEhL9g3K.js.br +0 -0
  725. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DEhL9g3K.js.gz +0 -0
  726. package/payload/server/public/assets/skills-l5I9HZ3D.js.br +0 -0
  727. package/payload/server/public/assets/skills-l5I9HZ3D.js.gz +0 -0
  728. package/payload/server/public/assets/src-BrAT6wKv.js.br +0 -0
  729. package/payload/server/public/assets/src-BrAT6wKv.js.gz +0 -0
  730. package/payload/server/public/assets/stateDiagram-FHFEXIEX-Q-g6BHdz.js.br +0 -0
  731. package/payload/server/public/assets/stateDiagram-FHFEXIEX-Q-g6BHdz.js.gz +0 -0
  732. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-ssRWItVj.js +0 -1
  733. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-ssRWItVj.js.br +0 -0
  734. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-ssRWItVj.js.gz +0 -0
  735. package/payload/server/public/assets/tasks-C2qJMv6i.js.br +0 -0
  736. package/payload/server/public/assets/tasks-C2qJMv6i.js.gz +0 -0
  737. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-B3-52q4Q.js.br +0 -0
  738. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-B3-52q4Q.js.gz +0 -0
  739. package/payload/server/public/assets/treeView-SZITEDCU-BBR3hu9P.js +0 -1
  740. package/payload/server/public/assets/treeView-SZITEDCU-BBR3hu9P.js.br +0 -0
  741. package/payload/server/public/assets/treemap-W4RFUUIX-wSQMuzBT.js +0 -1
  742. package/payload/server/public/assets/treemap-W4RFUUIX-wSQMuzBT.js.br +0 -0
  743. package/payload/server/public/assets/triangle-alert-BnC67uSs.js.br +0 -0
  744. package/payload/server/public/assets/triangle-alert-BnC67uSs.js.gz +0 -0
  745. package/payload/server/public/assets/useCopyFeedback-1RmgkTFh.js.br +0 -0
  746. package/payload/server/public/assets/useCopyFeedback-1RmgkTFh.js.gz +0 -0
  747. package/payload/server/public/assets/useMediaQuery-BQslddHQ.js.br +0 -0
  748. package/payload/server/public/assets/useMediaQuery-BQslddHQ.js.gz +0 -0
  749. package/payload/server/public/assets/useVoiceRecorder-BeZNQEC4.js.br +0 -0
  750. package/payload/server/public/assets/useVoiceRecorder-BeZNQEC4.js.gz +0 -0
  751. package/payload/server/public/assets/vennDiagram-DHZGUBPP-Bzm1VDi1.js.br +0 -0
  752. package/payload/server/public/assets/vennDiagram-DHZGUBPP-Bzm1VDi1.js.gz +0 -0
  753. package/payload/server/public/assets/wardley-RL74JXVD-3QaECtQN.js +0 -1
  754. package/payload/server/public/assets/wardley-RL74JXVD-3QaECtQN.js.br +0 -0
  755. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-DIqGZr4v.js.br +0 -0
  756. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-DIqGZr4v.js.gz +0 -0
  757. package/payload/server/public/assets/wrench-D4ufQG6C.js.br +0 -0
  758. package/payload/server/public/assets/wrench-D4ufQG6C.js.gz +0 -0
  759. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-0W2L2hQA.js.br +0 -0
  760. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-0W2L2hQA.js.gz +0 -0
  761. package/payload/server/public/dispatch.html +0 -20
  762. /package/payload/server/public/assets/{_baseFor-D1duyODO.js → _baseFor-BApe6Tla.js} +0 -0
  763. /package/payload/server/public/assets/{_baseFor-D1duyODO.js.br → _baseFor-BApe6Tla.js.br} +0 -0
  764. /package/payload/server/public/assets/{_baseFor-D1duyODO.js.gz → _baseFor-BApe6Tla.js.gz} +0 -0
  765. /package/payload/server/public/assets/{array-j7Xa9Fap.js → array-eiH4WfvY.js} +0 -0
  766. /package/payload/server/public/assets/{array-j7Xa9Fap.js.br → array-eiH4WfvY.js.br} +0 -0
  767. /package/payload/server/public/assets/{chunk-DlZTsV_O.js → chunk-BycB0eMI.js} +0 -0
  768. /package/payload/server/public/assets/{chunk-DlZTsV_O.js.br → chunk-BycB0eMI.js.br} +0 -0
  769. /package/payload/server/public/assets/{chunk-DlZTsV_O.js.gz → chunk-BycB0eMI.js.gz} +0 -0
  770. /package/payload/server/public/assets/{cytoscape.esm-Dob3eilA.js → cytoscape.esm-BZ6NYo0w.js} +0 -0
  771. /package/payload/server/public/assets/{cytoscape.esm-Dob3eilA.js.br → cytoscape.esm-BZ6NYo0w.js.br} +0 -0
  772. /package/payload/server/public/assets/{cytoscape.esm-Dob3eilA.js.gz → cytoscape.esm-BZ6NYo0w.js.gz} +0 -0
  773. /package/payload/server/public/assets/{defaultLocale-BNILPWh2.js → defaultLocale-DWHqsa6O.js} +0 -0
  774. /package/payload/server/public/assets/{defaultLocale-BNILPWh2.js.br → defaultLocale-DWHqsa6O.js.br} +0 -0
  775. /package/payload/server/public/assets/{defaultLocale-BNILPWh2.js.gz → defaultLocale-DWHqsa6O.js.gz} +0 -0
  776. /package/payload/server/public/assets/{file-download-CN4H4Eih.js → file-download-B7zwa78w.js} +0 -0
  777. /package/payload/server/public/assets/{file-download-CN4H4Eih.js.br → file-download-B7zwa78w.js.br} +0 -0
  778. /package/payload/server/public/assets/{file-download-CN4H4Eih.js.gz → file-download-B7zwa78w.js.gz} +0 -0
  779. /package/payload/server/public/assets/{init-ve51bpJo.js → init-BdkYWjJJ.js} +0 -0
  780. /package/payload/server/public/assets/{init-ve51bpJo.js.br → init-BdkYWjJJ.js.br} +0 -0
  781. /package/payload/server/public/assets/{init-ve51bpJo.js.gz → init-BdkYWjJJ.js.gz} +0 -0
  782. /package/payload/server/public/assets/{katex-CJNaolDQ.js → katex-BCzoGtFh.js} +0 -0
  783. /package/payload/server/public/assets/{katex-CJNaolDQ.js.br → katex-BCzoGtFh.js.br} +0 -0
  784. /package/payload/server/public/assets/{katex-CJNaolDQ.js.gz → katex-BCzoGtFh.js.gz} +0 -0
  785. /package/payload/server/public/assets/{path-B4emajHp.js → path-DY2qBuPM.js} +0 -0
  786. /package/payload/server/public/assets/{path-B4emajHp.js.br → path-DY2qBuPM.js.br} +0 -0
  787. /package/payload/server/public/assets/{path-B4emajHp.js.gz → path-DY2qBuPM.js.gz} +0 -0
  788. /package/payload/server/public/assets/{preload-helper-3YNEDsJZ.js → preload-helper-eAV8hweq.js} +0 -0
  789. /package/payload/server/public/assets/{preload-helper-3YNEDsJZ.js.br → preload-helper-eAV8hweq.js.br} +0 -0
  790. /package/payload/server/public/assets/{preload-helper-3YNEDsJZ.js.gz → preload-helper-eAV8hweq.js.gz} +0 -0
  791. /package/payload/server/public/assets/{rough.esm-zabqYs6f.js → rough.esm-ec8xsRC7.js} +0 -0
  792. /package/payload/server/public/assets/{rough.esm-zabqYs6f.js.br → rough.esm-ec8xsRC7.js.br} +0 -0
  793. /package/payload/server/public/assets/{rough.esm-zabqYs6f.js.gz → rough.esm-ec8xsRC7.js.gz} +0 -0
@@ -1,20 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ATTENDANCE_COLLECT = exports.ATTENDANCE_MATCH = void 0;
4
+ exports.projectAttendances = projectAttendances;
3
5
  exports.projectJob = projectJob;
4
6
  exports.projectVisit = projectVisit;
5
7
  exports.readJob = readJob;
6
8
  exports.readVisit = readVisit;
7
9
  exports.readVisitRecordState = readVisitRecordState;
8
10
  exports.readVisitsForJob = readVisitsForJob;
11
+ exports.readOpenVisitsForWorker = readOpenVisitsForWorker;
9
12
  exports.readCommitments = readCommitments;
13
+ exports.readPreviousVisits = readPreviousVisits;
10
14
  exports.buildJobListQuery = buildJobListQuery;
11
15
  exports.readJobs = readJobs;
12
16
  exports.readNodeId = readNodeId;
17
+ exports.readSiteLocation = readSiteLocation;
18
+ exports.readDraft = readDraft;
19
+ exports.readDrafts = readDrafts;
13
20
  exports.readSiteHistory = readSiteHistory;
14
21
  exports.readVisitsInWindow = readVisitsInWindow;
15
22
  exports.nonZuluStarts = nonZuluStarts;
16
23
  exports.readDay = readDay;
24
+ exports.projectFieldVisit = projectFieldVisit;
17
25
  exports.readWorkerDay = readWorkerDay;
26
+ exports.readFieldVisit = readFieldVisit;
18
27
  exports.readJobList = readJobList;
19
28
  exports.readCounts = readCounts;
20
29
  const session_js_1 = require("./session.js");
@@ -30,6 +39,58 @@ function num(v) {
30
39
  function str(v) {
31
40
  return typeof v === "string" && v.length > 0 ? v : null;
32
41
  }
42
+ /**
43
+ * The attendance sub-pattern, as one string every visit query interpolates
44
+ * (Task 2512).
45
+ *
46
+ * It COLLECTS rather than returning a row per attender, and that is the whole
47
+ * point: `OPTIONAL MATCH (v)-[:ATTENDED_BY]->(e:Engineer)` returned one record
48
+ * per edge, so a two-worker visit arrived as two rows carrying one set of times
49
+ * and rendered as two separate visits. `collect` drops nulls, so an unallocated
50
+ * visit yields `[]` and never a list holding one empty map.
51
+ *
52
+ * Interpolated rather than repeated by hand because nine queries need it, and a
53
+ * hand-copied ninth is the one that keeps the old shape.
54
+ */
55
+ exports.ATTENDANCE_MATCH = `OPTIONAL MATCH (v)-[:HAS_ATTENDANCE]->(att:Attendance)-[:BY_ENGINEER]->(e:Engineer)`;
56
+ /** The collected list, named `attendances`. Pair with `ATTENDANCE_MATCH`. */
57
+ exports.ATTENDANCE_COLLECT = `collect(CASE WHEN att IS NULL THEN NULL ELSE {
58
+ workerId: e.engineerId,
59
+ arrivedPressedAt: att.arrivedPressedAt,
60
+ arrivedObservedAt: att.arrivedObservedAt,
61
+ arrivedObservedDistanceM: att.arrivedObservedDistanceM
62
+ } END) AS attendances`;
63
+ /**
64
+ * Project the collected list, and derive the sole-attendee scalars from it.
65
+ *
66
+ * The scalars are populated only at exactly one attendance. At two they are
67
+ * null, because "which single worker?" has no answer and returning either one
68
+ * is a silent cross-assignment — the same failure `portal-visits-push.ts`
69
+ * refuses by binding on a property rather than matching a name.
70
+ */
71
+ function projectAttendances(g) {
72
+ const raw = g.get("attendances") ?? [];
73
+ const attendances = raw
74
+ .filter((a) => a && typeof a.workerId === "string" && a.workerId.length > 0)
75
+ .map((a) => ({
76
+ workerId: String(a.workerId),
77
+ arrivedPressedAt: str(a.arrivedPressedAt),
78
+ arrivedObservedAt: str(a.arrivedObservedAt),
79
+ arrivedObservedDistanceM: a.arrivedObservedDistanceM == null ? null : num(a.arrivedObservedDistanceM),
80
+ }))
81
+ // Sorted here rather than in Cypher: `collect` has no ORDER BY of its own,
82
+ // and two reads of one visit returning different orders would make a
83
+ // rendered card's worker order arbitrary.
84
+ .sort((x, y) => (x.workerId < y.workerId ? -1 : x.workerId > y.workerId ? 1 : 0));
85
+ const sole = attendances.length === 1 ? attendances[0] : null;
86
+ return {
87
+ attendances,
88
+ workerId: sole?.workerId ?? null,
89
+ arrivedPressedAt: sole?.arrivedPressedAt ?? null,
90
+ arrivedObservedAt: sole?.arrivedObservedAt ?? null,
91
+ arrivedObservedDistanceM: sole?.arrivedObservedDistanceM ?? null,
92
+ };
93
+ }
33
94
  /** Shared job projection, so every job query returns one shape. */
34
95
  function projectJob(g) {
35
96
  return {
@@ -45,7 +106,6 @@ function projectJob(g) {
45
106
  }
46
107
  /** Shared visit projection, so the day read and its tests cannot drift apart. */
47
108
  function projectVisit(g) {
48
- const dist = g.get("arrivedObservedDistanceM");
49
109
  return {
50
110
  visitId: String(g.get("visitId")),
51
111
  jobId: str(g.get("jobId")),
@@ -53,14 +113,11 @@ function projectVisit(g) {
53
113
  startDate: str(g.get("startDate")),
54
114
  endDate: str(g.get("endDate")),
55
115
  purpose: str(g.get("purpose")),
56
- workerId: str(g.get("workerId")),
57
116
  siteName: str(g.get("siteName")),
58
117
  customerId: str(g.get("customerId")),
59
118
  customerName: str(g.get("customerName")),
60
119
  jobType: str(g.get("jobType")),
61
- arrivedPressedAt: str(g.get("arrivedPressedAt")),
62
- arrivedObservedAt: str(g.get("arrivedObservedAt")),
63
- arrivedObservedDistanceM: dist == null ? null : num(dist),
120
+ ...projectAttendances(g),
64
121
  };
65
122
  }
66
123
  async function readJob(session, accountId, jobId) {
@@ -78,18 +135,15 @@ async function readJob(session, accountId, jobId) {
78
135
  async function readVisit(session, accountId, visitId) {
79
136
  const r = await session.run(`MATCH (v:Visit {accountId: $accountId, visitId: $visitId})
80
137
  OPTIONAL MATCH (j:Job)-[:HAS_VISIT]->(v)
81
- OPTIONAL MATCH (v)-[:ATTENDED_BY]->(e:Engineer)
138
+ ${exports.ATTENDANCE_MATCH}
139
+ WITH v, j, ${exports.ATTENDANCE_COLLECT}
82
140
  RETURN v.visitId AS visitId, j.jobId AS jobId, v.status AS status,
83
141
  v.startDate AS startDate, v.endDate AS endDate, v.purpose AS purpose,
84
- e.engineerId AS workerId,
85
- v.arrivedPressedAt AS arrivedPressedAt,
86
- v.arrivedObservedAt AS arrivedObservedAt,
87
- v.arrivedObservedDistanceM AS arrivedObservedDistanceM
142
+ attendances
88
143
  LIMIT 1`, { accountId, visitId });
89
144
  if (r.records.length === 0)
90
145
  return null;
91
146
  const g = r.records[0];
92
- const dist = g.get("arrivedObservedDistanceM");
93
147
  return {
94
148
  visitId: String(g.get("visitId")),
95
149
  jobId: str(g.get("jobId")),
@@ -97,10 +151,7 @@ async function readVisit(session, accountId, visitId) {
97
151
  startDate: str(g.get("startDate")),
98
152
  endDate: str(g.get("endDate")),
99
153
  purpose: str(g.get("purpose")),
100
- workerId: str(g.get("workerId")),
101
- arrivedPressedAt: str(g.get("arrivedPressedAt")),
102
- arrivedObservedAt: str(g.get("arrivedObservedAt")),
103
- arrivedObservedDistanceM: dist == null ? null : num(dist),
154
+ ...projectAttendances(g),
104
155
  };
105
156
  }
106
157
  async function readVisitRecordState(session, accountId, visitId) {
@@ -134,32 +185,69 @@ async function readVisitRecordState(session, accountId, visitId) {
134
185
  }
135
186
  async function readVisitsForJob(session, accountId, jobId) {
136
187
  const r = await session.run(`MATCH (j:Job {accountId: $accountId, jobId: $jobId})-[:HAS_VISIT]->(v:Visit)
137
- OPTIONAL MATCH (v)-[:ATTENDED_BY]->(e:Engineer)
188
+ ${exports.ATTENDANCE_MATCH}
189
+ WITH v, ${exports.ATTENDANCE_COLLECT}
138
190
  RETURN v.visitId AS visitId, v.status AS status, v.startDate AS startDate,
139
- v.endDate AS endDate, v.purpose AS purpose, e.engineerId AS workerId,
140
- v.arrivedPressedAt AS arrivedPressedAt,
141
- v.arrivedObservedAt AS arrivedObservedAt,
142
- v.arrivedObservedDistanceM AS arrivedObservedDistanceM
191
+ v.endDate AS endDate, v.purpose AS purpose, attendances
143
192
  ORDER BY v.startDate ASC`, { accountId, jobId });
193
+ return r.records.map((g) => ({
194
+ visitId: String(g.get("visitId")),
195
+ jobId,
196
+ status: String(g.get("status")),
197
+ startDate: str(g.get("startDate")),
198
+ endDate: str(g.get("endDate")),
199
+ purpose: str(g.get("purpose")),
200
+ ...projectAttendances(g),
201
+ }));
202
+ }
203
+ /**
204
+ * A worker's visits that are not finished, newest first (Task 2510).
205
+ *
206
+ * Deliberately not scoped to today. A visit that overran yesterday is still
207
+ * open, and a day window would silently drop the photo of the job most likely to
208
+ * need one.
209
+ */
210
+ async function readOpenVisitsForWorker(session, accountId, workerId, terminalStatuses) {
211
+ const r = await session.run(
212
+ // Anchored on the caller's own attendance, then the whole visit's collected
213
+ // beside it — the shape `readWorkerDay` uses, for the same reason: the
214
+ // sole-attendee rule returns null on a visit they share, and this list is
215
+ // what a worker's photo or voice note gets attached to.
216
+ `MATCH (v:Visit {accountId: $accountId})-[:HAS_ATTENDANCE]->(mine:Attendance)-[:BY_ENGINEER]->(:Engineer {engineerId: $workerId})
217
+ WHERE NOT v.status IN $terminal
218
+ OPTIONAL MATCH (j:Job)-[:HAS_VISIT]->(v)
219
+ ${exports.ATTENDANCE_MATCH}
220
+ WITH v, j, mine, ${exports.ATTENDANCE_COLLECT}
221
+ RETURN v.visitId AS visitId, j.jobId AS jobId, v.status AS status,
222
+ v.startDate AS startDate, v.endDate AS endDate, v.purpose AS purpose,
223
+ attendances,
224
+ mine.arrivedPressedAt AS ownArrivedPressedAt,
225
+ mine.arrivedObservedAt AS ownArrivedObservedAt,
226
+ mine.arrivedObservedDistanceM AS ownArrivedObservedDistanceM
227
+ ORDER BY v.startDate DESC`, { accountId, workerId, terminal: [...terminalStatuses] });
144
228
  return r.records.map((g) => {
145
- const dist = g.get("arrivedObservedDistanceM");
229
+ const dist = g.get("ownArrivedObservedDistanceM");
146
230
  return {
147
231
  visitId: String(g.get("visitId")),
148
- jobId,
232
+ jobId: str(g.get("jobId")),
149
233
  status: String(g.get("status")),
150
234
  startDate: str(g.get("startDate")),
151
235
  endDate: str(g.get("endDate")),
152
236
  purpose: str(g.get("purpose")),
153
- workerId: str(g.get("workerId")),
154
- arrivedPressedAt: str(g.get("arrivedPressedAt")),
155
- arrivedObservedAt: str(g.get("arrivedObservedAt")),
237
+ attendances: projectAttendances(g).attendances,
238
+ workerId,
239
+ arrivedPressedAt: str(g.get("ownArrivedPressedAt")),
240
+ arrivedObservedAt: str(g.get("ownArrivedObservedAt")),
156
241
  arrivedObservedDistanceM: dist == null ? null : num(dist),
157
242
  };
158
243
  });
159
244
  }
160
245
  /** Visits a worker is already committed to inside `[from, to)`. */
161
246
  async function readCommitments(session, accountId, from, to) {
162
- const r = await session.run(`MATCH (v:Visit {accountId: $accountId})-[:ATTENDED_BY]->(e:Engineer)
247
+ const r = await session.run(
248
+ // One row per ATTENDANCE is correct here and nowhere else: a commitment
249
+ // belongs to a worker, so a two-worker visit legitimately commits both.
250
+ `MATCH (v:Visit {accountId: $accountId})-[:HAS_ATTENDANCE]->(:Attendance)-[:BY_ENGINEER]->(e:Engineer)
163
251
  WHERE v.startDate < $to AND coalesce(v.endDate, v.startDate) > $from
164
252
  RETURN e.engineerId AS workerId, v.visitId AS visitId,
165
253
  v.startDate AS start, coalesce(v.endDate, v.startDate) AS end`, { accountId, from, to });
@@ -178,6 +266,60 @@ async function readCommitments(session, accountId, from, to) {
178
266
  }
179
267
  return out;
180
268
  }
269
+ /**
270
+ * Each worker's latest visit ending at or before `before`, no earlier than
271
+ * `dayStart`.
272
+ *
273
+ * `readCommitments` cannot answer this: it reads only inside the requested
274
+ * window, and the origin of a journey is by definition outside it.
275
+ *
276
+ * **Both bounds, always.** Without the upper one, a worker's current job
277
+ * becomes the origin and the estimate measures a journey that has not happened
278
+ * yet. Without the lower one, yesterday's last job becomes this morning's
279
+ * origin and the office is shown a drive nobody will make. `dayStart` is the
280
+ * caller's, computed in the account's timezone, because "that day" is not a
281
+ * UTC fact.
282
+ *
283
+ * The collapse to one visit per worker is done here rather than in the Cypher.
284
+ * A `head(collect(...))` would be invisible to every test that does not hold a
285
+ * real database, and picking the wrong origin visit is the failure that
286
+ * produces a confident number for the wrong journey.
287
+ */
288
+ async function readPreviousVisits(session, accountId, before, dayStart) {
289
+ const r = await session.run(
290
+ // One row per ATTENDANCE, as `readCommitments` above: a two-worker visit is
291
+ // where BOTH of them were, so each is legitimately coming from it. Task 2512
292
+ // retired `ATTENDED_BY`; this query was written against it and would have
293
+ // matched nothing, reporting every worker as having no previous visit.
294
+ `MATCH (v:Visit {accountId: $accountId})-[:HAS_ATTENDANCE]->(:Attendance)-[:BY_ENGINEER]->(e:Engineer)
295
+ WHERE coalesce(v.endDate, v.startDate) <= $before
296
+ AND coalesce(v.endDate, v.startDate) >= $dayStart
297
+ OPTIONAL MATCH (j:Job {accountId: $accountId})-[:HAS_VISIT]->(v)
298
+ OPTIONAL MATCH (j)-[:AT_SITE]->(s:Site {accountId: $accountId})
299
+ RETURN e.engineerId AS workerId, v.visitId AS visitId,
300
+ coalesce(v.endDate, v.startDate) AS endDate, s.siteId AS siteId`, { accountId, before, dayStart });
301
+ const out = new Map();
302
+ const latest = new Map();
303
+ for (const g of r.records) {
304
+ const workerId = str(g.get("workerId"));
305
+ if (!workerId)
306
+ continue;
307
+ const endDate = str(g.get("endDate"));
308
+ if (endDate === null)
309
+ continue;
310
+ const held = latest.get(workerId);
311
+ // Strictly later, so two visits ending on the same instant keep the first
312
+ // the query returned rather than flipping between runs.
313
+ if (held !== undefined && held >= endDate)
314
+ continue;
315
+ latest.set(workerId, endDate);
316
+ out.set(workerId, {
317
+ visitId: String(g.get("visitId")),
318
+ siteId: str(g.get("siteId")),
319
+ });
320
+ }
321
+ return out;
322
+ }
181
323
  /**
182
324
  * The job-list query as text plus params, extracted so its shape is testable
183
325
  * without a database.
@@ -191,7 +333,7 @@ function buildJobListQuery(filter) {
191
333
  if (filter.unallocatedOnly)
192
334
  clauses.push("NOT (j)-[:HAS_VISIT]->(:Visit)");
193
335
  if (filter.workerId) {
194
- clauses.push("EXISTS { MATCH (j)-[:HAS_VISIT]->(:Visit)-[:ATTENDED_BY]->(w:Engineer) WHERE w.engineerId = $workerId }");
336
+ clauses.push("EXISTS { MATCH (j)-[:HAS_VISIT]->(:Visit)-[:HAS_ATTENDANCE]->(:Attendance)-[:BY_ENGINEER]->(w:Engineer) WHERE w.engineerId = $workerId }");
195
337
  }
196
338
  // One EXISTS carrying both bounds, never two. Two independent clauses are
197
339
  // satisfied by DIFFERENT visits — a job with one visit in January and another
@@ -238,41 +380,107 @@ async function readNodeId(session, accountId, label, keyProp, keyValue) {
238
380
  RETURN elementId(n) AS id LIMIT 1`, { accountId, keyProp, keyValue });
239
381
  return r.records.length === 0 ? null : String(r.records[0].get("id"));
240
382
  }
383
+ /**
384
+ * A site's position and radius, or null when the account holds no such site
385
+ * (Task 2510).
386
+ *
387
+ * A site that exists but carries no coordinates returns nulls rather than null:
388
+ * "this site is not on the account" and "this site has never been placed" are
389
+ * different problems, and the geofence names each of them separately.
390
+ */
391
+ async function readSiteLocation(session, accountId, siteId) {
392
+ const r = await session.run(`MATCH (s:Site {accountId: $accountId, siteId: $siteId})
393
+ RETURN s.siteId AS siteId, s.latitude AS latitude, s.longitude AS longitude,
394
+ s.geofenceRadiusM AS geofenceRadiusM
395
+ LIMIT 1`, { accountId, siteId });
396
+ if (r.records.length === 0)
397
+ return null;
398
+ const g = r.records[0];
399
+ const lat = g.get("latitude");
400
+ const lon = g.get("longitude");
401
+ const rad = g.get("geofenceRadiusM");
402
+ return {
403
+ siteId: String(g.get("siteId")),
404
+ latitude: lat == null ? null : num(lat),
405
+ longitude: lon == null ? null : num(lon),
406
+ geofenceRadiusM: rad == null ? null : num(rad),
407
+ };
408
+ }
409
+ const DRAFT_RETURN = `d.draftId AS draftId, d.receivedAt AS receivedAt, d.source AS source,
410
+ d.sourceRef AS sourceRef, d.jobType AS jobType, d.siteId AS siteId,
411
+ d.customerId AS customerId, d.description AS description,
412
+ d.verdict AS verdict, d.decidedAt AS decidedAt, d.decidedBy AS decidedBy,
413
+ d.reason AS reason, d.jobId AS jobId`;
414
+ function projectDraft(rec) {
415
+ const s = (k) => {
416
+ const v = rec.get(k);
417
+ return typeof v === "string" && v.length > 0 ? v : null;
418
+ };
419
+ return {
420
+ draftId: s("draftId") ?? "",
421
+ receivedAt: s("receivedAt") ?? "",
422
+ source: s("source") ?? "",
423
+ sourceRef: s("sourceRef") ?? "",
424
+ jobType: s("jobType"),
425
+ siteId: s("siteId"),
426
+ customerId: s("customerId"),
427
+ description: s("description"),
428
+ verdict: s("verdict"),
429
+ decidedAt: s("decidedAt"),
430
+ decidedBy: s("decidedBy"),
431
+ reason: s("reason"),
432
+ jobId: s("jobId"),
433
+ };
434
+ }
435
+ /** One draft by its id, or null. */
436
+ async function readDraft(session, accountId, draftId) {
437
+ const r = await session.run(`MATCH (d:IntakeDraft {accountId: $accountId, draftId: $draftId})
438
+ RETURN ${DRAFT_RETURN}`, { accountId, draftId });
439
+ return r.records.length === 0 ? null : projectDraft(r.records[0]);
440
+ }
441
+ /**
442
+ * The queue, oldest first. A null `verdict` argument means undecided only,
443
+ * which is what the queue is; a named verdict returns those already decided,
444
+ * because a rejection whose reason nobody can read is not a record of anything.
445
+ *
446
+ * Undecided is the ABSENCE of the property, never a written value, so the
447
+ * predicate is `IS NULL` rather than an equality against a sentinel.
448
+ */
449
+ async function readDrafts(session, accountId, verdict, limit) {
450
+ const r = await session.run(`MATCH (d:IntakeDraft {accountId: $accountId})
451
+ WHERE ($verdict IS NULL AND d.verdict IS NULL) OR d.verdict = $verdict
452
+ RETURN ${DRAFT_RETURN}
453
+ ORDER BY d.receivedAt ASC
454
+ LIMIT $limit`, { accountId, verdict, limit: Math.min(Math.max(limit, 1), 200) });
455
+ return r.records.map(projectDraft);
456
+ }
241
457
  /** Every visit at one site, newest first, with its job. */
242
458
  async function readSiteHistory(session, accountId, siteId, limit) {
243
459
  const r = await session.run(`MATCH (j:Job {accountId: $accountId})-[:AT_SITE]->(:Site {accountId: $accountId, siteId: $siteId})
244
460
  MATCH (j)-[:HAS_VISIT]->(v:Visit)
245
- OPTIONAL MATCH (v)-[:ATTENDED_BY]->(e:Engineer)
461
+ ${exports.ATTENDANCE_MATCH}
462
+ WITH j, v, ${exports.ATTENDANCE_COLLECT}
246
463
  RETURN j.jobId AS jobId, j.status AS jobStatus, v.visitId AS visitId,
247
464
  v.status AS status, v.startDate AS startDate, v.endDate AS endDate,
248
- v.purpose AS purpose, e.engineerId AS workerId,
465
+ v.purpose AS purpose, attendances,
249
466
  coalesce(v.notes, []) AS notes,
250
- size(coalesce(v.media, [])) AS mediaCount,
251
- v.arrivedPressedAt AS arrivedPressedAt,
252
- v.arrivedObservedAt AS arrivedObservedAt,
253
- v.arrivedObservedDistanceM AS arrivedObservedDistanceM
467
+ size(coalesce(v.media, [])) AS mediaCount
254
468
  ORDER BY v.startDate DESC
255
469
  LIMIT $limit`, { accountId, siteId, limit: Math.min(Math.max(limit, 1), 200) });
256
- return r.records.map((g) => {
257
- const dist = g.get("arrivedObservedDistanceM");
258
- return {
259
- visitId: String(g.get("visitId")),
260
- jobId: String(g.get("jobId")),
261
- jobStatus: String(g.get("jobStatus")),
262
- status: String(g.get("status")),
263
- startDate: str(g.get("startDate")),
264
- endDate: str(g.get("endDate")),
265
- purpose: str(g.get("purpose")),
266
- workerId: str(g.get("workerId")),
267
- notes: g.get("notes") ?? [],
268
- // A count, not the references. A worker at a door needs to know whether
269
- // photographs exist before deciding to load them on a bad signal.
270
- mediaCount: num(g.get("mediaCount") ?? 0),
271
- arrivedPressedAt: str(g.get("arrivedPressedAt")),
272
- arrivedObservedAt: str(g.get("arrivedObservedAt")),
273
- arrivedObservedDistanceM: dist == null ? null : num(dist),
274
- };
275
- });
470
+ return r.records.map((g) => ({
471
+ visitId: String(g.get("visitId")),
472
+ jobId: String(g.get("jobId")),
473
+ jobStatus: String(g.get("jobStatus")),
474
+ status: String(g.get("status")),
475
+ startDate: str(g.get("startDate")),
476
+ endDate: str(g.get("endDate")),
477
+ purpose: str(g.get("purpose")),
478
+ notes: g.get("notes") ?? [],
479
+ // A count, not the references. A worker at a door needs to know whether
480
+ // photographs exist before deciding to load them on a bad signal.
481
+ mediaCount: num(g.get("mediaCount") ?? 0),
482
+ ...projectAttendances(g),
483
+ }));
276
484
  }
277
485
  /** Every visit starting inside `[from, to)`. */
278
486
  async function readVisitsInWindow(session, accountId, from, to) {
@@ -280,30 +488,22 @@ async function readVisitsInWindow(session, accountId, from, to) {
280
488
  WHERE v.startDate >= $from AND v.startDate < $to
281
489
  OPTIONAL MATCH (j:Job)-[:HAS_VISIT]->(v)
282
490
  OPTIONAL MATCH (j)-[:AT_SITE]->(s:Site)
283
- OPTIONAL MATCH (v)-[:ATTENDED_BY]->(e:Engineer)
491
+ ${exports.ATTENDANCE_MATCH}
492
+ WITH v, j, s, ${exports.ATTENDANCE_COLLECT}
284
493
  RETURN v.visitId AS visitId, j.jobId AS jobId, v.status AS status,
285
494
  v.startDate AS startDate, v.endDate AS endDate, v.purpose AS purpose,
286
- e.engineerId AS workerId, s.name AS siteName,
287
- v.arrivedPressedAt AS arrivedPressedAt,
288
- v.arrivedObservedAt AS arrivedObservedAt,
289
- v.arrivedObservedDistanceM AS arrivedObservedDistanceM
495
+ attendances, s.name AS siteName
290
496
  ORDER BY v.startDate ASC`, { accountId, from, to });
291
- return r.records.map((g) => {
292
- const dist = g.get("arrivedObservedDistanceM");
293
- return {
294
- visitId: String(g.get("visitId")),
295
- jobId: str(g.get("jobId")),
296
- status: String(g.get("status")),
297
- startDate: str(g.get("startDate")),
298
- endDate: str(g.get("endDate")),
299
- purpose: str(g.get("purpose")),
300
- workerId: str(g.get("workerId")),
301
- siteName: str(g.get("siteName")),
302
- arrivedPressedAt: str(g.get("arrivedPressedAt")),
303
- arrivedObservedAt: str(g.get("arrivedObservedAt")),
304
- arrivedObservedDistanceM: dist == null ? null : num(dist),
305
- };
306
- });
497
+ return r.records.map((g) => ({
498
+ visitId: String(g.get("visitId")),
499
+ jobId: str(g.get("jobId")),
500
+ status: String(g.get("status")),
501
+ startDate: str(g.get("startDate")),
502
+ endDate: str(g.get("endDate")),
503
+ purpose: str(g.get("purpose")),
504
+ siteName: str(g.get("siteName")),
505
+ ...projectAttendances(g),
506
+ }));
307
507
  }
308
508
  /**
309
509
  * Visit ids whose `startDate` is not Zulu-normalised.
@@ -331,74 +531,193 @@ async function readDay(accountId, fromUtc, toUtc) {
331
531
  OPTIONAL MATCH (j:Job)-[:HAS_VISIT]->(v)
332
532
  OPTIONAL MATCH (j)-[:AT_SITE]->(s:Site)
333
533
  OPTIONAL MATCH (j)-[:FOR_CUSTOMER]->(c:Customer)
334
- OPTIONAL MATCH (v)-[:ATTENDED_BY]->(e:Engineer)
534
+ ${exports.ATTENDANCE_MATCH}
535
+ WITH v, j, s, c, ${exports.ATTENDANCE_COLLECT}
335
536
  RETURN v.visitId AS visitId, j.jobId AS jobId, v.status AS status,
336
537
  v.startDate AS startDate, v.endDate AS endDate, v.purpose AS purpose,
337
- e.engineerId AS workerId, s.name AS siteName,
538
+ attendances, s.name AS siteName,
338
539
  c.customerId AS customerId, c.name AS customerName,
339
- j.jobType AS jobType,
340
- v.arrivedPressedAt AS arrivedPressedAt,
341
- v.arrivedObservedAt AS arrivedObservedAt,
342
- v.arrivedObservedDistanceM AS arrivedObservedDistanceM
540
+ j.jobType AS jobType
343
541
  ORDER BY v.startDate ASC`, { accountId, from: fromUtc, to: toUtc });
344
542
  return r.records.map(projectVisit);
345
543
  });
346
544
  }
347
545
  /**
348
- * One worker's visits in a window, with the contact detail a doorstep needs.
546
+ * The columns a field card needs beyond a plain visit row, as one clause.
547
+ *
548
+ * Written once because two reads return this shape — the day list and the
549
+ * single-visit sheet read — and a card that differed between the two would be
550
+ * a worker seeing a telephone on one screen and not the other.
551
+ *
552
+ * It returns `attendances` and NO arrival columns, because the two reads
553
+ * legitimately differ on whose arrival a card shows: `readWorkerDay` shows the
554
+ * caller their own, and `readFieldVisit`, which names no worker, falls back to
555
+ * the sole-attendee rule. Each adds its own arrival clause; the columns they
556
+ * share stay here.
557
+ */
558
+ const FIELD_RETURN = `v.visitId AS visitId, j.jobId AS jobId, v.status AS status,
559
+ v.startDate AS startDate, v.endDate AS endDate, v.purpose AS purpose,
560
+ attendances,
561
+ s.siteId AS siteId, s.name AS siteName,
562
+ c.name AS customerName,
563
+ ct.name AS contactName, ct.telephone AS contactTelephone,
564
+ pa IS NOT NULL AS addressed,
565
+ pa.streetAddress AS streetAddress, pa.addressLocality AS addressLocality,
566
+ pa.postalCode AS postalCode`;
567
+ /**
568
+ * The optional neighbourhood a visit hangs in.
569
+ *
570
+ * Every hop is optional: a visit allocated before its job was linked must stay
571
+ * in the day rather than drop out of it.
572
+ *
573
+ * **The `WITH` is what stops a visit appearing twice.** An `OPTIONAL MATCH`
574
+ * that finds two nodes returns two rows, so a site holding two `AT_ADDRESS`
575
+ * edges — or a customer holding two contacts — would put the same visit on the
576
+ * worker's list once per match, each copy showing a different address. That
577
+ * state is reachable: `memory-write`'s edge check is warn-only, so nothing
578
+ * blocks a second edge being written directly.
579
+ *
580
+ * Which of two the collapse keeps is arbitrary, and it is not this query's job
581
+ * to choose. `dispatch-site-upsert` is what guarantees a site has one address:
582
+ * it clears the previous edge before writing the next.
583
+ *
584
+ * **Two aggregating `WITH`s, not one.** The attendance collect is a second
585
+ * multiplication on the same rows, and folding both into one `WITH` would make
586
+ * each address appear once per attendance and each attendance once per address.
587
+ * Collapsing them in turn keeps every grouping key a plain node.
588
+ *
589
+ * `carry` is the extra binding a caller needs kept alive across both — `, mine`
590
+ * for the worker day, empty for the sheet. Anything not named in a `WITH` is
591
+ * dropped, so a caller that binds a variable before this clause and reads it
592
+ * after must pass it here.
593
+ */
594
+ const fieldOptionalMatches = (carry) => `OPTIONAL MATCH (j:Job {accountId: $accountId})-[:HAS_VISIT]->(v)
595
+ OPTIONAL MATCH (j)-[:AT_SITE]->(s:Site {accountId: $accountId})
596
+ OPTIONAL MATCH (j)-[:FOR_CUSTOMER]->(c:Customer {accountId: $accountId})
597
+ OPTIONAL MATCH (s)-[:AT_ADDRESS]->(pa0:PostalAddress)
598
+ OPTIONAL MATCH (ct0:Contact {accountId: $accountId})-[:CONTACT_FOR]->(c)
599
+ WITH v${carry}, j, s, c,
600
+ head(collect(DISTINCT pa0)) AS pa,
601
+ head(collect(DISTINCT ct0)) AS ct
602
+ ${exports.ATTENDANCE_MATCH}
603
+ WITH v${carry}, j, s, c, pa, ct, ${exports.ATTENDANCE_COLLECT}`;
604
+ /**
605
+ * One field card from one record.
606
+ *
607
+ * `address` is set when the `AT_ADDRESS` edge resolved and omitted when it did
608
+ * not. The **edge** decides the key, read off its own `addressed` column rather
609
+ * than inferred from the three property columns: a PostalAddress missing its
610
+ * locality is still somewhere a worker can drive to, and inferring absence from
611
+ * empty properties would report the site unaddressed while the census, which
612
+ * counts the edge, called it addressed.
613
+ *
614
+ * `own` is the caller's own attendance, passed by `readWorkerDay` and omitted by
615
+ * the sheet read. With it, the four worker fields are that worker's; without it
616
+ * they fall back to the sole-attendee rule and go null on a shared visit. The
617
+ * distinction is load-bearing: a sheet that showed no arrival to the worker who
618
+ * pressed it would read as a lost press (Task 2512).
619
+ */
620
+ function projectFieldVisit(g, own) {
621
+ const addressed = g.get("addressed") === true;
622
+ const att = projectAttendances(g);
623
+ const worker = own ?? {
624
+ workerId: att.workerId,
625
+ arrivedPressedAt: att.arrivedPressedAt,
626
+ arrivedObservedAt: att.arrivedObservedAt,
627
+ arrivedObservedDistanceM: att.arrivedObservedDistanceM,
628
+ };
629
+ return {
630
+ visitId: String(g.get("visitId")),
631
+ jobId: str(g.get("jobId")),
632
+ status: String(g.get("status")),
633
+ startDate: str(g.get("startDate")),
634
+ endDate: str(g.get("endDate")),
635
+ purpose: str(g.get("purpose")),
636
+ attendances: att.attendances,
637
+ workerId: worker.workerId,
638
+ arrivedPressedAt: worker.arrivedPressedAt,
639
+ arrivedObservedAt: worker.arrivedObservedAt,
640
+ arrivedObservedDistanceM: worker.arrivedObservedDistanceM,
641
+ siteId: str(g.get("siteId")),
642
+ siteName: str(g.get("siteName")),
643
+ customerName: str(g.get("customerName")),
644
+ contactName: str(g.get("contactName")),
645
+ contactTelephone: str(g.get("contactTelephone")),
646
+ ...(addressed
647
+ ? {
648
+ address: {
649
+ streetAddress: str(g.get("streetAddress")),
650
+ addressLocality: str(g.get("addressLocality")),
651
+ postalCode: str(g.get("postalCode")),
652
+ },
653
+ }
654
+ : {}),
655
+ };
656
+ }
657
+ /**
658
+ * One worker's visits in a window, with the contact detail and the street a
659
+ * doorstep needs.
349
660
  *
350
661
  * A separate function rather than a widening of `readDay`, because the planner
351
662
  * draws a week of cards for the whole roster and needs a customer's telephone
352
663
  * on none of them.
353
- *
354
- * **No address and no postcode.** `schema-dispatch.md` declares neither on
355
- * `:Site`, and the only `PostalAddress` edge in the whole ontology is
356
- * logistics' `(:Stop)-[:AT_ADDRESS]->(:PostalAddress)`. Returning them as
357
- * always-null columns would read to a worker as "this site has no address"
358
- * rather than "we do not store one". Task 2514 adds the edge.
359
664
  */
360
665
  async function readWorkerDay(accountId, workerId, fromUtc, toUtc) {
361
666
  return (0, session_js_1.withSession)(async (session) => {
362
- const r = await session.run(`MATCH (v:Visit {accountId: $accountId})-[:ATTENDED_BY]->(e:Engineer {accountId: $accountId, engineerId: $workerId})
667
+ const r = await session.run(
668
+ // Anchored on the CALLER'S OWN attendance (`mine`), then the whole
669
+ // visit's attendances collected beside it. The worker's arrival times are
670
+ // read off `mine` rather than through the sole-attendee rule: on a visit
671
+ // they share with somebody, that rule returns null, and a field sheet
672
+ // showing no arrival to the worker who pressed it reads as a lost press.
673
+ `MATCH (v:Visit {accountId: $accountId})-[:HAS_ATTENDANCE]->(mine:Attendance)-[:BY_ENGINEER]->(:Engineer {accountId: $accountId, engineerId: $workerId})
363
674
  WHERE v.startDate >= $from AND v.startDate < $to
364
- OPTIONAL MATCH (j:Job {accountId: $accountId})-[:HAS_VISIT]->(v)
365
- OPTIONAL MATCH (j)-[:AT_SITE]->(s:Site {accountId: $accountId})
366
- OPTIONAL MATCH (j)-[:FOR_CUSTOMER]->(c:Customer {accountId: $accountId})
367
- OPTIONAL MATCH (ct:Contact {accountId: $accountId})-[:CONTACT_FOR]->(c)
368
- RETURN v.visitId AS visitId, j.jobId AS jobId, v.status AS status,
369
- v.startDate AS startDate, v.endDate AS endDate, v.purpose AS purpose,
370
- e.engineerId AS workerId,
371
- v.arrivedPressedAt AS arrivedPressedAt,
372
- v.arrivedObservedAt AS arrivedObservedAt,
373
- v.arrivedObservedDistanceM AS arrivedObservedDistanceM,
374
- s.siteId AS siteId, s.name AS siteName,
375
- c.name AS customerName,
376
- ct.name AS contactName, ct.telephone AS contactTelephone
675
+ ${fieldOptionalMatches(", mine")}
676
+ RETURN ${FIELD_RETURN},
677
+ mine.arrivedPressedAt AS ownArrivedPressedAt,
678
+ mine.arrivedObservedAt AS ownArrivedObservedAt,
679
+ mine.arrivedObservedDistanceM AS ownArrivedObservedDistanceM
377
680
  ORDER BY v.startDate ASC`, { accountId, workerId, from: fromUtc, to: toUtc });
378
681
  // Sorted in the query, not on the client: an empty result and an unsorted
379
682
  // one must not be able to look alike.
380
683
  return r.records.map((g) => {
381
- const dist = g.get("arrivedObservedDistanceM");
382
- return {
383
- visitId: String(g.get("visitId")),
384
- jobId: str(g.get("jobId")),
385
- status: String(g.get("status")),
386
- startDate: str(g.get("startDate")),
387
- endDate: str(g.get("endDate")),
388
- purpose: str(g.get("purpose")),
389
- workerId: str(g.get("workerId")),
390
- arrivedPressedAt: str(g.get("arrivedPressedAt")),
391
- arrivedObservedAt: str(g.get("arrivedObservedAt")),
684
+ const dist = g.get("ownArrivedObservedDistanceM");
685
+ return projectFieldVisit(g, {
686
+ workerId,
687
+ arrivedPressedAt: str(g.get("ownArrivedPressedAt")),
688
+ arrivedObservedAt: str(g.get("ownArrivedObservedAt")),
392
689
  arrivedObservedDistanceM: dist == null ? null : num(dist),
393
- siteId: str(g.get("siteId")),
394
- siteName: str(g.get("siteName")),
395
- customerName: str(g.get("customerName")),
396
- contactName: str(g.get("contactName")),
397
- contactTelephone: str(g.get("contactTelephone")),
398
- };
690
+ });
399
691
  });
400
692
  });
401
693
  }
694
+ /**
695
+ * One visit as a field card, for the job sheet.
696
+ *
697
+ * The sheet used to serve a plain `VisitRow`, which carries no site name, no
698
+ * customer and no contact, so every sheet rendered "Site not named" with no
699
+ * telephone on it. This is the same projection the day list uses, so the two
700
+ * screens cannot disagree.
701
+ *
702
+ * It takes a session because the sheet route already holds one, and it applies
703
+ * no worker filter: the route does its own ownership check, and a read that
704
+ * also filtered would turn another worker's visit into a 404 where the route
705
+ * means to return a 403.
706
+ */
707
+ async function readFieldVisit(session, accountId, visitId) {
708
+ const r = await session.run(
709
+ // No `mine` to anchor on, because the sheet applies no worker filter, so the
710
+ // four worker fields fall to the sole-attendee rule and go null on a shared
711
+ // visit. `attendances` carries everyone either way, which is what the sheet
712
+ // renders (Task 2512).
713
+ `MATCH (v:Visit {accountId: $accountId, visitId: $visitId})
714
+ ${fieldOptionalMatches("")}
715
+ RETURN ${FIELD_RETURN}
716
+ LIMIT 1`, { accountId, visitId });
717
+ if (r.records.length === 0)
718
+ return null;
719
+ return projectFieldVisit(r.records[0]);
720
+ }
402
721
  /** The job list, owning its own session. */
403
722
  async function readJobList(accountId, filter) {
404
723
  const { text, params } = buildJobListQuery(filter);