@agent-native/dispatch 0.41.1-nightly-20261104110058 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/CHANGELOG.md +26 -55
  2. package/dist/actions/get-hosted-apps-settings.d.ts +5 -0
  3. package/dist/actions/get-hosted-apps-settings.d.ts.map +1 -0
  4. package/dist/actions/get-hosted-apps-settings.js +25 -0
  5. package/dist/actions/get-hosted-apps-settings.js.map +1 -0
  6. package/dist/actions/index.d.ts.map +1 -1
  7. package/dist/actions/index.js +4 -0
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/list-connected-agents.d.ts +1 -0
  10. package/dist/actions/list-connected-agents.js +11 -10
  11. package/dist/actions/list-connected-agents.js.map +1 -1
  12. package/dist/actions/list_apps.js +3 -2
  13. package/dist/actions/list_apps.js.map +1 -1
  14. package/dist/actions/provider-api-register.d.ts +10 -10
  15. package/dist/actions/set-hosted-apps-settings.d.ts +7 -0
  16. package/dist/actions/set-hosted-apps-settings.d.ts.map +1 -0
  17. package/dist/actions/set-hosted-apps-settings.js +35 -0
  18. package/dist/actions/set-hosted-apps-settings.js.map +1 -0
  19. package/dist/components/app-card-tiers.d.ts +13 -0
  20. package/dist/components/app-card-tiers.d.ts.map +1 -0
  21. package/dist/components/app-card-tiers.js +22 -0
  22. package/dist/components/app-card-tiers.js.map +1 -0
  23. package/dist/components/app-list-row.d.ts +12 -4
  24. package/dist/components/app-list-row.d.ts.map +1 -1
  25. package/dist/components/app-list-row.js +19 -4
  26. package/dist/components/app-list-row.js.map +1 -1
  27. package/dist/components/app-open-actions.d.ts +4 -0
  28. package/dist/components/app-open-actions.d.ts.map +1 -1
  29. package/dist/components/app-open-actions.js +9 -0
  30. package/dist/components/app-open-actions.js.map +1 -1
  31. package/dist/components/app-pin-button.d.ts +9 -0
  32. package/dist/components/app-pin-button.d.ts.map +1 -0
  33. package/dist/components/app-pin-button.js +29 -0
  34. package/dist/components/app-pin-button.js.map +1 -0
  35. package/dist/components/app-tier-sections.d.ts +27 -0
  36. package/dist/components/app-tier-sections.d.ts.map +1 -0
  37. package/dist/components/app-tier-sections.js +44 -0
  38. package/dist/components/app-tier-sections.js.map +1 -0
  39. package/dist/components/chat-home-apps.d.ts.map +1 -1
  40. package/dist/components/chat-home-apps.js +19 -26
  41. package/dist/components/chat-home-apps.js.map +1 -1
  42. package/dist/components/connected-app-card.d.ts +3 -1
  43. package/dist/components/connected-app-card.d.ts.map +1 -1
  44. package/dist/components/connected-app-card.js +6 -3
  45. package/dist/components/connected-app-card.js.map +1 -1
  46. package/dist/components/create-app-popover.d.ts +4 -0
  47. package/dist/components/create-app-popover.d.ts.map +1 -1
  48. package/dist/components/create-app-popover.js +6 -0
  49. package/dist/components/create-app-popover.js.map +1 -1
  50. package/dist/components/dispatch-control-plane.d.ts.map +1 -1
  51. package/dist/components/dispatch-control-plane.js +25 -35
  52. package/dist/components/dispatch-control-plane.js.map +1 -1
  53. package/dist/components/hosted-apps-settings-group.d.ts +6 -0
  54. package/dist/components/hosted-apps-settings-group.d.ts.map +1 -0
  55. package/dist/components/hosted-apps-settings-group.js +76 -0
  56. package/dist/components/hosted-apps-settings-group.js.map +1 -0
  57. package/dist/components/layout/Layout.d.ts +6 -4
  58. package/dist/components/layout/Layout.d.ts.map +1 -1
  59. package/dist/components/layout/Layout.js +97 -80
  60. package/dist/components/layout/Layout.js.map +1 -1
  61. package/dist/components/workspace-app-card.d.ts.map +1 -1
  62. package/dist/components/workspace-app-card.js +9 -20
  63. package/dist/components/workspace-app-card.js.map +1 -1
  64. package/dist/components/workspace-app-layout-notice.d.ts +9 -0
  65. package/dist/components/workspace-app-layout-notice.d.ts.map +1 -0
  66. package/dist/components/workspace-app-layout-notice.js +27 -0
  67. package/dist/components/workspace-app-layout-notice.js.map +1 -0
  68. package/dist/components/workspace-app-search.d.ts.map +1 -1
  69. package/dist/components/workspace-app-search.js +11 -5
  70. package/dist/components/workspace-app-search.js.map +1 -1
  71. package/dist/components/workspace-template-card.d.ts.map +1 -1
  72. package/dist/components/workspace-template-card.js +7 -2
  73. package/dist/components/workspace-template-card.js.map +1 -1
  74. package/dist/db/index.d.ts.map +1 -1
  75. package/dist/db/index.js +1 -0
  76. package/dist/db/index.js.map +1 -1
  77. package/dist/lib/other-apps.d.ts +10 -1
  78. package/dist/lib/other-apps.d.ts.map +1 -1
  79. package/dist/lib/other-apps.js +7 -1
  80. package/dist/lib/other-apps.js.map +1 -1
  81. package/dist/lib/workspace-app-layout.d.ts +62 -6
  82. package/dist/lib/workspace-app-layout.d.ts.map +1 -1
  83. package/dist/lib/workspace-app-layout.js +196 -41
  84. package/dist/lib/workspace-app-layout.js.map +1 -1
  85. package/dist/lib/workspace-app-lists.d.ts +17 -0
  86. package/dist/lib/workspace-app-lists.d.ts.map +1 -0
  87. package/dist/lib/workspace-app-lists.js +21 -0
  88. package/dist/lib/workspace-app-lists.js.map +1 -0
  89. package/dist/lib/workspace-apps.d.ts +3 -1
  90. package/dist/lib/workspace-apps.d.ts.map +1 -1
  91. package/dist/lib/workspace-apps.js +5 -1
  92. package/dist/lib/workspace-apps.js.map +1 -1
  93. package/dist/routes/pages/apps.d.ts.map +1 -1
  94. package/dist/routes/pages/apps.js +23 -35
  95. package/dist/routes/pages/apps.js.map +1 -1
  96. package/dist/routes/pages/settings-page.d.ts.map +1 -1
  97. package/dist/routes/pages/settings-page.js +24 -3
  98. package/dist/routes/pages/settings-page.js.map +1 -1
  99. package/dist/server/lib/app-creation-store.d.ts.map +1 -1
  100. package/dist/server/lib/app-creation-store.js +13 -18
  101. package/dist/server/lib/app-creation-store.js.map +1 -1
  102. package/dist/server/lib/app-roles.d.ts +2 -0
  103. package/dist/server/lib/app-roles.d.ts.map +1 -1
  104. package/dist/server/lib/app-roles.js +26 -7
  105. package/dist/server/lib/app-roles.js.map +1 -1
  106. package/dist/server/lib/hosted-apps-settings-schema.d.ts +6 -0
  107. package/dist/server/lib/hosted-apps-settings-schema.d.ts.map +1 -0
  108. package/dist/server/lib/hosted-apps-settings-schema.js +6 -0
  109. package/dist/server/lib/hosted-apps-settings-schema.js.map +1 -0
  110. package/dist/server/lib/hosted-apps-settings.d.ts +27 -0
  111. package/dist/server/lib/hosted-apps-settings.d.ts.map +1 -0
  112. package/dist/server/lib/hosted-apps-settings.js +72 -0
  113. package/dist/server/lib/hosted-apps-settings.js.map +1 -0
  114. package/dist/server/plugins/agent-chat.js +6 -3
  115. package/dist/server/plugins/agent-chat.js.map +1 -1
  116. package/dist/server/plugins/integrations.js +3 -3
  117. package/dist/server/plugins/integrations.js.map +1 -1
  118. package/dist/shared/hosted-apps-settings.d.ts +3 -0
  119. package/dist/shared/hosted-apps-settings.d.ts.map +1 -0
  120. package/dist/shared/hosted-apps-settings.js +3 -0
  121. package/dist/shared/hosted-apps-settings.js.map +1 -0
  122. package/package.json +4 -4
  123. package/src/actions/get-hosted-apps-settings.ts +29 -0
  124. package/src/actions/hosted-apps-settings.spec.ts +100 -0
  125. package/src/actions/index.ts +4 -0
  126. package/src/actions/list-connected-agents.spec.ts +67 -0
  127. package/src/actions/list-connected-agents.ts +14 -15
  128. package/src/actions/list_apps.spec.ts +16 -0
  129. package/src/actions/list_apps.ts +5 -2
  130. package/src/actions/set-hosted-apps-settings.ts +42 -0
  131. package/src/components/app-card-tiers.tsx +85 -0
  132. package/src/components/app-list-row.spec.tsx +54 -0
  133. package/src/components/app-list-row.tsx +50 -8
  134. package/src/components/app-open-actions.tsx +16 -0
  135. package/src/components/app-pin-button.spec.tsx +68 -0
  136. package/src/components/app-pin-button.tsx +66 -0
  137. package/src/components/app-tier-sections.spec.tsx +155 -0
  138. package/src/components/app-tier-sections.tsx +158 -0
  139. package/src/components/chat-home-apps.spec.tsx +135 -29
  140. package/src/components/chat-home-apps.tsx +115 -111
  141. package/src/components/connected-app-card.spec.tsx +18 -2
  142. package/src/components/connected-app-card.tsx +18 -1
  143. package/src/components/create-app-popover.tsx +22 -0
  144. package/src/components/dispatch-control-plane.spec.tsx +89 -20
  145. package/src/components/dispatch-control-plane.tsx +91 -125
  146. package/src/components/hosted-apps-settings-group.spec.tsx +218 -0
  147. package/src/components/hosted-apps-settings-group.tsx +189 -0
  148. package/src/components/layout/Layout.spec.tsx +356 -49
  149. package/src/components/layout/Layout.tsx +189 -142
  150. package/src/components/workspace-app-card.spec.tsx +33 -29
  151. package/src/components/workspace-app-card.tsx +13 -31
  152. package/src/components/workspace-app-layout-notice.spec.tsx +106 -0
  153. package/src/components/workspace-app-layout-notice.tsx +65 -0
  154. package/src/components/workspace-app-search.spec.tsx +53 -0
  155. package/src/components/workspace-app-search.tsx +39 -32
  156. package/src/components/workspace-template-card.spec.tsx +10 -0
  157. package/src/components/workspace-template-card.tsx +7 -2
  158. package/src/db/index.spec.ts +9 -0
  159. package/src/db/index.ts +1 -0
  160. package/src/lib/other-apps.spec.ts +25 -0
  161. package/src/lib/other-apps.ts +9 -0
  162. package/src/lib/workspace-app-layout.spec.ts +61 -3
  163. package/src/lib/workspace-app-layout.store.spec.tsx +261 -0
  164. package/src/lib/workspace-app-layout.ts +265 -48
  165. package/src/lib/workspace-app-lists.ts +32 -0
  166. package/src/lib/workspace-apps.ts +10 -2
  167. package/src/routes/pages/apps.spec.tsx +133 -5
  168. package/src/routes/pages/apps.tsx +79 -140
  169. package/src/routes/pages/chat.spec.tsx +66 -49
  170. package/src/routes/pages/settings-page.tsx +31 -3
  171. package/src/routes/pages/settings.spec.tsx +37 -0
  172. package/src/server/lib/app-creation-store.spec.ts +14 -0
  173. package/src/server/lib/app-creation-store.ts +16 -29
  174. package/src/server/lib/app-creation-store.write-observation.spec.ts +216 -0
  175. package/src/server/lib/app-roles.spec.ts +48 -1
  176. package/src/server/lib/app-roles.ts +44 -12
  177. package/src/server/lib/hosted-apps-settings-schema.ts +6 -0
  178. package/src/server/lib/hosted-apps-settings.spec.ts +154 -0
  179. package/src/server/lib/hosted-apps-settings.ts +108 -0
  180. package/src/server/plugins/agent-chat.spec.ts +16 -0
  181. package/src/server/plugins/agent-chat.ts +7 -2
  182. package/src/server/plugins/integrations.ts +3 -3
  183. package/src/shared/hosted-apps-settings.ts +3 -0
  184. package/src/styles/dispatch.css +40 -11
  185. package/dist/components/available-apps-section.d.ts +0 -9
  186. package/dist/components/available-apps-section.d.ts.map +0 -1
  187. package/dist/components/available-apps-section.js +0 -97
  188. package/dist/components/available-apps-section.js.map +0 -1
  189. package/dist/components/other-apps-section.d.ts +0 -35
  190. package/dist/components/other-apps-section.d.ts.map +0 -1
  191. package/dist/components/other-apps-section.js +0 -79
  192. package/dist/components/other-apps-section.js.map +0 -1
  193. package/src/components/available-apps-section.tsx +0 -239
  194. package/src/components/other-apps-section.spec.ts +0 -50
  195. package/src/components/other-apps-section.tsx +0 -254
@@ -1,254 +0,0 @@
1
- import { useT } from "@agent-native/core/client/i18n";
2
-
3
- import { filterOtherApps, type ConnectedAppSummary } from "../lib/other-apps";
4
- import type { WorkspaceAppId } from "../lib/other-apps";
5
- import { cn } from "../lib/utils";
6
- import { isDefaultWorkspaceAppHiddenId } from "../lib/workspace-apps";
7
- import { ActionQueryError } from "./action-query-error";
8
- import {
9
- APP_LIST_GRID_CLASS,
10
- APP_LIST_GRID_ROW_CLASS,
11
- AppList,
12
- } from "./app-list-row";
13
- import { ConnectedAppCard } from "./connected-app-card";
14
- import { Skeleton } from "./ui/skeleton";
15
- import {
16
- WorkspaceTemplateCard,
17
- type CuratedWorkspaceTemplate,
18
- type CuratedWorkspaceTemplatesResult,
19
- type WorkspaceTemplateLabels,
20
- } from "./workspace-template-card";
21
-
22
- export type OtherAppEntry =
23
- | { kind: "template"; template: CuratedWorkspaceTemplate }
24
- | { kind: "connected"; app: ConnectedAppSummary };
25
-
26
- function templateKey(template: CuratedWorkspaceTemplate): string {
27
- return (template.templateId || template.id || template.appId || template.name)
28
- .trim()
29
- .toLowerCase();
30
- }
31
-
32
- function getTemplateItems(
33
- result: CuratedWorkspaceTemplatesResult | undefined,
34
- ): CuratedWorkspaceTemplate[] {
35
- if (!result) return [];
36
- return Array.isArray(result) ? result : result.templates;
37
- }
38
-
39
- export function otherAppEntryMatchesQuery(
40
- entry: OtherAppEntry,
41
- query: string,
42
- ): boolean {
43
- const normalizedQuery = query.trim().toLowerCase();
44
- if (!normalizedQuery) return true;
45
- const searchable =
46
- entry.kind === "template"
47
- ? `${entry.template.name} ${entry.template.description ?? ""}`
48
- : `${entry.app.name} ${entry.app.description ?? ""}`;
49
- return searchable.toLowerCase().includes(normalizedQuery);
50
- }
51
-
52
- export function filterOtherAppEntries(
53
- entries: OtherAppEntry[],
54
- query: string,
55
- ): OtherAppEntry[] {
56
- return entries.filter((entry) => otherAppEntryMatchesQuery(entry, query));
57
- }
58
-
59
- export function mergeOtherAppEntries({
60
- templates,
61
- connectedApps,
62
- workspaceApps,
63
- }: {
64
- templates?: CuratedWorkspaceTemplatesResult;
65
- connectedApps: ConnectedAppSummary[];
66
- workspaceApps: WorkspaceAppId[];
67
- }): OtherAppEntry[] {
68
- const workspaceAppIds = new Set(
69
- workspaceApps.map((app) => app.id.trim().toLowerCase()),
70
- );
71
- const seen = new Set<string>();
72
- const entries: OtherAppEntry[] = [];
73
-
74
- for (const template of getTemplateItems(templates)) {
75
- const id = templateKey(template);
76
- if (
77
- !id ||
78
- isDefaultWorkspaceAppHiddenId(id) ||
79
- template.installed ||
80
- workspaceAppIds.has(id)
81
- )
82
- continue;
83
- seen.add(id);
84
- entries.push({ kind: "template", template });
85
- }
86
-
87
- for (const app of filterOtherApps(connectedApps, workspaceApps)) {
88
- const id = app.id.trim().toLowerCase();
89
- if (seen.has(id)) continue;
90
- seen.add(id);
91
- entries.push({ kind: "connected", app });
92
- }
93
-
94
- return entries;
95
- }
96
-
97
- export function OtherAppsSection({
98
- templates,
99
- connectedApps = [],
100
- workspaceApps,
101
- templatesLoading = false,
102
- connectedAppsLoading = false,
103
- templatesError,
104
- connectedAppsError,
105
- onRetryTemplates,
106
- onRetryConnectedApps,
107
- templateLabels,
108
- onRemixSuccess,
109
- query = "",
110
- heading = "Other apps",
111
- embeddedInList = false,
112
- className,
113
- }: {
114
- templates?: CuratedWorkspaceTemplatesResult;
115
- connectedApps?: ConnectedAppSummary[];
116
- workspaceApps: WorkspaceAppId[];
117
- templatesLoading?: boolean;
118
- connectedAppsLoading?: boolean;
119
- templatesError?: Error | null;
120
- connectedAppsError?: Error | null;
121
- onRetryTemplates?: () => void;
122
- onRetryConnectedApps?: () => void;
123
- templateLabels?: Partial<WorkspaceTemplateLabels>;
124
- onRemixSuccess?: (
125
- result: unknown,
126
- template: CuratedWorkspaceTemplate,
127
- ) => void;
128
- query?: string;
129
- heading?: string | null;
130
- embeddedInList?: boolean;
131
- className?: string;
132
- }) {
133
- const t = useT();
134
- const entries = filterOtherAppEntries(
135
- mergeOtherAppEntries({
136
- templates,
137
- connectedApps,
138
- workspaceApps,
139
- }),
140
- query,
141
- );
142
- const isLoading = templatesLoading || connectedAppsLoading;
143
- const hasError = Boolean(templatesError || connectedAppsError);
144
-
145
- if (!isLoading && !hasError && entries.length === 0) return null;
146
-
147
- const entryCards = entries.map((entry) =>
148
- entry.kind === "template" ? (
149
- <WorkspaceTemplateCard
150
- key={`template:${templateKey(entry.template)}`}
151
- template={entry.template}
152
- labels={templateLabels}
153
- catalog
154
- className={APP_LIST_GRID_ROW_CLASS}
155
- onRemixSuccess={onRemixSuccess}
156
- />
157
- ) : (
158
- <ConnectedAppCard
159
- key={`connected:${entry.app.id}`}
160
- app={entry.app}
161
- className={APP_LIST_GRID_ROW_CLASS}
162
- />
163
- ),
164
- );
165
-
166
- const content = (
167
- <>
168
- {heading ? (
169
- <div className="flex min-w-0 items-center">
170
- <h2 className="truncate text-sm font-semibold text-foreground">
171
- {t("dispatch.pages.otherApps", { defaultValue: heading })}
172
- </h2>
173
- </div>
174
- ) : null}
175
-
176
- {templatesError ? (
177
- <ActionQueryError
178
- error={templatesError}
179
- onRetry={() => onRetryTemplates?.()}
180
- />
181
- ) : null}
182
- {connectedAppsError ? (
183
- <ActionQueryError
184
- error={connectedAppsError}
185
- onRetry={() => onRetryConnectedApps?.()}
186
- />
187
- ) : null}
188
-
189
- {isLoading && entries.length === 0 ? (
190
- embeddedInList ? (
191
- <OtherAppsSkeletonRows />
192
- ) : (
193
- <OtherAppsSkeletonList />
194
- )
195
- ) : entries.length > 0 ? (
196
- embeddedInList ? (
197
- entryCards
198
- ) : (
199
- <AppList className={APP_LIST_GRID_CLASS}>{entryCards}</AppList>
200
- )
201
- ) : null}
202
- </>
203
- );
204
-
205
- if (embeddedInList) return content;
206
-
207
- return <section className={cn("space-y-3", className)}>{content}</section>;
208
- }
209
-
210
- function OtherAppsSkeletonList() {
211
- return (
212
- <AppList className={APP_LIST_GRID_CLASS}>
213
- {Array.from({ length: 4 }).map((_, index) => (
214
- <div
215
- key={index}
216
- className={cn(
217
- "flex min-w-0 items-center gap-3 border-b px-4 py-3.5 last:border-b-0",
218
- APP_LIST_GRID_ROW_CLASS,
219
- )}
220
- >
221
- <Skeleton className="size-8 shrink-0 rounded-xl" />
222
- <div className="min-w-0 flex-1 space-y-2">
223
- <Skeleton className="h-4 w-32" />
224
- <Skeleton className="h-3 w-2/3" />
225
- </div>
226
- <Skeleton className="h-9 w-24 shrink-0 rounded-md" />
227
- </div>
228
- ))}
229
- </AppList>
230
- );
231
- }
232
-
233
- function OtherAppsSkeletonRows() {
234
- return (
235
- <>
236
- {Array.from({ length: 4 }).map((_, index) => (
237
- <div
238
- key={index}
239
- className={cn(
240
- "flex min-w-0 items-center gap-3 border-b px-4 py-3.5 last:border-b-0",
241
- APP_LIST_GRID_ROW_CLASS,
242
- )}
243
- >
244
- <Skeleton className="size-8 shrink-0 rounded-xl" />
245
- <div className="min-w-0 flex-1 space-y-2">
246
- <Skeleton className="h-4 w-32" />
247
- <Skeleton className="h-3 w-2/3" />
248
- </div>
249
- <Skeleton className="h-9 w-24 shrink-0 rounded-md" />
250
- </div>
251
- ))}
252
- </>
253
- );
254
- }