@burdenoff/microfe-botmanor 2026.813.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/botlit/BotlitRoutes.js +357 -0
- package/dist/botlit/BotlitRoutes.js.map +1 -0
- package/dist/botlit/BotmanorRoot.js +12 -0
- package/dist/botlit/BotmanorRoot.js.map +1 -0
- package/dist/botlit/BotmanorRootInner.js +101 -0
- package/dist/botlit/BotmanorRootInner.js.map +1 -0
- package/dist/botlit/components/Badge.js +39 -0
- package/dist/botlit/components/Badge.js.map +1 -0
- package/dist/botlit/components/Button.js +46 -0
- package/dist/botlit/components/Button.js.map +1 -0
- package/dist/botlit/components/Card.js +31 -0
- package/dist/botlit/components/Card.js.map +1 -0
- package/dist/botlit/components/ChannelSelectorSheet.js +130 -0
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -0
- package/dist/botlit/components/EmptyState.js +35 -0
- package/dist/botlit/components/EmptyState.js.map +1 -0
- package/dist/botlit/components/ErrorState.js +33 -0
- package/dist/botlit/components/ErrorState.js.map +1 -0
- package/dist/botlit/components/Input.js +59 -0
- package/dist/botlit/components/Input.js.map +1 -0
- package/dist/botlit/components/PageLayout.js +34 -0
- package/dist/botlit/components/PageLayout.js.map +1 -0
- package/dist/botlit/components/QuotaExhaustedDialog.js +20 -0
- package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -0
- package/dist/botlit/components/RouteLoader.js +52 -0
- package/dist/botlit/components/RouteLoader.js.map +1 -0
- package/dist/botlit/components/VersionHistoryPanel.js +144 -0
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -0
- package/dist/botlit/components/WorkspaceRequired.js +70 -0
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -0
- package/dist/botlit/hooks/index.js +16 -0
- package/dist/botlit/hooks/internal/mutationInput.js +16 -0
- package/dist/botlit/hooks/internal/mutationInput.js.map +1 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +99 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -0
- package/dist/botlit/hooks/useA2A.js +184 -0
- package/dist/botlit/hooks/useA2A.js.map +1 -0
- package/dist/botlit/hooks/useAgents.js +469 -0
- package/dist/botlit/hooks/useAgents.js.map +1 -0
- package/dist/botlit/hooks/useBots.js +306 -0
- package/dist/botlit/hooks/useBots.js.map +1 -0
- package/dist/botlit/hooks/useBuckets.js +119 -0
- package/dist/botlit/hooks/useBuckets.js.map +1 -0
- package/dist/botlit/hooks/useChannels.js +213 -0
- package/dist/botlit/hooks/useChannels.js.map +1 -0
- package/dist/botlit/hooks/useConversations.js +64 -0
- package/dist/botlit/hooks/useConversations.js.map +1 -0
- package/dist/botlit/hooks/useExecutions.js +86 -0
- package/dist/botlit/hooks/useExecutions.js.map +1 -0
- package/dist/botlit/hooks/useKnowledgeBases.js +113 -0
- package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -0
- package/dist/botlit/hooks/useLLMProviders.js +83 -0
- package/dist/botlit/hooks/useLLMProviders.js.map +1 -0
- package/dist/botlit/hooks/useMCPServers.js +134 -0
- package/dist/botlit/hooks/useMCPServers.js.map +1 -0
- package/dist/botlit/hooks/usePolicies.js +120 -0
- package/dist/botlit/hooks/usePolicies.js.map +1 -0
- package/dist/botlit/hooks/usePromptTemplates.js +161 -0
- package/dist/botlit/hooks/usePromptTemplates.js.map +1 -0
- package/dist/botlit/hooks/useRetrievalProfiles.js +146 -0
- package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -0
- package/dist/botlit/hooks/useSkills.js +132 -0
- package/dist/botlit/hooks/useSkills.js.map +1 -0
- package/dist/botlit/hooks/useStore.js +167 -0
- package/dist/botlit/hooks/useStore.js.map +1 -0
- package/dist/botlit/hooks/useUserPlatformConnection.js +172 -0
- package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -0
- package/dist/botlit/index.js +11 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js +589 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -0
- package/dist/botlit/pages/A2ARegistryPage.js +240 -0
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -0
- package/dist/botlit/pages/AgentBuilderPage.js +486 -0
- package/dist/botlit/pages/AgentBuilderPage.js.map +1 -0
- package/dist/botlit/pages/AgentDetailPage.js +517 -0
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -0
- package/dist/botlit/pages/AgentsListPage.js +294 -0
- package/dist/botlit/pages/AgentsListPage.js.map +1 -0
- package/dist/botlit/pages/BotChannelsTab.js +530 -0
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -0
- package/dist/botlit/pages/BotDetailPage.js +872 -0
- package/dist/botlit/pages/BotDetailPage.js.map +1 -0
- package/dist/botlit/pages/BotWorkflowTab.js +229 -0
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -0
- package/dist/botlit/pages/BotsListPage.js +313 -0
- package/dist/botlit/pages/BotsListPage.js.map +1 -0
- package/dist/botlit/pages/BucketsPage.js +604 -0
- package/dist/botlit/pages/BucketsPage.js.map +1 -0
- package/dist/botlit/pages/ChannelDetailPage.js +955 -0
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -0
- package/dist/botlit/pages/ChannelRoutesPage.js +218 -0
- package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -0
- package/dist/botlit/pages/ChannelsPage.js +304 -0
- package/dist/botlit/pages/ChannelsPage.js.map +1 -0
- package/dist/botlit/pages/ChatPage.js +247 -0
- package/dist/botlit/pages/ChatPage.js.map +1 -0
- package/dist/botlit/pages/DashboardPage.js +318 -0
- package/dist/botlit/pages/DashboardPage.js.map +1 -0
- package/dist/botlit/pages/ExecutionDetailPage.js +313 -0
- package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -0
- package/dist/botlit/pages/ExecutionsPage.js +294 -0
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -0
- package/dist/botlit/pages/InstalledPackagesPage.js +619 -0
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -0
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js +473 -0
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -0
- package/dist/botlit/pages/KnowledgeBasesPage.js +150 -0
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -0
- package/dist/botlit/pages/MCPServerDetailPage.js +550 -0
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -0
- package/dist/botlit/pages/MCPServersPage.js +321 -0
- package/dist/botlit/pages/MCPServersPage.js.map +1 -0
- package/dist/botlit/pages/PoliciesPage.js +224 -0
- package/dist/botlit/pages/PoliciesPage.js.map +1 -0
- package/dist/botlit/pages/PolicyDetailPage.js +861 -0
- package/dist/botlit/pages/PolicyDetailPage.js.map +1 -0
- package/dist/botlit/pages/PromptStudioPage.js +236 -0
- package/dist/botlit/pages/PromptStudioPage.js.map +1 -0
- package/dist/botlit/pages/PromptTemplateDetailPage.js +812 -0
- package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -0
- package/dist/botlit/pages/PromptTemplatesPage.js +269 -0
- package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -0
- package/dist/botlit/pages/RetrievalProfileDetailPage.js +559 -0
- package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -0
- package/dist/botlit/pages/RetrievalProfilesPage.js +219 -0
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -0
- package/dist/botlit/pages/SettingsPage.js +655 -0
- package/dist/botlit/pages/SettingsPage.js.map +1 -0
- package/dist/botlit/pages/SkillDetailPage.js +778 -0
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -0
- package/dist/botlit/pages/SkillsPage.js +206 -0
- package/dist/botlit/pages/SkillsPage.js.map +1 -0
- package/dist/botlit/pages/StorePackageDetailPage.js +462 -0
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -0
- package/dist/botlit/pages/StorePage.js +315 -0
- package/dist/botlit/pages/StorePage.js.map +1 -0
- package/dist/botlit/providers/BotlitProvider.js +93 -0
- package/dist/botlit/providers/BotlitProvider.js.map +1 -0
- package/dist/botlit/store/botlitStore.js +101 -0
- package/dist/botlit/store/botlitStore.js.map +1 -0
- package/dist/botlit/utils/cn.js +10 -0
- package/dist/botlit/utils/cn.js.map +1 -0
- package/dist/botlit/utils/formatters.js +37 -0
- package/dist/botlit/utils/formatters.js.map +1 -0
- package/dist/botlit/utils/navigation.js +9 -0
- package/dist/botlit/utils/navigation.js.map +1 -0
- package/dist/botlit/utils/unions.js +14 -0
- package/dist/botlit/utils/unions.js.map +1 -0
- package/dist/generated/global-operations.js +66 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.js +8 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.js +1591 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.js +12 -0
- package/dist/generated/wspace-types.js.map +1 -0
- package/dist/index.js +13 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +133 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { buildMutationInput as e, fieldsOf as t } from "./internal/mutationInput.js";
|
|
2
|
+
import { GetStorePackageBySlugDocument as n, InstallPackageDocument as r, ListInstalledPackagesDocument as i, ListStorePackagesDocument as a, UninstallPackageDocument as o, UpdateInstalledPackageDocument as s } from "../../generated/wspace-operations.js";
|
|
3
|
+
import { useWorkspaceId as c, useWorkspaceMutation as l, useWorkspaceQuery as u } from "./internal/workspaceGateway.js";
|
|
4
|
+
import { useCallback as d, useMemo as f } from "react";
|
|
5
|
+
//#region src/botlit/hooks/useStore.ts
|
|
6
|
+
var p = 100, m = t({
|
|
7
|
+
bindings: !0,
|
|
8
|
+
metadata: !0,
|
|
9
|
+
mode: !0,
|
|
10
|
+
packageId: !0,
|
|
11
|
+
pinnedByEnv: !0,
|
|
12
|
+
version: !0,
|
|
13
|
+
workspaceId: !0
|
|
14
|
+
}), h = t({
|
|
15
|
+
bindings: !0,
|
|
16
|
+
installedVersion: !0,
|
|
17
|
+
metadata: !0,
|
|
18
|
+
mode: !0,
|
|
19
|
+
pinnedByEnv: !0
|
|
20
|
+
});
|
|
21
|
+
t({
|
|
22
|
+
installedPackageId: !0,
|
|
23
|
+
metadata: !0,
|
|
24
|
+
newName: !0,
|
|
25
|
+
workspaceId: !0
|
|
26
|
+
});
|
|
27
|
+
var g = [], _ = [];
|
|
28
|
+
function v(e, t) {
|
|
29
|
+
let n = e?.manifest?.[t];
|
|
30
|
+
return n && typeof n == "object" && !Array.isArray(n) ? n : void 0;
|
|
31
|
+
}
|
|
32
|
+
function y(e, t) {
|
|
33
|
+
let n = v(e, "package")?.[t];
|
|
34
|
+
return typeof n == "string" ? n : void 0;
|
|
35
|
+
}
|
|
36
|
+
function b(e) {
|
|
37
|
+
return y(e, "name") ?? e?.slug ?? "";
|
|
38
|
+
}
|
|
39
|
+
function x(e) {
|
|
40
|
+
return y(e, "description");
|
|
41
|
+
}
|
|
42
|
+
function S(e) {
|
|
43
|
+
return e?.listStorePackages ?? g;
|
|
44
|
+
}
|
|
45
|
+
function C(e) {
|
|
46
|
+
return e?.listInstalledPackages ?? _;
|
|
47
|
+
}
|
|
48
|
+
function w(e) {
|
|
49
|
+
let t = e?.search?.trim() ?? "", n = e?.kind?.[0], r = e?.sortBy ?? "recent";
|
|
50
|
+
return u({
|
|
51
|
+
document: a,
|
|
52
|
+
variables: f(() => ({
|
|
53
|
+
filters: {
|
|
54
|
+
search: t || void 0,
|
|
55
|
+
kind: n
|
|
56
|
+
},
|
|
57
|
+
pagination: {
|
|
58
|
+
limit: p,
|
|
59
|
+
offset: 0
|
|
60
|
+
}
|
|
61
|
+
}), [t, n]),
|
|
62
|
+
select: d((e) => {
|
|
63
|
+
let t = S(e);
|
|
64
|
+
if (t.length === 0) return t;
|
|
65
|
+
let n = [...t];
|
|
66
|
+
return r === "name" ? n.sort((e, t) => b(e).localeCompare(b(t))) : n.sort((e, t) => (t.publishedAt ?? "").localeCompare(e.publishedAt ?? "")), n;
|
|
67
|
+
}, [r]),
|
|
68
|
+
fallback: g,
|
|
69
|
+
enabled: !0,
|
|
70
|
+
errorMessage: "Failed to load store packages"
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function T(e) {
|
|
74
|
+
return u({
|
|
75
|
+
document: n,
|
|
76
|
+
variables: f(() => ({ slug: e ?? "" }), [e]),
|
|
77
|
+
select: (e) => e?.getStorePackageBySlug ?? null,
|
|
78
|
+
fallback: null,
|
|
79
|
+
enabled: !!e,
|
|
80
|
+
errorMessage: "Failed to load store package"
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function E() {
|
|
84
|
+
let e = c();
|
|
85
|
+
return u({
|
|
86
|
+
document: i,
|
|
87
|
+
variables: f(() => ({
|
|
88
|
+
filters: { workspaceId: e ?? "" },
|
|
89
|
+
pagination: {
|
|
90
|
+
limit: p,
|
|
91
|
+
offset: 0
|
|
92
|
+
}
|
|
93
|
+
}), [e]),
|
|
94
|
+
select: C,
|
|
95
|
+
fallback: _,
|
|
96
|
+
enabled: !!e,
|
|
97
|
+
errorMessage: "Failed to load installed packages"
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function D() {
|
|
101
|
+
let t = c(), [n, i] = l({
|
|
102
|
+
document: r,
|
|
103
|
+
variables: d((n) => ({ input: e({
|
|
104
|
+
...n,
|
|
105
|
+
workspaceId: t
|
|
106
|
+
}, m) }), [t]),
|
|
107
|
+
select: (e) => e?.installPackage,
|
|
108
|
+
errorMessage: "Failed to install package"
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
install: n,
|
|
112
|
+
loading: i.loading,
|
|
113
|
+
error: i.error
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function O() {
|
|
117
|
+
let [t, n] = l({
|
|
118
|
+
document: s,
|
|
119
|
+
variables: ({ installedId: t, input: n }) => ({
|
|
120
|
+
id: t,
|
|
121
|
+
input: e(n, h)
|
|
122
|
+
}),
|
|
123
|
+
select: (e) => e?.updateInstalledPackage,
|
|
124
|
+
errorMessage: "Failed to update installed package"
|
|
125
|
+
});
|
|
126
|
+
return {
|
|
127
|
+
update: t,
|
|
128
|
+
loading: n.loading,
|
|
129
|
+
error: n.error
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function k() {
|
|
133
|
+
let [e, t] = l({
|
|
134
|
+
document: o,
|
|
135
|
+
variables: (e) => ({ id: e }),
|
|
136
|
+
select: (e) => e?.uninstallPackage,
|
|
137
|
+
errorMessage: "Failed to uninstall package"
|
|
138
|
+
});
|
|
139
|
+
return {
|
|
140
|
+
uninstall: e,
|
|
141
|
+
loading: t.loading,
|
|
142
|
+
error: t.error
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function A() {
|
|
146
|
+
let [e, t] = l({
|
|
147
|
+
document: s,
|
|
148
|
+
variables: ({ installedId: e, environment: t, version: n, pinnedByEnv: r }) => ({
|
|
149
|
+
id: e,
|
|
150
|
+
input: { pinnedByEnv: {
|
|
151
|
+
...r ?? {},
|
|
152
|
+
[t]: n
|
|
153
|
+
} }
|
|
154
|
+
}),
|
|
155
|
+
select: (e) => e?.updateInstalledPackage,
|
|
156
|
+
errorMessage: "Failed to pin package version"
|
|
157
|
+
});
|
|
158
|
+
return {
|
|
159
|
+
pin: e,
|
|
160
|
+
loading: t.loading,
|
|
161
|
+
error: t.error
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//#endregion
|
|
165
|
+
export { x as storePackageDescription, b as storePackageName, D as useInstallPackage, E as useInstalledPackages, A as usePinPackageVersion, T as useStorePackage, w as useStorePackages, k as useUninstallPackage, O as useUpdateInstalledPackage };
|
|
166
|
+
|
|
167
|
+
//# sourceMappingURL=useStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStore.js","names":[],"sources":["../../../src/botlit/hooks/useStore.ts"],"sourcesContent":["/**\n * Store Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listStorePackages` / `getStorePackageBySlug` /\n * `listInstalledPackages` operations and the install/update/uninstall/fork\n * mutations on wspace-botlit-svc.\n *\n * A `StorePackage` carries its human metadata (name, description, author,\n * tags…) inside the `manifest` JSON — the helpers below read it safely rather\n * than assuming top-level columns that the service does not expose.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n ForkInstalledPackageDocument,\n GetInstalledPackageDocument,\n GetStorePackageBySlugDocument,\n InstallPackageDocument,\n ListInstalledPackagesDocument,\n ListStorePackagesDocument,\n UninstallPackageDocument,\n UpdateInstalledPackageDocument,\n type ForkInstalledPackageMutation,\n type GetInstalledPackageQuery,\n type GetStorePackageBySlugQuery,\n type InstallPackageMutation,\n type ListInstalledPackagesQuery,\n type ListStorePackagesQuery,\n type UninstallPackageMutation,\n type UpdateInstalledPackageMutation,\n} from '../../generated/wspace-operations';\nimport type {\n ForkInstalledPackageInput,\n InstallPackageInput,\n UpdateInstalledPackageInput,\n} from '../../generated/wspace-types';\nimport { buildMutationInput, fieldsOf, type GraphQLInput } from './internal/mutationInput';\nimport {\n useWorkspaceId,\n useWorkspaceMutation,\n useWorkspaceQuery,\n type QueryResult,\n} from './internal/workspaceGateway';\n\nconst LIST_LIMIT = 100;\n\nexport interface StorePackageRecord {\n id: string;\n slug: string;\n kind: string;\n version: string;\n manifest: Record<string, unknown>;\n readme?: string | null;\n metadata?: Record<string, unknown> | null;\n publishedAt?: string | null;\n publishedBy?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface InstalledPackageRecord {\n id: string;\n packageId: string;\n installedVersion: string;\n mode: string;\n bindings?: Record<string, unknown> | null;\n pinnedByEnv?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n installedAt: string;\n installedBy: string;\n createdAt: string;\n updatedAt: string;\n workspaceId: string;\n package?: StorePackageRecord | null;\n}\n\n/** Sort orders the service data actually supports (no rating/downloads exist). */\nexport type StoreSortBy = 'recent' | 'name';\n\nexport interface StoreFilter {\n search?: string;\n kind?: string[];\n sortBy?: StoreSortBy;\n}\n\n/** `InstallPackageInput` minus the `workspaceId` the hook supplies. */\nexport type InstallPackageVariables = Omit<GraphQLInput<InstallPackageInput>, 'workspaceId'>;\n\nexport interface UpdateInstalledPackageVariables {\n installedId: string;\n input: GraphQLInput<UpdateInstalledPackageInput>;\n}\n\nconst INSTALL_PACKAGE_FIELDS = fieldsOf<InstallPackageInput>({\n bindings: true,\n metadata: true,\n mode: true,\n packageId: true,\n pinnedByEnv: true,\n version: true,\n workspaceId: true,\n});\n\nconst UPDATE_INSTALLED_FIELDS = fieldsOf<UpdateInstalledPackageInput>({\n bindings: true,\n installedVersion: true,\n metadata: true,\n mode: true,\n pinnedByEnv: true,\n});\n\nconst FORK_PACKAGE_FIELDS = fieldsOf<ForkInstalledPackageInput>({\n installedPackageId: true,\n metadata: true,\n newName: true,\n workspaceId: true,\n});\n\nexport interface PinPackageVersionVariables {\n installedId: string;\n environment: string;\n version: string;\n /** Existing pins — passed through so pinning one environment never drops the others. */\n pinnedByEnv?: Record<string, unknown> | null;\n}\n\n/** `ForkInstalledPackageInput` minus the `workspaceId` the hook supplies. */\nexport type ForkPackageVariables = Omit<GraphQLInput<ForkInstalledPackageInput>, 'workspaceId'>;\n\n/** An installed package whose store listing has moved on to a newer version. */\nexport interface OutdatedPackage {\n installed: InstalledPackageRecord;\n installedVersion: string;\n latestVersion: string;\n}\n\nconst NO_PACKAGES: StorePackageRecord[] = [];\nconst NO_INSTALLED: InstalledPackageRecord[] = [];\nconst NO_OUTDATED: OutdatedPackage[] = [];\n\nfunction manifestSection(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined,\n key: string\n): Record<string, unknown> | undefined {\n const section = pkg?.manifest?.[key];\n return section && typeof section === 'object' && !Array.isArray(section)\n ? (section as Record<string, unknown>)\n : undefined;\n}\n\nfunction manifestString(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined,\n key: string\n): string | undefined {\n const value = manifestSection(pkg, 'package')?.[key];\n return typeof value === 'string' ? value : undefined;\n}\n\n/** Display name from the package manifest, falling back to the slug. */\nexport function storePackageName(\n pkg: Pick<StorePackageRecord, 'manifest' | 'slug'> | null | undefined\n): string {\n return manifestString(pkg, 'name') ?? pkg?.slug ?? '';\n}\n\nexport function storePackageDescription(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined\n): string | undefined {\n return manifestString(pkg, 'description');\n}\n\nfunction selectPackages(data: ListStorePackagesQuery | undefined): StorePackageRecord[] {\n return data?.listStorePackages ?? NO_PACKAGES;\n}\n\nfunction selectInstalled(data: ListInstalledPackagesQuery | undefined): InstalledPackageRecord[] {\n return data?.listInstalledPackages ?? NO_INSTALLED;\n}\n\nexport const storeKeys = {\n all: ['store'] as const,\n packages: () => [...storeKeys.all, 'packages'] as const,\n packageList: (filter?: StoreFilter) => [...storeKeys.packages(), 'list', filter] as const,\n packageDetail: (slug: string) => [...storeKeys.packages(), 'detail', slug] as const,\n installed: () => [...storeKeys.all, 'installed'] as const,\n installedList: () => [...storeKeys.installed(), 'list'] as const,\n installedDetail: (id: string) => [...storeKeys.installed(), 'detail', id] as const,\n};\n\nexport function useStorePackages(filter?: StoreFilter): QueryResult<StorePackageRecord[]> {\n const search = filter?.search?.trim() ?? '';\n const kind = filter?.kind?.[0];\n const sortBy = filter?.sortBy ?? 'recent';\n\n const variables = useMemo(\n () => ({\n filters: { search: search || undefined, kind },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [search, kind]\n );\n\n const select = useCallback(\n (data: ListStorePackagesQuery | undefined): StorePackageRecord[] => {\n const rows = selectPackages(data);\n if (rows.length === 0) return rows;\n const sorted = [...rows];\n if (sortBy === 'name') {\n sorted.sort((a, b) => storePackageName(a).localeCompare(storePackageName(b)));\n } else {\n sorted.sort((a, b) => (b.publishedAt ?? '').localeCompare(a.publishedAt ?? ''));\n }\n return sorted;\n },\n [sortBy]\n );\n\n return useWorkspaceQuery<ListStorePackagesQuery, StorePackageRecord[]>({\n document: ListStorePackagesDocument,\n variables,\n select,\n fallback: NO_PACKAGES,\n // The store catalogue is workspace-independent.\n enabled: true,\n errorMessage: 'Failed to load store packages',\n });\n}\n\n/** Store packages are addressed by slug in the UI, so this resolves by slug. */\nexport function useStorePackage(slug: string | undefined): QueryResult<StorePackageRecord | null> {\n const variables = useMemo(() => ({ slug: slug ?? '' }), [slug]);\n\n return useWorkspaceQuery<GetStorePackageBySlugQuery, StorePackageRecord | null>({\n document: GetStorePackageBySlugDocument,\n variables,\n select: (data) => data?.getStorePackageBySlug ?? null,\n fallback: null,\n enabled: Boolean(slug),\n errorMessage: 'Failed to load store package',\n });\n}\n\nexport function useInstalledPackages(): QueryResult<InstalledPackageRecord[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId: workspaceId ?? '' },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n return useWorkspaceQuery<ListInstalledPackagesQuery, InstalledPackageRecord[]>({\n document: ListInstalledPackagesDocument,\n variables,\n select: selectInstalled,\n fallback: NO_INSTALLED,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load installed packages',\n });\n}\n\nexport function useInstalledPackage(\n packageId: string | undefined\n): QueryResult<InstalledPackageRecord | null> {\n const variables = useMemo(() => ({ id: packageId ?? '' }), [packageId]);\n\n return useWorkspaceQuery<GetInstalledPackageQuery, InstalledPackageRecord | null>({\n document: GetInstalledPackageDocument,\n variables,\n select: (data) => data?.getInstalledPackage ?? null,\n fallback: null,\n enabled: Boolean(packageId),\n errorMessage: 'Failed to load installed package',\n });\n}\n\n/**\n * Installed packages whose store listing now publishes a different version.\n * Derived from the store package returned alongside each install — the service\n * has no dedicated \"check for updates\" operation.\n */\nexport function useCheckPackageUpdates(): QueryResult<OutdatedPackage[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId: workspaceId ?? '' },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n const select = useCallback((data: ListInstalledPackagesQuery | undefined): OutdatedPackage[] => {\n const rows = selectInstalled(data);\n const outdated: OutdatedPackage[] = [];\n for (const installed of rows) {\n const latestVersion = installed.package?.version;\n if (latestVersion && latestVersion !== installed.installedVersion) {\n outdated.push({ installed, installedVersion: installed.installedVersion, latestVersion });\n }\n }\n return outdated;\n }, []);\n\n return useWorkspaceQuery<ListInstalledPackagesQuery, OutdatedPackage[]>({\n document: ListInstalledPackagesDocument,\n variables,\n select,\n fallback: NO_OUTDATED,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to check for package updates',\n });\n}\n\nexport function useInstallPackage() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: InstallPackageVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, INSTALL_PACKAGE_FIELDS),\n }),\n [workspaceId]\n );\n\n const [install, state] = useWorkspaceMutation<\n InstallPackageMutation,\n InstallPackageVariables,\n InstalledPackageRecord\n >({\n document: InstallPackageDocument,\n variables,\n select: (data) => data?.installPackage,\n errorMessage: 'Failed to install package',\n });\n\n return { install, loading: state.loading, error: state.error };\n}\n\nexport function useUpdateInstalledPackage() {\n const [update, state] = useWorkspaceMutation<\n UpdateInstalledPackageMutation,\n UpdateInstalledPackageVariables,\n InstalledPackageRecord\n >({\n document: UpdateInstalledPackageDocument,\n variables: ({ installedId, input }) => ({\n id: installedId,\n input: buildMutationInput(input, UPDATE_INSTALLED_FIELDS),\n }),\n select: (data) => data?.updateInstalledPackage,\n errorMessage: 'Failed to update installed package',\n });\n\n return { update, loading: state.loading, error: state.error };\n}\n\nexport function useUninstallPackage() {\n const [uninstall, state] = useWorkspaceMutation<UninstallPackageMutation, string, boolean>({\n document: UninstallPackageDocument,\n variables: (installedId) => ({ id: installedId }),\n select: (data) => data?.uninstallPackage,\n errorMessage: 'Failed to uninstall package',\n });\n\n return { uninstall, loading: state.loading, error: state.error };\n}\n\n/**\n * Pins one environment to a version. Implemented as a targeted merge into\n * `pinnedByEnv` via `updateInstalledPackage` — the service has no dedicated pin\n * mutation, and replacing the whole map would drop the other environments.\n */\nexport function usePinPackageVersion() {\n const [update, state] = useWorkspaceMutation<\n UpdateInstalledPackageMutation,\n PinPackageVersionVariables,\n InstalledPackageRecord\n >({\n document: UpdateInstalledPackageDocument,\n variables: ({ installedId, environment, version, pinnedByEnv }) => ({\n id: installedId,\n input: { pinnedByEnv: { ...(pinnedByEnv ?? {}), [environment]: version } },\n }),\n select: (data) => data?.updateInstalledPackage,\n errorMessage: 'Failed to pin package version',\n });\n\n return { pin: update, loading: state.loading, error: state.error };\n}\n\nexport function useForkPackage() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: ForkPackageVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, FORK_PACKAGE_FIELDS),\n }),\n [workspaceId]\n );\n\n const [fork, state] = useWorkspaceMutation<\n ForkInstalledPackageMutation,\n ForkPackageVariables,\n InstalledPackageRecord\n >({\n document: ForkInstalledPackageDocument,\n variables,\n select: (data) => data?.forkInstalledPackage,\n errorMessage: 'Failed to fork package',\n });\n\n return { fork, loading: state.loading, error: state.error };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { LinkIntegrationConnectionDocument as e, MyUserPlatformConnectionDocument as t, RevokeUserPlatformConnectionDocument as n, UpdateUserPlatformConnectionNotificationsDocument as r } from "../../generated/global-operations.js";
|
|
2
|
+
import { ChannelType as i } from "../../generated/global-types.js";
|
|
3
|
+
import { useCallback as a, useEffect as o, useMemo as s, useState as c } from "react";
|
|
4
|
+
import { gql as l } from "@apollo/client";
|
|
5
|
+
import { useGatewayClient as u } from "@burdenoff/fe-libs/shared/graphql";
|
|
6
|
+
//#region src/botlit/hooks/useUserPlatformConnection.ts
|
|
7
|
+
function d() {
|
|
8
|
+
return u("global");
|
|
9
|
+
}
|
|
10
|
+
function f(e) {
|
|
11
|
+
let n = d(), [r, i] = c(null), [s, l] = c(!1), [u, f] = c(null), p = a(async () => {
|
|
12
|
+
if (!e) {
|
|
13
|
+
i(null), l(!1), f(null);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
l(!0), f(null);
|
|
17
|
+
try {
|
|
18
|
+
i((await n.query({
|
|
19
|
+
query: t,
|
|
20
|
+
variables: { channelId: e },
|
|
21
|
+
fetchPolicy: "network-only"
|
|
22
|
+
})).data?.myUserPlatformConnection ?? null);
|
|
23
|
+
} catch (e) {
|
|
24
|
+
f(e);
|
|
25
|
+
} finally {
|
|
26
|
+
l(!1);
|
|
27
|
+
}
|
|
28
|
+
}, [e, n]);
|
|
29
|
+
return o(() => {
|
|
30
|
+
p();
|
|
31
|
+
}, [p]), {
|
|
32
|
+
data: r,
|
|
33
|
+
loading: s,
|
|
34
|
+
error: u,
|
|
35
|
+
refetch: p
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function p() {
|
|
39
|
+
let [e] = c(!1), [t] = c(null);
|
|
40
|
+
return {
|
|
41
|
+
initiate: a((e, t) => {
|
|
42
|
+
let n = new URL("/integrations/connections", window.location.origin);
|
|
43
|
+
n.searchParams.set("provider", "slack-user"), n.searchParams.set("returnUrl", t), n.searchParams.set("channelId", e), window.location.href = n.toString();
|
|
44
|
+
}, []),
|
|
45
|
+
loading: e,
|
|
46
|
+
error: t
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function m() {
|
|
50
|
+
let e = d(), [t, n] = c(!1), [i, o] = c(null);
|
|
51
|
+
return {
|
|
52
|
+
toggle: a(async (t, i) => {
|
|
53
|
+
n(!0), o(null);
|
|
54
|
+
try {
|
|
55
|
+
return (await e.mutate({
|
|
56
|
+
mutation: r,
|
|
57
|
+
variables: {
|
|
58
|
+
id: t,
|
|
59
|
+
notificationsEnabled: i
|
|
60
|
+
}
|
|
61
|
+
})).data?.updateUserPlatformConnectionNotifications ?? null;
|
|
62
|
+
} catch (e) {
|
|
63
|
+
return o(e), null;
|
|
64
|
+
} finally {
|
|
65
|
+
n(!1);
|
|
66
|
+
}
|
|
67
|
+
}, [e]),
|
|
68
|
+
loading: t,
|
|
69
|
+
error: i
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function h() {
|
|
73
|
+
let e = d(), [t, r] = c(!1), [i, o] = c(null);
|
|
74
|
+
return {
|
|
75
|
+
revoke: a(async (t) => {
|
|
76
|
+
r(!0), o(null);
|
|
77
|
+
try {
|
|
78
|
+
return (await e.mutate({
|
|
79
|
+
mutation: n,
|
|
80
|
+
variables: { id: t }
|
|
81
|
+
})).data?.revokeUserPlatformConnection?.dmAllowed === !1;
|
|
82
|
+
} catch (e) {
|
|
83
|
+
return o(e), !1;
|
|
84
|
+
} finally {
|
|
85
|
+
r(!1);
|
|
86
|
+
}
|
|
87
|
+
}, [e]),
|
|
88
|
+
loading: t,
|
|
89
|
+
error: i
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function g() {
|
|
93
|
+
let t = d(), [n, r] = c(!1), [i, o] = c(null);
|
|
94
|
+
return {
|
|
95
|
+
link: a(async (n, i) => {
|
|
96
|
+
r(!0), o(null);
|
|
97
|
+
try {
|
|
98
|
+
return (await t.mutate({
|
|
99
|
+
mutation: e,
|
|
100
|
+
variables: {
|
|
101
|
+
integrationConnectionId: n,
|
|
102
|
+
channelId: i
|
|
103
|
+
}
|
|
104
|
+
})).data?.linkIntegrationConnection ?? null;
|
|
105
|
+
} catch (e) {
|
|
106
|
+
return o(e), null;
|
|
107
|
+
} finally {
|
|
108
|
+
r(!1);
|
|
109
|
+
}
|
|
110
|
+
}, [t]),
|
|
111
|
+
loading: n,
|
|
112
|
+
error: i
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
var _ = l`
|
|
116
|
+
query GetChannels($filter: ChannelFilterInput, $pagination: ChannelPaginationInput) {
|
|
117
|
+
getChannels(filter: $filter, pagination: $pagination) {
|
|
118
|
+
items {
|
|
119
|
+
id
|
|
120
|
+
name
|
|
121
|
+
platform
|
|
122
|
+
adapterType
|
|
123
|
+
channelType
|
|
124
|
+
status
|
|
125
|
+
isConnected
|
|
126
|
+
description
|
|
127
|
+
priority
|
|
128
|
+
connectionHealth
|
|
129
|
+
}
|
|
130
|
+
total
|
|
131
|
+
hasMore
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
`, v = { channelType: i.Communication }, y = {
|
|
135
|
+
offset: 0,
|
|
136
|
+
limit: 50
|
|
137
|
+
};
|
|
138
|
+
function b(e, t) {
|
|
139
|
+
let n = d(), [r, i] = c([]), [l, u] = c(!1), [f, p] = c(null), m = s(() => e ?? v, [e]), h = s(() => t ?? y, [t]), g = a(async () => {
|
|
140
|
+
u(!0), p(null);
|
|
141
|
+
try {
|
|
142
|
+
i((await n.query({
|
|
143
|
+
query: _,
|
|
144
|
+
variables: {
|
|
145
|
+
filter: m,
|
|
146
|
+
pagination: h
|
|
147
|
+
},
|
|
148
|
+
fetchPolicy: "network-only"
|
|
149
|
+
})).data?.getChannels?.items ?? []);
|
|
150
|
+
} catch (e) {
|
|
151
|
+
p(e);
|
|
152
|
+
} finally {
|
|
153
|
+
u(!1);
|
|
154
|
+
}
|
|
155
|
+
}, [
|
|
156
|
+
n,
|
|
157
|
+
m,
|
|
158
|
+
h
|
|
159
|
+
]);
|
|
160
|
+
return o(() => {
|
|
161
|
+
g();
|
|
162
|
+
}, [g]), {
|
|
163
|
+
data: r,
|
|
164
|
+
loading: l,
|
|
165
|
+
error: f,
|
|
166
|
+
refetch: g
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
//#endregion
|
|
170
|
+
export { b as useGlobalChannels, p as useInitiateSlackConnect, g as useLinkIntegrationConnection, f as useMyUserPlatformConnection, h as useRevokeSlackConnection, m as useToggleSlackNotifications };
|
|
171
|
+
|
|
172
|
+
//# sourceMappingURL=useUserPlatformConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUserPlatformConnection.js","names":[],"sources":["../../../src/botlit/hooks/useUserPlatformConnection.ts"],"sourcesContent":["/**\n * UserPlatformConnection Hooks\n * Phase 7: Slack personal account connect for channel users\n * @module botlit/hooks\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { gql, type ApolloClient } from '@apollo/client';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport {\n MyUserPlatformConnectionDocument,\n UpdateUserPlatformConnectionNotificationsDocument,\n RevokeUserPlatformConnectionDocument,\n LinkIntegrationConnectionDocument,\n} from '../../generated/global-operations';\nimport type {\n MyUserPlatformConnectionQuery,\n MyUserPlatformConnectionQueryVariables,\n UpdateUserPlatformConnectionNotificationsMutation,\n UpdateUserPlatformConnectionNotificationsMutationVariables,\n RevokeUserPlatformConnectionMutation,\n RevokeUserPlatformConnectionMutationVariables,\n LinkIntegrationConnectionMutation,\n LinkIntegrationConnectionMutationVariables,\n} from '../../generated/global-operations';\nimport type {\n ChannelPlatform,\n ChannelStatus,\n AdapterType,\n ChannelFilterInput,\n ChannelPaginationInput,\n} from '../../generated/global-types';\n// Value import: `channelType` on the filter is the generated enum, not the\n// local display-only `ChannelType` alias declared below.\nimport { ChannelType as GlobalChannelType } from '../../generated/global-types';\n\n// BOFF-1866 resolved: linkIntegrationConnection is published on global-channel-svc and\n// already codegen'd (see src/operations/global/channel/user-platform-connection.graphql).\n// Use the generated document/types instead of a hand-rolled one — the previous inline\n// gql selected a non-existent `success` field on UserPlatformConnection, which always\n// failed GraphQL validation server-side (BOFF-4691).\n\ntype ChannelType = string;\n\n// ============================================================================\n// Internal: global gateway client\n//\n// BOFF-5428: this module used to build its own ApolloClient defaulting to the\n// local-dev global gateway (port 4000) whenever the shell did not pass a\n// `globalApiGatewayUrl` prop — which it never did, so production shipped every\n// call to the caller's own machine. The shell already installs a configured\n// global-gateway client (correct URL, `x-workspace-id`, auth refresh + retry),\n// so use that and only that. Do NOT reintroduce a bespoke client or a\n// hardcoded gateway host here.\n// ============================================================================\n\nfunction useGlobalApolloClient(): ApolloClient {\n return useGatewayClient('global');\n}\n\n// ============================================================================\n// Exported types\n// ============================================================================\n\nexport interface UserPlatformConnectionData {\n id: string;\n channelId: string;\n platform: string;\n externalUserId: string;\n externalUsername?: string | null;\n externalDisplayName?: string | null;\n dmAllowed: boolean;\n notificationsEnabled: boolean;\n connectedAt?: string | null;\n canReceiveDm: boolean;\n isTokenExpired: boolean;\n userTokenExpiresAt?: string | null;\n integrationConnectionId?: string | null;\n}\n\n// ============================================================================\n// Hook: useMyUserPlatformConnection\n// ============================================================================\n\ninterface UseMyUserPlatformConnectionResult {\n data: UserPlatformConnectionData | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport function useMyUserPlatformConnection(\n channelId: string | undefined\n): UseMyUserPlatformConnectionResult {\n const globalClient = useGlobalApolloClient();\n\n const [data, setData] = useState<UserPlatformConnectionData | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetch = useCallback(async () => {\n if (!channelId) {\n setData(null);\n setLoading(false);\n setError(null);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await globalClient.query<\n MyUserPlatformConnectionQuery,\n MyUserPlatformConnectionQueryVariables\n >({\n query: MyUserPlatformConnectionDocument,\n variables: { channelId },\n fetchPolicy: 'network-only',\n });\n setData(\n (result.data?.myUserPlatformConnection as UserPlatformConnectionData | null | undefined) ??\n null\n );\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [channelId, globalClient]);\n\n useEffect(() => {\n fetch();\n }, [fetch]);\n\n return { data, loading, error, refetch: fetch };\n}\n\n// ============================================================================\n// Hook: useInitiateSlackConnect\n// DEPRECATED: Use integrations UI flow instead\n// Redirect user to: /integrations/connections?provider=slack-user&returnUrl=<current-page>&channelId=<channel-id>\n// After OAuth completes, integrations will redirect back with ?integrationConnectionId=<id>\n// Then call useLinkIntegrationConnection to link the connection to the channel\n// ============================================================================\n\ninterface UseInitiateSlackConnectResult {\n initiate: (channelId: string, redirectUri: string) => void;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * @deprecated Use integrations UI OAuth flow + useLinkIntegrationConnection instead\n */\nexport function useInitiateSlackConnect(): UseInitiateSlackConnectResult {\n const [loading] = useState<boolean>(false);\n const [error] = useState<Error | null>(null);\n\n const initiate = useCallback((channelId: string, redirectUri: string): void => {\n // Construct integrations URL with return parameters\n const integrationsUrl = new URL('/integrations/connections', window.location.origin);\n integrationsUrl.searchParams.set('provider', 'slack-user');\n integrationsUrl.searchParams.set('returnUrl', redirectUri);\n integrationsUrl.searchParams.set('channelId', channelId);\n\n // Redirect to integrations UI\n window.location.href = integrationsUrl.toString();\n }, []);\n\n return { initiate, loading, error };\n}\n\n// ============================================================================\n// Hook: useToggleSlackNotifications\n// ============================================================================\n\ninterface UseToggleSlackNotificationsResult {\n toggle: (id: string, notificationsEnabled: boolean) => Promise<UserPlatformConnectionData | null>;\n loading: boolean;\n error: Error | null;\n}\n\nexport function useToggleSlackNotifications(): UseToggleSlackNotificationsResult {\n const globalClient = useGlobalApolloClient();\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const toggle = useCallback(\n async (\n id: string,\n notificationsEnabled: boolean\n ): Promise<UserPlatformConnectionData | null> => {\n setLoading(true);\n setError(null);\n try {\n const result = await globalClient.mutate<\n UpdateUserPlatformConnectionNotificationsMutation,\n UpdateUserPlatformConnectionNotificationsMutationVariables\n >({\n mutation: UpdateUserPlatformConnectionNotificationsDocument,\n variables: { id, notificationsEnabled },\n });\n return (\n (result.data?.updateUserPlatformConnectionNotifications as\n | UserPlatformConnectionData\n | null\n | undefined) ?? null\n );\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [globalClient]\n );\n\n return { toggle, loading, error };\n}\n\n// ============================================================================\n// Hook: useRevokeSlackConnection\n// ============================================================================\n\ninterface UseRevokeSlackConnectionResult {\n revoke: (id: string) => Promise<boolean>;\n loading: boolean;\n error: Error | null;\n}\n\nexport function useRevokeSlackConnection(): UseRevokeSlackConnectionResult {\n const globalClient = useGlobalApolloClient();\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const revoke = useCallback(\n async (id: string): Promise<boolean> => {\n setLoading(true);\n setError(null);\n try {\n const result = await globalClient.mutate<\n RevokeUserPlatformConnectionMutation,\n RevokeUserPlatformConnectionMutationVariables\n >({\n mutation: RevokeUserPlatformConnectionDocument,\n variables: { id },\n });\n return result.data?.revokeUserPlatformConnection?.dmAllowed === false;\n } catch (err) {\n setError(err as Error);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [globalClient]\n );\n\n return { revoke, loading, error };\n}\n\n// ============================================================================\n// Hook: useCompleteSlackConnect\n// DEPRECATED: OAuth now handled by integrations UI\n// After integrations OAuth completes, use useLinkIntegrationConnection instead\n// ============================================================================\n\ninterface UseCompleteSlackConnectResult {\n complete: (code: string, state: string) => Promise<UserPlatformConnectionData | null>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * @deprecated OAuth is now handled by integrations UI. Use useLinkIntegrationConnection instead.\n */\nexport function useCompleteSlackConnect(): UseCompleteSlackConnectResult {\n const [loading] = useState<boolean>(false);\n const [error] = useState<Error | null>(null);\n\n const complete = useCallback(\n async (_code: string, _state: string): Promise<UserPlatformConnectionData | null> => {\n console.warn(\n 'useCompleteSlackConnect is deprecated. Use useLinkIntegrationConnection instead.'\n );\n return null;\n },\n []\n );\n\n return { complete, loading, error };\n}\n\n// ============================================================================\n// Hook: useLinkIntegrationConnection\n// Links a completed IntegrationConnection (from wspace-integrations-svc) to a\n// bot channel, creating/upserting a UserPlatformConnection on global-channel-svc.\n// Called by BotChannelsTab after the user returns from microfe-integrations with\n// ?integrationConnectionId=<id>&channelId=<id> in the URL.\n// Uses the generated LinkIntegrationConnectionDocument (schema-pulled + codegenned).\n// ============================================================================\n\ninterface UseLinkIntegrationConnectionResult {\n link: (\n integrationConnectionId: string,\n channelId: string\n ) => Promise<UserPlatformConnectionData | null>;\n loading: boolean;\n error: Error | null;\n}\n\nexport function useLinkIntegrationConnection(): UseLinkIntegrationConnectionResult {\n const globalClient = useGlobalApolloClient();\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const link = useCallback(\n async (\n integrationConnectionId: string,\n channelId: string\n ): Promise<UserPlatformConnectionData | null> => {\n setLoading(true);\n setError(null);\n try {\n const result = await globalClient.mutate<\n LinkIntegrationConnectionMutation,\n LinkIntegrationConnectionMutationVariables\n >({\n mutation: LinkIntegrationConnectionDocument,\n variables: { integrationConnectionId, channelId },\n });\n return (\n (result.data?.linkIntegrationConnection as\n | UserPlatformConnectionData\n | null\n | undefined) ?? null\n );\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [globalClient]\n );\n\n return { link, loading, error };\n}\n\n// ============================================================================\n// GQL document: getChannels (queried directly — no codegen needed)\n// ============================================================================\n\nconst GetChannelsDocument = gql`\n query GetChannels($filter: ChannelFilterInput, $pagination: ChannelPaginationInput) {\n getChannels(filter: $filter, pagination: $pagination) {\n items {\n id\n name\n platform\n adapterType\n channelType\n status\n isConnected\n description\n priority\n connectionHealth\n }\n total\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// Exported types: GlobalChannelData\n// ============================================================================\n\nexport interface GlobalChannelData {\n id: string;\n name: string;\n platform: ChannelPlatform;\n adapterType: AdapterType | null;\n channelType: ChannelType;\n status: ChannelStatus;\n isConnected: boolean;\n description?: string | null;\n priority: number;\n connectionHealth: string;\n}\n\ninterface GetChannelsQueryResult {\n getChannels: {\n items: GlobalChannelData[];\n total: number;\n hasMore: boolean;\n };\n}\n\n// ============================================================================\n// Hook: useGlobalChannels\n// Fetches all ACTIVE channels from global-channel-svc via the global GraphQL gateway\n// ============================================================================\n\ninterface UseGlobalChannelsResult {\n data: GlobalChannelData[];\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n/** Bot channels are the COMMUNICATION ones; the rest are not addressable here. */\nconst DEFAULT_CHANNEL_FILTER: ChannelFilterInput = {\n channelType: GlobalChannelType.Communication,\n};\nconst DEFAULT_CHANNEL_PAGINATION: ChannelPaginationInput = { offset: 0, limit: 50 };\n\nexport function useGlobalChannels(\n filter?: ChannelFilterInput,\n pagination?: ChannelPaginationInput\n): UseGlobalChannelsResult {\n const globalClient = useGlobalApolloClient();\n\n const [data, setData] = useState<GlobalChannelData[]>([]);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Stable references so useCallback doesn't re-create on every render. The\n // defaults are module constants, so an omitted argument yields the same\n // object every render without hiding the argument from the dependency list.\n const stableFilter = useMemo(() => filter ?? DEFAULT_CHANNEL_FILTER, [filter]);\n const stablePagination = useMemo(() => pagination ?? DEFAULT_CHANNEL_PAGINATION, [pagination]);\n\n const fetch = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await globalClient.query<GetChannelsQueryResult>({\n query: GetChannelsDocument,\n variables: { filter: stableFilter, pagination: stablePagination },\n fetchPolicy: 'network-only',\n });\n setData(result.data?.getChannels?.items ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [globalClient, stableFilter, stablePagination]);\n\n useEffect(() => {\n fetch();\n }, [fetch]);\n\n return { data, loading, error, refetch: fetch };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "./BotmanorRoot.js";
|
|
2
|
+
import "./providers/BotlitProvider.js";
|
|
3
|
+
import "./store/botlitStore.js";
|
|
4
|
+
import "./hooks/useBots.js";
|
|
5
|
+
import "./hooks/useAgents.js";
|
|
6
|
+
import "./hooks/useKnowledgeBases.js";
|
|
7
|
+
import "./hooks/useConversations.js";
|
|
8
|
+
import "./hooks/useLLMProviders.js";
|
|
9
|
+
import "./hooks/useMCPServers.js";
|
|
10
|
+
import "./utils/cn.js";
|
|
11
|
+
import "./utils/formatters.js";
|