@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.
- package/LICENSE +661 -0
- package/README.md +44 -0
- package/dist/ServiceStatus.d.ts +6 -0
- package/dist/ServiceStatus.d.ts.map +1 -0
- package/dist/ServiceStatus.js +35 -0
- package/dist/ServiceStatus.js.map +1 -0
- package/dist/api/ApiProvider.d.ts +19 -0
- package/dist/api/ApiProvider.d.ts.map +1 -0
- package/dist/api/ApiProvider.js +18 -0
- package/dist/api/ApiProvider.js.map +1 -0
- package/dist/api/client.d.ts +83 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +162 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/context.d.ts +14 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +20 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/errors.d.ts +9 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +14 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/health.d.ts +15 -0
- package/dist/api/health.d.ts.map +1 -0
- package/dist/api/health.js +22 -0
- package/dist/api/health.js.map +1 -0
- package/dist/api/json.d.ts +3 -0
- package/dist/api/json.d.ts.map +1 -0
- package/dist/api/json.js +5 -0
- package/dist/api/json.js.map +1 -0
- package/dist/api/queryClient.d.ts +17 -0
- package/dist/api/queryClient.d.ts.map +1 -0
- package/dist/api/queryClient.js +33 -0
- package/dist/api/queryClient.js.map +1 -0
- package/dist/api/resource.d.ts +110 -0
- package/dist/api/resource.d.ts.map +1 -0
- package/dist/api/resource.js +238 -0
- package/dist/api/resource.js.map +1 -0
- package/dist/api/resources/account.d.ts +49 -0
- package/dist/api/resources/account.d.ts.map +1 -0
- package/dist/api/resources/account.js +146 -0
- package/dist/api/resources/account.js.map +1 -0
- package/dist/api/resources/activities.d.ts +8 -0
- package/dist/api/resources/activities.d.ts.map +1 -0
- package/dist/api/resources/activities.js +21 -0
- package/dist/api/resources/activities.js.map +1 -0
- package/dist/api/resources/agentTasks.d.ts +31 -0
- package/dist/api/resources/agentTasks.d.ts.map +1 -0
- package/dist/api/resources/agentTasks.js +103 -0
- package/dist/api/resources/agentTasks.js.map +1 -0
- package/dist/api/resources/candidates.d.ts +17 -0
- package/dist/api/resources/candidates.d.ts.map +1 -0
- package/dist/api/resources/candidates.js +40 -0
- package/dist/api/resources/candidates.js.map +1 -0
- package/dist/api/resources/companies.d.ts +22 -0
- package/dist/api/resources/companies.d.ts.map +1 -0
- package/dist/api/resources/companies.js +36 -0
- package/dist/api/resources/companies.js.map +1 -0
- package/dist/api/resources/dashboard.d.ts +8 -0
- package/dist/api/resources/dashboard.d.ts.map +1 -0
- package/dist/api/resources/dashboard.js +27 -0
- package/dist/api/resources/dashboard.js.map +1 -0
- package/dist/api/resources/deals.d.ts +30 -0
- package/dist/api/resources/deals.d.ts.map +1 -0
- package/dist/api/resources/deals.js +38 -0
- package/dist/api/resources/deals.js.map +1 -0
- package/dist/api/resources/decisions.d.ts +13 -0
- package/dist/api/resources/decisions.d.ts.map +1 -0
- package/dist/api/resources/decisions.js +38 -0
- package/dist/api/resources/decisions.js.map +1 -0
- package/dist/api/resources/forms.d.ts +82 -0
- package/dist/api/resources/forms.d.ts.map +1 -0
- package/dist/api/resources/forms.js +129 -0
- package/dist/api/resources/forms.js.map +1 -0
- package/dist/api/resources/handbookPages.d.ts +33 -0
- package/dist/api/resources/handbookPages.d.ts.map +1 -0
- package/dist/api/resources/handbookPages.js +49 -0
- package/dist/api/resources/handbookPages.js.map +1 -0
- package/dist/api/resources/importJobs.d.ts +72 -0
- package/dist/api/resources/importJobs.d.ts.map +1 -0
- package/dist/api/resources/importJobs.js +145 -0
- package/dist/api/resources/importJobs.js.map +1 -0
- package/dist/api/resources/invites.d.ts +19 -0
- package/dist/api/resources/invites.d.ts.map +1 -0
- package/dist/api/resources/invites.js +78 -0
- package/dist/api/resources/invites.js.map +1 -0
- package/dist/api/resources/mcpTools.d.ts +8 -0
- package/dist/api/resources/mcpTools.d.ts.map +1 -0
- package/dist/api/resources/mcpTools.js +23 -0
- package/dist/api/resources/mcpTools.js.map +1 -0
- package/dist/api/resources/members.d.ts +40 -0
- package/dist/api/resources/members.d.ts.map +1 -0
- package/dist/api/resources/members.js +67 -0
- package/dist/api/resources/members.js.map +1 -0
- package/dist/api/resources/moduleSettings.d.ts +14 -0
- package/dist/api/resources/moduleSettings.d.ts.map +1 -0
- package/dist/api/resources/moduleSettings.js +43 -0
- package/dist/api/resources/moduleSettings.js.map +1 -0
- package/dist/api/resources/mutation.d.ts +18 -0
- package/dist/api/resources/mutation.d.ts.map +1 -0
- package/dist/api/resources/mutation.js +12 -0
- package/dist/api/resources/mutation.js.map +1 -0
- package/dist/api/resources/notes.d.ts +14 -0
- package/dist/api/resources/notes.d.ts.map +1 -0
- package/dist/api/resources/notes.js +39 -0
- package/dist/api/resources/notes.js.map +1 -0
- package/dist/api/resources/opportunities.d.ts +29 -0
- package/dist/api/resources/opportunities.d.ts.map +1 -0
- package/dist/api/resources/opportunities.js +38 -0
- package/dist/api/resources/opportunities.js.map +1 -0
- package/dist/api/resources/partnerships.d.ts +33 -0
- package/dist/api/resources/partnerships.d.ts.map +1 -0
- package/dist/api/resources/partnerships.js +39 -0
- package/dist/api/resources/partnerships.js.map +1 -0
- package/dist/api/resources/people.d.ts +22 -0
- package/dist/api/resources/people.d.ts.map +1 -0
- package/dist/api/resources/people.js +36 -0
- package/dist/api/resources/people.js.map +1 -0
- package/dist/api/resources/pipelineStages.d.ts +22 -0
- package/dist/api/resources/pipelineStages.d.ts.map +1 -0
- package/dist/api/resources/pipelineStages.js +61 -0
- package/dist/api/resources/pipelineStages.js.map +1 -0
- package/dist/api/resources/planItems.d.ts +31 -0
- package/dist/api/resources/planItems.d.ts.map +1 -0
- package/dist/api/resources/planItems.js +60 -0
- package/dist/api/resources/planItems.js.map +1 -0
- package/dist/api/resources/positions.d.ts +23 -0
- package/dist/api/resources/positions.d.ts.map +1 -0
- package/dist/api/resources/positions.js +31 -0
- package/dist/api/resources/positions.js.map +1 -0
- package/dist/api/resources/raises.d.ts +30 -0
- package/dist/api/resources/raises.d.ts.map +1 -0
- package/dist/api/resources/raises.js +38 -0
- package/dist/api/resources/raises.js.map +1 -0
- package/dist/api/resources/roles.d.ts +20 -0
- package/dist/api/resources/roles.d.ts.map +1 -0
- package/dist/api/resources/roles.js +31 -0
- package/dist/api/resources/roles.js.map +1 -0
- package/dist/api/resources/search.d.ts +12 -0
- package/dist/api/resources/search.d.ts.map +1 -0
- package/dist/api/resources/search.js +37 -0
- package/dist/api/resources/search.js.map +1 -0
- package/dist/api/resources/session.d.ts +58 -0
- package/dist/api/resources/session.d.ts.map +1 -0
- package/dist/api/resources/session.js +157 -0
- package/dist/api/resources/session.js.map +1 -0
- package/dist/api/resources/webhooks.d.ts +45 -0
- package/dist/api/resources/webhooks.d.ts.map +1 -0
- package/dist/api/resources/webhooks.js +106 -0
- package/dist/api/resources/webhooks.js.map +1 -0
- package/dist/api/resources/workspace.d.ts +20 -0
- package/dist/api/resources/workspace.d.ts.map +1 -0
- package/dist/api/resources/workspace.js +63 -0
- package/dist/api/resources/workspace.js.map +1 -0
- package/dist/app/KelpieApp.d.ts +18 -0
- package/dist/app/KelpieApp.d.ts.map +1 -0
- package/dist/app/KelpieApp.js +59 -0
- package/dist/app/KelpieApp.js.map +1 -0
- package/dist/app/SessionGate.d.ts +14 -0
- package/dist/app/SessionGate.d.ts.map +1 -0
- package/dist/app/SessionGate.js +33 -0
- package/dist/app/SessionGate.js.map +1 -0
- package/dist/components/ActivitiesPanel.d.ts +28 -0
- package/dist/components/ActivitiesPanel.d.ts.map +1 -0
- package/dist/components/ActivitiesPanel.js +75 -0
- package/dist/components/ActivitiesPanel.js.map +1 -0
- package/dist/components/AgentTasks.d.ts +16 -0
- package/dist/components/AgentTasks.d.ts.map +1 -0
- package/dist/components/AgentTasks.js +166 -0
- package/dist/components/AgentTasks.js.map +1 -0
- package/dist/components/Chip.d.ts +10 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +21 -0
- package/dist/components/Chip.js.map +1 -0
- package/dist/components/CopyButton.d.ts +7 -0
- package/dist/components/CopyButton.d.ts.map +1 -0
- package/dist/components/CopyButton.js +30 -0
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/components/DataTable.d.ts +36 -0
- package/dist/components/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable.js +43 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/DecisionsPanel.d.ts +14 -0
- package/dist/components/DecisionsPanel.d.ts.map +1 -0
- package/dist/components/DecisionsPanel.js +73 -0
- package/dist/components/DecisionsPanel.js.map +1 -0
- package/dist/components/DeleteRecord.d.ts +19 -0
- package/dist/components/DeleteRecord.d.ts.map +1 -0
- package/dist/components/DeleteRecord.js +22 -0
- package/dist/components/DeleteRecord.js.map +1 -0
- package/dist/components/EntitySearch.d.ts +33 -0
- package/dist/components/EntitySearch.d.ts.map +1 -0
- package/dist/components/EntitySearch.js +111 -0
- package/dist/components/EntitySearch.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +21 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +26 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/InlineEdit.d.ts +37 -0
- package/dist/components/InlineEdit.d.ts.map +1 -0
- package/dist/components/InlineEdit.js +77 -0
- package/dist/components/InlineEdit.js.map +1 -0
- package/dist/components/KanbanBoard.d.ts +24 -0
- package/dist/components/KanbanBoard.d.ts.map +1 -0
- package/dist/components/KanbanBoard.js +92 -0
- package/dist/components/KanbanBoard.js.map +1 -0
- package/dist/components/MarkdownView.d.ts +4 -0
- package/dist/components/MarkdownView.d.ts.map +1 -0
- package/dist/components/MarkdownView.js +45 -0
- package/dist/components/MarkdownView.js.map +1 -0
- package/dist/components/NotesPanel.d.ts +17 -0
- package/dist/components/NotesPanel.d.ts.map +1 -0
- package/dist/components/NotesPanel.js +53 -0
- package/dist/components/NotesPanel.js.map +1 -0
- package/dist/components/PageHeader.d.ts +20 -0
- package/dist/components/PageHeader.d.ts.map +1 -0
- package/dist/components/PageHeader.js +15 -0
- package/dist/components/PageHeader.js.map +1 -0
- package/dist/components/PhonesField.d.ts +7 -0
- package/dist/components/PhonesField.d.ts.map +1 -0
- package/dist/components/PhonesField.js +92 -0
- package/dist/components/PhonesField.js.map +1 -0
- package/dist/components/PlanAttention.d.ts +40 -0
- package/dist/components/PlanAttention.d.ts.map +1 -0
- package/dist/components/PlanAttention.js +86 -0
- package/dist/components/PlanAttention.js.map +1 -0
- package/dist/components/PlanPanel.d.ts +18 -0
- package/dist/components/PlanPanel.d.ts.map +1 -0
- package/dist/components/PlanPanel.js +102 -0
- package/dist/components/PlanPanel.js.map +1 -0
- package/dist/components/QueryState.d.ts +24 -0
- package/dist/components/QueryState.d.ts.map +1 -0
- package/dist/components/QueryState.js +34 -0
- package/dist/components/QueryState.js.map +1 -0
- package/dist/components/RecordTabs.d.ts +16 -0
- package/dist/components/RecordTabs.d.ts.map +1 -0
- package/dist/components/RecordTabs.js +15 -0
- package/dist/components/RecordTabs.js.map +1 -0
- package/dist/components/SectionHeader.d.ts +15 -0
- package/dist/components/SectionHeader.d.ts.map +1 -0
- package/dist/components/SectionHeader.js +14 -0
- package/dist/components/SectionHeader.js.map +1 -0
- package/dist/components/SegmentedControl.d.ts +13 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl.js +14 -0
- package/dist/components/SegmentedControl.js.map +1 -0
- package/dist/components/Shell.d.ts +2 -0
- package/dist/components/Shell.d.ts.map +1 -0
- package/dist/components/Shell.js +143 -0
- package/dist/components/Shell.js.map +1 -0
- package/dist/components/SidebarField.d.ts +8 -0
- package/dist/components/SidebarField.d.ts.map +1 -0
- package/dist/components/SidebarField.js +6 -0
- package/dist/components/SidebarField.js.map +1 -0
- package/dist/components/SocialProfilesField.d.ts +8 -0
- package/dist/components/SocialProfilesField.d.ts.map +1 -0
- package/dist/components/SocialProfilesField.js +176 -0
- package/dist/components/SocialProfilesField.js.map +1 -0
- package/dist/components/StageSettings.d.ts +16 -0
- package/dist/components/StageSettings.d.ts.map +1 -0
- package/dist/components/StageSettings.js +107 -0
- package/dist/components/StageSettings.js.map +1 -0
- package/dist/components/SummaryBlock.d.ts +12 -0
- package/dist/components/SummaryBlock.d.ts.map +1 -0
- package/dist/components/SummaryBlock.js +12 -0
- package/dist/components/SummaryBlock.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/dates.d.ts +26 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +71 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/money.d.ts +7 -0
- package/dist/lib/money.d.ts.map +1 -0
- package/dist/lib/money.js +13 -0
- package/dist/lib/money.js.map +1 -0
- package/dist/lib/names.d.ts +9 -0
- package/dist/lib/names.d.ts.map +1 -0
- package/dist/lib/names.js +13 -0
- package/dist/lib/names.js.map +1 -0
- package/dist/lib/plan.d.ts +67 -0
- package/dist/lib/plan.d.ts.map +1 -0
- package/dist/lib/plan.js +96 -0
- package/dist/lib/plan.js.map +1 -0
- package/dist/lib/theme.d.ts +19 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +30 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/pages/CompaniesPage.d.ts +2 -0
- package/dist/pages/CompaniesPage.d.ts.map +1 -0
- package/dist/pages/CompaniesPage.js +77 -0
- package/dist/pages/CompaniesPage.js.map +1 -0
- package/dist/pages/CompanyDetail.d.ts +2 -0
- package/dist/pages/CompanyDetail.d.ts.map +1 -0
- package/dist/pages/CompanyDetail.js +177 -0
- package/dist/pages/CompanyDetail.js.map +1 -0
- package/dist/pages/DealDetail.d.ts +2 -0
- package/dist/pages/DealDetail.d.ts.map +1 -0
- package/dist/pages/DealDetail.js +192 -0
- package/dist/pages/DealDetail.js.map +1 -0
- package/dist/pages/DealStageSettingsPage.d.ts +7 -0
- package/dist/pages/DealStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/DealStageSettingsPage.js +38 -0
- package/dist/pages/DealStageSettingsPage.js.map +1 -0
- package/dist/pages/DealsPage.d.ts +2 -0
- package/dist/pages/DealsPage.d.ts.map +1 -0
- package/dist/pages/DealsPage.js +177 -0
- package/dist/pages/DealsPage.js.map +1 -0
- package/dist/pages/DecisionsPage.d.ts +2 -0
- package/dist/pages/DecisionsPage.d.ts.map +1 -0
- package/dist/pages/DecisionsPage.js +121 -0
- package/dist/pages/DecisionsPage.js.map +1 -0
- package/dist/pages/FormDetail.d.ts +2 -0
- package/dist/pages/FormDetail.d.ts.map +1 -0
- package/dist/pages/FormDetail.js +56 -0
- package/dist/pages/FormDetail.js.map +1 -0
- package/dist/pages/FormsPage.d.ts +2 -0
- package/dist/pages/FormsPage.d.ts.map +1 -0
- package/dist/pages/FormsPage.js +67 -0
- package/dist/pages/FormsPage.js.map +1 -0
- package/dist/pages/FundraisingPage.d.ts +2 -0
- package/dist/pages/FundraisingPage.d.ts.map +1 -0
- package/dist/pages/FundraisingPage.js +187 -0
- package/dist/pages/FundraisingPage.js.map +1 -0
- package/dist/pages/HiringPage.d.ts +9 -0
- package/dist/pages/HiringPage.d.ts.map +1 -0
- package/dist/pages/HiringPage.js +73 -0
- package/dist/pages/HiringPage.js.map +1 -0
- package/dist/pages/NotFoundPage.d.ts +10 -0
- package/dist/pages/NotFoundPage.d.ts.map +1 -0
- package/dist/pages/NotFoundPage.js +14 -0
- package/dist/pages/NotFoundPage.js.map +1 -0
- package/dist/pages/OpportunitiesPage.d.ts +2 -0
- package/dist/pages/OpportunitiesPage.d.ts.map +1 -0
- package/dist/pages/OpportunitiesPage.js +184 -0
- package/dist/pages/OpportunitiesPage.js.map +1 -0
- package/dist/pages/OpportunityDetail.d.ts +2 -0
- package/dist/pages/OpportunityDetail.d.ts.map +1 -0
- package/dist/pages/OpportunityDetail.js +132 -0
- package/dist/pages/OpportunityDetail.js.map +1 -0
- package/dist/pages/OpportunityStageSettingsPage.d.ts +3 -0
- package/dist/pages/OpportunityStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/OpportunityStageSettingsPage.js +34 -0
- package/dist/pages/OpportunityStageSettingsPage.js.map +1 -0
- package/dist/pages/PartnershipDetail.d.ts +2 -0
- package/dist/pages/PartnershipDetail.d.ts.map +1 -0
- package/dist/pages/PartnershipDetail.js +179 -0
- package/dist/pages/PartnershipDetail.js.map +1 -0
- package/dist/pages/PartnershipStageSettingsPage.d.ts +3 -0
- package/dist/pages/PartnershipStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/PartnershipStageSettingsPage.js +34 -0
- package/dist/pages/PartnershipStageSettingsPage.js.map +1 -0
- package/dist/pages/PartnershipsPage.d.ts +2 -0
- package/dist/pages/PartnershipsPage.d.ts.map +1 -0
- package/dist/pages/PartnershipsPage.js +182 -0
- package/dist/pages/PartnershipsPage.js.map +1 -0
- package/dist/pages/PeoplePage.d.ts +10 -0
- package/dist/pages/PeoplePage.d.ts.map +1 -0
- package/dist/pages/PeoplePage.js +71 -0
- package/dist/pages/PeoplePage.js.map +1 -0
- package/dist/pages/PersonDetail.d.ts +2 -0
- package/dist/pages/PersonDetail.d.ts.map +1 -0
- package/dist/pages/PersonDetail.js +193 -0
- package/dist/pages/PersonDetail.js.map +1 -0
- package/dist/pages/PlanningPage.d.ts +2 -0
- package/dist/pages/PlanningPage.d.ts.map +1 -0
- package/dist/pages/PlanningPage.js +112 -0
- package/dist/pages/PlanningPage.js.map +1 -0
- package/dist/pages/RaiseDetail.d.ts +2 -0
- package/dist/pages/RaiseDetail.d.ts.map +1 -0
- package/dist/pages/RaiseDetail.js +198 -0
- package/dist/pages/RaiseDetail.js.map +1 -0
- package/dist/pages/RaiseStageSettingsPage.d.ts +3 -0
- package/dist/pages/RaiseStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/RaiseStageSettingsPage.js +34 -0
- package/dist/pages/RaiseStageSettingsPage.js.map +1 -0
- package/dist/pages/RoleDetail.d.ts +2 -0
- package/dist/pages/RoleDetail.d.ts.map +1 -0
- package/dist/pages/RoleDetail.js +177 -0
- package/dist/pages/RoleDetail.js.map +1 -0
- package/dist/pages/SearchPage.d.ts +2 -0
- package/dist/pages/SearchPage.d.ts.map +1 -0
- package/dist/pages/SearchPage.js +51 -0
- package/dist/pages/SearchPage.js.map +1 -0
- package/dist/pages/account/AccountLayout.d.ts +2 -0
- package/dist/pages/account/AccountLayout.d.ts.map +1 -0
- package/dist/pages/account/AccountLayout.js +25 -0
- package/dist/pages/account/AccountLayout.js.map +1 -0
- package/dist/pages/account/Field.d.ts +8 -0
- package/dist/pages/account/Field.d.ts.map +1 -0
- package/dist/pages/account/Field.js +6 -0
- package/dist/pages/account/Field.js.map +1 -0
- package/dist/pages/account/PreferencesPage.d.ts +2 -0
- package/dist/pages/account/PreferencesPage.d.ts.map +1 -0
- package/dist/pages/account/PreferencesPage.js +92 -0
- package/dist/pages/account/PreferencesPage.js.map +1 -0
- package/dist/pages/account/ProfilePage.d.ts +14 -0
- package/dist/pages/account/ProfilePage.d.ts.map +1 -0
- package/dist/pages/account/ProfilePage.js +71 -0
- package/dist/pages/account/ProfilePage.js.map +1 -0
- package/dist/pages/account/SecurityPage.d.ts +11 -0
- package/dist/pages/account/SecurityPage.d.ts.map +1 -0
- package/dist/pages/account/SecurityPage.js +78 -0
- package/dist/pages/account/SecurityPage.js.map +1 -0
- package/dist/pages/admin/DataPage.d.ts +3 -0
- package/dist/pages/admin/DataPage.d.ts.map +1 -0
- package/dist/pages/admin/DataPage.js +210 -0
- package/dist/pages/admin/DataPage.js.map +1 -0
- package/dist/pages/admin/McpPage.d.ts +2 -0
- package/dist/pages/admin/McpPage.d.ts.map +1 -0
- package/dist/pages/admin/McpPage.js +128 -0
- package/dist/pages/admin/McpPage.js.map +1 -0
- package/dist/pages/admin/ModulesPage.d.ts +2 -0
- package/dist/pages/admin/ModulesPage.d.ts.map +1 -0
- package/dist/pages/admin/ModulesPage.js +53 -0
- package/dist/pages/admin/ModulesPage.js.map +1 -0
- package/dist/pages/admin/TeamPage.d.ts +2 -0
- package/dist/pages/admin/TeamPage.d.ts.map +1 -0
- package/dist/pages/admin/TeamPage.js +99 -0
- package/dist/pages/admin/TeamPage.js.map +1 -0
- package/dist/pages/admin/WebhookDeliveries.d.ts +4 -0
- package/dist/pages/admin/WebhookDeliveries.d.ts.map +1 -0
- package/dist/pages/admin/WebhookDeliveries.js +88 -0
- package/dist/pages/admin/WebhookDeliveries.js.map +1 -0
- package/dist/pages/admin/WebhooksPage.d.ts +2 -0
- package/dist/pages/admin/WebhooksPage.d.ts.map +1 -0
- package/dist/pages/admin/WebhooksPage.js +152 -0
- package/dist/pages/admin/WebhooksPage.js.map +1 -0
- package/dist/pages/admin/WorkspaceSettingsPage.d.ts +2 -0
- package/dist/pages/admin/WorkspaceSettingsPage.d.ts.map +1 -0
- package/dist/pages/admin/WorkspaceSettingsPage.js +117 -0
- package/dist/pages/admin/WorkspaceSettingsPage.js.map +1 -0
- package/dist/pages/auth/AuthForm.d.ts +46 -0
- package/dist/pages/auth/AuthForm.d.ts.map +1 -0
- package/dist/pages/auth/AuthForm.js +32 -0
- package/dist/pages/auth/AuthForm.js.map +1 -0
- package/dist/pages/auth/AuthLayout.d.ts +24 -0
- package/dist/pages/auth/AuthLayout.d.ts.map +1 -0
- package/dist/pages/auth/AuthLayout.js +19 -0
- package/dist/pages/auth/AuthLayout.js.map +1 -0
- package/dist/pages/auth/ForgotPasswordPage.d.ts +13 -0
- package/dist/pages/auth/ForgotPasswordPage.d.ts.map +1 -0
- package/dist/pages/auth/ForgotPasswordPage.js +39 -0
- package/dist/pages/auth/ForgotPasswordPage.js.map +1 -0
- package/dist/pages/auth/JoinPage.d.ts +12 -0
- package/dist/pages/auth/JoinPage.d.ts.map +1 -0
- package/dist/pages/auth/JoinPage.js +43 -0
- package/dist/pages/auth/JoinPage.js.map +1 -0
- package/dist/pages/auth/ResetPasswordPage.d.ts +13 -0
- package/dist/pages/auth/ResetPasswordPage.d.ts.map +1 -0
- package/dist/pages/auth/ResetPasswordPage.js +58 -0
- package/dist/pages/auth/ResetPasswordPage.js.map +1 -0
- package/dist/pages/auth/SignInPage.d.ts +2 -0
- package/dist/pages/auth/SignInPage.d.ts.map +1 -0
- package/dist/pages/auth/SignInPage.js +38 -0
- package/dist/pages/auth/SignInPage.js.map +1 -0
- package/dist/pages/auth/SignUpPage.d.ts +13 -0
- package/dist/pages/auth/SignUpPage.d.ts.map +1 -0
- package/dist/pages/auth/SignUpPage.js +43 -0
- package/dist/pages/auth/SignUpPage.js.map +1 -0
- package/dist/pages/candidateFields.d.ts +22 -0
- package/dist/pages/candidateFields.d.ts.map +1 -0
- package/dist/pages/candidateFields.js +82 -0
- package/dist/pages/candidateFields.js.map +1 -0
- package/dist/pages/dashboard/DashboardPage.d.ts +2 -0
- package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardPage.js +40 -0
- package/dist/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/pages/dashboard/attention.d.ts +41 -0
- package/dist/pages/dashboard/attention.d.ts.map +1 -0
- package/dist/pages/dashboard/attention.js +146 -0
- package/dist/pages/dashboard/attention.js.map +1 -0
- package/dist/pages/dashboard/sections.d.ts +20 -0
- package/dist/pages/dashboard/sections.d.ts.map +1 -0
- package/dist/pages/dashboard/sections.js +60 -0
- package/dist/pages/dashboard/sections.js.map +1 -0
- package/dist/pages/fields.d.ts +11 -0
- package/dist/pages/fields.d.ts.map +1 -0
- package/dist/pages/fields.js +17 -0
- package/dist/pages/fields.js.map +1 -0
- package/dist/pages/forms/EmbedPanel.d.ts +14 -0
- package/dist/pages/forms/EmbedPanel.d.ts.map +1 -0
- package/dist/pages/forms/EmbedPanel.js +19 -0
- package/dist/pages/forms/EmbedPanel.js.map +1 -0
- package/dist/pages/forms/FieldsEditor.d.ts +6 -0
- package/dist/pages/forms/FieldsEditor.d.ts.map +1 -0
- package/dist/pages/forms/FieldsEditor.js +115 -0
- package/dist/pages/forms/FieldsEditor.js.map +1 -0
- package/dist/pages/forms/FormSettings.d.ts +6 -0
- package/dist/pages/forms/FormSettings.d.ts.map +1 -0
- package/dist/pages/forms/FormSettings.js +47 -0
- package/dist/pages/forms/FormSettings.js.map +1 -0
- package/dist/pages/forms/SubmissionsTable.d.ts +8 -0
- package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -0
- package/dist/pages/forms/SubmissionsTable.js +91 -0
- package/dist/pages/forms/SubmissionsTable.js.map +1 -0
- package/dist/pages/forms/fieldList.d.ts +70 -0
- package/dist/pages/forms/fieldList.d.ts.map +1 -0
- package/dist/pages/forms/fieldList.js +126 -0
- package/dist/pages/forms/fieldList.js.map +1 -0
- package/dist/pages/forms/template.d.ts +18 -0
- package/dist/pages/forms/template.d.ts.map +1 -0
- package/dist/pages/forms/template.js +34 -0
- package/dist/pages/forms/template.js.map +1 -0
- package/dist/pages/handbook/HandbookPage.d.ts +2 -0
- package/dist/pages/handbook/HandbookPage.d.ts.map +1 -0
- package/dist/pages/handbook/HandbookPage.js +197 -0
- package/dist/pages/handbook/HandbookPage.js.map +1 -0
- package/dist/pages/handbook/tree.d.ts +62 -0
- package/dist/pages/handbook/tree.d.ts.map +1 -0
- package/dist/pages/handbook/tree.js +222 -0
- package/dist/pages/handbook/tree.js.map +1 -0
- package/dist/pages/hiringDirectory.d.ts +60 -0
- package/dist/pages/hiringDirectory.d.ts.map +1 -0
- package/dist/pages/hiringDirectory.js +81 -0
- package/dist/pages/hiringDirectory.js.map +1 -0
- package/dist/pages/onboarding/HandbookStepPage.d.ts +14 -0
- package/dist/pages/onboarding/HandbookStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/HandbookStepPage.js +29 -0
- package/dist/pages/onboarding/HandbookStepPage.js.map +1 -0
- package/dist/pages/onboarding/InvitesStepPage.d.ts +2 -0
- package/dist/pages/onboarding/InvitesStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/InvitesStepPage.js +77 -0
- package/dist/pages/onboarding/InvitesStepPage.js.map +1 -0
- package/dist/pages/onboarding/WorkspaceStepPage.d.ts +2 -0
- package/dist/pages/onboarding/WorkspaceStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/WorkspaceStepPage.js +72 -0
- package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -0
- package/dist/pages/positionDirectory.d.ts +20 -0
- package/dist/pages/positionDirectory.d.ts.map +1 -0
- package/dist/pages/positionDirectory.js +58 -0
- package/dist/pages/positionDirectory.js.map +1 -0
- package/dist/registry/UiExtensionProvider.d.ts +12 -0
- package/dist/registry/UiExtensionProvider.d.ts.map +1 -0
- package/dist/registry/UiExtensionProvider.js +10 -0
- package/dist/registry/UiExtensionProvider.js.map +1 -0
- package/dist/registry/context.d.ts +31 -0
- package/dist/registry/context.d.ts.map +1 -0
- package/dist/registry/context.js +45 -0
- package/dist/registry/context.js.map +1 -0
- package/dist/registry/contributions.d.ts +71 -0
- package/dist/registry/contributions.d.ts.map +1 -0
- package/dist/registry/contributions.js +25 -0
- package/dist/registry/contributions.js.map +1 -0
- package/dist/registry/overridable.d.ts +27 -0
- package/dist/registry/overridable.d.ts.map +1 -0
- package/dist/registry/overridable.js +29 -0
- package/dist/registry/overridable.js.map +1 -0
- package/dist/registry/registry.d.ts +68 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +112 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/testing/inputs.d.ts +13 -0
- package/dist/testing/inputs.d.ts.map +1 -0
- package/dist/testing/inputs.js +16 -0
- package/dist/testing/inputs.js.map +1 -0
- package/dist/testing/stubClient.d.ts +42 -0
- package/dist/testing/stubClient.d.ts.map +1 -0
- package/dist/testing/stubClient.js +29 -0
- package/dist/testing/stubClient.js.map +1 -0
- package/package.json +73 -0
- package/src/ServiceStatus.tsx +61 -0
- package/src/api/ApiProvider.tsx +40 -0
- package/src/api/client.ts +267 -0
- package/src/api/context.ts +25 -0
- package/src/api/errors.ts +14 -0
- package/src/api/health.ts +38 -0
- package/src/api/json.ts +4 -0
- package/src/api/queryClient.ts +35 -0
- package/src/api/resource.ts +412 -0
- package/src/api/resources/account.ts +220 -0
- package/src/api/resources/activities.ts +31 -0
- package/src/api/resources/agentTasks.ts +172 -0
- package/src/api/resources/candidates.ts +69 -0
- package/src/api/resources/companies.ts +72 -0
- package/src/api/resources/dashboard.ts +39 -0
- package/src/api/resources/deals.ts +82 -0
- package/src/api/resources/decisions.ts +60 -0
- package/src/api/resources/forms.ts +218 -0
- package/src/api/resources/handbookPages.ts +77 -0
- package/src/api/resources/importJobs.ts +229 -0
- package/src/api/resources/invites.ts +112 -0
- package/src/api/resources/mcpTools.ts +28 -0
- package/src/api/resources/members.ts +105 -0
- package/src/api/resources/moduleSettings.ts +67 -0
- package/src/api/resources/mutation.ts +31 -0
- package/src/api/resources/notes.ts +62 -0
- package/src/api/resources/opportunities.ts +84 -0
- package/src/api/resources/partnerships.ts +89 -0
- package/src/api/resources/people.ts +72 -0
- package/src/api/resources/pipelineStages.ts +93 -0
- package/src/api/resources/planItems.ts +103 -0
- package/src/api/resources/positions.ts +70 -0
- package/src/api/resources/raises.ts +82 -0
- package/src/api/resources/roles.ts +65 -0
- package/src/api/resources/search.ts +49 -0
- package/src/api/resources/session.ts +220 -0
- package/src/api/resources/webhooks.ts +157 -0
- package/src/api/resources/workspace.ts +81 -0
- package/src/app/KelpieApp.tsx +162 -0
- package/src/app/SessionGate.tsx +42 -0
- package/src/components/ActivitiesPanel.tsx +235 -0
- package/src/components/AgentTasks.tsx +473 -0
- package/src/components/Chip.tsx +36 -0
- package/src/components/CopyButton.tsx +48 -0
- package/src/components/DataTable.tsx +209 -0
- package/src/components/DecisionsPanel.tsx +233 -0
- package/src/components/DeleteRecord.tsx +73 -0
- package/src/components/EntitySearch.tsx +268 -0
- package/src/components/ErrorBoundary.tsx +58 -0
- package/src/components/InlineEdit.tsx +179 -0
- package/src/components/KanbanBoard.tsx +234 -0
- package/src/components/MarkdownView.tsx +73 -0
- package/src/components/NotesPanel.tsx +169 -0
- package/src/components/PageHeader.tsx +61 -0
- package/src/components/PhonesField.tsx +204 -0
- package/src/components/PlanAttention.tsx +249 -0
- package/src/components/PlanPanel.tsx +317 -0
- package/src/components/QueryState.tsx +83 -0
- package/src/components/RecordTabs.tsx +69 -0
- package/src/components/SectionHeader.tsx +63 -0
- package/src/components/SegmentedControl.tsx +48 -0
- package/src/components/Shell.tsx +300 -0
- package/src/components/SidebarField.tsx +18 -0
- package/src/components/SocialProfilesField.tsx +356 -0
- package/src/components/StageSettings.tsx +319 -0
- package/src/components/SummaryBlock.tsx +27 -0
- package/src/index.ts +190 -0
- package/src/lib/dates.ts +90 -0
- package/src/lib/money.ts +12 -0
- package/src/lib/names.ts +13 -0
- package/src/lib/plan.ts +147 -0
- package/src/lib/theme.ts +53 -0
- package/src/pages/CompaniesPage.tsx +143 -0
- package/src/pages/CompanyDetail.tsx +502 -0
- package/src/pages/DealDetail.tsx +512 -0
- package/src/pages/DealStageSettingsPage.tsx +67 -0
- package/src/pages/DealsPage.tsx +342 -0
- package/src/pages/DecisionsPage.tsx +211 -0
- package/src/pages/FormDetail.tsx +130 -0
- package/src/pages/FormsPage.tsx +151 -0
- package/src/pages/FundraisingPage.tsx +354 -0
- package/src/pages/HiringPage.tsx +169 -0
- package/src/pages/NotFoundPage.tsx +27 -0
- package/src/pages/OpportunitiesPage.tsx +349 -0
- package/src/pages/OpportunityDetail.tsx +337 -0
- package/src/pages/OpportunityStageSettingsPage.tsx +63 -0
- package/src/pages/PartnershipDetail.tsx +490 -0
- package/src/pages/PartnershipStageSettingsPage.tsx +63 -0
- package/src/pages/PartnershipsPage.tsx +353 -0
- package/src/pages/PeoplePage.tsx +145 -0
- package/src/pages/PersonDetail.tsx +526 -0
- package/src/pages/PlanningPage.tsx +318 -0
- package/src/pages/RaiseDetail.tsx +498 -0
- package/src/pages/RaiseStageSettingsPage.tsx +63 -0
- package/src/pages/RoleDetail.tsx +455 -0
- package/src/pages/SearchPage.tsx +135 -0
- package/src/pages/account/AccountLayout.tsx +38 -0
- package/src/pages/account/Field.tsx +20 -0
- package/src/pages/account/PreferencesPage.tsx +224 -0
- package/src/pages/account/ProfilePage.tsx +147 -0
- package/src/pages/account/SecurityPage.tsx +237 -0
- package/src/pages/admin/DataPage.tsx +772 -0
- package/src/pages/admin/McpPage.tsx +404 -0
- package/src/pages/admin/ModulesPage.tsx +113 -0
- package/src/pages/admin/TeamPage.tsx +386 -0
- package/src/pages/admin/WebhookDeliveries.tsx +184 -0
- package/src/pages/admin/WebhooksPage.tsx +443 -0
- package/src/pages/admin/WorkspaceSettingsPage.tsx +274 -0
- package/src/pages/auth/AuthForm.tsx +118 -0
- package/src/pages/auth/AuthLayout.tsx +74 -0
- package/src/pages/auth/ForgotPasswordPage.tsx +80 -0
- package/src/pages/auth/JoinPage.tsx +85 -0
- package/src/pages/auth/ResetPasswordPage.tsx +124 -0
- package/src/pages/auth/SignInPage.tsx +83 -0
- package/src/pages/auth/SignUpPage.tsx +93 -0
- package/src/pages/candidateFields.tsx +175 -0
- package/src/pages/dashboard/DashboardPage.tsx +108 -0
- package/src/pages/dashboard/attention.ts +206 -0
- package/src/pages/dashboard/sections.tsx +269 -0
- package/src/pages/fields.ts +21 -0
- package/src/pages/forms/EmbedPanel.tsx +95 -0
- package/src/pages/forms/FieldsEditor.tsx +412 -0
- package/src/pages/forms/FormSettings.tsx +159 -0
- package/src/pages/forms/SubmissionsTable.tsx +171 -0
- package/src/pages/forms/fieldList.ts +209 -0
- package/src/pages/forms/template.ts +37 -0
- package/src/pages/handbook/HandbookPage.tsx +500 -0
- package/src/pages/handbook/tree.ts +327 -0
- package/src/pages/hiringDirectory.ts +146 -0
- package/src/pages/onboarding/HandbookStepPage.tsx +75 -0
- package/src/pages/onboarding/InvitesStepPage.tsx +180 -0
- package/src/pages/onboarding/WorkspaceStepPage.tsx +122 -0
- package/src/pages/positionDirectory.ts +98 -0
- package/src/registry/UiExtensionProvider.tsx +20 -0
- package/src/registry/context.ts +67 -0
- package/src/registry/contributions.ts +89 -0
- package/src/registry/overridable.ts +62 -0
- package/src/registry/registry.ts +204 -0
- package/src/styles.css +175 -0
- package/src/testing/inputs.ts +18 -0
- package/src/testing/stubClient.ts +78 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { AGENT_RUN_STATUS_LABELS } from '@kelpie/schemas'
|
|
2
|
+
import type { AgentRun, McpTool } from '@kelpie/schemas'
|
|
3
|
+
import { useMemo, useState } from 'react'
|
|
4
|
+
import { Link } from 'react-router'
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
useAgentRuns,
|
|
8
|
+
useAgents,
|
|
9
|
+
useAllAgentTasks,
|
|
10
|
+
useCreateAgent,
|
|
11
|
+
useDeleteAgent,
|
|
12
|
+
} from '../../api/resources/agentTasks.ts'
|
|
13
|
+
import { useMcpTools } from '../../api/resources/mcpTools.ts'
|
|
14
|
+
import { PageHeader } from '../../components/PageHeader.tsx'
|
|
15
|
+
import { ErrorPanel, LoadingPanel } from '../../components/QueryState.tsx'
|
|
16
|
+
import { CopyButton } from '../../components/CopyButton.tsx'
|
|
17
|
+
import { formatRelativeTime } from '../../lib/dates.ts'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* How an agent connects to this workspace.
|
|
21
|
+
*
|
|
22
|
+
* Everything on the page is derived rather than written down. The endpoint comes
|
|
23
|
+
* from the origin the browser reached the app on, the same way a form's embed URL
|
|
24
|
+
* does, so it is right for a self-hosted install on any hostname. The tool list
|
|
25
|
+
* comes from `/v1/mcp/tools`, which reads the registry the endpoint itself
|
|
26
|
+
* dispatches against: a module that adds a resource shows up here without anyone
|
|
27
|
+
* editing this file.
|
|
28
|
+
*
|
|
29
|
+
* Registered agents and their run log live here too, under the connection
|
|
30
|
+
* details, where the mockup put them: an agent is something you connect, and
|
|
31
|
+
* this is the connections page.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Matches a tool on its name or its description, so "csv" finds the import and
|
|
36
|
+
* export tools and "pinned" finds the note list that filters on it.
|
|
37
|
+
*/
|
|
38
|
+
function matches(tool: McpTool, term: string): boolean {
|
|
39
|
+
const needle = term.trim().toLowerCase()
|
|
40
|
+
|
|
41
|
+
if (needle.length === 0) {
|
|
42
|
+
return true
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
tool.name.toLowerCase().includes(needle) ||
|
|
47
|
+
tool.description.toLowerCase().includes(needle)
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function McpPage(): React.JSX.Element {
|
|
52
|
+
const endpoint = new URL('/mcp', window.location.origin).toString()
|
|
53
|
+
const config = `{
|
|
54
|
+
"mcpServers": {
|
|
55
|
+
"kelpie": {
|
|
56
|
+
"url": "${endpoint}",
|
|
57
|
+
"headers": {
|
|
58
|
+
"Authorization": "Bearer kp_live_…"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}`
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<div className="animate-slide-in mx-auto max-w-4xl space-y-6">
|
|
66
|
+
<PageHeader title="MCP" description="Connect agents to this workspace over Streamable HTTP." />
|
|
67
|
+
|
|
68
|
+
<section className="rounded-md border border-border p-5">
|
|
69
|
+
<h2 className="text-[15px] font-semibold text-ink">How agents use Kelpie</h2>
|
|
70
|
+
<p className="mt-2 max-w-2xl text-[13px] leading-relaxed text-ink-muted">
|
|
71
|
+
Kelpie is a CRM and a company brain. Every REST operation is also an MCP tool over
|
|
72
|
+
Streamable HTTP, so an agent reads and writes the same records the app does, through the
|
|
73
|
+
same API. Point Claude, Cursor, or any MCP client at this workspace. There is no bundled
|
|
74
|
+
AI: bring your own agent.
|
|
75
|
+
</p>
|
|
76
|
+
<ul className="mt-4 space-y-2 text-[13px] text-ink">
|
|
77
|
+
<li className="flex gap-2">
|
|
78
|
+
<span className="text-accent">→</span>
|
|
79
|
+
An API key is bound to one workspace, so a client sees that workspace and no other.
|
|
80
|
+
</li>
|
|
81
|
+
<li className="flex gap-2">
|
|
82
|
+
<span className="text-accent">→</span>
|
|
83
|
+
A tool refuses exactly what the endpoint behind it refuses, with the same message.
|
|
84
|
+
</li>
|
|
85
|
+
<li className="flex gap-2">
|
|
86
|
+
<span className="text-accent">→</span>
|
|
87
|
+
Signing in with a browser session does not work here. The endpoint takes bearer keys
|
|
88
|
+
only.
|
|
89
|
+
</li>
|
|
90
|
+
</ul>
|
|
91
|
+
</section>
|
|
92
|
+
|
|
93
|
+
<section className="rounded-md border border-border p-5">
|
|
94
|
+
<div className="flex items-center justify-between gap-3">
|
|
95
|
+
<h2 className="text-[13px] font-semibold text-ink">Streamable HTTP endpoint</h2>
|
|
96
|
+
<CopyButton value={endpoint} label="Copy the endpoint URL" />
|
|
97
|
+
</div>
|
|
98
|
+
<code className="mt-3 block rounded-md border border-border bg-surface px-3 py-2.5 font-mono text-[13px] break-all text-ink">
|
|
99
|
+
{endpoint}
|
|
100
|
+
</code>
|
|
101
|
+
</section>
|
|
102
|
+
|
|
103
|
+
<section className="rounded-md border border-border p-5">
|
|
104
|
+
<div className="flex items-center justify-between gap-3">
|
|
105
|
+
<h2 className="text-[13px] font-semibold text-ink">Claude / Cursor config</h2>
|
|
106
|
+
<CopyButton value={config} label="Copy the client config" />
|
|
107
|
+
</div>
|
|
108
|
+
<p className="mt-1 text-[12px] text-ink-muted">
|
|
109
|
+
Paste into your MCP client config, and replace the bearer token with a workspace key from{' '}
|
|
110
|
+
<Link to="/admin/workspace" className="text-accent hover:underline">
|
|
111
|
+
workspace settings
|
|
112
|
+
</Link>
|
|
113
|
+
.
|
|
114
|
+
</p>
|
|
115
|
+
<pre className="bg-code-bg text-code-fg mt-3 overflow-x-auto rounded-md border border-border p-4 font-mono text-[12px] leading-relaxed">
|
|
116
|
+
{config}
|
|
117
|
+
</pre>
|
|
118
|
+
</section>
|
|
119
|
+
|
|
120
|
+
<RegisteredAgents />
|
|
121
|
+
<RecentRuns />
|
|
122
|
+
<ToolCatalog />
|
|
123
|
+
</div>
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Bring-your-own agents that Run dispatches to. Any member reads this list —
|
|
129
|
+
* the Run dialog on every record page is built from it — and the API holds
|
|
130
|
+
* writes to admins, so a member's Add answers `403` and the form shows it.
|
|
131
|
+
*/
|
|
132
|
+
function RegisteredAgents(): React.JSX.Element {
|
|
133
|
+
const { records, isLoading, error } = useAgents()
|
|
134
|
+
const createAgent = useCreateAgent()
|
|
135
|
+
const deleteAgent = useDeleteAgent()
|
|
136
|
+
const [adding, setAdding] = useState(false)
|
|
137
|
+
const [name, setName] = useState('')
|
|
138
|
+
const [endpoint, setEndpoint] = useState('')
|
|
139
|
+
const [authHeader, setAuthHeader] = useState('')
|
|
140
|
+
|
|
141
|
+
function submit(event: React.FormEvent): void {
|
|
142
|
+
event.preventDefault()
|
|
143
|
+
createAgent
|
|
144
|
+
.runAsync({
|
|
145
|
+
name,
|
|
146
|
+
endpoint,
|
|
147
|
+
...(authHeader.trim().length === 0 ? {} : { authHeader }),
|
|
148
|
+
})
|
|
149
|
+
.then(() => {
|
|
150
|
+
setAdding(false)
|
|
151
|
+
setName('')
|
|
152
|
+
setEndpoint('')
|
|
153
|
+
setAuthHeader('')
|
|
154
|
+
})
|
|
155
|
+
.catch(() => {
|
|
156
|
+
// The form stays open and renders `createAgent.error`.
|
|
157
|
+
})
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return (
|
|
161
|
+
<section className="rounded-md border border-border p-5">
|
|
162
|
+
<div className="flex flex-wrap items-center justify-between gap-3">
|
|
163
|
+
<h2 className="text-[13px] font-semibold text-ink">Registered agents</h2>
|
|
164
|
+
<button
|
|
165
|
+
type="button"
|
|
166
|
+
onClick={() => {
|
|
167
|
+
setAdding((open) => !open)
|
|
168
|
+
}}
|
|
169
|
+
className="rounded-md border border-border px-2.5 py-1 text-[12px] font-medium text-ink transition hover:border-accent hover:text-accent"
|
|
170
|
+
>
|
|
171
|
+
{adding ? 'Cancel' : 'Add agent'}
|
|
172
|
+
</button>
|
|
173
|
+
</div>
|
|
174
|
+
<p className="mt-1 max-w-2xl text-[12px] text-ink-muted">
|
|
175
|
+
Run on any record dispatches the resolved task to one of these endpoints as JSON. The agent
|
|
176
|
+
still reads and writes through the API above. The auth header is stored encrypted and never
|
|
177
|
+
shown again.
|
|
178
|
+
</p>
|
|
179
|
+
|
|
180
|
+
{adding && (
|
|
181
|
+
<form onSubmit={submit} className="mt-4 space-y-2 rounded-md border border-border p-3">
|
|
182
|
+
<label className="block text-[12px] text-ink-muted">
|
|
183
|
+
Name
|
|
184
|
+
<input
|
|
185
|
+
value={name}
|
|
186
|
+
onChange={(event) => {
|
|
187
|
+
setName(event.target.value)
|
|
188
|
+
}}
|
|
189
|
+
required
|
|
190
|
+
placeholder="Local Claude"
|
|
191
|
+
className="mt-1 w-full rounded-md border border-border bg-surface px-2.5 py-1.5 text-[12px] text-ink outline-none focus:border-accent"
|
|
192
|
+
/>
|
|
193
|
+
</label>
|
|
194
|
+
<label className="block text-[12px] text-ink-muted">
|
|
195
|
+
Endpoint URL
|
|
196
|
+
<input
|
|
197
|
+
value={endpoint}
|
|
198
|
+
onChange={(event) => {
|
|
199
|
+
setEndpoint(event.target.value)
|
|
200
|
+
}}
|
|
201
|
+
required
|
|
202
|
+
placeholder="https://agents.example.com/kelpie/run"
|
|
203
|
+
className="mt-1 w-full rounded-md border border-border bg-surface px-2.5 py-1.5 font-mono text-[12px] text-ink outline-none focus:border-accent"
|
|
204
|
+
/>
|
|
205
|
+
</label>
|
|
206
|
+
<label className="block text-[12px] text-ink-muted">
|
|
207
|
+
Auth header (optional, sent as Authorization)
|
|
208
|
+
<input
|
|
209
|
+
value={authHeader}
|
|
210
|
+
onChange={(event) => {
|
|
211
|
+
setAuthHeader(event.target.value)
|
|
212
|
+
}}
|
|
213
|
+
placeholder="Bearer …"
|
|
214
|
+
className="mt-1 w-full rounded-md border border-border bg-surface px-2.5 py-1.5 font-mono text-[12px] text-ink outline-none focus:border-accent"
|
|
215
|
+
/>
|
|
216
|
+
</label>
|
|
217
|
+
<div className="flex items-center gap-3">
|
|
218
|
+
<button
|
|
219
|
+
type="submit"
|
|
220
|
+
disabled={createAgent.isPending}
|
|
221
|
+
className="rounded-md bg-accent px-3 py-1.5 text-[12px] font-semibold text-accent-fg hover:bg-accent-hover disabled:opacity-50"
|
|
222
|
+
>
|
|
223
|
+
Register agent
|
|
224
|
+
</button>
|
|
225
|
+
{createAgent.error !== null && (
|
|
226
|
+
<span className="text-[12px] text-danger">{createAgent.error.message}</span>
|
|
227
|
+
)}
|
|
228
|
+
</div>
|
|
229
|
+
</form>
|
|
230
|
+
)}
|
|
231
|
+
|
|
232
|
+
{error !== null && <div className="mt-4">{<ErrorPanel error={error} />}</div>}
|
|
233
|
+
{isLoading && <LoadingPanel label="Loading agents…" />}
|
|
234
|
+
|
|
235
|
+
{!isLoading && error === null && records.length === 0 && (
|
|
236
|
+
<p className="mt-4 text-[12px] text-ink-faint">
|
|
237
|
+
No agents registered. Copy prompt works without one; Run needs somewhere to send the task.
|
|
238
|
+
</p>
|
|
239
|
+
)}
|
|
240
|
+
|
|
241
|
+
{records.length > 0 && (
|
|
242
|
+
<ul className="mt-4 divide-y divide-border rounded-md border border-border">
|
|
243
|
+
{records.map((agent) => (
|
|
244
|
+
<li key={agent.id} className="flex flex-wrap items-center justify-between gap-3 px-3 py-2.5">
|
|
245
|
+
<div className="min-w-0">
|
|
246
|
+
<div className="text-[13px] font-medium text-ink">{agent.name}</div>
|
|
247
|
+
<code className="font-mono text-[11px] break-all text-ink-muted">
|
|
248
|
+
{agent.endpoint}
|
|
249
|
+
</code>
|
|
250
|
+
</div>
|
|
251
|
+
<div className="flex shrink-0 items-center gap-3 text-[11px] text-ink-faint">
|
|
252
|
+
{agent.hasAuthHeader && <span>Auth header set</span>}
|
|
253
|
+
<span>
|
|
254
|
+
{agent.lastRunAt === null
|
|
255
|
+
? 'Never run'
|
|
256
|
+
: `Last run ${formatRelativeTime(agent.lastRunAt)}`}
|
|
257
|
+
</span>
|
|
258
|
+
<button
|
|
259
|
+
type="button"
|
|
260
|
+
onClick={() => {
|
|
261
|
+
deleteAgent.run(agent.id)
|
|
262
|
+
}}
|
|
263
|
+
className="font-medium text-danger hover:underline"
|
|
264
|
+
>
|
|
265
|
+
Remove
|
|
266
|
+
</button>
|
|
267
|
+
</div>
|
|
268
|
+
</li>
|
|
269
|
+
))}
|
|
270
|
+
</ul>
|
|
271
|
+
)}
|
|
272
|
+
{deleteAgent.error !== null && (
|
|
273
|
+
<p className="mt-2 text-[12px] text-danger">{deleteAgent.error.message}</p>
|
|
274
|
+
)}
|
|
275
|
+
</section>
|
|
276
|
+
)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const RUN_LOG_ROWS = 8
|
|
280
|
+
|
|
281
|
+
/** The newest dispatches, labelled from the catalog the tasks came from. */
|
|
282
|
+
function RecentRuns(): React.JSX.Element {
|
|
283
|
+
const { records: runs, isLoading, error } = useAgentRuns()
|
|
284
|
+
const catalog = useAllAgentTasks()
|
|
285
|
+
const agents = useAgents()
|
|
286
|
+
|
|
287
|
+
const taskLabels = useMemo(
|
|
288
|
+
() => new Map(catalog.records.map((task) => [task.id, task.label])),
|
|
289
|
+
[catalog.records],
|
|
290
|
+
)
|
|
291
|
+
const agentNames = useMemo(
|
|
292
|
+
() => new Map(agents.records.map((agent) => [agent.id, agent.name])),
|
|
293
|
+
[agents.records],
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
function describeRun(run: AgentRun): string {
|
|
297
|
+
const agentName = agentNames.get(run.agentId) ?? 'a removed agent'
|
|
298
|
+
|
|
299
|
+
return `${run.targetType}/${run.targetId} → ${agentName}`
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return (
|
|
303
|
+
<section className="rounded-md border border-border p-5">
|
|
304
|
+
<h2 className="text-[13px] font-semibold text-ink">Recent runs</h2>
|
|
305
|
+
<p className="mt-1 text-[12px] text-ink-muted">
|
|
306
|
+
Each run records the dispatch: queued, then succeeded or failed with the reason. What the
|
|
307
|
+
agent did afterwards is on the records themselves.
|
|
308
|
+
</p>
|
|
309
|
+
|
|
310
|
+
{error !== null && <div className="mt-4">{<ErrorPanel error={error} />}</div>}
|
|
311
|
+
{isLoading && <LoadingPanel label="Loading runs…" />}
|
|
312
|
+
|
|
313
|
+
{!isLoading && error === null && runs.length === 0 && (
|
|
314
|
+
<p className="mt-4 text-[12px] text-ink-faint">
|
|
315
|
+
No runs yet. Run an agent task from any record page.
|
|
316
|
+
</p>
|
|
317
|
+
)}
|
|
318
|
+
|
|
319
|
+
{runs.length > 0 && (
|
|
320
|
+
<ul className="mt-4 divide-y divide-border rounded-md border border-border">
|
|
321
|
+
{runs.slice(0, RUN_LOG_ROWS).map((run) => (
|
|
322
|
+
<li key={run.id} className="flex flex-wrap items-center justify-between gap-3 px-3 py-2.5">
|
|
323
|
+
<div className="min-w-0">
|
|
324
|
+
<div className="text-[13px] font-medium text-ink">
|
|
325
|
+
{taskLabels.get(run.taskId) ?? run.taskId}
|
|
326
|
+
</div>
|
|
327
|
+
<div className="text-[11px] text-ink-muted">{describeRun(run)}</div>
|
|
328
|
+
{run.failureReason !== null && (
|
|
329
|
+
<div className="text-[11px] text-danger">{run.failureReason}</div>
|
|
330
|
+
)}
|
|
331
|
+
</div>
|
|
332
|
+
<div className="flex shrink-0 items-center gap-3 text-[11px]">
|
|
333
|
+
<span className={run.status === 'failed' ? 'font-medium text-danger' : 'text-ink-muted'}>
|
|
334
|
+
{AGENT_RUN_STATUS_LABELS[run.status]}
|
|
335
|
+
</span>
|
|
336
|
+
<span className="text-ink-faint">{formatRelativeTime(run.updatedAt)}</span>
|
|
337
|
+
</div>
|
|
338
|
+
</li>
|
|
339
|
+
))}
|
|
340
|
+
</ul>
|
|
341
|
+
)}
|
|
342
|
+
</section>
|
|
343
|
+
)
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* What this deployment actually registered, read from the endpoint's own registry.
|
|
348
|
+
*
|
|
349
|
+
* A flat list rather than a grouped one. Tool names are resource-then-verb, so
|
|
350
|
+
* sorting by name already puts a resource's five together, and every rule for
|
|
351
|
+
* grouping them turned out to be a lexical guess that read `webhooks_rotate_secret`
|
|
352
|
+
* as a resource called `webhooks_rotate`.
|
|
353
|
+
*/
|
|
354
|
+
function ToolCatalog(): React.JSX.Element {
|
|
355
|
+
const { records, isLoading, error } = useMcpTools()
|
|
356
|
+
const [term, setTerm] = useState('')
|
|
357
|
+
const shown = useMemo(
|
|
358
|
+
() => [...records].filter((tool) => matches(tool, term)).sort((left, right) => left.name.localeCompare(right.name)),
|
|
359
|
+
[records, term],
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
return (
|
|
363
|
+
<section className="rounded-md border border-border p-5">
|
|
364
|
+
<div className="flex flex-wrap items-center justify-between gap-3">
|
|
365
|
+
<h2 className="text-[13px] font-semibold text-ink">Tools</h2>
|
|
366
|
+
{records.length > 0 && (
|
|
367
|
+
<input
|
|
368
|
+
type="search"
|
|
369
|
+
value={term}
|
|
370
|
+
onChange={(event) => {
|
|
371
|
+
setTerm(event.target.value)
|
|
372
|
+
}}
|
|
373
|
+
placeholder="Filter tools"
|
|
374
|
+
aria-label="Filter tools"
|
|
375
|
+
className="rounded-md border border-border bg-surface px-2.5 py-1 text-[12px] text-ink outline-none focus:border-border-strong"
|
|
376
|
+
/>
|
|
377
|
+
)}
|
|
378
|
+
</div>
|
|
379
|
+
<p className="mt-1 max-w-2xl text-[12px] text-ink-muted">
|
|
380
|
+
{isLoading
|
|
381
|
+
? 'Reading what this deployment exposes.'
|
|
382
|
+
: `${String(records.length)} tools, mirroring the REST API one for one. Arguments and results are snake_case JSON.`}
|
|
383
|
+
</p>
|
|
384
|
+
|
|
385
|
+
{error !== null && <div className="mt-4">{<ErrorPanel error={error} />}</div>}
|
|
386
|
+
{isLoading && <LoadingPanel label="Loading tools…" />}
|
|
387
|
+
|
|
388
|
+
{records.length > 0 && shown.length === 0 && (
|
|
389
|
+
<p className="mt-4 text-[12px] text-ink-faint">No tool matches “{term}”.</p>
|
|
390
|
+
)}
|
|
391
|
+
|
|
392
|
+
{shown.length > 0 && (
|
|
393
|
+
<ul className="mt-4 divide-y divide-border rounded-md border border-border">
|
|
394
|
+
{shown.map((tool) => (
|
|
395
|
+
<li key={tool.name} className="px-3 py-2.5">
|
|
396
|
+
<code className="font-mono text-[12px] text-accent">{tool.name}</code>
|
|
397
|
+
<p className="mt-0.5 text-[12px] leading-relaxed text-ink-muted">{tool.description}</p>
|
|
398
|
+
</li>
|
|
399
|
+
))}
|
|
400
|
+
</ul>
|
|
401
|
+
)}
|
|
402
|
+
</section>
|
|
403
|
+
)
|
|
404
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { ModuleSetting } from '@kelpie/schemas'
|
|
2
|
+
|
|
3
|
+
import { useSetModuleEnabled, useModuleSettings } from '../../api/resources/moduleSettings.ts'
|
|
4
|
+
import { useSession } from '../../api/resources/session.ts'
|
|
5
|
+
import { PageHeader } from '../../components/PageHeader.tsx'
|
|
6
|
+
import { ErrorPanel, LoadingPanel } from '../../components/QueryState.tsx'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Turns optional modules on or off for this workspace.
|
|
10
|
+
*
|
|
11
|
+
* A module a deploy-time config file locks (`modules.md`) shows as disabled
|
|
12
|
+
* with a note rather than being left out of the list: a workspace admin should
|
|
13
|
+
* see that the choice exists and is not theirs, not wonder why a module they
|
|
14
|
+
* expect is simply missing from the page.
|
|
15
|
+
*
|
|
16
|
+
* Known ids get a friendlier label; an id this page has never heard of still
|
|
17
|
+
* renders, title-cased, because the module catalog is meant to grow without
|
|
18
|
+
* this file changing every time it does.
|
|
19
|
+
*/
|
|
20
|
+
const MODULE_LABELS: Readonly<Record<string, string>> = {
|
|
21
|
+
positions: 'Positions',
|
|
22
|
+
deals: 'Deals',
|
|
23
|
+
opportunities: 'Opportunities',
|
|
24
|
+
partnerships: 'Partnerships',
|
|
25
|
+
raises: 'Fundraising',
|
|
26
|
+
hiring: 'Hiring',
|
|
27
|
+
handbook: 'Handbook',
|
|
28
|
+
forms: 'Forms',
|
|
29
|
+
'import-export': 'Import / export',
|
|
30
|
+
'agent-tasks': 'Agent tasks',
|
|
31
|
+
webhooks: 'Webhooks',
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function labelFor(moduleId: string): string {
|
|
35
|
+
return (
|
|
36
|
+
MODULE_LABELS[moduleId] ??
|
|
37
|
+
moduleId
|
|
38
|
+
.split('-')
|
|
39
|
+
.map((word) => (word.length === 0 ? word : word[0]?.toUpperCase() + word.slice(1)))
|
|
40
|
+
.join(' ')
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function ModulesPage(): React.JSX.Element {
|
|
45
|
+
const { session } = useSession()
|
|
46
|
+
const { settings, isLoading, error } = useModuleSettings()
|
|
47
|
+
const isAdmin = session?.role === 'owner' || session?.role === 'admin'
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div className="animate-slide-in mx-auto max-w-4xl space-y-6">
|
|
51
|
+
<PageHeader
|
|
52
|
+
title="Modules"
|
|
53
|
+
description="Turn optional parts of Kelpie on or off for this workspace."
|
|
54
|
+
/>
|
|
55
|
+
|
|
56
|
+
{error !== null && <ErrorPanel error={error} />}
|
|
57
|
+
|
|
58
|
+
{isLoading ? (
|
|
59
|
+
<LoadingPanel label="Loading modules…" />
|
|
60
|
+
) : settings.length === 0 ? (
|
|
61
|
+
<p className="text-[13px] text-ink-muted">Nothing here yet.</p>
|
|
62
|
+
) : (
|
|
63
|
+
<ul className="divide-y divide-border rounded-md border border-border">
|
|
64
|
+
{settings
|
|
65
|
+
.toSorted((a, b) => labelFor(a.moduleId).localeCompare(labelFor(b.moduleId)))
|
|
66
|
+
.map((setting) => (
|
|
67
|
+
<ModuleRow key={setting.moduleId} setting={setting} canEdit={isAdmin} />
|
|
68
|
+
))}
|
|
69
|
+
</ul>
|
|
70
|
+
)}
|
|
71
|
+
</div>
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function ModuleRow({
|
|
76
|
+
setting,
|
|
77
|
+
canEdit,
|
|
78
|
+
}: {
|
|
79
|
+
readonly setting: ModuleSetting
|
|
80
|
+
readonly canEdit: boolean
|
|
81
|
+
}): React.JSX.Element {
|
|
82
|
+
const setEnabled = useSetModuleEnabled()
|
|
83
|
+
const disabled = !canEdit || setting.locked || setEnabled.isPending
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<li className="flex items-start justify-between gap-4 px-4 py-3">
|
|
87
|
+
<div>
|
|
88
|
+
<label className="flex cursor-pointer items-center gap-2.5">
|
|
89
|
+
<input
|
|
90
|
+
type="checkbox"
|
|
91
|
+
checked={setting.enabled}
|
|
92
|
+
disabled={disabled}
|
|
93
|
+
onChange={(event) => {
|
|
94
|
+
setEnabled.run({ moduleId: setting.moduleId, enabled: event.target.checked })
|
|
95
|
+
}}
|
|
96
|
+
className="disabled:opacity-50"
|
|
97
|
+
/>
|
|
98
|
+
<span className="text-[13px] font-medium text-ink">{labelFor(setting.moduleId)}</span>
|
|
99
|
+
</label>
|
|
100
|
+
{setting.locked && (
|
|
101
|
+
<p className="mt-1 pl-6 text-[11px] text-ink-faint">
|
|
102
|
+
Locked by this deployment's configuration.
|
|
103
|
+
</p>
|
|
104
|
+
)}
|
|
105
|
+
{setEnabled.error !== null && (
|
|
106
|
+
<div className="mt-2 pl-6">
|
|
107
|
+
<ErrorPanel error={setEnabled.error} />
|
|
108
|
+
</div>
|
|
109
|
+
)}
|
|
110
|
+
</div>
|
|
111
|
+
</li>
|
|
112
|
+
)
|
|
113
|
+
}
|