@rubytech/create-maxy-code 0.1.63 → 0.1.64

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 (571) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/docs/references/admin-session.md +2 -1
  3. package/payload/platform/plugins/docs/references/platform.md +4 -0
  4. package/payload/platform/services/claude-session-manager/dist/index.js +4 -0
  5. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  6. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +12 -0
  7. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  8. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +67 -19
  9. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  10. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -1
  11. package/payload/platform/services/claude-session-manager/dist/tool-surface.js +19 -4
  12. package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -1
  13. package/payload/platform/services/claude-session-manager/dist/types.d.ts +5 -0
  14. package/payload/platform/services/claude-session-manager/dist/types.d.ts.map +1 -1
  15. package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
  16. package/payload/premium-plugins/real-agent/BUNDLE.md +2 -4
  17. package/payload/premium-plugins/real-agent/agents/valuer.md +1 -2
  18. package/payload/premium-plugins/real-agent/plugins/epc/.claude-plugin/plugin.json +3 -3
  19. package/payload/premium-plugins/real-agent/plugins/listings/.claude-plugin/plugin.json +1 -1
  20. package/payload/premium-plugins/real-agent/plugins/listings/PLUGIN.md +1 -3
  21. package/payload/premium-plugins/real-agent/plugins/listings/skills/new-instruction/SKILL.md +11 -12
  22. package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/SKILL.md +55 -33
  23. package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/render.py +69 -70
  24. package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/template-inputs.schema.json +12 -7
  25. package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/template.html +88 -19
  26. package/payload/premium-plugins/real-agent/specs/03-new-instruction.md +8 -12
  27. package/payload/server/{chunk-2IKQERHN.js → chunk-S6PQA6Q4.js} +43 -34
  28. package/payload/server/maxy-edge.js +1 -1
  29. package/payload/server/server.js +1 -1
  30. package/payload/platform/plugins/brochures/.claude-plugin/plugin.json +0 -8
  31. package/payload/platform/plugins/brochures/PLUGIN.md +0 -38
  32. package/payload/platform/plugins/brochures/commands/make-brochure.md +0 -11
  33. package/payload/platform/plugins/brochures/skills/a4-print-documents/SKILL.md +0 -478
  34. package/payload/platform/plugins/brochures/skills/brand-design/SKILL.md +0 -192
  35. package/payload/platform/plugins/brochures/skills/make-brochure/SKILL.md +0 -354
  36. package/payload/platform/plugins/brochures/skills/make-brochure/references/seller-brief-template.md +0 -115
  37. package/payload/platform/plugins/brochures/skills/property-brochure/SKILL.md +0 -142
  38. package/payload/platform/plugins/brochures/skills/property-brochure/references/build.md +0 -270
  39. package/payload/platform/plugins/brochures/skills/property-brochure/references/copy.md +0 -211
  40. package/payload/platform/plugins/brochures/skills/property-brochure/references/images.md +0 -166
  41. package/payload/platform/plugins/brochures/skills/property-brochure/references/index-landing.md +0 -376
  42. package/payload/platform/plugins/brochures/skills/property-brochure/references/index.html +0 -1288
  43. package/payload/platform/plugins/brochures/skills/property-brochure/references/placeholders.md +0 -250
  44. package/payload/platform/plugins/brochures/skills/property-brochure/references/registers.md +0 -47
  45. package/payload/platform/plugins/brochures/skills/property-brochure/references/seller-brief.md +0 -56
  46. package/payload/platform/plugins/brochures/skills/property-brochure/references/structure.md +0 -249
  47. package/payload/platform/plugins/brochures/skills/property-brochure/references/template.html +0 -2370
  48. package/payload/platform/plugins/brochures/skills/property-extract/SKILL.md +0 -372
  49. package/payload/platform/plugins/brochures/skills/property-market-report/SKILL.md +0 -100
  50. package/payload/platform/plugins/brochures/skills/property-market-report/references/render.py +0 -267
  51. package/payload/platform/plugins/brochures/skills/property-market-report/references/template.html +0 -266
  52. package/payload/platform/plugins/brochures/skills/property-socials/SKILL.md +0 -141
  53. package/payload/platform/plugins/buyers/.claude-plugin/plugin.json +0 -8
  54. package/payload/platform/plugins/buyers/PLUGIN.md +0 -34
  55. package/payload/platform/plugins/buyers/skills/buyer-feedback/SKILL.md +0 -109
  56. package/payload/platform/plugins/buyers/skills/buyer-management/SKILL.md +0 -42
  57. package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification-questions.md +0 -16
  58. package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification.md +0 -59
  59. package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-scripts.md +0 -63
  60. package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-working-scripts.md +0 -54
  61. package/payload/platform/plugins/buyers/skills/buyer-management/references/feedback-collection.md +0 -42
  62. package/payload/platform/plugins/buyers/skills/buyer-management/references/offer-capture.md +0 -38
  63. package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-booking.md +0 -32
  64. package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-management.md +0 -52
  65. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/SKILL.md +0 -407
  66. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/care-fees-guide.md +0 -68
  67. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/divorce-sales-guide.md +0 -61
  68. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/downsizing-guide.md +0 -45
  69. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-buyers.md +0 -92
  70. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-sellers.md +0 -78
  71. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/probate-guide.md +0 -53
  72. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/upsizing-guide.md +0 -41
  73. package/payload/platform/plugins/buyers/skills/property-enquiry/SKILL.md +0 -126
  74. package/payload/platform/plugins/buyers/skills/viewing-management/SKILL.md +0 -111
  75. package/payload/platform/plugins/epc/.claude-plugin/plugin.json +0 -17
  76. package/payload/platform/plugins/epc/PLUGIN.md +0 -90
  77. package/payload/platform/plugins/epc/mcp/dist/index.d.ts +0 -2
  78. package/payload/platform/plugins/epc/mcp/dist/index.d.ts.map +0 -1
  79. package/payload/platform/plugins/epc/mcp/dist/index.js +0 -117
  80. package/payload/platform/plugins/epc/mcp/dist/index.js.map +0 -1
  81. package/payload/platform/plugins/epc/mcp/dist/lib/crypto.d.ts +0 -3
  82. package/payload/platform/plugins/epc/mcp/dist/lib/crypto.d.ts.map +0 -1
  83. package/payload/platform/plugins/epc/mcp/dist/lib/crypto.js +0 -72
  84. package/payload/platform/plugins/epc/mcp/dist/lib/crypto.js.map +0 -1
  85. package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.d.ts +0 -60
  86. package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.d.ts.map +0 -1
  87. package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.js +0 -181
  88. package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.js.map +0 -1
  89. package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.d.ts +0 -3
  90. package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.d.ts.map +0 -1
  91. package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.js +0 -49
  92. package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.js.map +0 -1
  93. package/payload/platform/plugins/epc/mcp/dist/lib/key-store.d.ts +0 -15
  94. package/payload/platform/plugins/epc/mcp/dist/lib/key-store.d.ts.map +0 -1
  95. package/payload/platform/plugins/epc/mcp/dist/lib/key-store.js +0 -130
  96. package/payload/platform/plugins/epc/mcp/dist/lib/key-store.js.map +0 -1
  97. package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.d.ts +0 -5
  98. package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.d.ts.map +0 -1
  99. package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.js +0 -38
  100. package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.js.map +0 -1
  101. package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.d.ts +0 -4
  102. package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.d.ts.map +0 -1
  103. package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.js +0 -9
  104. package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.js.map +0 -1
  105. package/payload/platform/plugins/epc/mcp/dist/tools/key-list.d.ts +0 -4
  106. package/payload/platform/plugins/epc/mcp/dist/tools/key-list.d.ts.map +0 -1
  107. package/payload/platform/plugins/epc/mcp/dist/tools/key-list.js +0 -10
  108. package/payload/platform/plugins/epc/mcp/dist/tools/key-list.js.map +0 -1
  109. package/payload/platform/plugins/epc/mcp/dist/tools/key-register.d.ts +0 -5
  110. package/payload/platform/plugins/epc/mcp/dist/tools/key-register.d.ts.map +0 -1
  111. package/payload/platform/plugins/epc/mcp/dist/tools/key-register.js +0 -36
  112. package/payload/platform/plugins/epc/mcp/dist/tools/key-register.js.map +0 -1
  113. package/payload/platform/plugins/epc/mcp/dist/tools/lookup.d.ts +0 -10
  114. package/payload/platform/plugins/epc/mcp/dist/tools/lookup.d.ts.map +0 -1
  115. package/payload/platform/plugins/epc/mcp/dist/tools/lookup.js +0 -30
  116. package/payload/platform/plugins/epc/mcp/dist/tools/lookup.js.map +0 -1
  117. package/payload/platform/plugins/epc/mcp/package-lock.json +0 -2566
  118. package/payload/platform/plugins/epc/mcp/package.json +0 -21
  119. package/payload/platform/plugins/epc/mcp/src/__tests__/epc-api.test.ts +0 -251
  120. package/payload/platform/plugins/epc/mcp/src/__tests__/key-roundtrip.test.ts +0 -113
  121. package/payload/platform/plugins/epc/mcp/src/__tests__/lookup.test.ts +0 -181
  122. package/payload/platform/plugins/epc/mcp/src/__tests__/schema-parity.test.ts +0 -54
  123. package/payload/platform/plugins/epc/mcp/src/index.ts +0 -156
  124. package/payload/platform/plugins/epc/mcp/src/lib/crypto.ts +0 -79
  125. package/payload/platform/plugins/epc/mcp/src/lib/epc-api.ts +0 -241
  126. package/payload/platform/plugins/epc/mcp/src/lib/file-crypto.ts +0 -55
  127. package/payload/platform/plugins/epc/mcp/src/lib/key-store.ts +0 -172
  128. package/payload/platform/plugins/epc/mcp/src/lib/neo4j.ts +0 -47
  129. package/payload/platform/plugins/epc/mcp/src/tools/key-deregister.ts +0 -9
  130. package/payload/platform/plugins/epc/mcp/src/tools/key-list.ts +0 -10
  131. package/payload/platform/plugins/epc/mcp/src/tools/key-register.ts +0 -44
  132. package/payload/platform/plugins/epc/mcp/src/tools/lookup.ts +0 -43
  133. package/payload/platform/plugins/epc/mcp/tsconfig.json +0 -20
  134. package/payload/platform/plugins/epc/mcp/vitest.config.ts +0 -8
  135. package/payload/platform/plugins/estate-business/.claude-plugin/plugin.json +0 -8
  136. package/payload/platform/plugins/estate-business/PLUGIN.md +0 -64
  137. package/payload/platform/plugins/estate-business/skills/business-growth/SKILL.md +0 -133
  138. package/payload/platform/plugins/estate-business/skills/business-growth/references/buy-back-your-time.md +0 -37
  139. package/payload/platform/plugins/estate-business/skills/business-growth/references/firewave-gost-scorecards.md +0 -14
  140. package/payload/platform/plugins/estate-business/skills/business-growth/references/keller-org-model.md +0 -17
  141. package/payload/platform/plugins/estate-business/skills/business-growth/references/lencioni-team-models.md +0 -22
  142. package/payload/platform/plugins/estate-business/skills/business-growth/references/listing-management-system.md +0 -11
  143. package/payload/platform/plugins/estate-business/skills/business-growth/references/net-figure-form.md +0 -11
  144. package/payload/platform/plugins/estate-business/skills/business-growth/references/serhant-bizinbox-notes.md +0 -13
  145. package/payload/platform/plugins/estate-business/skills/business-growth/references/team-roles-commission.md +0 -14
  146. package/payload/platform/plugins/estate-business/skills/business-growth/references/va-2026-ops.md +0 -43
  147. package/payload/platform/plugins/estate-business/skills/business-growth/references/wingman-structure.md +0 -13
  148. package/payload/platform/plugins/estate-business/skills/business-operations/SKILL.md +0 -32
  149. package/payload/platform/plugins/estate-business/skills/business-operations/references/crm-systems.md +0 -57
  150. package/payload/platform/plugins/estate-business/skills/business-operations/references/hiring-guide.md +0 -59
  151. package/payload/platform/plugins/estate-business/skills/business-operations/references/impact-framework.md +0 -47
  152. package/payload/platform/plugins/estate-business/skills/business-operations/references/minutes-equal-money.md +0 -55
  153. package/payload/platform/plugins/estate-business/skills/business-operations/references/team-management.md +0 -48
  154. package/payload/platform/plugins/estate-business/skills/commission-calculator/SKILL.md +0 -40
  155. package/payload/platform/plugins/estate-business/skills/exp-partnership/SKILL.md +0 -52
  156. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/12-reasons.md +0 -39
  157. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/95-5-system.md +0 -66
  158. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/agent-attraction-scripts.md +0 -90
  159. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/business-partnership.md +0 -92
  160. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/exp-model-overview.md +0 -66
  161. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/model-comparison.md +0 -66
  162. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/revenue-share-explained.md +0 -57
  163. package/payload/platform/plugins/estate-business/skills/month-end-close/SKILL.md +0 -69
  164. package/payload/platform/plugins/estate-business/skills/payment-batch-stager/SKILL.md +0 -42
  165. package/payload/platform/plugins/estate-business/skills/period-reconciler/SKILL.md +0 -42
  166. package/payload/platform/plugins/estate-business/skills/personal-branding/SKILL.md +0 -117
  167. package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent-notes.md +0 -31
  168. package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent.md +0 -58
  169. package/payload/platform/plugins/estate-business/skills/personal-branding/references/authenticity-boundaries.md +0 -28
  170. package/payload/platform/plugins/estate-business/skills/personal-branding/references/become-a-brand-leader-notes.md +0 -19
  171. package/payload/platform/plugins/estate-business/skills/personal-branding/references/blast-formula.md +0 -42
  172. package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-leader.md +0 -48
  173. package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-strategy-system.md +0 -59
  174. package/payload/platform/plugins/estate-business/skills/personal-branding/references/content-engine.md +0 -49
  175. package/payload/platform/plugins/estate-business/skills/personal-branding/references/firewave-blast-and-blogging.md +0 -23
  176. package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-content.md +0 -52
  177. package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-principles.md +0 -20
  178. package/payload/platform/plugins/estate-business/skills/personal-branding/references/oversubscribed-positioning.md +0 -18
  179. package/payload/platform/plugins/estate-business/skills/personal-branding/references/platforms.md +0 -41
  180. package/payload/platform/plugins/estate-business/skills/personal-branding/references/priestley-oversubscribed.md +0 -54
  181. package/payload/platform/plugins/estate-business/skills/personal-branding/references/storeys-style-examples.md +0 -25
  182. package/payload/platform/plugins/estate-business/skills/personal-branding/references/visual-identity.md +0 -27
  183. package/payload/platform/plugins/estate-coaching/.claude-plugin/plugin.json +0 -8
  184. package/payload/platform/plugins/estate-coaching/PLUGIN.md +0 -54
  185. package/payload/platform/plugins/estate-coaching/skills/agent-performance/SKILL.md +0 -371
  186. package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/atomic-habits.md +0 -52
  187. package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/daily-routine-scorecard.md +0 -104
  188. package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/hp6-model.md +0 -63
  189. package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/twelve-week-year.md +0 -71
  190. package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/SKILL.md +0 -36
  191. package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/coaching-boundaries.md +0 -56
  192. package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/feedback-framework.md +0 -61
  193. package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/performance-framework.md +0 -109
  194. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/SKILL.md +0 -421
  195. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/coaching-exercises.md +0 -86
  196. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/goal-setting.md +0 -78
  197. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/one-to-one-framework.md +0 -92
  198. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/soi-workbook.md +0 -103
  199. package/payload/platform/plugins/estate-coaching/skills/serhant-training/SKILL.md +0 -410
  200. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/agent-training-guide.md +0 -70
  201. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/business-in-a-box.md +0 -72
  202. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/buyers-guide.md +0 -53
  203. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/codo-method.md +0 -72
  204. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/website-planning-guide.md +0 -79
  205. package/payload/platform/plugins/estate-sales/.claude-plugin/plugin.json +0 -8
  206. package/payload/platform/plugins/estate-sales/PLUGIN.md +0 -52
  207. package/payload/platform/plugins/estate-sales/skills/chase-progression/SKILL.md +0 -107
  208. package/payload/platform/plugins/estate-sales/skills/negotiation/SKILL.md +0 -35
  209. package/payload/platform/plugins/estate-sales/skills/negotiation/references/deal-saving.md +0 -47
  210. package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-deep-guide.md +0 -64
  211. package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-prep-principles.md +0 -29
  212. package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-techniques.md +0 -42
  213. package/payload/platform/plugins/estate-sales/skills/negotiation/references/offer-presentation.md +0 -43
  214. package/payload/platform/plugins/estate-sales/skills/risk-scorer/SKILL.md +0 -42
  215. package/payload/platform/plugins/estate-sales/skills/sales-closer/SKILL.md +0 -24
  216. package/payload/platform/plugins/estate-sales/skills/sales-closer/references/serhant-emotion-stages.md +0 -36
  217. package/payload/platform/plugins/estate-sales/skills/sales-discovery/SKILL.md +0 -30
  218. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/chris-voss-discovery.md +0 -88
  219. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/firewave-gost-journey.md +0 -68
  220. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/phil-jones-openers.md +0 -78
  221. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/pre-listing-checklist.md +0 -77
  222. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/serhant-improv.md +0 -22
  223. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/tom-ferry-discovery.md +0 -103
  224. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/vendor-motivation-competitor.md +0 -52
  225. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/SKILL.md +0 -29
  226. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/chris-voss-negotiation.md +0 -70
  227. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/phil-jones-price-words.md +0 -40
  228. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/serhant-negotiation-plus.md +0 -55
  229. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tom-panos-commission-pricing.md +0 -57
  230. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tony-morris-questioning.md +0 -54
  231. package/payload/platform/plugins/estate-sales/skills/sales-progression/SKILL.md +0 -27
  232. package/payload/platform/plugins/estate-sales/skills/sales-progression/references/conveyancing-guide.md +0 -54
  233. package/payload/platform/plugins/estate-sales/skills/sales-progression/references/transaction-tracking.md +0 -66
  234. package/payload/platform/plugins/estate-teaching/.claude-plugin/plugin.json +0 -8
  235. package/payload/platform/plugins/estate-teaching/PLUGIN.md +0 -30
  236. package/payload/platform/plugins/estate-teaching/skills/content-directory/SKILL.md +0 -39
  237. package/payload/platform/plugins/estate-teaching/skills/content-directory/references/module-delivery.md +0 -65
  238. package/payload/platform/plugins/estate-teaching/skills/content-directory/references/progress-tracking.md +0 -47
  239. package/payload/platform/plugins/leads/.claude-plugin/plugin.json +0 -8
  240. package/payload/platform/plugins/leads/PLUGIN.md +0 -61
  241. package/payload/platform/plugins/leads/skills/chain-progression-tracker/SKILL.md +0 -51
  242. package/payload/platform/plugins/leads/skills/diary-builder/SKILL.md +0 -38
  243. package/payload/platform/plugins/leads/skills/enquiry-triage/SKILL.md +0 -36
  244. package/payload/platform/plugins/leads/skills/lead-nurturing/SKILL.md +0 -137
  245. package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letter.md +0 -28
  246. package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letters.md +0 -37
  247. package/payload/platform/plugins/leads/skills/lead-nurturing/references/database-reactivation.md +0 -30
  248. package/payload/platform/plugins/leads/skills/lead-nurturing/references/email-nurture-sequences.md +0 -45
  249. package/payload/platform/plugins/leads/skills/lead-nurturing/references/facebook-referrals.md +0 -30
  250. package/payload/platform/plugins/leads/skills/lead-nurturing/references/firewave-email-nurture-sequences.md +0 -41
  251. package/payload/platform/plugins/leads/skills/lead-nurturing/references/keller-33-touch.md +0 -34
  252. package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-letters.md +0 -31
  253. package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-notification-letter.md +0 -20
  254. package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up-dialogue.md +0 -22
  255. package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up.md +0 -26
  256. package/payload/platform/plugins/leads/skills/lead-nurturing/references/serhant-three-fs-plus.md +0 -21
  257. package/payload/platform/plugins/leads/skills/lead-nurturing/references/sharran-10x10x10.md +0 -18
  258. package/payload/platform/plugins/leads/skills/lead-nurturing/references/sms-templates.md +0 -40
  259. package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence-notes.md +0 -34
  260. package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence.md +0 -60
  261. package/payload/platform/plugins/leads/skills/lead-nurturing/references/tom-panos-sms-templates.md +0 -59
  262. package/payload/platform/plugins/leads/skills/morning-round/SKILL.md +0 -72
  263. package/payload/platform/plugins/leads/skills/prospecting/SKILL.md +0 -33
  264. package/payload/platform/plugins/leads/skills/prospecting/references/database-matching.md +0 -30
  265. package/payload/platform/plugins/leads/skills/prospecting/references/database-value.md +0 -53
  266. package/payload/platform/plugins/leads/skills/prospecting/references/prospecting-dialogues.md +0 -24
  267. package/payload/platform/plugins/leads/skills/prospecting/references/reactivation.md +0 -34
  268. package/payload/platform/plugins/listings/.claude-plugin/plugin.json +0 -8
  269. package/payload/platform/plugins/listings/PLUGIN.md +0 -102
  270. package/payload/platform/plugins/listings/skills/comparable-finder/SKILL.md +0 -52
  271. package/payload/platform/plugins/listings/skills/epc-checker/SKILL.md +0 -38
  272. package/payload/platform/plugins/listings/skills/home-preparation/SKILL.md +0 -28
  273. package/payload/platform/plugins/listings/skills/home-preparation/references/kerb-appeal.md +0 -38
  274. package/payload/platform/plugins/listings/skills/home-preparation/references/photo-day.md +0 -59
  275. package/payload/platform/plugins/listings/skills/home-preparation/references/situational-tips.md +0 -50
  276. package/payload/platform/plugins/listings/skills/home-preparation/references/staging-guide.md +0 -52
  277. package/payload/platform/plugins/listings/skills/listing-copy-writer/SKILL.md +0 -55
  278. package/payload/platform/plugins/listings/skills/listing-presentation/SKILL.md +0 -286
  279. package/payload/platform/plugins/listings/skills/listing-presentation/references/booking-script.md +0 -51
  280. package/payload/platform/plugins/listings/skills/listing-presentation/references/objection-scripts.md +0 -193
  281. package/payload/platform/plugins/listings/skills/listing-presentation/references/penhaul-presentation.md +0 -123
  282. package/payload/platform/plugins/listings/skills/listing-presentation/references/pre-listing-kit.md +0 -139
  283. package/payload/platform/plugins/listings/skills/listing-presentation/references/set-to-sell.md +0 -55
  284. package/payload/platform/plugins/listings/skills/listing-presentation/references/sharran-frameworks.md +0 -107
  285. package/payload/platform/plugins/listings/skills/local-market-stats/SKILL.md +0 -33
  286. package/payload/platform/plugins/listings/skills/new-instruction/SKILL.md +0 -78
  287. package/payload/platform/plugins/listings/skills/particulars-builder/SKILL.md +0 -48
  288. package/payload/platform/plugins/listings/skills/portal-launch-scheduler/SKILL.md +0 -49
  289. package/payload/platform/plugins/listings/skills/pricing-scenario-builder/SKILL.md +0 -35
  290. package/payload/platform/plugins/listings/skills/property-marketing/SKILL.md +0 -337
  291. package/payload/platform/plugins/listings/skills/property-marketing/references/auction-report-template.md +0 -41
  292. package/payload/platform/plugins/listings/skills/property-marketing/references/coming-soon-campaign.md +0 -43
  293. package/payload/platform/plugins/listings/skills/property-marketing/references/direct-mail-templates.md +0 -121
  294. package/payload/platform/plugins/listings/skills/property-marketing/references/eoi-form-template.md +0 -62
  295. package/payload/platform/plugins/listings/skills/property-marketing/references/monthly-scorecard.md +0 -63
  296. package/payload/platform/plugins/listings/skills/supplier-booker/SKILL.md +0 -39
  297. package/payload/platform/plugins/listings/skills/talk-track-composer/SKILL.md +0 -36
  298. package/payload/platform/plugins/listings/skills/terms-of-business-drafter/SKILL.md +0 -54
  299. package/payload/platform/plugins/listings/skills/valuation-prep/SKILL.md +0 -69
  300. package/payload/platform/plugins/loop/.claude-plugin/plugin.json +0 -17
  301. package/payload/platform/plugins/loop/PLUGIN.md +0 -260
  302. package/payload/platform/plugins/loop/mcp/dist/index.d.ts +0 -2
  303. package/payload/platform/plugins/loop/mcp/dist/index.d.ts.map +0 -1
  304. package/payload/platform/plugins/loop/mcp/dist/index.js +0 -320
  305. package/payload/platform/plugins/loop/mcp/dist/index.js.map +0 -1
  306. package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts +0 -10
  307. package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts.map +0 -1
  308. package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js +0 -88
  309. package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js.map +0 -1
  310. package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.d.ts +0 -3
  311. package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.d.ts.map +0 -1
  312. package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.js +0 -48
  313. package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.js.map +0 -1
  314. package/payload/platform/plugins/loop/mcp/dist/lib/key-store.d.ts +0 -22
  315. package/payload/platform/plugins/loop/mcp/dist/lib/key-store.d.ts.map +0 -1
  316. package/payload/platform/plugins/loop/mcp/dist/lib/key-store.js +0 -165
  317. package/payload/platform/plugins/loop/mcp/dist/lib/key-store.js.map +0 -1
  318. package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts +0 -82
  319. package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +0 -1
  320. package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js +0 -392
  321. package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js.map +0 -1
  322. package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts +0 -5
  323. package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +0 -1
  324. package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js +0 -40
  325. package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js.map +0 -1
  326. package/payload/platform/plugins/loop/mcp/dist/tools/auto-responder.d.ts +0 -12
  327. package/payload/platform/plugins/loop/mcp/dist/tools/auto-responder.d.ts.map +0 -1
  328. package/payload/platform/plugins/loop/mcp/dist/tools/auto-responder.js +0 -22
  329. package/payload/platform/plugins/loop/mcp/dist/tools/auto-responder.js.map +0 -1
  330. package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +0 -10
  331. package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +0 -1
  332. package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js +0 -24
  333. package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js.map +0 -1
  334. package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts +0 -16
  335. package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts.map +0 -1
  336. package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js +0 -35
  337. package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js.map +0 -1
  338. package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts +0 -5
  339. package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +0 -1
  340. package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js +0 -9
  341. package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js.map +0 -1
  342. package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts +0 -4
  343. package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts.map +0 -1
  344. package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js +0 -14
  345. package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js.map +0 -1
  346. package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts +0 -9
  347. package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts.map +0 -1
  348. package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js +0 -43
  349. package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js.map +0 -1
  350. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +0 -6
  351. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +0 -1
  352. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js +0 -7
  353. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +0 -1
  354. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +0 -9
  355. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +0 -1
  356. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js +0 -16
  357. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +0 -1
  358. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +0 -15
  359. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +0 -1
  360. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js +0 -11
  361. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +0 -1
  362. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts +0 -10
  363. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +0 -1
  364. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js +0 -39
  365. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js.map +0 -1
  366. package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts +0 -9
  367. package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +0 -1
  368. package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js +0 -125
  369. package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js.map +0 -1
  370. package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts +0 -18
  371. package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts.map +0 -1
  372. package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js +0 -87
  373. package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js.map +0 -1
  374. package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts +0 -10
  375. package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +0 -1
  376. package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js +0 -82
  377. package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js.map +0 -1
  378. package/payload/platform/plugins/loop/mcp/dist/tools/property-intent.d.ts +0 -33
  379. package/payload/platform/plugins/loop/mcp/dist/tools/property-intent.d.ts.map +0 -1
  380. package/payload/platform/plugins/loop/mcp/dist/tools/property-intent.js +0 -19
  381. package/payload/platform/plugins/loop/mcp/dist/tools/property-intent.js.map +0 -1
  382. package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts +0 -11
  383. package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +0 -1
  384. package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js +0 -26
  385. package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js.map +0 -1
  386. package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts +0 -15
  387. package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts.map +0 -1
  388. package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js +0 -11
  389. package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js.map +0 -1
  390. package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts +0 -16
  391. package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts.map +0 -1
  392. package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js +0 -41
  393. package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js.map +0 -1
  394. package/payload/platform/plugins/loop/mcp/dist/tools/property-sold.d.ts +0 -9
  395. package/payload/platform/plugins/loop/mcp/dist/tools/property-sold.d.ts.map +0 -1
  396. package/payload/platform/plugins/loop/mcp/dist/tools/property-sold.js +0 -19
  397. package/payload/platform/plugins/loop/mcp/dist/tools/property-sold.js.map +0 -1
  398. package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts +0 -13
  399. package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts.map +0 -1
  400. package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js +0 -49
  401. package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js.map +0 -1
  402. package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts +0 -7
  403. package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +0 -1
  404. package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js +0 -19
  405. package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js.map +0 -1
  406. package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts +0 -5
  407. package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts.map +0 -1
  408. package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js +0 -32
  409. package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js.map +0 -1
  410. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts +0 -14
  411. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +0 -1
  412. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js +0 -11
  413. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js.map +0 -1
  414. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +0 -9
  415. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +0 -1
  416. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js +0 -85
  417. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js.map +0 -1
  418. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts +0 -13
  419. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +0 -1
  420. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js +0 -44
  421. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js.map +0 -1
  422. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts +0 -14
  423. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +0 -1
  424. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js +0 -18
  425. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js.map +0 -1
  426. package/payload/platform/plugins/loop/mcp/package-lock.json +0 -2549
  427. package/payload/platform/plugins/loop/mcp/package.json +0 -21
  428. package/payload/platform/plugins/loop/mcp/src/__tests__/loop-swagger.snapshot.json +0 -26467
  429. package/payload/platform/plugins/loop/mcp/src/__tests__/new-tool-shape.test.ts +0 -99
  430. package/payload/platform/plugins/loop/mcp/src/__tests__/plugin-md-time-doctrine.test.ts +0 -132
  431. package/payload/platform/plugins/loop/mcp/src/__tests__/swagger-write-coverage.test.ts +0 -154
  432. package/payload/platform/plugins/loop/mcp/src/index.ts +0 -498
  433. package/payload/platform/plugins/loop/mcp/src/lib/crypto.ts +0 -105
  434. package/payload/platform/plugins/loop/mcp/src/lib/file-crypto.ts +0 -54
  435. package/payload/platform/plugins/loop/mcp/src/lib/key-store.ts +0 -221
  436. package/payload/platform/plugins/loop/mcp/src/lib/loop-api.ts +0 -567
  437. package/payload/platform/plugins/loop/mcp/src/lib/neo4j.ts +0 -51
  438. package/payload/platform/plugins/loop/mcp/src/tools/auto-responder.ts +0 -80
  439. package/payload/platform/plugins/loop/mcp/src/tools/customer-preferences.ts +0 -66
  440. package/payload/platform/plugins/loop/mcp/src/tools/feedback.ts +0 -86
  441. package/payload/platform/plugins/loop/mcp/src/tools/key-deregister.ts +0 -12
  442. package/payload/platform/plugins/loop/mcp/src/tools/key-list.ts +0 -19
  443. package/payload/platform/plugins/loop/mcp/src/tools/key-register.ts +0 -70
  444. package/payload/platform/plugins/loop/mcp/src/tools/marketing-enquiry.ts +0 -27
  445. package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-batch.ts +0 -53
  446. package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-request.ts +0 -42
  447. package/payload/platform/plugins/loop/mcp/src/tools/marketing-match.ts +0 -84
  448. package/payload/platform/plugins/loop/mcp/src/tools/people-detail.ts +0 -245
  449. package/payload/platform/plugins/loop/mcp/src/tools/people-search.ts +0 -180
  450. package/payload/platform/plugins/loop/mcp/src/tools/property-detail.ts +0 -145
  451. package/payload/platform/plugins/loop/mcp/src/tools/property-intent.ts +0 -84
  452. package/payload/platform/plugins/loop/mcp/src/tools/property-listed.ts +0 -81
  453. package/payload/platform/plugins/loop/mcp/src/tools/property-search.ts +0 -92
  454. package/payload/platform/plugins/loop/mcp/src/tools/property-sold.ts +0 -67
  455. package/payload/platform/plugins/loop/mcp/src/tools/supplier.ts +0 -129
  456. package/payload/platform/plugins/loop/mcp/src/tools/team-availability.ts +0 -52
  457. package/payload/platform/plugins/loop/mcp/src/tools/team-info.ts +0 -95
  458. package/payload/platform/plugins/loop/mcp/src/tools/viewing-create.ts +0 -41
  459. package/payload/platform/plugins/loop/mcp/src/tools/viewing-detail.ts +0 -171
  460. package/payload/platform/plugins/loop/mcp/src/tools/viewing-search.ts +0 -92
  461. package/payload/platform/plugins/loop/mcp/src/tools/viewing-update.ts +0 -53
  462. package/payload/platform/plugins/loop/mcp/tsconfig.json +0 -20
  463. package/payload/platform/plugins/loop/mcp/vitest.config.ts +0 -9
  464. package/payload/platform/plugins/loop/skills/compliance-flag-checker/SKILL.md +0 -53
  465. package/payload/platform/plugins/loop/skills/priority-ranker/SKILL.md +0 -40
  466. package/payload/platform/plugins/loop/skills/tone-matched-drafter/SKILL.md +0 -53
  467. package/payload/platform/plugins/loop/skills/variance-narrator/SKILL.md +0 -50
  468. package/payload/platform/plugins/loop/skills/vendor-research/SKILL.md +0 -54
  469. package/payload/platform/plugins/preval/.claude-plugin/plugin.json +0 -8
  470. package/payload/platform/plugins/preval/PLUGIN.md +0 -55
  471. package/payload/platform/plugins/preval/hooks/preval-prompt-required.sh +0 -140
  472. package/payload/platform/plugins/preval/skills/property-preval/SKILL.md +0 -176
  473. package/payload/platform/plugins/preval/skills/property-preval/references/__tests__/adherence.test.py +0 -373
  474. package/payload/platform/plugins/preval/skills/property-preval/references/render.py +0 -815
  475. package/payload/platform/plugins/preval/skills/property-preval/references/template-inputs.schema.json +0 -199
  476. package/payload/platform/plugins/preval/skills/property-preval/references/template.html +0 -312
  477. package/payload/platform/plugins/property-data/.claude-plugin/plugin.json +0 -17
  478. package/payload/platform/plugins/property-data/PLUGIN.md +0 -180
  479. package/payload/platform/plugins/property-data/mcp/dist/index.d.ts +0 -2
  480. package/payload/platform/plugins/property-data/mcp/dist/index.d.ts.map +0 -1
  481. package/payload/platform/plugins/property-data/mcp/dist/index.js +0 -236
  482. package/payload/platform/plugins/property-data/mcp/dist/index.js.map +0 -1
  483. package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.d.ts +0 -3
  484. package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.d.ts.map +0 -1
  485. package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.js +0 -72
  486. package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.js.map +0 -1
  487. package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.d.ts +0 -3
  488. package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.d.ts.map +0 -1
  489. package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.js +0 -49
  490. package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.js.map +0 -1
  491. package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.d.ts +0 -15
  492. package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.d.ts.map +0 -1
  493. package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.js +0 -135
  494. package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.js.map +0 -1
  495. package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.d.ts +0 -5
  496. package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.d.ts.map +0 -1
  497. package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.js +0 -38
  498. package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.js.map +0 -1
  499. package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts +0 -28
  500. package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts.map +0 -1
  501. package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.js +0 -101
  502. package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.js.map +0 -1
  503. package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.d.ts +0 -24
  504. package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.d.ts.map +0 -1
  505. package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.js +0 -33
  506. package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.js.map +0 -1
  507. package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.d.ts +0 -4
  508. package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.d.ts.map +0 -1
  509. package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.js +0 -9
  510. package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.js.map +0 -1
  511. package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.d.ts +0 -4
  512. package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.d.ts.map +0 -1
  513. package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.js +0 -10
  514. package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.js.map +0 -1
  515. package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.d.ts +0 -5
  516. package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.d.ts.map +0 -1
  517. package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.js +0 -50
  518. package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.js.map +0 -1
  519. package/payload/platform/plugins/property-data/mcp/package-lock.json +0 -2566
  520. package/payload/platform/plugins/property-data/mcp/package.json +0 -21
  521. package/payload/platform/plugins/property-data/mcp/src/__tests__/endpoints.test.ts +0 -252
  522. package/payload/platform/plugins/property-data/mcp/src/__tests__/key-roundtrip.test.ts +0 -107
  523. package/payload/platform/plugins/property-data/mcp/src/__tests__/propertydata-api.test.ts +0 -184
  524. package/payload/platform/plugins/property-data/mcp/src/__tests__/schema-parity.test.ts +0 -62
  525. package/payload/platform/plugins/property-data/mcp/src/index.ts +0 -409
  526. package/payload/platform/plugins/property-data/mcp/src/lib/crypto.ts +0 -79
  527. package/payload/platform/plugins/property-data/mcp/src/lib/file-crypto.ts +0 -55
  528. package/payload/platform/plugins/property-data/mcp/src/lib/key-store.ts +0 -181
  529. package/payload/platform/plugins/property-data/mcp/src/lib/neo4j.ts +0 -47
  530. package/payload/platform/plugins/property-data/mcp/src/lib/propertydata-api.ts +0 -120
  531. package/payload/platform/plugins/property-data/mcp/src/tools/endpoints.ts +0 -47
  532. package/payload/platform/plugins/property-data/mcp/src/tools/key-deregister.ts +0 -9
  533. package/payload/platform/plugins/property-data/mcp/src/tools/key-list.ts +0 -10
  534. package/payload/platform/plugins/property-data/mcp/src/tools/key-register.ts +0 -54
  535. package/payload/platform/plugins/property-data/mcp/tsconfig.json +0 -20
  536. package/payload/platform/plugins/property-data/mcp/vitest.config.ts +0 -8
  537. package/payload/platform/plugins/property-data/skills/property-data/SKILL.md +0 -77
  538. package/payload/platform/plugins/vendors/.claude-plugin/plugin.json +0 -8
  539. package/payload/platform/plugins/vendors/PLUGIN.md +0 -33
  540. package/payload/platform/plugins/vendors/skills/vendor-communication/SKILL.md +0 -42
  541. package/payload/platform/plugins/vendors/skills/vendor-communication/references/fee-protection-and-agenda.md +0 -28
  542. package/payload/platform/plugins/vendors/skills/vendor-communication/references/listing-scripts.md +0 -44
  543. package/payload/platform/plugins/vendors/skills/vendor-communication/references/negotiation-deep-guide.md +0 -70
  544. package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment-scripts.md +0 -33
  545. package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment.md +0 -34
  546. package/payload/platform/plugins/vendors/skills/vendor-communication/references/scenario-scripts.md +0 -38
  547. package/payload/platform/plugins/vendors/skills/vendor-communication/references/seller-engagement.md +0 -51
  548. package/payload/platform/plugins/vendors/skills/vendor-communication/references/valuation-booking.md +0 -76
  549. package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-scripts.md +0 -63
  550. package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-updates.md +0 -41
  551. package/payload/platform/plugins/vendors/skills/vendor-updates/SKILL.md +0 -153
  552. package/payload/premium-plugins/real-agent/plugins/epc/PLUGIN.md +0 -90
  553. package/payload/premium-plugins/real-agent/plugins/epc/mcp/package-lock.json +0 -2566
  554. package/payload/premium-plugins/real-agent/plugins/epc/mcp/package.json +0 -21
  555. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/epc-api.test.ts +0 -251
  556. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/key-roundtrip.test.ts +0 -113
  557. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/lookup.test.ts +0 -181
  558. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/schema-parity.test.ts +0 -54
  559. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/index.ts +0 -156
  560. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/crypto.ts +0 -79
  561. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/epc-api.ts +0 -241
  562. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/file-crypto.ts +0 -55
  563. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/key-store.ts +0 -172
  564. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/neo4j.ts +0 -47
  565. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-deregister.ts +0 -9
  566. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-list.ts +0 -10
  567. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-register.ts +0 -44
  568. package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/lookup.ts +0 -43
  569. package/payload/premium-plugins/real-agent/plugins/epc/mcp/tsconfig.json +0 -20
  570. package/payload/premium-plugins/real-agent/plugins/epc/mcp/vitest.config.ts +0 -8
  571. package/payload/premium-plugins/real-agent/plugins/listings/skills/epc-checker/SKILL.md +0 -38
@@ -1,567 +0,0 @@
1
- import { selectLoopKeyStore } from "./key-store.js";
2
-
3
- // ─────────────────────────────────────────────────────────────────
4
- // Loop API V2 HTTP Client + Cross-Team Aggregation Engine
5
- //
6
- // ┌─ Load LoopTeamKey nodes (Neo4j) ─┐
7
- // │ │
8
- // ▼ │
9
- // For each key: │
10
- // 1. Decrypt API key │
11
- // 2. Check permissions │
12
- // 3. HTTP GET/POST/PUT → Loop API V2 │
13
- // │ │
14
- // ▼ │
15
- // Promise.allSettled → merge results │
16
- // Log aggregate summary │
17
- // ─────────────────────────────────────────────────────────────────
18
-
19
- const LOOP_BASE_URL = "https://api.loop.software";
20
- const REQUEST_TIMEOUT_MS = 10_000;
21
- const TIMEOUT_RETRY_BACKOFF_MS = 2_000;
22
- const DEFAULT_LIMIT_PER_TEAM = 50;
23
- const DEFAULT_LIMIT_TOTAL = 200;
24
-
25
- // One bounded retry on transient timeout — recovers from intermittent
26
- // Loop-API latency spikes that would otherwise drop a team from coverage.
27
- function isTimeoutError(err: unknown): boolean {
28
- if (!(err instanceof Error)) return false;
29
- return (
30
- err.name === "TimeoutError" ||
31
- err.name === "AbortError" ||
32
- /aborted due to timeout/i.test(err.message)
33
- );
34
- }
35
-
36
- // ─── Loop API V2 Envelope ────────────────────────────────────────
37
- //
38
- // Every Loop API V2 response is wrapped in a status envelope:
39
- //
40
- // { statusCode: "success", httpResponseCode: 200,
41
- // errors: [], warnings: [], data: <payload> }
42
- //
43
- // unwrapEnvelope detects this shape and returns the inner `data`,
44
- // so tool handlers receive bare arrays/objects — not the wrapper.
45
- // Non-envelope responses (if any) pass through unchanged.
46
- // ──────────────────────────────────────────────────────────────────
47
-
48
- interface LoopEnvelope<T> {
49
- statusCode: string;
50
- httpResponseCode: number;
51
- errors?: string[];
52
- warnings?: string[];
53
- data: T;
54
- }
55
-
56
- function isEnvelope(val: unknown): val is LoopEnvelope<unknown> {
57
- return (
58
- val !== null &&
59
- typeof val === "object" &&
60
- !Array.isArray(val) &&
61
- "statusCode" in val &&
62
- "httpResponseCode" in val &&
63
- "data" in val
64
- );
65
- }
66
-
67
- function unwrapEnvelope<T>(parsed: unknown, toolName: string, teamName: string): T {
68
- if (!isEnvelope(parsed)) {
69
- return parsed as T;
70
- }
71
-
72
- if (parsed.statusCode !== "success") {
73
- const errMsg = parsed.errors?.length
74
- ? parsed.errors.join("; ")
75
- : `statusCode=${parsed.statusCode}`;
76
- throw new Error(
77
- `Loop API error for team=${teamName} tool=${toolName}: ${errMsg} (httpResponseCode=${parsed.httpResponseCode})`
78
- );
79
- }
80
-
81
- if (parsed.warnings?.length) {
82
- console.error(
83
- `[loop] ${toolName} team=${teamName} warnings: ${parsed.warnings.join("; ")}`
84
- );
85
- }
86
-
87
- return parsed.data as T;
88
- }
89
-
90
- export interface LoopTeamKey {
91
- teamName: string;
92
- apiKey: string;
93
- teamAddress: string;
94
- agentId: string;
95
- permissions: string[];
96
- createdAt: string;
97
- updatedAt: string;
98
- }
99
-
100
- export interface TeamResult<T> {
101
- teamName: string;
102
- data: T[];
103
- }
104
-
105
- export interface AggregationFailure {
106
- teamName: string;
107
- reason: string;
108
- kind: "timeout" | "other";
109
- }
110
-
111
- export interface AggregationResult<T> {
112
- results: TeamResult<T>[];
113
- failures: AggregationFailure[];
114
- skipped: { teamName: string; reason: string }[];
115
- totalTeams: number;
116
- }
117
-
118
- /**
119
- * Load all LoopTeamKey nodes for an account from Neo4j.
120
- */
121
- export async function loadTeamKeys(accountId: string): Promise<LoopTeamKey[]> {
122
- return selectLoopKeyStore().loadAll(accountId);
123
- }
124
-
125
- // Truncate to 200 chars, escape newlines, single line — `[loop] <tool> team=<t>
126
- // status=<n> body="<...>"`. Emitted at the wrapper boundary before throwing so
127
- // the body is visible regardless of how downstream catch sites format the error
128
- // (the aggregator at line ~388 reduces LoopApiError to "HTTP <status>" and
129
- // would otherwise discard the body).
130
- function logErrorBody(
131
- toolName: string,
132
- teamName: string,
133
- status: number,
134
- body: string
135
- ): void {
136
- const truncated = body.slice(0, 200).replace(/\n/g, "\\n");
137
- console.error(
138
- `[loop] ${toolName} team=${teamName} status=${status} body="${truncated}"`
139
- );
140
- }
141
-
142
- /**
143
- * Make a GET request to the Loop API V2.
144
- */
145
- export async function loopGet<T>(
146
- apiKey: string,
147
- path: string,
148
- toolName: string,
149
- teamName: string
150
- ): Promise<T> {
151
- const url = `${LOOP_BASE_URL}${path}`;
152
- const start = Date.now();
153
-
154
- const response = await fetch(url, {
155
- headers: { "X-Api-Key": apiKey, "Accept": "application/json" },
156
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
157
- });
158
-
159
- const duration = Date.now() - start;
160
- console.error(
161
- `[loop] ${toolName} team=${teamName} endpoint=GET ${path} status=${response.status} duration=${duration}ms`
162
- );
163
-
164
- if (response.status === 204) {
165
- return [] as unknown as T;
166
- }
167
-
168
- if (!response.ok) {
169
- const errorBody = await response.text().catch(() => "");
170
- logErrorBody(toolName, teamName, response.status, errorBody);
171
- throw new LoopApiError(response.status, teamName, path, errorBody);
172
- }
173
-
174
- const text = await response.text();
175
- try {
176
- const parsed = JSON.parse(text);
177
- return unwrapEnvelope<T>(parsed, toolName, teamName);
178
- } catch (err) {
179
- if (err instanceof SyntaxError) {
180
- throw new Error(
181
- `Loop returned non-JSON response for team=${teamName} path=${path} ` +
182
- `(status=${response.status}, length=${text.length})`
183
- );
184
- }
185
- throw err;
186
- }
187
- }
188
-
189
- /**
190
- * Make a POST request to the Loop API V2.
191
- * For write operations: create viewings, record feedback, submit enquiries, etc.
192
- * Returns parsed JSON response. Treats 204 as success with empty result.
193
- */
194
- export async function loopPost<T>(
195
- apiKey: string,
196
- path: string,
197
- body: unknown,
198
- toolName: string,
199
- teamName: string
200
- ): Promise<T> {
201
- const url = `${LOOP_BASE_URL}${path}`;
202
- const start = Date.now();
203
-
204
- const response = await fetch(url, {
205
- method: "POST",
206
- headers: {
207
- "X-Api-Key": apiKey,
208
- "Accept": "application/json",
209
- "Content-Type": "application/json",
210
- },
211
- body: JSON.stringify(body),
212
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
213
- });
214
-
215
- const duration = Date.now() - start;
216
- console.error(
217
- `[loop] WRITE ${toolName} team=${teamName} endpoint=POST ${path} status=${response.status} duration=${duration}ms`
218
- );
219
-
220
- if (response.status === 204) {
221
- return { success: true } as unknown as T;
222
- }
223
-
224
- if (!response.ok) {
225
- const errorBody = await response.text().catch(() => "");
226
- logErrorBody(toolName, teamName, response.status, errorBody);
227
- throw new LoopApiError(response.status, teamName, path, errorBody);
228
- }
229
-
230
- const text = await response.text();
231
- try {
232
- const parsed = JSON.parse(text);
233
- return unwrapEnvelope<T>(parsed, toolName, teamName);
234
- } catch (err) {
235
- if (err instanceof SyntaxError) {
236
- throw new Error(
237
- `Loop returned non-JSON response for team=${teamName} path=${path} ` +
238
- `(status=${response.status}, length=${text.length})`
239
- );
240
- }
241
- throw err;
242
- }
243
- }
244
-
245
- /**
246
- * Make a PUT request to the Loop API V2.
247
- * For update operations: batch matching, submit quotes, update preferences, etc.
248
- */
249
- export async function loopPut<T>(
250
- apiKey: string,
251
- path: string,
252
- body: unknown,
253
- toolName: string,
254
- teamName: string
255
- ): Promise<T> {
256
- const url = `${LOOP_BASE_URL}${path}`;
257
- const start = Date.now();
258
-
259
- const response = await fetch(url, {
260
- method: "PUT",
261
- headers: {
262
- "X-Api-Key": apiKey,
263
- "Accept": "application/json",
264
- "Content-Type": "application/json",
265
- },
266
- body: JSON.stringify(body),
267
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
268
- });
269
-
270
- const duration = Date.now() - start;
271
- console.error(
272
- `[loop] WRITE ${toolName} team=${teamName} endpoint=PUT ${path} status=${response.status} duration=${duration}ms`
273
- );
274
-
275
- if (response.status === 204) {
276
- return { success: true } as unknown as T;
277
- }
278
-
279
- if (!response.ok) {
280
- const errorBody = await response.text().catch(() => "");
281
- logErrorBody(toolName, teamName, response.status, errorBody);
282
- throw new LoopApiError(response.status, teamName, path, errorBody);
283
- }
284
-
285
- const text = await response.text();
286
- try {
287
- const parsed = JSON.parse(text);
288
- return unwrapEnvelope<T>(parsed, toolName, teamName);
289
- } catch (err) {
290
- if (err instanceof SyntaxError) {
291
- throw new Error(
292
- `Loop returned non-JSON response for team=${teamName} path=${path} ` +
293
- `(status=${response.status}, length=${text.length})`
294
- );
295
- }
296
- throw err;
297
- }
298
- }
299
-
300
- export class LoopApiError extends Error {
301
- constructor(
302
- public readonly status: number,
303
- public readonly teamName: string,
304
- public readonly path: string,
305
- public readonly responseBody?: string
306
- ) {
307
- const detail = responseBody ? ` — ${responseBody.slice(0, 200)}` : "";
308
- super(`Loop API returned ${status} for team=${teamName} path=${path}${detail}`);
309
- this.name = "LoopApiError";
310
- }
311
- }
312
-
313
- /**
314
- * Fan out a request across all registered teams for an account, merging results.
315
- *
316
- * Each tool provides a `buildRequest` function that takes a decrypted API key
317
- * and returns the data for that team. The aggregation engine handles:
318
- * - Key loading and decryption
319
- * - Permission checking
320
- * - Concurrent fan-out via Promise.allSettled
321
- * - Result merging with teamName tags
322
- * - Aggregate logging
323
- *
324
- * When `teamName` is provided, only that team is queried (no fan-out).
325
- */
326
- export async function aggregateAcrossTeams<T>(
327
- accountId: string,
328
- endpointGroup: string,
329
- toolName: string,
330
- buildRequest: (apiKey: string, teamName: string) => Promise<T[]>,
331
- options?: { teamName?: string; limitPerTeam?: number; limitTotal?: number }
332
- ): Promise<AggregationResult<T>> {
333
- const allKeys = await loadTeamKeys(accountId);
334
-
335
- if (allKeys.length === 0) {
336
- return { results: [], failures: [], skipped: [], totalTeams: 0 };
337
- }
338
-
339
- // Filter to specific team if requested
340
- const keys = options?.teamName
341
- ? allKeys.filter((k) => k.teamName === options.teamName)
342
- : allKeys;
343
-
344
- if (keys.length === 0 && options?.teamName) {
345
- return {
346
- results: [],
347
- failures: [{ teamName: options.teamName, reason: "Team not found", kind: "other" }],
348
- skipped: [],
349
- totalTeams: allKeys.length,
350
- };
351
- }
352
-
353
- const limitPerTeam = options?.limitPerTeam ?? DEFAULT_LIMIT_PER_TEAM;
354
- const limitTotal = options?.limitTotal ?? DEFAULT_LIMIT_TOTAL;
355
-
356
- const results: TeamResult<T>[] = [];
357
- const failures: AggregationFailure[] = [];
358
- const skipped: { teamName: string; reason: string }[] = [];
359
-
360
- // Check permissions and build per-team request thunks. Thunks (not stored
361
- // promises) are required so a timed-out attempt can be re-invoked on retry.
362
- const tasks: { key: LoopTeamKey; run: () => Promise<T[]> }[] = [];
363
-
364
- for (const key of keys) {
365
- if (!key.permissions.includes(endpointGroup)) {
366
- console.error(
367
- `[loop] ${toolName} team=${key.teamName} — permission denied (requires: ${endpointGroup})`
368
- );
369
- skipped.push({
370
- teamName: key.teamName,
371
- reason: `No ${endpointGroup} permission`,
372
- });
373
- continue;
374
- }
375
-
376
- const apiKey = key.apiKey;
377
- const teamName = key.teamName;
378
- tasks.push({
379
- key,
380
- run: async () => {
381
- try {
382
- return await buildRequest(apiKey, teamName);
383
- } catch (err) {
384
- if (!isTimeoutError(err)) throw err;
385
- console.error(
386
- `[loop] ${toolName} team=${teamName} timed out — retrying in ${TIMEOUT_RETRY_BACKOFF_MS}ms`
387
- );
388
- await new Promise((resolve) => setTimeout(resolve, TIMEOUT_RETRY_BACKOFF_MS));
389
- return await buildRequest(apiKey, teamName);
390
- }
391
- },
392
- });
393
- }
394
-
395
- // Fan out concurrent requests
396
- const settled = await Promise.allSettled(tasks.map((t) => t.run()));
397
-
398
- for (let i = 0; i < settled.length; i++) {
399
- const outcome = settled[i];
400
- const teamName = tasks[i].key.teamName;
401
-
402
- if (outcome.status === "fulfilled") {
403
- const data = Array.isArray(outcome.value)
404
- ? outcome.value.slice(0, limitPerTeam)
405
- : [];
406
- results.push({ teamName, data });
407
- } else {
408
- const reason =
409
- outcome.reason instanceof LoopApiError
410
- ? `HTTP ${outcome.reason.status}`
411
- : outcome.reason instanceof Error
412
- ? outcome.reason.message
413
- : String(outcome.reason);
414
- const kind: AggregationFailure["kind"] = isTimeoutError(outcome.reason)
415
- ? "timeout"
416
- : "other";
417
- console.error(`[loop] ${toolName} team=${teamName} failed: ${reason}`);
418
- failures.push({ teamName, reason, kind });
419
- }
420
- }
421
-
422
- // Apply total limit across all teams
423
- let totalItems = 0;
424
- for (const r of results) {
425
- const remaining = limitTotal - totalItems;
426
- if (remaining <= 0) {
427
- r.data = [];
428
- } else if (r.data.length > remaining) {
429
- r.data = r.data.slice(0, remaining);
430
- }
431
- totalItems += r.data.length;
432
- }
433
-
434
- const timedOutCount = failures.filter((f) => f.kind === "timeout").length;
435
- const erroredCount = failures.length - timedOutCount;
436
-
437
- console.error(
438
- `[loop] aggregate tool=${toolName} teams=${keys.length} ` +
439
- `succeeded=${results.length} failed=${failures.length} skipped=${skipped.length}`
440
- );
441
- console.error(
442
- `[loop] aggregate-coverage tool=${toolName} requested=${keys.length} ` +
443
- `answered=${results.length} timed_out=${timedOutCount} errored=${erroredCount}`
444
- );
445
-
446
- return { results, failures, skipped, totalTeams: allKeys.length };
447
- }
448
-
449
- /**
450
- * Resolve a single team's API key with permission checking.
451
- * Handles key loading, decryption, and permission validation.
452
- * Used for both reads and writes that target a specific team — no fan-out.
453
- */
454
- export async function withTeamKey<T>(
455
- accountId: string,
456
- teamName: string,
457
- endpointGroup: string,
458
- toolName: string,
459
- execute: (apiKey: string) => Promise<T>
460
- ): Promise<T> {
461
- const allKeys = await loadTeamKeys(accountId);
462
- if (allKeys.length === 0) {
463
- throw new Error("No Loop teams registered. Use loop-key-register to add team API keys.");
464
- }
465
-
466
- const key = allKeys.find((k) => k.teamName === teamName);
467
- if (!key) {
468
- const available = allKeys.map((k) => k.teamName).join(", ");
469
- throw new Error(`Team "${teamName}" not found. Available teams: ${available}`);
470
- }
471
-
472
- if (!key.permissions.includes(endpointGroup)) {
473
- throw new Error(
474
- `Team "${teamName}" does not have ${endpointGroup} permission. ` +
475
- `Current permissions: ${key.permissions.join(", ")}`
476
- );
477
- }
478
-
479
- return execute(key.apiKey);
480
- }
481
-
482
- /**
483
- * Format an aggregation result into a human-readable text response.
484
- */
485
- export function formatAggregationResult<T>(
486
- result: AggregationResult<T>,
487
- formatItem: (item: T, teamName: string) => string,
488
- entityName: string
489
- ): string {
490
- if (result.totalTeams === 0) {
491
- return "No Loop teams registered. Use loop-key-register to add team API keys.";
492
- }
493
-
494
- const allSkippedOrFailed =
495
- result.results.length === 0 && result.failures.length + result.skipped.length > 0;
496
-
497
- if (allSkippedOrFailed) {
498
- const reasons = [
499
- ...result.failures.map((f) => `${f.teamName}: ${f.reason}`),
500
- ...result.skipped.map((s) => `${s.teamName}: ${s.reason}`),
501
- ];
502
- return `All teams failed or were skipped:\n${reasons.join("\n")}`;
503
- }
504
-
505
- const lines: string[] = [];
506
- let totalItems = 0;
507
-
508
- for (const teamResult of result.results) {
509
- if (teamResult.data.length === 0) continue;
510
- totalItems += teamResult.data.length;
511
- lines.push(`\n## ${teamResult.teamName}`);
512
- for (const item of teamResult.data) {
513
- lines.push(formatItem(item, teamResult.teamName));
514
- }
515
- }
516
-
517
- // Coverage = teams that had a chance to answer (succeeded + failed). Skipped
518
- // teams are excluded from the denominator: they were configured-out, not lost.
519
- const answered = result.results.length;
520
- const failed = result.failures.length;
521
- const totalCovered = answered + failed;
522
- const coverageNote = formatCoverageNote(result.failures);
523
-
524
- if (totalItems === 0) {
525
- if (failed > 0) {
526
- return `No ${entityName} found across ${answered} of ${totalCovered} teams (${coverageNote}).`;
527
- }
528
- const teamCount =
529
- result.results.length === 1
530
- ? result.results[0].teamName
531
- : `${result.results.length} teams`;
532
- return `No ${entityName} found across ${teamCount}.`;
533
- }
534
-
535
- const teamCountFragment =
536
- failed > 0 ? `${answered} of ${totalCovered} team(s)` : `${answered} team(s)`;
537
- let header = `${totalItems} ${entityName} across ${teamCountFragment}:`;
538
- const parts: string[] = [header, ...lines];
539
-
540
- if (failed > 0) {
541
- parts.push(`\n---\nNote: ${coverageNote}.`);
542
- }
543
- if (result.skipped.length > 0) {
544
- parts.push(
545
- `Note: ${result.skipped.length} team(s) skipped (insufficient permissions).`
546
- );
547
- }
548
-
549
- return parts.join("\n");
550
- }
551
-
552
- function formatCoverageNote(failures: AggregationFailure[]): string {
553
- const timedOut = failures.filter((f) => f.kind === "timeout");
554
- const errored = failures.filter((f) => f.kind !== "timeout");
555
- const fragments: string[] = [];
556
- if (timedOut.length > 0) {
557
- fragments.push(
558
- `${timedOut.length} timed out: ${timedOut.map((f) => f.teamName).join(", ")}`
559
- );
560
- }
561
- if (errored.length > 0) {
562
- fragments.push(
563
- `${errored.length} errored: ${errored.map((f) => f.teamName).join(", ")}`
564
- );
565
- }
566
- return fragments.join("; ");
567
- }
@@ -1,51 +0,0 @@
1
- import neo4j, { Driver, Session } from "neo4j-driver";
2
- import { readFileSync } from "node:fs";
3
- import { resolve } from "node:path";
4
-
5
- let driver: Driver | null = null;
6
-
7
- function readPassword(): string {
8
- if (process.env.NEO4J_PASSWORD) return process.env.NEO4J_PASSWORD;
9
-
10
- const passwordFile = resolve(
11
- process.env.PLATFORM_ROOT ?? resolve(import.meta.dirname, "../../../.."),
12
- "config/.neo4j-password"
13
- );
14
-
15
- try {
16
- return readFileSync(passwordFile, "utf-8").trim();
17
- } catch {
18
- throw new Error(
19
- `Neo4j password not found. Expected at ${passwordFile} or in NEO4J_PASSWORD env var.`
20
- );
21
- }
22
- }
23
-
24
- export function getDriver(): Driver {
25
- if (!driver) {
26
- // NEO4J_URI must be explicit. Silent default to:7687 was the
27
- // vector for the orphan data in Maxy's DB from a realagent install.
28
- const uri = process.env.NEO4J_URI;
29
- if (!uri) {
30
- throw new Error(
31
- "[loop] NEO4J_URI unset — refusing to default to bolt://localhost:7687"
32
- );
33
- }
34
- const user = process.env.NEO4J_USER ?? "neo4j";
35
- const password = readPassword();
36
- console.error(`[loop] resolved neo4j_uri=${uri}`);
37
- driver = neo4j.driver(uri, neo4j.auth.basic(user, password));
38
- }
39
- return driver;
40
- }
41
-
42
- export function getSession(): Session {
43
- return getDriver().session();
44
- }
45
-
46
- export async function closeDriver(): Promise<void> {
47
- if (driver) {
48
- await driver.close();
49
- driver = null;
50
- }
51
- }
@@ -1,80 +0,0 @@
1
- import { loopGet, loopPut, withTeamKey } from "../lib/loop-api.js";
2
-
3
- type AutoResponderAction = "get" | "answers" | "details" | "refer";
4
-
5
- // Loop API V2: enquiry auto-responder endpoints (Loop's stated 40% efficiency lever)
6
- // GET /marketing/enquiries/auto-responder/{id}/{key} — read questions + details
7
- // PUT /marketing/enquiries/auto-responder/{id}/answers/{key} — submit applicant answers
8
- // PUT /marketing/enquiries/auto-responder/{id}/details/{key} — update enquiry details
9
- // PUT /marketing/enquiries/auto-responder/{id}/refer/{key} — refer enquiry to another team
10
- // `id` is the enquiry id, `key` is the UUID handed out at enquiry creation.
11
-
12
- interface LoopBooleanResponse {
13
- success?: boolean;
14
- [key: string]: unknown;
15
- }
16
-
17
- interface LoopAutoResponderDetails {
18
- id?: number;
19
- questions?: unknown[];
20
- enquiryDetails?: unknown;
21
- [key: string]: unknown;
22
- }
23
-
24
- export async function autoResponder(params: {
25
- accountId: string;
26
- teamName: string;
27
- action: AutoResponderAction;
28
- autoResponderId: number;
29
- autoResponderKey: string;
30
- answers?: unknown[];
31
- details?: Record<string, unknown>;
32
- }): Promise<string> {
33
- const { accountId, teamName, action, autoResponderId: id, autoResponderKey: key } = params;
34
-
35
- if (action === "get") {
36
- const result = await withTeamKey<LoopAutoResponderDetails>(
37
- accountId, teamName, "marketing", "loop-auto-responder",
38
- async (apiKey) => loopGet<LoopAutoResponderDetails>(
39
- apiKey, `/marketing/enquiries/auto-responder/${id}/${key}`,
40
- "loop-auto-responder", teamName
41
- )
42
- );
43
- return JSON.stringify(result, null, 2);
44
- }
45
-
46
- if (action === "answers") {
47
- await withTeamKey<LoopBooleanResponse>(
48
- accountId, teamName, "marketing", "loop-auto-responder",
49
- async (apiKey) => loopPut<LoopBooleanResponse>(
50
- apiKey, `/marketing/enquiries/auto-responder/${id}/answers/${key}`,
51
- params.answers ?? [], "loop-auto-responder", teamName
52
- )
53
- );
54
- return `Auto-responder answers submitted for enquiry ${id} via team "${teamName}".`;
55
- }
56
-
57
- if (action === "details") {
58
- await withTeamKey<LoopBooleanResponse>(
59
- accountId, teamName, "marketing", "loop-auto-responder",
60
- async (apiKey) => loopPut<LoopBooleanResponse>(
61
- apiKey, `/marketing/enquiries/auto-responder/${id}/details/${key}`,
62
- params.details ?? {}, "loop-auto-responder", teamName
63
- )
64
- );
65
- return `Auto-responder details updated for enquiry ${id} via team "${teamName}".`;
66
- }
67
-
68
- if (action === "refer") {
69
- await withTeamKey<LoopBooleanResponse>(
70
- accountId, teamName, "marketing", "loop-auto-responder",
71
- async (apiKey) => loopPut<LoopBooleanResponse>(
72
- apiKey, `/marketing/enquiries/auto-responder/${id}/refer/${key}`,
73
- {}, "loop-auto-responder", teamName
74
- )
75
- );
76
- return `Enquiry ${id} referred via team "${teamName}".`;
77
- }
78
-
79
- throw new Error(`Unknown auto-responder action: ${action}`);
80
- }