@burdenoff/microfe-botmanor 2026.1109.1 → 2026.1110.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/botlit/BotlitRoutes.js +34 -45
  2. package/dist/botlit/BotlitRoutes.js.map +1 -1
  3. package/dist/botlit/components/Badge.js +2 -2
  4. package/dist/botlit/components/Badge.js.map +1 -1
  5. package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
  6. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
  7. package/dist/botlit/components/LoadMore.d.ts +9 -0
  8. package/dist/botlit/components/LoadMore.js +22 -0
  9. package/dist/botlit/components/LoadMore.js.map +1 -0
  10. package/dist/botlit/components/index.d.ts +1 -0
  11. package/dist/botlit/hooks/index.d.ts +1 -2
  12. package/dist/botlit/hooks/index.js +15 -16
  13. package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
  14. package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
  15. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  16. package/dist/botlit/hooks/useAgents.d.ts +2 -6
  17. package/dist/botlit/hooks/useAgents.js +71 -95
  18. package/dist/botlit/hooks/useAgents.js.map +1 -1
  19. package/dist/botlit/hooks/useBots.d.ts +2 -6
  20. package/dist/botlit/hooks/useBots.js +51 -75
  21. package/dist/botlit/hooks/useBots.js.map +1 -1
  22. package/dist/botlit/hooks/useBuckets.d.ts +5 -0
  23. package/dist/botlit/hooks/useBuckets.js +72 -38
  24. package/dist/botlit/hooks/useBuckets.js.map +1 -1
  25. package/dist/botlit/hooks/useExecutions.d.ts +2 -2
  26. package/dist/botlit/hooks/useExecutions.js +30 -34
  27. package/dist/botlit/hooks/useExecutions.js.map +1 -1
  28. package/dist/botlit/hooks/useStore.d.ts +3 -3
  29. package/dist/botlit/hooks/useStore.js +41 -50
  30. package/dist/botlit/hooks/useStore.js.map +1 -1
  31. package/dist/botlit/index.d.ts +0 -1
  32. package/dist/botlit/index.js +5 -6
  33. package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
  34. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  35. package/dist/botlit/pages/AgentDetailPage.js +1 -1
  36. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  37. package/dist/botlit/pages/AgentsListPage.js +157 -156
  38. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  39. package/dist/botlit/pages/BotChannelsTab.js +24 -24
  40. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  41. package/dist/botlit/pages/BotsListPage.js +147 -146
  42. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  43. package/dist/botlit/pages/BucketDetailPage.d.ts +2 -0
  44. package/dist/botlit/pages/BucketDetailPage.js +251 -0
  45. package/dist/botlit/pages/BucketDetailPage.js.map +1 -0
  46. package/dist/botlit/pages/BucketsPage.js +3 -3
  47. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  48. package/dist/botlit/pages/ChannelDetailPage.js +2 -2
  49. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  50. package/dist/botlit/pages/ExecutionsPage.js +141 -134
  51. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  52. package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
  53. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  54. package/dist/botlit/pages/MCPServersPage.js +1 -1
  55. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  56. package/dist/botlit/pages/SettingsPage.js +2 -2
  57. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  58. package/dist/botlit/pages/SkillDetailPage.js +1 -1
  59. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  60. package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
  61. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  62. package/dist/botlit/pages/StorePage.js +150 -143
  63. package/dist/botlit/pages/StorePage.js.map +1 -1
  64. package/dist/botlit/pages/index.d.ts +1 -2
  65. package/dist/generated/wspace-operations.js +67 -67
  66. package/dist/generated/wspace-operations.js.map +1 -1
  67. package/dist/index.js +5 -6
  68. package/package.json +1 -1
  69. package/dist/botlit/hooks/useConversations.d.ts +0 -42
  70. package/dist/botlit/hooks/useConversations.js +0 -63
  71. package/dist/botlit/hooks/useConversations.js.map +0 -1
  72. package/dist/botlit/pages/ConversationDetailPage.d.ts +0 -2
  73. package/dist/botlit/pages/ConversationsPage.d.ts +0 -2
@@ -1,9 +1,9 @@
1
- import { CreateBucketDocument as e, DeleteBucketDocument as t, ListBucketsDocument as n, UpdateBucketDocument as r } from "../../generated/wspace-operations.js";
2
- import { buildMutationInput as i, fieldsOf as a } from "./internal/mutationInput.js";
3
- import { useWorkspaceId as o, useWorkspaceMutation as s, useWorkspaceQuery as c } from "./internal/workspaceGateway.js";
4
- import { useCallback as l, useMemo as u } from "react";
1
+ import { CreateBucketDocument as e, DeleteBucketDocument as t, GetBucketDocument as n, ListBucketsDocument as r, UpdateBucketDocument as i } from "../../generated/wspace-operations.js";
2
+ import { buildMutationInput as a, fieldsOf as o } from "./internal/mutationInput.js";
3
+ import { useWorkspaceId as s, useWorkspaceMutation as c, useWorkspaceQuery as l } from "./internal/workspaceGateway.js";
4
+ import { useCallback as u, useMemo as d } from "react";
5
5
  // src/botlit/hooks/useBuckets.ts
6
- var d = 100, f = a({
6
+ var f = 100, p = o({
7
7
  color: !0,
8
8
  context: !0,
9
9
  description: !0,
@@ -13,7 +13,7 @@ var d = 100, f = a({
13
13
  parentBucketId: !0,
14
14
  slug: !0,
15
15
  workspaceId: !0
16
- }), p = a({
16
+ }), m = o({
17
17
  color: !0,
18
18
  context: !0,
19
19
  description: !0,
@@ -22,11 +22,14 @@ var d = 100, f = a({
22
22
  name: !0,
23
23
  parentBucketId: !0,
24
24
  slug: !0
25
- }), m = [], h = [];
26
- function g(e) {
27
- return e?.listBuckets ?? m;
28
- }
25
+ }), h = [], g = [];
29
26
  function _(e) {
27
+ return e?.listBuckets ?? h;
28
+ }
29
+ function v(e) {
30
+ return e?.getBucket ?? null;
31
+ }
32
+ function y(e) {
30
33
  let t = /* @__PURE__ */ new Map();
31
34
  for (let n of e) t.set(n.id, {
32
35
  ...n,
@@ -45,74 +48,105 @@ function _(e) {
45
48
  };
46
49
  return i(n), n;
47
50
  }
48
- function v(e) {
49
- let t = o(), r = e?.search, i = u(() => ({
51
+ function b(e) {
52
+ let t = s(), n = e?.search, i = d(() => ({
50
53
  filters: {
51
54
  workspaceId: t,
52
- search: r || void 0
55
+ search: n || void 0
53
56
  },
54
57
  pagination: {
55
- limit: d,
58
+ limit: f,
56
59
  offset: 0
57
60
  }
58
- }), [t, r]);
59
- return c({
60
- document: n,
61
+ }), [t, n]);
62
+ return l({
63
+ document: r,
61
64
  variables: i,
62
- select: g,
63
- fallback: m,
65
+ select: _,
66
+ fallback: h,
64
67
  enabled: !!t,
65
68
  errorMessage: "Failed to load buckets"
66
69
  });
67
70
  }
68
- function y() {
69
- let e = o(), t = u(() => ({
71
+ function x() {
72
+ let e = s(), t = d(() => ({
70
73
  filters: { workspaceId: e },
71
74
  pagination: {
72
- limit: d,
75
+ limit: f,
73
76
  offset: 0
74
77
  }
75
- }), [e]), r = l((e) => _(e?.listBuckets ?? m), []);
76
- return c({
77
- document: n,
78
+ }), [e]), n = u((e) => y(e?.listBuckets ?? h), []);
79
+ return l({
80
+ document: r,
78
81
  variables: t,
79
- select: r,
80
- fallback: h,
82
+ select: n,
83
+ fallback: g,
81
84
  enabled: !!e,
82
85
  errorMessage: "Failed to load the bucket tree"
83
86
  });
84
87
  }
85
- function b() {
86
- let t = o(), n = l((e) => ({ input: i({
88
+ function S(e) {
89
+ let t = s(), n = d(() => ({
90
+ filters: {
91
+ workspaceId: t,
92
+ parentBucketId: e ?? ""
93
+ },
94
+ pagination: {
95
+ limit: f,
96
+ offset: 0
97
+ }
98
+ }), [t, e]);
99
+ return l({
100
+ document: r,
101
+ variables: n,
102
+ select: _,
103
+ fallback: h,
104
+ enabled: !!(t && e),
105
+ errorMessage: "Failed to load sub-buckets"
106
+ });
107
+ }
108
+ function C(e) {
109
+ let t = d(() => ({ id: e ?? "" }), [e]);
110
+ return l({
111
+ document: n,
112
+ variables: t,
113
+ select: v,
114
+ fallback: null,
115
+ enabled: !!e,
116
+ errorMessage: "Failed to load bucket"
117
+ });
118
+ }
119
+ function w() {
120
+ let t = s(), n = u((e) => ({ input: a({
87
121
  ...e,
88
122
  workspaceId: t
89
- }, f) }), [t]);
90
- return s({
123
+ }, p) }), [t]);
124
+ return c({
91
125
  document: e,
92
126
  variables: n,
93
127
  select: (e) => e?.createBucket,
94
128
  errorMessage: "Failed to create bucket"
95
129
  });
96
130
  }
97
- function x() {
98
- return s({
99
- document: r,
131
+ function T() {
132
+ return c({
133
+ document: i,
100
134
  variables: ({ bucketId: e, input: t }) => ({
101
135
  id: e,
102
- input: i(t, p)
136
+ input: a(t, m)
103
137
  }),
104
138
  select: (e) => e?.updateBucket,
105
139
  errorMessage: "Failed to update bucket"
106
140
  });
107
141
  }
108
- function S() {
109
- return s({
142
+ function E() {
143
+ return c({
110
144
  document: t,
111
145
  variables: (e) => ({ id: e }),
112
146
  select: (e) => e?.deleteBucket,
113
147
  errorMessage: "Failed to delete bucket"
114
148
  });
115
149
  }
116
- export { _ as buildBucketTree, y as useBucketTree, v as useBuckets, b as useCreateBucket, S as useDeleteBucket, x as useUpdateBucket };
150
+ export { y as buildBucketTree, C as useBucket, x as useBucketTree, b as useBuckets, S as useChildBuckets, w as useCreateBucket, E as useDeleteBucket, T as useUpdateBucket };
117
151
 
118
152
  //# sourceMappingURL=useBuckets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBuckets.js","names":["LIST_LIMIT","CREATE_BUCKET_FIELDS","fieldsOf","UPDATE_BUCKET_FIELDS","NO_BUCKETS","NO_BUCKET_TREE","selectBuckets","data","buildBucketTree","nodes","bucket","buckets","roots","node","parent","byName","a","b","sortRecursively","child","list","useBuckets","workspaceId","useWorkspaceId","search","filter","variables","useMemo","useWorkspaceQuery","ListBucketsDocument","useBucketTree","select","useCallback","useCreateBucket","buildMutationInput","input","useWorkspaceMutation","CreateBucketDocument","useUpdateBucket","UpdateBucketDocument","bucketId","useDeleteBucket","DeleteBucketDocument"],"sources":["../../../src/botlit/hooks/useBuckets.ts"],"sourcesContent":["/**\n * Buckets Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listBuckets` / `getBucket` / `createBucket` / `updateBucket`\n * / `deleteBucket` operations on wspace-botlit-svc.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n CreateBucketDocument,\n DeleteBucketDocument,\n GetBucketDocument,\n ListBucketsDocument,\n UpdateBucketDocument,\n type CreateBucketMutation,\n type DeleteBucketMutation,\n type GetBucketQuery,\n type ListBucketsQuery,\n type UpdateBucketMutation,\n} from '../../generated/wspace-operations';\nimport type { CreateBucketInput, UpdateBucketInput } from '../../generated/wspace-types';\nimport type { BaseFilter } from '../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 BucketRecord {\n id: string;\n name: string;\n slug: string;\n path: string;\n description?: string | null;\n color?: string | null;\n icon?: string | null;\n parentBucketId?: string | null;\n metadata?: Record<string, unknown> | null;\n deletedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n createdById: string;\n updatedById: string;\n workspaceId: string;\n}\n\n/** A bucket plus its resolved children — the shape the tree view renders. */\nexport interface BucketTreeNode extends BucketRecord {\n children: BucketTreeNode[];\n}\n\n/**\n * `CreateBucketInput` minus the `workspaceId`/`context` the hook supplies.\n */\nexport type CreateBucketVariables = Omit<\n GraphQLInput<CreateBucketInput>,\n 'workspaceId' | 'context'\n>;\n\nexport interface UpdateBucketVariables {\n bucketId: string;\n input: GraphQLInput<UpdateBucketInput>;\n}\n\nconst CREATE_BUCKET_FIELDS = fieldsOf<CreateBucketInput>({\n color: true,\n context: true,\n description: true,\n icon: true,\n metadata: true,\n name: true,\n parentBucketId: true,\n slug: true,\n workspaceId: true,\n});\n\nconst UPDATE_BUCKET_FIELDS = fieldsOf<UpdateBucketInput>({\n color: true,\n context: true,\n description: true,\n icon: true,\n metadata: true,\n name: true,\n parentBucketId: true,\n slug: true,\n});\n\nconst NO_BUCKETS: BucketRecord[] = [];\nconst NO_BUCKET_TREE: BucketTreeNode[] = [];\n\nfunction selectBuckets(data: ListBucketsQuery | undefined): BucketRecord[] {\n return data?.listBuckets ?? NO_BUCKETS;\n}\n\nfunction selectBucket(data: GetBucketQuery | undefined): BucketRecord | null {\n return data?.getBucket ?? null;\n}\n\n/**\n * Builds the parent → children tree. Buckets whose parent is not in the result\n * set (filtered out, or not readable) are surfaced at the root rather than\n * silently dropped.\n */\nexport function buildBucketTree(buckets: readonly BucketRecord[]): BucketTreeNode[] {\n const nodes = new Map<string, BucketTreeNode>();\n for (const bucket of buckets) {\n nodes.set(bucket.id, { ...bucket, children: [] });\n }\n\n const roots: BucketTreeNode[] = [];\n for (const bucket of buckets) {\n const node = nodes.get(bucket.id);\n if (!node) continue;\n const parent = bucket.parentBucketId ? nodes.get(bucket.parentBucketId) : undefined;\n if (parent && parent !== node) {\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n const byName = (a: BucketTreeNode, b: BucketTreeNode) => a.name.localeCompare(b.name);\n const sortRecursively = (list: BucketTreeNode[]) => {\n list.sort(byName);\n for (const child of list) sortRecursively(child.children);\n };\n sortRecursively(roots);\n\n return roots;\n}\n\nexport const bucketKeys = {\n all: ['buckets'] as const,\n lists: () => [...bucketKeys.all, 'list'] as const,\n list: (filter?: BaseFilter) => [...bucketKeys.lists(), filter] as const,\n tree: () => [...bucketKeys.all, 'tree'] as const,\n details: () => [...bucketKeys.all, 'detail'] as const,\n detail: (id: string) => [...bucketKeys.details(), id] as const,\n};\n\nexport function useBuckets(filter?: BaseFilter): QueryResult<BucketRecord[]> {\n const workspaceId = useWorkspaceId();\n const search = filter?.search;\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId, search: search || undefined },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId, search]\n );\n\n return useWorkspaceQuery<ListBucketsQuery, BucketRecord[]>({\n document: ListBucketsDocument,\n variables,\n select: selectBuckets,\n fallback: NO_BUCKETS,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load buckets',\n });\n}\n\n/**\n * The bucket hierarchy. Derived from `listBuckets` — the service exposes the\n * parent link on every bucket, so no separate tree operation is needed.\n */\nexport function useBucketTree(): QueryResult<BucketTreeNode[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n const select = useCallback(\n (data: ListBucketsQuery | undefined) => buildBucketTree(data?.listBuckets ?? NO_BUCKETS),\n []\n );\n\n return useWorkspaceQuery<ListBucketsQuery, BucketTreeNode[]>({\n document: ListBucketsDocument,\n variables,\n select,\n fallback: NO_BUCKET_TREE,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load the bucket tree',\n });\n}\n\nexport function useBucket(bucketId: string | undefined): QueryResult<BucketRecord | null> {\n const variables = useMemo(() => ({ id: bucketId ?? '' }), [bucketId]);\n\n return useWorkspaceQuery<GetBucketQuery, BucketRecord | null>({\n document: GetBucketDocument,\n variables,\n select: selectBucket,\n fallback: null,\n enabled: Boolean(bucketId),\n errorMessage: 'Failed to load bucket',\n });\n}\n\nexport function useCreateBucket() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: CreateBucketVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, CREATE_BUCKET_FIELDS),\n }),\n [workspaceId]\n );\n\n return useWorkspaceMutation<CreateBucketMutation, CreateBucketVariables, BucketRecord>({\n document: CreateBucketDocument,\n variables,\n select: (data) => data?.createBucket,\n errorMessage: 'Failed to create bucket',\n });\n}\n\nexport function useUpdateBucket() {\n return useWorkspaceMutation<UpdateBucketMutation, UpdateBucketVariables, BucketRecord>({\n document: UpdateBucketDocument,\n variables: ({ bucketId, input }) => ({\n id: bucketId,\n input: buildMutationInput(input, UPDATE_BUCKET_FIELDS),\n }),\n select: (data) => data?.updateBucket,\n errorMessage: 'Failed to update bucket',\n });\n}\n\nexport function useDeleteBucket() {\n return useWorkspaceMutation<DeleteBucketMutation, string, boolean>({\n document: DeleteBucketDocument,\n variables: (bucketId) => ({ id: bucketId }),\n select: (data) => data?.deleteBucket,\n errorMessage: 'Failed to delete bucket',\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useBuckets.js","names":["LIST_LIMIT","CREATE_BUCKET_FIELDS","fieldsOf","UPDATE_BUCKET_FIELDS","NO_BUCKETS","NO_BUCKET_TREE","selectBuckets","data","selectBucket","buildBucketTree","nodes","bucket","buckets","roots","node","parent","byName","a","b","sortRecursively","child","list","useBuckets","workspaceId","useWorkspaceId","search","filter","variables","useMemo","useWorkspaceQuery","ListBucketsDocument","useBucketTree","select","useCallback","useChildBuckets","parentBucketId","useBucket","bucketId","GetBucketDocument","useCreateBucket","buildMutationInput","input","useWorkspaceMutation","CreateBucketDocument","useUpdateBucket","UpdateBucketDocument","useDeleteBucket","DeleteBucketDocument"],"sources":["../../../src/botlit/hooks/useBuckets.ts"],"sourcesContent":["/**\n * Buckets Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listBuckets` / `getBucket` / `createBucket` / `updateBucket`\n * / `deleteBucket` operations on wspace-botlit-svc.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n CreateBucketDocument,\n DeleteBucketDocument,\n GetBucketDocument,\n ListBucketsDocument,\n UpdateBucketDocument,\n type CreateBucketMutation,\n type DeleteBucketMutation,\n type GetBucketQuery,\n type ListBucketsQuery,\n type UpdateBucketMutation,\n} from '../../generated/wspace-operations';\nimport type { CreateBucketInput, UpdateBucketInput } from '../../generated/wspace-types';\nimport type { BaseFilter } from '../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 BucketRecord {\n id: string;\n name: string;\n slug: string;\n path: string;\n description?: string | null;\n color?: string | null;\n icon?: string | null;\n parentBucketId?: string | null;\n metadata?: Record<string, unknown> | null;\n deletedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n createdById: string;\n updatedById: string;\n workspaceId: string;\n}\n\n/** A bucket plus its resolved children — the shape the tree view renders. */\nexport interface BucketTreeNode extends BucketRecord {\n children: BucketTreeNode[];\n}\n\n/**\n * `CreateBucketInput` minus the `workspaceId`/`context` the hook supplies.\n */\nexport type CreateBucketVariables = Omit<\n GraphQLInput<CreateBucketInput>,\n 'workspaceId' | 'context'\n>;\n\nexport interface UpdateBucketVariables {\n bucketId: string;\n input: GraphQLInput<UpdateBucketInput>;\n}\n\nconst CREATE_BUCKET_FIELDS = fieldsOf<CreateBucketInput>({\n color: true,\n context: true,\n description: true,\n icon: true,\n metadata: true,\n name: true,\n parentBucketId: true,\n slug: true,\n workspaceId: true,\n});\n\nconst UPDATE_BUCKET_FIELDS = fieldsOf<UpdateBucketInput>({\n color: true,\n context: true,\n description: true,\n icon: true,\n metadata: true,\n name: true,\n parentBucketId: true,\n slug: true,\n});\n\nconst NO_BUCKETS: BucketRecord[] = [];\nconst NO_BUCKET_TREE: BucketTreeNode[] = [];\n\nfunction selectBuckets(data: ListBucketsQuery | undefined): BucketRecord[] {\n return data?.listBuckets ?? NO_BUCKETS;\n}\n\nfunction selectBucket(data: GetBucketQuery | undefined): BucketRecord | null {\n return data?.getBucket ?? null;\n}\n\n/**\n * Builds the parent → children tree. Buckets whose parent is not in the result\n * set (filtered out, or not readable) are surfaced at the root rather than\n * silently dropped.\n */\nexport function buildBucketTree(buckets: readonly BucketRecord[]): BucketTreeNode[] {\n const nodes = new Map<string, BucketTreeNode>();\n for (const bucket of buckets) {\n nodes.set(bucket.id, { ...bucket, children: [] });\n }\n\n const roots: BucketTreeNode[] = [];\n for (const bucket of buckets) {\n const node = nodes.get(bucket.id);\n if (!node) continue;\n const parent = bucket.parentBucketId ? nodes.get(bucket.parentBucketId) : undefined;\n if (parent && parent !== node) {\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n const byName = (a: BucketTreeNode, b: BucketTreeNode) => a.name.localeCompare(b.name);\n const sortRecursively = (list: BucketTreeNode[]) => {\n list.sort(byName);\n for (const child of list) sortRecursively(child.children);\n };\n sortRecursively(roots);\n\n return roots;\n}\n\nexport const bucketKeys = {\n all: ['buckets'] as const,\n lists: () => [...bucketKeys.all, 'list'] as const,\n list: (filter?: BaseFilter) => [...bucketKeys.lists(), filter] as const,\n tree: () => [...bucketKeys.all, 'tree'] as const,\n details: () => [...bucketKeys.all, 'detail'] as const,\n detail: (id: string) => [...bucketKeys.details(), id] as const,\n};\n\nexport function useBuckets(filter?: BaseFilter): QueryResult<BucketRecord[]> {\n const workspaceId = useWorkspaceId();\n const search = filter?.search;\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId, search: search || undefined },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId, search]\n );\n\n return useWorkspaceQuery<ListBucketsQuery, BucketRecord[]>({\n document: ListBucketsDocument,\n variables,\n select: selectBuckets,\n fallback: NO_BUCKETS,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load buckets',\n });\n}\n\n/**\n * The bucket hierarchy. Derived from `listBuckets` — the service exposes the\n * parent link on every bucket, so no separate tree operation is needed.\n */\nexport function useBucketTree(): QueryResult<BucketTreeNode[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n const select = useCallback(\n (data: ListBucketsQuery | undefined) => buildBucketTree(data?.listBuckets ?? NO_BUCKETS),\n []\n );\n\n return useWorkspaceQuery<ListBucketsQuery, BucketTreeNode[]>({\n document: ListBucketsDocument,\n variables,\n select,\n fallback: NO_BUCKET_TREE,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load the bucket tree',\n });\n}\n\n/**\n * Direct children of one bucket, resolved via the `parentBucketId` filter on\n * `listBuckets`. Powers the sub-bucket section of the bucket detail page.\n */\nexport function useChildBuckets(parentBucketId: string | undefined): QueryResult<BucketRecord[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId, parentBucketId: parentBucketId ?? '' },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId, parentBucketId]\n );\n\n return useWorkspaceQuery<ListBucketsQuery, BucketRecord[]>({\n document: ListBucketsDocument,\n variables,\n select: selectBuckets,\n fallback: NO_BUCKETS,\n enabled: Boolean(workspaceId && parentBucketId),\n errorMessage: 'Failed to load sub-buckets',\n });\n}\n\nexport function useBucket(bucketId: string | undefined): QueryResult<BucketRecord | null> {\n const variables = useMemo(() => ({ id: bucketId ?? '' }), [bucketId]);\n\n return useWorkspaceQuery<GetBucketQuery, BucketRecord | null>({\n document: GetBucketDocument,\n variables,\n select: selectBucket,\n fallback: null,\n enabled: Boolean(bucketId),\n errorMessage: 'Failed to load bucket',\n });\n}\n\nexport function useCreateBucket() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: CreateBucketVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, CREATE_BUCKET_FIELDS),\n }),\n [workspaceId]\n );\n\n return useWorkspaceMutation<CreateBucketMutation, CreateBucketVariables, BucketRecord>({\n document: CreateBucketDocument,\n variables,\n select: (data) => data?.createBucket,\n errorMessage: 'Failed to create bucket',\n });\n}\n\nexport function useUpdateBucket() {\n return useWorkspaceMutation<UpdateBucketMutation, UpdateBucketVariables, BucketRecord>({\n document: UpdateBucketDocument,\n variables: ({ bucketId, input }) => ({\n id: bucketId,\n input: buildMutationInput(input, UPDATE_BUCKET_FIELDS),\n }),\n select: (data) => data?.updateBucket,\n errorMessage: 'Failed to update bucket',\n });\n}\n\nexport function useDeleteBucket() {\n return useWorkspaceMutation<DeleteBucketMutation, string, boolean>({\n document: DeleteBucketDocument,\n variables: (bucketId) => ({ id: bucketId }),\n select: (data) => data?.deleteBucket,\n errorMessage: 'Failed to delete bucket',\n });\n}\n"],"mappings":";;;;;AA+BA,IAAMA,IAAa,KAsCbC,IAAuBC,EAA4B;CACvD,OAAO;CACP,SAAS;CACT,aAAa;CACb,MAAM;CACN,UAAU;CACV,MAAM;CACN,gBAAgB;CAChB,MAAM;CACN,aAAa;AACf,CAAC,GAEKC,IAAuBD,EAA4B;CACvD,OAAO;CACP,SAAS;CACT,aAAa;CACb,MAAM;CACN,UAAU;CACV,MAAM;CACN,gBAAgB;CAChB,MAAM;AACR,CAAC,GAEKE,IAA6B,CAAC,GAC9BC,IAAmC,CAAC;AAE1C,SAASC,EAAc,GAAoD;CACzE,OAAOC,GAAM,eAAeH;AAC9B;AAEA,SAASI,EAAa,GAAuD;CAC3E,OAAOD,GAAM,aAAa;AAC5B;AAOA,SAAgBE,EAAgB,GAAoD;CAClF,IAAMC,oBAAQ,IAAI,IAA4B;CAC9C,KAAK,IAAMC,KAAUC,GACnB,EAAM,IAAID,EAAO,IAAI;EAAE,GAAGA;EAAQ,UAAU,CAAC;CAAE,CAAC;CAGlD,IAAME,IAA0B,CAAC;CACjC,KAAK,IAAMF,KAAUC,GAAS;EAC5B,IAAME,IAAOJ,EAAM,IAAIC,EAAO,EAAE;EAChC,IAAI,CAACG,GAAM;EACX,IAAMC,IAASJ,EAAO,iBAAiBD,EAAM,IAAIC,EAAO,cAAc,IAAI,KAAA;EAC1E,AAAII,KAAUA,MAAWD,IACvBC,EAAO,SAAS,KAAKD,CAAI,IAEzBD,EAAM,KAAKC,CAAI;CAEnB;CAEA,IAAME,KAAU,GAAmB,MAAsBC,EAAE,KAAK,cAAcC,EAAE,IAAI,GAC9EC,KAAmB,MAA2B;EAClD,EAAK,KAAKH,CAAM;EAChB,KAAK,IAAMI,KAASC,GAAM,EAAgBD,EAAM,QAAQ;CAC1D;CAGA,OAFAD,EAAgBN,CAAK,GAEdA;AACT;AAWA,SAAgBS,EAAW,GAAkD;CAC3E,IAAMC,IAAcC,EAAe,GAC7BC,IAASC,GAAQ,QAEjBC,IAAYC,SACT;EACL,SAAS;GAAE;GAAa,QAAQH,KAAU,KAAA;EAAU;EACpD,YAAY;GAAE,OAAOzB;GAAY,QAAQ;EAAE;CAC7C,IACA,CAACuB,GAAaE,CAAM,CACtB;CAEA,OAAOI,EAAoD;EACzD,UAAUC;EACV;EACA,QAAQxB;EACR,UAAUF;EACV,SAAS,EAAQmB;EACjB,cAAc;CAChB,CAAC;AACH;AAMA,SAAgBQ,IAA+C;CAC7D,IAAMR,IAAcC,EAAe,GAE7BG,IAAYC,SACT;EACL,SAAS,EAAE,eAAY;EACvB,YAAY;GAAE,OAAO5B;GAAY,QAAQ;EAAE;CAC7C,IACA,CAACuB,CAAW,CACd,GAEMS,IAASC,GACZ,MAAuCxB,EAAgBF,GAAM,eAAeH,CAAU,GACvF,CAAC,CACH;CAEA,OAAOyB,EAAsD;EAC3D,UAAUC;EACV;EACA;EACA,UAAUzB;EACV,SAAS,EAAQkB;EACjB,cAAc;CAChB,CAAC;AACH;AAMA,SAAgBW,EAAgB,GAAiE;CAC/F,IAAMX,IAAcC,EAAe,GAE7BG,IAAYC,SACT;EACL,SAAS;GAAE;GAAa,gBAAgBO,KAAkB;EAAG;EAC7D,YAAY;GAAE,OAAOnC;GAAY,QAAQ;EAAE;CAC7C,IACA,CAACuB,GAAaY,CAAc,CAC9B;CAEA,OAAON,EAAoD;EACzD,UAAUC;EACV;EACA,QAAQxB;EACR,UAAUF;EACV,SAAS,GAAQmB,KAAeY;EAChC,cAAc;CAChB,CAAC;AACH;AAEA,SAAgBC,EAAU,GAAgE;CACxF,IAAMT,IAAYC,SAAe,EAAE,IAAIS,KAAY,GAAG,IAAI,CAACA,CAAQ,CAAC;CAEpE,OAAOR,EAAuD;EAC5D,UAAUS;EACV;EACA,QAAQ9B;EACR,UAAU;EACV,SAAS,EAAQ6B;EACjB,cAAc;CAChB,CAAC;AACH;AAEA,SAAgBE,IAAkB;CAChC,IAAMhB,IAAcC,EAAe,GAE7BG,IAAYM,GACf,OAAkC,EACjC,OAAOO,EAAmB;EAAE,GAAGC;EAAO;CAAY,GAAGxC,CAAoB,EAC3E,IACA,CAACsB,CAAW,CACd;CAEA,OAAOmB,EAAgF;EACrF,UAAUC;EACV;EACA,SAAS,MAASpC,GAAM;EACxB,cAAc;CAChB,CAAC;AACH;AAEA,SAAgBqC,IAAkB;CAChC,OAAOF,EAAgF;EACrF,UAAUG;EACV,YAAY,EAAE,aAAU,gBAAa;GACnC,IAAIR;GACJ,OAAOG,EAAmBC,GAAOtC,CAAoB;EACvD;EACA,SAAS,MAASI,GAAM;EACxB,cAAc;CAChB,CAAC;AACH;AAEA,SAAgBuC,IAAkB;CAChC,OAAOJ,EAA4D;EACjE,UAAUK;EACV,YAAY,OAAc,EAAE,IAAIV,EAAS;EACzC,SAAS,MAAS9B,GAAM;EACxB,cAAc;CAChB,CAAC;AACH"}
@@ -1,6 +1,6 @@
1
1
  import { CreateExecutionInput, ExecutionStatus } from '../../generated/wspace-types';
2
2
  import { GraphQLInput } from './internal/mutationInput';
3
- import { QueryResult } from './internal/workspaceGateway';
3
+ import { PaginatedQueryResult, QueryResult } from './internal/workspaceGateway';
4
4
  export interface ExecutionRecord {
5
5
  id: string;
6
6
  status: string;
@@ -61,7 +61,7 @@ export declare const executionKeys: {
61
61
  detail: (id: string) => readonly ["executions", "detail", string];
62
62
  metrics: () => readonly ["executions", "metrics"];
63
63
  };
64
- export declare function useExecutions(filter?: ExecutionsFilter): QueryResult<ExecutionRecord[]>;
64
+ export declare function useExecutions(filter?: ExecutionsFilter): PaginatedQueryResult<ExecutionRecord[]>;
65
65
  export declare function useExecution(executionId: string | undefined): QueryResult<ExecutionRecord | null>;
66
66
  /**
67
67
  * Token/cost metrics for the workspace, optionally narrowed to an agent, app or
@@ -1,9 +1,9 @@
1
1
  import { CreateExecutionDocument as e, GetExecutionDocument as t, ListExecutionsDocument as n } from "../../generated/wspace-operations.js";
2
2
  import { buildMutationInput as r, fieldsOf as i } from "./internal/mutationInput.js";
3
- import { useWorkspaceId as a, useWorkspaceMutation as o, useWorkspaceQuery as s } from "./internal/workspaceGateway.js";
4
- import { useCallback as c, useMemo as l } from "react";
3
+ import { useWorkspaceId as a, useWorkspaceMutation as o, useWorkspacePaginatedQuery as s, useWorkspaceQuery as c } from "./internal/workspaceGateway.js";
4
+ import { useCallback as l, useMemo as u } from "react";
5
5
  // src/botlit/hooks/useExecutions.ts
6
- var u = 100, d = i({
6
+ var d = 100, f = i({
7
7
  agentId: !0,
8
8
  appId: !0,
9
9
  conversationId: !0,
@@ -11,47 +11,43 @@ var u = 100, d = i({
11
11
  metadata: !0,
12
12
  type: !0,
13
13
  workspaceId: !0
14
- }), f = /* @__PURE__ */ new Set(["COMPLETED"]), p = [];
15
- function m(e, t) {
14
+ }), p = /* @__PURE__ */ new Set(["COMPLETED"]), m = [];
15
+ function h(e, t) {
16
16
  return e.id.toLowerCase().includes(t) || (e.agentId ?? "").toLowerCase().includes(t) || (e.appId ?? "").toLowerCase().includes(t) || e.input.toLowerCase().includes(t);
17
17
  }
18
- function h(e) {
19
- let t = a(), r = e?.search?.trim().toLowerCase() ?? "", i = e?.status, o = i?.length === 1 ? i[0] : void 0, d = i?.join(",") ?? "", { agentId: f, appId: h, conversationId: g, type: _ } = e ?? {}, v = l(() => ({
20
- filters: {
21
- workspaceId: t,
22
- status: o,
23
- agentId: f,
24
- appId: h,
25
- conversationId: g,
26
- type: _
27
- },
28
- pagination: {
29
- limit: u,
30
- offset: 0
31
- }
32
- }), [
18
+ function g(e) {
19
+ let t = a(), r = e?.search?.trim().toLowerCase() ?? "", i = e?.status, o = i?.length === 1 ? i[0] : void 0, c = i?.join(",") ?? "", { agentId: f, appId: p, conversationId: g, type: _ } = e ?? {}, v = u(() => ({ filters: {
20
+ workspaceId: t,
21
+ status: o,
22
+ agentId: f,
23
+ appId: p,
24
+ conversationId: g,
25
+ type: _
26
+ } }), [
33
27
  t,
34
28
  o,
35
29
  f,
36
- h,
30
+ p,
37
31
  g,
38
32
  _
39
- ]), y = c((e) => {
40
- let t = e?.listExecutions ?? p, n = d ? new Set(d.split(",")) : void 0, i = n && n.size > 1 ? t.filter((e) => n.has(e.status)) : t;
41
- return r ? i.filter((e) => m(e, r)) : i;
42
- }, [r, d]);
33
+ ]), y = l((e) => {
34
+ let t = c ? new Set(c.split(",")) : void 0, n = t && t.size > 1 ? e.filter((e) => t.has(e.status)) : e;
35
+ return r ? n.filter((e) => h(e, r)) : n;
36
+ }, [r, c]);
43
37
  return s({
44
38
  document: n,
45
39
  variables: v,
40
+ pageSize: d,
41
+ extractRows: (e) => e?.listExecutions ?? m,
46
42
  select: y,
47
- fallback: p,
43
+ fallback: m,
48
44
  enabled: !!t,
49
45
  errorMessage: "Failed to load executions"
50
46
  });
51
47
  }
52
- function g(e) {
53
- let n = l(() => ({ id: e ?? "" }), [e]);
54
- return s({
48
+ function _(e) {
49
+ let n = u(() => ({ id: e ?? "" }), [e]);
50
+ return c({
55
51
  document: t,
56
52
  variables: n,
57
53
  select: (e) => e?.getExecution ?? null,
@@ -60,9 +56,9 @@ function g(e) {
60
56
  errorMessage: "Failed to load execution"
61
57
  });
62
58
  }
63
- function _(e) {
59
+ function v(e) {
64
60
  let t = e.length, n = 0, r = 0, i = 0, a = 0, o = 0, s = 0;
65
- for (let t of e) f.has(t.status) && (n += 1), (t.status === "FAILED" || t.status === "TIMEOUT") && (r += 1), typeof t.duration == "number" && (i += t.duration, a += 1), o += t.cost ?? 0, s += t.tokensUsed ?? 0;
61
+ for (let t of e) p.has(t.status) && (n += 1), (t.status === "FAILED" || t.status === "TIMEOUT") && (r += 1), typeof t.duration == "number" && (i += t.duration, a += 1), o += t.cost ?? 0, s += t.tokensUsed ?? 0;
66
62
  return {
67
63
  total: t,
68
64
  succeeded: n,
@@ -73,14 +69,14 @@ function _(e) {
73
69
  totalTokens: s
74
70
  };
75
71
  }
76
- function v() {
72
+ function y() {
77
73
  return o({
78
74
  document: e,
79
- variables: ({ input: e }) => ({ input: r(e, d) }),
75
+ variables: ({ input: e }) => ({ input: r(e, f) }),
80
76
  select: (e) => e?.createExecution,
81
77
  errorMessage: "Failed to start execution"
82
78
  });
83
79
  }
84
- export { _ as summariseExecutions, v as useCreateExecution, g as useExecution, h as useExecutions };
80
+ export { v as summariseExecutions, y as useCreateExecution, _ as useExecution, g as useExecutions };
85
81
 
86
82
  //# sourceMappingURL=useExecutions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useExecutions.js","names":["LIST_LIMIT","CREATE_EXECUTION_FIELDS","fieldsOf","SUCCESS_STATUSES","NO_EXECUTIONS","matchesSearch","execution","needle","useExecutions","workspaceId","useWorkspaceId","search","filter","statuses","singleStatus","statusKey","variables","useMemo","agentId","appId","conversationId","type","select","useCallback","rows","data","wanted","narrowed","row","useWorkspaceQuery","ListExecutionsDocument","useExecution","executionId","GetExecutionDocument","summariseExecutions","total","executions","succeeded","failed","durationSum","durationCount","totalCost","totalTokens","useCreateExecution","useWorkspaceMutation","CreateExecutionDocument","buildMutationInput","input"],"sources":["../../../src/botlit/hooks/useExecutions.ts"],"sourcesContent":["/**\n * Executions Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listExecutions` / `getExecution` / `getExecutionMetrics`\n * operations plus the `createExecution` / `updateExecutionStatus` mutations on\n * wspace-botlit-svc.\n *\n * Note on filtering: `ExecutionFilterInput` accepts a SINGLE status and has no\n * free-text field, so multi-status selections and search are narrowed on the\n * client over the fetched page.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n CreateExecutionDocument,\n GetExecutionDocument,\n GetExecutionMetricsDocument,\n ListExecutionsDocument,\n UpdateExecutionStatusDocument,\n type CreateExecutionMutation,\n type GetExecutionMetricsQuery,\n type GetExecutionQuery,\n type ListExecutionsQuery,\n type UpdateExecutionStatusMutation,\n} from '../../generated/wspace-operations';\nimport type { CreateExecutionInput, ExecutionStatus } 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 ExecutionRecord {\n id: string;\n status: string;\n type: string;\n input: string;\n output?: string | null;\n agentId?: string | null;\n appId?: string | null;\n conversationId?: string | null;\n cost?: number | null;\n duration?: number | null;\n tokensUsed?: number | null;\n errorCode?: string | null;\n errorMessage?: string | null;\n errorDetails?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n completedAt?: string | null;\n createdAt: string;\n workspaceId: string;\n}\n\nexport interface ExecutionMetricsRecord {\n executionId: string;\n cost: number;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n ragChunks: number;\n toolCalls: number;\n}\n\nexport interface ExecutionsFilter {\n search?: string;\n status?: string[];\n agentId?: string;\n appId?: string;\n conversationId?: string;\n type?: string;\n}\n\nexport interface ExecutionMetricsFilter {\n agentId?: string;\n appId?: string;\n startDate?: string;\n endDate?: string;\n}\n\nexport interface CreateExecutionVariables {\n input: GraphQLInput<CreateExecutionInput>;\n}\n\nconst CREATE_EXECUTION_FIELDS = fieldsOf<CreateExecutionInput>({\n agentId: true,\n appId: true,\n conversationId: true,\n input: true,\n metadata: true,\n type: true,\n workspaceId: true,\n});\n\nexport interface UpdateExecutionStatusVariables {\n id: string;\n status: ExecutionStatus;\n output?: string;\n error?: Record<string, unknown>;\n}\n\n/** Terminal statuses that count as a successful run. */\nconst SUCCESS_STATUSES = new Set(['COMPLETED']);\n\nconst NO_EXECUTIONS: ExecutionRecord[] = [];\n\nexport const executionKeys = {\n all: ['executions'] as const,\n lists: () => [...executionKeys.all, 'list'] as const,\n list: (filter?: ExecutionsFilter) => [...executionKeys.lists(), filter] as const,\n details: () => [...executionKeys.all, 'detail'] as const,\n detail: (id: string) => [...executionKeys.details(), id] as const,\n metrics: () => [...executionKeys.all, 'metrics'] as const,\n};\n\nfunction matchesSearch(execution: ExecutionRecord, needle: string): boolean {\n return (\n execution.id.toLowerCase().includes(needle) ||\n (execution.agentId ?? '').toLowerCase().includes(needle) ||\n (execution.appId ?? '').toLowerCase().includes(needle) ||\n execution.input.toLowerCase().includes(needle)\n );\n}\n\nexport function useExecutions(filter?: ExecutionsFilter): QueryResult<ExecutionRecord[]> {\n const workspaceId = useWorkspaceId();\n const search = filter?.search?.trim().toLowerCase() ?? '';\n const statuses = filter?.status;\n const singleStatus = statuses?.length === 1 ? statuses[0] : undefined;\n const statusKey = statuses?.join(',') ?? '';\n const { agentId, appId, conversationId, type } = filter ?? {};\n\n const variables = useMemo(\n () => ({\n filters: {\n workspaceId,\n status: singleStatus,\n agentId,\n appId,\n conversationId,\n type,\n },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId, singleStatus, agentId, appId, conversationId, type]\n );\n\n const select = useCallback(\n (data: ListExecutionsQuery | undefined): ExecutionRecord[] => {\n const rows: ExecutionRecord[] = data?.listExecutions ?? NO_EXECUTIONS;\n const wanted = statusKey ? new Set(statusKey.split(',')) : undefined;\n const narrowed =\n // A single status is already applied server-side.\n wanted && wanted.size > 1 ? rows.filter((row) => wanted.has(row.status)) : rows;\n return search ? narrowed.filter((row) => matchesSearch(row, search)) : narrowed;\n },\n [search, statusKey]\n );\n\n return useWorkspaceQuery<ListExecutionsQuery, ExecutionRecord[]>({\n document: ListExecutionsDocument,\n variables,\n select,\n fallback: NO_EXECUTIONS,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load executions',\n });\n}\n\nexport function useExecution(executionId: string | undefined): QueryResult<ExecutionRecord | null> {\n const variables = useMemo(() => ({ id: executionId ?? '' }), [executionId]);\n\n return useWorkspaceQuery<GetExecutionQuery, ExecutionRecord | null>({\n document: GetExecutionDocument,\n variables,\n select: (data) => data?.getExecution ?? null,\n fallback: null,\n enabled: Boolean(executionId),\n errorMessage: 'Failed to load execution',\n });\n}\n\n/**\n * Token/cost metrics for the workspace, optionally narrowed to an agent, app or\n * date window. Returns `null` when the service has nothing recorded yet.\n */\nexport function useExecutionMetrics(\n filter?: ExecutionMetricsFilter\n): QueryResult<ExecutionMetricsRecord | null> {\n const workspaceId = useWorkspaceId();\n const { agentId, appId, startDate, endDate } = filter ?? {};\n\n const variables = useMemo(\n () => ({ filter: { workspaceId, agentId, appId, startDate, endDate } }),\n [workspaceId, agentId, appId, startDate, endDate]\n );\n\n return useWorkspaceQuery<GetExecutionMetricsQuery, ExecutionMetricsRecord | null>({\n document: GetExecutionMetricsDocument,\n variables,\n select: (data) => data?.getExecutionMetrics ?? null,\n fallback: null,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load execution metrics',\n });\n}\n\nexport interface ExecutionRollup {\n total: number;\n succeeded: number;\n failed: number;\n successRate: number;\n avgDurationMs: number;\n totalCost: number;\n totalTokens: number;\n}\n\n/**\n * Rolls a list of executions up into the headline numbers shown above the table.\n * Derived purely from the rows that were actually loaded — no server aggregate\n * exists for this, so callers must label it as such.\n */\nexport function summariseExecutions(executions: readonly ExecutionRecord[]): ExecutionRollup {\n const total = executions.length;\n let succeeded = 0;\n let failed = 0;\n let durationSum = 0;\n let durationCount = 0;\n let totalCost = 0;\n let totalTokens = 0;\n\n for (const execution of executions) {\n if (SUCCESS_STATUSES.has(execution.status)) succeeded += 1;\n if (execution.status === 'FAILED' || execution.status === 'TIMEOUT') failed += 1;\n if (typeof execution.duration === 'number') {\n durationSum += execution.duration;\n durationCount += 1;\n }\n totalCost += execution.cost ?? 0;\n totalTokens += execution.tokensUsed ?? 0;\n }\n\n return {\n total,\n succeeded,\n failed,\n successRate: total > 0 ? succeeded / total : 0,\n avgDurationMs: durationCount > 0 ? durationSum / durationCount : 0,\n totalCost,\n totalTokens,\n };\n}\n\nexport function useCreateExecution() {\n return useWorkspaceMutation<CreateExecutionMutation, CreateExecutionVariables, ExecutionRecord>({\n document: CreateExecutionDocument,\n variables: ({ input }) => ({ input: buildMutationInput(input, CREATE_EXECUTION_FIELDS) }),\n select: (data) => data?.createExecution,\n errorMessage: 'Failed to start execution',\n });\n}\n\nexport function useUpdateExecutionStatus() {\n return useWorkspaceMutation<\n UpdateExecutionStatusMutation,\n UpdateExecutionStatusVariables,\n ExecutionRecord\n >({\n document: UpdateExecutionStatusDocument,\n variables: ({ id, status, output, error }) => ({\n id,\n input: {\n status,\n output,\n // The subgraph takes the failure as a message plus a JSON detail blob\n // (UpdateExecutionStatusInput); pass the caller's object through whole.\n errorMessage: typeof error?.message === 'string' ? error.message : undefined,\n errorDetails: error,\n },\n }),\n select: (data) => data?.updateExecutionStatus,\n errorMessage: 'Failed to update execution status',\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useExecutions.js","names":["LIST_LIMIT","CREATE_EXECUTION_FIELDS","fieldsOf","SUCCESS_STATUSES","NO_EXECUTIONS","matchesSearch","execution","needle","useExecutions","workspaceId","useWorkspaceId","search","filter","statuses","singleStatus","statusKey","variables","useMemo","agentId","appId","conversationId","type","select","useCallback","wanted","narrowed","rows","row","useWorkspacePaginatedQuery","ListExecutionsDocument","data","useExecution","executionId","useWorkspaceQuery","GetExecutionDocument","summariseExecutions","total","executions","succeeded","failed","durationSum","durationCount","totalCost","totalTokens","useCreateExecution","useWorkspaceMutation","CreateExecutionDocument","buildMutationInput","input"],"sources":["../../../src/botlit/hooks/useExecutions.ts"],"sourcesContent":["/**\n * Executions Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listExecutions` / `getExecution` / `getExecutionMetrics`\n * operations plus the `createExecution` / `updateExecutionStatus` mutations on\n * wspace-botlit-svc.\n *\n * Note on filtering: `ExecutionFilterInput` accepts a SINGLE status and has no\n * free-text field, so multi-status selections and search are narrowed on the\n * client over every loaded page (see `loadMore`).\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n CreateExecutionDocument,\n GetExecutionDocument,\n GetExecutionMetricsDocument,\n ListExecutionsDocument,\n UpdateExecutionStatusDocument,\n type CreateExecutionMutation,\n type GetExecutionMetricsQuery,\n type GetExecutionQuery,\n type ListExecutionsQuery,\n type UpdateExecutionStatusMutation,\n} from '../../generated/wspace-operations';\nimport type { CreateExecutionInput, ExecutionStatus } from '../../generated/wspace-types';\nimport { buildMutationInput, fieldsOf, type GraphQLInput } from './internal/mutationInput';\nimport {\n useWorkspaceId,\n useWorkspaceMutation,\n useWorkspacePaginatedQuery,\n useWorkspaceQuery,\n type PaginatedQueryResult,\n type QueryResult,\n} from './internal/workspaceGateway';\n\nconst LIST_LIMIT = 100;\n\nexport interface ExecutionRecord {\n id: string;\n status: string;\n type: string;\n input: string;\n output?: string | null;\n agentId?: string | null;\n appId?: string | null;\n conversationId?: string | null;\n cost?: number | null;\n duration?: number | null;\n tokensUsed?: number | null;\n errorCode?: string | null;\n errorMessage?: string | null;\n errorDetails?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n completedAt?: string | null;\n createdAt: string;\n workspaceId: string;\n}\n\nexport interface ExecutionMetricsRecord {\n executionId: string;\n cost: number;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n ragChunks: number;\n toolCalls: number;\n}\n\nexport interface ExecutionsFilter {\n search?: string;\n status?: string[];\n agentId?: string;\n appId?: string;\n conversationId?: string;\n type?: string;\n}\n\nexport interface ExecutionMetricsFilter {\n agentId?: string;\n appId?: string;\n startDate?: string;\n endDate?: string;\n}\n\nexport interface CreateExecutionVariables {\n input: GraphQLInput<CreateExecutionInput>;\n}\n\nconst CREATE_EXECUTION_FIELDS = fieldsOf<CreateExecutionInput>({\n agentId: true,\n appId: true,\n conversationId: true,\n input: true,\n metadata: true,\n type: true,\n workspaceId: true,\n});\n\nexport interface UpdateExecutionStatusVariables {\n id: string;\n status: ExecutionStatus;\n output?: string;\n error?: Record<string, unknown>;\n}\n\n/** Terminal statuses that count as a successful run. */\nconst SUCCESS_STATUSES = new Set(['COMPLETED']);\n\nconst NO_EXECUTIONS: ExecutionRecord[] = [];\n\nexport const executionKeys = {\n all: ['executions'] as const,\n lists: () => [...executionKeys.all, 'list'] as const,\n list: (filter?: ExecutionsFilter) => [...executionKeys.lists(), filter] as const,\n details: () => [...executionKeys.all, 'detail'] as const,\n detail: (id: string) => [...executionKeys.details(), id] as const,\n metrics: () => [...executionKeys.all, 'metrics'] as const,\n};\n\nfunction matchesSearch(execution: ExecutionRecord, needle: string): boolean {\n return (\n execution.id.toLowerCase().includes(needle) ||\n (execution.agentId ?? '').toLowerCase().includes(needle) ||\n (execution.appId ?? '').toLowerCase().includes(needle) ||\n execution.input.toLowerCase().includes(needle)\n );\n}\n\nexport function useExecutions(filter?: ExecutionsFilter): PaginatedQueryResult<ExecutionRecord[]> {\n const workspaceId = useWorkspaceId();\n const search = filter?.search?.trim().toLowerCase() ?? '';\n const statuses = filter?.status;\n const singleStatus = statuses?.length === 1 ? statuses[0] : undefined;\n const statusKey = statuses?.join(',') ?? '';\n const { agentId, appId, conversationId, type } = filter ?? {};\n\n const variables = useMemo(\n () => ({\n filters: {\n workspaceId,\n status: singleStatus,\n agentId,\n appId,\n conversationId,\n type,\n },\n }),\n [workspaceId, singleStatus, agentId, appId, conversationId, type]\n );\n\n const select = useCallback(\n (rows: ExecutionRecord[]): ExecutionRecord[] => {\n const wanted = statusKey ? new Set(statusKey.split(',')) : undefined;\n const narrowed =\n // A single status is already applied server-side.\n wanted && wanted.size > 1 ? rows.filter((row) => wanted.has(row.status)) : rows;\n return search ? narrowed.filter((row) => matchesSearch(row, search)) : narrowed;\n },\n [search, statusKey]\n );\n\n return useWorkspacePaginatedQuery<ListExecutionsQuery, ExecutionRecord, ExecutionRecord[]>({\n document: ListExecutionsDocument,\n variables,\n pageSize: LIST_LIMIT,\n extractRows: (data) => data?.listExecutions ?? NO_EXECUTIONS,\n select,\n fallback: NO_EXECUTIONS,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load executions',\n });\n}\n\nexport function useExecution(executionId: string | undefined): QueryResult<ExecutionRecord | null> {\n const variables = useMemo(() => ({ id: executionId ?? '' }), [executionId]);\n\n return useWorkspaceQuery<GetExecutionQuery, ExecutionRecord | null>({\n document: GetExecutionDocument,\n variables,\n select: (data) => data?.getExecution ?? null,\n fallback: null,\n enabled: Boolean(executionId),\n errorMessage: 'Failed to load execution',\n });\n}\n\n/**\n * Token/cost metrics for the workspace, optionally narrowed to an agent, app or\n * date window. Returns `null` when the service has nothing recorded yet.\n */\nexport function useExecutionMetrics(\n filter?: ExecutionMetricsFilter\n): QueryResult<ExecutionMetricsRecord | null> {\n const workspaceId = useWorkspaceId();\n const { agentId, appId, startDate, endDate } = filter ?? {};\n\n const variables = useMemo(\n () => ({ filter: { workspaceId, agentId, appId, startDate, endDate } }),\n [workspaceId, agentId, appId, startDate, endDate]\n );\n\n return useWorkspaceQuery<GetExecutionMetricsQuery, ExecutionMetricsRecord | null>({\n document: GetExecutionMetricsDocument,\n variables,\n select: (data) => data?.getExecutionMetrics ?? null,\n fallback: null,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load execution metrics',\n });\n}\n\nexport interface ExecutionRollup {\n total: number;\n succeeded: number;\n failed: number;\n successRate: number;\n avgDurationMs: number;\n totalCost: number;\n totalTokens: number;\n}\n\n/**\n * Rolls a list of executions up into the headline numbers shown above the table.\n * Derived purely from the rows that were actually loaded — no server aggregate\n * exists for this, so callers must label it as such.\n */\nexport function summariseExecutions(executions: readonly ExecutionRecord[]): ExecutionRollup {\n const total = executions.length;\n let succeeded = 0;\n let failed = 0;\n let durationSum = 0;\n let durationCount = 0;\n let totalCost = 0;\n let totalTokens = 0;\n\n for (const execution of executions) {\n if (SUCCESS_STATUSES.has(execution.status)) succeeded += 1;\n if (execution.status === 'FAILED' || execution.status === 'TIMEOUT') failed += 1;\n if (typeof execution.duration === 'number') {\n durationSum += execution.duration;\n durationCount += 1;\n }\n totalCost += execution.cost ?? 0;\n totalTokens += execution.tokensUsed ?? 0;\n }\n\n return {\n total,\n succeeded,\n failed,\n successRate: total > 0 ? succeeded / total : 0,\n avgDurationMs: durationCount > 0 ? durationSum / durationCount : 0,\n totalCost,\n totalTokens,\n };\n}\n\nexport function useCreateExecution() {\n return useWorkspaceMutation<CreateExecutionMutation, CreateExecutionVariables, ExecutionRecord>({\n document: CreateExecutionDocument,\n variables: ({ input }) => ({ input: buildMutationInput(input, CREATE_EXECUTION_FIELDS) }),\n select: (data) => data?.createExecution,\n errorMessage: 'Failed to start execution',\n });\n}\n\nexport function useUpdateExecutionStatus() {\n return useWorkspaceMutation<\n UpdateExecutionStatusMutation,\n UpdateExecutionStatusVariables,\n ExecutionRecord\n >({\n document: UpdateExecutionStatusDocument,\n variables: ({ id, status, output, error }) => ({\n id,\n input: {\n status,\n output,\n // The subgraph takes the failure as a message plus a JSON detail blob\n // (UpdateExecutionStatusInput); pass the caller's object through whole.\n errorMessage: typeof error?.message === 'string' ? error.message : undefined,\n errorDetails: error,\n },\n }),\n select: (data) => data?.updateExecutionStatus,\n errorMessage: 'Failed to update execution status',\n });\n}\n"],"mappings":";;;;;AAqCA,IAAMA,IAAa,KAqDbC,IAA0BC,EAA+B;CAC7D,SAAS;CACT,OAAO;CACP,gBAAgB;CAChB,OAAO;CACP,UAAU;CACV,MAAM;CACN,aAAa;AACf,CAAC,GAUKC,oBAAmB,IAAI,IAAI,CAAC,WAAW,CAAC,GAExCC,IAAmC,CAAC;AAW1C,SAASC,EAAc,GAA4B,GAAyB;CAC1E,OACEC,EAAU,GAAG,YAAY,CAAC,CAAC,SAASC,CAAM,MACzCD,EAAU,WAAW,GAAA,CAAI,YAAY,CAAC,CAAC,SAASC,CAAM,MACtDD,EAAU,SAAS,GAAA,CAAI,YAAY,CAAC,CAAC,SAASC,CAAM,KACrDD,EAAU,MAAM,YAAY,CAAC,CAAC,SAASC,CAAM;AAEjD;AAEA,SAAgBC,EAAc,GAAoE;CAChG,IAAMC,IAAcC,EAAe,GAC7BC,IAASC,GAAQ,QAAQ,KAAK,CAAC,CAAC,YAAY,KAAK,IACjDC,IAAWD,GAAQ,QACnBE,IAAeD,GAAU,WAAW,IAAIA,EAAS,KAAK,KAAA,GACtDE,IAAYF,GAAU,KAAK,GAAG,KAAK,IACnC,EAAE,YAAS,UAAO,mBAAgB,YAASD,KAAU,CAAC,GAEtDI,IAAYC,SACT,EACL,SAAS;EACP;EACA,QAAQH;EACR;EACA;EACA;EACA;CACF,EACF,IACA;EAACL;EAAaK;EAAcI;EAASC;EAAOC;EAAgBC;CAAI,CAClE,GAEMC,IAASC,GACZ,MAA+C;EAC9C,IAAMC,IAAST,IAAY,IAAI,IAAIA,EAAU,MAAM,GAAG,CAAC,IAAI,KAAA,GACrDU,IAEJD,KAAUA,EAAO,OAAO,IAAIE,EAAK,QAAQ,MAAQF,EAAO,IAAIG,EAAI,MAAM,CAAC,IAAID;EAC7E,OAAOf,IAASc,EAAS,QAAQ,MAAQpB,EAAcsB,GAAKhB,CAAM,CAAC,IAAIc;CACzE,GACA,CAACd,GAAQI,CAAS,CACpB;CAEA,OAAOa,EAAoF;EACzF,UAAUC;EACV;EACA,UAAU7B;EACV,cAAc,MAAS8B,GAAM,kBAAkB1B;EAC/C;EACA,UAAUA;EACV,SAAS,EAAQK;EACjB,cAAc;CAChB,CAAC;AACH;AAEA,SAAgBsB,EAAa,GAAsE;CACjG,IAAMf,IAAYC,SAAe,EAAE,IAAIe,KAAe,GAAG,IAAI,CAACA,CAAW,CAAC;CAE1E,OAAOC,EAA6D;EAClE,UAAUC;EACV;EACA,SAAS,MAASJ,GAAM,gBAAgB;EACxC,UAAU;EACV,SAAS,EAAQE;EACjB,cAAc;CAChB,CAAC;AACH;AA0CA,SAAgBG,EAAoB,GAAyD;CAC3F,IAAMC,IAAQC,EAAW,QACrBC,IAAY,GACZC,IAAS,GACTC,IAAc,GACdC,IAAgB,GAChBC,IAAY,GACZC,IAAc;CAElB,KAAK,IAAMrC,KAAa+B,GAQtB,AAPIlC,EAAiB,IAAIG,EAAU,MAAM,MAAG,KAAa,KACrDA,EAAU,WAAW,YAAYA,EAAU,WAAW,eAAW,KAAU,IAC3E,OAAOA,EAAU,YAAa,aAChC,KAAeA,EAAU,UACzB,KAAiB,IAEnB,KAAaA,EAAU,QAAQ,GAC/B,KAAeA,EAAU,cAAc;CAGzC,OAAO;EACL;EACA;EACA;EACA,aAAa8B,IAAQ,IAAIE,IAAYF,IAAQ;EAC7C,eAAeK,IAAgB,IAAID,IAAcC,IAAgB;EACjE;EACA;CACF;AACF;AAEA,SAAgBG,IAAqB;CACnC,OAAOC,EAAyF;EAC9F,UAAUC;EACV,YAAY,EAAE,gBAAa,EAAE,OAAOC,EAAmBC,GAAO/C,CAAuB,EAAE;EACvF,SAAS,MAAS6B,GAAM;EACxB,cAAc;CAChB,CAAC;AACH"}
@@ -1,6 +1,6 @@
1
1
  import { ForkInstalledPackageInput, InstallPackageInput, UpdateInstalledPackageInput } from '../../generated/wspace-types';
2
2
  import { GraphQLInput } from './internal/mutationInput';
3
- import { QueryResult } from './internal/workspaceGateway';
3
+ import { PaginatedQueryResult, QueryResult } from './internal/workspaceGateway';
4
4
  export interface StorePackageRecord {
5
5
  id: string;
6
6
  slug: string;
@@ -69,10 +69,10 @@ export declare const storeKeys: {
69
69
  installedList: () => readonly ["store", "installed", "list"];
70
70
  installedDetail: (id: string) => readonly ["store", "installed", "detail", string];
71
71
  };
72
- export declare function useStorePackages(filter?: StoreFilter): QueryResult<StorePackageRecord[]>;
72
+ export declare function useStorePackages(filter?: StoreFilter): PaginatedQueryResult<StorePackageRecord[]>;
73
73
  /** Store packages are addressed by slug in the UI, so this resolves by slug. */
74
74
  export declare function useStorePackage(slug: string | undefined): QueryResult<StorePackageRecord | null>;
75
- export declare function useInstalledPackages(): QueryResult<InstalledPackageRecord[]>;
75
+ export declare function useInstalledPackages(): PaginatedQueryResult<InstalledPackageRecord[]>;
76
76
  export declare function useInstalledPackage(packageId: string | undefined): QueryResult<InstalledPackageRecord | null>;
77
77
  /**
78
78
  * Installed packages whose store listing now publishes a different version.
@@ -1,9 +1,9 @@
1
1
  import { GetStorePackageBySlugDocument as e, InstallPackageDocument as t, ListInstalledPackagesDocument as n, ListStorePackagesDocument as r, UninstallPackageDocument as i, UpdateInstalledPackageDocument as a } from "../../generated/wspace-operations.js";
2
2
  import { buildMutationInput as o, fieldsOf as s } from "./internal/mutationInput.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";
3
+ import { useWorkspaceId as c, useWorkspaceMutation as l, useWorkspacePaginatedQuery as u, useWorkspaceQuery as d } from "./internal/workspaceGateway.js";
4
+ import { useCallback as f, useMemo as p } from "react";
5
5
  // src/botlit/hooks/useStore.ts
6
- var p = 100, m = s({
6
+ var m = 100, h = s({
7
7
  bindings: !0,
8
8
  metadata: !0,
9
9
  mode: !0,
@@ -11,7 +11,7 @@ var p = 100, m = s({
11
11
  pinnedByEnv: !0,
12
12
  version: !0,
13
13
  workspaceId: !0
14
- }), h = s({
14
+ }), g = s({
15
15
  bindings: !0,
16
16
  installedVersion: !0,
17
17
  metadata: !0,
@@ -24,55 +24,50 @@ s({
24
24
  newName: !0,
25
25
  workspaceId: !0
26
26
  });
27
- var g = [], _ = [];
28
- function v(e, t) {
27
+ var _ = [], v = [];
28
+ function y(e, t) {
29
29
  let n = e?.manifest?.[t];
30
30
  return n && typeof n == "object" && !Array.isArray(n) ? n : void 0;
31
31
  }
32
- function y(e, t) {
33
- let n = v(e, "package")?.[t];
32
+ function b(e, t) {
33
+ let n = y(e, "package")?.[t];
34
34
  return typeof n == "string" ? n : void 0;
35
35
  }
36
- function b(e) {
37
- return y(e, "name") ?? e?.slug ?? "";
38
- }
39
36
  function x(e) {
40
- return y(e, "description");
37
+ return b(e, "name") ?? e?.slug ?? "";
41
38
  }
42
39
  function S(e) {
43
- return e?.listStorePackages ?? g;
40
+ return b(e, "description");
44
41
  }
45
42
  function C(e) {
46
- return e?.listInstalledPackages ?? _;
43
+ return e?.listStorePackages ?? _;
47
44
  }
48
45
  function w(e) {
49
- let t = e?.search?.trim() ?? "", n = e?.kind?.[0], i = e?.sortBy ?? "recent", a = f(() => ({
50
- filters: {
51
- search: t || void 0,
52
- kind: n
53
- },
54
- pagination: {
55
- limit: p,
56
- offset: 0
57
- }
58
- }), [t, n]), o = d((e) => {
59
- let t = S(e);
60
- if (t.length === 0) return t;
61
- let n = [...t];
62
- return i === "name" ? n.sort((e, t) => b(e).localeCompare(b(t))) : n.sort((e, t) => (t.publishedAt ?? "").localeCompare(e.publishedAt ?? "")), n;
46
+ return e?.listInstalledPackages ?? v;
47
+ }
48
+ function T(e) {
49
+ let t = e?.search?.trim() ?? "", n = e?.kind?.[0], i = e?.sortBy ?? "recent", a = p(() => ({ filters: {
50
+ search: t || void 0,
51
+ kind: n
52
+ } }), [t, n]), o = f((e) => {
53
+ if (e.length === 0) return e;
54
+ let t = [...e];
55
+ return i === "name" ? t.sort((e, t) => x(e).localeCompare(x(t))) : t.sort((e, t) => (t.publishedAt ?? "").localeCompare(e.publishedAt ?? "")), t;
63
56
  }, [i]);
64
57
  return u({
65
58
  document: r,
66
59
  variables: a,
60
+ pageSize: m,
61
+ extractRows: C,
67
62
  select: o,
68
- fallback: g,
63
+ fallback: _,
69
64
  enabled: !0,
70
65
  errorMessage: "Failed to load store packages"
71
66
  });
72
67
  }
73
- function T(t) {
74
- let n = f(() => ({ slug: t ?? "" }), [t]);
75
- return u({
68
+ function E(t) {
69
+ let n = p(() => ({ slug: t ?? "" }), [t]);
70
+ return d({
76
71
  document: e,
77
72
  variables: n,
78
73
  select: (e) => e?.getStorePackageBySlug ?? null,
@@ -81,28 +76,24 @@ function T(t) {
81
76
  errorMessage: "Failed to load store package"
82
77
  });
83
78
  }
84
- function E() {
85
- let e = c(), t = f(() => ({
86
- filters: { workspaceId: e ?? "" },
87
- pagination: {
88
- limit: p,
89
- offset: 0
90
- }
91
- }), [e]);
79
+ function D() {
80
+ let e = c(), t = p(() => ({ filters: { workspaceId: e ?? "" } }), [e]);
92
81
  return u({
93
82
  document: n,
94
83
  variables: t,
95
- select: C,
96
- fallback: _,
84
+ pageSize: m,
85
+ extractRows: w,
86
+ select: (e) => e,
87
+ fallback: v,
97
88
  enabled: !!e,
98
89
  errorMessage: "Failed to load installed packages"
99
90
  });
100
91
  }
101
- function D() {
102
- let e = c(), n = d((t) => ({ input: o({
92
+ function O() {
93
+ let e = c(), n = f((t) => ({ input: o({
103
94
  ...t,
104
95
  workspaceId: e
105
- }, m) }), [e]), [r, i] = l({
96
+ }, h) }), [e]), [r, i] = l({
106
97
  document: t,
107
98
  variables: n,
108
99
  select: (e) => e?.installPackage,
@@ -114,12 +105,12 @@ function D() {
114
105
  error: i.error
115
106
  };
116
107
  }
117
- function O() {
108
+ function k() {
118
109
  let [e, t] = l({
119
110
  document: a,
120
111
  variables: ({ installedId: e, input: t }) => ({
121
112
  id: e,
122
- input: o(t, h)
113
+ input: o(t, g)
123
114
  }),
124
115
  select: (e) => e?.updateInstalledPackage,
125
116
  errorMessage: "Failed to update installed package"
@@ -130,7 +121,7 @@ function O() {
130
121
  error: t.error
131
122
  };
132
123
  }
133
- function k() {
124
+ function A() {
134
125
  let [e, t] = l({
135
126
  document: i,
136
127
  variables: (e) => ({ id: e }),
@@ -143,7 +134,7 @@ function k() {
143
134
  error: t.error
144
135
  };
145
136
  }
146
- function A() {
137
+ function j() {
147
138
  let [e, t] = l({
148
139
  document: a,
149
140
  variables: ({ installedId: e, environment: t, version: n, pinnedByEnv: r }) => ({
@@ -162,6 +153,6 @@ function A() {
162
153
  error: t.error
163
154
  };
164
155
  }
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 };
156
+ export { S as storePackageDescription, x as storePackageName, O as useInstallPackage, D as useInstalledPackages, j as usePinPackageVersion, E as useStorePackage, T as useStorePackages, A as useUninstallPackage, k as useUpdateInstalledPackage };
166
157
 
167
158
  //# sourceMappingURL=useStore.js.map