assembly-kit 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/CLAUDE.md +205 -0
  2. package/LICENSE +21 -0
  3. package/README.md +516 -0
  4. package/dist/bridge-ui/index.d.mts +4 -0
  5. package/dist/bridge-ui/index.mjs +5 -0
  6. package/dist/bridge-ui/use-actions-menu.d.mts +16 -0
  7. package/dist/bridge-ui/use-actions-menu.mjs +33 -0
  8. package/dist/bridge-ui/use-actions-menu.mjs.map +1 -0
  9. package/dist/bridge-ui/use-primary-cta.d.mts +16 -0
  10. package/dist/bridge-ui/use-primary-cta.mjs +34 -0
  11. package/dist/bridge-ui/use-primary-cta.mjs.map +1 -0
  12. package/dist/bridge-ui/use-secondary-cta.d.mts +16 -0
  13. package/dist/bridge-ui/use-secondary-cta.mjs +34 -0
  14. package/dist/bridge-ui/use-secondary-cta.mjs.map +1 -0
  15. package/dist/client/index.d.mts +108 -0
  16. package/dist/client/index.mjs +168 -0
  17. package/dist/client/index.mjs.map +1 -0
  18. package/dist/client/options.d.mts +40 -0
  19. package/dist/constants/kit-mode.d.mts +15 -0
  20. package/dist/constants/kit-mode.mjs +15 -0
  21. package/dist/constants/kit-mode.mjs.map +1 -0
  22. package/dist/errors/base.d.mts +29 -0
  23. package/dist/errors/base.mjs +16 -0
  24. package/dist/errors/base.mjs.map +1 -0
  25. package/dist/errors/connection.d.mts +12 -0
  26. package/dist/errors/connection.mjs +16 -0
  27. package/dist/errors/connection.mjs.map +1 -0
  28. package/dist/errors/forbidden.d.mts +12 -0
  29. package/dist/errors/forbidden.mjs +16 -0
  30. package/dist/errors/forbidden.mjs.map +1 -0
  31. package/dist/errors/index.d.mts +13 -0
  32. package/dist/errors/index.mjs +13 -0
  33. package/dist/errors/invalid-token.d.mts +12 -0
  34. package/dist/errors/invalid-token.mjs +16 -0
  35. package/dist/errors/invalid-token.mjs.map +1 -0
  36. package/dist/errors/missing-api-key.d.mts +12 -0
  37. package/dist/errors/missing-api-key.mjs +16 -0
  38. package/dist/errors/missing-api-key.mjs.map +1 -0
  39. package/dist/errors/no-token.d.mts +12 -0
  40. package/dist/errors/no-token.mjs +16 -0
  41. package/dist/errors/no-token.mjs.map +1 -0
  42. package/dist/errors/not-found.d.mts +12 -0
  43. package/dist/errors/not-found.mjs +16 -0
  44. package/dist/errors/not-found.mjs.map +1 -0
  45. package/dist/errors/rate-limit.d.mts +17 -0
  46. package/dist/errors/rate-limit.mjs +18 -0
  47. package/dist/errors/rate-limit.mjs.map +1 -0
  48. package/dist/errors/response-parse.d.mts +19 -0
  49. package/dist/errors/response-parse.mjs +23 -0
  50. package/dist/errors/response-parse.mjs.map +1 -0
  51. package/dist/errors/server.d.mts +12 -0
  52. package/dist/errors/server.mjs +16 -0
  53. package/dist/errors/server.mjs.map +1 -0
  54. package/dist/errors/unauthorized.d.mts +12 -0
  55. package/dist/errors/unauthorized.mjs +16 -0
  56. package/dist/errors/unauthorized.mjs.map +1 -0
  57. package/dist/errors/validation.d.mts +12 -0
  58. package/dist/errors/validation.mjs +16 -0
  59. package/dist/errors/validation.mjs.map +1 -0
  60. package/dist/index.d.mts +49 -0
  61. package/dist/index.mjs +51 -0
  62. package/dist/lib/modules/app-connections/resource.d.mts +28 -0
  63. package/dist/lib/modules/app-connections/resource.mjs +33 -0
  64. package/dist/lib/modules/app-connections/resource.mjs.map +1 -0
  65. package/dist/lib/modules/app-connections/schema.d.mts +37 -0
  66. package/dist/lib/modules/app-connections/schema.mjs +30 -0
  67. package/dist/lib/modules/app-connections/schema.mjs.map +1 -0
  68. package/dist/lib/modules/app-installs/resource.d.mts +21 -0
  69. package/dist/lib/modules/app-installs/resource.mjs +31 -0
  70. package/dist/lib/modules/app-installs/resource.mjs.map +1 -0
  71. package/dist/lib/modules/app-installs/schema.d.mts +22 -0
  72. package/dist/lib/modules/app-installs/schema.mjs +23 -0
  73. package/dist/lib/modules/app-installs/schema.mjs.map +1 -0
  74. package/dist/lib/modules/clients/resource.d.mts +43 -0
  75. package/dist/lib/modules/clients/resource.mjs +62 -0
  76. package/dist/lib/modules/clients/resource.mjs.map +1 -0
  77. package/dist/lib/modules/clients/schema.d.mts +50 -0
  78. package/dist/lib/modules/clients/schema.mjs +52 -0
  79. package/dist/lib/modules/clients/schema.mjs.map +1 -0
  80. package/dist/lib/modules/companies/resource.d.mts +37 -0
  81. package/dist/lib/modules/companies/resource.mjs +60 -0
  82. package/dist/lib/modules/companies/resource.mjs.map +1 -0
  83. package/dist/lib/modules/companies/schema.d.mts +39 -0
  84. package/dist/lib/modules/companies/schema.mjs +34 -0
  85. package/dist/lib/modules/companies/schema.mjs.map +1 -0
  86. package/dist/lib/modules/contract-templates/resource.d.mts +27 -0
  87. package/dist/lib/modules/contract-templates/resource.mjs +40 -0
  88. package/dist/lib/modules/contract-templates/resource.mjs.map +1 -0
  89. package/dist/lib/modules/contract-templates/schema.d.mts +21 -0
  90. package/dist/lib/modules/contract-templates/schema.mjs +18 -0
  91. package/dist/lib/modules/contract-templates/schema.mjs.map +1 -0
  92. package/dist/lib/modules/contracts/resource.d.mts +29 -0
  93. package/dist/lib/modules/contracts/resource.mjs +40 -0
  94. package/dist/lib/modules/contracts/resource.mjs.map +1 -0
  95. package/dist/lib/modules/contracts/schema.d.mts +50 -0
  96. package/dist/lib/modules/contracts/schema.mjs +45 -0
  97. package/dist/lib/modules/contracts/schema.mjs.map +1 -0
  98. package/dist/lib/modules/custom-field-options/index.d.mts +1 -0
  99. package/dist/lib/modules/custom-field-options/index.mjs +2 -0
  100. package/dist/lib/modules/custom-field-options/resource.d.mts +22 -0
  101. package/dist/lib/modules/custom-field-options/resource.mjs +25 -0
  102. package/dist/lib/modules/custom-field-options/resource.mjs.map +1 -0
  103. package/dist/lib/modules/custom-field-options/schema.d.mts +18 -0
  104. package/dist/lib/modules/custom-field-options/schema.mjs +13 -0
  105. package/dist/lib/modules/custom-field-options/schema.mjs.map +1 -0
  106. package/dist/lib/modules/custom-fields/resource.d.mts +21 -0
  107. package/dist/lib/modules/custom-fields/resource.mjs +24 -0
  108. package/dist/lib/modules/custom-fields/resource.mjs.map +1 -0
  109. package/dist/lib/modules/custom-fields/schema.d.mts +43 -0
  110. package/dist/lib/modules/custom-fields/schema.mjs +44 -0
  111. package/dist/lib/modules/custom-fields/schema.mjs.map +1 -0
  112. package/dist/lib/modules/events/resource.d.mts +33 -0
  113. package/dist/lib/modules/events/resource.mjs +49 -0
  114. package/dist/lib/modules/events/resource.mjs.map +1 -0
  115. package/dist/lib/modules/events/schema.d.mts +52 -0
  116. package/dist/lib/modules/events/schema.mjs +49 -0
  117. package/dist/lib/modules/events/schema.mjs.map +1 -0
  118. package/dist/lib/modules/file-channels/resource.d.mts +26 -0
  119. package/dist/lib/modules/file-channels/resource.mjs +48 -0
  120. package/dist/lib/modules/file-channels/resource.mjs.map +1 -0
  121. package/dist/lib/modules/file-channels/schema.d.mts +33 -0
  122. package/dist/lib/modules/file-channels/schema.mjs +28 -0
  123. package/dist/lib/modules/file-channels/schema.mjs.map +1 -0
  124. package/dist/lib/modules/files/resource.d.mts +40 -0
  125. package/dist/lib/modules/files/resource.mjs +52 -0
  126. package/dist/lib/modules/files/resource.mjs.map +1 -0
  127. package/dist/lib/modules/files/schema.d.mts +27 -0
  128. package/dist/lib/modules/files/schema.mjs +27 -0
  129. package/dist/lib/modules/files/schema.mjs.map +1 -0
  130. package/dist/lib/modules/form-responses/resource.d.mts +24 -0
  131. package/dist/lib/modules/form-responses/resource.mjs +34 -0
  132. package/dist/lib/modules/form-responses/resource.mjs.map +1 -0
  133. package/dist/lib/modules/form-responses/schema.d.mts +29 -0
  134. package/dist/lib/modules/form-responses/schema.mjs +23 -0
  135. package/dist/lib/modules/form-responses/schema.mjs.map +1 -0
  136. package/dist/lib/modules/forms/resource.d.mts +24 -0
  137. package/dist/lib/modules/forms/resource.mjs +40 -0
  138. package/dist/lib/modules/forms/resource.mjs.map +1 -0
  139. package/dist/lib/modules/forms/schema.d.mts +22 -0
  140. package/dist/lib/modules/forms/schema.mjs +19 -0
  141. package/dist/lib/modules/forms/schema.mjs.map +1 -0
  142. package/dist/lib/modules/index.d.mts +28 -0
  143. package/dist/lib/modules/index.mjs +29 -0
  144. package/dist/lib/modules/internal-users/resource.d.mts +24 -0
  145. package/dist/lib/modules/internal-users/resource.mjs +37 -0
  146. package/dist/lib/modules/internal-users/resource.mjs.map +1 -0
  147. package/dist/lib/modules/internal-users/schema.d.mts +27 -0
  148. package/dist/lib/modules/internal-users/schema.mjs +24 -0
  149. package/dist/lib/modules/internal-users/schema.mjs.map +1 -0
  150. package/dist/lib/modules/invoice-templates/resource.d.mts +22 -0
  151. package/dist/lib/modules/invoice-templates/resource.mjs +32 -0
  152. package/dist/lib/modules/invoice-templates/resource.mjs.map +1 -0
  153. package/dist/lib/modules/invoice-templates/schema.d.mts +21 -0
  154. package/dist/lib/modules/invoice-templates/schema.mjs +18 -0
  155. package/dist/lib/modules/invoice-templates/schema.mjs.map +1 -0
  156. package/dist/lib/modules/invoices/resource.d.mts +30 -0
  157. package/dist/lib/modules/invoices/resource.mjs +48 -0
  158. package/dist/lib/modules/invoices/resource.mjs.map +1 -0
  159. package/dist/lib/modules/invoices/schema.d.mts +81 -0
  160. package/dist/lib/modules/invoices/schema.mjs +75 -0
  161. package/dist/lib/modules/invoices/schema.mjs.map +1 -0
  162. package/dist/lib/modules/message-channels/resource.d.mts +26 -0
  163. package/dist/lib/modules/message-channels/resource.mjs +48 -0
  164. package/dist/lib/modules/message-channels/resource.mjs.map +1 -0
  165. package/dist/lib/modules/message-channels/schema.d.mts +35 -0
  166. package/dist/lib/modules/message-channels/schema.mjs +30 -0
  167. package/dist/lib/modules/message-channels/schema.mjs.map +1 -0
  168. package/dist/lib/modules/messages/resource.d.mts +27 -0
  169. package/dist/lib/modules/messages/resource.mjs +40 -0
  170. package/dist/lib/modules/messages/resource.mjs.map +1 -0
  171. package/dist/lib/modules/messages/schema.d.mts +30 -0
  172. package/dist/lib/modules/messages/schema.mjs +26 -0
  173. package/dist/lib/modules/messages/schema.mjs.map +1 -0
  174. package/dist/lib/modules/notes/resource.d.mts +37 -0
  175. package/dist/lib/modules/notes/resource.mjs +60 -0
  176. package/dist/lib/modules/notes/resource.mjs.map +1 -0
  177. package/dist/lib/modules/notes/schema.d.mts +34 -0
  178. package/dist/lib/modules/notes/schema.mjs +27 -0
  179. package/dist/lib/modules/notes/schema.mjs.map +1 -0
  180. package/dist/lib/modules/notifications/resource.d.mts +27 -0
  181. package/dist/lib/modules/notifications/resource.mjs +52 -0
  182. package/dist/lib/modules/notifications/resource.mjs.map +1 -0
  183. package/dist/lib/modules/notifications/schema.d.mts +52 -0
  184. package/dist/lib/modules/notifications/schema.mjs +43 -0
  185. package/dist/lib/modules/notifications/schema.mjs.map +1 -0
  186. package/dist/lib/modules/payments/resource.d.mts +26 -0
  187. package/dist/lib/modules/payments/resource.mjs +32 -0
  188. package/dist/lib/modules/payments/resource.mjs.map +1 -0
  189. package/dist/lib/modules/payments/schema.d.mts +23 -0
  190. package/dist/lib/modules/payments/schema.mjs +20 -0
  191. package/dist/lib/modules/payments/schema.mjs.map +1 -0
  192. package/dist/lib/modules/prices/resource.d.mts +27 -0
  193. package/dist/lib/modules/prices/resource.mjs +40 -0
  194. package/dist/lib/modules/prices/resource.mjs.map +1 -0
  195. package/dist/lib/modules/prices/schema.d.mts +22 -0
  196. package/dist/lib/modules/prices/schema.mjs +19 -0
  197. package/dist/lib/modules/prices/schema.mjs.map +1 -0
  198. package/dist/lib/modules/products/resource.d.mts +24 -0
  199. package/dist/lib/modules/products/resource.mjs +40 -0
  200. package/dist/lib/modules/products/resource.mjs.map +1 -0
  201. package/dist/lib/modules/products/schema.d.mts +22 -0
  202. package/dist/lib/modules/products/schema.mjs +19 -0
  203. package/dist/lib/modules/products/schema.mjs.map +1 -0
  204. package/dist/lib/modules/subscription-templates/resource.d.mts +22 -0
  205. package/dist/lib/modules/subscription-templates/resource.mjs +32 -0
  206. package/dist/lib/modules/subscription-templates/resource.mjs.map +1 -0
  207. package/dist/lib/modules/subscription-templates/schema.d.mts +21 -0
  208. package/dist/lib/modules/subscription-templates/schema.mjs +18 -0
  209. package/dist/lib/modules/subscription-templates/schema.mjs.map +1 -0
  210. package/dist/lib/modules/subscriptions/resource.d.mts +32 -0
  211. package/dist/lib/modules/subscriptions/resource.mjs +56 -0
  212. package/dist/lib/modules/subscriptions/resource.mjs.map +1 -0
  213. package/dist/lib/modules/subscriptions/schema.d.mts +31 -0
  214. package/dist/lib/modules/subscriptions/schema.mjs +26 -0
  215. package/dist/lib/modules/subscriptions/schema.mjs.map +1 -0
  216. package/dist/lib/modules/task-templates/resource.d.mts +24 -0
  217. package/dist/lib/modules/task-templates/resource.mjs +40 -0
  218. package/dist/lib/modules/task-templates/resource.mjs.map +1 -0
  219. package/dist/lib/modules/task-templates/schema.d.mts +22 -0
  220. package/dist/lib/modules/task-templates/schema.mjs +19 -0
  221. package/dist/lib/modules/task-templates/schema.mjs.map +1 -0
  222. package/dist/lib/modules/tasks/resource.d.mts +38 -0
  223. package/dist/lib/modules/tasks/resource.mjs +60 -0
  224. package/dist/lib/modules/tasks/resource.mjs.map +1 -0
  225. package/dist/lib/modules/tasks/schema.d.mts +45 -0
  226. package/dist/lib/modules/tasks/schema.mjs +43 -0
  227. package/dist/lib/modules/tasks/schema.mjs.map +1 -0
  228. package/dist/lib/modules/workspace/resource.d.mts +19 -0
  229. package/dist/lib/modules/workspace/resource.mjs +23 -0
  230. package/dist/lib/modules/workspace/resource.mjs.map +1 -0
  231. package/dist/lib/modules/workspace/schema.d.mts +23 -0
  232. package/dist/lib/modules/workspace/schema.mjs +21 -0
  233. package/dist/lib/modules/workspace/schema.mjs.map +1 -0
  234. package/dist/lib/pagination/paginate.d.mts +8 -0
  235. package/dist/lib/pagination/paginate.mjs +24 -0
  236. package/dist/lib/pagination/paginate.mjs.map +1 -0
  237. package/dist/logger/index.d.mts +26 -0
  238. package/dist/logger/index.mjs +45 -0
  239. package/dist/logger/index.mjs.map +1 -0
  240. package/dist/schemas/index.d.mts +32 -0
  241. package/dist/schemas/index.mjs +34 -0
  242. package/dist/schemas/shared/hex-color.d.mts +8 -0
  243. package/dist/schemas/shared/hex-color.mjs +7 -0
  244. package/dist/schemas/shared/hex-color.mjs.map +1 -0
  245. package/dist/schemas/shared/index.d.mts +3 -0
  246. package/dist/schemas/shared/index.mjs +4 -0
  247. package/dist/schemas/shared/membership-type.d.mts +9 -0
  248. package/dist/schemas/shared/membership-type.mjs +11 -0
  249. package/dist/schemas/shared/membership-type.mjs.map +1 -0
  250. package/dist/schemas/shared/token.d.mts +22 -0
  251. package/dist/schemas/shared/token.mjs +21 -0
  252. package/dist/schemas/shared/token.mjs.map +1 -0
  253. package/dist/token/assembly-token.d.mts +96 -0
  254. package/dist/token/assembly-token.mjs +117 -0
  255. package/dist/token/assembly-token.mjs.map +1 -0
  256. package/dist/token/crypto.mjs +98 -0
  257. package/dist/token/crypto.mjs.map +1 -0
  258. package/dist/token/index.d.mts +3 -0
  259. package/dist/token/index.mjs +3 -0
  260. package/dist/token/parse.d.mts +24 -0
  261. package/dist/token/parse.mjs +62 -0
  262. package/dist/token/parse.mjs.map +1 -0
  263. package/dist/transport/build-search-params.mjs +16 -0
  264. package/dist/transport/build-search-params.mjs.map +1 -0
  265. package/dist/transport/http.d.mts +14 -0
  266. package/dist/transport/http.mjs +142 -0
  267. package/dist/transport/http.mjs.map +1 -0
  268. package/dist/transport/parse-response.mjs +17 -0
  269. package/dist/transport/parse-response.mjs.map +1 -0
  270. package/dist/version.mjs +7 -0
  271. package/dist/version.mjs.map +1 -0
  272. package/package.json +93 -0
package/README.md ADDED
@@ -0,0 +1,516 @@
1
+ # assembly-kit
2
+
3
+ TypeScript SDK for the [Assembly](https://assembly.ac) platform. ESM-only, targets Node.js 18+, Node.js 24+, and Bun.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add assembly-kit
9
+ # or
10
+ bun add assembly-kit
11
+ # or
12
+ npm install assembly-kit
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ### Client
18
+
19
+ Create an SDK client with `createAssemblyKit()`. At least one of `token` or `workspaceId` must be provided:
20
+
21
+ ```typescript
22
+ import { createAssemblyKit } from "assembly-kit";
23
+
24
+ // With token (e.g. marketplace apps, portal users)
25
+ const kit = createAssemblyKit({
26
+ apiKey: "your-api-key",
27
+ token: encryptedToken,
28
+ });
29
+
30
+ // With workspaceId only (server-to-server, local dev)
31
+ const kit = createAssemblyKit({
32
+ apiKey: "your-api-key",
33
+ workspaceId: "ws-123",
34
+ });
35
+
36
+ // Access resources via namespaces
37
+ const workspace = await kit.workspace.retrieve();
38
+ const companies = await kit.companies.list();
39
+ const task = await kit.tasks.create({ title: "Follow up", ... });
40
+ ```
41
+
42
+ When only `workspaceId` is provided (no token), the SDK automatically sets `ASSEMBLY_ENV=local` at runtime and builds the compound key as `workspaceId/apiKey`.
43
+
44
+ #### Multiple workspaces
45
+
46
+ Each `createAssemblyKit()` call returns a fully independent client. To work with multiple workspaces or API keys, create one instance per credential set.
47
+
48
+ **React Server Components (recommended):** Use React's `cache()` to deduplicate instances per request. This is the idiomatic approach for Next.js App Router:
49
+
50
+ ```typescript
51
+ // lib/assembly.ts
52
+ import { cache } from "react";
53
+ import { createAssemblyKit } from "assembly-kit";
54
+
55
+ export const getAssemblyKit = cache((apiKey: string, workspaceId: string) =>
56
+ createAssemblyKit({ apiKey, workspaceId }),
57
+ );
58
+
59
+ // In any Server Component or server action:
60
+ const kitA = getAssemblyKit("api-key-a", "ws-workspace-a");
61
+ const kitB = getAssemblyKit("api-key-b", "ws-workspace-b");
62
+
63
+ // Same args within the same request → same instance (deduplicated by React)
64
+ const same = getAssemblyKit("api-key-a", "ws-workspace-a"); // === kitA
65
+ ```
66
+
67
+ **Plain Node.js / Bun:** Manage your own singleton map:
68
+
69
+ ```typescript
70
+ import { createAssemblyKit } from "assembly-kit";
71
+ import type { AssemblyKit } from "assembly-kit";
72
+
73
+ const clients = new Map<string, AssemblyKit>();
74
+
75
+ function getKit(apiKey: string, workspaceId: string): AssemblyKit {
76
+ const existing = clients.get(workspaceId);
77
+ if (existing) return existing;
78
+
79
+ const kit = createAssemblyKit({ apiKey, workspaceId });
80
+ clients.set(workspaceId, kit);
81
+ return kit;
82
+ }
83
+
84
+ const kitA = getKit("api-key-a", "ws-workspace-a");
85
+ const kitB = getKit("api-key-b", "ws-workspace-b");
86
+ ```
87
+
88
+ #### Options
89
+
90
+ | Option | Type | Default | Description |
91
+ | ------------------- | --------------------- | --------- | ------------------------------------------------------------------------- |
92
+ | `apiKey` | `string` | — | Required. Your Assembly API key. |
93
+ | `token` | `string` | — | Encrypted token from Assembly. Required if `workspaceId` is not provided. |
94
+ | `workspaceId` | `string` | — | Explicit workspace ID. Required if `token` is not provided. |
95
+ | `retry` | `RetryOptions\|false` | see below | Retry config, or `false` to disable retry entirely. |
96
+ | `validateResponses` | `boolean` | `true` | When true, all responses are validated through Zod schemas. |
97
+
98
+ **Default retry options:**
99
+
100
+ | Option | Default |
101
+ | ------------ | ------- |
102
+ | `retries` | `3` |
103
+ | `minTimeout` | `1000` |
104
+ | `maxTimeout` | `5000` |
105
+ | `factor` | `2` |
106
+
107
+ #### Token properties
108
+
109
+ When a token is provided, the decrypted payload is available directly on the instance:
110
+
111
+ ```typescript
112
+ const kit = createAssemblyKit({ apiKey, token });
113
+
114
+ kit.token; // AssemblyToken | undefined — the decrypted token instance
115
+ kit.payload; // TokenPayload | undefined — the decrypted token payload
116
+
117
+ // Assert token type — throws AssemblyNoTokenError or AssemblyUnauthorizedError
118
+ const clientPayload = kit.ensureIsClient(); // ClientTokenPayload
119
+ const internalPayload = kit.ensureIsInternalUser(); // InternalUserTokenPayload
120
+ ```
121
+
122
+ #### Disabling response validation
123
+
124
+ ```typescript
125
+ const kit = createAssemblyKit({
126
+ apiKey: "your-api-key",
127
+ token: encryptedToken,
128
+ validateResponses: false, // skip Zod parsing for performance
129
+ });
130
+ ```
131
+
132
+ #### Disabling retry
133
+
134
+ ```typescript
135
+ const kit = createAssemblyKit({
136
+ apiKey: "your-api-key",
137
+ token: encryptedToken,
138
+ retry: false,
139
+ });
140
+ ```
141
+
142
+ #### Resource namespaces
143
+
144
+ | Namespace | Methods |
145
+ | ----------------------- | ----------------------------------------------------------------------- |
146
+ | `workspace` | `retrieve()` |
147
+ | `clients` | `list()`, `retrieve()`, `create()`, `update()`, `delete()`, `listAll()` |
148
+ | `companies` | `list()`, `retrieve()`, `create()`, `update()`, `delete()`, `listAll()` |
149
+ | `internalUsers` | `list()`, `retrieve()`, `listAll()` |
150
+ | `customFields` | `list()` |
151
+ | `customFieldOptions` | `list()` |
152
+ | `notes` | `list()`, `retrieve()`, `create()`, `update()`, `delete()`, `listAll()` |
153
+ | `messageChannels` | `list()`, `retrieve()`, `create()`, `listAll()` |
154
+ | `messages` | `list()`, `send()`, `listAll()` |
155
+ | `products` | `list()`, `retrieve()`, `listAll()` |
156
+ | `prices` | `list()`, `retrieve()`, `listAll()` |
157
+ | `invoiceTemplates` | `list()`, `listAll()` |
158
+ | `invoices` | `list()`, `retrieve()`, `create()`, `listAll()` |
159
+ | `subscriptionTemplates` | `list()`, `listAll()` |
160
+ | `subscriptions` | `list()`, `retrieve()`, `create()`, `cancel()`, `listAll()` |
161
+ | `payments` | `list()`, `listAll()` |
162
+ | `fileChannels` | `list()`, `retrieve()`, `create()`, `listAll()` |
163
+ | `files` | `list()`, `retrieve()`, `create()`, `delete()`, `listAll()` |
164
+ | `contractTemplates` | `list()`, `retrieve()`, `listAll()` |
165
+ | `contracts` | `list()`, `retrieve()`, `send()` |
166
+ | `forms` | `list()`, `retrieve()`, `listAll()` |
167
+ | `formResponses` | `list()`, `create()` |
168
+ | `tasks` | `list()`, `retrieve()`, `create()`, `update()`, `delete()`, `listAll()` |
169
+ | `taskTemplates` | `list()`, `retrieve()`, `listAll()` |
170
+ | `notifications` | `list()`, `create()`, `delete()`, `markRead()`, `markUnread()` |
171
+ | `events` | `list()`, `retrieve()`, `create()`, `listAll()` |
172
+ | `appConnections` | `list()`, `create()` |
173
+ | `appInstalls` | `list()`, `retrieve()` |
174
+
175
+ ### Pagination
176
+
177
+ Every resource that supports listing also exposes `listAll()`, which collects all pages into a single array by following `nextToken` cursors automatically:
178
+
179
+ ```typescript
180
+ import { AssemblyKit } from "assembly-kit";
181
+
182
+ const kit = createAssemblyKit({ apiKey, token });
183
+
184
+ // Returns Promise<Company[]> — all pages collected
185
+ const allCompanies = await kit.companies.listAll();
186
+
187
+ // Filter arguments are passed through on every page
188
+ const allTasks = await kit.tasks.listAll({ status: "open" });
189
+ ```
190
+
191
+ For manual pagination, use `list()` directly and handle `nextToken` yourself:
192
+
193
+ ```typescript
194
+ const page1 = await kit.companies.list({ limit: 100 });
195
+ if (page1.nextToken) {
196
+ const page2 = await kit.companies.list({ limit: 100, nextToken: page1.nextToken });
197
+ }
198
+ ```
199
+
200
+ ### Error classes
201
+
202
+ All errors extend the base `AssemblyError` class, which carries a `statusCode` and optional `details` payload. Import from the package root or from `assembly-kit/errors`:
203
+
204
+ ```typescript
205
+ import {
206
+ AssemblyError,
207
+ AssemblyMissingApiKeyError,
208
+ AssemblyNoTokenError,
209
+ AssemblyInvalidTokenError,
210
+ AssemblyUnauthorizedError,
211
+ AssemblyForbiddenError,
212
+ AssemblyNotFoundError,
213
+ AssemblyValidationError,
214
+ AssemblyRateLimitError,
215
+ AssemblyServerError,
216
+ AssemblyConnectionError,
217
+ AssemblyResponseParseError,
218
+ } from "assembly-kit";
219
+ ```
220
+
221
+ #### Catching errors
222
+
223
+ ```typescript
224
+ import { AssemblyRateLimitError, AssemblyUnauthorizedError, AssemblyError } from "assembly-kit";
225
+
226
+ try {
227
+ await kit.companies.retrieve(id);
228
+ } catch (err) {
229
+ if (err instanceof AssemblyRateLimitError) {
230
+ console.log("Retry after:", err.retryAfter); // seconds, if provided
231
+ } else if (err instanceof AssemblyUnauthorizedError) {
232
+ console.log("Check your API key");
233
+ } else if (err instanceof AssemblyError) {
234
+ console.log(err.message, err.statusCode, err.details);
235
+ }
236
+ }
237
+ ```
238
+
239
+ #### Error hierarchy
240
+
241
+ | Class | Status | Thrown when |
242
+ | ---------------------------- | ------ | ------------------------------------------------------- |
243
+ | `AssemblyError` | — | Base class for all errors |
244
+ | `AssemblyMissingApiKeyError` | 400 | API key is absent or empty |
245
+ | `AssemblyNoTokenError` | 400 | Token required but not provided |
246
+ | `AssemblyInvalidTokenError` | 401 | Token could not be decrypted or validated |
247
+ | `AssemblyUnauthorizedError` | 401 | API key rejected, or token fails identity assertion |
248
+ | `AssemblyForbiddenError` | 403 | API key lacks required permission |
249
+ | `AssemblyNotFoundError` | 404 | Requested resource does not exist |
250
+ | `AssemblyValidationError` | 422 | Request payload rejected by API |
251
+ | `AssemblyRateLimitError` | 429 | Rate limit exceeded (`.retryAfter?: number`) |
252
+ | `AssemblyServerError` | 500 | Unexpected error on Assembly servers |
253
+ | `AssemblyResponseParseError` | 500 | API response failed Zod schema validation (`.zodError`) |
254
+ | `AssemblyConnectionError` | 503 | Network error reaching the API |
255
+
256
+ ### Schemas
257
+
258
+ All Zod schemas are available from `assembly-kit/schemas` (also re-exported from the package root). Each resource has a base schema, a response schema (for paginated API responses), and optionally a request schema for create/update payloads.
259
+
260
+ ```typescript
261
+ import {
262
+ ClientSchema,
263
+ CompanySchema,
264
+ TaskSchema,
265
+ TaskStatusSchema,
266
+ WorkspaceSchema,
267
+ InternalUserSchema,
268
+ InvoiceSchema,
269
+ CustomFieldSchema,
270
+ TokenPayloadSchema,
271
+ HexColorSchema,
272
+ } from "assembly-kit/schemas";
273
+
274
+ // TypeScript types inferred from schemas
275
+ import type {
276
+ Client,
277
+ Company,
278
+ Task,
279
+ TaskStatus,
280
+ Workspace,
281
+ InternalUser,
282
+ } from "assembly-kit/schemas";
283
+ ```
284
+
285
+ #### Response schemas
286
+
287
+ ```typescript
288
+ import {
289
+ ClientsResponseSchema,
290
+ CompaniesResponseSchema,
291
+ TasksResponseSchema,
292
+ } from "assembly-kit/schemas";
293
+
294
+ import type { ClientsResponse, CompaniesResponse, TasksResponse } from "assembly-kit/schemas";
295
+ ```
296
+
297
+ #### Request schemas
298
+
299
+ ```typescript
300
+ import {
301
+ ClientCreateRequestSchema,
302
+ ClientUpdateRequestSchema,
303
+ CompanyCreateRequestSchema,
304
+ TaskCreateRequestSchema,
305
+ } from "assembly-kit/schemas";
306
+
307
+ import type { ClientCreateRequest, ClientUpdateRequest } from "assembly-kit/schemas";
308
+ ```
309
+
310
+ #### Validating data
311
+
312
+ ```typescript
313
+ import { ClientSchema } from "assembly-kit/schemas";
314
+
315
+ const result = ClientSchema.safeParse(unknownData);
316
+
317
+ if (result.success) {
318
+ console.log(result.data.name);
319
+ } else {
320
+ console.error(result.error);
321
+ }
322
+ ```
323
+
324
+ ### Token Utilities
325
+
326
+ Decrypt, validate, and inspect encrypted Assembly tokens using the `AssemblyToken` class. These utilities are standalone — they are also used internally by `AssemblyKit` when a token is provided.
327
+
328
+ Import from either the package root or from `assembly-kit/token`:
329
+
330
+ ```typescript
331
+ import { AssemblyToken, createToken } from "assembly-kit";
332
+ // or
333
+ import { AssemblyToken, createToken } from "assembly-kit/token";
334
+ ```
335
+
336
+ #### `AssemblyToken`
337
+
338
+ Decrypts and validates a token using your API key. The constructor exposes the payload along with convenience getters and guard methods:
339
+
340
+ ```typescript
341
+ import { AssemblyToken } from "assembly-kit";
342
+
343
+ const token = new AssemblyToken({ token: encryptedTokenHex, apiKey });
344
+
345
+ // Convenience getters
346
+ token.workspaceId; // string — always present
347
+ token.clientId; // string | undefined — present for client (portal) users
348
+ token.companyId; // string | undefined — present for client users
349
+ token.internalUserId; // string | undefined — present for internal (team member) users
350
+ token.tokenId; // string | undefined — present in some marketplace tokens
351
+ token.baseUrl; // string | undefined — overrides the API base URL if set
352
+
353
+ // Identity checks
354
+ token.isClientUser; // true if clientId + companyId are present
355
+ token.isInternalUser; // true if internalUserId is present
356
+
357
+ // Throwing guards — return narrowed payload type or throw AssemblyUnauthorizedError
358
+ const clientPayload = token.ensureIsClient(); // ClientTokenPayload
359
+ const internalPayload = token.ensureIsInternalUser(); // InternalUserTokenPayload
360
+
361
+ // Build the compound API key for the X-API-Key header
362
+ const key = token.buildCompoundKey({ apiKey });
363
+ // With tokenId: "workspaceId/apiKey/tokenId"
364
+ // Without tokenId: "workspaceId/apiKey"
365
+ ```
366
+
367
+ Throws `AssemblyNoTokenError` if the token is missing, or `AssemblyInvalidTokenError` if decryption or validation fails.
368
+
369
+ For request-scoped usage, use `AssemblyToken.new()` — it returns the existing instance for the current async context if the token matches:
370
+
371
+ ```typescript
372
+ const token = AssemblyToken.new({ token: encryptedTokenHex, apiKey });
373
+ ```
374
+
375
+ #### `createToken`
376
+
377
+ Encrypt a `TokenPayload` into a hex-encoded token string (the inverse of `new AssemblyToken()`):
378
+
379
+ ```typescript
380
+ import { createToken } from "assembly-kit";
381
+
382
+ const encrypted = createToken({
383
+ payload: {
384
+ workspaceId: "ws-123",
385
+ clientId: "cl-456",
386
+ companyId: "co-789",
387
+ },
388
+ apiKey,
389
+ });
390
+ // encrypted is a hex-encoded AES-128-CBC encrypted string
391
+ ```
392
+
393
+ The payload is validated against `TokenPayloadSchema` before encryption. Throws `AssemblyInvalidTokenError` if validation fails. Each call produces a different ciphertext (random IV).
394
+
395
+ ### Logger
396
+
397
+ A request-scoped Pino logger is available from `assembly-kit/logger`. Requires `pino` and `pino-pretty` as peer dependencies.
398
+
399
+ ```typescript
400
+ import { createLogger, logger } from "assembly-kit/logger";
401
+
402
+ // Request-scoped: returns the same instance within the same async context
403
+ const log = createLogger({ level: "debug" });
404
+ log.info("hello");
405
+ log.warn("careful");
406
+
407
+ // Or use the default module-level logger
408
+ import { logger } from "assembly-kit/logger";
409
+ logger.info("starting up");
410
+ ```
411
+
412
+ The logger uses `pino-pretty` in non-production environments and plain JSON in production (`NODE_ENV=production`). The default log level respects the `LOG_LEVEL` environment variable.
413
+
414
+ ### App Bridge (React Hooks)
415
+
416
+ React hooks that register UI elements in the Assembly dashboard header from an embedded iframe app. Handles setup, cleanup, and `beforeunload` automatically.
417
+
418
+ Requires `react >= 18` and `@assembly-js/app-bridge` as peer dependencies:
419
+
420
+ ```bash
421
+ pnpm add react @assembly-js/app-bridge
422
+ ```
423
+
424
+ Import from `assembly-kit/bridge-ui`:
425
+
426
+ #### `usePrimaryCta`
427
+
428
+ Registers a primary CTA button in the dashboard header:
429
+
430
+ ```tsx
431
+ import { usePrimaryCta } from "assembly-kit/bridge-ui";
432
+ import type { CtaConfig } from "@assembly-js/app-bridge";
433
+
434
+ function MyApp() {
435
+ usePrimaryCta({
436
+ label: "Create Invoice",
437
+ onClick: () => {
438
+ console.log("Primary CTA clicked");
439
+ },
440
+ });
441
+
442
+ return <div>My App</div>;
443
+ }
444
+ ```
445
+
446
+ #### `useSecondaryCta`
447
+
448
+ Registers a secondary CTA button. Same API as `usePrimaryCta`:
449
+
450
+ ```tsx
451
+ import { useSecondaryCta } from "assembly-kit/bridge-ui";
452
+
453
+ function MyApp() {
454
+ useSecondaryCta({
455
+ label: "Export",
456
+ onClick: () => {
457
+ console.log("Secondary CTA clicked");
458
+ },
459
+ });
460
+
461
+ return <div>My App</div>;
462
+ }
463
+ ```
464
+
465
+ #### `useActionsMenu`
466
+
467
+ Registers a dropdown actions menu in the dashboard header:
468
+
469
+ ```tsx
470
+ import { useActionsMenu } from "assembly-kit/bridge-ui";
471
+ import type { ActionMenuItem } from "@assembly-js/app-bridge";
472
+
473
+ function MyApp() {
474
+ useActionsMenu([
475
+ { label: "Archive", onClick: () => archive() },
476
+ { label: "Delete", onClick: () => remove() },
477
+ ]);
478
+
479
+ return <div>My App</div>;
480
+ }
481
+ ```
482
+
483
+ #### Visibility toggle
484
+
485
+ All hooks accept an optional second argument to control visibility. When `false`, the slot is cleared. Defaults to `true`:
486
+
487
+ ```tsx
488
+ usePrimaryCta({ label: "Save", onClick: () => save() }, false);
489
+ useActionsMenu([{ label: "Archive", onClick: () => archive() }], hasItems);
490
+ ```
491
+
492
+ ## Entry Points
493
+
494
+ | Import path | Exports |
495
+ | ------------------------ | ------------------------------------------------------------------------------------------- |
496
+ | `assembly-kit` | `createAssemblyKit`, `AssemblyKit`, all errors, all schemas, `AssemblyToken`, `createToken` |
497
+ | `assembly-kit/client` | `createAssemblyKit`, `AssemblyKit`, `AssemblyKitOptions`, `RetryOptions` |
498
+ | `assembly-kit/errors` | All error classes |
499
+ | `assembly-kit/schemas` | All Zod schemas and inferred types (no client dependency) |
500
+ | `assembly-kit/token` | `AssemblyToken`, `createToken`, `ClientTokenPayload`, `InternalUserTokenPayload` |
501
+ | `assembly-kit/logger` | `createLogger`, `logger` |
502
+ | `assembly-kit/bridge-ui` | `usePrimaryCta`, `useSecondaryCta`, `useActionsMenu` |
503
+
504
+ ## Development
505
+
506
+ ```bash
507
+ pnpm run build # build to dist/
508
+ pnpm run dev # build in watch mode
509
+ pnpm test # run tests
510
+ pnpm run check # lint + format + type check
511
+ pnpm run release # bump version, commit, push, tag
512
+ ```
513
+
514
+ ## License
515
+
516
+ MIT
@@ -0,0 +1,4 @@
1
+ import { useActionsMenu } from "./use-actions-menu.mjs";
2
+ import { usePrimaryCta } from "./use-primary-cta.mjs";
3
+ import { useSecondaryCta } from "./use-secondary-cta.mjs";
4
+ export { useActionsMenu, usePrimaryCta, useSecondaryCta };
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ import { useActionsMenu } from "./use-actions-menu.mjs";
3
+ import { usePrimaryCta } from "./use-primary-cta.mjs";
4
+ import { useSecondaryCta } from "./use-secondary-cta.mjs";
5
+ export { useActionsMenu, usePrimaryCta, useSecondaryCta };
@@ -0,0 +1,16 @@
1
+ import { ActionMenuItem } from "@assembly-js/app-bridge";
2
+
3
+ //#region src/bridge-ui/use-actions-menu.d.ts
4
+ /**
5
+ * Registers an actions menu in the Assembly dashboard header.
6
+ *
7
+ * Uses `AssemblyBridge.header.setActionsMenu()` to set the menu items and
8
+ * automatically clears them on unmount or page unload.
9
+ *
10
+ * @param items - Array of menu items with labels, icons, and click handlers.
11
+ * @param show - Whether the menu is visible. Defaults to true.
12
+ */
13
+ declare const useActionsMenu: (items: ActionMenuItem[], show?: boolean) => void;
14
+ //#endregion
15
+ export { useActionsMenu };
16
+ //# sourceMappingURL=use-actions-menu.d.mts.map
@@ -0,0 +1,33 @@
1
+ import { AssemblyBridge } from "@assembly-js/app-bridge";
2
+ import { useEffect } from "react";
3
+ //#region src/bridge-ui/use-actions-menu.ts
4
+ /**
5
+ * Registers an actions menu in the Assembly dashboard header.
6
+ *
7
+ * Uses `AssemblyBridge.header.setActionsMenu()` to set the menu items and
8
+ * automatically clears them on unmount or page unload.
9
+ *
10
+ * @param items - Array of menu items with labels, icons, and click handlers.
11
+ * @param show - Whether the menu is visible. Defaults to true.
12
+ */
13
+ const useActionsMenu = (items, show = true) => {
14
+ useEffect(() => {
15
+ AssemblyBridge.header.setActionsMenu(show ? items : []);
16
+ return () => {
17
+ AssemblyBridge.header.setActionsMenu([]);
18
+ };
19
+ }, [items, show]);
20
+ useEffect(() => {
21
+ const handleUnload = () => {
22
+ AssemblyBridge.header.setActionsMenu([]);
23
+ };
24
+ addEventListener("beforeunload", handleUnload);
25
+ return () => {
26
+ removeEventListener("beforeunload", handleUnload);
27
+ };
28
+ }, []);
29
+ };
30
+ //#endregion
31
+ export { useActionsMenu };
32
+
33
+ //# sourceMappingURL=use-actions-menu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-actions-menu.mjs","names":[],"sources":["../../src/bridge-ui/use-actions-menu.ts"],"sourcesContent":["import { AssemblyBridge } from \"@assembly-js/app-bridge\";\nimport type { ActionMenuItem } from \"@assembly-js/app-bridge\";\nimport { useEffect } from \"react\";\n\n/**\n * Registers an actions menu in the Assembly dashboard header.\n *\n * Uses `AssemblyBridge.header.setActionsMenu()` to set the menu items and\n * automatically clears them on unmount or page unload.\n *\n * @param items - Array of menu items with labels, icons, and click handlers.\n * @param show - Whether the menu is visible. Defaults to true.\n */\nexport const useActionsMenu = (items: ActionMenuItem[], show = true): void => {\n useEffect(() => {\n AssemblyBridge.header.setActionsMenu(show ? items : []);\n\n return () => {\n AssemblyBridge.header.setActionsMenu([]);\n };\n }, [items, show]);\n\n useEffect(() => {\n const handleUnload = (): void => {\n AssemblyBridge.header.setActionsMenu([]);\n };\n\n addEventListener(\"beforeunload\", handleUnload);\n\n return () => {\n removeEventListener(\"beforeunload\", handleUnload);\n };\n }, []);\n};\n"],"mappings":";;;;;;;;;;;;AAaA,MAAa,kBAAkB,OAAyB,OAAO,SAAe;AAC5E,iBAAgB;AACd,iBAAe,OAAO,eAAe,OAAO,QAAQ,EAAE,CAAC;AAEvD,eAAa;AACX,kBAAe,OAAO,eAAe,EAAE,CAAC;;IAEzC,CAAC,OAAO,KAAK,CAAC;AAEjB,iBAAgB;EACd,MAAM,qBAA2B;AAC/B,kBAAe,OAAO,eAAe,EAAE,CAAC;;AAG1C,mBAAiB,gBAAgB,aAAa;AAE9C,eAAa;AACX,uBAAoB,gBAAgB,aAAa;;IAElD,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { CtaConfig } from "@assembly-js/app-bridge";
2
+
3
+ //#region src/bridge-ui/use-primary-cta.d.ts
4
+ /**
5
+ * Registers a primary CTA button in the Assembly dashboard header.
6
+ *
7
+ * Uses `AssemblyBridge.header.setPrimaryCta()` to set the button and
8
+ * automatically clears it on unmount or page unload.
9
+ *
10
+ * @param cta - Label, icon, and click handler for the primary CTA.
11
+ * @param show - Whether the CTA is visible. Defaults to true.
12
+ */
13
+ declare const usePrimaryCta: (cta: CtaConfig, show?: boolean) => void;
14
+ //#endregion
15
+ export { usePrimaryCta };
16
+ //# sourceMappingURL=use-primary-cta.d.mts.map
@@ -0,0 +1,34 @@
1
+ import { AssemblyBridge } from "@assembly-js/app-bridge";
2
+ import { useEffect } from "react";
3
+ //#region src/bridge-ui/use-primary-cta.ts
4
+ /**
5
+ * Registers a primary CTA button in the Assembly dashboard header.
6
+ *
7
+ * Uses `AssemblyBridge.header.setPrimaryCta()` to set the button and
8
+ * automatically clears it on unmount or page unload.
9
+ *
10
+ * @param cta - Label, icon, and click handler for the primary CTA.
11
+ * @param show - Whether the CTA is visible. Defaults to true.
12
+ */
13
+ const usePrimaryCta = (cta, show = true) => {
14
+ useEffect(() => {
15
+ if (show) AssemblyBridge.header.setPrimaryCta(cta);
16
+ else AssemblyBridge.header.setPrimaryCta(null);
17
+ return () => {
18
+ AssemblyBridge.header.setPrimaryCta(null);
19
+ };
20
+ }, [cta, show]);
21
+ useEffect(() => {
22
+ const handleUnload = () => {
23
+ AssemblyBridge.header.setPrimaryCta(null);
24
+ };
25
+ addEventListener("beforeunload", handleUnload);
26
+ return () => {
27
+ removeEventListener("beforeunload", handleUnload);
28
+ };
29
+ }, []);
30
+ };
31
+ //#endregion
32
+ export { usePrimaryCta };
33
+
34
+ //# sourceMappingURL=use-primary-cta.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-primary-cta.mjs","names":[],"sources":["../../src/bridge-ui/use-primary-cta.ts"],"sourcesContent":["import { AssemblyBridge } from \"@assembly-js/app-bridge\";\nimport type { CtaConfig } from \"@assembly-js/app-bridge\";\nimport { useEffect } from \"react\";\n\n/**\n * Registers a primary CTA button in the Assembly dashboard header.\n *\n * Uses `AssemblyBridge.header.setPrimaryCta()` to set the button and\n * automatically clears it on unmount or page unload.\n *\n * @param cta - Label, icon, and click handler for the primary CTA.\n * @param show - Whether the CTA is visible. Defaults to true.\n */\nexport const usePrimaryCta = (cta: CtaConfig, show = true): void => {\n useEffect(() => {\n if (show) {\n AssemblyBridge.header.setPrimaryCta(cta);\n } else {\n AssemblyBridge.header.setPrimaryCta(null);\n }\n\n return () => {\n AssemblyBridge.header.setPrimaryCta(null);\n };\n }, [cta, show]);\n\n useEffect(() => {\n const handleUnload = (): void => {\n AssemblyBridge.header.setPrimaryCta(null);\n };\n\n addEventListener(\"beforeunload\", handleUnload);\n\n return () => {\n removeEventListener(\"beforeunload\", handleUnload);\n };\n }, []);\n};\n"],"mappings":";;;;;;;;;;;;AAaA,MAAa,iBAAiB,KAAgB,OAAO,SAAe;AAClE,iBAAgB;AACd,MAAI,KACF,gBAAe,OAAO,cAAc,IAAI;MAExC,gBAAe,OAAO,cAAc,KAAK;AAG3C,eAAa;AACX,kBAAe,OAAO,cAAc,KAAK;;IAE1C,CAAC,KAAK,KAAK,CAAC;AAEf,iBAAgB;EACd,MAAM,qBAA2B;AAC/B,kBAAe,OAAO,cAAc,KAAK;;AAG3C,mBAAiB,gBAAgB,aAAa;AAE9C,eAAa;AACX,uBAAoB,gBAAgB,aAAa;;IAElD,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { CtaConfig } from "@assembly-js/app-bridge";
2
+
3
+ //#region src/bridge-ui/use-secondary-cta.d.ts
4
+ /**
5
+ * Registers a secondary CTA button in the Assembly dashboard header.
6
+ *
7
+ * Uses `AssemblyBridge.header.setSecondaryCta()` to set the button and
8
+ * automatically clears it on unmount or page unload.
9
+ *
10
+ * @param cta - Label, icon, and click handler for the secondary CTA.
11
+ * @param show - Whether the CTA is visible. Defaults to true.
12
+ */
13
+ declare const useSecondaryCta: (cta: CtaConfig, show?: boolean) => void;
14
+ //#endregion
15
+ export { useSecondaryCta };
16
+ //# sourceMappingURL=use-secondary-cta.d.mts.map