Skip to content

Commit 2fd8c44

Browse files
committed
Migrate the remaining console apps onto the shared route tree
packages/app (local + desktop), host-selfhost, and cloud now compose consoleRoutes() from @executor-js/react into their TanStack virtualRouteConfig instead of re-declaring the shared route files — host-cloudflare already did in the previous commit. Each app keeps its own __root and its app-specific routes under a routes/app directory. Intentional divergence is now explicit via exclude: - packages/app excludes /secrets (the local variant shows credential-provider info). - cloud excludes /secrets (redirects to /), /resume/$executionId (the cloud variant), and /plugins/$pluginId/$ (client plugin pages are not wired up on cloud). The legacy /sources/* redirect stubs are dropped rather than carried forward — pre-rename bookmarks now 404 instead of redirecting. Incidental drift the shared files erase: local/desktop pick up the integration-add namespace search param the other apps already had. A contract test in packages/react locks consoleRoutes() to the generated console tree, so a route file added without a helper entry (or vice versa) fails in CI. cloud's build wrapper additionally pre-builds @executor-js/react: its vite config imports @executor-js/react/console-routes, which vite's config loader externalizes, so under Node it must resolve to the built dist.
1 parent d5eb3d7 commit 2fd8c44

47 files changed

Lines changed: 421 additions & 814 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/cloud/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
"@executor-js/cli": "workspace:*",
8080
"@rhyssul/portless": "^0.13.0",
8181
"@tailwindcss/vite": "catalog:",
82+
"@tanstack/virtual-file-routes": "^1.162.0",
8283
"@types/react": "catalog:",
8384
"@types/react-dom": "catalog:",
8485
"@vitejs/plugin-react": "catalog:",

apps/cloud/scripts/build.mjs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ console.log(`[build] VITE_PUBLIC_ANALYTICS_PATH=${process.env.VITE_PUBLIC_ANALYT
1818

1919
rmSync(new URL("../dist/", import.meta.url), { force: true, recursive: true });
2020

21-
const steps = ["turbo run build --filter @executor-js/vite-plugin", "vite build"];
21+
const steps = [
22+
// Workspace packages whose exports app code (or this very vite config)
23+
// resolves from dist under Node — vite's config loader externalizes bare
24+
// imports, so they must be built before vite starts.
25+
"turbo run build --filter @executor-js/vite-plugin --filter @executor-js/react",
26+
"vite build",
27+
];
2228

2329
for (const step of steps) {
2430
const result = spawnSync(step, { stdio: "inherit", shell: true });

apps/cloud/src/routeTree.gen.ts

Lines changed: 96 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,26 @@
99
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
1010

1111
import { Route as rootRouteImport } from './routes/__root'
12-
import { Route as ToolsRouteImport } from './routes/tools'
13-
import { Route as SetupMcpRouteImport } from './routes/setup-mcp'
14-
import { Route as SecretsRouteImport } from './routes/secrets'
15-
import { Route as PoliciesRouteImport } from './routes/policies'
16-
import { Route as OrgRouteImport } from './routes/org'
17-
import { Route as CreateOrgRouteImport } from './routes/create-org'
18-
import { Route as BillingRouteImport } from './routes/billing'
19-
import { Route as ApiKeysRouteImport } from './routes/api-keys'
20-
import { Route as IndexRouteImport } from './routes/index'
21-
import { Route as ResumeExecutionIdRouteImport } from './routes/resume.$executionId'
22-
import { Route as IntegrationsNamespaceRouteImport } from './routes/integrations.$namespace'
23-
import { Route as BillingPlansRouteImport } from './routes/billing_.plans'
24-
import { Route as IntegrationsAddPluginKeyRouteImport } from './routes/integrations.add.$pluginKey'
12+
import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport } from './../../../packages/react/src/routes/tools'
13+
import { Route as SetupMcpRouteImport } from './routes/app/setup-mcp'
14+
import { Route as SecretsRouteImport } from './routes/app/secrets'
15+
import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport } from './../../../packages/react/src/routes/policies'
16+
import { Route as OrgRouteImport } from './routes/app/org'
17+
import { Route as CreateOrgRouteImport } from './routes/app/create-org'
18+
import { Route as BillingRouteImport } from './routes/app/billing'
19+
import { Route as ApiKeysRouteImport } from './routes/app/api-keys'
20+
import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport } from './../../../packages/react/src/routes/index'
21+
import { Route as ResumeDotexecutionIdRouteImport } from './routes/app/resume.$executionId'
22+
import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../../packages/react/src/routes/integrations.$namespace'
23+
import { Route as Billing_DotplansRouteImport } from './routes/app/billing_.plans'
24+
import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRouteImport } from './../../../packages/react/src/routes/integrations.add.$pluginKey'
2525

26-
const ToolsRoute = ToolsRouteImport.update({
27-
id: '/tools',
28-
path: '/tools',
29-
getParentRoute: () => rootRouteImport,
30-
} as any)
26+
const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute =
27+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport.update({
28+
id: '/tools',
29+
path: '/tools',
30+
getParentRoute: () => rootRouteImport,
31+
} as any)
3132
const SetupMcpRoute = SetupMcpRouteImport.update({
3233
id: '/setup-mcp',
3334
path: '/setup-mcp',
@@ -38,11 +39,12 @@ const SecretsRoute = SecretsRouteImport.update({
3839
path: '/secrets',
3940
getParentRoute: () => rootRouteImport,
4041
} as any)
41-
const PoliciesRoute = PoliciesRouteImport.update({
42-
id: '/policies',
43-
path: '/policies',
44-
getParentRoute: () => rootRouteImport,
45-
} as any)
42+
const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute =
43+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport.update({
44+
id: '/policies',
45+
path: '/policies',
46+
getParentRoute: () => rootRouteImport,
47+
} as any)
4648
const OrgRoute = OrgRouteImport.update({
4749
id: '/org',
4850
path: '/org',
@@ -63,78 +65,84 @@ const ApiKeysRoute = ApiKeysRouteImport.update({
6365
path: '/api-keys',
6466
getParentRoute: () => rootRouteImport,
6567
} as any)
66-
const IndexRoute = IndexRouteImport.update({
67-
id: '/',
68-
path: '/',
69-
getParentRoute: () => rootRouteImport,
70-
} as any)
71-
const ResumeExecutionIdRoute = ResumeExecutionIdRouteImport.update({
68+
const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute =
69+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport.update({
70+
id: '/',
71+
path: '/',
72+
getParentRoute: () => rootRouteImport,
73+
} as any)
74+
const ResumeDotexecutionIdRoute = ResumeDotexecutionIdRouteImport.update({
7275
id: '/resume/$executionId',
7376
path: '/resume/$executionId',
7477
getParentRoute: () => rootRouteImport,
7578
} as any)
76-
const IntegrationsNamespaceRoute = IntegrationsNamespaceRouteImport.update({
77-
id: '/integrations/$namespace',
78-
path: '/integrations/$namespace',
79-
getParentRoute: () => rootRouteImport,
80-
} as any)
81-
const BillingPlansRoute = BillingPlansRouteImport.update({
79+
const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute =
80+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport.update(
81+
{
82+
id: '/integrations/$namespace',
83+
path: '/integrations/$namespace',
84+
getParentRoute: () => rootRouteImport,
85+
} as any,
86+
)
87+
const Billing_DotplansRoute = Billing_DotplansRouteImport.update({
8288
id: '/billing_/plans',
8389
path: '/billing/plans',
8490
getParentRoute: () => rootRouteImport,
8591
} as any)
86-
const IntegrationsAddPluginKeyRoute =
87-
IntegrationsAddPluginKeyRouteImport.update({
88-
id: '/integrations/add/$pluginKey',
89-
path: '/integrations/add/$pluginKey',
90-
getParentRoute: () => rootRouteImport,
91-
} as any)
92+
const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute =
93+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRouteImport.update(
94+
{
95+
id: '/integrations/add/$pluginKey',
96+
path: '/integrations/add/$pluginKey',
97+
getParentRoute: () => rootRouteImport,
98+
} as any,
99+
)
92100

93101
export interface FileRoutesByFullPath {
94-
'/': typeof IndexRoute
102+
'/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
95103
'/api-keys': typeof ApiKeysRoute
96104
'/billing': typeof BillingRoute
97105
'/create-org': typeof CreateOrgRoute
98106
'/org': typeof OrgRoute
99-
'/policies': typeof PoliciesRoute
107+
'/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
100108
'/secrets': typeof SecretsRoute
101109
'/setup-mcp': typeof SetupMcpRoute
102-
'/tools': typeof ToolsRoute
103-
'/billing/plans': typeof BillingPlansRoute
104-
'/integrations/$namespace': typeof IntegrationsNamespaceRoute
105-
'/resume/$executionId': typeof ResumeExecutionIdRoute
106-
'/integrations/add/$pluginKey': typeof IntegrationsAddPluginKeyRoute
110+
'/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
111+
'/billing/plans': typeof Billing_DotplansRoute
112+
'/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
113+
'/resume/$executionId': typeof ResumeDotexecutionIdRoute
114+
'/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
107115
}
108116
export interface FileRoutesByTo {
109-
'/': typeof IndexRoute
117+
'/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
110118
'/api-keys': typeof ApiKeysRoute
111119
'/billing': typeof BillingRoute
112120
'/create-org': typeof CreateOrgRoute
113121
'/org': typeof OrgRoute
114-
'/policies': typeof PoliciesRoute
122+
'/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
115123
'/secrets': typeof SecretsRoute
116124
'/setup-mcp': typeof SetupMcpRoute
117-
'/tools': typeof ToolsRoute
118-
'/billing/plans': typeof BillingPlansRoute
119-
'/integrations/$namespace': typeof IntegrationsNamespaceRoute
120-
'/resume/$executionId': typeof ResumeExecutionIdRoute
121-
'/integrations/add/$pluginKey': typeof IntegrationsAddPluginKeyRoute
125+
'/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
126+
'/billing/plans': typeof Billing_DotplansRoute
127+
'/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
128+
'/resume/$executionId': typeof ResumeDotexecutionIdRoute
129+
'/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
122130
}
123131
export interface FileRoutesById {
124132
__root__: typeof rootRouteImport
125-
'/': typeof IndexRoute
133+
'/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
126134
'/api-keys': typeof ApiKeysRoute
127135
'/billing': typeof BillingRoute
128136
'/create-org': typeof CreateOrgRoute
129137
'/org': typeof OrgRoute
130-
'/policies': typeof PoliciesRoute
138+
'/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
131139
'/secrets': typeof SecretsRoute
132140
'/setup-mcp': typeof SetupMcpRoute
133-
'/tools': typeof ToolsRoute
134-
'/billing_/plans': typeof BillingPlansRoute
135-
'/integrations/$namespace': typeof IntegrationsNamespaceRoute
136-
'/resume/$executionId': typeof ResumeExecutionIdRoute
137-
'/integrations/add/$pluginKey': typeof IntegrationsAddPluginKeyRoute
141+
'/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
142+
'/billing_/plans': typeof Billing_DotplansRoute
143+
'/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
144+
'/resume/$executionId': typeof ResumeDotexecutionIdRoute
145+
'/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
138146
}
139147
export interface FileRouteTypes {
140148
fileRoutesByFullPath: FileRoutesByFullPath
@@ -185,19 +193,19 @@ export interface FileRouteTypes {
185193
fileRoutesById: FileRoutesById
186194
}
187195
export interface RootRouteChildren {
188-
IndexRoute: typeof IndexRoute
196+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
189197
ApiKeysRoute: typeof ApiKeysRoute
190198
BillingRoute: typeof BillingRoute
191199
CreateOrgRoute: typeof CreateOrgRoute
192200
OrgRoute: typeof OrgRoute
193-
PoliciesRoute: typeof PoliciesRoute
201+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
194202
SecretsRoute: typeof SecretsRoute
195203
SetupMcpRoute: typeof SetupMcpRoute
196-
ToolsRoute: typeof ToolsRoute
197-
BillingPlansRoute: typeof BillingPlansRoute
198-
IntegrationsNamespaceRoute: typeof IntegrationsNamespaceRoute
199-
ResumeExecutionIdRoute: typeof ResumeExecutionIdRoute
200-
IntegrationsAddPluginKeyRoute: typeof IntegrationsAddPluginKeyRoute
204+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
205+
Billing_DotplansRoute: typeof Billing_DotplansRoute
206+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
207+
ResumeDotexecutionIdRoute: typeof ResumeDotexecutionIdRoute
208+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
201209
}
202210

203211
declare module '@tanstack/react-router' {
@@ -206,7 +214,7 @@ declare module '@tanstack/react-router' {
206214
id: '/tools'
207215
path: '/tools'
208216
fullPath: '/tools'
209-
preLoaderRoute: typeof ToolsRouteImport
217+
preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport
210218
parentRoute: typeof rootRouteImport
211219
}
212220
'/setup-mcp': {
@@ -227,7 +235,7 @@ declare module '@tanstack/react-router' {
227235
id: '/policies'
228236
path: '/policies'
229237
fullPath: '/policies'
230-
preLoaderRoute: typeof PoliciesRouteImport
238+
preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport
231239
parentRoute: typeof rootRouteImport
232240
}
233241
'/org': {
@@ -262,54 +270,59 @@ declare module '@tanstack/react-router' {
262270
id: '/'
263271
path: '/'
264272
fullPath: '/'
265-
preLoaderRoute: typeof IndexRouteImport
273+
preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport
266274
parentRoute: typeof rootRouteImport
267275
}
268276
'/resume/$executionId': {
269277
id: '/resume/$executionId'
270278
path: '/resume/$executionId'
271279
fullPath: '/resume/$executionId'
272-
preLoaderRoute: typeof ResumeExecutionIdRouteImport
280+
preLoaderRoute: typeof ResumeDotexecutionIdRouteImport
273281
parentRoute: typeof rootRouteImport
274282
}
275283
'/integrations/$namespace': {
276284
id: '/integrations/$namespace'
277285
path: '/integrations/$namespace'
278286
fullPath: '/integrations/$namespace'
279-
preLoaderRoute: typeof IntegrationsNamespaceRouteImport
287+
preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport
280288
parentRoute: typeof rootRouteImport
281289
}
282290
'/billing_/plans': {
283291
id: '/billing_/plans'
284292
path: '/billing/plans'
285293
fullPath: '/billing/plans'
286-
preLoaderRoute: typeof BillingPlansRouteImport
294+
preLoaderRoute: typeof Billing_DotplansRouteImport
287295
parentRoute: typeof rootRouteImport
288296
}
289297
'/integrations/add/$pluginKey': {
290298
id: '/integrations/add/$pluginKey'
291299
path: '/integrations/add/$pluginKey'
292300
fullPath: '/integrations/add/$pluginKey'
293-
preLoaderRoute: typeof IntegrationsAddPluginKeyRouteImport
301+
preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRouteImport
294302
parentRoute: typeof rootRouteImport
295303
}
296304
}
297305
}
298306

299307
const rootRouteChildren: RootRouteChildren = {
300-
IndexRoute: IndexRoute,
308+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute:
309+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute,
301310
ApiKeysRoute: ApiKeysRoute,
302311
BillingRoute: BillingRoute,
303312
CreateOrgRoute: CreateOrgRoute,
304313
OrgRoute: OrgRoute,
305-
PoliciesRoute: PoliciesRoute,
314+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute:
315+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute,
306316
SecretsRoute: SecretsRoute,
307317
SetupMcpRoute: SetupMcpRoute,
308-
ToolsRoute: ToolsRoute,
309-
BillingPlansRoute: BillingPlansRoute,
310-
IntegrationsNamespaceRoute: IntegrationsNamespaceRoute,
311-
ResumeExecutionIdRoute: ResumeExecutionIdRoute,
312-
IntegrationsAddPluginKeyRoute: IntegrationsAddPluginKeyRoute,
318+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute:
319+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute,
320+
Billing_DotplansRoute: Billing_DotplansRoute,
321+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute:
322+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute,
323+
ResumeDotexecutionIdRoute: ResumeDotexecutionIdRoute,
324+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute:
325+
DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute,
313326
}
314327
export const routeTree = rootRouteImport
315328
._addFileChildren(rootRouteChildren)
File renamed without changes.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createFileRoute } from "@tanstack/react-router";
2-
import { CreateOrgPage } from "../web/pages/create-org";
2+
import { CreateOrgPage } from "../../web/pages/create-org";
33

44
export const Route = createFileRoute("/create-org")({
55
component: CreateOrgPage,
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
DropdownMenuTrigger,
1616
} from "@executor-js/react/components/dropdown-menu";
1717
import { OrgPage as SharedOrgPage } from "@executor-js/react/pages/org";
18-
import { orgDomainsAtom, getDomainVerificationLink, deleteDomain } from "../web/org-atoms";
18+
import { orgDomainsAtom, getDomainVerificationLink, deleteDomain } from "../../web/org-atoms";
1919

2020
// ---------------------------------------------------------------------------
2121
// Cloud organization page. The members / roles / invite / org-name surface is

apps/cloud/src/routes/resume.$executionId.tsx renamed to apps/cloud/src/routes/app/resume.$executionId.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
ResumeApprovalPageView,
88
} from "@executor-js/react/pages/resume-approval";
99

10-
import { mcpPausedExecutionAtom, resumeMcpExecution } from "../web/mcp-resume-atoms";
10+
import { mcpPausedExecutionAtom, resumeMcpExecution } from "../../web/mcp-resume-atoms";
1111

1212
const SearchParams = Schema.toStandardSchemaV1(
1313
Schema.Struct({

0 commit comments

Comments
 (0)