@nurama/sdk 0.0.0-stage → 1.4.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 (225) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +1080 -2
  4. package/dist/BotClient.d.ts +66 -0
  5. package/dist/BotClient.d.ts.map +1 -0
  6. package/dist/BotClient.js +68 -0
  7. package/dist/BotClient.js.map +1 -0
  8. package/dist/NuramaClient.d.ts +480 -0
  9. package/dist/NuramaClient.d.ts.map +1 -0
  10. package/dist/NuramaClient.js +902 -0
  11. package/dist/NuramaClient.js.map +1 -0
  12. package/dist/browser/nurama-bot-sdk.js +12051 -0
  13. package/dist/browser/nurama-bot-sdk.min.js +1 -0
  14. package/dist/browser/nurama-sdk.js +12003 -0
  15. package/dist/browser/nurama-sdk.min.js +1 -0
  16. package/dist/routes/ai.d.ts +280 -0
  17. package/dist/routes/ai.d.ts.map +1 -0
  18. package/dist/routes/ai.js +173 -0
  19. package/dist/routes/ai.js.map +1 -0
  20. package/dist/routes/asset.d.ts +493 -0
  21. package/dist/routes/asset.d.ts.map +1 -0
  22. package/dist/routes/asset.js +848 -0
  23. package/dist/routes/asset.js.map +1 -0
  24. package/dist/routes/auth.d.ts +218 -0
  25. package/dist/routes/auth.d.ts.map +1 -0
  26. package/dist/routes/auth.js +454 -0
  27. package/dist/routes/auth.js.map +1 -0
  28. package/dist/routes/blogPosts.d.ts +17 -0
  29. package/dist/routes/blogPosts.d.ts.map +1 -0
  30. package/dist/routes/blogPosts.js +29 -0
  31. package/dist/routes/blogPosts.js.map +1 -0
  32. package/dist/routes/board.d.ts +187 -0
  33. package/dist/routes/board.d.ts.map +1 -0
  34. package/dist/routes/board.js +270 -0
  35. package/dist/routes/board.js.map +1 -0
  36. package/dist/routes/bot.d.ts +202 -0
  37. package/dist/routes/bot.d.ts.map +1 -0
  38. package/dist/routes/bot.js +229 -0
  39. package/dist/routes/bot.js.map +1 -0
  40. package/dist/routes/chat.d.ts +842 -0
  41. package/dist/routes/chat.d.ts.map +1 -0
  42. package/dist/routes/chat.js +863 -0
  43. package/dist/routes/chat.js.map +1 -0
  44. package/dist/routes/chatAi.d.ts +51 -0
  45. package/dist/routes/chatAi.d.ts.map +1 -0
  46. package/dist/routes/chatAi.js +109 -0
  47. package/dist/routes/chatAi.js.map +1 -0
  48. package/dist/routes/config.d.ts +11 -0
  49. package/dist/routes/config.d.ts.map +1 -0
  50. package/dist/routes/config.js +24 -0
  51. package/dist/routes/config.js.map +1 -0
  52. package/dist/routes/convo.d.ts +169 -0
  53. package/dist/routes/convo.d.ts.map +1 -0
  54. package/dist/routes/convo.js +284 -0
  55. package/dist/routes/convo.js.map +1 -0
  56. package/dist/routes/credits.d.ts +82 -0
  57. package/dist/routes/credits.d.ts.map +1 -0
  58. package/dist/routes/credits.js +49 -0
  59. package/dist/routes/credits.js.map +1 -0
  60. package/dist/routes/device.d.ts +74 -0
  61. package/dist/routes/device.d.ts.map +1 -0
  62. package/dist/routes/device.js +122 -0
  63. package/dist/routes/device.js.map +1 -0
  64. package/dist/routes/folder.d.ts +75 -0
  65. package/dist/routes/folder.d.ts.map +1 -0
  66. package/dist/routes/folder.js +99 -0
  67. package/dist/routes/folder.js.map +1 -0
  68. package/dist/routes/invite.d.ts +61 -0
  69. package/dist/routes/invite.d.ts.map +1 -0
  70. package/dist/routes/invite.js +86 -0
  71. package/dist/routes/invite.js.map +1 -0
  72. package/dist/routes/joinLink.d.ts +88 -0
  73. package/dist/routes/joinLink.d.ts.map +1 -0
  74. package/dist/routes/joinLink.js +205 -0
  75. package/dist/routes/joinLink.js.map +1 -0
  76. package/dist/routes/membership.d.ts +116 -0
  77. package/dist/routes/membership.d.ts.map +1 -0
  78. package/dist/routes/membership.js +183 -0
  79. package/dist/routes/membership.js.map +1 -0
  80. package/dist/routes/notification.d.ts +103 -0
  81. package/dist/routes/notification.d.ts.map +1 -0
  82. package/dist/routes/notification.js +89 -0
  83. package/dist/routes/notification.js.map +1 -0
  84. package/dist/routes/oauthGrant.d.ts +45 -0
  85. package/dist/routes/oauthGrant.d.ts.map +1 -0
  86. package/dist/routes/oauthGrant.js +32 -0
  87. package/dist/routes/oauthGrant.js.map +1 -0
  88. package/dist/routes/payment.d.ts +56 -0
  89. package/dist/routes/payment.d.ts.map +1 -0
  90. package/dist/routes/payment.js +78 -0
  91. package/dist/routes/payment.js.map +1 -0
  92. package/dist/routes/product.d.ts +43 -0
  93. package/dist/routes/product.d.ts.map +1 -0
  94. package/dist/routes/product.js +53 -0
  95. package/dist/routes/product.js.map +1 -0
  96. package/dist/routes/project.d.ts +821 -0
  97. package/dist/routes/project.d.ts.map +1 -0
  98. package/dist/routes/project.js +1153 -0
  99. package/dist/routes/project.js.map +1 -0
  100. package/dist/routes/public.d.ts +269 -0
  101. package/dist/routes/public.d.ts.map +1 -0
  102. package/dist/routes/public.js +412 -0
  103. package/dist/routes/public.js.map +1 -0
  104. package/dist/routes/scratch.d.ts +70 -0
  105. package/dist/routes/scratch.d.ts.map +1 -0
  106. package/dist/routes/scratch.js +67 -0
  107. package/dist/routes/scratch.js.map +1 -0
  108. package/dist/routes/settings.d.ts +102 -0
  109. package/dist/routes/settings.d.ts.map +1 -0
  110. package/dist/routes/settings.js +94 -0
  111. package/dist/routes/settings.js.map +1 -0
  112. package/dist/routes/shortlink.d.ts +79 -0
  113. package/dist/routes/shortlink.d.ts.map +1 -0
  114. package/dist/routes/shortlink.js +25 -0
  115. package/dist/routes/shortlink.js.map +1 -0
  116. package/dist/routes/socket.d.ts +108 -0
  117. package/dist/routes/socket.d.ts.map +1 -0
  118. package/dist/routes/socket.js +573 -0
  119. package/dist/routes/socket.js.map +1 -0
  120. package/dist/routes/storage.d.ts +44 -0
  121. package/dist/routes/storage.d.ts.map +1 -0
  122. package/dist/routes/storage.js +49 -0
  123. package/dist/routes/storage.js.map +1 -0
  124. package/dist/routes/subscription.d.ts +184 -0
  125. package/dist/routes/subscription.d.ts.map +1 -0
  126. package/dist/routes/subscription.js +219 -0
  127. package/dist/routes/subscription.js.map +1 -0
  128. package/dist/routes/supportChat.d.ts +40 -0
  129. package/dist/routes/supportChat.d.ts.map +1 -0
  130. package/dist/routes/supportChat.js +53 -0
  131. package/dist/routes/supportChat.js.map +1 -0
  132. package/dist/routes/supportTicket.d.ts +89 -0
  133. package/dist/routes/supportTicket.d.ts.map +1 -0
  134. package/dist/routes/supportTicket.js +54 -0
  135. package/dist/routes/supportTicket.js.map +1 -0
  136. package/dist/routes/tag.d.ts +72 -0
  137. package/dist/routes/tag.d.ts.map +1 -0
  138. package/dist/routes/tag.js +81 -0
  139. package/dist/routes/tag.js.map +1 -0
  140. package/dist/routes/task.d.ts +252 -0
  141. package/dist/routes/task.d.ts.map +1 -0
  142. package/dist/routes/task.js +284 -0
  143. package/dist/routes/task.js.map +1 -0
  144. package/dist/routes/taskRelation.d.ts +80 -0
  145. package/dist/routes/taskRelation.d.ts.map +1 -0
  146. package/dist/routes/taskRelation.js +71 -0
  147. package/dist/routes/taskRelation.js.map +1 -0
  148. package/dist/routes/token.d.ts +97 -0
  149. package/dist/routes/token.d.ts.map +1 -0
  150. package/dist/routes/token.js +73 -0
  151. package/dist/routes/token.js.map +1 -0
  152. package/dist/routes/user.d.ts +112 -0
  153. package/dist/routes/user.d.ts.map +1 -0
  154. package/dist/routes/user.js +151 -0
  155. package/dist/routes/user.js.map +1 -0
  156. package/dist/routes/version.d.ts +42 -0
  157. package/dist/routes/version.d.ts.map +1 -0
  158. package/dist/routes/version.js +38 -0
  159. package/dist/routes/version.js.map +1 -0
  160. package/dist/routes/webhook.d.ts +170 -0
  161. package/dist/routes/webhook.d.ts.map +1 -0
  162. package/dist/routes/webhook.js +173 -0
  163. package/dist/routes/webhook.js.map +1 -0
  164. package/dist/routes/workspace.d.ts +120 -0
  165. package/dist/routes/workspace.d.ts.map +1 -0
  166. package/dist/routes/workspace.js +199 -0
  167. package/dist/routes/workspace.js.map +1 -0
  168. package/dist/utils/uploadSessionManager.d.ts +133 -0
  169. package/dist/utils/uploadSessionManager.d.ts.map +1 -0
  170. package/dist/utils/uploadSessionManager.js +321 -0
  171. package/dist/utils/uploadSessionManager.js.map +1 -0
  172. package/dist/utils/urlParams.d.ts +35 -0
  173. package/dist/utils/urlParams.d.ts.map +1 -0
  174. package/dist/utils/urlParams.js +146 -0
  175. package/dist/utils/urlParams.js.map +1 -0
  176. package/dist/version.d.ts +15 -0
  177. package/dist/version.d.ts.map +1 -0
  178. package/dist/version.js +12 -0
  179. package/dist/version.js.map +1 -0
  180. package/package.json +87 -3
  181. package/src/BotClient.ts +113 -0
  182. package/src/NuramaClient.ts +1253 -0
  183. package/src/bot-browser-entry.js +15 -0
  184. package/src/browser-entry.js +20 -0
  185. package/src/routes/ai.ts +378 -0
  186. package/src/routes/asset.ts +1104 -0
  187. package/src/routes/auth.ts +587 -0
  188. package/src/routes/blogPosts.ts +29 -0
  189. package/src/routes/board.ts +403 -0
  190. package/src/routes/bot.ts +356 -0
  191. package/src/routes/chat.ts +1292 -0
  192. package/src/routes/chatAi.ts +125 -0
  193. package/src/routes/config.ts +31 -0
  194. package/src/routes/convo.ts +321 -0
  195. package/src/routes/credits.ts +112 -0
  196. package/src/routes/device.ts +133 -0
  197. package/src/routes/folder.ts +154 -0
  198. package/src/routes/invite.ts +133 -0
  199. package/src/routes/joinLink.ts +233 -0
  200. package/src/routes/membership.ts +237 -0
  201. package/src/routes/notification.ts +166 -0
  202. package/src/routes/oauthGrant.ts +64 -0
  203. package/src/routes/payment.ts +104 -0
  204. package/src/routes/product.ts +67 -0
  205. package/src/routes/project.ts +1528 -0
  206. package/src/routes/public.ts +496 -0
  207. package/src/routes/scratch.ts +94 -0
  208. package/src/routes/settings.ts +152 -0
  209. package/src/routes/shortlink.ts +90 -0
  210. package/src/routes/socket.ts +757 -0
  211. package/src/routes/storage.ts +83 -0
  212. package/src/routes/subscription.ts +307 -0
  213. package/src/routes/supportChat.ts +62 -0
  214. package/src/routes/supportTicket.ts +114 -0
  215. package/src/routes/tag.ts +131 -0
  216. package/src/routes/task.ts +431 -0
  217. package/src/routes/taskRelation.ts +125 -0
  218. package/src/routes/token.ts +152 -0
  219. package/src/routes/user.ts +214 -0
  220. package/src/routes/version.ts +62 -0
  221. package/src/routes/webhook.ts +295 -0
  222. package/src/routes/workspace.ts +223 -0
  223. package/src/utils/uploadSessionManager.ts +407 -0
  224. package/src/utils/urlParams.ts +181 -0
  225. package/src/version.ts +22 -0
@@ -0,0 +1,412 @@
1
+ /**
2
+ * Defines public route methods for unauthenticated access to public file systems.
3
+ */
4
+ export default function createPublicMethods(client) {
5
+ return {
6
+ /**
7
+ * Gets public file system details by token.
8
+ * This endpoint does not require authentication - access is controlled by the token.
9
+ *
10
+ * @param {string} token - The 10-character alphanumeric public access token.
11
+ * @returns {Promise<PublicFileSystemDetailsResponse>} The public file system details.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const publicFileSystem = await nuramaClient.public.getPublicFileSystem('abc123def4');
16
+ * ```
17
+ */
18
+ async getPublicFileSystem(token) {
19
+ if (!token)
20
+ throw new Error('token is required.');
21
+ if (token.length !== 10)
22
+ throw new Error('token must be exactly 10 characters long.');
23
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
24
+ throw new Error('token must contain only alphanumeric characters.');
25
+ return client._request({
26
+ endpoint: `/v1/public/${token}`,
27
+ method: 'GET',
28
+ sendJWT: false, // This is a public endpoint
29
+ });
30
+ },
31
+ /**
32
+ * Gets public items at the root level of a public file system.
33
+ * This endpoint does not require authentication - access is controlled by the token.
34
+ *
35
+ * @param {string} token - The 10-character alphanumeric public access token.
36
+ * @param {PublicPaginationParams} params - Optional pagination and filtering parameters.
37
+ * @returns {Promise<PublicFileSystemResponse>} Paginated list of public file system items.
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const publicItems = await nuramaClient.public.getPublicItems('abc123def4');
42
+ * ```
43
+ */
44
+ async getPublicItems(token, params) {
45
+ if (!token)
46
+ throw new Error('token is required.');
47
+ if (token.length !== 10)
48
+ throw new Error('token must be exactly 10 characters long.');
49
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
50
+ throw new Error('token must contain only alphanumeric characters.');
51
+ // Convert arrays to proper format for query params
52
+ const queryParams = params ? {
53
+ ...params,
54
+ resourceIds: Array.isArray(params.resourceIds) ? params.resourceIds : (params.resourceIds ? [params.resourceIds] : []),
55
+ resourceSlugs: Array.isArray(params.resourceSlugs) ? params.resourceSlugs : (params.resourceSlugs ? [params.resourceSlugs] : []),
56
+ resourceTags: Array.isArray(params.resourceTags) ? params.resourceTags : (params.resourceTags ? [params.resourceTags] : []),
57
+ mediaTypes: Array.isArray(params.mediaTypes) ? params.mediaTypes : (params.mediaTypes ? [params.mediaTypes] : []),
58
+ } : {};
59
+ return client._request({
60
+ endpoint: `/v1/public/${token}/files`,
61
+ method: 'GET',
62
+ params: queryParams,
63
+ sendJWT: false, // This is a public endpoint
64
+ });
65
+ },
66
+ /**
67
+ * Gets public items at a specific path within a public file system.
68
+ * This endpoint does not require authentication - access is controlled by the token.
69
+ *
70
+ * @param {string} token - The 10-character alphanumeric public access token.
71
+ * @param {string} path - The path within the public file system to retrieve items from.
72
+ * @param {PublicPaginationParams} params - Optional pagination and filtering parameters.
73
+ * @returns {Promise<PublicFileSystemResponse>} Paginated list of public file system items.
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const items = await nuramaClient.public.getPublicItemsAtPath('abc123def4', 'folder1/subfolder');
78
+ * ```
79
+ */
80
+ async getPublicItemsAtPath(token, path, params) {
81
+ if (!token)
82
+ throw new Error('token is required.');
83
+ if (token.length !== 10)
84
+ throw new Error('token must be exactly 10 characters long.');
85
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
86
+ throw new Error('token must contain only alphanumeric characters.');
87
+ if (path === null || path === undefined)
88
+ throw new Error('path is required.');
89
+ // Remove leading slash if present
90
+ const cleanPath = path.startsWith('/') ? path.substring(1) : path;
91
+ // Convert arrays to proper format for query params
92
+ const queryParams = params ? {
93
+ ...params,
94
+ resourceIds: Array.isArray(params.resourceIds) ? params.resourceIds : (params.resourceIds ? [params.resourceIds] : []),
95
+ resourceSlugs: Array.isArray(params.resourceSlugs) ? params.resourceSlugs : (params.resourceSlugs ? [params.resourceSlugs] : []),
96
+ resourceTags: Array.isArray(params.resourceTags) ? params.resourceTags : (params.resourceTags ? [params.resourceTags] : []),
97
+ mediaTypes: Array.isArray(params.mediaTypes) ? params.mediaTypes : (params.mediaTypes ? [params.mediaTypes] : []),
98
+ } : {};
99
+ return client._request({
100
+ endpoint: `/v1/public/${token}/files/${cleanPath}`,
101
+ method: 'GET',
102
+ params: queryParams,
103
+ sendJWT: false, // This is a public endpoint
104
+ });
105
+ },
106
+ /**
107
+ * Downloads public assets by generating signed URLs for the original files.
108
+ * This endpoint does not require authentication - access is controlled by the token.
109
+ *
110
+ * @param {string} token - The 10-character alphanumeric public access token.
111
+ * @param {DownloadPublicAssetsData} downloadData - The asset IDs to download.
112
+ * @returns {Promise<DownloadSignedUrlData[]>} Array of signed download URLs for the requested assets.
113
+ *
114
+ * @example
115
+ * ```typescript
116
+ * const downloadUrls = await nuramaClient.public.downloadAssets('abc123def4', {
117
+ * assetIds: ['507f1f77bcf86cd799439011', '507f191e810c19729de860ea']
118
+ * });
119
+ * ```
120
+ */
121
+ async downloadAssets(token, downloadData) {
122
+ if (!token)
123
+ throw new Error('token is required.');
124
+ if (token.length !== 10)
125
+ throw new Error('token must be exactly 10 characters long.');
126
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
127
+ throw new Error('token must contain only alphanumeric characters.');
128
+ if (!downloadData)
129
+ throw new Error('downloadData is required.');
130
+ if (!downloadData.assetIds || !Array.isArray(downloadData.assetIds) || downloadData.assetIds.length === 0) {
131
+ throw new Error('downloadData.assetIds must be a non-empty array.');
132
+ }
133
+ return client._request({
134
+ endpoint: `/v1/public/${token}/download`,
135
+ method: 'POST',
136
+ body: downloadData,
137
+ sendJWT: false, // This is a public endpoint
138
+ });
139
+ },
140
+ // ============================================================================
141
+ // Public Chat Methods
142
+ // ============================================================================
143
+ /**
144
+ * Gets the main public file system chat or a specific chat by ID.
145
+ * This endpoint does not require authentication for read access.
146
+ *
147
+ * @param {string} token - The 10-character alphanumeric public access token.
148
+ * @param {string} [chatId] - Optional specific chat ID to retrieve.
149
+ * @returns {Promise<Chat | null>} The chat object, or null if no main chat exists yet.
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * // Get main public file system chat
154
+ * const mainChat = await nuramaClient.public.getPublicChat('abc123def4');
155
+ *
156
+ * // Get specific chat by ID
157
+ * const chat = await nuramaClient.public.getPublicChat('abc123def4', 'chat-id-here');
158
+ * ```
159
+ */
160
+ async getPublicChat(token, chatId) {
161
+ if (!token)
162
+ throw new Error('token is required.');
163
+ if (token.length !== 10)
164
+ throw new Error('token must be exactly 10 characters long.');
165
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
166
+ throw new Error('token must contain only alphanumeric characters.');
167
+ const endpoint = chatId ? `/v1/public/${token}/chat/${chatId}` : `/v1/public/${token}/chat`;
168
+ return client._request({
169
+ endpoint,
170
+ method: 'GET',
171
+ sendJWT: false, // Read access is public
172
+ });
173
+ },
174
+ /**
175
+ * Gets paginated messages for a public chat.
176
+ * This endpoint does not require authentication for read access.
177
+ *
178
+ * @param {string} token - The 10-character alphanumeric public access token.
179
+ * @param {string} chatId - The ID of the chat to get messages from.
180
+ * @param {GetPublicChatMessagesParams} [params] - Optional pagination parameters.
181
+ * @returns {Promise<PublicChatMessagesResponse>} Paginated list of chat messages.
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * const messages = await nuramaClient.public.getPublicChatMessages('abc123def4', 'chat-id', {
186
+ * limit: 20,
187
+ * paginateReverse: false,
188
+ * });
189
+ * ```
190
+ */
191
+ async getPublicChatMessages(token, chatId, params) {
192
+ if (!token)
193
+ throw new Error('token is required.');
194
+ if (token.length !== 10)
195
+ throw new Error('token must be exactly 10 characters long.');
196
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
197
+ throw new Error('token must contain only alphanumeric characters.');
198
+ if (!chatId)
199
+ throw new Error('chatId is required.');
200
+ return client._request({
201
+ endpoint: `/v1/public/${token}/chat/${chatId}/messages`,
202
+ method: 'GET',
203
+ params: params || {},
204
+ sendJWT: false, // Read access is public
205
+ });
206
+ },
207
+ /**
208
+ * Creates a message in an existing public chat.
209
+ * Requires authentication.
210
+ *
211
+ * @param {string} token - The 10-character alphanumeric public access token.
212
+ * @param {string} chatId - The ID of the chat to post to.
213
+ * @param {CreatePublicChatMessageRequest} data - The message data.
214
+ * @returns {Promise<ChatMessage>} The created message.
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * const message = await nuramaClient.public.createPublicChatMessage('abc123def4', 'chat-id', {
219
+ * content: 'Hello world!',
220
+ * });
221
+ * ```
222
+ */
223
+ async createPublicChatMessage(token, chatId, data) {
224
+ if (!token)
225
+ throw new Error('token is required.');
226
+ if (token.length !== 10)
227
+ throw new Error('token must be exactly 10 characters long.');
228
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
229
+ throw new Error('token must contain only alphanumeric characters.');
230
+ if (!chatId)
231
+ throw new Error('chatId is required.');
232
+ if (!data)
233
+ throw new Error('data is required.');
234
+ return client._request({
235
+ endpoint: `/v1/public/${token}/chat/${chatId}/messages`,
236
+ method: 'POST',
237
+ body: data,
238
+ sendJWT: 'optional', // Authenticated caller keeps identity; anonymous allowed when the release opts in
239
+ });
240
+ },
241
+ /**
242
+ * Creates a message on the main public topic chat.
243
+ * If no main chat exists for this public file system, one is created (lazy creation).
244
+ * Requires authentication.
245
+ *
246
+ * @param {string} token - The 10-character alphanumeric public access token.
247
+ * @param {CreatePublicChatMessageRequest} data - The message data.
248
+ * @returns {Promise<CreatePublicAssetChatMessageResponse>} The chat and created message.
249
+ *
250
+ * @example
251
+ * ```typescript
252
+ * // This creates the main chat if it doesn't exist and posts the first message
253
+ * const { chat, message } = await nuramaClient.public.createPublicTopicChatMessage('abc123def4', {
254
+ * content: 'First comment on this public file system!',
255
+ * });
256
+ * ```
257
+ */
258
+ async createPublicTopicChatMessage(token, data) {
259
+ if (!token)
260
+ throw new Error('token is required.');
261
+ if (token.length !== 10)
262
+ throw new Error('token must be exactly 10 characters long.');
263
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
264
+ throw new Error('token must contain only alphanumeric characters.');
265
+ if (!data)
266
+ throw new Error('data is required.');
267
+ return client._request({
268
+ endpoint: `/v1/public/${token}/chat/messages`,
269
+ method: 'POST',
270
+ body: data,
271
+ sendJWT: 'optional', // Authenticated caller keeps identity; anonymous allowed when the release opts in
272
+ });
273
+ },
274
+ /**
275
+ * Gets an asset with its public chat in the context of a public file system.
276
+ * This endpoint does not require authentication for read access.
277
+ *
278
+ * @param {string} token - The 10-character alphanumeric public access token.
279
+ * @param {string} assetId - The ID of the asset to retrieve.
280
+ * @returns {Promise<PublicAssetResponse>} The asset with its public chat (or null if no chat exists).
281
+ *
282
+ * @example
283
+ * ```typescript
284
+ * const asset = await nuramaClient.public.getPublicAsset('abc123def4', 'asset-id');
285
+ * if (asset.chats.public) {
286
+ * console.log('Asset has public chat:', asset.chats.public.id);
287
+ * }
288
+ * ```
289
+ */
290
+ async getPublicAsset(token, assetId) {
291
+ if (!token)
292
+ throw new Error('token is required.');
293
+ if (token.length !== 10)
294
+ throw new Error('token must be exactly 10 characters long.');
295
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
296
+ throw new Error('token must contain only alphanumeric characters.');
297
+ if (!assetId)
298
+ throw new Error('assetId is required.');
299
+ return client._request({
300
+ endpoint: `/v1/public/${token}/assets/${assetId}`,
301
+ method: 'GET',
302
+ sendJWT: false, // Read access is public
303
+ });
304
+ },
305
+ /**
306
+ * Creates a message on an asset's public chat.
307
+ * If no public chat exists for this asset in this public file system, one is created (lazy creation).
308
+ * Requires authentication.
309
+ *
310
+ * @param {string} token - The 10-character alphanumeric public access token.
311
+ * @param {string} assetId - The ID of the asset to post to.
312
+ * @param {CreatePublicChatMessageRequest} data - The message data.
313
+ * @returns {Promise<CreatePublicAssetChatMessageResponse>} The chat and created message.
314
+ *
315
+ * @example
316
+ * ```typescript
317
+ * // This creates the chat if it doesn't exist and posts the first message
318
+ * const { chat, message } = await nuramaClient.public.createPublicAssetChatMessage('abc123def4', 'asset-id', {
319
+ * content: 'First comment on this asset!',
320
+ * });
321
+ * ```
322
+ */
323
+ async createPublicAssetChatMessage(token, assetId, data) {
324
+ if (!token)
325
+ throw new Error('token is required.');
326
+ if (token.length !== 10)
327
+ throw new Error('token must be exactly 10 characters long.');
328
+ if (!/^[a-zA-Z0-9]{10}$/.test(token))
329
+ throw new Error('token must contain only alphanumeric characters.');
330
+ if (!assetId)
331
+ throw new Error('assetId is required.');
332
+ if (!data)
333
+ throw new Error('data is required.');
334
+ return client._request({
335
+ endpoint: `/v1/public/${token}/assets/${assetId}/messages`,
336
+ method: 'POST',
337
+ body: data,
338
+ sendJWT: 'optional', // Authenticated caller keeps identity; anonymous allowed when the release opts in
339
+ });
340
+ },
341
+ // ========================================================================
342
+ // Public asset links (/public-download)
343
+ // ========================================================================
344
+ /**
345
+ * Resolve a public asset-link token to the minimal file info the download page shows.
346
+ * Public endpoint; no authentication.
347
+ * @param {string} token - The public asset-link token.
348
+ * @returns {Promise<ResolvePublicDownloadResponse>} File name, media type and link status.
349
+ * @throws {Error} 'token is required.' when `token` is falsy.
350
+ */
351
+ async resolvePublicDownload(token) {
352
+ if (!token)
353
+ throw new Error('token is required.');
354
+ return client._request({
355
+ method: 'GET',
356
+ endpoint: `/v1/public-download/${token}`,
357
+ sendJWT: false,
358
+ });
359
+ },
360
+ /**
361
+ * Get a short-lived signed download URL for a public asset-link token.
362
+ * Public endpoint; fails with 403 for embed-only links.
363
+ * @param {string} token - The public asset-link token.
364
+ * @returns {Promise<PublicDownloadUrlResponse>} The signed URL and its expiry.
365
+ * @throws {Error} 'token is required.' when `token` is falsy.
366
+ */
367
+ async getPublicDownloadUrl(token) {
368
+ if (!token)
369
+ throw new Error('token is required.');
370
+ return client._request({
371
+ method: 'GET',
372
+ endpoint: `/v1/public-download/${token}/download`,
373
+ sendJWT: false,
374
+ });
375
+ },
376
+ /**
377
+ * Get the HLS stream and fallback media key paths for the embeddable player.
378
+ * Public endpoint; fails with 403 for download-only links.
379
+ * @param {string} token - The public asset-link token.
380
+ * @returns {Promise<PublicEmbedFilesResponse>} Stream and fallback key paths.
381
+ * @throws {Error} 'token is required.' when `token` is falsy.
382
+ */
383
+ async getPublicEmbedFiles(token) {
384
+ if (!token)
385
+ throw new Error('token is required.');
386
+ return client._request({
387
+ method: 'GET',
388
+ endpoint: `/v1/public-download/${token}/embed-files`,
389
+ sendJWT: false,
390
+ });
391
+ },
392
+ /**
393
+ * Record a play event from the embed player for a public asset link.
394
+ * Public endpoint; no authentication. The API responds 204.
395
+ * @param {string} token - The public asset-link token.
396
+ * @param {object} body - `{ eventType: 'play_started' | 'play_completed' }`.
397
+ * @returns {Promise<void>} Resolves once recorded.
398
+ * @throws {Error} 'token is required.' when `token` is falsy.
399
+ */
400
+ async recordAccessActivity(token, body) {
401
+ if (!token)
402
+ throw new Error('token is required.');
403
+ await client._request({
404
+ method: 'POST',
405
+ endpoint: `/v1/public-download/${token}/access-activity`,
406
+ body,
407
+ sendJWT: false,
408
+ });
409
+ },
410
+ };
411
+ }
412
+ //# sourceMappingURL=public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/routes/public.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import NuramaClient from '../NuramaClient.js';
2
+ export interface CompleteUploadBody {
3
+ uploadId: string;
4
+ parts: Array<{
5
+ ETag: string;
6
+ PartNumber: number;
7
+ }>;
8
+ }
9
+ export interface CompleteUploadResponse {
10
+ id: string;
11
+ url: string | null;
12
+ }
13
+ export interface PromoteBody {
14
+ /** Optional rename — lands on `Asset.name`. Defaults to a row-id-derived name. */
15
+ fileName?: string;
16
+ }
17
+ export interface PromoteResponse {
18
+ asset: unknown;
19
+ /**
20
+ * `true` when the scratch row was already promoted on a prior call
21
+ * (e.g. the same revision was Attached-to-chat earlier and the
22
+ * chat-send pipeline ran the promote synchronously). The returned
23
+ * `asset` is the existing one. The FE should treat this as a no-op
24
+ * for "newly added" UX (toast copy, list-refresh side effects) while
25
+ * still surfacing the asset.
26
+ */
27
+ alreadyPromoted: boolean;
28
+ }
29
+ /**
30
+ * Scratch — platform-wide temporary object-storage with explicit lifecycle.
31
+ *
32
+ * There is NO public surface for creating scratch rows or minting
33
+ * upload URLs. Parent processes (e.g. AI Revision) initiate the
34
+ * multipart upload server-side and return the
35
+ * `{ scratchId, uploadId, key, urls[] }` bundle in their own response
36
+ * payload. The FE uploads each part directly against its signed URL
37
+ * (same pattern as asset uploads), then calls `completeUpload` here to
38
+ * finalise.
39
+ *
40
+ * `completeUpload` mirrors `nuramaClient.asset.completeUpload`:
41
+ * the body is the same `{ uploadId, parts }` shape, the server runs the
42
+ * S3-compatible `CompleteMultipartUploadCommand`, and (for scratch
43
+ * specifically) HEADs the resulting object, increments workspace
44
+ * storage usage, and writes the audit row.
45
+ */
46
+ export default function createScratchMethods(client: NuramaClient): {
47
+ /**
48
+ * Finish a multipart upload for a scratch row. Same `{ uploadId,
49
+ * parts }` body the asset complete-upload route accepts. Server
50
+ * runs `CompleteMultipartUploadCommand` against the media bucket,
51
+ * HEADs the object for size, increments workspace storage usage,
52
+ * writes the audit row, and flips status pendingUpload → active.
53
+ * Creator-only.
54
+ */
55
+ completeUpload(scratchId: string, data: CompleteUploadBody): Promise<CompleteUploadResponse>;
56
+ /**
57
+ * Promote a scratch row to a real Asset. Creator-only — only the
58
+ * user who created the scratch row can call this. Destination is
59
+ * derived server-side from the row itself:
60
+ * - row has `projectId` → asset created in that project
61
+ * - row has only workspace → asset created at the workspace
62
+ *
63
+ * No body fields for destination on purpose: the FE doesn't get to
64
+ * claim a scratch belongs to a different workspace / project. The
65
+ * only optional input is `fileName` to override the asset's
66
+ * user-facing name.
67
+ */
68
+ promote(scratchId: string, data?: PromoteBody): Promise<PromoteResponse>;
69
+ };
70
+ //# sourceMappingURL=scratch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scratch.d.ts","sourceRoot":"","sources":["../../src/routes/scratch.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf;;;;;;;OAOG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAM,EAAE,YAAY;IAE7D;;;;;;;OAOG;8BAC6B,MAAM,QAAQ,kBAAkB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAclG;;;;;;;;;;;OAWG;uBACsB,MAAM,SAAQ,WAAW,GAAQ,OAAO,CAAC,eAAe,CAAC;EAUrF"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Scratch — platform-wide temporary object-storage with explicit lifecycle.
3
+ *
4
+ * There is NO public surface for creating scratch rows or minting
5
+ * upload URLs. Parent processes (e.g. AI Revision) initiate the
6
+ * multipart upload server-side and return the
7
+ * `{ scratchId, uploadId, key, urls[] }` bundle in their own response
8
+ * payload. The FE uploads each part directly against its signed URL
9
+ * (same pattern as asset uploads), then calls `completeUpload` here to
10
+ * finalise.
11
+ *
12
+ * `completeUpload` mirrors `nuramaClient.asset.completeUpload`:
13
+ * the body is the same `{ uploadId, parts }` shape, the server runs the
14
+ * S3-compatible `CompleteMultipartUploadCommand`, and (for scratch
15
+ * specifically) HEADs the resulting object, increments workspace
16
+ * storage usage, and writes the audit row.
17
+ */
18
+ export default function createScratchMethods(client) {
19
+ return {
20
+ /**
21
+ * Finish a multipart upload for a scratch row. Same `{ uploadId,
22
+ * parts }` body the asset complete-upload route accepts. Server
23
+ * runs `CompleteMultipartUploadCommand` against the media bucket,
24
+ * HEADs the object for size, increments workspace storage usage,
25
+ * writes the audit row, and flips status pendingUpload → active.
26
+ * Creator-only.
27
+ */
28
+ async completeUpload(scratchId, data) {
29
+ if (!scratchId)
30
+ throw new Error('scratchId is required.');
31
+ if (!data?.uploadId)
32
+ throw new Error('uploadId is required.');
33
+ if (!Array.isArray(data?.parts) || data.parts.length === 0) {
34
+ throw new Error('parts is required.');
35
+ }
36
+ return client._request({
37
+ endpoint: `/v1/scratch/${encodeURIComponent(scratchId)}/complete-upload`,
38
+ method: 'POST',
39
+ body: data,
40
+ sendJWT: true,
41
+ });
42
+ },
43
+ /**
44
+ * Promote a scratch row to a real Asset. Creator-only — only the
45
+ * user who created the scratch row can call this. Destination is
46
+ * derived server-side from the row itself:
47
+ * - row has `projectId` → asset created in that project
48
+ * - row has only workspace → asset created at the workspace
49
+ *
50
+ * No body fields for destination on purpose: the FE doesn't get to
51
+ * claim a scratch belongs to a different workspace / project. The
52
+ * only optional input is `fileName` to override the asset's
53
+ * user-facing name.
54
+ */
55
+ async promote(scratchId, data = {}) {
56
+ if (!scratchId)
57
+ throw new Error('scratchId is required.');
58
+ return client._request({
59
+ endpoint: `/v1/scratch/${encodeURIComponent(scratchId)}/promote`,
60
+ method: 'POST',
61
+ body: data,
62
+ sendJWT: true,
63
+ });
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=scratch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scratch.js","sourceRoot":"","sources":["../../src/routes/scratch.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAoB;IAC/D,OAAO;QACL;;;;;;;WAOG;QACH,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,IAAwB;YAC9D,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI,EAAE,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,MAAM,CAAC,QAAQ,CAAC;gBACrB,QAAQ,EAAE,eAAe,kBAAkB,CAAC,SAAS,CAAC,kBAAkB;gBACxE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED;;;;;;;;;;;WAWG;QACH,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAoB,EAAE;YACrD,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC,QAAQ,CAAC;gBACrB,QAAQ,EAAE,eAAe,kBAAkB,CAAC,SAAS,CAAC,UAAU;gBAChE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}