@agent-native/dispatch 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +8 -0
- package/dist/actions/index.js.map +1 -1
- package/dist/components/workspace-app-card.d.ts.map +1 -1
- package/dist/components/workspace-app-card.js +33 -2
- package/dist/components/workspace-app-card.js.map +1 -1
- package/dist/lib/workspace-apps.d.ts +1 -0
- package/dist/lib/workspace-apps.d.ts.map +1 -1
- package/dist/lib/workspace-apps.js.map +1 -1
- package/dist/routes/pages/apps.d.ts.map +1 -1
- package/dist/routes/pages/apps.js +41 -8
- package/dist/routes/pages/apps.js.map +1 -1
- package/dist/server/lib/app-creation-store.js +3 -3
- package/dist/server/lib/app-creation-store.js.map +1 -1
- package/package.json +2 -2
- package/src/actions/index.ts +4 -0
- package/src/components/workspace-app-card.tsx +95 -5
- package/src/lib/workspace-apps.ts +1 -0
- package/src/routes/pages/apps.tsx +159 -6
- package/src/server/lib/app-creation-store.ts +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AA2D7D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AA2D7D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA0DvD,CAAC"}
|
package/dist/actions/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import getWorkspaceInfo from "./get-workspace-info.js";
|
|
|
17
17
|
import grantWorkspaceResourcesToApp from "./grant-workspace-resources-to-app.js";
|
|
18
18
|
import grantVaultSecretsToApp from "./grant-vault-secrets-to-app.js";
|
|
19
19
|
import listAgentThreadSources from "./list-agent-thread-sources.js";
|
|
20
|
+
import listAvailableWorkspaceTemplates from "./list-available-workspace-templates.js";
|
|
20
21
|
import listConnectedAgents from "./list-connected-agents.js";
|
|
21
22
|
import listDestinations from "./list-destinations.js";
|
|
22
23
|
import listDispatchApprovals from "./list-dispatch-approvals.js";
|
|
@@ -36,9 +37,11 @@ import listWorkspaceResourceGrants from "./list-workspace-resource-grants.js";
|
|
|
36
37
|
import listWorkspaceResources from "./list-workspace-resources.js";
|
|
37
38
|
import navigate from "./navigate.js";
|
|
38
39
|
import rejectDispatchChange from "./reject-dispatch-change.js";
|
|
40
|
+
import removePendingWorkspaceApp from "./remove-pending-workspace-app.js";
|
|
39
41
|
import requestVaultSecret from "./request-vault-secret.js";
|
|
40
42
|
import revokeVaultGrant from "./revoke-vault-grant.js";
|
|
41
43
|
import revokeWorkspaceResourceGrant from "./revoke-workspace-resource-grant.js";
|
|
44
|
+
import scaffoldWorkspaceApp from "./scaffold-workspace-app.js";
|
|
42
45
|
import searchAgentThreads from "./search-agent-threads.js";
|
|
43
46
|
import sendPlatformMessage from "./send-platform-message.js";
|
|
44
47
|
import setAppCreationSettings from "./set-app-creation-settings.js";
|
|
@@ -47,6 +50,7 @@ import startWorkspaceAppCreation from "./start-workspace-app-creation.js";
|
|
|
47
50
|
import syncVaultToApp from "./sync-vault-to-app.js";
|
|
48
51
|
import syncWorkspaceResourcesToAll from "./sync-workspace-resources-to-all.js";
|
|
49
52
|
import syncWorkspaceResourcesToApp from "./sync-workspace-resources-to-app.js";
|
|
53
|
+
import unarchiveWorkspaceApp from "./unarchive-workspace-app.js";
|
|
50
54
|
import updateVaultSecret from "./update-vault-secret.js";
|
|
51
55
|
import updateWorkspaceResource from "./update-workspace-resource.js";
|
|
52
56
|
import upsertDestination from "./upsert-destination.js";
|
|
@@ -77,6 +81,7 @@ export const dispatchActions = {
|
|
|
77
81
|
"grant-workspace-resources-to-app": grantWorkspaceResourcesToApp,
|
|
78
82
|
"grant-vault-secrets-to-app": grantVaultSecretsToApp,
|
|
79
83
|
"list-agent-thread-sources": listAgentThreadSources,
|
|
84
|
+
"list-available-workspace-templates": listAvailableWorkspaceTemplates,
|
|
80
85
|
"list-connected-agents": listConnectedAgents,
|
|
81
86
|
"list-destinations": listDestinations,
|
|
82
87
|
"list-dispatch-approvals": listDispatchApprovals,
|
|
@@ -96,9 +101,11 @@ export const dispatchActions = {
|
|
|
96
101
|
"list-workspace-resources": listWorkspaceResources,
|
|
97
102
|
navigate: navigate,
|
|
98
103
|
"reject-dispatch-change": rejectDispatchChange,
|
|
104
|
+
"remove-pending-workspace-app": removePendingWorkspaceApp,
|
|
99
105
|
"request-vault-secret": requestVaultSecret,
|
|
100
106
|
"revoke-vault-grant": revokeVaultGrant,
|
|
101
107
|
"revoke-workspace-resource-grant": revokeWorkspaceResourceGrant,
|
|
108
|
+
"scaffold-workspace-app": scaffoldWorkspaceApp,
|
|
102
109
|
"search-agent-threads": searchAgentThreads,
|
|
103
110
|
"send-platform-message": sendPlatformMessage,
|
|
104
111
|
"set-app-creation-settings": setAppCreationSettings,
|
|
@@ -107,6 +114,7 @@ export const dispatchActions = {
|
|
|
107
114
|
"sync-vault-to-app": syncVaultToApp,
|
|
108
115
|
"sync-workspace-resources-to-all": syncWorkspaceResourcesToAll,
|
|
109
116
|
"sync-workspace-resources-to-app": syncWorkspaceResourcesToApp,
|
|
117
|
+
"unarchive-workspace-app": unarchiveWorkspaceApp,
|
|
110
118
|
"update-vault-secret": updateVaultSecret,
|
|
111
119
|
"update-workspace-resource": updateWorkspaceResource,
|
|
112
120
|
"upsert-destination": upsertDestination,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"@agent-native/core/server\";\nimport approveDispatchChange from \"./approve-dispatch-change.js\";\nimport approveVaultRequest from \"./approve-vault-request.js\";\nimport archiveWorkspaceApp from \"./archive-workspace-app.js\";\nimport createLinkToken from \"./create-link-token.js\";\nimport createVaultGrant from \"./create-vault-grant.js\";\nimport createVaultSecret from \"./create-vault-secret.js\";\nimport createWorkspaceResourceGrant from \"./create-workspace-resource-grant.js\";\nimport createWorkspaceResource from \"./create-workspace-resource.js\";\nimport deleteDestination from \"./delete-destination.js\";\nimport deleteVaultSecret from \"./delete-vault-secret.js\";\nimport deleteWorkspaceResource from \"./delete-workspace-resource.js\";\nimport denyVaultRequest from \"./deny-vault-request.js\";\nimport getAppCreationSettings from \"./get-app-creation-settings.js\";\nimport getAgentThreadDebug from \"./get-agent-thread-debug.js\";\nimport getDispatchSettings from \"./get-dispatch-settings.js\";\nimport getWorkspaceInfo from \"./get-workspace-info.js\";\nimport grantWorkspaceResourcesToApp from \"./grant-workspace-resources-to-app.js\";\nimport grantVaultSecretsToApp from \"./grant-vault-secrets-to-app.js\";\nimport listAgentThreadSources from \"./list-agent-thread-sources.js\";\nimport listAvailableWorkspaceTemplates from \"./list-available-workspace-templates.js\";\nimport listConnectedAgents from \"./list-connected-agents.js\";\nimport listDestinations from \"./list-destinations.js\";\nimport listDispatchApprovals from \"./list-dispatch-approvals.js\";\nimport listDispatchAudit from \"./list-dispatch-audit.js\";\nimport listDispatchOverview from \"./list-dispatch-overview.js\";\nimport listDispatchUsageMetrics from \"./list-dispatch-usage-metrics.js\";\nimport listIntegrationsCatalog from \"./list-integrations-catalog.js\";\nimport listLinkedIdentities from \"./list-linked-identities.js\";\nimport listVaultAudit from \"./list-vault-audit.js\";\nimport listVaultGrants from \"./list-vault-grants.js\";\nimport listVaultRequests from \"./list-vault-requests.js\";\nimport listVaultSecretOptions from \"./list-vault-secret-options.js\";\nimport listVaultSecrets from \"./list-vault-secrets.js\";\nimport listWorkspaceApps from \"./list-workspace-apps.js\";\nimport listWorkspaceResourceOptions from \"./list-workspace-resource-options.js\";\nimport listWorkspaceResourceGrants from \"./list-workspace-resource-grants.js\";\nimport listWorkspaceResources from \"./list-workspace-resources.js\";\nimport navigate from \"./navigate.js\";\nimport rejectDispatchChange from \"./reject-dispatch-change.js\";\nimport removePendingWorkspaceApp from \"./remove-pending-workspace-app.js\";\nimport requestVaultSecret from \"./request-vault-secret.js\";\nimport revokeVaultGrant from \"./revoke-vault-grant.js\";\nimport revokeWorkspaceResourceGrant from \"./revoke-workspace-resource-grant.js\";\nimport scaffoldWorkspaceApp from \"./scaffold-workspace-app.js\";\nimport searchAgentThreads from \"./search-agent-threads.js\";\nimport sendPlatformMessage from \"./send-platform-message.js\";\nimport setAppCreationSettings from \"./set-app-creation-settings.js\";\nimport setDispatchApprovalPolicy from \"./set-dispatch-approval-policy.js\";\nimport startWorkspaceAppCreation from \"./start-workspace-app-creation.js\";\nimport syncVaultToApp from \"./sync-vault-to-app.js\";\nimport syncWorkspaceResourcesToAll from \"./sync-workspace-resources-to-all.js\";\nimport syncWorkspaceResourcesToApp from \"./sync-workspace-resources-to-app.js\";\nimport unarchiveWorkspaceApp from \"./unarchive-workspace-app.js\";\nimport updateVaultSecret from \"./update-vault-secret.js\";\nimport updateWorkspaceResource from \"./update-workspace-resource.js\";\nimport upsertDestination from \"./upsert-destination.js\";\nimport viewScreen from \"./view-screen.js\";\n\n/**\n * Dispatch's actions registered as a flat name→entry map. Imported by\n * `@agent-native/dispatch/server`'s side-effect block, which calls\n * `registerPackageActions(dispatchActions)` so the framework's action\n * loader picks them up.\n */\nexport const dispatchActions: Record<string, ActionEntry> = {\n \"approve-dispatch-change\": approveDispatchChange,\n \"approve-vault-request\": approveVaultRequest,\n \"archive-workspace-app\": archiveWorkspaceApp,\n \"create-link-token\": createLinkToken,\n \"create-vault-grant\": createVaultGrant,\n \"create-vault-secret\": createVaultSecret,\n \"create-workspace-resource-grant\": createWorkspaceResourceGrant,\n \"create-workspace-resource\": createWorkspaceResource,\n \"delete-destination\": deleteDestination,\n \"delete-vault-secret\": deleteVaultSecret,\n \"delete-workspace-resource\": deleteWorkspaceResource,\n \"deny-vault-request\": denyVaultRequest,\n \"get-app-creation-settings\": getAppCreationSettings,\n \"get-agent-thread-debug\": getAgentThreadDebug,\n \"get-dispatch-settings\": getDispatchSettings,\n \"get-workspace-info\": getWorkspaceInfo,\n \"grant-workspace-resources-to-app\": grantWorkspaceResourcesToApp,\n \"grant-vault-secrets-to-app\": grantVaultSecretsToApp,\n \"list-agent-thread-sources\": listAgentThreadSources,\n \"list-connected-agents\": listConnectedAgents,\n \"list-destinations\": listDestinations,\n \"list-dispatch-approvals\": listDispatchApprovals,\n \"list-dispatch-audit\": listDispatchAudit,\n \"list-dispatch-overview\": listDispatchOverview,\n \"list-dispatch-usage-metrics\": listDispatchUsageMetrics,\n \"list-integrations-catalog\": listIntegrationsCatalog,\n \"list-linked-identities\": listLinkedIdentities,\n \"list-vault-audit\": listVaultAudit,\n \"list-vault-grants\": listVaultGrants,\n \"list-vault-requests\": listVaultRequests,\n \"list-vault-secret-options\": listVaultSecretOptions,\n \"list-vault-secrets\": listVaultSecrets,\n \"list-workspace-apps\": listWorkspaceApps,\n \"list-workspace-resource-options\": listWorkspaceResourceOptions,\n \"list-workspace-resource-grants\": listWorkspaceResourceGrants,\n \"list-workspace-resources\": listWorkspaceResources,\n navigate: navigate,\n \"reject-dispatch-change\": rejectDispatchChange,\n \"request-vault-secret\": requestVaultSecret,\n \"revoke-vault-grant\": revokeVaultGrant,\n \"revoke-workspace-resource-grant\": revokeWorkspaceResourceGrant,\n \"search-agent-threads\": searchAgentThreads,\n \"send-platform-message\": sendPlatformMessage,\n \"set-app-creation-settings\": setAppCreationSettings,\n \"set-dispatch-approval-policy\": setDispatchApprovalPolicy,\n \"start-workspace-app-creation\": startWorkspaceAppCreation,\n \"sync-vault-to-app\": syncVaultToApp,\n \"sync-workspace-resources-to-all\": syncWorkspaceResourcesToAll,\n \"sync-workspace-resources-to-app\": syncWorkspaceResourcesToApp,\n \"update-vault-secret\": updateVaultSecret,\n \"update-workspace-resource\": updateWorkspaceResource,\n \"upsert-destination\": upsertDestination,\n \"view-screen\": viewScreen,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"@agent-native/core/server\";\nimport approveDispatchChange from \"./approve-dispatch-change.js\";\nimport approveVaultRequest from \"./approve-vault-request.js\";\nimport archiveWorkspaceApp from \"./archive-workspace-app.js\";\nimport createLinkToken from \"./create-link-token.js\";\nimport createVaultGrant from \"./create-vault-grant.js\";\nimport createVaultSecret from \"./create-vault-secret.js\";\nimport createWorkspaceResourceGrant from \"./create-workspace-resource-grant.js\";\nimport createWorkspaceResource from \"./create-workspace-resource.js\";\nimport deleteDestination from \"./delete-destination.js\";\nimport deleteVaultSecret from \"./delete-vault-secret.js\";\nimport deleteWorkspaceResource from \"./delete-workspace-resource.js\";\nimport denyVaultRequest from \"./deny-vault-request.js\";\nimport getAppCreationSettings from \"./get-app-creation-settings.js\";\nimport getAgentThreadDebug from \"./get-agent-thread-debug.js\";\nimport getDispatchSettings from \"./get-dispatch-settings.js\";\nimport getWorkspaceInfo from \"./get-workspace-info.js\";\nimport grantWorkspaceResourcesToApp from \"./grant-workspace-resources-to-app.js\";\nimport grantVaultSecretsToApp from \"./grant-vault-secrets-to-app.js\";\nimport listAgentThreadSources from \"./list-agent-thread-sources.js\";\nimport listAvailableWorkspaceTemplates from \"./list-available-workspace-templates.js\";\nimport listConnectedAgents from \"./list-connected-agents.js\";\nimport listDestinations from \"./list-destinations.js\";\nimport listDispatchApprovals from \"./list-dispatch-approvals.js\";\nimport listDispatchAudit from \"./list-dispatch-audit.js\";\nimport listDispatchOverview from \"./list-dispatch-overview.js\";\nimport listDispatchUsageMetrics from \"./list-dispatch-usage-metrics.js\";\nimport listIntegrationsCatalog from \"./list-integrations-catalog.js\";\nimport listLinkedIdentities from \"./list-linked-identities.js\";\nimport listVaultAudit from \"./list-vault-audit.js\";\nimport listVaultGrants from \"./list-vault-grants.js\";\nimport listVaultRequests from \"./list-vault-requests.js\";\nimport listVaultSecretOptions from \"./list-vault-secret-options.js\";\nimport listVaultSecrets from \"./list-vault-secrets.js\";\nimport listWorkspaceApps from \"./list-workspace-apps.js\";\nimport listWorkspaceResourceOptions from \"./list-workspace-resource-options.js\";\nimport listWorkspaceResourceGrants from \"./list-workspace-resource-grants.js\";\nimport listWorkspaceResources from \"./list-workspace-resources.js\";\nimport navigate from \"./navigate.js\";\nimport rejectDispatchChange from \"./reject-dispatch-change.js\";\nimport removePendingWorkspaceApp from \"./remove-pending-workspace-app.js\";\nimport requestVaultSecret from \"./request-vault-secret.js\";\nimport revokeVaultGrant from \"./revoke-vault-grant.js\";\nimport revokeWorkspaceResourceGrant from \"./revoke-workspace-resource-grant.js\";\nimport scaffoldWorkspaceApp from \"./scaffold-workspace-app.js\";\nimport searchAgentThreads from \"./search-agent-threads.js\";\nimport sendPlatformMessage from \"./send-platform-message.js\";\nimport setAppCreationSettings from \"./set-app-creation-settings.js\";\nimport setDispatchApprovalPolicy from \"./set-dispatch-approval-policy.js\";\nimport startWorkspaceAppCreation from \"./start-workspace-app-creation.js\";\nimport syncVaultToApp from \"./sync-vault-to-app.js\";\nimport syncWorkspaceResourcesToAll from \"./sync-workspace-resources-to-all.js\";\nimport syncWorkspaceResourcesToApp from \"./sync-workspace-resources-to-app.js\";\nimport unarchiveWorkspaceApp from \"./unarchive-workspace-app.js\";\nimport updateVaultSecret from \"./update-vault-secret.js\";\nimport updateWorkspaceResource from \"./update-workspace-resource.js\";\nimport upsertDestination from \"./upsert-destination.js\";\nimport viewScreen from \"./view-screen.js\";\n\n/**\n * Dispatch's actions registered as a flat name→entry map. Imported by\n * `@agent-native/dispatch/server`'s side-effect block, which calls\n * `registerPackageActions(dispatchActions)` so the framework's action\n * loader picks them up.\n */\nexport const dispatchActions: Record<string, ActionEntry> = {\n \"approve-dispatch-change\": approveDispatchChange,\n \"approve-vault-request\": approveVaultRequest,\n \"archive-workspace-app\": archiveWorkspaceApp,\n \"create-link-token\": createLinkToken,\n \"create-vault-grant\": createVaultGrant,\n \"create-vault-secret\": createVaultSecret,\n \"create-workspace-resource-grant\": createWorkspaceResourceGrant,\n \"create-workspace-resource\": createWorkspaceResource,\n \"delete-destination\": deleteDestination,\n \"delete-vault-secret\": deleteVaultSecret,\n \"delete-workspace-resource\": deleteWorkspaceResource,\n \"deny-vault-request\": denyVaultRequest,\n \"get-app-creation-settings\": getAppCreationSettings,\n \"get-agent-thread-debug\": getAgentThreadDebug,\n \"get-dispatch-settings\": getDispatchSettings,\n \"get-workspace-info\": getWorkspaceInfo,\n \"grant-workspace-resources-to-app\": grantWorkspaceResourcesToApp,\n \"grant-vault-secrets-to-app\": grantVaultSecretsToApp,\n \"list-agent-thread-sources\": listAgentThreadSources,\n \"list-available-workspace-templates\": listAvailableWorkspaceTemplates,\n \"list-connected-agents\": listConnectedAgents,\n \"list-destinations\": listDestinations,\n \"list-dispatch-approvals\": listDispatchApprovals,\n \"list-dispatch-audit\": listDispatchAudit,\n \"list-dispatch-overview\": listDispatchOverview,\n \"list-dispatch-usage-metrics\": listDispatchUsageMetrics,\n \"list-integrations-catalog\": listIntegrationsCatalog,\n \"list-linked-identities\": listLinkedIdentities,\n \"list-vault-audit\": listVaultAudit,\n \"list-vault-grants\": listVaultGrants,\n \"list-vault-requests\": listVaultRequests,\n \"list-vault-secret-options\": listVaultSecretOptions,\n \"list-vault-secrets\": listVaultSecrets,\n \"list-workspace-apps\": listWorkspaceApps,\n \"list-workspace-resource-options\": listWorkspaceResourceOptions,\n \"list-workspace-resource-grants\": listWorkspaceResourceGrants,\n \"list-workspace-resources\": listWorkspaceResources,\n navigate: navigate,\n \"reject-dispatch-change\": rejectDispatchChange,\n \"remove-pending-workspace-app\": removePendingWorkspaceApp,\n \"request-vault-secret\": requestVaultSecret,\n \"revoke-vault-grant\": revokeVaultGrant,\n \"revoke-workspace-resource-grant\": revokeWorkspaceResourceGrant,\n \"scaffold-workspace-app\": scaffoldWorkspaceApp,\n \"search-agent-threads\": searchAgentThreads,\n \"send-platform-message\": sendPlatformMessage,\n \"set-app-creation-settings\": setAppCreationSettings,\n \"set-dispatch-approval-policy\": setDispatchApprovalPolicy,\n \"start-workspace-app-creation\": startWorkspaceAppCreation,\n \"sync-vault-to-app\": syncVaultToApp,\n \"sync-workspace-resources-to-all\": syncWorkspaceResourcesToAll,\n \"sync-workspace-resources-to-app\": syncWorkspaceResourcesToApp,\n \"unarchive-workspace-app\": unarchiveWorkspaceApp,\n \"update-vault-secret\": updateVaultSecret,\n \"update-workspace-resource\": updateWorkspaceResource,\n \"upsert-destination\": upsertDestination,\n \"view-screen\": viewScreen,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-app-card.d.ts","sourceRoot":"","sources":["../../src/components/workspace-app-card.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace-app-card.d.ts","sourceRoot":"","sources":["../../src/components/workspace-app-card.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAE9B,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,SAAS,GACV,EAAE;IACD,GAAG,EAAE,mBAAmB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CA0IA"}
|
|
@@ -1,12 +1,43 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useActionMutation } from "@agent-native/core/client";
|
|
3
|
+
import { IconArrowUpRight, IconClockHour4, IconDots, IconEye, IconEyeOff, IconTrash, } from "@tabler/icons-react";
|
|
4
|
+
import { toast } from "sonner";
|
|
3
5
|
import { AppKeysPopover } from "../components/app-keys-popover.js";
|
|
4
6
|
import { Badge } from "../components/ui/badge.js";
|
|
7
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "../components/ui/dropdown-menu.js";
|
|
5
8
|
import { cn } from "../lib/utils.js";
|
|
6
9
|
import { isPendingBuilderHref, workspaceAppHref, } from "../lib/workspace-apps.js";
|
|
7
10
|
export function WorkspaceAppCard({ app, className, }) {
|
|
8
11
|
const href = workspaceAppHref(app);
|
|
9
12
|
const openInNewTab = isPendingBuilderHref(app);
|
|
10
|
-
|
|
13
|
+
const isPending = app.status === "pending";
|
|
14
|
+
const isArchived = !!app.archived;
|
|
15
|
+
const archive = useActionMutation("archive-workspace-app", {
|
|
16
|
+
onError: (err) => toast.error(`Could not hide ${app.name}: ${stringifyError(err)}`),
|
|
17
|
+
});
|
|
18
|
+
const unarchive = useActionMutation("unarchive-workspace-app", {
|
|
19
|
+
onError: (err) => toast.error(`Could not restore ${app.name}: ${stringifyError(err)}`),
|
|
20
|
+
});
|
|
21
|
+
const removePending = useActionMutation("remove-pending-workspace-app", {
|
|
22
|
+
onError: (err) => toast.error(`Could not remove ${app.name}: ${stringifyError(err)}`),
|
|
23
|
+
});
|
|
24
|
+
const handleArchive = () => {
|
|
25
|
+
archive.mutate({ appId: app.id });
|
|
26
|
+
toast.success(`Hid ${app.name} from the Apps list`);
|
|
27
|
+
};
|
|
28
|
+
const handleUnarchive = () => {
|
|
29
|
+
unarchive.mutate({ appId: app.id });
|
|
30
|
+
toast.success(`Restored ${app.name} to the Apps list`);
|
|
31
|
+
};
|
|
32
|
+
const handleRemovePending = () => {
|
|
33
|
+
removePending.mutate({ appId: app.id });
|
|
34
|
+
toast.success(`Removed pending ${app.name}`);
|
|
35
|
+
};
|
|
36
|
+
return (_jsxs("div", { "aria-disabled": !href, className: cn("group relative rounded-lg border bg-card p-4 transition hover:border-foreground/30 aria-disabled:opacity-60", isArchived && "opacity-70", className), children: [href ? (_jsx("a", { href: href, target: openInNewTab ? "_blank" : undefined, rel: openInNewTab ? "noreferrer" : undefined, "aria-label": `Open ${app.name}`, className: "absolute inset-0 z-0 rounded-lg" })) : null, _jsxs("div", { className: "pointer-events-none relative z-10 flex h-full items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("h3", { className: "truncate text-sm font-semibold text-foreground", children: app.name }), isPending ? (_jsxs(Badge, { variant: "outline", className: "shrink-0 gap-1 border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300", children: [_jsx(IconClockHour4, { size: 12 }), "Building"] })) : null, isArchived ? (_jsxs(Badge, { variant: "outline", className: "shrink-0 gap-1", children: [_jsx(IconEyeOff, { size: 12 }), "Hidden"] })) : null] }), _jsx("p", { className: "mt-1 truncate font-mono text-xs text-muted-foreground", children: app.path }), isPending && app.branchName ? (_jsxs("p", { className: "mt-1 truncate text-xs text-muted-foreground", children: ["Branch: ", app.branchName] })) : null, app.description ? (_jsx("p", { className: "mt-2 line-clamp-2 text-xs leading-relaxed text-muted-foreground", children: app.description })) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [!isPending && !isArchived ? (_jsx("div", { className: "pointer-events-auto", children: _jsx(AppKeysPopover, { appId: app.id, appName: app.name }) })) : null, _jsx("div", { className: "pointer-events-auto", children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": `More actions for ${app.name}`, className: "inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground opacity-0 transition hover:bg-accent hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100 data-[state=open]:opacity-100", onClick: (e) => e.stopPropagation(), children: _jsx(IconDots, { size: 15 }) }) }), _jsx(DropdownMenuContent, { align: "end", className: "w-44", children: isPending ? (_jsxs(DropdownMenuItem, { onSelect: handleRemovePending, className: "text-red-600 focus:text-red-600 dark:text-red-400 dark:focus:text-red-400", children: [_jsx(IconTrash, { size: 14, className: "mr-2" }), "Remove from list"] })) : isArchived ? (_jsxs(DropdownMenuItem, { onSelect: handleUnarchive, children: [_jsx(IconEye, { size: 14, className: "mr-2" }), "Restore to list"] })) : (_jsxs(DropdownMenuItem, { onSelect: handleArchive, children: [_jsx(IconEyeOff, { size: 14, className: "mr-2" }), "Hide from list"] })) })] }) }), href && !isArchived ? (_jsx(IconArrowUpRight, { size: 16, className: "text-muted-foreground transition group-hover:text-foreground" })) : null] })] })] }));
|
|
37
|
+
}
|
|
38
|
+
function stringifyError(err) {
|
|
39
|
+
if (err instanceof Error)
|
|
40
|
+
return err.message;
|
|
41
|
+
return String(err);
|
|
11
42
|
}
|
|
12
43
|
//# sourceMappingURL=workspace-app-card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-app-card.js","sourceRoot":"","sources":["../../src/components/workspace-app-card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,UAAU,gBAAgB,CAAC,EAC/B,GAAG,EACH,SAAS,GAIV;IACC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAE/C,OAAO,CACL,gCACiB,CAAC,IAAI,EACpB,SAAS,EAAE,EAAE,CACX,6GAA6G,EAC7G,SAAS,CACV,aAEA,IAAI,CAAC,CAAC,CAAC,CACN,YACE,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAC3C,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,gBAChC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAC9B,SAAS,EAAC,iCAAiC,GAC3C,CACH,CAAC,CAAC,CAAC,IAAI,EAER,eAAK,SAAS,EAAC,iFAAiF,aAC9F,eAAK,SAAS,EAAC,SAAS,aACtB,eAAK,SAAS,EAAC,iCAAiC,aAC9C,aAAI,SAAS,EAAC,gDAAgD,YAC3D,GAAG,CAAC,IAAI,GACN,EACJ,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAC1B,MAAC,KAAK,IACJ,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,uFAAuF,aAEjG,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,GAAI,gBAEtB,CACT,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,YAAG,SAAS,EAAC,uDAAuD,YACjE,GAAG,CAAC,IAAI,GACP,EACH,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAC5C,aAAG,SAAS,EAAC,6CAA6C,yBAC/C,GAAG,CAAC,UAAU,IACrB,CACL,CAAC,CAAC,CAAC,IAAI,EACP,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CACjB,YAAG,SAAS,EAAC,iEAAiE,YAC3E,GAAG,CAAC,WAAW,GACd,CACL,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,eAAK,SAAS,EAAC,kCAAkC,aAC9C,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CACxB,cAAK,SAAS,EAAC,qBAAqB,YAClC,KAAC,cAAc,IAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,GAAI,GAChD,CACP,CAAC,CAAC,CAAC,IAAI,EACP,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,gBAAgB,IACf,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,8DAA8D,GACxE,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,IACF,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { IconArrowUpRight, IconClockHour4 } from \"@tabler/icons-react\";\nimport { AppKeysPopover } from \"@/components/app-keys-popover\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/lib/utils\";\nimport {\n isPendingBuilderHref,\n workspaceAppHref,\n type WorkspaceAppSummary,\n} from \"@/lib/workspace-apps\";\n\nexport function WorkspaceAppCard({\n app,\n className,\n}: {\n app: WorkspaceAppSummary;\n className?: string;\n}) {\n const href = workspaceAppHref(app);\n const openInNewTab = isPendingBuilderHref(app);\n\n return (\n <div\n aria-disabled={!href}\n className={cn(\n \"group relative rounded-lg border bg-card p-4 transition hover:border-foreground/30 aria-disabled:opacity-60\",\n className,\n )}\n >\n {href ? (\n <a\n href={href}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noreferrer\" : undefined}\n aria-label={`Open ${app.name}`}\n className=\"absolute inset-0 z-0 rounded-lg\"\n />\n ) : null}\n\n <div className=\"pointer-events-none relative z-10 flex h-full items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">\n {app.name}\n </h3>\n {app.status === \"pending\" ? (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 gap-1 border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n >\n <IconClockHour4 size={12} />\n Building\n </Badge>\n ) : null}\n </div>\n <p className=\"mt-1 truncate font-mono text-xs text-muted-foreground\">\n {app.path}\n </p>\n {app.status === \"pending\" && app.branchName ? (\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n Branch: {app.branchName}\n </p>\n ) : null}\n {app.description ? (\n <p className=\"mt-2 line-clamp-2 text-xs leading-relaxed text-muted-foreground\">\n {app.description}\n </p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {app.status === \"ready\" ? (\n <div className=\"pointer-events-auto\">\n <AppKeysPopover appId={app.id} appName={app.name} />\n </div>\n ) : null}\n {href ? (\n <IconArrowUpRight\n size={16}\n className=\"text-muted-foreground transition group-hover:text-foreground\"\n />\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workspace-app-card.js","sourceRoot":"","sources":["../../src/components/workspace-app-card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,UAAU,gBAAgB,CAAC,EAC/B,GAAG,EACH,SAAS,GAIV;IACC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;IAC3C,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;IAElC,MAAM,OAAO,GAAG,iBAAiB,CAAC,uBAAuB,EAAE;QACzD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,KAAK,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,yBAAyB,EAAE;QAC7D,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,KAAK,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;KACvE,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,iBAAiB,CAAC,8BAA8B,EAAE;QACtE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,KAAK,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;KACtE,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,qBAAqB,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC;IACzD,CAAC,CAAC;IACF,MAAM,mBAAmB,GAAG,GAAG,EAAE;QAC/B,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,KAAK,CAAC,OAAO,CAAC,mBAAmB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,OAAO,CACL,gCACiB,CAAC,IAAI,EACpB,SAAS,EAAE,EAAE,CACX,6GAA6G,EAC7G,UAAU,IAAI,YAAY,EAC1B,SAAS,CACV,aAEA,IAAI,CAAC,CAAC,CAAC,CACN,YACE,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAC3C,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,gBAChC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAC9B,SAAS,EAAC,iCAAiC,GAC3C,CACH,CAAC,CAAC,CAAC,IAAI,EAER,eAAK,SAAS,EAAC,iFAAiF,aAC9F,eAAK,SAAS,EAAC,SAAS,aACtB,eAAK,SAAS,EAAC,iCAAiC,aAC9C,aAAI,SAAS,EAAC,gDAAgD,YAC3D,GAAG,CAAC,IAAI,GACN,EACJ,SAAS,CAAC,CAAC,CAAC,CACX,MAAC,KAAK,IACJ,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,uFAAuF,aAEjG,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,GAAI,gBAEtB,CACT,CAAC,CAAC,CAAC,IAAI,EACP,UAAU,CAAC,CAAC,CAAC,CACZ,MAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,gBAAgB,aACjD,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,cAElB,CACT,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,YAAG,SAAS,EAAC,uDAAuD,YACjE,GAAG,CAAC,IAAI,GACP,EACH,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAC7B,aAAG,SAAS,EAAC,6CAA6C,yBAC/C,GAAG,CAAC,UAAU,IACrB,CACL,CAAC,CAAC,CAAC,IAAI,EACP,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CACjB,YAAG,SAAS,EAAC,iEAAiE,YAC3E,GAAG,CAAC,WAAW,GACd,CACL,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,eAAK,SAAS,EAAC,kCAAkC,aAC9C,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAC3B,cAAK,SAAS,EAAC,qBAAqB,YAClC,KAAC,cAAc,IAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,GAAI,GAChD,CACP,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,SAAS,EAAC,qBAAqB,YAClC,MAAC,YAAY,eACX,KAAC,mBAAmB,IAAC,OAAO,kBAC1B,iBACE,IAAI,EAAC,QAAQ,gBACD,oBAAoB,GAAG,CAAC,IAAI,EAAE,EAC1C,SAAS,EAAC,4OAA4O,EACtP,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,YAEnC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,GACf,GACW,EACtB,KAAC,mBAAmB,IAAC,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,MAAM,YAC9C,SAAS,CAAC,CAAC,CAAC,CACX,MAAC,gBAAgB,IACf,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAC,2EAA2E,aAErF,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,MAAM,GAAG,wBAEvB,CACpB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACf,MAAC,gBAAgB,IAAC,QAAQ,EAAE,eAAe,aACzC,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,MAAM,GAAG,uBAErB,CACpB,CAAC,CAAC,CAAC,CACF,MAAC,gBAAgB,IAAC,QAAQ,EAAE,aAAa,aACvC,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,MAAM,GAAG,sBAExB,CACpB,GACmB,IACT,GACX,EACL,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CACrB,KAAC,gBAAgB,IACf,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,8DAA8D,GACxE,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,IACF,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC","sourcesContent":["import { useActionMutation } from \"@agent-native/core/client\";\nimport {\n IconArrowUpRight,\n IconClockHour4,\n IconDots,\n IconEye,\n IconEyeOff,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { toast } from \"sonner\";\nimport { AppKeysPopover } from \"@/components/app-keys-popover\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/lib/utils\";\nimport {\n isPendingBuilderHref,\n workspaceAppHref,\n type WorkspaceAppSummary,\n} from \"@/lib/workspace-apps\";\n\nexport function WorkspaceAppCard({\n app,\n className,\n}: {\n app: WorkspaceAppSummary;\n className?: string;\n}) {\n const href = workspaceAppHref(app);\n const openInNewTab = isPendingBuilderHref(app);\n const isPending = app.status === \"pending\";\n const isArchived = !!app.archived;\n\n const archive = useActionMutation(\"archive-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not hide ${app.name}: ${stringifyError(err)}`),\n });\n const unarchive = useActionMutation(\"unarchive-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not restore ${app.name}: ${stringifyError(err)}`),\n });\n const removePending = useActionMutation(\"remove-pending-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not remove ${app.name}: ${stringifyError(err)}`),\n });\n\n const handleArchive = () => {\n archive.mutate({ appId: app.id });\n toast.success(`Hid ${app.name} from the Apps list`);\n };\n const handleUnarchive = () => {\n unarchive.mutate({ appId: app.id });\n toast.success(`Restored ${app.name} to the Apps list`);\n };\n const handleRemovePending = () => {\n removePending.mutate({ appId: app.id });\n toast.success(`Removed pending ${app.name}`);\n };\n\n return (\n <div\n aria-disabled={!href}\n className={cn(\n \"group relative rounded-lg border bg-card p-4 transition hover:border-foreground/30 aria-disabled:opacity-60\",\n isArchived && \"opacity-70\",\n className,\n )}\n >\n {href ? (\n <a\n href={href}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noreferrer\" : undefined}\n aria-label={`Open ${app.name}`}\n className=\"absolute inset-0 z-0 rounded-lg\"\n />\n ) : null}\n\n <div className=\"pointer-events-none relative z-10 flex h-full items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">\n {app.name}\n </h3>\n {isPending ? (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 gap-1 border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n >\n <IconClockHour4 size={12} />\n Building\n </Badge>\n ) : null}\n {isArchived ? (\n <Badge variant=\"outline\" className=\"shrink-0 gap-1\">\n <IconEyeOff size={12} />\n Hidden\n </Badge>\n ) : null}\n </div>\n <p className=\"mt-1 truncate font-mono text-xs text-muted-foreground\">\n {app.path}\n </p>\n {isPending && app.branchName ? (\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n Branch: {app.branchName}\n </p>\n ) : null}\n {app.description ? (\n <p className=\"mt-2 line-clamp-2 text-xs leading-relaxed text-muted-foreground\">\n {app.description}\n </p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {!isPending && !isArchived ? (\n <div className=\"pointer-events-auto\">\n <AppKeysPopover appId={app.id} appName={app.name} />\n </div>\n ) : null}\n <div className=\"pointer-events-auto\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`More actions for ${app.name}`}\n className=\"inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground opacity-0 transition hover:bg-accent hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100 data-[state=open]:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n <IconDots size={15} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n {isPending ? (\n <DropdownMenuItem\n onSelect={handleRemovePending}\n className=\"text-red-600 focus:text-red-600 dark:text-red-400 dark:focus:text-red-400\"\n >\n <IconTrash size={14} className=\"mr-2\" />\n Remove from list\n </DropdownMenuItem>\n ) : isArchived ? (\n <DropdownMenuItem onSelect={handleUnarchive}>\n <IconEye size={14} className=\"mr-2\" />\n Restore to list\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem onSelect={handleArchive}>\n <IconEyeOff size={14} className=\"mr-2\" />\n Hide from list\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n {href && !isArchived ? (\n <IconArrowUpRight\n size={16}\n className=\"text-muted-foreground transition group-hover:text-foreground\"\n />\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction stringifyError(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n"]}
|
|
@@ -9,6 +9,7 @@ export interface WorkspaceAppSummary {
|
|
|
9
9
|
statusLabel?: string;
|
|
10
10
|
builderUrl?: string | null;
|
|
11
11
|
branchName?: string | null;
|
|
12
|
+
archived?: boolean;
|
|
12
13
|
}
|
|
13
14
|
export declare function workspaceAppHref(app: WorkspaceAppSummary): string | null;
|
|
14
15
|
export declare function isPendingBuilderHref(app: WorkspaceAppSummary): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-apps.d.ts","sourceRoot":"","sources":["../../src/lib/workspace-apps.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-apps.d.ts","sourceRoot":"","sources":["../../src/lib/workspace-apps.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAGxE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAEtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-apps.js","sourceRoot":"","sources":["../../src/lib/workspace-apps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace-apps.js","sourceRoot":"","sources":["../../src/lib/workspace-apps.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,gBAAgB,CAAC,GAAwB;IACvD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC;IAC5D,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAwB;IAC3D,OAAO,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;AACtD,CAAC","sourcesContent":["export interface WorkspaceAppSummary {\n id: string;\n name: string;\n description?: string;\n path: string;\n url?: string | null;\n isDispatch?: boolean;\n status?: \"ready\" | \"pending\";\n statusLabel?: string;\n builderUrl?: string | null;\n branchName?: string | null;\n archived?: boolean;\n}\n\nexport function workspaceAppHref(app: WorkspaceAppSummary): string | null {\n if (app.status === \"pending\") return app.builderUrl || null;\n return app.path || app.url || null;\n}\n\nexport function isPendingBuilderHref(app: WorkspaceAppSummary): boolean {\n return app.status === \"pending\" && !!app.builderUrl;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/apps.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/apps.tsx"],"names":[],"mappings":"AA0BA,wBAAgB,IAAI;;IAEnB;AA8BD,MAAM,CAAC,OAAO,UAAU,SAAS,4CAgHhC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { useActionMutation, useActionQuery } from "@agent-native/core/client";
|
|
4
|
+
import { IconApps, IconBrush, IconCalendarMonth, IconChartBar, IconClipboardList, IconEyeOff, IconFileText, IconLoader2, IconMail, IconPlus, IconPresentation, IconScreenShare, IconSparkles, IconStack3, IconVideo, } from "@tabler/icons-react";
|
|
5
|
+
import { toast } from "sonner";
|
|
4
6
|
import { CreateAppPopover } from "../../components/create-app-popover.js";
|
|
5
7
|
import { DispatchShell } from "../../components/dispatch-shell.js";
|
|
6
8
|
import { WorkspaceAppCard } from "../../components/workspace-app-card.js";
|
|
@@ -8,18 +10,49 @@ import { Button } from "../../components/ui/button.js";
|
|
|
8
10
|
export function meta() {
|
|
9
11
|
return [{ title: "Apps — Dispatch" }];
|
|
10
12
|
}
|
|
13
|
+
const TEMPLATE_ICONS = {
|
|
14
|
+
Mail: IconMail,
|
|
15
|
+
CalendarMonth: IconCalendarMonth,
|
|
16
|
+
FileText: IconFileText,
|
|
17
|
+
Presentation: IconPresentation,
|
|
18
|
+
ScreenShare: IconScreenShare,
|
|
19
|
+
ChartBar: IconChartBar,
|
|
20
|
+
ClipboardList: IconClipboardList,
|
|
21
|
+
Brush: IconBrush,
|
|
22
|
+
Video: IconVideo,
|
|
23
|
+
};
|
|
11
24
|
export default function AppsRoute() {
|
|
12
|
-
const
|
|
25
|
+
const [showHidden, setShowHidden] = useState(false);
|
|
26
|
+
const { data: apps = [] } = useActionQuery("list-workspace-apps", { includeAgentCards: false, includeArchived: true }, {
|
|
13
27
|
refetchInterval: 2_000,
|
|
14
28
|
});
|
|
15
29
|
const { data: workspace } = useActionQuery("get-workspace-info", {}, { staleTime: 60_000 });
|
|
30
|
+
const { data: templates = [] } = useActionQuery("list-available-workspace-templates", {}, { refetchInterval: 5_000 });
|
|
16
31
|
const ws = workspace;
|
|
17
32
|
const workspaceLabel = ws?.displayName ?? ws?.name ?? null;
|
|
18
|
-
const
|
|
33
|
+
const allApps = apps.filter((app) => !app.isDispatch);
|
|
34
|
+
const visibleApps = allApps.filter((app) => !app.archived);
|
|
35
|
+
const archivedApps = allApps.filter((app) => app.archived);
|
|
36
|
+
const typedTemplates = templates;
|
|
19
37
|
return (_jsx(DispatchShell, { title: "Apps", description: workspaceLabel
|
|
20
38
|
? `Apps in the "${workspaceLabel}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.`
|
|
21
|
-
: "Open workspace apps and start new app creation from Dispatch.", children:
|
|
22
|
-
|
|
23
|
-
|
|
39
|
+
: "Open workspace apps and start new app creation from Dispatch.", children: _jsxs("div", { className: "space-y-6", children: [_jsxs("section", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(IconApps, { size: 16, className: "text-muted-foreground" }), _jsx("h2", { className: "text-sm font-semibold text-foreground", children: workspaceLabel
|
|
40
|
+
? `Apps in ${workspaceLabel}`
|
|
41
|
+
: "Workspace apps" })] }), _jsx(CreateAppPopover, { align: "end", trigger: _jsxs(Button, { size: "sm", variant: "outline", children: [_jsx(IconPlus, { size: 15, className: "mr-1.5" }), "App"] }) })] }), _jsxs("div", { className: "grid gap-3 md:grid-cols-2 xl:grid-cols-3", children: [visibleApps.map((app) => (_jsx(WorkspaceAppCard, { app: app }, app.id))), _jsx(CreateAppPopover, {})] })] }), typedTemplates.length > 0 ? (_jsxs("section", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(IconStack3, { size: 16, className: "text-muted-foreground" }), _jsx("h2", { className: "text-sm font-semibold text-foreground", children: "Add a template" }), _jsxs("span", { className: "text-xs text-muted-foreground", children: ["Scaffold a first-party app into", " ", _jsx("code", { className: "font-mono text-[11px]", children: "apps/" }), "."] })] }), _jsx("div", { className: "grid gap-3 md:grid-cols-2 xl:grid-cols-3", children: typedTemplates.map((template) => (_jsx(AddTemplateCard, { template: template }, template.name))) })] })) : null, archivedApps.length > 0 ? (_jsxs("section", { className: "space-y-3", children: [_jsxs("button", { type: "button", onClick: () => setShowHidden((cur) => !cur), className: "inline-flex cursor-pointer items-center gap-2 text-xs text-muted-foreground hover:text-foreground", children: [_jsx(IconEyeOff, { size: 14 }), showHidden ? "Hide" : "Show", " ", archivedApps.length, " hidden", " ", archivedApps.length === 1 ? "app" : "apps"] }), showHidden ? (_jsx("div", { className: "grid gap-3 md:grid-cols-2 xl:grid-cols-3", children: archivedApps.map((app) => (_jsx(WorkspaceAppCard, { app: app }, app.id))) })) : null] })) : null] }) }));
|
|
42
|
+
}
|
|
43
|
+
function AddTemplateCard({ template }) {
|
|
44
|
+
const Icon = TEMPLATE_ICONS[template.icon] ?? IconSparkles;
|
|
45
|
+
const scaffold = useActionMutation("scaffold-workspace-app", {
|
|
46
|
+
onSuccess: (result) => {
|
|
47
|
+
toast.success(`Scaffolded apps/${result?.appId || template.name}. The gateway will pick it up shortly.`);
|
|
48
|
+
},
|
|
49
|
+
onError: (err) => {
|
|
50
|
+
toast.error(`Could not scaffold ${template.label}: ${err instanceof Error ? err.message : String(err)}`);
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
return (_jsxs("div", { className: "group relative flex items-start gap-3 rounded-lg border bg-card p-4 transition hover:border-foreground/30", children: [_jsx("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-md", style: {
|
|
54
|
+
backgroundColor: `rgb(${template.colorRgb} / 0.12)`,
|
|
55
|
+
color: template.color,
|
|
56
|
+
}, children: _jsx(Icon, { size: 18 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "flex min-w-0 items-center gap-2", children: _jsx("h3", { className: "truncate text-sm font-semibold text-foreground", children: template.label }) }), _jsx("p", { className: "mt-1 line-clamp-2 text-xs leading-relaxed text-muted-foreground", children: template.hint }), _jsx("div", { className: "mt-3", children: _jsx(Button, { size: "sm", variant: "outline", disabled: scaffold.isPending, onClick: () => scaffold.mutate({ template: template.name }), children: scaffold.isPending ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { size: 14, className: "mr-1.5 animate-spin" }), "Adding\u2026"] })) : (_jsxs(_Fragment, { children: [_jsx(IconPlus, { size: 14, className: "mr-1.5" }), "Add to workspace"] })) }) })] })] }));
|
|
24
57
|
}
|
|
25
58
|
//# sourceMappingURL=apps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../../src/routes/pages/apps.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhD,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;AACxC,CAAC;AAQD,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,cAAc,CACxC,qBAAqB,EACrB,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAC5B;QACE,eAAe,EAAE,KAAK;KACvB,CACF,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,cAAc,CACxC,oBAAoB,EACpB,EAAE,EACF,EAAE,SAAS,EAAE,MAAM,EAAE,CACtB,CAAC;IACF,MAAM,EAAE,GAAG,SAAsC,CAAC;IAClD,MAAM,cAAc,GAAG,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC;IAC3D,MAAM,SAAS,GAAI,IAA8B,CAAC,MAAM,CACtD,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CACzB,CAAC;IAEF,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAC,MAAM,EACZ,WAAW,EACT,cAAc;YACZ,CAAC,CAAC,gBAAgB,cAAc,8GAA8G;YAC9I,CAAC,CAAC,+DAA+D,YAGrE,cAAK,SAAS,EAAC,WAAW,YACxB,mBAAS,SAAS,EAAC,WAAW,aAC5B,eAAK,SAAS,EAAC,yCAAyC,aACtD,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,GAAG,EACxD,aAAI,SAAS,EAAC,uCAAuC,YAClD,cAAc;4CACb,CAAC,CAAC,WAAW,cAAc,EAAE;4CAC7B,CAAC,CAAC,gBAAgB,GACjB,IACD,EACN,KAAC,gBAAgB,IACf,KAAK,EAAC,KAAK,EACX,OAAO,EACL,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,aACjC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,QAAQ,GAAG,WAElC,GAEX,IACE,EAEN,eAAK,SAAS,EAAC,0CAA0C,aACtD,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACtB,KAAC,gBAAgB,IAAc,GAAG,EAAE,GAAG,IAAhB,GAAG,CAAC,EAAE,CAAc,CAC5C,CAAC,EAEF,KAAC,gBAAgB,KAAG,IAChB,IACE,GACN,GACQ,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { useActionQuery } from \"@agent-native/core/client\";\nimport { IconApps, IconPlus } from \"@tabler/icons-react\";\nimport { CreateAppPopover } from \"@/components/create-app-popover\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { WorkspaceAppCard } from \"@/components/workspace-app-card\";\nimport { Button } from \"@/components/ui/button\";\nimport type { WorkspaceAppSummary } from \"@/lib/workspace-apps\";\n\nexport function meta() {\n return [{ title: \"Apps — Dispatch\" }];\n}\n\ninterface WorkspaceInfo {\n name: string | null;\n displayName: string | null;\n appCount: number;\n}\n\nexport default function AppsRoute() {\n const { data: apps = [] } = useActionQuery(\n \"list-workspace-apps\",\n { includeAgentCards: false },\n {\n refetchInterval: 2_000,\n },\n );\n const { data: workspace } = useActionQuery(\n \"get-workspace-info\",\n {},\n { staleTime: 60_000 },\n );\n const ws = workspace as WorkspaceInfo | undefined;\n const workspaceLabel = ws?.displayName ?? ws?.name ?? null;\n const typedApps = (apps as WorkspaceAppSummary[]).filter(\n (app) => !app.isDispatch,\n );\n\n return (\n <DispatchShell\n title=\"Apps\"\n description={\n workspaceLabel\n ? `Apps in the \"${workspaceLabel}\" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.`\n : \"Open workspace apps and start new app creation from Dispatch.\"\n }\n >\n <div className=\"space-y-4\">\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <IconApps size={16} className=\"text-muted-foreground\" />\n <h2 className=\"text-sm font-semibold text-foreground\">\n {workspaceLabel\n ? `Apps in ${workspaceLabel}`\n : \"Workspace apps\"}\n </h2>\n </div>\n <CreateAppPopover\n align=\"end\"\n trigger={\n <Button size=\"sm\" variant=\"outline\">\n <IconPlus size={15} className=\"mr-1.5\" />\n App\n </Button>\n }\n />\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-3\">\n {typedApps.map((app) => (\n <WorkspaceAppCard key={app.id} app={app} />\n ))}\n\n <CreateAppPopover />\n </div>\n </section>\n </div>\n </DispatchShell>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../../src/routes/pages/apps.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EACL,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhD,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;AACxC,CAAC;AAkBD,MAAM,cAAc,GAAoC;IACtD,IAAI,EAAE,QAAQ;IACd,aAAa,EAAE,iBAAiB;IAChC,QAAQ,EAAE,YAAY;IACtB,YAAY,EAAE,gBAAgB;IAC9B,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE,YAAY;IACtB,aAAa,EAAE,iBAAiB;IAChC,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,cAAc,CACxC,qBAAqB,EACrB,EAAE,iBAAiB,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,EACnD;QACE,eAAe,EAAE,KAAK;KACvB,CACF,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,cAAc,CACxC,oBAAoB,EACpB,EAAE,EACF,EAAE,SAAS,EAAE,MAAM,EAAE,CACtB,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,cAAc,CAC7C,oCAAoC,EACpC,EAAE,EACF,EAAE,eAAe,EAAE,KAAK,EAAE,CAC3B,CAAC;IAEF,MAAM,EAAE,GAAG,SAAsC,CAAC;IAClD,MAAM,cAAc,GAAG,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC;IAC3D,MAAM,OAAO,GAAI,IAA8B,CAAC,MAAM,CACpD,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CACzB,CAAC;IACF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,cAAc,GAAG,SAAgC,CAAC;IAExD,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAC,MAAM,EACZ,WAAW,EACT,cAAc;YACZ,CAAC,CAAC,gBAAgB,cAAc,8GAA8G;YAC9I,CAAC,CAAC,+DAA+D,YAGrE,eAAK,SAAS,EAAC,WAAW,aACxB,mBAAS,SAAS,EAAC,WAAW,aAC5B,eAAK,SAAS,EAAC,yCAAyC,aACtD,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,GAAG,EACxD,aAAI,SAAS,EAAC,uCAAuC,YAClD,cAAc;gDACb,CAAC,CAAC,WAAW,cAAc,EAAE;gDAC7B,CAAC,CAAC,gBAAgB,GACjB,IACD,EACN,KAAC,gBAAgB,IACf,KAAK,EAAC,KAAK,EACX,OAAO,EACL,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,aACjC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,QAAQ,GAAG,WAElC,GAEX,IACE,EAEN,eAAK,SAAS,EAAC,0CAA0C,aACtD,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACxB,KAAC,gBAAgB,IAAc,GAAG,EAAE,GAAG,IAAhB,GAAG,CAAC,EAAE,CAAc,CAC5C,CAAC,EAEF,KAAC,gBAAgB,KAAG,IAChB,IACE,EAET,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC3B,mBAAS,SAAS,EAAC,WAAW,aAC5B,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,GAAG,EAC1D,aAAI,SAAS,EAAC,uCAAuC,+BAEhD,EACL,gBAAM,SAAS,EAAC,+BAA+B,gDACb,GAAG,EACnC,eAAM,SAAS,EAAC,uBAAuB,sBAAa,SAC/C,IACH,EACN,cAAK,SAAS,EAAC,0CAA0C,YACtD,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAChC,KAAC,eAAe,IAAqB,QAAQ,EAAE,QAAQ,IAAjC,QAAQ,CAAC,IAAI,CAAwB,CAC5D,CAAC,GACE,IACE,CACX,CAAC,CAAC,CAAC,IAAI,EAEP,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACzB,mBAAS,SAAS,EAAC,WAAW,aAC5B,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAC3C,SAAS,EAAC,mGAAmG,aAE7G,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,EACvB,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,OAAG,YAAY,CAAC,MAAM,aAAS,GAAG,EAC9D,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IACpC,EACR,UAAU,CAAC,CAAC,CAAC,CACZ,cAAK,SAAS,EAAC,0CAA0C,YACtD,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACzB,KAAC,gBAAgB,IAAc,GAAG,EAAE,GAAG,IAAhB,GAAG,CAAC,EAAE,CAAc,CAC5C,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAC,CAAC,CAAC,IAAI,IACJ,GACQ,CACjB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,QAAQ,EAAmC;IACpE,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;IAC3D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,wBAAwB,EAAE;QAC3D,SAAS,EAAE,CAAC,MAAW,EAAE,EAAE;YACzB,KAAK,CAAC,OAAO,CACX,mBAAmB,MAAM,EAAE,KAAK,IAAI,QAAQ,CAAC,IAAI,wCAAwC,CAC1F,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,KAAK,CAAC,KAAK,CACT,sBAAsB,QAAQ,CAAC,KAAK,KAClC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,CACL,eAAK,SAAS,EAAC,2GAA2G,aACxH,cACE,SAAS,EAAC,8DAA8D,EACxE,KAAK,EAAE;oBACL,eAAe,EAAE,OAAO,QAAQ,CAAC,QAAQ,UAAU;oBACnD,KAAK,EAAE,QAAQ,CAAC,KAAK;iBACtB,YAED,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,GACd,EACN,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cAAK,SAAS,EAAC,iCAAiC,YAC9C,aAAI,SAAS,EAAC,gDAAgD,YAC3D,QAAQ,CAAC,KAAK,GACZ,GACD,EACN,YAAG,SAAS,EAAC,iEAAiE,YAC3E,QAAQ,CAAC,IAAI,GACZ,EACJ,cAAK,SAAS,EAAC,MAAM,YACnB,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,SAAS,EACjB,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,YAE1D,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CACpB,8BACE,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,qBAAqB,GAAG,oBAExD,CACJ,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,QAAQ,GAAG,wBAExC,CACJ,GACM,GACL,IACF,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { useState } from \"react\";\nimport { useActionMutation, useActionQuery } from \"@agent-native/core/client\";\nimport {\n IconApps,\n IconBrush,\n IconCalendarMonth,\n IconChartBar,\n IconClipboardList,\n IconEyeOff,\n IconFileText,\n IconLoader2,\n IconMail,\n IconPlus,\n IconPresentation,\n IconScreenShare,\n IconSparkles,\n IconStack3,\n IconVideo,\n} from \"@tabler/icons-react\";\nimport { toast } from \"sonner\";\nimport { CreateAppPopover } from \"@/components/create-app-popover\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { WorkspaceAppCard } from \"@/components/workspace-app-card\";\nimport { Button } from \"@/components/ui/button\";\nimport type { WorkspaceAppSummary } from \"@/lib/workspace-apps\";\n\nexport function meta() {\n return [{ title: \"Apps — Dispatch\" }];\n}\n\ninterface WorkspaceInfo {\n name: string | null;\n displayName: string | null;\n appCount: number;\n}\n\ninterface AvailableTemplate {\n name: string;\n label: string;\n hint: string;\n icon: string;\n color: string;\n colorRgb: string;\n core: boolean;\n}\n\nconst TEMPLATE_ICONS: Record<string, typeof IconMail> = {\n Mail: IconMail,\n CalendarMonth: IconCalendarMonth,\n FileText: IconFileText,\n Presentation: IconPresentation,\n ScreenShare: IconScreenShare,\n ChartBar: IconChartBar,\n ClipboardList: IconClipboardList,\n Brush: IconBrush,\n Video: IconVideo,\n};\n\nexport default function AppsRoute() {\n const [showHidden, setShowHidden] = useState(false);\n const { data: apps = [] } = useActionQuery(\n \"list-workspace-apps\",\n { includeAgentCards: false, includeArchived: true },\n {\n refetchInterval: 2_000,\n },\n );\n const { data: workspace } = useActionQuery(\n \"get-workspace-info\",\n {},\n { staleTime: 60_000 },\n );\n const { data: templates = [] } = useActionQuery(\n \"list-available-workspace-templates\",\n {},\n { refetchInterval: 5_000 },\n );\n\n const ws = workspace as WorkspaceInfo | undefined;\n const workspaceLabel = ws?.displayName ?? ws?.name ?? null;\n const allApps = (apps as WorkspaceAppSummary[]).filter(\n (app) => !app.isDispatch,\n );\n const visibleApps = allApps.filter((app) => !app.archived);\n const archivedApps = allApps.filter((app) => app.archived);\n const typedTemplates = templates as AvailableTemplate[];\n\n return (\n <DispatchShell\n title=\"Apps\"\n description={\n workspaceLabel\n ? `Apps in the \"${workspaceLabel}\" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.`\n : \"Open workspace apps and start new app creation from Dispatch.\"\n }\n >\n <div className=\"space-y-6\">\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <IconApps size={16} className=\"text-muted-foreground\" />\n <h2 className=\"text-sm font-semibold text-foreground\">\n {workspaceLabel\n ? `Apps in ${workspaceLabel}`\n : \"Workspace apps\"}\n </h2>\n </div>\n <CreateAppPopover\n align=\"end\"\n trigger={\n <Button size=\"sm\" variant=\"outline\">\n <IconPlus size={15} className=\"mr-1.5\" />\n App\n </Button>\n }\n />\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-3\">\n {visibleApps.map((app) => (\n <WorkspaceAppCard key={app.id} app={app} />\n ))}\n\n <CreateAppPopover />\n </div>\n </section>\n\n {typedTemplates.length > 0 ? (\n <section className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <IconStack3 size={16} className=\"text-muted-foreground\" />\n <h2 className=\"text-sm font-semibold text-foreground\">\n Add a template\n </h2>\n <span className=\"text-xs text-muted-foreground\">\n Scaffold a first-party app into{\" \"}\n <code className=\"font-mono text-[11px]\">apps/</code>.\n </span>\n </div>\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-3\">\n {typedTemplates.map((template) => (\n <AddTemplateCard key={template.name} template={template} />\n ))}\n </div>\n </section>\n ) : null}\n\n {archivedApps.length > 0 ? (\n <section className=\"space-y-3\">\n <button\n type=\"button\"\n onClick={() => setShowHidden((cur) => !cur)}\n className=\"inline-flex cursor-pointer items-center gap-2 text-xs text-muted-foreground hover:text-foreground\"\n >\n <IconEyeOff size={14} />\n {showHidden ? \"Hide\" : \"Show\"} {archivedApps.length} hidden{\" \"}\n {archivedApps.length === 1 ? \"app\" : \"apps\"}\n </button>\n {showHidden ? (\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-3\">\n {archivedApps.map((app) => (\n <WorkspaceAppCard key={app.id} app={app} />\n ))}\n </div>\n ) : null}\n </section>\n ) : null}\n </div>\n </DispatchShell>\n );\n}\n\nfunction AddTemplateCard({ template }: { template: AvailableTemplate }) {\n const Icon = TEMPLATE_ICONS[template.icon] ?? IconSparkles;\n const scaffold = useActionMutation(\"scaffold-workspace-app\", {\n onSuccess: (result: any) => {\n toast.success(\n `Scaffolded apps/${result?.appId || template.name}. The gateway will pick it up shortly.`,\n );\n },\n onError: (err) => {\n toast.error(\n `Could not scaffold ${template.label}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n },\n });\n\n return (\n <div className=\"group relative flex items-start gap-3 rounded-lg border bg-card p-4 transition hover:border-foreground/30\">\n <div\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md\"\n style={{\n backgroundColor: `rgb(${template.colorRgb} / 0.12)`,\n color: template.color,\n }}\n >\n <Icon size={18} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">\n {template.label}\n </h3>\n </div>\n <p className=\"mt-1 line-clamp-2 text-xs leading-relaxed text-muted-foreground\">\n {template.hint}\n </p>\n <div className=\"mt-3\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={scaffold.isPending}\n onClick={() => scaffold.mutate({ template: template.name })}\n >\n {scaffold.isPending ? (\n <>\n <IconLoader2 size={14} className=\"mr-1.5 animate-spin\" />\n Adding…\n </>\n ) : (\n <>\n <IconPlus size={14} className=\"mr-1.5\" />\n Add to workspace\n </>\n )}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -587,7 +587,7 @@ const ADDABLE_TEMPLATES = [
|
|
|
587
587
|
name: "calendar",
|
|
588
588
|
label: "Calendar",
|
|
589
589
|
hint: "Manage events, sync, and public booking",
|
|
590
|
-
icon: "
|
|
590
|
+
icon: "CalendarMonth",
|
|
591
591
|
color: "#8B5CF6",
|
|
592
592
|
colorRgb: "139 92 246",
|
|
593
593
|
core: true,
|
|
@@ -605,7 +605,7 @@ const ADDABLE_TEMPLATES = [
|
|
|
605
605
|
name: "slides",
|
|
606
606
|
label: "Slides",
|
|
607
607
|
hint: "Generate and edit React presentations",
|
|
608
|
-
icon: "
|
|
608
|
+
icon: "Presentation",
|
|
609
609
|
color: "#EC4899",
|
|
610
610
|
colorRgb: "236 72 153",
|
|
611
611
|
core: true,
|
|
@@ -623,7 +623,7 @@ const ADDABLE_TEMPLATES = [
|
|
|
623
623
|
name: "analytics",
|
|
624
624
|
label: "Analytics",
|
|
625
625
|
hint: "Connect data sources, prompt for charts",
|
|
626
|
-
icon: "
|
|
626
|
+
icon: "ChartBar",
|
|
627
627
|
color: "#F59E0B",
|
|
628
628
|
colorRgb: "245 158 11",
|
|
629
629
|
core: true,
|