@kelpie/ui 0.1.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 (704) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +44 -0
  3. package/dist/ServiceStatus.d.ts +6 -0
  4. package/dist/ServiceStatus.d.ts.map +1 -0
  5. package/dist/ServiceStatus.js +35 -0
  6. package/dist/ServiceStatus.js.map +1 -0
  7. package/dist/api/ApiProvider.d.ts +19 -0
  8. package/dist/api/ApiProvider.d.ts.map +1 -0
  9. package/dist/api/ApiProvider.js +18 -0
  10. package/dist/api/ApiProvider.js.map +1 -0
  11. package/dist/api/client.d.ts +83 -0
  12. package/dist/api/client.d.ts.map +1 -0
  13. package/dist/api/client.js +162 -0
  14. package/dist/api/client.js.map +1 -0
  15. package/dist/api/context.d.ts +14 -0
  16. package/dist/api/context.d.ts.map +1 -0
  17. package/dist/api/context.js +20 -0
  18. package/dist/api/context.js.map +1 -0
  19. package/dist/api/errors.d.ts +9 -0
  20. package/dist/api/errors.d.ts.map +1 -0
  21. package/dist/api/errors.js +14 -0
  22. package/dist/api/errors.js.map +1 -0
  23. package/dist/api/health.d.ts +15 -0
  24. package/dist/api/health.d.ts.map +1 -0
  25. package/dist/api/health.js +22 -0
  26. package/dist/api/health.js.map +1 -0
  27. package/dist/api/json.d.ts +3 -0
  28. package/dist/api/json.d.ts.map +1 -0
  29. package/dist/api/json.js +5 -0
  30. package/dist/api/json.js.map +1 -0
  31. package/dist/api/queryClient.d.ts +17 -0
  32. package/dist/api/queryClient.d.ts.map +1 -0
  33. package/dist/api/queryClient.js +33 -0
  34. package/dist/api/queryClient.js.map +1 -0
  35. package/dist/api/resource.d.ts +110 -0
  36. package/dist/api/resource.d.ts.map +1 -0
  37. package/dist/api/resource.js +238 -0
  38. package/dist/api/resource.js.map +1 -0
  39. package/dist/api/resources/account.d.ts +49 -0
  40. package/dist/api/resources/account.d.ts.map +1 -0
  41. package/dist/api/resources/account.js +146 -0
  42. package/dist/api/resources/account.js.map +1 -0
  43. package/dist/api/resources/activities.d.ts +8 -0
  44. package/dist/api/resources/activities.d.ts.map +1 -0
  45. package/dist/api/resources/activities.js +21 -0
  46. package/dist/api/resources/activities.js.map +1 -0
  47. package/dist/api/resources/agentTasks.d.ts +31 -0
  48. package/dist/api/resources/agentTasks.d.ts.map +1 -0
  49. package/dist/api/resources/agentTasks.js +103 -0
  50. package/dist/api/resources/agentTasks.js.map +1 -0
  51. package/dist/api/resources/candidates.d.ts +17 -0
  52. package/dist/api/resources/candidates.d.ts.map +1 -0
  53. package/dist/api/resources/candidates.js +40 -0
  54. package/dist/api/resources/candidates.js.map +1 -0
  55. package/dist/api/resources/companies.d.ts +22 -0
  56. package/dist/api/resources/companies.d.ts.map +1 -0
  57. package/dist/api/resources/companies.js +36 -0
  58. package/dist/api/resources/companies.js.map +1 -0
  59. package/dist/api/resources/dashboard.d.ts +8 -0
  60. package/dist/api/resources/dashboard.d.ts.map +1 -0
  61. package/dist/api/resources/dashboard.js +27 -0
  62. package/dist/api/resources/dashboard.js.map +1 -0
  63. package/dist/api/resources/deals.d.ts +30 -0
  64. package/dist/api/resources/deals.d.ts.map +1 -0
  65. package/dist/api/resources/deals.js +38 -0
  66. package/dist/api/resources/deals.js.map +1 -0
  67. package/dist/api/resources/decisions.d.ts +13 -0
  68. package/dist/api/resources/decisions.d.ts.map +1 -0
  69. package/dist/api/resources/decisions.js +38 -0
  70. package/dist/api/resources/decisions.js.map +1 -0
  71. package/dist/api/resources/forms.d.ts +82 -0
  72. package/dist/api/resources/forms.d.ts.map +1 -0
  73. package/dist/api/resources/forms.js +129 -0
  74. package/dist/api/resources/forms.js.map +1 -0
  75. package/dist/api/resources/handbookPages.d.ts +33 -0
  76. package/dist/api/resources/handbookPages.d.ts.map +1 -0
  77. package/dist/api/resources/handbookPages.js +49 -0
  78. package/dist/api/resources/handbookPages.js.map +1 -0
  79. package/dist/api/resources/importJobs.d.ts +72 -0
  80. package/dist/api/resources/importJobs.d.ts.map +1 -0
  81. package/dist/api/resources/importJobs.js +145 -0
  82. package/dist/api/resources/importJobs.js.map +1 -0
  83. package/dist/api/resources/invites.d.ts +19 -0
  84. package/dist/api/resources/invites.d.ts.map +1 -0
  85. package/dist/api/resources/invites.js +78 -0
  86. package/dist/api/resources/invites.js.map +1 -0
  87. package/dist/api/resources/mcpTools.d.ts +8 -0
  88. package/dist/api/resources/mcpTools.d.ts.map +1 -0
  89. package/dist/api/resources/mcpTools.js +23 -0
  90. package/dist/api/resources/mcpTools.js.map +1 -0
  91. package/dist/api/resources/members.d.ts +40 -0
  92. package/dist/api/resources/members.d.ts.map +1 -0
  93. package/dist/api/resources/members.js +67 -0
  94. package/dist/api/resources/members.js.map +1 -0
  95. package/dist/api/resources/moduleSettings.d.ts +14 -0
  96. package/dist/api/resources/moduleSettings.d.ts.map +1 -0
  97. package/dist/api/resources/moduleSettings.js +43 -0
  98. package/dist/api/resources/moduleSettings.js.map +1 -0
  99. package/dist/api/resources/mutation.d.ts +18 -0
  100. package/dist/api/resources/mutation.d.ts.map +1 -0
  101. package/dist/api/resources/mutation.js +12 -0
  102. package/dist/api/resources/mutation.js.map +1 -0
  103. package/dist/api/resources/notes.d.ts +14 -0
  104. package/dist/api/resources/notes.d.ts.map +1 -0
  105. package/dist/api/resources/notes.js +39 -0
  106. package/dist/api/resources/notes.js.map +1 -0
  107. package/dist/api/resources/opportunities.d.ts +29 -0
  108. package/dist/api/resources/opportunities.d.ts.map +1 -0
  109. package/dist/api/resources/opportunities.js +38 -0
  110. package/dist/api/resources/opportunities.js.map +1 -0
  111. package/dist/api/resources/partnerships.d.ts +33 -0
  112. package/dist/api/resources/partnerships.d.ts.map +1 -0
  113. package/dist/api/resources/partnerships.js +39 -0
  114. package/dist/api/resources/partnerships.js.map +1 -0
  115. package/dist/api/resources/people.d.ts +22 -0
  116. package/dist/api/resources/people.d.ts.map +1 -0
  117. package/dist/api/resources/people.js +36 -0
  118. package/dist/api/resources/people.js.map +1 -0
  119. package/dist/api/resources/pipelineStages.d.ts +22 -0
  120. package/dist/api/resources/pipelineStages.d.ts.map +1 -0
  121. package/dist/api/resources/pipelineStages.js +61 -0
  122. package/dist/api/resources/pipelineStages.js.map +1 -0
  123. package/dist/api/resources/planItems.d.ts +31 -0
  124. package/dist/api/resources/planItems.d.ts.map +1 -0
  125. package/dist/api/resources/planItems.js +60 -0
  126. package/dist/api/resources/planItems.js.map +1 -0
  127. package/dist/api/resources/positions.d.ts +23 -0
  128. package/dist/api/resources/positions.d.ts.map +1 -0
  129. package/dist/api/resources/positions.js +31 -0
  130. package/dist/api/resources/positions.js.map +1 -0
  131. package/dist/api/resources/raises.d.ts +30 -0
  132. package/dist/api/resources/raises.d.ts.map +1 -0
  133. package/dist/api/resources/raises.js +38 -0
  134. package/dist/api/resources/raises.js.map +1 -0
  135. package/dist/api/resources/roles.d.ts +20 -0
  136. package/dist/api/resources/roles.d.ts.map +1 -0
  137. package/dist/api/resources/roles.js +31 -0
  138. package/dist/api/resources/roles.js.map +1 -0
  139. package/dist/api/resources/search.d.ts +12 -0
  140. package/dist/api/resources/search.d.ts.map +1 -0
  141. package/dist/api/resources/search.js +37 -0
  142. package/dist/api/resources/search.js.map +1 -0
  143. package/dist/api/resources/session.d.ts +58 -0
  144. package/dist/api/resources/session.d.ts.map +1 -0
  145. package/dist/api/resources/session.js +157 -0
  146. package/dist/api/resources/session.js.map +1 -0
  147. package/dist/api/resources/webhooks.d.ts +45 -0
  148. package/dist/api/resources/webhooks.d.ts.map +1 -0
  149. package/dist/api/resources/webhooks.js +106 -0
  150. package/dist/api/resources/webhooks.js.map +1 -0
  151. package/dist/api/resources/workspace.d.ts +20 -0
  152. package/dist/api/resources/workspace.d.ts.map +1 -0
  153. package/dist/api/resources/workspace.js +63 -0
  154. package/dist/api/resources/workspace.js.map +1 -0
  155. package/dist/app/KelpieApp.d.ts +18 -0
  156. package/dist/app/KelpieApp.d.ts.map +1 -0
  157. package/dist/app/KelpieApp.js +59 -0
  158. package/dist/app/KelpieApp.js.map +1 -0
  159. package/dist/app/SessionGate.d.ts +14 -0
  160. package/dist/app/SessionGate.d.ts.map +1 -0
  161. package/dist/app/SessionGate.js +33 -0
  162. package/dist/app/SessionGate.js.map +1 -0
  163. package/dist/components/ActivitiesPanel.d.ts +28 -0
  164. package/dist/components/ActivitiesPanel.d.ts.map +1 -0
  165. package/dist/components/ActivitiesPanel.js +75 -0
  166. package/dist/components/ActivitiesPanel.js.map +1 -0
  167. package/dist/components/AgentTasks.d.ts +16 -0
  168. package/dist/components/AgentTasks.d.ts.map +1 -0
  169. package/dist/components/AgentTasks.js +166 -0
  170. package/dist/components/AgentTasks.js.map +1 -0
  171. package/dist/components/Chip.d.ts +10 -0
  172. package/dist/components/Chip.d.ts.map +1 -0
  173. package/dist/components/Chip.js +21 -0
  174. package/dist/components/Chip.js.map +1 -0
  175. package/dist/components/CopyButton.d.ts +7 -0
  176. package/dist/components/CopyButton.d.ts.map +1 -0
  177. package/dist/components/CopyButton.js +30 -0
  178. package/dist/components/CopyButton.js.map +1 -0
  179. package/dist/components/DataTable.d.ts +36 -0
  180. package/dist/components/DataTable.d.ts.map +1 -0
  181. package/dist/components/DataTable.js +43 -0
  182. package/dist/components/DataTable.js.map +1 -0
  183. package/dist/components/DecisionsPanel.d.ts +14 -0
  184. package/dist/components/DecisionsPanel.d.ts.map +1 -0
  185. package/dist/components/DecisionsPanel.js +73 -0
  186. package/dist/components/DecisionsPanel.js.map +1 -0
  187. package/dist/components/DeleteRecord.d.ts +19 -0
  188. package/dist/components/DeleteRecord.d.ts.map +1 -0
  189. package/dist/components/DeleteRecord.js +22 -0
  190. package/dist/components/DeleteRecord.js.map +1 -0
  191. package/dist/components/EntitySearch.d.ts +33 -0
  192. package/dist/components/EntitySearch.d.ts.map +1 -0
  193. package/dist/components/EntitySearch.js +111 -0
  194. package/dist/components/EntitySearch.js.map +1 -0
  195. package/dist/components/ErrorBoundary.d.ts +21 -0
  196. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  197. package/dist/components/ErrorBoundary.js +26 -0
  198. package/dist/components/ErrorBoundary.js.map +1 -0
  199. package/dist/components/InlineEdit.d.ts +37 -0
  200. package/dist/components/InlineEdit.d.ts.map +1 -0
  201. package/dist/components/InlineEdit.js +77 -0
  202. package/dist/components/InlineEdit.js.map +1 -0
  203. package/dist/components/KanbanBoard.d.ts +24 -0
  204. package/dist/components/KanbanBoard.d.ts.map +1 -0
  205. package/dist/components/KanbanBoard.js +92 -0
  206. package/dist/components/KanbanBoard.js.map +1 -0
  207. package/dist/components/MarkdownView.d.ts +4 -0
  208. package/dist/components/MarkdownView.d.ts.map +1 -0
  209. package/dist/components/MarkdownView.js +45 -0
  210. package/dist/components/MarkdownView.js.map +1 -0
  211. package/dist/components/NotesPanel.d.ts +17 -0
  212. package/dist/components/NotesPanel.d.ts.map +1 -0
  213. package/dist/components/NotesPanel.js +53 -0
  214. package/dist/components/NotesPanel.js.map +1 -0
  215. package/dist/components/PageHeader.d.ts +20 -0
  216. package/dist/components/PageHeader.d.ts.map +1 -0
  217. package/dist/components/PageHeader.js +15 -0
  218. package/dist/components/PageHeader.js.map +1 -0
  219. package/dist/components/PhonesField.d.ts +7 -0
  220. package/dist/components/PhonesField.d.ts.map +1 -0
  221. package/dist/components/PhonesField.js +92 -0
  222. package/dist/components/PhonesField.js.map +1 -0
  223. package/dist/components/PlanAttention.d.ts +40 -0
  224. package/dist/components/PlanAttention.d.ts.map +1 -0
  225. package/dist/components/PlanAttention.js +86 -0
  226. package/dist/components/PlanAttention.js.map +1 -0
  227. package/dist/components/PlanPanel.d.ts +18 -0
  228. package/dist/components/PlanPanel.d.ts.map +1 -0
  229. package/dist/components/PlanPanel.js +102 -0
  230. package/dist/components/PlanPanel.js.map +1 -0
  231. package/dist/components/QueryState.d.ts +24 -0
  232. package/dist/components/QueryState.d.ts.map +1 -0
  233. package/dist/components/QueryState.js +34 -0
  234. package/dist/components/QueryState.js.map +1 -0
  235. package/dist/components/RecordTabs.d.ts +16 -0
  236. package/dist/components/RecordTabs.d.ts.map +1 -0
  237. package/dist/components/RecordTabs.js +15 -0
  238. package/dist/components/RecordTabs.js.map +1 -0
  239. package/dist/components/SectionHeader.d.ts +15 -0
  240. package/dist/components/SectionHeader.d.ts.map +1 -0
  241. package/dist/components/SectionHeader.js +14 -0
  242. package/dist/components/SectionHeader.js.map +1 -0
  243. package/dist/components/SegmentedControl.d.ts +13 -0
  244. package/dist/components/SegmentedControl.d.ts.map +1 -0
  245. package/dist/components/SegmentedControl.js +14 -0
  246. package/dist/components/SegmentedControl.js.map +1 -0
  247. package/dist/components/Shell.d.ts +2 -0
  248. package/dist/components/Shell.d.ts.map +1 -0
  249. package/dist/components/Shell.js +143 -0
  250. package/dist/components/Shell.js.map +1 -0
  251. package/dist/components/SidebarField.d.ts +8 -0
  252. package/dist/components/SidebarField.d.ts.map +1 -0
  253. package/dist/components/SidebarField.js +6 -0
  254. package/dist/components/SidebarField.js.map +1 -0
  255. package/dist/components/SocialProfilesField.d.ts +8 -0
  256. package/dist/components/SocialProfilesField.d.ts.map +1 -0
  257. package/dist/components/SocialProfilesField.js +176 -0
  258. package/dist/components/SocialProfilesField.js.map +1 -0
  259. package/dist/components/StageSettings.d.ts +16 -0
  260. package/dist/components/StageSettings.d.ts.map +1 -0
  261. package/dist/components/StageSettings.js +107 -0
  262. package/dist/components/StageSettings.js.map +1 -0
  263. package/dist/components/SummaryBlock.d.ts +12 -0
  264. package/dist/components/SummaryBlock.d.ts.map +1 -0
  265. package/dist/components/SummaryBlock.js +12 -0
  266. package/dist/components/SummaryBlock.js.map +1 -0
  267. package/dist/index.d.ts +90 -0
  268. package/dist/index.d.ts.map +1 -0
  269. package/dist/index.js +55 -0
  270. package/dist/index.js.map +1 -0
  271. package/dist/lib/dates.d.ts +26 -0
  272. package/dist/lib/dates.d.ts.map +1 -0
  273. package/dist/lib/dates.js +71 -0
  274. package/dist/lib/dates.js.map +1 -0
  275. package/dist/lib/money.d.ts +7 -0
  276. package/dist/lib/money.d.ts.map +1 -0
  277. package/dist/lib/money.js +13 -0
  278. package/dist/lib/money.js.map +1 -0
  279. package/dist/lib/names.d.ts +9 -0
  280. package/dist/lib/names.d.ts.map +1 -0
  281. package/dist/lib/names.js +13 -0
  282. package/dist/lib/names.js.map +1 -0
  283. package/dist/lib/plan.d.ts +67 -0
  284. package/dist/lib/plan.d.ts.map +1 -0
  285. package/dist/lib/plan.js +96 -0
  286. package/dist/lib/plan.js.map +1 -0
  287. package/dist/lib/theme.d.ts +19 -0
  288. package/dist/lib/theme.d.ts.map +1 -0
  289. package/dist/lib/theme.js +30 -0
  290. package/dist/lib/theme.js.map +1 -0
  291. package/dist/pages/CompaniesPage.d.ts +2 -0
  292. package/dist/pages/CompaniesPage.d.ts.map +1 -0
  293. package/dist/pages/CompaniesPage.js +77 -0
  294. package/dist/pages/CompaniesPage.js.map +1 -0
  295. package/dist/pages/CompanyDetail.d.ts +2 -0
  296. package/dist/pages/CompanyDetail.d.ts.map +1 -0
  297. package/dist/pages/CompanyDetail.js +177 -0
  298. package/dist/pages/CompanyDetail.js.map +1 -0
  299. package/dist/pages/DealDetail.d.ts +2 -0
  300. package/dist/pages/DealDetail.d.ts.map +1 -0
  301. package/dist/pages/DealDetail.js +192 -0
  302. package/dist/pages/DealDetail.js.map +1 -0
  303. package/dist/pages/DealStageSettingsPage.d.ts +7 -0
  304. package/dist/pages/DealStageSettingsPage.d.ts.map +1 -0
  305. package/dist/pages/DealStageSettingsPage.js +38 -0
  306. package/dist/pages/DealStageSettingsPage.js.map +1 -0
  307. package/dist/pages/DealsPage.d.ts +2 -0
  308. package/dist/pages/DealsPage.d.ts.map +1 -0
  309. package/dist/pages/DealsPage.js +177 -0
  310. package/dist/pages/DealsPage.js.map +1 -0
  311. package/dist/pages/DecisionsPage.d.ts +2 -0
  312. package/dist/pages/DecisionsPage.d.ts.map +1 -0
  313. package/dist/pages/DecisionsPage.js +121 -0
  314. package/dist/pages/DecisionsPage.js.map +1 -0
  315. package/dist/pages/FormDetail.d.ts +2 -0
  316. package/dist/pages/FormDetail.d.ts.map +1 -0
  317. package/dist/pages/FormDetail.js +56 -0
  318. package/dist/pages/FormDetail.js.map +1 -0
  319. package/dist/pages/FormsPage.d.ts +2 -0
  320. package/dist/pages/FormsPage.d.ts.map +1 -0
  321. package/dist/pages/FormsPage.js +67 -0
  322. package/dist/pages/FormsPage.js.map +1 -0
  323. package/dist/pages/FundraisingPage.d.ts +2 -0
  324. package/dist/pages/FundraisingPage.d.ts.map +1 -0
  325. package/dist/pages/FundraisingPage.js +187 -0
  326. package/dist/pages/FundraisingPage.js.map +1 -0
  327. package/dist/pages/HiringPage.d.ts +9 -0
  328. package/dist/pages/HiringPage.d.ts.map +1 -0
  329. package/dist/pages/HiringPage.js +73 -0
  330. package/dist/pages/HiringPage.js.map +1 -0
  331. package/dist/pages/NotFoundPage.d.ts +10 -0
  332. package/dist/pages/NotFoundPage.d.ts.map +1 -0
  333. package/dist/pages/NotFoundPage.js +14 -0
  334. package/dist/pages/NotFoundPage.js.map +1 -0
  335. package/dist/pages/OpportunitiesPage.d.ts +2 -0
  336. package/dist/pages/OpportunitiesPage.d.ts.map +1 -0
  337. package/dist/pages/OpportunitiesPage.js +184 -0
  338. package/dist/pages/OpportunitiesPage.js.map +1 -0
  339. package/dist/pages/OpportunityDetail.d.ts +2 -0
  340. package/dist/pages/OpportunityDetail.d.ts.map +1 -0
  341. package/dist/pages/OpportunityDetail.js +132 -0
  342. package/dist/pages/OpportunityDetail.js.map +1 -0
  343. package/dist/pages/OpportunityStageSettingsPage.d.ts +3 -0
  344. package/dist/pages/OpportunityStageSettingsPage.d.ts.map +1 -0
  345. package/dist/pages/OpportunityStageSettingsPage.js +34 -0
  346. package/dist/pages/OpportunityStageSettingsPage.js.map +1 -0
  347. package/dist/pages/PartnershipDetail.d.ts +2 -0
  348. package/dist/pages/PartnershipDetail.d.ts.map +1 -0
  349. package/dist/pages/PartnershipDetail.js +179 -0
  350. package/dist/pages/PartnershipDetail.js.map +1 -0
  351. package/dist/pages/PartnershipStageSettingsPage.d.ts +3 -0
  352. package/dist/pages/PartnershipStageSettingsPage.d.ts.map +1 -0
  353. package/dist/pages/PartnershipStageSettingsPage.js +34 -0
  354. package/dist/pages/PartnershipStageSettingsPage.js.map +1 -0
  355. package/dist/pages/PartnershipsPage.d.ts +2 -0
  356. package/dist/pages/PartnershipsPage.d.ts.map +1 -0
  357. package/dist/pages/PartnershipsPage.js +182 -0
  358. package/dist/pages/PartnershipsPage.js.map +1 -0
  359. package/dist/pages/PeoplePage.d.ts +10 -0
  360. package/dist/pages/PeoplePage.d.ts.map +1 -0
  361. package/dist/pages/PeoplePage.js +71 -0
  362. package/dist/pages/PeoplePage.js.map +1 -0
  363. package/dist/pages/PersonDetail.d.ts +2 -0
  364. package/dist/pages/PersonDetail.d.ts.map +1 -0
  365. package/dist/pages/PersonDetail.js +193 -0
  366. package/dist/pages/PersonDetail.js.map +1 -0
  367. package/dist/pages/PlanningPage.d.ts +2 -0
  368. package/dist/pages/PlanningPage.d.ts.map +1 -0
  369. package/dist/pages/PlanningPage.js +112 -0
  370. package/dist/pages/PlanningPage.js.map +1 -0
  371. package/dist/pages/RaiseDetail.d.ts +2 -0
  372. package/dist/pages/RaiseDetail.d.ts.map +1 -0
  373. package/dist/pages/RaiseDetail.js +198 -0
  374. package/dist/pages/RaiseDetail.js.map +1 -0
  375. package/dist/pages/RaiseStageSettingsPage.d.ts +3 -0
  376. package/dist/pages/RaiseStageSettingsPage.d.ts.map +1 -0
  377. package/dist/pages/RaiseStageSettingsPage.js +34 -0
  378. package/dist/pages/RaiseStageSettingsPage.js.map +1 -0
  379. package/dist/pages/RoleDetail.d.ts +2 -0
  380. package/dist/pages/RoleDetail.d.ts.map +1 -0
  381. package/dist/pages/RoleDetail.js +177 -0
  382. package/dist/pages/RoleDetail.js.map +1 -0
  383. package/dist/pages/SearchPage.d.ts +2 -0
  384. package/dist/pages/SearchPage.d.ts.map +1 -0
  385. package/dist/pages/SearchPage.js +51 -0
  386. package/dist/pages/SearchPage.js.map +1 -0
  387. package/dist/pages/account/AccountLayout.d.ts +2 -0
  388. package/dist/pages/account/AccountLayout.d.ts.map +1 -0
  389. package/dist/pages/account/AccountLayout.js +25 -0
  390. package/dist/pages/account/AccountLayout.js.map +1 -0
  391. package/dist/pages/account/Field.d.ts +8 -0
  392. package/dist/pages/account/Field.d.ts.map +1 -0
  393. package/dist/pages/account/Field.js +6 -0
  394. package/dist/pages/account/Field.js.map +1 -0
  395. package/dist/pages/account/PreferencesPage.d.ts +2 -0
  396. package/dist/pages/account/PreferencesPage.d.ts.map +1 -0
  397. package/dist/pages/account/PreferencesPage.js +92 -0
  398. package/dist/pages/account/PreferencesPage.js.map +1 -0
  399. package/dist/pages/account/ProfilePage.d.ts +14 -0
  400. package/dist/pages/account/ProfilePage.d.ts.map +1 -0
  401. package/dist/pages/account/ProfilePage.js +71 -0
  402. package/dist/pages/account/ProfilePage.js.map +1 -0
  403. package/dist/pages/account/SecurityPage.d.ts +11 -0
  404. package/dist/pages/account/SecurityPage.d.ts.map +1 -0
  405. package/dist/pages/account/SecurityPage.js +78 -0
  406. package/dist/pages/account/SecurityPage.js.map +1 -0
  407. package/dist/pages/admin/DataPage.d.ts +3 -0
  408. package/dist/pages/admin/DataPage.d.ts.map +1 -0
  409. package/dist/pages/admin/DataPage.js +210 -0
  410. package/dist/pages/admin/DataPage.js.map +1 -0
  411. package/dist/pages/admin/McpPage.d.ts +2 -0
  412. package/dist/pages/admin/McpPage.d.ts.map +1 -0
  413. package/dist/pages/admin/McpPage.js +128 -0
  414. package/dist/pages/admin/McpPage.js.map +1 -0
  415. package/dist/pages/admin/ModulesPage.d.ts +2 -0
  416. package/dist/pages/admin/ModulesPage.d.ts.map +1 -0
  417. package/dist/pages/admin/ModulesPage.js +53 -0
  418. package/dist/pages/admin/ModulesPage.js.map +1 -0
  419. package/dist/pages/admin/TeamPage.d.ts +2 -0
  420. package/dist/pages/admin/TeamPage.d.ts.map +1 -0
  421. package/dist/pages/admin/TeamPage.js +99 -0
  422. package/dist/pages/admin/TeamPage.js.map +1 -0
  423. package/dist/pages/admin/WebhookDeliveries.d.ts +4 -0
  424. package/dist/pages/admin/WebhookDeliveries.d.ts.map +1 -0
  425. package/dist/pages/admin/WebhookDeliveries.js +88 -0
  426. package/dist/pages/admin/WebhookDeliveries.js.map +1 -0
  427. package/dist/pages/admin/WebhooksPage.d.ts +2 -0
  428. package/dist/pages/admin/WebhooksPage.d.ts.map +1 -0
  429. package/dist/pages/admin/WebhooksPage.js +152 -0
  430. package/dist/pages/admin/WebhooksPage.js.map +1 -0
  431. package/dist/pages/admin/WorkspaceSettingsPage.d.ts +2 -0
  432. package/dist/pages/admin/WorkspaceSettingsPage.d.ts.map +1 -0
  433. package/dist/pages/admin/WorkspaceSettingsPage.js +117 -0
  434. package/dist/pages/admin/WorkspaceSettingsPage.js.map +1 -0
  435. package/dist/pages/auth/AuthForm.d.ts +46 -0
  436. package/dist/pages/auth/AuthForm.d.ts.map +1 -0
  437. package/dist/pages/auth/AuthForm.js +32 -0
  438. package/dist/pages/auth/AuthForm.js.map +1 -0
  439. package/dist/pages/auth/AuthLayout.d.ts +24 -0
  440. package/dist/pages/auth/AuthLayout.d.ts.map +1 -0
  441. package/dist/pages/auth/AuthLayout.js +19 -0
  442. package/dist/pages/auth/AuthLayout.js.map +1 -0
  443. package/dist/pages/auth/ForgotPasswordPage.d.ts +13 -0
  444. package/dist/pages/auth/ForgotPasswordPage.d.ts.map +1 -0
  445. package/dist/pages/auth/ForgotPasswordPage.js +39 -0
  446. package/dist/pages/auth/ForgotPasswordPage.js.map +1 -0
  447. package/dist/pages/auth/JoinPage.d.ts +12 -0
  448. package/dist/pages/auth/JoinPage.d.ts.map +1 -0
  449. package/dist/pages/auth/JoinPage.js +43 -0
  450. package/dist/pages/auth/JoinPage.js.map +1 -0
  451. package/dist/pages/auth/ResetPasswordPage.d.ts +13 -0
  452. package/dist/pages/auth/ResetPasswordPage.d.ts.map +1 -0
  453. package/dist/pages/auth/ResetPasswordPage.js +58 -0
  454. package/dist/pages/auth/ResetPasswordPage.js.map +1 -0
  455. package/dist/pages/auth/SignInPage.d.ts +2 -0
  456. package/dist/pages/auth/SignInPage.d.ts.map +1 -0
  457. package/dist/pages/auth/SignInPage.js +38 -0
  458. package/dist/pages/auth/SignInPage.js.map +1 -0
  459. package/dist/pages/auth/SignUpPage.d.ts +13 -0
  460. package/dist/pages/auth/SignUpPage.d.ts.map +1 -0
  461. package/dist/pages/auth/SignUpPage.js +43 -0
  462. package/dist/pages/auth/SignUpPage.js.map +1 -0
  463. package/dist/pages/candidateFields.d.ts +22 -0
  464. package/dist/pages/candidateFields.d.ts.map +1 -0
  465. package/dist/pages/candidateFields.js +82 -0
  466. package/dist/pages/candidateFields.js.map +1 -0
  467. package/dist/pages/dashboard/DashboardPage.d.ts +2 -0
  468. package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
  469. package/dist/pages/dashboard/DashboardPage.js +40 -0
  470. package/dist/pages/dashboard/DashboardPage.js.map +1 -0
  471. package/dist/pages/dashboard/attention.d.ts +41 -0
  472. package/dist/pages/dashboard/attention.d.ts.map +1 -0
  473. package/dist/pages/dashboard/attention.js +146 -0
  474. package/dist/pages/dashboard/attention.js.map +1 -0
  475. package/dist/pages/dashboard/sections.d.ts +20 -0
  476. package/dist/pages/dashboard/sections.d.ts.map +1 -0
  477. package/dist/pages/dashboard/sections.js +60 -0
  478. package/dist/pages/dashboard/sections.js.map +1 -0
  479. package/dist/pages/fields.d.ts +11 -0
  480. package/dist/pages/fields.d.ts.map +1 -0
  481. package/dist/pages/fields.js +17 -0
  482. package/dist/pages/fields.js.map +1 -0
  483. package/dist/pages/forms/EmbedPanel.d.ts +14 -0
  484. package/dist/pages/forms/EmbedPanel.d.ts.map +1 -0
  485. package/dist/pages/forms/EmbedPanel.js +19 -0
  486. package/dist/pages/forms/EmbedPanel.js.map +1 -0
  487. package/dist/pages/forms/FieldsEditor.d.ts +6 -0
  488. package/dist/pages/forms/FieldsEditor.d.ts.map +1 -0
  489. package/dist/pages/forms/FieldsEditor.js +115 -0
  490. package/dist/pages/forms/FieldsEditor.js.map +1 -0
  491. package/dist/pages/forms/FormSettings.d.ts +6 -0
  492. package/dist/pages/forms/FormSettings.d.ts.map +1 -0
  493. package/dist/pages/forms/FormSettings.js +47 -0
  494. package/dist/pages/forms/FormSettings.js.map +1 -0
  495. package/dist/pages/forms/SubmissionsTable.d.ts +8 -0
  496. package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -0
  497. package/dist/pages/forms/SubmissionsTable.js +91 -0
  498. package/dist/pages/forms/SubmissionsTable.js.map +1 -0
  499. package/dist/pages/forms/fieldList.d.ts +70 -0
  500. package/dist/pages/forms/fieldList.d.ts.map +1 -0
  501. package/dist/pages/forms/fieldList.js +126 -0
  502. package/dist/pages/forms/fieldList.js.map +1 -0
  503. package/dist/pages/forms/template.d.ts +18 -0
  504. package/dist/pages/forms/template.d.ts.map +1 -0
  505. package/dist/pages/forms/template.js +34 -0
  506. package/dist/pages/forms/template.js.map +1 -0
  507. package/dist/pages/handbook/HandbookPage.d.ts +2 -0
  508. package/dist/pages/handbook/HandbookPage.d.ts.map +1 -0
  509. package/dist/pages/handbook/HandbookPage.js +197 -0
  510. package/dist/pages/handbook/HandbookPage.js.map +1 -0
  511. package/dist/pages/handbook/tree.d.ts +62 -0
  512. package/dist/pages/handbook/tree.d.ts.map +1 -0
  513. package/dist/pages/handbook/tree.js +222 -0
  514. package/dist/pages/handbook/tree.js.map +1 -0
  515. package/dist/pages/hiringDirectory.d.ts +60 -0
  516. package/dist/pages/hiringDirectory.d.ts.map +1 -0
  517. package/dist/pages/hiringDirectory.js +81 -0
  518. package/dist/pages/hiringDirectory.js.map +1 -0
  519. package/dist/pages/onboarding/HandbookStepPage.d.ts +14 -0
  520. package/dist/pages/onboarding/HandbookStepPage.d.ts.map +1 -0
  521. package/dist/pages/onboarding/HandbookStepPage.js +29 -0
  522. package/dist/pages/onboarding/HandbookStepPage.js.map +1 -0
  523. package/dist/pages/onboarding/InvitesStepPage.d.ts +2 -0
  524. package/dist/pages/onboarding/InvitesStepPage.d.ts.map +1 -0
  525. package/dist/pages/onboarding/InvitesStepPage.js +77 -0
  526. package/dist/pages/onboarding/InvitesStepPage.js.map +1 -0
  527. package/dist/pages/onboarding/WorkspaceStepPage.d.ts +2 -0
  528. package/dist/pages/onboarding/WorkspaceStepPage.d.ts.map +1 -0
  529. package/dist/pages/onboarding/WorkspaceStepPage.js +72 -0
  530. package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -0
  531. package/dist/pages/positionDirectory.d.ts +20 -0
  532. package/dist/pages/positionDirectory.d.ts.map +1 -0
  533. package/dist/pages/positionDirectory.js +58 -0
  534. package/dist/pages/positionDirectory.js.map +1 -0
  535. package/dist/registry/UiExtensionProvider.d.ts +12 -0
  536. package/dist/registry/UiExtensionProvider.d.ts.map +1 -0
  537. package/dist/registry/UiExtensionProvider.js +10 -0
  538. package/dist/registry/UiExtensionProvider.js.map +1 -0
  539. package/dist/registry/context.d.ts +31 -0
  540. package/dist/registry/context.d.ts.map +1 -0
  541. package/dist/registry/context.js +45 -0
  542. package/dist/registry/context.js.map +1 -0
  543. package/dist/registry/contributions.d.ts +71 -0
  544. package/dist/registry/contributions.d.ts.map +1 -0
  545. package/dist/registry/contributions.js +25 -0
  546. package/dist/registry/contributions.js.map +1 -0
  547. package/dist/registry/overridable.d.ts +27 -0
  548. package/dist/registry/overridable.d.ts.map +1 -0
  549. package/dist/registry/overridable.js +29 -0
  550. package/dist/registry/overridable.js.map +1 -0
  551. package/dist/registry/registry.d.ts +68 -0
  552. package/dist/registry/registry.d.ts.map +1 -0
  553. package/dist/registry/registry.js +112 -0
  554. package/dist/registry/registry.js.map +1 -0
  555. package/dist/testing/inputs.d.ts +13 -0
  556. package/dist/testing/inputs.d.ts.map +1 -0
  557. package/dist/testing/inputs.js +16 -0
  558. package/dist/testing/inputs.js.map +1 -0
  559. package/dist/testing/stubClient.d.ts +42 -0
  560. package/dist/testing/stubClient.d.ts.map +1 -0
  561. package/dist/testing/stubClient.js +29 -0
  562. package/dist/testing/stubClient.js.map +1 -0
  563. package/package.json +73 -0
  564. package/src/ServiceStatus.tsx +61 -0
  565. package/src/api/ApiProvider.tsx +40 -0
  566. package/src/api/client.ts +267 -0
  567. package/src/api/context.ts +25 -0
  568. package/src/api/errors.ts +14 -0
  569. package/src/api/health.ts +38 -0
  570. package/src/api/json.ts +4 -0
  571. package/src/api/queryClient.ts +35 -0
  572. package/src/api/resource.ts +412 -0
  573. package/src/api/resources/account.ts +220 -0
  574. package/src/api/resources/activities.ts +31 -0
  575. package/src/api/resources/agentTasks.ts +172 -0
  576. package/src/api/resources/candidates.ts +69 -0
  577. package/src/api/resources/companies.ts +72 -0
  578. package/src/api/resources/dashboard.ts +39 -0
  579. package/src/api/resources/deals.ts +82 -0
  580. package/src/api/resources/decisions.ts +60 -0
  581. package/src/api/resources/forms.ts +218 -0
  582. package/src/api/resources/handbookPages.ts +77 -0
  583. package/src/api/resources/importJobs.ts +229 -0
  584. package/src/api/resources/invites.ts +112 -0
  585. package/src/api/resources/mcpTools.ts +28 -0
  586. package/src/api/resources/members.ts +105 -0
  587. package/src/api/resources/moduleSettings.ts +67 -0
  588. package/src/api/resources/mutation.ts +31 -0
  589. package/src/api/resources/notes.ts +62 -0
  590. package/src/api/resources/opportunities.ts +84 -0
  591. package/src/api/resources/partnerships.ts +89 -0
  592. package/src/api/resources/people.ts +72 -0
  593. package/src/api/resources/pipelineStages.ts +93 -0
  594. package/src/api/resources/planItems.ts +103 -0
  595. package/src/api/resources/positions.ts +70 -0
  596. package/src/api/resources/raises.ts +82 -0
  597. package/src/api/resources/roles.ts +65 -0
  598. package/src/api/resources/search.ts +49 -0
  599. package/src/api/resources/session.ts +220 -0
  600. package/src/api/resources/webhooks.ts +157 -0
  601. package/src/api/resources/workspace.ts +81 -0
  602. package/src/app/KelpieApp.tsx +162 -0
  603. package/src/app/SessionGate.tsx +42 -0
  604. package/src/components/ActivitiesPanel.tsx +235 -0
  605. package/src/components/AgentTasks.tsx +473 -0
  606. package/src/components/Chip.tsx +36 -0
  607. package/src/components/CopyButton.tsx +48 -0
  608. package/src/components/DataTable.tsx +209 -0
  609. package/src/components/DecisionsPanel.tsx +233 -0
  610. package/src/components/DeleteRecord.tsx +73 -0
  611. package/src/components/EntitySearch.tsx +268 -0
  612. package/src/components/ErrorBoundary.tsx +58 -0
  613. package/src/components/InlineEdit.tsx +179 -0
  614. package/src/components/KanbanBoard.tsx +234 -0
  615. package/src/components/MarkdownView.tsx +73 -0
  616. package/src/components/NotesPanel.tsx +169 -0
  617. package/src/components/PageHeader.tsx +61 -0
  618. package/src/components/PhonesField.tsx +204 -0
  619. package/src/components/PlanAttention.tsx +249 -0
  620. package/src/components/PlanPanel.tsx +317 -0
  621. package/src/components/QueryState.tsx +83 -0
  622. package/src/components/RecordTabs.tsx +69 -0
  623. package/src/components/SectionHeader.tsx +63 -0
  624. package/src/components/SegmentedControl.tsx +48 -0
  625. package/src/components/Shell.tsx +300 -0
  626. package/src/components/SidebarField.tsx +18 -0
  627. package/src/components/SocialProfilesField.tsx +356 -0
  628. package/src/components/StageSettings.tsx +319 -0
  629. package/src/components/SummaryBlock.tsx +27 -0
  630. package/src/index.ts +190 -0
  631. package/src/lib/dates.ts +90 -0
  632. package/src/lib/money.ts +12 -0
  633. package/src/lib/names.ts +13 -0
  634. package/src/lib/plan.ts +147 -0
  635. package/src/lib/theme.ts +53 -0
  636. package/src/pages/CompaniesPage.tsx +143 -0
  637. package/src/pages/CompanyDetail.tsx +502 -0
  638. package/src/pages/DealDetail.tsx +512 -0
  639. package/src/pages/DealStageSettingsPage.tsx +67 -0
  640. package/src/pages/DealsPage.tsx +342 -0
  641. package/src/pages/DecisionsPage.tsx +211 -0
  642. package/src/pages/FormDetail.tsx +130 -0
  643. package/src/pages/FormsPage.tsx +151 -0
  644. package/src/pages/FundraisingPage.tsx +354 -0
  645. package/src/pages/HiringPage.tsx +169 -0
  646. package/src/pages/NotFoundPage.tsx +27 -0
  647. package/src/pages/OpportunitiesPage.tsx +349 -0
  648. package/src/pages/OpportunityDetail.tsx +337 -0
  649. package/src/pages/OpportunityStageSettingsPage.tsx +63 -0
  650. package/src/pages/PartnershipDetail.tsx +490 -0
  651. package/src/pages/PartnershipStageSettingsPage.tsx +63 -0
  652. package/src/pages/PartnershipsPage.tsx +353 -0
  653. package/src/pages/PeoplePage.tsx +145 -0
  654. package/src/pages/PersonDetail.tsx +526 -0
  655. package/src/pages/PlanningPage.tsx +318 -0
  656. package/src/pages/RaiseDetail.tsx +498 -0
  657. package/src/pages/RaiseStageSettingsPage.tsx +63 -0
  658. package/src/pages/RoleDetail.tsx +455 -0
  659. package/src/pages/SearchPage.tsx +135 -0
  660. package/src/pages/account/AccountLayout.tsx +38 -0
  661. package/src/pages/account/Field.tsx +20 -0
  662. package/src/pages/account/PreferencesPage.tsx +224 -0
  663. package/src/pages/account/ProfilePage.tsx +147 -0
  664. package/src/pages/account/SecurityPage.tsx +237 -0
  665. package/src/pages/admin/DataPage.tsx +772 -0
  666. package/src/pages/admin/McpPage.tsx +404 -0
  667. package/src/pages/admin/ModulesPage.tsx +113 -0
  668. package/src/pages/admin/TeamPage.tsx +386 -0
  669. package/src/pages/admin/WebhookDeliveries.tsx +184 -0
  670. package/src/pages/admin/WebhooksPage.tsx +443 -0
  671. package/src/pages/admin/WorkspaceSettingsPage.tsx +274 -0
  672. package/src/pages/auth/AuthForm.tsx +118 -0
  673. package/src/pages/auth/AuthLayout.tsx +74 -0
  674. package/src/pages/auth/ForgotPasswordPage.tsx +80 -0
  675. package/src/pages/auth/JoinPage.tsx +85 -0
  676. package/src/pages/auth/ResetPasswordPage.tsx +124 -0
  677. package/src/pages/auth/SignInPage.tsx +83 -0
  678. package/src/pages/auth/SignUpPage.tsx +93 -0
  679. package/src/pages/candidateFields.tsx +175 -0
  680. package/src/pages/dashboard/DashboardPage.tsx +108 -0
  681. package/src/pages/dashboard/attention.ts +206 -0
  682. package/src/pages/dashboard/sections.tsx +269 -0
  683. package/src/pages/fields.ts +21 -0
  684. package/src/pages/forms/EmbedPanel.tsx +95 -0
  685. package/src/pages/forms/FieldsEditor.tsx +412 -0
  686. package/src/pages/forms/FormSettings.tsx +159 -0
  687. package/src/pages/forms/SubmissionsTable.tsx +171 -0
  688. package/src/pages/forms/fieldList.ts +209 -0
  689. package/src/pages/forms/template.ts +37 -0
  690. package/src/pages/handbook/HandbookPage.tsx +500 -0
  691. package/src/pages/handbook/tree.ts +327 -0
  692. package/src/pages/hiringDirectory.ts +146 -0
  693. package/src/pages/onboarding/HandbookStepPage.tsx +75 -0
  694. package/src/pages/onboarding/InvitesStepPage.tsx +180 -0
  695. package/src/pages/onboarding/WorkspaceStepPage.tsx +122 -0
  696. package/src/pages/positionDirectory.ts +98 -0
  697. package/src/registry/UiExtensionProvider.tsx +20 -0
  698. package/src/registry/context.ts +67 -0
  699. package/src/registry/contributions.ts +89 -0
  700. package/src/registry/overridable.ts +62 -0
  701. package/src/registry/registry.ts +204 -0
  702. package/src/styles.css +175 -0
  703. package/src/testing/inputs.ts +18 -0
  704. package/src/testing/stubClient.ts +78 -0
@@ -0,0 +1,386 @@
1
+ import { INVITABLE_ROLES } from '@kelpie/schemas'
2
+ import type { InvitableRole, Invite, Member, MemberRole } from '@kelpie/schemas'
3
+ import { useState } from 'react'
4
+ import type { FormEvent } from 'react'
5
+
6
+ import { useMembers, useRemoveMember, useSetMemberRole } from '../../api/resources/members.ts'
7
+ import {
8
+ useInvites,
9
+ useResendInvite,
10
+ useRevokeInvite,
11
+ useSendInvite,
12
+ } from '../../api/resources/invites.ts'
13
+ import { useSession } from '../../api/resources/session.ts'
14
+ import { PageHeader } from '../../components/PageHeader.tsx'
15
+ import { ErrorPanel, LoadingPanel } from '../../components/QueryState.tsx'
16
+ import { initialsOf } from '../../lib/names.ts'
17
+
18
+ /**
19
+ * The workspace's people: who is in it, and who has been asked.
20
+ *
21
+ * The mockup's version was local state, so its rules were suggestions. Every one
22
+ * of them is now the API's: an admin invites, changes roles, and removes; the
23
+ * owner cannot be demoted or removed; ownership moves by being given away; and a
24
+ * member who still owns records cannot be removed until they are reassigned.
25
+ *
26
+ * This page hides the controls a member cannot use, which is a courtesy rather
27
+ * than the enforcement. The endpoints answer `403` either way.
28
+ */
29
+
30
+ function formatDate(value: Date): string {
31
+ return value.toLocaleDateString(undefined, { dateStyle: 'medium' })
32
+ }
33
+
34
+ export function TeamPage(): React.JSX.Element {
35
+ const { session } = useSession()
36
+ const isAdmin = session?.role === 'owner' || session?.role === 'admin'
37
+ const { members, isLoading, error } = useMembers()
38
+
39
+ return (
40
+ <div className="animate-slide-in mx-auto max-w-4xl space-y-8">
41
+ <PageHeader title="Team" description="Who is in this workspace, and what they can do." />
42
+
43
+ {isAdmin && <InviteForm />}
44
+ {isAdmin && <PendingInvites />}
45
+
46
+ <section>
47
+ <h2 className="mb-3 text-[14px] font-semibold text-ink">Active members</h2>
48
+ {error !== null && <ErrorPanel error={error} />}
49
+ {isLoading ? (
50
+ <LoadingPanel label="Loading the team…" />
51
+ ) : (
52
+ <MemberTable members={members} isAdmin={isAdmin} currentUserId={session?.userId} />
53
+ )}
54
+ </section>
55
+ </div>
56
+ )
57
+ }
58
+
59
+ function InviteForm(): React.JSX.Element {
60
+ const sendInvite = useSendInvite()
61
+ const [email, setEmail] = useState('')
62
+ const [role, setRole] = useState<InvitableRole>('member')
63
+
64
+ function submit(event: FormEvent): void {
65
+ event.preventDefault()
66
+
67
+ sendInvite
68
+ .runAsync({ email: email.trim(), role })
69
+ .then(() => {
70
+ setEmail('')
71
+ })
72
+ .catch(() => undefined)
73
+ }
74
+
75
+ return (
76
+ <form onSubmit={submit} className="space-y-3 rounded-md border border-border p-4">
77
+ <div className="flex flex-wrap items-end gap-2">
78
+ <label className="min-w-[220px] flex-1">
79
+ <span className="mb-1.5 block text-[12px] font-medium text-ink">Invite by email</span>
80
+ <input
81
+ type="email"
82
+ value={email}
83
+ onChange={(event) => {
84
+ setEmail(event.target.value)
85
+ }}
86
+ required
87
+ placeholder="colleague@startup.com"
88
+ className="w-full rounded-md border border-border bg-surface px-3 py-2 text-[13px] outline-none focus:border-accent focus:ring-2 focus:ring-accent/20"
89
+ />
90
+ </label>
91
+ <label>
92
+ <span className="mb-1.5 block text-[12px] font-medium text-ink">Role</span>
93
+ <select
94
+ value={role}
95
+ onChange={(event) => {
96
+ setRole(event.target.value as InvitableRole)
97
+ }}
98
+ className="rounded-md border border-border bg-surface px-3 py-2 text-[13px] capitalize outline-none focus:border-accent"
99
+ >
100
+ {INVITABLE_ROLES.map((option) => (
101
+ <option key={option} value={option}>
102
+ {option}
103
+ </option>
104
+ ))}
105
+ </select>
106
+ </label>
107
+ <button
108
+ type="submit"
109
+ disabled={sendInvite.isPending}
110
+ className="rounded-md bg-accent px-3.5 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50"
111
+ >
112
+ {sendInvite.isPending ? 'Sending…' : 'Send invite'}
113
+ </button>
114
+ </div>
115
+ {sendInvite.error !== null && <ErrorPanel error={sendInvite.error} />}
116
+ <p className="text-[11px] text-ink-faint">
117
+ The invitation is emailed and lasts seven days. Ownership is not invited; it is given to a
118
+ member who has already joined.
119
+ </p>
120
+ </form>
121
+ )
122
+ }
123
+
124
+ function PendingInvites(): React.JSX.Element {
125
+ const { invites, isLoading, error } = useInvites()
126
+ const resend = useResendInvite()
127
+ const revoke = useRevokeInvite()
128
+ const failure = resend.error ?? revoke.error ?? error
129
+
130
+ return (
131
+ <section>
132
+ <h2 className="mb-3 text-[14px] font-semibold text-ink">Invitations</h2>
133
+ {failure !== null && <ErrorPanel error={failure} />}
134
+ {isLoading ? (
135
+ <LoadingPanel label="Loading invitations…" />
136
+ ) : invites.length === 0 ? (
137
+ <p className="text-[13px] text-ink-muted">No outstanding invitations.</p>
138
+ ) : (
139
+ <div className="overflow-x-auto rounded-md border border-border">
140
+ <table className="w-full text-left text-[13px]">
141
+ <thead>
142
+ <tr className="border-b border-border bg-surface text-[11px] font-semibold tracking-wide text-ink-muted uppercase">
143
+ <th className="px-4 py-2.5">Email</th>
144
+ <th className="px-4 py-2.5">Role</th>
145
+ <th className="px-4 py-2.5">Invited</th>
146
+ <th className="px-4 py-2.5">Status</th>
147
+ <th className="px-4 py-2.5 text-right">Actions</th>
148
+ </tr>
149
+ </thead>
150
+ <tbody>
151
+ {invites.map((invite) => (
152
+ <InviteRow
153
+ key={invite.id}
154
+ invite={invite}
155
+ isPending={resend.isPending || revoke.isPending}
156
+ onResend={() => {
157
+ resend.run(invite.id)
158
+ }}
159
+ onRevoke={() => {
160
+ revoke.run(invite.id)
161
+ }}
162
+ />
163
+ ))}
164
+ </tbody>
165
+ </table>
166
+ </div>
167
+ )}
168
+ </section>
169
+ )
170
+ }
171
+
172
+ function InviteRow({
173
+ invite,
174
+ isPending,
175
+ onResend,
176
+ onRevoke,
177
+ }: {
178
+ readonly invite: Invite
179
+ readonly isPending: boolean
180
+ readonly onResend: () => void
181
+ readonly onRevoke: () => void
182
+ }): React.JSX.Element {
183
+ return (
184
+ <tr className="border-b border-border last:border-0">
185
+ <td className="px-4 py-3 font-mono text-[12px] text-ink">{invite.email}</td>
186
+ <td className="px-4 py-3 text-ink-muted capitalize">{invite.role}</td>
187
+ <td className="px-4 py-3 text-ink-muted">{formatDate(invite.createdAt)}</td>
188
+ <td className="px-4 py-3">
189
+ <span
190
+ className={
191
+ invite.status === 'pending'
192
+ ? 'text-[12px] font-medium text-warning'
193
+ : 'text-[12px] font-medium text-ink-faint'
194
+ }
195
+ >
196
+ {invite.status === 'pending' ? `Pending until ${formatDate(invite.expiresAt)}` : 'Expired'}
197
+ </span>
198
+ </td>
199
+ <td className="px-4 py-3 text-right">
200
+ <div className="flex flex-wrap justify-end gap-3">
201
+ <button
202
+ type="button"
203
+ disabled={isPending}
204
+ onClick={onResend}
205
+ title="Sends a new link and retires the old one"
206
+ className="text-[12px] font-medium text-accent hover:underline disabled:opacity-50"
207
+ >
208
+ Resend
209
+ </button>
210
+ <button
211
+ type="button"
212
+ disabled={isPending}
213
+ onClick={onRevoke}
214
+ className="text-[12px] font-medium text-danger hover:underline disabled:opacity-50"
215
+ >
216
+ Revoke
217
+ </button>
218
+ </div>
219
+ </td>
220
+ </tr>
221
+ )
222
+ }
223
+
224
+ function MemberTable({
225
+ members,
226
+ isAdmin,
227
+ currentUserId,
228
+ }: {
229
+ readonly members: readonly Member[]
230
+ readonly isAdmin: boolean
231
+ readonly currentUserId: string | undefined
232
+ }): React.JSX.Element {
233
+ const { session } = useSession()
234
+ const setRole = useSetMemberRole()
235
+ const removeMember = useRemoveMember()
236
+ const [pendingRemovalId, setPendingRemovalId] = useState<string | null>(null)
237
+ // A refused removal is only worth showing while its row is still asking. A
238
+ // successful removal clears the row, and so does Cancel; either way the reason
239
+ // the last one failed is no longer about anything on screen.
240
+ const failure = setRole.error ?? (pendingRemovalId === null ? null : removeMember.error)
241
+
242
+ const isOwner = session?.role === 'owner'
243
+
244
+ function remove(memberId: string): void {
245
+ removeMember
246
+ .runAsync(memberId)
247
+ .then(() => {
248
+ setPendingRemovalId(null)
249
+ })
250
+ .catch(() => undefined)
251
+ }
252
+
253
+ return (
254
+ <div className="space-y-3">
255
+ {failure !== null && <ErrorPanel error={failure} />}
256
+ <div className="overflow-x-auto rounded-md border border-border">
257
+ <table className="w-full text-left text-[13px]">
258
+ <thead>
259
+ <tr className="border-b border-border bg-surface text-[11px] font-semibold tracking-wide text-ink-muted uppercase">
260
+ <th className="px-4 py-2.5">Member</th>
261
+ <th className="px-4 py-2.5">Role</th>
262
+ <th className="px-4 py-2.5">Joined</th>
263
+ <th className="px-4 py-2.5 text-right">Actions</th>
264
+ </tr>
265
+ </thead>
266
+ <tbody>
267
+ {members.map((member) => (
268
+ <tr key={member.id} className="border-b border-border last:border-0">
269
+ <td className="px-4 py-3">
270
+ <div className="flex items-center gap-3">
271
+ <div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-surface-sunken text-[11px] font-medium text-ink">
272
+ {initialsOf(member.name)}
273
+ </div>
274
+ <div className="min-w-0">
275
+ <div className="truncate font-medium text-ink">
276
+ {member.name}
277
+ {member.userId === currentUserId && (
278
+ <span className="ml-1.5 text-[11px] text-ink-faint">you</span>
279
+ )}
280
+ </div>
281
+ <div className="truncate font-mono text-[11px] text-ink-faint">
282
+ {member.email}
283
+ </div>
284
+ </div>
285
+ </div>
286
+ </td>
287
+ <td className="px-4 py-3">
288
+ {member.role === 'owner' || !isAdmin ? (
289
+ <span className="text-ink-muted capitalize">{member.role}</span>
290
+ ) : (
291
+ <select
292
+ value={member.role}
293
+ disabled={setRole.isPending}
294
+ onChange={(event) => {
295
+ setRole.run({ memberId: member.id, role: event.target.value as MemberRole })
296
+ }}
297
+ className="rounded border border-border bg-surface px-2 py-1 text-[12px] capitalize outline-none disabled:opacity-50"
298
+ >
299
+ <option value="admin">Admin</option>
300
+ <option value="member">Member</option>
301
+ {/* Only the owner may offer this, and the API agrees. */}
302
+ {isOwner && <option value="owner">Owner (transfer)</option>}
303
+ </select>
304
+ )}
305
+ </td>
306
+ <td className="px-4 py-3 text-ink-muted">{formatDate(member.joinedAt)}</td>
307
+ <td className="px-4 py-3 text-right">
308
+ {isAdmin && member.role !== 'owner' && (
309
+ <RemoveMemberCell
310
+ name={member.name}
311
+ isConfirming={pendingRemovalId === member.id}
312
+ isPending={removeMember.isPending}
313
+ onAsk={() => {
314
+ setPendingRemovalId(member.id)
315
+ }}
316
+ onCancel={() => {
317
+ setPendingRemovalId(null)
318
+ }}
319
+ onConfirm={() => {
320
+ remove(member.id)
321
+ }}
322
+ />
323
+ )}
324
+ </td>
325
+ </tr>
326
+ ))}
327
+ </tbody>
328
+ </table>
329
+ </div>
330
+ {isOwner && (
331
+ <p className="text-[11px] text-ink-faint">
332
+ Giving somebody ownership makes you an admin. A workspace has exactly one owner.
333
+ </p>
334
+ )}
335
+ </div>
336
+ )
337
+ }
338
+
339
+ function RemoveMemberCell({
340
+ name,
341
+ isConfirming,
342
+ isPending,
343
+ onAsk,
344
+ onCancel,
345
+ onConfirm,
346
+ }: {
347
+ readonly name: string
348
+ readonly isConfirming: boolean
349
+ readonly isPending: boolean
350
+ readonly onAsk: () => void
351
+ readonly onCancel: () => void
352
+ readonly onConfirm: () => void
353
+ }): React.JSX.Element {
354
+ if (!isConfirming) {
355
+ return (
356
+ <button
357
+ type="button"
358
+ onClick={onAsk}
359
+ className="text-[12px] font-medium text-danger hover:underline"
360
+ >
361
+ Remove
362
+ </button>
363
+ )
364
+ }
365
+
366
+ return (
367
+ <div className="flex items-center justify-end gap-2">
368
+ <span className="text-[12px] text-ink-muted">Remove {name}?</span>
369
+ <button
370
+ type="button"
371
+ onClick={onCancel}
372
+ className="text-[12px] font-medium text-ink-muted hover:text-ink"
373
+ >
374
+ Cancel
375
+ </button>
376
+ <button
377
+ type="button"
378
+ disabled={isPending}
379
+ onClick={onConfirm}
380
+ className="rounded-md bg-danger px-2.5 py-1 text-[12px] font-semibold text-danger-fg transition hover:opacity-90 disabled:opacity-50"
381
+ >
382
+ {isPending ? 'Removing…' : 'Remove'}
383
+ </button>
384
+ </div>
385
+ )
386
+ }
@@ -0,0 +1,184 @@
1
+ import type { WebhookDelivery, WebhookDeliveryStatus } from '@kelpie/schemas'
2
+ import { useState } from 'react'
3
+
4
+ import { useWebhookDeliveries } from '../../api/resources/webhooks.ts'
5
+ import { Chip } from '../../components/Chip.tsx'
6
+ import type { ChipTone } from '../../components/Chip.tsx'
7
+ import { DataTable } from '../../components/DataTable.tsx'
8
+ import type { Column } from '../../components/DataTable.tsx'
9
+ import { ErrorPanel, LoadingPanel } from '../../components/QueryState.tsx'
10
+ import { SegmentedControl } from '../../components/SegmentedControl.tsx'
11
+ import { formatDateTime } from '../../lib/dates.ts'
12
+
13
+ /**
14
+ * What this webhook has actually sent.
15
+ *
16
+ * The row above shows only the newest delivery, which is the whole story for a
17
+ * healthy endpoint and useless for a failing one: it cannot say which event
18
+ * failed, how many attempts it took, or whether anything succeeded before it.
19
+ *
20
+ * Mounted only while a row is expanded, so a page listing ten registrations
21
+ * makes no delivery request until somebody asks for one.
22
+ */
23
+
24
+ type StatusFilter = 'all' | WebhookDeliveryStatus
25
+
26
+ const STATUS_OPTIONS = [
27
+ { id: 'all' as const, label: 'All' },
28
+ { id: 'success' as const, label: 'Success' },
29
+ { id: 'failed' as const, label: 'Failed' },
30
+ ]
31
+
32
+ const STATUS_TONES: Readonly<Record<WebhookDeliveryStatus, ChipTone>> = {
33
+ success: 'success',
34
+ failed: 'danger',
35
+ }
36
+
37
+ export function WebhookDeliveries({ webhookId }: { readonly webhookId: string }): React.JSX.Element {
38
+ const [status, setStatus] = useState<StatusFilter>('all')
39
+ const [openPayloadId, setOpenPayloadId] = useState<string | null>(null)
40
+ const deliveries = useWebhookDeliveries(webhookId, {
41
+ status: status === 'all' ? undefined : status,
42
+ })
43
+ const open = deliveries.records.find((delivery) => delivery.id === openPayloadId)
44
+
45
+ const columns: readonly Column<WebhookDelivery>[] = [
46
+ {
47
+ key: 'event',
48
+ header: 'Event',
49
+ render: (delivery) => <span className="font-mono text-[12px] text-ink">{delivery.event}</span>,
50
+ },
51
+ {
52
+ key: 'status',
53
+ header: 'Status',
54
+ className: 'w-24',
55
+ render: (delivery) => <Chip tone={STATUS_TONES[delivery.status]}>{delivery.status}</Chip>,
56
+ },
57
+ {
58
+ key: 'attempts',
59
+ header: 'Attempts',
60
+ className: 'w-20',
61
+ render: (delivery) => (
62
+ <span className="text-[12px] text-ink-muted">{delivery.attempts}</span>
63
+ ),
64
+ },
65
+ {
66
+ key: 'sent',
67
+ header: 'Sent',
68
+ className: 'w-32',
69
+ render: (delivery) => (
70
+ <span className="font-mono text-[12px] text-ink-muted">
71
+ {formatDateTime(delivery.createdAt)}
72
+ </span>
73
+ ),
74
+ },
75
+ {
76
+ key: 'delivered',
77
+ header: 'Delivered',
78
+ className: 'w-32',
79
+ // Null for a delivery that exhausted its attempts, which is the row a
80
+ // reader is looking for. An em dash says "never" without claiming a time.
81
+ render: (delivery) => (
82
+ <span className="font-mono text-[12px] text-ink-muted">
83
+ {delivery.deliveredAt === null ? '—' : formatDateTime(delivery.deliveredAt)}
84
+ </span>
85
+ ),
86
+ },
87
+ {
88
+ key: 'payload',
89
+ header: 'Body',
90
+ className: 'w-20',
91
+ render: (delivery) => (
92
+ <button
93
+ type="button"
94
+ onClick={() => {
95
+ setOpenPayloadId((current) => (current === delivery.id ? null : delivery.id))
96
+ }}
97
+ className="text-[12px] font-medium text-accent hover:underline"
98
+ >
99
+ {openPayloadId === delivery.id ? 'Hide' : 'View'}
100
+ </button>
101
+ ),
102
+ },
103
+ ]
104
+
105
+ if (deliveries.error !== null) {
106
+ return <ErrorPanel error={deliveries.error} />
107
+ }
108
+
109
+ return (
110
+ <div className="space-y-3">
111
+ <div className="flex items-center justify-between gap-3">
112
+ <h3 className="text-[12px] font-semibold text-ink">
113
+ Deliveries
114
+ {/* No number: the window is `WEBHOOK_DELIVERY_RETENTION_DAYS`, a
115
+ deployment setting this client cannot read, and naming the default
116
+ here would promise history an operator's override has deleted. */}
117
+ <span className="ml-2 font-normal text-ink-faint">older rows are pruned</span>
118
+ </h3>
119
+ <SegmentedControl
120
+ value={status}
121
+ onChange={(next) => {
122
+ setStatus(next)
123
+ // The open body may not be in the filtered list, and a panel left
124
+ // showing a row the table no longer has reads as a mismatch.
125
+ setOpenPayloadId(null)
126
+ }}
127
+ options={STATUS_OPTIONS}
128
+ ariaLabel="Filter deliveries by status"
129
+ />
130
+ </div>
131
+
132
+ {deliveries.isLoading ? (
133
+ <LoadingPanel label="Loading deliveries…" />
134
+ ) : deliveries.records.length === 0 ? (
135
+ <p className="text-[12px] text-ink-muted">
136
+ {status === 'all' ? 'Nothing delivered yet.' : `No ${status} deliveries.`}
137
+ </p>
138
+ ) : (
139
+ <DataTable
140
+ columns={columns}
141
+ rows={deliveries.records}
142
+ getRowId={(delivery) => delivery.id}
143
+ />
144
+ )}
145
+
146
+ {open !== undefined && <PayloadPanel delivery={open} />}
147
+
148
+ {deliveries.hasMore && (
149
+ <button
150
+ type="button"
151
+ onClick={deliveries.loadMore}
152
+ disabled={deliveries.isLoadingMore}
153
+ className="rounded-md border border-border px-3 py-1.5 text-[12px] font-medium text-ink transition hover:border-border-strong hover:bg-surface-sunken disabled:opacity-50"
154
+ >
155
+ {deliveries.isLoadingMore ? 'Loading…' : 'Load more'}
156
+ </button>
157
+ )}
158
+ </div>
159
+ )
160
+ }
161
+
162
+ /**
163
+ * The body of one delivery.
164
+ *
165
+ * Deliberately not called the signed bytes. `payload` is a `jsonb` column, and
166
+ * Postgres reorders an object's keys and drops the whitespace, so what comes
167
+ * back is the content the receiver was sent rather than the exact text the
168
+ * `Kelpie-Signature` HMAC covers. Saying otherwise would send a customer off to
169
+ * verify a signature against a string we never transmitted.
170
+ */
171
+ function PayloadPanel({ delivery }: { readonly delivery: WebhookDelivery }): React.JSX.Element {
172
+ return (
173
+ <div className="rounded-md border border-border bg-surface-sunken p-3">
174
+ <p className="text-[11px] text-ink-faint">
175
+ What was sent for <span className="font-mono">{delivery.event}</span>. The database
176
+ normalises key order, so this is the content of the body and not the exact text the
177
+ signature was computed over.
178
+ </p>
179
+ <pre className="mt-2 overflow-x-auto rounded border border-border bg-surface p-3 font-mono text-[11px] text-ink">
180
+ {JSON.stringify(delivery.payload, null, 2)}
181
+ </pre>
182
+ </div>
183
+ )
184
+ }