@rubytech/create-maxy-code 0.1.279 → 0.1.281

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 (299) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/mcp-spawn-tee/dist/index.d.ts +31 -43
  3. package/payload/platform/lib/mcp-spawn-tee/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/mcp-spawn-tee/dist/index.js +112 -85
  5. package/payload/platform/lib/mcp-spawn-tee/dist/index.js.map +1 -1
  6. package/payload/platform/lib/mcp-spawn-tee/src/__tests__/spawn-tee.test.ts +111 -0
  7. package/payload/platform/lib/mcp-spawn-tee/src/index.ts +113 -84
  8. package/payload/platform/lib/mcp-spawn-tee/tsconfig.json +2 -1
  9. package/payload/platform/plugins/admin/PLUGIN.md +1 -0
  10. package/payload/platform/plugins/admin/hooks/__tests__/prompt-optimiser-directive.test.sh +42 -0
  11. package/payload/platform/plugins/admin/hooks/prompt-optimiser-directive.sh +60 -15
  12. package/payload/platform/plugins/admin/mcp/dist/__tests__/e-sign-discoverable.test.d.ts +2 -0
  13. package/payload/platform/plugins/admin/mcp/dist/__tests__/e-sign-discoverable.test.d.ts.map +1 -0
  14. package/payload/platform/plugins/admin/mcp/dist/__tests__/e-sign-discoverable.test.js +54 -0
  15. package/payload/platform/plugins/admin/mcp/dist/__tests__/e-sign-discoverable.test.js.map +1 -0
  16. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.d.ts +2 -0
  17. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.d.ts.map +1 -0
  18. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.js +19 -0
  19. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.js.map +1 -0
  20. package/payload/platform/plugins/admin/mcp/dist/skill-resolution.d.ts.map +1 -1
  21. package/payload/platform/plugins/admin/mcp/dist/skill-resolution.js +2 -5
  22. package/payload/platform/plugins/admin/mcp/dist/skill-resolution.js.map +1 -1
  23. package/payload/platform/plugins/admin/skills/a4-print-documents/SKILL.md +2 -0
  24. package/payload/platform/plugins/admin/skills/access-manager/SKILL.md +2 -0
  25. package/payload/platform/plugins/admin/skills/admin-user-management/SKILL.md +2 -0
  26. package/payload/platform/plugins/admin/skills/business-profile/SKILL.md +2 -0
  27. package/payload/platform/plugins/admin/skills/capabilities-here/SKILL.md +2 -0
  28. package/payload/platform/plugins/admin/skills/datetime/SKILL.md +2 -0
  29. package/payload/platform/plugins/admin/skills/deck-pages/SKILL.md +2 -0
  30. package/payload/platform/plugins/admin/skills/file-presentation/SKILL.md +2 -0
  31. package/payload/platform/plugins/admin/skills/investigate/SKILL.md +2 -0
  32. package/payload/platform/plugins/admin/skills/plainly/SKILL.md +2 -0
  33. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +5 -1
  34. package/payload/platform/plugins/admin/skills/plugin-management/SKILL.md +2 -0
  35. package/payload/platform/plugins/admin/skills/professional-document/SKILL.md +2 -0
  36. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +2 -0
  37. package/payload/platform/plugins/admin/skills/qr-code/SKILL.md +2 -0
  38. package/payload/platform/plugins/admin/skills/session-management/SKILL.md +2 -0
  39. package/payload/platform/plugins/admin/skills/skill-builder/SKILL.md +2 -0
  40. package/payload/platform/plugins/admin/skills/specialist-management/SKILL.md +2 -0
  41. package/payload/platform/plugins/admin/skills/stream-log-review/SKILL.md +2 -0
  42. package/payload/platform/plugins/admin/skills/superpowers-sprint/SKILL.md +2 -0
  43. package/payload/platform/plugins/admin/skills/task/SKILL.md +2 -0
  44. package/payload/platform/plugins/admin/skills/update-knowledge/SKILL.md +2 -0
  45. package/payload/platform/plugins/admin/skills/upgrade/SKILL.md +2 -0
  46. package/payload/platform/plugins/aeo/skills/structured-answer/SKILL.md +2 -0
  47. package/payload/platform/plugins/business-assistant/PLUGIN.md +2 -1
  48. package/payload/platform/plugins/business-assistant/{references/e-sign.md → skills/e-sign/SKILL.md} +9 -2
  49. package/payload/platform/plugins/cloudflare/skills/cloudflare/SKILL.md +2 -0
  50. package/payload/platform/plugins/deep-research/skills/academic-verify/SKILL.md +2 -0
  51. package/payload/platform/plugins/deep-research/skills/book-mirror/SKILL.md +2 -0
  52. package/payload/platform/plugins/deep-research/skills/data-research/SKILL.md +2 -0
  53. package/payload/platform/plugins/deep-research/skills/deep-research/SKILL.md +2 -0
  54. package/payload/platform/plugins/deep-research/skills/strategic-reading/SKILL.md +2 -0
  55. package/payload/platform/plugins/docs/references/platform.md +2 -0
  56. package/payload/platform/plugins/email/PLUGIN.md +2 -0
  57. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.d.ts +2 -0
  58. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.d.ts.map +1 -0
  59. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.js +68 -0
  60. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.js.map +1 -0
  61. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.d.ts +2 -0
  62. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.d.ts.map +1 -0
  63. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js +55 -0
  64. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js.map +1 -0
  65. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.d.ts +2 -0
  66. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.d.ts.map +1 -0
  67. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.js +110 -0
  68. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.js.map +1 -0
  69. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.d.ts +2 -0
  70. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.d.ts.map +1 -0
  71. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.js +57 -0
  72. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.js.map +1 -0
  73. package/payload/platform/plugins/email/mcp/dist/index.js +8 -1
  74. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  75. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts +5 -0
  76. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts.map +1 -1
  77. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js +35 -5
  78. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js.map +1 -1
  79. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +50 -14
  80. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  81. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +143 -66
  82. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  83. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts +8 -0
  84. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts.map +1 -1
  85. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js.map +1 -1
  86. package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts +16 -5
  87. package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts.map +1 -1
  88. package/payload/platform/plugins/email/mcp/dist/lib/providers.js +120 -13
  89. package/payload/platform/plugins/email/mcp/dist/lib/providers.js.map +1 -1
  90. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js +3 -3
  91. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js.map +1 -1
  92. package/payload/platform/plugins/email/mcp/dist/tools/email-otp-extract.d.ts.map +1 -1
  93. package/payload/platform/plugins/email/mcp/dist/tools/email-otp-extract.js +4 -2
  94. package/payload/platform/plugins/email/mcp/dist/tools/email-otp-extract.js.map +1 -1
  95. package/payload/platform/plugins/email/mcp/dist/tools/email-read.d.ts.map +1 -1
  96. package/payload/platform/plugins/email/mcp/dist/tools/email-read.js +18 -8
  97. package/payload/platform/plugins/email/mcp/dist/tools/email-read.js.map +1 -1
  98. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts.map +1 -1
  99. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js +5 -3
  100. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js.map +1 -1
  101. package/payload/platform/plugins/email/mcp/dist/tools/email-search.d.ts.map +1 -1
  102. package/payload/platform/plugins/email/mcp/dist/tools/email-search.js +18 -8
  103. package/payload/platform/plugins/email/mcp/dist/tools/email-search.js.map +1 -1
  104. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts.map +1 -1
  105. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js +6 -3
  106. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js.map +1 -1
  107. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.d.ts.map +1 -1
  108. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +22 -4
  109. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
  110. package/payload/platform/plugins/email/mcp/package.json +4 -2
  111. package/payload/platform/plugins/email/mcp/vitest.config.ts +9 -0
  112. package/payload/platform/plugins/email/references/email-reference.md +22 -5
  113. package/payload/platform/plugins/email/skills/email-composition/SKILL.md +3 -1
  114. package/payload/platform/plugins/email/skills/email-ingest/SKILL.md +2 -0
  115. package/payload/platform/plugins/graph/PLUGIN.md +2 -0
  116. package/payload/platform/plugins/graph-viewer/skills/render-graph/SKILL.md +2 -0
  117. package/payload/platform/plugins/linkedin-extension/skills/linkedin-extension/SKILL.md +2 -0
  118. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.d.ts +2 -0
  119. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.d.ts.map +1 -0
  120. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.js +31 -0
  121. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.js.map +1 -0
  122. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.d.ts +5 -0
  123. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.d.ts.map +1 -1
  124. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.js +21 -2
  125. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.js.map +1 -1
  126. package/payload/platform/plugins/memory/skills/archive-crawler/SKILL.md +2 -0
  127. package/payload/platform/plugins/memory/skills/challenge/SKILL.md +2 -0
  128. package/payload/platform/plugins/memory/skills/concept-synthesis/SKILL.md +2 -0
  129. package/payload/platform/plugins/memory/skills/connect/SKILL.md +2 -0
  130. package/payload/platform/plugins/memory/skills/conversational-memory/SKILL.md +2 -0
  131. package/payload/platform/plugins/memory/skills/emerge/SKILL.md +2 -0
  132. package/payload/platform/plugins/outlook/skills/outlook/SKILL.md +2 -0
  133. package/payload/platform/plugins/prompt-optimiser/skills/prompt-optimiser/SKILL.md +3 -1
  134. package/payload/platform/plugins/prompt-optimiser/skills/prompt-optimiser/__tests__/restatement-ladder.test.sh +21 -0
  135. package/payload/platform/plugins/scheduling/skills/briefing/SKILL.md +2 -0
  136. package/payload/platform/plugins/scheduling/skills/daily-prep/SKILL.md +2 -0
  137. package/payload/platform/plugins/slides/skills/deck-system/SKILL.md +2 -0
  138. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js +5 -5
  139. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js.map +1 -1
  140. package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +2 -0
  141. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +2 -0
  142. package/payload/platform/plugins/work/skills/execute-task/SKILL.md +2 -0
  143. package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +2 -0
  144. package/payload/platform/scripts/lib/__tests__/admin-skills-bootstrap.test.sh +64 -0
  145. package/payload/platform/scripts/lib/admin-skills-bootstrap.sh +109 -0
  146. package/payload/platform/scripts/setup-account.sh +8 -0
  147. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
  148. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +43 -11
  149. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
  150. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  151. package/payload/platform/services/claude-session-manager/dist/http-server.js +74 -1
  152. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  153. package/payload/platform/services/claude-session-manager/dist/index.js +48 -2
  154. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  155. package/payload/platform/services/claude-session-manager/dist/liveness-divergence.d.ts +19 -0
  156. package/payload/platform/services/claude-session-manager/dist/liveness-divergence.d.ts.map +1 -0
  157. package/payload/platform/services/claude-session-manager/dist/liveness-divergence.js +38 -0
  158. package/payload/platform/services/claude-session-manager/dist/liveness-divergence.js.map +1 -0
  159. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +8 -0
  160. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  161. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +19 -1
  162. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  163. package/payload/platform/services/claude-session-manager/dist/scope-record.d.ts +11 -0
  164. package/payload/platform/services/claude-session-manager/dist/scope-record.d.ts.map +1 -0
  165. package/payload/platform/services/claude-session-manager/dist/scope-record.js +81 -0
  166. package/payload/platform/services/claude-session-manager/dist/scope-record.js.map +1 -0
  167. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +10 -7
  168. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  169. package/payload/platform/services/whatsapp-channel/dist/notification.js +14 -14
  170. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  171. package/payload/platform/templates/agents/admin/IDENTITY.md +2 -6
  172. package/payload/server/public/assets/AdminShell-FO766lOW.js +1 -0
  173. package/payload/server/public/assets/{Checkbox-2reCESkb.js → Checkbox-syHoU9nY.js} +1 -1
  174. package/payload/server/public/assets/{admin-xRCXEFNW.js → admin-0_VxffD5.js} +1 -1
  175. package/payload/server/public/assets/{arc-BgelqC_3.js → arc-BW1WhwmV.js} +1 -1
  176. package/payload/server/public/assets/architecture-YZFGNWBL-xHbVjatf.js +1 -0
  177. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BabnAZJm.js → architectureDiagram-Q4EWVU46-DsionCio.js} +1 -1
  178. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BJzZqNsy.js → blockDiagram-DXYQGD6D-NOG5yVZk.js} +1 -1
  179. package/payload/server/public/assets/{browser-DT2XfRpL.js → browser-Cxjkhtsk.js} +1 -1
  180. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-By-xuh9F.js → c4Diagram-AHTNJAMY-DwFV1k9I.js} +1 -1
  181. package/payload/server/public/assets/channel-D8Go_zJk.js +1 -0
  182. package/payload/server/public/assets/{chunk-2KRD3SAO-Gj2dSpBl.js → chunk-2KRD3SAO-CKn-bEkI.js} +1 -1
  183. package/payload/server/public/assets/{chunk-336JU56O-2PXVPCUA.js → chunk-336JU56O-iJ4ISPCi.js} +2 -2
  184. package/payload/server/public/assets/chunk-426QAEUC-sWe0Iexz.js +1 -0
  185. package/payload/server/public/assets/{chunk-4BX2VUAB-9XIBlnC2.js → chunk-4BX2VUAB-B2mSmC97.js} +1 -1
  186. package/payload/server/public/assets/{chunk-4TB4RGXK-Cr3mXPnI.js → chunk-4TB4RGXK-kKNYi2_i.js} +1 -1
  187. package/payload/server/public/assets/{chunk-55IACEB6-Ccg46J3A.js → chunk-55IACEB6-JLT9m7Hd.js} +1 -1
  188. package/payload/server/public/assets/{chunk-5FUZZQ4R-Cz9MvPKc.js → chunk-5FUZZQ4R-Car3r0he.js} +1 -1
  189. package/payload/server/public/assets/{chunk-5PVQY5BW-BleOdlgO.js → chunk-5PVQY5BW-DR9EfLvj.js} +1 -1
  190. package/payload/server/public/assets/{chunk-67CJDMHE-CyCYCQWy.js → chunk-67CJDMHE-CCdP3Pdx.js} +1 -1
  191. package/payload/server/public/assets/{chunk-7N4EOEYR-KpT3uHzH.js → chunk-7N4EOEYR-bXgVzdM9.js} +1 -1
  192. package/payload/server/public/assets/{chunk-AA7GKIK3-BfOzbuxq.js → chunk-AA7GKIK3-CYeDvY8B.js} +1 -1
  193. package/payload/server/public/assets/{chunk-BSJP7CBP-Bq0M3wlv.js → chunk-BSJP7CBP-U0Fi-Ers.js} +1 -1
  194. package/payload/server/public/assets/{chunk-CIAEETIT-CR-2dNaL.js → chunk-CIAEETIT-C8QrV6Gg.js} +1 -1
  195. package/payload/server/public/assets/{chunk-EDXVE4YY-egUGMTOS.js → chunk-EDXVE4YY-DLUWVRZV.js} +1 -1
  196. package/payload/server/public/assets/{chunk-ENJZ2VHE-CQohBEFw.js → chunk-ENJZ2VHE-B4bNJo6C.js} +1 -1
  197. package/payload/server/public/assets/{chunk-FMBD7UC4-DIxBUbLP.js → chunk-FMBD7UC4-DxAQS3UB.js} +1 -1
  198. package/payload/server/public/assets/{chunk-FOC6F5B3-C2694Zoq.js → chunk-FOC6F5B3-CyIK3zeY.js} +1 -1
  199. package/payload/server/public/assets/{chunk-ICPOFSXX-DpXZKHyn.js → chunk-ICPOFSXX-Qzl8Ki0l.js} +2 -2
  200. package/payload/server/public/assets/{chunk-K5T4RW27-CUicG0Rp.js → chunk-K5T4RW27-7GcDzjyJ.js} +1 -1
  201. package/payload/server/public/assets/{chunk-KGLVRYIC-B5mPJhOr.js → chunk-KGLVRYIC-B7pAr9hf.js} +1 -1
  202. package/payload/server/public/assets/{chunk-LIHQZDEY-q81QhuMs.js → chunk-LIHQZDEY-DEoU2jrz.js} +1 -1
  203. package/payload/server/public/assets/{chunk-ORNJ4GCN-DgurdFZs.js → chunk-ORNJ4GCN-BwMFuN24.js} +1 -1
  204. package/payload/server/public/assets/{chunk-OYMX7WX6-CxqMRu2d.js → chunk-OYMX7WX6-BenBO6O_.js} +1 -1
  205. package/payload/server/public/assets/chunk-QZHKN3VN-CHE_iZO7.js +1 -0
  206. package/payload/server/public/assets/{chunk-U2HBQHQK-BSLctJC9.js → chunk-U2HBQHQK-DewM8R0D.js} +1 -1
  207. package/payload/server/public/assets/{chunk-X2U36JSP--0AUeeFl.js → chunk-X2U36JSP-C22Q6Ea4.js} +1 -1
  208. package/payload/server/public/assets/{chunk-XPW4576I-D-hf9Bcn.js → chunk-XPW4576I-BA0a8Ygs.js} +1 -1
  209. package/payload/server/public/assets/{chunk-YZCP3GAM-PvOhSwI9.js → chunk-YZCP3GAM-DfUUNTnA.js} +1 -1
  210. package/payload/server/public/assets/{chunk-ZZ45TVLE-1zPUlNWz.js → chunk-ZZ45TVLE-CUT6zma2.js} +1 -1
  211. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BLb1mzrT.js +1 -0
  212. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Ctj5qYTS.js +1 -0
  213. package/payload/server/public/assets/clone-DGZ2vydA.js +1 -0
  214. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-Cvo-gkBd.js → cose-bilkent-S5V4N54A-Df_JmB8E.js} +1 -1
  215. package/payload/server/public/assets/{dagre-CMHsNfjP.js → dagre-CYXRIdv0.js} +1 -1
  216. package/payload/server/public/assets/{dagre-KV5264BT-CM1DSx4E.js → dagre-KV5264BT-D4EGb60h.js} +1 -1
  217. package/payload/server/public/assets/{data-Dr7XUvAx.js → data-BOgwOWnw.js} +1 -1
  218. package/payload/server/public/assets/{diagram-5BDNPKRD-VDHiHwEI.js → diagram-5BDNPKRD-BzieCEfT.js} +1 -1
  219. package/payload/server/public/assets/{diagram-G4DWMVQ6-OKdufoeW.js → diagram-G4DWMVQ6-DDbO71XD.js} +1 -1
  220. package/payload/server/public/assets/{diagram-MMDJMWI5-Yg6QdCA1.js → diagram-MMDJMWI5-DqQ_UXDA.js} +1 -1
  221. package/payload/server/public/assets/{diagram-TYMM5635-CpEMZQDu.js → diagram-TYMM5635-CFyxA1aZ.js} +1 -1
  222. package/payload/server/public/assets/{dist-811BIK0R.js → dist-BmvZ8OaX.js} +1 -1
  223. package/payload/server/public/assets/{erDiagram-SMLLAGMA-Dw5gAkFM.js → erDiagram-SMLLAGMA-BMaEBbOK.js} +1 -1
  224. package/payload/server/public/assets/{flatten-BsWEYbBB.js → flatten-Bo6YRmWl.js} +1 -1
  225. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-Cy_R1XHz.js → flowDiagram-DWJPFMVM-De5ChZQP.js} +1 -1
  226. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BYARP_eH.js → ganttDiagram-T4ZO3ILL-CXEMPVaK.js} +1 -1
  227. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CmHdoS27.js +1 -0
  228. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BGOe0unY.js → gitGraphDiagram-UUTBAWPF-OZedr_6y.js} +1 -1
  229. package/payload/server/public/assets/{graph-DOEjjQHD.js → graph-BqD2GjQd.js} +2 -2
  230. package/payload/server/public/assets/{graph-labels-eOrWYy0R.js → graph-labels-DSDTSBfM.js} +1 -1
  231. package/payload/server/public/assets/{graphlib-DaefxCga.js → graphlib-CN4nhD2U.js} +1 -1
  232. package/payload/server/public/assets/info-OMHHGYJF-DTA9msO-.js +1 -0
  233. package/payload/server/public/assets/infoDiagram-42DDH7IO-CSqg4nRL.js +2 -0
  234. package/payload/server/public/assets/{isEmpty-BWl67LAZ.js → isEmpty-D6Kr-M1M.js} +1 -1
  235. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-YrGuzpiI.js → ishikawaDiagram-UXIWVN3A-ChlzrZyx.js} +1 -1
  236. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-EIykOcqg.js → journeyDiagram-VCZTEJTY-DsrK55ZO.js} +1 -1
  237. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BR0TC6Je.js → kanban-definition-6JOO6SKY-DYF-_Rym.js} +1 -1
  238. package/payload/server/public/assets/{line-DPGcT5IM.js → line-3zmwI8XK.js} +1 -1
  239. package/payload/server/public/assets/{linear-CPN03uSh.js → linear-COm19-p7.js} +1 -1
  240. package/payload/server/public/assets/{mermaid-parser.core-D7Iu4c9M.js → mermaid-parser.core-BrcX8-cl.js} +2 -2
  241. package/payload/server/public/assets/{mermaid.core-krXRpXn9.js → mermaid.core-CBdz3b1N.js} +3 -3
  242. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-HwiCtPzN.js → mindmap-definition-QFDTVHPH-BqCqlYZb.js} +1 -1
  243. package/payload/server/public/assets/{ordinal-krseTxxN.js → ordinal-BDi6f4xk.js} +1 -1
  244. package/payload/server/public/assets/packet-4T2RLAQJ-6GjqIKgu.js +1 -0
  245. package/payload/server/public/assets/pie-ZZUOXDRM-T72DJ5JR.js +1 -0
  246. package/payload/server/public/assets/{pieDiagram-DEJITSTG-xodxyWLe.js → pieDiagram-DEJITSTG-D5LiILuM.js} +1 -1
  247. package/payload/server/public/assets/{public-xVaPcg6i.js → public-udi_Z7la.js} +3 -3
  248. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DuYYY4ZZ.js → quadrantDiagram-34T5L4WZ-C3iuI5l_.js} +1 -1
  249. package/payload/server/public/assets/radar-PYXPWWZC-x-6xW1dE.js +1 -0
  250. package/payload/server/public/assets/{reduce-tk-xY6Fv.js → reduce-CGi9ik8i.js} +1 -1
  251. package/payload/server/public/assets/{requirementDiagram-MS252O5E-D0ta3kru.js → requirementDiagram-MS252O5E-CTPOw5qQ.js} +1 -1
  252. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-KdHdlzvT.js → sankeyDiagram-XADWPNL6-D_5aVlYp.js} +1 -1
  253. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DoSFUTQZ.js → sequenceDiagram-FGHM5R23-D7h5vocM.js} +1 -1
  254. package/payload/server/public/assets/{src-Cpl1JzME.js → src-DLEIsjER.js} +1 -1
  255. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BLW0KiSA.js → stateDiagram-FHFEXIEX-DyZjuwPj.js} +1 -1
  256. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BiW9pGXy.js +1 -0
  257. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-8QAzhYz1.js → timeline-definition-GMOUNBTQ-BqpVYJz_.js} +1 -1
  258. package/payload/server/public/assets/treeView-SZITEDCU-5-6wEryJ.js +1 -0
  259. package/payload/server/public/assets/treemap-W4RFUUIX-DF48Cc86.js +1 -0
  260. package/payload/server/public/assets/{useSelectionMode-DlJsX-_X.js → useSelectionMode-BPzPjKP_.js} +1 -1
  261. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BKvfScOi.js → vennDiagram-DHZGUBPP-Czflml0e.js} +1 -1
  262. package/payload/server/public/assets/wardley-RL74JXVD-duKIa6Hq.js +1 -0
  263. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-DaMfDpJ3.js → wardleyDiagram-NUSXRM2D-Cqz3pSTK.js} +1 -1
  264. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-BIkNQlLa.js → xychartDiagram-5P7HB3ND-CS5dEuUO.js} +1 -1
  265. package/payload/server/public/browser.html +4 -4
  266. package/payload/server/public/data.html +5 -5
  267. package/payload/server/public/graph.html +6 -6
  268. package/payload/server/public/index.html +5 -5
  269. package/payload/server/public/public.html +4 -4
  270. package/payload/server/server.js +339 -482
  271. package/payload/server/public/assets/AdminShell-DnH3kou-.js +0 -1
  272. package/payload/server/public/assets/architecture-YZFGNWBL-YM-TtgPY.js +0 -1
  273. package/payload/server/public/assets/channel-BRPH0atd.js +0 -1
  274. package/payload/server/public/assets/chunk-426QAEUC-QhauxjvK.js +0 -1
  275. package/payload/server/public/assets/chunk-QZHKN3VN-BDAQvtxz.js +0 -1
  276. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BJv89PB6.js +0 -1
  277. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DNUszH5M.js +0 -1
  278. package/payload/server/public/assets/clone-CREg9jLM.js +0 -1
  279. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CtOPqykB.js +0 -1
  280. package/payload/server/public/assets/info-OMHHGYJF-Jba5enA8.js +0 -1
  281. package/payload/server/public/assets/infoDiagram-42DDH7IO-Df9BlkPA.js +0 -2
  282. package/payload/server/public/assets/packet-4T2RLAQJ-D_eWzeAP.js +0 -1
  283. package/payload/server/public/assets/pie-ZZUOXDRM-BDiy1Ob2.js +0 -1
  284. package/payload/server/public/assets/radar-PYXPWWZC-C5mlfmtg.js +0 -1
  285. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-C5zlCV4X.js +0 -1
  286. package/payload/server/public/assets/treeView-SZITEDCU-CM-9m-cS.js +0 -1
  287. package/payload/server/public/assets/treemap-W4RFUUIX-DDHPB-Xh.js +0 -1
  288. package/payload/server/public/assets/wardley-RL74JXVD-CUb3Br4q.js +0 -1
  289. package/payload/server/public/assets/whatsapp-cDxgZkbM.js +0 -1
  290. package/payload/server/public/whatsapp.html +0 -18
  291. /package/payload/server/public/assets/{_baseFor-BHtDrjIo.js → _baseFor-Cam2PbSt.js} +0 -0
  292. /package/payload/server/public/assets/{array-DetWRiSa.js → array-DYRGGQae.js} +0 -0
  293. /package/payload/server/public/assets/{chunk-CWOGyPgy.js → chunk-CnGqDkHZ.js} +0 -0
  294. /package/payload/server/public/assets/{cytoscape.esm-C9yNhe1u.js → cytoscape.esm-nWsJMTNI.js} +0 -0
  295. /package/payload/server/public/assets/{defaultLocale-_WRwicXn.js → defaultLocale-Du1XY3Dp.js} +0 -0
  296. /package/payload/server/public/assets/{init-sTEcj9YX.js → init-B5BXBRcm.js} +0 -0
  297. /package/payload/server/public/assets/{katex-s61Rgv6l.js → katex-HOUACuRw.js} +0 -0
  298. /package/payload/server/public/assets/{path-B0Ik7Tu9.js → path-CNO468J-.js} +0 -0
  299. /package/payload/server/public/assets/{rough.esm-DKRO8IF-.js → rough.esm-DRO6hWPh.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { writeConfig, writePassword, removeConfig, checkAddressBinding, writeBindingConfig, } from "../lib/credentials.js";
3
- import { inferProvider, getProviderNotes } from "../lib/providers.js";
3
+ import { describeProvider } from "../lib/providers.js";
4
4
  import * as imap from "../lib/imap.js";
5
5
  import * as smtp from "../lib/smtp.js";
6
6
  /**
@@ -37,9 +37,27 @@ function stripStaleEmailFetchCron() {
37
37
  }
38
38
  export async function emailSetup(params) {
39
39
  const { email, password, accountId } = params;
40
- // Infer provider defaults if hosts not explicitly provided
41
- const provider = inferProvider(email);
42
- const providerNotes = getProviderNotes(email) ?? undefined;
40
+ // Resolve the provider once (static map MX fallback). This runs regardless
41
+ // of supplied hosts, because a Microsoft address must be refused even when the
42
+ // operator hand-enters office365 hosts: the email-plugin IMAP path is dead
43
+ // (Basic auth retired; M365 app passwords ended 1 March 2026). Microsoft mail
44
+ // connects through the outlook Graph plugin, not email-setup.
45
+ const info = await describeProvider(email);
46
+ if (info.status === "redirect") {
47
+ process.stderr.write(`[email] setup-redirect domain=${info.domain} target=${info.plugin} reason=ms-basic-auth-retired\n`);
48
+ return {
49
+ success: false,
50
+ message: `${email} is a Microsoft (Outlook.com / Microsoft 365) address. ${info.reason} Do not retry email-setup for this address — run ${info.registerTool} on the ${info.plugin} plugin to connect it.`,
51
+ };
52
+ }
53
+ // Use inferred host defaults only when a host is actually missing. When the
54
+ // operator supplies both hosts, the inferred fields are discarded below by the
55
+ // `??` chain and the domain-derived note could describe a different provider
56
+ // than the hosts in use, so both are skipped. The describeProvider call above
57
+ // is the single resolution; notes come from the same result.
58
+ const needsInference = !params.imapHost || !params.smtpHost;
59
+ const provider = needsInference && info.status === "known" ? info.defaults : null;
60
+ const providerNotes = needsInference && info.status === "known" ? info.notes : undefined;
43
61
  const agentAddress = params.agentAddress?.trim() || email;
44
62
  const config = {
45
63
  email,
@@ -1 +1 @@
1
- {"version":3,"file":"email-setup.js","sourceRoot":"","sources":["../../src/tools/email-setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"email-setup.js","sourceRoot":"","sources":["../../src/tools/email-setup.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,8 @@
6
6
  "main": "dist/index.js",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
- "start": "node dist/index.js"
9
+ "start": "node dist/index.js",
10
+ "test": "vitest run"
10
11
  },
11
12
  "dependencies": {
12
13
  "@modelcontextprotocol/sdk": "^1.12.1",
@@ -17,6 +18,7 @@
17
18
  "devDependencies": {
18
19
  "@types/node": "^22.0.0",
19
20
  "@types/nodemailer": "^6.4.17",
20
- "typescript": "^5.7.0"
21
+ "typescript": "^5.7.0",
22
+ "vitest": "^4.1.7"
21
23
  }
22
24
  }
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: "node",
6
+ include: ["src/**/__tests__/**/*.test.ts"],
7
+ testTimeout: 10_000,
8
+ },
9
+ });
@@ -6,9 +6,10 @@ Full reference for the email plugin. Load with `plugin-read` when detailed confi
6
6
 
7
7
  Setup is two steps in plain chat, in this order. **Do the provider lookup before asking for any password** — most providers reject the normal login password and require a credential the operator has to mint in the provider's own settings, so asking for "the password" first sends them down a path that cannot work.
8
8
 
9
- **Step 1 — look up the provider.** As soon as you have the email address, call `email-provider-info` with it. The tool returns one of three outcomes:
9
+ **Step 1 — look up the provider.** As soon as you have the email address, call `email-provider-info` with it. The tool returns one of four outcomes:
10
10
 
11
11
  - **Known provider** — it gives the IMAP/SMTP hosts (already inferred, no need to ask) and the provider's specific requirement: an app-specific password, a trusted-device/IMAP toggle, enabling IMAP on a paid plan, etc. Relay that requirement to the operator and wait for them to create the credential in their provider's settings. Name the provider and the step it needs — that is the whole point of this tool.
12
+ - **Microsoft (redirect)** — an Outlook.com / Hotmail / Live / Microsoft 365 address (consumer domains, or a custom domain whose MX is Microsoft). The email plugin's IMAP path for Microsoft is dead — Microsoft retired Basic auth for Exchange Online and M365 app passwords stopped working on 1 March 2026 — so the tool does **not** return hosts. Do not call `email-setup`. Connect the account through the `outlook` Graph plugin instead: run `outlook-account-register`. See § Microsoft / Microsoft 365 below.
12
13
  - **Unsupported provider** — some providers (e.g. Tuta/Tutanota) deliberately offer no IMAP/SMTP at all. The tool says so; tell the operator this account cannot be connected here, and stop.
13
14
  - **Unknown provider** — no host mapping. Ask the operator for the IMAP host/port and SMTP host/port (their provider's "mail client" / "IMAP/SMTP" help page lists these) along with the password.
14
15
 
@@ -28,6 +29,22 @@ On success, confirm "credentials stored" and the inbox count. On failure, relay
28
29
 
29
30
  The agent never displays stored passwords.
30
31
 
32
+ ### Google / Google Workspace
33
+
34
+ `email-provider-info` returns the gmail hosts for a Google address by either path: the `gmail.com` / `googlemail.com` static entry, or — for a Google Workspace custom domain (e.g. `name@company.co.uk` whose mail is hosted by Google) — MX detection. A Workspace custom domain is no longer `unknown`: the tool resolves its MX records, sees Google as the mail host, and returns `imap.gmail.com` / `smtp.gmail.com`. There is no host guessing.
35
+
36
+ For any Google address, **require an app password — never the regular account password.** Google retired regular-password (basic auth) sign-in in May 2025, so the login password cannot work for IMAP/SMTP. Walk the operator through generating one: Google Account → Security → turn on 2-Step Verification (required first) → App passwords → Mail → generate. Paste that 16-character value as `password` to `email-setup`. Do not ask for the normal password at any point.
37
+
38
+ For a Workspace custom domain there is one extra dependency: the Workspace admin must allow app passwords (Admin console → Security). If the app password is rejected at `email-setup` — an authentication failure with an app password supplied — the tenant has app passwords disabled, and the account needs OAuth instead (Task 708, not yet shipped). Relay that to the operator rather than retrying the password.
39
+
40
+ ### Microsoft / Microsoft 365
41
+
42
+ Microsoft mail does not go through the email plugin. Microsoft retired Basic authentication for Exchange Online IMAP/POP, and Microsoft 365 app passwords stopped working on 1 March 2026, so there is no IMAP path left — for consumer Outlook.com / Hotmail / Live / MSN addresses or for a custom domain whose mail is hosted by Microsoft 365 (MX records ending in `mail.protection.outlook.com`).
43
+
44
+ `email-provider-info` recognises both — the static consumer domains, and a custom M365 domain via MX detection — and returns the **redirect** outcome rather than IMAP hosts. `email-setup` likewise refuses a Microsoft address (even if you hand it `outlook.office365.com` hosts) and points back here; it never attempts a connection.
45
+
46
+ Connect the account through the **`outlook` Graph plugin** instead: run `outlook-account-register`. That plugin authorises over OAuth — it opens a Microsoft sign-in for the operator (in the headless browser) and stores the token; there is no password or app password to ask for. After registration, Microsoft mail is read with the `outlook-mail-list` / `outlook-mail-search` tools, not `email-read` / `email-search`.
47
+
31
48
  ## Reading and Searching
32
49
 
33
50
  `email-read` and `email-search` return message metadata only: UID, sender, subject, and date. Body content is not included — present results as a message list without commenting on missing bodies.
@@ -76,11 +93,11 @@ Both `email-send` and `email-reply` accept an optional `attachments` array of ab
76
93
  When `agentAddress` is set and differs from the auth email:
77
94
 
78
95
  - **Sending:** emails are sent with the agent address as the From header. SMTP authentication still uses the auth email.
79
- - **Reading/searching:** only emails whose TO header contains the agent address are returned. The agent ignores emails to other addresses on the same mailbox.
80
- - **OTP extraction:** only OTPs addressed to the agent address are found.
96
+ - **Reading/searching/fetching:** emails whose **To or Cc** header contains **either the login (auth email) or the agent address** are returned. `email-read`, `email-search`, and `email-fetch` apply the same `{login, alias}` recipient set, inspecting both To and Cc, so a reply that arrives at the login or Cc's the alias is not hidden. Pass an explicit `to=` (read/search) to narrow to one address.
97
+ - **OTP extraction:** OTPs addressed (To or Cc) to the login or the agent address are found.
81
98
  - **Status:** reports both the agent address and the auth email.
82
99
 
83
- When `agentAddress` is not set or matches the auth email, all tools behave as before — no filtering, From header uses the auth email.
100
+ When `agentAddress` is not set or matches the auth email, all tools behave as before — no recipient filter, From header uses the auth email.
84
101
 
85
102
  ## Email Persistence
86
103
 
@@ -95,7 +112,7 @@ Properties of the persistence layer:
95
112
 
96
113
  - **Operator-initiated only.** No `setInterval`, cron, or systemd timer ever invokes `email-fetch`. The operator drives every cycle.
97
114
  - **Deduplication:** Each archive is keyed by `conversationIdentity` (sha256 over `accountId + sortedParticipantElementIds`). Re-ingesting the same thread delta-appends new sections rather than duplicating.
98
- - **Alias filtering:** Only emails addressed TO the agent's `agentAddress` are listed and ingested.
115
+ - **Alias filtering:** Emails whose To or Cc carries the agent's `agentAddress` **or** the login (auth email) are listed by `email-fetch` and ingested. The fetch path uses the same `{login, alias}` recipient set, inspecting To and Cc, as `email-read`/`email-search`; when no distinct alias is configured no recipient filter is applied and every message in the UID window is listed.
99
116
  - **Semantic search:** Sections are vector-indexed via `section_embedding`, enabling natural-language search via `email-graph-query` that ranks parent archives by their best-matching section.
100
117
  - **Isolation:** Each agent sees only archives whose participants resolve to its own account scope, even when sharing a catchall mailbox.
101
118
 
@@ -5,6 +5,8 @@ description: "Conversational wrapper around the email plugin tools. Activate whe
5
5
 
6
6
  # Email composition
7
7
 
8
+ Invoked from `specialists:personal-assistant`.
9
+
8
10
  Conversational wrapper around the existing `email-*` tools. Drafting, threading, triage. **Human-in-the-loop only — every send is explicitly approved by the operator.** No drip sequences, no scheduled sends, no automatic categorisation.
9
11
 
10
12
  ## When to activate
@@ -19,7 +21,7 @@ Activate when the operator asks for any of:
19
21
  Do **not** activate for:
20
22
 
21
23
  - Listing or searching emails as the end-goal (no draft intent) — let `email-search` / `email-graph-query` answer directly.
22
- - Setup, status checks, OTP extraction — those are direct tool calls.
24
+ - Setup, status checks, OTP extraction — those are direct tool calls. (For Google/Workspace setup the agent must require an app password, never the regular password — see the email plugin's `references/email-reference.md` § Setup → Google. For Microsoft / Microsoft 365 addresses there is no email-plugin path at all — register via the `outlook` Graph plugin's `outlook-account-register`, not `email-setup` — see § Setup → Microsoft.)
23
25
  - Any automated send loop. If the operator asks for drip / scheduled / broadcast sends, decline and explain that this skill is human-in-the-loop only.
24
26
 
25
27
  ## Flow — reply to an existing thread
@@ -5,6 +5,8 @@ description: "Operator-initiated email ingestion. Activate when the operator ask
5
5
 
6
6
  # Email ingestion
7
7
 
8
+ Invoked from `specialists:personal-assistant`.
9
+
8
10
  Operator-initiated, human-in-the-loop ingestion of the agent's IMAP inbox into the graph. New messages enter the knowledge graph **only** when the operator says so, and only the ones they pick. There is no background poll, no automatic classifier, no silent writes.
9
11
 
10
12
  ## When to activate
@@ -13,8 +13,10 @@ tools:
13
13
  mcp:
14
14
  command: node
15
15
  args:
16
+ - ${PLATFORM_ROOT}/lib/mcp-spawn-tee/dist/index.js
16
17
  - ${PLATFORM_ROOT}/lib/graph-mcp/dist/index.js
17
18
  env:
19
+ MCP_SPAWN_TEE_NAME: graph
18
20
  LOG_DIR: ${LOG_DIR}
19
21
  PLATFORM_ROOT: ${PLATFORM_ROOT}
20
22
  ACCOUNT_ID: ${ACCOUNT_ID}
@@ -5,6 +5,8 @@ description: "Render an inline PNG of a Neo4j subgraph for the operator using th
5
5
 
6
6
  # render-graph
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  When the operator asks for a picture of a subgraph:
9
11
 
10
12
  1. Resolve the root node's `elementId` first — usually via `memory-search`
@@ -5,6 +5,8 @@ description: Payload contract and DOM-selector rules for the LinkedIn one-click
5
5
 
6
6
  # LinkedIn Extension — payload & selectors
7
7
 
8
+ Invoked from `specialists:librarian`.
9
+
8
10
  This skill carries two contracts. Neither is enforced by an LLM; both are enforced by the route schema and the extractor unit tests.
9
11
 
10
12
  ## 1. Wire payload
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=kd-classify-account-dir.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kd-classify-account-dir.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/kd-classify-account-dir.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import { resolveAccountDirFromEnv } from '../kd-classify.js';
3
+ describe('Task 714 — kd-classify account-dir resolution', () => {
4
+ const saved = { ...process.env };
5
+ beforeEach(() => {
6
+ delete process.env.ACCOUNT_DIR;
7
+ delete process.env.PLATFORM_ROOT;
8
+ delete process.env.ACCOUNT_ID;
9
+ });
10
+ afterEach(() => {
11
+ process.env = { ...saved };
12
+ });
13
+ it('returns ACCOUNT_DIR when set', () => {
14
+ process.env.ACCOUNT_DIR = '/data/accounts/acc-1';
15
+ expect(resolveAccountDirFromEnv()).toBe('/data/accounts/acc-1');
16
+ });
17
+ it('falls back to PLATFORM_ROOT + ACCOUNT_ID', () => {
18
+ process.env.PLATFORM_ROOT = '/opt/platform';
19
+ process.env.ACCOUNT_ID = 'acc-1';
20
+ expect(resolveAccountDirFromEnv()).toBe('/opt/data/accounts/acc-1');
21
+ });
22
+ it('returns null when neither is resolvable', () => {
23
+ expect(resolveAccountDirFromEnv()).toBeNull();
24
+ });
25
+ it('returns null when ACCOUNT_ID contains path traversal', () => {
26
+ process.env.PLATFORM_ROOT = '/opt/platform';
27
+ process.env.ACCOUNT_ID = '../../etc';
28
+ expect(resolveAccountDirFromEnv()).toBeNull();
29
+ });
30
+ });
31
+ //# sourceMappingURL=kd-classify-account-dir.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kd-classify-account-dir.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/kd-classify-account-dir.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,MAAM,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;QAChC,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IAC/B,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,sBAAsB,CAAA;QAChD,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,eAAe,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAA;QAChC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,eAAe,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,WAAW,CAAA;QACpC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,3 +1,8 @@
1
+ /** Resolve the account-scoped storage root. ACCOUNT_DIR is the canonical
2
+ * spawn-set var; fall back to PLATFORM_ROOT + ACCOUNT_ID exactly as url-get
3
+ * does. Returns null when neither is resolvable — the caller throws a precise
4
+ * error rather than staging a temp file at an empty path. */
5
+ export declare function resolveAccountDirFromEnv(): string | null;
1
6
  export interface KdClassifyParams {
2
7
  accountId: string;
3
8
  attachmentId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"kd-classify.d.ts","sourceRoot":"","sources":["../../src/tools/kd-classify.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AA8CD,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoD1E"}
1
+ {"version":3,"file":"kd-classify.d.ts","sourceRoot":"","sources":["../../src/tools/kd-classify.ts"],"names":[],"mappings":"AAQA;;;8DAG8D;AAC9D,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,IAAI,CASxD;AAeD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AA8CD,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuD1E"}
@@ -1,5 +1,21 @@
1
+ import { join } from "node:path";
1
2
  import { getSession } from "../lib/neo4j.js";
2
3
  import { decideGate, writeClassifyTempFile, buildDispatchEnvelope, } from "../lib/kd-classify-gate.js";
4
+ /** Resolve the account-scoped storage root. ACCOUNT_DIR is the canonical
5
+ * spawn-set var; fall back to PLATFORM_ROOT + ACCOUNT_ID exactly as url-get
6
+ * does. Returns null when neither is resolvable — the caller throws a precise
7
+ * error rather than staging a temp file at an empty path. */
8
+ export function resolveAccountDirFromEnv() {
9
+ const direct = process.env.ACCOUNT_DIR;
10
+ if (direct && direct.trim())
11
+ return direct;
12
+ const platformRoot = process.env.PLATFORM_ROOT;
13
+ const accountId = process.env.ACCOUNT_ID;
14
+ if (platformRoot && accountId && !accountId.includes("/") && !accountId.includes("..")) {
15
+ return join(platformRoot, "..", "data", "accounts", accountId);
16
+ }
17
+ return null;
18
+ }
3
19
  async function readKd(accountId, attachmentId) {
4
20
  const session = getSession();
5
21
  try {
@@ -56,9 +72,12 @@ export async function kdClassify(params) {
56
72
  // Race: body emptied between the two reads. Unexpected; surface loudly.
57
73
  throw new Error(`kd-classify: body for ${attachmentId} was readable in the metadata query but is now empty.`);
58
74
  }
59
- const accountDir = process.env.ACCOUNT_DIR;
75
+ // Task 714 ACCOUNT_DIR is set at the spawn seam, but derive from
76
+ // PLATFORM_ROOT + ACCOUNT_ID when absent so a spawn path that omits it
77
+ // degrades rather than crashing. Loud-fail only when no source resolves.
78
+ const accountDir = resolveAccountDirFromEnv();
60
79
  if (!accountDir) {
61
- throw new Error(`kd-classify: ACCOUNT_DIR env not set; cannot stage body for librarian dispatch.`);
80
+ throw new Error(`kd-classify: no account context (ACCOUNT_DIR unset and PLATFORM_ROOT+ACCOUNT_ID unavailable); cannot stage body for librarian dispatch.`);
62
81
  }
63
82
  const tempFilePath = await writeClassifyTempFile(accountDir, attachmentId, body);
64
83
  return buildDispatchEnvelope({
@@ -1 +1 @@
1
- {"version":3,"file":"kd-classify.js","sourceRoot":"","sources":["../../src/tools/kd-classify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kd-classify.js","sourceRoot":"","sources":["../../src/tools/kd-classify.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ description: "Walks a folder of files the owner has accumulated over time (Downl
5
5
 
6
6
  # Archive crawler
7
7
 
8
+ Invoked from `specialists:librarian`.
9
+
8
10
  This skill imports volume in a controlled way. It walks a folder, classifies each file, asks the owner to filter, and routes only the approved set through the existing ingest skills. It does not invent a new write path; it sits in front of `document-ingest` and `conversation-archive` and gates them.
9
11
 
10
12
  **Default parent.** This skill performs no graph writes itself. The downstream ingest skill it dispatches to (`document-ingest`, `conversation-archive`, or a per-source archive importer) is responsible for naming the parent in the canonical hierarchy `LocalBusiness → Project → KnowledgeDocument`. The operator's filter selection answers the parent question implicitly — "scan my Downloads for pricing notes" names the topical scope that the downstream skill resolves into a `:Project` anchor before any write.
@@ -5,6 +5,8 @@ description: "Stress-tests a claim against the operator's own graph. Retrieves n
5
5
 
6
6
  # Challenge
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  This skill retrieves nodes from the operator's graph that contradict or qualify a given claim. It presents the strongest counter-case the graph can support. It reads only — it never writes.
9
11
 
10
12
  ## When to run
@@ -5,6 +5,8 @@ description: "Walks the knowledge documents already in the graph, clusters them
5
5
 
6
6
  # Concept synthesis
7
7
 
8
+ Invoked from `specialists:librarian`.
9
+
8
10
  This skill turns a pile of saved documents into a usable concept map. It reads what the graph already holds, groups related material, names the groups, and connects them back to their sources. It writes nothing without the owner's approval, and it never auto-merges across groups.
9
11
 
10
12
  **Default parent.** Every `:Concept` node this skill creates is anchored to a `:Project` (when the scope is a project) or to the account's `:LocalBusiness` (when the scope is a topic phrase or date range that crosses projects). The parent is named at proposal time and shown in the per-cluster row the operator approves — a Concept with no project or LocalBusiness parent is a write defect, never an option.
@@ -5,6 +5,8 @@ description: "Finds the bridge between two topics or entities in the operator's
5
5
 
6
6
  # Connect
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  This skill finds bridging nodes between two topics or entities in the operator's graph. It names the bridge and lists the nodes that form it. It reads only — it never writes.
9
11
 
10
12
  ## When to run
@@ -5,6 +5,8 @@ description: "Notice, store, and recall who the owner is and how they work, accu
5
5
 
6
6
  # Conversational Memory
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  Memory accumulates from conversation — never from questionnaires, quizzes, or onboarding forms. The owner reveals who they are and how they work through natural interaction. Your role is to notice, store, and recall that knowledge so every session feels continuous rather than starting from scratch.
9
11
 
10
12
  ## Memory Tools
@@ -5,6 +5,8 @@ description: "Clusters KnowledgeDocument and Section nodes that have no Concept
5
5
 
6
6
  # Emerge
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  This skill surfaces unnamed clusters of knowledge already in the operator's graph — documents and sections that share a theme but have no Concept node connecting them yet. For each cluster it proposes a name and routes the write through the operator-approval gate. It never writes without approval.
9
11
 
10
12
  ## When to run
@@ -5,6 +5,8 @@ description: "Microsoft 365 / Outlook.com via Microsoft Graph (read-only). Use w
5
5
 
6
6
  # Outlook (Microsoft Graph)
7
7
 
8
+ Invoked from `specialists:personal-assistant`.
9
+
8
10
  Read-only access to the user's Outlook.com or Microsoft 365 mailbox via Microsoft Graph. Per-account OAuth, encrypted token storage, refresh handled automatically.
9
11
 
10
12
  ## When to activate
@@ -5,6 +5,8 @@ description: Turn any rough prompt, half-formed idea, or task description into a
5
5
 
6
6
  # Prompt optimiser
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  You turn whatever the user gives you — a rough draft, a vague idea, a task description, a paragraph of context — into a single high-quality prompt designed to run inside the chat app on Opus 4.7 with adaptive thinking.
9
11
 
10
12
  This is for the **chat app** (claude.ai, Mac, iOS), not the API. The user is going to paste a single message into chat. There is no system prompt, no `effort` parameter, no tool config to tune. The prompt itself has to do all the work.
@@ -20,7 +22,7 @@ This skill is invoked two ways, and they want opposite outputs. Decide which one
20
22
  - Do not end with "Think before answering". Do not ask the user to paste anything — you already have the content and the context.
21
23
  - Do not invent requirements or add scope the user did not ask for. If the prompt was already clear, say so in one line and restate it tightly.
22
24
  - The restated brief is bound by the three doctrines (see `/doctrine`): precise/concise/plain, no speculation, observability-first. If the user's wording carries a speculative claim or skips an observability step the doctrines require, the restatement corrects it rather than echoing the slip.
23
- - End the restated brief with this exact sentence as its own final line: "Delegate this task to the appropriate specialist." Apply on every restatement, without exception. The owning specialist is identified from the AGENTS.md roster loaded alongside this seat — the closing line is the trigger, not the classifier (Task 529).
25
+ - End the restated brief with the three-tier routing ladder, applied to the restated task in order. **(1)** Delegate to the specialist that owns the deliverable's type via the Agent tool: ownership covers origination, not just the final render, and the brief states the outcome plus the binding constraints, never the lines, anchors, or literal text to insert. **(2)** Only if no installed specialist owns it, load a skill from the admin-usable list with skill-load and do the work from this seat. **(3)** Only if neither fits, author it directly freestyle inline authoring is the last resort, not a peer of the two routes above. The live specialist roster and admin-usable list are injected each turn by the standing prompt-optimiser directive; the ranked ladder is the classifier. This reverses Task 529's "the closing line is the trigger, not the classifier".
24
26
 
25
27
  Then do the work from the restated task. Everything below this section is for the other mode and does not apply — stop reading here.
26
28
 
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+ # Task 698 — the prompt-optimiser restatement mode must end with the three-tier
3
+ # routing ladder, not the lone "Delegate this task to the appropriate specialist."
4
+ # line it carried before.
5
+ set -u
6
+
7
+ SK="$(cd "$(dirname "$0")/.." && pwd)/SKILL.md"
8
+ [ -f "$SK" ] || { echo "FAIL: $SK not found" >&2; exit 1; }
9
+
10
+ PASS=0; FAIL=0
11
+ chk() { if eval "$2"; then echo "PASS: $1"; PASS=$((PASS+1)); else echo "FAIL: $1" >&2; FAIL=$((FAIL+1)); fi; }
12
+
13
+ chk "lone delegate line removed" '! grep -q "Delegate this task to the appropriate specialist." "$SK"'
14
+ chk "tier 1 delegate to specialist" 'grep -qiE "delegate to (a |the )?specialist" "$SK"'
15
+ chk "tier 2 admin-usable skill" 'grep -qi "admin-usable" "$SK"'
16
+ chk "tier 3 freestyle last resort" 'grep -qiE "freestyle|last resort" "$SK"'
17
+ chk "restatement section present" 'grep -qi "In-session restatement mode" "$SK"'
18
+
19
+ echo "----"
20
+ echo "PASS=$PASS FAIL=$FAIL"
21
+ [ "$FAIL" -eq 0 ]
@@ -5,6 +5,8 @@ description: "Composes a one-screen daily briefing covering outstanding commitme
5
5
 
6
6
  # Briefing
7
7
 
8
+ Invoked from `specialists:personal-assistant`.
9
+
8
10
  This skill produces the owner's daily reading pack. It pulls four signals from the graph, composes them into a single screen of output, and persists the composed briefing as a `:Report` node so the owner can later ask "what was this morning's briefing" and get the exact text back. It does not draft replies, schedule events, or mark tasks complete; the only write is the report-persistence step.
9
11
 
10
12
  ## When to run
@@ -5,6 +5,8 @@ description: "Fetches today's calendar and produces a per-event context block fo
5
5
 
6
6
  # Daily prep
7
7
 
8
+ Invoked from `specialists:personal-assistant`.
9
+
8
10
  This skill turns today's calendar into a ready-to-read context pack. For each event, it looks up the attendees in the graph and surfaces what the owner already knows about each one. It never invents context; if the graph has no record of a person, it says so out loud.
9
11
 
10
12
  ## When to run
@@ -8,6 +8,8 @@ description: >
8
8
 
9
9
  # Slides: Deck Generation Skill
10
10
 
11
+ Invoked from `specialists:content-producer`.
12
+
11
13
  You are generating a slide deck using the Slides framework. This skill gives you everything needed to produce correct, on-brand decks.
12
14
 
13
15
  ## What you produce
@@ -32,11 +32,11 @@ const CHALLENGE_SIGNATURES = [
32
32
  "attention required! | cloudflare",
33
33
  "<title>just a moment",
34
34
  ];
35
- /** Resolve the account-scoped storage root. ACCOUNT_DIR is the canonical env
36
- * var (set on the spawned claude process); fall back to deriving it from
37
- * PLATFORM_ROOT + ACCOUNT_ID so the tool still works when only those are
38
- * present. Returns null when neither is resolvable — the caller turns that
39
- * into an error envelope rather than throwing. */
35
+ /** Resolve the account-scoped storage root. ACCOUNT_DIR is set on the spawned
36
+ * claude process at the spawn seam (pty-spawner buildMcpPlaceholders + spawnEnv,
37
+ * Task 714); the PLATFORM_ROOT + ACCOUNT_ID derivation below is the fallback for
38
+ * any path that does not carry it. Returns null when neither is resolvable — the
39
+ * caller turns that into an error envelope rather than throwing. */
40
40
  function resolveAccountDir() {
41
41
  const direct = process.env.ACCOUNT_DIR;
42
42
  if (direct && direct.trim())
@@ -1 +1 @@
1
- {"version":3,"file":"url-get.js","sourceRoot":"","sources":["../../src/tools/url-get.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"url-get.js","sourceRoot":"","sources":["../../src/tools/url-get.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ description: Guide the user through connecting WhatsApp via a typed pairing code
5
5
 
6
6
  # Connect WhatsApp
7
7
 
8
+ Invoked from `specialists:personal-assistant`.
9
+
8
10
  Conversational flow for linking a WhatsApp account to {{productName}} via a typed WhatsApp pairing code, followed by admin phone registration and public agent selection. All three phases are required for a correctly configured WhatsApp channel.
9
11
 
10
12
  ## When to activate
@@ -5,6 +5,8 @@ description: Guide the user through viewing and editing WhatsApp settings — me
5
5
 
6
6
  # Manage WhatsApp Config
7
7
 
8
+ Invoked from `specialists:personal-assistant`.
9
+
8
10
  Conversational editing of WhatsApp settings. Every field is presented with its description, current value, and what the default means — the user makes informed decisions without needing backend knowledge.
9
11
 
10
12
  ## When to activate
@@ -5,6 +5,8 @@ description: "Operator task loop for outstanding work. Activate when the operato
5
5
 
6
6
  # Execute task
7
7
 
8
+ Invoked from `specialists:project-manager`.
9
+
8
10
  The operator-facing wrapper around the `work-*`, `project-*`, and `session-*` tools. Drives one Task from selection to closure with every artefact tied back to the graph. Five clauses are binding; the skill is a contract, not a recipe.
9
11
 
10
12
  ## When to activate
@@ -5,6 +5,8 @@ description: "Create, test, and diagnose persistent workflows that automate recu
5
5
 
6
6
  # Workflow Manager
7
7
 
8
+ Invoked from `specialists:project-manager`.
9
+
8
10
  Create, test, and diagnose persistent workflows that automate recurring multi-step processes.
9
11
 
10
12
  ## When to Suggest a Workflow