@rubytech/create-sitedesk-code 0.1.529 → 0.1.531

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 (341) hide show
  1. package/dist/index.js +13 -0
  2. package/package.json +1 -1
  3. package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/graph-write/dist/index.js +4 -0
  5. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  6. package/payload/platform/lib/graph-write/src/index.ts +4 -0
  7. package/payload/platform/lib/learning-constants/dist/index.d.ts +35 -0
  8. package/payload/platform/lib/learning-constants/dist/index.d.ts.map +1 -0
  9. package/payload/platform/lib/learning-constants/dist/index.js +50 -0
  10. package/payload/platform/lib/learning-constants/dist/index.js.map +1 -0
  11. package/payload/platform/lib/learning-constants/package.json +7 -0
  12. package/payload/platform/lib/learning-constants/src/index.test.ts +47 -0
  13. package/payload/platform/lib/learning-constants/src/index.ts +57 -0
  14. package/payload/platform/lib/learning-constants/tsconfig.json +9 -0
  15. package/payload/platform/lib/routine-templates/dist/index.d.ts +19 -3
  16. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
  17. package/payload/platform/lib/routine-templates/dist/index.js +22 -4
  18. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
  19. package/payload/platform/lib/routine-templates/dist/roster.d.ts +19 -6
  20. package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
  21. package/payload/platform/lib/routine-templates/dist/roster.js +127 -17
  22. package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
  23. package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +46 -3
  24. package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +52 -10
  25. package/payload/platform/lib/routine-templates/src/index.ts +30 -4
  26. package/payload/platform/lib/routine-templates/src/roster.ts +147 -17
  27. package/payload/platform/neo4j/schema.cypher +24 -0
  28. package/payload/platform/package.json +1 -1
  29. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  30. package/payload/platform/plugins/admin/PLUGIN.md +1 -1
  31. package/payload/platform/plugins/admin/mcp/dist/index.js +2 -2
  32. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  33. package/payload/platform/plugins/admin/skills/insight/SKILL.md +1 -1
  34. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +64 -12
  35. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +13 -0
  36. package/payload/platform/plugins/docs/references/admin-ui.md +6 -2
  37. package/payload/platform/plugins/docs/references/linkedin-extension.md +18 -9
  38. package/payload/platform/plugins/docs/references/session-retrospective.md +39 -0
  39. package/payload/platform/plugins/linkedin-extension/.claude-plugin/plugin.json +1 -1
  40. package/payload/platform/plugins/linkedin-extension/PLUGIN.md +7 -10
  41. package/payload/platform/plugins/linkedin-extension/extension/README.md +20 -17
  42. package/payload/platform/plugins/linkedin-extension/extension/background/sw.js +96 -13
  43. package/payload/platform/plugins/linkedin-extension/extension/manifest.json +3 -18
  44. package/payload/platform/plugins/linkedin-extension/extension/options/options.html +2 -2
  45. package/payload/platform/plugins/linkedin-extension/extension/options/options.js +1 -1
  46. package/payload/platform/plugins/memory/.claude-plugin/plugin.json +1 -1
  47. package/payload/platform/plugins/memory/PLUGIN.md +15 -1
  48. package/payload/platform/plugins/memory/mcp/dist/index.js +169 -0
  49. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  50. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/session-jsonl.test.d.ts +2 -0
  51. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/session-jsonl.test.d.ts.map +1 -0
  52. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/session-jsonl.test.js +95 -0
  53. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/session-jsonl.test.js.map +1 -0
  54. package/payload/platform/plugins/memory/mcp/dist/lib/session-jsonl.d.ts +60 -0
  55. package/payload/platform/plugins/memory/mcp/dist/lib/session-jsonl.d.ts.map +1 -0
  56. package/payload/platform/plugins/memory/mcp/dist/lib/session-jsonl.js +153 -0
  57. package/payload/platform/plugins/memory/mcp/dist/lib/session-jsonl.js.map +1 -0
  58. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/cross-account.test.js +6 -4
  59. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/cross-account.test.js.map +1 -1
  60. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-derive.test.d.ts +2 -0
  61. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-derive.test.d.ts.map +1 -0
  62. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-derive.test.js +160 -0
  63. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-derive.test.js.map +1 -0
  64. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-recall.test.d.ts +2 -0
  65. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-recall.test.d.ts.map +1 -0
  66. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-recall.test.js +64 -0
  67. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-recall.test.js.map +1 -0
  68. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-scan.test.d.ts +2 -0
  69. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-scan.test.d.ts.map +1 -0
  70. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-scan.test.js +78 -0
  71. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/learnings-scan.test.js.map +1 -0
  72. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-derive.d.ts +41 -0
  73. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-derive.d.ts.map +1 -0
  74. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-derive.js +225 -0
  75. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-derive.js.map +1 -0
  76. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-recall.d.ts +31 -0
  77. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-recall.d.ts.map +1 -0
  78. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-recall.js +67 -0
  79. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-recall.js.map +1 -0
  80. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-scan.d.ts +40 -0
  81. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-scan.d.ts.map +1 -0
  82. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-scan.js +55 -0
  83. package/payload/platform/plugins/memory/mcp/dist/tools/learnings-scan.js.map +1 -0
  84. package/payload/platform/plugins/memory/references/schema-base.md +3 -0
  85. package/payload/platform/plugins/memory/skills/learnings-recall/SKILL.md +27 -0
  86. package/payload/platform/plugins/scheduling/PLUGIN.md +2 -0
  87. package/payload/platform/plugins/scheduling/mcp/dist/index.js +5 -0
  88. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  89. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.d.ts +2 -0
  90. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.d.ts.map +1 -0
  91. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.js +100 -0
  92. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.js.map +1 -0
  93. package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.d.ts +36 -0
  94. package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.d.ts.map +1 -0
  95. package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.js +82 -0
  96. package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.js.map +1 -0
  97. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.d.ts +31 -0
  98. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.d.ts.map +1 -1
  99. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.js +99 -0
  100. package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.js.map +1 -1
  101. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +12 -12
  102. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
  103. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.d.ts +2 -0
  104. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.d.ts.map +1 -0
  105. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.js +79 -0
  106. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.js.map +1 -0
  107. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.d.ts +2 -0
  108. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.d.ts.map +1 -0
  109. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.js +23 -0
  110. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.js.map +1 -0
  111. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js +61 -1
  112. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js.map +1 -1
  113. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +33 -1
  114. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  115. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +96 -7
  116. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  117. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +21 -69
  118. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  119. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts +24 -0
  120. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts.map +1 -0
  121. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js +87 -0
  122. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js.map +1 -0
  123. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.d.ts +2 -0
  124. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.d.ts.map +1 -0
  125. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.js +123 -0
  126. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.js.map +1 -0
  127. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.d.ts +2 -0
  128. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.d.ts.map +1 -0
  129. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.js +71 -0
  130. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.js.map +1 -0
  131. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.js +14 -3
  132. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.js.map +1 -1
  133. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +9 -0
  134. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  135. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +19 -3
  136. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  137. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  138. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +24 -9
  139. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  140. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +4 -4
  141. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  142. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +3 -3
  143. package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +6 -2
  144. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +5 -1
  145. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  146. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +3 -0
  147. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  148. package/payload/platform/services/claude-session-manager/dist/learning-index.d.ts +28 -0
  149. package/payload/platform/services/claude-session-manager/dist/learning-index.d.ts.map +1 -0
  150. package/payload/platform/services/claude-session-manager/dist/learning-index.js +70 -0
  151. package/payload/platform/services/claude-session-manager/dist/learning-index.js.map +1 -0
  152. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  153. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +18 -0
  154. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  155. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +6 -0
  156. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  157. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +17 -0
  158. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  159. package/payload/platform/templates/specialists/agents/librarian.md +1 -1
  160. package/payload/server/{chunk-UTIHI6KV.js → chunk-SVB5NZ64.js} +53 -42
  161. package/payload/server/{manager-B4LRDZKC.js → manager-4Q3DTLXO.js} +5 -1
  162. package/payload/server/package.json +1 -1
  163. package/payload/server/public/activity.html +5 -5
  164. package/payload/server/public/agents.html +4 -4
  165. package/payload/server/public/assets/{AdminLoginScreens-zfexKfbT.js → AdminLoginScreens-7Czw3MAC.js} +1 -1
  166. package/payload/server/public/assets/AdminLoginScreens-7Czw3MAC.js.br +0 -0
  167. package/payload/server/public/assets/AdminLoginScreens-7Czw3MAC.js.gz +0 -0
  168. package/payload/server/public/assets/{AdminShell-Cbk0TL1B.js → AdminShell-D5GApZ_n.js} +1 -1
  169. package/payload/server/public/assets/AdminShell-D5GApZ_n.js.br +0 -0
  170. package/payload/server/public/assets/AdminShell-D5GApZ_n.js.gz +0 -0
  171. package/payload/server/public/assets/{CdpScreencastSurface-CLSQHh4e.js → CdpScreencastSurface-BbekDUFw.js} +1 -1
  172. package/payload/server/public/assets/CdpScreencastSurface-BbekDUFw.js.br +0 -0
  173. package/payload/server/public/assets/CdpScreencastSurface-BbekDUFw.js.gz +0 -0
  174. package/payload/server/public/assets/{activity-u275Oc-u.js → activity-ClI-RgJu.js} +1 -1
  175. package/payload/server/public/assets/activity-ClI-RgJu.js.br +0 -0
  176. package/payload/server/public/assets/activity-ClI-RgJu.js.gz +0 -0
  177. package/payload/server/public/assets/{admin-Du1nR_hP.js → admin-svtCmBPk.js} +1 -1
  178. package/payload/server/public/assets/admin-svtCmBPk.js.br +0 -0
  179. package/payload/server/public/assets/admin-svtCmBPk.js.gz +0 -0
  180. package/payload/server/public/assets/{agents-DJTxRLLU.js → agents-BO8YBj8d.js} +1 -1
  181. package/payload/server/public/assets/agents-BO8YBj8d.js.br +0 -0
  182. package/payload/server/public/assets/agents-BO8YBj8d.js.gz +0 -0
  183. package/payload/server/public/assets/{browser-Bft6zVkX.js → browser-Bj8oTG5R.js} +1 -1
  184. package/payload/server/public/assets/browser-Bj8oTG5R.js.br +0 -0
  185. package/payload/server/public/assets/browser-Bj8oTG5R.js.gz +0 -0
  186. package/payload/server/public/assets/{calendar-Ct-DCCqY.js → calendar-CrkSY8U7.js} +1 -1
  187. package/payload/server/public/assets/calendar-CrkSY8U7.js.br +0 -0
  188. package/payload/server/public/assets/calendar-CrkSY8U7.js.gz +0 -0
  189. package/payload/server/public/assets/chat-Bvxoni2e.js +1 -0
  190. package/payload/server/public/assets/chat-Bvxoni2e.js.br +0 -0
  191. package/payload/server/public/assets/chat-Bvxoni2e.js.gz +0 -0
  192. package/payload/server/public/assets/chevron-left-CdUzxzeB.js +1 -0
  193. package/payload/server/public/assets/chevron-left-CdUzxzeB.js.br +0 -0
  194. package/payload/server/public/assets/chevron-right-CKGwd-M0.js +1 -0
  195. package/payload/server/public/assets/chevron-right-CKGwd-M0.js.br +0 -0
  196. package/payload/server/public/assets/clock-Cf8Oe9qi.js +1 -0
  197. package/payload/server/public/assets/clock-Cf8Oe9qi.js.br +0 -0
  198. package/payload/server/public/assets/clock-Cf8Oe9qi.js.gz +0 -0
  199. package/payload/server/public/assets/data-DF0Pstdp.js +1 -0
  200. package/payload/server/public/assets/data-DF0Pstdp.js.br +1 -0
  201. package/payload/server/public/assets/data-DF0Pstdp.js.gz +0 -0
  202. package/payload/server/public/assets/{file-download-C_fSe4dm.js → file-download-Di_s0_4w.js} +1 -1
  203. package/payload/server/public/assets/file-download-Di_s0_4w.js.br +0 -0
  204. package/payload/server/public/assets/file-download-Di_s0_4w.js.gz +0 -0
  205. package/payload/server/public/assets/{file-text-D7GbEcqj.js → file-text-CP1KIrJV.js} +1 -1
  206. package/payload/server/public/assets/file-text-CP1KIrJV.js.br +1 -0
  207. package/payload/server/public/assets/file-text-CP1KIrJV.js.gz +0 -0
  208. package/payload/server/public/assets/{graph-yl5qU1kO.js → graph-BCMscnCV.js} +1 -1
  209. package/payload/server/public/assets/graph-BCMscnCV.js.br +0 -0
  210. package/payload/server/public/assets/graph-BCMscnCV.js.gz +0 -0
  211. package/payload/server/public/assets/{graph-labels-Dlcb6cW7.js → graph-labels-CgP17xHK.js} +1 -1
  212. package/payload/server/public/assets/graph-labels-CgP17xHK.js.br +0 -0
  213. package/payload/server/public/assets/graph-labels-CgP17xHK.js.gz +0 -0
  214. package/payload/server/public/assets/{maximize-2-BS689r4W.js → maximize-2-DkQzDv-g.js} +1 -1
  215. package/payload/server/public/assets/maximize-2-DkQzDv-g.js.br +0 -0
  216. package/payload/server/public/assets/maximize-2-DkQzDv-g.js.gz +0 -0
  217. package/payload/server/public/assets/{operator-CvapnpIW.js → operator-CLbCar9e.js} +1 -1
  218. package/payload/server/public/assets/operator-CLbCar9e.js.br +0 -0
  219. package/payload/server/public/assets/operator-CLbCar9e.js.gz +0 -0
  220. package/payload/server/public/assets/{page-DWkUH4Z_.js → page-CNJl3tWT.js} +1 -1
  221. package/payload/server/public/assets/page-CNJl3tWT.js.br +0 -0
  222. package/payload/server/public/assets/page-CNJl3tWT.js.gz +0 -0
  223. package/payload/server/public/assets/{page-987y4JbQ.js → page-CPVUAwb8.js} +1 -1
  224. package/payload/server/public/assets/page-CPVUAwb8.js.br +0 -0
  225. package/payload/server/public/assets/page-CPVUAwb8.js.gz +0 -0
  226. package/payload/server/public/assets/{public-D5pi-VFn.js → public-DQea3Ybz.js} +1 -1
  227. package/payload/server/public/assets/public-DQea3Ybz.js.br +0 -0
  228. package/payload/server/public/assets/public-DQea3Ybz.js.gz +0 -0
  229. package/payload/server/public/assets/{rotate-ccw-zNxnK36R.js → rotate-ccw-DPw0vXC0.js} +1 -1
  230. package/payload/server/public/assets/rotate-ccw-DPw0vXC0.js.br +0 -0
  231. package/payload/server/public/assets/rotate-ccw-DPw0vXC0.js.gz +0 -0
  232. package/payload/server/public/assets/{routines-mZzrGA5y.js → routines-CwiiYpfK.js} +2 -2
  233. package/payload/server/public/assets/routines-CwiiYpfK.js.br +0 -0
  234. package/payload/server/public/assets/routines-CwiiYpfK.js.gz +0 -0
  235. package/payload/server/public/assets/{skills-5A8PockT.js → skills-0FOjKUM-.js} +1 -1
  236. package/payload/server/public/assets/skills-0FOjKUM-.js.br +0 -0
  237. package/payload/server/public/assets/skills-0FOjKUM-.js.gz +0 -0
  238. package/payload/server/public/assets/{tasks-B1_2wc6L.js → tasks-BUVsPEGm.js} +1 -1
  239. package/payload/server/public/assets/tasks-BUVsPEGm.js.br +0 -0
  240. package/payload/server/public/assets/tasks-BUVsPEGm.js.gz +0 -0
  241. package/payload/server/public/assets/{time-entry-format-CJ2FSSQt.js → time-entry-format-B6fX_19a.js} +1 -1
  242. package/payload/server/public/assets/time-entry-format-B6fX_19a.js.br +0 -0
  243. package/payload/server/public/assets/time-entry-format-B6fX_19a.js.gz +0 -0
  244. package/payload/server/public/assets/{triangle-alert-CedsrgME.js → triangle-alert-vAaSDhVq.js} +1 -1
  245. package/payload/server/public/assets/triangle-alert-vAaSDhVq.js.br +0 -0
  246. package/payload/server/public/assets/triangle-alert-vAaSDhVq.js.gz +0 -0
  247. package/payload/server/public/assets/{useCopyFeedback-zjZZUC2-.js → useCopyFeedback-BvIRgs7W.js} +1 -1
  248. package/payload/server/public/assets/useCopyFeedback-BvIRgs7W.js.br +0 -0
  249. package/payload/server/public/assets/useCopyFeedback-BvIRgs7W.js.gz +0 -0
  250. package/payload/server/public/assets/{useSubAccountSwitcher-72THldvm.css → useSubAccountSwitcher-DM5Y9eio.css} +1 -1
  251. package/payload/server/public/assets/useSubAccountSwitcher-DM5Y9eio.css.br +0 -0
  252. package/payload/server/public/assets/{useSubAccountSwitcher-72THldvm.css.gz → useSubAccountSwitcher-DM5Y9eio.css.gz} +0 -0
  253. package/payload/server/public/assets/{useVoiceRecorder-CJecnefX.js → useVoiceRecorder-CiDOh8PG.js} +1 -1
  254. package/payload/server/public/assets/useVoiceRecorder-CiDOh8PG.js.br +0 -0
  255. package/payload/server/public/assets/useVoiceRecorder-CiDOh8PG.js.gz +0 -0
  256. package/payload/server/public/assets/{wrench-D8BH20W8.js → wrench-BNBtwT2p.js} +1 -1
  257. package/payload/server/public/assets/wrench-BNBtwT2p.js.br +0 -0
  258. package/payload/server/public/assets/wrench-BNBtwT2p.js.gz +0 -0
  259. package/payload/server/public/browser.html +5 -5
  260. package/payload/server/public/calendar.html +7 -7
  261. package/payload/server/public/chat.html +13 -13
  262. package/payload/server/public/data.html +12 -12
  263. package/payload/server/public/graph.html +9 -9
  264. package/payload/server/public/index.html +16 -16
  265. package/payload/server/public/operator.html +15 -15
  266. package/payload/server/public/public.html +13 -13
  267. package/payload/server/public/routines.html +7 -7
  268. package/payload/server/public/skills.html +5 -5
  269. package/payload/server/public/tasks.html +6 -6
  270. package/payload/server/server.js +73 -19
  271. package/payload/platform/plugins/linkedin-extension/extension/assets/pill.css +0 -52
  272. package/payload/platform/plugins/linkedin-extension/extension/content/profile.js +0 -100
  273. package/payload/platform/plugins/linkedin-extension/extension/content/thread.js +0 -102
  274. package/payload/server/public/assets/AdminLoginScreens-zfexKfbT.js.br +0 -0
  275. package/payload/server/public/assets/AdminLoginScreens-zfexKfbT.js.gz +0 -0
  276. package/payload/server/public/assets/AdminShell-Cbk0TL1B.js.br +0 -0
  277. package/payload/server/public/assets/AdminShell-Cbk0TL1B.js.gz +0 -0
  278. package/payload/server/public/assets/CdpScreencastSurface-CLSQHh4e.js.br +0 -0
  279. package/payload/server/public/assets/CdpScreencastSurface-CLSQHh4e.js.gz +0 -0
  280. package/payload/server/public/assets/activity-u275Oc-u.js.br +0 -0
  281. package/payload/server/public/assets/activity-u275Oc-u.js.gz +0 -0
  282. package/payload/server/public/assets/admin-Du1nR_hP.js.br +0 -0
  283. package/payload/server/public/assets/admin-Du1nR_hP.js.gz +0 -0
  284. package/payload/server/public/assets/agents-DJTxRLLU.js.br +0 -0
  285. package/payload/server/public/assets/agents-DJTxRLLU.js.gz +0 -0
  286. package/payload/server/public/assets/browser-Bft6zVkX.js.br +0 -0
  287. package/payload/server/public/assets/browser-Bft6zVkX.js.gz +0 -0
  288. package/payload/server/public/assets/calendar-Ct-DCCqY.js.br +0 -0
  289. package/payload/server/public/assets/calendar-Ct-DCCqY.js.gz +0 -0
  290. package/payload/server/public/assets/chat-pqasbAg8.js +0 -1
  291. package/payload/server/public/assets/chat-pqasbAg8.js.br +0 -0
  292. package/payload/server/public/assets/chat-pqasbAg8.js.gz +0 -0
  293. package/payload/server/public/assets/chevron-left-C8LTc7lb.js +0 -1
  294. package/payload/server/public/assets/chevron-right-Lz9t7Hed.js +0 -1
  295. package/payload/server/public/assets/chevron-right-Lz9t7Hed.js.br +0 -0
  296. package/payload/server/public/assets/clock-D6QQFHwJ.js +0 -1
  297. package/payload/server/public/assets/clock-D6QQFHwJ.js.br +0 -0
  298. package/payload/server/public/assets/clock-D6QQFHwJ.js.gz +0 -0
  299. package/payload/server/public/assets/data-B1JJ3Y1T.js +0 -1
  300. package/payload/server/public/assets/data-B1JJ3Y1T.js.br +0 -0
  301. package/payload/server/public/assets/data-B1JJ3Y1T.js.gz +0 -0
  302. package/payload/server/public/assets/file-download-C_fSe4dm.js.br +0 -0
  303. package/payload/server/public/assets/file-download-C_fSe4dm.js.gz +0 -0
  304. package/payload/server/public/assets/file-text-D7GbEcqj.js.br +0 -0
  305. package/payload/server/public/assets/file-text-D7GbEcqj.js.gz +0 -0
  306. package/payload/server/public/assets/graph-labels-Dlcb6cW7.js.br +0 -0
  307. package/payload/server/public/assets/graph-labels-Dlcb6cW7.js.gz +0 -0
  308. package/payload/server/public/assets/graph-yl5qU1kO.js.br +0 -0
  309. package/payload/server/public/assets/graph-yl5qU1kO.js.gz +0 -0
  310. package/payload/server/public/assets/maximize-2-BS689r4W.js.br +0 -0
  311. package/payload/server/public/assets/maximize-2-BS689r4W.js.gz +0 -0
  312. package/payload/server/public/assets/operator-CvapnpIW.js.br +0 -0
  313. package/payload/server/public/assets/operator-CvapnpIW.js.gz +0 -0
  314. package/payload/server/public/assets/page-987y4JbQ.js.br +0 -0
  315. package/payload/server/public/assets/page-987y4JbQ.js.gz +0 -0
  316. package/payload/server/public/assets/page-DWkUH4Z_.js.br +0 -0
  317. package/payload/server/public/assets/page-DWkUH4Z_.js.gz +0 -0
  318. package/payload/server/public/assets/public-D5pi-VFn.js.br +0 -0
  319. package/payload/server/public/assets/public-D5pi-VFn.js.gz +0 -0
  320. package/payload/server/public/assets/rotate-ccw-zNxnK36R.js.br +0 -0
  321. package/payload/server/public/assets/rotate-ccw-zNxnK36R.js.gz +0 -0
  322. package/payload/server/public/assets/routines-mZzrGA5y.js.br +0 -0
  323. package/payload/server/public/assets/routines-mZzrGA5y.js.gz +0 -0
  324. package/payload/server/public/assets/skills-5A8PockT.js.br +0 -0
  325. package/payload/server/public/assets/skills-5A8PockT.js.gz +0 -0
  326. package/payload/server/public/assets/tasks-B1_2wc6L.js.br +0 -0
  327. package/payload/server/public/assets/tasks-B1_2wc6L.js.gz +0 -0
  328. package/payload/server/public/assets/time-entry-format-CJ2FSSQt.js.br +0 -0
  329. package/payload/server/public/assets/time-entry-format-CJ2FSSQt.js.gz +0 -0
  330. package/payload/server/public/assets/triangle-alert-CedsrgME.js.br +0 -0
  331. package/payload/server/public/assets/triangle-alert-CedsrgME.js.gz +0 -0
  332. package/payload/server/public/assets/useCopyFeedback-zjZZUC2-.js.br +0 -0
  333. package/payload/server/public/assets/useCopyFeedback-zjZZUC2-.js.gz +0 -0
  334. package/payload/server/public/assets/useSubAccountSwitcher-72THldvm.css.br +0 -0
  335. package/payload/server/public/assets/useVoiceRecorder-CJecnefX.js.br +0 -0
  336. package/payload/server/public/assets/useVoiceRecorder-CJecnefX.js.gz +0 -0
  337. package/payload/server/public/assets/wrench-D8BH20W8.js.br +0 -0
  338. package/payload/server/public/assets/wrench-D8BH20W8.js.gz +0 -0
  339. /package/payload/server/public/assets/{useSubAccountSwitcher-HjQZjJBr.js → useSubAccountSwitcher-BEwQMRMo.js} +0 -0
  340. /package/payload/server/public/assets/{useSubAccountSwitcher-HjQZjJBr.js.br → useSubAccountSwitcher-BEwQMRMo.js.br} +0 -0
  341. /package/payload/server/public/assets/{useSubAccountSwitcher-HjQZjJBr.js.gz → useSubAccountSwitcher-BEwQMRMo.js.gz} +0 -0
@@ -3,15 +3,17 @@
3
3
  *
4
4
  * A fresh install used to ship zero routines, so the only working examples
5
5
  * lived in one customer's graph and every operator wrote the prompts from
6
- * scratch. These eleven are the catalogue that ships with the platform instead.
6
+ * scratch. These thirteen are the catalogue that ships with the platform
7
+ * instead.
7
8
  *
8
9
  * Two properties make a routine shippable, and both are load-bearing:
9
10
  *
10
11
  * 1. It resolves its own surfaces at run time. Every prompt opens on
11
12
  * `capabilities-here`, which reports the account's live install set, and
12
13
  * ends the turn without replying when the surface it needs is absent. That
13
- * is what makes the same eleven rows correct on an estate agency, a web studio
14
- * and a field-service install rather than a template someone must edit.
14
+ * is what makes the same thirteen rows correct on an estate agency, a web
15
+ * studio and a field-service install rather than a template someone must
16
+ * edit.
15
17
  *
16
18
  * 2. It names nobody. No prompt carries a person's name, an email address, a
17
19
  * phone number, a hostname or a database name. `scripts/check-routine-
@@ -33,7 +35,7 @@
33
35
  * routine's prompt only when the stored `routineTemplateVersion` is BELOW this
34
36
  * and no operator has edited the row, so an unbumped edit ships to new installs
35
37
  * and never reaches existing ones — bump it in the same commit as the edit. */
36
- export const ROUTINE_TEMPLATE_VERSION = 1;
38
+ export const ROUTINE_TEMPLATE_VERSION = 2;
37
39
 
38
40
  export interface RoutineTemplate {
39
41
  /** Stable identity. Half of the MERGE key `(accountId, routineTemplate)`, so
@@ -42,6 +44,11 @@ export interface RoutineTemplate {
42
44
  readonly key: string;
43
45
  /** The title shown on `/routines`. */
44
46
  readonly name: string;
47
+ /** One sentence under the title on the card: what this does and what it will
48
+ * not do. Roster-owned and read-only — projected by the routines route but
49
+ * absent from its PATCH field set, so no operator edit exists for the seed to
50
+ * overwrite and the MERGE rewrites it on every match. */
51
+ readonly description: string;
45
52
  /** The proposed cron. Written ON CREATE only, never refreshed, so an operator
46
53
  * who retimes a routine keeps their expression across upgrades. */
47
54
  readonly recurrence: string;
@@ -183,21 +190,144 @@ When a link is down, reply with one message naming the number it is paired to, t
183
190
 
184
191
  Never disconnect a link and never begin a re-pair from here. This routine reports; the remedy is a person's decision.`;
185
192
 
186
- /** The eleven. Order is the display order on `/routines` before the operator
193
+ const GRAPH_HEALTH = `Report on the state of this account's graph and on what its maintenance sweep last found. This routine reads. It performs no graph writes at all.
194
+
195
+ Call capabilities-here first. If the memory plugin is not enabled, end the turn without replying.
196
+
197
+ Read the most recent maintenance report with memory-report-read-latest: it carries the run's per-phase counts and the time it ran. Read the two review queues with memory-review-queue. Orphan candidates are nodes the sweep could not attach to anything; citation proposals are timeline claims still waiting for a source.
198
+
199
+ Report four things: when the sweep last ran, how many orphan candidates are waiting, how large the citation backlog is, and how much compiled truth the last run found stale. A queue that has grown since the previous run matters more than its absolute size, so say which direction it is moving.
200
+
201
+ Never call memory-dream-run from here. The sweep already runs on its own hourly cadence and decides for itself whether an account is due; a second writer started from a scheduled turn would race it, and the surviving report would be whichever run finished last. Reading the sweep's output is the whole of this routine's authority.
202
+
203
+ If both queues are empty and the sweep ran within the past day, end the turn without replying. Nothing is wrong and there is nothing to decide.`;
204
+
205
+ const FILESYSTEM_HEALTH = `Report what has accumulated under this account's own directory, so growth is visible before it becomes a problem. This routine deletes nothing.
206
+
207
+ Call capabilities-here first. If the filesystem plugin is not enabled, end the turn without replying.
208
+
209
+ Walk the account directory with file-list, starting at its root and descending only where something is already large. Use file-glob to count the things that accumulate rather than get cleaned up: uploaded files, session transcripts, generated documents, logs, and anything a plugin writes once per run.
210
+
211
+ Report the few paths worth a person's attention, each with what is in it and roughly how much. Name every path relative to the account directory, never as an absolute one. Judgement is the point: one directory holding thousands of files is worth naming, and a hundred small ones spread evenly are not.
212
+
213
+ There is no deletion tool on this surface and this routine must not ask for one. Report what grew and leave the decision with the operator: a routine that removed files on a schedule would eventually remove the one that mattered, and nothing would say which.
214
+
215
+ If nothing has grown materially since the last run, end the turn without replying.`;
216
+
217
+ /** The thirteen. Order is the display order on `/routines` before the operator
187
218
  * retimes anything: the daily rhythm first, then the reconciles, then the
188
- * weekly, then the standing check. */
219
+ * weekly, then the standing check, then the two health reports.
220
+ *
221
+ * `description` is what the card shows under the title. It says what the row
222
+ * does and, where the row is deliberately narrower than its name suggests,
223
+ * what it will not do — the send it never makes, the write it never performs,
224
+ * the file it never deletes. That second half is the part an operator cannot
225
+ * infer from a title, and it is why the sentence is not just the name again. */
189
226
  export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
190
- { key: "start-of-day", name: "Start of day briefing", recurrence: "30 7 * * 1-5", prompt: START_OF_DAY },
191
- { key: "inbound-check", name: "Working-hours inbound check", recurrence: "*/30 9-17 * * 1-5", prompt: INBOUND_CHECK },
192
- { key: "end-of-day", name: "End of day wrap-up", recurrence: "0 18 * * 1-5", prompt: END_OF_DAY },
193
- { key: "appointment-reminder", name: "Appointment reminders", recurrence: "0 * * * *", prompt: APPOINTMENT_REMINDER },
194
- { key: "commitment-chase", name: "Commitment chase", recurrence: "0 10 * * 2", prompt: COMMITMENT_CHASE },
195
- { key: "calendar-reconcile", name: "Calendar reconcile", recurrence: "*/15 * * * *", prompt: CALENDAR_RECONCILE },
196
- { key: "contact-reconcile", name: "Contact reconcile", recurrence: "45 6 * * 1-5", prompt: CONTACT_RECONCILE },
197
- { key: "crm-reconcile", name: "Operational system reconcile", recurrence: "0 3 * * *", prompt: CRM_RECONCILE },
198
- { key: "finance-reconcile", name: "Finance reconcile", recurrence: "0 4 * * 1", prompt: FINANCE_RECONCILE },
199
- { key: "weekly-digest", name: "Weekly digest", recurrence: "0 16 * * 5", prompt: WEEKLY_DIGEST },
200
- { key: "channel-link-check", name: "Channel link check", recurrence: "*/15 * * * *", prompt: CHANNEL_LINK_CHECK },
227
+ {
228
+ key: "start-of-day",
229
+ name: "Start of day briefing",
230
+ description:
231
+ "Sends one morning message covering what needs a decision, what is time-bound and what changed overnight; stays silent when there is nothing worth saying.",
232
+ recurrence: "30 7 * * 1-5",
233
+ prompt: START_OF_DAY,
234
+ },
235
+ {
236
+ key: "inbound-check",
237
+ name: "Working-hours inbound check",
238
+ description:
239
+ "Triages mail that arrived since the last check and writes replies for you to approve; it never sends anything itself.",
240
+ recurrence: "*/30 9-17 * * 1-5",
241
+ prompt: INBOUND_CHECK,
242
+ },
243
+ {
244
+ key: "end-of-day",
245
+ name: "End of day wrap-up",
246
+ description:
247
+ "Closes the day with your unsent drafts, overdue work and tomorrow's diary; says nothing when all three are empty.",
248
+ recurrence: "0 18 * * 1-5",
249
+ prompt: END_OF_DAY,
250
+ },
251
+ {
252
+ key: "appointment-reminder",
253
+ name: "Appointment reminders",
254
+ description:
255
+ "Reminds each attendee once before a booked appointment, on a route they already use; it never opens a conversation with a stranger.",
256
+ recurrence: "0 * * * *",
257
+ prompt: APPOINTMENT_REMINDER,
258
+ },
259
+ {
260
+ key: "commitment-chase",
261
+ name: "Commitment chase",
262
+ description:
263
+ "Surfaces promises the business made and did not keep, and promises made to it that nobody kept; it reports them rather than chasing them.",
264
+ recurrence: "0 10 * * 2",
265
+ prompt: COMMITMENT_CHASE,
266
+ },
267
+ {
268
+ key: "calendar-reconcile",
269
+ name: "Calendar reconcile",
270
+ description:
271
+ "Reconciles the provider calendar against the appointments held in the graph, writing what is missing and marking what was cancelled; a clean run says nothing.",
272
+ recurrence: "*/15 * * * *",
273
+ prompt: CALENDAR_RECONCILE,
274
+ },
275
+ {
276
+ key: "contact-reconcile",
277
+ name: "Contact reconcile",
278
+ description:
279
+ "Reconciles the people you correspond with against the people on record, creating and updating contacts; it never merges two records that might be two people.",
280
+ recurrence: "45 6 * * 1-5",
281
+ prompt: CONTACT_RECONCILE,
282
+ },
283
+ {
284
+ key: "crm-reconcile",
285
+ name: "Operational system reconcile",
286
+ description:
287
+ "Brings across what changed in whichever operational system this business runs; it reads only and never writes back to that system.",
288
+ recurrence: "0 3 * * *",
289
+ prompt: CRM_RECONCILE,
290
+ },
291
+ {
292
+ key: "finance-reconcile",
293
+ name: "Finance reconcile",
294
+ description:
295
+ "Reconciles the accounting system against the internal ledger and reports what does not agree; it never adjusts an entry to make the two sides match.",
296
+ recurrence: "0 4 * * 1",
297
+ prompt: FINANCE_RECONCILE,
298
+ },
299
+ {
300
+ key: "weekly-digest",
301
+ name: "Weekly digest",
302
+ description:
303
+ "Writes the week in three paragraphs at most: what changed, what is stuck, and what next week turns on.",
304
+ recurrence: "0 16 * * 5",
305
+ prompt: WEEKLY_DIGEST,
306
+ },
307
+ {
308
+ key: "channel-link-check",
309
+ name: "Channel link check",
310
+ description:
311
+ "Reports a messaging link that has gone down and whether it can recover on its own; it never disconnects a link or starts a re-pair.",
312
+ recurrence: "*/15 * * * *",
313
+ prompt: CHANNEL_LINK_CHECK,
314
+ },
315
+ {
316
+ key: "graph-health",
317
+ name: "Graph health report",
318
+ description:
319
+ "Reports what the hourly graph sweep last did and what is waiting for review; it reads only and never runs the sweep itself.",
320
+ recurrence: "0 9 * * 1",
321
+ prompt: GRAPH_HEALTH,
322
+ },
323
+ {
324
+ key: "filesystem-health",
325
+ name: "Filesystem health report",
326
+ description:
327
+ "Reports what has grown under the account directory and which paths are worth attention; it deletes nothing.",
328
+ recurrence: "0 9 * * 1",
329
+ prompt: FILESYSTEM_HEALTH,
330
+ },
201
331
  ];
202
332
 
203
333
  /** Every roster key, in roster order. The scheduling heartbeat's `op=roster`
@@ -868,6 +868,30 @@ OPTIONS {
868
868
  }
869
869
  };
870
870
 
871
+ // ----------------------------------------------------------
872
+ // Learning — Task 2220. A claim a session established, carrying a confidence
873
+ // lifecycle: created at 0.5, amplified on re-observation, decremented and
874
+ // stamped contradictedAt when disputed, decayed after 14 untouched days.
875
+ // Parented (:UserProfile)-[:HAS_LEARNING]->(:Learning), as Preference is.
876
+ // The vector index is what learnings-derive queries by name to reconcile a
877
+ // claim against an existing learning instead of minting a duplicate.
878
+ // ----------------------------------------------------------
879
+
880
+ CREATE INDEX learning_account IF NOT EXISTS
881
+ FOR (l:Learning) ON (l.accountId);
882
+
883
+ CREATE INDEX learning_id IF NOT EXISTS
884
+ FOR (l:Learning) ON (l.accountId, l.learningId);
885
+
886
+ CREATE VECTOR INDEX learning_embedding IF NOT EXISTS
887
+ FOR (l:Learning) ON (l.embedding)
888
+ OPTIONS {
889
+ indexConfig: {
890
+ `vector.dimensions`: 768,
891
+ `vector.similarity_function`: 'cosine'
892
+ }
893
+ };
894
+
871
895
  // ----------------------------------------------------------
872
896
  // EmailAccount — managed by the email plugin (credentials.ts)
873
897
  // Created via MERGE by email-setup. Properties:
@@ -10,7 +10,7 @@
10
10
  "pdf-lib": "^1.17.1"
11
11
  },
12
12
  "scripts": {
13
- "build": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/account-ingest-token/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p lib/routine-templates/tsconfig.json && tsc -p lib/agent-dispatch-rule/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && tsc -p services/webchat-channel/tsconfig.json && tsc -p services/telegram-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
13
+ "build": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/account-ingest-token/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p lib/routine-templates/tsconfig.json && tsc -p lib/agent-dispatch-rule/tsconfig.json && tsc -p lib/learning-constants/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && tsc -p services/webchat-channel/tsconfig.json && tsc -p services/telegram-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
14
14
  "build:lib": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/account-ingest-token/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p lib/routine-templates/tsconfig.json && tsc -p lib/agent-dispatch-rule/tsconfig.json",
15
15
  "gen:canonical-tools": "node scripts/generate-canonical-tool-names.mjs",
16
16
  "build:memory": "tsc -p plugins/memory/mcp/tsconfig.json",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "admin",
3
- "description": "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), admin-hostname (the admin-host twin of public-hostname — resolves the host that serves /calendar and the rest of the admin shell behind sign-in from the same ingress + alias + operator files, so agents point the operator at the admin /calendar URL instead of the public host that 404s it), publish-site (move an extracted static-site tree under <accountDir>/sites/<slug>/, emit one canonical path slug, and refresh llms.txt at the site root — typed refusal taxonomy replaces the prior skill-prose contract), brand-settings, account-manage, capabilities-here (deterministic install-introspection — returns enabledPlugins, tier, models, installed platform + premium specialists, registered Claude Code agent types, and the brand block as a single JSON object; the canonical tool for grounding any claim about what is enabled on the current account), linkedin-ingest-token (returns the account's durable LinkedIn ingest token — the one credential the SiteDesk LinkedIn Ingest Chrome extension needs in its options page; minted on first call then stable across restarts and new chat sessions, and never a conversation session key nor the admin browser's session_key, which the ingest route rejects; action='rotate' replaces it and invalidates every existing extension install), account-update, the multi-account managed-service lifecycle tools (account_list, account_create, account_delete, account_purge, account_channel_routing, account_channel_routing_set — one Rubytech operator hosting N client accounts on one house install; create/delete/purge are operator-only and purge is two-step with a typed confirmation; account_create requires the client business owner's real name (ownerName), refusing a blank or the placeholder \"Owner\" and seeding it onto the sub-account's owner AdminUser and owner Person, and requires the owner's IANA timezone (timezone) — refusing a blank or a non-IANA value — seeding it onto the owner UserProfile marked owner-set so scheduling reads the owner's real zone from the start rather than the box's server default, while a managing house admin (its userId) is optional — when supplied it is validated as a live house admin and recorded as the sub-account's managingAdminUserId, and when omitted the sub-account is unmanaged and its passive-intake tasks route to the install's primary admin; account_reassign_admin repoints a client sub-account's managing admin to another live house admin (the repair path for a dangling managingAdminUserId, or to record one on an unmanaged account); account_roster is the canonical per-account identity view — one row per sub-account giving business name, role, the managing house admin resolved to a name with status (assigned/absent/dangling), the business owner from the graph with status (named/nameless), and the WhatsApp account-manager binding if any, each field carrying what it means and does not (managing admin is the responsible house team member not the owner; account manager is WhatsApp routing only with no admin rights), so the agent never stitches admin-list + account.json + whatsapp-config; account_set_owner_name names (or corrects) a client sub-account's business owner by writing the owned Person — the canonical name source — refusing a blank or the placeholder \"Owner\", the guarded repair for a nameless owner (the standing identity-audit op=nameless-owned-person detector); account_channel_routing_set repoints the install's single WhatsApp/Telegram inbound stream to a different sub-account), admin-add (refuses on a client sub-account, where admin access is already install-wide so a per-operator seat grants nothing — the sub-account's one identity, its business owner, is set at account creation; the house account, where operators hold PIN logins and admins[] rows, is unchanged), admin-remove (refuses to remove a house admin who still manages one or more client sub-accounts, naming them so the operator reassigns each with account_reassign_admin first — never silently orphans them), admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, cpu-triage-start and cpu-triage-read (the two-call device CPU diagnostic — start spawns a detached sampling run across at least one full 120s reconcile cycle and returns a run handle immediately, read returns running/complete/failed with the per-core distribution; no admin tool blocks through a sampling window, and no spot reading is obtainable), plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), skill-search (free-text intent → skill resolver: ranks every plugin skill's SKILL.md name+description against a query and returns the top owners with their canonical skills/<slug>/ path, so intent→skill mapping survives the available-skills menu leaving context after a compaction), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the SiteDesk platform.",
3
+ "description": "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), admin-hostname (the admin-host twin of public-hostname — resolves the host that serves /calendar and the rest of the admin shell behind sign-in from the same ingress + alias + operator files, so agents point the operator at the admin /calendar URL instead of the public host that 404s it), publish-site (move an extracted static-site tree under <accountDir>/sites/<slug>/, emit one canonical path slug, and refresh llms.txt at the site root — typed refusal taxonomy replaces the prior skill-prose contract), brand-settings, account-manage, capabilities-here (deterministic install-introspection — returns enabledPlugins, tier, models, installed platform + premium specialists, registered Claude Code agent types, and the brand block as a single JSON object; the canonical tool for grounding any claim about what is enabled on the current account), linkedin-ingest-token (returns the account's durable LinkedIn ingest token — the one credential the SiteDesk LinkedIn Ingest Chrome extension needs in its options page; minted on first call then stable across restarts and new chat sessions, and never a conversation session key nor the admin browser's session_key, which the ingest route rejects; action='rotate' replaces it and invalidates every existing extension install), account-update, the multi-account managed-service lifecycle tools (account_list, account_create, account_delete, account_purge, account_channel_routing, account_channel_routing_set — one Rubytech operator hosting N client accounts on one house install; create/delete/purge are operator-only and purge is two-step with a typed confirmation; account_create requires the client business owner's real name (ownerName), refusing a blank or the placeholder \"Owner\" and seeding it onto the sub-account's owner AdminUser and owner Person, and requires the owner's IANA timezone (timezone) — refusing a blank or a non-IANA value — seeding it onto the owner UserProfile marked owner-set so scheduling reads the owner's real zone from the start rather than the box's server default, while a managing house admin (its userId) is optional — when supplied it is validated as a live house admin and recorded as the sub-account's managingAdminUserId, and when omitted the sub-account is unmanaged and its passive-intake tasks route to the install's primary admin; account_reassign_admin repoints a client sub-account's managing admin to another live house admin (the repair path for a dangling managingAdminUserId, or to record one on an unmanaged account); account_roster is the canonical per-account identity view — one row per sub-account giving business name, role, the managing house admin resolved to a name with status (assigned/absent/dangling), the business owner from the graph with status (named/nameless), and the WhatsApp account-manager binding if any, each field carrying what it means and does not (managing admin is the responsible house team member not the owner; account manager is WhatsApp routing only with no admin rights), so the agent never stitches admin-list + account.json + whatsapp-config; account_set_owner_name names (or corrects) a client sub-account's business owner by writing the owned Person — the canonical name source — refusing a blank or the placeholder \"Owner\", the guarded repair for a nameless owner (the standing identity-audit op=nameless-owned-person detector); account_channel_routing_set repoints the house-paired WhatsApp/Telegram inbound stream to a different sub-account, and does not affect a sub-account's own separately paired WhatsApp number), admin-add (refuses on a client sub-account, where admin access is already install-wide so a per-operator seat grants nothing — the sub-account's one identity, its business owner, is set at account creation; the house account, where operators hold PIN logins and admins[] rows, is unchanged), admin-remove (refuses to remove a house admin who still manages one or more client sub-accounts, naming them so the operator reassigns each with account_reassign_admin first — never silently orphans them), admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, cpu-triage-start and cpu-triage-read (the two-call device CPU diagnostic — start spawns a detached sampling run across at least one full 120s reconcile cycle and returns a run handle immediately, read returns running/complete/failed with the per-core distribution; no admin tool blocks through a sampling window, and no spot reading is obtainable), plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), skill-search (free-text intent → skill resolver: ranks every plugin skill's SKILL.md name+description against a query and returns the top owners with their canonical skills/<slug>/ path, so intent→skill mapping survives the available-skills menu leaving context after a compaction), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the SiteDesk platform.",
4
4
  "version": "0.1.0",
5
5
  "author": {
6
6
  "name": "Rubytech LLC"
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: admin
3
3
  surface: platform
4
- description: "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), admin-hostname (the admin-host twin of public-hostname — resolves the host that serves /calendar and the rest of the admin shell behind sign-in from the same ingress + alias + operator files, so agents point the operator at the admin /calendar URL instead of the public host that 404s it), publish-site (move an extracted static-site tree under <accountDir>/sites/<slug>/, emit one canonical path slug, and refresh llms.txt at the site root — typed refusal taxonomy replaces the prior skill-prose contract), brand-settings, account-manage, capabilities-here (deterministic install-introspection — returns enabledPlugins, tier, models, installed platform + premium specialists, registered Claude Code agent types, and the brand block as a single JSON object; the canonical tool for grounding any claim about what is enabled on the current account), linkedin-ingest-token (returns the account's durable LinkedIn ingest token — the one credential the SiteDesk LinkedIn Ingest Chrome extension needs in its options page; minted on first call then stable across restarts and new chat sessions, and never a conversation session key nor the admin browser's session_key, which the ingest route rejects; action='rotate' replaces it and invalidates every existing extension install), account-update, the multi-account managed-service lifecycle tools (account_list, account_create, account_delete, account_purge, account_channel_routing, account_channel_routing_set — one Rubytech operator hosting N client accounts on one house install; create/delete/purge are operator-only and purge is two-step with a typed confirmation; account_create requires the client business owner's real name (ownerName), refusing a blank or the placeholder "Owner" and seeding it onto the sub-account's owner AdminUser and owner Person, and requires the owner's IANA timezone (timezone) — refusing a blank or a non-IANA value — seeding it onto the owner UserProfile marked owner-set so scheduling reads the owner's real zone from the start rather than the box's server default, while a managing house admin (its userId) is optional — when supplied it is validated as a live house admin and recorded as the sub-account's managingAdminUserId, and when omitted the sub-account is unmanaged and its passive-intake tasks route to the install's primary admin; account_reassign_admin repoints a client sub-account's managing admin to another live house admin (the repair path for a dangling managingAdminUserId, or to record one on an unmanaged account); account_roster is the canonical per-account identity view — one row per sub-account giving business name, role, the managing house admin resolved to a name with status (assigned/absent/dangling), the business owner from the graph with status (named/nameless), and the WhatsApp account-manager binding if any, each field carrying what it means and does not (managing admin is the responsible house team member not the owner; account manager is WhatsApp routing only with no admin rights), so the agent never stitches admin-list + account.json + whatsapp-config; account_set_owner_name names (or corrects) a client sub-account's business owner by writing the owned Person — the canonical name source — refusing a blank or the placeholder "Owner", the guarded repair for a nameless owner (the standing identity-audit op=nameless-owned-person detector); account_channel_routing_set repoints the install's single WhatsApp/Telegram inbound stream to a different sub-account), admin-add (refuses on a client sub-account, where admin access is already install-wide so a per-operator seat grants nothing — the sub-account's one identity, its business owner, is set at account creation; the house account, where operators hold PIN logins and admins[] rows, is unchanged), admin-remove (refuses to remove a house admin who still manages one or more client sub-accounts, naming them so the operator reassigns each with account_reassign_admin first — never silently orphans them), admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, cpu-triage-start and cpu-triage-read (the two-call device CPU diagnostic — start spawns a detached sampling run across at least one full 120s reconcile cycle and returns a run handle immediately, read returns running/complete/failed with the per-core distribution; no admin tool blocks through a sampling window, and no spot reading is obtainable), plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), skill-search (free-text intent → skill resolver: ranks every plugin skill's SKILL.md name+description against a query and returns the top owners with their canonical skills/<slug>/ path, so intent→skill mapping survives the available-skills menu leaving context after a compaction), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the SiteDesk platform."
4
+ description: "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), admin-hostname (the admin-host twin of public-hostname — resolves the host that serves /calendar and the rest of the admin shell behind sign-in from the same ingress + alias + operator files, so agents point the operator at the admin /calendar URL instead of the public host that 404s it), publish-site (move an extracted static-site tree under <accountDir>/sites/<slug>/, emit one canonical path slug, and refresh llms.txt at the site root — typed refusal taxonomy replaces the prior skill-prose contract), brand-settings, account-manage, capabilities-here (deterministic install-introspection — returns enabledPlugins, tier, models, installed platform + premium specialists, registered Claude Code agent types, and the brand block as a single JSON object; the canonical tool for grounding any claim about what is enabled on the current account), linkedin-ingest-token (returns the account's durable LinkedIn ingest token — the one credential the SiteDesk LinkedIn Ingest Chrome extension needs in its options page; minted on first call then stable across restarts and new chat sessions, and never a conversation session key nor the admin browser's session_key, which the ingest route rejects; action='rotate' replaces it and invalidates every existing extension install), account-update, the multi-account managed-service lifecycle tools (account_list, account_create, account_delete, account_purge, account_channel_routing, account_channel_routing_set — one Rubytech operator hosting N client accounts on one house install; create/delete/purge are operator-only and purge is two-step with a typed confirmation; account_create requires the client business owner's real name (ownerName), refusing a blank or the placeholder "Owner" and seeding it onto the sub-account's owner AdminUser and owner Person, and requires the owner's IANA timezone (timezone) — refusing a blank or a non-IANA value — seeding it onto the owner UserProfile marked owner-set so scheduling reads the owner's real zone from the start rather than the box's server default, while a managing house admin (its userId) is optional — when supplied it is validated as a live house admin and recorded as the sub-account's managingAdminUserId, and when omitted the sub-account is unmanaged and its passive-intake tasks route to the install's primary admin; account_reassign_admin repoints a client sub-account's managing admin to another live house admin (the repair path for a dangling managingAdminUserId, or to record one on an unmanaged account); account_roster is the canonical per-account identity view — one row per sub-account giving business name, role, the managing house admin resolved to a name with status (assigned/absent/dangling), the business owner from the graph with status (named/nameless), and the WhatsApp account-manager binding if any, each field carrying what it means and does not (managing admin is the responsible house team member not the owner; account manager is WhatsApp routing only with no admin rights), so the agent never stitches admin-list + account.json + whatsapp-config; account_set_owner_name names (or corrects) a client sub-account's business owner by writing the owned Person — the canonical name source — refusing a blank or the placeholder "Owner", the guarded repair for a nameless owner (the standing identity-audit op=nameless-owned-person detector); account_channel_routing_set repoints the house-paired WhatsApp/Telegram inbound stream to a different sub-account, and does not affect a sub-account's own separately paired WhatsApp number), admin-add (refuses on a client sub-account, where admin access is already install-wide so a per-operator seat grants nothing — the sub-account's one identity, its business owner, is set at account creation; the house account, where operators hold PIN logins and admins[] rows, is unchanged), admin-remove (refuses to remove a house admin who still manages one or more client sub-accounts, naming them so the operator reassigns each with account_reassign_admin first — never silently orphans them), admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, cpu-triage-start and cpu-triage-read (the two-call device CPU diagnostic — start spawns a detached sampling run across at least one full 120s reconcile cycle and returns a run handle immediately, read returns running/complete/failed with the per-core distribution; no admin tool blocks through a sampling window, and no spot reading is obtainable), plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), skill-search (free-text intent → skill resolver: ranks every plugin skill's SKILL.md name+description against a query and returns the top owners with their canonical skills/<slug>/ path, so intent→skill mapping survives the available-skills menu leaving context after a compaction), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the SiteDesk platform."
5
5
  account-owned-files: [{"file": "webchat-channel-bindings.json", "description": "Routes this account's inbound admin webchat messages. Written by the session manager's webchat-channel-store."}, {"file": "wa-channel-bindings.json", "description": "Routes this account's inbound WhatsApp messages. Written by the session manager's wa-channel-store, which runs on every brand whether or not the whatsapp plugin ships."}, {"file": "telegram-channel-bindings.json", "description": "Routes this account's inbound Telegram messages. Written by the session manager's telegram-channel-store, which runs on every brand whether or not the telegram plugin ships."}, {"file": "canonical-webchat-session.json", "description": "Pins the account's canonical webchat session. Written by the admin UI server."}, {"file": "session-titles.json", "description": "Operator renames of sessions. Written by the session manager's title stores."}, {"file": "agents-disabled.json", "description": "Names the agents the operator switched off. Written by the admin agents route; provision reads it to re-apply the disables and never creates it."}]
6
6
  tools:
7
7
  - name: system-status
@@ -3747,7 +3747,7 @@ eagerTool(server, "account_purge", "IRREVERSIBLY delete every graph node carryin
3747
3747
  await session.close();
3748
3748
  }
3749
3749
  });
3750
- eagerTool(server, "account_channel_routing", "Reports which sub-account WhatsApp/Telegram inbound currently attaches to on this install. There is exactly one WhatsApp number per install (not one per sub-account) this is the single install-wide routing target, defaulting to the house sub-account.", {}, async () => {
3750
+ eagerTool(server, "account_channel_routing", "Reports which sub-account the HOUSE-PAIRED WhatsApp/Telegram socket's inbound attaches to on this install, defaulting to the house sub-account. Each sub-account may pair its own WhatsApp number separately (whatsapp-login-start with no accountId pairs the calling session's own account), and a sub-account's line coexists with the house's rather than replacing it. This setting governs only where the house-paired socket's inbound lands; it does not affect those separate lines and does not limit how many numbers the install pairs.", {}, async () => {
3751
3751
  const house = findHouseAccount(ACCOUNTS_ROOT);
3752
3752
  if (!house) {
3753
3753
  return { content: [{ type: "text", text: "account_channel_routing: no house account found on this install." }], isError: true };
@@ -3758,7 +3758,7 @@ eagerTool(server, "account_channel_routing", "Reports which sub-account WhatsApp
3758
3758
  content: [{ type: "text", text: `WhatsApp/Telegram inbound currently routes to: ${target}${isDefault ? " (house, default)" : ""}` }],
3759
3759
  };
3760
3760
  });
3761
- eagerTool(server, "account_channel_routing_set", "Repoints the single install-wide WhatsApp/Telegram inbound stream to the given sub-account. Refuses an accountId that is not a registered sub-account on this install. Takes effect on the next inbound message — no restart needed.", {
3761
+ eagerTool(server, "account_channel_routing_set", "Repoints the house-paired WhatsApp/Telegram inbound stream to the given sub-account. Refuses an accountId that is not a registered sub-account on this install. Takes effect on the next inbound message — no restart needed. Does not affect a sub-account's own separately paired WhatsApp number.", {
3762
3762
  accountId: z.string().describe("The sub-account UUID to route WhatsApp/Telegram inbound to."),
3763
3763
  }, async ({ accountId }) => {
3764
3764
  if (!ACCOUNT_ID)