@headless-lms/server 0.3.0 → 0.5.0

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 (228) hide show
  1. package/README.md +14 -0
  2. package/dist/app/community-mail.d.ts +10 -10
  3. package/dist/app/community-mail.js +72 -28
  4. package/dist/app/community-mail.js.map +1 -1
  5. package/dist/app/container.d.ts +48 -10
  6. package/dist/app/container.js +268 -48
  7. package/dist/app/container.js.map +1 -1
  8. package/dist/app/notification-channels.d.ts +47 -0
  9. package/dist/app/notification-channels.js +175 -0
  10. package/dist/app/notification-channels.js.map +1 -0
  11. package/dist/app/notification-reads.d.ts +23 -0
  12. package/dist/app/notification-reads.js +74 -0
  13. package/dist/app/notification-reads.js.map +1 -0
  14. package/dist/app/platform.d.ts +14 -0
  15. package/dist/app/platform.js +14 -0
  16. package/dist/app/platform.js.map +1 -0
  17. package/dist/http/config.d.ts +4 -0
  18. package/dist/http/errors.d.ts +1 -0
  19. package/dist/http/errors.js +24 -4
  20. package/dist/http/errors.js.map +1 -1
  21. package/dist/http/fastify.d.ts +8 -0
  22. package/dist/http/mcp/catalogue.d.ts +11 -9
  23. package/dist/http/mcp/catalogue.js +15 -21
  24. package/dist/http/mcp/catalogue.js.map +1 -1
  25. package/dist/http/mcp/challenge.js +3 -3
  26. package/dist/http/mcp/challenge.js.map +1 -1
  27. package/dist/http/mcp/route.js +7 -7
  28. package/dist/http/mcp/route.js.map +1 -1
  29. package/dist/http/mcp/test-support.d.ts +6 -5
  30. package/dist/http/mcp/test-support.js +32 -11
  31. package/dist/http/mcp/test-support.js.map +1 -1
  32. package/dist/http/mcp/tool.d.ts +3 -9
  33. package/dist/http/mcp/tool.js +14 -6
  34. package/dist/http/mcp/tool.js.map +1 -1
  35. package/dist/http/mcp/tools/automations.js +10 -20
  36. package/dist/http/mcp/tools/automations.js.map +1 -1
  37. package/dist/http/mcp/tools/catalog.js +25 -42
  38. package/dist/http/mcp/tools/catalog.js.map +1 -1
  39. package/dist/http/mcp/tools/comments.js +9 -19
  40. package/dist/http/mcp/tools/comments.js.map +1 -1
  41. package/dist/http/mcp/tools/communities.js +16 -31
  42. package/dist/http/mcp/tools/communities.js.map +1 -1
  43. package/dist/http/mcp/tools/community-members.js +9 -16
  44. package/dist/http/mcp/tools/community-members.js.map +1 -1
  45. package/dist/http/mcp/tools/community-moderation.js +13 -25
  46. package/dist/http/mcp/tools/community-moderation.js.map +1 -1
  47. package/dist/http/mcp/tools/courses.js +11 -21
  48. package/dist/http/mcp/tools/courses.js.map +1 -1
  49. package/dist/http/mcp/tools/events.d.ts +6 -0
  50. package/dist/http/mcp/tools/events.js +170 -0
  51. package/dist/http/mcp/tools/events.js.map +1 -0
  52. package/dist/http/mcp/tools/index.d.ts +5 -1
  53. package/dist/http/mcp/tools/index.js +45 -10
  54. package/dist/http/mcp/tools/index.js.map +1 -1
  55. package/dist/http/mcp/tools/organization.d.ts +6 -0
  56. package/dist/http/mcp/tools/organization.js +214 -0
  57. package/dist/http/mcp/tools/organization.js.map +1 -0
  58. package/dist/http/mcp/tools/people.js +30 -49
  59. package/dist/http/mcp/tools/people.js.map +1 -1
  60. package/dist/http/plugins/auth.js +37 -8
  61. package/dist/http/plugins/auth.js.map +1 -1
  62. package/dist/http/plugins/error-handler.d.ts +5 -1
  63. package/dist/http/plugins/error-handler.js +13 -3
  64. package/dist/http/plugins/error-handler.js.map +1 -1
  65. package/dist/http/plugins/openapi.js +18 -2
  66. package/dist/http/plugins/openapi.js.map +1 -1
  67. package/dist/http/plugins/platform.d.ts +7 -0
  68. package/dist/http/plugins/platform.js +13 -0
  69. package/dist/http/plugins/platform.js.map +1 -0
  70. package/dist/http/routes/access.js +54 -36
  71. package/dist/http/routes/access.js.map +1 -1
  72. package/dist/http/routes/activities.js +45 -45
  73. package/dist/http/routes/activities.js.map +1 -1
  74. package/dist/http/routes/assets.js +30 -65
  75. package/dist/http/routes/assets.js.map +1 -1
  76. package/dist/http/routes/automations.js +37 -42
  77. package/dist/http/routes/automations.js.map +1 -1
  78. package/dist/http/routes/bundles.js +33 -36
  79. package/dist/http/routes/bundles.js.map +1 -1
  80. package/dist/http/routes/communities.js +144 -136
  81. package/dist/http/routes/communities.js.map +1 -1
  82. package/dist/http/routes/community-moderation.js +83 -137
  83. package/dist/http/routes/community-moderation.js.map +1 -1
  84. package/dist/http/routes/course-analytics.js +32 -15
  85. package/dist/http/routes/course-analytics.js.map +1 -1
  86. package/dist/http/routes/courses.js +25 -32
  87. package/dist/http/routes/courses.js.map +1 -1
  88. package/dist/http/routes/dashboard.js +9 -9
  89. package/dist/http/routes/dashboard.js.map +1 -1
  90. package/dist/http/routes/discussion.js +21 -39
  91. package/dist/http/routes/discussion.js.map +1 -1
  92. package/dist/http/routes/downloads.js +41 -47
  93. package/dist/http/routes/downloads.js.map +1 -1
  94. package/dist/http/routes/entitlements.js +19 -23
  95. package/dist/http/routes/entitlements.js.map +1 -1
  96. package/dist/http/routes/events.d.ts +7 -0
  97. package/dist/http/routes/events.js +333 -0
  98. package/dist/http/routes/events.js.map +1 -0
  99. package/dist/http/routes/integrations.js +40 -73
  100. package/dist/http/routes/integrations.js.map +1 -1
  101. package/dist/http/routes/member/assets.js +10 -13
  102. package/dist/http/routes/member/assets.js.map +1 -1
  103. package/dist/http/routes/member/chats.js +177 -75
  104. package/dist/http/routes/member/chats.js.map +1 -1
  105. package/dist/http/routes/member/comments.js +65 -26
  106. package/dist/http/routes/member/comments.js.map +1 -1
  107. package/dist/http/routes/member/community.js +68 -51
  108. package/dist/http/routes/member/community.js.map +1 -1
  109. package/dist/http/routes/member/courses.js +12 -19
  110. package/dist/http/routes/member/courses.js.map +1 -1
  111. package/dist/http/routes/member/devices.d.ts +7 -0
  112. package/dist/http/routes/member/devices.js +97 -0
  113. package/dist/http/routes/member/devices.js.map +1 -0
  114. package/dist/http/routes/member/downloads.js +6 -9
  115. package/dist/http/routes/member/downloads.js.map +1 -1
  116. package/dist/http/routes/member/events.d.ts +7 -0
  117. package/dist/http/routes/member/events.js +386 -0
  118. package/dist/http/routes/member/events.js.map +1 -0
  119. package/dist/http/routes/member/files.js +71 -46
  120. package/dist/http/routes/member/files.js.map +1 -1
  121. package/dist/http/routes/member/index.js +6 -0
  122. package/dist/http/routes/member/index.js.map +1 -1
  123. package/dist/http/routes/member/notification-settings.d.ts +7 -0
  124. package/dist/http/routes/member/notification-settings.js +100 -0
  125. package/dist/http/routes/member/notification-settings.js.map +1 -0
  126. package/dist/http/routes/member/notifications.js +69 -45
  127. package/dist/http/routes/member/notifications.js.map +1 -1
  128. package/dist/http/routes/member/org.js +5 -15
  129. package/dist/http/routes/member/org.js.map +1 -1
  130. package/dist/http/routes/member/posts.js +94 -95
  131. package/dist/http/routes/member/posts.js.map +1 -1
  132. package/dist/http/routes/member/profile.js +15 -6
  133. package/dist/http/routes/member/profile.js.map +1 -1
  134. package/dist/http/routes/member/progress.js +7 -11
  135. package/dist/http/routes/member/progress.js.map +1 -1
  136. package/dist/http/routes/organizations.js +415 -110
  137. package/dist/http/routes/organizations.js.map +1 -1
  138. package/dist/http/routes/platform.d.ts +7 -0
  139. package/dist/http/routes/platform.js +61 -0
  140. package/dist/http/routes/platform.js.map +1 -0
  141. package/dist/http/routes/students.js +12 -75
  142. package/dist/http/routes/students.js.map +1 -1
  143. package/dist/http/routes/webhooks.js +30 -39
  144. package/dist/http/routes/webhooks.js.map +1 -1
  145. package/dist/http/routes.js +9 -0
  146. package/dist/http/routes.js.map +1 -1
  147. package/dist/http/schemas/access.d.ts +346 -64
  148. package/dist/http/schemas/access.js +39 -12
  149. package/dist/http/schemas/access.js.map +1 -1
  150. package/dist/http/schemas/assets.d.ts +13 -8
  151. package/dist/http/schemas/assets.js +6 -5
  152. package/dist/http/schemas/assets.js.map +1 -1
  153. package/dist/http/schemas/automations.d.ts +4 -8
  154. package/dist/http/schemas/chats.d.ts +238 -36
  155. package/dist/http/schemas/chats.js +14 -7
  156. package/dist/http/schemas/chats.js.map +1 -1
  157. package/dist/http/schemas/community.d.ts +140 -33
  158. package/dist/http/schemas/community.js +25 -9
  159. package/dist/http/schemas/community.js.map +1 -1
  160. package/dist/http/schemas/course-analytics.d.ts +51 -1
  161. package/dist/http/schemas/course-analytics.js +19 -1
  162. package/dist/http/schemas/course-analytics.js.map +1 -1
  163. package/dist/http/schemas/dashboard.d.ts +1 -0
  164. package/dist/http/schemas/dashboard.js +2 -1
  165. package/dist/http/schemas/dashboard.js.map +1 -1
  166. package/dist/http/schemas/discussion.d.ts +45 -73
  167. package/dist/http/schemas/discussion.js +16 -4
  168. package/dist/http/schemas/discussion.js.map +1 -1
  169. package/dist/http/schemas/entitlements.d.ts +9 -12
  170. package/dist/http/schemas/entitlements.js +11 -5
  171. package/dist/http/schemas/entitlements.js.map +1 -1
  172. package/dist/http/schemas/events.d.ts +527 -0
  173. package/dist/http/schemas/events.js +64 -0
  174. package/dist/http/schemas/events.js.map +1 -0
  175. package/dist/http/schemas/files.d.ts +15 -5
  176. package/dist/http/schemas/files.js +10 -2
  177. package/dist/http/schemas/files.js.map +1 -1
  178. package/dist/http/schemas/index.d.ts +14 -12
  179. package/dist/http/schemas/index.js +14 -12
  180. package/dist/http/schemas/invites.d.ts +3 -47
  181. package/dist/http/schemas/invites.js +4 -25
  182. package/dist/http/schemas/invites.js.map +1 -1
  183. package/dist/http/schemas/member.d.ts +94 -7
  184. package/dist/http/schemas/member.js +7 -3
  185. package/dist/http/schemas/member.js.map +1 -1
  186. package/dist/http/schemas/members.d.ts +329 -65
  187. package/dist/http/schemas/members.js +67 -25
  188. package/dist/http/schemas/members.js.map +1 -1
  189. package/dist/http/schemas/notifications.d.ts +502 -175
  190. package/dist/http/schemas/notifications.js +148 -28
  191. package/dist/http/schemas/notifications.js.map +1 -1
  192. package/dist/http/schemas/platform.d.ts +37 -0
  193. package/dist/http/schemas/platform.js +19 -0
  194. package/dist/http/schemas/platform.js.map +1 -0
  195. package/dist/http/schemas/posts.d.ts +92 -38
  196. package/dist/http/schemas/posts.js +4 -4
  197. package/dist/http/schemas/posts.js.map +1 -1
  198. package/dist/http/schemas/profile.d.ts +1 -1
  199. package/dist/http/schemas/shared.d.ts +10 -13
  200. package/dist/http/schemas/shared.js +3 -11
  201. package/dist/http/schemas/shared.js.map +1 -1
  202. package/dist/http/schemas/students.d.ts +22 -0
  203. package/dist/http/schemas/students.js +3 -1
  204. package/dist/http/schemas/students.js.map +1 -1
  205. package/dist/http/scope.d.ts +9 -12
  206. package/dist/http/scope.js +30 -35
  207. package/dist/http/scope.js.map +1 -1
  208. package/dist/http/server.js +9 -0
  209. package/dist/http/server.js.map +1 -1
  210. package/dist/http/shutdown.d.ts +11 -0
  211. package/dist/http/shutdown.js +40 -0
  212. package/dist/http/shutdown.js.map +1 -0
  213. package/dist/http/sse.d.ts +19 -0
  214. package/dist/http/sse.js +104 -0
  215. package/dist/http/sse.js.map +1 -0
  216. package/dist/http/test-caller.d.ts +13 -0
  217. package/dist/http/test-caller.js +14 -0
  218. package/dist/http/test-caller.js.map +1 -0
  219. package/dist/http/well-known.js +2 -2
  220. package/dist/http/well-known.js.map +1 -1
  221. package/dist/index.d.ts +5 -2
  222. package/dist/index.js +4 -2
  223. package/dist/index.js.map +1 -1
  224. package/dist/packages/server/package.js +1 -1
  225. package/package.json +7 -6
  226. package/dist/http/routes/member/actor.d.ts +0 -14
  227. package/dist/http/routes/member/actor.js +0 -11
  228. package/dist/http/routes/member/actor.js.map +0 -1
@@ -1,172 +1,157 @@
1
1
  import { CommunitiesQuery, CommunityIdParam, CommunitySpaceParam, CreateCommunity, CreateSpace, OrderedIds, PatchDmSettings, SetSpaceTopics, SpaceLinkBody, SpaceLinkParam, UpdateCommunity, UpdateSpace } from "../../schemas/community.js";
2
2
  import "../../schemas/index.js";
3
- import { actor, defineTool } from "../tool.js";
3
+ import { defineTool } from "../tool.js";
4
4
  //#region src/http/mcp/tools/communities.ts
5
5
  const communityTools = [
6
6
  defineTool({
7
7
  name: "list_communities",
8
8
  title: "List communities",
9
9
  description: "Search and page through the communities, drafts included, each with its status and direct-message settings. Filter by status, search by title.",
10
- scope: "communities:read",
11
10
  kind: "read",
12
11
  idempotent: true,
13
12
  openWorld: false,
14
13
  input: CommunitiesQuery,
15
- call: (input, { container, scope }) => container.content.listCommunities(scope.orgId, input)
14
+ call: (input, { container, caller }) => container.content.listCommunities(input, caller.actor)
16
15
  }),
17
16
  defineTool({
18
17
  name: "list_spaces",
19
18
  title: "List spaces",
20
19
  description: "The spaces of a community, in order, each with its access rule, topics and links.",
21
- scope: "communities:read",
22
20
  kind: "read",
23
21
  idempotent: true,
24
22
  openWorld: false,
25
23
  input: CommunityIdParam,
26
- call: ({ communityId }, { container, scope }) => container.content.listSpaces(scope.orgId, communityId)
24
+ call: ({ communityId }, { container, caller }) => container.content.listSpaces(communityId, caller.actor)
27
25
  }),
28
26
  defineTool({
29
27
  name: "create_community",
30
28
  title: "Create community",
31
29
  description: "Create a draft community with the default direct-message settings and no spaces. Add spaces with create_space and publish it with update_community.",
32
- scope: "communities:write",
33
30
  kind: "write",
34
31
  idempotent: false,
35
32
  openWorld: false,
36
33
  input: CreateCommunity,
37
- call: (input, { container, scope }) => container.content.createCommunity(scope.orgId, input, actor(scope))
34
+ call: (input, { container, caller }) => container.content.createCommunity(input, caller.actor)
38
35
  }),
39
36
  defineTool({
40
37
  name: "update_community",
41
38
  title: "Update community",
42
39
  description: "Change a community title, description or cover image, or publish and unpublish it with status. The cover must be a ready image from list_media; null clears it. Fields left out stay as they are.",
43
- scope: "communities:write",
44
40
  kind: "write",
45
41
  idempotent: true,
46
42
  openWorld: false,
47
43
  input: UpdateCommunity.extend(CommunityIdParam.shape),
48
- call: ({ communityId, ...input }, { container, scope }) => container.content.updateCommunity(scope.orgId, communityId, input, actor(scope))
44
+ call: ({ communityId, ...input }, { container, caller }) => container.content.updateCommunity(communityId, input, caller.actor)
49
45
  }),
50
46
  defineTool({
51
47
  name: "update_community_messaging",
52
48
  title: "Update community messaging",
53
49
  description: "Change the direct-message settings of a community: who may message whom from now on. Settings left out stay as they are.",
54
- scope: "communities:write",
55
50
  kind: "write",
56
51
  idempotent: true,
57
52
  openWorld: false,
58
53
  input: PatchDmSettings.extend(CommunityIdParam.shape),
59
- call: ({ communityId, ...input }, { container, scope }) => container.content.patchDmSettings(scope.orgId, communityId, input, actor(scope))
54
+ call: ({ communityId, ...input }, { container, caller }) => container.content.patchCommunitySettings(communityId, input, caller.actor)
60
55
  }),
61
56
  defineTool({
62
57
  name: "create_space",
63
58
  title: "Create space",
64
59
  description: "Add a space at the end of a community. Its access rule decides who can open it: all members, by request or by invite. A space open to all members cannot have a capacity.",
65
- scope: "communities:write",
66
60
  kind: "write",
67
61
  idempotent: false,
68
62
  openWorld: false,
69
63
  input: CreateSpace.extend(CommunityIdParam.shape),
70
- call: ({ communityId, ...input }, { container, scope }) => container.content.createSpace(scope.orgId, communityId, input, actor(scope))
64
+ call: ({ communityId, ...input }, { container, caller }) => container.content.createSpace(communityId, input, caller.actor)
71
65
  }),
72
66
  defineTool({
73
67
  name: "update_space",
74
68
  title: "Update space",
75
69
  description: "Change a space name, description, access rule, capacity or settings. settings merges into the current settings. Fields left out stay as they are.",
76
- scope: "communities:write",
77
70
  kind: "write",
78
71
  idempotent: true,
79
72
  openWorld: false,
80
73
  input: UpdateSpace.extend(CommunitySpaceParam.shape),
81
- call: ({ communityId, spaceId, ...input }, { container, scope }) => container.content.updateSpace(scope.orgId, communityId, spaceId, input, actor(scope))
74
+ call: ({ communityId, spaceId, ...input }, { container, caller }) => container.content.updateSpace(communityId, spaceId, input, caller.actor)
82
75
  }),
83
76
  defineTool({
84
77
  name: "reorder_spaces",
85
78
  title: "Reorder spaces",
86
79
  description: "Set the space order of a community. Pass every space id of the community in the new order.",
87
- scope: "communities:write",
88
80
  kind: "write",
89
81
  idempotent: true,
90
82
  openWorld: false,
91
83
  input: OrderedIds.extend(CommunityIdParam.shape),
92
- call: ({ communityId, ids }, { container, scope }) => container.content.reorderSpaces(scope.orgId, communityId, ids, actor(scope))
84
+ call: ({ communityId, ids }, { container, caller }) => container.content.reorderSpaces(communityId, ids, caller.actor)
93
85
  }),
94
86
  defineTool({
95
87
  name: "set_space_topics",
96
88
  title: "Set space topics",
97
89
  description: "Replace the topics of a space. An entry with an id keeps and renames that topic, one without adds a topic, and a topic left out is deleted. A topic that posts use cannot be deleted.",
98
- scope: "communities:write",
99
90
  kind: "write",
100
91
  idempotent: true,
101
92
  openWorld: false,
102
93
  input: SetSpaceTopics.extend(CommunitySpaceParam.shape),
103
- call: ({ communityId, spaceId, ...input }, { container, scope }) => container.content.setSpaceTopics(scope.orgId, communityId, spaceId, input, actor(scope))
94
+ call: ({ communityId, spaceId, ...input }, { container, caller }) => container.content.setSpaceTopics(communityId, spaceId, input, caller.actor)
104
95
  }),
105
96
  defineTool({
106
97
  name: "add_space_link",
107
98
  title: "Add space link",
108
99
  description: "Link a course, download or community into a space, after its other links. Returns the space.",
109
- scope: "communities:write",
110
100
  kind: "write",
111
101
  idempotent: false,
112
102
  openWorld: false,
113
103
  input: SpaceLinkBody.extend(CommunitySpaceParam.shape),
114
- call: ({ communityId, spaceId, contentId }, { container, scope }) => container.content.addSpaceLink(scope.orgId, communityId, spaceId, contentId, actor(scope))
104
+ call: ({ communityId, spaceId, contentId }, { container, caller }) => container.content.addSpaceLink(communityId, spaceId, contentId, caller.actor)
115
105
  }),
116
106
  defineTool({
117
107
  name: "reorder_space_links",
118
108
  title: "Reorder space links",
119
109
  description: "Set the link order of a space. Pass every link id of the space in the new order.",
120
- scope: "communities:write",
121
110
  kind: "write",
122
111
  idempotent: true,
123
112
  openWorld: false,
124
113
  input: OrderedIds.extend(CommunitySpaceParam.shape),
125
- call: ({ communityId, spaceId, ids }, { container, scope }) => container.content.reorderSpaceLinks(scope.orgId, communityId, spaceId, ids, actor(scope))
114
+ call: ({ communityId, spaceId, ids }, { container, caller }) => container.content.reorderSpaceLinks(communityId, spaceId, ids, caller.actor)
126
115
  }),
127
116
  defineTool({
128
117
  name: "remove_space_link",
129
118
  title: "Remove space link",
130
119
  description: "Take a link out of a space. The linked content itself is kept. Returns the space.",
131
- scope: "communities:write",
132
120
  kind: "destructive",
133
121
  idempotent: true,
134
122
  openWorld: false,
135
123
  input: SpaceLinkParam,
136
- call: ({ communityId, spaceId, linkId }, { container, scope }) => container.content.removeSpaceLink(scope.orgId, communityId, spaceId, linkId, actor(scope))
124
+ call: ({ communityId, spaceId, linkId }, { container, caller }) => container.content.removeSpaceLink(communityId, spaceId, linkId, caller.actor)
137
125
  }),
138
126
  defineTool({
139
127
  name: "delete_space",
140
128
  title: "Delete space",
141
129
  description: "Permanently delete a space with its posts, comments and members.",
142
- scope: "communities:delete",
143
130
  kind: "destructive",
144
131
  idempotent: true,
145
132
  openWorld: false,
146
133
  input: CommunitySpaceParam,
147
- call: ({ communityId, spaceId }, { container, scope }) => container.content.deleteSpace(scope.orgId, communityId, spaceId, actor(scope))
134
+ call: ({ communityId, spaceId }, { container, caller }) => container.content.deleteSpace(communityId, spaceId, caller.actor)
148
135
  }),
149
136
  defineTool({
150
137
  name: "delete_community",
151
138
  title: "Delete community",
152
139
  description: "Permanently delete a community with its spaces. Links to it from other spaces are removed.",
153
- scope: "communities:delete",
154
140
  kind: "destructive",
155
141
  idempotent: true,
156
142
  openWorld: false,
157
143
  input: CommunityIdParam,
158
- call: ({ communityId }, { container, scope }) => container.content.deleteCommunity(scope.orgId, communityId, actor(scope))
144
+ call: ({ communityId }, { container, caller }) => container.content.deleteCommunity(communityId, caller.actor)
159
145
  }),
160
146
  defineTool({
161
147
  name: "get_community_analytics",
162
148
  title: "Get community analytics",
163
149
  description: "Membership, activity and moderation counts for one community.",
164
- scope: "analytics:read",
165
150
  kind: "read",
166
151
  idempotent: true,
167
152
  openWorld: false,
168
153
  input: CommunityIdParam,
169
- call: ({ communityId }, { container, scope }) => container.reporting.admin.communityAnalytics(scope.orgId, communityId)
154
+ call: ({ communityId }, { container, caller }) => container.reporting.admin.communityAnalytics(communityId, caller.actor)
170
155
  })
171
156
  ];
172
157
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"communities.js","names":[],"sources":["../../../../src/http/mcp/tools/communities.ts"],"sourcesContent":["import {\n CommunitiesQuery,\n CommunityIdParam,\n CommunitySpaceParam,\n CreateCommunity,\n CreateSpace,\n OrderedIds,\n PatchDmSettings,\n SetSpaceTopics,\n SpaceLinkBody,\n SpaceLinkParam,\n UpdateCommunity,\n UpdateSpace,\n} from '../../schemas/index.js';\nimport { actor, defineTool, type Tool } from '../tool.js';\n\nexport const communityTools: Tool[] = [\n defineTool({\n name: 'list_communities',\n title: 'List communities',\n description:\n 'Search and page through the communities, drafts included, each with its status and direct-message settings. Filter by status, search by title.',\n scope: 'communities:read',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunitiesQuery,\n call: (input, { container, scope }) => container.content.listCommunities(scope.orgId, input),\n }),\n defineTool({\n name: 'list_spaces',\n title: 'List spaces',\n description:\n 'The spaces of a community, in order, each with its access rule, topics and links.',\n scope: 'communities:read',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunityIdParam,\n call: ({ communityId }, { container, scope }) =>\n container.content.listSpaces(scope.orgId, communityId),\n }),\n defineTool({\n name: 'create_community',\n title: 'Create community',\n description:\n 'Create a draft community with the default direct-message settings and no spaces. Add spaces with create_space and publish it with update_community.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: false,\n openWorld: false,\n input: CreateCommunity,\n call: (input, { container, scope }) =>\n container.content.createCommunity(scope.orgId, input, actor(scope)),\n }),\n defineTool({\n name: 'update_community',\n title: 'Update community',\n description:\n 'Change a community title, description or cover image, or publish and unpublish it with status. The cover must be a ready image from list_media; null clears it. Fields left out stay as they are.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: UpdateCommunity.extend(CommunityIdParam.shape),\n call: ({ communityId, ...input }, { container, scope }) =>\n container.content.updateCommunity(scope.orgId, communityId, input, actor(scope)),\n }),\n defineTool({\n name: 'update_community_messaging',\n title: 'Update community messaging',\n description:\n 'Change the direct-message settings of a community: who may message whom from now on. Settings left out stay as they are.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: PatchDmSettings.extend(CommunityIdParam.shape),\n call: ({ communityId, ...input }, { container, scope }) =>\n container.content.patchDmSettings(scope.orgId, communityId, input, actor(scope)),\n }),\n defineTool({\n name: 'create_space',\n title: 'Create space',\n description:\n 'Add a space at the end of a community. Its access rule decides who can open it: all members, by request or by invite. A space open to all members cannot have a capacity.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: false,\n openWorld: false,\n input: CreateSpace.extend(CommunityIdParam.shape),\n call: ({ communityId, ...input }, { container, scope }) =>\n container.content.createSpace(scope.orgId, communityId, input, actor(scope)),\n }),\n defineTool({\n name: 'update_space',\n title: 'Update space',\n description:\n 'Change a space name, description, access rule, capacity or settings. settings merges into the current settings. Fields left out stay as they are.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: UpdateSpace.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, ...input }, { container, scope }) =>\n container.content.updateSpace(scope.orgId, communityId, spaceId, input, actor(scope)),\n }),\n defineTool({\n name: 'reorder_spaces',\n title: 'Reorder spaces',\n description:\n 'Set the space order of a community. Pass every space id of the community in the new order.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: OrderedIds.extend(CommunityIdParam.shape),\n call: ({ communityId, ids }, { container, scope }) =>\n container.content.reorderSpaces(scope.orgId, communityId, ids, actor(scope)),\n }),\n defineTool({\n name: 'set_space_topics',\n title: 'Set space topics',\n description:\n 'Replace the topics of a space. An entry with an id keeps and renames that topic, one without adds a topic, and a topic left out is deleted. A topic that posts use cannot be deleted.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: SetSpaceTopics.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, ...input }, { container, scope }) =>\n container.content.setSpaceTopics(scope.orgId, communityId, spaceId, input, actor(scope)),\n }),\n defineTool({\n name: 'add_space_link',\n title: 'Add space link',\n description:\n 'Link a course, download or community into a space, after its other links. Returns the space.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: false,\n openWorld: false,\n input: SpaceLinkBody.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, contentId }, { container, scope }) =>\n container.content.addSpaceLink(scope.orgId, communityId, spaceId, contentId, actor(scope)),\n }),\n defineTool({\n name: 'reorder_space_links',\n title: 'Reorder space links',\n description: 'Set the link order of a space. Pass every link id of the space in the new order.',\n scope: 'communities:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: OrderedIds.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, ids }, { container, scope }) =>\n container.content.reorderSpaceLinks(scope.orgId, communityId, spaceId, ids, actor(scope)),\n }),\n defineTool({\n name: 'remove_space_link',\n title: 'Remove space link',\n description:\n 'Take a link out of a space. The linked content itself is kept. Returns the space.',\n scope: 'communities:write',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: SpaceLinkParam,\n call: ({ communityId, spaceId, linkId }, { container, scope }) =>\n container.content.removeSpaceLink(scope.orgId, communityId, spaceId, linkId, actor(scope)),\n }),\n defineTool({\n name: 'delete_space',\n title: 'Delete space',\n description: 'Permanently delete a space with its posts, comments and members.',\n scope: 'communities:delete',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunitySpaceParam,\n call: ({ communityId, spaceId }, { container, scope }) =>\n container.content.deleteSpace(scope.orgId, communityId, spaceId, actor(scope)),\n }),\n defineTool({\n name: 'delete_community',\n title: 'Delete community',\n description:\n 'Permanently delete a community with its spaces. Links to it from other spaces are removed.',\n scope: 'communities:delete',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunityIdParam,\n call: ({ communityId }, { container, scope }) =>\n container.content.deleteCommunity(scope.orgId, communityId, actor(scope)),\n }),\n defineTool({\n name: 'get_community_analytics',\n title: 'Get community analytics',\n description: 'Membership, activity and moderation counts for one community.',\n scope: 'analytics:read',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunityIdParam,\n call: ({ communityId }, { container, scope }) =>\n container.reporting.admin.communityAnalytics(scope.orgId, communityId),\n }),\n];\n"],"mappings":"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"}
1
+ {"version":3,"file":"communities.js","names":[],"sources":["../../../../src/http/mcp/tools/communities.ts"],"sourcesContent":["import {\n CommunitiesQuery,\n CommunityIdParam,\n CommunitySpaceParam,\n CreateCommunity,\n CreateSpace,\n OrderedIds,\n PatchDmSettings,\n SetSpaceTopics,\n SpaceLinkBody,\n SpaceLinkParam,\n UpdateCommunity,\n UpdateSpace,\n} from '../../schemas/index.js';\nimport { defineTool, type Tool } from '../tool.js';\n\nexport const communityTools: Tool[] = [\n defineTool({\n name: 'list_communities',\n title: 'List communities',\n description:\n 'Search and page through the communities, drafts included, each with its status and direct-message settings. Filter by status, search by title.',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunitiesQuery,\n call: (input, { container, caller }) => container.content.listCommunities(input, caller.actor),\n }),\n defineTool({\n name: 'list_spaces',\n title: 'List spaces',\n description:\n 'The spaces of a community, in order, each with its access rule, topics and links.',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunityIdParam,\n call: ({ communityId }, { container, caller }) =>\n container.content.listSpaces(communityId, caller.actor),\n }),\n defineTool({\n name: 'create_community',\n title: 'Create community',\n description:\n 'Create a draft community with the default direct-message settings and no spaces. Add spaces with create_space and publish it with update_community.',\n kind: 'write',\n idempotent: false,\n openWorld: false,\n input: CreateCommunity,\n call: (input, { container, caller }) => container.content.createCommunity(input, caller.actor),\n }),\n defineTool({\n name: 'update_community',\n title: 'Update community',\n description:\n 'Change a community title, description or cover image, or publish and unpublish it with status. The cover must be a ready image from list_media; null clears it. Fields left out stay as they are.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: UpdateCommunity.extend(CommunityIdParam.shape),\n call: ({ communityId, ...input }, { container, caller }) =>\n container.content.updateCommunity(communityId, input, caller.actor),\n }),\n defineTool({\n name: 'update_community_messaging',\n title: 'Update community messaging',\n description:\n 'Change the direct-message settings of a community: who may message whom from now on. Settings left out stay as they are.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: PatchDmSettings.extend(CommunityIdParam.shape),\n call: ({ communityId, ...input }, { container, caller }) =>\n container.content.patchCommunitySettings(communityId, input, caller.actor),\n }),\n defineTool({\n name: 'create_space',\n title: 'Create space',\n description:\n 'Add a space at the end of a community. Its access rule decides who can open it: all members, by request or by invite. A space open to all members cannot have a capacity.',\n kind: 'write',\n idempotent: false,\n openWorld: false,\n input: CreateSpace.extend(CommunityIdParam.shape),\n call: ({ communityId, ...input }, { container, caller }) =>\n container.content.createSpace(communityId, input, caller.actor),\n }),\n defineTool({\n name: 'update_space',\n title: 'Update space',\n description:\n 'Change a space name, description, access rule, capacity or settings. settings merges into the current settings. Fields left out stay as they are.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: UpdateSpace.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, ...input }, { container, caller }) =>\n container.content.updateSpace(communityId, spaceId, input, caller.actor),\n }),\n defineTool({\n name: 'reorder_spaces',\n title: 'Reorder spaces',\n description:\n 'Set the space order of a community. Pass every space id of the community in the new order.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: OrderedIds.extend(CommunityIdParam.shape),\n call: ({ communityId, ids }, { container, caller }) =>\n container.content.reorderSpaces(communityId, ids, caller.actor),\n }),\n defineTool({\n name: 'set_space_topics',\n title: 'Set space topics',\n description:\n 'Replace the topics of a space. An entry with an id keeps and renames that topic, one without adds a topic, and a topic left out is deleted. A topic that posts use cannot be deleted.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: SetSpaceTopics.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, ...input }, { container, caller }) =>\n container.content.setSpaceTopics(communityId, spaceId, input, caller.actor),\n }),\n defineTool({\n name: 'add_space_link',\n title: 'Add space link',\n description:\n 'Link a course, download or community into a space, after its other links. Returns the space.',\n kind: 'write',\n idempotent: false,\n openWorld: false,\n input: SpaceLinkBody.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, contentId }, { container, caller }) =>\n container.content.addSpaceLink(communityId, spaceId, contentId, caller.actor),\n }),\n defineTool({\n name: 'reorder_space_links',\n title: 'Reorder space links',\n description: 'Set the link order of a space. Pass every link id of the space in the new order.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: OrderedIds.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, ids }, { container, caller }) =>\n container.content.reorderSpaceLinks(communityId, spaceId, ids, caller.actor),\n }),\n defineTool({\n name: 'remove_space_link',\n title: 'Remove space link',\n description:\n 'Take a link out of a space. The linked content itself is kept. Returns the space.',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: SpaceLinkParam,\n call: ({ communityId, spaceId, linkId }, { container, caller }) =>\n container.content.removeSpaceLink(communityId, spaceId, linkId, caller.actor),\n }),\n defineTool({\n name: 'delete_space',\n title: 'Delete space',\n description: 'Permanently delete a space with its posts, comments and members.',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunitySpaceParam,\n call: ({ communityId, spaceId }, { container, caller }) =>\n container.content.deleteSpace(communityId, spaceId, caller.actor),\n }),\n defineTool({\n name: 'delete_community',\n title: 'Delete community',\n description:\n 'Permanently delete a community with its spaces. Links to it from other spaces are removed.',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunityIdParam,\n call: ({ communityId }, { container, caller }) =>\n container.content.deleteCommunity(communityId, caller.actor),\n }),\n defineTool({\n name: 'get_community_analytics',\n title: 'Get community analytics',\n description: 'Membership, activity and moderation counts for one community.',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunityIdParam,\n call: ({ communityId }, { container, caller }) =>\n container.reporting.admin.communityAnalytics(communityId, caller.actor),\n }),\n];\n"],"mappings":"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"}
@@ -2,85 +2,78 @@ import { PageQuery } from "../../schemas/shared.js";
2
2
  import { CommunityIdParam, CommunityMembersQuery, CommunitySpaceParam, SpaceMemberParam } from "../../schemas/community.js";
3
3
  import { OrgUserBody } from "../../schemas/chats.js";
4
4
  import "../../schemas/index.js";
5
- import { actor, defineTool } from "../tool.js";
5
+ import { defineTool } from "../tool.js";
6
6
  //#region src/http/mcp/tools/community-members.ts
7
7
  const communityMemberTools = [
8
8
  defineTool({
9
9
  name: "list_community_members",
10
10
  title: "List community members",
11
11
  description: "Page through everyone with active access to a community, granted directly or through a bundle. Search by name or email.",
12
- scope: "community_members:read",
13
12
  kind: "read",
14
13
  idempotent: true,
15
14
  openWorld: false,
16
15
  input: CommunityMembersQuery.extend(CommunityIdParam.shape),
17
- call: ({ communityId, ...query }, { container, scope }) => container.reporting.admin.communityMembers(scope.orgId, communityId, query)
16
+ call: ({ communityId, ...query }, { container, caller }) => container.reporting.admin.communityMembers(communityId, query, caller.actor)
18
17
  }),
19
18
  defineTool({
20
19
  name: "list_space_members",
21
20
  title: "List space members",
22
- description: "Page through a space's members, its open requests to join and its open invitations.",
23
- scope: "community_members:read",
21
+ description: "Page through the members of a space you can open. Community moderators also see its open requests to join and open invitations. People who open every space through their role are not listed.",
24
22
  kind: "read",
25
23
  idempotent: true,
26
24
  openWorld: false,
27
25
  input: PageQuery.extend(CommunitySpaceParam.shape),
28
- call: ({ communityId, spaceId, ...page }, { container, scope }) => container.entitlements.listSpaceMembers(scope.orgId, actor(scope), communityId, spaceId, page)
26
+ call: ({ communityId, spaceId, ...page }, { container, caller }) => container.entitlements.listSpaceMembers(communityId, spaceId, page, caller.actor)
29
27
  }),
30
28
  defineTool({
31
29
  name: "add_space_member",
32
30
  title: "Add space member",
33
31
  description: "Place a member of the community straight into a space, with no request or invitation. Not for a space open to all members, or one that is full.",
34
- scope: "community_members:write",
35
32
  kind: "write",
36
33
  idempotent: false,
37
34
  openWorld: false,
38
35
  input: OrgUserBody.extend(CommunitySpaceParam.shape),
39
- call: ({ communityId, spaceId, orgUserId }, { container, scope }) => container.entitlements.addSpaceMember(scope.orgId, actor(scope), communityId, spaceId, orgUserId)
36
+ call: ({ communityId, spaceId, orgUserId }, { container, caller }) => container.entitlements.addSpaceMember(communityId, spaceId, orgUserId, caller.actor)
40
37
  }),
41
38
  defineTool({
42
39
  name: "invite_space_member",
43
40
  title: "Invite space member",
44
41
  description: "Invite a member of the community into an invite-only space. They are notified and join when they accept.",
45
- scope: "community_members:write",
46
42
  kind: "write",
47
43
  idempotent: false,
48
44
  openWorld: true,
49
45
  input: OrgUserBody.extend(CommunitySpaceParam.shape),
50
- call: ({ communityId, spaceId, orgUserId }, { container, scope }) => container.entitlements.invite(scope.orgId, actor(scope), communityId, spaceId, orgUserId)
46
+ call: ({ communityId, spaceId, orgUserId }, { container, caller }) => container.entitlements.invite(communityId, spaceId, orgUserId, caller.actor)
51
47
  }),
52
48
  defineTool({
53
49
  name: "approve_space_request",
54
50
  title: "Approve space request",
55
51
  description: "Approve a person's request to join a space. Not when the space is full.",
56
- scope: "community_members:write",
57
52
  kind: "write",
58
53
  idempotent: true,
59
54
  openWorld: false,
60
55
  input: SpaceMemberParam,
61
- call: ({ communityId, spaceId, orgUserId }, { container, scope }) => container.entitlements.approve(scope.orgId, actor(scope), communityId, spaceId, orgUserId)
56
+ call: ({ communityId, spaceId, orgUserId }, { container, caller }) => container.entitlements.approve(communityId, spaceId, orgUserId, caller.actor)
62
57
  }),
63
58
  defineTool({
64
59
  name: "decline_space_request",
65
60
  title: "Decline space request",
66
61
  description: "Decline a person's request to join a space.",
67
- scope: "community_members:write",
68
62
  kind: "write",
69
63
  idempotent: true,
70
64
  openWorld: false,
71
65
  input: SpaceMemberParam,
72
- call: ({ communityId, spaceId, orgUserId }, { container, scope }) => container.entitlements.decline(scope.orgId, actor(scope), communityId, spaceId, orgUserId)
66
+ call: ({ communityId, spaceId, orgUserId }, { container, caller }) => container.entitlements.decline(communityId, spaceId, orgUserId, caller.actor)
73
67
  }),
74
68
  defineTool({
75
69
  name: "remove_space_member",
76
70
  title: "Remove space member",
77
71
  description: "Remove a person from a space, whether they are a member, asked to join or were invited. Their access to the community stays. Not for a space open to all members.",
78
- scope: "community_members:write",
79
72
  kind: "destructive",
80
73
  idempotent: true,
81
74
  openWorld: false,
82
75
  input: SpaceMemberParam,
83
- call: ({ communityId, spaceId, orgUserId }, { container, scope }) => container.entitlements.remove(scope.orgId, actor(scope), communityId, spaceId, orgUserId)
76
+ call: ({ communityId, spaceId, orgUserId }, { container, caller }) => container.entitlements.remove(communityId, spaceId, orgUserId, caller.actor)
84
77
  })
85
78
  ];
86
79
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"community-members.js","names":[],"sources":["../../../../src/http/mcp/tools/community-members.ts"],"sourcesContent":["import {\n CommunityIdParam,\n CommunityMembersQuery,\n CommunitySpaceParam,\n OrgUserBody,\n PageQuery,\n SpaceMemberParam,\n} from '../../schemas/index.js';\nimport { actor, defineTool, type Tool } from '../tool.js';\n\nexport const communityMemberTools: Tool[] = [\n defineTool({\n name: 'list_community_members',\n title: 'List community members',\n description:\n 'Page through everyone with active access to a community, granted directly or through a bundle. Search by name or email.',\n scope: 'community_members:read',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunityMembersQuery.extend(CommunityIdParam.shape),\n call: ({ communityId, ...query }, { container, scope }) =>\n container.reporting.admin.communityMembers(scope.orgId, communityId, query),\n }),\n defineTool({\n name: 'list_space_members',\n title: 'List space members',\n description:\n \"Page through a space's members, its open requests to join and its open invitations.\",\n scope: 'community_members:read',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: PageQuery.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, ...page }, { container, scope }) =>\n container.entitlements.listSpaceMembers(\n scope.orgId,\n actor(scope),\n communityId,\n spaceId,\n page,\n ),\n }),\n defineTool({\n name: 'add_space_member',\n title: 'Add space member',\n description:\n 'Place a member of the community straight into a space, with no request or invitation. Not for a space open to all members, or one that is full.',\n scope: 'community_members:write',\n kind: 'write',\n idempotent: false,\n openWorld: false,\n input: OrgUserBody.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, orgUserId }, { container, scope }) =>\n container.entitlements.addSpaceMember(\n scope.orgId,\n actor(scope),\n communityId,\n spaceId,\n orgUserId,\n ),\n }),\n defineTool({\n name: 'invite_space_member',\n title: 'Invite space member',\n description:\n 'Invite a member of the community into an invite-only space. They are notified and join when they accept.',\n scope: 'community_members:write',\n kind: 'write',\n idempotent: false,\n openWorld: true,\n input: OrgUserBody.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, orgUserId }, { container, scope }) =>\n container.entitlements.invite(scope.orgId, actor(scope), communityId, spaceId, orgUserId),\n }),\n defineTool({\n name: 'approve_space_request',\n title: 'Approve space request',\n description: \"Approve a person's request to join a space. Not when the space is full.\",\n scope: 'community_members:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: SpaceMemberParam,\n call: ({ communityId, spaceId, orgUserId }, { container, scope }) =>\n container.entitlements.approve(scope.orgId, actor(scope), communityId, spaceId, orgUserId),\n }),\n defineTool({\n name: 'decline_space_request',\n title: 'Decline space request',\n description: \"Decline a person's request to join a space.\",\n scope: 'community_members:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: SpaceMemberParam,\n call: ({ communityId, spaceId, orgUserId }, { container, scope }) =>\n container.entitlements.decline(scope.orgId, actor(scope), communityId, spaceId, orgUserId),\n }),\n defineTool({\n name: 'remove_space_member',\n title: 'Remove space member',\n description:\n 'Remove a person from a space, whether they are a member, asked to join or were invited. Their access to the community stays. Not for a space open to all members.',\n scope: 'community_members:write',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: SpaceMemberParam,\n call: ({ communityId, spaceId, orgUserId }, { container, scope }) =>\n container.entitlements.remove(scope.orgId, actor(scope), communityId, spaceId, orgUserId),\n }),\n];\n"],"mappings":";;;;;;AAUA,MAAa,uBAA+B;CAC1C,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,OAAO;EACP,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO,sBAAsB,OAAO,iBAAiB,KAAK;EAC1D,OAAO,EAAE,aAAa,GAAG,SAAS,EAAE,WAAW,YAC7C,UAAU,UAAU,MAAM,iBAAiB,MAAM,OAAO,aAAa,KAAK;CAC9E,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,OAAO;EACP,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO,UAAU,OAAO,oBAAoB,KAAK;EACjD,OAAO,EAAE,aAAa,SAAS,GAAG,QAAQ,EAAE,WAAW,YACrD,UAAU,aAAa,iBACrB,MAAM,OACN,MAAM,KAAK,GACX,aACA,SACA,IACF;CACJ,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,OAAO;EACP,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO,YAAY,OAAO,oBAAoB,KAAK;EACnD,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,YACvD,UAAU,aAAa,eACrB,MAAM,OACN,MAAM,KAAK,GACX,aACA,SACA,SACF;CACJ,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,OAAO;EACP,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO,YAAY,OAAO,oBAAoB,KAAK;EACnD,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,YACvD,UAAU,aAAa,OAAO,MAAM,OAAO,MAAM,KAAK,GAAG,aAAa,SAAS,SAAS;CAC5F,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aAAa;EACb,OAAO;EACP,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO;EACP,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,YACvD,UAAU,aAAa,QAAQ,MAAM,OAAO,MAAM,KAAK,GAAG,aAAa,SAAS,SAAS;CAC7F,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aAAa;EACb,OAAO;EACP,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO;EACP,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,YACvD,UAAU,aAAa,QAAQ,MAAM,OAAO,MAAM,KAAK,GAAG,aAAa,SAAS,SAAS;CAC7F,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,OAAO;EACP,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO;EACP,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,YACvD,UAAU,aAAa,OAAO,MAAM,OAAO,MAAM,KAAK,GAAG,aAAa,SAAS,SAAS;CAC5F,CAAC;AACH"}
1
+ {"version":3,"file":"community-members.js","names":[],"sources":["../../../../src/http/mcp/tools/community-members.ts"],"sourcesContent":["import {\n CommunityIdParam,\n CommunityMembersQuery,\n CommunitySpaceParam,\n OrgUserBody,\n PageQuery,\n SpaceMemberParam,\n} from '../../schemas/index.js';\nimport { defineTool, type Tool } from '../tool.js';\n\nexport const communityMemberTools: Tool[] = [\n defineTool({\n name: 'list_community_members',\n title: 'List community members',\n description:\n 'Page through everyone with active access to a community, granted directly or through a bundle. Search by name or email.',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunityMembersQuery.extend(CommunityIdParam.shape),\n call: ({ communityId, ...query }, { container, caller }) =>\n container.reporting.admin.communityMembers(communityId, query, caller.actor),\n }),\n defineTool({\n name: 'list_space_members',\n title: 'List space members',\n description:\n 'Page through the members of a space you can open. Community moderators also see its open requests to join and open invitations. People who open every space through their role are not listed.',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: PageQuery.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, ...page }, { container, caller }) =>\n container.entitlements.listSpaceMembers(communityId, spaceId, page, caller.actor),\n }),\n defineTool({\n name: 'add_space_member',\n title: 'Add space member',\n description:\n 'Place a member of the community straight into a space, with no request or invitation. Not for a space open to all members, or one that is full.',\n kind: 'write',\n idempotent: false,\n openWorld: false,\n input: OrgUserBody.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, orgUserId }, { container, caller }) =>\n container.entitlements.addSpaceMember(communityId, spaceId, orgUserId, caller.actor),\n }),\n defineTool({\n name: 'invite_space_member',\n title: 'Invite space member',\n description:\n 'Invite a member of the community into an invite-only space. They are notified and join when they accept.',\n kind: 'write',\n idempotent: false,\n openWorld: true,\n input: OrgUserBody.extend(CommunitySpaceParam.shape),\n call: ({ communityId, spaceId, orgUserId }, { container, caller }) =>\n container.entitlements.invite(communityId, spaceId, orgUserId, caller.actor),\n }),\n defineTool({\n name: 'approve_space_request',\n title: 'Approve space request',\n description: \"Approve a person's request to join a space. Not when the space is full.\",\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: SpaceMemberParam,\n call: ({ communityId, spaceId, orgUserId }, { container, caller }) =>\n container.entitlements.approve(communityId, spaceId, orgUserId, caller.actor),\n }),\n defineTool({\n name: 'decline_space_request',\n title: 'Decline space request',\n description: \"Decline a person's request to join a space.\",\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: SpaceMemberParam,\n call: ({ communityId, spaceId, orgUserId }, { container, caller }) =>\n container.entitlements.decline(communityId, spaceId, orgUserId, caller.actor),\n }),\n defineTool({\n name: 'remove_space_member',\n title: 'Remove space member',\n description:\n 'Remove a person from a space, whether they are a member, asked to join or were invited. Their access to the community stays. Not for a space open to all members.',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: SpaceMemberParam,\n call: ({ communityId, spaceId, orgUserId }, { container, caller }) =>\n container.entitlements.remove(communityId, spaceId, orgUserId, caller.actor),\n }),\n];\n"],"mappings":";;;;;;AAUA,MAAa,uBAA+B;CAC1C,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO,sBAAsB,OAAO,iBAAiB,KAAK;EAC1D,OAAO,EAAE,aAAa,GAAG,SAAS,EAAE,WAAW,aAC7C,UAAU,UAAU,MAAM,iBAAiB,aAAa,OAAO,OAAO,KAAK;CAC/E,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO,UAAU,OAAO,oBAAoB,KAAK;EACjD,OAAO,EAAE,aAAa,SAAS,GAAG,QAAQ,EAAE,WAAW,aACrD,UAAU,aAAa,iBAAiB,aAAa,SAAS,MAAM,OAAO,KAAK;CACpF,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO,YAAY,OAAO,oBAAoB,KAAK;EACnD,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,aACvD,UAAU,aAAa,eAAe,aAAa,SAAS,WAAW,OAAO,KAAK;CACvF,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO,YAAY,OAAO,oBAAoB,KAAK;EACnD,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,aACvD,UAAU,aAAa,OAAO,aAAa,SAAS,WAAW,OAAO,KAAK;CAC/E,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO;EACP,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,aACvD,UAAU,aAAa,QAAQ,aAAa,SAAS,WAAW,OAAO,KAAK;CAChF,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO;EACP,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,aACvD,UAAU,aAAa,QAAQ,aAAa,SAAS,WAAW,OAAO,KAAK;CAChF,CAAC;CACD,WAAW;EACT,MAAM;EACN,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,OAAO;EACP,OAAO,EAAE,aAAa,SAAS,aAAa,EAAE,WAAW,aACvD,UAAU,aAAa,OAAO,aAAa,SAAS,WAAW,OAAO,KAAK;CAC/E,CAAC;AACH"}
@@ -2,140 +2,128 @@ import { CommunityChatParam, CommunityCommentParam, CommunityIdParam, CommunityM
2
2
  import { ResolvePostFlags } from "../../schemas/posts.js";
3
3
  import { ResolveMessageFlags } from "../../schemas/chats.js";
4
4
  import "../../schemas/index.js";
5
- import { actor, defineTool } from "../tool.js";
5
+ import { defineTool } from "../tool.js";
6
6
  //#region src/http/mcp/tools/community-moderation.ts
7
7
  const communityModerationTools = [
8
8
  defineTool({
9
9
  name: "get_space_moderation_queue",
10
10
  title: "Get space moderation queue",
11
11
  description: "The posts awaiting review in a space and the open flags on its posts and comments. Each list holds at most the 100 oldest; working the queue brings in the next ones.",
12
- scope: "community_moderation:read",
13
12
  kind: "read",
14
13
  idempotent: true,
15
14
  openWorld: false,
16
15
  input: CommunitySpaceParam,
17
- call: ({ communityId, spaceId }, { container, scope }) => container.posts.moderationQueue(scope.orgId, actor(scope), communityId, spaceId)
16
+ call: ({ communityId, spaceId }, { container, caller }) => container.posts.moderationQueue(communityId, spaceId, caller.actor)
18
17
  }),
19
18
  defineTool({
20
19
  name: "get_message_moderation_queue",
21
20
  title: "Get message moderation queue",
22
21
  description: "The messages in a community's chats with open flags, with the flags and the chat each is in. Holds at most the 100 oldest open flags.",
23
- scope: "community_moderation:read",
24
22
  kind: "read",
25
23
  idempotent: true,
26
24
  openWorld: false,
27
25
  input: CommunityIdParam,
28
- call: ({ communityId }, { container, scope }) => container.chats.messageQueue(scope.orgId, actor(scope), communityId)
26
+ call: ({ communityId }, { container, caller }) => container.chats.messageQueue(communityId, caller.actor)
29
27
  }),
30
28
  defineTool({
31
29
  name: "approve_post",
32
30
  title: "Approve post",
33
31
  description: "Publish a post that is awaiting review.",
34
- scope: "community_moderation:write",
35
32
  kind: "write",
36
33
  idempotent: true,
37
34
  openWorld: false,
38
35
  input: CommunityPostParam,
39
- call: ({ communityId, postId }, { container, scope }) => container.posts.approve(scope.orgId, postId, actor(scope), communityId)
36
+ call: ({ communityId, postId }, { container, caller }) => container.posts.approve(postId, communityId, caller.actor)
40
37
  }),
41
38
  defineTool({
42
39
  name: "dismiss_post_flags",
43
40
  title: "Dismiss post flags",
44
41
  description: "Close every open flag on a post and leave it up.",
45
- scope: "community_moderation:write",
46
42
  kind: "write",
47
43
  idempotent: true,
48
44
  openWorld: false,
49
45
  input: ResolvePostFlags.extend(CommunityPostParam.shape),
50
- call: ({ communityId, postId, resolution }, { container, scope }) => container.posts.resolveFlags(scope.orgId, postId, actor(scope), resolution, communityId)
46
+ call: ({ communityId, postId, resolution }, { container, caller }) => container.posts.resolveFlags(postId, resolution, communityId, caller.actor)
51
47
  }),
52
48
  defineTool({
53
49
  name: "remove_post",
54
50
  title: "Remove post",
55
51
  description: "Take a published or pending post down and resolve its open flags as removed. restore_post brings it back.",
56
- scope: "community_moderation:write",
57
52
  kind: "destructive",
58
53
  idempotent: true,
59
54
  openWorld: false,
60
55
  input: CommunityPostParam,
61
- call: ({ communityId, postId }, { container, scope }) => container.posts.remove(scope.orgId, postId, actor(scope), communityId)
56
+ call: ({ communityId, postId }, { container, caller }) => container.posts.remove(postId, communityId, caller.actor)
62
57
  }),
63
58
  defineTool({
64
59
  name: "restore_post",
65
60
  title: "Restore post",
66
61
  description: "Put a removed post back up.",
67
- scope: "community_moderation:write",
68
62
  kind: "write",
69
63
  idempotent: true,
70
64
  openWorld: false,
71
65
  input: CommunityPostParam,
72
- call: ({ communityId, postId }, { container, scope }) => container.posts.restore(scope.orgId, postId, actor(scope), communityId)
66
+ call: ({ communityId, postId }, { container, caller }) => container.posts.restore(postId, communityId, caller.actor)
73
67
  }),
74
68
  defineTool({
75
69
  name: "dismiss_post_comment_flags",
76
70
  title: "Dismiss post comment flags",
77
71
  description: "Close every open flag on a comment on a post and leave it up.",
78
- scope: "community_moderation:write",
79
72
  kind: "write",
80
73
  idempotent: true,
81
74
  openWorld: false,
82
75
  input: CommunityCommentParam,
83
- call: ({ communityId, commentId }, { container, scope }) => container.discussion.resolveReports(scope.orgId, commentId, actor(scope), communityId)
76
+ call: ({ communityId, commentId }, { container, caller }) => container.discussion.resolveReports(commentId, { communityId }, caller.actor)
84
77
  }),
85
78
  defineTool({
86
79
  name: "remove_post_comment",
87
80
  title: "Remove post comment",
88
81
  description: "Hide a comment on a post and resolve its open flags as removed. restore_post_comment brings it back.",
89
- scope: "community_moderation:write",
90
82
  kind: "destructive",
91
83
  idempotent: true,
92
84
  openWorld: false,
93
85
  input: CommunityCommentParam,
94
- call: ({ communityId, commentId }, { container, scope }) => container.discussion.remove(scope.orgId, commentId, actor(scope), communityId)
86
+ call: ({ communityId, commentId }, { container, caller }) => container.discussion.remove(commentId, { communityId }, caller.actor)
95
87
  }),
96
88
  defineTool({
97
89
  name: "restore_post_comment",
98
90
  title: "Restore post comment",
99
91
  description: "Publish a removed comment on a post again.",
100
- scope: "community_moderation:write",
101
92
  kind: "write",
102
93
  idempotent: true,
103
94
  openWorld: false,
104
95
  input: CommunityCommentParam,
105
- call: ({ communityId, commentId }, { container, scope }) => container.discussion.restore(scope.orgId, commentId, actor(scope), communityId)
96
+ call: ({ communityId, commentId }, { container, caller }) => container.discussion.restore(commentId, { communityId }, caller.actor)
106
97
  }),
107
98
  defineTool({
108
99
  name: "dismiss_message_flags",
109
100
  title: "Dismiss message flags",
110
101
  description: "Close every open flag on a chat message and leave it up.",
111
- scope: "community_moderation:write",
112
102
  kind: "write",
113
103
  idempotent: true,
114
104
  openWorld: false,
115
105
  input: ResolveMessageFlags.extend(CommunityMessageParam.shape),
116
- call: ({ communityId, messageId, resolution }, { container, scope }) => container.chats.resolveMessageFlags(scope.orgId, actor(scope), messageId, resolution, communityId)
106
+ call: ({ communityId, messageId, resolution }, { container, caller }) => container.chats.resolveMessageFlags(messageId, resolution, communityId, caller.actor)
117
107
  }),
118
108
  defineTool({
119
109
  name: "lock_chat",
120
110
  title: "Lock chat",
121
111
  description: "Stop everyone sending or editing messages in a chat until it is unlocked. Its open message flags are resolved as locked.",
122
- scope: "community_moderation:write",
123
112
  kind: "destructive",
124
113
  idempotent: true,
125
114
  openWorld: false,
126
115
  input: CommunityChatParam,
127
- call: ({ communityId, chatId }, { container, scope }) => container.chats.lock(scope.orgId, actor(scope), chatId, communityId)
116
+ call: ({ communityId, chatId }, { container, caller }) => container.chats.lock(chatId, communityId, caller.actor)
128
117
  }),
129
118
  defineTool({
130
119
  name: "unlock_chat",
131
120
  title: "Unlock chat",
132
121
  description: "Let the participants of a locked chat send messages again.",
133
- scope: "community_moderation:write",
134
122
  kind: "write",
135
123
  idempotent: true,
136
124
  openWorld: false,
137
125
  input: CommunityChatParam,
138
- call: ({ communityId, chatId }, { container, scope }) => container.chats.unlock(scope.orgId, actor(scope), chatId, communityId)
126
+ call: ({ communityId, chatId }, { container, caller }) => container.chats.unlock(chatId, communityId, caller.actor)
139
127
  })
140
128
  ];
141
129
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"community-moderation.js","names":[],"sources":["../../../../src/http/mcp/tools/community-moderation.ts"],"sourcesContent":["import {\n CommunityChatParam,\n CommunityCommentParam,\n CommunityIdParam,\n CommunityMessageParam,\n CommunityPostParam,\n CommunitySpaceParam,\n ResolveMessageFlags,\n ResolvePostFlags,\n} from '../../schemas/index.js';\nimport { actor, defineTool, type Tool } from '../tool.js';\n\nexport const communityModerationTools: Tool[] = [\n defineTool({\n name: 'get_space_moderation_queue',\n title: 'Get space moderation queue',\n description:\n 'The posts awaiting review in a space and the open flags on its posts and comments. Each list holds at most the 100 oldest; working the queue brings in the next ones.',\n scope: 'community_moderation:read',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunitySpaceParam,\n call: ({ communityId, spaceId }, { container, scope }) =>\n container.posts.moderationQueue(scope.orgId, actor(scope), communityId, spaceId),\n }),\n defineTool({\n name: 'get_message_moderation_queue',\n title: 'Get message moderation queue',\n description:\n \"The messages in a community's chats with open flags, with the flags and the chat each is in. Holds at most the 100 oldest open flags.\",\n scope: 'community_moderation:read',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunityIdParam,\n call: ({ communityId }, { container, scope }) =>\n container.chats.messageQueue(scope.orgId, actor(scope), communityId),\n }),\n defineTool({\n name: 'approve_post',\n title: 'Approve post',\n description: 'Publish a post that is awaiting review.',\n scope: 'community_moderation:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityPostParam,\n call: ({ communityId, postId }, { container, scope }) =>\n container.posts.approve(scope.orgId, postId, actor(scope), communityId),\n }),\n defineTool({\n name: 'dismiss_post_flags',\n title: 'Dismiss post flags',\n description: 'Close every open flag on a post and leave it up.',\n scope: 'community_moderation:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: ResolvePostFlags.extend(CommunityPostParam.shape),\n call: ({ communityId, postId, resolution }, { container, scope }) =>\n container.posts.resolveFlags(scope.orgId, postId, actor(scope), resolution, communityId),\n }),\n defineTool({\n name: 'remove_post',\n title: 'Remove post',\n description:\n 'Take a published or pending post down and resolve its open flags as removed. restore_post brings it back.',\n scope: 'community_moderation:write',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunityPostParam,\n call: ({ communityId, postId }, { container, scope }) =>\n container.posts.remove(scope.orgId, postId, actor(scope), communityId),\n }),\n defineTool({\n name: 'restore_post',\n title: 'Restore post',\n description: 'Put a removed post back up.',\n scope: 'community_moderation:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityPostParam,\n call: ({ communityId, postId }, { container, scope }) =>\n container.posts.restore(scope.orgId, postId, actor(scope), communityId),\n }),\n defineTool({\n name: 'dismiss_post_comment_flags',\n title: 'Dismiss post comment flags',\n description: 'Close every open flag on a comment on a post and leave it up.',\n scope: 'community_moderation:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityCommentParam,\n call: ({ communityId, commentId }, { container, scope }) =>\n container.discussion.resolveReports(scope.orgId, commentId, actor(scope), communityId),\n }),\n defineTool({\n name: 'remove_post_comment',\n title: 'Remove post comment',\n description:\n 'Hide a comment on a post and resolve its open flags as removed. restore_post_comment brings it back.',\n scope: 'community_moderation:write',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunityCommentParam,\n call: ({ communityId, commentId }, { container, scope }) =>\n container.discussion.remove(scope.orgId, commentId, actor(scope), communityId),\n }),\n defineTool({\n name: 'restore_post_comment',\n title: 'Restore post comment',\n description: 'Publish a removed comment on a post again.',\n scope: 'community_moderation:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityCommentParam,\n call: ({ communityId, commentId }, { container, scope }) =>\n container.discussion.restore(scope.orgId, commentId, actor(scope), communityId),\n }),\n defineTool({\n name: 'dismiss_message_flags',\n title: 'Dismiss message flags',\n description: 'Close every open flag on a chat message and leave it up.',\n scope: 'community_moderation:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: ResolveMessageFlags.extend(CommunityMessageParam.shape),\n call: ({ communityId, messageId, resolution }, { container, scope }) =>\n container.chats.resolveMessageFlags(\n scope.orgId,\n actor(scope),\n messageId,\n resolution,\n communityId,\n ),\n }),\n defineTool({\n name: 'lock_chat',\n title: 'Lock chat',\n description:\n 'Stop everyone sending or editing messages in a chat until it is unlocked. Its open message flags are resolved as locked.',\n scope: 'community_moderation:write',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunityChatParam,\n call: ({ communityId, chatId }, { container, scope }) =>\n container.chats.lock(scope.orgId, actor(scope), chatId, communityId),\n }),\n defineTool({\n name: 'unlock_chat',\n title: 'Unlock chat',\n description: 'Let the participants of a locked chat send messages again.',\n scope: 'community_moderation:write',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityChatParam,\n call: ({ communityId, chatId }, { container, scope }) =>\n container.chats.unlock(scope.orgId, actor(scope), chatId, communityId),\n }),\n];\n"],"mappings":"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"}
1
+ {"version":3,"file":"community-moderation.js","names":[],"sources":["../../../../src/http/mcp/tools/community-moderation.ts"],"sourcesContent":["import {\n CommunityChatParam,\n CommunityCommentParam,\n CommunityIdParam,\n CommunityMessageParam,\n CommunityPostParam,\n CommunitySpaceParam,\n ResolveMessageFlags,\n ResolvePostFlags,\n} from '../../schemas/index.js';\nimport { defineTool, type Tool } from '../tool.js';\n\nexport const communityModerationTools: Tool[] = [\n defineTool({\n name: 'get_space_moderation_queue',\n title: 'Get space moderation queue',\n description:\n 'The posts awaiting review in a space and the open flags on its posts and comments. Each list holds at most the 100 oldest; working the queue brings in the next ones.',\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunitySpaceParam,\n call: ({ communityId, spaceId }, { container, caller }) =>\n container.posts.moderationQueue(communityId, spaceId, caller.actor),\n }),\n defineTool({\n name: 'get_message_moderation_queue',\n title: 'Get message moderation queue',\n description:\n \"The messages in a community's chats with open flags, with the flags and the chat each is in. Holds at most the 100 oldest open flags.\",\n kind: 'read',\n idempotent: true,\n openWorld: false,\n input: CommunityIdParam,\n call: ({ communityId }, { container, caller }) =>\n container.chats.messageQueue(communityId, caller.actor),\n }),\n defineTool({\n name: 'approve_post',\n title: 'Approve post',\n description: 'Publish a post that is awaiting review.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityPostParam,\n call: ({ communityId, postId }, { container, caller }) =>\n container.posts.approve(postId, communityId, caller.actor),\n }),\n defineTool({\n name: 'dismiss_post_flags',\n title: 'Dismiss post flags',\n description: 'Close every open flag on a post and leave it up.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: ResolvePostFlags.extend(CommunityPostParam.shape),\n call: ({ communityId, postId, resolution }, { container, caller }) =>\n container.posts.resolveFlags(postId, resolution, communityId, caller.actor),\n }),\n defineTool({\n name: 'remove_post',\n title: 'Remove post',\n description:\n 'Take a published or pending post down and resolve its open flags as removed. restore_post brings it back.',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunityPostParam,\n call: ({ communityId, postId }, { container, caller }) =>\n container.posts.remove(postId, communityId, caller.actor),\n }),\n defineTool({\n name: 'restore_post',\n title: 'Restore post',\n description: 'Put a removed post back up.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityPostParam,\n call: ({ communityId, postId }, { container, caller }) =>\n container.posts.restore(postId, communityId, caller.actor),\n }),\n defineTool({\n name: 'dismiss_post_comment_flags',\n title: 'Dismiss post comment flags',\n description: 'Close every open flag on a comment on a post and leave it up.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityCommentParam,\n call: ({ communityId, commentId }, { container, caller }) =>\n container.discussion.resolveReports(commentId, { communityId }, caller.actor),\n }),\n defineTool({\n name: 'remove_post_comment',\n title: 'Remove post comment',\n description:\n 'Hide a comment on a post and resolve its open flags as removed. restore_post_comment brings it back.',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunityCommentParam,\n call: ({ communityId, commentId }, { container, caller }) =>\n container.discussion.remove(commentId, { communityId }, caller.actor),\n }),\n defineTool({\n name: 'restore_post_comment',\n title: 'Restore post comment',\n description: 'Publish a removed comment on a post again.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityCommentParam,\n call: ({ communityId, commentId }, { container, caller }) =>\n container.discussion.restore(commentId, { communityId }, caller.actor),\n }),\n defineTool({\n name: 'dismiss_message_flags',\n title: 'Dismiss message flags',\n description: 'Close every open flag on a chat message and leave it up.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: ResolveMessageFlags.extend(CommunityMessageParam.shape),\n call: ({ communityId, messageId, resolution }, { container, caller }) =>\n container.chats.resolveMessageFlags(messageId, resolution, communityId, caller.actor),\n }),\n defineTool({\n name: 'lock_chat',\n title: 'Lock chat',\n description:\n 'Stop everyone sending or editing messages in a chat until it is unlocked. Its open message flags are resolved as locked.',\n kind: 'destructive',\n idempotent: true,\n openWorld: false,\n input: CommunityChatParam,\n call: ({ communityId, chatId }, { container, caller }) =>\n container.chats.lock(chatId, communityId, caller.actor),\n }),\n defineTool({\n name: 'unlock_chat',\n title: 'Unlock chat',\n description: 'Let the participants of a locked chat send messages again.',\n kind: 'write',\n idempotent: true,\n openWorld: false,\n input: CommunityChatParam,\n call: ({ communityId, chatId }, { container, caller }) =>\n container.chats.unlock(chatId, communityId, caller.actor),\n }),\n];\n"],"mappings":"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"}