@metatell/bot-core 0.0.1

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 (185) hide show
  1. package/dist/CoreServiceFactory.d.ts +25 -0
  2. package/dist/CoreServiceFactory.d.ts.map +1 -0
  3. package/dist/CoreServiceFactory.js +102 -0
  4. package/dist/CoreServiceFactory.js.map +1 -0
  5. package/dist/ServiceContainer.d.ts +87 -0
  6. package/dist/ServiceContainer.d.ts.map +1 -0
  7. package/dist/ServiceContainer.js +119 -0
  8. package/dist/ServiceContainer.js.map +1 -0
  9. package/dist/ServiceIdentifier.d.ts +28 -0
  10. package/dist/ServiceIdentifier.d.ts.map +1 -0
  11. package/dist/ServiceIdentifier.js +18 -0
  12. package/dist/ServiceIdentifier.js.map +1 -0
  13. package/dist/builders/NafMessageBuilder.d.ts +242 -0
  14. package/dist/builders/NafMessageBuilder.d.ts.map +1 -0
  15. package/dist/builders/NafMessageBuilder.js +288 -0
  16. package/dist/builders/NafMessageBuilder.js.map +1 -0
  17. package/dist/errors/animation-errors.d.ts +41 -0
  18. package/dist/errors/animation-errors.d.ts.map +1 -0
  19. package/dist/errors/animation-errors.js +60 -0
  20. package/dist/errors/animation-errors.js.map +1 -0
  21. package/dist/index.d.ts +32 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +27 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/interfaces/IAnimationService.d.ts +42 -0
  26. package/dist/interfaces/IAnimationService.d.ts.map +1 -0
  27. package/dist/interfaces/IAnimationService.js +5 -0
  28. package/dist/interfaces/IAnimationService.js.map +1 -0
  29. package/dist/interfaces/IAppSettings.d.ts +11 -0
  30. package/dist/interfaces/IAppSettings.d.ts.map +1 -0
  31. package/dist/interfaces/IAppSettings.js +5 -0
  32. package/dist/interfaces/IAppSettings.js.map +1 -0
  33. package/dist/interfaces/IAuthenticationService.d.ts +20 -0
  34. package/dist/interfaces/IAuthenticationService.d.ts.map +1 -0
  35. package/dist/interfaces/IAuthenticationService.js +5 -0
  36. package/dist/interfaces/IAuthenticationService.js.map +1 -0
  37. package/dist/interfaces/IAvatarController.d.ts +54 -0
  38. package/dist/interfaces/IAvatarController.d.ts.map +1 -0
  39. package/dist/interfaces/IAvatarController.js +5 -0
  40. package/dist/interfaces/IAvatarController.js.map +1 -0
  41. package/dist/interfaces/IConfigurationProvider.d.ts +39 -0
  42. package/dist/interfaces/IConfigurationProvider.d.ts.map +1 -0
  43. package/dist/interfaces/IConfigurationProvider.js +5 -0
  44. package/dist/interfaces/IConfigurationProvider.js.map +1 -0
  45. package/dist/interfaces/IConnectionManager.d.ts +23 -0
  46. package/dist/interfaces/IConnectionManager.d.ts.map +1 -0
  47. package/dist/interfaces/IConnectionManager.js +5 -0
  48. package/dist/interfaces/IConnectionManager.js.map +1 -0
  49. package/dist/interfaces/IEventBus.d.ts +28 -0
  50. package/dist/interfaces/IEventBus.d.ts.map +1 -0
  51. package/dist/interfaces/IEventBus.js +31 -0
  52. package/dist/interfaces/IEventBus.js.map +1 -0
  53. package/dist/interfaces/IMessageService.d.ts +25 -0
  54. package/dist/interfaces/IMessageService.d.ts.map +1 -0
  55. package/dist/interfaces/IMessageService.js +5 -0
  56. package/dist/interfaces/IMessageService.js.map +1 -0
  57. package/dist/interfaces/IOrganizationService.d.ts +58 -0
  58. package/dist/interfaces/IOrganizationService.d.ts.map +1 -0
  59. package/dist/interfaces/IOrganizationService.js +5 -0
  60. package/dist/interfaces/IOrganizationService.js.map +1 -0
  61. package/dist/interfaces/IPresenceManager.d.ts +20 -0
  62. package/dist/interfaces/IPresenceManager.d.ts.map +1 -0
  63. package/dist/interfaces/IPresenceManager.js +5 -0
  64. package/dist/interfaces/IPresenceManager.js.map +1 -0
  65. package/dist/interfaces/IUserAvatarManager.d.ts +88 -0
  66. package/dist/interfaces/IUserAvatarManager.d.ts.map +1 -0
  67. package/dist/interfaces/IUserAvatarManager.js +5 -0
  68. package/dist/interfaces/IUserAvatarManager.js.map +1 -0
  69. package/dist/interfaces/IWebSocketConnectionManager.d.ts +14 -0
  70. package/dist/interfaces/IWebSocketConnectionManager.d.ts.map +1 -0
  71. package/dist/interfaces/IWebSocketConnectionManager.js +2 -0
  72. package/dist/interfaces/IWebSocketConnectionManager.js.map +1 -0
  73. package/dist/logging/LogEventEmitter.d.ts +38 -0
  74. package/dist/logging/LogEventEmitter.d.ts.map +1 -0
  75. package/dist/logging/LogEventEmitter.js +54 -0
  76. package/dist/logging/LogEventEmitter.js.map +1 -0
  77. package/dist/logging/index.d.ts +22 -0
  78. package/dist/logging/index.d.ts.map +1 -0
  79. package/dist/logging/index.js +10 -0
  80. package/dist/logging/index.js.map +1 -0
  81. package/dist/logging/providers/default.d.ts +22 -0
  82. package/dist/logging/providers/default.d.ts.map +1 -0
  83. package/dist/logging/providers/default.js +175 -0
  84. package/dist/logging/providers/default.js.map +1 -0
  85. package/dist/logging/spi.d.ts +35 -0
  86. package/dist/logging/spi.d.ts.map +1 -0
  87. package/dist/logging/spi.js +25 -0
  88. package/dist/logging/spi.js.map +1 -0
  89. package/dist/services/AnimationService.d.ts +38 -0
  90. package/dist/services/AnimationService.d.ts.map +1 -0
  91. package/dist/services/AnimationService.js +157 -0
  92. package/dist/services/AnimationService.js.map +1 -0
  93. package/dist/services/AppSettings.d.ts +14 -0
  94. package/dist/services/AppSettings.d.ts.map +1 -0
  95. package/dist/services/AppSettings.js +48 -0
  96. package/dist/services/AppSettings.js.map +1 -0
  97. package/dist/services/AuthenticationService.d.ts +13 -0
  98. package/dist/services/AuthenticationService.d.ts.map +1 -0
  99. package/dist/services/AuthenticationService.js +44 -0
  100. package/dist/services/AuthenticationService.js.map +1 -0
  101. package/dist/services/AvatarController.d.ts +50 -0
  102. package/dist/services/AvatarController.d.ts.map +1 -0
  103. package/dist/services/AvatarController.js +409 -0
  104. package/dist/services/AvatarController.js.map +1 -0
  105. package/dist/services/ChannelService.d.ts +19 -0
  106. package/dist/services/ChannelService.d.ts.map +1 -0
  107. package/dist/services/ChannelService.js +113 -0
  108. package/dist/services/ChannelService.js.map +1 -0
  109. package/dist/services/ConfigurationProvider.d.ts +13 -0
  110. package/dist/services/ConfigurationProvider.d.ts.map +1 -0
  111. package/dist/services/ConfigurationProvider.js +49 -0
  112. package/dist/services/ConfigurationProvider.js.map +1 -0
  113. package/dist/services/EventBus.d.ts +11 -0
  114. package/dist/services/EventBus.d.ts.map +1 -0
  115. package/dist/services/EventBus.js +54 -0
  116. package/dist/services/EventBus.js.map +1 -0
  117. package/dist/services/IChannelService.d.ts +57 -0
  118. package/dist/services/IChannelService.d.ts.map +1 -0
  119. package/dist/services/IChannelService.js +6 -0
  120. package/dist/services/IChannelService.js.map +1 -0
  121. package/dist/services/MessageService.d.ts +23 -0
  122. package/dist/services/MessageService.d.ts.map +1 -0
  123. package/dist/services/MessageService.js +141 -0
  124. package/dist/services/MessageService.js.map +1 -0
  125. package/dist/services/OrganizationService.d.ts +11 -0
  126. package/dist/services/OrganizationService.d.ts.map +1 -0
  127. package/dist/services/OrganizationService.js +121 -0
  128. package/dist/services/OrganizationService.js.map +1 -0
  129. package/dist/services/PresenceManager.d.ts +21 -0
  130. package/dist/services/PresenceManager.d.ts.map +1 -0
  131. package/dist/services/PresenceManager.js +143 -0
  132. package/dist/services/PresenceManager.js.map +1 -0
  133. package/dist/services/UserAvatarManager.d.ts +61 -0
  134. package/dist/services/UserAvatarManager.d.ts.map +1 -0
  135. package/dist/services/UserAvatarManager.js +466 -0
  136. package/dist/services/UserAvatarManager.js.map +1 -0
  137. package/dist/services/WebSocketConnectionManager.d.ts +26 -0
  138. package/dist/services/WebSocketConnectionManager.d.ts.map +1 -0
  139. package/dist/services/WebSocketConnectionManager.js +223 -0
  140. package/dist/services/WebSocketConnectionManager.js.map +1 -0
  141. package/dist/services/resolvers/CompositeUserIdResolver.d.ts +20 -0
  142. package/dist/services/resolvers/CompositeUserIdResolver.d.ts.map +1 -0
  143. package/dist/services/resolvers/CompositeUserIdResolver.js +46 -0
  144. package/dist/services/resolvers/CompositeUserIdResolver.js.map +1 -0
  145. package/dist/services/resolvers/CreatorMatchResolver.d.ts +15 -0
  146. package/dist/services/resolvers/CreatorMatchResolver.d.ts.map +1 -0
  147. package/dist/services/resolvers/CreatorMatchResolver.js +31 -0
  148. package/dist/services/resolvers/CreatorMatchResolver.js.map +1 -0
  149. package/dist/services/resolvers/ExactMatchResolver.d.ts +15 -0
  150. package/dist/services/resolvers/ExactMatchResolver.d.ts.map +1 -0
  151. package/dist/services/resolvers/ExactMatchResolver.js +28 -0
  152. package/dist/services/resolvers/ExactMatchResolver.js.map +1 -0
  153. package/dist/services/resolvers/IUserIdResolver.d.ts +53 -0
  154. package/dist/services/resolvers/IUserIdResolver.d.ts.map +1 -0
  155. package/dist/services/resolvers/IUserIdResolver.js +6 -0
  156. package/dist/services/resolvers/IUserIdResolver.js.map +1 -0
  157. package/dist/services/resolvers/OwnerMatchResolver.d.ts +15 -0
  158. package/dist/services/resolvers/OwnerMatchResolver.d.ts.map +1 -0
  159. package/dist/services/resolvers/OwnerMatchResolver.js +31 -0
  160. package/dist/services/resolvers/OwnerMatchResolver.js.map +1 -0
  161. package/dist/services/resolvers/PrefixMatchResolver.d.ts +17 -0
  162. package/dist/services/resolvers/PrefixMatchResolver.d.ts.map +1 -0
  163. package/dist/services/resolvers/PrefixMatchResolver.js +36 -0
  164. package/dist/services/resolvers/PrefixMatchResolver.js.map +1 -0
  165. package/dist/services/resolvers/index.d.ts +10 -0
  166. package/dist/services/resolvers/index.d.ts.map +1 -0
  167. package/dist/services/resolvers/index.js +9 -0
  168. package/dist/services/resolvers/index.js.map +1 -0
  169. package/dist/types/animation.d.ts +92 -0
  170. package/dist/types/animation.d.ts.map +1 -0
  171. package/dist/types/animation.js +31 -0
  172. package/dist/types/animation.js.map +1 -0
  173. package/dist/types/index.d.ts +14 -0
  174. package/dist/types/index.d.ts.map +1 -0
  175. package/dist/types/index.js +5 -0
  176. package/dist/types/index.js.map +1 -0
  177. package/dist/types/naf.d.ts +229 -0
  178. package/dist/types/naf.d.ts.map +1 -0
  179. package/dist/types/naf.js +93 -0
  180. package/dist/types/naf.js.map +1 -0
  181. package/dist/utils/nafParser.d.ts +64 -0
  182. package/dist/utils/nafParser.d.ts.map +1 -0
  183. package/dist/utils/nafParser.js +99 -0
  184. package/dist/utils/nafParser.js.map +1 -0
  185. package/package.json +37 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarController.d.ts","sourceRoot":"","sources":["../../src/services/AvatarController.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACT,MAAM,oCAAoC,CAAA;AAC3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AACrF,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,4BAA4B,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAEvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAO1F,qBAAa,gBAAiB,YAAW,iBAAiB;IAOtD,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB,CAAC;IAT3B,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,MAAM,CAAgC;gBAGpC,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,sBAAsB,EACtC,QAAQ,EAAE,SAAS,EACnB,gBAAgB,CAAC,EAAE,iBAAiB,YAAA;IAQxC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0GrF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAMtB,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBvC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/C,OAAO,CAAC,iBAAiB;IAiBnB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C7D,QAAQ,IAAI,WAAW,GAAG,IAAI;IAIxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkDnC;;OAEG;IACG,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,uBAAuB,CAAC;IA+DnC;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCpC;;OAEG;YACW,yBAAyB;CA6BxC"}
@@ -0,0 +1,409 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { NafMessageBuilder } from '../builders/NafMessageBuilder.js';
3
+ import { AnimationNotFoundError, AvatarNotSpawnedError } from '../errors/animation-errors.js';
4
+ import { SystemEvents } from '../interfaces/IEventBus.js';
5
+ import { getLogger } from '../logging/index.js';
6
+ // Constants for default values
7
+ const DEFAULT_TEMPLATE = '#remote-avatar';
8
+ const DEFAULT_AVATAR_TYPE = 'skinnable';
9
+ const ORGANIZATION_AVATAR_TYPE = 'avatar-bot';
10
+ export class AvatarController {
11
+ messageService;
12
+ configProvider;
13
+ eventBus;
14
+ animationService;
15
+ state = null;
16
+ sessionId = null;
17
+ currentAnimation = null;
18
+ logger = getLogger('AvatarController');
19
+ constructor(messageService, configProvider, eventBus, animationService) {
20
+ this.messageService = messageService;
21
+ this.configProvider = configProvider;
22
+ this.eventBus = eventBus;
23
+ this.animationService = animationService;
24
+ // Listen for room joined to get session ID
25
+ this.eventBus.on(SystemEvents.ROOM_JOINED, (data) => {
26
+ this.sessionId = data.session_id;
27
+ });
28
+ }
29
+ async spawn(avatarId, position, avatarSrc) {
30
+ if (!this.sessionId) {
31
+ throw new Error('Cannot spawn avatar: Not connected to room');
32
+ }
33
+ this.logger.debug('spawn() called with parameters:', {
34
+ avatarId,
35
+ position,
36
+ avatarSrc,
37
+ });
38
+ const config = this.configProvider.getConfiguration();
39
+ const timestamp = Date.now();
40
+ const networkId = this.sessionId;
41
+ const spawnPosition = position || { x: 0, y: 0.2, z: 0 };
42
+ // Determine avatar source URL
43
+ let finalAvatarSrc;
44
+ if (avatarSrc) {
45
+ // Use provided avatar source URL (organization avatar GLTF URLs are passed here)
46
+ finalAvatarSrc = avatarSrc;
47
+ this.logger.debug('Using provided avatar source URL', { avatarSrc });
48
+ }
49
+ else if (this.isOrganizationAvatar(avatarId)) {
50
+ // Organization avatar (UUID format) - avatarSrc must be provided
51
+ throw new Error(`Organization avatar requires avatarSrc URL. Avatar ID: ${avatarId}`);
52
+ }
53
+ else {
54
+ // Individual avatar (non-UUID format) - use storage URL
55
+ let storageUrl = config.storageUrl;
56
+ if (!storageUrl && config.hubUrl) {
57
+ storageUrl = this.determineStorageUrl(config.hubUrl);
58
+ }
59
+ storageUrl = storageUrl || 'https://storage.metatell.app:443';
60
+ finalAvatarSrc = `${storageUrl}/api/v1/avatars/${avatarId}/avatar.gltf?v=${timestamp}`;
61
+ }
62
+ // Update internal state
63
+ this.state = {
64
+ networkId,
65
+ position: spawnPosition,
66
+ rotation: { x: 0, y: 0, z: 0, w: 1 },
67
+ avatarId,
68
+ avatarSrc: finalAvatarSrc,
69
+ displayName: config.profile.displayName,
70
+ };
71
+ // Send initial NAF message (unreliable) for immediate visibility
72
+ const nafMessage = new NafMessageBuilder()
73
+ .withDataType('u')
74
+ .withNetworkId(networkId)
75
+ .withOwner(this.sessionId)
76
+ .withCreator(this.sessionId)
77
+ .withFirstSync(true)
78
+ .withPosition(spawnPosition)
79
+ .withAvatar({
80
+ avatarSrc: this.state.avatarSrc || '',
81
+ avatarType: this.state.avatarId && this.isOrganizationAvatar(this.state.avatarId)
82
+ ? ORGANIZATION_AVATAR_TYPE
83
+ : DEFAULT_AVATAR_TYPE,
84
+ muted: false,
85
+ isSharingAvatarCamera: false,
86
+ ...(this.state.avatarId && this.isOrganizationAvatar(this.state.avatarId)
87
+ ? { files: {} }
88
+ : {}),
89
+ })
90
+ .build();
91
+ await this.messageService.sendNAF(nafMessage);
92
+ // Send NAFR message (reliable) to ensure critical spawn data arrives
93
+ const nafrMessage = new NafMessageBuilder()
94
+ .withDataType('um')
95
+ .withNetworkId(networkId)
96
+ .withOwner(this.sessionId)
97
+ .withCreator(this.sessionId)
98
+ .withPosition(spawnPosition)
99
+ .withAvatar({
100
+ avatarSrc: this.state.avatarSrc || '',
101
+ avatarType: this.state.avatarId && this.isOrganizationAvatar(this.state.avatarId)
102
+ ? ORGANIZATION_AVATAR_TYPE
103
+ : DEFAULT_AVATAR_TYPE,
104
+ muted: false,
105
+ isSharingAvatarCamera: false,
106
+ ...(this.state.avatarId && this.isOrganizationAvatar(this.state.avatarId)
107
+ ? { files: {} }
108
+ : {}),
109
+ })
110
+ .build();
111
+ await this.messageService.sendNAFR(nafrMessage);
112
+ // Emit event
113
+ this.eventBus.emit(SystemEvents.AVATAR_SPAWNED, this.state);
114
+ // アニメーションサービスに現在のアバターIDを設定
115
+ if (this.animationService) {
116
+ this.animationService.setCurrentAvatarId(avatarId);
117
+ }
118
+ this.logger.debug(`✅ Avatar spawned with ID: ${avatarId}`, {
119
+ avatarSrc: finalAvatarSrc,
120
+ isOrganization: this.isOrganizationAvatar(avatarId),
121
+ });
122
+ }
123
+ /**
124
+ * Determine storage URL based on hub URL environment
125
+ */
126
+ determineStorageUrl(hubUrl) {
127
+ try {
128
+ const url = new URL(hubUrl);
129
+ const hostname = url.hostname;
130
+ // Map hub domains to storage domains
131
+ if (hostname.includes('metatell-stg.app') || hostname.includes('-stg.')) {
132
+ return 'https://storage.metatell-stg.app:443';
133
+ }
134
+ else if (hostname.includes('metatell-dev.app') || hostname.includes('-dev.')) {
135
+ return 'https://storage.metatell-dev.app:443';
136
+ }
137
+ else {
138
+ // Production or default
139
+ return 'https://storage.metatell.app:443';
140
+ }
141
+ }
142
+ catch (error) {
143
+ this.logger.warn('Failed to parse hub URL for storage URL determination', { hubUrl, error });
144
+ return 'https://storage.metatell.app:443';
145
+ }
146
+ }
147
+ /**
148
+ * Check if avatar ID is organization avatar (UUID format)
149
+ */
150
+ isOrganizationAvatar(avatarId) {
151
+ // UUID v4 format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
152
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
153
+ return uuidRegex.test(avatarId);
154
+ }
155
+ async move(position) {
156
+ if (!this.state || !this.sessionId) {
157
+ throw new Error('Avatar not spawned');
158
+ }
159
+ this.state.position = position;
160
+ // Send position update via NAFR (reliable) to ensure movement is received
161
+ // Position updates are critical for avatar synchronization
162
+ const nafMessage = new NafMessageBuilder()
163
+ .withDataType('um')
164
+ .withNetworkId(this.state.networkId)
165
+ .withOwner(this.sessionId)
166
+ .withCreator(this.sessionId)
167
+ .withPosition(position)
168
+ .build();
169
+ await this.messageService.sendNAFR(nafMessage);
170
+ this.eventBus.emit(SystemEvents.AVATAR_MOVED, this.state);
171
+ // 移動ログは頻繁すぎるのでコメントアウト
172
+ // this.logger.debug(`Avatar moved to position (${position.x}, ${position.y}, ${position.z})`)
173
+ }
174
+ async rotate(rotation) {
175
+ if (!this.state || !this.sessionId) {
176
+ throw new Error('Avatar not spawned');
177
+ }
178
+ this.state.rotation = rotation;
179
+ // クォータニオンをオイラー角(度数)に変換
180
+ const euler = this.quaternionToEuler(rotation);
181
+ const nafMessage = new NafMessageBuilder()
182
+ .withDataType('um')
183
+ .withNetworkId(this.state.networkId)
184
+ .withOwner(this.sessionId)
185
+ .withCreator(this.sessionId)
186
+ .withPosition(this.state.position) // 位置情報も含める
187
+ .withBodyRotation(euler) // ブラウザクライアント準拠(オイラー角、度数)
188
+ .build();
189
+ await this.messageService.sendNAFR(nafMessage);
190
+ this.eventBus.emit(SystemEvents.AVATAR_UPDATED, this.state);
191
+ }
192
+ quaternionToEuler(rotation) {
193
+ // クォータニオンからオイラー角への変換(ZYX順、度数)
194
+ const { x, y, z, w } = rotation;
195
+ // wがundefinedの場合は正規化されたクォータニオンから計算
196
+ const normalizedW = w ?? Math.sqrt(Math.max(0, 1 - x * x - y * y - z * z));
197
+ // Y軸回転のみの場合の簡略化された変換
198
+ const yaw = Math.atan2(2 * (normalizedW * y + x * z), 1 - 2 * (y * y + z * z));
199
+ return {
200
+ x: 0, // X軸回転(ピッチ)
201
+ y: yaw * (180 / Math.PI), // Y軸回転(ヨー)を度数に変換
202
+ z: 0, // Z軸回転(ロール)
203
+ };
204
+ }
205
+ async updateState(state) {
206
+ if (!this.state || !this.sessionId) {
207
+ throw new Error('Avatar not spawned');
208
+ }
209
+ this.state = { ...this.state, ...state };
210
+ // Use builder pattern for consistent NAF message construction
211
+ let builder = new NafMessageBuilder()
212
+ .withDataType('um')
213
+ .withNetworkId(this.state.networkId)
214
+ .withOwner(this.sessionId)
215
+ .withCreator(this.sessionId);
216
+ // 常に現在の位置情報を含める(更新されていない場合でも)
217
+ builder = builder.withPosition(state.position || this.state.position);
218
+ if (state.rotation) {
219
+ const euler = this.quaternionToEuler(state.rotation);
220
+ builder = builder.withBodyRotation(euler);
221
+ }
222
+ if (state.avatarSrc || state.avatarId) {
223
+ builder = builder.withAvatar({
224
+ avatarSrc: this.state.avatarSrc || '',
225
+ avatarType: this.state.avatarId && this.isOrganizationAvatar(this.state.avatarId)
226
+ ? ORGANIZATION_AVATAR_TYPE
227
+ : DEFAULT_AVATAR_TYPE,
228
+ muted: false,
229
+ isSharingAvatarCamera: false,
230
+ ...(this.state.avatarId && this.isOrganizationAvatar(this.state.avatarId)
231
+ ? { files: {} }
232
+ : {}),
233
+ });
234
+ }
235
+ const nafMessage = builder.build();
236
+ await this.messageService.sendNAFR(nafMessage);
237
+ this.eventBus.emit(SystemEvents.AVATAR_UPDATED, this.state);
238
+ }
239
+ getState() {
240
+ return this.state ? { ...this.state } : null;
241
+ }
242
+ async destroy() {
243
+ this.state = null;
244
+ // Additional cleanup if needed
245
+ }
246
+ async resyncAvatar() {
247
+ if (!this.state || !this.sessionId) {
248
+ throw new Error('Avatar not spawned');
249
+ }
250
+ // Build NAF message using the builder pattern
251
+ const nafMessage = new NafMessageBuilder()
252
+ .withDataType('u')
253
+ .withNetworkId(this.state.networkId)
254
+ .withOwner(this.sessionId)
255
+ .withCreator(this.sessionId)
256
+ .withLastOwnerTime()
257
+ .withTemplate(DEFAULT_TEMPLATE)
258
+ .withPersistent(false)
259
+ .withFirstSync(true) // Important: Set first sync flag for new users
260
+ .withPosition(this.state.position)
261
+ .withVelocity({ x: 0, y: 0, z: 0 })
262
+ .withScale({ x: 1, y: 1, z: 1 })
263
+ .withAvatar({
264
+ avatarSrc: this.state.avatarSrc || '',
265
+ avatarType: this.state.avatarId && this.isOrganizationAvatar(this.state.avatarId)
266
+ ? ORGANIZATION_AVATAR_TYPE
267
+ : DEFAULT_AVATAR_TYPE,
268
+ muted: false,
269
+ isSharingAvatarCamera: false,
270
+ ...(this.state.avatarId && this.isOrganizationAvatar(this.state.avatarId)
271
+ ? { files: {} }
272
+ : {}),
273
+ })
274
+ .withHeadRotation({ x: 0, y: 0, z: 0, w: 1 })
275
+ .withLeftHandRotation({ x: 0, y: 0, z: 0, w: 1 })
276
+ .withRightHandRotation({ x: 0, y: 0, z: 0, w: 1 })
277
+ .withLeftHandPosition({ x: 0, y: 0, z: 0 })
278
+ .withRightHandPosition({ x: 0, y: 0, z: 0 })
279
+ .withHandRaised(false)
280
+ .withPinPosition({ x: 0, y: 0, z: 0 })
281
+ .withPinScale({ x: 1, y: 1, z: 1 })
282
+ .withFaceSnapshotEnabled(false)
283
+ .withFaceSnapshot(null)
284
+ .withBodyRotation({ x: 0, y: 0, z: 0 })
285
+ .withMegaphone(false)
286
+ .withTemporaryMegaphone(false)
287
+ .build();
288
+ await this.messageService.sendNAF(nafMessage);
289
+ this.logger.debug(`✅ Avatar resynced for new user`);
290
+ }
291
+ /**
292
+ * Play animation on the avatar
293
+ */
294
+ async playAnimation(animationId, options) {
295
+ if (!this.state || !this.sessionId) {
296
+ throw new AvatarNotSpawnedError();
297
+ }
298
+ // UUID形式のアニメーションかチェック
299
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
300
+ const isCustomAnimation = uuidRegex.test(animationId);
301
+ // Validate animation exists (if animation service is available)
302
+ // カスタムアニメーション(UUID)の場合は検証をスキップ
303
+ if (this.animationService && !isCustomAnimation) {
304
+ const isValid = await this.animationService.validateAnimation(animationId);
305
+ if (!isValid) {
306
+ throw new AnimationNotFoundError(animationId);
307
+ }
308
+ }
309
+ const playbackId = uuidv4();
310
+ const timestamp = Date.now();
311
+ // Update internal state
312
+ this.currentAnimation = animationId;
313
+ this.state.currentAnimation = animationId;
314
+ // v-air_clientと同じ形式でNAFメッセージを構築
315
+ // vrm-avatar-status-managerコンポーネント(インデックス13)のみを送信
316
+ const nafMessage = new NafMessageBuilder()
317
+ .withDataType('um')
318
+ .withNetworkId(this.state.networkId)
319
+ .withOwner(this.sessionId)
320
+ .withCreator(this.sessionId)
321
+ .withPosition(this.state.position) // 位置情報も含める
322
+ .withCustomComponent('13', {
323
+ status: animationId,
324
+ animationRunId: playbackId,
325
+ })
326
+ .build();
327
+ // Send via NAFR for reliability
328
+ await this.messageService.sendNAFR(nafMessage);
329
+ // Emit event
330
+ this.eventBus.emit('animation:played', {
331
+ animationId,
332
+ playbackId,
333
+ options,
334
+ });
335
+ this.logger.debug('Animation played', {
336
+ animationId,
337
+ playbackId,
338
+ options,
339
+ });
340
+ return {
341
+ playbackId,
342
+ animationId,
343
+ startedAt: timestamp,
344
+ expectedDuration: await this.calculateExpectedDuration(animationId, options),
345
+ };
346
+ }
347
+ /**
348
+ * Get current animation
349
+ */
350
+ getCurrentAnimation() {
351
+ return this.currentAnimation;
352
+ }
353
+ /**
354
+ * Stop current animation
355
+ */
356
+ async stopAnimation() {
357
+ if (!this.state || !this.sessionId) {
358
+ throw new AvatarNotSpawnedError();
359
+ }
360
+ // Clear animation state
361
+ this.currentAnimation = null;
362
+ this.state.currentAnimation = undefined;
363
+ const playbackId = uuidv4();
364
+ // v-air_clientと同じ形式でNAFメッセージを構築
365
+ const nafMessage = new NafMessageBuilder()
366
+ .withDataType('um')
367
+ .withNetworkId(this.state.networkId)
368
+ .withOwner(this.sessionId)
369
+ .withCreator(this.sessionId)
370
+ .withCustomComponent('13', {
371
+ status: 'idle',
372
+ animationRunId: playbackId,
373
+ })
374
+ .build();
375
+ await this.messageService.sendNAFR(nafMessage);
376
+ this.eventBus.emit('animation:stopped', {
377
+ animationId: 'idle',
378
+ playbackId,
379
+ });
380
+ this.logger.info('Animation stopped, returned to idle');
381
+ }
382
+ /**
383
+ * Calculate expected animation duration
384
+ */
385
+ async calculateExpectedDuration(animationId, options) {
386
+ if (!this.animationService) {
387
+ return undefined;
388
+ }
389
+ // UUID形式のアニメーションかチェック
390
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
391
+ const isCustomAnimation = uuidRegex.test(animationId);
392
+ // カスタムアニメーション(UUID)の場合はdurationを取得できない
393
+ if (isCustomAnimation) {
394
+ return undefined;
395
+ }
396
+ try {
397
+ const animation = await this.animationService.loadAnimation(animationId);
398
+ if (animation.duration) {
399
+ const timeScale = options?.timeScale || 1;
400
+ return animation.duration / timeScale;
401
+ }
402
+ }
403
+ catch {
404
+ // Ignore errors, return undefined
405
+ }
406
+ return undefined;
407
+ }
408
+ }
409
+ //# sourceMappingURL=AvatarController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarController.js","sourceRoot":"","sources":["../../src/services/AvatarController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Implementation of channel communication service
3
+ * Encapsulates Phoenix channel operations with proper error handling and retries
4
+ */
5
+ import type { Channel } from 'phoenix';
6
+ import type { BatchPushOperation, IChannelService, PushOptions, PushResult } from './IChannelService.js';
7
+ export declare class ChannelService implements IChannelService {
8
+ private readonly logger;
9
+ private readonly defaultTimeoutMs;
10
+ private readonly defaultRetryDelayMs;
11
+ push<T = unknown>(channel: Channel, event: string, payload?: object, options?: PushOptions): Promise<T>;
12
+ pushSequence(channel: Channel, operations: BatchPushOperation[]): Promise<PushResult[]>;
13
+ pushParallel(channel: Channel, operations: BatchPushOperation[]): Promise<PushResult[]>;
14
+ subscribe(channel: Channel, event: string, handler: (payload: unknown) => void): () => void;
15
+ waitForEvent<T = unknown>(channel: Channel, event: string, timeoutMs?: number): Promise<T>;
16
+ private pushWithTimeout;
17
+ private delay;
18
+ }
19
+ //# sourceMappingURL=ChannelService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelService.d.ts","sourceRoot":"","sources":["../../src/services/ChannelService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,UAAU,EACX,MAAM,sBAAsB,CAAA;AAE7B,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAErC,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAW,EACpB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC;IAiCP,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA+BvF,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAwB7F,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAQrF,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,SAAwB,GAChC,OAAO,CAAC,CAAC,CAAC;IAeb,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Implementation of channel communication service
3
+ * Encapsulates Phoenix channel operations with proper error handling and retries
4
+ */
5
+ import { getLogger } from '../logging/index.js';
6
+ export class ChannelService {
7
+ logger = getLogger('ChannelService');
8
+ defaultTimeoutMs = 30000;
9
+ defaultRetryDelayMs = 1000;
10
+ async push(channel, event, payload = {}, options = {}) {
11
+ const { timeoutMs = this.defaultTimeoutMs, retries = 0, retryDelayMs = this.defaultRetryDelayMs, } = options;
12
+ let lastError;
13
+ let attempt = 0;
14
+ while (attempt <= retries) {
15
+ try {
16
+ return await this.pushWithTimeout(channel, event, payload, timeoutMs);
17
+ }
18
+ catch (error) {
19
+ lastError = error instanceof Error ? error : new Error(String(error));
20
+ if (attempt < retries) {
21
+ this.logger.debug(`Push '${event}' failed, retrying...`, {
22
+ attempt: attempt + 1,
23
+ maxRetries: retries,
24
+ error: lastError.message,
25
+ });
26
+ await this.delay(retryDelayMs * 2 ** attempt); // Exponential backoff
27
+ }
28
+ attempt++;
29
+ }
30
+ }
31
+ throw lastError || new Error(`Push '${event}' failed after ${retries + 1} attempts`);
32
+ }
33
+ async pushSequence(channel, operations) {
34
+ const results = [];
35
+ for (const op of operations) {
36
+ try {
37
+ const data = await this.push(channel, op.event, op.payload, op.options);
38
+ if (op.onSuccess) {
39
+ op.onSuccess(data);
40
+ }
41
+ results.push({ status: 'ok', data });
42
+ }
43
+ catch (error) {
44
+ const errorMessage = error instanceof Error ? error.message : String(error);
45
+ if (op.onError) {
46
+ op.onError(error instanceof Error ? error : new Error(errorMessage));
47
+ }
48
+ results.push({ status: 'error', error: errorMessage });
49
+ // Stop sequence on error unless explicitly handled
50
+ if (!op.onError) {
51
+ break;
52
+ }
53
+ }
54
+ }
55
+ return results;
56
+ }
57
+ async pushParallel(channel, operations) {
58
+ const promises = operations.map(async (op) => {
59
+ try {
60
+ const data = await this.push(channel, op.event, op.payload, op.options);
61
+ if (op.onSuccess) {
62
+ op.onSuccess(data);
63
+ }
64
+ return { status: 'ok', data };
65
+ }
66
+ catch (error) {
67
+ const errorMessage = error instanceof Error ? error.message : String(error);
68
+ if (op.onError) {
69
+ op.onError(error instanceof Error ? error : new Error(errorMessage));
70
+ }
71
+ return { status: 'error', error: errorMessage };
72
+ }
73
+ });
74
+ return Promise.all(promises);
75
+ }
76
+ subscribe(channel, event, handler) {
77
+ const ref = channel.on(event, handler);
78
+ return () => {
79
+ channel.off(event, ref);
80
+ };
81
+ }
82
+ async waitForEvent(channel, event, timeoutMs = this.defaultTimeoutMs) {
83
+ return new Promise((resolve, reject) => {
84
+ const timeoutId = setTimeout(() => {
85
+ channel.off(event, ref);
86
+ reject(new Error(`Timeout waiting for event '${event}' after ${timeoutMs}ms`));
87
+ }, timeoutMs);
88
+ const ref = channel.on(event, (payload) => {
89
+ clearTimeout(timeoutId);
90
+ channel.off(event, ref);
91
+ resolve(payload);
92
+ });
93
+ });
94
+ }
95
+ pushWithTimeout(channel, event, payload, timeoutMs) {
96
+ return new Promise((resolve, reject) => {
97
+ const push = channel.push(event, payload);
98
+ push
99
+ .receive('ok', (response) => resolve(response))
100
+ .receive('error', (error) => {
101
+ const errorMessage = typeof error === 'string' ? error : JSON.stringify(error);
102
+ reject(new Error(`Push '${event}' failed: ${errorMessage}`));
103
+ })
104
+ .receive('timeout', () => {
105
+ reject(new Error(`Push '${event}' timed out after ${timeoutMs}ms`));
106
+ });
107
+ });
108
+ }
109
+ delay(ms) {
110
+ return new Promise((resolve) => setTimeout(resolve, ms));
111
+ }
112
+ }
113
+ //# sourceMappingURL=ChannelService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelService.js","sourceRoot":"","sources":["../../src/services/ChannelService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { BotConfiguration, IConfigurationProvider } from '../interfaces/IConfigurationProvider.js';
2
+ export declare class ConfigurationProvider implements IConfigurationProvider {
3
+ private readonly config;
4
+ constructor(initialConfig: BotConfiguration);
5
+ /**
6
+ * Recursively freeze an object and all its nested properties
7
+ * This ensures complete immutability of the configuration
8
+ */
9
+ private deepFreeze;
10
+ get<T = unknown>(key: string): T | undefined;
11
+ getConfiguration(): BotConfiguration;
12
+ }
13
+ //# sourceMappingURL=ConfigurationProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigurationProvider.d.ts","sourceRoot":"","sources":["../../src/services/ConfigurationProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,yCAAyC,CAAA;AAEhD,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,aAAa,EAAE,gBAAgB;IAiB3C;;;OAGG;IACH,OAAO,CAAC,UAAU;IASlB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAgB5C,gBAAgB,IAAI,gBAAgB;CAMrC"}
@@ -0,0 +1,49 @@
1
+ export class ConfigurationProvider {
2
+ config;
3
+ constructor(initialConfig) {
4
+ // Create a deep copy of the configuration to ensure complete isolation
5
+ this.config = JSON.parse(JSON.stringify({
6
+ ...initialConfig,
7
+ context: initialConfig.context || {
8
+ mobile: false,
9
+ embed: false,
10
+ hmd: false,
11
+ },
12
+ }));
13
+ // Deep freeze the configuration to prevent any modifications
14
+ this.deepFreeze(this.config);
15
+ }
16
+ /**
17
+ * Recursively freeze an object and all its nested properties
18
+ * This ensures complete immutability of the configuration
19
+ */
20
+ deepFreeze(obj) {
21
+ if (obj && typeof obj === 'object') {
22
+ Object.freeze(obj);
23
+ Object.values(obj).forEach((value) => {
24
+ this.deepFreeze(value);
25
+ });
26
+ }
27
+ }
28
+ get(key) {
29
+ // Check nested config properties
30
+ const keys = key.split('.');
31
+ let value = this.config;
32
+ for (const k of keys) {
33
+ if (value && typeof value === 'object' && k in value) {
34
+ value = value[k];
35
+ }
36
+ else {
37
+ return undefined;
38
+ }
39
+ }
40
+ return value;
41
+ }
42
+ getConfiguration() {
43
+ // Return a deep copy to ensure true immutability
44
+ // JSON.parse/stringify is the simplest way to create a deep copy
45
+ // This ensures that even nested objects are completely independent
46
+ return JSON.parse(JSON.stringify(this.config));
47
+ }
48
+ }
49
+ //# sourceMappingURL=ConfigurationProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigurationProvider.js","sourceRoot":"","sources":["../../src/services/ConfigurationProvider.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,qBAAqB;IACf,MAAM,CAAkB;IAEzC,YAAY,aAA+B;QACzC,uEAAuE;QACvE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CACtB,IAAI,CAAC,SAAS,CAAC;YACb,GAAG,aAAa;YAChB,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI;gBAChC,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,KAAK;aACX;SACF,CAAC,CACH,CAAA;QAED,6DAA6D;QAC7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAED;;;OAGG;IACK,UAAU,CAAC,GAAY;QAC7B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAClB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACnC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;YACxB,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,GAAG,CAAc,GAAW;QAC1B,iCAAiC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,KAAK,GAAY,IAAI,CAAC,MAAM,CAAA;QAEhC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;gBACrD,KAAK,GAAI,KAAiC,CAAC,CAAC,CAAC,CAAA;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,SAAS,CAAA;YAClB,CAAC;QACH,CAAC;QAED,OAAO,KAAU,CAAA;IACnB,CAAC;IAED,gBAAgB;QACd,iDAAiD;QACjD,iEAAiE;QACjE,mEAAmE;QACnE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAChD,CAAC;CACF"}