@dugjason/front-node 0.1.0-beta.2 → 0.2.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 (303) hide show
  1. package/{LICENSE.md → LICENSE} +2 -2
  2. package/README.md +41 -258
  3. package/dist/index.cjs +2 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +11907 -0
  6. package/dist/index.d.cts.map +1 -0
  7. package/dist/index.d.mts +11907 -0
  8. package/dist/index.d.mts.map +1 -0
  9. package/dist/index.mjs +2 -0
  10. package/dist/index.mjs.map +1 -0
  11. package/package.json +67 -38
  12. package/dist/client.d.ts +0 -53
  13. package/dist/client.d.ts.map +0 -1
  14. package/dist/client.js +0 -230
  15. package/dist/client.js.map +0 -1
  16. package/dist/core/client.d.ts +0 -36
  17. package/dist/core/client.d.ts.map +0 -1
  18. package/dist/core/client.js +0 -89
  19. package/dist/core/client.js.map +0 -1
  20. package/dist/core/errors.d.ts +0 -55
  21. package/dist/core/errors.d.ts.map +0 -1
  22. package/dist/core/errors.js +0 -124
  23. package/dist/core/errors.js.map +0 -1
  24. package/dist/core/paginator.d.ts +0 -88
  25. package/dist/core/paginator.d.ts.map +0 -1
  26. package/dist/core/paginator.js +0 -129
  27. package/dist/core/paginator.js.map +0 -1
  28. package/dist/core/resource.d.ts +0 -143
  29. package/dist/core/resource.d.ts.map +0 -1
  30. package/dist/core/resource.js +0 -132
  31. package/dist/core/resource.js.map +0 -1
  32. package/dist/endpoints/accounts.d.ts +0 -34
  33. package/dist/endpoints/accounts.d.ts.map +0 -1
  34. package/dist/endpoints/accounts.js +0 -85
  35. package/dist/endpoints/accounts.js.map +0 -1
  36. package/dist/endpoints/analytics.d.ts +0 -32
  37. package/dist/endpoints/analytics.d.ts.map +0 -1
  38. package/dist/endpoints/analytics.js +0 -48
  39. package/dist/endpoints/analytics.js.map +0 -1
  40. package/dist/endpoints/applications.d.ts +0 -15
  41. package/dist/endpoints/applications.d.ts.map +0 -1
  42. package/dist/endpoints/applications.js +0 -17
  43. package/dist/endpoints/applications.js.map +0 -1
  44. package/dist/endpoints/attachments.d.ts +0 -8
  45. package/dist/endpoints/attachments.d.ts.map +0 -1
  46. package/dist/endpoints/attachments.js +0 -10
  47. package/dist/endpoints/attachments.js.map +0 -1
  48. package/dist/endpoints/channels.d.ts +0 -41
  49. package/dist/endpoints/channels.d.ts.map +0 -1
  50. package/dist/endpoints/channels.js +0 -64
  51. package/dist/endpoints/channels.js.map +0 -1
  52. package/dist/endpoints/comments.d.ts +0 -30
  53. package/dist/endpoints/comments.d.ts.map +0 -1
  54. package/dist/endpoints/comments.js +0 -45
  55. package/dist/endpoints/comments.js.map +0 -1
  56. package/dist/endpoints/contacts.d.ts +0 -46
  57. package/dist/endpoints/contacts.d.ts.map +0 -1
  58. package/dist/endpoints/contacts.js +0 -99
  59. package/dist/endpoints/contacts.js.map +0 -1
  60. package/dist/endpoints/conversations.d.ts +0 -77
  61. package/dist/endpoints/conversations.d.ts.map +0 -1
  62. package/dist/endpoints/conversations.js +0 -221
  63. package/dist/endpoints/conversations.js.map +0 -1
  64. package/dist/endpoints/drafts.d.ts +0 -12
  65. package/dist/endpoints/drafts.d.ts.map +0 -1
  66. package/dist/endpoints/drafts.js +0 -26
  67. package/dist/endpoints/drafts.js.map +0 -1
  68. package/dist/endpoints/events.d.ts +0 -13
  69. package/dist/endpoints/events.d.ts.map +0 -1
  70. package/dist/endpoints/events.js +0 -21
  71. package/dist/endpoints/events.js.map +0 -1
  72. package/dist/endpoints/inboxes.d.ts +0 -42
  73. package/dist/endpoints/inboxes.d.ts.map +0 -1
  74. package/dist/endpoints/inboxes.js +0 -83
  75. package/dist/endpoints/inboxes.js.map +0 -1
  76. package/dist/endpoints/knowledge-base-articles.d.ts +0 -8
  77. package/dist/endpoints/knowledge-base-articles.d.ts.map +0 -1
  78. package/dist/endpoints/knowledge-base-articles.js +0 -10
  79. package/dist/endpoints/knowledge-base-articles.js.map +0 -1
  80. package/dist/endpoints/knowledge-bases.d.ts +0 -50
  81. package/dist/endpoints/knowledge-bases.d.ts.map +0 -1
  82. package/dist/endpoints/knowledge-bases.js +0 -131
  83. package/dist/endpoints/knowledge-bases.js.map +0 -1
  84. package/dist/endpoints/links.d.ts +0 -30
  85. package/dist/endpoints/links.d.ts.map +0 -1
  86. package/dist/endpoints/links.js +0 -67
  87. package/dist/endpoints/links.js.map +0 -1
  88. package/dist/endpoints/message-template-folders.d.ts +0 -38
  89. package/dist/endpoints/message-template-folders.d.ts.map +0 -1
  90. package/dist/endpoints/message-template-folders.js +0 -114
  91. package/dist/endpoints/message-template-folders.js.map +0 -1
  92. package/dist/endpoints/message-templates.d.ts +0 -30
  93. package/dist/endpoints/message-templates.d.ts.map +0 -1
  94. package/dist/endpoints/message-templates.js +0 -69
  95. package/dist/endpoints/message-templates.js.map +0 -1
  96. package/dist/endpoints/messages.d.ts +0 -21
  97. package/dist/endpoints/messages.d.ts.map +0 -1
  98. package/dist/endpoints/messages.js +0 -31
  99. package/dist/endpoints/messages.js.map +0 -1
  100. package/dist/endpoints/rules.d.ts +0 -16
  101. package/dist/endpoints/rules.d.ts.map +0 -1
  102. package/dist/endpoints/rules.js +0 -21
  103. package/dist/endpoints/rules.js.map +0 -1
  104. package/dist/endpoints/shifts.d.ts +0 -46
  105. package/dist/endpoints/shifts.d.ts.map +0 -1
  106. package/dist/endpoints/shifts.js +0 -70
  107. package/dist/endpoints/shifts.js.map +0 -1
  108. package/dist/endpoints/signatures.d.ts +0 -36
  109. package/dist/endpoints/signatures.d.ts.map +0 -1
  110. package/dist/endpoints/signatures.js +0 -52
  111. package/dist/endpoints/signatures.js.map +0 -1
  112. package/dist/endpoints/statuses.d.ts +0 -15
  113. package/dist/endpoints/statuses.d.ts.map +0 -1
  114. package/dist/endpoints/statuses.js +0 -22
  115. package/dist/endpoints/statuses.js.map +0 -1
  116. package/dist/endpoints/tags.d.ts +0 -30
  117. package/dist/endpoints/tags.d.ts.map +0 -1
  118. package/dist/endpoints/tags.js +0 -49
  119. package/dist/endpoints/tags.js.map +0 -1
  120. package/dist/endpoints/teammate-groups.d.ts +0 -47
  121. package/dist/endpoints/teammate-groups.d.ts.map +0 -1
  122. package/dist/endpoints/teammate-groups.js +0 -101
  123. package/dist/endpoints/teammate-groups.js.map +0 -1
  124. package/dist/endpoints/teammates.d.ts +0 -28
  125. package/dist/endpoints/teammates.d.ts.map +0 -1
  126. package/dist/endpoints/teammates.js +0 -59
  127. package/dist/endpoints/teammates.js.map +0 -1
  128. package/dist/endpoints/teams.d.ts +0 -37
  129. package/dist/endpoints/teams.d.ts.map +0 -1
  130. package/dist/endpoints/teams.js +0 -79
  131. package/dist/endpoints/teams.js.map +0 -1
  132. package/dist/front.d.ts +0 -103
  133. package/dist/front.d.ts.map +0 -1
  134. package/dist/front.js +0 -162
  135. package/dist/front.js.map +0 -1
  136. package/dist/generated/client/client.gen.d.ts +0 -3
  137. package/dist/generated/client/client.gen.d.ts.map +0 -1
  138. package/dist/generated/client/client.gen.js +0 -204
  139. package/dist/generated/client/client.gen.js.map +0 -1
  140. package/dist/generated/client/index.d.ts +0 -8
  141. package/dist/generated/client/index.d.ts.map +0 -1
  142. package/dist/generated/client/index.js +0 -6
  143. package/dist/generated/client/index.js.map +0 -1
  144. package/dist/generated/client/types.gen.d.ts +0 -125
  145. package/dist/generated/client/types.gen.d.ts.map +0 -1
  146. package/dist/generated/client/types.gen.js +0 -3
  147. package/dist/generated/client/types.gen.js.map +0 -1
  148. package/dist/generated/client/utils.gen.d.ts +0 -39
  149. package/dist/generated/client/utils.gen.d.ts.map +0 -1
  150. package/dist/generated/client/utils.gen.js +0 -230
  151. package/dist/generated/client/utils.gen.js.map +0 -1
  152. package/dist/generated/client.gen.d.ts +0 -13
  153. package/dist/generated/client.gen.d.ts.map +0 -1
  154. package/dist/generated/client.gen.js +0 -6
  155. package/dist/generated/client.gen.js.map +0 -1
  156. package/dist/generated/core/auth.gen.d.ts +0 -19
  157. package/dist/generated/core/auth.gen.d.ts.map +0 -1
  158. package/dist/generated/core/auth.gen.js +0 -15
  159. package/dist/generated/core/auth.gen.js.map +0 -1
  160. package/dist/generated/core/bodySerializer.gen.d.ts +0 -18
  161. package/dist/generated/core/bodySerializer.gen.d.ts.map +0 -1
  162. package/dist/generated/core/bodySerializer.gen.js +0 -58
  163. package/dist/generated/core/bodySerializer.gen.js.map +0 -1
  164. package/dist/generated/core/params.gen.d.ts +0 -34
  165. package/dist/generated/core/params.gen.d.ts.map +0 -1
  166. package/dist/generated/core/params.gen.js +0 -89
  167. package/dist/generated/core/params.gen.js.map +0 -1
  168. package/dist/generated/core/pathSerializer.gen.d.ts +0 -34
  169. package/dist/generated/core/pathSerializer.gen.d.ts.map +0 -1
  170. package/dist/generated/core/pathSerializer.gen.js +0 -115
  171. package/dist/generated/core/pathSerializer.gen.js.map +0 -1
  172. package/dist/generated/core/serverSentEvents.gen.d.ts +0 -72
  173. package/dist/generated/core/serverSentEvents.gen.d.ts.map +0 -1
  174. package/dist/generated/core/serverSentEvents.gen.js +0 -136
  175. package/dist/generated/core/serverSentEvents.gen.js.map +0 -1
  176. package/dist/generated/core/types.gen.d.ts +0 -79
  177. package/dist/generated/core/types.gen.d.ts.map +0 -1
  178. package/dist/generated/core/types.gen.js +0 -3
  179. package/dist/generated/core/types.gen.js.map +0 -1
  180. package/dist/generated/core/utils.gen.d.ts +0 -15
  181. package/dist/generated/core/utils.gen.d.ts.map +0 -1
  182. package/dist/generated/core/utils.gen.js +0 -70
  183. package/dist/generated/core/utils.gen.js.map +0 -1
  184. package/dist/generated/sdk.gen.d.ts +0 -1292
  185. package/dist/generated/sdk.gen.d.ts.map +0 -1
  186. package/dist/generated/sdk.gen.js +0 -4202
  187. package/dist/generated/sdk.gen.js.map +0 -1
  188. package/dist/generated/types.gen.d.ts +0 -8492
  189. package/dist/generated/types.gen.d.ts.map +0 -1
  190. package/dist/generated/types.gen.js +0 -149
  191. package/dist/generated/types.gen.js.map +0 -1
  192. package/dist/index.d.ts +0 -28
  193. package/dist/index.d.ts.map +0 -1
  194. package/dist/index.js +0 -6
  195. package/dist/index.js.map +0 -1
  196. package/dist/oauth.d.ts +0 -28
  197. package/dist/oauth.d.ts.map +0 -1
  198. package/dist/oauth.js +0 -82
  199. package/dist/oauth.js.map +0 -1
  200. package/dist/resources/accounts.d.ts +0 -16
  201. package/dist/resources/accounts.d.ts.map +0 -1
  202. package/dist/resources/accounts.js +0 -37
  203. package/dist/resources/accounts.js.map +0 -1
  204. package/dist/resources/analytics.d.ts +0 -36
  205. package/dist/resources/analytics.d.ts.map +0 -1
  206. package/dist/resources/analytics.js +0 -82
  207. package/dist/resources/analytics.js.map +0 -1
  208. package/dist/resources/applications.d.ts +0 -9
  209. package/dist/resources/applications.d.ts.map +0 -1
  210. package/dist/resources/applications.js +0 -13
  211. package/dist/resources/applications.js.map +0 -1
  212. package/dist/resources/channels.d.ts +0 -18
  213. package/dist/resources/channels.d.ts.map +0 -1
  214. package/dist/resources/channels.js +0 -35
  215. package/dist/resources/channels.js.map +0 -1
  216. package/dist/resources/comments.d.ts +0 -18
  217. package/dist/resources/comments.d.ts.map +0 -1
  218. package/dist/resources/comments.js +0 -36
  219. package/dist/resources/comments.js.map +0 -1
  220. package/dist/resources/contacts.d.ts +0 -16
  221. package/dist/resources/contacts.d.ts.map +0 -1
  222. package/dist/resources/contacts.js +0 -37
  223. package/dist/resources/contacts.js.map +0 -1
  224. package/dist/resources/conversations.d.ts +0 -24
  225. package/dist/resources/conversations.d.ts.map +0 -1
  226. package/dist/resources/conversations.js +0 -55
  227. package/dist/resources/conversations.js.map +0 -1
  228. package/dist/resources/drafts.d.ts +0 -15
  229. package/dist/resources/drafts.d.ts.map +0 -1
  230. package/dist/resources/drafts.js +0 -34
  231. package/dist/resources/drafts.js.map +0 -1
  232. package/dist/resources/events.d.ts +0 -23
  233. package/dist/resources/events.d.ts.map +0 -1
  234. package/dist/resources/events.js +0 -28
  235. package/dist/resources/events.js.map +0 -1
  236. package/dist/resources/inboxes.d.ts +0 -12
  237. package/dist/resources/inboxes.d.ts.map +0 -1
  238. package/dist/resources/inboxes.js +0 -25
  239. package/dist/resources/inboxes.js.map +0 -1
  240. package/dist/resources/knowledge-base-articles.d.ts +0 -15
  241. package/dist/resources/knowledge-base-articles.d.ts.map +0 -1
  242. package/dist/resources/knowledge-base-articles.js +0 -34
  243. package/dist/resources/knowledge-base-articles.js.map +0 -1
  244. package/dist/resources/knowledge-base-categories.d.ts +0 -16
  245. package/dist/resources/knowledge-base-categories.d.ts.map +0 -1
  246. package/dist/resources/knowledge-base-categories.js +0 -37
  247. package/dist/resources/knowledge-base-categories.js.map +0 -1
  248. package/dist/resources/knowledge-bases.d.ts +0 -15
  249. package/dist/resources/knowledge-bases.d.ts.map +0 -1
  250. package/dist/resources/knowledge-bases.js +0 -35
  251. package/dist/resources/knowledge-bases.js.map +0 -1
  252. package/dist/resources/links.d.ts +0 -12
  253. package/dist/resources/links.d.ts.map +0 -1
  254. package/dist/resources/links.js +0 -25
  255. package/dist/resources/links.js.map +0 -1
  256. package/dist/resources/message-template-folders.d.ts +0 -13
  257. package/dist/resources/message-template-folders.d.ts.map +0 -1
  258. package/dist/resources/message-template-folders.js +0 -41
  259. package/dist/resources/message-template-folders.js.map +0 -1
  260. package/dist/resources/message-templates.d.ts +0 -16
  261. package/dist/resources/message-templates.d.ts.map +0 -1
  262. package/dist/resources/message-templates.js +0 -50
  263. package/dist/resources/message-templates.js.map +0 -1
  264. package/dist/resources/messages.d.ts +0 -36
  265. package/dist/resources/messages.d.ts.map +0 -1
  266. package/dist/resources/messages.js +0 -55
  267. package/dist/resources/messages.js.map +0 -1
  268. package/dist/resources/rules.d.ts +0 -11
  269. package/dist/resources/rules.d.ts.map +0 -1
  270. package/dist/resources/rules.js +0 -22
  271. package/dist/resources/rules.js.map +0 -1
  272. package/dist/resources/shifts.d.ts +0 -14
  273. package/dist/resources/shifts.d.ts.map +0 -1
  274. package/dist/resources/shifts.js +0 -31
  275. package/dist/resources/shifts.js.map +0 -1
  276. package/dist/resources/signatures.d.ts +0 -17
  277. package/dist/resources/signatures.d.ts.map +0 -1
  278. package/dist/resources/signatures.js +0 -51
  279. package/dist/resources/signatures.js.map +0 -1
  280. package/dist/resources/statuses.d.ts +0 -13
  281. package/dist/resources/statuses.d.ts.map +0 -1
  282. package/dist/resources/statuses.js +0 -28
  283. package/dist/resources/statuses.js.map +0 -1
  284. package/dist/resources/tags.d.ts +0 -17
  285. package/dist/resources/tags.d.ts.map +0 -1
  286. package/dist/resources/tags.js +0 -53
  287. package/dist/resources/tags.js.map +0 -1
  288. package/dist/resources/teammate-groups.d.ts +0 -17
  289. package/dist/resources/teammate-groups.d.ts.map +0 -1
  290. package/dist/resources/teammate-groups.js +0 -25
  291. package/dist/resources/teammate-groups.js.map +0 -1
  292. package/dist/resources/teammates.d.ts +0 -17
  293. package/dist/resources/teammates.d.ts.map +0 -1
  294. package/dist/resources/teammates.js +0 -40
  295. package/dist/resources/teammates.js.map +0 -1
  296. package/dist/resources/teams.d.ts +0 -11
  297. package/dist/resources/teams.d.ts.map +0 -1
  298. package/dist/resources/teams.js +0 -28
  299. package/dist/resources/teams.js.map +0 -1
  300. package/dist/types.d.ts +0 -46
  301. package/dist/types.d.ts.map +0 -1
  302. package/dist/types.js +0 -2
  303. package/dist/types.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["packageJson.name","packageJson.version","_exhaustive"],"sources":["../package.json","../src/errors.ts","../src/normalize-response.ts","../src/base.ts","../src/resource.ts","../src/resources/accounts.ts","../src/resources/analytics.ts","../src/resources/applications.ts","../src/resources/channels.ts","../src/resources/comments.ts","../src/resources/tags.ts","../src/resources/company.ts","../src/resources/contact-lists.ts","../src/resources/contacts.ts","../src/resources/conversations.ts","../src/resources/custom-fields-global.ts","../src/resources/downloads.ts","../src/resources/drafts.ts","../src/resources/events.ts","../src/resources/inboxes.ts","../src/resources/knowledge.ts","../src/resources/links.ts","../src/resources/me.ts","../src/resources/message-templates.ts","../src/resources/message-template-folders.ts","../src/resources/messages.ts","../src/resources/rules.ts","../src/resources/teammates.ts","../src/resources/shifts.ts","../src/resources/signatures.ts","../src/resources/teammate-groups.ts","../src/resources/teams.ts","../src/resources/views.ts","../src/front.ts"],"sourcesContent":["","/** Thrown when the Front API returns a non-success HTTP status. */\nexport class FrontApiError extends Error {\n /** HTTP status code from the failed response. */\n readonly status: number;\n /** Response headers from the failed request. */\n readonly headers: Headers;\n /** The underlying `fetch` {@link Response}. */\n readonly response: Response;\n /** Parsed error body when JSON; otherwise the raw response text or other parse result. */\n readonly body: unknown;\n\n /**\n * @param response Failed HTTP response.\n * @param body Parsed error payload (see {@link FrontApiError.body}).\n */\n constructor(response: Response, body: unknown) {\n super(`Front API error: ${response.status} ${response.statusText}`);\n this.name = \"FrontApiError\";\n this.status = response.status;\n this.headers = response.headers;\n this.response = response;\n this.body = body;\n }\n}\n","/**\n * List JSON after {@link normalizeFrontResponse}: `_pagination` is renamed to `pagination`\n * (and `pagination.next` is the `page_token` string, not the raw API URL).\n */\nexport type WithNormalizedPagination<T> = [Extract<keyof T, \"_pagination\">] extends [never]\n ? T\n : Omit<T, \"_pagination\"> & {\n pagination?: T extends { _pagination?: infer P } ? P : never;\n };\n\n/**\n * Pagination object after {@link normalizeFrontResponse}: `_pagination` from the API becomes `pagination`,\n * and `next` holds the **`page_token` query value** (not the full URL the API returns).\n */\nexport type PaginationInfo = Record<string, unknown> & {\n /** Pass as `page_token` on the next list request. */\n next?: string | null;\n};\n\n/**\n * Extract the `page_token` query parameter from a Front pagination `next` URL.\n * If `next` is not a URL or has no `page_token`, returns `next` unchanged.\n *\n * @param next Value of `_pagination.next` from the raw API.\n */\nexport const pageTokenFromPaginationNextUrl = (next?: string | null): string | null | undefined => {\n if (!next) {\n return null;\n }\n try {\n const u = new URL(next);\n const token = u.searchParams.get(\"page_token\");\n if (token !== null && token !== \"\") {\n return token;\n }\n } catch {\n // not a URL\n return null;\n }\n return null;\n};\n\n/**\n * Rename `_pagination` → `pagination` and replace `pagination.next` full URLs with the\n * `page_token` query value.\n *\n * @param value Parsed JSON body.\n */\nexport const normalizeFrontResponse = <T>(value: T): WithNormalizedPagination<T> => {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return value as WithNormalizedPagination<T>;\n }\n const input = value as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(input)) {\n if (key === \"_pagination\") {\n if (val !== null && typeof val === \"object\" && !Array.isArray(val)) {\n const p = val as Record<string, unknown>;\n const nextRaw = p.next;\n const next =\n typeof nextRaw === \"string\" ? pageTokenFromPaginationNextUrl(nextRaw) : nextRaw;\n result.pagination = { ...p, next };\n }\n continue;\n }\n result[key] = val;\n }\n return result as WithNormalizedPagination<T>;\n};\n","import packageJson from \"../package.json\";\nimport { FrontApiError } from \"./errors\";\nimport { normalizeFrontResponse } from \"./normalize-response\";\n\nconst DEFAULT_USER_AGENT = `${packageJson.name}@${packageJson.version}`;\n\n/** Options for {@link FrontBase}. */\nexport interface FrontBaseOptions {\n /** Bearer token sent as `Authorization: Bearer …`. */\n apiKey: string;\n /** API origin (default `https://api2.frontapp.com`). */\n baseUrl?: string;\n /** Override `fetch` (defaults to `globalThis.fetch`). */\n fetch?: typeof fetch;\n /** User-Agent header value sent with each request. */\n userAgent?: string;\n}\n\nconst TRAILING_SLASH_AT_END = /\\/$/u;\n\nconst joinUrl = (baseUrl: string, path: string): string => {\n const base = baseUrl.replace(TRAILING_SLASH_AT_END, \"\");\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${base}${p}`;\n};\n\nconst appendQuery = (url: string, query?: Record<string, string | undefined>): string => {\n if (!query) {\n return url;\n }\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n params.set(key, value);\n }\n }\n const qs = params.toString();\n return qs.length > 0 ? `${url}?${qs}` : url;\n};\n\n/**\n * Shared HTTP layer for the Front API. {@link Front} extends this class and attaches resource helpers.\n */\nexport class FrontBase {\n protected readonly apiKey: string;\n protected readonly baseUrl: string;\n protected readonly fetchImpl: typeof fetch;\n protected readonly userAgent: string;\n\n /** @param options API token and optional overrides. */\n constructor(options: FrontBaseOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://api2.frontapp.com\";\n this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.userAgent = options.userAgent ?? DEFAULT_USER_AGENT;\n }\n\n protected buildUrl(path: string, query?: Record<string, string | undefined>): string {\n return appendQuery(joinUrl(this.baseUrl, path), query);\n }\n\n /**\n * Build a path by substituting `{param}` placeholders with URL-encoded values\n * (e.g. `\"/tags/{tag_id}\"` + `{ tag_id: \"tag_1\" }` → `\"/tags/tag_1\"`).\n *\n * @param template Path template containing `{name}` segments.\n * @param pathParams Map of placeholder names to raw path segment values.\n */\n static expandPath(template: string, pathParams: Record<string, string>): string {\n let out = template;\n for (const [key, value] of Object.entries(pathParams)) {\n out = out.replace(`{${key}}`, encodeURIComponent(value));\n }\n if (out.includes(\"{\")) {\n throw new Error(`Unresolved path template: ${template} → ${out}`);\n }\n return out;\n }\n\n /**\n * Perform an HTTP request with JSON request/response handling.\n *\n * Sends `Authorization: Bearer` using {@link FrontBaseOptions.apiKey}. Parses JSON bodies on success;\n * returns `undefined` for status `204` or empty bodies. On failure, throws {@link FrontApiError}.\n *\n * Successful JSON is passed through {@link normalizeFrontResponse}: `_pagination` becomes `pagination`,\n * and `pagination.next` is the `page_token` string (parsed from the API’s full next-page URL when needed).\n *\n * @param method HTTP verb (`GET`, `POST`, `PATCH`, …).\n * @param path Absolute path beginning with `/` (e.g. `\"/tags\"`).\n * @param init Optional query string and JSON-serializable body.\n */\n async requestJson<TResult>(\n method: string,\n path: string,\n init?: { query?: Record<string, string | undefined>; body?: unknown },\n ): Promise<TResult> {\n const url = this.buildUrl(path, init?.query);\n const headers = new Headers({\n Accept: \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": this.userAgent,\n });\n if (init?.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n const response = await this.fetchImpl(url, {\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n headers,\n method,\n });\n if (!response.ok) {\n let parsed: unknown;\n const text = await response.text();\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n throw new FrontApiError(response, parsed);\n }\n if (response.status === 204) {\n return undefined as TResult;\n }\n const text = await response.text();\n if (text.length === 0) {\n return undefined as TResult;\n }\n const parsed: unknown = JSON.parse(text);\n return normalizeFrontResponse(parsed) as TResult;\n }\n\n /**\n * Perform a request and return the successful {@link Response} without reading or JSON-parsing the body\n * (e.g. binary attachment downloads). On failure, reads the body for diagnostics and throws {@link FrontApiError}.\n *\n * @param method HTTP verb (`GET`, …).\n * @param path Absolute path beginning with `/`.\n * @param init Optional query string and extra headers; default `Accept` is all types.\n */\n async requestWithoutParsingBody(\n method: string,\n path: string,\n init?: {\n query?: Record<string, string | undefined>;\n headers?: Record<string, string | undefined>;\n },\n ): Promise<Response> {\n const url = this.buildUrl(path, init?.query);\n const headers = new Headers({\n Accept: \"*/*\",\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": this.userAgent,\n });\n if (init?.headers !== undefined) {\n for (const [key, value] of Object.entries(init.headers)) {\n if (value !== undefined) {\n headers.set(key, value);\n }\n }\n }\n const response = await this.fetchImpl(url, { headers, method });\n if (!response.ok) {\n let parsed: unknown;\n const text = await response.text();\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n throw new FrontApiError(response, parsed);\n }\n return response;\n }\n}\n","import type { FrontBase } from \"./base\";\n\n/**\n * Base for a Front REST entity (`id`, `_links`, …) with shared wiring for\n * {@link refresh}, {@link delete}, {@link save}, and PATCH helpers.\n *\n * Subclasses expose domain fields (often using {@link pick} / {@link assign} with API keys)\n * and implement {@link selfPath}, {@link toUpdateBody}, and {@link update}.\n *\n * @template TState OpenAPI-derived JSON shape for the resource (includes `id` and `_links`).\n * @template TUpdate PATCH payload type (or equivalent) for {@link update} / {@link save}.\n */\nexport abstract class FrontResource<TState extends { id: string; _links: unknown }, TUpdate> {\n protected state!: TState;\n protected readonly base: FrontBase;\n private stateLoaded: boolean;\n private readonly resourceId: string | undefined;\n\n /**\n * @param base Shared HTTP client.\n * @param snapshot Initial resource JSON (deep-cloned).\n */\n constructor(base: FrontBase, snapshot?: TState, resourceId?: string) {\n this.base = base;\n this.stateLoaded = snapshot !== undefined;\n if (snapshot !== undefined) {\n this.state = structuredClone(snapshot);\n }\n this.resourceId = resourceId;\n }\n\n /** Resource id from the API (`id` field). */\n get id(): string {\n const id = (this.stateLoaded ? this.state.id : undefined) ?? this.resourceId;\n if (id === undefined) {\n throw new Error(\"This resource operation requires an ID.\");\n }\n return id;\n }\n\n /** HAL-style `_links` object from the API response. */\n get links(): TState[\"_links\"] {\n return this.requireState()._links;\n }\n\n /** Replace {@link links} on the in-memory copy (does not call the API by itself). */\n set links(value: TState[\"_links\"]) {\n this.assign(\"_links\", value);\n }\n\n /** Read-only view of the full API JSON for this resource. */\n get data(): Readonly<TState> {\n return this.requireState();\n }\n\n /** Read a field using the API / schema property name. */\n protected pick<K extends keyof TState>(key: K): TState[K] {\n return this.requireState()[key];\n }\n\n /** Assign one field immutably (API / schema property name). */\n protected assign<K extends keyof TState>(key: K, value: TState[K]): void {\n this.state = { ...this.requireState(), [key]: value };\n }\n\n protected replaceState(next: TState): void {\n this.state = structuredClone(next);\n this.stateLoaded = true;\n }\n\n /** Whether this instance currently has a response snapshot. */\n protected hasState(): boolean {\n return this.stateLoaded;\n }\n\n private requireState(): TState {\n if (!this.stateLoaded) {\n throw new Error(\"This resource operation requires fetched resource data.\");\n }\n return this.state;\n }\n\n /** URL for this resource (GET / PATCH / DELETE on the entity). */\n protected abstract selfPath(): string;\n\n /** Optional hook after {@link refresh} replaces state. */\n protected onAfterRefresh(): void {\n // Subclasses may override.\n }\n\n /**\n * `GET` the current entity URL and replace {@link data} from the response.\n * Required OAuth scopes depend on the resource (see Front API docs for that path).\n */\n async refresh(): Promise<this> {\n const next = await this.base.requestJson<TState>(\"GET\", this.selfPath());\n this.replaceState(next);\n this.onAfterRefresh();\n return this;\n }\n\n /**\n * `DELETE` the current entity URL.\n * Required OAuth scopes depend on the resource (see Front API docs for that path).\n */\n async delete(): Promise<void> {\n await this.base.requestJson<undefined>(\"DELETE\", this.selfPath());\n }\n\n /** PATCH with an empty body response; merge the request into local state. */\n protected async patchNoContent<TBody>(\n body: TBody,\n merge: (current: TState, body: TBody) => TState,\n ): Promise<void> {\n await this.base.requestJson<undefined>(\"PATCH\", this.selfPath(), { body });\n if (this.stateLoaded) {\n this.state = merge(this.state, body);\n }\n }\n\n /** PATCH where the API returns the full updated resource. */\n protected async patchReplaceFromResponse<TBody>(body: TBody): Promise<void> {\n const next = await this.base.requestJson<TState>(\"PATCH\", this.selfPath(), {\n body,\n });\n this.replaceState(next);\n }\n\n /** Build the JSON body used by {@link save} (full persist of mutable fields). */\n abstract toUpdateBody(): TUpdate;\n\n /**\n * `PATCH` (or equivalent) this entity with a partial or full update payload.\n * Semantics (empty body vs returned entity) are defined per subclass.\n */\n abstract update(body: TUpdate | Partial<TUpdate>): Promise<void>;\n\n /**\n * Persist local changes by calling {@link update} with {@link toUpdateBody}.\n * Same network and scope requirements as {@link update}.\n */\n async save(): Promise<void> {\n await this.update(this.toUpdateBody());\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type AccountResponse = components[\"schemas\"][\"AccountResponse\"];\nexport type AccountPatch = components[\"schemas\"][\"AccountPatch\"];\nexport type Account = components[\"schemas\"][\"Account\"];\nexport type ContactIds = components[\"schemas\"][\"ContactIds\"];\nexport type CustomFieldResponse = components[\"schemas\"][\"CustomFieldResponse\"];\n\ntype ListAccountsQuery = NonNullable<operations[\"list-accounts\"][\"parameters\"][\"query\"]>;\ntype ListAccountsResponse =\n operations[\"list-accounts\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListAccountCustomFieldsResponse =\n operations[\"list-account-custom-fields\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListAccountContactsQuery = NonNullable<\n operations[\"list-account-contacts\"][\"parameters\"][\"query\"]\n>;\ntype ListAccountContactsResponse =\n operations[\"list-account-contacts\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromListAccounts = (\n q?: ListAccountsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromListAccountContacts = (\n q?: ListAccountContactsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst accountResponseToUpdateBody = (state: AccountResponse): AccountPatch => ({\n custom_fields: state.custom_fields,\n description: state.description ?? undefined,\n domains: state.domains,\n name: state.name,\n});\n\n/**\n * One account (`/accounts/{account_id}` and related contact routes).\n *\n * Writable: `name`, `description`, `domains`, `customFields`. Read-only: `id`, `logoUrl`, `externalId`, `createdAt`, `updatedAt`, `links`.\n * `PATCH` returns the updated account JSON; {@link update} and {@link save} replace local state from the response.\n *\n * @see https://dev.frontapp.com/reference/accounts\n */\nexport class FrontAccounts extends FrontResource<AccountResponse, AccountPatch> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/accounts/{account_id}\", {\n account_id: this.id,\n });\n }\n\n get name(): string {\n return this.pick(\"name\");\n }\n\n set name(value: string) {\n this.assign(\"name\", value);\n }\n\n get description(): string | null {\n return this.pick(\"description\");\n }\n\n set description(value: string | null) {\n this.assign(\"description\", value);\n }\n\n get domains(): string[] {\n return this.pick(\"domains\");\n }\n\n set domains(value: string[]) {\n this.assign(\"domains\", value);\n }\n\n get customFields(): AccountResponse[\"custom_fields\"] {\n return this.pick(\"custom_fields\");\n }\n\n set customFields(value: AccountResponse[\"custom_fields\"]) {\n this.assign(\"custom_fields\", value);\n }\n\n get logoUrl(): string | null {\n return this.pick(\"logo_url\");\n }\n\n get externalId(): string | null {\n return this.pick(\"external_id\");\n }\n\n get createdAt(): number | undefined {\n return this.pick(\"created_at\");\n }\n\n get updatedAt(): number | undefined {\n return this.pick(\"updated_at\");\n }\n\n /**\n * Build the `PATCH` body implied by the current property values.\n * @see https://dev.frontapp.com/reference/update-account\n */\n toUpdateBody(): AccountPatch {\n return accountResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this account (`PATCH /accounts/{account_id}`). The API returns `200` with the updated resource.\n *\n * **Required scope:** `accounts:write`\n *\n * @param body Fields to change (OpenAPI {@link AccountPatch}). Omitting `custom_fields` leaves them unchanged; including it replaces the full set — see API docs.\n * @see https://dev.frontapp.com/reference/update-account\n */\n async update(body: AccountPatch | Partial<AccountPatch>): Promise<void>;\n async update(accountId: string, body: AccountPatch | Partial<AccountPatch>): Promise<void>;\n async update(\n bodyOrAccountId: AccountPatch | Partial<AccountPatch> | string,\n directBody?: AccountPatch | Partial<AccountPatch>,\n ): Promise<void> {\n if (typeof bodyOrAccountId === \"string\") {\n await this.target(bodyOrAccountId).update(directBody ?? {});\n return;\n }\n await this.patchReplaceFromResponse(bodyOrAccountId);\n }\n\n override async delete(accountId?: string): Promise<void> {\n if (accountId === undefined) {\n await super.delete();\n return;\n }\n await this.target(accountId).delete();\n }\n\n /**\n * List contacts linked to this account (`GET /accounts/{account_id}/contacts`).\n *\n * **Required scope:** `contacts:read`\n *\n * @param query Optional pagination and sort (`sort_by`: `created_at` or `updated_at`).\n * @see https://dev.frontapp.com/reference/list-account-contacts\n */\n async listContacts(\n query?: ListAccountContactsQuery,\n ): Promise<WithNormalizedPagination<ListAccountContactsResponse>>;\n async listContacts(\n accountId: string,\n query?: ListAccountContactsQuery,\n ): Promise<WithNormalizedPagination<ListAccountContactsResponse>>;\n async listContacts(\n queryOrAccountId?: ListAccountContactsQuery | string,\n directQuery?: ListAccountContactsQuery,\n ): Promise<WithNormalizedPagination<ListAccountContactsResponse>> {\n if (typeof queryOrAccountId === \"string\") {\n return await this.target(queryOrAccountId).listContacts(directQuery);\n }\n const path = FrontBase.expandPath(\"/accounts/{account_id}/contacts\", {\n account_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListAccountContactsResponse>>(\n \"GET\",\n path,\n { query: queryFromListAccountContacts(queryOrAccountId) },\n );\n }\n\n /**\n * Add contacts to this account (`POST /accounts/{account_id}/contacts`). The API returns `204`.\n *\n * **Required scope:** `accounts:write`\n *\n * @param body Contact ids or resource aliases (OpenAPI {@link ContactIds}).\n * @see https://dev.frontapp.com/reference/add-contact-to-account\n */\n async addContacts(body: ContactIds): Promise<void>;\n async addContacts(accountId: string, body: ContactIds): Promise<void>;\n async addContacts(bodyOrAccountId: ContactIds | string, directBody?: ContactIds): Promise<void> {\n if (typeof bodyOrAccountId === \"string\") {\n await this.target(bodyOrAccountId).addContacts(directBody ?? { contact_ids: [] });\n return;\n }\n const path = FrontBase.expandPath(\"/accounts/{account_id}/contacts\", {\n account_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body: bodyOrAccountId });\n }\n\n /**\n * Remove contacts from this account (`DELETE /accounts/{account_id}/contacts`). The API returns `204`.\n *\n * **Required scope:** `accounts:write`\n *\n * @param body Contact ids or resource aliases (OpenAPI {@link ContactIds}).\n * @see https://dev.frontapp.com/reference/remove-contact-from-account\n */\n async removeContacts(body: ContactIds): Promise<void>;\n async removeContacts(accountId: string, body: ContactIds): Promise<void>;\n async removeContacts(\n bodyOrAccountId: ContactIds | string,\n directBody?: ContactIds,\n ): Promise<void> {\n if (typeof bodyOrAccountId === \"string\") {\n await this.target(bodyOrAccountId).removeContacts(directBody ?? { contact_ids: [] });\n return;\n }\n const path = FrontBase.expandPath(\"/accounts/{account_id}/contacts\", {\n account_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body: bodyOrAccountId });\n }\n\n /**\n * List accounts for the company (`GET /accounts`).\n *\n * **Required scope:** `accounts:read`\n *\n * @param query Optional pagination and sort (`sort_by`: `created_at` or `updated_at`).\n * @see https://dev.frontapp.com/reference/list-accounts\n */\n async list(query?: ListAccountsQuery): Promise<WithNormalizedPagination<ListAccountsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListAccountsResponse>>(\n \"GET\",\n \"/accounts\",\n {\n query: queryFromListAccounts(query),\n },\n );\n }\n\n /**\n * Create an account (`POST /accounts`). The API returns `201` with the new account body.\n *\n * **Required scope:** `accounts:write`\n *\n * @param body Account fields (OpenAPI {@link Account}).\n * @see https://dev.frontapp.com/reference/create-account\n */\n async create(body: Account): Promise<FrontAccounts> {\n const data = await this.base.requestJson<AccountResponse>(\"POST\", \"/accounts\", {\n body,\n });\n return new FrontAccounts(this.base, data);\n }\n\n /**\n * Fetch one account (`GET /accounts/{account_id}`).\n *\n * **Required scope:** `accounts:read`\n *\n * @param accountId Account id or supported [resource alias](https://dev.frontapp.com/docs/resource-aliases-1) (domain, external id).\n * @see https://dev.frontapp.com/reference/fetch-an-account\n */\n async get(accountId: string): Promise<FrontAccounts> {\n return await this.target(accountId).refresh();\n }\n\n /** Target an account by ID without fetching it first. */\n private target(accountId: string): FrontAccounts {\n return new FrontAccounts(this.base, undefined, accountId);\n }\n\n /**\n * List custom fields that can be attached to accounts (`GET /accounts/custom_fields`).\n *\n * **Required scope:** `custom_fields:read`\n *\n * @see https://dev.frontapp.com/reference/list-account-custom-fields\n */\n async listCustomFields(): Promise<WithNormalizedPagination<ListAccountCustomFieldsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListAccountCustomFieldsResponse>>(\n \"GET\",\n \"/accounts/custom_fields\",\n );\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components } from \"../gen/schema.gen\";\n\nexport type AnalyticsExportRequest = components[\"schemas\"][\"AnalyticsExportRequest\"];\nexport type AnalyticsExportResponse = components[\"schemas\"][\"AnalyticsExportResponse\"];\nexport type AnalyticsFilters = components[\"schemas\"][\"AnalyticsFilters\"];\nexport type AnalyticsMetricId = components[\"schemas\"][\"AnalyticsMetricId\"];\nexport type AnalyticsReportRequest = components[\"schemas\"][\"AnalyticsReportRequest\"];\nexport type AnalyticsReportResponse = components[\"schemas\"][\"AnalyticsReportResponse\"];\n\n/**\n * One analytics export job (`GET /analytics/exports/{export_id}`).\n *\n * There is no PATCH/DELETE on this path in the OpenAPI spec; use {@link refresh} to poll status.\n *\n * **Required scope:** `analytics:read`\n *\n * @see https://dev.frontapp.com/reference/analytics\n */\nexport class FrontAnalyticsExport {\n private state: AnalyticsExportResponse;\n private readonly base: FrontBase;\n\n constructor(base: FrontBase, snapshot: AnalyticsExportResponse) {\n this.base = base;\n this.state = structuredClone(snapshot);\n }\n\n get id(): string {\n return this.state.id;\n }\n\n get links(): AnalyticsExportResponse[\"_links\"] {\n return this.state._links;\n }\n\n /** Full export JSON (status, progress, download URL when ready, …). */\n get data(): Readonly<AnalyticsExportResponse> {\n return this.state;\n }\n\n private selfPath(): string {\n return FrontBase.expandPath(\"/analytics/exports/{export_id}\", {\n export_id: this.id,\n });\n }\n\n /**\n * Poll export status (`GET /analytics/exports/{export_id}`).\n *\n * **Required scope:** `analytics:read`\n */\n async refresh(): Promise<this> {\n const next = await this.base.requestJson<AnalyticsExportResponse>(\"GET\", this.selfPath());\n this.state = structuredClone(next);\n return this;\n }\n}\n\n/**\n * One analytics report job (`GET /analytics/reports/{report_uid}`).\n *\n * Reports are keyed by `uid` (not `id`). There is no PATCH/DELETE on this path in the OpenAPI spec.\n *\n * **Required scope:** `analytics:read`\n *\n * @see https://dev.frontapp.com/reference/analytics\n */\nexport class FrontAnalyticsReport {\n private state: AnalyticsReportResponse;\n private readonly base: FrontBase;\n\n constructor(base: FrontBase, snapshot: AnalyticsReportResponse) {\n this.base = base;\n this.state = structuredClone(snapshot);\n }\n\n /** Report UID (path segment for {@link refresh}). */\n get uid(): string {\n return this.state.uid;\n }\n\n get links(): AnalyticsReportResponse[\"_links\"] {\n return this.state._links;\n }\n\n get data(): Readonly<AnalyticsReportResponse> {\n return this.state;\n }\n\n private selfPath(): string {\n return FrontBase.expandPath(\"/analytics/reports/{report_uid}\", {\n report_uid: this.uid,\n });\n }\n\n /**\n * Poll report status (`GET /analytics/reports/{report_uid}`).\n *\n * **Required scope:** `analytics:read`\n */\n async refresh(): Promise<this> {\n const next = await this.base.requestJson<AnalyticsReportResponse>(\"GET\", this.selfPath());\n this.state = structuredClone(next);\n return this;\n }\n}\n\n/**\n * Analytics exports and reports (`/analytics/exports`, `/analytics/reports`).\n *\n * @see https://dev.frontapp.com/reference/analytics\n */\nexport class FrontAnalytics {\n private readonly base: FrontBase;\n\n /** @param base Shared HTTP client (in practice the `Front` instance). */\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * Create an export (`POST /analytics/exports`). Returns `201` with the export resource.\n *\n * **Required scope:** `analytics:read`\n */\n async createExport(body: AnalyticsExportRequest): Promise<FrontAnalyticsExport> {\n const data = await this.base.requestJson<AnalyticsExportResponse>(\n \"POST\",\n \"/analytics/exports\",\n { body },\n );\n return new FrontAnalyticsExport(this.base, data);\n }\n\n /**\n * Fetch an export (`GET /analytics/exports/{export_id}`).\n *\n * **Required scope:** `analytics:read`\n */\n async getExport(exportId: string): Promise<FrontAnalyticsExport> {\n const path = FrontBase.expandPath(\"/analytics/exports/{export_id}\", {\n export_id: exportId,\n });\n const data = await this.base.requestJson<AnalyticsExportResponse>(\"GET\", path);\n return new FrontAnalyticsExport(this.base, data);\n }\n\n /**\n * Create a metrics report (`POST /analytics/reports`). Returns `201` with the report resource.\n *\n * **Required scope:** `analytics:read`\n */\n async createReport(body: AnalyticsReportRequest): Promise<FrontAnalyticsReport> {\n const data = await this.base.requestJson<AnalyticsReportResponse>(\n \"POST\",\n \"/analytics/reports\",\n { body },\n );\n return new FrontAnalyticsReport(this.base, data);\n }\n\n /**\n * Fetch a report (`GET /analytics/reports/{report_uid}`).\n *\n * **Required scope:** `analytics:read`\n */\n async getReport(reportUid: string): Promise<FrontAnalyticsReport> {\n const path = FrontBase.expandPath(\"/analytics/reports/{report_uid}\", {\n report_uid: reportUid,\n });\n const data = await this.base.requestJson<AnalyticsReportResponse>(\"GET\", path);\n return new FrontAnalyticsReport(this.base, data);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components } from \"../gen/schema.gen\";\n\nexport type AppEvent = components[\"schemas\"][\"AppEvent\"];\n\n/**\n * Application trigger API (`POST /applications/{application_uid}/events`).\n *\n * @see https://dev.frontapp.com/docs/application-triggers#/\n */\nexport class FrontApplications {\n private readonly base: FrontBase;\n\n /** @param base Shared HTTP client (in practice the `Front` instance). */\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * Trigger an application event (`POST /applications/{application_uid}/events`). Returns `204` with no body.\n *\n * **Required scope:** `feature:app_trigger`\n */\n async triggerEvent(applicationUid: string, body: AppEvent): Promise<void> {\n const path = FrontBase.expandPath(\"/applications/{application_uid}/events\", {\n application_uid: applicationUid,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type ChannelResponse = components[\"schemas\"][\"ChannelResponse\"];\nexport type CreateChannel = components[\"schemas\"][\"CreateChannel\"];\nexport type UpdateChannel = components[\"schemas\"][\"UpdateChannel\"];\nexport type CreateDraft = components[\"schemas\"][\"CreateDraft\"];\nexport type CustomMessage = components[\"schemas\"][\"CustomMessage\"];\nexport type OutboundMessage = components[\"schemas\"][\"OutboundMessage\"];\nexport type MessageResponse = components[\"schemas\"][\"MessageResponse\"];\n\ntype ListChannelsResponse =\n operations[\"list-channels\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype AcceptedMessageBody =\n operations[\"create-message\"][\"responses\"][202][\"content\"][\"application/json\"];\n\ntype AcceptedBody = operations[\"validate-channel\"][\"responses\"][202][\"content\"][\"application/json\"];\n\nconst mergeChannelSnapshot = (\n current: ChannelResponse,\n patch: Partial<UpdateChannel>,\n): ChannelResponse => {\n const filtered = Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n ) as Partial<UpdateChannel>;\n\n let next: ChannelResponse = { ...current };\n if (filtered.name !== undefined) {\n next = { ...next, name: filtered.name };\n }\n if (filtered.settings !== undefined) {\n next = {\n ...next,\n settings: { ...current.settings, ...filtered.settings },\n };\n }\n return next;\n};\n\nconst channelResponseToUpdateBody = (state: ChannelResponse): UpdateChannel => ({\n name: state.name,\n settings: state.settings,\n});\n\n/**\n * One channel (`/channels/{channel_id}` and related message routes).\n *\n * Writable: `name`, `settings`. To move a channel to another inbox, call {@link update} with `{ inbox_id }` and then {@link refresh} (the GET response does not include `inbox_id`).\n * Read-only: `id`, `type`, `address`, `sendAs`, `isPrivate`, `isValid`, `links`.\n *\n * `PATCH /channels/{channel_id}` returns `204`; {@link update} and {@link save} merge the request into local state for fields that exist on {@link ChannelResponse}.\n *\n * @see https://dev.frontapp.com/reference/channels\n */\nexport class FrontChannels extends FrontResource<ChannelResponse, UpdateChannel> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/channels/{channel_id}\", {\n channel_id: this.id,\n });\n }\n\n get name(): string | undefined {\n return this.pick(\"name\");\n }\n\n set name(value: string | undefined) {\n this.assign(\"name\", value);\n }\n\n get settings(): ChannelResponse[\"settings\"] {\n return this.pick(\"settings\");\n }\n\n set settings(value: ChannelResponse[\"settings\"]) {\n this.assign(\"settings\", value);\n }\n\n get type(): ChannelResponse[\"type\"] {\n return this.pick(\"type\");\n }\n\n get address(): string | undefined {\n return this.pick(\"address\");\n }\n\n get sendAs(): string | undefined {\n return this.pick(\"send_as\");\n }\n\n get isPrivate(): boolean {\n return this.pick(\"is_private\");\n }\n\n get isValid(): boolean {\n return this.pick(\"is_valid\");\n }\n\n /**\n * The Front API does not expose `DELETE /channels/{channel_id}`.\n *\n * @throws {Error} always — use the Front product or inbox channel management instead.\n */\n override delete(): Promise<void> {\n return Promise.reject(\n new Error(\n `Deleting channel ${this.id} is not supported by the Front REST API for this path.`,\n ),\n );\n }\n\n /**\n * Build the `PATCH` body implied by the current `name` and `settings`.\n *\n * @see https://dev.frontapp.com/reference/update-channel\n */\n toUpdateBody(): UpdateChannel {\n return channelResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this channel (`PATCH /channels/{channel_id}`). The API returns `204`; local state is merged from the body.\n *\n * **Required scope:** `channels:write`\n *\n * @see https://dev.frontapp.com/reference/update-channel\n */\n async update(body: UpdateChannel | Partial<UpdateChannel>): Promise<void>;\n async update(channelId: string, body: UpdateChannel | Partial<UpdateChannel>): Promise<void>;\n async update(\n channelIdOrBody: string | UpdateChannel | Partial<UpdateChannel>,\n optionalBody?: UpdateChannel | Partial<UpdateChannel>,\n ): Promise<void> {\n const { body, id } = this.resolveIdAndBody(channelIdOrBody, optionalBody);\n const path = FrontBase.expandPath(\"/channels/{channel_id}\", { channel_id: id });\n await this.base.requestJson<undefined>(\"PATCH\", path, { body });\n if (this.hasState() && id === this.id) {\n this.replaceState(mergeChannelSnapshot(this.state, body));\n }\n }\n\n /**\n * Create a draft (`POST /channels/{channel_id}/drafts`).\n *\n * **Required scope:** `drafts:write`\n *\n * @see https://dev.frontapp.com/reference/create-draft\n */\n async createDraft(body: CreateDraft): Promise<MessageResponse>;\n async createDraft(channelId: string, body: CreateDraft): Promise<MessageResponse>;\n async createDraft(\n channelIdOrBody: string | CreateDraft,\n optionalBody?: CreateDraft,\n ): Promise<MessageResponse> {\n const { body, id } = this.resolveIdAndBody(channelIdOrBody, optionalBody);\n const path = FrontBase.expandPath(\"/channels/{channel_id}/drafts\", {\n channel_id: id,\n });\n return await this.base.requestJson<MessageResponse>(\"POST\", path, { body });\n }\n\n /**\n * Receive a custom message (`POST /channels/{channel_id}/incoming_messages`). Custom channels only.\n *\n * **Required scope:** `messages:write`\n *\n * @see https://dev.frontapp.com/reference/receive-custom-messages\n */\n async receiveCustomMessage(body: CustomMessage): Promise<AcceptedMessageBody>;\n async receiveCustomMessage(channelId: string, body: CustomMessage): Promise<AcceptedMessageBody>;\n async receiveCustomMessage(\n channelIdOrBody: string | CustomMessage,\n optionalBody?: CustomMessage,\n ): Promise<AcceptedMessageBody> {\n const { body, id } = this.resolveIdAndBody(channelIdOrBody, optionalBody);\n const path = FrontBase.expandPath(\"/channels/{channel_id}/incoming_messages\", {\n channel_id: id,\n });\n return await this.base.requestJson<AcceptedMessageBody>(\"POST\", path, {\n body,\n });\n }\n\n /**\n * Send a new message from this channel (`POST /channels/{channel_id}/messages`).\n *\n * **Required scope:** `messages:send`\n *\n * @see https://dev.frontapp.com/reference/create-message\n */\n async createMessage(body: OutboundMessage): Promise<AcceptedMessageBody>;\n async createMessage(channelId: string, body: OutboundMessage): Promise<AcceptedMessageBody>;\n async createMessage(\n channelIdOrBody: string | OutboundMessage,\n optionalBody?: OutboundMessage,\n ): Promise<AcceptedMessageBody> {\n const { body, id } = this.resolveIdAndBody(channelIdOrBody, optionalBody);\n const path = FrontBase.expandPath(\"/channels/{channel_id}/messages\", {\n channel_id: id,\n });\n return await this.base.requestJson<AcceptedMessageBody>(\"POST\", path, {\n body,\n });\n }\n\n /**\n * Asynchronously validate an SMTP channel (`POST /channels/{channel_id}/validate`).\n *\n * **Required scope:** `channels:write`\n *\n * @see https://dev.frontapp.com/reference/validate-channel\n */\n async validate(channelId?: string): Promise<AcceptedBody> {\n const id = channelId ?? this.id;\n const path = FrontBase.expandPath(\"/channels/{channel_id}/validate\", {\n channel_id: id,\n });\n return await this.base.requestJson<AcceptedBody>(\"POST\", path);\n }\n\n /**\n * List channels (`GET /channels`).\n *\n * **Required scope:** `channels:read`\n *\n * @see https://dev.frontapp.com/reference/list-channels\n */\n async list(): Promise<WithNormalizedPagination<ListChannelsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListChannelsResponse>>(\n \"GET\",\n \"/channels\",\n );\n }\n\n /**\n * Fetch one channel (`GET /channels/{channel_id}`).\n *\n * **Required scope:** `channels:read`\n *\n * @param channelId Channel id or supported [resource alias](https://dev.frontapp.com/docs/resource-aliases-1) (e.g. channel address).\n * @see https://dev.frontapp.com/reference/get-channel\n */\n async get(channelId: string): Promise<FrontChannels> {\n const path = FrontBase.expandPath(\"/channels/{channel_id}\", {\n channel_id: channelId,\n });\n const data = await this.base.requestJson<ChannelResponse>(\"GET\", path);\n return new FrontChannels(this.base, data);\n }\n\n /**\n * Create a channel in an inbox (`POST /inboxes/{inbox_id}/channels`). The API returns `204`.\n *\n * **Required scope:** `channels:write`\n *\n * @see https://dev.frontapp.com/reference/post_inboxes-inbox-id-channels\n */\n async create(inboxId: string, body: CreateChannel): Promise<void> {\n const path = FrontBase.expandPath(\"/inboxes/{inbox_id}/channels\", {\n inbox_id: inboxId,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n\n private resolveIdAndBody<TBody>(\n idOrBody: string | TBody,\n optionalBody: TBody | undefined,\n ): { body: TBody; id: string } {\n if (typeof idOrBody === \"string\") {\n if (optionalBody === undefined) {\n throw new Error(\"A request body is required.\");\n }\n return { body: optionalBody, id: idOrBody };\n }\n return { body: idOrBody, id: this.id };\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type CommentResponse = components[\"schemas\"][\"CommentResponse\"];\nexport type CreateComment = components[\"schemas\"][\"CreateComment\"];\nexport type UpdateComment = components[\"schemas\"][\"UpdateComment\"];\n\ntype ListCommentMentionsResponse =\n operations[\"list-comment-mentions\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst commentResponseToUpdateBody = (state: CommentResponse): UpdateComment => ({\n body: state.body,\n is_pinned: state.is_pinned,\n});\n\n/**\n * One comment (`GET /comments/{comment_id}`, `PATCH /comments/{comment_id}/`, mentions, replies, attachment download).\n *\n * Writable: `body`, `isPinned`. Read-only: `id`, `author`, `postedAt`, `attachments`, `links`.\n * `PATCH` uses the slash-terminated URL from the OpenAPI spec and returns `200` with the updated comment.\n *\n * @see https://dev.frontapp.com/reference/comments\n */\nexport class FrontComments extends FrontResource<CommentResponse, UpdateComment> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/comments/{comment_id}\", {\n comment_id: this.id,\n });\n }\n\n /** OpenAPI `PATCH` target includes a trailing slash (distinct from `GET` on this resource). */\n private patchPath(): string {\n return FrontBase.expandPath(\"/comments/{comment_id}/\", {\n comment_id: this.id,\n });\n }\n\n get author(): CommentResponse[\"author\"] {\n return this.pick(\"author\");\n }\n\n get body(): string {\n return this.pick(\"body\");\n }\n\n set body(value: string) {\n this.assign(\"body\", value);\n }\n\n get isPinned(): boolean {\n return this.pick(\"is_pinned\");\n }\n\n set isPinned(value: boolean) {\n this.assign(\"is_pinned\", value);\n }\n\n get postedAt(): number | undefined {\n return this.pick(\"posted_at\");\n }\n\n get attachments(): CommentResponse[\"attachments\"] {\n return this.pick(\"attachments\");\n }\n\n /**\n * The Front API does not expose `DELETE /comments/{comment_id}` on this path.\n */\n override delete(commentId?: string): Promise<void> {\n if (commentId !== undefined) {\n return this.target(commentId).delete();\n }\n return Promise.reject(\n new Error(\n `Deleting comment ${this.id} is not supported by the Front REST API for this path.`,\n ),\n );\n }\n\n toUpdateBody(): UpdateComment {\n return commentResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this comment (`PATCH /comments/{comment_id}/`). The API returns `200` with the updated comment.\n *\n * **Required scope:** `comments:write`\n */\n async update(body: UpdateComment | Partial<UpdateComment>): Promise<void>;\n async update(commentId: string, body: UpdateComment | Partial<UpdateComment>): Promise<void>;\n async update(\n bodyOrCommentId: UpdateComment | Partial<UpdateComment> | string,\n directBody?: UpdateComment | Partial<UpdateComment>,\n ): Promise<void> {\n if (typeof bodyOrCommentId === \"string\") {\n await this.target(bodyOrCommentId).update(directBody ?? {});\n return;\n }\n const next = await this.base.requestJson<CommentResponse>(\"PATCH\", this.patchPath(), {\n body: bodyOrCommentId,\n });\n this.replaceState(next);\n }\n\n /**\n * Teammates mentioned in this comment (`GET /comments/{comment_id}/mentions`).\n *\n * **Required scope:** `teammates:read`\n */\n async listMentions(\n commentId?: string,\n ): Promise<WithNormalizedPagination<ListCommentMentionsResponse>> {\n if (commentId !== undefined) {\n return await this.target(commentId).listMentions();\n }\n const path = FrontBase.expandPath(\"/comments/{comment_id}/mentions\", {\n comment_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListCommentMentionsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Add a reply to this comment (`POST /comments/{comment_id}/replies`). Returns `201` with the new comment.\n *\n * **Required scope:** `comments:write`\n */\n async addReply(body: CreateComment): Promise<FrontComments>;\n async addReply(commentId: string, body: CreateComment): Promise<FrontComments>;\n async addReply(\n bodyOrCommentId: CreateComment | string,\n directBody?: CreateComment,\n ): Promise<FrontComments> {\n if (typeof bodyOrCommentId === \"string\") {\n return await this.target(bodyOrCommentId).addReply(directBody ?? { body: \"\" });\n }\n const path = FrontBase.expandPath(\"/comments/{comment_id}/replies\", {\n comment_id: this.id,\n });\n const data = await this.base.requestJson<CommentResponse>(\"POST\", path, {\n body: bodyOrCommentId,\n });\n return new FrontComments(this.base, data);\n }\n\n /**\n * Download a comment attachment (`GET /comments/{comment_id}/download/{attachment_link_id}`).\n * Returns the raw HTTP {@link Response}; use {@link Response.blob} or {@link Response.arrayBuffer} to read bytes.\n *\n * **Required scope:** `attachments:read`\n */\n async downloadAttachment(\n commentIdOrAttachmentLinkId: string,\n directAttachmentLinkId?: string,\n ): Promise<Response> {\n if (directAttachmentLinkId !== undefined) {\n return await this.target(commentIdOrAttachmentLinkId).downloadAttachment(\n directAttachmentLinkId,\n );\n }\n const path = FrontBase.expandPath(\"/comments/{comment_id}/download/{attachment_link_id}\", {\n attachment_link_id: commentIdOrAttachmentLinkId,\n comment_id: this.id,\n });\n return await this.base.requestWithoutParsingBody(\"GET\", path);\n }\n /**\n * Fetch one comment (`GET /comments/{comment_id}`).\n *\n * **Required scope:** `comments:read`\n *\n * @param commentId Comment id or supported [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).\n */\n async get(commentId: string): Promise<FrontComments> {\n return await this.target(commentId).refresh();\n }\n\n /** Target a comment by ID without fetching it first. */\n private target(commentId: string): FrontComments {\n return new FrontComments(this.base, undefined, commentId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type TagResponse = components[\"schemas\"][\"TagResponse\"];\nexport type CreateTag = components[\"schemas\"][\"CreateTag\"];\nexport type UpdateTag = components[\"schemas\"][\"UpdateTag\"];\n\n/** PATCH body for a tag; `parent_tag_id` may be `null` to clear the parent (API behavior). */\nexport type TagUpdateInput = Omit<UpdateTag, \"parent_tag_id\"> & {\n parent_tag_id?: string | null;\n};\n\ntype ListTagsQuery = NonNullable<operations[\"list-tags\"][\"parameters\"][\"query\"]>;\ntype ListTagsResponse = operations[\"list-tags\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTagChildrenResponse =\n operations[\"list-tag-children\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTaggedConversationsQuery = NonNullable<\n operations[\"list-tagged-conversations\"][\"parameters\"][\"query\"]\n>;\ntype ListTaggedConversationsResponse =\n operations[\"list-tagged-conversations\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromListTags = (q?: ListTagsQuery): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromTaggedConversations = (\n q?: ListTaggedConversationsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\nconst mergeTagSnapshot = (current: TagResponse, patch: Partial<TagUpdateInput>): TagResponse => {\n const { parent_tag_id: _parentTagIdOmitted, ...restPatch } = patch;\n const filtered = Object.fromEntries(\n Object.entries(restPatch).filter(([, value]) => value !== undefined),\n ) as Partial<TagResponse>;\n return { ...current, ...filtered };\n};\n\nconst tagResponseToUpdateBody = (\n state: TagResponse,\n parentTagId: string | null | undefined,\n): TagUpdateInput => {\n const body: TagUpdateInput = {\n description: state.description ?? undefined,\n highlight: (state.highlight ?? undefined) as UpdateTag[\"highlight\"],\n is_visible_in_conversation_lists: state.is_visible_in_conversation_lists,\n name: state.name,\n };\n if (parentTagId !== undefined) {\n body.parent_tag_id = parentTagId;\n }\n return body;\n};\n\n/**\n * One tag (`/tags/{tag_id}` and related child/conversation routes).\n *\n * Writable camelCase: `name`, `description`, `highlight`, `isVisibleInConversationLists`, `links`, `parentTagId`\n * (PATCH-only parent id; `null` clears on save — cleared on {@link refresh}). Read-only: `id`, `isPrivate`,\n * `createdAt`, `updatedAt`. Raw JSON: {@link FrontResource.data}.\n *\n * @see https://dev.frontapp.com/reference/tags\n */\nexport class FrontTags extends FrontResource<TagResponse, TagUpdateInput> {\n /** PATCH-only parent id (`null` clears). Cleared by {@link refresh}. */\n private parentTagIdForUpdate: string | null | undefined;\n\n /**\n * @param base Shared HTTP client (in practice the `Front` instance).\n * @param snapshot Tag JSON returned by the API.\n */\n constructor(base: FrontBase, snapshot?: TagResponse, tagId?: string) {\n super(base, snapshot, tagId);\n this.parentTagIdForUpdate = undefined;\n }\n\n protected selfPath(): string {\n return FrontBase.expandPath(\"/tags/{tag_id}\", { tag_id: this.id });\n }\n\n protected override onAfterRefresh(): void {\n this.parentTagIdForUpdate = undefined;\n }\n\n get name(): string {\n return this.pick(\"name\");\n }\n\n set name(value: string) {\n this.assign(\"name\", value);\n }\n\n get description(): string | null {\n return this.pick(\"description\");\n }\n\n set description(value: string | null) {\n this.assign(\"description\", value);\n }\n\n get highlight(): string | null {\n return this.pick(\"highlight\");\n }\n\n set highlight(value: string | null) {\n this.assign(\"highlight\", value);\n }\n\n get isPrivate(): boolean {\n return this.pick(\"is_private\");\n }\n\n get isVisibleInConversationLists(): boolean {\n return this.pick(\"is_visible_in_conversation_lists\");\n }\n\n set isVisibleInConversationLists(value: boolean) {\n this.assign(\"is_visible_in_conversation_lists\", value);\n }\n\n get createdAt(): number | undefined {\n return this.pick(\"created_at\");\n }\n\n get updatedAt(): number | undefined {\n return this.pick(\"updated_at\");\n }\n\n /**\n * Parent tag id for `PATCH` updates only ([Update a tag](https://dev.frontapp.com/reference/update-a-tag)).\n * Set to `null` and call {@link save} to clear the parent on the server.\n */\n get parentTagId(): string | null | undefined {\n return this.parentTagIdForUpdate;\n }\n\n set parentTagId(value: string | null | undefined) {\n this.parentTagIdForUpdate = value;\n }\n\n /**\n * Build the `PATCH` body implied by the current property values (including {@link parentTagId} when set).\n * @see https://dev.frontapp.com/reference/update-a-tag\n */\n toUpdateBody(): TagUpdateInput {\n return tagResponseToUpdateBody(this.state, this.parentTagIdForUpdate);\n }\n\n /**\n * Update this tag (`PATCH /tags/{tag_id}`). The API returns `204`; local state is merged from the request body.\n *\n * **Required scope:** `tags:write`\n *\n * @param body Fields to change (OpenAPI {@link TagUpdateInput}).\n * @see https://dev.frontapp.com/reference/update-a-tag\n */\n async update(body: TagUpdateInput | Partial<TagUpdateInput>): Promise<void>;\n async update(tagId: string, body: TagUpdateInput | Partial<TagUpdateInput>): Promise<void>;\n async update(\n bodyOrTagId: TagUpdateInput | Partial<TagUpdateInput> | string,\n directBody?: TagUpdateInput | Partial<TagUpdateInput>,\n ): Promise<void> {\n if (typeof bodyOrTagId === \"string\") {\n await this.target(bodyOrTagId).update(directBody ?? {});\n return;\n }\n await this.patchNoContent(bodyOrTagId, mergeTagSnapshot);\n if (\"parent_tag_id\" in bodyOrTagId) {\n this.parentTagIdForUpdate =\n bodyOrTagId.parent_tag_id === null || bodyOrTagId.parent_tag_id === undefined\n ? undefined\n : bodyOrTagId.parent_tag_id;\n }\n }\n\n override async delete(tagId?: string): Promise<void> {\n if (tagId === undefined) {\n await super.delete();\n return;\n }\n await this.target(tagId).delete();\n }\n\n /**\n * List child tags (`GET /tags/{tag_id}/children`).\n *\n * **Required scope:** `tags:read`\n *\n * @see https://dev.frontapp.com/reference/list-tag-children\n */\n async listChildren(tagId?: string): Promise<FrontTags[]> {\n if (tagId !== undefined) {\n return await this.target(tagId).listChildren();\n }\n const path = FrontBase.expandPath(\"/tags/{tag_id}/children\", {\n tag_id: this.id,\n });\n const json = await this.base.requestJson<WithNormalizedPagination<ListTagChildrenResponse>>(\n \"GET\",\n path,\n );\n const results = json._results ?? [];\n return results.map((row) => new FrontTags(this.base, row));\n }\n\n /**\n * Create a child tag (`POST /tags/{tag_id}/children`).\n *\n * **Required scope:** `tags:write`\n *\n * @param body Child tag payload (OpenAPI {@link CreateTag}).\n * @see https://dev.frontapp.com/reference/create-child-tag\n */\n async createChild(body: CreateTag): Promise<FrontTags>;\n async createChild(tagId: string, body: CreateTag): Promise<FrontTags>;\n async createChild(bodyOrTagId: CreateTag | string, directBody?: CreateTag): Promise<FrontTags> {\n if (typeof bodyOrTagId === \"string\") {\n if (directBody === undefined) {\n throw new Error(\"Creating a child tag requires a request body.\");\n }\n return await this.target(bodyOrTagId).createChild(directBody);\n }\n const path = FrontBase.expandPath(\"/tags/{tag_id}/children\", {\n tag_id: this.id,\n });\n const created = await this.base.requestJson<TagResponse>(\"POST\", path, {\n body: bodyOrTagId,\n });\n return new FrontTags(this.base, created);\n }\n\n /**\n * List conversations that have this tag (`GET /tags/{tag_id}/conversations`).\n *\n * **Required scope:** `conversations:read`\n *\n * @param query Optional `q`, `limit`, and `page_token` (see Front pagination and query-object docs).\n * @see https://dev.frontapp.com/reference/list-tagged-conversations\n */\n async listTaggedConversations(\n query?: ListTaggedConversationsQuery,\n ): Promise<WithNormalizedPagination<ListTaggedConversationsResponse>>;\n async listTaggedConversations(\n tagId: string,\n query?: ListTaggedConversationsQuery,\n ): Promise<WithNormalizedPagination<ListTaggedConversationsResponse>>;\n async listTaggedConversations(\n queryOrTagId?: ListTaggedConversationsQuery | string,\n directQuery?: ListTaggedConversationsQuery,\n ): Promise<WithNormalizedPagination<ListTaggedConversationsResponse>> {\n if (typeof queryOrTagId === \"string\") {\n return await this.target(queryOrTagId).listTaggedConversations(directQuery);\n }\n const path = FrontBase.expandPath(\"/tags/{tag_id}/conversations\", {\n tag_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTaggedConversationsResponse>>(\n \"GET\",\n path,\n {\n query: queryFromTaggedConversations(queryOrTagId),\n },\n );\n }\n\n /**\n * List tags for the company accessible to the token (company, team, and teammate tags).\n *\n * **Required scope:** `tags:read`\n *\n * @param query Optional pagination and sorting.\n * @see https://dev.frontapp.com/reference/list-tags\n */\n async list(query?: ListTagsQuery): Promise<WithNormalizedPagination<ListTagsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListTagsResponse>>(\"GET\", \"/tags\", {\n query: queryFromListTags(query),\n });\n }\n\n /**\n * Create a tag in the oldest team (legacy `POST /tags` endpoint).\n *\n * **Required scope:** `tags:write`\n *\n * @param body Tag fields (OpenAPI {@link CreateTag}).\n * Prefer company/team/teammate tag endpoints when possible; see Front API docs.\n * @see https://dev.frontapp.com/reference/create-tag\n */\n async create(body: CreateTag): Promise<FrontTags> {\n const data = await this.base.requestJson<TagResponse>(\"POST\", \"/tags\", {\n body,\n });\n return new FrontTags(this.base, data);\n }\n\n /**\n * Fetch one tag by id (`GET /tags/{tag_id}`).\n *\n * **Required scope:** `tags:read`\n *\n * @param tagId Tag id, or a supported [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).\n * @see https://dev.frontapp.com/reference/get-tag\n */\n async get(tagId: string): Promise<FrontTags> {\n return await this.target(tagId).refresh();\n }\n\n /** Target a tag by id without calling the API first. */\n private target(tagId: string): FrontTags {\n return new FrontTags(this.base, undefined, tagId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport type { CreateTag } from \"./tags\";\nimport { FrontTags } from \"./tags\";\n\nexport type RuleResponse = components[\"schemas\"][\"RuleResponse\"];\nexport type StatusResponse = components[\"schemas\"][\"StatusResponse\"];\n\ntype ListCompanyRulesResponse =\n operations[\"list-all-company-rules\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListCompanyTicketStatusesResponse =\n operations[\"list-company-ticket-statuses\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListCompanyTagsQuery = NonNullable<operations[\"list-company-tags\"][\"parameters\"][\"query\"]>;\n\ntype ListCompanyTagsResponse =\n operations[\"list-company-tags\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromListCompanyTags = (\n q?: ListCompanyTagsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\n/**\n * Company-scoped rules, ticket statuses, and tags (`/company/rules`, `/company/statuses`, `/company/tags`).\n *\n * @see https://dev.frontapp.com/reference/introduction\n */\nexport class FrontCompany {\n private readonly base: FrontBase;\n\n /** @param base Shared HTTP client (in practice the `Front` instance). */\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * List company rules (`GET /company/rules`).\n *\n * **Required scope:** `rules:read`\n */\n async listRules(): Promise<WithNormalizedPagination<ListCompanyRulesResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListCompanyRulesResponse>>(\n \"GET\",\n \"/company/rules\",\n );\n }\n\n /**\n * List ticket statuses (`GET /company/statuses`). Returns `404` when ticketing is not enabled (throws {@link FrontApiError}).\n *\n * **Required scope:** `statuses:read`\n */\n async listTicketStatuses(): Promise<WithNormalizedPagination<ListCompanyTicketStatusesResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListCompanyTicketStatusesResponse>>(\n \"GET\",\n \"/company/statuses\",\n );\n }\n\n /**\n * Fetch one ticket status (`GET /company/statuses/{status_id}`).\n *\n * **Required scope:** `statuses:read`\n */\n async getTicketStatus(statusId: string): Promise<StatusResponse> {\n const path = FrontBase.expandPath(\"/company/statuses/{status_id}\", {\n status_id: statusId,\n });\n return await this.base.requestJson<StatusResponse>(\"GET\", path);\n }\n\n /**\n * List company tags (`GET /company/tags`).\n *\n * **Required scope:** `tags:read`\n */\n async listTags(\n query?: ListCompanyTagsQuery,\n ): Promise<WithNormalizedPagination<ListCompanyTagsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListCompanyTagsResponse>>(\n \"GET\",\n \"/company/tags\",\n { query: queryFromListCompanyTags(query) },\n );\n }\n\n /**\n * Create a company tag (`POST /company/tags`). Returns `201` with the new tag.\n *\n * **Required scope:** `tags:write`\n */\n async createTag(body: CreateTag): Promise<FrontTags> {\n const data = await this.base.requestJson<components[\"schemas\"][\"TagResponse\"]>(\n \"POST\",\n \"/company/tags\",\n { body },\n );\n return new FrontTags(this.base, data);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\n\nexport type CreateContactList = components[\"schemas\"][\"CreateContactList\"];\nexport type AddContactsToList = components[\"schemas\"][\"AddContactsToList\"];\nexport type RemoveContactsFromList = components[\"schemas\"][\"RemoveContactsFromList\"];\n\ntype ListContactListsResponse =\n operations[\"list-contact-lists\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListContactsInContactListQuery = NonNullable<\n operations[\"list-contacts-in-contact-list\"][\"parameters\"][\"query\"]\n>;\ntype ListContactsInContactListResponse =\n operations[\"list-contacts-in-contact-list\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromListContactsInContactList = (\n q?: ListContactsInContactListQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\n/**\n * Company contact lists (`/contact_lists` and `/contact_lists/{contact_list_id}/contacts`).\n *\n * @see https://dev.frontapp.com/reference/contact-lists\n */\nexport class FrontContactLists {\n private readonly base: FrontBase;\n\n /** @param base Shared HTTP client (in practice the `Front` instance). */\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * List contact lists (`GET /contact_lists`).\n *\n * **Required scope:** `contacts:read`\n *\n * @see https://dev.frontapp.com/reference/list-contact-lists\n */\n async list(): Promise<WithNormalizedPagination<ListContactListsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListContactListsResponse>>(\n \"GET\",\n \"/contact_lists\",\n );\n }\n\n /**\n * Create a contact list (`POST /contact_lists`). The API returns `204`.\n *\n * **Required scope:** `contacts:write`\n *\n * @param body List name (OpenAPI {@link CreateContactList}).\n * @see https://dev.frontapp.com/reference/create-contact-list\n */\n async create(body: CreateContactList): Promise<void> {\n await this.base.requestJson<undefined>(\"POST\", \"/contact_lists\", {\n body,\n });\n }\n\n /**\n * Delete a contact list (`DELETE /contact_lists/{contact_list_id}`). The API returns `204`.\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/delete-contact-list\n */\n async delete(contactListId: string): Promise<void> {\n const path = FrontBase.expandPath(\"/contact_lists/{contact_list_id}\", {\n contact_list_id: contactListId,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path);\n }\n\n /**\n * List contacts in a contact list (`GET /contact_lists/{contact_list_id}/contacts`).\n *\n * **Required scope:** `contacts:read`\n *\n * @param query Optional `limit` and `page_token`.\n * @see https://dev.frontapp.com/reference/list-contacts-in-contact-list\n */\n async listContacts(\n contactListId: string,\n query?: ListContactsInContactListQuery,\n ): Promise<WithNormalizedPagination<ListContactsInContactListResponse>> {\n const path = FrontBase.expandPath(\"/contact_lists/{contact_list_id}/contacts\", {\n contact_list_id: contactListId,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListContactsInContactListResponse>>(\n \"GET\",\n path,\n { query: queryFromListContactsInContactList(query) },\n );\n }\n\n /**\n * Add contacts to a contact list (`POST /contact_lists/{contact_list_id}/contacts`). The API returns `204`.\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/add-contacts-to-contact-list\n */\n async addContacts(contactListId: string, body: AddContactsToList): Promise<void> {\n const path = FrontBase.expandPath(\"/contact_lists/{contact_list_id}/contacts\", {\n contact_list_id: contactListId,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n\n /**\n * Remove contacts from a contact list (`DELETE /contact_lists/{contact_list_id}/contacts`). The API returns `204`.\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/remove-contacts-from-contact-list\n */\n async removeContacts(contactListId: string, body: RemoveContactsFromList): Promise<void> {\n const path = FrontBase.expandPath(\"/contact_lists/{contact_list_id}/contacts\", {\n contact_list_id: contactListId,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body });\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type ContactResponse = components[\"schemas\"][\"ContactResponse\"];\nexport type Contact = components[\"schemas\"][\"Contact\"];\nexport type CreateContact = components[\"schemas\"][\"CreateContact\"];\nexport type ContactHandle = components[\"schemas\"][\"ContactHandle\"];\nexport type DeleteContactHandle = components[\"schemas\"][\"DeleteContactHandle\"];\nexport type MergeContacts = components[\"schemas\"][\"MergeContacts\"];\nexport type CreateContactNote = components[\"schemas\"][\"CreateContactNote\"];\n\n/**\n * Contact JSON shaped for {@link FrontResource} (OpenAPI marks `id` / `_links` optional on {@link ContactResponse}).\n */\nexport type ContactSnapshot = ContactResponse & {\n id: string;\n _links: Record<string, unknown>;\n};\n\ntype ListContactsQuery = NonNullable<operations[\"list-contacts\"][\"parameters\"][\"query\"]>;\ntype ListContactsResponse =\n operations[\"list-contacts\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListContactCustomFieldsResponse =\n operations[\"list-contact-custom-fields\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListContactConversationsQuery = NonNullable<\n operations[\"list-contact-conversations\"][\"parameters\"][\"query\"]\n>;\ntype ListContactConversationsResponse =\n operations[\"list-contact-conversations\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListNotesResponse = operations[\"list-notes\"][\"responses\"][202][\"content\"][\"application/json\"];\n\ntype ContactNoteResponse = operations[\"add-note\"][\"responses\"][201][\"content\"][\"application/json\"];\n\nconst toContactSnapshot = (data: ContactResponse): ContactSnapshot => {\n if (data.id === undefined || data.id === \"\") {\n throw new Error(\"Contact response missing `id`.\");\n }\n return {\n ...data,\n _links: data._links !== undefined && data._links !== null ? { ...data._links } : {},\n id: data.id,\n };\n};\n\nconst queryFromListContacts = (\n q?: ListContactsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromListContactConversations = (\n q?: ListContactConversationsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\nconst mergeContactSnapshot = (\n current: ContactSnapshot,\n patch: Partial<Contact>,\n): ContactSnapshot => {\n let next: ContactSnapshot = { ...current };\n if (patch.name !== undefined) {\n next = { ...next, name: patch.name };\n }\n if (patch.description !== undefined) {\n next = { ...next, description: patch.description };\n }\n if (patch.links !== undefined) {\n next = { ...next, links: patch.links };\n }\n if (patch.custom_fields !== undefined) {\n next = { ...next, custom_fields: patch.custom_fields };\n }\n return next;\n};\n\nconst contactSnapshotToUpdateBody = (state: ContactSnapshot): Contact => ({\n custom_fields: state.custom_fields,\n description: state.description,\n links: state.links,\n name: state.name,\n});\n\n/**\n * One contact (`/contacts/{contact_id}` and related routes).\n *\n * Writable fields aligned with OpenAPI {@link Contact}: `name`, `description`, `contactLinks` (JSON `links`), `customFields`.\n * HAL `_links` is exposed as `links` on {@link FrontResource} (not the contact URL list).\n * `PATCH` returns `204`; {@link update} and {@link save} merge the request into local state for those fields.\n *\n * @see https://dev.frontapp.com/reference/contacts\n */\nexport class FrontContacts extends FrontResource<ContactSnapshot, Contact> {\n constructor(base: FrontBase, snapshot?: ContactResponse, contactId?: string) {\n super(base, snapshot === undefined ? undefined : toContactSnapshot(snapshot), contactId);\n }\n\n protected selfPath(): string {\n return FrontBase.expandPath(\"/contacts/{contact_id}\", {\n contact_id: this.id,\n });\n }\n\n get name(): string | undefined {\n return this.pick(\"name\");\n }\n\n set name(value: string | undefined) {\n this.assign(\"name\", value);\n }\n\n get description(): string | undefined {\n return this.pick(\"description\");\n }\n\n set description(value: string | undefined) {\n this.assign(\"description\", value);\n }\n\n get avatarUrl(): string | undefined {\n return this.pick(\"avatar_url\");\n }\n\n /**\n * Contact “links” URLs from the API (`links` on {@link ContactResponse}).\n * Named {@link contactLinks} to avoid clashing with {@link FrontResource.links} (HAL `_links`).\n */\n get contactLinks(): string[] | undefined {\n return this.pick(\"links\");\n }\n\n set contactLinks(value: string[] | undefined) {\n this.assign(\"links\", value);\n }\n\n get handles(): ContactResponse[\"handles\"] {\n return this.pick(\"handles\");\n }\n\n get customFields(): ContactResponse[\"custom_fields\"] {\n return this.pick(\"custom_fields\");\n }\n\n set customFields(value: ContactResponse[\"custom_fields\"]) {\n this.assign(\"custom_fields\", value);\n }\n\n get lists(): ContactResponse[\"lists\"] {\n return this.pick(\"lists\");\n }\n\n get groups(): ContactResponse[\"groups\"] {\n return this.pick(\"groups\");\n }\n\n get isPrivate(): boolean | undefined {\n return this.pick(\"is_private\");\n }\n\n /**\n * Build the `PATCH` body implied by the current mutable fields.\n * @see https://dev.frontapp.com/reference/update-a-contact\n */\n toUpdateBody(): Contact {\n return contactSnapshotToUpdateBody(this.state);\n }\n\n /**\n * Update this contact (`PATCH /contacts/{contact_id}`). The API returns `204`; local state is merged from the body.\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/update-a-contact\n */\n async update(body: Contact | Partial<Contact>): Promise<void>;\n async update(contactId: string, body: Contact | Partial<Contact>): Promise<void>;\n async update(\n bodyOrContactId: Contact | Partial<Contact> | string,\n directBody?: Contact | Partial<Contact>,\n ): Promise<void> {\n if (typeof bodyOrContactId === \"string\") {\n await this.target(bodyOrContactId).update(directBody ?? {});\n return;\n }\n await this.patchNoContent(bodyOrContactId, mergeContactSnapshot);\n }\n\n override async delete(contactId?: string): Promise<void> {\n if (contactId === undefined) {\n await super.delete();\n return;\n }\n await this.target(contactId).delete();\n }\n\n /**\n * `GET` this contact and replace local state (normalizes into {@link ContactSnapshot}).\n */\n override async refresh(): Promise<this> {\n const data = await this.base.requestJson<ContactResponse>(\"GET\", this.selfPath());\n this.replaceState(toContactSnapshot(data));\n this.onAfterRefresh();\n return this;\n }\n\n /**\n * List conversations for this contact (`GET /contacts/{contact_id}/conversations`).\n *\n * **Required scope:** `conversations:read`\n *\n * @param query Optional `q`, `limit`, and `page_token`.\n * @see https://dev.frontapp.com/reference/list-contact-conversations\n */\n async listConversations(\n query?: ListContactConversationsQuery,\n ): Promise<WithNormalizedPagination<ListContactConversationsResponse>>;\n async listConversations(\n contactId: string,\n query?: ListContactConversationsQuery,\n ): Promise<WithNormalizedPagination<ListContactConversationsResponse>>;\n async listConversations(\n queryOrContactId?: ListContactConversationsQuery | string,\n directQuery?: ListContactConversationsQuery,\n ): Promise<WithNormalizedPagination<ListContactConversationsResponse>> {\n if (typeof queryOrContactId === \"string\") {\n return await this.target(queryOrContactId).listConversations(directQuery);\n }\n const path = FrontBase.expandPath(\"/contacts/{contact_id}/conversations\", {\n contact_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListContactConversationsResponse>>(\n \"GET\",\n path,\n {\n query: queryFromListContactConversations(queryOrContactId),\n },\n );\n }\n\n /**\n * Add a handle (`POST /contacts/{contact_id}/handles`). The API returns `204`.\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/add-contact-handle\n */\n async addHandle(body: ContactHandle): Promise<void>;\n async addHandle(contactId: string, body: ContactHandle): Promise<void>;\n async addHandle(\n bodyOrContactId: ContactHandle | string,\n directBody?: ContactHandle,\n ): Promise<void> {\n if (typeof bodyOrContactId === \"string\") {\n await this.target(bodyOrContactId).addHandle(directBody ?? { handle: \"\", source: \"custom\" });\n return;\n }\n const path = FrontBase.expandPath(\"/contacts/{contact_id}/handles\", {\n contact_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body: bodyOrContactId });\n const existing = this.pick(\"handles\") ?? [];\n this.assign(\"handles\", [...existing, bodyOrContactId]);\n }\n\n /**\n * Remove a handle (`DELETE /contacts/{contact_id}/handles`). The API expects a JSON body (including `force`), not query parameters.\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/delete-contact-handle\n */\n async deleteHandle(body: DeleteContactHandle): Promise<void>;\n async deleteHandle(contactId: string, body: DeleteContactHandle): Promise<void>;\n async deleteHandle(\n bodyOrContactId: DeleteContactHandle | string,\n directBody?: DeleteContactHandle,\n ): Promise<void> {\n if (typeof bodyOrContactId === \"string\") {\n await this.target(bodyOrContactId).deleteHandle(\n directBody ?? { force: false, handle: \"\", source: \"custom\" },\n );\n return;\n }\n const path = FrontBase.expandPath(\"/contacts/{contact_id}/handles\", {\n contact_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body: bodyOrContactId });\n const existing = this.pick(\"handles\") ?? [];\n this.assign(\n \"handles\",\n existing.filter(\n (h) => !(h.handle === bodyOrContactId.handle && h.source === bodyOrContactId.source),\n ),\n );\n }\n\n /**\n * List notes on this contact (`GET /contacts/{contact_id}/notes`). The API returns `202`.\n *\n * **Required scope:** `contacts:read`\n *\n * @see https://dev.frontapp.com/reference/list-notes\n */\n async listNotes(contactId?: string): Promise<WithNormalizedPagination<ListNotesResponse>> {\n if (contactId !== undefined) {\n return await this.target(contactId).listNotes();\n }\n const path = FrontBase.expandPath(\"/contacts/{contact_id}/notes\", {\n contact_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListNotesResponse>>(\"GET\", path);\n }\n\n /**\n * Add a note (`POST /contacts/{contact_id}/notes`). The API returns `201` with the new note.\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/add-note\n */\n async addNote(body: CreateContactNote): Promise<ContactNoteResponse>;\n async addNote(contactId: string, body: CreateContactNote): Promise<ContactNoteResponse>;\n async addNote(\n bodyOrContactId: CreateContactNote | string,\n directBody?: CreateContactNote,\n ): Promise<ContactNoteResponse> {\n if (typeof bodyOrContactId === \"string\") {\n return await this.target(bodyOrContactId).addNote(directBody ?? { author_id: \"\", body: \"\" });\n }\n const path = FrontBase.expandPath(\"/contacts/{contact_id}/notes\", {\n contact_id: this.id,\n });\n return await this.base.requestJson<ContactNoteResponse>(\"POST\", path, {\n body: bodyOrContactId,\n });\n }\n /**\n * List contacts (`GET /contacts`).\n *\n * **Required scope:** `contacts:read`\n *\n * @param query Optional `q`, pagination, and sort.\n * @see https://dev.frontapp.com/reference/list-contacts\n */\n async list(query?: ListContactsQuery): Promise<WithNormalizedPagination<ListContactsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListContactsResponse>>(\n \"GET\",\n \"/contacts\",\n { query: queryFromListContacts(query) },\n );\n }\n\n /**\n * Create a contact (`POST /contacts`). The API returns `201` with the new contact.\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/create-contact\n */\n async create(body: CreateContact): Promise<FrontContacts> {\n const data = await this.base.requestJson<ContactResponse>(\"POST\", \"/contacts\", { body });\n return new FrontContacts(this.base, data);\n }\n\n /**\n * List custom fields that can be attached to contacts (`GET /contacts/custom_fields`).\n *\n * **Required scope:** `custom_fields:read`\n *\n * @see https://dev.frontapp.com/reference/list-contact-custom-fields\n */\n async listCustomFields(): Promise<WithNormalizedPagination<ListContactCustomFieldsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListContactCustomFieldsResponse>>(\n \"GET\",\n \"/contacts/custom_fields\",\n );\n }\n\n /**\n * Merge contacts (`POST /contacts/merge`).\n *\n * **Required scope:** `contacts:write`\n *\n * @see https://dev.frontapp.com/reference/merge-contacts\n */\n async merge(body: MergeContacts): Promise<FrontContacts> {\n const data = await this.base.requestJson<ContactResponse>(\"POST\", \"/contacts/merge\", { body });\n return new FrontContacts(this.base, data);\n }\n\n /**\n * Fetch one contact (`GET /contacts/{contact_id}`).\n *\n * **Required scope:** `contacts:read`\n *\n * @param contactId Contact id or supported [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).\n * @see https://dev.frontapp.com/reference/get-contact\n */\n async get(contactId: string): Promise<FrontContacts> {\n return await this.target(contactId).refresh();\n }\n\n /** Target a contact by ID without fetching it first. */\n private target(contactId: string): FrontContacts {\n return new FrontContacts(this.base, undefined, contactId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\nimport type { CreateComment } from \"./comments\";\nimport { FrontComments } from \"./comments\";\n\nexport type ConversationResponse = components[\"schemas\"][\"ConversationResponse\"];\nexport type UpdateConversation = components[\"schemas\"][\"UpdateConversation\"];\nexport type CreateConversation = components[\"schemas\"][\"CreateConversation\"];\nexport type ReplyDraft = components[\"schemas\"][\"ReplyDraft\"];\nexport type OutboundReplyMessage = components[\"schemas\"][\"OutboundReplyMessage\"];\nexport type UpdateConversationReminders = components[\"schemas\"][\"UpdateConversationReminders\"];\nexport type TagIds = components[\"schemas\"][\"TagIds\"];\n\ntype MessageResponse = components[\"schemas\"][\"MessageResponse\"];\n\ntype ListConversationsResponse =\n operations[\"list-conversations\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ListConversationCustomFieldsResponse =\n operations[\"list-conversation-custom-fields\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype SearchConversationsResponse =\n operations[\"search-conversations\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ListConversationCommentsResponse =\n operations[\"list-conversation-comments\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ListConversationDraftsResponse =\n operations[\"list-conversation-drafts\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ListConversationEventsResponse =\n operations[\"list-conversation-events\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ListConversationFollowersResponse =\n operations[\"list-conversation-followers\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ListConversationInboxesResponse =\n operations[\"list-conversation-inboxes\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ListConversationMessagesResponse =\n operations[\"list-conversation-messages\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype AcceptedMessageReply =\n operations[\"create-message-reply\"][\"responses\"][202][\"content\"][\"application/json\"];\n\ntype ListConversationsQuery = NonNullable<operations[\"list-conversations\"][\"parameters\"][\"query\"]>;\ntype SearchConversationsQuery = NonNullable<\n operations[\"search-conversations\"][\"parameters\"][\"query\"]\n>;\ntype ListConversationEventsQuery = NonNullable<\n operations[\"list-conversation-events\"][\"parameters\"][\"query\"]\n>;\nexport type ListConversationMessagesQuery = NonNullable<\n operations[\"list-conversation-messages\"][\"parameters\"][\"query\"]\n>;\n\ntype AddConversationFollowersQuery = NonNullable<\n operations[\"add-conversation-followers\"][\"parameters\"][\"query\"]\n>;\ntype AddConversationFollowersBody = NonNullable<\n NonNullable<\n operations[\"add-conversation-followers\"][\"requestBody\"]\n >[\"content\"][\"application/json\"]\n>;\ntype DeleteConversationFollowersBody = NonNullable<\n NonNullable<\n operations[\"delete-conversation-followers\"][\"requestBody\"]\n >[\"content\"][\"application/json\"]\n>;\ntype AddConversationLinkBody = NonNullable<\n NonNullable<operations[\"add-conversation-link\"][\"requestBody\"]>[\"content\"][\"application/json\"]\n>;\ntype RemoveConversationLinksBody = NonNullable<\n NonNullable<operations[\"remove-conversation-links\"][\"requestBody\"]>[\"content\"][\"application/json\"]\n>;\n\nconst queryFromListConversations = (\n q?: ListConversationsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromSearchConversations = (\n q?: SearchConversationsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\nconst queryFromListConversationEvents = (\n q?: ListConversationEventsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\nconst queryFromListConversationMessages = (\n q?: ListConversationMessagesQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst requestListConversationMessages = (\n base: FrontBase,\n conversationId: string,\n query?: ListConversationMessagesQuery,\n): Promise<WithNormalizedPagination<ListConversationMessagesResponse>> => {\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/messages\", {\n conversation_id: conversationId,\n });\n return base.requestJson<WithNormalizedPagination<ListConversationMessagesResponse>>(\"GET\", path, {\n query: queryFromListConversationMessages(query),\n });\n};\n\nconst queryFromAddConversationFollowers = (\n q?: AddConversationFollowersQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.ignore_errors !== undefined) {\n out.ignore_errors = q.ignore_errors ? \"true\" : \"false\";\n }\n return out;\n};\n\nconst updateStatusToConversationStatus = (\n status: NonNullable<UpdateConversation[\"status\"]>,\n): ConversationResponse[\"status\"] => {\n switch (status) {\n case \"archived\": {\n return \"archived\";\n }\n case \"deleted\": {\n return \"deleted\";\n }\n case \"open\": {\n return \"unassigned\";\n }\n case \"spam\": {\n return \"deleted\";\n }\n default: {\n const _exhaustive: never = status;\n return _exhaustive;\n }\n }\n};\n\nconst conversationStatusToUpdateStatus = (\n status: ConversationResponse[\"status\"],\n): UpdateConversation[\"status\"] | undefined => {\n if (status === \"archived\") {\n return \"archived\";\n }\n if (status === \"deleted\") {\n return \"deleted\";\n }\n if (status === \"unassigned\") {\n return \"open\";\n }\n};\n\nconst mergeConversationSnapshot = (\n current: ConversationResponse,\n patch: Partial<UpdateConversation>,\n): ConversationResponse => {\n const filtered = Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n ) as Partial<UpdateConversation>;\n\n let next: ConversationResponse = { ...current };\n\n if (filtered.status !== undefined) {\n next = {\n ...next,\n status: updateStatusToConversationStatus(filtered.status),\n };\n }\n if (filtered.status_id !== undefined) {\n next = { ...next, status_id: filtered.status_id };\n }\n if (filtered.custom_fields !== undefined) {\n next = { ...next, custom_fields: filtered.custom_fields };\n }\n if (filtered.tag_ids !== undefined) {\n const idSet = new Set(filtered.tag_ids);\n next = {\n ...next,\n tags: next.tags.filter((tag) => idSet.has(tag.id)),\n };\n }\n\n const assigneePatch = filtered.assignee_id as string | null | undefined;\n if (assigneePatch !== undefined) {\n next = {\n ...next,\n assignee: {\n ...next.assignee,\n id: assigneePatch === null ? \"\" : assigneePatch,\n },\n };\n }\n\n return next;\n};\n\nconst conversationResponseToUpdateBody = (state: ConversationResponse): UpdateConversation => {\n const status = conversationStatusToUpdateStatus(state.status);\n return {\n assignee_id: state.assignee.id === \"\" ? undefined : state.assignee.id,\n custom_fields: state.custom_fields,\n tag_ids: state.tags.map((t) => t.id),\n ...(status === undefined ? {} : { status }),\n ...(state.status_id === undefined ? {} : { status_id: state.status_id }),\n };\n};\n\n/**\n * One conversation (`/conversations/{conversation_id}` and nested routes).\n *\n * Writable fields for {@link save} map from {@link ConversationResponse} into {@link UpdateConversation}\n * (assignee, status, status id, tags, custom fields). `PATCH` returns `204`; {@link update} merges the\n * request into local state for supported fields — call {@link refresh} when you need an authoritative snapshot.\n *\n * @see https://dev.frontapp.com/reference/conversations\n */\nexport class FrontConversations extends FrontResource<ConversationResponse, UpdateConversation> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/conversations/{conversation_id}\", {\n conversation_id: this.id,\n });\n }\n\n get subject(): string {\n return this.pick(\"subject\");\n }\n\n get status(): ConversationResponse[\"status\"] {\n return this.pick(\"status\");\n }\n\n get statusId(): string | undefined {\n return this.pick(\"status_id\");\n }\n\n get statusCategory(): ConversationResponse[\"status_category\"] {\n return this.pick(\"status_category\");\n }\n\n get ticketIds(): ConversationResponse[\"ticket_ids\"] {\n return this.pick(\"ticket_ids\");\n }\n\n get assignee(): ConversationResponse[\"assignee\"] {\n return this.pick(\"assignee\");\n }\n\n get recipient(): ConversationResponse[\"recipient\"] {\n return this.pick(\"recipient\");\n }\n\n get tags(): ConversationResponse[\"tags\"] {\n return this.pick(\"tags\");\n }\n\n /**\n * Links attached to this conversation (API field `links`). HAL `_links` for the resource is {@link FrontResource.links}.\n */\n get conversationLinks(): ConversationResponse[\"links\"] {\n return this.pick(\"links\");\n }\n\n get customFields(): ConversationResponse[\"custom_fields\"] {\n return this.pick(\"custom_fields\");\n }\n\n get createdAt(): number | undefined {\n return this.pick(\"created_at\");\n }\n\n get updatedAt(): number | undefined {\n return this.pick(\"updated_at\");\n }\n\n get waitingSince(): number | undefined {\n return this.pick(\"waiting_since\");\n }\n\n get isPrivate(): boolean {\n return this.pick(\"is_private\");\n }\n\n get scheduledReminders(): ConversationResponse[\"scheduled_reminders\"] {\n return this.pick(\"scheduled_reminders\");\n }\n\n get metadata(): ConversationResponse[\"metadata\"] {\n return this.pick(\"metadata\");\n }\n\n toUpdateBody(): UpdateConversation {\n return conversationResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this conversation (`PATCH /conversations/{conversation_id}`). The API returns `204`; local state\n * is merged from the body for supported fields.\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/update-conversation\n */\n async update(body: UpdateConversation | Partial<UpdateConversation>): Promise<void>;\n async update(\n conversationId: string,\n body: UpdateConversation | Partial<UpdateConversation>,\n ): Promise<void>;\n async update(\n bodyOrConversationId: string | UpdateConversation | Partial<UpdateConversation>,\n body?: UpdateConversation | Partial<UpdateConversation>,\n ): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Updating a conversation by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).update(body);\n return;\n }\n await this.patchNoContent(bodyOrConversationId, mergeConversationSnapshot);\n }\n\n /**\n * Permanently delete this conversation (`DELETE /conversations/{conversation_id}`). The conversation must be in\n * the trashed state.\n *\n * **Required scope:** `conversations:delete`\n *\n * @see https://dev.frontapp.com/reference/delete-conversation\n */\n override async delete(conversationId?: string): Promise<void> {\n if (conversationId !== undefined) {\n await this.target(conversationId).delete();\n return;\n }\n await super.delete();\n }\n\n /**\n * Assign or unassign (`PUT /conversations/{conversation_id}/assignee`). The API returns `204`.\n * Pass `{ assignee_id: null }` to unassign (JSON `null` is accepted by the API even when the generated schema\n * types `assignee_id` as `string`).\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/update-conversation-assignee\n */\n async updateAssignee(body: { assignee_id: string | null }): Promise<void>;\n async updateAssignee(conversationId: string, body: { assignee_id: string | null }): Promise<void>;\n async updateAssignee(\n bodyOrConversationId: string | { assignee_id: string | null },\n body?: { assignee_id: string | null },\n ): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Updating a conversation assignee by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).updateAssignee(body);\n return;\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/assignee\", {\n conversation_id: this.id,\n });\n await this.base.requestJson<undefined>(\"PUT\", path, { body: bodyOrConversationId });\n }\n\n /**\n * List comments (`GET /conversations/{conversation_id}/comments`).\n *\n * **Required scope:** `comments:read`\n *\n * @see https://dev.frontapp.com/reference/list-conversation-comments\n */\n async listComments(\n conversationId?: string,\n ): Promise<WithNormalizedPagination<ListConversationCommentsResponse>> {\n if (conversationId !== undefined) {\n return await this.target(conversationId).listComments();\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/comments\", {\n conversation_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListConversationCommentsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Add a comment (`POST /conversations/{conversation_id}/comments`).\n *\n * **Required scope:** `comments:write`\n *\n * @see https://dev.frontapp.com/reference/add-comment\n */\n async addComment(body: CreateComment): Promise<FrontComments>;\n async addComment(conversationId: string, body: CreateComment): Promise<FrontComments>;\n async addComment(\n bodyOrConversationId: string | CreateComment,\n body?: CreateComment,\n ): Promise<FrontComments> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Adding a conversation comment by ID requires a request body.\");\n }\n return await this.target(bodyOrConversationId).addComment(body);\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/comments\", {\n conversation_id: this.id,\n });\n const data = await this.base.requestJson<components[\"schemas\"][\"CommentResponse\"]>(\n \"POST\",\n path,\n { body: bodyOrConversationId },\n );\n return new FrontComments(this.base, data);\n }\n\n /**\n * List drafts (`GET /conversations/{conversation_id}/drafts`).\n *\n * **Required scope:** `drafts:read`\n *\n * @see https://dev.frontapp.com/reference/list-conversation-drafts\n */\n async listDrafts(\n conversationId?: string,\n ): Promise<WithNormalizedPagination<ListConversationDraftsResponse>> {\n if (conversationId !== undefined) {\n return await this.target(conversationId).listDrafts();\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/drafts\", {\n conversation_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListConversationDraftsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Create a draft reply to the last message (`POST /conversations/{conversation_id}/drafts`).\n *\n * **Required scope:** `drafts:write`\n *\n * @see https://dev.frontapp.com/reference/create-draft-reply\n */\n async createDraftReply(body: ReplyDraft): Promise<MessageResponse>;\n async createDraftReply(conversationId: string, body: ReplyDraft): Promise<MessageResponse>;\n async createDraftReply(\n bodyOrConversationId: string | ReplyDraft,\n body?: ReplyDraft,\n ): Promise<MessageResponse> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Creating a conversation draft by ID requires a request body.\");\n }\n return await this.target(bodyOrConversationId).createDraftReply(body);\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/drafts\", {\n conversation_id: this.id,\n });\n return await this.base.requestJson<MessageResponse>(\"POST\", path, {\n body: bodyOrConversationId,\n });\n }\n\n /**\n * List events (`GET /conversations/{conversation_id}/events`).\n *\n * **Required scope:** `events:read`\n *\n * @see https://dev.frontapp.com/reference/list-conversation-events\n */\n async listEvents(\n query?: ListConversationEventsQuery,\n ): Promise<WithNormalizedPagination<ListConversationEventsResponse>>;\n async listEvents(\n conversationId: string,\n query?: ListConversationEventsQuery,\n ): Promise<WithNormalizedPagination<ListConversationEventsResponse>>;\n async listEvents(\n queryOrConversationId?: string | ListConversationEventsQuery,\n query?: ListConversationEventsQuery,\n ): Promise<WithNormalizedPagination<ListConversationEventsResponse>> {\n if (typeof queryOrConversationId === \"string\") {\n return await this.target(queryOrConversationId).listEvents(query);\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/events\", {\n conversation_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListConversationEventsResponse>>(\n \"GET\",\n path,\n { query: queryFromListConversationEvents(queryOrConversationId) },\n );\n }\n\n /**\n * List followers (`GET /conversations/{conversation_id}/followers`).\n *\n * **Required scope:** `conversations:read`\n *\n * @see https://dev.frontapp.com/reference/list-conversation-followers\n */\n async listFollowers(\n conversationId?: string,\n ): Promise<WithNormalizedPagination<ListConversationFollowersResponse>> {\n if (conversationId !== undefined) {\n return await this.target(conversationId).listFollowers();\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/followers\", {\n conversation_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListConversationFollowersResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Add followers (`POST /conversations/{conversation_id}/followers`). The API returns `204`.\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/add-conversation-followers\n */\n async addFollowers(\n body: AddConversationFollowersBody,\n query?: AddConversationFollowersQuery,\n ): Promise<void>;\n async addFollowers(\n conversationId: string,\n body: AddConversationFollowersBody,\n query?: AddConversationFollowersQuery,\n ): Promise<void>;\n async addFollowers(\n bodyOrConversationId: string | AddConversationFollowersBody,\n bodyOrQuery?: AddConversationFollowersBody | AddConversationFollowersQuery,\n query?: AddConversationFollowersQuery,\n ): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (bodyOrQuery === undefined) {\n throw new Error(\"Adding conversation followers by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).addFollowers(\n bodyOrQuery as AddConversationFollowersBody,\n query,\n );\n return;\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/followers\", {\n conversation_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, {\n body: bodyOrConversationId,\n query: queryFromAddConversationFollowers(bodyOrQuery as AddConversationFollowersQuery),\n });\n }\n\n /**\n * Remove followers (`DELETE /conversations/{conversation_id}/followers`). The API returns `204`.\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/delete-conversation-followers\n */\n async deleteFollowers(body: DeleteConversationFollowersBody): Promise<void>;\n async deleteFollowers(\n conversationId: string,\n body: DeleteConversationFollowersBody,\n ): Promise<void>;\n async deleteFollowers(\n bodyOrConversationId: string | DeleteConversationFollowersBody,\n body?: DeleteConversationFollowersBody,\n ): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Removing conversation followers by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).deleteFollowers(body);\n return;\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/followers\", {\n conversation_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body: bodyOrConversationId });\n }\n\n /**\n * List inboxes (`GET /conversations/{conversation_id}/inboxes`).\n *\n * **Required scope:** `inboxes:read`\n *\n * @see https://dev.frontapp.com/reference/list-conversation-inboxes\n */\n async listInboxes(\n conversationId?: string,\n ): Promise<WithNormalizedPagination<ListConversationInboxesResponse>> {\n if (conversationId !== undefined) {\n return await this.target(conversationId).listInboxes();\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/inboxes\", {\n conversation_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListConversationInboxesResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Add links (`POST /conversations/{conversation_id}/links`). The API returns `204`.\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/add-conversation-link\n */\n async addLink(body: AddConversationLinkBody): Promise<void>;\n async addLink(conversationId: string, body: AddConversationLinkBody): Promise<void>;\n async addLink(\n bodyOrConversationId: string | AddConversationLinkBody,\n body?: AddConversationLinkBody,\n ): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Adding a conversation link by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).addLink(body);\n return;\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/links\", {\n conversation_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body: bodyOrConversationId });\n }\n\n /**\n * Remove links (`DELETE /conversations/{conversation_id}/links`). The API returns `204`.\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/remove-conversation-links\n */\n async removeLinks(body: RemoveConversationLinksBody): Promise<void>;\n async removeLinks(conversationId: string, body: RemoveConversationLinksBody): Promise<void>;\n async removeLinks(\n bodyOrConversationId: string | RemoveConversationLinksBody,\n body?: RemoveConversationLinksBody,\n ): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Removing conversation links by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).removeLinks(body);\n return;\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/links\", {\n conversation_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body: bodyOrConversationId });\n }\n\n /**\n * List messages (`GET /conversations/{conversation_id}/messages`).\n *\n * **Required scope:** `messages:read`\n *\n * @see https://dev.frontapp.com/reference/list-conversation-messages\n */\n async listMessages(\n query?: ListConversationMessagesQuery,\n ): Promise<WithNormalizedPagination<ListConversationMessagesResponse>>;\n async listMessages(\n conversationId: string,\n query?: ListConversationMessagesQuery,\n ): Promise<WithNormalizedPagination<ListConversationMessagesResponse>>;\n async listMessages(\n queryOrConversationId?: string | ListConversationMessagesQuery,\n query?: ListConversationMessagesQuery,\n ): Promise<WithNormalizedPagination<ListConversationMessagesResponse>> {\n if (typeof queryOrConversationId === \"string\") {\n return await this.target(queryOrConversationId).listMessages(query);\n }\n return await requestListConversationMessages(this.base, this.id, queryOrConversationId);\n }\n\n /**\n * Reply with a new message (`POST /conversations/{conversation_id}/messages`). Returns `202` with status metadata.\n *\n * **Required scope:** `messages:send`\n *\n * @see https://dev.frontapp.com/reference/create-message-reply\n */\n async createMessageReply(body: OutboundReplyMessage): Promise<AcceptedMessageReply>;\n async createMessageReply(\n conversationId: string,\n body: OutboundReplyMessage,\n ): Promise<AcceptedMessageReply>;\n async createMessageReply(\n bodyOrConversationId: string | OutboundReplyMessage,\n body?: OutboundReplyMessage,\n ): Promise<AcceptedMessageReply> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Replying to a conversation by ID requires a request body.\");\n }\n return await this.target(bodyOrConversationId).createMessageReply(body);\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/messages\", {\n conversation_id: this.id,\n });\n return await this.base.requestJson<AcceptedMessageReply>(\"POST\", path, {\n body: bodyOrConversationId,\n });\n }\n\n /**\n * Update reminders (`PATCH /conversations/{conversation_id}/reminders`). The API returns `204`.\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/update-conversation-reminders\n */\n async updateReminders(body: UpdateConversationReminders): Promise<void>;\n async updateReminders(conversationId: string, body: UpdateConversationReminders): Promise<void>;\n async updateReminders(\n bodyOrConversationId: string | UpdateConversationReminders,\n body?: UpdateConversationReminders,\n ): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Updating conversation reminders by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).updateReminders(body);\n return;\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/reminders\", {\n conversation_id: this.id,\n });\n await this.base.requestJson<undefined>(\"PATCH\", path, { body: bodyOrConversationId });\n }\n\n /**\n * Add tags (`POST /conversations/{conversation_id}/tags`). The API returns `204`.\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/add-conversation-tag\n */\n async addTag(body: TagIds): Promise<void>;\n async addTag(conversationId: string, body: TagIds): Promise<void>;\n async addTag(bodyOrConversationId: string | TagIds, body?: TagIds): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Adding a conversation tag by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).addTag(body);\n return;\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/tags\", {\n conversation_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body: bodyOrConversationId });\n }\n\n /**\n * Remove tags (`DELETE /conversations/{conversation_id}/tags`). The API returns `204`.\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/remove-conversation-tag\n */\n async removeTag(body: TagIds): Promise<void>;\n async removeTag(conversationId: string, body: TagIds): Promise<void>;\n async removeTag(bodyOrConversationId: string | TagIds, body?: TagIds): Promise<void> {\n if (typeof bodyOrConversationId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Removing a conversation tag by ID requires a request body.\");\n }\n await this.target(bodyOrConversationId).removeTag(body);\n return;\n }\n const path = FrontBase.expandPath(\"/conversations/{conversation_id}/tags\", {\n conversation_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body: bodyOrConversationId });\n }\n /**\n * Company conversations (`/conversations`, `/conversations/custom_fields`, `/conversations/search/{query}`, …).\n *\n * @see https://dev.frontapp.com/reference/conversations\n */\n /**\n * List conversations (`GET /conversations`).\n *\n * **Required scope:** `conversations:read`\n *\n * @see https://dev.frontapp.com/reference/list-conversations\n */\n async list(\n query?: ListConversationsQuery,\n ): Promise<WithNormalizedPagination<ListConversationsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListConversationsResponse>>(\n \"GET\",\n \"/conversations\",\n { query: queryFromListConversations(query) },\n );\n }\n\n /**\n * Create a discussion conversation (`POST /conversations`).\n *\n * **Required scope:** `conversations:write`\n *\n * @see https://dev.frontapp.com/reference/create-conversation\n */\n async create(body: CreateConversation): Promise<FrontConversations> {\n const data = await this.base.requestJson<ConversationResponse>(\"POST\", \"/conversations\", {\n body,\n });\n return new FrontConversations(this.base, data);\n }\n\n /**\n * List custom fields that can be attached to a conversation (`GET /conversations/custom_fields`).\n *\n * **Required scope:** `conversations:read`\n *\n * @see https://dev.frontapp.com/reference/list-conversation-custom-fields\n */\n async listCustomFields(): Promise<\n WithNormalizedPagination<ListConversationCustomFieldsResponse>\n > {\n return await this.base.requestJson<\n WithNormalizedPagination<ListConversationCustomFieldsResponse>\n >(\"GET\", \"/conversations/custom_fields\");\n }\n\n /**\n * Search conversations (`GET /conversations/search/{query}`). The `{query}` segment is URL-encoded.\n *\n * **Required scope:** `conversations:read`\n *\n * @param query Search string (path segment).\n * @see https://dev.frontapp.com/reference/search-conversations\n */\n async search(\n query: string,\n params?: SearchConversationsQuery,\n ): Promise<WithNormalizedPagination<SearchConversationsResponse>> {\n const path = FrontBase.expandPath(\"/conversations/search/{query}\", {\n query,\n });\n return await this.base.requestJson<WithNormalizedPagination<SearchConversationsResponse>>(\n \"GET\",\n path,\n { query: queryFromSearchConversations(params) },\n );\n }\n\n /**\n * Fetch one conversation (`GET /conversations/{conversation_id}`).\n *\n * **Required scope:** `conversations:read`\n *\n * @param conversationId Conversation id or supported [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).\n * @see https://dev.frontapp.com/reference/get-conversation-by-id\n */\n async get(conversationId: string): Promise<FrontConversations> {\n const conversation = this.target(conversationId);\n await conversation.refresh();\n return conversation;\n }\n\n /** Target a conversation by id without calling the API first. */\n private target(conversationId: string): FrontConversations {\n return new FrontConversations(this.base, undefined, conversationId);\n }\n}\n","import type { FrontBase } from \"../base\";\nimport type { components } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\n\ntype ListCustomFieldsResponse =\n components[\"responses\"][\"listOfCustomFields\"][\"content\"][\"application/json\"];\n\n/**\n * Deprecated global custom fields list (`GET /custom_fields`, same shape as contact custom fields).\n *\n * **Required scope:** `custom_fields:read`\n *\n * @see https://dev.frontapp.com/reference/list-contacts-custom-fields\n */\nexport class FrontCustomFieldsGlobal {\n private readonly base: FrontBase;\n\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * List custom fields (`GET /custom_fields`).\n *\n * **Required scope:** `custom_fields:read`\n */\n async list(): Promise<WithNormalizedPagination<ListCustomFieldsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListCustomFieldsResponse>>(\n \"GET\",\n \"/custom_fields\",\n );\n }\n}\n","import { FrontBase } from \"../base\";\n\n/**\n * Attachment download by link id (`GET /download/{attachment_link_id}`).\n *\n * **Required scope:** `attachments:read`\n *\n * @see https://dev.frontapp.com/reference/download-attachment\n */\nexport class FrontDownloads {\n private readonly base: FrontBase;\n\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * Download an attachment (`GET /download/{attachment_link_id}`). Returns the raw `Response` (binary body not parsed as JSON).\n *\n * **Required scope:** `attachments:read`\n */\n async download(attachmentLinkId: string): Promise<Response> {\n const path = FrontBase.expandPath(\"/download/{attachment_link_id}\", {\n attachment_link_id: attachmentLinkId,\n });\n return await this.base.requestWithoutParsingBody(\"GET\", path);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\n\nexport type DeleteDraft = components[\"schemas\"][\"DeleteDraft\"];\nexport type EditDraft = components[\"schemas\"][\"EditDraft\"];\n\ntype EditDraftMessageResponse =\n operations[\"edit-draft\"][\"responses\"][200][\"content\"][\"application/json\"];\n\n/**\n * Standalone draft delete and edit (`DELETE /drafts/{draft_id}`, `PATCH /drafts/{message_id}/`).\n *\n * @see https://dev.frontapp.com/reference/delete-draft\n * @see https://dev.frontapp.com/reference/edit-draft\n */\nexport class FrontDrafts {\n private readonly base: FrontBase;\n\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * Delete a draft (`DELETE /drafts/{draft_id}`).\n *\n * **Required scope:** `drafts:delete`\n */\n async delete(draftId: string, body?: DeleteDraft): Promise<void> {\n const path = FrontBase.expandPath(\"/drafts/{draft_id}\", {\n draft_id: draftId,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body });\n }\n\n /**\n * Edit a draft (`PATCH /drafts/{message_id}/`). The path keeps a trailing slash after the message id.\n *\n * **Required scope:** `drafts:write`\n */\n async edit(messageId: string, body: EditDraft): Promise<EditDraftMessageResponse> {\n const path = FrontBase.expandPath(\"/drafts/{message_id}/\", {\n message_id: messageId,\n });\n return await this.base.requestJson<EditDraftMessageResponse>(\"PATCH\", path, {\n body,\n });\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\n\ntype ListEventsQuery = NonNullable<operations[\"list-events\"][\"parameters\"][\"query\"]>;\ntype ListEventsResponse = components[\"responses\"][\"listOfEvents\"][\"content\"][\"application/json\"];\ntype GetEventResponse = components[\"responses\"][\"event\"][\"content\"][\"application/json\"];\n\nconst queryFromListEvents = (\n q?: ListEventsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\n/**\n * Company-wide activity events (`GET /events`, `GET /events/{event_id}`).\n *\n * @see https://dev.frontapp.com/reference/events\n */\nexport class FrontEvents {\n private readonly base: FrontBase;\n\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * List events (`GET /events`).\n *\n * **Required scope:** `events:*:read`\n */\n async list(query?: ListEventsQuery): Promise<WithNormalizedPagination<ListEventsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListEventsResponse>>(\n \"GET\",\n \"/events\",\n { query: queryFromListEvents(query) },\n );\n }\n\n /**\n * Fetch one event (`GET /events/{event_id}`).\n *\n * **Required scope:** `events:*:read`\n */\n async get(eventId: string): Promise<GetEventResponse> {\n const path = FrontBase.expandPath(\"/events/{event_id}\", {\n event_id: eventId,\n });\n return await this.base.requestJson<GetEventResponse>(\"GET\", path);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\n\nexport type InboxResponse = components[\"schemas\"][\"InboxResponse\"];\nexport type CreateInbox = components[\"schemas\"][\"CreateInbox\"];\nexport type ImportMessage = components[\"schemas\"][\"ImportMessage\"];\nexport type TeammateIds = components[\"schemas\"][\"TeammateIds\"];\n\ntype InboxSnapshot = InboxResponse & { id: string };\n\ntype ListInboxesResponse =\n operations[\"list-inboxes\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListInboxCustomFieldsResponse =\n operations[\"list-inbox-custom-fields\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListInboxChannelsResponse =\n operations[\"list-inbox-channels\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListInboxConversationsQuery = NonNullable<\n operations[\"list-inbox-conversations\"][\"parameters\"][\"query\"]\n>;\ntype ListInboxConversationsResponse =\n operations[\"list-inbox-conversations\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ImportInboxMessageResponse =\n operations[\"import-inbox-message\"][\"responses\"][202][\"content\"][\"application/json\"];\n\ntype ListInboxAccessResponse =\n operations[\"list-inbox-access\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromListInboxConversations = (\n q?: ListInboxConversationsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\nconst assertInboxId = (snapshot: InboxResponse): string => {\n const { id } = snapshot;\n if (id === undefined || id === \"\") {\n throw new Error(\"Inbox response missing id\");\n }\n return id;\n};\n\n/**\n * One inbox (`GET /inboxes/{inbox_id}`). There is no inbox `PATCH` in the OpenAPI spec; use {@link refresh} after changes.\n *\n * @see https://dev.frontapp.com/reference/inboxes\n */\nexport class FrontInboxes {\n private state: InboxSnapshot | undefined;\n private readonly base: FrontBase;\n private readonly inboxId: string | undefined;\n\n constructor(base: FrontBase, snapshot?: InboxResponse, inboxId?: string) {\n this.base = base;\n if (snapshot === undefined) {\n this.inboxId = inboxId;\n return;\n }\n const id = assertInboxId(snapshot);\n this.inboxId = id;\n this.state = structuredClone({ ...snapshot, id });\n }\n\n get id(): string {\n const id = this.state?.id ?? this.inboxId;\n if (id === undefined) {\n throw new Error(\"This inbox operation requires an ID.\");\n }\n return id;\n }\n\n get links(): InboxResponse[\"_links\"] {\n return this.requireState()._links;\n }\n\n /** Full inbox JSON from the last fetch or list/create response. */\n get data(): Readonly<InboxSnapshot> {\n return this.requireState();\n }\n\n private requireState(): InboxSnapshot {\n if (this.state === undefined) {\n throw new Error(\"This inbox operation requires fetched resource data.\");\n }\n return this.state;\n }\n\n private selfPath(): string {\n return FrontBase.expandPath(\"/inboxes/{inbox_id}\", { inbox_id: this.id });\n }\n\n /**\n * Fetch inbox (`GET /inboxes/{inbox_id}`).\n *\n * **Required scope:** `inboxes:read`\n */\n async refresh(): Promise<this> {\n const next = await this.base.requestJson<InboxResponse>(\"GET\", this.selfPath());\n const id = assertInboxId(next);\n this.state = structuredClone({ ...next, id });\n return this;\n }\n\n /**\n * List channels in this inbox (`GET /inboxes/{inbox_id}/channels`).\n *\n * **Required scope:** `channels:read`\n */\n async listChannels(\n inboxId?: string,\n ): Promise<WithNormalizedPagination<ListInboxChannelsResponse>> {\n if (inboxId !== undefined) {\n return await this.target(inboxId).listChannels();\n }\n const path = FrontBase.expandPath(\"/inboxes/{inbox_id}/channels\", {\n inbox_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListInboxChannelsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * List conversations in this inbox (`GET /inboxes/{inbox_id}/conversations`).\n *\n * **Required scope:** `conversations:read`\n */\n async listConversations(\n query?: ListInboxConversationsQuery,\n ): Promise<WithNormalizedPagination<ListInboxConversationsResponse>>;\n async listConversations(\n inboxId: string,\n query?: ListInboxConversationsQuery,\n ): Promise<WithNormalizedPagination<ListInboxConversationsResponse>>;\n async listConversations(\n inboxIdOrQuery?: string | ListInboxConversationsQuery,\n directQuery?: ListInboxConversationsQuery,\n ): Promise<WithNormalizedPagination<ListInboxConversationsResponse>> {\n if (typeof inboxIdOrQuery === \"string\") {\n return await this.target(inboxIdOrQuery).listConversations(directQuery);\n }\n const path = FrontBase.expandPath(\"/inboxes/{inbox_id}/conversations\", {\n inbox_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListInboxConversationsResponse>>(\n \"GET\",\n path,\n {\n query: queryFromListInboxConversations(inboxIdOrQuery),\n },\n );\n }\n\n /**\n * Import a message into this inbox (`POST /inboxes/{inbox_id}/imported_messages`).\n *\n * **Required scope:** `messages:write`\n */\n async importMessage(body: ImportMessage): Promise<ImportInboxMessageResponse>;\n async importMessage(inboxId: string, body: ImportMessage): Promise<ImportInboxMessageResponse>;\n async importMessage(\n inboxIdOrBody: string | ImportMessage,\n directBody?: ImportMessage,\n ): Promise<ImportInboxMessageResponse> {\n if (typeof inboxIdOrBody === \"string\") {\n return await this.target(inboxIdOrBody).importMessage(directBody ?? ({} as ImportMessage));\n }\n const path = FrontBase.expandPath(\"/inboxes/{inbox_id}/imported_messages\", {\n inbox_id: this.id,\n });\n return await this.base.requestJson<ImportInboxMessageResponse>(\"POST\", path, {\n body: inboxIdOrBody,\n });\n }\n\n /**\n * List teammates with access (`GET /inboxes/{inbox_id}/teammates`).\n *\n * **Required scope:** `teammates:read`\n */\n async listTeammateAccess(\n inboxId?: string,\n ): Promise<WithNormalizedPagination<ListInboxAccessResponse>> {\n if (inboxId !== undefined) {\n return await this.target(inboxId).listTeammateAccess();\n }\n const path = FrontBase.expandPath(\"/inboxes/{inbox_id}/teammates\", {\n inbox_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListInboxAccessResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Add teammate access (`POST /inboxes/{inbox_id}/teammates`). The API returns `204`.\n *\n * **Required scope:** `inboxes:write`\n */\n async addTeammateAccess(body: TeammateIds): Promise<void>;\n async addTeammateAccess(inboxId: string, body: TeammateIds): Promise<void>;\n async addTeammateAccess(\n inboxIdOrBody: string | TeammateIds,\n directBody?: TeammateIds,\n ): Promise<void> {\n if (typeof inboxIdOrBody === \"string\") {\n await this.target(inboxIdOrBody).addTeammateAccess(directBody ?? { teammate_ids: [] });\n return;\n }\n const path = FrontBase.expandPath(\"/inboxes/{inbox_id}/teammates\", {\n inbox_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body: inboxIdOrBody });\n }\n\n /**\n * Remove teammate access (`DELETE /inboxes/{inbox_id}/teammates`). The API returns `204`.\n *\n * **Required scope:** `inboxes:write`\n */\n async removeTeammateAccess(body: TeammateIds): Promise<void>;\n async removeTeammateAccess(inboxId: string, body: TeammateIds): Promise<void>;\n async removeTeammateAccess(\n inboxIdOrBody: string | TeammateIds,\n directBody?: TeammateIds,\n ): Promise<void> {\n if (typeof inboxIdOrBody === \"string\") {\n await this.target(inboxIdOrBody).removeTeammateAccess(directBody ?? { teammate_ids: [] });\n return;\n }\n const path = FrontBase.expandPath(\"/inboxes/{inbox_id}/teammates\", {\n inbox_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body: inboxIdOrBody });\n }\n /**\n * List inboxes (`GET /inboxes`).\n *\n * **Required scope:** `inboxes:read`\n */\n async list(): Promise<WithNormalizedPagination<ListInboxesResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListInboxesResponse>>(\n \"GET\",\n \"/inboxes\",\n );\n }\n\n /**\n * Create an inbox (`POST /inboxes`).\n *\n * **Required scope:** `inboxes:write`\n */\n async create(body: CreateInbox): Promise<FrontInboxes> {\n const data = await this.base.requestJson<InboxResponse>(\"POST\", \"/inboxes\", {\n body,\n });\n return new FrontInboxes(this.base, data);\n }\n\n /**\n * List custom fields available on inboxes (`GET /inboxes/custom_fields`).\n *\n * **Required scope:** `custom_fields:read`\n */\n async listCustomFields(): Promise<WithNormalizedPagination<ListInboxCustomFieldsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListInboxCustomFieldsResponse>>(\n \"GET\",\n \"/inboxes/custom_fields\",\n );\n }\n\n /**\n * Fetch one inbox (`GET /inboxes/{inbox_id}`).\n *\n * **Required scope:** `inboxes:read`\n */\n async get(inboxId: string): Promise<FrontInboxes> {\n return await this.target(inboxId).refresh();\n }\n\n /** Target an inbox by ID without fetching it first. */\n private target(inboxId: string): FrontInboxes {\n return new FrontInboxes(this.base, undefined, inboxId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\n\nexport type KnowledgeBaseCreate = components[\"schemas\"][\"KnowledgeBaseCreate\"];\nexport type KnowledgeBasePatch = components[\"schemas\"][\"KnowledgeBasePatch\"];\nexport type KnowledgeBaseSlimResponse = components[\"schemas\"][\"KnowledgeBaseSlimResponse\"];\nexport type KnowledgeBaseResponse = components[\"schemas\"][\"KnowledgeBaseResponse\"];\nexport type KnowledgeBaseArticleCreate = components[\"schemas\"][\"KnowledgeBaseArticleCreate\"];\nexport type KnowledgeBaseArticlePatch = components[\"schemas\"][\"KnowledgeBaseArticlePatch\"];\nexport type KnowledgeBaseArticleSlimResponse =\n components[\"schemas\"][\"KnowledgeBaseArticleSlimResponse\"];\nexport type KnowledgeBaseArticleResponse = components[\"schemas\"][\"KnowledgeBaseArticleResponse\"];\nexport type KnowledgeBaseCategoryCreate = components[\"schemas\"][\"KnowledgeBaseCategoryCreate\"];\nexport type KnowledgeBaseCategoryPatch = components[\"schemas\"][\"KnowledgeBaseCategoryPatch\"];\nexport type KnowledgeBaseCategorySlimResponse =\n components[\"schemas\"][\"KnowledgeBaseCategorySlimResponse\"];\nexport type KnowledgeBaseCategoryResponse = components[\"schemas\"][\"KnowledgeBaseCategoryResponse\"];\n\ntype ListKnowledgeBasesResponse =\n operations[\"list-knowledge-bases\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListArticlesInKnowledgeBaseQuery = NonNullable<\n operations[\"list-articles-in-a-knowledge-base\"][\"parameters\"][\"query\"]\n>;\ntype ListArticlesInKnowledgeBaseResponse =\n operations[\"list-articles-in-a-knowledge-base\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListCategoriesInKnowledgeBaseQuery = NonNullable<\n operations[\"list-categories-in-a-knowledge-base\"][\"parameters\"][\"query\"]\n>;\ntype ListCategoriesInKnowledgeBaseResponse =\n operations[\"list-categories-in-a-knowledge-base\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListArticlesInCategoryQuery = NonNullable<\n operations[\"list-articles-in-a-category\"][\"parameters\"][\"query\"]\n>;\ntype ListArticlesInCategoryResponse =\n operations[\"list-articles-in-a-category\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromPaged = (q?: {\n limit?: unknown;\n page_token?: unknown;\n}): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return Object.keys(out).length > 0 ? out : undefined;\n};\n\n/**\n * One knowledge base and its `/knowledge_bases/{knowledge_base_id}/…` subtree.\n */\nexport class FrontKnowledgeBases {\n private readonly base: FrontBase;\n private readonly knowledgeBaseId: string;\n private snapshot: KnowledgeBaseSlimResponse | KnowledgeBaseResponse | undefined;\n\n constructor(\n base: FrontBase,\n knowledgeBaseId?: string,\n snapshot?: KnowledgeBaseSlimResponse | KnowledgeBaseResponse,\n ) {\n this.base = base;\n this.knowledgeBaseId = knowledgeBaseId ?? \"\";\n this.snapshot = snapshot;\n }\n\n get id(): string {\n if (this.knowledgeBaseId.length === 0) {\n throw new Error(\"This knowledge base operation requires an ID.\");\n }\n return this.knowledgeBaseId;\n }\n\n /** Latest slim or full payload from {@link refresh} or constructors; `undefined` until loaded. */\n get data(): Readonly<KnowledgeBaseSlimResponse | KnowledgeBaseResponse> | undefined {\n return this.snapshot;\n }\n\n /**\n * `GET /knowledge_bases/{knowledge_base_id}` — replaces {@link data} with the slim response.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async refresh(): Promise<this> {\n const path = FrontBase.expandPath(\"/knowledge_bases/{knowledge_base_id}\", {\n knowledge_base_id: this.knowledgeBaseId,\n });\n this.snapshot = await this.base.requestJson<KnowledgeBaseSlimResponse>(\"GET\", path);\n return this;\n }\n\n /**\n * `GET /knowledge_bases/{knowledge_base_id}/content` (default locale).\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async getContentDefault(): Promise<KnowledgeBaseResponse> {\n const path = FrontBase.expandPath(\"/knowledge_bases/{knowledge_base_id}/content\", {\n knowledge_base_id: this.knowledgeBaseId,\n });\n return await this.base.requestJson<KnowledgeBaseResponse>(\"GET\", path);\n }\n\n /**\n * `PATCH /knowledge_bases/{knowledge_base_id}/content` (default locale).\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async updateContentDefault(body: KnowledgeBasePatch): Promise<KnowledgeBaseResponse> {\n const path = FrontBase.expandPath(\"/knowledge_bases/{knowledge_base_id}/content\", {\n knowledge_base_id: this.knowledgeBaseId,\n });\n return await this.base.requestJson<KnowledgeBaseResponse>(\"PATCH\", path, {\n body,\n });\n }\n\n /**\n * `GET /knowledge_bases/{knowledge_base_id}/locales/{locale}/content`.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async getContentLocale(locale: string): Promise<KnowledgeBaseResponse> {\n const path = FrontBase.expandPath(\n \"/knowledge_bases/{knowledge_base_id}/locales/{locale}/content\",\n { knowledge_base_id: this.knowledgeBaseId, locale },\n );\n return await this.base.requestJson<KnowledgeBaseResponse>(\"GET\", path);\n }\n\n /**\n * `PATCH /knowledge_bases/{knowledge_base_id}/locales/{locale}/content`.\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async updateContentLocale(\n locale: string,\n body: KnowledgeBasePatch,\n ): Promise<KnowledgeBaseResponse> {\n const path = FrontBase.expandPath(\n \"/knowledge_bases/{knowledge_base_id}/locales/{locale}/content\",\n { knowledge_base_id: this.knowledgeBaseId, locale },\n );\n return await this.base.requestJson<KnowledgeBaseResponse>(\"PATCH\", path, {\n body,\n });\n }\n\n /**\n * `GET /knowledge_bases/{knowledge_base_id}/articles`.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async listArticles(\n query?: ListArticlesInKnowledgeBaseQuery,\n ): Promise<WithNormalizedPagination<ListArticlesInKnowledgeBaseResponse>> {\n const path = FrontBase.expandPath(\"/knowledge_bases/{knowledge_base_id}/articles\", {\n knowledge_base_id: this.knowledgeBaseId,\n });\n return await this.base.requestJson<\n WithNormalizedPagination<ListArticlesInKnowledgeBaseResponse>\n >(\"GET\", path, { query: queryFromPaged(query) });\n }\n\n /**\n * `POST /knowledge_bases/{knowledge_base_id}/articles` (default locale).\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async createArticleDefault(body: KnowledgeBaseArticleCreate): Promise<FrontKnowledgeBaseArticle> {\n const path = FrontBase.expandPath(\"/knowledge_bases/{knowledge_base_id}/articles\", {\n knowledge_base_id: this.knowledgeBaseId,\n });\n const data = await this.base.requestJson<KnowledgeBaseArticleResponse>(\"POST\", path, { body });\n return new FrontKnowledgeBaseArticle(this.base, data.id, data);\n }\n\n /**\n * `POST /knowledge_bases/{knowledge_base_id}/locales/{locale}/articles`.\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async createArticleLocale(\n locale: string,\n body: KnowledgeBaseArticleCreate,\n ): Promise<FrontKnowledgeBaseArticle> {\n const path = FrontBase.expandPath(\n \"/knowledge_bases/{knowledge_base_id}/locales/{locale}/articles\",\n { knowledge_base_id: this.knowledgeBaseId, locale },\n );\n const data = await this.base.requestJson<KnowledgeBaseArticleResponse>(\"POST\", path, { body });\n return new FrontKnowledgeBaseArticle(this.base, data.id, data);\n }\n\n /**\n * `GET /knowledge_bases/{knowledge_base_id}/categories`.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async listCategories(\n query?: ListCategoriesInKnowledgeBaseQuery,\n ): Promise<WithNormalizedPagination<ListCategoriesInKnowledgeBaseResponse>> {\n const path = FrontBase.expandPath(\"/knowledge_bases/{knowledge_base_id}/categories\", {\n knowledge_base_id: this.knowledgeBaseId,\n });\n return await this.base.requestJson<\n WithNormalizedPagination<ListCategoriesInKnowledgeBaseResponse>\n >(\"GET\", path, { query: queryFromPaged(query) });\n }\n\n /**\n * `POST /knowledge_bases/{knowledge_base_id}/categories` (default locale).\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async createCategoryDefault(\n body: KnowledgeBaseCategoryCreate,\n ): Promise<FrontKnowledgeBaseCategory> {\n const path = FrontBase.expandPath(\"/knowledge_bases/{knowledge_base_id}/categories\", {\n knowledge_base_id: this.knowledgeBaseId,\n });\n const data = await this.base.requestJson<KnowledgeBaseCategoryResponse>(\"POST\", path, { body });\n return new FrontKnowledgeBaseCategory(this.base, data.id, data);\n }\n\n /**\n * `POST /knowledge_bases/{knowledge_base_id}/locales/{locale}/categories`.\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async createCategoryLocale(\n locale: string,\n body: KnowledgeBaseCategoryCreate,\n ): Promise<FrontKnowledgeBaseCategory> {\n const path = FrontBase.expandPath(\n \"/knowledge_bases/{knowledge_base_id}/locales/{locale}/categories\",\n { knowledge_base_id: this.knowledgeBaseId, locale },\n );\n const data = await this.base.requestJson<KnowledgeBaseCategoryResponse>(\"POST\", path, { body });\n return new FrontKnowledgeBaseCategory(this.base, data.id, data);\n }\n\n /** List knowledge bases (`GET /knowledge_bases`). */\n async list(): Promise<WithNormalizedPagination<ListKnowledgeBasesResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListKnowledgeBasesResponse>>(\n \"GET\",\n \"/knowledge_bases\",\n );\n }\n\n /** Create a knowledge base (`POST /knowledge_bases`). */\n async create(body: KnowledgeBaseCreate): Promise<FrontKnowledgeBases> {\n const created = await this.base.requestJson<KnowledgeBaseResponse>(\"POST\", \"/knowledge_bases\", {\n body,\n });\n return new FrontKnowledgeBases(this.base, created.id, created);\n }\n\n /** Fetch a knowledge base (`GET /knowledge_bases/{knowledge_base_id}`). */\n async get(knowledgeBaseId: string): Promise<FrontKnowledgeBases> {\n const knowledgeBase = this.target(knowledgeBaseId);\n await knowledgeBase.refresh();\n return knowledgeBase;\n }\n\n /** Target a knowledge base by id without calling the API first. */\n private target(knowledgeBaseId: string): FrontKnowledgeBases {\n return new FrontKnowledgeBases(this.base, knowledgeBaseId);\n }\n\n /** Target a knowledge base article by id without calling the API first. */\n article(articleId: string): FrontKnowledgeBaseArticle {\n return new FrontKnowledgeBaseArticle(this.base, articleId);\n }\n\n /** Target a knowledge base category by id without calling the API first. */\n category(categoryId: string): FrontKnowledgeBaseCategory {\n return new FrontKnowledgeBaseCategory(this.base, categoryId);\n }\n}\n\n/**\n * One knowledge base article (`/knowledge_base_articles/{article_id}/…`).\n */\nexport class FrontKnowledgeBaseArticle {\n private readonly base: FrontBase;\n private readonly articleId: string;\n private snapshot: KnowledgeBaseArticleSlimResponse | KnowledgeBaseArticleResponse | undefined;\n\n constructor(\n base: FrontBase,\n articleId: string,\n snapshot?: KnowledgeBaseArticleSlimResponse | KnowledgeBaseArticleResponse,\n ) {\n this.base = base;\n this.articleId = articleId;\n this.snapshot = snapshot;\n }\n\n get id(): string {\n return this.articleId;\n }\n\n get data():\n | Readonly<KnowledgeBaseArticleSlimResponse | KnowledgeBaseArticleResponse>\n | undefined {\n return this.snapshot;\n }\n\n /**\n * `GET /knowledge_base_articles/{article_id}`.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async refresh(): Promise<this> {\n const path = FrontBase.expandPath(\"/knowledge_base_articles/{article_id}\", {\n article_id: this.articleId,\n });\n this.snapshot = await this.base.requestJson<KnowledgeBaseArticleSlimResponse>(\"GET\", path);\n return this;\n }\n\n /**\n * `DELETE /knowledge_base_articles/{article_id}`.\n *\n * **Required scope:** `knowledge_bases:delete`\n */\n async delete(): Promise<KnowledgeBaseArticleSlimResponse> {\n const path = FrontBase.expandPath(\"/knowledge_base_articles/{article_id}\", {\n article_id: this.articleId,\n });\n return await this.base.requestJson<KnowledgeBaseArticleSlimResponse>(\"DELETE\", path);\n }\n\n /**\n * `GET /knowledge_base_articles/{article_id}/content` (default locale).\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async getContentDefault(): Promise<KnowledgeBaseArticleResponse> {\n const path = FrontBase.expandPath(\"/knowledge_base_articles/{article_id}/content\", {\n article_id: this.articleId,\n });\n return await this.base.requestJson<KnowledgeBaseArticleResponse>(\"GET\", path);\n }\n\n /**\n * `PATCH /knowledge_base_articles/{article_id}/content` (default locale).\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async updateContentDefault(\n body: KnowledgeBaseArticlePatch,\n ): Promise<KnowledgeBaseArticleResponse> {\n const path = FrontBase.expandPath(\"/knowledge_base_articles/{article_id}/content\", {\n article_id: this.articleId,\n });\n return await this.base.requestJson<KnowledgeBaseArticleResponse>(\"PATCH\", path, {\n body,\n });\n }\n\n /**\n * `GET /knowledge_base_articles/{article_id}/locales/{locale}/content`.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async getContentLocale(locale: string): Promise<KnowledgeBaseArticleResponse> {\n const path = FrontBase.expandPath(\n \"/knowledge_base_articles/{article_id}/locales/{locale}/content\",\n { article_id: this.articleId, locale },\n );\n return await this.base.requestJson<KnowledgeBaseArticleResponse>(\"GET\", path);\n }\n\n /**\n * `PATCH /knowledge_base_articles/{article_id}/locales/{locale}/content`.\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async updateContentLocale(\n locale: string,\n body: KnowledgeBaseArticlePatch,\n ): Promise<KnowledgeBaseArticleResponse> {\n const path = FrontBase.expandPath(\n \"/knowledge_base_articles/{article_id}/locales/{locale}/content\",\n { article_id: this.articleId, locale },\n );\n return await this.base.requestJson<KnowledgeBaseArticleResponse>(\"PATCH\", path, {\n body,\n });\n }\n\n /**\n * `GET /knowledge_base_articles/{article_id}/download/{attachment_id}` — raw {@link Response} (binary).\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async downloadAttachment(attachmentId: string): Promise<Response> {\n const path = FrontBase.expandPath(\n \"/knowledge_base_articles/{article_id}/download/{attachment_id}\",\n { article_id: this.articleId, attachment_id: attachmentId },\n );\n return await this.base.requestWithoutParsingBody(\"GET\", path);\n }\n}\n\n/**\n * One knowledge base category (`/knowledge_base_categories/{category_id}/…`).\n */\nexport class FrontKnowledgeBaseCategory {\n private readonly base: FrontBase;\n private readonly categoryId: string;\n private snapshot: KnowledgeBaseCategorySlimResponse | KnowledgeBaseCategoryResponse | undefined;\n\n constructor(\n base: FrontBase,\n categoryId: string,\n snapshot?: KnowledgeBaseCategorySlimResponse | KnowledgeBaseCategoryResponse,\n ) {\n this.base = base;\n this.categoryId = categoryId;\n this.snapshot = snapshot;\n }\n\n get id(): string {\n return this.categoryId;\n }\n\n get data():\n | Readonly<KnowledgeBaseCategorySlimResponse | KnowledgeBaseCategoryResponse>\n | undefined {\n return this.snapshot;\n }\n\n /**\n * `GET /knowledge_base_categories/{category_id}`.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async refresh(): Promise<this> {\n const path = FrontBase.expandPath(\"/knowledge_base_categories/{category_id}\", {\n category_id: this.categoryId,\n });\n this.snapshot = await this.base.requestJson<KnowledgeBaseCategorySlimResponse>(\"GET\", path);\n return this;\n }\n\n /**\n * `DELETE /knowledge_base_categories/{category_id}`.\n *\n * **Required scope:** `knowledge_bases:delete`\n */\n async delete(): Promise<void> {\n const path = FrontBase.expandPath(\"/knowledge_base_categories/{category_id}\", {\n category_id: this.categoryId,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path);\n }\n\n /**\n * `GET /knowledge_base_categories/{category_id}/articles`.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async listArticles(\n query?: ListArticlesInCategoryQuery,\n ): Promise<WithNormalizedPagination<ListArticlesInCategoryResponse>> {\n const path = FrontBase.expandPath(\"/knowledge_base_categories/{category_id}/articles\", {\n category_id: this.categoryId,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListArticlesInCategoryResponse>>(\n \"GET\",\n path,\n { query: queryFromPaged(query) },\n );\n }\n\n /**\n * `GET /knowledge_base_categories/{category_id}/content` (default locale).\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async getContentDefault(): Promise<KnowledgeBaseCategoryResponse> {\n const path = FrontBase.expandPath(\"/knowledge_base_categories/{category_id}/content\", {\n category_id: this.categoryId,\n });\n return await this.base.requestJson<KnowledgeBaseCategoryResponse>(\"GET\", path);\n }\n\n /**\n * `PATCH /knowledge_base_categories/{category_id}/content` (default locale).\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async updateContentDefault(\n body: KnowledgeBaseCategoryPatch,\n ): Promise<KnowledgeBaseCategoryResponse> {\n const path = FrontBase.expandPath(\"/knowledge_base_categories/{category_id}/content\", {\n category_id: this.categoryId,\n });\n return await this.base.requestJson<KnowledgeBaseCategoryResponse>(\"PATCH\", path, {\n body,\n });\n }\n\n /**\n * `GET /knowledge_base_categories/{category_id}/locales/{locale}/content`.\n *\n * **Required scope:** `knowledge_bases:read`\n */\n async getContentLocale(locale: string): Promise<KnowledgeBaseCategoryResponse> {\n const path = FrontBase.expandPath(\n \"/knowledge_base_categories/{category_id}/locales/{locale}/content\",\n { category_id: this.categoryId, locale },\n );\n return await this.base.requestJson<KnowledgeBaseCategoryResponse>(\"GET\", path);\n }\n\n /**\n * `PATCH /knowledge_base_categories/{category_id}/locales/{locale}/content`.\n *\n * **Required scope:** `knowledge_bases:write`\n */\n async updateContentLocale(\n locale: string,\n body: KnowledgeBaseCategoryPatch,\n ): Promise<KnowledgeBaseCategoryResponse> {\n const path = FrontBase.expandPath(\n \"/knowledge_base_categories/{category_id}/locales/{locale}/content\",\n { category_id: this.categoryId, locale },\n );\n return await this.base.requestJson<KnowledgeBaseCategoryResponse>(\"PATCH\", path, {\n body,\n });\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type LinkResponse = components[\"schemas\"][\"LinkResponse\"];\nexport type CreateLink = components[\"schemas\"][\"CreateLink\"];\nexport type UpdateLink = components[\"schemas\"][\"UpdateLink\"];\n\ntype ListLinksQuery = NonNullable<operations[\"list-links\"][\"parameters\"][\"query\"]>;\ntype ListLinksResponse = operations[\"list-links\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListLinkCustomFieldsResponse =\n operations[\"list-link-custom-fields\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListLinkConversationsQuery = NonNullable<\n operations[\"list-link-conversations\"][\"parameters\"][\"query\"]\n>;\ntype ListLinkConversationsResponse =\n operations[\"list-link-conversations\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromListLinks = (q?: ListLinksQuery): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromListLinkConversations = (\n q?: ListLinkConversationsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst mergeLinkSnapshot = (current: LinkResponse, patch: Partial<UpdateLink>): LinkResponse => {\n const filtered = Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n ) as Partial<LinkResponse>;\n return { ...current, ...filtered };\n};\n\nconst linkResponseToUpdateBody = (state: LinkResponse): UpdateLink => ({\n name: state.name,\n});\n\n/**\n * One link (`/links/{link_id}` and related routes).\n *\n * **Required scopes:** `links:read` (read), `links:write` (update).\n *\n * @see https://dev.frontapp.com/reference/links\n */\nexport class FrontLinks extends FrontResource<LinkResponse, UpdateLink> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/links/{link_id}\", { link_id: this.id });\n }\n\n get name(): string {\n return this.pick(\"name\");\n }\n\n set name(value: string) {\n this.assign(\"name\", value);\n }\n\n get type(): string {\n return this.pick(\"type\");\n }\n\n get externalUrl(): string {\n return this.pick(\"external_url\");\n }\n\n get customFields(): LinkResponse[\"custom_fields\"] {\n return this.pick(\"custom_fields\");\n }\n\n /**\n * The Front API does not expose `DELETE /links/{link_id}` on this path.\n */\n override delete(linkId?: string): Promise<void> {\n if (linkId !== undefined) {\n return this.target(linkId).delete();\n }\n return Promise.reject(\n new Error(`Deleting link ${this.id} is not supported by the Front REST API for this path.`),\n );\n }\n\n toUpdateBody(): UpdateLink {\n return linkResponseToUpdateBody(this.state);\n }\n\n /**\n * `PATCH /links/{link_id}`. Returns `204`; local state is merged from the body.\n *\n * **Required scope:** `links:write`\n */\n async update(body: UpdateLink | Partial<UpdateLink>): Promise<void>;\n async update(linkId: string, body: UpdateLink | Partial<UpdateLink>): Promise<void>;\n async update(\n bodyOrLinkId: UpdateLink | Partial<UpdateLink> | string,\n directBody?: UpdateLink | Partial<UpdateLink>,\n ): Promise<void> {\n if (typeof bodyOrLinkId === \"string\") {\n await this.target(bodyOrLinkId).update(directBody ?? {});\n return;\n }\n await this.patchNoContent(bodyOrLinkId, mergeLinkSnapshot);\n }\n\n /**\n * `GET /links/{link_id}/conversations`.\n *\n * **Required scope:** `conversations:read`\n */\n async listConversations(\n query?: ListLinkConversationsQuery,\n ): Promise<WithNormalizedPagination<ListLinkConversationsResponse>>;\n async listConversations(\n linkId: string,\n query?: ListLinkConversationsQuery,\n ): Promise<WithNormalizedPagination<ListLinkConversationsResponse>>;\n async listConversations(\n queryOrLinkId?: ListLinkConversationsQuery | string,\n directQuery?: ListLinkConversationsQuery,\n ): Promise<WithNormalizedPagination<ListLinkConversationsResponse>> {\n if (typeof queryOrLinkId === \"string\") {\n return await this.target(queryOrLinkId).listConversations(directQuery);\n }\n const path = FrontBase.expandPath(\"/links/{link_id}/conversations\", {\n link_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListLinkConversationsResponse>>(\n \"GET\",\n path,\n { query: queryFromListLinkConversations(queryOrLinkId) },\n );\n }\n /**\n * `GET /links`.\n *\n * **Required scope:** `links:read`\n */\n async list(query?: ListLinksQuery): Promise<WithNormalizedPagination<ListLinksResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListLinksResponse>>(\n \"GET\",\n \"/links\",\n { query: queryFromListLinks(query) },\n );\n }\n\n /**\n * `POST /links`.\n *\n * **Required scope:** `links:write`\n */\n async create(body: CreateLink): Promise<FrontLinks> {\n const data = await this.base.requestJson<LinkResponse>(\"POST\", \"/links\", {\n body,\n });\n return new FrontLinks(this.base, data);\n }\n\n /**\n * `GET /links/custom_fields`.\n *\n * **Required scope:** `custom_fields:read`\n */\n async listCustomFields(): Promise<WithNormalizedPagination<ListLinkCustomFieldsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListLinkCustomFieldsResponse>>(\n \"GET\",\n \"/links/custom_fields\",\n );\n }\n\n /**\n * `GET /links/{link_id}`.\n *\n * **Required scope:** `links:read`\n */\n async get(linkId: string): Promise<FrontLinks> {\n return await this.target(linkId).refresh();\n }\n\n /** Target a link by ID without fetching it first. */\n private target(linkId: string): FrontLinks {\n return new FrontLinks(this.base, undefined, linkId);\n }\n}\n","import type { FrontBase } from \"../base\";\nimport type { components } from \"../gen/schema.gen\";\n\nexport type IdentityResponse = components[\"schemas\"][\"IdentityResponse\"];\n\ntype ApiTokenDetailsResponse = components[\"responses\"][\"identity\"][\"content\"][\"application/json\"];\n\n/**\n * API token / identity (`GET /me`).\n *\n * @see https://dev.frontapp.com/reference/me\n */\nexport class FrontMe {\n private readonly base: FrontBase;\n\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * Fetch API token details (`GET /me`).\n */\n async details(): Promise<ApiTokenDetailsResponse> {\n return await this.base.requestJson<ApiTokenDetailsResponse>(\"GET\", \"/me\");\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type MessageTemplateResponse = components[\"schemas\"][\"MessageTemplateResponse\"];\nexport type CreateSharedMessageTemplate = components[\"schemas\"][\"CreateSharedMessageTemplate\"];\nexport type UpdateMessageTemplate = components[\"schemas\"][\"UpdateMessageTemplate\"];\n\ntype ListMessageTemplatesQuery = NonNullable<\n operations[\"list-message-templates\"][\"parameters\"][\"query\"]\n>;\ntype ListMessageTemplatesResponse =\n components[\"responses\"][\"listOfCannedAnswers\"][\"content\"][\"application/json\"];\n\nconst queryFromListMessageTemplates = (\n q?: ListMessageTemplatesQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst templateResponseToUpdateBody = (state: MessageTemplateResponse): UpdateMessageTemplate => {\n const out: UpdateMessageTemplate = {\n body: state.body,\n name: state.name,\n subject: state.subject === null ? undefined : state.subject,\n };\n if (state.inbox_ids !== null) {\n out.inbox_ids = state.inbox_ids;\n }\n return out;\n};\n\n/**\n * One message template (`/message_templates/{message_template_id}`).\n *\n * @see https://dev.frontapp.com/reference/message-templates\n */\nexport class FrontMessageTemplates extends FrontResource<\n MessageTemplateResponse,\n UpdateMessageTemplate\n> {\n private folderIdForUpdate: string | null | undefined;\n\n constructor(base: FrontBase, snapshot?: MessageTemplateResponse, messageTemplateId?: string) {\n super(base, snapshot, messageTemplateId);\n this.folderIdForUpdate = undefined;\n }\n\n protected override onAfterRefresh(): void {\n this.folderIdForUpdate = undefined;\n }\n\n protected selfPath(): string {\n return FrontBase.expandPath(\"/message_templates/{message_template_id}\", {\n message_template_id: this.id,\n });\n }\n\n get name(): string {\n return this.pick(\"name\");\n }\n\n set name(value: string) {\n this.assign(\"name\", value);\n }\n\n get subject(): string | null {\n return this.pick(\"subject\");\n }\n\n set subject(value: string | null) {\n this.assign(\"subject\", value);\n }\n\n get body(): string {\n return this.pick(\"body\");\n }\n\n set body(value: string) {\n this.assign(\"body\", value);\n }\n\n get isAvailableForAllInboxes(): boolean {\n return this.pick(\"is_available_for_all_inboxes\");\n }\n\n get inboxIds(): string[] | null {\n return this.pick(\"inbox_ids\");\n }\n\n set inboxIds(value: string[] | null) {\n this.assign(\"inbox_ids\", value);\n }\n\n /**\n * Parent folder id for `PATCH` only (not returned as an id field on `GET`).\n */\n get folderId(): string | null | undefined {\n return this.folderIdForUpdate;\n }\n\n set folderId(value: string | null | undefined) {\n this.folderIdForUpdate = value;\n }\n\n toUpdateBody(): UpdateMessageTemplate {\n const body = templateResponseToUpdateBody(this.state);\n if (this.folderIdForUpdate !== undefined) {\n body.folder_id = this.folderIdForUpdate ?? undefined;\n }\n return body;\n }\n\n async update(body: UpdateMessageTemplate | Partial<UpdateMessageTemplate>): Promise<void>;\n async update(\n messageTemplateId: string,\n body: UpdateMessageTemplate | Partial<UpdateMessageTemplate>,\n ): Promise<void>;\n async update(\n bodyOrMessageTemplateId: UpdateMessageTemplate | Partial<UpdateMessageTemplate> | string,\n directBody?: UpdateMessageTemplate | Partial<UpdateMessageTemplate>,\n ): Promise<void> {\n if (typeof bodyOrMessageTemplateId === \"string\") {\n await this.target(bodyOrMessageTemplateId).update(directBody ?? {});\n return;\n }\n await this.patchReplaceFromResponse(bodyOrMessageTemplateId);\n if (\"folder_id\" in bodyOrMessageTemplateId) {\n this.folderIdForUpdate =\n bodyOrMessageTemplateId.folder_id === null ||\n bodyOrMessageTemplateId.folder_id === undefined\n ? undefined\n : bodyOrMessageTemplateId.folder_id;\n }\n }\n\n override async delete(messageTemplateId?: string): Promise<void> {\n if (messageTemplateId === undefined) {\n await super.delete();\n return;\n }\n await this.target(messageTemplateId).delete();\n }\n\n /**\n * Download an attachment (`GET /message_templates/{message_template_id}/download/{attachment_link_id}`).\n *\n * **Required scope:** `attachments:read`\n */\n async downloadAttachment(\n attachmentLinkIdOrMessageTemplateId: string,\n directAttachmentLinkId?: string,\n ): Promise<Response> {\n if (directAttachmentLinkId !== undefined) {\n return await this.target(attachmentLinkIdOrMessageTemplateId).downloadAttachment(\n directAttachmentLinkId,\n );\n }\n const path = FrontBase.expandPath(\n \"/message_templates/{message_template_id}/download/{attachment_link_id}\",\n {\n attachment_link_id: attachmentLinkIdOrMessageTemplateId,\n message_template_id: this.id,\n },\n );\n return await this.base.requestWithoutParsingBody(\"GET\", path);\n }\n /**\n * Message templates (`/message_templates`) collection operations.\n *\n * @see https://dev.frontapp.com/reference/message-templates\n */\n /**\n * List message templates (`GET /message_templates`).\n *\n * **Required scope:** `message_templates:read`\n */\n async list(\n query?: ListMessageTemplatesQuery,\n ): Promise<WithNormalizedPagination<ListMessageTemplatesResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListMessageTemplatesResponse>>(\n \"GET\",\n \"/message_templates\",\n {\n query: queryFromListMessageTemplates(query),\n },\n );\n }\n\n /**\n * Create a message template (`POST /message_templates`).\n *\n * **Required scope:** `message_templates:write`\n */\n async create(body: CreateSharedMessageTemplate): Promise<FrontMessageTemplates> {\n const data = await this.base.requestJson<MessageTemplateResponse>(\n \"POST\",\n \"/message_templates\",\n { body },\n );\n return new FrontMessageTemplates(this.base, data);\n }\n\n /**\n * Fetch one message template (`GET /message_templates/{message_template_id}`).\n *\n * **Required scope:** `message_templates:read`\n */\n async get(messageTemplateId: string): Promise<FrontMessageTemplates> {\n return await this.target(messageTemplateId).refresh();\n }\n\n /** Target a message template by id without calling the API first. */\n private target(messageTemplateId: string): FrontMessageTemplates {\n return new FrontMessageTemplates(this.base, undefined, messageTemplateId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\nimport { FrontMessageTemplates } from \"./message-templates\";\n\nexport type MessageTemplateFolderResponse = components[\"schemas\"][\"MessageTemplateFolderResponse\"];\nexport type CreateMessageTemplateFolder = components[\"schemas\"][\"CreateMessageTemplateFolder\"];\nexport type CreateMessageTemplateFolderAsChild =\n components[\"schemas\"][\"CreateMessageTemplateFolderAsChild\"];\nexport type UpdateMessageTemplateFolder = components[\"schemas\"][\"UpdateMessageTemplateFolder\"];\n\ntype ListFoldersQuery = NonNullable<operations[\"list-folders\"][\"parameters\"][\"query\"]>;\ntype ListFoldersResponse =\n components[\"responses\"][\"listOfCannedAnswerFolders\"][\"content\"][\"application/json\"];\n\ntype AcceptedFolderDeletionBody =\n components[\"responses\"][\"acceptedCannedAnswerFolderDeletion\"][\"content\"][\"application/json\"];\n\nconst queryFromListFolders = (\n q?: ListFoldersQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst folderResponseToUpdateBody = (\n state: MessageTemplateFolderResponse,\n parentFolderId: string | null | undefined,\n): UpdateMessageTemplateFolder => {\n const body: UpdateMessageTemplateFolder = { name: state.name };\n if (parentFolderId !== undefined) {\n body.parent_folder_id = parentFolderId ?? undefined;\n }\n return body;\n};\n\n/**\n * One message template folder (`/message_template_folders/{message_template_folder_id}` and child routes).\n *\n * @see https://dev.frontapp.com/reference/message-template-folders\n */\nexport class FrontMessageTemplateFolders extends FrontResource<\n MessageTemplateFolderResponse,\n UpdateMessageTemplateFolder\n> {\n private parentFolderIdForUpdate: string | null | undefined;\n\n constructor(base: FrontBase, snapshot?: MessageTemplateFolderResponse, folderId?: string) {\n super(base, snapshot, folderId);\n this.parentFolderIdForUpdate = undefined;\n }\n\n protected override onAfterRefresh(): void {\n this.parentFolderIdForUpdate = undefined;\n }\n\n protected selfPath(): string {\n return FrontBase.expandPath(\"/message_template_folders/{message_template_folder_id}\", {\n message_template_folder_id: this.id,\n });\n }\n\n get name(): string {\n return this.pick(\"name\");\n }\n\n set name(value: string) {\n this.assign(\"name\", value);\n }\n\n /**\n * Parent folder id for `PATCH` only (OpenAPI update payload).\n */\n get parentFolderId(): string | null | undefined {\n return this.parentFolderIdForUpdate;\n }\n\n set parentFolderId(value: string | null | undefined) {\n this.parentFolderIdForUpdate = value;\n }\n\n toUpdateBody(): UpdateMessageTemplateFolder {\n return folderResponseToUpdateBody(this.state, this.parentFolderIdForUpdate);\n }\n\n async update(\n body: UpdateMessageTemplateFolder | Partial<UpdateMessageTemplateFolder>,\n ): Promise<void>;\n async update(\n folderId: string,\n body: UpdateMessageTemplateFolder | Partial<UpdateMessageTemplateFolder>,\n ): Promise<void>;\n async update(\n bodyOrFolderId: UpdateMessageTemplateFolder | Partial<UpdateMessageTemplateFolder> | string,\n directBody?: UpdateMessageTemplateFolder | Partial<UpdateMessageTemplateFolder>,\n ): Promise<void> {\n if (typeof bodyOrFolderId === \"string\") {\n await this.target(bodyOrFolderId).update(directBody ?? {});\n return;\n }\n await this.patchReplaceFromResponse(bodyOrFolderId);\n if (\"parent_folder_id\" in bodyOrFolderId) {\n this.parentFolderIdForUpdate =\n bodyOrFolderId.parent_folder_id === null || bodyOrFolderId.parent_folder_id === undefined\n ? undefined\n : bodyOrFolderId.parent_folder_id;\n }\n }\n\n /**\n * Delete this folder (`DELETE /message_template_folders/{message_template_folder_id}`). Returns `202` with a small JSON body (handled internally).\n *\n * **Required scope:** `message_templates:delete`\n */\n override async delete(folderId?: string): Promise<void> {\n if (folderId !== undefined) {\n await this.target(folderId).delete();\n return;\n }\n await this.base.requestJson<AcceptedFolderDeletionBody>(\"DELETE\", this.selfPath());\n }\n\n /**\n * List child folders (`GET /message_template_folders/{message_template_folder_id}/message_template_folders`).\n *\n * **Required scope:** `message_templates:read`\n */\n async listChildFolders(\n folderId?: string,\n ): Promise<WithNormalizedPagination<ListFoldersResponse>> {\n if (folderId !== undefined) {\n return await this.target(folderId).listChildFolders();\n }\n const path = FrontBase.expandPath(\n \"/message_template_folders/{message_template_folder_id}/message_template_folders\",\n { message_template_folder_id: this.id },\n );\n return await this.base.requestJson<WithNormalizedPagination<ListFoldersResponse>>(\"GET\", path);\n }\n\n /**\n * Create a child folder (`POST /message_template_folders/{message_template_folder_id}/message_template_folders`).\n *\n * **Required scope:** `message_templates:write`\n */\n async createChildFolder(\n body: CreateMessageTemplateFolderAsChild,\n ): Promise<FrontMessageTemplateFolders>;\n async createChildFolder(\n folderId: string,\n body: CreateMessageTemplateFolderAsChild,\n ): Promise<FrontMessageTemplateFolders>;\n async createChildFolder(\n bodyOrFolderId: CreateMessageTemplateFolderAsChild | string,\n directBody?: CreateMessageTemplateFolderAsChild,\n ): Promise<FrontMessageTemplateFolders> {\n if (typeof bodyOrFolderId === \"string\") {\n if (directBody === undefined) {\n throw new Error(\"Creating a child folder requires a request body.\");\n }\n return await this.target(bodyOrFolderId).createChildFolder(directBody);\n }\n const path = FrontBase.expandPath(\n \"/message_template_folders/{message_template_folder_id}/message_template_folders\",\n { message_template_folder_id: this.id },\n );\n const data = await this.base.requestJson<MessageTemplateFolderResponse>(\"POST\", path, {\n body: bodyOrFolderId,\n });\n return new FrontMessageTemplateFolders(this.base, data);\n }\n\n /**\n * List child templates (`GET /message_template_folders/{message_template_folder_id}/message_templates`).\n * The OpenAPI spec types the `200` body like {@link listChildFolders}; callers should rely on the live API shape.\n *\n * **Required scope:** `message_templates:read`\n */\n async listChildTemplates(\n folderId?: string,\n ): Promise<WithNormalizedPagination<ListFoldersResponse>> {\n if (folderId !== undefined) {\n return await this.target(folderId).listChildTemplates();\n }\n const path = FrontBase.expandPath(\n \"/message_template_folders/{message_template_folder_id}/message_templates\",\n { message_template_folder_id: this.id },\n );\n return await this.base.requestJson<WithNormalizedPagination<ListFoldersResponse>>(\"GET\", path);\n }\n\n /**\n * Create a child template (`POST /message_template_folders/{message_template_folder_id}/message_templates`).\n *\n * **Required scope:** `message_templates:write`\n */\n async createChildTemplate(\n body: components[\"schemas\"][\"CreateMessageTemplateAsChild\"],\n ): Promise<FrontMessageTemplates>;\n async createChildTemplate(\n folderId: string,\n body: components[\"schemas\"][\"CreateMessageTemplateAsChild\"],\n ): Promise<FrontMessageTemplates>;\n async createChildTemplate(\n bodyOrFolderId: components[\"schemas\"][\"CreateMessageTemplateAsChild\"] | string,\n directBody?: components[\"schemas\"][\"CreateMessageTemplateAsChild\"],\n ): Promise<FrontMessageTemplates> {\n if (typeof bodyOrFolderId === \"string\") {\n if (directBody === undefined) {\n throw new Error(\"Creating a child template requires a request body.\");\n }\n return await this.target(bodyOrFolderId).createChildTemplate(directBody);\n }\n const path = FrontBase.expandPath(\n \"/message_template_folders/{message_template_folder_id}/message_templates\",\n { message_template_folder_id: this.id },\n );\n const data = await this.base.requestJson<components[\"schemas\"][\"MessageTemplateResponse\"]>(\n \"POST\",\n path,\n { body: bodyOrFolderId },\n );\n return new FrontMessageTemplates(this.base, data);\n }\n\n /**\n * List folders (`GET /message_template_folders`).\n *\n * **Required scope:** `message_templates:read`\n */\n async list(query?: ListFoldersQuery): Promise<WithNormalizedPagination<ListFoldersResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListFoldersResponse>>(\n \"GET\",\n \"/message_template_folders\",\n {\n query: queryFromListFolders(query),\n },\n );\n }\n\n /**\n * Create a folder (`POST /message_template_folders`).\n *\n * **Required scope:** `message_templates:write`\n */\n async create(body: CreateMessageTemplateFolder): Promise<FrontMessageTemplateFolders> {\n const data = await this.base.requestJson<MessageTemplateFolderResponse>(\n \"POST\",\n \"/message_template_folders\",\n { body },\n );\n return new FrontMessageTemplateFolders(this.base, data);\n }\n\n /**\n * Fetch one folder (`GET /message_template_folders/{message_template_folder_id}`).\n *\n * **Required scope:** `message_templates:read`\n */\n async get(folderId: string): Promise<FrontMessageTemplateFolders> {\n return await this.target(folderId).refresh();\n }\n\n /** Target a message template folder by id without calling the API first. */\n private target(folderId: string): FrontMessageTemplateFolders {\n return new FrontMessageTemplateFolders(this.base, undefined, folderId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\n\ntype MessageResponse = components[\"schemas\"][\"MessageResponse\"];\n\ntype ListMessageSeenResponse =\n operations[\"get-message-seen-status\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst emptySeenBody: Record<string, never> = {};\n\n/**\n * One message (`/messages/{message_id}` and related routes).\n *\n * @see https://dev.frontapp.com/reference/messages\n */\nexport class FrontMessages {\n private readonly base: FrontBase;\n private readonly boundMessageId: string | undefined;\n private snapshot: MessageResponse | undefined;\n\n constructor(base: FrontBase, messageId?: string, snapshot?: MessageResponse) {\n this.base = base;\n this.boundMessageId = messageId;\n this.snapshot = snapshot;\n }\n\n /** Id or alias used in request paths (from the constructor or last {@link refresh}). */\n get messageIdParam(): string {\n return this.messageId;\n }\n\n /** Last JSON payload from {@link FrontMessages.get} or {@link refresh}, if loaded. */\n get data(): Readonly<MessageResponse> | undefined {\n return this.snapshot;\n }\n\n /**\n * `GET /messages/{message_id}` (JSON). For other `Accept` values (e.g. `message/rfc822`), use {@link fetchRaw}.\n *\n * **Required scope:** `messages:read`\n */\n async refresh(): Promise<this> {\n const path = FrontBase.expandPath(\"/messages/{message_id}\", {\n message_id: this.messageId,\n });\n this.snapshot = await this.base.requestJson<MessageResponse>(\"GET\", path);\n return this;\n }\n\n /**\n * `GET /messages/{message_id}` without JSON parsing — use for non-JSON `Accept` (e.g. `message/rfc822`).\n *\n * **Required scope:** `messages:read`\n */\n async fetchRaw(init?: { headers?: Record<string, string | undefined> }): Promise<Response>;\n async fetchRaw(\n messageId: string,\n init?: { headers?: Record<string, string | undefined> },\n ): Promise<Response>;\n async fetchRaw(\n messageIdOrInit?: string | { headers?: Record<string, string | undefined> },\n optionalInit?: { headers?: Record<string, string | undefined> },\n ): Promise<Response> {\n const messageId = typeof messageIdOrInit === \"string\" ? messageIdOrInit : this.messageId;\n const init = typeof messageIdOrInit === \"string\" ? optionalInit : messageIdOrInit;\n const path = FrontBase.expandPath(\"/messages/{message_id}\", {\n message_id: messageId,\n });\n const headers: Record<string, string | undefined> = {\n ...init?.headers,\n };\n if (headers.Accept === undefined) {\n headers.Accept = \"application/json\";\n }\n return await this.base.requestWithoutParsingBody(\"GET\", path, { headers });\n }\n\n /**\n * `GET /messages/{message_id}/download/{attachment_link_id}` — raw {@link Response}.\n *\n * **Required scope:** `attachments:read`\n */\n async downloadAttachment(\n messageIdOrAttachmentLinkId: string,\n optionalAttachmentLinkId?: string,\n ): Promise<Response> {\n const messageId =\n optionalAttachmentLinkId === undefined ? this.messageId : messageIdOrAttachmentLinkId;\n const attachmentLinkId = optionalAttachmentLinkId ?? messageIdOrAttachmentLinkId;\n const path = FrontBase.expandPath(\"/messages/{message_id}/download/{attachment_link_id}\", {\n attachment_link_id: attachmentLinkId,\n message_id: messageId,\n });\n return await this.base.requestWithoutParsingBody(\"GET\", path);\n }\n\n /**\n * `GET /messages/{message_id}/seen`.\n *\n * **Required scope:** `messages:read`\n */\n async getSeen(\n messageId = this.messageId,\n ): Promise<WithNormalizedPagination<ListMessageSeenResponse>> {\n const path = FrontBase.expandPath(\"/messages/{message_id}/seen\", {\n message_id: messageId,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListMessageSeenResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * `POST /messages/{message_id}/seen`.\n *\n * **Required scope:** `messages:write`\n */\n async markSeen(messageId = this.messageId): Promise<void> {\n const path = FrontBase.expandPath(\"/messages/{message_id}/seen\", {\n message_id: messageId,\n });\n await this.base.requestJson<undefined>(\"POST\", path, {\n body: emptySeenBody,\n });\n }\n\n private get messageId(): string {\n if (this.boundMessageId === undefined) {\n throw new Error(\"This message operation requires an ID.\");\n }\n return this.boundMessageId;\n }\n\n /**\n * `GET /messages/{message_id}` — returns a hydrated resource with the response loaded.\n *\n * **Required scope:** `messages:read`\n */\n async get(messageId: string): Promise<FrontMessages> {\n const path = FrontBase.expandPath(\"/messages/{message_id}\", {\n message_id: messageId,\n });\n const data = await this.base.requestJson<MessageResponse>(\"GET\", path);\n return new FrontMessages(this.base, messageId, data);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\n\nexport type RuleResponse = components[\"schemas\"][\"RuleResponse\"];\n\ntype ListRulesResponse = operations[\"list-rules\"][\"responses\"][200][\"content\"][\"application/json\"];\n\n/**\n * Company rules under `/rules` (list and fetch by id only).\n *\n * @see https://dev.frontapp.com/reference/rules\n */\nexport class FrontRules {\n private readonly base: FrontBase;\n\n constructor(base: FrontBase) {\n this.base = base;\n }\n\n /**\n * List rules (`GET /rules`).\n *\n * **Required scope:** `rules:read`\n *\n * @see https://dev.frontapp.com/reference/list-rules\n */\n async list(): Promise<WithNormalizedPagination<ListRulesResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListRulesResponse>>(\n \"GET\",\n \"/rules\",\n );\n }\n\n /**\n * Fetch one rule (`GET /rules/{rule_id}`).\n *\n * **Required scope:** `rules:read`\n *\n * @see https://dev.frontapp.com/reference/get-rule\n */\n async get(ruleId: string): Promise<RuleResponse> {\n const path = FrontBase.expandPath(\"/rules/{rule_id}\", { rule_id: ruleId });\n return await this.base.requestJson<RuleResponse>(\"GET\", path);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type TeammateResponse = components[\"schemas\"][\"TeammateResponse\"];\nexport type UpdateTeammate = components[\"schemas\"][\"UpdateTeammate\"];\nexport type CustomFieldParameter = components[\"schemas\"][\"CustomFieldParameter\"];\n\ntype ListTeammatesResponse =\n operations[\"list-teammates\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListAssignedConversationsQuery = NonNullable<\n operations[\"list-assigned-conversations\"][\"parameters\"][\"query\"]\n>;\ntype ListAssignedConversationsResponse =\n operations[\"list-assigned-conversations\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromAssignedConversations = (\n q?: ListAssignedConversationsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\nconst mergeTeammateSnapshot = (\n current: TeammateResponse,\n patch: Partial<UpdateTeammate>,\n): TeammateResponse => {\n const filtered = Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n ) as Partial<TeammateResponse>;\n return { ...current, ...filtered };\n};\n\nconst teammateResponseToUpdateBody = (state: TeammateResponse): UpdateTeammate => ({\n custom_fields: state.custom_fields,\n first_name: state.first_name,\n is_available: state.is_available,\n last_name: state.last_name,\n username: state.username,\n});\n\n/**\n * One teammate (`/teammates/{teammate_id}`).\n *\n * Writable camelCase: `username`, `firstName`, `lastName`, `isAvailable`, `customFields`, `links`.\n * Read-only: `id`, `email`, `isAdmin`, `isBlocked`, `type`. Raw JSON: {@link FrontResource.data}.\n *\n * `PATCH` returns `204`; {@link update} and {@link save} merge the request into local state.\n *\n * @see https://dev.frontapp.com/reference/teammates\n */\nexport class FrontTeammates extends FrontResource<TeammateResponse, UpdateTeammate> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/teammates/{teammate_id}\", {\n teammate_id: this.id,\n });\n }\n\n get email(): string {\n return this.pick(\"email\");\n }\n\n get username(): string {\n return this.pick(\"username\");\n }\n\n set username(value: string) {\n this.assign(\"username\", value);\n }\n\n get firstName(): string {\n return this.pick(\"first_name\");\n }\n\n set firstName(value: string) {\n this.assign(\"first_name\", value);\n }\n\n get lastName(): string {\n return this.pick(\"last_name\");\n }\n\n set lastName(value: string) {\n this.assign(\"last_name\", value);\n }\n\n get isAdmin(): boolean {\n return this.pick(\"is_admin\");\n }\n\n get isAvailable(): boolean {\n return this.pick(\"is_available\");\n }\n\n set isAvailable(value: boolean) {\n this.assign(\"is_available\", value);\n }\n\n get isBlocked(): boolean {\n return this.pick(\"is_blocked\");\n }\n\n get type(): TeammateResponse[\"type\"] {\n return this.pick(\"type\");\n }\n\n get customFields(): TeammateResponse[\"custom_fields\"] {\n return this.pick(\"custom_fields\");\n }\n\n set customFields(value: TeammateResponse[\"custom_fields\"]) {\n this.assign(\"custom_fields\", value);\n }\n\n /**\n * Build the `PATCH` body implied by the current property values (username, names, availability, custom fields).\n * @see https://dev.frontapp.com/reference/update-teammate\n */\n toUpdateBody(): UpdateTeammate {\n return teammateResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this teammate (`PATCH /teammates/{teammate_id}`). The API returns `204`; local state is merged from the body.\n *\n * **Required scope:** `teammates:write`\n *\n * @param body Fields to change (OpenAPI {@link UpdateTeammate}). Sending `custom_fields` replaces omitted keys — see API docs.\n * @see https://dev.frontapp.com/reference/update-teammate\n */\n async update(body: UpdateTeammate | Partial<UpdateTeammate>): Promise<void>;\n async update(teammateId: string, body: UpdateTeammate | Partial<UpdateTeammate>): Promise<void>;\n async update(\n bodyOrTeammateId: string | UpdateTeammate | Partial<UpdateTeammate>,\n body?: UpdateTeammate | Partial<UpdateTeammate>,\n ): Promise<void> {\n if (typeof bodyOrTeammateId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Updating a teammate by ID requires a request body.\");\n }\n await this.target(bodyOrTeammateId).update(body);\n return;\n }\n await this.patchNoContent(bodyOrTeammateId, mergeTeammateSnapshot);\n }\n\n /**\n * List conversations assigned to this teammate (`GET /teammates/{teammate_id}/conversations`), most recently updated first.\n *\n * **Required scope:** `conversations:read`\n *\n * @param query Optional `q` ([query object](https://dev.frontapp.com/docs/query-object-q)), `limit`, and `page_token`.\n * @see https://dev.frontapp.com/reference/list-assigned-conversations\n */\n async listAssignedConversations(\n query?: ListAssignedConversationsQuery,\n ): Promise<WithNormalizedPagination<ListAssignedConversationsResponse>>;\n async listAssignedConversations(\n teammateId: string,\n query?: ListAssignedConversationsQuery,\n ): Promise<WithNormalizedPagination<ListAssignedConversationsResponse>>;\n async listAssignedConversations(\n queryOrTeammateId?: string | ListAssignedConversationsQuery,\n query?: ListAssignedConversationsQuery,\n ): Promise<WithNormalizedPagination<ListAssignedConversationsResponse>> {\n if (typeof queryOrTeammateId === \"string\") {\n return await this.target(queryOrTeammateId).listAssignedConversations(query);\n }\n const path = FrontBase.expandPath(\"/teammates/{teammate_id}/conversations\", {\n teammate_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListAssignedConversationsResponse>>(\n \"GET\",\n path,\n {\n query: queryFromAssignedConversations(queryOrTeammateId),\n },\n );\n }\n /**\n * Company teammates (`GET /teammates`, `GET /teammates/{teammate_id}`).\n *\n * @see https://dev.frontapp.com/reference/teammates\n */\n /**\n * List teammates in the company (`GET /teammates`).\n *\n * **Required scope:** `teammates:read`\n *\n * @see https://dev.frontapp.com/reference/list-teammates\n */\n async list(): Promise<WithNormalizedPagination<ListTeammatesResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListTeammatesResponse>>(\n \"GET\",\n \"/teammates\",\n );\n }\n\n /**\n * Fetch one teammate (`GET /teammates/{teammate_id}`).\n *\n * **Required scope:** `teammates:read`\n *\n * @param teammateId Teammate id or supported [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).\n * @see https://dev.frontapp.com/reference/get-teammate\n */\n async get(teammateId: string): Promise<FrontTeammates> {\n const teammate = this.target(teammateId);\n await teammate.refresh();\n return teammate;\n }\n\n /** Target a teammate by id without calling the API first. */\n private target(teammateId: string): FrontTeammates {\n return new FrontTeammates(this.base, undefined, teammateId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\nimport { FrontTeammates } from \"./teammates\";\n\nexport type ShiftResponse = components[\"schemas\"][\"ShiftResponse\"];\nexport type CreateShift = components[\"schemas\"][\"CreateShift\"];\nexport type UpdateShift = components[\"schemas\"][\"UpdateShift\"];\n\ntype ListShiftsResponse =\n operations[\"list-shifts\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListShiftsTeammatesResponse =\n operations[\"list-shifts-teammates\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst mergeShiftSnapshot = (current: ShiftResponse, patch: Partial<UpdateShift>): ShiftResponse => {\n const { times: patchTimes, ...restPatch } = patch;\n const filteredRest = Object.fromEntries(\n Object.entries(restPatch).filter(([, value]) => value !== undefined),\n ) as Partial<Omit<UpdateShift, \"times\">>;\n let next: ShiftResponse = { ...current, ...filteredRest };\n if (patchTimes !== undefined) {\n next = {\n ...next,\n times: { ...current.times, ...patchTimes },\n };\n }\n return next;\n};\n\nconst shiftResponseToUpdateBody = (state: ShiftResponse): UpdateShift => ({\n color: state.color,\n name: state.name,\n times: state.times,\n timezone: state.timezone,\n});\n\n/**\n * One shift (`/shifts/{shift_id}` and `/shifts/{shift_id}/teammates`).\n *\n * Writable: `name`, `color`, `timezone`, `times`. Read-only: `id`, `createdAt`, `updatedAt`, `links`.\n * `PATCH` returns `204`; {@link update} and {@link save} merge the request into local state.\n *\n * @see https://dev.frontapp.com/reference/shifts\n */\nexport class FrontShifts extends FrontResource<ShiftResponse, UpdateShift> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/shifts/{shift_id}\", { shift_id: this.id });\n }\n\n get name(): string {\n return this.pick(\"name\");\n }\n\n set name(value: string) {\n this.assign(\"name\", value);\n }\n\n get color(): ShiftResponse[\"color\"] {\n return this.pick(\"color\");\n }\n\n set color(value: ShiftResponse[\"color\"]) {\n this.assign(\"color\", value);\n }\n\n get timezone(): string {\n return this.pick(\"timezone\");\n }\n\n set timezone(value: string) {\n this.assign(\"timezone\", value);\n }\n\n get times(): ShiftResponse[\"times\"] {\n return this.pick(\"times\");\n }\n\n set times(value: ShiftResponse[\"times\"]) {\n this.assign(\"times\", value);\n }\n\n get createdAt(): number | undefined {\n return this.pick(\"created_at\");\n }\n\n get updatedAt(): number | undefined {\n return this.pick(\"updated_at\");\n }\n\n toUpdateBody(): UpdateShift {\n return shiftResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this shift (`PATCH /shifts/{shift_id}`). Returns `204`; local state is merged.\n *\n * **Required scope:** `shifts:write`\n *\n * @see https://dev.frontapp.com/reference/update-shift\n */\n async update(body: UpdateShift | Partial<UpdateShift>): Promise<void>;\n async update(shiftId: string, body: UpdateShift | Partial<UpdateShift>): Promise<void>;\n async update(\n bodyOrShiftId: UpdateShift | Partial<UpdateShift> | string,\n directBody?: UpdateShift | Partial<UpdateShift>,\n ): Promise<void> {\n if (typeof bodyOrShiftId === \"string\") {\n await this.target(bodyOrShiftId).update(directBody ?? {});\n return;\n }\n await this.patchNoContent(bodyOrShiftId, mergeShiftSnapshot);\n }\n\n override async delete(shiftId?: string): Promise<void> {\n if (shiftId === undefined) {\n await super.delete();\n return;\n }\n await this.target(shiftId).delete();\n }\n\n /**\n * List teammates on the shift (`GET /shifts/{shift_id}/teammates`).\n *\n * **Required scope:** `teammates:read`\n *\n * @see https://dev.frontapp.com/reference/list-shifts-teammates\n */\n async listTeammates(shiftId?: string): Promise<FrontTeammates[]> {\n if (shiftId !== undefined) {\n return await this.target(shiftId).listTeammates();\n }\n const path = FrontBase.expandPath(\"/shifts/{shift_id}/teammates\", {\n shift_id: this.id,\n });\n const json = await this.base.requestJson<WithNormalizedPagination<ListShiftsTeammatesResponse>>(\n \"GET\",\n path,\n );\n const results = json._results ?? [];\n return results.map((row) => new FrontTeammates(this.base, row));\n }\n\n /**\n * Add teammates (`POST /shifts/{shift_id}/teammates`).\n *\n * **Required scope:** `shifts:write`\n *\n * @see https://dev.frontapp.com/reference/add-teammates-to-shift\n */\n async addTeammates(body: components[\"schemas\"][\"TeammateIds\"]): Promise<void>;\n async addTeammates(shiftId: string, body: components[\"schemas\"][\"TeammateIds\"]): Promise<void>;\n async addTeammates(\n bodyOrShiftId: components[\"schemas\"][\"TeammateIds\"] | string,\n directBody?: components[\"schemas\"][\"TeammateIds\"],\n ): Promise<void> {\n if (typeof bodyOrShiftId === \"string\") {\n if (directBody === undefined) {\n throw new Error(\"Adding teammates requires a request body.\");\n }\n await this.target(bodyOrShiftId).addTeammates(directBody);\n return;\n }\n const path = FrontBase.expandPath(\"/shifts/{shift_id}/teammates\", {\n shift_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body: bodyOrShiftId });\n }\n\n /**\n * Remove teammates (`DELETE /shifts/{shift_id}/teammates`).\n *\n * **Required scope:** `shifts:write`\n *\n * @see https://dev.frontapp.com/reference/remove-teammates-from-shift\n */\n async removeTeammates(body: components[\"schemas\"][\"TeammateIds\"]): Promise<void>;\n async removeTeammates(shiftId: string, body: components[\"schemas\"][\"TeammateIds\"]): Promise<void>;\n async removeTeammates(\n bodyOrShiftId: components[\"schemas\"][\"TeammateIds\"] | string,\n directBody?: components[\"schemas\"][\"TeammateIds\"],\n ): Promise<void> {\n if (typeof bodyOrShiftId === \"string\") {\n if (directBody === undefined) {\n throw new Error(\"Removing teammates requires a request body.\");\n }\n await this.target(bodyOrShiftId).removeTeammates(directBody);\n return;\n }\n const path = FrontBase.expandPath(\"/shifts/{shift_id}/teammates\", {\n shift_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body: bodyOrShiftId });\n }\n\n /**\n * List shifts (`GET /shifts`).\n *\n * **Required scope:** `shifts:read`\n *\n * @see https://dev.frontapp.com/reference/list-shifts\n */\n async list(): Promise<WithNormalizedPagination<ListShiftsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListShiftsResponse>>(\n \"GET\",\n \"/shifts\",\n );\n }\n\n /**\n * Create a shift (`POST /shifts`).\n *\n * **Required scope:** `shifts:write`\n *\n * @see https://dev.frontapp.com/reference/create-shift\n */\n async create(body: CreateShift): Promise<FrontShifts> {\n const data = await this.base.requestJson<ShiftResponse>(\"POST\", \"/shifts\", {\n body,\n });\n return new FrontShifts(this.base, data);\n }\n\n /**\n * Fetch one shift (`GET /shifts/{shift_id}`).\n *\n * **Required scope:** `shifts:read`\n *\n * @see https://dev.frontapp.com/reference/get-shift\n */\n async get(shiftId: string): Promise<FrontShifts> {\n return await this.target(shiftId).refresh();\n }\n\n /** Target a shift by id without calling the API first. */\n private target(shiftId: string): FrontShifts {\n return new FrontShifts(this.base, undefined, shiftId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type SignatureResponse = components[\"schemas\"][\"SignatureResponse\"];\nexport type UpdateSignature = components[\"schemas\"][\"UpdateSignature\"];\nexport type CreatePrivateSignature = components[\"schemas\"][\"CreatePrivateSignature\"];\nexport type CreateSharedSignature = components[\"schemas\"][\"CreateSharedSignature\"];\n\ntype ListSignaturesResponse =\n operations[\"list-teammate-signatures\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst signatureResponseToUpdateBody = (state: SignatureResponse): UpdateSignature => ({\n body: state.body,\n channel_ids: state.channel_ids === null ? undefined : state.channel_ids,\n is_default: state.is_default,\n is_visible_for_all_teammate_channels: state.is_visible_for_all_teammate_channels,\n name: state.name ?? undefined,\n sender_info: state.sender_info ?? undefined,\n});\n\n/**\n * One signature (`/signatures/{signature_id}`).\n *\n * Writable camelCase: `name`, `body`, `senderInfo`, `isVisibleForAllTeammateChannels`, `isDefault`, `channelIds`, `links`.\n * Read-only: `id`, `isPrivate`. `PATCH` returns the updated resource JSON; {@link update} and {@link save} replace local state.\n *\n * @see https://dev.frontapp.com/reference/signatures\n */\nexport class FrontSignatures extends FrontResource<SignatureResponse, UpdateSignature> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/signatures/{signature_id}\", {\n signature_id: this.id,\n });\n }\n\n get name(): string | null {\n return this.pick(\"name\");\n }\n\n set name(value: string | null) {\n this.assign(\"name\", value);\n }\n\n get body(): string {\n return this.pick(\"body\");\n }\n\n set body(value: string) {\n this.assign(\"body\", value);\n }\n\n get senderInfo(): string | null {\n return this.pick(\"sender_info\");\n }\n\n set senderInfo(value: string | null) {\n this.assign(\"sender_info\", value);\n }\n\n get isVisibleForAllTeammateChannels(): boolean {\n return this.pick(\"is_visible_for_all_teammate_channels\");\n }\n\n set isVisibleForAllTeammateChannels(value: boolean) {\n this.assign(\"is_visible_for_all_teammate_channels\", value);\n }\n\n get isDefault(): boolean {\n return this.pick(\"is_default\");\n }\n\n set isDefault(value: boolean) {\n this.assign(\"is_default\", value);\n }\n\n get isPrivate(): boolean {\n return this.pick(\"is_private\");\n }\n\n get channelIds(): string[] | null {\n return this.pick(\"channel_ids\");\n }\n\n set channelIds(value: string[] | null) {\n this.assign(\"channel_ids\", value);\n }\n\n /**\n * Build the `PATCH` body implied by the current property values.\n * @see https://dev.frontapp.com/reference/update-signature\n */\n toUpdateBody(): UpdateSignature {\n return signatureResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this signature (`PATCH /signatures/{signature_id}`). The API returns `200` with the updated resource.\n *\n * **Required scope:** `signatures:write`\n *\n * @param body Fields to change (OpenAPI {@link UpdateSignature}).\n * @see https://dev.frontapp.com/reference/update-signature\n */\n async update(body: UpdateSignature | Partial<UpdateSignature>): Promise<void>;\n async update(\n signatureId: string,\n body: UpdateSignature | Partial<UpdateSignature>,\n ): Promise<void>;\n async update(\n bodyOrSignatureId: UpdateSignature | Partial<UpdateSignature> | string,\n directBody?: UpdateSignature | Partial<UpdateSignature>,\n ): Promise<void> {\n if (typeof bodyOrSignatureId === \"string\") {\n await this.target(bodyOrSignatureId).update(directBody ?? {});\n return;\n }\n await this.patchReplaceFromResponse(bodyOrSignatureId);\n }\n\n override async delete(signatureId?: string): Promise<void> {\n if (signatureId === undefined) {\n await super.delete();\n return;\n }\n await this.target(signatureId).delete();\n }\n\n /**\n * Fetch one signature (`GET /signatures/{signature_id}`).\n *\n * **Required scope:** `signatures:read`\n *\n * @param signatureId Signature id.\n * @see https://dev.frontapp.com/reference/get-signatures\n */\n async get(signatureId: string): Promise<FrontSignatures> {\n return await this.target(signatureId).refresh();\n }\n\n /** Target a signature by id without calling the API first. */\n private target(signatureId: string): FrontSignatures {\n return new FrontSignatures(this.base, undefined, signatureId);\n }\n\n /**\n * List signatures for a teammate (`GET /teammates/{teammate_id}/signatures`).\n *\n * **Required scope:** `signatures:read`\n *\n * @param teammateId Teammate id or supported [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).\n * @see https://dev.frontapp.com/reference/list-teammate-signatures\n */\n async listTeammate(\n teammateId: string,\n ): Promise<WithNormalizedPagination<ListSignaturesResponse>> {\n const path = FrontBase.expandPath(\"/teammates/{teammate_id}/signatures\", {\n teammate_id: teammateId,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListSignaturesResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Create a private signature for a teammate (`POST /teammates/{teammate_id}/signatures`).\n *\n * **Required scope:** `signatures:write`\n *\n * @param teammateId Teammate id or supported resource alias.\n * @param body Create payload (OpenAPI {@link CreatePrivateSignature}).\n * @see https://dev.frontapp.com/reference/create-teammate-signature\n */\n async createTeammate(teammateId: string, body: CreatePrivateSignature): Promise<FrontSignatures> {\n const path = FrontBase.expandPath(\"/teammates/{teammate_id}/signatures\", {\n teammate_id: teammateId,\n });\n const data = await this.base.requestJson<SignatureResponse>(\"POST\", path, {\n body,\n });\n return new FrontSignatures(this.base, data);\n }\n\n /**\n * List signatures for a team/workspace (`GET /teams/{team_id}/signatures`).\n *\n * **Required scope:** `signatures:read`\n *\n * @param teamId Team id.\n * @see https://dev.frontapp.com/reference/list-team-signatures\n */\n async listTeam(teamId: string): Promise<WithNormalizedPagination<ListSignaturesResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/signatures\", {\n team_id: teamId,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListSignaturesResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Create a shared signature for a team (`POST /teams/{team_id}/signatures`).\n *\n * **Required scope:** `signatures:write`\n *\n * @param teamId Team id.\n * @param body Create payload (OpenAPI {@link CreateSharedSignature}).\n * @see https://dev.frontapp.com/reference/create-team-signature\n */\n async createTeam(teamId: string, body: CreateSharedSignature): Promise<FrontSignatures> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/signatures\", {\n team_id: teamId,\n });\n const data = await this.base.requestJson<SignatureResponse>(\"POST\", path, {\n body,\n });\n return new FrontSignatures(this.base, data);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\nimport { FrontTeammates } from \"./teammates\";\n\nexport type TeammateGroupResponse = components[\"schemas\"][\"TeammateGroupResponse\"];\nexport type CreateTeammateGroup = components[\"schemas\"][\"CreateTeammateGroup\"];\nexport type UpdateTeammateGroup = components[\"schemas\"][\"UpdateTeammateGroup\"];\n\ntype ListTeammateGroupsResponse =\n operations[\"list-company-teammate-groups\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeammateGroupInboxesResponse =\n operations[\"list-company-teammate-group-team-inboxes\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeammateGroupTeammatesResponse =\n operations[\"list-company-teammate-group-teammates\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeammateGroupTeamsResponse =\n operations[\"list-company-teammate-group-teams\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst mergeTeammateGroupSnapshot = (\n current: TeammateGroupResponse,\n patch: Partial<UpdateTeammateGroup>,\n): TeammateGroupResponse => {\n const { permissions: patchPermissions, ...restPatch } = patch;\n const filteredRest = Object.fromEntries(\n Object.entries(restPatch).filter(([, value]) => value !== undefined),\n ) as Partial<Omit<UpdateTeammateGroup, \"permissions\">>;\n let next: TeammateGroupResponse = { ...current, ...filteredRest };\n if (patchPermissions !== undefined) {\n const patchContacts = patchPermissions.contacts;\n const currentContacts = current.permissions.contacts;\n next = {\n ...next,\n permissions: {\n ...current.permissions,\n ...patchPermissions,\n contacts:\n patchContacts === undefined\n ? currentContacts\n : {\n ...currentContacts,\n ...patchContacts,\n },\n },\n };\n }\n return next;\n};\n\nconst permissionsToUpdateBody = (\n permissions: TeammateGroupResponse[\"permissions\"],\n): UpdateTeammateGroup[\"permissions\"] | undefined => {\n const c = permissions.contacts;\n if (c === undefined) {\n return;\n }\n const { access } = c;\n if (access === undefined) {\n return;\n }\n const contacts: NonNullable<UpdateTeammateGroup[\"permissions\"]>[\"contacts\"] = { access };\n if (c.contact_list_ids !== undefined) {\n contacts.contact_list_ids = c.contact_list_ids;\n }\n return { contacts };\n};\n\nconst teammateGroupResponseToUpdateBody = (state: TeammateGroupResponse): UpdateTeammateGroup => {\n const body: UpdateTeammateGroup = { name: state.name };\n if (state.description !== null) {\n body.description = state.description;\n }\n const permissions = permissionsToUpdateBody(state.permissions);\n if (permissions !== undefined) {\n body.permissions = permissions;\n }\n return body;\n};\n\n/**\n * One company teammate group (`/teammate_groups/{teammate_group_id}` and related routes).\n *\n * Writable: `name`, `description`, `permissions`. Read-only: `id`, `isManagedByScim`, `links`.\n * `PATCH` returns `204`; {@link update} and {@link save} merge the request into local state.\n *\n * @see https://dev.frontapp.com/reference/teammate-groups\n */\nexport class FrontTeammateGroups extends FrontResource<TeammateGroupResponse, UpdateTeammateGroup> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}\", {\n teammate_group_id: this.id,\n });\n }\n\n get name(): string {\n return this.pick(\"name\");\n }\n\n set name(value: string) {\n this.assign(\"name\", value);\n }\n\n get description(): string | null {\n return this.pick(\"description\");\n }\n\n set description(value: string | null) {\n this.assign(\"description\", value);\n }\n\n get isManagedByScim(): boolean {\n return this.pick(\"is_managed_by_scim\");\n }\n\n get permissions(): TeammateGroupResponse[\"permissions\"] {\n return this.pick(\"permissions\");\n }\n\n set permissions(value: TeammateGroupResponse[\"permissions\"]) {\n this.assign(\"permissions\", value);\n }\n\n toUpdateBody(): UpdateTeammateGroup {\n return teammateGroupResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this teammate group (`PATCH /teammate_groups/{teammate_group_id}`). Returns `204`; local state is merged.\n *\n * **Required scope:** `teammate_groups:write`\n *\n * @see https://dev.frontapp.com/reference/update-a-company-teammate-group\n */\n async update(body: UpdateTeammateGroup | Partial<UpdateTeammateGroup>): Promise<void>;\n async update(\n teammateGroupId: string,\n body: UpdateTeammateGroup | Partial<UpdateTeammateGroup>,\n ): Promise<void>;\n async update(\n bodyOrTeammateGroupId: string | UpdateTeammateGroup | Partial<UpdateTeammateGroup>,\n body?: UpdateTeammateGroup | Partial<UpdateTeammateGroup>,\n ): Promise<void> {\n if (typeof bodyOrTeammateGroupId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Updating a teammate group by ID requires a request body.\");\n }\n await this.target(bodyOrTeammateGroupId).update(body);\n return;\n }\n await this.patchNoContent(bodyOrTeammateGroupId, mergeTeammateGroupSnapshot);\n }\n\n /**\n * List inboxes this group can access via its teams (`GET /teammate_groups/{teammate_group_id}/inboxes`).\n *\n * **Required scope:** `teammate_groups:read`\n *\n * @see https://dev.frontapp.com/reference/list-company-teammate-group-team-inboxes\n */\n async listInboxes(): Promise<WithNormalizedPagination<ListTeammateGroupInboxesResponse>> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/inboxes\", {\n teammate_group_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeammateGroupInboxesResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Link non-public inboxes (`POST /teammate_groups/{teammate_group_id}/inboxes`).\n *\n * **Required scope:** `teammate_groups:write`\n *\n * @see https://dev.frontapp.com/reference/add-company-teammate-group-team-inboxes\n */\n async addInboxes(body: components[\"schemas\"][\"InboxIds\"]): Promise<void> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/inboxes\", {\n teammate_group_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n\n /**\n * Unlink non-public inboxes (`DELETE /teammate_groups/{teammate_group_id}/inboxes`).\n *\n * **Required scope:** `teammate_groups:write`\n *\n * @see https://dev.frontapp.com/reference/remove-company-teammate-group-team-inboxes\n */\n async removeInboxes(body: components[\"schemas\"][\"InboxIds\"]): Promise<void> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/inboxes\", {\n teammate_group_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body });\n }\n\n /**\n * List teammates in the group (`GET /teammate_groups/{teammate_group_id}/teammates`).\n *\n * **Required scope:** `teammate_groups:read`\n *\n * @see https://dev.frontapp.com/reference/list-company-teammate-group-teammates\n */\n async listTeammates(): Promise<FrontTeammates[]> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/teammates\", {\n teammate_group_id: this.id,\n });\n const json = await this.base.requestJson<\n WithNormalizedPagination<ListTeammateGroupTeammatesResponse>\n >(\"GET\", path);\n const results = json._results ?? [];\n return results.map((row) => new FrontTeammates(this.base, row));\n }\n\n /**\n * Add teammates (`POST /teammate_groups/{teammate_group_id}/teammates`).\n *\n * **Required scope:** `teammate_groups:write`\n *\n * @see https://dev.frontapp.com/reference/add-company-teammate-group-teammates\n */\n async addTeammates(body: components[\"schemas\"][\"TeammateIds\"]): Promise<void> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/teammates\", {\n teammate_group_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n\n /**\n * Remove teammates (`DELETE /teammate_groups/{teammate_group_id}/teammates`).\n *\n * **Required scope:** `teammate_groups:write`\n *\n * @see https://dev.frontapp.com/reference/remove-company-teammate-group-teammates\n */\n async removeTeammates(body: components[\"schemas\"][\"TeammateIds\"]): Promise<void> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/teammates\", {\n teammate_group_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body });\n }\n\n /**\n * List teams on the group (`GET /teammate_groups/{teammate_group_id}/teams`).\n *\n * **Required scope:** `teammate_groups:read`\n *\n * @see https://dev.frontapp.com/reference/list-company-teammate-group-teams\n */\n async listTeams(): Promise<WithNormalizedPagination<ListTeammateGroupTeamsResponse>> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/teams\", {\n teammate_group_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeammateGroupTeamsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Add teams (`POST /teammate_groups/{teammate_group_id}/teams`).\n *\n * **Required scope:** `teammate_groups:write`\n *\n * @see https://dev.frontapp.com/reference/add-company-teammate-group-teams\n */\n async addTeams(body: components[\"schemas\"][\"TeamIds\"]): Promise<void> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/teams\", {\n teammate_group_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n\n /**\n * Remove teams (`DELETE /teammate_groups/{teammate_group_id}/teams`).\n *\n * **Required scope:** `teammate_groups:write`\n *\n * @see https://dev.frontapp.com/reference/remove-company-teammate-group-teams\n */\n async removeTeams(body: components[\"schemas\"][\"TeamIds\"]): Promise<void> {\n const path = FrontBase.expandPath(\"/teammate_groups/{teammate_group_id}/teams\", {\n teammate_group_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body });\n }\n /**\n * Company teammate groups under `/teammate_groups`.\n *\n * @see https://dev.frontapp.com/reference/teammate-groups\n */\n /**\n * List teammate groups (`GET /teammate_groups`).\n *\n * **Required scope:** `teammate_groups:read`\n *\n * @see https://dev.frontapp.com/reference/list-company-teammate-groups\n */\n async list(): Promise<WithNormalizedPagination<ListTeammateGroupsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListTeammateGroupsResponse>>(\n \"GET\",\n \"/teammate_groups\",\n );\n }\n\n /**\n * Create a teammate group (`POST /teammate_groups`).\n *\n * **Required scope:** `teammate_groups:write`\n *\n * @see https://dev.frontapp.com/reference/create-company-teammate-group\n */\n async create(body: CreateTeammateGroup): Promise<FrontTeammateGroups> {\n const data = await this.base.requestJson<TeammateGroupResponse>(\"POST\", \"/teammate_groups\", {\n body,\n });\n return new FrontTeammateGroups(this.base, data);\n }\n\n /**\n * Fetch one teammate group (`GET /teammate_groups/{teammate_group_id}`).\n *\n * **Required scope:** `teammate_groups:read`\n *\n * @see https://dev.frontapp.com/reference/get-company-teammate-group\n */\n async get(teammateGroupId: string): Promise<FrontTeammateGroups> {\n const teammateGroup = this.target(teammateGroupId);\n await teammateGroup.refresh();\n return teammateGroup;\n }\n\n /** Target a teammate group by id without calling the API first. */\n private target(teammateGroupId: string): FrontTeammateGroups {\n return new FrontTeammateGroups(this.base, undefined, teammateGroupId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontInboxes } from \"./inboxes\";\nimport type { CreateSharedSignature, SignatureResponse } from \"./signatures\";\nimport { FrontSignatures } from \"./signatures\";\nimport type { CreateTag, TagResponse } from \"./tags\";\nimport { FrontTags } from \"./tags\";\n\ntype CreateContact = components[\"schemas\"][\"CreateContact\"];\ntype CreateContactList = components[\"schemas\"][\"CreateContactList\"];\ntype ContactResponse = components[\"schemas\"][\"ContactResponse\"];\n\nexport type TeamResponse = components[\"schemas\"][\"TeamResponse\"];\nexport type CreateTeamInbox = components[\"schemas\"][\"CreateTeamInbox\"];\nexport type CreateMessageTemplateFolder = components[\"schemas\"][\"CreateMessageTemplateFolder\"];\nexport type CreateSharedMessageTemplate = components[\"schemas\"][\"CreateSharedMessageTemplate\"];\nexport type CreateShift = components[\"schemas\"][\"CreateShift\"];\nexport type CreateView = components[\"schemas\"][\"CreateView\"];\nexport type MessageTemplateResponse = components[\"schemas\"][\"MessageTemplateResponse\"];\nexport type MessageTemplateFolderResponse = components[\"schemas\"][\"MessageTemplateFolderResponse\"];\nexport type ShiftResponse = components[\"schemas\"][\"ShiftResponse\"];\nexport type SharedViewResponse = components[\"schemas\"][\"SharedViewResponse\"];\n\ntype ListTeamsResponse = operations[\"list-teams\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamChannelsResponse =\n operations[\"list-team-channels\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamGroupsResponse =\n operations[\"list-team-groups\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamContactListsResponse =\n operations[\"list-team-contact-lists\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamContactsQuery = NonNullable<operations[\"list-team-contacts\"][\"parameters\"][\"query\"]>;\ntype ListTeamContactsResponse =\n operations[\"list-team-contacts\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamInboxesResponse =\n operations[\"list-team-inboxes\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamFoldersQuery = NonNullable<operations[\"list-team-folders\"][\"parameters\"][\"query\"]>;\ntype ListTeamFoldersResponse =\n operations[\"list-team-folders\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamMessageTemplatesQuery = NonNullable<\n operations[\"list-team-message-templates\"][\"parameters\"][\"query\"]\n>;\ntype ListTeamMessageTemplatesResponse =\n operations[\"list-team-message-templates\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamRulesResponse =\n operations[\"list-team-rules\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamShiftsResponse =\n operations[\"list-team-shifts\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamSignaturesResponse =\n operations[\"list-team-signatures\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamTagsQuery = NonNullable<operations[\"list-team-tags\"][\"parameters\"][\"query\"]>;\ntype ListTeamTagsResponse =\n operations[\"list-team-tags\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ListTeamViewsQuery = NonNullable<operations[\"list-team-views\"][\"parameters\"][\"query\"]>;\ntype ListTeamViewsResponse =\n operations[\"list-team-views\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nconst queryFromListTeamContacts = (\n q?: ListTeamContactsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.q !== undefined) {\n out.q = String(q.q);\n }\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromListTeamFolders = (\n q?: ListTeamFoldersQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromListTeamMessageTemplates = (\n q?: ListTeamMessageTemplatesQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromListTeamTags = (\n q?: ListTeamTagsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n if (q.sort_by !== undefined) {\n out.sort_by = String(q.sort_by);\n }\n if (q.sort_order !== undefined) {\n out.sort_order = String(q.sort_order);\n }\n return out;\n};\n\nconst queryFromListTeamViews = (\n q?: ListTeamViewsQuery,\n): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\n/**\n * One team / workspace (`GET /teams/{team_id}`). There is no team `PATCH` in the OpenAPI spec; use {@link refresh} after changes elsewhere.\n *\n * @see https://dev.frontapp.com/reference/teams\n */\nexport class FrontTeams {\n private state: TeamResponse | undefined;\n private readonly base: FrontBase;\n private readonly teamId: string | undefined;\n\n constructor(base: FrontBase, snapshot?: TeamResponse, teamId?: string) {\n this.base = base;\n this.state = snapshot === undefined ? undefined : structuredClone(snapshot);\n this.teamId = teamId;\n }\n\n get id(): string {\n const id = this.state?.id ?? this.teamId;\n if (id === undefined) {\n throw new Error(\"This team operation requires an ID.\");\n }\n return id;\n }\n\n get links(): TeamResponse[\"_links\"] {\n return this.requireState()._links;\n }\n\n /** Full team JSON from the last fetch. */\n get data(): Readonly<TeamResponse> | undefined {\n return this.state;\n }\n\n private requireState(): TeamResponse {\n if (this.state === undefined) {\n throw new Error(\"This team operation requires fetched resource data.\");\n }\n return this.state;\n }\n\n private selfPath(): string {\n return FrontBase.expandPath(\"/teams/{team_id}\", { team_id: this.id });\n }\n\n /**\n * Fetch team (`GET /teams/{team_id}`).\n *\n * **Required scope:** `teams:read`\n */\n async refresh(): Promise<this> {\n const next = await this.base.requestJson<TeamResponse>(\"GET\", this.selfPath());\n this.state = structuredClone(next);\n return this;\n }\n\n /**\n * List team channels (`GET /teams/{team_id}/channels`).\n *\n * **Required scope:** `channels:read`\n */\n async listChannels(): Promise<WithNormalizedPagination<ListTeamChannelsResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/channels\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamChannelsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * List contact groups (deprecated; `GET /teams/{team_id}/contact_groups`).\n *\n * **Required scope:** `contacts:read`\n */\n async listContactGroups(): Promise<WithNormalizedPagination<ListTeamGroupsResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/contact_groups\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamGroupsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Create a contact group (deprecated; `POST /teams/{team_id}/contact_groups`). The API returns `204`.\n *\n * **Required scope:** `contacts:write`\n */\n async createContactGroup(body: CreateContactList): Promise<void> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/contact_groups\", {\n team_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n\n /**\n * List contact lists (`GET /teams/{team_id}/contact_lists`).\n *\n * **Required scope:** `contacts:read`\n */\n async listContactLists(): Promise<WithNormalizedPagination<ListTeamContactListsResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/contact_lists\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamContactListsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Create a contact list (`POST /teams/{team_id}/contact_lists`). The API returns `204`.\n *\n * **Required scope:** `contacts:write`\n */\n async createContactList(body: CreateContactList): Promise<void> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/contact_lists\", {\n team_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n\n /**\n * List team contacts (`GET /teams/{team_id}/contacts`).\n *\n * **Required scope:** `contacts:read`\n */\n async listContacts(\n query?: ListTeamContactsQuery,\n ): Promise<WithNormalizedPagination<ListTeamContactsResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/contacts\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamContactsResponse>>(\n \"GET\",\n path,\n {\n query: queryFromListTeamContacts(query),\n },\n );\n }\n\n /**\n * Create a team contact (`POST /teams/{team_id}/contacts`).\n *\n * **Required scope:** `contacts:write`\n */\n async createContact(body: CreateContact): Promise<ContactResponse> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/contacts\", {\n team_id: this.id,\n });\n return await this.base.requestJson<ContactResponse>(\"POST\", path, { body });\n }\n\n /**\n * List team inboxes (`GET /teams/{team_id}/inboxes`).\n *\n * **Required scope:** `inboxes:read`\n */\n async listInboxes(): Promise<WithNormalizedPagination<ListTeamInboxesResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/inboxes\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamInboxesResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Create a team inbox (`POST /teams/{team_id}/inboxes`).\n *\n * **Required scope:** `inboxes:write`\n */\n async createInbox(body: CreateTeamInbox): Promise<FrontInboxes> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/inboxes\", {\n team_id: this.id,\n });\n const data = await this.base.requestJson<\n operations[\"create-team-inbox\"][\"responses\"][201][\"content\"][\"application/json\"]\n >(\"POST\", path, { body });\n return new FrontInboxes(this.base, data);\n }\n\n /**\n * List message template folders (`GET /teams/{team_id}/message_template_folders`).\n *\n * **Required scope:** `message_templates:read`\n */\n async listMessageTemplateFolders(\n query?: ListTeamFoldersQuery,\n ): Promise<WithNormalizedPagination<ListTeamFoldersResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/message_template_folders\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamFoldersResponse>>(\n \"GET\",\n path,\n {\n query: queryFromListTeamFolders(query),\n },\n );\n }\n\n /**\n * Create a message template folder (`POST /teams/{team_id}/message_template_folders`).\n *\n * **Required scope:** `message_templates:write`\n */\n async createMessageTemplateFolder(\n body: CreateMessageTemplateFolder,\n ): Promise<MessageTemplateFolderResponse> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/message_template_folders\", {\n team_id: this.id,\n });\n return await this.base.requestJson<MessageTemplateFolderResponse>(\"POST\", path, { body });\n }\n\n /**\n * List message templates (`GET /teams/{team_id}/message_templates`).\n *\n * **Required scope:** `message_templates:read`\n */\n async listMessageTemplates(\n query?: ListTeamMessageTemplatesQuery,\n ): Promise<WithNormalizedPagination<ListTeamMessageTemplatesResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/message_templates\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamMessageTemplatesResponse>>(\n \"GET\",\n path,\n {\n query: queryFromListTeamMessageTemplates(query),\n },\n );\n }\n\n /**\n * Create a message template (`POST /teams/{team_id}/message_templates`).\n *\n * **Required scope:** `message_templates:write`\n */\n async createMessageTemplate(body: CreateSharedMessageTemplate): Promise<MessageTemplateResponse> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/message_templates\", {\n team_id: this.id,\n });\n return await this.base.requestJson<MessageTemplateResponse>(\"POST\", path, {\n body,\n });\n }\n\n /**\n * List team rules (`GET /teams/{team_id}/rules`).\n *\n * **Required scope:** `rules:read`\n */\n async listRules(): Promise<WithNormalizedPagination<ListTeamRulesResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/rules\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamRulesResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * List team shifts (`GET /teams/{team_id}/shifts`).\n *\n * **Required scope:** `shifts:read`\n */\n async listShifts(): Promise<WithNormalizedPagination<ListTeamShiftsResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/shifts\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamShiftsResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Create a team shift (`POST /teams/{team_id}/shifts`).\n *\n * **Required scope:** `shifts:write`\n */\n async createShift(body: CreateShift): Promise<ShiftResponse> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/shifts\", {\n team_id: this.id,\n });\n return await this.base.requestJson<ShiftResponse>(\"POST\", path, { body });\n }\n\n /**\n * List team signatures (`GET /teams/{team_id}/signatures`).\n *\n * **Required scope:** `signatures:read`\n */\n async listSignatures(): Promise<WithNormalizedPagination<ListTeamSignaturesResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/signatures\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamSignaturesResponse>>(\n \"GET\",\n path,\n );\n }\n\n /**\n * Create a shared team signature (`POST /teams/{team_id}/signatures`).\n *\n * **Required scope:** `signatures:write`\n */\n async createSignature(body: CreateSharedSignature): Promise<FrontSignatures> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/signatures\", {\n team_id: this.id,\n });\n const data = await this.base.requestJson<SignatureResponse>(\"POST\", path, {\n body,\n });\n return new FrontSignatures(this.base, data);\n }\n\n /**\n * List team tags (`GET /teams/{team_id}/tags`).\n *\n * **Required scope:** `tags:read`\n */\n async listTags(\n query?: ListTeamTagsQuery,\n ): Promise<WithNormalizedPagination<ListTeamTagsResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/tags\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamTagsResponse>>(\n \"GET\",\n path,\n {\n query: queryFromListTeamTags(query),\n },\n );\n }\n\n /**\n * Create a team tag (`POST /teams/{team_id}/tags`).\n *\n * **Required scope:** `tags:write`\n */\n async createTag(body: CreateTag): Promise<FrontTags> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/tags\", {\n team_id: this.id,\n });\n const data = await this.base.requestJson<TagResponse>(\"POST\", path, {\n body,\n });\n return new FrontTags(this.base, data);\n }\n\n /**\n * Add teammates to the team (`POST /teams/{team_id}/teammates`). The API returns `204`.\n *\n * **Required scope:** `teams:write`\n */\n async addTeammates(body: components[\"schemas\"][\"TeammateIds\"]): Promise<void> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/teammates\", {\n team_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n\n /**\n * Remove teammates from the team (`DELETE /teams/{team_id}/teammates`). The API returns `204`.\n *\n * **Required scope:** `teams:write`\n */\n async removeTeammates(body: components[\"schemas\"][\"TeammateIds\"]): Promise<void> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/teammates\", {\n team_id: this.id,\n });\n await this.base.requestJson<undefined>(\"DELETE\", path, { body });\n }\n\n /**\n * List team views (`GET /teams/{team_id}/views`).\n *\n * **Required scope:** `views:read`\n */\n async listViews(\n query?: ListTeamViewsQuery,\n ): Promise<WithNormalizedPagination<ListTeamViewsResponse>> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/views\", {\n team_id: this.id,\n });\n return await this.base.requestJson<WithNormalizedPagination<ListTeamViewsResponse>>(\n \"GET\",\n path,\n {\n query: queryFromListTeamViews(query),\n },\n );\n }\n\n /**\n * Create a team view (`POST /teams/{team_id}/views`).\n *\n * **Required scope:** `views:write`\n */\n async createView(body: CreateView): Promise<SharedViewResponse> {\n const path = FrontBase.expandPath(\"/teams/{team_id}/views\", {\n team_id: this.id,\n });\n return await this.base.requestJson<SharedViewResponse>(\"POST\", path, {\n body,\n });\n }\n /**\n * Teams / workspaces (`GET /teams`, `GET /teams/{team_id}`) and ID-bound sub-routes.\n *\n * @see https://dev.frontapp.com/reference/teams\n */\n /**\n * List teams (`GET /teams`).\n *\n * **Required scope:** `teams:read`\n */\n async listTeams(): Promise<WithNormalizedPagination<ListTeamsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListTeamsResponse>>(\n \"GET\",\n \"/teams\",\n );\n }\n\n /**\n * Fetch one team (`GET /teams/{team_id}`).\n *\n * **Required scope:** `teams:read`\n */\n async getTeam(teamId: string): Promise<FrontTeams> {\n const team = this.target(teamId);\n await team.refresh();\n return team;\n }\n\n /** Target a team by id without calling the API first. */\n private target(teamId: string): FrontTeams {\n return new FrontTeams(this.base, undefined, teamId);\n }\n}\n","import { FrontBase } from \"../base\";\nimport type { components, operations } from \"../gen/schema.gen\";\nimport type { WithNormalizedPagination } from \"../normalize-response\";\nimport { FrontResource } from \"../resource\";\n\nexport type ViewResponse = components[\"schemas\"][\"SharedViewResponse\"];\nexport type UpdateView = components[\"schemas\"][\"UpdateView\"];\n\ntype ListViewsQuery = NonNullable<operations[\"list-views\"][\"parameters\"][\"query\"]>;\n\ntype ListViewsResponse = operations[\"list-views\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype AddViewTeammatesBody = NonNullable<\n NonNullable<operations[\"add-view-teammates\"][\"requestBody\"]>[\"content\"]\n>[\"application/json\"];\n\nconst queryFromListViews = (q?: ListViewsQuery): Record<string, string | undefined> | undefined => {\n if (!q) {\n return;\n }\n const out: Record<string, string | undefined> = {};\n if (q.limit !== undefined) {\n out.limit = String(q.limit);\n }\n if (q.page_token !== undefined) {\n out.page_token = String(q.page_token);\n }\n return out;\n};\n\nconst mergeViewSnapshot = (current: ViewResponse, patch: Partial<UpdateView>): ViewResponse => {\n const filtered = Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n ) as Partial<UpdateView>;\n let next: ViewResponse = { ...current, ...filtered };\n if (Object.hasOwn(patch, \"highlight\")) {\n next = {\n ...next,\n highlight: patch.highlight ?? null,\n };\n }\n return next;\n};\n\nconst viewResponseToUpdateBody = (state: ViewResponse): UpdateView => ({\n assignee_ids: state.assignee_ids,\n highlight: state.highlight ?? undefined,\n inbox_ids: state.inbox_ids,\n name: state.name,\n no_tags: state.no_tags,\n not_assignee_ids: state.not_assignee_ids,\n not_tag_ids: state.not_tag_ids,\n tag_ids: state.tag_ids,\n});\n\n/**\n * One shared view (`/views/{view_id}` and `POST /views/{view_id}/teammates`).\n *\n * Writable fields follow {@link UpdateView}. Read-only: `id`, `links`.\n * `PATCH` returns `204`; {@link update} and {@link save} merge the request into local state.\n *\n * @see https://dev.frontapp.com/reference/views\n */\nexport class FrontViews extends FrontResource<ViewResponse, UpdateView> {\n protected selfPath(): string {\n return FrontBase.expandPath(\"/views/{view_id}\", { view_id: this.id });\n }\n\n get name(): string {\n return this.pick(\"name\");\n }\n\n set name(value: string) {\n this.assign(\"name\", value);\n }\n\n get highlight(): string | null {\n return this.pick(\"highlight\");\n }\n\n set highlight(value: string | null) {\n this.assign(\"highlight\", value);\n }\n\n get inboxIds(): string[] {\n return this.pick(\"inbox_ids\");\n }\n\n set inboxIds(value: string[]) {\n this.assign(\"inbox_ids\", value);\n }\n\n get tagIds(): string[] {\n return this.pick(\"tag_ids\");\n }\n\n set tagIds(value: string[]) {\n this.assign(\"tag_ids\", value);\n }\n\n get notTagIds(): string[] {\n return this.pick(\"not_tag_ids\");\n }\n\n set notTagIds(value: string[]) {\n this.assign(\"not_tag_ids\", value);\n }\n\n get noTags(): boolean {\n return this.pick(\"no_tags\");\n }\n\n set noTags(value: boolean) {\n this.assign(\"no_tags\", value);\n }\n\n get assigneeIds(): string[] {\n return this.pick(\"assignee_ids\");\n }\n\n set assigneeIds(value: string[]) {\n this.assign(\"assignee_ids\", value);\n }\n\n get notAssigneeIds(): string[] {\n return this.pick(\"not_assignee_ids\");\n }\n\n set notAssigneeIds(value: string[]) {\n this.assign(\"not_assignee_ids\", value);\n }\n\n toUpdateBody(): UpdateView {\n return viewResponseToUpdateBody(this.state);\n }\n\n /**\n * Update this view (`PATCH /views/{view_id}`). Returns `204`; local state is merged.\n *\n * **Required scope:** `views:write`\n *\n * @see https://dev.frontapp.com/reference/update-view\n */\n async update(body: UpdateView | Partial<UpdateView>): Promise<void>;\n async update(viewId: string, body: UpdateView | Partial<UpdateView>): Promise<void>;\n async update(\n bodyOrViewId: string | UpdateView | Partial<UpdateView>,\n body?: UpdateView | Partial<UpdateView>,\n ): Promise<void> {\n if (typeof bodyOrViewId === \"string\") {\n if (body === undefined) {\n throw new Error(\"Updating a view by ID requires a request body.\");\n }\n await this.target(bodyOrViewId).update(body);\n return;\n }\n await this.patchNoContent(bodyOrViewId, mergeViewSnapshot);\n }\n\n /**\n * Add this view to teammates' sidebars (`POST /views/{view_id}/teammates`).\n *\n * **Required scope:** `views:write`\n *\n * @see https://dev.frontapp.com/reference/add-view-teammates\n */\n async addTeammates(body: AddViewTeammatesBody): Promise<void> {\n const path = FrontBase.expandPath(\"/views/{view_id}/teammates\", {\n view_id: this.id,\n });\n await this.base.requestJson<undefined>(\"POST\", path, { body });\n }\n /**\n * Views under `/views`.\n *\n * @see https://dev.frontapp.com/reference/views\n */\n /**\n * List views (`GET /views`).\n *\n * **Required scope:** `views:read`\n *\n * @param query Optional pagination (`limit`, `page_token`).\n * @see https://dev.frontapp.com/reference/list-views\n */\n async list(query?: ListViewsQuery): Promise<WithNormalizedPagination<ListViewsResponse>> {\n return await this.base.requestJson<WithNormalizedPagination<ListViewsResponse>>(\n \"GET\",\n \"/views\",\n { query: queryFromListViews(query) },\n );\n }\n\n /**\n * Fetch one view (`GET /views/{view_id}`).\n *\n * **Required scope:** `views:read`\n *\n * @see https://dev.frontapp.com/reference/get-view\n */\n async get(viewId: string): Promise<FrontViews> {\n const view = this.target(viewId);\n await view.refresh();\n return view;\n }\n\n /** Target a view by id without calling the API first. */\n private target(viewId: string): FrontViews {\n return new FrontViews(this.base, undefined, viewId);\n }\n}\n","import { FrontBase } from \"./base\";\nimport { FrontAccounts } from \"./resources/accounts\";\nimport { FrontAnalytics } from \"./resources/analytics\";\nimport { FrontApplications } from \"./resources/applications\";\nimport { FrontChannels } from \"./resources/channels\";\nimport { FrontComments } from \"./resources/comments\";\nimport { FrontCompany } from \"./resources/company\";\nimport { FrontContactLists } from \"./resources/contact-lists\";\nimport { FrontContacts } from \"./resources/contacts\";\nimport { FrontConversations } from \"./resources/conversations\";\nimport { FrontCustomFieldsGlobal } from \"./resources/custom-fields-global\";\nimport { FrontDownloads } from \"./resources/downloads\";\nimport { FrontDrafts } from \"./resources/drafts\";\nimport { FrontEvents } from \"./resources/events\";\nimport { FrontInboxes } from \"./resources/inboxes\";\nimport { FrontKnowledgeBases } from \"./resources/knowledge\";\nimport { FrontLinks } from \"./resources/links\";\nimport { FrontMe } from \"./resources/me\";\nimport { FrontMessageTemplateFolders } from \"./resources/message-template-folders\";\nimport { FrontMessageTemplates } from \"./resources/message-templates\";\nimport { FrontMessages } from \"./resources/messages\";\nimport { FrontRules } from \"./resources/rules\";\nimport { FrontShifts } from \"./resources/shifts\";\nimport { FrontSignatures } from \"./resources/signatures\";\nimport { FrontTags } from \"./resources/tags\";\nimport { FrontTeammateGroups } from \"./resources/teammate-groups\";\nimport { FrontTeammates } from \"./resources/teammates\";\nimport { FrontTeams } from \"./resources/teams\";\nimport { FrontViews } from \"./resources/views\";\n\nconst DEFAULT_BASE_URL = \"https://api2.frontapp.com\";\n\nconst resolveFrontApiToken = (): string | undefined => {\n const raw = process.env.FRONT_API_TOKEN;\n if (!raw) {\n return;\n }\n const v = raw.trim();\n return v.length > 0 ? v : undefined;\n};\n\n/** Options for the {@link Front} client constructor. */\nexport interface FrontOptions {\n /**\n * Front API token (Bearer). If omitted, reads `FRONT_API_TOKEN` from `process.env`.\n */\n apiKey?: string;\n /** Override the API base URL (default `https://api2.frontapp.com`). */\n baseUrl?: string;\n /** Use a custom `fetch` implementation (defaults to `globalThis.fetch`). */\n fetch?: typeof fetch;\n /** Override the User-Agent header sent with every request. */\n userAgent?: string;\n}\n\n/**\n * Application entry point for the Front REST API.\n *\n * Resource namespaces mirror OpenAPI path groups (accounts, analytics, applications, channels,\n * comments, company, contact lists, contacts, conversations, custom fields, downloads, drafts,\n * events, inboxes, knowledge bases, links, identity, message templates, messages, rules, shifts,\n * teammate groups, teams, tags, signatures, teammates, views).\n *\n * @see https://dev.frontapp.com/reference/introduction\n */\nexport class Front extends FrontBase {\n /** Accounts under `/accounts` (list, create, get) and `/accounts/custom_fields`. */\n readonly accounts: FrontAccounts;\n /** Analytics exports and reports under `/analytics/exports` and `/analytics/reports`. */\n readonly analytics: FrontAnalytics;\n /** Application triggers under `/applications/{application_uid}/events`. */\n readonly applications: FrontApplications;\n /** Channels under `/channels` and `/channels/{channel_id}`. */\n readonly channels: FrontChannels;\n /** Comments under `/comments/{comment_id}` and related sub-routes. */\n readonly comments: FrontComments;\n /** Company rules, ticket statuses, and company tags under `/company/*`. */\n readonly company: FrontCompany;\n /** Contact lists under `/contact_lists`. */\n readonly contactLists: FrontContactLists;\n /** Contacts under `/contacts`. */\n readonly contacts: FrontContacts;\n /** Conversations under `/conversations`. */\n readonly conversations: FrontConversations;\n /** Company-wide contact custom field definitions (`GET /custom_fields`). */\n readonly customFieldsGlobal: FrontCustomFieldsGlobal;\n /** Attachment download by link id (`GET /download/{attachment_link_id}`). */\n readonly downloads: FrontDownloads;\n /** Drafts under `/drafts`. */\n readonly drafts: FrontDrafts;\n /** Events under `/events`. */\n readonly events: FrontEvents;\n /** Inboxes under `/inboxes`. */\n readonly inboxes: FrontInboxes;\n /** Knowledge bases, articles, and categories (`/knowledge_bases`, `/knowledge_base_*`). */\n readonly knowledgeBases: FrontKnowledgeBases;\n /** Links under `/links`. */\n readonly links: FrontLinks;\n /** Current token identity (`GET /me`). */\n readonly me: FrontMe;\n /** Message template folders under `/message_template_folders`. */\n readonly messageTemplateFolders: FrontMessageTemplateFolders;\n /** Message templates under `/message_templates`. */\n readonly messageTemplates: FrontMessageTemplates;\n /** Messages under `/messages`. */\n readonly messages: FrontMessages;\n /** Rules under `/rules` (not `/company/rules`). */\n readonly rules: FrontRules;\n /** Shifts under `/shifts`. */\n readonly shifts: FrontShifts;\n /** Tags under `/tags` (company scope for the token). */\n readonly tags: FrontTags;\n /** Signatures under `/signatures/{id}` plus teammate/team list and create routes. */\n readonly signatures: FrontSignatures;\n /** Teammate groups under `/teammate_groups`. */\n readonly teammateGroups: FrontTeammateGroups;\n /** Teammates under `/teammates` and `/teammates/{id}` (non-deprecated Teammates operations). */\n readonly teammates: FrontTeammates;\n /** Teams under `/teams`. */\n readonly teams: FrontTeams;\n /** Views under `/views`. */\n readonly views: FrontViews;\n\n /**\n * @param options API credentials and optional HTTP overrides. A token is required either here or via `FRONT_API_TOKEN`.\n * @throws {Error} when no API token can be resolved.\n */\n constructor(options?: FrontOptions) {\n const { apiKey, baseUrl, fetch: fetchOption, userAgent } = options ?? {};\n const token = apiKey ?? resolveFrontApiToken();\n if (!token) {\n throw new Error(\n 'Front API token is required. Set FRONT_API_TOKEN in the environment or pass { apiKey: \"...\" } to the Front constructor.',\n );\n }\n super({\n apiKey: token,\n baseUrl: baseUrl ?? DEFAULT_BASE_URL,\n ...(fetchOption === undefined ? {} : { fetch: fetchOption }),\n ...(userAgent === undefined ? {} : { userAgent }),\n });\n this.accounts = new FrontAccounts(this);\n this.analytics = new FrontAnalytics(this);\n this.applications = new FrontApplications(this);\n this.channels = new FrontChannels(this);\n this.comments = new FrontComments(this);\n this.company = new FrontCompany(this);\n this.contactLists = new FrontContactLists(this);\n this.contacts = new FrontContacts(this);\n this.conversations = new FrontConversations(this);\n this.customFieldsGlobal = new FrontCustomFieldsGlobal(this);\n this.downloads = new FrontDownloads(this);\n this.drafts = new FrontDrafts(this);\n this.events = new FrontEvents(this);\n this.inboxes = new FrontInboxes(this);\n this.knowledgeBases = new FrontKnowledgeBases(this);\n this.links = new FrontLinks(this);\n this.me = new FrontMe(this);\n this.messageTemplateFolders = new FrontMessageTemplateFolders(this);\n this.messageTemplates = new FrontMessageTemplates(this);\n this.messages = new FrontMessages(this);\n this.rules = new FrontRules(this);\n this.shifts = new FrontShifts(this);\n this.tags = new FrontTags(this);\n this.signatures = new FrontSignatures(this);\n this.teammateGroups = new FrontTeammateGroups(this);\n this.teammates = new FrontTeammates(this);\n this.teams = new FrontTeams(this);\n this.views = new FrontViews(this);\n }\n}\n"],"mappings":"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"}