@basicbit/vrchat-mcp 0.1.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 (230) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +266 -0
  4. package/assets/logo.svg +39 -0
  5. package/dist/bin/cli.js +4 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/package.json +109 -0
  8. package/dist/src/auth/cookieStore.js +136 -0
  9. package/dist/src/auth/cookieStore.js.map +1 -0
  10. package/dist/src/auth/index.js +398 -0
  11. package/dist/src/auth/index.js.map +1 -0
  12. package/dist/src/config/defaults.json +58 -0
  13. package/dist/src/config/index.js +405 -0
  14. package/dist/src/config/index.js.map +1 -0
  15. package/dist/src/core/client.js +262 -0
  16. package/dist/src/core/client.js.map +1 -0
  17. package/dist/src/core/generatedToolOverrides.js +104 -0
  18. package/dist/src/core/generatedToolOverrides.js.map +1 -0
  19. package/dist/src/core/generatedToolSkips.js +28 -0
  20. package/dist/src/core/generatedToolSkips.js.map +1 -0
  21. package/dist/src/core/operationSchemas.js +102 -0
  22. package/dist/src/core/operationSchemas.js.map +1 -0
  23. package/dist/src/core/readToolRegistry.js +93 -0
  24. package/dist/src/core/readToolRegistry.js.map +1 -0
  25. package/dist/src/core/readTools.js +197 -0
  26. package/dist/src/core/readTools.js.map +1 -0
  27. package/dist/src/core/spec.js +137 -0
  28. package/dist/src/core/spec.js.map +1 -0
  29. package/dist/src/core/writeToolRegistry.js +113 -0
  30. package/dist/src/core/writeToolRegistry.js.map +1 -0
  31. package/dist/src/generated/vrchat-schemas.js +3326 -0
  32. package/dist/src/generated/vrchat-schemas.js.map +1 -0
  33. package/dist/src/index.js +31 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/infra/logger.js +26 -0
  36. package/dist/src/infra/logger.js.map +1 -0
  37. package/dist/src/models/avatars.js +22 -0
  38. package/dist/src/models/avatars.js.map +1 -0
  39. package/dist/src/models/events.js +115 -0
  40. package/dist/src/models/events.js.map +1 -0
  41. package/dist/src/models/friends.js +148 -0
  42. package/dist/src/models/friends.js.map +1 -0
  43. package/dist/src/models/groups.js +228 -0
  44. package/dist/src/models/groups.js.map +1 -0
  45. package/dist/src/models/instances.js +56 -0
  46. package/dist/src/models/instances.js.map +1 -0
  47. package/dist/src/models/invites.js +34 -0
  48. package/dist/src/models/invites.js.map +1 -0
  49. package/dist/src/models/notifications.js +62 -0
  50. package/dist/src/models/notifications.js.map +1 -0
  51. package/dist/src/models/status.js +50 -0
  52. package/dist/src/models/status.js.map +1 -0
  53. package/dist/src/models/statusPage.js +84 -0
  54. package/dist/src/models/statusPage.js.map +1 -0
  55. package/dist/src/models/users.js +113 -0
  56. package/dist/src/models/users.js.map +1 -0
  57. package/dist/src/models/vrcx.js +144 -0
  58. package/dist/src/models/vrcx.js.map +1 -0
  59. package/dist/src/models/worlds.js +150 -0
  60. package/dist/src/models/worlds.js.map +1 -0
  61. package/dist/src/resources/friendsChanges.js +44 -0
  62. package/dist/src/resources/friendsChanges.js.map +1 -0
  63. package/dist/src/resources/friendsSnapshot.js +69 -0
  64. package/dist/src/resources/friendsSnapshot.js.map +1 -0
  65. package/dist/src/resources/index.js +9 -0
  66. package/dist/src/resources/index.js.map +1 -0
  67. package/dist/src/resources/subscriptions.js +39 -0
  68. package/dist/src/resources/subscriptions.js.map +1 -0
  69. package/dist/src/schemas/auth.js +3 -0
  70. package/dist/src/schemas/auth.js.map +1 -0
  71. package/dist/src/schemas/call.js +13 -0
  72. package/dist/src/schemas/call.js.map +1 -0
  73. package/dist/src/schemas/read.js +58 -0
  74. package/dist/src/schemas/read.js.map +1 -0
  75. package/dist/src/schemas/write.js +18 -0
  76. package/dist/src/schemas/write.js.map +1 -0
  77. package/dist/src/services/api/client.js +66 -0
  78. package/dist/src/services/api/client.js.map +1 -0
  79. package/dist/src/services/api/index.js +2 -0
  80. package/dist/src/services/api/index.js.map +1 -0
  81. package/dist/src/services/avatars/index.js +24 -0
  82. package/dist/src/services/avatars/index.js.map +1 -0
  83. package/dist/src/services/cache.js +158 -0
  84. package/dist/src/services/cache.js.map +1 -0
  85. package/dist/src/services/events/curated.js +229 -0
  86. package/dist/src/services/events/curated.js.map +1 -0
  87. package/dist/src/services/events/index.js +3 -0
  88. package/dist/src/services/events/index.js.map +1 -0
  89. package/dist/src/services/events/utils.js +75 -0
  90. package/dist/src/services/events/utils.js.map +1 -0
  91. package/dist/src/services/friends/changes.js +246 -0
  92. package/dist/src/services/friends/changes.js.map +1 -0
  93. package/dist/src/services/friends/curated.js +497 -0
  94. package/dist/src/services/friends/curated.js.map +1 -0
  95. package/dist/src/services/friends/fetch.js +69 -0
  96. package/dist/src/services/friends/fetch.js.map +1 -0
  97. package/dist/src/services/friends/index.js +5 -0
  98. package/dist/src/services/friends/index.js.map +1 -0
  99. package/dist/src/services/friends/match.js +98 -0
  100. package/dist/src/services/friends/match.js.map +1 -0
  101. package/dist/src/services/groups/allowlist.js +19 -0
  102. package/dist/src/services/groups/allowlist.js.map +1 -0
  103. package/dist/src/services/groups/curated.js +343 -0
  104. package/dist/src/services/groups/curated.js.map +1 -0
  105. package/dist/src/services/groups/index.js +3 -0
  106. package/dist/src/services/groups/index.js.map +1 -0
  107. package/dist/src/services/instances/curated.js +80 -0
  108. package/dist/src/services/instances/curated.js.map +1 -0
  109. package/dist/src/services/instances/index.js +3 -0
  110. package/dist/src/services/instances/index.js.map +1 -0
  111. package/dist/src/services/instances/read.js +14 -0
  112. package/dist/src/services/instances/read.js.map +1 -0
  113. package/dist/src/services/invites/curated.js +90 -0
  114. package/dist/src/services/invites/curated.js.map +1 -0
  115. package/dist/src/services/invites/index.js +2 -0
  116. package/dist/src/services/invites/index.js.map +1 -0
  117. package/dist/src/services/notifications/curated.js +54 -0
  118. package/dist/src/services/notifications/curated.js.map +1 -0
  119. package/dist/src/services/notifications/index.js +2 -0
  120. package/dist/src/services/notifications/index.js.map +1 -0
  121. package/dist/src/services/pipeline/events.js +40 -0
  122. package/dist/src/services/pipeline/events.js.map +1 -0
  123. package/dist/src/services/pipeline/handlers.js +21 -0
  124. package/dist/src/services/pipeline/handlers.js.map +1 -0
  125. package/dist/src/services/pipeline/index.js +4 -0
  126. package/dist/src/services/pipeline/index.js.map +1 -0
  127. package/dist/src/services/pipeline/manager.js +143 -0
  128. package/dist/src/services/pipeline/manager.js.map +1 -0
  129. package/dist/src/services/status/curated.js +53 -0
  130. package/dist/src/services/status/curated.js.map +1 -0
  131. package/dist/src/services/status/index.js +2 -0
  132. package/dist/src/services/status/index.js.map +1 -0
  133. package/dist/src/services/statusPage/curated.js +397 -0
  134. package/dist/src/services/statusPage/curated.js.map +1 -0
  135. package/dist/src/services/statusPage/index.js +2 -0
  136. package/dist/src/services/statusPage/index.js.map +1 -0
  137. package/dist/src/services/users/curated.js +124 -0
  138. package/dist/src/services/users/curated.js.map +1 -0
  139. package/dist/src/services/users/groups.js +54 -0
  140. package/dist/src/services/users/groups.js.map +1 -0
  141. package/dist/src/services/users/index.js +3 -0
  142. package/dist/src/services/users/index.js.map +1 -0
  143. package/dist/src/services/vrcx/db.js +13 -0
  144. package/dist/src/services/vrcx/db.js.map +1 -0
  145. package/dist/src/services/vrcx/gamelog.js +125 -0
  146. package/dist/src/services/vrcx/gamelog.js.map +1 -0
  147. package/dist/src/services/vrcx/index.js +5 -0
  148. package/dist/src/services/vrcx/index.js.map +1 -0
  149. package/dist/src/services/vrcx/memos.js +51 -0
  150. package/dist/src/services/vrcx/memos.js.map +1 -0
  151. package/dist/src/services/vrcx/paths.js +133 -0
  152. package/dist/src/services/vrcx/paths.js.map +1 -0
  153. package/dist/src/services/vrcx/relationships.js +138 -0
  154. package/dist/src/services/vrcx/relationships.js.map +1 -0
  155. package/dist/src/services/vrcx/shared.js +173 -0
  156. package/dist/src/services/vrcx/shared.js.map +1 -0
  157. package/dist/src/services/vrcx/status.js +54 -0
  158. package/dist/src/services/vrcx/status.js.map +1 -0
  159. package/dist/src/services/worlds/index.js +256 -0
  160. package/dist/src/services/worlds/index.js.map +1 -0
  161. package/dist/src/tools/auth.js +44 -0
  162. package/dist/src/tools/auth.js.map +1 -0
  163. package/dist/src/tools/cache.js +61 -0
  164. package/dist/src/tools/cache.js.map +1 -0
  165. package/dist/src/tools/curated/avatars.js +57 -0
  166. package/dist/src/tools/curated/avatars.js.map +1 -0
  167. package/dist/src/tools/curated/events.js +212 -0
  168. package/dist/src/tools/curated/events.js.map +1 -0
  169. package/dist/src/tools/curated/friends.js +168 -0
  170. package/dist/src/tools/curated/friends.js.map +1 -0
  171. package/dist/src/tools/curated/groups.js +368 -0
  172. package/dist/src/tools/curated/groups.js.map +1 -0
  173. package/dist/src/tools/curated/instances.js +35 -0
  174. package/dist/src/tools/curated/instances.js.map +1 -0
  175. package/dist/src/tools/curated/invites.js +78 -0
  176. package/dist/src/tools/curated/invites.js.map +1 -0
  177. package/dist/src/tools/curated/notifications.js +35 -0
  178. package/dist/src/tools/curated/notifications.js.map +1 -0
  179. package/dist/src/tools/curated/status.js +44 -0
  180. package/dist/src/tools/curated/status.js.map +1 -0
  181. package/dist/src/tools/curated/statusPage.js +27 -0
  182. package/dist/src/tools/curated/statusPage.js.map +1 -0
  183. package/dist/src/tools/curated/users.js +201 -0
  184. package/dist/src/tools/curated/users.js.map +1 -0
  185. package/dist/src/tools/curated/vrcx/gamelog.js +80 -0
  186. package/dist/src/tools/curated/vrcx/gamelog.js.map +1 -0
  187. package/dist/src/tools/curated/vrcx/index.js +11 -0
  188. package/dist/src/tools/curated/vrcx/index.js.map +1 -0
  189. package/dist/src/tools/curated/vrcx/memos.js +105 -0
  190. package/dist/src/tools/curated/vrcx/memos.js.map +1 -0
  191. package/dist/src/tools/curated/vrcx/relationships.js +86 -0
  192. package/dist/src/tools/curated/vrcx/relationships.js.map +1 -0
  193. package/dist/src/tools/curated/vrcx/status.js +43 -0
  194. package/dist/src/tools/curated/vrcx/status.js.map +1 -0
  195. package/dist/src/tools/curated/worlds.js +162 -0
  196. package/dist/src/tools/curated/worlds.js.map +1 -0
  197. package/dist/src/tools/generated.js +19 -0
  198. package/dist/src/tools/generated.js.map +1 -0
  199. package/dist/src/tools/raw.js +49 -0
  200. package/dist/src/tools/raw.js.map +1 -0
  201. package/dist/src/tools/read/common.js +58 -0
  202. package/dist/src/tools/read/common.js.map +1 -0
  203. package/dist/src/tools/read/system.js +19 -0
  204. package/dist/src/tools/read/system.js.map +1 -0
  205. package/dist/src/tools/registerAllTools.js +41 -0
  206. package/dist/src/tools/registerAllTools.js.map +1 -0
  207. package/dist/src/tools/write/common.js +10 -0
  208. package/dist/src/tools/write/common.js.map +1 -0
  209. package/dist/src/utils/json.js +53 -0
  210. package/dist/src/utils/json.js.map +1 -0
  211. package/dist/src/utils/schema.js +14 -0
  212. package/dist/src/utils/schema.js.map +1 -0
  213. package/dist/src/utils/stableStringify.js +36 -0
  214. package/dist/src/utils/stableStringify.js.map +1 -0
  215. package/dist/src/utils/strings.js +7 -0
  216. package/dist/src/utils/strings.js.map +1 -0
  217. package/dist/src/utils/toolAnnotations.js +17 -0
  218. package/dist/src/utils/toolAnnotations.js.map +1 -0
  219. package/dist/src/utils/toolNames.js +13 -0
  220. package/dist/src/utils/toolNames.js.map +1 -0
  221. package/dist/src/utils/toolResponses.js +12 -0
  222. package/dist/src/utils/toolResponses.js.map +1 -0
  223. package/docs/architecture.md +46 -0
  224. package/docs/curated-tools.md +132 -0
  225. package/docs/design-notes.md +48 -0
  226. package/docs/evals.md +129 -0
  227. package/docs/tools-guide.md +27 -0
  228. package/docs/tools.md +13849 -0
  229. package/docs/vrcx.md +69 -0
  230. package/package.json +109 -0
@@ -0,0 +1,90 @@
1
+ import { callReadOperationParsed, callWriteOperationParsed, } from '../api/client.js';
2
+ export function resolveInviteLocation(args) {
3
+ if (args.location) {
4
+ const parts = args.location.split(':');
5
+ if (parts.length >= 2) {
6
+ return { worldId: parts[0], instanceId: parts.slice(1).join(':') };
7
+ }
8
+ }
9
+ if (args.worldId && args.instanceId) {
10
+ return { worldId: args.worldId, instanceId: args.instanceId };
11
+ }
12
+ throw new Error('Provide location or worldId + instanceId.');
13
+ }
14
+ export function resolveInviteInstanceId(args) {
15
+ if (args.instanceId)
16
+ return args.instanceId;
17
+ if (args.location) {
18
+ const parts = args.location.split(':');
19
+ if (parts.length >= 2) {
20
+ return parts.slice(1).join(':');
21
+ }
22
+ return args.location;
23
+ }
24
+ throw new Error('Provide instanceId or location.');
25
+ }
26
+ export function prepareInviteUser(input) {
27
+ let instanceId;
28
+ try {
29
+ instanceId = resolveInviteInstanceId({
30
+ instanceId: input.instanceId,
31
+ location: input.location,
32
+ });
33
+ }
34
+ catch (err) {
35
+ const message = err instanceof Error ? err.message : 'Provide instanceId or location.';
36
+ return { ok: false, reason: message };
37
+ }
38
+ const request = { instanceId };
39
+ if (typeof input.messageSlot === 'number') {
40
+ request.messageSlot = input.messageSlot;
41
+ }
42
+ return { ok: true, userId: input.userId, request };
43
+ }
44
+ export async function sendSelfInvite(location) {
45
+ const result = await callWriteOperationParsed('inviteMyselfTo', {
46
+ worldId: location.worldId,
47
+ instanceId: location.instanceId,
48
+ });
49
+ return result.data ?? null;
50
+ }
51
+ export async function sendUserInvite(userId, request) {
52
+ const result = await callWriteOperationParsed('inviteUser', { userId }, request);
53
+ return result.data ?? null;
54
+ }
55
+ export async function resolveCurrentInviteLocation() {
56
+ const currentResult = await callReadOperationParsed('getCurrentUser', {});
57
+ const currentUser = currentResult.data;
58
+ const location = typeof currentUser?.location === 'string' ? currentUser.location : '';
59
+ if (!location?.includes(':')) {
60
+ throw new Error('Could not determine your current joinable instance from location. Join an instance first or provide instanceId/location explicitly via vrchat_invite_user.');
61
+ }
62
+ const parts = location.split(':');
63
+ const worldId = parts[0];
64
+ const instanceId = parts.slice(1).join(':');
65
+ if (!worldId || !instanceId) {
66
+ throw new Error('Current location is malformed; unable to extract worldId/instanceId. Use vrchat_invite_user with explicit instanceId/location.');
67
+ }
68
+ return {
69
+ worldId,
70
+ instanceId,
71
+ location,
72
+ };
73
+ }
74
+ export async function inviteUserToCurrentInstance(input) {
75
+ const current = await resolveCurrentInviteLocation();
76
+ const request = { instanceId: current.instanceId };
77
+ if (typeof input.messageSlot === 'number') {
78
+ request.messageSlot = input.messageSlot;
79
+ }
80
+ const notification = await sendUserInvite(input.userId, request);
81
+ return {
82
+ status: 'sent',
83
+ userId: input.userId,
84
+ worldId: current.worldId,
85
+ instanceId: current.instanceId,
86
+ location: current.location,
87
+ notification,
88
+ };
89
+ }
90
+ //# sourceMappingURL=curated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curated.js","sourceRoot":"","sources":["../../../../src/services/invites/curated.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './curated.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/invites/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { callReadOperationParsed } from '../api/client.js';
2
+ import { buildCacheKey, cacheConfig, cacheManager } from '../cache.js';
3
+ import { mapNotification } from '../../models/notifications.js';
4
+ import { nonEmptyString } from '../../utils/strings.js';
5
+ const DEFAULT_PAGE_SIZE = 50;
6
+ const DEFAULT_MAX_PAGES = 5;
7
+ export async function listRecentNotifications(input) {
8
+ const pageSize = typeof input.pageSize === 'number' ? Math.floor(input.pageSize) : DEFAULT_PAGE_SIZE;
9
+ const maxPages = typeof input.maxPages === 'number' ? Math.floor(input.maxPages) : DEFAULT_MAX_PAGES;
10
+ const maxItems = typeof input.maxItems === 'number' ? Math.floor(input.maxItems) : pageSize * maxPages;
11
+ const type = nonEmptyString(input.type);
12
+ const unreadOnly = input.unreadOnly === true;
13
+ const after = nonEmptyString(input.after);
14
+ const cacheKey = buildCacheKey('notifications:recent', {
15
+ type,
16
+ unreadOnly,
17
+ pageSize,
18
+ maxPages,
19
+ maxItems,
20
+ after,
21
+ });
22
+ const tags = ['notifications'];
23
+ const { value, stale } = await cacheManager.getOrSetStale(cacheKey, cacheConfig.notificationsTtlMs, cacheConfig.notificationsStaleTtlMs, tags, async () => {
24
+ const result = await callReadOperationParsed('getNotifications', {
25
+ type,
26
+ after,
27
+ }, {
28
+ page: {
29
+ enabled: true,
30
+ size: pageSize,
31
+ maxPages,
32
+ maxItems,
33
+ },
34
+ });
35
+ const notifications = result.data
36
+ .map(mapNotification)
37
+ .filter((notification) => Boolean(notification))
38
+ .filter((notification) => (unreadOnly ? notification.seen === false : true));
39
+ return {
40
+ notifications,
41
+ page: result.page,
42
+ truncated: result.page?.truncated ?? false,
43
+ };
44
+ });
45
+ return {
46
+ notifications: value.notifications,
47
+ page: value.page,
48
+ truncated: value.truncated,
49
+ stale,
50
+ pageSize,
51
+ maxPages,
52
+ };
53
+ }
54
+ //# sourceMappingURL=curated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curated.js","sourceRoot":"","sources":["../../../../src/services/notifications/curated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,eAAe,EAA4B,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAO7C;IAcC,MAAM,QAAQ,GACZ,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACtF,MAAM,QAAQ,GACZ,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACtF,MAAM,QAAQ,GACZ,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxF,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,aAAa,CAAC,sBAAsB,EAAE;QACrD,IAAI;QACJ,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,KAAK;KACN,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,aAAa,CACvD,QAAQ,EACR,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,uBAAuB,EACnC,IAAI,EACJ,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAC1C,kBAAkB,EAClB;YACE,IAAI;YACJ,KAAK;SACN,EACD;YACE,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,QAAQ;gBACd,QAAQ;gBACR,QAAQ;aACT;SACF,CACF,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI;aAC9B,GAAG,CAAC,eAAe,CAAC;aACpB,MAAM,CAAC,CAAC,YAAY,EAAuC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;aACpF,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,OAAO;YACL,aAAa;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,IAAI,KAAK;SAC3C,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK;QACL,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './curated.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/notifications/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { isJsonObject, parseJsonText, } from '../../utils/json.js';
2
+ function normalizeMessageData(data) {
3
+ if (typeof data === 'string')
4
+ return data;
5
+ if (data instanceof ArrayBuffer)
6
+ return Buffer.from(data).toString('utf8');
7
+ if (Buffer.isBuffer(data))
8
+ return data.toString('utf8');
9
+ if (ArrayBuffer.isView(data)) {
10
+ return Buffer.from(data.buffer).toString('utf8');
11
+ }
12
+ return null;
13
+ }
14
+ export function parsePipelineMessage(data) {
15
+ const text = normalizeMessageData(data);
16
+ if (!text)
17
+ return null;
18
+ const parsed = parseJsonText(text);
19
+ if (!parsed || !isJsonObject(parsed))
20
+ return null;
21
+ const type = parsed.type;
22
+ if (typeof type !== 'string')
23
+ return null;
24
+ let content = typeof parsed.content === 'undefined' ? null : parsed.content;
25
+ if (typeof content === 'string') {
26
+ const trimmed = content.trim();
27
+ if (trimmed) {
28
+ const parsedContent = parseJsonText(trimmed);
29
+ if (parsedContent !== null)
30
+ content = parsedContent;
31
+ }
32
+ }
33
+ return {
34
+ type,
35
+ content,
36
+ raw: parsed,
37
+ receivedAt: new Date().toISOString(),
38
+ };
39
+ }
40
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/services/pipeline/events.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,GAGd,MAAM,qBAAqB,CAAC;AAW7B,SAAS,oBAAoB,CAAC,IAAyB;IACrD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,YAAY,WAAW;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAqB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAyB;IAEzB,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,OAAO,GACT,OAAO,MAAM,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IAChE,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,aAAa,KAAK,IAAI;gBAAE,OAAO,GAAG,aAAa,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI;QACJ,OAAO;QACP,GAAG,EAAE,MAAM;QACX,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { FRIENDS_CHANGES_URI } from '../../resources/friendsChanges.js';
2
+ import { FRIENDS_SNAPSHOT_URI } from '../../resources/friendsSnapshot.js';
3
+ import { notifyResourceUpdated } from '../../resources/subscriptions.js';
4
+ import { applyFriendEventToCache, recordFriendChange } from '../friends/changes.js';
5
+ import { pipelineManager } from './manager.js';
6
+ let registered = false;
7
+ export function registerPipelineHandlers(server) {
8
+ if (registered)
9
+ return;
10
+ registered = true;
11
+ pipelineManager.onEvent((event) => {
12
+ const change = recordFriendChange(event);
13
+ if (!change)
14
+ return;
15
+ applyFriendEventToCache(event);
16
+ notifyResourceUpdated(server, FRIENDS_CHANGES_URI);
17
+ notifyResourceUpdated(server, FRIENDS_SNAPSHOT_URI);
18
+ });
19
+ pipelineManager.start();
20
+ }
21
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../../src/services/pipeline/handlers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,IAAI,CAAC;IAElB,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC/B,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACnD,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,eAAe,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './events.js';
2
+ export * from './handlers.js';
3
+ export * from './manager.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/pipeline/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,143 @@
1
+ import { WebSocket } from 'undici';
2
+ import { authManager } from '../../auth/index.js';
3
+ import { getConfig } from '../../config/index.js';
4
+ import { logger } from '../../infra/logger.js';
5
+ import { parsePipelineMessage, } from './events.js';
6
+ function formatError(err) {
7
+ if (typeof err === 'string')
8
+ return err;
9
+ if ('error' in err && err.error instanceof Error) {
10
+ return err.error.message || err.message;
11
+ }
12
+ if ('message' in err && typeof err.message === 'string') {
13
+ return err.message;
14
+ }
15
+ return 'Unknown error';
16
+ }
17
+ function readPipelineConfig() {
18
+ const pipeline = getConfig().pipeline;
19
+ return {
20
+ enabled: pipeline.enabled,
21
+ url: pipeline.url,
22
+ reconnectMs: pipeline.reconnectMs,
23
+ userAgent: pipeline.userAgent,
24
+ };
25
+ }
26
+ export class PipelineManager {
27
+ ws = null;
28
+ listeners = new Set();
29
+ reconnectTimer = null;
30
+ started = false;
31
+ connecting = false;
32
+ config = readPipelineConfig();
33
+ unsubscribeAuth = null;
34
+ onEvent(listener) {
35
+ this.listeners.add(listener);
36
+ return () => this.listeners.delete(listener);
37
+ }
38
+ start() {
39
+ if (this.started)
40
+ return;
41
+ this.started = true;
42
+ this.config = readPipelineConfig();
43
+ if (!this.config.enabled) {
44
+ logger.info('Pipeline disabled via config.');
45
+ return;
46
+ }
47
+ this.unsubscribeAuth = authManager.onStatusChange((status) => {
48
+ if (!this.started)
49
+ return;
50
+ if (status.loggedIn) {
51
+ void this.connectIfPossible();
52
+ }
53
+ else {
54
+ this.disconnect();
55
+ }
56
+ });
57
+ if (authManager.getStatus().loggedIn) {
58
+ void this.connectIfPossible();
59
+ }
60
+ }
61
+ stop() {
62
+ this.started = false;
63
+ if (this.unsubscribeAuth) {
64
+ this.unsubscribeAuth();
65
+ this.unsubscribeAuth = null;
66
+ }
67
+ this.clearReconnect();
68
+ this.disconnect();
69
+ }
70
+ clearReconnect() {
71
+ if (this.reconnectTimer) {
72
+ clearTimeout(this.reconnectTimer);
73
+ this.reconnectTimer = null;
74
+ }
75
+ }
76
+ scheduleReconnect() {
77
+ if (!this.started || !this.config.enabled)
78
+ return;
79
+ if (this.reconnectTimer)
80
+ return;
81
+ this.reconnectTimer = setTimeout(() => {
82
+ this.reconnectTimer = null;
83
+ void this.connectIfPossible();
84
+ }, this.config.reconnectMs);
85
+ }
86
+ disconnect() {
87
+ if (this.ws) {
88
+ this.ws.close();
89
+ this.ws = null;
90
+ }
91
+ }
92
+ async connectIfPossible() {
93
+ if (this.connecting || this.ws)
94
+ return;
95
+ if (!this.started || !this.config.enabled)
96
+ return;
97
+ if (!authManager.getStatus().loggedIn)
98
+ return;
99
+ this.connecting = true;
100
+ try {
101
+ const authToken = (await authManager.getCookieValue('auth', 'https://api.vrchat.cloud')) ??
102
+ (await authManager.getCookieValue('twoFactorAuth', 'https://api.vrchat.cloud'));
103
+ if (!authToken) {
104
+ logger.warn('Pipeline auth token missing; waiting for login.');
105
+ return;
106
+ }
107
+ const url = new URL(this.config.url);
108
+ url.searchParams.set('authToken', authToken);
109
+ const socket = new WebSocket(url.toString(), {
110
+ headers: { 'user-agent': this.config.userAgent },
111
+ });
112
+ this.ws = socket;
113
+ socket.onopen = () => {
114
+ logger.info('Pipeline websocket connected.');
115
+ };
116
+ socket.onmessage = (message) => {
117
+ const event = parsePipelineMessage(message.data);
118
+ if (!event)
119
+ return;
120
+ for (const listener of this.listeners) {
121
+ listener(event);
122
+ }
123
+ };
124
+ socket.onerror = (err) => {
125
+ logger.warn('Pipeline websocket error', {
126
+ message: formatError(err),
127
+ });
128
+ };
129
+ socket.onclose = () => {
130
+ logger.warn('Pipeline websocket closed');
131
+ this.ws = null;
132
+ if (this.started && this.config.enabled && authManager.getStatus().loggedIn) {
133
+ this.scheduleReconnect();
134
+ }
135
+ };
136
+ }
137
+ finally {
138
+ this.connecting = false;
139
+ }
140
+ }
141
+ }
142
+ export const pipelineManager = new PipelineManager();
143
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/services/pipeline/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { callReadOperationParsed, callWriteOperationParsed } from '../api/client.js';
2
+ import { STATUS_FROM_COLOR, StatusSchema } from '../../models/status.js';
3
+ import { resolveUserId } from '../users/index.js';
4
+ const STATUS_VALUES = new Set(StatusSchema.options);
5
+ function isStatusValue(value) {
6
+ return STATUS_VALUES.has(value);
7
+ }
8
+ function resolveStatus(input) {
9
+ if (input.status)
10
+ return input.status;
11
+ if (input.color)
12
+ return STATUS_FROM_COLOR[input.color];
13
+ return null;
14
+ }
15
+ export async function getCurrentStatus() {
16
+ const result = await callReadOperationParsed('getCurrentUser', {});
17
+ const user = result.data;
18
+ return {
19
+ userId: typeof user?.id === 'string' ? user.id : undefined,
20
+ status: typeof user?.status === 'string' && isStatusValue(user.status) ? user.status : undefined,
21
+ statusDescription: typeof user?.statusDescription === 'string' ? user.statusDescription : undefined,
22
+ };
23
+ }
24
+ export async function updateStatus(input) {
25
+ const status = resolveStatus(input);
26
+ if (!status) {
27
+ throw new Error('Provide status or color.');
28
+ }
29
+ const resolved = await resolveUserId({ userId: input.userId });
30
+ if (!resolved.ok) {
31
+ throw new Error(resolved.reason);
32
+ }
33
+ const body = { status };
34
+ if (typeof input.description === 'string') {
35
+ body.statusDescription = input.description;
36
+ }
37
+ const result = await callWriteOperationParsed('updateUser', { userId: resolved.userId }, body);
38
+ const user = result.data;
39
+ const responseStatus = typeof user?.status === 'string' && isStatusValue(user.status) ? user.status : undefined;
40
+ const finalStatus = responseStatus && (responseStatus !== 'offline' || status === 'offline')
41
+ ? responseStatus
42
+ : status;
43
+ return {
44
+ userId: typeof user?.id === 'string' ? user.id : resolved.userId,
45
+ status: finalStatus,
46
+ statusDescription: typeof user?.statusDescription === 'string'
47
+ ? user.statusDescription
48
+ : typeof body.statusDescription === 'string'
49
+ ? body.statusDescription
50
+ : undefined,
51
+ };
52
+ }
53
+ //# sourceMappingURL=curated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curated.js","sourceRoot":"","sources":["../../../../src/services/status/curated.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './curated.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/status/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}