@amityco/social-plus-vise 1.5.0 → 1.7.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.
@@ -70,6 +70,119 @@ const CAPABILITIES = {
70
70
  ],
71
71
  models: [{ name: "Post", kind: "model", owner: "Amity" }],
72
72
  },
73
+ community: {
74
+ required: [
75
+ { name: "CommunityRepository", kind: "type" },
76
+ { name: "getCommunities", kind: "member", owner: "CommunityRepository" },
77
+ { name: "joinCommunity", kind: "member", owner: "CommunityRepository" },
78
+ ],
79
+ optional: [
80
+ { name: "getCommunity", kind: "member", owner: "CommunityRepository" },
81
+ { name: "createCommunity", kind: "member", owner: "CommunityRepository" },
82
+ { name: "leaveCommunity", kind: "member", owner: "CommunityRepository" },
83
+ { name: "updateCommunity", kind: "member", owner: "CommunityRepository" },
84
+ { name: "deleteCommunity", kind: "member", owner: "CommunityRepository" },
85
+ { name: "searchCommunities", kind: "member", owner: "CommunityRepository" },
86
+ { name: "getRecommendedCommunities", kind: "member", owner: "CommunityRepository" },
87
+ { name: "getTrendingCommunities", kind: "member", owner: "CommunityRepository" },
88
+ { name: "onCommunityCreated", kind: "member", owner: "CommunityRepository" },
89
+ { name: "onCommunityUpdated", kind: "member", owner: "CommunityRepository" },
90
+ { name: "onCommunityDeleted", kind: "member", owner: "CommunityRepository" },
91
+ ],
92
+ models: [{ name: "Community", kind: "model", owner: "Amity" }],
93
+ },
94
+ chat: {
95
+ required: [
96
+ { name: "ChannelRepository", kind: "type" },
97
+ { name: "MessageRepository", kind: "type" },
98
+ { name: "getChannels", kind: "member", owner: "ChannelRepository" },
99
+ { name: "getMessages", kind: "member", owner: "MessageRepository" },
100
+ { name: "createMessage", kind: "member", owner: "MessageRepository" },
101
+ ],
102
+ optional: [
103
+ { name: "getChannel", kind: "member", owner: "ChannelRepository" },
104
+ { name: "createChannel", kind: "member", owner: "ChannelRepository" },
105
+ { name: "joinChannel", kind: "member", owner: "ChannelRepository" },
106
+ { name: "leaveChannel", kind: "member", owner: "ChannelRepository" },
107
+ { name: "archiveChannel", kind: "member", owner: "ChannelRepository" },
108
+ { name: "unarchiveChannel", kind: "member", owner: "ChannelRepository" },
109
+ { name: "muteChannel", kind: "member", owner: "ChannelRepository" },
110
+ { name: "searchChannels", kind: "member", owner: "ChannelRepository" },
111
+ { name: "getSubChannels", kind: "member", owner: "SubChannelRepository" },
112
+ { name: "editMessage", kind: "member", owner: "MessageRepository" },
113
+ { name: "deleteMessage", kind: "member", owner: "MessageRepository" },
114
+ { name: "flagMessage", kind: "member", owner: "MessageRepository" },
115
+ { name: "unflagMessage", kind: "member", owner: "MessageRepository" },
116
+ { name: "isMessageFlaggedByMe", kind: "member", owner: "MessageRepository" },
117
+ { name: "searchMessage", kind: "member", owner: "MessageRepository" },
118
+ { name: "markAsDelivered", kind: "member", owner: "MessageRepository" },
119
+ { name: "onMessageCreatedMqtt", kind: "member", owner: "MessageRepository" },
120
+ { name: "onMessageUpdated", kind: "member", owner: "MessageRepository" },
121
+ { name: "onMessageDeleted", kind: "member", owner: "MessageRepository" },
122
+ ],
123
+ models: [
124
+ { name: "Channel", kind: "model", owner: "Amity" },
125
+ { name: "Message", kind: "model", owner: "Amity" },
126
+ { name: "SubChannel", kind: "model", owner: "Amity" },
127
+ ],
128
+ },
129
+ livestream: {
130
+ required: [
131
+ { name: "RoomRepository", kind: "type" },
132
+ { name: "getRoom", kind: "member", owner: "RoomRepository" },
133
+ { name: "getRooms", kind: "member", owner: "RoomRepository" },
134
+ ],
135
+ optional: [
136
+ { name: "createRoom", kind: "member", owner: "RoomRepository" },
137
+ { name: "updateRoom", kind: "member", owner: "RoomRepository" },
138
+ { name: "deleteRoom", kind: "member", owner: "RoomRepository" },
139
+ { name: "leaveRoom", kind: "member", owner: "RoomRepository" },
140
+ { name: "stopRoom", kind: "member", owner: "RoomRepository" },
141
+ { name: "removeParticipant", kind: "member", owner: "RoomRepository" },
142
+ { name: "getBroadcasterData", kind: "member", owner: "RoomRepository" },
143
+ { name: "getRecordedUrl", kind: "member", owner: "RoomRepository" },
144
+ { name: "getPlayer", kind: "member", owner: "LiveStreamPlayer" },
145
+ { name: "getRoomOnlineUsers", kind: "member", owner: "RoomPresenceRepository" },
146
+ { name: "getRoomUserCount", kind: "member", owner: "RoomPresenceRepository" },
147
+ ],
148
+ models: [{ name: "Room", kind: "model", owner: "Amity" }],
149
+ },
150
+ "notification-tray": {
151
+ required: [
152
+ { name: "notificationTray", kind: "type" },
153
+ { name: "getNotificationTrayItems", kind: "member", owner: "notificationTray" },
154
+ ],
155
+ optional: [
156
+ { name: "getNotificationTraySeen", kind: "member", owner: "notificationTray" },
157
+ { name: "markItemsSeen", kind: "member", owner: "notificationTray" },
158
+ { name: "markTraySeen", kind: "member", owner: "notificationTray" },
159
+ { name: "onNotificationTraySeenUpdated", kind: "member", owner: "notificationTray" },
160
+ ],
161
+ models: [
162
+ { name: "NotificationTrayItem", kind: "model", owner: "Amity" },
163
+ { name: "NotificationTraySeen", kind: "model", owner: "Amity" },
164
+ ],
165
+ },
166
+ events: {
167
+ required: [
168
+ { name: "EventRepository", kind: "type" },
169
+ { name: "getEvents", kind: "member", owner: "EventRepository" },
170
+ { name: "getRSVPs", kind: "member", owner: "EventRepository" },
171
+ ],
172
+ optional: [
173
+ { name: "getEvent", kind: "member", owner: "EventRepository" },
174
+ { name: "getMyEvents", kind: "member", owner: "EventRepository" },
175
+ { name: "createEvent", kind: "member", owner: "EventRepository" },
176
+ { name: "updateEvent", kind: "member", owner: "EventRepository" },
177
+ { name: "deleteEvent", kind: "member", owner: "EventRepository" },
178
+ { name: "onEventCreated", kind: "member", owner: "EventRepository" },
179
+ { name: "onEventUpdated", kind: "member", owner: "EventRepository" },
180
+ { name: "onEventDeleted", kind: "member", owner: "EventRepository" },
181
+ { name: "onRSVPCreated", kind: "member", owner: "EventRepository" },
182
+ { name: "onRSVPUpdated", kind: "member", owner: "EventRepository" },
183
+ ],
184
+ models: [{ name: "Event", kind: "model", owner: "Amity" }],
185
+ },
73
186
  users: {
74
187
  required: [
75
188
  { name: "UserRepository", kind: "type" },
@@ -88,6 +201,113 @@ const CAPABILITIES = {
88
201
  models: [{ name: "User", kind: "model", owner: "Amity" }],
89
202
  },
90
203
  };
204
+ const FLUTTER_CAPABILITIES = {
205
+ comments: {
206
+ required: [
207
+ { name: "CommentRepository", kind: "type" },
208
+ { name: "getComments", kind: "member", owner: "CommentRepository" },
209
+ { name: "createComment", kind: "member", owner: "CommentRepository" },
210
+ ],
211
+ optional: [
212
+ { name: "getComment", kind: "member", owner: "CommentRepository" },
213
+ { name: "updateComment", kind: "member", owner: "CommentRepository" },
214
+ ],
215
+ models: [{ name: "AmityComment", kind: "model" }],
216
+ },
217
+ reactions: {
218
+ required: [
219
+ { name: "AmityReactionRepository", kind: "type" },
220
+ { name: "addReaction", kind: "member", owner: "AmityReactionRepository" },
221
+ { name: "removeReaction", kind: "member", owner: "AmityReactionRepository" },
222
+ ],
223
+ optional: [
224
+ { name: "getReactions", kind: "member", owner: "AmityReactionRepository" },
225
+ ],
226
+ models: [{ name: "AmityReaction", kind: "model" }],
227
+ },
228
+ posts: {
229
+ required: [
230
+ { name: "PostRepository", kind: "type" },
231
+ { name: "getPosts", kind: "member", owner: "PostRepository" },
232
+ { name: "createPost", kind: "member", owner: "PostRepository" },
233
+ ],
234
+ optional: [
235
+ { name: "getPost", kind: "member", owner: "PostRepository" },
236
+ { name: "deletePost", kind: "member", owner: "PostRepository" },
237
+ { name: "reviewPost", kind: "member", owner: "PostRepository" },
238
+ { name: "getPinnedPosts", kind: "member", owner: "PostRepository" },
239
+ { name: "isFlaggedByMe", kind: "member", owner: "PostRepository" },
240
+ ],
241
+ models: [{ name: "AmityPost", kind: "model" }],
242
+ },
243
+ users: {
244
+ required: [
245
+ { name: "UserRepository", kind: "type" },
246
+ { name: "getUser", kind: "member", owner: "UserRepository" },
247
+ ],
248
+ optional: [
249
+ { name: "getUsers", kind: "member", owner: "UserRepository" },
250
+ { name: "searchUserByDisplayName", kind: "member", owner: "UserRepository" },
251
+ { name: "updateUser", kind: "member", owner: "UserRepository" },
252
+ { name: "getBlockedUsers", kind: "member", owner: "UserRepository" },
253
+ { name: "report", kind: "member", owner: "UserRepository" },
254
+ { name: "follow", kind: "member", owner: "AmityUserRelationshipRepository" },
255
+ { name: "getFollowInfo", kind: "member", owner: "AmityUserRelationshipRepository" },
256
+ ],
257
+ models: [{ name: "AmityUser", kind: "model" }],
258
+ },
259
+ community: {
260
+ required: [
261
+ { name: "AmityCommunityRepository", kind: "type" },
262
+ { name: "getCommunities", kind: "member", owner: "AmityCommunityRepository" },
263
+ { name: "joinCommunity", kind: "member", owner: "AmityCommunityRepository" },
264
+ ],
265
+ optional: [
266
+ { name: "getCommunity", kind: "member", owner: "AmityCommunityRepository" },
267
+ { name: "createCommunity", kind: "member", owner: "AmityCommunityRepository" },
268
+ { name: "leaveCommunity", kind: "member", owner: "AmityCommunityRepository" },
269
+ { name: "updateCommunity", kind: "member", owner: "AmityCommunityRepository" },
270
+ { name: "deleteCommunity", kind: "member", owner: "AmityCommunityRepository" },
271
+ { name: "getRecommendedCommunities", kind: "member", owner: "AmityCommunityRepository" },
272
+ { name: "getTrendingCommunities", kind: "member", owner: "AmityCommunityRepository" },
273
+ ],
274
+ models: [{ name: "AmityCommunity", kind: "model" }],
275
+ },
276
+ chat: {
277
+ required: [
278
+ { name: "AmityChannelRepository", kind: "type" },
279
+ { name: "MessageRepository", kind: "type" },
280
+ { name: "getChannels", kind: "member", owner: "AmityChannelRepository" },
281
+ { name: "getMessages", kind: "member", owner: "MessageRepository" },
282
+ { name: "createMessage", kind: "member", owner: "MessageRepository" },
283
+ ],
284
+ optional: [
285
+ { name: "getChannel", kind: "member", owner: "AmityChannelRepository" },
286
+ { name: "createChannel", kind: "member", owner: "AmityChannelRepository" },
287
+ { name: "joinChannel", kind: "member", owner: "AmityChannelRepository" },
288
+ { name: "leaveChannel", kind: "member", owner: "AmityChannelRepository" },
289
+ { name: "archiveChannel", kind: "member", owner: "AmityChannelRepository" },
290
+ { name: "unarchiveChannel", kind: "member", owner: "AmityChannelRepository" },
291
+ { name: "muteChannel", kind: "member", owner: "AmityChannelRepository" },
292
+ { name: "searchChannels", kind: "member", owner: "AmityChannelRepository" },
293
+ { name: "getMessage", kind: "member", owner: "MessageRepository" },
294
+ { name: "deleteMessage", kind: "member", owner: "MessageRepository" },
295
+ { name: "flagMessage", kind: "member", owner: "MessageRepository" },
296
+ { name: "updateMessage", kind: "member", owner: "MessageRepository" },
297
+ { name: "searchMessage", kind: "member", owner: "MessageRepository" },
298
+ { name: "getSubChannels", kind: "member", owner: "AmitySubChannelRepository" },
299
+ ],
300
+ models: [
301
+ { name: "AmityChannel", kind: "model" },
302
+ { name: "AmityMessage", kind: "model" },
303
+ { name: "AmitySubChannel", kind: "model" },
304
+ ],
305
+ },
306
+ };
307
+ const CAPABILITY_ANCHORS = {
308
+ typescript: CAPABILITIES,
309
+ flutter: FLUTTER_CAPABILITIES,
310
+ };
91
311
  export const getSdkFactsTool = {
92
312
  name: "get_sdk_facts",
93
313
  description: "Read bundled social.plus SDK surface facts for block packaging. Projectless and read-only; answers symbol existence, not semantic correctness.",
@@ -181,7 +401,12 @@ export async function getSdkFacts(options) {
181
401
  "Remote SP_SDK_SURFACE_URL resolution is recorded in the manifest for a future online snapshot source; this MVP uses local override/env/bundled directories only.",
182
402
  ...(platform !== "typescript"
183
403
  ? [
184
- `Capability anchors are authored TypeScript-first at this MVP, so capabilities is empty for ${platform}. This means capability mapping is not yet available on ${platform} — it does NOT mean the SDK lacks the feature. The symbol and model facts above are extracted from the ${platform} surface and remain authoritative.`,
404
+ (() => {
405
+ const anchored = Object.keys(CAPABILITY_ANCHORS[platform] ?? {});
406
+ return anchored.length > 0
407
+ ? `Capability anchors on ${platform} cover: ${anchored.join(", ")}. Families not listed are not yet anchored on ${platform} — capability mapping is unavailable for them, which does NOT mean the SDK lacks the feature. The symbol and model facts above are extracted from the ${platform} surface and remain authoritative.`
408
+ : `Capability anchors are authored TypeScript-first at this MVP, so capabilities is empty for ${platform}. This means capability mapping is not yet available on ${platform} — it does NOT mean the SDK lacks the feature. The symbol and model facts above are extracted from the ${platform} surface and remain authoritative.`;
409
+ })(),
185
410
  ]
186
411
  : []),
187
412
  ],
@@ -264,20 +489,21 @@ async function readJson(filePath) {
264
489
  }
265
490
  function requestedCapabilityIds(platform, capability) {
266
491
  const available = Object.keys(CAPABILITIES);
492
+ const anchored = Object.keys(CAPABILITY_ANCHORS[platform] ?? {});
267
493
  if (!capability) {
268
- return platform === "typescript" ? available : [];
494
+ return anchored;
269
495
  }
270
496
  const normalized = capability.trim().toLowerCase();
271
497
  if (!available.includes(normalized)) {
272
498
  throw new Error(`Unsupported SDK capability: ${capability}. Supported capabilities: ${available.join(", ")}.`);
273
499
  }
274
- if (platform !== "typescript") {
275
- return [];
276
- }
277
- return [normalized];
500
+ return anchored.includes(normalized) ? [normalized] : [];
278
501
  }
279
502
  function buildCapabilityFact(id, platform, symbols, modelFacts) {
280
- const definition = CAPABILITIES[id];
503
+ const definition = CAPABILITY_ANCHORS[platform]?.[id];
504
+ if (!definition) {
505
+ throw new Error(`No ${platform} anchor set for capability ${id}; requestedCapabilityIds must filter unanchored families.`);
506
+ }
281
507
  const requiredSymbols = definition.required.map((symbol) => checkSymbol(symbols, { ...symbol, required: true }));
282
508
  const optionalSymbols = definition.optional.map((symbol) => checkSymbol(symbols, { ...symbol, required: false }));
283
509
  const models = definition.models.map((symbol) => {