@rubytech/create-maxy 1.0.772 → 1.0.773

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 (194) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/mcp/dist/index.js +43 -4
  3. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  4. package/payload/platform/plugins/admin/skills/business-profile/SKILL.md +5 -6
  5. package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +5 -6
  6. package/payload/server/{chunk-XHFMXKXI.js → chunk-2HBD6IRL.js} +63 -0
  7. package/payload/server/{chunk-57S5JC7G.js → chunk-PIMJJCOQ.js} +1 -1
  8. package/payload/server/{client-pool-5V5GX3UT.js → client-pool-U3A5YUO7.js} +1 -1
  9. package/payload/server/maxy-edge.js +2 -2
  10. package/payload/server/public/assets/{admin-CFttroHB.js → admin-C4CTVtBu.js} +2 -2
  11. package/payload/server/public/index.html +1 -1
  12. package/payload/server/server.js +24 -4
  13. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.d.ts +0 -61
  14. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.d.ts.map +0 -1
  15. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.js +0 -266
  16. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.js.map +0 -1
  17. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/index.d.ts +0 -2
  18. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/index.d.ts.map +0 -1
  19. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/index.js +0 -293
  20. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/index.js.map +0 -1
  21. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/crypto.d.ts +0 -10
  22. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/crypto.d.ts.map +0 -1
  23. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/crypto.js +0 -88
  24. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/crypto.js.map +0 -1
  25. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/loop-api.d.ts +0 -80
  26. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/loop-api.d.ts.map +0 -1
  27. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/loop-api.js +0 -355
  28. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/loop-api.js.map +0 -1
  29. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/neo4j.d.ts +0 -5
  30. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/neo4j.d.ts.map +0 -1
  31. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/neo4j.js +0 -34
  32. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/lib/neo4j.js.map +0 -1
  33. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/customer-preferences.d.ts +0 -10
  34. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/customer-preferences.d.ts.map +0 -1
  35. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/customer-preferences.js +0 -24
  36. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/customer-preferences.js.map +0 -1
  37. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/feedback-list.d.ts +0 -6
  38. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/feedback-list.d.ts.map +0 -1
  39. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/feedback-list.js +0 -18
  40. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/feedback-list.js.map +0 -1
  41. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/feedback.d.ts +0 -16
  42. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/feedback.d.ts.map +0 -1
  43. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/feedback.js +0 -35
  44. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/feedback.js.map +0 -1
  45. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-deregister.d.ts +0 -5
  46. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-deregister.d.ts.map +0 -1
  47. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-deregister.js +0 -19
  48. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-deregister.js.map +0 -1
  49. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-list.d.ts +0 -4
  50. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-list.d.ts.map +0 -1
  51. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-list.js +0 -14
  52. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-list.js.map +0 -1
  53. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-register.d.ts +0 -9
  54. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-register.d.ts.map +0 -1
  55. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-register.js +0 -60
  56. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/key-register.js.map +0 -1
  57. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-enquiry.d.ts +0 -13
  58. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-enquiry.d.ts.map +0 -1
  59. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-enquiry.js +0 -41
  60. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-enquiry.js.map +0 -1
  61. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match-batch.d.ts +0 -9
  62. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match-batch.d.ts.map +0 -1
  63. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match-batch.js +0 -16
  64. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match-batch.js.map +0 -1
  65. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match-request.d.ts +0 -15
  66. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match-request.d.ts.map +0 -1
  67. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match-request.js +0 -11
  68. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match-request.js.map +0 -1
  69. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match.d.ts +0 -10
  70. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match.d.ts.map +0 -1
  71. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match.js +0 -39
  72. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/marketing-match.js.map +0 -1
  73. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-detail.d.ts +0 -9
  74. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-detail.d.ts.map +0 -1
  75. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-detail.js +0 -125
  76. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-detail.js.map +0 -1
  77. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-list.d.ts +0 -7
  78. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-list.d.ts.map +0 -1
  79. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-list.js +0 -16
  80. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-list.js.map +0 -1
  81. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-search.d.ts +0 -18
  82. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-search.d.ts.map +0 -1
  83. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-search.js +0 -87
  84. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/people-search.js.map +0 -1
  85. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/properties-list.d.ts +0 -7
  86. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/properties-list.d.ts.map +0 -1
  87. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/properties-list.js +0 -19
  88. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/properties-list.js.map +0 -1
  89. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-detail.d.ts +0 -10
  90. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-detail.d.ts.map +0 -1
  91. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-detail.js +0 -82
  92. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-detail.js.map +0 -1
  93. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-listed.d.ts +0 -12
  94. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-listed.d.ts.map +0 -1
  95. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-listed.js +0 -32
  96. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-listed.js.map +0 -1
  97. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-request.d.ts +0 -15
  98. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-request.d.ts.map +0 -1
  99. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-request.js +0 -11
  100. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-request.js.map +0 -1
  101. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-search.d.ts +0 -16
  102. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-search.d.ts.map +0 -1
  103. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-search.js +0 -41
  104. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/property-search.js.map +0 -1
  105. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/supplier.d.ts +0 -13
  106. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/supplier.d.ts.map +0 -1
  107. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/supplier.js +0 -49
  108. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/supplier.js.map +0 -1
  109. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/team-availability.d.ts +0 -7
  110. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/team-availability.d.ts.map +0 -1
  111. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/team-availability.js +0 -19
  112. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/team-availability.js.map +0 -1
  113. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/team-info.d.ts +0 -5
  114. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/team-info.d.ts.map +0 -1
  115. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/team-info.js +0 -32
  116. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/team-info.js.map +0 -1
  117. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-create.d.ts +0 -14
  118. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-create.d.ts.map +0 -1
  119. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-create.js +0 -11
  120. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-create.js.map +0 -1
  121. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-detail.d.ts +0 -9
  122. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-detail.d.ts.map +0 -1
  123. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-detail.js +0 -85
  124. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-detail.js.map +0 -1
  125. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-search.d.ts +0 -13
  126. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-search.d.ts.map +0 -1
  127. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-search.js +0 -44
  128. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-search.js.map +0 -1
  129. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-update.d.ts +0 -14
  130. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-update.d.ts.map +0 -1
  131. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-update.js +0 -18
  132. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewing-update.js.map +0 -1
  133. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewings-list.d.ts +0 -9
  134. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewings-list.d.ts.map +0 -1
  135. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewings-list.js +0 -25
  136. package/payload/premium-plugins/real-agency/plugins/real-agency-loop/mcp/dist/tools/viewings-list.js.map +0 -1
  137. package/payload/server/chunk-26QT2HEQ.js +0 -9483
  138. package/payload/server/chunk-2T4RRIJK.js +0 -9462
  139. package/payload/server/chunk-2W7O63CK.js +0 -3052
  140. package/payload/server/chunk-32ZHQJNX.js +0 -11395
  141. package/payload/server/chunk-3KDVGWPQ.js +0 -2920
  142. package/payload/server/chunk-3RBKKDHC.js +0 -783
  143. package/payload/server/chunk-3VVHVJK2.js +0 -11405
  144. package/payload/server/chunk-43JK6WNK.js +0 -3057
  145. package/payload/server/chunk-5YIXIF6C.js +0 -726
  146. package/payload/server/chunk-7ODDM7L4.js +0 -12370
  147. package/payload/server/chunk-A5K3CFMI.js +0 -12297
  148. package/payload/server/chunk-AIWWYOBH.js +0 -9439
  149. package/payload/server/chunk-B54KBAK4.js +0 -72
  150. package/payload/server/chunk-BIOIXN5A.js +0 -12165
  151. package/payload/server/chunk-D53LK5YC.js +0 -12171
  152. package/payload/server/chunk-EIQT6QDH.js +0 -9562
  153. package/payload/server/chunk-FM5JMRED.js +0 -12033
  154. package/payload/server/chunk-HPU24BXP.js +0 -12173
  155. package/payload/server/chunk-HU5FSQYA.js +0 -12186
  156. package/payload/server/chunk-IAIGB5WN.js +0 -11406
  157. package/payload/server/chunk-IO2WQEY4.js +0 -9562
  158. package/payload/server/chunk-JDT3MGUY.js +0 -12165
  159. package/payload/server/chunk-JLVVVQN7.js +0 -9447
  160. package/payload/server/chunk-K7GQ5RMN.js +0 -12172
  161. package/payload/server/chunk-LQ5GSMEW.js +0 -12036
  162. package/payload/server/chunk-MPWGVFU2.js +0 -12340
  163. package/payload/server/chunk-O2FWENOD.js +0 -11530
  164. package/payload/server/chunk-PE76FPYP.js +0 -12040
  165. package/payload/server/chunk-PQ6LDXZ4.js +0 -2997
  166. package/payload/server/chunk-Q6NDXCM6.js +0 -11448
  167. package/payload/server/chunk-QXAUMZXQ.js +0 -9512
  168. package/payload/server/chunk-S3M2NZMA.js +0 -3136
  169. package/payload/server/chunk-SGBNY4NP.js +0 -9540
  170. package/payload/server/chunk-SKXO42T6.js +0 -2934
  171. package/payload/server/chunk-SPTD7L7Z.js +0 -9474
  172. package/payload/server/chunk-TKYZ7AEB.js +0 -3142
  173. package/payload/server/chunk-TXPEEAV6.js +0 -2997
  174. package/payload/server/chunk-U3W5YIXU.js +0 -11450
  175. package/payload/server/chunk-U5JPRUYZ.js +0 -12298
  176. package/payload/server/chunk-UFLV7I6N.js +0 -11678
  177. package/payload/server/chunk-ULVR2RRY.js +0 -9439
  178. package/payload/server/chunk-VOD2IZ6J.js +0 -2934
  179. package/payload/server/chunk-VS7CRH4M.js +0 -9439
  180. package/payload/server/chunk-W6ZUNLLS.js +0 -9446
  181. package/payload/server/chunk-WW464F23.js +0 -9512
  182. package/payload/server/chunk-Y57ACANQ.js +0 -12292
  183. package/payload/server/chunk-ZK3VNR7Y.js +0 -9510
  184. package/payload/server/chunk-ZL2A4ROK.js +0 -11416
  185. package/payload/server/client-pool-67NUIL7H.js +0 -28
  186. package/payload/server/client-pool-CX2MFW75.js +0 -28
  187. package/payload/server/client-pool-DQBHSKAF.js +0 -28
  188. package/payload/server/client-pool-I5TCP7WI.js +0 -28
  189. package/payload/server/client-pool-ISMYJXCU.js +0 -28
  190. package/payload/server/client-pool-J4ZHJ6Z3.js +0 -28
  191. package/payload/server/client-pool-SGPHSYLK.js +0 -28
  192. package/payload/server/client-pool-TCKGDZLE.js +0 -28
  193. package/payload/server/client-pool-TULUIO6M.js +0 -28
  194. package/payload/server/upgrade-progress-server.js +0 -83
@@ -1,355 +0,0 @@
1
- import { getSession } from "./neo4j.js";
2
- import { decrypt } from "./crypto.js";
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
- const LOOP_BASE_URL = "https://api.loop.software";
19
- const REQUEST_TIMEOUT_MS = 10_000;
20
- const DEFAULT_LIMIT_PER_TEAM = 50;
21
- const DEFAULT_LIMIT_TOTAL = 200;
22
- function isEnvelope(val) {
23
- return (val !== null &&
24
- typeof val === "object" &&
25
- !Array.isArray(val) &&
26
- "statusCode" in val &&
27
- "httpResponseCode" in val &&
28
- "data" in val);
29
- }
30
- function unwrapEnvelope(parsed, toolName, teamName) {
31
- if (!isEnvelope(parsed)) {
32
- return parsed;
33
- }
34
- if (parsed.statusCode !== "success") {
35
- const errMsg = parsed.errors?.length
36
- ? parsed.errors.join("; ")
37
- : `statusCode=${parsed.statusCode}`;
38
- throw new Error(`Loop API error for team=${teamName} tool=${toolName}: ${errMsg} (httpResponseCode=${parsed.httpResponseCode})`);
39
- }
40
- if (parsed.warnings?.length) {
41
- console.error(`[loop] ${toolName} team=${teamName} warnings: ${parsed.warnings.join("; ")}`);
42
- }
43
- return parsed.data;
44
- }
45
- /**
46
- * Load all LoopTeamKey nodes for an account from Neo4j.
47
- */
48
- export async function loadTeamKeys(accountId) {
49
- const session = getSession();
50
- try {
51
- const result = await session.run(`MATCH (k:LoopTeamKey {accountId: $accountId})
52
- RETURN k.teamName AS teamName, k.encryptedKey AS encryptedKey,
53
- k.teamAddress AS teamAddress, k.agentId AS agentId,
54
- k.permissions AS permissions, k.createdAt AS createdAt,
55
- k.updatedAt AS updatedAt
56
- ORDER BY k.teamName`, { accountId });
57
- return result.records.map((r) => ({
58
- teamName: r.get("teamName"),
59
- encryptedKey: r.get("encryptedKey"),
60
- teamAddress: r.get("teamAddress") ?? "",
61
- agentId: r.get("agentId") ?? "",
62
- permissions: r.get("permissions") ?? [],
63
- createdAt: r.get("createdAt") ?? "",
64
- updatedAt: r.get("updatedAt") ?? "",
65
- }));
66
- }
67
- finally {
68
- await session.close();
69
- }
70
- }
71
- /**
72
- * Make a GET request to the Loop API V2.
73
- */
74
- export async function loopGet(apiKey, path, toolName, teamName) {
75
- const url = `${LOOP_BASE_URL}${path}`;
76
- const start = Date.now();
77
- const response = await fetch(url, {
78
- headers: { "X-Api-Key": apiKey, "Accept": "application/json" },
79
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
80
- });
81
- const duration = Date.now() - start;
82
- console.error(`[loop] ${toolName} team=${teamName} endpoint=GET ${path} status=${response.status} duration=${duration}ms`);
83
- if (response.status === 204) {
84
- return [];
85
- }
86
- if (!response.ok) {
87
- throw new LoopApiError(response.status, teamName, path);
88
- }
89
- const text = await response.text();
90
- try {
91
- const parsed = JSON.parse(text);
92
- return unwrapEnvelope(parsed, toolName, teamName);
93
- }
94
- catch (err) {
95
- if (err instanceof SyntaxError) {
96
- throw new Error(`Loop returned non-JSON response for team=${teamName} path=${path} ` +
97
- `(status=${response.status}, length=${text.length})`);
98
- }
99
- throw err;
100
- }
101
- }
102
- /**
103
- * Make a POST request to the Loop API V2.
104
- * For write operations: create viewings, record feedback, submit enquiries, etc.
105
- * Returns parsed JSON response. Treats 204 as success with empty result.
106
- */
107
- export async function loopPost(apiKey, path, body, toolName, teamName) {
108
- const url = `${LOOP_BASE_URL}${path}`;
109
- const start = Date.now();
110
- const response = await fetch(url, {
111
- method: "POST",
112
- headers: {
113
- "X-Api-Key": apiKey,
114
- "Accept": "application/json",
115
- "Content-Type": "application/json",
116
- },
117
- body: JSON.stringify(body),
118
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
119
- });
120
- const duration = Date.now() - start;
121
- console.error(`[loop] WRITE ${toolName} team=${teamName} endpoint=POST ${path} status=${response.status} duration=${duration}ms`);
122
- if (response.status === 204) {
123
- return { success: true };
124
- }
125
- if (!response.ok) {
126
- const errorBody = await response.text().catch(() => "");
127
- throw new LoopApiError(response.status, teamName, path, errorBody);
128
- }
129
- const text = await response.text();
130
- try {
131
- const parsed = JSON.parse(text);
132
- return unwrapEnvelope(parsed, toolName, teamName);
133
- }
134
- catch (err) {
135
- if (err instanceof SyntaxError) {
136
- throw new Error(`Loop returned non-JSON response for team=${teamName} path=${path} ` +
137
- `(status=${response.status}, length=${text.length})`);
138
- }
139
- throw err;
140
- }
141
- }
142
- /**
143
- * Make a PUT request to the Loop API V2.
144
- * For update operations: batch matching, submit quotes, update preferences, etc.
145
- */
146
- export async function loopPut(apiKey, path, body, toolName, teamName) {
147
- const url = `${LOOP_BASE_URL}${path}`;
148
- const start = Date.now();
149
- const response = await fetch(url, {
150
- method: "PUT",
151
- headers: {
152
- "X-Api-Key": apiKey,
153
- "Accept": "application/json",
154
- "Content-Type": "application/json",
155
- },
156
- body: JSON.stringify(body),
157
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
158
- });
159
- const duration = Date.now() - start;
160
- console.error(`[loop] WRITE ${toolName} team=${teamName} endpoint=PUT ${path} status=${response.status} duration=${duration}ms`);
161
- if (response.status === 204) {
162
- return { success: true };
163
- }
164
- if (!response.ok) {
165
- const errorBody = await response.text().catch(() => "");
166
- throw new LoopApiError(response.status, teamName, path, errorBody);
167
- }
168
- const text = await response.text();
169
- try {
170
- const parsed = JSON.parse(text);
171
- return unwrapEnvelope(parsed, toolName, teamName);
172
- }
173
- catch (err) {
174
- if (err instanceof SyntaxError) {
175
- throw new Error(`Loop returned non-JSON response for team=${teamName} path=${path} ` +
176
- `(status=${response.status}, length=${text.length})`);
177
- }
178
- throw err;
179
- }
180
- }
181
- export class LoopApiError extends Error {
182
- status;
183
- teamName;
184
- path;
185
- responseBody;
186
- constructor(status, teamName, path, responseBody) {
187
- const detail = responseBody ? ` — ${responseBody.slice(0, 200)}` : "";
188
- super(`Loop API returned ${status} for team=${teamName} path=${path}${detail}`);
189
- this.status = status;
190
- this.teamName = teamName;
191
- this.path = path;
192
- this.responseBody = responseBody;
193
- this.name = "LoopApiError";
194
- }
195
- }
196
- /**
197
- * Fan out a request across all registered teams for an account, merging results.
198
- *
199
- * Each tool provides a `buildRequest` function that takes a decrypted API key
200
- * and returns the data for that team. The aggregation engine handles:
201
- * - Key loading and decryption
202
- * - Permission checking
203
- * - Concurrent fan-out via Promise.allSettled
204
- * - Result merging with teamName tags
205
- * - Aggregate logging
206
- *
207
- * When `teamName` is provided, only that team is queried (no fan-out).
208
- */
209
- export async function aggregateAcrossTeams(accountId, endpointGroup, toolName, buildRequest, options) {
210
- const allKeys = await loadTeamKeys(accountId);
211
- if (allKeys.length === 0) {
212
- return { results: [], failures: [], skipped: [], totalTeams: 0 };
213
- }
214
- // Filter to specific team if requested
215
- const keys = options?.teamName
216
- ? allKeys.filter((k) => k.teamName === options.teamName)
217
- : allKeys;
218
- if (keys.length === 0 && options?.teamName) {
219
- return {
220
- results: [],
221
- failures: [{ teamName: options.teamName, reason: "Team not found" }],
222
- skipped: [],
223
- totalTeams: allKeys.length,
224
- };
225
- }
226
- const limitPerTeam = options?.limitPerTeam ?? DEFAULT_LIMIT_PER_TEAM;
227
- const limitTotal = options?.limitTotal ?? DEFAULT_LIMIT_TOTAL;
228
- const results = [];
229
- const failures = [];
230
- const skipped = [];
231
- // Check permissions and build request promises
232
- const tasks = [];
233
- for (const key of keys) {
234
- if (!key.permissions.includes(endpointGroup)) {
235
- console.error(`[loop] ${toolName} team=${key.teamName} — permission denied (requires: ${endpointGroup})`);
236
- skipped.push({
237
- teamName: key.teamName,
238
- reason: `No ${endpointGroup} permission`,
239
- });
240
- continue;
241
- }
242
- let apiKey;
243
- try {
244
- apiKey = decrypt(key.encryptedKey);
245
- }
246
- catch (err) {
247
- const msg = err instanceof Error ? err.message : String(err);
248
- console.error(`[loop] decrypt failed for team=${key.teamName}: ${msg}`);
249
- failures.push({ teamName: key.teamName, reason: `Decryption failed` });
250
- continue;
251
- }
252
- tasks.push({ key, promise: buildRequest(apiKey, key.teamName) });
253
- }
254
- // Fan out concurrent requests
255
- const settled = await Promise.allSettled(tasks.map((t) => t.promise));
256
- for (let i = 0; i < settled.length; i++) {
257
- const outcome = settled[i];
258
- const teamName = tasks[i].key.teamName;
259
- if (outcome.status === "fulfilled") {
260
- const data = Array.isArray(outcome.value)
261
- ? outcome.value.slice(0, limitPerTeam)
262
- : [];
263
- results.push({ teamName, data });
264
- }
265
- else {
266
- const reason = outcome.reason instanceof LoopApiError
267
- ? `HTTP ${outcome.reason.status}`
268
- : outcome.reason instanceof Error
269
- ? outcome.reason.message
270
- : String(outcome.reason);
271
- console.error(`[loop] ${toolName} team=${teamName} failed: ${reason}`);
272
- failures.push({ teamName, reason });
273
- }
274
- }
275
- // Apply total limit across all teams
276
- let totalItems = 0;
277
- for (const r of results) {
278
- const remaining = limitTotal - totalItems;
279
- if (remaining <= 0) {
280
- r.data = [];
281
- }
282
- else if (r.data.length > remaining) {
283
- r.data = r.data.slice(0, remaining);
284
- }
285
- totalItems += r.data.length;
286
- }
287
- console.error(`[loop] aggregate tool=${toolName} teams=${keys.length} ` +
288
- `succeeded=${results.length} failed=${failures.length} skipped=${skipped.length}`);
289
- return { results, failures, skipped, totalTeams: allKeys.length };
290
- }
291
- /**
292
- * Resolve a single team's API key with permission checking.
293
- * Handles key loading, decryption, and permission validation.
294
- * Used for both reads and writes that target a specific team — no fan-out.
295
- */
296
- export async function withTeamKey(accountId, teamName, endpointGroup, toolName, execute) {
297
- const allKeys = await loadTeamKeys(accountId);
298
- if (allKeys.length === 0) {
299
- throw new Error("No Loop teams registered. Use loop-key-register to add team API keys.");
300
- }
301
- const key = allKeys.find((k) => k.teamName === teamName);
302
- if (!key) {
303
- const available = allKeys.map((k) => k.teamName).join(", ");
304
- throw new Error(`Team "${teamName}" not found. Available teams: ${available}`);
305
- }
306
- if (!key.permissions.includes(endpointGroup)) {
307
- throw new Error(`Team "${teamName}" does not have ${endpointGroup} permission. ` +
308
- `Current permissions: ${key.permissions.join(", ")}`);
309
- }
310
- const apiKey = decrypt(key.encryptedKey);
311
- return execute(apiKey);
312
- }
313
- /**
314
- * Format an aggregation result into a human-readable text response.
315
- */
316
- export function formatAggregationResult(result, formatItem, entityName) {
317
- if (result.totalTeams === 0) {
318
- return "No Loop teams registered. Use loop-key-register to add team API keys.";
319
- }
320
- const allSkippedOrFailed = result.results.length === 0 && result.failures.length + result.skipped.length > 0;
321
- if (allSkippedOrFailed) {
322
- const reasons = [
323
- ...result.failures.map((f) => `${f.teamName}: ${f.reason}`),
324
- ...result.skipped.map((s) => `${s.teamName}: ${s.reason}`),
325
- ];
326
- return `All teams failed or were skipped:\n${reasons.join("\n")}`;
327
- }
328
- const lines = [];
329
- let totalItems = 0;
330
- for (const teamResult of result.results) {
331
- if (teamResult.data.length === 0)
332
- continue;
333
- totalItems += teamResult.data.length;
334
- lines.push(`\n## ${teamResult.teamName}`);
335
- for (const item of teamResult.data) {
336
- lines.push(formatItem(item, teamResult.teamName));
337
- }
338
- }
339
- if (totalItems === 0) {
340
- const teamCount = result.results.length === 1
341
- ? result.results[0].teamName
342
- : `${result.results.length} teams`;
343
- return `No ${entityName} found across ${teamCount}.`;
344
- }
345
- let header = `${totalItems} ${entityName} across ${result.results.length} team(s):`;
346
- const parts = [header, ...lines];
347
- if (result.failures.length > 0) {
348
- parts.push(`\n---\nNote: ${result.failures.length} team(s) failed — check server.log for details.`);
349
- }
350
- if (result.skipped.length > 0) {
351
- parts.push(`Note: ${result.skipped.length} team(s) skipped (insufficient permissions).`);
352
- }
353
- return parts.join("\n");
354
- }
355
- //# sourceMappingURL=loop-api.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loop-api.js","sourceRoot":"","sources":["../../src/lib/loop-api.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import { Driver, Session } from "neo4j-driver";
2
- export declare function getDriver(): Driver;
3
- export declare function getSession(): Session;
4
- export declare function closeDriver(): Promise<void>;
5
- //# sourceMappingURL=neo4j.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"neo4j.d.ts","sourceRoot":"","sources":["../../src/lib/neo4j.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAuBtD,wBAAgB,SAAS,IAAI,MAAM,CAQlC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAKjD"}
@@ -1,34 +0,0 @@
1
- import neo4j from "neo4j-driver";
2
- import { readFileSync } from "node:fs";
3
- import { resolve } from "node:path";
4
- let driver = null;
5
- function readPassword() {
6
- if (process.env.NEO4J_PASSWORD)
7
- return process.env.NEO4J_PASSWORD;
8
- const passwordFile = resolve(process.env.PLATFORM_ROOT ?? resolve(import.meta.dirname, "../../../.."), "config/.neo4j-password");
9
- try {
10
- return readFileSync(passwordFile, "utf-8").trim();
11
- }
12
- catch {
13
- throw new Error(`Neo4j password not found. Expected at ${passwordFile} or in NEO4J_PASSWORD env var.`);
14
- }
15
- }
16
- export function getDriver() {
17
- if (!driver) {
18
- const uri = process.env.NEO4J_URI ?? "bolt://localhost:7687";
19
- const user = process.env.NEO4J_USER ?? "neo4j";
20
- const password = readPassword();
21
- driver = neo4j.driver(uri, neo4j.auth.basic(user, password));
22
- }
23
- return driver;
24
- }
25
- export function getSession() {
26
- return getDriver().session();
27
- }
28
- export async function closeDriver() {
29
- if (driver) {
30
- await driver.close();
31
- driver = null;
32
- }
33
- }
34
- //# sourceMappingURL=neo4j.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"neo4j.js","sourceRoot":"","sources":["../../src/lib/neo4j.ts"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAElE,MAAM,YAAY,GAAG,OAAO,CAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EACxE,wBAAwB,CACzB,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,yCAAyC,YAAY,gCAAgC,CACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,uBAAuB,CAAC;QAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;QAC/C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -1,10 +0,0 @@
1
- type PreferencesAction = "read" | "write";
2
- export declare function customerPreferences(params: {
3
- accountId: string;
4
- teamName: string;
5
- personCode: number;
6
- action: PreferencesAction;
7
- preferences?: Record<string, unknown>;
8
- }): Promise<string>;
9
- export {};
10
- //# sourceMappingURL=customer-preferences.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"customer-preferences.d.ts","sourceRoot":"","sources":["../../src/tools/customer-preferences.ts"],"names":[],"mappings":"AAEA,KAAK,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAmB1C,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsClB"}
@@ -1,24 +0,0 @@
1
- import { loopGet, loopPost, withTeamKey } from "../lib/loop-api.js";
2
- export async function customerPreferences(params) {
3
- const { accountId, teamName, personCode, action } = params;
4
- if (action === "read") {
5
- const result = await withTeamKey(accountId, teamName, "customer", "loop-customer-preferences", async (apiKey) => {
6
- return loopGet(apiKey, `/customer/preferences/${personCode}`, "loop-customer-preferences", teamName);
7
- });
8
- if (!result || (Array.isArray(result) && result.length === 0)) {
9
- return `No preferences found for person ${personCode} via team "${teamName}".`;
10
- }
11
- return JSON.stringify(result, null, 2);
12
- }
13
- if (action === "write") {
14
- if (!params.preferences) {
15
- throw new Error("preferences object is required when action is 'write'.");
16
- }
17
- await withTeamKey(accountId, teamName, "customer", "loop-customer-preferences", async (apiKey) => {
18
- return loopPost(apiKey, `/customer/preferences/${personCode}`, params.preferences, "loop-customer-preferences", teamName);
19
- });
20
- return `Preferences updated for person ${personCode} via team "${teamName}".`;
21
- }
22
- throw new Error(`Unknown action: ${action}. Use "read" or "write".`);
23
- }
24
- //# sourceMappingURL=customer-preferences.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"customer-preferences.js","sourceRoot":"","sources":["../../src/tools/customer-preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAqBpE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAMzC;IACC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE3D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,2BAA2B,EAC5D,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,OAAO,OAAO,CACZ,MAAM,EAAE,yBAAyB,UAAU,EAAE,EAC7C,2BAA2B,EAAE,QAAQ,CACtC,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO,mCAAmC,UAAU,cAAc,QAAQ,IAAI,CAAC;QACjF,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,WAAW,CACf,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,2BAA2B,EAC5D,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,OAAO,QAAQ,CACb,MAAM,EAAE,yBAAyB,UAAU,EAAE,EAC7C,MAAM,CAAC,WAAY,EAAE,2BAA2B,EAAE,QAAQ,CAC3D,CAAC;QACJ,CAAC,CACF,CAAC;QACF,OAAO,kCAAkC,UAAU,cAAc,QAAQ,IAAI,CAAC;IAChF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,0BAA0B,CAAC,CAAC;AACvE,CAAC"}
@@ -1,6 +0,0 @@
1
- export declare function feedbackList(params: {
2
- accountId: string;
3
- teamName?: string;
4
- limit?: number;
5
- }): Promise<string>;
6
- //# sourceMappingURL=feedback-list.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback-list.d.ts","sourceRoot":"","sources":["../../src/tools/feedback-list.ts"],"names":[],"mappings":"AAiBA,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgClB"}
@@ -1,18 +0,0 @@
1
- import { aggregateAcrossTeams, formatAggregationResult, loopGet, } from "../lib/loop-api.js";
2
- export async function feedbackList(params) {
3
- const { accountId, teamName, limit } = params;
4
- const result = await aggregateAcrossTeams(accountId, "feedback", "loop-feedback-list", async (apiKey, team) => {
5
- const data = await loopGet(apiKey, "/feedback", "loop-feedback-list", team);
6
- return Array.isArray(data) ? data : [];
7
- }, { teamName, limitPerTeam: limit ?? 50, limitTotal: limit ?? 200 });
8
- return formatAggregationResult(result, (f) => {
9
- const addr = f.propertyAddress ?? "Unknown property";
10
- const date = f.viewingDate ?? "";
11
- const attendee = f.attendeeName ? ` (${f.attendeeName})` : "";
12
- const rating = f.rating != null ? ` ★${f.rating}` : "";
13
- const text = f.feedback ? `: "${f.feedback}"` : "";
14
- const status = f.status ? ` [${f.status}]` : "";
15
- return `- ${addr} ${date}${attendee}${rating}${status}${text}`;
16
- }, "feedback");
17
- }
18
- //# sourceMappingURL=feedback-list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback-list.js","sourceRoot":"","sources":["../../src/tools/feedback-list.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,OAAO,GACR,MAAM,oBAAoB,CAAC;AAa5B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAIlC;IACC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,SAAS,EACT,UAAU,EACV,oBAAoB,EACpB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,IAAI,CACL,CAAC;QACF,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,CAAC,EACD,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,IAAI,GAAG,EAAE,CAClE,CAAC;IAEF,OAAO,uBAAuB,CAC5B,MAAM,EACN,CAAC,CAAC,EAAE,EAAE;QACJ,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,IAAI,kBAAkB,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,KAAK,IAAI,IAAI,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;IACjE,CAAC,EACD,UAAU,CACX,CAAC;AACJ,CAAC"}
@@ -1,16 +0,0 @@
1
- type Department = "sales" | "lettings";
2
- export declare function feedbackGet(params: {
3
- accountId: string;
4
- teamName: string;
5
- viewingId: number;
6
- department: Department;
7
- }): Promise<string>;
8
- export declare function feedbackSubmit(params: {
9
- accountId: string;
10
- teamName: string;
11
- viewingId: number;
12
- department: Department;
13
- feedback: string;
14
- }): Promise<string>;
15
- export {};
16
- //# sourceMappingURL=feedback.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/tools/feedback.ts"],"names":[],"mappings":"AAMA,KAAK,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;AAwBvC,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BlB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAelB"}
@@ -1,35 +0,0 @@
1
- import { loopGet, loopPost, withTeamKey, } from "../lib/loop-api.js";
2
- export async function feedbackGet(params) {
3
- const { accountId, teamName, viewingId, department } = params;
4
- const result = await withTeamKey(accountId, teamName, "feedback", "loop-feedback-get", async (apiKey) => {
5
- const path = `/feedback/residential/${department}/viewings/${viewingId}`;
6
- return loopGet(apiKey, path, "loop-feedback-get", teamName);
7
- });
8
- if (!result || (Array.isArray(result) && result.length === 0)) {
9
- return `No feedback found for viewing ${viewingId} (${department}) via team "${teamName}".`;
10
- }
11
- const f = result;
12
- const lines = [`**Feedback for viewing ${viewingId}**`];
13
- if (f.propertyAddress)
14
- lines.push(`Property: ${f.propertyAddress}`);
15
- if (f.date)
16
- lines.push(`Date: ${f.date}`);
17
- if (f.attendeeName)
18
- lines.push(`Attendee: ${f.attendeeName}`);
19
- if (f.rating != null)
20
- lines.push(`Rating: ★${f.rating}`);
21
- if (f.status)
22
- lines.push(`Status: ${f.status}`);
23
- if (f.feedback)
24
- lines.push(`Feedback: ${f.feedback}`);
25
- return lines.join("\n");
26
- }
27
- export async function feedbackSubmit(params) {
28
- const { accountId, teamName, viewingId, department, feedback } = params;
29
- await withTeamKey(accountId, teamName, "feedback", "loop-feedback-submit", async (apiKey) => {
30
- const path = `/feedback/residential/${department}/viewings/${viewingId}/feedback`;
31
- return loopPost(apiKey, path, { result: feedback }, "loop-feedback-submit", teamName);
32
- });
33
- return `Feedback submitted for viewing ${viewingId} (${department}) via team "${teamName}".`;
34
- }
35
- //# sourceMappingURL=feedback.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/tools/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,WAAW,GACZ,MAAM,oBAAoB,CAAC;AA0B5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAKjC;IACC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAE9D,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,SAAS,EACT,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,yBAAyB,UAAU,aAAa,SAAS,EAAE,CAAC;QACzE,OAAO,OAAO,CAAsB,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IACnF,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,iCAAiC,SAAS,KAAK,UAAU,eAAe,QAAQ,IAAI,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,CAAC;IACjB,MAAM,KAAK,GAAG,CAAC,0BAA0B,SAAS,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC,eAAe;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAMpC;IACC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAExE,MAAM,WAAW,CACf,SAAS,EACT,QAAQ,EACR,UAAU,EACV,sBAAsB,EACtB,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,yBAAyB,UAAU,aAAa,SAAS,WAAW,CAAC;QAClF,OAAO,QAAQ,CAAsB,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAC7G,CAAC,CACF,CAAC;IAEF,OAAO,kCAAkC,SAAS,KAAK,UAAU,eAAe,QAAQ,IAAI,CAAC;AAC/F,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare function keyDeregister(params: {
2
- teamName: string;
3
- accountId: string;
4
- }): Promise<void>;
5
- //# sourceMappingURL=key-deregister.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-deregister.d.ts","sourceRoot":"","sources":["../../src/tools/key-deregister.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB"}
@@ -1,19 +0,0 @@
1
- import { getSession } from "../lib/neo4j.js";
2
- export async function keyDeregister(params) {
3
- const { teamName, accountId } = params;
4
- const session = getSession();
5
- try {
6
- const result = await session.run(`MATCH (k:LoopTeamKey {teamName: $teamName, accountId: $accountId})
7
- DELETE k
8
- RETURN count(k) AS deleted`, { teamName, accountId });
9
- const deleted = result.records[0]?.get("deleted")?.toNumber?.() ?? 0;
10
- if (deleted === 0) {
11
- throw new Error(`Team "${teamName}" not found.`);
12
- }
13
- }
14
- finally {
15
- await session.close();
16
- }
17
- console.error(`[loop] key-deregister team=${teamName} account=${accountId}`);
18
- }
19
- //# sourceMappingURL=key-deregister.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-deregister.js","sourceRoot":"","sources":["../../src/tools/key-deregister.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAGnC;IACC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAEvC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B;;kCAE4B,EAC5B,EAAE,QAAQ,EAAE,SAAS,EAAE,CACxB,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;QACrE,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,cAAc,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,YAAY,SAAS,EAAE,CAAC,CAAC;AAC/E,CAAC"}
@@ -1,4 +0,0 @@
1
- export declare function keyList(params: {
2
- accountId: string;
3
- }): Promise<string>;
4
- //# sourceMappingURL=key-list.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-list.d.ts","sourceRoot":"","sources":["../../src/tools/key-list.ts"],"names":[],"mappings":"AAEA,wBAAsB,OAAO,CAAC,MAAM,EAAE;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAclB"}
@@ -1,14 +0,0 @@
1
- import { loadTeamKeys } from "../lib/loop-api.js";
2
- export async function keyList(params) {
3
- const keys = await loadTeamKeys(params.accountId);
4
- if (keys.length === 0) {
5
- return "No Loop teams registered. Use loop-key-register to add team API keys.";
6
- }
7
- const lines = keys.map((k) => {
8
- const perms = k.permissions.join(", ");
9
- const addr = k.teamAddress ? ` — ${k.teamAddress}` : "";
10
- return `- **${k.teamName}**${addr} (permissions: ${perms}, registered: ${k.createdAt})`;
11
- });
12
- return `${keys.length} Loop team(s) registered:\n\n${lines.join("\n")}`;
13
- }
14
- //# sourceMappingURL=key-list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-list.js","sourceRoot":"","sources":["../../src/tools/key-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAE7B;IACC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,uEAAuE,CAAC;IACjF,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,OAAO,CAAC,CAAC,QAAQ,KAAK,IAAI,kBAAkB,KAAK,iBAAiB,CAAC,CAAC,SAAS,GAAG,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,IAAI,CAAC,MAAM,gCAAgC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1E,CAAC"}