@agent-native/dispatch 0.40.30-nightly-20261021093329 → 0.40.31

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 (150) hide show
  1. package/CHANGELOG.md +15 -60
  2. package/dist/actions/connect-external-agent.d.ts.map +1 -1
  3. package/dist/actions/connect-external-agent.js +12 -13
  4. package/dist/actions/connect-external-agent.js.map +1 -1
  5. package/dist/actions/create-workspace-resource.d.ts +13 -13
  6. package/dist/actions/delete-destination.d.ts +12 -12
  7. package/dist/actions/delete-workspace-resource.d.ts +13 -13
  8. package/dist/actions/import-agent.d.ts +13 -13
  9. package/dist/actions/index.d.ts.map +1 -1
  10. package/dist/actions/index.js +8 -0
  11. package/dist/actions/index.js.map +1 -1
  12. package/dist/actions/inspect-connect-agent-card.d.ts +5 -0
  13. package/dist/actions/inspect-connect-agent-card.d.ts.map +1 -0
  14. package/dist/actions/inspect-connect-agent-card.js +15 -0
  15. package/dist/actions/inspect-connect-agent-card.js.map +1 -0
  16. package/dist/actions/install-curated-community-app.d.ts +36 -0
  17. package/dist/actions/install-curated-community-app.d.ts.map +1 -0
  18. package/dist/actions/install-curated-community-app.js +26 -0
  19. package/dist/actions/install-curated-community-app.js.map +1 -0
  20. package/dist/actions/list-connect-marketplace-apps.d.ts +3 -0
  21. package/dist/actions/list-connect-marketplace-apps.d.ts.map +1 -0
  22. package/dist/actions/list-connect-marketplace-apps.js +15 -0
  23. package/dist/actions/list-connect-marketplace-apps.js.map +1 -0
  24. package/dist/actions/list-connected-agents.d.ts +2 -0
  25. package/dist/actions/list-connected-agents.js +7 -3
  26. package/dist/actions/list-connected-agents.js.map +1 -1
  27. package/dist/actions/list-curated-community-apps.d.ts +3 -0
  28. package/dist/actions/list-curated-community-apps.d.ts.map +1 -0
  29. package/dist/actions/list-curated-community-apps.js +10 -0
  30. package/dist/actions/list-curated-community-apps.js.map +1 -0
  31. package/dist/actions/list-workspace-connections.d.ts.map +1 -1
  32. package/dist/actions/list-workspace-connections.js +13 -18
  33. package/dist/actions/list-workspace-connections.js.map +1 -1
  34. package/dist/actions/provider-api-register.d.ts +14 -14
  35. package/dist/actions/remix-workspace-template.d.ts +6 -0
  36. package/dist/actions/update-workspace-app-metadata.d.ts +1 -0
  37. package/dist/actions/update-workspace-app-metadata.js +26 -5
  38. package/dist/actions/update-workspace-app-metadata.js.map +1 -1
  39. package/dist/components/action-query-error.d.ts +2 -1
  40. package/dist/components/action-query-error.d.ts.map +1 -1
  41. package/dist/components/action-query-error.js +25 -2
  42. package/dist/components/action-query-error.js.map +1 -1
  43. package/dist/components/chat-home-apps.d.ts.map +1 -1
  44. package/dist/components/chat-home-apps.js +2 -2
  45. package/dist/components/chat-home-apps.js.map +1 -1
  46. package/dist/components/community-apps-section.d.ts +2 -0
  47. package/dist/components/community-apps-section.d.ts.map +1 -0
  48. package/dist/components/community-apps-section.js +90 -0
  49. package/dist/components/community-apps-section.js.map +1 -0
  50. package/dist/components/dispatch-control-plane.d.ts.map +1 -1
  51. package/dist/components/dispatch-control-plane.js +1 -1
  52. package/dist/components/dispatch-control-plane.js.map +1 -1
  53. package/dist/components/layout/Layout.d.ts +1 -0
  54. package/dist/components/layout/Layout.d.ts.map +1 -1
  55. package/dist/components/layout/Layout.js +7 -0
  56. package/dist/components/layout/Layout.js.map +1 -1
  57. package/dist/components/workspace-app-card.d.ts.map +1 -1
  58. package/dist/components/workspace-app-card.js +63 -9
  59. package/dist/components/workspace-app-card.js.map +1 -1
  60. package/dist/lib/connect-apps.d.ts +1 -2
  61. package/dist/lib/connect-apps.d.ts.map +1 -1
  62. package/dist/lib/connect-apps.js +41 -65
  63. package/dist/lib/connect-apps.js.map +1 -1
  64. package/dist/lib/workspace-apps.d.ts +1 -0
  65. package/dist/lib/workspace-apps.d.ts.map +1 -1
  66. package/dist/lib/workspace-apps.js.map +1 -1
  67. package/dist/routes/pages/$appId.d.ts.map +1 -1
  68. package/dist/routes/pages/$appId.js +1 -1
  69. package/dist/routes/pages/$appId.js.map +1 -1
  70. package/dist/routes/pages/apps.d.ts.map +1 -1
  71. package/dist/routes/pages/apps.js +3 -2
  72. package/dist/routes/pages/apps.js.map +1 -1
  73. package/dist/routes/pages/connect.d.ts.map +1 -1
  74. package/dist/routes/pages/connect.js +5 -7
  75. package/dist/routes/pages/connect.js.map +1 -1
  76. package/dist/server/index.d.ts +2 -0
  77. package/dist/server/index.d.ts.map +1 -1
  78. package/dist/server/index.js +2 -0
  79. package/dist/server/index.js.map +1 -1
  80. package/dist/server/lib/app-creation-store.d.ts +11 -1
  81. package/dist/server/lib/app-creation-store.d.ts.map +1 -1
  82. package/dist/server/lib/app-creation-store.js +379 -92
  83. package/dist/server/lib/app-creation-store.js.map +1 -1
  84. package/dist/server/lib/community-apps.d.ts +45 -0
  85. package/dist/server/lib/community-apps.d.ts.map +1 -0
  86. package/dist/server/lib/community-apps.js +267 -0
  87. package/dist/server/lib/community-apps.js.map +1 -0
  88. package/dist/server/lib/community-source.d.ts +19 -0
  89. package/dist/server/lib/community-source.d.ts.map +1 -0
  90. package/dist/server/lib/community-source.js +118 -0
  91. package/dist/server/lib/community-source.js.map +1 -0
  92. package/dist/server/lib/connect-apps.d.ts +4 -0
  93. package/dist/server/lib/connect-apps.d.ts.map +1 -0
  94. package/dist/server/lib/connect-apps.js +99 -0
  95. package/dist/server/lib/connect-apps.js.map +1 -0
  96. package/dist/server/lib/org-apps-directory-cache.d.ts +20 -0
  97. package/dist/server/lib/org-apps-directory-cache.d.ts.map +1 -0
  98. package/dist/server/lib/org-apps-directory-cache.js +44 -0
  99. package/dist/server/lib/org-apps-directory-cache.js.map +1 -0
  100. package/dist/server/plugins/integrations.js +3 -3
  101. package/dist/server/plugins/integrations.js.map +1 -1
  102. package/dist/shared/labs.d.ts +2 -0
  103. package/dist/shared/labs.d.ts.map +1 -0
  104. package/dist/shared/labs.js +8 -0
  105. package/dist/shared/labs.js.map +1 -0
  106. package/package.json +5 -4
  107. package/src/actions/connect-external-agent.spec.ts +101 -3
  108. package/src/actions/connect-external-agent.ts +12 -11
  109. package/src/actions/index.spec.ts +13 -0
  110. package/src/actions/index.ts +8 -0
  111. package/src/actions/inspect-connect-agent-card.ts +17 -0
  112. package/src/actions/install-curated-community-app.ts +32 -0
  113. package/src/actions/list-connect-marketplace-apps.ts +17 -0
  114. package/src/actions/list-connected-agents.spec.ts +17 -1
  115. package/src/actions/list-connected-agents.ts +7 -2
  116. package/src/actions/list-curated-community-apps.ts +12 -0
  117. package/src/actions/list-workspace-connections.spec.ts +14 -3
  118. package/src/actions/list-workspace-connections.ts +13 -17
  119. package/src/actions/update-workspace-app-metadata.spec.ts +25 -0
  120. package/src/actions/update-workspace-app-metadata.ts +48 -24
  121. package/src/components/action-query-error.spec.tsx +20 -0
  122. package/src/components/action-query-error.tsx +40 -0
  123. package/src/components/chat-home-apps.spec.tsx +32 -1
  124. package/src/components/chat-home-apps.tsx +6 -1
  125. package/src/components/community-apps-section.tsx +224 -0
  126. package/src/components/dispatch-control-plane.tsx +1 -0
  127. package/src/components/layout/Layout.tsx +9 -0
  128. package/src/components/workspace-app-card.spec.tsx +226 -1
  129. package/src/components/workspace-app-card.tsx +115 -12
  130. package/src/lib/connect-apps.spec.ts +118 -66
  131. package/src/lib/connect-apps.ts +47 -82
  132. package/src/lib/workspace-apps.ts +1 -0
  133. package/src/routes/pages/$appId.tsx +1 -0
  134. package/src/routes/pages/apps.spec.tsx +227 -3
  135. package/src/routes/pages/apps.tsx +5 -0
  136. package/src/routes/pages/connect.spec.tsx +53 -6
  137. package/src/routes/pages/connect.tsx +14 -11
  138. package/src/server/index.ts +9 -0
  139. package/src/server/lib/app-creation-store.spec.ts +820 -16
  140. package/src/server/lib/app-creation-store.ts +504 -101
  141. package/src/server/lib/community-apps.spec.ts +367 -0
  142. package/src/server/lib/community-apps.ts +372 -0
  143. package/src/server/lib/community-source.spec.ts +151 -0
  144. package/src/server/lib/community-source.ts +186 -0
  145. package/src/server/lib/connect-apps.ts +149 -0
  146. package/src/server/lib/org-apps-directory-cache.spec.ts +71 -0
  147. package/src/server/lib/org-apps-directory-cache.ts +66 -0
  148. package/src/server/plugins/integrations.spec.ts +60 -0
  149. package/src/server/plugins/integrations.ts +3 -3
  150. package/src/shared/labs.ts +9 -0
@@ -0,0 +1,90 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { sendToAgentChat } from "@agent-native/core/client/agent-chat";
3
+ import { useActionMutation, useActionQuery, } from "@agent-native/core/client/hooks";
4
+ import { useT } from "@agent-native/core/client/i18n";
5
+ import { useLab } from "@agent-native/core/client/labs";
6
+ import { IconArrowUpRight, IconCircleCheck, IconPlus, } from "@tabler/icons-react";
7
+ import { useState } from "react";
8
+ import { toast } from "sonner";
9
+ import { COMMUNITY_APPS_LAB } from "../shared/labs.js";
10
+ import { ActionQueryError } from "./action-query-error.js";
11
+ import { AppIcon } from "./app-icon.js";
12
+ import { AppList, AppListRow } from "./app-list-row.js";
13
+ import { Badge } from "./ui/badge.js";
14
+ import { Button } from "./ui/button.js";
15
+ import { Skeleton } from "./ui/skeleton.js";
16
+ import { Spinner } from "./ui/spinner.js";
17
+ function pinnedSourceUrl(source) {
18
+ return ("https://github.com/" +
19
+ source.repo +
20
+ "/tree/" +
21
+ source.ref +
22
+ "/" +
23
+ source.templatePath);
24
+ }
25
+ export function CommunityAppsSection() {
26
+ const t = useT();
27
+ const enabled = useLab(COMMUNITY_APPS_LAB);
28
+ const [installingId, setInstallingId] = useState(null);
29
+ const catalogQuery = useActionQuery("list-curated-community-apps", {}, { enabled });
30
+ const workspaceAppsQuery = useActionQuery("list-workspace-apps", {
31
+ includeAgentCards: false,
32
+ includeArchived: true,
33
+ });
34
+ const install = useActionMutation("install-curated-community-app", {
35
+ onSuccess: (result) => {
36
+ const mode = result?.mode;
37
+ const message = result?.message;
38
+ if (mode === "builder") {
39
+ toast.success(t("dispatch.pages.communityAppsInstallStarted"));
40
+ }
41
+ else if (mode === "pending") {
42
+ toast.info(t("dispatch.pages.communityAppsPending"));
43
+ }
44
+ else if (mode === "already-installed") {
45
+ toast.success(t("dispatch.pages.communityAppsAlreadyInstalled"));
46
+ }
47
+ else if (mode === "builder-unavailable" || mode === "app-id-taken") {
48
+ toast.error(message || t("dispatch.pages.communityAppsInstallFailed"));
49
+ }
50
+ else if (mode === "local-agent") {
51
+ sendToAgentChat({
52
+ message: result?.prompt ||
53
+ t("dispatch.pages.communityAppsLocalRequestReady"),
54
+ attachments: result?.attachments,
55
+ submit: true,
56
+ type: "code",
57
+ newTab: true,
58
+ reuseEmptyTab: true,
59
+ });
60
+ toast.info(t("dispatch.pages.communityAppsLocalRequestReady"));
61
+ }
62
+ else {
63
+ toast.error(t("dispatch.pages.communityAppsInstallFailed"));
64
+ }
65
+ setInstallingId(null);
66
+ void catalogQuery.refetch();
67
+ void workspaceAppsQuery.refetch();
68
+ },
69
+ onError: () => {
70
+ setInstallingId(null);
71
+ toast.error(t("dispatch.pages.communityAppsInstallFailed"));
72
+ },
73
+ });
74
+ if (!enabled)
75
+ return null;
76
+ return (_jsxs("section", { className: "space-y-3 border-t pt-6", children: [_jsx("h2", { className: "text-sm font-semibold text-foreground", children: t("dispatch.pages.communityApps") }), catalogQuery.isError ? (_jsx(ActionQueryError, { error: catalogQuery.error, onRetry: () => void catalogQuery.refetch() })) : catalogQuery.isLoading ? (_jsx(AppList, { className: "divide-y rounded-xl border", children: _jsxs("div", { className: "flex items-center gap-3 px-4 py-3.5", children: [_jsx(Skeleton, { className: "size-8 rounded-lg" }), _jsx(Skeleton, { className: "h-4 w-40" })] }) })) : catalogQuery.data?.length ? (_jsx(AppList, { className: "divide-y rounded-xl border", children: catalogQuery.data.map((source) => (_jsxs(AppListRow, { className: "border-b-0", children: [_jsx(AppIcon, { id: source.id, name: source.name, size: "sm" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2", children: [_jsx("h3", { className: "truncate text-sm font-semibold text-foreground", children: source.name }), source.installed ? (_jsxs(Badge, { variant: "secondary", className: "gap-1", children: [_jsx(IconCircleCheck, { size: 13 }), t("dispatch.pages.communityAppsInstalled")] })) : source.pending ? (_jsx(Badge, { variant: "secondary", children: t("dispatch.pages.communityAppsPending") })) : null] }), source.description ? (_jsx("p", { className: "mt-0.5 truncate text-xs text-muted-foreground", children: source.description })) : null, _jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-x-2 text-xs text-muted-foreground", children: [_jsxs("span", { children: [t("dispatch.pages.communityAppsLicense"), ": ", source.license] }), _jsxs("a", { href: pinnedSourceUrl(source), target: "_blank", rel: "noreferrer", className: "inline-flex items-center gap-1 underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [t("dispatch.pages.communityAppsTemplateSource"), _jsx(IconArrowUpRight, { size: 12, "aria-hidden": "true" })] })] })] }), source.installable ? (_jsxs(Button, { type: "button", size: "sm", variant: "outline", disabled: install.isPending, onClick: () => {
77
+ setInstallingId(source.id);
78
+ install.mutate({ sourceId: source.id });
79
+ }, children: [install.isPending && installingId === source.id ? (_jsx(Spinner, { className: "mr-1.5" })) : (_jsx(IconPlus, { size: 14, className: "mr-1.5" })), install.isPending && installingId === source.id
80
+ ? t("dispatch.pages.communityAppsInstalling")
81
+ : t("dispatch.pages.communityAppsInstall")] })) : !source.installed &&
82
+ !source.pending &&
83
+ source.installUnavailableReason === "workspace-required" ? (_jsx("span", { className: "max-w-48 text-right text-xs text-muted-foreground", children: t("dispatch.pages.communityAppsWorkspaceRequired") })) : !source.installed &&
84
+ !source.pending &&
85
+ source.installUnavailableReason === "app-id-conflict" ? (_jsx("span", { className: "max-w-48 text-right text-xs text-muted-foreground", children: t("dispatch.pages.communityAppsIdConflict") })) : !source.installed &&
86
+ !source.pending &&
87
+ source.installUnavailableReason ===
88
+ "builder-install-unverified" ? (_jsx("span", { className: "max-w-48 text-right text-xs text-muted-foreground", children: t("dispatch.pages.communityAppsBuilderInstallUnavailable") })) : null] }, source.id))) })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: t("dispatch.pages.communityAppsEmpty") }))] }));
89
+ }
90
+ //# sourceMappingURL=community-apps-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community-apps-section.js","sourceRoot":"","sources":["../../src/components/community-apps-section.tsx"],"names":[],"mappings":"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","sourcesContent":["import { sendToAgentChat } from \"@agent-native/core/client/agent-chat\";\nimport {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { useLab } from \"@agent-native/core/client/labs\";\nimport {\n IconArrowUpRight,\n IconCircleCheck,\n IconPlus,\n} from \"@tabler/icons-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { COMMUNITY_APPS_LAB } from \"../shared/labs.js\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport { AppIcon } from \"./app-icon\";\nimport { AppList, AppListRow } from \"./app-list-row\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { Spinner } from \"./ui/spinner\";\n\ninterface CommunityAppSource {\n id: string;\n name: string;\n description?: string;\n appId: string;\n repo: string;\n ref: string;\n license: string;\n provenance: string;\n templatePath: string;\n installed: boolean;\n pending: boolean;\n installable: boolean;\n installUnavailableReason?:\n | \"workspace-required\"\n | \"app-id-conflict\"\n | \"builder-install-unverified\";\n}\n\nfunction pinnedSourceUrl(source: CommunityAppSource): string {\n return (\n \"https://github.com/\" +\n source.repo +\n \"/tree/\" +\n source.ref +\n \"/\" +\n source.templatePath\n );\n}\n\nexport function CommunityAppsSection() {\n const t = useT();\n const enabled = useLab(COMMUNITY_APPS_LAB);\n const [installingId, setInstallingId] = useState<string | null>(null);\n const catalogQuery = useActionQuery<CommunityAppSource[]>(\n \"list-curated-community-apps\" as never,\n {},\n { enabled },\n );\n const workspaceAppsQuery = useActionQuery(\"list-workspace-apps\", {\n includeAgentCards: false,\n includeArchived: true,\n });\n const install = useActionMutation(\"install-curated-community-app\", {\n onSuccess: (result) => {\n const mode = (result as { mode?: string } | null)?.mode;\n const message = (result as { message?: string } | null)?.message;\n if (mode === \"builder\") {\n toast.success(t(\"dispatch.pages.communityAppsInstallStarted\"));\n } else if (mode === \"pending\") {\n toast.info(t(\"dispatch.pages.communityAppsPending\"));\n } else if (mode === \"already-installed\") {\n toast.success(t(\"dispatch.pages.communityAppsAlreadyInstalled\"));\n } else if (mode === \"builder-unavailable\" || mode === \"app-id-taken\") {\n toast.error(message || t(\"dispatch.pages.communityAppsInstallFailed\"));\n } else if (mode === \"local-agent\") {\n sendToAgentChat({\n message:\n (result as { prompt?: string } | null)?.prompt ||\n t(\"dispatch.pages.communityAppsLocalRequestReady\"),\n attachments: (\n result as {\n attachments?: Array<{\n type: \"file\";\n name: string;\n contentType: string;\n text: string;\n }>;\n } | null\n )?.attachments,\n submit: true,\n type: \"code\",\n newTab: true,\n reuseEmptyTab: true,\n });\n toast.info(t(\"dispatch.pages.communityAppsLocalRequestReady\"));\n } else {\n toast.error(t(\"dispatch.pages.communityAppsInstallFailed\"));\n }\n setInstallingId(null);\n void catalogQuery.refetch();\n void workspaceAppsQuery.refetch();\n },\n onError: () => {\n setInstallingId(null);\n toast.error(t(\"dispatch.pages.communityAppsInstallFailed\"));\n },\n });\n\n if (!enabled) return null;\n\n return (\n <section className=\"space-y-3 border-t pt-6\">\n <h2 className=\"text-sm font-semibold text-foreground\">\n {t(\"dispatch.pages.communityApps\")}\n </h2>\n {catalogQuery.isError ? (\n <ActionQueryError\n error={catalogQuery.error}\n onRetry={() => void catalogQuery.refetch()}\n />\n ) : catalogQuery.isLoading ? (\n <AppList className=\"divide-y rounded-xl border\">\n <div className=\"flex items-center gap-3 px-4 py-3.5\">\n <Skeleton className=\"size-8 rounded-lg\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n </AppList>\n ) : catalogQuery.data?.length ? (\n <AppList className=\"divide-y rounded-xl border\">\n {catalogQuery.data.map((source) => (\n <AppListRow key={source.id} className=\"border-b-0\">\n <AppIcon id={source.id} name={source.name} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">\n {source.name}\n </h3>\n {source.installed ? (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <IconCircleCheck size={13} />\n {t(\"dispatch.pages.communityAppsInstalled\")}\n </Badge>\n ) : source.pending ? (\n <Badge variant=\"secondary\">\n {t(\"dispatch.pages.communityAppsPending\")}\n </Badge>\n ) : null}\n </div>\n {source.description ? (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {source.description}\n </p>\n ) : null}\n <div className=\"mt-1 flex flex-wrap items-center gap-x-2 text-xs text-muted-foreground\">\n <span>\n {t(\"dispatch.pages.communityAppsLicense\")}: {source.license}\n </span>\n <a\n href={pinnedSourceUrl(source)}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {t(\"dispatch.pages.communityAppsTemplateSource\")}\n <IconArrowUpRight size={12} aria-hidden=\"true\" />\n </a>\n </div>\n </div>\n {source.installable ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={install.isPending}\n onClick={() => {\n setInstallingId(source.id);\n install.mutate({ sourceId: source.id });\n }}\n >\n {install.isPending && installingId === source.id ? (\n <Spinner className=\"mr-1.5\" />\n ) : (\n <IconPlus size={14} className=\"mr-1.5\" />\n )}\n {install.isPending && installingId === source.id\n ? t(\"dispatch.pages.communityAppsInstalling\")\n : t(\"dispatch.pages.communityAppsInstall\")}\n </Button>\n ) : !source.installed &&\n !source.pending &&\n source.installUnavailableReason === \"workspace-required\" ? (\n <span className=\"max-w-48 text-right text-xs text-muted-foreground\">\n {t(\"dispatch.pages.communityAppsWorkspaceRequired\")}\n </span>\n ) : !source.installed &&\n !source.pending &&\n source.installUnavailableReason === \"app-id-conflict\" ? (\n <span className=\"max-w-48 text-right text-xs text-muted-foreground\">\n {t(\"dispatch.pages.communityAppsIdConflict\")}\n </span>\n ) : !source.installed &&\n !source.pending &&\n source.installUnavailableReason ===\n \"builder-install-unverified\" ? (\n <span className=\"max-w-48 text-right text-xs text-muted-foreground\">\n {t(\"dispatch.pages.communityAppsBuilderInstallUnavailable\")}\n </span>\n ) : null}\n </AppListRow>\n ))}\n </AppList>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n {t(\"dispatch.pages.communityAppsEmpty\")}\n </p>\n )}\n </section>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-control-plane.d.ts","sourceRoot":"","sources":["../../src/components/dispatch-control-plane.tsx"],"names":[],"mappings":"AA2VA,wBAAgB,oBAAoB,oDAqBnC"}
1
+ {"version":3,"file":"dispatch-control-plane.d.ts","sourceRoot":"","sources":["../../src/components/dispatch-control-plane.tsx"],"names":[],"mappings":"AA2VA,wBAAgB,oBAAoB,oDAsBnC"}
@@ -103,6 +103,6 @@ export function DispatchControlPlane() {
103
103
  useSetPageTitle(_jsx("span", { "aria-hidden": true }));
104
104
  const appsQuery = useActionQuery("list-workspace-apps", { includeAgentCards: false, includeArchived: true });
105
105
  const { data: workspaceApps = [], isLoading: appsLoading } = appsQuery;
106
- return (_jsxs("div", { className: "flex flex-col gap-8", children: [_jsx(CommandPanel, {}), appsQuery.isError ? (_jsx(ActionQueryError, { error: appsQuery.error, onRetry: () => void appsQuery.refetch() })) : (_jsx(AppsPanel, { apps: workspaceApps ?? [], isLoading: appsLoading }))] }));
106
+ return (_jsxs("div", { className: "flex flex-col gap-8", children: [_jsx(CommandPanel, {}), appsQuery.isError ? (_jsx(ActionQueryError, { error: appsQuery.error, onRetry: () => void appsQuery.refetch(), queryName: "list-workspace-apps" })) : (_jsx(AppsPanel, { apps: workspaceApps ?? [], isLoading: appsLoading }))] }));
107
107
  }
108
108
  //# sourceMappingURL=dispatch-control-plane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-control-plane.js","sourceRoot":"","sources":["../../src/components/dispatch-control-plane.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n chatModelSelectionStorageKey,\n navigateWithAgentChatViewTransition,\n useChatModels,\n} from \"@agent-native/core/client/agent-chat\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { useOrgRole } from \"@agent-native/core/client/org\";\nimport {\n PromptBar,\n PromptComposer,\n} from \"@agent-native/toolkit/app/chat/composer/index\";\nimport { IconChevronDown, IconClockHour4, IconPlus } from \"@tabler/icons-react\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n orderWorkspaceApps,\n useWorkspaceAppLayout,\n workspaceAppMatchesQuery,\n} from \"../lib/workspace-app-layout\";\nimport {\n isWorkspaceAppVisibleInDefaultLaunchers,\n type WorkspaceAppSummary,\n} from \"../lib/workspace-apps\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport {\n APP_LIST_GRID_CLASS,\n AppList,\n APP_LIST_GRID_ROW_CLASS,\n} from \"./app-list-row\";\nimport { CreateAppPopover } from \"./create-app-popover\";\nimport { useSetPageTitle } from \"./layout/HeaderActions\";\nimport { Button } from \"./ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { WorkspaceAppCard } from \"./workspace-app-card\";\nimport {\n WorkspaceAppSearch,\n WorkspaceAppSearchEmpty,\n} from \"./workspace-app-search\";\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <h2 className=\"truncate text-sm font-semibold text-foreground\">\n {title}\n </h2>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n );\n}\n\nfunction CommandPanel() {\n const t = useT();\n const { org } = useOrgRole();\n const draftScope = org?.orgId?.trim()\n ? `dispatch:overview:${org.orgId}`\n : \"dispatch:overview\";\n const {\n availableModels,\n isLoading: modelListLoading,\n onEffortChange,\n onModelChange,\n selectedEffort,\n selectedEngine,\n selectedModel,\n } = useChatModels({ storageKey: chatModelSelectionStorageKey(\"dispatch\") });\n const navigate = useNavigate();\n const promptSuggestions = [\n t(\"dispatch.pages.suggestionOnboardingApp\", {\n defaultValue: \"Create an app for onboarding requests\",\n }),\n t(\"dispatch.pages.suggestionAnalyticsAgents\", {\n defaultValue: \"Check which agents can help with analytics\",\n }),\n ];\n\n function send(message: string) {\n const trimmed = message.trim();\n if (!trimmed) return;\n\n navigateWithAgentChatViewTransition(navigate, \"/chat\", {\n state: {\n dispatchPrompt: {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n message: trimmed,\n selectedModel,\n selectedEngine,\n selectedEffort,\n },\n },\n });\n }\n\n return (\n <section className=\"flex flex-col\">\n <div className=\"mx-auto flex w-full max-w-[750px] flex-col pt-4 sm:pt-6\">\n <div className=\"mb-5 text-center\">\n <h2 className=\"text-2xl font-semibold tracking-tight text-foreground sm:text-3xl\">\n {t(\"dispatch.pages.chatAcrossApps\", {\n defaultValue: \"Chat across your apps\",\n })}\n </h2>\n <p className=\"mx-auto mt-2 max-w-xl text-sm leading-6 text-muted-foreground\">\n {t(\"dispatch.pages.chatAcrossAppsDescription\", {\n defaultValue:\n \"Route work, inspect status, or create something new from one place.\",\n })}\n </p>\n </div>\n <PromptBar mode=\"inline\" className=\"contents\">\n <PromptComposer\n requireAgentEngine\n availableModels={availableModels}\n draftScope={draftScope}\n modelListLoading={modelListLoading}\n placeholder={t(\"dispatch.pages.overviewPromptPlaceholder\", {\n defaultValue: \"Ask Dispatch anything...\",\n })}\n selectedEffort={selectedEffort}\n selectedEngine={selectedEngine}\n selectedModel={selectedModel}\n layoutVariant=\"hero\"\n rootClassName=\"bg-card\"\n onEffortChange={onEffortChange}\n onModelChange={onModelChange}\n onSubmit={(text) => send(text)}\n />\n </PromptBar>\n <div className=\"mt-3 flex flex-wrap justify-center gap-2\">\n {promptSuggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => send(suggestion)}\n className=\"cursor-pointer rounded-md border border-transparent bg-muted/60 px-2.5 py-1.5 text-xs text-muted-foreground transition-[background-color,color] hover:bg-muted hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n </section>\n );\n}\n\nfunction AppsPanel({\n apps,\n isLoading,\n}: {\n apps: WorkspaceAppSummary[];\n isLoading: boolean;\n}) {\n const t = useT();\n const [showPending, setShowPending] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const { layout, persistenceError, togglePinned } = useWorkspaceAppLayout();\n const visibleApps = apps.filter(\n (app) => isWorkspaceAppVisibleInDefaultLaunchers(app) && !app.archived,\n );\n const activeApps = visibleApps.filter((app) => app.status !== \"pending\");\n const pendingApps = visibleApps.filter((app) => app.status === \"pending\");\n const orderedActiveApps = orderWorkspaceApps(activeApps, layout);\n const orderedPendingApps = orderWorkspaceApps(pendingApps, layout);\n const filteredActiveApps = orderedActiveApps.filter((app) =>\n workspaceAppMatchesQuery(app, searchQuery),\n );\n const filteredPendingApps = orderedPendingApps.filter((app) =>\n workspaceAppMatchesQuery(app, searchQuery),\n );\n const hasSearchResults =\n filteredActiveApps.length > 0 || filteredPendingApps.length > 0;\n const showSkeletons =\n isLoading && activeApps.length === 0 && pendingApps.length === 0;\n\n return (\n <section className=\"mx-auto flex w-full max-w-[1000px] flex-col gap-3\">\n <SectionHeader\n title=\"Apps\"\n action={\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-1.5\">\n <Button variant=\"ghost\" size=\"sm\" asChild>\n <Link to=\"/apps\" className=\"text-muted-foreground\">\n View all\n </Link>\n </Button>\n {!showSkeletons &&\n (visibleApps.length > 0 || Boolean(searchQuery.trim())) ? (\n <WorkspaceAppSearch\n className=\"w-[220px]\"\n query={searchQuery}\n onQueryChange={setSearchQuery}\n />\n ) : null}\n <CreateAppPopover\n align=\"end\"\n trigger={\n <Button variant=\"default\" size=\"sm\" className=\"gap-1.5\">\n <IconPlus size={14} />\n {t(\"dispatch.pages.newApp\", { defaultValue: \"New\" })}\n </Button>\n }\n />\n </div>\n }\n />\n {!showSkeletons && visibleApps.length > 0 && persistenceError ? (\n <p className=\"text-xs text-muted-foreground\" role=\"status\">\n {persistenceError === \"both\"\n ? t(\"dispatch.pages.appPinSaveFailed\", {\n defaultValue: \"App pins could not be saved.\",\n })\n : t(\"dispatch.pages.appPinSavedLocally\", {\n defaultValue: \"App pins are saved on this device only.\",\n })}\n </p>\n ) : null}\n {showSkeletons ? (\n <OverviewAppsSkeleton />\n ) : searchQuery.trim() && !hasSearchResults ? (\n <WorkspaceAppSearchEmpty\n query={searchQuery}\n onClear={() => setSearchQuery(\"\")}\n />\n ) : (\n <>\n <AppList className={APP_LIST_GRID_CLASS}>\n {filteredActiveApps.map((app) => (\n <WorkspaceAppCard\n key={app.id}\n app={app}\n className={APP_LIST_GRID_ROW_CLASS}\n isPinned={layout.pinnedIds.includes(app.id.toLowerCase())}\n onTogglePinned={() => togglePinned(app.id)}\n />\n ))}\n {filteredActiveApps.length === 0 &&\n pendingApps.length === 0 &&\n !searchQuery.trim() ? (\n <p className=\"px-4 py-3 text-sm text-muted-foreground\">\n {t(\"dispatch.pages.noApps\", {\n defaultValue: \"No apps yet.\",\n })}\n </p>\n ) : null}\n </AppList>\n </>\n )}\n {pendingApps.length > 0 &&\n (!searchQuery.trim() || filteredPendingApps.length > 0) ? (\n <Collapsible\n open={showPending || Boolean(searchQuery.trim())}\n onOpenChange={setShowPending}\n >\n <div className=\"space-y-3 border-t pt-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <IconClockHour4\n size={15}\n className=\"shrink-0 text-muted-foreground\"\n />\n <div className=\"min-w-0\">\n <h3 className=\"text-xs font-semibold text-foreground\">\n {t(\"dispatch.pages.pendingApps\")}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\"dispatch.pages.pendingAppsDescription\", {\n count: pendingApps.length,\n })}\n </p>\n </div>\n </div>\n <CollapsibleTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-xs\"\n >\n {showPending || Boolean(searchQuery.trim())\n ? t(\"dispatch.pages.hidePendingApps\")\n : t(\"dispatch.pages.showPendingApps\")}\n <IconChevronDown\n size={13}\n className={\n showPending || searchQuery.trim()\n ? \"rotate-180\"\n : undefined\n }\n />\n </Button>\n </CollapsibleTrigger>\n </div>\n <CollapsibleContent>\n <AppList className={APP_LIST_GRID_CLASS}>\n {filteredPendingApps.map((app) => (\n <WorkspaceAppCard\n key={app.id}\n app={app}\n className={APP_LIST_GRID_ROW_CLASS}\n />\n ))}\n </AppList>\n </CollapsibleContent>\n </div>\n </Collapsible>\n ) : null}\n </section>\n );\n}\n\nfunction OverviewAppsSkeleton() {\n return (\n <AppList className={APP_LIST_GRID_CLASS}>\n {Array.from({ length: 4 }).map((_, index) => (\n <div\n key={index}\n className={cn(\n \"flex min-w-0 items-center gap-3 border-b px-4 py-3.5 last:border-b-0\",\n APP_LIST_GRID_ROW_CLASS,\n )}\n >\n <Skeleton className=\"size-8 shrink-0 rounded-xl\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-3 w-2/3\" />\n </div>\n <Skeleton className=\"h-9 w-24 shrink-0 rounded-md\" />\n </div>\n ))}\n </AppList>\n );\n}\n\nexport function DispatchControlPlane() {\n useSetPageTitle(<span aria-hidden />);\n const appsQuery = useActionQuery<WorkspaceAppSummary[]>(\n \"list-workspace-apps\",\n { includeAgentCards: false, includeArchived: true },\n );\n const { data: workspaceApps = [], isLoading: appsLoading } = appsQuery;\n\n return (\n <div className=\"flex flex-col gap-8\">\n <CommandPanel />\n {appsQuery.isError ? (\n <ActionQueryError\n error={appsQuery.error}\n onRetry={() => void appsQuery.refetch()}\n />\n ) : (\n <AppsPanel apps={workspaceApps ?? []} isLoading={appsLoading} />\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"dispatch-control-plane.js","sourceRoot":"","sources":["../../src/components/dispatch-control-plane.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n chatModelSelectionStorageKey,\n navigateWithAgentChatViewTransition,\n useChatModels,\n} from \"@agent-native/core/client/agent-chat\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { useOrgRole } from \"@agent-native/core/client/org\";\nimport {\n PromptBar,\n PromptComposer,\n} from \"@agent-native/toolkit/app/chat/composer/index\";\nimport { IconChevronDown, IconClockHour4, IconPlus } from \"@tabler/icons-react\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n orderWorkspaceApps,\n useWorkspaceAppLayout,\n workspaceAppMatchesQuery,\n} from \"../lib/workspace-app-layout\";\nimport {\n isWorkspaceAppVisibleInDefaultLaunchers,\n type WorkspaceAppSummary,\n} from \"../lib/workspace-apps\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport {\n APP_LIST_GRID_CLASS,\n AppList,\n APP_LIST_GRID_ROW_CLASS,\n} from \"./app-list-row\";\nimport { CreateAppPopover } from \"./create-app-popover\";\nimport { useSetPageTitle } from \"./layout/HeaderActions\";\nimport { Button } from \"./ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { WorkspaceAppCard } from \"./workspace-app-card\";\nimport {\n WorkspaceAppSearch,\n WorkspaceAppSearchEmpty,\n} from \"./workspace-app-search\";\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <h2 className=\"truncate text-sm font-semibold text-foreground\">\n {title}\n </h2>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n );\n}\n\nfunction CommandPanel() {\n const t = useT();\n const { org } = useOrgRole();\n const draftScope = org?.orgId?.trim()\n ? `dispatch:overview:${org.orgId}`\n : \"dispatch:overview\";\n const {\n availableModels,\n isLoading: modelListLoading,\n onEffortChange,\n onModelChange,\n selectedEffort,\n selectedEngine,\n selectedModel,\n } = useChatModels({ storageKey: chatModelSelectionStorageKey(\"dispatch\") });\n const navigate = useNavigate();\n const promptSuggestions = [\n t(\"dispatch.pages.suggestionOnboardingApp\", {\n defaultValue: \"Create an app for onboarding requests\",\n }),\n t(\"dispatch.pages.suggestionAnalyticsAgents\", {\n defaultValue: \"Check which agents can help with analytics\",\n }),\n ];\n\n function send(message: string) {\n const trimmed = message.trim();\n if (!trimmed) return;\n\n navigateWithAgentChatViewTransition(navigate, \"/chat\", {\n state: {\n dispatchPrompt: {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n message: trimmed,\n selectedModel,\n selectedEngine,\n selectedEffort,\n },\n },\n });\n }\n\n return (\n <section className=\"flex flex-col\">\n <div className=\"mx-auto flex w-full max-w-[750px] flex-col pt-4 sm:pt-6\">\n <div className=\"mb-5 text-center\">\n <h2 className=\"text-2xl font-semibold tracking-tight text-foreground sm:text-3xl\">\n {t(\"dispatch.pages.chatAcrossApps\", {\n defaultValue: \"Chat across your apps\",\n })}\n </h2>\n <p className=\"mx-auto mt-2 max-w-xl text-sm leading-6 text-muted-foreground\">\n {t(\"dispatch.pages.chatAcrossAppsDescription\", {\n defaultValue:\n \"Route work, inspect status, or create something new from one place.\",\n })}\n </p>\n </div>\n <PromptBar mode=\"inline\" className=\"contents\">\n <PromptComposer\n requireAgentEngine\n availableModels={availableModels}\n draftScope={draftScope}\n modelListLoading={modelListLoading}\n placeholder={t(\"dispatch.pages.overviewPromptPlaceholder\", {\n defaultValue: \"Ask Dispatch anything...\",\n })}\n selectedEffort={selectedEffort}\n selectedEngine={selectedEngine}\n selectedModel={selectedModel}\n layoutVariant=\"hero\"\n rootClassName=\"bg-card\"\n onEffortChange={onEffortChange}\n onModelChange={onModelChange}\n onSubmit={(text) => send(text)}\n />\n </PromptBar>\n <div className=\"mt-3 flex flex-wrap justify-center gap-2\">\n {promptSuggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => send(suggestion)}\n className=\"cursor-pointer rounded-md border border-transparent bg-muted/60 px-2.5 py-1.5 text-xs text-muted-foreground transition-[background-color,color] hover:bg-muted hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n </section>\n );\n}\n\nfunction AppsPanel({\n apps,\n isLoading,\n}: {\n apps: WorkspaceAppSummary[];\n isLoading: boolean;\n}) {\n const t = useT();\n const [showPending, setShowPending] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const { layout, persistenceError, togglePinned } = useWorkspaceAppLayout();\n const visibleApps = apps.filter(\n (app) => isWorkspaceAppVisibleInDefaultLaunchers(app) && !app.archived,\n );\n const activeApps = visibleApps.filter((app) => app.status !== \"pending\");\n const pendingApps = visibleApps.filter((app) => app.status === \"pending\");\n const orderedActiveApps = orderWorkspaceApps(activeApps, layout);\n const orderedPendingApps = orderWorkspaceApps(pendingApps, layout);\n const filteredActiveApps = orderedActiveApps.filter((app) =>\n workspaceAppMatchesQuery(app, searchQuery),\n );\n const filteredPendingApps = orderedPendingApps.filter((app) =>\n workspaceAppMatchesQuery(app, searchQuery),\n );\n const hasSearchResults =\n filteredActiveApps.length > 0 || filteredPendingApps.length > 0;\n const showSkeletons =\n isLoading && activeApps.length === 0 && pendingApps.length === 0;\n\n return (\n <section className=\"mx-auto flex w-full max-w-[1000px] flex-col gap-3\">\n <SectionHeader\n title=\"Apps\"\n action={\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-1.5\">\n <Button variant=\"ghost\" size=\"sm\" asChild>\n <Link to=\"/apps\" className=\"text-muted-foreground\">\n View all\n </Link>\n </Button>\n {!showSkeletons &&\n (visibleApps.length > 0 || Boolean(searchQuery.trim())) ? (\n <WorkspaceAppSearch\n className=\"w-[220px]\"\n query={searchQuery}\n onQueryChange={setSearchQuery}\n />\n ) : null}\n <CreateAppPopover\n align=\"end\"\n trigger={\n <Button variant=\"default\" size=\"sm\" className=\"gap-1.5\">\n <IconPlus size={14} />\n {t(\"dispatch.pages.newApp\", { defaultValue: \"New\" })}\n </Button>\n }\n />\n </div>\n }\n />\n {!showSkeletons && visibleApps.length > 0 && persistenceError ? (\n <p className=\"text-xs text-muted-foreground\" role=\"status\">\n {persistenceError === \"both\"\n ? t(\"dispatch.pages.appPinSaveFailed\", {\n defaultValue: \"App pins could not be saved.\",\n })\n : t(\"dispatch.pages.appPinSavedLocally\", {\n defaultValue: \"App pins are saved on this device only.\",\n })}\n </p>\n ) : null}\n {showSkeletons ? (\n <OverviewAppsSkeleton />\n ) : searchQuery.trim() && !hasSearchResults ? (\n <WorkspaceAppSearchEmpty\n query={searchQuery}\n onClear={() => setSearchQuery(\"\")}\n />\n ) : (\n <>\n <AppList className={APP_LIST_GRID_CLASS}>\n {filteredActiveApps.map((app) => (\n <WorkspaceAppCard\n key={app.id}\n app={app}\n className={APP_LIST_GRID_ROW_CLASS}\n isPinned={layout.pinnedIds.includes(app.id.toLowerCase())}\n onTogglePinned={() => togglePinned(app.id)}\n />\n ))}\n {filteredActiveApps.length === 0 &&\n pendingApps.length === 0 &&\n !searchQuery.trim() ? (\n <p className=\"px-4 py-3 text-sm text-muted-foreground\">\n {t(\"dispatch.pages.noApps\", {\n defaultValue: \"No apps yet.\",\n })}\n </p>\n ) : null}\n </AppList>\n </>\n )}\n {pendingApps.length > 0 &&\n (!searchQuery.trim() || filteredPendingApps.length > 0) ? (\n <Collapsible\n open={showPending || Boolean(searchQuery.trim())}\n onOpenChange={setShowPending}\n >\n <div className=\"space-y-3 border-t pt-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <IconClockHour4\n size={15}\n className=\"shrink-0 text-muted-foreground\"\n />\n <div className=\"min-w-0\">\n <h3 className=\"text-xs font-semibold text-foreground\">\n {t(\"dispatch.pages.pendingApps\")}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\"dispatch.pages.pendingAppsDescription\", {\n count: pendingApps.length,\n })}\n </p>\n </div>\n </div>\n <CollapsibleTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-xs\"\n >\n {showPending || Boolean(searchQuery.trim())\n ? t(\"dispatch.pages.hidePendingApps\")\n : t(\"dispatch.pages.showPendingApps\")}\n <IconChevronDown\n size={13}\n className={\n showPending || searchQuery.trim()\n ? \"rotate-180\"\n : undefined\n }\n />\n </Button>\n </CollapsibleTrigger>\n </div>\n <CollapsibleContent>\n <AppList className={APP_LIST_GRID_CLASS}>\n {filteredPendingApps.map((app) => (\n <WorkspaceAppCard\n key={app.id}\n app={app}\n className={APP_LIST_GRID_ROW_CLASS}\n />\n ))}\n </AppList>\n </CollapsibleContent>\n </div>\n </Collapsible>\n ) : null}\n </section>\n );\n}\n\nfunction OverviewAppsSkeleton() {\n return (\n <AppList className={APP_LIST_GRID_CLASS}>\n {Array.from({ length: 4 }).map((_, index) => (\n <div\n key={index}\n className={cn(\n \"flex min-w-0 items-center gap-3 border-b px-4 py-3.5 last:border-b-0\",\n APP_LIST_GRID_ROW_CLASS,\n )}\n >\n <Skeleton className=\"size-8 shrink-0 rounded-xl\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-3 w-2/3\" />\n </div>\n <Skeleton className=\"h-9 w-24 shrink-0 rounded-md\" />\n </div>\n ))}\n </AppList>\n );\n}\n\nexport function DispatchControlPlane() {\n useSetPageTitle(<span aria-hidden />);\n const appsQuery = useActionQuery<WorkspaceAppSummary[]>(\n \"list-workspace-apps\",\n { includeAgentCards: false, includeArchived: true },\n );\n const { data: workspaceApps = [], isLoading: appsLoading } = appsQuery;\n\n return (\n <div className=\"flex flex-col gap-8\">\n <CommandPanel />\n {appsQuery.isError ? (\n <ActionQueryError\n error={appsQuery.error}\n onRetry={() => void appsQuery.refetch()}\n queryName=\"list-workspace-apps\"\n />\n ) : (\n <AppsPanel apps={workspaceApps ?? []} isLoading={appsLoading} />\n )}\n </div>\n );\n}\n"]}
@@ -57,6 +57,7 @@ interface DispatchWorkspaceAppLauncher {
57
57
  workspaceApps: readonly WorkspaceAppSummary[];
58
58
  isLoading: boolean;
59
59
  error?: unknown;
60
+ errorQueryName?: "list-workspace-apps" | "list-connected-agents";
60
61
  openApp: (app: ChatFirstAppItem) => void;
61
62
  retry: () => void;
62
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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"}
@@ -704,6 +704,11 @@ function DispatchLayout({ children, extensions, agentPageHref, brandName, brandI
704
704
  const chatFirstAppsLoading = chatFirstWorkspaceAppsLoading || chatFirstConnectedAppsLoading;
705
705
  const chatFirstAppsFailed = chatFirstAppsQuery.isError;
706
706
  const chatFirstAppsError = chatFirstAppsQuery.error ?? chatFirstConnectedAppsQuery.error;
707
+ const chatFirstAppsErrorQueryName = chatFirstAppsQuery.error != null
708
+ ? "list-workspace-apps"
709
+ : chatFirstConnectedAppsQuery.error != null
710
+ ? "list-connected-agents"
711
+ : undefined;
707
712
  const chatFirstResolvableApps = useMemo(() => mergeChatFirstWorkspaceApps(chatFirstAppsQuery.data, chatFirstEnabledBuiltinAppIds, chatFirstBuiltinApps.map((app) => ({
708
713
  id: app.id,
709
714
  name: app.name,
@@ -766,6 +771,7 @@ function DispatchLayout({ children, extensions, agentPageHref, brandName, brandI
766
771
  workspaceApps: chatFirstWorkspaceApps,
767
772
  isLoading: chatFirstAppsLoading,
768
773
  error: chatFirstAppsError,
774
+ errorQueryName: chatFirstAppsErrorQueryName,
769
775
  openApp: openChatFirstApp,
770
776
  retry: () => {
771
777
  void chatFirstAppsQuery.refetch();
@@ -773,6 +779,7 @@ function DispatchLayout({ children, extensions, agentPageHref, brandName, brandI
773
779
  },
774
780
  }), [
775
781
  chatFirstAppsError,
782
+ chatFirstAppsErrorQueryName,
776
783
  chatFirstAppsLoading,
777
784
  chatFirstAppsQuery.refetch,
778
785
  chatFirstConnectedAppsQuery.refetch,