@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,110 @@
1
+ import type { Decoder, QueryParameters } from './client.ts';
2
+ /**
3
+ * The read and write hooks for one `/v1` collection.
4
+ *
5
+ * Every CRM resource is the same five operations over the same list envelope,
6
+ * so they are built once here and configured per resource. A resource module
7
+ * supplies its path, its decoder, and its two body builders; it writes no cache
8
+ * handling of its own.
9
+ *
10
+ * Pages see the three result types below and never import from
11
+ * `@tanstack/react-query` directly. That is deliberate: it keeps page code short
12
+ * and leaves the cache library replaceable without touching a page.
13
+ */
14
+ /** A list, one page at a time. Nothing is truncated in silence: `hasMore` says so. */
15
+ export interface RecordListResult<TRecord> {
16
+ readonly records: readonly TRecord[];
17
+ readonly isLoading: boolean;
18
+ readonly error: Error | null;
19
+ readonly hasMore: boolean;
20
+ readonly isLoadingMore: boolean;
21
+ readonly loadMore: () => void;
22
+ }
23
+ export interface RecordResult<TRecord> {
24
+ readonly record: TRecord | undefined;
25
+ readonly isLoading: boolean;
26
+ readonly error: Error | null;
27
+ /** The record is not in this workspace, which `api.md` makes indistinguishable from not existing. */
28
+ readonly isNotFound: boolean;
29
+ }
30
+ export interface MutationResult<TInput, TOutput> {
31
+ /** Fire and forget. A failure lands in `error` rather than in an unhandled rejection. */
32
+ readonly run: (input: TInput) => void;
33
+ /** Await the result, for a caller that navigates or chains on success. Rejects on failure. */
34
+ readonly runAsync: (input: TInput) => Promise<TOutput>;
35
+ readonly isPending: boolean;
36
+ readonly error: Error | null;
37
+ }
38
+ export interface UpdateArguments<TUpdateInput> {
39
+ readonly id: string;
40
+ readonly changes: TUpdateInput;
41
+ }
42
+ export interface PatchResult<TChanges> {
43
+ /** Fire and forget, bound to one record's id. A failure lands in `error`. */
44
+ readonly patch: (changes: TChanges) => void;
45
+ readonly error: Error | null;
46
+ }
47
+ export interface ListOptions {
48
+ /**
49
+ * Set false to hold the request back. A list filtered by a set of ids has
50
+ * nothing to ask until those ids are known, and asking with the filter omitted
51
+ * would answer with every record instead of none.
52
+ */
53
+ readonly enabled?: boolean;
54
+ }
55
+ export interface ResourceHooks<TRecord, TCreateInput, TUpdateInput> extends ReadOnlyResourceHooks<TRecord> {
56
+ useCreate(): MutationResult<TCreateInput, TRecord>;
57
+ useUpdate(): MutationResult<UpdateArguments<TUpdateInput>, TRecord>;
58
+ useRemove(): MutationResult<string, void>;
59
+ }
60
+ /** What a collection with no write verbs offers. Activities are the case: the table is append-only. */
61
+ export interface ReadOnlyResourceHooks<TRecord> {
62
+ useList(query?: QueryParameters, options?: ListOptions): RecordListResult<TRecord>;
63
+ useRecord(id: string | undefined): RecordResult<TRecord>;
64
+ }
65
+ export interface ReadOnlyResourceDefinition<TRecord> {
66
+ /** Cache key root. The plural resource name, e.g. `activities`. */
67
+ readonly name: string;
68
+ /** Path under the API base, e.g. `/activities`. */
69
+ readonly path: string;
70
+ readonly decode: Decoder<TRecord>;
71
+ }
72
+ export interface ResourceDefinition<TRecord, TCreateInput, TUpdateInput> extends ReadOnlyResourceDefinition<TRecord> {
73
+ readonly createBody: (input: TCreateInput) => unknown;
74
+ readonly updateBody: (input: TUpdateInput) => unknown;
75
+ /**
76
+ * Other resources whose cached lists a write here can invalidate.
77
+ *
78
+ * A join record is the case that needs it. `GET /v1/people?company_id=` is a
79
+ * list of people, so creating a Position changes its contents without
80
+ * touching a single person, and a company page that only refetched positions
81
+ * would render the new row against a name it never fetched.
82
+ */
83
+ readonly alsoInvalidates?: readonly string[];
84
+ }
85
+ /**
86
+ * The read half: `useList` and `useRecord`, and nothing that writes.
87
+ *
88
+ * Split out because a collection can be read-only. `createResourceHooks` builds
89
+ * on this rather than repeating it, so both kinds of resource page, cache, and
90
+ * report a 404 identically.
91
+ */
92
+ export declare function createReadOnlyResourceHooks<TRecord>(definition: ReadOnlyResourceDefinition<TRecord>): ReadOnlyResourceHooks<TRecord>;
93
+ export declare function createResourceHooks<TRecord extends {
94
+ readonly id: string;
95
+ }, TCreateInput, TUpdateInput extends Partial<TRecord>>(definition: ResourceDefinition<TRecord, TCreateInput, TUpdateInput>): ResourceHooks<TRecord, TCreateInput, TUpdateInput>;
96
+ /**
97
+ * Binds a resource's `useUpdate` hook to one record's id, for a detail page's
98
+ * inline edits.
99
+ *
100
+ * Every detail page had its own three-line `use<X>Patch` doing exactly this,
101
+ * and every one of them discarded `update.error`. `InlineEdit`'s `onChange` has
102
+ * no return value to reject, so a failed `PATCH` — a duplicate email or domain,
103
+ * a dropped connection — had nowhere left to surface: the field just reverted
104
+ * to its old value with no explanation. Callers now get the error back and
105
+ * decide where to show it.
106
+ */
107
+ export declare function usePatch<TRecord extends {
108
+ readonly id: string;
109
+ }, TChanges>(useUpdate: () => MutationResult<UpdateArguments<TChanges>, TRecord>, record: TRecord): PatchResult<TChanges>;
110
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../src/api/resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ import { keepPreviousData, useInfiniteQuery, useMutation, useQuery, useQueryClient, } from '@tanstack/react-query';
2
+ import { ApiError } from './client.js';
3
+ import { useApiClient } from './context.js';
4
+ import { toError } from './errors.js';
5
+ function keysFor(name) {
6
+ return {
7
+ all: [name],
8
+ lists: [name, 'list'],
9
+ list: (query) => [name, 'list', query],
10
+ detail: (id) => [name, 'detail', id],
11
+ };
12
+ }
13
+ /**
14
+ * Applies a partial update to a record.
15
+ *
16
+ * `undefined` means "not sent" and `null` means "clear this field", per
17
+ * `api.md`, so an undefined value must leave the existing one alone rather than
18
+ * overwrite it.
19
+ */
20
+ function mergeDefined(record, changes) {
21
+ const merged = { ...record };
22
+ for (const [key, value] of Object.entries(changes)) {
23
+ if (value !== undefined) {
24
+ Object.assign(merged, { [key]: value });
25
+ }
26
+ }
27
+ return merged;
28
+ }
29
+ /** Rewrites one record everywhere it is cached: its own entry, and every list page holding it. */
30
+ function writeRecordEverywhere(queryClient, keys, record) {
31
+ queryClient.setQueryData(keys.detail(record.id), record);
32
+ queryClient.setQueriesData({ queryKey: keys.lists }, (data) => data === undefined
33
+ ? data
34
+ : {
35
+ ...data,
36
+ pages: data.pages.map((page) => ({
37
+ ...page,
38
+ items: page.items.map((item) => (item.id === record.id ? record : item)),
39
+ })),
40
+ });
41
+ }
42
+ function removeRecordEverywhere(queryClient, keys, id) {
43
+ queryClient.removeQueries({ queryKey: keys.detail(id) });
44
+ queryClient.setQueriesData({ queryKey: keys.lists }, (data) => data === undefined
45
+ ? data
46
+ : {
47
+ ...data,
48
+ pages: data.pages.map((page) => ({
49
+ ...page,
50
+ items: page.items.filter((item) => item.id !== id),
51
+ })),
52
+ });
53
+ }
54
+ /**
55
+ * The read half: `useList` and `useRecord`, and nothing that writes.
56
+ *
57
+ * Split out because a collection can be read-only. `createResourceHooks` builds
58
+ * on this rather than repeating it, so both kinds of resource page, cache, and
59
+ * report a 404 identically.
60
+ */
61
+ export function createReadOnlyResourceHooks(definition) {
62
+ const keys = keysFor(definition.name);
63
+ function useList(query = {}, options = {}) {
64
+ const client = useApiClient();
65
+ const enabled = options.enabled ?? true;
66
+ const result = useInfiniteQuery({
67
+ queryKey: keys.list(query),
68
+ queryFn: ({ pageParam }) => client.list(definition.path, definition.decode, {
69
+ ...query,
70
+ ...(pageParam === null ? {} : { cursor: pageParam }),
71
+ }),
72
+ initialPageParam: null,
73
+ getNextPageParam: (lastPage) => lastPage.nextCursor,
74
+ // Without this a keystroke in the filter box blanks the table while the
75
+ // next query runs, which reads as "no results" for as long as it takes.
76
+ placeholderData: keepPreviousData,
77
+ enabled,
78
+ });
79
+ return {
80
+ records: result.data?.pages.flatMap((page) => page.items) ?? [],
81
+ // A disabled query stays pending forever, which is not the same as loading.
82
+ isLoading: result.isPending && enabled,
83
+ error: toError(result.error),
84
+ hasMore: result.hasNextPage,
85
+ isLoadingMore: result.isFetchingNextPage,
86
+ loadMore: () => {
87
+ void result.fetchNextPage();
88
+ },
89
+ };
90
+ }
91
+ function useRecord(id) {
92
+ const client = useApiClient();
93
+ const result = useQuery({
94
+ queryKey: keys.detail(id ?? ''),
95
+ queryFn: () => client.get(`${definition.path}/${id ?? ''}`, definition.decode),
96
+ enabled: id !== undefined,
97
+ });
98
+ return {
99
+ record: result.data,
100
+ isLoading: result.isPending && id !== undefined,
101
+ error: toError(result.error),
102
+ isNotFound: result.error instanceof ApiError && result.error.status === 404,
103
+ };
104
+ }
105
+ return { useList, useRecord };
106
+ }
107
+ export function createResourceHooks(definition) {
108
+ const keys = keysFor(definition.name);
109
+ const related = (definition.alsoInvalidates ?? []).map(keysFor);
110
+ const { useList, useRecord } = createReadOnlyResourceHooks(definition);
111
+ /**
112
+ * Marks this resource's lists stale, and the related resources' with them.
113
+ * Applied to every write rather than only to create and delete: a resource
114
+ * that declares a relation has one, whichever verb reaches it.
115
+ */
116
+ function invalidateLists(queryClient) {
117
+ for (const target of [keys, ...related]) {
118
+ void queryClient.invalidateQueries({ queryKey: target.lists });
119
+ }
120
+ }
121
+ function useCreate() {
122
+ const client = useApiClient();
123
+ const queryClient = useQueryClient();
124
+ const mutation = useMutation({
125
+ mutationFn: (input) => client.post(definition.path, definition.createBody(input), definition.decode),
126
+ // No optimistic insert: the id comes from the server, and the caller
127
+ // usually navigates straight to the new record. A placeholder id would be
128
+ // a route to a record that does not exist yet.
129
+ onSuccess: (record) => {
130
+ queryClient.setQueryData(keys.detail(record.id), record);
131
+ },
132
+ onSettled: () => {
133
+ invalidateLists(queryClient);
134
+ },
135
+ });
136
+ return {
137
+ run: (input) => {
138
+ mutation.mutate(input);
139
+ },
140
+ runAsync: (input) => mutation.mutateAsync(input),
141
+ isPending: mutation.isPending,
142
+ error: toError(mutation.error),
143
+ };
144
+ }
145
+ function useUpdate() {
146
+ const client = useApiClient();
147
+ const queryClient = useQueryClient();
148
+ const mutation = useMutation({
149
+ mutationFn: ({ id, changes }) => client.patch(`${definition.path}/${id}`, definition.updateBody(changes), definition.decode),
150
+ // Inline editing is the whole interaction on a detail page, so the field
151
+ // has to settle the moment it is committed. The snapshot is what makes
152
+ // that safe: a rejected PATCH puts the old value back.
153
+ onMutate: async ({ id, changes }) => {
154
+ await queryClient.cancelQueries({ queryKey: keys.detail(id) });
155
+ const previous = queryClient.getQueryData(keys.detail(id));
156
+ if (previous !== undefined) {
157
+ writeRecordEverywhere(queryClient, keys, mergeDefined(previous, changes));
158
+ }
159
+ return { previous };
160
+ },
161
+ onError: (_error, _arguments_, context) => {
162
+ if (context?.previous !== undefined) {
163
+ writeRecordEverywhere(queryClient, keys, context.previous);
164
+ }
165
+ },
166
+ onSuccess: (record) => {
167
+ writeRecordEverywhere(queryClient, keys, record);
168
+ },
169
+ onSettled: (_record, _error, { id }) => {
170
+ void queryClient.invalidateQueries({ queryKey: keys.detail(id) });
171
+ invalidateLists(queryClient);
172
+ },
173
+ });
174
+ return {
175
+ run: (input) => {
176
+ mutation.mutate(input);
177
+ },
178
+ runAsync: (input) => mutation.mutateAsync(input),
179
+ isPending: mutation.isPending,
180
+ error: toError(mutation.error),
181
+ };
182
+ }
183
+ function useRemove() {
184
+ const client = useApiClient();
185
+ const queryClient = useQueryClient();
186
+ const mutation = useMutation({
187
+ mutationFn: (id) => client.delete(`${definition.path}/${id}`),
188
+ onMutate: async (id) => {
189
+ await queryClient.cancelQueries({ queryKey: keys.all });
190
+ const previous = queryClient.getQueryData(keys.detail(id));
191
+ const previousLists = queryClient.getQueriesData({ queryKey: keys.lists });
192
+ removeRecordEverywhere(queryClient, keys, id);
193
+ return { previous, previousLists };
194
+ },
195
+ onError: (_error, id, context) => {
196
+ for (const [key, data] of context?.previousLists ?? []) {
197
+ queryClient.setQueryData(key, data);
198
+ }
199
+ if (context?.previous !== undefined) {
200
+ queryClient.setQueryData(keys.detail(id), context.previous);
201
+ }
202
+ },
203
+ onSettled: () => {
204
+ invalidateLists(queryClient);
205
+ },
206
+ });
207
+ return {
208
+ run: (id) => {
209
+ mutation.mutate(id);
210
+ },
211
+ runAsync: (id) => mutation.mutateAsync(id),
212
+ isPending: mutation.isPending,
213
+ error: toError(mutation.error),
214
+ };
215
+ }
216
+ return { useList, useRecord, useCreate, useUpdate, useRemove };
217
+ }
218
+ /**
219
+ * Binds a resource's `useUpdate` hook to one record's id, for a detail page's
220
+ * inline edits.
221
+ *
222
+ * Every detail page had its own three-line `use<X>Patch` doing exactly this,
223
+ * and every one of them discarded `update.error`. `InlineEdit`'s `onChange` has
224
+ * no return value to reject, so a failed `PATCH` — a duplicate email or domain,
225
+ * a dropped connection — had nowhere left to surface: the field just reverted
226
+ * to its old value with no explanation. Callers now get the error back and
227
+ * decide where to show it.
228
+ */
229
+ export function usePatch(useUpdate, record) {
230
+ const update = useUpdate();
231
+ return {
232
+ patch: (changes) => {
233
+ update.run({ id: record.id, changes });
234
+ },
235
+ error: update.error,
236
+ };
237
+ }
238
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/api/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,cAAc,GACf,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AA2GrC,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO;QACL,GAAG,EAAE,CAAC,IAAI,CAAC;QACX,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;QACtC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;KACrC,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CAAyB,MAAe,EAAE,OAAyB;IACtF,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;IAE5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,kGAAkG;AAClG,SAAS,qBAAqB,CAC5B,WAAwB,EACxB,IAAkB,EAClB,MAAe;IAEf,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IACxD,WAAW,CAAC,cAAc,CAAoB,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAC/E,IAAI,KAAK,SAAS;QAChB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,GAAG,IAAI;YACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC/B,GAAG,IAAI;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACzE,CAAC,CAAC;SACJ,CACN,CAAA;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,WAAwB,EACxB,IAAkB,EAClB,EAAU;IAEV,WAAW,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACxD,WAAW,CAAC,cAAc,CAAoB,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAC/E,IAAI,KAAK,SAAS;QAChB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,GAAG,IAAI;YACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC/B,GAAG,IAAI;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;aACnD,CAAC,CAAC;SACJ,CACN,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,UAA+C;IAE/C,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAErC,SAAS,OAAO,CAAC,KAAK,GAAoB,EAAE,EAAE,OAAO,GAAgB,EAAE;QACrE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAA;QACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAC9B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1B,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CACzB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE;gBAC9C,GAAG,KAAK;gBACR,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;aACrD,CAAC;YACJ,gBAAgB,EAAE,IAAqB;YACvC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU;YACnD,wEAAwE;YACxE,wEAAwE;YACxE,eAAe,EAAE,gBAAgB;YACjC,OAAO;SACR,CAAC,CAAA;QAEF,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAC/D,4EAA4E;YAC5E,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,OAAO;YACtC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5B,OAAO,EAAE,MAAM,CAAC,WAAW;YAC3B,aAAa,EAAE,MAAM,CAAC,kBAAkB;YACxC,QAAQ,EAAE,GAAG,EAAE;gBACb,KAAK,MAAM,CAAC,aAAa,EAAE,CAAA;YAC7B,CAAC;SACF,CAAA;IACH,CAAC;IAED,SAAS,SAAS,CAAC,EAAsB;QACvC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;YAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;YAC9E,OAAO,EAAE,EAAE,KAAK,SAAS;SAC1B,CAAC,CAAA;QAEF,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE,KAAK,SAAS;YAC/C,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5B,UAAU,EAAE,MAAM,CAAC,KAAK,YAAY,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG;SAC5E,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAKjC,UAAmE;IAEnE,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC/D,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAA;IAEtE;;;;OAIG;IACH,SAAS,eAAe,CAAC,WAAwB;QAC/C,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;YACxC,KAAK,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED,SAAS,SAAS;QAChB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC;YAC3B,UAAU,EAAE,CAAC,KAAmB,EAAE,EAAE,CAClC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC;YAC/E,qEAAqE;YACrE,0EAA0E;YAC1E,+CAA+C;YAC/C,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpB,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;YAC1D,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,eAAe,CAAC,WAAW,CAAC,CAAA;YAC9B,CAAC;SACF,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;gBACb,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACxB,CAAC;YACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;YAChD,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;SAC/B,CAAA;IACH,CAAC;IAED,SAAS,SAAS;QAChB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC;YAC3B,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAiC,EAAE,EAAE,CAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC;YAE7F,yEAAyE;YACzE,uEAAuE;YACvE,uDAAuD;YACvD,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAClC,MAAM,WAAW,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC9D,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAU,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;gBAEnE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,qBAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;gBAC3E,CAAC;gBAED,OAAO,EAAE,QAAQ,EAAE,CAAA;YACrB,CAAC;YAED,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;gBACxC,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACpC,qBAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAC5D,CAAC;YACH,CAAC;YAED,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpB,qBAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;YAClD,CAAC;YAED,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;gBACrC,KAAK,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBACjE,eAAe,CAAC,WAAW,CAAC,CAAA;YAC9B,CAAC;SACF,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;gBACb,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACxB,CAAC;YACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;YAChD,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;SAC/B,CAAA;IACH,CAAC;IAED,SAAS,SAAS;QAChB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC;YAC3B,UAAU,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YAErE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACrB,MAAM,WAAW,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;gBACvD,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAU,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;gBACnE,MAAM,aAAa,GAAG,WAAW,CAAC,cAAc,CAAoB,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;gBAE7F,sBAAsB,CAAU,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;gBAEtD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;YACpC,CAAC;YAED,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;gBAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC;oBACvD,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;gBACrC,CAAC;gBAED,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACpC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAC7D,CAAC;YACH,CAAC;YAED,SAAS,EAAE,GAAG,EAAE;gBACd,eAAe,CAAC,WAAW,CAAC,CAAA;YAC9B,CAAC;SACF,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;gBACV,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACrB,CAAC;YACD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;SAC/B,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA;AAChE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,SAAmE,EACnE,MAAe;IAEf,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;YACjB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QACxC,CAAC;QACD,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAA;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { Account, AccountPreferences, AccountSession, ChangePasswordInput, ThemePreference, UpdateAccountInput, UpdateAccountPreferencesInput } from '@kelpie/schemas';
2
+ import type { MutationResult } from '../resource.ts';
3
+ export interface AccountState {
4
+ readonly account: Account | undefined;
5
+ readonly isLoading: boolean;
6
+ readonly error: Error | null;
7
+ }
8
+ export declare function useAccount(): AccountState;
9
+ export declare function useUpdateAccount(): MutationResult<UpdateAccountInput, Account>;
10
+ export interface AccountPreferencesState {
11
+ readonly preferences: AccountPreferences | undefined;
12
+ readonly isLoading: boolean;
13
+ readonly error: Error | null;
14
+ }
15
+ export declare function useAccountPreferences(): AccountPreferencesState;
16
+ export declare function useUpdateAccountPreferences(): MutationResult<UpdateAccountPreferencesInput, AccountPreferences>;
17
+ export interface AccountSessionsState {
18
+ readonly sessions: readonly AccountSession[];
19
+ readonly isLoading: boolean;
20
+ readonly error: Error | null;
21
+ }
22
+ /** Where this account is signed in. The caller's own session is marked `current`. */
23
+ export declare function useAccountSessions(): AccountSessionsState;
24
+ export declare function useRevokeAccountSession(): MutationResult<string, void>;
25
+ /**
26
+ * Changes the password and ends every other session, which is what the service
27
+ * does, so the session list on the same page is refetched rather than left
28
+ * showing devices that are no longer signed in.
29
+ */
30
+ export declare function useChangePassword(): MutationResult<ChangePasswordInput, void>;
31
+ export interface ThemeControl {
32
+ readonly theme: ThemePreference;
33
+ readonly setTheme: (theme: ThemePreference) => void;
34
+ }
35
+ /**
36
+ * The theme, applied to the document and stored on the account.
37
+ *
38
+ * The account's preference is the source of truth, so the theme follows the
39
+ * person to a new browser. `localStorage` seeds the first paint only: waiting
40
+ * for the request would render the default theme and then correct itself on
41
+ * every cold load.
42
+ *
43
+ * The value comes from the query cache rather than component state, because
44
+ * more than one control changes it. The shell's toggle and the preferences page
45
+ * are separate components, and two `useState` copies of one preference disagree
46
+ * the moment either is clicked.
47
+ */
48
+ export declare function useTheme(): ThemeControl;
49
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/api/resources/account.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,6BAA6B,EAC9B,MAAM,iBAAiB,CAAA;AAOxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAgBpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAC7B;AAED,wBAAgB,UAAU,IAAI,YAAY,CAQzC;AAED,wBAAgB,gBAAgB,IAAI,cAAc,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAe9E;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACpD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAC7B;AAED,wBAAgB,qBAAqB,IAAI,uBAAuB,CAQ/D;AAED,wBAAgB,2BAA2B,IAAI,cAAc,CAC3D,6BAA6B,EAC7B,kBAAkB,CACnB,CAqBA;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAC7B;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,IAAI,oBAAoB,CAYzD;AAED,wBAAgB,uBAAuB,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAWtE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAY7E;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;CACpD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,IAAI,YAAY,CAkCvC"}
@@ -0,0 +1,146 @@
1
+ import { accountPreferencesSchema, accountSchema, accountSessionSchema, changePasswordBody, updateAccountBody, updateAccountPreferencesBody, } from '@kelpie/schemas';
2
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
3
+ import { useEffect, useState } from 'react';
4
+ import { applyTheme, getStoredTheme, setStoredTheme, watchSystemTheme } from '../../lib/theme.js';
5
+ import { useApiClient } from '../context.js';
6
+ import { toError } from '../errors.js';
7
+ import { asMutationResult } from './mutation.js';
8
+ /**
9
+ * The signed-in person, as the `/account/*` pages read and write them.
10
+ *
11
+ * Not CRM resources, so none of these go through `createResourceHooks`: there is
12
+ * no collection and no id in a path. They are also not workspace-scoped, which
13
+ * is why nothing here keys on the session's workspace: renaming an account
14
+ * renames it everywhere it is a member.
15
+ */
16
+ const ACCOUNT_KEY = ['account'];
17
+ const PREFERENCES_KEY = ['account', 'preferences'];
18
+ const SESSIONS_KEY = ['account', 'sessions'];
19
+ export function useAccount() {
20
+ const client = useApiClient();
21
+ const result = useQuery({
22
+ queryKey: ACCOUNT_KEY,
23
+ queryFn: () => client.get('/account', accountSchema.parse),
24
+ });
25
+ return { account: result.data, isLoading: result.isPending, error: toError(result.error) };
26
+ }
27
+ export function useUpdateAccount() {
28
+ const client = useApiClient();
29
+ const queryClient = useQueryClient();
30
+ const mutation = useMutation({
31
+ mutationFn: (input) => client.patch('/account', updateAccountBody(input), accountSchema.parse),
32
+ onSuccess: async (account) => {
33
+ queryClient.setQueryData(ACCOUNT_KEY, account);
34
+ // The team page lists this person by name and address out of the member
35
+ // list, which the account write knows nothing about.
36
+ await queryClient.invalidateQueries({ queryKey: ['members'] });
37
+ },
38
+ });
39
+ return asMutationResult(mutation);
40
+ }
41
+ export function useAccountPreferences() {
42
+ const client = useApiClient();
43
+ const result = useQuery({
44
+ queryKey: PREFERENCES_KEY,
45
+ queryFn: () => client.get('/account/preferences', accountPreferencesSchema.parse),
46
+ });
47
+ return { preferences: result.data, isLoading: result.isPending, error: toError(result.error) };
48
+ }
49
+ export function useUpdateAccountPreferences() {
50
+ const client = useApiClient();
51
+ const queryClient = useQueryClient();
52
+ const mutation = useMutation({
53
+ mutationFn: (input) => client.patch('/account/preferences', updateAccountPreferencesBody(input), accountPreferencesSchema.parse),
54
+ onSuccess: (preferences) => {
55
+ queryClient.setQueryData(PREFERENCES_KEY, preferences);
56
+ },
57
+ // A failed write leaves an optimistic theme on screen that the account does
58
+ // not hold. Ask the service what is true rather than guessing back.
59
+ onError: async () => {
60
+ await queryClient.invalidateQueries({ queryKey: PREFERENCES_KEY });
61
+ },
62
+ });
63
+ return asMutationResult(mutation);
64
+ }
65
+ /** Where this account is signed in. The caller's own session is marked `current`. */
66
+ export function useAccountSessions() {
67
+ const client = useApiClient();
68
+ const result = useQuery({
69
+ queryKey: SESSIONS_KEY,
70
+ queryFn: () => client.list('/auth/sessions', accountSessionSchema.parse),
71
+ });
72
+ return {
73
+ sessions: result.data?.items ?? [],
74
+ isLoading: result.isPending,
75
+ error: toError(result.error),
76
+ };
77
+ }
78
+ export function useRevokeAccountSession() {
79
+ const client = useApiClient();
80
+ const queryClient = useQueryClient();
81
+ const mutation = useMutation({
82
+ mutationFn: (sessionId) => client.delete(`/auth/sessions/${sessionId}`),
83
+ onSuccess: async () => {
84
+ await queryClient.invalidateQueries({ queryKey: SESSIONS_KEY });
85
+ },
86
+ });
87
+ return asMutationResult(mutation);
88
+ }
89
+ /**
90
+ * Changes the password and ends every other session, which is what the service
91
+ * does, so the session list on the same page is refetched rather than left
92
+ * showing devices that are no longer signed in.
93
+ */
94
+ export function useChangePassword() {
95
+ const client = useApiClient();
96
+ const queryClient = useQueryClient();
97
+ const mutation = useMutation({
98
+ mutationFn: (input) => client.patchEmpty('/auth/password', changePasswordBody(input)),
99
+ onSuccess: async () => {
100
+ await queryClient.invalidateQueries({ queryKey: SESSIONS_KEY });
101
+ },
102
+ });
103
+ return asMutationResult(mutation);
104
+ }
105
+ /**
106
+ * The theme, applied to the document and stored on the account.
107
+ *
108
+ * The account's preference is the source of truth, so the theme follows the
109
+ * person to a new browser. `localStorage` seeds the first paint only: waiting
110
+ * for the request would render the default theme and then correct itself on
111
+ * every cold load.
112
+ *
113
+ * The value comes from the query cache rather than component state, because
114
+ * more than one control changes it. The shell's toggle and the preferences page
115
+ * are separate components, and two `useState` copies of one preference disagree
116
+ * the moment either is clicked.
117
+ */
118
+ export function useTheme() {
119
+ const queryClient = useQueryClient();
120
+ const { preferences } = useAccountPreferences();
121
+ const update = useUpdateAccountPreferences();
122
+ const [firstPaintTheme] = useState(() => getStoredTheme());
123
+ const theme = preferences?.theme ?? firstPaintTheme;
124
+ useEffect(() => {
125
+ applyTheme(theme);
126
+ // Kept current so the next cold load in this browser paints the right theme
127
+ // before the request answers.
128
+ setStoredTheme(theme);
129
+ }, [theme]);
130
+ useEffect(() => {
131
+ if (theme !== 'system') {
132
+ return;
133
+ }
134
+ return watchSystemTheme(() => {
135
+ applyTheme('system');
136
+ });
137
+ }, [theme]);
138
+ function setTheme(next) {
139
+ // Applied to the cache first: the click is about something visible, and the
140
+ // eye should not wait on a round trip. `onError` puts the truth back.
141
+ queryClient.setQueryData(PREFERENCES_KEY, (current) => current === undefined ? current : { ...current, theme: next });
142
+ update.run({ theme: next });
143
+ }
144
+ return { theme, setTheme };
145
+ }
146
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/api/resources/account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Activity, RecordTargetType } from '@kelpie/schemas';
2
+ import type { RecordListResult } from '../resource.ts';
3
+ export interface ActivityTimeline {
4
+ readonly targetType: RecordTargetType;
5
+ readonly targetId: string;
6
+ }
7
+ export declare function useActivities(timeline: ActivityTimeline): RecordListResult<Activity>;
8
+ //# sourceMappingURL=activities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activities.d.ts","sourceRoot":"","sources":["../../../src/api/resources/activities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAGjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAmBtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAEpF"}
@@ -0,0 +1,21 @@
1
+ import { activitySchema } from '@kelpie/schemas';
2
+ import { createReadOnlyResourceHooks } from '../resource.js';
3
+ /**
4
+ * `/v1/activities`, read-only.
5
+ *
6
+ * No write hooks, because the API has no write routes: activity is emitted by
7
+ * the service that made the change, in the same transaction, and the table is
8
+ * append-only.
9
+ *
10
+ * The roll-up a person's or company's timeline shows is resolved server-side.
11
+ * Nothing here fetches related deals to merge them in.
12
+ */
13
+ const activities = createReadOnlyResourceHooks({
14
+ name: 'activities',
15
+ path: '/activities',
16
+ decode: activitySchema.parse,
17
+ });
18
+ export function useActivities(timeline) {
19
+ return activities.useList({ target_type: timeline.targetType, target_id: timeline.targetId });
20
+ }
21
+ //# sourceMappingURL=activities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activities.js","sourceRoot":"","sources":["../../../src/api/resources/activities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAGhD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAG5D;;;;;;;;;GASG;AAEH,MAAM,UAAU,GAAG,2BAA2B,CAAW;IACvD,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,cAAc,CAAC,KAAK;CAC7B,CAAC,CAAA;AAOF,MAAM,UAAU,aAAa,CAAC,QAA0B;IACtD,OAAO,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC/F,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { AgentRun, AgentRunStatus, AgentTaskDefinition, AgentTaskTargetType, CreateRegisteredAgentInput, RegisteredAgent, RegisteredAgentInput, ResolveAgentTaskInput, ResolvedAgentTask, RunAgentTaskInput } from '@kelpie/schemas';
2
+ import type { ListOptions, MutationResult, RecordListResult, RecordResult, UpdateArguments } from '../resource.ts';
3
+ /** The catalog for one target type. Code on the server, so never stale enough to refetch. */
4
+ export declare function useAgentTasks(targetType: AgentTaskTargetType): RecordListResult<AgentTaskDefinition>;
5
+ /** The whole catalog, for labelling run-log rows by task id. */
6
+ export declare function useAllAgentTasks(): RecordListResult<AgentTaskDefinition>;
7
+ export interface ResolveAgentTaskArguments extends ResolveAgentTaskInput {
8
+ readonly taskId: string;
9
+ }
10
+ /** A POST in verb only: it assembles a prompt and writes nothing, so no cache moves. */
11
+ export declare function useResolveAgentTask(): MutationResult<ResolveAgentTaskArguments, ResolvedAgentTask>;
12
+ export interface RunAgentTaskArguments extends RunAgentTaskInput {
13
+ readonly taskId: string;
14
+ }
15
+ export declare function useRunAgentTask(): MutationResult<RunAgentTaskArguments, AgentRun>;
16
+ export interface AgentRunFilters {
17
+ readonly agentId?: string;
18
+ readonly status?: AgentRunStatus;
19
+ }
20
+ export declare function useAgentRuns(filters?: AgentRunFilters, options?: ListOptions): RecordListResult<AgentRun>;
21
+ /**
22
+ * One run, polled while the dispatch is still moving. The server settles the
23
+ * run after the create response returns, so `queued` and `running` are moments
24
+ * the page would otherwise be stuck displaying forever.
25
+ */
26
+ export declare function useAgentRun(id: string | undefined): RecordResult<AgentRun>;
27
+ export declare function useAgents(options?: ListOptions): RecordListResult<RegisteredAgent>;
28
+ export declare function useCreateAgent(): MutationResult<CreateRegisteredAgentInput, RegisteredAgent>;
29
+ export declare function useUpdateAgent(): MutationResult<UpdateArguments<RegisteredAgentInput>, RegisteredAgent>;
30
+ export declare function useDeleteAgent(): MutationResult<string, void>;
31
+ //# sourceMappingURL=agentTasks.d.ts.map