@nekutima/biome-sdk 0.19.3 → 0.29.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 (219) hide show
  1. package/dist/admin/admin.model.d.ts +70 -0
  2. package/dist/admin/admin.model.d.ts.map +1 -1
  3. package/dist/admin/admin.schema.json +339 -0
  4. package/dist/admin/admin.service.d.ts +9 -1
  5. package/dist/admin/admin.service.d.ts.map +1 -1
  6. package/dist/admin/admin.service.js +79 -4
  7. package/dist/admin/admin.service.js.map +1 -1
  8. package/dist/agents/agent-identity.d.ts +19 -0
  9. package/dist/agents/agent-identity.d.ts.map +1 -0
  10. package/dist/agents/agent-identity.js +36 -0
  11. package/dist/agents/agent-identity.js.map +1 -0
  12. package/dist/agents/agent-resource.d.ts +0 -1
  13. package/dist/agents/agent-resource.d.ts.map +1 -1
  14. package/dist/agents/agent.model.d.ts +13 -40
  15. package/dist/agents/agent.model.d.ts.map +1 -1
  16. package/dist/agents/agent.service.d.ts +9 -3
  17. package/dist/agents/agent.service.d.ts.map +1 -1
  18. package/dist/agents/agent.service.js +37 -8
  19. package/dist/agents/agent.service.js.map +1 -1
  20. package/dist/ai/yuri.service.d.ts +39 -5
  21. package/dist/ai/yuri.service.d.ts.map +1 -1
  22. package/dist/ai/yuri.service.js +64 -34
  23. package/dist/ai/yuri.service.js.map +1 -1
  24. package/dist/alexandria/nugget.model.d.ts +77 -0
  25. package/dist/alexandria/nugget.model.d.ts.map +1 -0
  26. package/dist/alexandria/nugget.model.js +7 -0
  27. package/dist/alexandria/nugget.model.js.map +1 -0
  28. package/dist/alexandria/nugget.service.d.ts +21 -0
  29. package/dist/alexandria/nugget.service.d.ts.map +1 -0
  30. package/dist/alexandria/nugget.service.js +127 -0
  31. package/dist/alexandria/nugget.service.js.map +1 -0
  32. package/dist/alexandria/problem.model.d.ts +48 -0
  33. package/dist/alexandria/problem.model.d.ts.map +1 -0
  34. package/dist/alexandria/problem.model.js +7 -0
  35. package/dist/alexandria/problem.model.js.map +1 -0
  36. package/dist/alexandria/problem.service.d.ts +17 -0
  37. package/dist/alexandria/problem.service.d.ts.map +1 -0
  38. package/dist/alexandria/problem.service.js +98 -0
  39. package/dist/alexandria/problem.service.js.map +1 -0
  40. package/dist/alexandria/progress.model.d.ts +19 -0
  41. package/dist/alexandria/progress.model.d.ts.map +1 -0
  42. package/dist/alexandria/progress.model.js +3 -0
  43. package/dist/alexandria/progress.model.js.map +1 -0
  44. package/dist/alexandria/progress.service.d.ts +10 -0
  45. package/dist/alexandria/progress.service.d.ts.map +1 -0
  46. package/dist/alexandria/progress.service.js +38 -0
  47. package/dist/alexandria/progress.service.js.map +1 -0
  48. package/dist/api-keys/api-key.model.d.ts +30 -0
  49. package/dist/api-keys/api-key.model.d.ts.map +1 -0
  50. package/dist/api-keys/api-key.model.js +3 -0
  51. package/dist/api-keys/api-key.model.js.map +1 -0
  52. package/dist/api-keys/api-key.service.d.ts +16 -0
  53. package/dist/api-keys/api-key.service.d.ts.map +1 -0
  54. package/dist/api-keys/api-key.service.js +34 -0
  55. package/dist/api-keys/api-key.service.js.map +1 -0
  56. package/dist/auth/auth.schema.json +106 -0
  57. package/dist/auth/auth.service.d.ts +8 -1
  58. package/dist/auth/auth.service.d.ts.map +1 -1
  59. package/dist/auth/auth.service.js +23 -10
  60. package/dist/auth/auth.service.js.map +1 -1
  61. package/dist/chat/chat.service.d.ts.map +1 -1
  62. package/dist/chat/chat.service.js +60 -68
  63. package/dist/chat/chat.service.js.map +1 -1
  64. package/dist/circles/circle.model.d.ts +25 -0
  65. package/dist/circles/circle.model.d.ts.map +1 -0
  66. package/dist/circles/circle.model.js +3 -0
  67. package/dist/circles/circle.model.js.map +1 -0
  68. package/dist/circles/circle.schema.json +332 -0
  69. package/dist/circles/circle.service.d.ts +14 -0
  70. package/dist/circles/circle.service.d.ts.map +1 -0
  71. package/dist/circles/circle.service.js +50 -0
  72. package/dist/circles/circle.service.js.map +1 -0
  73. package/dist/communities/community.model.d.ts +72 -0
  74. package/dist/communities/community.model.d.ts.map +1 -0
  75. package/dist/communities/community.model.js +3 -0
  76. package/dist/communities/community.model.js.map +1 -0
  77. package/dist/communities/community.service.d.ts +26 -0
  78. package/dist/communities/community.service.d.ts.map +1 -0
  79. package/dist/communities/community.service.js +140 -0
  80. package/dist/communities/community.service.js.map +1 -0
  81. package/dist/contacts/contact.model.d.ts +97 -0
  82. package/dist/contacts/contact.model.d.ts.map +1 -0
  83. package/dist/contacts/contact.model.js +3 -0
  84. package/dist/contacts/contact.model.js.map +1 -0
  85. package/dist/contacts/contact.schema.json +312 -0
  86. package/dist/contacts/contact.service.d.ts +28 -0
  87. package/dist/contacts/contact.service.d.ts.map +1 -0
  88. package/dist/contacts/contact.service.js +109 -0
  89. package/dist/contacts/contact.service.js.map +1 -0
  90. package/dist/core/api-diagnostics.d.ts +91 -0
  91. package/dist/core/api-diagnostics.d.ts.map +1 -0
  92. package/dist/core/api-diagnostics.js +211 -0
  93. package/dist/core/api-diagnostics.js.map +1 -0
  94. package/dist/core/configuration.d.ts +12 -0
  95. package/dist/core/configuration.d.ts.map +1 -1
  96. package/dist/core/error-handler.d.ts +5 -1
  97. package/dist/core/error-handler.d.ts.map +1 -1
  98. package/dist/core/error-handler.js +45 -21
  99. package/dist/core/error-handler.js.map +1 -1
  100. package/dist/core/http-client.d.ts +33 -6
  101. package/dist/core/http-client.d.ts.map +1 -1
  102. package/dist/core/http-client.js +193 -31
  103. package/dist/core/http-client.js.map +1 -1
  104. package/dist/core/node-cookie-jar.d.ts +14 -0
  105. package/dist/core/node-cookie-jar.d.ts.map +1 -0
  106. package/dist/core/node-cookie-jar.js +58 -0
  107. package/dist/core/node-cookie-jar.js.map +1 -0
  108. package/dist/core/request-scheduler.d.ts +56 -0
  109. package/dist/core/request-scheduler.d.ts.map +1 -0
  110. package/dist/core/request-scheduler.js +176 -0
  111. package/dist/core/request-scheduler.js.map +1 -0
  112. package/dist/core/resilience.d.ts +10 -0
  113. package/dist/core/resilience.d.ts.map +1 -1
  114. package/dist/core/resilience.js +27 -0
  115. package/dist/core/resilience.js.map +1 -1
  116. package/dist/ecosystem/organization.model.d.ts +4 -4
  117. package/dist/ecosystem/organization.model.d.ts.map +1 -1
  118. package/dist/errors/error-codes.d.ts +3 -1
  119. package/dist/errors/error-codes.d.ts.map +1 -1
  120. package/dist/errors/error-codes.js +2 -0
  121. package/dist/errors/error-codes.js.map +1 -1
  122. package/dist/events/event-edition.model.d.ts +5 -0
  123. package/dist/events/event-edition.model.d.ts.map +1 -1
  124. package/dist/events/event.model.d.ts +5 -0
  125. package/dist/events/event.model.d.ts.map +1 -1
  126. package/dist/follows/follow.model.d.ts +1 -1
  127. package/dist/follows/follow.model.d.ts.map +1 -1
  128. package/dist/follows/follow.service.d.ts.map +1 -1
  129. package/dist/follows/follow.service.js +1 -0
  130. package/dist/follows/follow.service.js.map +1 -1
  131. package/dist/guilds/guild.model.d.ts +36 -0
  132. package/dist/guilds/guild.model.d.ts.map +1 -1
  133. package/dist/guilds/guild.service.d.ts +7 -1
  134. package/dist/guilds/guild.service.d.ts.map +1 -1
  135. package/dist/guilds/guild.service.js +52 -0
  136. package/dist/guilds/guild.service.js.map +1 -1
  137. package/dist/index.d.ts +50 -6
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +70 -4
  140. package/dist/index.js.map +1 -1
  141. package/dist/memberships/membership.model.d.ts +34 -0
  142. package/dist/memberships/membership.model.d.ts.map +1 -0
  143. package/dist/memberships/membership.model.js +3 -0
  144. package/dist/memberships/membership.model.js.map +1 -0
  145. package/dist/memberships/membership.service.d.ts +22 -0
  146. package/dist/memberships/membership.service.d.ts.map +1 -0
  147. package/dist/memberships/membership.service.js +111 -0
  148. package/dist/memberships/membership.service.js.map +1 -0
  149. package/dist/missions/mission.model.d.ts +4 -4
  150. package/dist/missions/mission.model.d.ts.map +1 -1
  151. package/dist/missions/mission.schema.json +204 -0
  152. package/dist/missions/mission.service.d.ts +2 -2
  153. package/dist/missions/mission.service.d.ts.map +1 -1
  154. package/dist/missions/mission.service.js.map +1 -1
  155. package/dist/models/chat.model.d.ts +11 -1
  156. package/dist/models/chat.model.d.ts.map +1 -1
  157. package/dist/models/chat.model.js +4 -0
  158. package/dist/models/chat.model.js.map +1 -1
  159. package/dist/notifications/notification.service.d.ts.map +1 -1
  160. package/dist/notifications/notification.service.js +10 -2
  161. package/dist/notifications/notification.service.js.map +1 -1
  162. package/dist/profiles/person.model.d.ts +26 -26
  163. package/dist/profiles/person.model.d.ts.map +1 -1
  164. package/dist/profiles/profile.schema.json +269 -0
  165. package/dist/project/schemas.js +2 -1
  166. package/dist/project/schemas.js.map +1 -1
  167. package/dist/projects/project.service.d.ts +1 -1
  168. package/dist/projects/project.service.d.ts.map +1 -1
  169. package/dist/projects/project.service.js +2 -2
  170. package/dist/projects/project.service.js.map +1 -1
  171. package/dist/rewards/reward.model.d.ts +2 -2
  172. package/dist/rewards/reward.model.d.ts.map +1 -1
  173. package/dist/rewards/reward.service.d.ts +9 -0
  174. package/dist/rewards/reward.service.d.ts.map +1 -1
  175. package/dist/rewards/reward.service.js +32 -0
  176. package/dist/rewards/reward.service.js.map +1 -1
  177. package/dist/support/support.model.d.ts +6 -0
  178. package/dist/support/support.model.d.ts.map +1 -0
  179. package/dist/support/support.model.js +3 -0
  180. package/dist/support/support.model.js.map +1 -0
  181. package/dist/support/support.schema.json +25 -0
  182. package/dist/support/support.service.d.ts +11 -0
  183. package/dist/support/support.service.d.ts.map +1 -0
  184. package/dist/support/support.service.js +22 -0
  185. package/dist/support/support.service.js.map +1 -0
  186. package/dist/tasks/schemas.js +4 -3
  187. package/dist/tasks/schemas.js.map +1 -1
  188. package/dist/tasks/task.model.d.ts +40 -15
  189. package/dist/tasks/task.model.d.ts.map +1 -1
  190. package/dist/tasks/task.model.js +1 -1
  191. package/dist/tasks/task.model.js.map +1 -1
  192. package/dist/tasks/task.schema.json +780 -0
  193. package/dist/tasks/task.service.d.ts +108 -9
  194. package/dist/tasks/task.service.d.ts.map +1 -1
  195. package/dist/tasks/task.service.js +184 -47
  196. package/dist/tasks/task.service.js.map +1 -1
  197. package/dist/timezone/time.helper.d.ts +9 -0
  198. package/dist/timezone/time.helper.d.ts.map +1 -1
  199. package/dist/timezone/time.helper.js +31 -2
  200. package/dist/timezone/time.helper.js.map +1 -1
  201. package/dist/users/user.model.d.ts +2 -1
  202. package/dist/users/user.model.d.ts.map +1 -1
  203. package/dist/users/user.model.js.map +1 -1
  204. package/dist/users/user.schema.json +429 -0
  205. package/dist/users/user.service.d.ts +2 -2
  206. package/dist/users/user.service.d.ts.map +1 -1
  207. package/dist/users/user.service.js +29 -35
  208. package/dist/users/user.service.js.map +1 -1
  209. package/dist/utils/validation.utils.d.ts +0 -4
  210. package/dist/utils/validation.utils.d.ts.map +1 -1
  211. package/dist/utils/validation.utils.js +1 -11
  212. package/dist/utils/validation.utils.js.map +1 -1
  213. package/dist/wallet/wallet.model.d.ts +5 -0
  214. package/dist/wallet/wallet.model.d.ts.map +1 -1
  215. package/dist/wallet/wallet.service.d.ts +2 -1
  216. package/dist/wallet/wallet.service.d.ts.map +1 -1
  217. package/dist/wallet/wallet.service.js +9 -0
  218. package/dist/wallet/wallet.service.js.map +1 -1
  219. package/package.json +19 -6
@@ -89,13 +89,42 @@ class TimeHelper {
89
89
  let date;
90
90
  if (typeof moment === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(moment)) {
91
91
  const [year, month, day] = moment.split('-').map(Number);
92
- date = luxon_1.DateTime.fromObject({ year, month, day }, { zone }).startOf('day');
92
+ date = luxon_1.DateTime.fromObject({ year, month, day }, { zone }).endOf('day');
93
93
  }
94
94
  else {
95
- date = luxon_1.DateTime.fromISO(moment, { zone: 'utc' }).setZone(zone).startOf('day');
95
+ date = luxon_1.DateTime.fromISO(moment, { zone: 'utc' }).setZone(zone).endOf('day');
96
96
  }
97
97
  return date.toJSDate();
98
98
  }
99
+ /**
100
+ * Compose a UTC Date from a calendar date (YYYY-MM-DD) and local hour (0–23)
101
+ * in the given IANA timezone. Used for dueDate / nextTouchDate wall-clock moments.
102
+ */
103
+ static composeFromDateAndHour(dateStr, hour, timezoneName) {
104
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
105
+ throw new Error(`Invalid date string: ${dateStr}`);
106
+ }
107
+ if (!Number.isInteger(hour) || hour < 0 || hour > 23) {
108
+ throw new Error(`Hour must be an integer 0–23, got ${hour}`);
109
+ }
110
+ const zone = timezoneName || 'utc';
111
+ const [year, month, day] = dateStr.split('-').map(Number);
112
+ return luxon_1.DateTime.fromObject({ year, month, day, hour, minute: 0, second: 0, millisecond: 0 }, { zone })
113
+ .toUTC()
114
+ .toJSDate();
115
+ }
116
+ /**
117
+ * Extract local hour (0–23) of a UTC instant in the given IANA timezone.
118
+ */
119
+ static extractHour(date, timezoneName) {
120
+ if (!date)
121
+ return 23;
122
+ const zone = timezoneName || 'utc';
123
+ const dateObj = typeof date === 'string' ? new Date(date) : date;
124
+ if (isNaN(dateObj.getTime()))
125
+ return 23;
126
+ return luxon_1.DateTime.fromJSDate(dateObj, { zone: 'utc' }).setZone(zone).hour;
127
+ }
99
128
  /**
100
129
  * Convert a UTC date to YYYY-MM-DD string in user's timezone
101
130
  *
@@ -1 +1 @@
1
- {"version":3,"file":"time.helper.js","sourceRoot":"","sources":["../../src/timezone/time.helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"time.helper.js","sourceRoot":"","sources":["../../src/timezone/time.helper.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,7 @@ export interface User {
30
30
  isAdmin?: boolean;
31
31
  isBetaTester: boolean;
32
32
  isAgent?: boolean;
33
+ isBlocked?: boolean;
33
34
  createdAt: Date;
34
35
  updatedAt: Date;
35
36
  }
@@ -37,7 +38,7 @@ export interface User {
37
38
  * User type safe for frontend display
38
39
  * Excludes sensitive fields like password and security-related fields
39
40
  */
40
- export type UserPublic = Omit<User, 'password' | 'loginAttempts' | 'lockedUntil' | 'emailConfirmedAt' | 'termsAcceptedAt' | 'lastLoginAt' | 'loginCount' | 'passwordChangedAt' | 'twoFactorEnabled' | 'twoFactorPreference' | 'hasActiveSubscription' | 'nekTokensAvailable' | 'isAdmin'>;
41
+ export type UserPublic = Omit<User, 'password' | 'loginAttempts' | 'lockedUntil' | 'emailConfirmedAt' | 'termsAcceptedAt' | 'lastLoginAt' | 'loginCount' | 'passwordChangedAt' | 'twoFactorEnabled' | 'twoFactorPreference' | 'hasActiveSubscription' | 'nekTokensAvailable' | 'isAdmin' | 'isBlocked'>;
41
42
  /**
42
43
  * Lightweight user representation for lists and references
43
44
  * Minimal fields for performance
@@ -1 +1 @@
1
- {"version":3,"file":"user.model.d.ts","sourceRoot":"","sources":["../../src/users/user.model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user.model.d.ts","sourceRoot":"","sources":["../../src/users/user.model.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"user.model.js","sourceRoot":"","sources":["../../src/users/user.model.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AA2HH,sDAIC;AAPD;;GAEG;AACH,SAAgB,qBAAqB,CAAC,IAAU;IAC5C,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IACjC,IAAI,IAAI,CAAC,qBAAqB;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO,MAAM,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"user.model.js","sourceRoot":"","sources":["../../src/users/user.model.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AA6HH,sDAIC;AAPD;;GAEG;AACH,SAAgB,qBAAqB,CAAC,IAAU;IAC5C,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IACjC,IAAI,IAAI,CAAC,qBAAqB;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,429 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "definitions": {
4
+ "CreateUserRequest": {
5
+ "additionalProperties": false,
6
+ "description": "Type for user creation (without auto-generated or auto-managed fields)",
7
+ "properties": {
8
+ "email": {
9
+ "type": "string"
10
+ },
11
+ "emailConfirmedAt": {
12
+ "anyOf": [
13
+ {
14
+ "format": "date-time",
15
+ "type": "string"
16
+ },
17
+ {
18
+ "type": "null"
19
+ }
20
+ ]
21
+ },
22
+ "isAgent": {
23
+ "type": "boolean"
24
+ },
25
+ "isBetaTester": {
26
+ "type": "boolean"
27
+ },
28
+ "isBlocked": {
29
+ "type": "boolean"
30
+ },
31
+ "loginAttempts": {
32
+ "type": "number"
33
+ },
34
+ "password": {
35
+ "type": "string"
36
+ },
37
+ "passwordChangedAt": {
38
+ "anyOf": [
39
+ {
40
+ "format": "date-time",
41
+ "type": "string"
42
+ },
43
+ {
44
+ "type": "null"
45
+ }
46
+ ]
47
+ },
48
+ "termsAcceptedAt": {
49
+ "anyOf": [
50
+ {
51
+ "format": "date-time",
52
+ "type": "string"
53
+ },
54
+ {
55
+ "type": "null"
56
+ }
57
+ ]
58
+ },
59
+ "timezoneId": {
60
+ "type": "number"
61
+ },
62
+ "username": {
63
+ "type": "string"
64
+ }
65
+ },
66
+ "required": [
67
+ "username",
68
+ "email",
69
+ "password",
70
+ "timezoneId",
71
+ "loginAttempts",
72
+ "emailConfirmedAt",
73
+ "termsAcceptedAt",
74
+ "isBetaTester"
75
+ ],
76
+ "type": "object"
77
+ },
78
+ "UpdateUserRequest": {
79
+ "additionalProperties": false,
80
+ "description": "Type for user updates (partial, without auto-managed fields)",
81
+ "properties": {
82
+ "email": {
83
+ "type": "string"
84
+ },
85
+ "emailConfirmedAt": {
86
+ "anyOf": [
87
+ {
88
+ "format": "date-time",
89
+ "type": "string"
90
+ },
91
+ {
92
+ "type": "null"
93
+ }
94
+ ]
95
+ },
96
+ "hasActiveSubscription": {
97
+ "type": "boolean"
98
+ },
99
+ "isAdmin": {
100
+ "type": "boolean"
101
+ },
102
+ "isAgent": {
103
+ "type": "boolean"
104
+ },
105
+ "isBetaTester": {
106
+ "type": "boolean"
107
+ },
108
+ "isBlocked": {
109
+ "type": "boolean"
110
+ },
111
+ "lastLoginAt": {
112
+ "anyOf": [
113
+ {
114
+ "format": "date-time",
115
+ "type": "string"
116
+ },
117
+ {
118
+ "type": "null"
119
+ }
120
+ ]
121
+ },
122
+ "lockedUntil": {
123
+ "anyOf": [
124
+ {
125
+ "format": "date-time",
126
+ "type": "string"
127
+ },
128
+ {
129
+ "type": "null"
130
+ }
131
+ ]
132
+ },
133
+ "loginAttempts": {
134
+ "type": "number"
135
+ },
136
+ "loginCount": {
137
+ "type": "number"
138
+ },
139
+ "nekTokensAvailable": {
140
+ "type": "number"
141
+ },
142
+ "passwordChangedAt": {
143
+ "anyOf": [
144
+ {
145
+ "format": "date-time",
146
+ "type": "string"
147
+ },
148
+ {
149
+ "type": "null"
150
+ }
151
+ ]
152
+ },
153
+ "termsAcceptedAt": {
154
+ "anyOf": [
155
+ {
156
+ "format": "date-time",
157
+ "type": "string"
158
+ },
159
+ {
160
+ "type": "null"
161
+ }
162
+ ]
163
+ },
164
+ "timezoneId": {
165
+ "type": "number"
166
+ },
167
+ "twoFactorEnabled": {
168
+ "type": "boolean"
169
+ },
170
+ "twoFactorPreference": {
171
+ "type": [
172
+ "string",
173
+ "null"
174
+ ]
175
+ },
176
+ "username": {
177
+ "type": "string"
178
+ }
179
+ },
180
+ "type": "object"
181
+ },
182
+ "User": {
183
+ "additionalProperties": true,
184
+ "description": "Complete User model matching database schema Includes all fields from the users table",
185
+ "properties": {
186
+ "createdAt": {
187
+ "format": "date-time",
188
+ "type": "string"
189
+ },
190
+ "email": {
191
+ "type": "string"
192
+ },
193
+ "emailConfirmedAt": {
194
+ "anyOf": [
195
+ {
196
+ "format": "date-time",
197
+ "type": "string"
198
+ },
199
+ {
200
+ "type": "null"
201
+ }
202
+ ]
203
+ },
204
+ "hasActiveSubscription": {
205
+ "type": "boolean"
206
+ },
207
+ "id": {
208
+ "type": "number"
209
+ },
210
+ "isAdmin": {
211
+ "type": "boolean"
212
+ },
213
+ "isAgent": {
214
+ "type": "boolean"
215
+ },
216
+ "isBetaTester": {
217
+ "type": "boolean"
218
+ },
219
+ "isBlocked": {
220
+ "type": "boolean"
221
+ },
222
+ "lastLoginAt": {
223
+ "anyOf": [
224
+ {
225
+ "format": "date-time",
226
+ "type": "string"
227
+ },
228
+ {
229
+ "type": "null"
230
+ }
231
+ ]
232
+ },
233
+ "lockedUntil": {
234
+ "anyOf": [
235
+ {
236
+ "format": "date-time",
237
+ "type": "string"
238
+ },
239
+ {
240
+ "type": "null"
241
+ }
242
+ ]
243
+ },
244
+ "loginAttempts": {
245
+ "type": "number"
246
+ },
247
+ "loginCount": {
248
+ "type": "number"
249
+ },
250
+ "nekTokensAvailable": {
251
+ "type": "number"
252
+ },
253
+ "password": {
254
+ "type": "string"
255
+ },
256
+ "passwordChangedAt": {
257
+ "anyOf": [
258
+ {
259
+ "format": "date-time",
260
+ "type": "string"
261
+ },
262
+ {
263
+ "type": "null"
264
+ }
265
+ ]
266
+ },
267
+ "termsAcceptedAt": {
268
+ "anyOf": [
269
+ {
270
+ "format": "date-time",
271
+ "type": "string"
272
+ },
273
+ {
274
+ "type": "null"
275
+ }
276
+ ]
277
+ },
278
+ "timezoneId": {
279
+ "type": "number"
280
+ },
281
+ "twoFactorEnabled": {
282
+ "type": "boolean"
283
+ },
284
+ "twoFactorPreference": {
285
+ "type": [
286
+ "string",
287
+ "null"
288
+ ]
289
+ },
290
+ "updatedAt": {
291
+ "format": "date-time",
292
+ "type": "string"
293
+ },
294
+ "username": {
295
+ "type": "string"
296
+ }
297
+ },
298
+ "required": [
299
+ "username",
300
+ "email",
301
+ "password",
302
+ "timezoneId",
303
+ "loginAttempts",
304
+ "emailConfirmedAt",
305
+ "termsAcceptedAt",
306
+ "isBetaTester",
307
+ "createdAt",
308
+ "updatedAt"
309
+ ],
310
+ "type": "object"
311
+ },
312
+ "UserMinimal": {
313
+ "additionalProperties": true,
314
+ "description": "Lightweight user representation for lists and references Minimal fields for performance",
315
+ "properties": {
316
+ "email": {
317
+ "type": "string"
318
+ },
319
+ "id": {
320
+ "type": "number"
321
+ },
322
+ "username": {
323
+ "type": "string"
324
+ }
325
+ },
326
+ "required": [
327
+ "username",
328
+ "email"
329
+ ],
330
+ "type": "object"
331
+ },
332
+ "UserPublic": {
333
+ "additionalProperties": true,
334
+ "description": "User type safe for frontend display Excludes sensitive fields like password and security-related fields",
335
+ "properties": {
336
+ "createdAt": {
337
+ "format": "date-time",
338
+ "type": "string"
339
+ },
340
+ "email": {
341
+ "type": "string"
342
+ },
343
+ "id": {
344
+ "type": "number"
345
+ },
346
+ "isAgent": {
347
+ "type": "boolean"
348
+ },
349
+ "isBetaTester": {
350
+ "type": "boolean"
351
+ },
352
+ "timezoneId": {
353
+ "type": "number"
354
+ },
355
+ "updatedAt": {
356
+ "format": "date-time",
357
+ "type": "string"
358
+ },
359
+ "username": {
360
+ "type": "string"
361
+ }
362
+ },
363
+ "required": [
364
+ "username",
365
+ "email",
366
+ "timezoneId",
367
+ "isBetaTester",
368
+ "createdAt",
369
+ "updatedAt"
370
+ ],
371
+ "type": "object"
372
+ },
373
+ "UserWithAvatar": {
374
+ "additionalProperties": true,
375
+ "properties": {
376
+ "avatarDownloadUrl": {
377
+ "type": [
378
+ "string",
379
+ "null"
380
+ ]
381
+ },
382
+ "avatarStoragePath": {
383
+ "type": [
384
+ "string",
385
+ "null"
386
+ ]
387
+ },
388
+ "avatarUrl": {
389
+ "type": [
390
+ "string",
391
+ "null"
392
+ ]
393
+ },
394
+ "email": {
395
+ "type": "string"
396
+ },
397
+ "id": {
398
+ "type": "number"
399
+ },
400
+ "profilePhoto": {
401
+ "additionalProperties": false,
402
+ "properties": {
403
+ "downloadUrl": {
404
+ "type": "string"
405
+ },
406
+ "storagePath": {
407
+ "type": "string"
408
+ }
409
+ },
410
+ "type": "object"
411
+ },
412
+ "profilePhotoFileId": {
413
+ "type": [
414
+ "number",
415
+ "null"
416
+ ]
417
+ },
418
+ "username": {
419
+ "type": "string"
420
+ }
421
+ },
422
+ "required": [
423
+ "id",
424
+ "username"
425
+ ],
426
+ "type": "object"
427
+ }
428
+ }
429
+ }
@@ -12,11 +12,11 @@ export declare class BiomeUsers {
12
12
  */
13
13
  getAll(): Promise<UserWithAvatar[]>;
14
14
  /**
15
- * Build avatar URL for user
15
+ * Build avatar URL for user (absolute, using HTTP client base URL)
16
16
  */
17
17
  private buildAvatarUrl;
18
18
  /**
19
- * Normalize URL to be absolute
19
+ * Normalize URL to be absolute using the HTTP client's API base URL.
20
20
  */
21
21
  private normalizeUrl;
22
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/users/user.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKtD;;GAEG;AACH,qBAAa,UAAU;IAMP,OAAO,CAAC,IAAI;IAJxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA4B;IAE/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAmC;gBAErD,IAAI,EAAE,eAAe;IAEzC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBzC;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;;;OAIG;IACG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmBzE;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAe7D;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAezE;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI3E;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAoDxE;;;;;;OAMG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAqBrE;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE;QACX,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC"}
1
+ {"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/users/user.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKtD;;GAEG;AACH,qBAAa,UAAU;IAMP,OAAO,CAAC,IAAI;IAJxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA4B;IAE/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAmC;gBAErD,IAAI,EAAE,eAAe;IAEzC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBzC;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;OAIG;IACG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmBzE;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAe7D;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAezE;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI3E;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyCxE;;;;;;OAMG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAqBrE;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE;QACX,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC"}
@@ -31,7 +31,7 @@ class BiomeUsers {
31
31
  }
32
32
  }
33
33
  /**
34
- * Build avatar URL for user
34
+ * Build avatar URL for user (absolute, using HTTP client base URL)
35
35
  */
36
36
  buildAvatarUrl(user) {
37
37
  if (user.avatarUrl) {
@@ -41,20 +41,25 @@ class BiomeUsers {
41
41
  return this.normalizeUrl(user.avatarDownloadUrl);
42
42
  }
43
43
  if (user.avatarStoragePath) {
44
- return this.normalizeUrl(`/trunk/files/${user.avatarStoragePath}`);
44
+ const segment = String(user.avatarStoragePath).replace(/^\/+/, '');
45
+ if (/^\d+$/.test(segment)) {
46
+ return this.normalizeUrl(`/trunk/files/${segment}/download`);
47
+ }
48
+ return this.normalizeUrl(`/trunk/files/${segment}`);
49
+ }
50
+ if (user.profilePhotoFileId) {
51
+ return this.normalizeUrl(`/trunk/files/${user.profilePhotoFileId}/download`);
45
52
  }
46
53
  return null;
47
54
  }
48
55
  /**
49
- * Normalize URL to be absolute
56
+ * Normalize URL to be absolute using the HTTP client's API base URL.
50
57
  */
51
58
  normalizeUrl(path) {
52
59
  if (path.startsWith('http://') || path.startsWith('https://')) {
53
60
  return path;
54
61
  }
55
- // For SDK, we don't have access to environment
56
- // This would need to be passed in via config or handled at a higher level
57
- const baseUrl = ''; // This should be handled by HTTP client base URL
62
+ const baseUrl = (this.http.baseURL || '').replace(/\/$/, '');
58
63
  const normalizedPath = path.startsWith('/') ? path : `/${path}`;
59
64
  return `${baseUrl}${normalizedPath}`;
60
65
  }
@@ -152,11 +157,7 @@ class BiomeUsers {
152
157
  */
153
158
  async findUsers(keyword, limit = 20) {
154
159
  // Apply rate limiting (FR-014) - 100 requests per minute
155
- const rateLimitKey = 'findUsers';
156
- const rateCheck = BiomeUsers.rateLimiter.checkLimit(rateLimitKey);
157
- if (!rateCheck.allowed) {
158
- throw new resilience_1.RateLimitExceededError('Too many search requests. Please try again later.', rateCheck.retryAfter || 60, 100, 60);
159
- }
160
+ (0, resilience_1.checkRateLimit)(BiomeUsers.rateLimiter, 'findUsers', 'Too many search requests. Please try again later.', 100, 60);
160
161
  // Validate and clamp limit (max 100 per FR-012)
161
162
  const effectiveLimit = Math.min(Math.max(1, limit), 100);
162
163
  // Handle whitespace-only keyword - return empty array (per spec edge case)
@@ -164,32 +165,25 @@ class BiomeUsers {
164
165
  if (keyword !== undefined && keyword.length > 0 && keyword.trim().length === 0) {
165
166
  return [];
166
167
  }
167
- try {
168
- // Execute with circuit breaker for resilience (FR-020)
169
- return await BiomeUsers.circuitBreaker.execute(async () => {
170
- const params = new URLSearchParams();
171
- // Include q param only if keyword has non-whitespace content
172
- if (keyword !== undefined && keyword.trim().length > 0) {
173
- params.set('q', keyword);
174
- }
175
- params.set('limit', effectiveLimit.toString());
176
- const response = await this.http.get(`/users?${params.toString()}`);
177
- // Ensure we always return an array (never null per FR-003)
178
- const users = Array.isArray(response.payload) ? response.payload : [];
179
- // Populate avatar URLs for all results
180
- return users.map(user => ({
181
- ...user,
182
- avatarUrl: this.buildAvatarUrl(user),
183
- }));
184
- });
185
- }
186
- catch (error) {
187
- // Circuit breaker errors and rate limit errors pass through
188
- if (error instanceof resilience_1.CircuitBreakerOpenError || error instanceof resilience_1.RateLimitExceededError) {
189
- throw error;
168
+ // Execute with circuit breaker for resilience (FR-020)
169
+ return (0, resilience_1.executeWithCircuitBreaker)(BiomeUsers.circuitBreaker, async () => {
170
+ const params = new URLSearchParams();
171
+ // Include q param only if keyword has non-whitespace content
172
+ if (keyword !== undefined && keyword.trim().length > 0) {
173
+ params.set('q', keyword);
190
174
  }
175
+ params.set('limit', effectiveLimit.toString());
176
+ const response = await this.http.get(`/users?${params.toString()}`);
177
+ // Ensure we always return an array (never null per FR-003)
178
+ const users = Array.isArray(response.payload) ? response.payload : [];
179
+ // Populate avatar URLs for all results
180
+ return users.map(user => ({
181
+ ...user,
182
+ avatarUrl: this.buildAvatarUrl(user),
183
+ }));
184
+ }, (error) => {
191
185
  throw (0, error_handler_1.createSdkError)(error, 'Failed to find users');
192
- }
186
+ });
193
187
  }
194
188
  /**
195
189
  * Find a single user by username or email