History

Make toolkits a first-class route

Rhys Sullivan committed 4 months ago

Commit be7fa251 parent d1fb12515 files · +602 −178Browse files

Unified · Split

15 files
  1. apps/cloud/src/routeTree.gen.ts +65 −0
  2. apps/host-cloudflare/web/routeTree.gen.ts +61 −0
  3. apps/host-selfhost/web/routeTree.gen.ts +61 −0
  4. e2e/selfhost/toolkits-ui.test.ts +37 −16
  5. packages/app/src/routeTree.gen.ts +58 −0
  6. packages/app/src/web/shell.tsx +7 −0
  7. packages/plugins/toolkits/src/client.tsx +0 −1
  8. packages/plugins/toolkits/src/page.tsx +190 −158
  9. packages/react/src/console-routes.ts +4 −0
  10. packages/react/src/multiplayer/shell.tsx +1 −0
  11. packages/react/src/routes/plugins.$pluginId.$.tsx +18 −3
  12. packages/react/src/routes/routeTree.gen.ts +53 −0
  13. packages/react/src/routes/toolkits-route.tsx +23 −0
  14. packages/react/src/routes/toolkits.$toolkitSlug.tsx +12 −0
  15. packages/react/src/routes/toolkits.tsx +12 −0
apps/cloud/src/routeTree.gen.ts+65−0
@@ -14,11 +14,13 @@ import { Route as LoginRouteImport } from './routes/bare/login' · 13 unmodified lines
14import { Route as CreateOrgRouteImport } from './routes/bare/create-org'14import { Route as CreateOrgRouteImport } from './routes/bare/create-org'
15import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport } from './../../../packages/react/src/routes/index'15import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport } from './../../../packages/react/src/routes/index'
16import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport } from './../../../packages/react/src/routes/tools'16import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport } from './../../../packages/react/src/routes/tools'
17import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport } from './../../../packages/react/src/routes/toolkits'
17import { Route as SecretsRouteImport } from './routes/app/secrets'18import { Route as SecretsRouteImport } from './routes/app/secrets'
18import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport } from './../../../packages/react/src/routes/policies'19import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport } from './../../../packages/react/src/routes/policies'
19import { Route as OrgRouteImport } from './routes/app/org'20import { Route as OrgRouteImport } from './routes/app/org'
20import { Route as BillingRouteImport } from './routes/app/billing'21import { Route as BillingRouteImport } from './routes/app/billing'
21import { Route as ApiKeysRouteImport } from './routes/app/api-keys'22import { Route as ApiKeysRouteImport } from './routes/app/api-keys'
23import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport } from './../../../packages/react/src/routes/toolkits.$toolkitSlug'
22import { Route as ResumeDotexecutionIdRouteImport } from './routes/app/resume.$executionId'24import { Route as ResumeDotexecutionIdRouteImport } from './routes/app/resume.$executionId'
23import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../../packages/react/src/routes/integrations.$namespace'25import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../../packages/react/src/routes/integrations.$namespace'
24import { Route as Billing_DotplansRouteImport } from './routes/app/billing_.plans'26import { Route as Billing_DotplansRouteImport } from './routes/app/billing_.plans'
@@ -51,6 +53,12 @@ const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute = · 26 unmodified lines
51 path: '/{-$orgSlug}/tools',53 path: '/{-$orgSlug}/tools',
52 getParentRoute: () => rootRouteImport,54 getParentRoute: () => rootRouteImport,
53 } as any)55 } as any)
56const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute =
57 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport.update({
58 id: '/{-$orgSlug}/toolkits',
59 path: '/{-$orgSlug}/toolkits',
60 getParentRoute: () => rootRouteImport,
61 } as any)
54const SecretsRoute = SecretsRouteImport.update({62const SecretsRoute = SecretsRouteImport.update({
55 id: '/{-$orgSlug}/secrets',63 id: '/{-$orgSlug}/secrets',
56 path: '/{-$orgSlug}/secrets',64 path: '/{-$orgSlug}/secrets',
@@ -77,6 +85,15 @@ const ApiKeysRoute = ApiKeysRouteImport.update({ · 20 unmodified lines
77 path: '/{-$orgSlug}/api-keys',85 path: '/{-$orgSlug}/api-keys',
78 getParentRoute: () => rootRouteImport,86 getParentRoute: () => rootRouteImport,
79} as any)87} as any)
88const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute =
89 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport.update(
90 {
91 id: '/$toolkitSlug',
92 path: '/$toolkitSlug',
93 getParentRoute: () =>
94 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute,
95 } as any,
96 )
80const ResumeDotexecutionIdRoute = ResumeDotexecutionIdRouteImport.update({97const ResumeDotexecutionIdRoute = ResumeDotexecutionIdRouteImport.update({
81 id: '/{-$orgSlug}/resume/$executionId',98 id: '/{-$orgSlug}/resume/$executionId',
82 path: '/{-$orgSlug}/resume/$executionId',99 path: '/{-$orgSlug}/resume/$executionId',
@@ -113,11 +130,13 @@ export interface FileRoutesByFullPath { · 30 unmodified lines
113 '/{-$orgSlug}/org': typeof OrgRoute130 '/{-$orgSlug}/org': typeof OrgRoute
114 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute131 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
115 '/{-$orgSlug}/secrets': typeof SecretsRoute132 '/{-$orgSlug}/secrets': typeof SecretsRoute
133 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
116 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute134 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
117 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute135 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
118 '/{-$orgSlug}/billing/plans': typeof Billing_DotplansRoute136 '/{-$orgSlug}/billing/plans': typeof Billing_DotplansRoute
119 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute137 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
120 '/{-$orgSlug}/resume/$executionId': typeof ResumeDotexecutionIdRoute138 '/{-$orgSlug}/resume/$executionId': typeof ResumeDotexecutionIdRoute
139 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
121 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute140 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
122}141}
123export interface FileRoutesByTo {142export interface FileRoutesByTo {
@@ -129,11 +148,13 @@ export interface FileRoutesByTo { · 5 unmodified lines
129 '/{-$orgSlug}/org': typeof OrgRoute148 '/{-$orgSlug}/org': typeof OrgRoute
130 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute149 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
131 '/{-$orgSlug}/secrets': typeof SecretsRoute150 '/{-$orgSlug}/secrets': typeof SecretsRoute
151 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
132 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute152 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
133 '/{-$orgSlug}': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute153 '/{-$orgSlug}': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
134 '/{-$orgSlug}/billing/plans': typeof Billing_DotplansRoute154 '/{-$orgSlug}/billing/plans': typeof Billing_DotplansRoute
135 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute155 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
136 '/{-$orgSlug}/resume/$executionId': typeof ResumeDotexecutionIdRoute156 '/{-$orgSlug}/resume/$executionId': typeof ResumeDotexecutionIdRoute
157 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
137 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute158 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
138}159}
139export interface FileRoutesById {160export interface FileRoutesById {
@@ -146,11 +167,13 @@ export interface FileRoutesById { · 6 unmodified lines
146 '/{-$orgSlug}/org': typeof OrgRoute167 '/{-$orgSlug}/org': typeof OrgRoute
147 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute168 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
148 '/{-$orgSlug}/secrets': typeof SecretsRoute169 '/{-$orgSlug}/secrets': typeof SecretsRoute
170 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
149 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute171 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
150 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute172 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
151 '/{-$orgSlug}/billing_/plans': typeof Billing_DotplansRoute173 '/{-$orgSlug}/billing_/plans': typeof Billing_DotplansRoute
152 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute174 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
153 '/{-$orgSlug}/resume/$executionId': typeof ResumeDotexecutionIdRoute175 '/{-$orgSlug}/resume/$executionId': typeof ResumeDotexecutionIdRoute
176 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
154 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute177 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
155}178}
156export interface FileRouteTypes {179export interface FileRouteTypes {
@@ -164,11 +187,13 @@ export interface FileRouteTypes { · 7 unmodified lines
164 | '/{-$orgSlug}/org'187 | '/{-$orgSlug}/org'
165 | '/{-$orgSlug}/policies'188 | '/{-$orgSlug}/policies'
166 | '/{-$orgSlug}/secrets'189 | '/{-$orgSlug}/secrets'
190 | '/{-$orgSlug}/toolkits'
167 | '/{-$orgSlug}/tools'191 | '/{-$orgSlug}/tools'
168 | '/{-$orgSlug}/'192 | '/{-$orgSlug}/'
169 | '/{-$orgSlug}/billing/plans'193 | '/{-$orgSlug}/billing/plans'
170 | '/{-$orgSlug}/integrations/$namespace'194 | '/{-$orgSlug}/integrations/$namespace'
171 | '/{-$orgSlug}/resume/$executionId'195 | '/{-$orgSlug}/resume/$executionId'
196 | '/{-$orgSlug}/toolkits/$toolkitSlug'
172 | '/{-$orgSlug}/integrations/add/$pluginKey'197 | '/{-$orgSlug}/integrations/add/$pluginKey'
173 fileRoutesByTo: FileRoutesByTo198 fileRoutesByTo: FileRoutesByTo
174 to:199 to:
@@ -180,11 +205,13 @@ export interface FileRouteTypes { · 5 unmodified lines
180 | '/{-$orgSlug}/org'205 | '/{-$orgSlug}/org'
181 | '/{-$orgSlug}/policies'206 | '/{-$orgSlug}/policies'
182 | '/{-$orgSlug}/secrets'207 | '/{-$orgSlug}/secrets'
208 | '/{-$orgSlug}/toolkits'
183 | '/{-$orgSlug}/tools'209 | '/{-$orgSlug}/tools'
184 | '/{-$orgSlug}'210 | '/{-$orgSlug}'
185 | '/{-$orgSlug}/billing/plans'211 | '/{-$orgSlug}/billing/plans'
186 | '/{-$orgSlug}/integrations/$namespace'212 | '/{-$orgSlug}/integrations/$namespace'
187 | '/{-$orgSlug}/resume/$executionId'213 | '/{-$orgSlug}/resume/$executionId'
214 | '/{-$orgSlug}/toolkits/$toolkitSlug'
188 | '/{-$orgSlug}/integrations/add/$pluginKey'215 | '/{-$orgSlug}/integrations/add/$pluginKey'
189 id:216 id:
190 | '__root__'217 | '__root__'
@@ -196,11 +223,13 @@ export interface FileRouteTypes { · 5 unmodified lines
196 | '/{-$orgSlug}/org'223 | '/{-$orgSlug}/org'
197 | '/{-$orgSlug}/policies'224 | '/{-$orgSlug}/policies'
198 | '/{-$orgSlug}/secrets'225 | '/{-$orgSlug}/secrets'
226 | '/{-$orgSlug}/toolkits'
199 | '/{-$orgSlug}/tools'227 | '/{-$orgSlug}/tools'
200 | '/{-$orgSlug}/'228 | '/{-$orgSlug}/'
201 | '/{-$orgSlug}/billing_/plans'229 | '/{-$orgSlug}/billing_/plans'
202 | '/{-$orgSlug}/integrations/$namespace'230 | '/{-$orgSlug}/integrations/$namespace'
203 | '/{-$orgSlug}/resume/$executionId'231 | '/{-$orgSlug}/resume/$executionId'
232 | '/{-$orgSlug}/toolkits/$toolkitSlug'
204 | '/{-$orgSlug}/integrations/add/$pluginKey'233 | '/{-$orgSlug}/integrations/add/$pluginKey'
205 fileRoutesById: FileRoutesById234 fileRoutesById: FileRoutesById
206}235}
@@ -213,6 +242,7 @@ export interface RootRouteChildren { · 6 unmodified lines
213 OrgRoute: typeof OrgRoute242 OrgRoute: typeof OrgRoute
214 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute243 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
215 SecretsRoute: typeof SecretsRoute244 SecretsRoute: typeof SecretsRoute
245 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
216 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute246 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
217 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute247 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
218 Billing_DotplansRoute: typeof Billing_DotplansRoute248 Billing_DotplansRoute: typeof Billing_DotplansRoute
@@ -258,6 +288,13 @@ declare module '@tanstack/react-router' { · 39 unmodified lines
258 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport288 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport
259 parentRoute: typeof rootRouteImport289 parentRoute: typeof rootRouteImport
260 }290 }
291 '/{-$orgSlug}/toolkits': {
292 id: '/{-$orgSlug}/toolkits'
293 path: '/{-$orgSlug}/toolkits'
294 fullPath: '/{-$orgSlug}/toolkits'
295 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport
296 parentRoute: typeof rootRouteImport
297 }
261 '/{-$orgSlug}/secrets': {298 '/{-$orgSlug}/secrets': {
262 id: '/{-$orgSlug}/secrets'299 id: '/{-$orgSlug}/secrets'
263 path: '/{-$orgSlug}/secrets'300 path: '/{-$orgSlug}/secrets'
@@ -293,6 +330,13 @@ declare module '@tanstack/react-router' { · 29 unmodified lines
293 preLoaderRoute: typeof ApiKeysRouteImport330 preLoaderRoute: typeof ApiKeysRouteImport
294 parentRoute: typeof rootRouteImport331 parentRoute: typeof rootRouteImport
295 }332 }
333 '/{-$orgSlug}/toolkits/$toolkitSlug': {
334 id: '/{-$orgSlug}/toolkits/$toolkitSlug'
335 path: '/$toolkitSlug'
336 fullPath: '/{-$orgSlug}/toolkits/$toolkitSlug'
337 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport
338 parentRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute
339 }
296 '/{-$orgSlug}/resume/$executionId': {340 '/{-$orgSlug}/resume/$executionId': {
297 id: '/{-$orgSlug}/resume/$executionId'341 id: '/{-$orgSlug}/resume/$executionId'
298 path: '/{-$orgSlug}/resume/$executionId'342 path: '/{-$orgSlug}/resume/$executionId'
@@ -324,6 +368,21 @@ declare module '@tanstack/react-router' { · 25 unmodified lines
324 }368 }
325}369}
326 370
371interface DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren {
372 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
373}
374
375const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren: DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren =
376 {
377 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute:
378 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute,
379 }
380
381const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren =
382 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute._addFileChildren(
383 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren,
384 )
385
327const rootRouteChildren: RootRouteChildren = {386const rootRouteChildren: RootRouteChildren = {
328 CreateOrgRoute: CreateOrgRoute,387 CreateOrgRoute: CreateOrgRoute,
329 LoginRoute: LoginRoute,388 LoginRoute: LoginRoute,
@@ -334,6 +393,8 @@ const rootRouteChildren: RootRouteChildren = { · 4 unmodified lines
334 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute:393 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute:
335 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute,394 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute,
336 SecretsRoute: SecretsRoute,395 SecretsRoute: SecretsRoute,
396 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute:
397 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren,
337 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute:398 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute:
338 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute,399 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute,
339 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute:400 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute:
@@ -350,11 +411,15 @@ export const routeTree = rootRouteImport · 10 unmodified lines
350 ._addFileTypes<FileRouteTypes>()411 ._addFileTypes<FileRouteTypes>()
351 412
352import type { getRouter } from './router.tsx'413import type { getRouter } from './router.tsx'
414
353import type { startInstance } from './start.ts'415import type { startInstance } from './start.ts'
416
354declare module '@tanstack/react-start' {417declare module '@tanstack/react-start' {
355 interface Register {418 interface Register {
356 ssr: true419 ssr: true
420
357 router: Awaited<ReturnType<typeof getRouter>>421 router: Awaited<ReturnType<typeof getRouter>>
422
358 config: Awaited<ReturnType<typeof startInstance.getOptions>>423 config: Awaited<ReturnType<typeof startInstance.getOptions>>
359 }424 }
360}425}
apps/host-cloudflare/web/routeTree.gen.ts+61−0
@@ -11,8 +11,10 @@ · 10 unmodified lines
11import { Route as rootRouteImport } from './routes/__root'11import { Route as rootRouteImport } from './routes/__root'
12import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport } from './../../../packages/react/src/routes/index'12import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport } from './../../../packages/react/src/routes/index'
13import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport } from './../../../packages/react/src/routes/tools'13import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport } from './../../../packages/react/src/routes/tools'
14import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport } from './../../../packages/react/src/routes/toolkits'
14import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRouteImport } from './../../../packages/react/src/routes/secrets'15import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRouteImport } from './../../../packages/react/src/routes/secrets'
15import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport } from './../../../packages/react/src/routes/policies'16import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport } from './../../../packages/react/src/routes/policies'
17import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport } from './../../../packages/react/src/routes/toolkits.$toolkitSlug'
16import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRouteImport } from './../../../packages/react/src/routes/resume.$executionId'18import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRouteImport } from './../../../packages/react/src/routes/resume.$executionId'
17import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../../packages/react/src/routes/integrations.$namespace'19import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../../packages/react/src/routes/integrations.$namespace'
18import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRouteImport } from './../../../packages/react/src/routes/plugins.$pluginId.$'20import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRouteImport } from './../../../packages/react/src/routes/plugins.$pluginId.$'
@@ -30,6 +32,12 @@ const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute = · 11 unmodified lines
30 path: '/{-$orgSlug}/tools',32 path: '/{-$orgSlug}/tools',
31 getParentRoute: () => rootRouteImport,33 getParentRoute: () => rootRouteImport,
32 } as any)34 } as any)
35const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute =
36 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport.update({
37 id: '/{-$orgSlug}/toolkits',
38 path: '/{-$orgSlug}/toolkits',
39 getParentRoute: () => rootRouteImport,
40 } as any)
33const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute =41const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute =
34 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRouteImport.update({42 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRouteImport.update({
35 id: '/{-$orgSlug}/secrets',43 id: '/{-$orgSlug}/secrets',
@@ -42,6 +50,15 @@ const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute = · 6 unmodified lines
42 path: '/{-$orgSlug}/policies',50 path: '/{-$orgSlug}/policies',
43 getParentRoute: () => rootRouteImport,51 getParentRoute: () => rootRouteImport,
44 } as any)52 } as any)
53const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute =
54 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport.update(
55 {
56 id: '/$toolkitSlug',
57 path: '/$toolkitSlug',
58 getParentRoute: () =>
59 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute,
60 } as any,
61 )
45const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute =62const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute =
46 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRouteImport.update(63 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRouteImport.update(
47 {64 {
@@ -78,20 +95,24 @@ const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginK · 30 unmodified lines
78export interface FileRoutesByFullPath {95export interface FileRoutesByFullPath {
79 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute96 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
80 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute97 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute
98 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
81 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute99 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
82 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute100 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
83 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute101 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
84 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute102 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute
103 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
85 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute104 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
86 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute105 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute
87}106}
88export interface FileRoutesByTo {107export interface FileRoutesByTo {
89 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute108 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
90 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute109 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute
110 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
91 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute111 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
92 '/{-$orgSlug}': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute112 '/{-$orgSlug}': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
93 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute113 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
94 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute114 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute
115 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
95 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute116 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
96 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute117 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute
97}118}
@@ -99,10 +120,12 @@ export interface FileRoutesById { · 1 unmodified line
99 __root__: typeof rootRouteImport120 __root__: typeof rootRouteImport
100 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute121 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
101 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute122 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute
123 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
102 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute124 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
103 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute125 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
104 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute126 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
105 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute127 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute
128 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
106 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute129 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
107 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute130 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute
108}131}
@@ -111,30 +134,36 @@ export interface FileRouteTypes { · 2 unmodified lines
111 fullPaths:134 fullPaths:
112 | '/{-$orgSlug}/policies'135 | '/{-$orgSlug}/policies'
113 | '/{-$orgSlug}/secrets'136 | '/{-$orgSlug}/secrets'
137 | '/{-$orgSlug}/toolkits'
114 | '/{-$orgSlug}/tools'138 | '/{-$orgSlug}/tools'
115 | '/{-$orgSlug}/'139 | '/{-$orgSlug}/'
116 | '/{-$orgSlug}/integrations/$namespace'140 | '/{-$orgSlug}/integrations/$namespace'
117 | '/{-$orgSlug}/resume/$executionId'141 | '/{-$orgSlug}/resume/$executionId'
142 | '/{-$orgSlug}/toolkits/$toolkitSlug'
118 | '/{-$orgSlug}/integrations/add/$pluginKey'143 | '/{-$orgSlug}/integrations/add/$pluginKey'
119 | '/{-$orgSlug}/plugins/$pluginId/$'144 | '/{-$orgSlug}/plugins/$pluginId/$'
120 fileRoutesByTo: FileRoutesByTo145 fileRoutesByTo: FileRoutesByTo
121 to:146 to:
122 | '/{-$orgSlug}/policies'147 | '/{-$orgSlug}/policies'
123 | '/{-$orgSlug}/secrets'148 | '/{-$orgSlug}/secrets'
149 | '/{-$orgSlug}/toolkits'
124 | '/{-$orgSlug}/tools'150 | '/{-$orgSlug}/tools'
125 | '/{-$orgSlug}'151 | '/{-$orgSlug}'
126 | '/{-$orgSlug}/integrations/$namespace'152 | '/{-$orgSlug}/integrations/$namespace'
127 | '/{-$orgSlug}/resume/$executionId'153 | '/{-$orgSlug}/resume/$executionId'
154 | '/{-$orgSlug}/toolkits/$toolkitSlug'
128 | '/{-$orgSlug}/integrations/add/$pluginKey'155 | '/{-$orgSlug}/integrations/add/$pluginKey'
129 | '/{-$orgSlug}/plugins/$pluginId/$'156 | '/{-$orgSlug}/plugins/$pluginId/$'
130 id:157 id:
131 | '__root__'158 | '__root__'
132 | '/{-$orgSlug}/policies'159 | '/{-$orgSlug}/policies'
133 | '/{-$orgSlug}/secrets'160 | '/{-$orgSlug}/secrets'
161 | '/{-$orgSlug}/toolkits'
134 | '/{-$orgSlug}/tools'162 | '/{-$orgSlug}/tools'
135 | '/{-$orgSlug}/'163 | '/{-$orgSlug}/'
136 | '/{-$orgSlug}/integrations/$namespace'164 | '/{-$orgSlug}/integrations/$namespace'
137 | '/{-$orgSlug}/resume/$executionId'165 | '/{-$orgSlug}/resume/$executionId'
166 | '/{-$orgSlug}/toolkits/$toolkitSlug'
138 | '/{-$orgSlug}/integrations/add/$pluginKey'167 | '/{-$orgSlug}/integrations/add/$pluginKey'
139 | '/{-$orgSlug}/plugins/$pluginId/$'168 | '/{-$orgSlug}/plugins/$pluginId/$'
140 fileRoutesById: FileRoutesById169 fileRoutesById: FileRoutesById
@@ -142,6 +171,7 @@ export interface FileRouteTypes { · 1 unmodified line
142export interface RootRouteChildren {171export interface RootRouteChildren {
143 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute172 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
144 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute173 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute
174 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
145 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute175 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
146 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute176 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
147 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute177 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
@@ -166,6 +196,13 @@ declare module '@tanstack/react-router' { · 18 unmodified lines
166 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport196 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport
167 parentRoute: typeof rootRouteImport197 parentRoute: typeof rootRouteImport
168 }198 }
199 '/{-$orgSlug}/toolkits': {
200 id: '/{-$orgSlug}/toolkits'
201 path: '/{-$orgSlug}/toolkits'
202 fullPath: '/{-$orgSlug}/toolkits'
203 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport
204 parentRoute: typeof rootRouteImport
205 }
169 '/{-$orgSlug}/secrets': {206 '/{-$orgSlug}/secrets': {
170 id: '/{-$orgSlug}/secrets'207 id: '/{-$orgSlug}/secrets'
171 path: '/{-$orgSlug}/secrets'208 path: '/{-$orgSlug}/secrets'
@@ -180,6 +217,13 @@ declare module '@tanstack/react-router' { · 8 unmodified lines
180 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport217 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport
181 parentRoute: typeof rootRouteImport218 parentRoute: typeof rootRouteImport
182 }219 }
220 '/{-$orgSlug}/toolkits/$toolkitSlug': {
221 id: '/{-$orgSlug}/toolkits/$toolkitSlug'
222 path: '/$toolkitSlug'
223 fullPath: '/{-$orgSlug}/toolkits/$toolkitSlug'
224 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport
225 parentRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute
226 }
183 '/{-$orgSlug}/resume/$executionId': {227 '/{-$orgSlug}/resume/$executionId': {
184 id: '/{-$orgSlug}/resume/$executionId'228 id: '/{-$orgSlug}/resume/$executionId'
185 path: '/{-$orgSlug}/resume/$executionId'229 path: '/{-$orgSlug}/resume/$executionId'
@@ -211,11 +255,28 @@ declare module '@tanstack/react-router' { · 25 unmodified lines
211 }255 }
212}256}
213 257
258interface DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren {
259 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
260}
261
262const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren: DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren =
263 {
264 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute:
265 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute,
266 }
267
268const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren =
269 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute._addFileChildren(
270 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren,
271 )
272
214const rootRouteChildren: RootRouteChildren = {273const rootRouteChildren: RootRouteChildren = {
215 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute:274 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute:
216 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute,275 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute,
217 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute:276 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute:
218 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute,277 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute,
278 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute:
279 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren,
219 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute:280 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute:
220 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute,281 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute,
221 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute:282 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute:
apps/host-selfhost/web/routeTree.gen.ts+61−0
@@ -11,11 +11,13 @@ · 10 unmodified lines
11import { Route as rootRouteImport } from './routes/__root'11import { Route as rootRouteImport } from './routes/__root'
12import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport } from './../../../packages/react/src/routes/index'12import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRouteImport } from './../../../packages/react/src/routes/index'
13import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport } from './../../../packages/react/src/routes/tools'13import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport } from './../../../packages/react/src/routes/tools'
14import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport } from './../../../packages/react/src/routes/toolkits'
14import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRouteImport } from './../../../packages/react/src/routes/secrets'15import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRouteImport } from './../../../packages/react/src/routes/secrets'
15import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport } from './../../../packages/react/src/routes/policies'16import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRouteImport } from './../../../packages/react/src/routes/policies'
16import { Route as ApiKeysRouteImport } from './routes/app/api-keys'17import { Route as ApiKeysRouteImport } from './routes/app/api-keys'
17import { Route as AdminRouteImport } from './routes/app/admin'18import { Route as AdminRouteImport } from './routes/app/admin'
18import { Route as JoinDotcodeRouteImport } from './routes/public/join.$code'19import { Route as JoinDotcodeRouteImport } from './routes/public/join.$code'
20import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport } from './../../../packages/react/src/routes/toolkits.$toolkitSlug'
19import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRouteImport } from './../../../packages/react/src/routes/resume.$executionId'21import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRouteImport } from './../../../packages/react/src/routes/resume.$executionId'
20import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../../packages/react/src/routes/integrations.$namespace'22import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../../packages/react/src/routes/integrations.$namespace'
21import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRouteImport } from './../../../packages/react/src/routes/plugins.$pluginId.$'23import { Route as DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRouteImport } from './../../../packages/react/src/routes/plugins.$pluginId.$'
@@ -33,6 +35,12 @@ const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute = · 11 unmodified lines
33 path: '/{-$orgSlug}/tools',35 path: '/{-$orgSlug}/tools',
34 getParentRoute: () => rootRouteImport,36 getParentRoute: () => rootRouteImport,
35 } as any)37 } as any)
38const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute =
39 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport.update({
40 id: '/{-$orgSlug}/toolkits',
41 path: '/{-$orgSlug}/toolkits',
42 getParentRoute: () => rootRouteImport,
43 } as any)
36const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute =44const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute =
37 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRouteImport.update({45 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRouteImport.update({
38 id: '/{-$orgSlug}/secrets',46 id: '/{-$orgSlug}/secrets',
@@ -60,6 +68,15 @@ const JoinDotcodeRoute = JoinDotcodeRouteImport.update({ · 21 unmodified lines
60 path: '/join/$code',68 path: '/join/$code',
61 getParentRoute: () => rootRouteImport,69 getParentRoute: () => rootRouteImport,
62} as any)70} as any)
71const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute =
72 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport.update(
73 {
74 id: '/$toolkitSlug',
75 path: '/$toolkitSlug',
76 getParentRoute: () =>
77 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute,
78 } as any,
79 )
63const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute =80const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute =
64 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRouteImport.update(81 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRouteImport.update(
65 {82 {
@@ -99,10 +116,12 @@ export interface FileRoutesByFullPath { · 33 unmodified lines
99 '/{-$orgSlug}/api-keys': typeof ApiKeysRoute116 '/{-$orgSlug}/api-keys': typeof ApiKeysRoute
100 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute117 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
101 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute118 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute
119 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
102 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute120 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
103 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute121 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
104 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute122 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
105 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute123 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute
124 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
106 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute125 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
107 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute126 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute
108}127}
@@ -112,10 +131,12 @@ export interface FileRoutesByTo { · 3 unmodified lines
112 '/{-$orgSlug}/api-keys': typeof ApiKeysRoute131 '/{-$orgSlug}/api-keys': typeof ApiKeysRoute
113 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute132 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
114 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute133 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute
134 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
115 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute135 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
116 '/{-$orgSlug}': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute136 '/{-$orgSlug}': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
117 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute137 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
118 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute138 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute
139 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
119 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute140 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
120 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute141 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute
121}142}
@@ -126,10 +147,12 @@ export interface FileRoutesById { · 4 unmodified lines
126 '/{-$orgSlug}/api-keys': typeof ApiKeysRoute147 '/{-$orgSlug}/api-keys': typeof ApiKeysRoute
127 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute148 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
128 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute149 '/{-$orgSlug}/secrets': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute
150 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
129 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute151 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
130 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute152 '/{-$orgSlug}/': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
131 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute153 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
132 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute154 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesResumeDotexecutionIdRoute
155 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
133 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute156 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
134 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute157 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPluginsDotpluginIdDotsplatRoute
135}158}
@@ -141,10 +164,12 @@ export interface FileRouteTypes { · 5 unmodified lines
141 | '/{-$orgSlug}/api-keys'164 | '/{-$orgSlug}/api-keys'
142 | '/{-$orgSlug}/policies'165 | '/{-$orgSlug}/policies'
143 | '/{-$orgSlug}/secrets'166 | '/{-$orgSlug}/secrets'
167 | '/{-$orgSlug}/toolkits'
144 | '/{-$orgSlug}/tools'168 | '/{-$orgSlug}/tools'
145 | '/{-$orgSlug}/'169 | '/{-$orgSlug}/'
146 | '/{-$orgSlug}/integrations/$namespace'170 | '/{-$orgSlug}/integrations/$namespace'
147 | '/{-$orgSlug}/resume/$executionId'171 | '/{-$orgSlug}/resume/$executionId'
172 | '/{-$orgSlug}/toolkits/$toolkitSlug'
148 | '/{-$orgSlug}/integrations/add/$pluginKey'173 | '/{-$orgSlug}/integrations/add/$pluginKey'
149 | '/{-$orgSlug}/plugins/$pluginId/$'174 | '/{-$orgSlug}/plugins/$pluginId/$'
150 fileRoutesByTo: FileRoutesByTo175 fileRoutesByTo: FileRoutesByTo
@@ -154,10 +179,12 @@ export interface FileRouteTypes { · 3 unmodified lines
154 | '/{-$orgSlug}/api-keys'179 | '/{-$orgSlug}/api-keys'
155 | '/{-$orgSlug}/policies'180 | '/{-$orgSlug}/policies'
156 | '/{-$orgSlug}/secrets'181 | '/{-$orgSlug}/secrets'
182 | '/{-$orgSlug}/toolkits'
157 | '/{-$orgSlug}/tools'183 | '/{-$orgSlug}/tools'
158 | '/{-$orgSlug}'184 | '/{-$orgSlug}'
159 | '/{-$orgSlug}/integrations/$namespace'185 | '/{-$orgSlug}/integrations/$namespace'
160 | '/{-$orgSlug}/resume/$executionId'186 | '/{-$orgSlug}/resume/$executionId'
187 | '/{-$orgSlug}/toolkits/$toolkitSlug'
161 | '/{-$orgSlug}/integrations/add/$pluginKey'188 | '/{-$orgSlug}/integrations/add/$pluginKey'
162 | '/{-$orgSlug}/plugins/$pluginId/$'189 | '/{-$orgSlug}/plugins/$pluginId/$'
163 id:190 id:
@@ -167,10 +194,12 @@ export interface FileRouteTypes { · 3 unmodified lines
167 | '/{-$orgSlug}/api-keys'194 | '/{-$orgSlug}/api-keys'
168 | '/{-$orgSlug}/policies'195 | '/{-$orgSlug}/policies'
169 | '/{-$orgSlug}/secrets'196 | '/{-$orgSlug}/secrets'
197 | '/{-$orgSlug}/toolkits'
170 | '/{-$orgSlug}/tools'198 | '/{-$orgSlug}/tools'
171 | '/{-$orgSlug}/'199 | '/{-$orgSlug}/'
172 | '/{-$orgSlug}/integrations/$namespace'200 | '/{-$orgSlug}/integrations/$namespace'
173 | '/{-$orgSlug}/resume/$executionId'201 | '/{-$orgSlug}/resume/$executionId'
202 | '/{-$orgSlug}/toolkits/$toolkitSlug'
174 | '/{-$orgSlug}/integrations/add/$pluginKey'203 | '/{-$orgSlug}/integrations/add/$pluginKey'
175 | '/{-$orgSlug}/plugins/$pluginId/$'204 | '/{-$orgSlug}/plugins/$pluginId/$'
176 fileRoutesById: FileRoutesById205 fileRoutesById: FileRoutesById
@@ -181,6 +210,7 @@ export interface RootRouteChildren { · 4 unmodified lines
181 ApiKeysRoute: typeof ApiKeysRoute210 ApiKeysRoute: typeof ApiKeysRoute
182 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute211 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute
183 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute212 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute
213 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren
184 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute214 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute
185 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute215 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute
186 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute216 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIntegrationsDotnamespaceRoute
@@ -205,6 +235,13 @@ declare module '@tanstack/react-router' { · 18 unmodified lines
205 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport235 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRouteImport
206 parentRoute: typeof rootRouteImport236 parentRoute: typeof rootRouteImport
207 }237 }
238 '/{-$orgSlug}/toolkits': {
239 id: '/{-$orgSlug}/toolkits'
240 path: '/{-$orgSlug}/toolkits'
241 fullPath: '/{-$orgSlug}/toolkits'
242 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteImport
243 parentRoute: typeof rootRouteImport
244 }
208 '/{-$orgSlug}/secrets': {245 '/{-$orgSlug}/secrets': {
209 id: '/{-$orgSlug}/secrets'246 id: '/{-$orgSlug}/secrets'
210 path: '/{-$orgSlug}/secrets'247 path: '/{-$orgSlug}/secrets'
@@ -240,6 +277,13 @@ declare module '@tanstack/react-router' { · 29 unmodified lines
240 preLoaderRoute: typeof JoinDotcodeRouteImport277 preLoaderRoute: typeof JoinDotcodeRouteImport
241 parentRoute: typeof rootRouteImport278 parentRoute: typeof rootRouteImport
242 }279 }
280 '/{-$orgSlug}/toolkits/$toolkitSlug': {
281 id: '/{-$orgSlug}/toolkits/$toolkitSlug'
282 path: '/$toolkitSlug'
283 fullPath: '/{-$orgSlug}/toolkits/$toolkitSlug'
284 preLoaderRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRouteImport
285 parentRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute
286 }
243 '/{-$orgSlug}/resume/$executionId': {287 '/{-$orgSlug}/resume/$executionId': {
244 id: '/{-$orgSlug}/resume/$executionId'288 id: '/{-$orgSlug}/resume/$executionId'
245 path: '/{-$orgSlug}/resume/$executionId'289 path: '/{-$orgSlug}/resume/$executionId'
@@ -271,6 +315,21 @@ declare module '@tanstack/react-router' { · 25 unmodified lines
271 }315 }
272}316}
273 317
318interface DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren {
319 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute: typeof DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute
320}
321
322const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren: DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren =
323 {
324 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute:
325 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsDottoolkitSlugRoute,
326 }
327
328const DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren =
329 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute._addFileChildren(
330 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteChildren,
331 )
332
274const rootRouteChildren: RootRouteChildren = {333const rootRouteChildren: RootRouteChildren = {
275 JoinDotcodeRoute: JoinDotcodeRoute,334 JoinDotcodeRoute: JoinDotcodeRoute,
276 AdminRoute: AdminRoute,335 AdminRoute: AdminRoute,
@@ -279,6 +338,8 @@ const rootRouteChildren: RootRouteChildren = { · 2 unmodified lines
279 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute,338 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesPoliciesRoute,
280 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute:339 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute:
281 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute,340 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesSecretsRoute,
341 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRoute:
342 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolkitsRouteWithChildren,
282 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute:343 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute:
283 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute,344 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesToolsRoute,
284 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute:345 DotDotDotDotDotDotDotDotPackagesReactSrcRoutesIndexRoute:
e2e/selfhost/toolkits-ui.test.ts+37−16
@@ -52,12 +52,13 @@ scenario( · 51 unmodified lines
52 52
53 yield* browser.session(identity, async ({ page, step }) => {53 yield* browser.session(identity, async ({ page, step }) => {
54 await step("Open the Toolkits plugin page", async () => {54 await step("Open the Toolkits plugin page", async () => {
55 await page.goto("/plugins/toolkits/", { waitUntil: "networkidle" });55 await page.goto("/default/toolkits/", { waitUntil: "domcontentloaded" });
56 await page.getByRole("heading", { name: "Toolkits" }).waitFor();56 await page.getByRole("heading", { name: "Toolkits" }).waitFor();
57 await page.getByRole("heading", { name: "Workspace" }).waitFor();57 await page.getByRole("heading", { name: "Workspace" }).waitFor();
58 await page.getByRole("heading", { name: "Personal" }).waitFor();58 await page.getByRole("heading", { name: "Personal" }).waitFor();
59 await page.getByRole("button", { name: "Add workspace toolkit" }).waitFor();59 await page.getByRole("button", { name: "Add workspace toolkit" }).waitFor();
60 await page.getByRole("button", { name: "Add personal toolkit" }).waitFor();60 await page.getByRole("button", { name: "Add personal toolkit" }).waitFor();
61 await page.locator('main [data-slot="skeleton"]').first().waitFor({ state: "detached" });
61 expect(await page.locator('main [data-slot="skeleton"]').count()).toBe(0);62 expect(await page.locator('main [data-slot="skeleton"]').count()).toBe(0);
62 const seededCard = page.getByRole("link", {63 const seededCard = page.getByRole("link", {
63 name: `Open toolkit ${prefix}-workspace-a`,64 name: `Open toolkit ${prefix}-workspace-a`,
@@ -104,8 +105,8 @@ scenario( · 40 unmodified lines
104 105
105 await step("Open the created toolkit from the grid", async () => {106 await step("Open the created toolkit from the grid", async () => {
106 await page.getByRole("link", { name: `Open toolkit ${name}` }).click();107 await page.getByRole("link", { name: `Open toolkit ${name}` }).click();
107 await page.waitForURL(new RegExp(`/plugins/toolkits/${slug}$`));108 await page.waitForURL(new RegExp(`/toolkits/${slug}$`));
108 expect(page.url()).toMatch(new RegExp(`/plugins/toolkits/${slug}$`));109 expect(page.url()).toMatch(new RegExp(`/toolkits/${slug}$`));
109 await page110 await page
110 .locator("code")111 .locator("code")
111 .filter({ hasText: `/mcp/toolkits/${slug}` })112 .filter({ hasText: `/mcp/toolkits/${slug}` })
@@ -116,15 +117,15 @@ scenario( · 4 unmodified lines
116 117
117 await step("Return to the toolkit grid with browser-visible routing", async () => {118 await step("Return to the toolkit grid with browser-visible routing", async () => {
118 await page.getByRole("button", { name: "Toolkits" }).click();119 await page.getByRole("button", { name: "Toolkits" }).click();
119 await page.waitForURL(/\/plugins\/toolkits\/?$/);120 await page.waitForURL(/\/toolkits\/?$/);
120 expect(page.url()).toMatch(/\/plugins\/toolkits\/?$/);121 expect(page.url()).toMatch(/\/toolkits\/?$/);
121 await page.getByRole("heading", { name: "Workspace" }).waitFor();122 await page.getByRole("heading", { name: "Workspace" }).waitFor();
122 await page.getByRole("link", { name: `Open toolkit ${name}` }).waitFor();123 await page.getByRole("link", { name: `Open toolkit ${name}` }).waitFor();
123 });124 });
124 125
125 await step("Open the created toolkit from a direct URL", async () => {126 await step("Open the created toolkit from a direct URL", async () => {
126 await page.goto(`/plugins/toolkits/${slug}`, { waitUntil: "networkidle" });127 await page.goto(`/default/toolkits/${slug}`, { waitUntil: "domcontentloaded" });
127 expect(page.url()).toMatch(new RegExp(`/plugins/toolkits/${slug}$`));128 expect(page.url()).toMatch(new RegExp(`/toolkits/${slug}$`));
128 await page129 await page
129 .locator("code")130 .locator("code")
130 .filter({ hasText: `/mcp/toolkits/${slug}` })131 .filter({ hasText: `/mcp/toolkits/${slug}` })
@@ -133,9 +134,18 @@ scenario( · 2 unmodified lines
133 expect(await page.getByLabel("New toolkit").count()).toBe(0);134 expect(await page.getByLabel("New toolkit").count()).toBe(0);
134 });135 });
135 136
137 await step("Cancel toolkit deletion from the confirmation modal", async () => {
138 await page.getByRole("button", { name: "Delete toolkit" }).click();
139 const dialog = page.getByRole("alertdialog", { name: `Delete ${name}?` });
140 await dialog.waitFor();
141 await dialog.getByRole("button", { name: "Cancel" }).click();
142 await dialog.waitFor({ state: "detached" });
143 await page.getByRole("heading", { name }).waitFor();
144 });
145
136 await step("Add a connection to the toolkit", async () => {146 await step("Add a connection to the toolkit", async () => {
137 await page.getByRole("button", { name: "Add connection to toolkit" }).click();147 await page.getByRole("button", { name: "Manage toolkit connections" }).click();
138 const dialog = page.getByRole("dialog", { name: "Add connection" });148 const dialog = page.getByRole("dialog", { name: "Manage connections" });
139 await dialog.waitFor();149 await dialog.waitFor();
140 await dialog.getByLabel("Search connections and tools").fill("policies.list");150 await dialog.getByLabel("Search connections and tools").fill("policies.list");
141 expect(await dialog.getByRole("button", { name: /^Add tool/ }).count()).toBe(0);151 expect(await dialog.getByRole("button", { name: /^Add tool/ }).count()).toBe(0);
@@ -145,6 +155,8 @@ scenario( · 3 unmodified lines
145 .getByRole("button", { name: /^Add connection / })155 .getByRole("button", { name: /^Add connection / })
146 .first()156 .first()
147 .click();157 .click();
158 await dialog.getByRole("button", { name: /^Remove connection / }).waitFor();
159 await page.keyboard.press("Escape");
148 await dialog.waitFor({ state: "hidden" });160 await dialog.waitFor({ state: "hidden" });
149 const toolkitTools = page.getByRole("region", { name: "Toolkit tools" });161 const toolkitTools = page.getByRole("region", { name: "Toolkit tools" });
150 await toolkitTools.waitFor();162 await toolkitTools.waitFor();
@@ -154,30 +166,39 @@ scenario( · 3 unmodified lines
154 });166 });
155 167
156 await step("The add connection list reflects the saved toolkit connection", async () => {168 await step("The add connection list reflects the saved toolkit connection", async () => {
157 await page.getByRole("button", { name: "Add connection to toolkit" }).click();169 await page.getByRole("button", { name: "Manage toolkit connections" }).click();
158 const dialog = page.getByRole("dialog", { name: "Add connection" });170 const dialog = page.getByRole("dialog", { name: "Manage connections" });
159 await dialog.waitFor();171 await dialog.waitFor();
160 await dialog.getByLabel("Search connections and tools").fill("policies.list");172 await dialog.getByLabel("Search connections and tools").fill("policies.list");
161 await dialog.getByRole("button", { name: /^Connection added / }).waitFor();173 await dialog.getByRole("button", { name: /^Remove connection / }).waitFor();
162 expect(await dialog.getByRole("button", { name: /^Add connection / }).count()).toBe(0);174 expect(await dialog.getByRole("button", { name: /^Add connection / }).count()).toBe(0);
163 await page.keyboard.press("Escape");175 await page.keyboard.press("Escape");
164 await dialog.waitFor({ state: "hidden" });176 await dialog.waitFor({ state: "hidden" });
165 });177 });
166 178
167 await step("Remove the connection from the toolkit tools list", async () => {179 await step("Remove the connection from the manage modal", async () => {
168 await page180 await page.getByRole("button", { name: "Manage toolkit connections" }).click();
181 const removeDialog = page.getByRole("dialog", { name: "Manage connections" });
182 await removeDialog.waitFor();
183 await removeDialog.getByLabel("Search connections and tools").fill("policies.list");
184 await removeDialog
169 .getByRole("button", { name: /^Remove connection / })185 .getByRole("button", { name: /^Remove connection / })
170 .first()186 .first()
171 .click();187 .click();
188 await removeDialog.getByRole("button", { name: /^Add connection / }).waitFor();
189 await page.keyboard.press("Escape");
190 await removeDialog.waitFor({ state: "hidden" });
172 await page.getByText("No connections added").waitFor();191 await page.getByText("No connections added").waitFor();
173 await page.getByRole("button", { name: "Add connection to toolkit" }).click();192 await page.getByRole("button", { name: "Manage toolkit connections" }).click();
174 const dialog = page.getByRole("dialog", { name: "Add connection" });193 const dialog = page.getByRole("dialog", { name: "Manage connections" });
175 await dialog.waitFor();194 await dialog.waitFor();
176 await dialog.getByLabel("Search connections and tools").fill("policies.list");195 await dialog.getByLabel("Search connections and tools").fill("policies.list");
177 await dialog196 await dialog
178 .getByRole("button", { name: /^Add connection / })197 .getByRole("button", { name: /^Add connection / })
179 .first()198 .first()
180 .click();199 .click();
200 await dialog.getByRole("button", { name: /^Remove connection / }).waitFor();
201 await page.keyboard.press("Escape");
181 await dialog.waitFor({ state: "hidden" });202 await dialog.waitFor({ state: "hidden" });
182 const toolkitTools = page.getByRole("region", { name: "Toolkit tools" });203 const toolkitTools = page.getByRole("region", { name: "Toolkit tools" });
183 await toolkitTools.getByLabel("Filter tools").fill("policies.list");204 await toolkitTools.getByLabel("Filter tools").fill("policies.list");
packages/app/src/routeTree.gen.ts+58−0
@@ -11,8 +11,10 @@ · 10 unmodified lines
11import { Route as rootRouteImport } from './routes/__root'11import { Route as rootRouteImport } from './routes/__root'
12import { Route as DotDotDotDotDotDotReactSrcRoutesIndexRouteImport } from './../../react/src/routes/index'12import { Route as DotDotDotDotDotDotReactSrcRoutesIndexRouteImport } from './../../react/src/routes/index'
13import { Route as DotDotDotDotDotDotReactSrcRoutesToolsRouteImport } from './../../react/src/routes/tools'13import { Route as DotDotDotDotDotDotReactSrcRoutesToolsRouteImport } from './../../react/src/routes/tools'
14import { Route as DotDotDotDotDotDotReactSrcRoutesToolkitsRouteImport } from './../../react/src/routes/toolkits'
14import { Route as SecretsRouteImport } from './routes/app/secrets'15import { Route as SecretsRouteImport } from './routes/app/secrets'
15import { Route as DotDotDotDotDotDotReactSrcRoutesPoliciesRouteImport } from './../../react/src/routes/policies'16import { Route as DotDotDotDotDotDotReactSrcRoutesPoliciesRouteImport } from './../../react/src/routes/policies'
17import { Route as DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRouteImport } from './../../react/src/routes/toolkits.$toolkitSlug'
16import { Route as DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRouteImport } from './../../react/src/routes/resume.$executionId'18import { Route as DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRouteImport } from './../../react/src/routes/resume.$executionId'
17import { Route as DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../react/src/routes/integrations.$namespace'19import { Route as DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRouteImport } from './../../react/src/routes/integrations.$namespace'
18import { Route as DotDotDotDotDotDotReactSrcRoutesPluginsDotpluginIdDotsplatRouteImport } from './../../react/src/routes/plugins.$pluginId.$'20import { Route as DotDotDotDotDotDotReactSrcRoutesPluginsDotpluginIdDotsplatRouteImport } from './../../react/src/routes/plugins.$pluginId.$'
@@ -30,6 +32,12 @@ const DotDotDotDotDotDotReactSrcRoutesToolsRoute = · 11 unmodified lines
30 path: '/{-$orgSlug}/tools',32 path: '/{-$orgSlug}/tools',
31 getParentRoute: () => rootRouteImport,33 getParentRoute: () => rootRouteImport,
32 } as any)34 } as any)
35const DotDotDotDotDotDotReactSrcRoutesToolkitsRoute =
36 DotDotDotDotDotDotReactSrcRoutesToolkitsRouteImport.update({
37 id: '/{-$orgSlug}/toolkits',
38 path: '/{-$orgSlug}/toolkits',
39 getParentRoute: () => rootRouteImport,
40 } as any)
33const SecretsRoute = SecretsRouteImport.update({41const SecretsRoute = SecretsRouteImport.update({
34 id: '/{-$orgSlug}/secrets',42 id: '/{-$orgSlug}/secrets',
35 path: '/{-$orgSlug}/secrets',43 path: '/{-$orgSlug}/secrets',
@@ -41,6 +49,12 @@ const DotDotDotDotDotDotReactSrcRoutesPoliciesRoute = · 5 unmodified lines
41 path: '/{-$orgSlug}/policies',49 path: '/{-$orgSlug}/policies',
42 getParentRoute: () => rootRouteImport,50 getParentRoute: () => rootRouteImport,
43 } as any)51 } as any)
52const DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRoute =
53 DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRouteImport.update({
54 id: '/$toolkitSlug',
55 path: '/$toolkitSlug',
56 getParentRoute: () => DotDotDotDotDotDotReactSrcRoutesToolkitsRoute,
57 } as any)
44const DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRoute =58const DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRoute =
45 DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRouteImport.update({59 DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRouteImport.update({
46 id: '/{-$orgSlug}/resume/$executionId',60 id: '/{-$orgSlug}/resume/$executionId',
@@ -71,20 +85,24 @@ const DotDotDotDotDotDotReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute = · 24 unmodified lines
71export interface FileRoutesByFullPath {85export interface FileRoutesByFullPath {
72 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRoute86 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRoute
73 '/{-$orgSlug}/secrets': typeof SecretsRoute87 '/{-$orgSlug}/secrets': typeof SecretsRoute
88 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotReactSrcRoutesToolkitsRouteWithChildren
74 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotReactSrcRoutesToolsRoute89 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotReactSrcRoutesToolsRoute
75 '/{-$orgSlug}/': typeof DotDotDotDotDotDotReactSrcRoutesIndexRoute90 '/{-$orgSlug}/': typeof DotDotDotDotDotDotReactSrcRoutesIndexRoute
76 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute91 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute
77 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRoute92 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRoute
93 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRoute
78 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute94 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
79 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotReactSrcRoutesPluginsDotpluginIdDotsplatRoute95 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotReactSrcRoutesPluginsDotpluginIdDotsplatRoute
80}96}
81export interface FileRoutesByTo {97export interface FileRoutesByTo {
82 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRoute98 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRoute
83 '/{-$orgSlug}/secrets': typeof SecretsRoute99 '/{-$orgSlug}/secrets': typeof SecretsRoute
100 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotReactSrcRoutesToolkitsRouteWithChildren
84 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotReactSrcRoutesToolsRoute101 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotReactSrcRoutesToolsRoute
85 '/{-$orgSlug}': typeof DotDotDotDotDotDotReactSrcRoutesIndexRoute102 '/{-$orgSlug}': typeof DotDotDotDotDotDotReactSrcRoutesIndexRoute
86 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute103 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute
87 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRoute104 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRoute
105 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRoute
88 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute106 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
89 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotReactSrcRoutesPluginsDotpluginIdDotsplatRoute107 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotReactSrcRoutesPluginsDotpluginIdDotsplatRoute
90}108}
@@ -92,10 +110,12 @@ export interface FileRoutesById { · 1 unmodified line
92 __root__: typeof rootRouteImport110 __root__: typeof rootRouteImport
93 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRoute111 '/{-$orgSlug}/policies': typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRoute
94 '/{-$orgSlug}/secrets': typeof SecretsRoute112 '/{-$orgSlug}/secrets': typeof SecretsRoute
113 '/{-$orgSlug}/toolkits': typeof DotDotDotDotDotDotReactSrcRoutesToolkitsRouteWithChildren
95 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotReactSrcRoutesToolsRoute114 '/{-$orgSlug}/tools': typeof DotDotDotDotDotDotReactSrcRoutesToolsRoute
96 '/{-$orgSlug}/': typeof DotDotDotDotDotDotReactSrcRoutesIndexRoute115 '/{-$orgSlug}/': typeof DotDotDotDotDotDotReactSrcRoutesIndexRoute
97 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute116 '/{-$orgSlug}/integrations/$namespace': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute
98 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRoute117 '/{-$orgSlug}/resume/$executionId': typeof DotDotDotDotDotDotReactSrcRoutesResumeDotexecutionIdRoute
118 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRoute
99 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute119 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotaddDotpluginKeyRoute
100 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotReactSrcRoutesPluginsDotpluginIdDotsplatRoute120 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotDotDotDotDotDotReactSrcRoutesPluginsDotpluginIdDotsplatRoute
101}121}
@@ -104,30 +124,36 @@ export interface FileRouteTypes { · 2 unmodified lines
104 fullPaths:124 fullPaths:
105 | '/{-$orgSlug}/policies'125 | '/{-$orgSlug}/policies'
106 | '/{-$orgSlug}/secrets'126 | '/{-$orgSlug}/secrets'
127 | '/{-$orgSlug}/toolkits'
107 | '/{-$orgSlug}/tools'128 | '/{-$orgSlug}/tools'
108 | '/{-$orgSlug}/'129 | '/{-$orgSlug}/'
109 | '/{-$orgSlug}/integrations/$namespace'130 | '/{-$orgSlug}/integrations/$namespace'
110 | '/{-$orgSlug}/resume/$executionId'131 | '/{-$orgSlug}/resume/$executionId'
132 | '/{-$orgSlug}/toolkits/$toolkitSlug'
111 | '/{-$orgSlug}/integrations/add/$pluginKey'133 | '/{-$orgSlug}/integrations/add/$pluginKey'
112 | '/{-$orgSlug}/plugins/$pluginId/$'134 | '/{-$orgSlug}/plugins/$pluginId/$'
113 fileRoutesByTo: FileRoutesByTo135 fileRoutesByTo: FileRoutesByTo
114 to:136 to:
115 | '/{-$orgSlug}/policies'137 | '/{-$orgSlug}/policies'
116 | '/{-$orgSlug}/secrets'138 | '/{-$orgSlug}/secrets'
139 | '/{-$orgSlug}/toolkits'
117 | '/{-$orgSlug}/tools'140 | '/{-$orgSlug}/tools'
118 | '/{-$orgSlug}'141 | '/{-$orgSlug}'
119 | '/{-$orgSlug}/integrations/$namespace'142 | '/{-$orgSlug}/integrations/$namespace'
120 | '/{-$orgSlug}/resume/$executionId'143 | '/{-$orgSlug}/resume/$executionId'
144 | '/{-$orgSlug}/toolkits/$toolkitSlug'
121 | '/{-$orgSlug}/integrations/add/$pluginKey'145 | '/{-$orgSlug}/integrations/add/$pluginKey'
122 | '/{-$orgSlug}/plugins/$pluginId/$'146 | '/{-$orgSlug}/plugins/$pluginId/$'
123 id:147 id:
124 | '__root__'148 | '__root__'
125 | '/{-$orgSlug}/policies'149 | '/{-$orgSlug}/policies'
126 | '/{-$orgSlug}/secrets'150 | '/{-$orgSlug}/secrets'
151 | '/{-$orgSlug}/toolkits'
127 | '/{-$orgSlug}/tools'152 | '/{-$orgSlug}/tools'
128 | '/{-$orgSlug}/'153 | '/{-$orgSlug}/'
129 | '/{-$orgSlug}/integrations/$namespace'154 | '/{-$orgSlug}/integrations/$namespace'
130 | '/{-$orgSlug}/resume/$executionId'155 | '/{-$orgSlug}/resume/$executionId'
156 | '/{-$orgSlug}/toolkits/$toolkitSlug'
131 | '/{-$orgSlug}/integrations/add/$pluginKey'157 | '/{-$orgSlug}/integrations/add/$pluginKey'
132 | '/{-$orgSlug}/plugins/$pluginId/$'158 | '/{-$orgSlug}/plugins/$pluginId/$'
133 fileRoutesById: FileRoutesById159 fileRoutesById: FileRoutesById
@@ -135,6 +161,7 @@ export interface FileRouteTypes { · 1 unmodified line
135export interface RootRouteChildren {161export interface RootRouteChildren {
136 DotDotDotDotDotDotReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRoute162 DotDotDotDotDotDotReactSrcRoutesPoliciesRoute: typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRoute
137 SecretsRoute: typeof SecretsRoute163 SecretsRoute: typeof SecretsRoute
164 DotDotDotDotDotDotReactSrcRoutesToolkitsRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolkitsRouteWithChildren
138 DotDotDotDotDotDotReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolsRoute165 DotDotDotDotDotDotReactSrcRoutesToolsRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolsRoute
139 DotDotDotDotDotDotReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotReactSrcRoutesIndexRoute166 DotDotDotDotDotDotReactSrcRoutesIndexRoute: typeof DotDotDotDotDotDotReactSrcRoutesIndexRoute
140 DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute: typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute167 DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute: typeof DotDotDotDotDotDotReactSrcRoutesIntegrationsDotnamespaceRoute
@@ -159,6 +186,13 @@ declare module '@tanstack/react-router' { · 18 unmodified lines
159 preLoaderRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolsRouteImport186 preLoaderRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolsRouteImport
160 parentRoute: typeof rootRouteImport187 parentRoute: typeof rootRouteImport
161 }188 }
189 '/{-$orgSlug}/toolkits': {
190 id: '/{-$orgSlug}/toolkits'
191 path: '/{-$orgSlug}/toolkits'
192 fullPath: '/{-$orgSlug}/toolkits'
193 preLoaderRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolkitsRouteImport
194 parentRoute: typeof rootRouteImport
195 }
162 '/{-$orgSlug}/secrets': {196 '/{-$orgSlug}/secrets': {
163 id: '/{-$orgSlug}/secrets'197 id: '/{-$orgSlug}/secrets'
164 path: '/{-$orgSlug}/secrets'198 path: '/{-$orgSlug}/secrets'
@@ -173,6 +207,13 @@ declare module '@tanstack/react-router' { · 8 unmodified lines
173 preLoaderRoute: typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRouteImport207 preLoaderRoute: typeof DotDotDotDotDotDotReactSrcRoutesPoliciesRouteImport
174 parentRoute: typeof rootRouteImport208 parentRoute: typeof rootRouteImport
175 }209 }
210 '/{-$orgSlug}/toolkits/$toolkitSlug': {
211 id: '/{-$orgSlug}/toolkits/$toolkitSlug'
212 path: '/$toolkitSlug'
213 fullPath: '/{-$orgSlug}/toolkits/$toolkitSlug'
214 preLoaderRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRouteImport
215 parentRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolkitsRoute
216 }
176 '/{-$orgSlug}/resume/$executionId': {217 '/{-$orgSlug}/resume/$executionId': {
177 id: '/{-$orgSlug}/resume/$executionId'218 id: '/{-$orgSlug}/resume/$executionId'
178 path: '/{-$orgSlug}/resume/$executionId'219 path: '/{-$orgSlug}/resume/$executionId'
@@ -204,10 +245,27 @@ declare module '@tanstack/react-router' { · 25 unmodified lines
204 }245 }
205}246}
206 247
248interface DotDotDotDotDotDotReactSrcRoutesToolkitsRouteChildren {
249 DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRoute: typeof DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRoute
250}
251
252const DotDotDotDotDotDotReactSrcRoutesToolkitsRouteChildren: DotDotDotDotDotDotReactSrcRoutesToolkitsRouteChildren =
253 {
254 DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRoute:
255 DotDotDotDotDotDotReactSrcRoutesToolkitsDottoolkitSlugRoute,
256 }
257
258const DotDotDotDotDotDotReactSrcRoutesToolkitsRouteWithChildren =
259 DotDotDotDotDotDotReactSrcRoutesToolkitsRoute._addFileChildren(
260 DotDotDotDotDotDotReactSrcRoutesToolkitsRouteChildren,
261 )
262
207const rootRouteChildren: RootRouteChildren = {263const rootRouteChildren: RootRouteChildren = {
208 DotDotDotDotDotDotReactSrcRoutesPoliciesRoute:264 DotDotDotDotDotDotReactSrcRoutesPoliciesRoute:
209 DotDotDotDotDotDotReactSrcRoutesPoliciesRoute,265 DotDotDotDotDotDotReactSrcRoutesPoliciesRoute,
210 SecretsRoute: SecretsRoute,266 SecretsRoute: SecretsRoute,
267 DotDotDotDotDotDotReactSrcRoutesToolkitsRoute:
268 DotDotDotDotDotDotReactSrcRoutesToolkitsRouteWithChildren,
211 DotDotDotDotDotDotReactSrcRoutesToolsRoute:269 DotDotDotDotDotDotReactSrcRoutesToolsRoute:
212 DotDotDotDotDotDotReactSrcRoutesToolsRoute,270 DotDotDotDotDotDotReactSrcRoutesToolsRoute,
213 DotDotDotDotDotDotReactSrcRoutesIndexRoute:271 DotDotDotDotDotDotReactSrcRoutesIndexRoute:
packages/app/src/web/shell.tsx+7−0
@@ -342,6 +342,7 @@ function SidebarContent(props: { · 341 unmodified lines
342 const isHome = props.pathname === "/";342 const isHome = props.pathname === "/";
343 const isSecrets = props.pathname === "/secrets";343 const isSecrets = props.pathname === "/secrets";
344 const isPolicies = props.pathname === "/policies";344 const isPolicies = props.pathname === "/policies";
345 const isToolkits = props.pathname === "/toolkits" || props.pathname.startsWith("/toolkits/");
345 346
346 return (347 return (
347 <>348 <>
@@ -381,6 +382,12 @@ function SidebarContent(props: { · 33 unmodified lines
381 active={isPolicies}382 active={isPolicies}
382 onNavigate={props.onNavigate}383 onNavigate={props.onNavigate}
383 />384 />
385 <NavItem
386 to="/{-$orgSlug}/toolkits"
387 label="Toolkits"
388 active={isToolkits}
389 onNavigate={props.onNavigate}
390 />
384 391
385 <PluginNav pathname={props.pathname} onNavigate={props.onNavigate} />392 <PluginNav pathname={props.pathname} onNavigate={props.onNavigate} />
386 393
packages/plugins/toolkits/src/client.tsx+0−1
@@ -8,7 +8,6 @@ export default defineClientPlugin({ · 7 unmodified lines
8 {8 {
9 path: "/",9 path: "/",
10 component: ToolkitsPage,10 component: ToolkitsPage,
11 nav: { label: "Toolkits" },
12 },11 },
13 {12 {
14 path: "/$toolkitSlug",13 path: "/$toolkitSlug",
packages/plugins/toolkits/src/page.tsx+190−158
@@ -1,17 +1,9 @@
1import { useId, useMemo, useState } from "react";1import { useId, useMemo, useState } from "react";
2import { Link, useNavigate, useParams } from "@tanstack/react-router";2import { Link, useNavigate } from "@tanstack/react-router";
3import { useAtomSet, useAtomValue } from "@effect/atom-react";3import { useAtomSet, useAtomValue } from "@effect/atom-react";
4import * as Atom from "effect/unstable/reactivity/Atom";4import * as Atom from "effect/unstable/reactivity/Atom";
5import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";5import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
6import {6import { ArrowLeftIcon, BoxIcon, PlugIcon, PlusIcon, SearchIcon, Trash2Icon } from "lucide-react";
7 ArrowLeftIcon,
8 BoxIcon,
9 CheckIcon,
10 PlugIcon,
11 PlusIcon,
12 SearchIcon,
13 Trash2Icon,
14} from "lucide-react";
15import {7import {
16 createPluginAtomClient,8 createPluginAtomClient,
17 useIntegrationPlugins,9 useIntegrationPlugins,
@@ -28,15 +20,27 @@ import { · 10 unmodified lines
28} from "@executor-js/sdk/shared";20} from "@executor-js/sdk/shared";
29import { integrationsOptimisticAtom, toolsAllAtom } from "@executor-js/react/api/atoms";21import { integrationsOptimisticAtom, toolsAllAtom } from "@executor-js/react/api/atoms";
30import { ReactivityKey } from "@executor-js/react/api/reactivity-keys";22import { ReactivityKey } from "@executor-js/react/api/reactivity-keys";
23import { useOrganizationSlug } from "@executor-js/react/api/organization-context";
31import {24import {
32 getExecutorApiBaseUrl,25 getExecutorApiBaseUrl,
33 getExecutorOrganizationHeaders,26 getExecutorOrganizationHeaders,
34 getExecutorServerAuthorizationHeader,27 getExecutorServerAuthorizationHeader,
35} from "@executor-js/react/api/server-connection";28} from "@executor-js/react/api/server-connection";
36import { ownerLabel } from "@executor-js/react/api/owner-display";29import { ownerLabel, useOwnerDisplay } from "@executor-js/react/api/owner-display";
37import { Badge } from "@executor-js/react/components/badge";30import { Badge } from "@executor-js/react/components/badge";
38import { Button } from "@executor-js/react/components/button";31import { Button } from "@executor-js/react/components/button";
39import { CopyButton } from "@executor-js/react/components/copy-button";32import { CopyButton } from "@executor-js/react/components/copy-button";
33import {
34 AlertDialog,
35 AlertDialogAction,
36 AlertDialogCancel,
37 AlertDialogContent,
38 AlertDialogDescription,
39 AlertDialogFooter,
40 AlertDialogHeader,
41 AlertDialogTitle,
42 AlertDialogTrigger,
43} from "@executor-js/react/components/alert-dialog";
40import {44import {
41 IntegrationFavicon,45 IntegrationFavicon,
42 integrationPresetIconUrl,46 integrationPresetIconUrl,
@@ -294,6 +298,9 @@ const compareTools = (a: ToolRow, b: ToolRow): number => · 251 unmodified lines
294const connectionTitle = (group: ToolkitConnectionGroup): string =>298const connectionTitle = (group: ToolkitConnectionGroup): string =>
295 `${ownerLabel(group.owner)} ${group.integration} / ${group.connection}`;299 `${ownerLabel(group.owner)} ${group.integration} / ${group.connection}`;
296 300
301const connectionTitleForHost = (group: ToolkitConnectionGroup, showOwnerLabels: boolean): string =>
302 showOwnerLabels ? connectionTitle(group) : `${group.integration} / ${group.connection}`;
303
297const connectionDisplayTitle = (group: ToolkitConnectionGroup, meta: IntegrationMeta): string =>304const connectionDisplayTitle = (group: ToolkitConnectionGroup, meta: IntegrationMeta): string =>
298 group.connection === "built-in" || group.connection === "default" ? meta.name : group.connection;305 group.connection === "built-in" || group.connection === "default" ? meta.name : group.connection;
299 306
@@ -302,6 +309,15 @@ const connectionDisplaySubtitle = (group: ToolkitConnectionGroup, meta: Integrat · 2 unmodified lines
302 ? `${group.tools.length} ${group.tools.length === 1 ? "tool" : "tools"}`309 ? `${group.tools.length} ${group.tools.length === 1 ? "tool" : "tools"}`
303 : `${meta.name} · ${group.tools.length} ${group.tools.length === 1 ? "tool" : "tools"}`;310 : `${meta.name} · ${group.tools.length} ${group.tools.length === 1 ? "tool" : "tools"}`;
304 311
312const connectionDisplaySubtitleForHost = (
313 group: ToolkitConnectionGroup,
314 meta: IntegrationMeta,
315 showOwnerLabels: boolean,
316): string => {
317 const subtitle = connectionDisplaySubtitle(group, meta);
318 return showOwnerLabels ? `${ownerLabel(group.owner)} · ${subtitle}` : subtitle;
319};
320
305const integrationMetaFor = (321const integrationMetaFor = (
306 group: ToolkitConnectionGroup,322 group: ToolkitConnectionGroup,
307 integrations: readonly Integration[],323 integrations: readonly Integration[],
@@ -340,6 +356,7 @@ const configuredConnectionViews = ( · 32 unmodified lines
340 connectionGroups: readonly ToolkitConnectionGroup[],356 connectionGroups: readonly ToolkitConnectionGroup[],
341 integrations: readonly Integration[],357 integrations: readonly Integration[],
342 integrationPlugins: readonly IntegrationPlugin[],358 integrationPlugins: readonly IntegrationPlugin[],
359 showOwnerLabels: boolean,
343): readonly ConfiguredConnectionView[] =>360): readonly ConfiguredConnectionView[] =>
344 connections.map((connection) => {361 connections.map((connection) => {
345 const group = connectionGroups.find((candidate) =>362 const group = connectionGroups.find((candidate) =>
@@ -358,7 +375,7 @@ const configuredConnectionViews = ( · 12 unmodified lines
358 return {375 return {
359 id: connection.id,376 id: connection.id,
360 title: connectionDisplayTitle(group, meta),377 title: connectionDisplayTitle(group, meta),
361 subtitle: `${ownerLabel(group.owner)} · ${connectionDisplaySubtitle(group, meta)}`,378 subtitle: connectionDisplaySubtitleForHost(group, meta, showOwnerLabels),
362 pattern: connection.pattern,379 pattern: connection.pattern,
363 sourceId: meta.sourceId,380 sourceId: meta.sourceId,
364 icon: meta.icon,381 icon: meta.icon,
@@ -434,7 +451,7 @@ function ToolkitConnectionIconStack(props: { connections: readonly ConfiguredCon · 69 unmodified lines
434const connectionCountLabel = (count: number): string =>451const connectionCountLabel = (count: number): string =>
435 count === 0 ? "No connections" : `${count} ${count === 1 ? "connection" : "connections"}`;452 count === 0 ? "No connections" : `${count} ${count === 1 ? "connection" : "connections"}`;
436 453
437function ToolkitTile(props: { pluginId: string; toolkit: ToolkitResponse }) {454function ToolkitTile(props: { showOwnerLabels: boolean; toolkit: ToolkitResponse }) {
438 const toolkit = props.toolkit;455 const toolkit = props.toolkit;
439 const tools = useAtomValue(toolsAllAtom);456 const tools = useAtomValue(toolsAllAtom);
440 const integrations = useAtomValue(integrationsOptimisticAtom);457 const integrations = useAtomValue(integrationsOptimisticAtom);
@@ -464,12 +481,13 @@ function ToolkitTile(props: { pluginId: string; toolkit: ToolkitResponse }) { · 23 unmodified lines
464 connectionGroups,481 connectionGroups,
465 integrationRows,482 integrationRows,
466 integrationPlugins,483 integrationPlugins,
484 props.showOwnerLabels,
467 )485 )
468 : [];486 : [];
469 return (487 return (
470 <Link488 <Link
471 to="/{-$orgSlug}/plugins/$pluginId/$"489 to="/{-$orgSlug}/toolkits/$toolkitSlug"
472 params={{ pluginId: props.pluginId, _splat: toolkit.slug }}490 params={{ toolkitSlug: toolkit.slug }}
473 aria-label={`Open toolkit ${toolkit.name}`}491 aria-label={`Open toolkit ${toolkit.name}`}
474 className="group flex min-h-36 min-w-0 self-start flex-col justify-between rounded-md border border-border/70 bg-card p-3.5 text-left text-card-foreground shadow-xs transition-[border-color,background-color,box-shadow] hover:border-foreground/25 hover:bg-muted/20 hover:shadow-sm focus-visible:ring-[3px] focus-visible:ring-ring/30 focus-visible:outline-none"492 className="group flex min-h-36 min-w-0 self-start flex-col justify-between rounded-md border border-border/70 bg-card p-3.5 text-left text-card-foreground shadow-xs transition-[border-color,background-color,box-shadow] hover:border-foreground/25 hover:bg-muted/20 hover:shadow-sm focus-visible:ring-[3px] focus-visible:ring-ring/30 focus-visible:outline-none"
475 style={toolkitCardStyle}493 style={toolkitCardStyle}
@@ -491,12 +509,18 @@ function ToolkitTile(props: { pluginId: string; toolkit: ToolkitResponse }) { · 15 unmodified lines
491 );509 );
492}510}
493 511
494const addToolkitScopeLabel = (owner: Owner): string => (owner === "org" ? "workspace" : "personal");512const addToolkitScopeLabel = (owner: Owner, showOwnerLabels: boolean): string =>
495const addToolkitTitle = (owner: Owner): string =>513 showOwnerLabels ? (owner === "org" ? "workspace" : "personal") : "";
496 owner === "org" ? "New workspace toolkit" : "New personal toolkit";514const addToolkitTitle = (owner: Owner, showOwnerLabels: boolean): string =>
515 showOwnerLabels
516 ? owner === "org"
517 ? "New workspace toolkit"
518 : "New personal toolkit"
519 : "New toolkit";
497 520
498function CreateToolkitDialog(props: {521function CreateToolkitDialog(props: {
499 owner: Owner;522 owner: Owner;
523 showOwnerLabels: boolean;
500 open: boolean;524 open: boolean;
501 onOpenChange: (open: boolean) => void;525 onOpenChange: (open: boolean) => void;
502 onCreate: (input: { owner: Owner; name: string }) => Promise<void>;526 onCreate: (input: { owner: Owner; name: string }) => Promise<void>;
@@ -504,7 +528,7 @@ function CreateToolkitDialog(props: { · 1 unmodified line
504 const inputId = useId();528 const inputId = useId();
505 const [name, setName] = useState("");529 const [name, setName] = useState("");
506 const trimmed = name.trim();530 const trimmed = name.trim();
507 const title = addToolkitTitle(props.owner);531 const title = addToolkitTitle(props.owner, props.showOwnerLabels);
508 532
509 const submit = async () => {533 const submit = async () => {
510 if (!trimmed) return;534 if (!trimmed) return;
@@ -568,14 +592,14 @@ function CreateToolkitDialog(props: { · 57 unmodified lines
568 );592 );
569}593}
570 594
571function AddToolkitCard(props: { owner: Owner; onClick: () => void }) {595function AddToolkitCard(props: { owner: Owner; showOwnerLabels: boolean; onClick: () => void }) {
572 const scopeLabel = addToolkitScopeLabel(props.owner);596 const scopeLabel = addToolkitScopeLabel(props.owner, props.showOwnerLabels);
573 return (597 return (
574 <Button598 <Button
575 type="button"599 type="button"
576 variant="ghost"600 variant="ghost"
577 onClick={props.onClick}601 onClick={props.onClick}
578 aria-label={`Add ${scopeLabel} toolkit`}602 aria-label={scopeLabel ? `Add ${scopeLabel} toolkit` : "Add toolkit"}
579 className="group flex h-auto min-h-36 min-w-0 self-start items-center justify-center rounded-md border border-dashed border-border/75 bg-card/40 p-0 text-muted-foreground transition-[border-color,background-color,box-shadow,color] hover:border-foreground/25 hover:bg-muted/20 hover:text-foreground hover:shadow-sm focus-visible:ring-[3px] focus-visible:ring-ring/30 focus-visible:outline-none"603 className="group flex h-auto min-h-36 min-w-0 self-start items-center justify-center rounded-md border border-dashed border-border/75 bg-card/40 p-0 text-muted-foreground transition-[border-color,background-color,box-shadow,color] hover:border-foreground/25 hover:bg-muted/20 hover:text-foreground hover:shadow-sm focus-visible:ring-[3px] focus-visible:ring-ring/30 focus-visible:outline-none"
580 style={toolkitCardStyle}604 style={toolkitCardStyle}
581 >605 >
@@ -593,9 +617,9 @@ function AddToolkitCard(props: { owner: Owner; onClick: () => void }) { · 11 unmodified lines
593}617}
594 618
595function ToolkitSection(props: {619function ToolkitSection(props: {
596 pluginId: string;
597 owner: Owner;620 owner: Owner;
598 title: string;621 title?: string;
622 showOwnerLabels: boolean;
599 toolkits: readonly ToolkitResponse[];623 toolkits: readonly ToolkitResponse[];
600 onCreate: (input: { owner: Owner; name: string }) => Promise<void>;624 onCreate: (input: { owner: Owner; name: string }) => Promise<void>;
601}) {625}) {
@@ -604,24 +628,31 @@ function ToolkitSection(props: { · 2 unmodified lines
604 const openCreate = () => setCreateOpen(true);628 const openCreate = () => setCreateOpen(true);
605 return (629 return (
606 <section className="space-y-3">630 <section className="space-y-3">
607 <div className="border-b border-border/60 pb-2">631 {props.title ? (
608 <h2 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">632 <div className="border-b border-border/60 pb-2">
609 {props.title}633 <h2 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
610 </h2>634 {props.title}
611 </div>635 </h2>
636 </div>
637 ) : null}
612 638
613 <div639 <div
614 className="grid content-start grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-3"640 className="grid content-start grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-3"
615 style={toolkitShelfStyle}641 style={toolkitShelfStyle}
616 >642 >
617 {rows.map((toolkit) => (643 {rows.map((toolkit) => (
618 <ToolkitTile key={toolkit.id} pluginId={props.pluginId} toolkit={toolkit} />644 <ToolkitTile key={toolkit.id} showOwnerLabels={props.showOwnerLabels} toolkit={toolkit} />
619 ))}645 ))}
620 <AddToolkitCard owner={props.owner} onClick={openCreate} />646 <AddToolkitCard
647 owner={props.owner}
648 showOwnerLabels={props.showOwnerLabels}
649 onClick={openCreate}
650 />
621 </div>651 </div>
622 652
623 <CreateToolkitDialog653 <CreateToolkitDialog
624 owner={props.owner}654 owner={props.owner}
655 showOwnerLabels={props.showOwnerLabels}
625 open={createOpen}656 open={createOpen}
626 onOpenChange={setCreateOpen}657 onOpenChange={setCreateOpen}
627 onCreate={props.onCreate}658 onCreate={props.onCreate}
@@ -631,27 +662,41 @@ function ToolkitSection(props: { · 3 unmodified lines
631}662}
632 663
633function ToolkitGrid(props: {664function ToolkitGrid(props: {
634 pluginId: string;
635 toolkits: readonly ToolkitResponse[];665 toolkits: readonly ToolkitResponse[];
636 onCreate: (input: { owner: Owner; name: string }) => Promise<void>;666 onCreate: (input: { owner: Owner; name: string }) => Promise<void>;
637}) {667}) {
668 const ownerDisplay = useOwnerDisplay();
638 // Toolkit shelves are grouped by owner; the selected toolkit owns the page.669 // Toolkit shelves are grouped by owner; the selected toolkit owns the page.
639 const workspaceToolkits = props.toolkits.filter((toolkit) => toolkit.owner === "org");670 const workspaceToolkits = props.toolkits.filter((toolkit) => toolkit.owner === "org");
640 const personalToolkits = props.toolkits.filter((toolkit) => toolkit.owner === "user");671 const personalToolkits = props.toolkits.filter((toolkit) => toolkit.owner === "user");
672 if (!ownerDisplay.showOwnerLabels) {
673 return (
674 <div className="min-h-0 flex-1 overflow-y-auto">
675 <div className="w-full space-y-7 px-4 py-4" style={toolkitGridContainerStyle}>
676 <ToolkitSection
677 owner="org"
678 showOwnerLabels={false}
679 toolkits={props.toolkits}
680 onCreate={props.onCreate}
681 />
682 </div>
683 </div>
684 );
685 }
641 686
642 return (687 return (
643 <div className="min-h-0 flex-1 overflow-y-auto">688 <div className="min-h-0 flex-1 overflow-y-auto">
644 <div className="w-full space-y-7 px-4 py-4" style={toolkitGridContainerStyle}>689 <div className="w-full space-y-7 px-4 py-4" style={toolkitGridContainerStyle}>
645 <ToolkitSection690 <ToolkitSection
646 pluginId={props.pluginId}
647 owner="org"691 owner="org"
692 showOwnerLabels
648 title="Workspace"693 title="Workspace"
649 toolkits={workspaceToolkits}694 toolkits={workspaceToolkits}
650 onCreate={props.onCreate}695 onCreate={props.onCreate}
651 />696 />
652 <ToolkitSection697 <ToolkitSection
653 pluginId={props.pluginId}
654 owner="user"698 owner="user"
699 showOwnerLabels
655 title="Personal"700 title="Personal"
656 toolkits={personalToolkits}701 toolkits={personalToolkits}
657 onCreate={props.onCreate}702 onCreate={props.onCreate}
@@ -661,7 +706,7 @@ function ToolkitGrid(props: { · 3 unmodified lines
661 );706 );
662}707}
663 708
664function ToolkitContentsEmpty(props: { onAddConnection: () => void }) {709function ToolkitContentsEmpty(props: { onManageConnections: () => void }) {
665 return (710 return (
666 <div className="flex h-full items-center justify-center px-6 py-10">711 <div className="flex h-full items-center justify-center px-6 py-10">
667 <div className="max-w-sm text-center">712 <div className="max-w-sm text-center">
@@ -672,75 +717,19 @@ function ToolkitContentsEmpty(props: { onAddConnection: () => void }) { · 4 unmodified lines
672 <p className="mt-1.5 text-sm leading-6 text-muted-foreground">717 <p className="mt-1.5 text-sm leading-6 text-muted-foreground">
673 Add a connection to decide what this toolkit exposes.718 Add a connection to decide what this toolkit exposes.
674 </p>719 </p>
675 <Button type="button" size="sm" onClick={props.onAddConnection} className="mt-4">720 <Button type="button" size="sm" onClick={props.onManageConnections} className="mt-4">
676 <PlusIcon className="size-3.5" />721 Manage connections
677 Add connection
678 </Button>722 </Button>
679 </div>723 </div>
680 </div>724 </div>
681 );725 );
682}726}
683 727
684function ToolkitConfiguredConnections(props: {
685 connections: readonly ConfiguredConnectionView[];
686 onRemoveConnection: (connectionId: string) => void;
687}) {
688 if (props.connections.length === 0) return null;
689 return (
690 <div className="border-b border-border/60 bg-background/60 px-3 py-2">
691 <div className="mb-1.5 flex items-center justify-between gap-2">
692 <span className="text-[10px] font-semibold uppercase tracking-widest text-muted-foreground">
693 Connections
694 </span>
695 <span className="text-xs tabular-nums text-muted-foreground">
696 {props.connections.length}
697 </span>
698 </div>
699 <div className="space-y-1">
700 {props.connections.map((connection) => (
701 <div
702 key={connection.id}
703 className="group flex min-w-0 items-center gap-2 rounded-md border border-border/60 bg-card px-2 py-1.5"
704 >
705 <span className="flex size-7 shrink-0 items-center justify-center rounded-md border border-border/70 bg-muted/30">
706 <IntegrationFavicon
707 icon={connection.icon}
708 sourceId={connection.sourceId}
709 url={connection.url}
710 size={16}
711 />
712 </span>
713 <div className="min-w-0 flex-1">
714 <div className="truncate text-xs font-medium text-foreground">{connection.title}</div>
715 <div className="truncate text-[11px] text-muted-foreground">
716 {connection.subtitle}
717 </div>
718 </div>
719 <Button
720 type="button"
721 variant="ghost"
722 size="icon-xs"
723 aria-label={`Remove connection ${connection.title} from toolkit`}
724 title="Remove connection"
725 onClick={() => props.onRemoveConnection(connection.id)}
726 className="size-6 shrink-0 text-muted-foreground hover:text-destructive"
727 >
728 <Trash2Icon className="size-3.5" />
729 </Button>
730 </div>
731 ))}
732 </div>
733 </div>
734 );
735}
736
737function ToolkitToolsPanel(props: {728function ToolkitToolsPanel(props: {
738 tools: readonly ToolSummary[];729 tools: readonly ToolSummary[];
739 configuredConnections: readonly ConfiguredConnectionView[];
740 selectedToolId: string | null;730 selectedToolId: string | null;
741 policies: readonly ToolkitPolicyResponse[];731 policies: readonly ToolkitPolicyResponse[];
742 onAddConnection: () => void;732 onManageConnections: () => void;
743 onRemoveConnection: (connectionId: string) => void;
744 onSelectTool: (toolId: string) => void;733 onSelectTool: (toolId: string) => void;
745 onSetPolicy: (pattern: string, action: ToolPolicyAction) => void;734 onSetPolicy: (pattern: string, action: ToolPolicyAction) => void;
746 onClearPolicy: (pattern: string) => void;735 onClearPolicy: (pattern: string) => void;
@@ -765,21 +754,16 @@ function ToolkitToolsPanel(props: { · 18 unmodified lines
765 <Button754 <Button
766 type="button"755 type="button"
767 size="sm"756 size="sm"
768 aria-label="Add connection to toolkit"757 aria-label="Manage toolkit connections"
769 onClick={props.onAddConnection}758 onClick={props.onManageConnections}
770 className="h-8"759 className="h-8"
771 >760 >
772 <PlusIcon className="size-3.5" />761 Manage
773 Add
774 </Button>762 </Button>
775 </div>763 </div>
776 </div>764 </div>
777 <ToolkitConfiguredConnections
778 connections={props.configuredConnections}
779 onRemoveConnection={props.onRemoveConnection}
780 />
781 {props.tools.length === 0 ? (765 {props.tools.length === 0 ? (
782 <ToolkitContentsEmpty onAddConnection={props.onAddConnection} />766 <ToolkitContentsEmpty onManageConnections={props.onManageConnections} />
783 ) : (767 ) : (
784 <ToolTree768 <ToolTree
785 tools={props.tools}769 tools={props.tools}
@@ -799,11 +783,13 @@ function ToolkitToolsPanel(props: { · 13 unmodified lines
799function AddConnectionDialog(props: {783function AddConnectionDialog(props: {
800 open: boolean;784 open: boolean;
801 groups: readonly ToolkitConnectionGroup[];785 groups: readonly ToolkitConnectionGroup[];
802 configuredToolIds: ReadonlySet<string>;786 configuredConnections: readonly ConfiguredConnectionView[];
803 integrations: readonly Integration[];787 integrations: readonly Integration[];
804 integrationPlugins: readonly IntegrationPlugin[];788 integrationPlugins: readonly IntegrationPlugin[];
789 showOwnerLabels: boolean;
805 onOpenChange: (open: boolean) => void;790 onOpenChange: (open: boolean) => void;
806 onAddPatterns: (patterns: readonly string[]) => Promise<void> | void;791 onAddPatterns: (patterns: readonly string[]) => Promise<void> | void;
792 onRemoveConnection: (connectionId: string) => Promise<void> | void;
807}) {793}) {
808 const searchId = useId();794 const searchId = useId();
809 const [query, setQuery] = useState("");795 const [query, setQuery] = useState("");
@@ -823,9 +809,12 @@ function AddConnectionDialog(props: { · 13 unmodified lines
823 });809 });
824 }, [props.groups, trimmedQuery]);810 }, [props.groups, trimmedQuery]);
825 811
826 const addAndClose = async (patterns: readonly string[]) => {812 const addConnection = async (patterns: readonly string[]) => {
827 await props.onAddPatterns(patterns);813 await props.onAddPatterns(patterns);
828 props.onOpenChange(false);814 };
815
816 const removeConnection = async (connectionId: string) => {
817 await props.onRemoveConnection(connectionId);
829 };818 };
830 819
831 return (820 return (
@@ -852,9 +841,9 @@ function AddConnectionDialog(props: { · 20 unmodified lines
852 <PlugIcon className="size-4" />841 <PlugIcon className="size-4" />
853 </span>842 </span>
854 <div className="min-w-0">843 <div className="min-w-0">
855 <DialogTitle className="text-sm">Add connection</DialogTitle>844 <DialogTitle className="text-sm">Manage connections</DialogTitle>
856 <DialogDescription className="mt-1 text-xs">845 <DialogDescription className="mt-1 text-xs">
857 Choose which connected account this toolkit can use.846 Choose which connected accounts this toolkit can use.
858 </DialogDescription>847 </DialogDescription>
859 </div>848 </div>
860 </div>849 </div>
@@ -892,10 +881,11 @@ function AddConnectionDialog(props: { · 31 unmodified lines
892 ) : (881 ) : (
893 <div className="overflow-hidden rounded-md border border-border/70 bg-background/30">882 <div className="overflow-hidden rounded-md border border-border/70 bg-background/30">
894 {filteredGroups.map((group) => {883 {filteredGroups.map((group) => {
895 const title = connectionTitle(group);884 const title = connectionTitleForHost(group, props.showOwnerLabels);
896 const added = group.tools.every((tool) =>885 const configuredConnection = props.configuredConnections.find((connection) =>
897 props.configuredToolIds.has(toolMatchId(tool)),886 group.patterns.includes(connection.pattern),
898 );887 );
888 const added = configuredConnection !== undefined;
899 const meta = integrationMetaFor(889 const meta = integrationMetaFor(
900 group,890 group,
901 props.integrations,891 props.integrations,
@@ -919,9 +909,11 @@ function AddConnectionDialog(props: { · 17 unmodified lines
919 <span className="truncate text-xs font-medium text-foreground">909 <span className="truncate text-xs font-medium text-foreground">
920 {connectionDisplayTitle(group, meta)}910 {connectionDisplayTitle(group, meta)}
921 </span>911 </span>
922 <Badge variant="outline" className="shrink-0 text-[10px]">912 {props.showOwnerLabels ? (
923 {ownerLabel(group.owner)}913 <Badge variant="outline" className="shrink-0 text-[10px]">
924 </Badge>914 {ownerLabel(group.owner)}
915 </Badge>
916 ) : null}
925 </div>917 </div>
926 <div className="flex min-w-0 items-center gap-2">918 <div className="flex min-w-0 items-center gap-2">
927 <span className="truncate text-[11px] text-muted-foreground">919 <span className="truncate text-[11px] text-muted-foreground">
@@ -933,22 +925,25 @@ function AddConnectionDialog(props: { · 5 unmodified lines
933 type="button"925 type="button"
934 variant={added ? "outline" : "default"}926 variant={added ? "outline" : "default"}
935 size="sm"927 size="sm"
936 disabled={added}928 aria-label={`${added ? "Remove connection" : "Add connection"} ${title}`}
937 aria-label={`${added ? "Connection added" : "Add connection"} ${title}`}929 onClick={() =>
938 onClick={() => void addAndClose(group.patterns)}930 void (added && configuredConnection
931 ? removeConnection(configuredConnection.id)
932 : addConnection(group.patterns))
933 }
939 className={cn(934 className={cn(
940 "h-7 shrink-0 px-2.5 text-xs",935 "h-7 shrink-0 px-2.5 text-xs",
941 added936 added
942 ? "border-border/70 bg-transparent text-muted-foreground"937 ? "border-border/70 bg-transparent text-muted-foreground hover:text-destructive"
943 : "bg-primary/10 text-primary hover:bg-primary/15",938 : "bg-primary/10 text-primary hover:bg-primary/15",
944 )}939 )}
945 >940 >
946 {added ? (941 {added ? (
947 <CheckIcon className="size-3.5" />942 <Trash2Icon className="size-3.5" />
948 ) : (943 ) : (
949 <PlusIcon className="size-3.5" />944 <PlusIcon className="size-3.5" />
950 )}945 )}
951 {added ? "Added" : "Add"}946 {added ? "Remove" : "Add"}
952 </Button>947 </Button>
953 </div>948 </div>
954 );949 );
@@ -964,6 +959,7 @@ function AddConnectionDialog(props: { · 9 unmodified lines
964 959
965function ToolkitHeader(props: {960function ToolkitHeader(props: {
966 toolkit: ToolkitResponse;961 toolkit: ToolkitResponse;
962 showOwnerLabels: boolean;
967 toolCount: number;963 toolCount: number;
968 mcpUrl: string;964 mcpUrl: string;
969 onBack: () => void;965 onBack: () => void;
@@ -985,9 +981,11 @@ function ToolkitHeader(props: { · 15 unmodified lines
985 <div className="min-w-0">981 <div className="min-w-0">
986 <div className="flex min-w-0 items-center gap-2">982 <div className="flex min-w-0 items-center gap-2">
987 <h2 className="truncate text-sm font-semibold text-foreground">{props.toolkit.name}</h2>983 <h2 className="truncate text-sm font-semibold text-foreground">{props.toolkit.name}</h2>
988 <Badge variant="outline" className="text-[10px]">984 {props.showOwnerLabels ? (
989 {ownerLabel(props.toolkit.owner)}985 <Badge variant="outline" className="text-[10px]">
990 </Badge>986 {ownerLabel(props.toolkit.owner)}
987 </Badge>
988 ) : null}
991 <span className="text-xs tabular-nums text-muted-foreground">989 <span className="text-xs tabular-nums text-muted-foreground">
992 {props.toolCount} {props.toolCount === 1 ? "tool" : "tools"}990 {props.toolCount} {props.toolCount === 1 ? "tool" : "tools"}
993 </span>991 </span>
@@ -999,16 +997,34 @@ function ToolkitHeader(props: { · 5 unmodified lines
999 <CopyButton value={props.mcpUrl} label="Copy toolkit MCP URL" />997 <CopyButton value={props.mcpUrl} label="Copy toolkit MCP URL" />
1000 </div>998 </div>
1001 </div>999 </div>
1002 <Button1000 <AlertDialog>
1003 type="button"1001 <AlertDialogTrigger asChild>
1004 variant="ghost"1002 <Button
1005 size="icon-sm"1003 type="button"
1006 aria-label="Delete toolkit"1004 variant="ghost"
1007 onClick={props.onRemove}1005 size="icon-sm"
1008 className="text-muted-foreground hover:text-destructive"1006 aria-label="Delete toolkit"
1009 >1007 className="text-muted-foreground hover:text-destructive"
1010 <Trash2Icon className="size-3.5" />1008 >
1011 </Button>1009 <Trash2Icon className="size-3.5" />
1010 </Button>
1011 </AlertDialogTrigger>
1012 <AlertDialogContent size="sm">
1013 <AlertDialogHeader>
1014 <AlertDialogTitle>Delete {props.toolkit.name}?</AlertDialogTitle>
1015 <AlertDialogDescription>
1016 This removes the toolkit and its dedicated MCP endpoint. Connections are not
1017 deleted.
1018 </AlertDialogDescription>
1019 </AlertDialogHeader>
1020 <AlertDialogFooter>
1021 <AlertDialogCancel>Cancel</AlertDialogCancel>
1022 <AlertDialogAction variant="destructive" onClick={props.onRemove}>
1023 Delete
1024 </AlertDialogAction>
1025 </AlertDialogFooter>
1026 </AlertDialogContent>
1027 </AlertDialog>
1012 </div>1028 </div>
1013 </div>1029 </div>
1014 );1030 );
@@ -1016,6 +1032,7 @@ function ToolkitHeader(props: { · 1 unmodified line
1016 1032
1017function ToolkitWorkspace(props: {1033function ToolkitWorkspace(props: {
1018 toolkit: ToolkitResponse;1034 toolkit: ToolkitResponse;
1035 showOwnerLabels: boolean;
1019 policies: readonly ToolkitPolicyResponse[];1036 policies: readonly ToolkitPolicyResponse[];
1020 connections: readonly ToolkitConnectionResponse[];1037 connections: readonly ToolkitConnectionResponse[];
1021 tools: readonly ToolRow[];1038 tools: readonly ToolRow[];
@@ -1043,8 +1060,15 @@ function ToolkitWorkspace(props: { · 21 unmodified lines
1043 connectionGroups,1060 connectionGroups,
1044 props.integrations,1061 props.integrations,
1045 props.integrationPlugins,1062 props.integrationPlugins,
1063 props.showOwnerLabels,
1046 ),1064 ),
1047 [connectionGroups, props.connections, props.integrationPlugins, props.integrations],1065 [
1066 connectionGroups,
1067 props.connections,
1068 props.integrationPlugins,
1069 props.integrations,
1070 props.showOwnerLabels,
1071 ],
1048 );1072 );
1049 const legacyPolicyIds = useMemo(1073 const legacyPolicyIds = useMemo(
1050 () => legacyConnectionPolicyIds(props.policies, connectionGroups, props.connections),1074 () => legacyConnectionPolicyIds(props.policies, connectionGroups, props.connections),
@@ -1103,6 +1127,7 @@ function ToolkitWorkspace(props: { · 52 unmodified lines
1103 <div className="flex min-h-0 flex-1 flex-col overflow-hidden">1127 <div className="flex min-h-0 flex-1 flex-col overflow-hidden">
1104 <ToolkitHeader1128 <ToolkitHeader
1105 toolkit={props.toolkit}1129 toolkit={props.toolkit}
1130 showOwnerLabels={props.showOwnerLabels}
1106 toolCount={exposedToolIds.size}1131 toolCount={exposedToolIds.size}
1107 mcpUrl={props.mcpUrl}1132 mcpUrl={props.mcpUrl}
1108 onBack={props.onBack}1133 onBack={props.onBack}
@@ -1112,11 +1137,9 @@ function ToolkitWorkspace(props: { · 3 unmodified lines
1112 <div className="flex min-h-0 flex-1 overflow-hidden">1137 <div className="flex min-h-0 flex-1 overflow-hidden">
1113 <ToolkitToolsPanel1138 <ToolkitToolsPanel
1114 tools={toolkitTools}1139 tools={toolkitTools}
1115 configuredConnections={configuredConnections}
1116 selectedToolId={selectedToolId}1140 selectedToolId={selectedToolId}
1117 policies={accessPolicies}1141 policies={accessPolicies}
1118 onAddConnection={() => setAddOpen(true)}1142 onManageConnections={() => setAddOpen(true)}
1119 onRemoveConnection={(connectionId) => void props.onRemoveConnection(connectionId)}
1120 onSelectTool={setSelectedToolId}1143 onSelectTool={setSelectedToolId}
1121 onSetPolicy={(pattern, action) => void props.onSetPolicy(pattern, action)}1144 onSetPolicy={(pattern, action) => void props.onSetPolicy(pattern, action)}
1122 onClearPolicy={(pattern) => void props.onClearPolicy(pattern)}1145 onClearPolicy={(pattern) => void props.onClearPolicy(pattern)}
@@ -1142,14 +1165,16 @@ function ToolkitWorkspace(props: { · 19 unmodified lines
1142 open={addOpen}1165 open={addOpen}
1143 onOpenChange={setAddOpen}1166 onOpenChange={setAddOpen}
1144 groups={connectionGroups}1167 groups={connectionGroups}
1145 configuredToolIds={configuredToolIds}1168 configuredConnections={configuredConnections}
1146 integrations={props.integrations}1169 integrations={props.integrations}
1147 integrationPlugins={props.integrationPlugins}1170 integrationPlugins={props.integrationPlugins}
1171 showOwnerLabels={props.showOwnerLabels}
1148 onAddPatterns={async (patterns) => {1172 onAddPatterns={async (patterns) => {
1149 for (const pattern of patterns) {1173 for (const pattern of patterns) {
1150 await props.onAddConnection(pattern);1174 await props.onAddConnection(pattern);
1151 }1175 }
1152 }}1176 }}
1177 onRemoveConnection={props.onRemoveConnection}
1153 />1178 />
1154 </div>1179 </div>
1155 );1180 );
@@ -1171,14 +1196,16 @@ function ToolkitTileSkeleton(props: { index: number }) { · 15 unmodified lines
1171 );1196 );
1172}1197}
1173 1198
1174function ToolkitSectionSkeleton(props: { title: string; offset: number }) {1199function ToolkitSectionSkeleton(props: { title?: string; offset: number }) {
1175 return (1200 return (
1176 <section className="space-y-3" aria-label={`Loading ${props.title.toLowerCase()} toolkits`}>1201 <section className="space-y-3" aria-label="Loading toolkits">
1177 <div className="border-b border-border/60 pb-2">1202 {props.title ? (
1178 <h2 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">1203 <div className="border-b border-border/60 pb-2">
1179 {props.title}1204 <h2 className="text-xs font-semibold uppercase tracking-widest text-muted-foreground">
1180 </h2>1205 {props.title}
1181 </div>1206 </h2>
1207 </div>
1208 ) : null}
1182 1209
1183 <div className="grid content-start grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-3">1210 <div className="grid content-start grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-3">
1184 {Array.from({ length: 3 }).map((_, index) => (1211 {Array.from({ length: 3 }).map((_, index) => (
@@ -1189,12 +1216,18 @@ function ToolkitSectionSkeleton(props: { title: string; offset: number }) { · 4 unmodified lines
1189 );1216 );
1190}1217}
1191 1218
1192function ToolkitGridSkeleton() {1219function ToolkitGridSkeleton(props: { showOwnerLabels: boolean }) {
1193 return (1220 return (
1194 <div className="min-h-0 flex-1 overflow-y-auto">1221 <div className="min-h-0 flex-1 overflow-y-auto">
1195 <div className="w-full space-y-7 px-4 py-4" style={toolkitGridContainerStyle}>1222 <div className="w-full space-y-7 px-4 py-4" style={toolkitGridContainerStyle}>
1196 <ToolkitSectionSkeleton title="Workspace" offset={0} />1223 {props.showOwnerLabels ? (
1197 <ToolkitSectionSkeleton title="Personal" offset={3} />1224 <>
1225 <ToolkitSectionSkeleton title="Workspace" offset={0} />
1226 <ToolkitSectionSkeleton title="Personal" offset={3} />
1227 </>
1228 ) : (
1229 <ToolkitSectionSkeleton offset={0} />
1230 )}
1198 </div>1231 </div>
1199 </div>1232 </div>
1200 );1233 );
@@ -1258,6 +1291,7 @@ function ToolkitDetailSkeleton() { · 57 unmodified lines
1258 1291
1259function ToolkitDetailView(props: {1292function ToolkitDetailView(props: {
1260 toolkit: ToolkitResponse;1293 toolkit: ToolkitResponse;
1294 showOwnerLabels: boolean;
1261 tools: readonly ToolRow[];1295 tools: readonly ToolRow[];
1262 integrations: readonly Integration[];1296 integrations: readonly Integration[];
1263 integrationPlugins: readonly IntegrationPlugin[];1297 integrationPlugins: readonly IntegrationPlugin[];
@@ -1326,6 +1360,7 @@ function ToolkitDetailView(props: { · 62 unmodified lines
1326 return (1360 return (
1327 <ToolkitWorkspace1361 <ToolkitWorkspace
1328 toolkit={props.toolkit}1362 toolkit={props.toolkit}
1363 showOwnerLabels={props.showOwnerLabels}
1329 policies={policyRows}1364 policies={policyRows}
1330 connections={connectionRows}1365 connections={connectionRows}
1331 tools={props.tools}1366 tools={props.tools}
@@ -1343,8 +1378,9 @@ function ToolkitDetailView(props: { · 11 unmodified lines
1343}1378}
1344 1379
1345export function ToolkitsPage(props: PluginPageProps) {1380export function ToolkitsPage(props: PluginPageProps) {
1346 const params = useParams({ strict: false }) as { orgSlug?: string };
1347 const navigate = useNavigate();1381 const navigate = useNavigate();
1382 const organizationSlug = useOrganizationSlug();
1383 const ownerDisplay = useOwnerDisplay();
1348 const integrationPlugins = useIntegrationPlugins();1384 const integrationPlugins = useIntegrationPlugins();
1349 const toolkits = useAtomValue(toolkitsAtom);1385 const toolkits = useAtomValue(toolkitsAtom);
1350 const tools = useAtomValue(toolsAllAtom);1386 const tools = useAtomValue(toolsAllAtom);
@@ -1367,8 +1403,7 @@ export function ToolkitsPage(props: PluginPageProps) { · 16 unmodified lines
1367 const toolsFailed = AsyncResult.isFailure(tools);1403 const toolsFailed = AsyncResult.isFailure(tools);
1368 const navigateToIndex = () =>1404 const navigateToIndex = () =>
1369 navigate({1405 navigate({
1370 to: "/{-$orgSlug}/plugins/$pluginId/$",1406 to: "/{-$orgSlug}/toolkits",
1371 params: { pluginId: props.pluginId, _splat: "" },
1372 });1407 });
1373 1408
1374 const createToolkitHandler = async (input: { owner: Owner; name: string }) => {1409 const createToolkitHandler = async (input: { owner: Owner; name: string }) => {
@@ -1411,7 +1446,7 @@ export function ToolkitsPage(props: PluginPageProps) { · 36 unmodified lines
1411 toolkitsFailed ? (1446 toolkitsFailed ? (
1412 <div className="p-6 text-sm text-destructive">Failed to load toolkits</div>1447 <div className="p-6 text-sm text-destructive">Failed to load toolkits</div>
1413 ) : (1448 ) : (
1414 <ToolkitGridSkeleton />1449 <ToolkitGridSkeleton showOwnerLabels={ownerDisplay.showOwnerLabels} />
1415 )1450 )
1416 ) : selectedToolkit ? (1451 ) : selectedToolkit ? (
1417 toolsFailed ? (1452 toolsFailed ? (
@@ -1421,10 +1456,11 @@ export function ToolkitsPage(props: PluginPageProps) { · 3 unmodified lines
1421 ) : (1456 ) : (
1422 <ToolkitDetailView1457 <ToolkitDetailView
1423 toolkit={selectedToolkit}1458 toolkit={selectedToolkit}
1459 showOwnerLabels={ownerDisplay.showOwnerLabels}
1424 tools={toolRows}1460 tools={toolRows}
1425 integrations={integrationRows}1461 integrations={integrationRows}
1426 integrationPlugins={integrationPlugins}1462 integrationPlugins={integrationPlugins}
1427 orgSlug={params.orgSlug}1463 orgSlug={organizationSlug ?? undefined}
1428 onBack={() => void navigateToIndex()}1464 onBack={() => void navigateToIndex()}
1429 onRemoveToolkit={removeToolkitHandler}1465 onRemoveToolkit={removeToolkitHandler}
1430 />1466 />
@@ -1444,11 +1480,7 @@ export function ToolkitsPage(props: PluginPageProps) { · 13 unmodified lines
1444 <div className="text-sm text-muted-foreground">Toolkit not found</div>1480 <div className="text-sm text-muted-foreground">Toolkit not found</div>
1445 </div>1481 </div>
1446 ) : (1482 ) : (
1447 <ToolkitGrid1483 <ToolkitGrid toolkits={toolkitRows} onCreate={createToolkitHandler} />
1448 pluginId={props.pluginId}
1449 toolkits={toolkitRows}
1450 onCreate={createToolkitHandler}
1451 />
1452 )}1484 )}
1453 </div>1485 </div>
1454 );1486 );
packages/react/src/console-routes.ts+4−0
@@ -39,6 +39,8 @@ export const CONSOLE_ROUTE_PATHS = [ · 38 unmodified lines
39 "/policies",39 "/policies",
40 "/secrets",40 "/secrets",
41 "/tools",41 "/tools",
42 "/toolkits",
43 "/toolkits/$toolkitSlug",
42 "/resume/$executionId",44 "/resume/$executionId",
43 "/plugins/$pluginId/$",45 "/plugins/$pluginId/$",
44] as const;46] as const;
@@ -71,6 +73,8 @@ export const consoleRoutes = (options: ConsoleRoutesOptions): Array<VirtualRoute · 26 unmodified lines
71 ["/policies", route("/policies", file("policies.tsx"))],73 ["/policies", route("/policies", file("policies.tsx"))],
72 ["/secrets", route("/secrets", file("secrets.tsx"))],74 ["/secrets", route("/secrets", file("secrets.tsx"))],
73 ["/tools", route("/tools", file("tools.tsx"))],75 ["/tools", route("/tools", file("tools.tsx"))],
76 ["/toolkits", route("/toolkits", file("toolkits.tsx"))],
77 ["/toolkits/$toolkitSlug", route("/toolkits/$toolkitSlug", file("toolkits.$toolkitSlug.tsx"))],
74 ["/resume/$executionId", route("/resume/$executionId", file("resume.$executionId.tsx"))],78 ["/resume/$executionId", route("/resume/$executionId", file("resume.$executionId.tsx"))],
75 ["/plugins/$pluginId/$", route("/plugins/$pluginId/$", file("plugins.$pluginId.$.tsx"))],79 ["/plugins/$pluginId/$", route("/plugins/$pluginId/$", file("plugins.$pluginId.$.tsx"))],
76 ];80 ];
packages/react/src/multiplayer/shell.tsx+1−0
@@ -49,6 +49,7 @@ export const defaultShellNavItems: ReadonlyArray<ShellNavItem> = [ · 48 unmodified lines
49 { to: "/", label: "Integrations" },49 { to: "/", label: "Integrations" },
50 { to: "/secrets", label: "Providers" },50 { to: "/secrets", label: "Providers" },
51 { to: "/policies", label: "Policies" },51 { to: "/policies", label: "Policies" },
52 { to: "/toolkits", label: "Toolkits" },
52];53];
53 54
54/** Canonical public docs (Mintlify). Same-origin on cloud (executor.sh proxies55/** Canonical public docs (Mintlify). Same-origin on cloud (executor.sh proxies
packages/react/src/routes/plugins.$pluginId.$.tsx+18−3
@@ -1,4 +1,4 @@
1import { createFileRoute, notFound } from "@tanstack/react-router";1import { createFileRoute, Navigate, notFound } from "@tanstack/react-router";
2import { useClientPlugins } from "@executor-js/sdk/client";2import { useClientPlugins } from "@executor-js/sdk/client";
3 3
4// ---------------------------------------------------------------------------4// ---------------------------------------------------------------------------
@@ -84,13 +84,28 @@ export const matchPluginPage = <TPage extends { readonly path: string }>( · 79 unmodified lines
84};84};
85 85
86function PluginRouteComponent() {86function PluginRouteComponent() {
87 const { pluginId, _splat: rest } = Route.useParams();87 const { orgSlug, pluginId, _splat: rest } = Route.useParams();
88 const plugins = useClientPlugins();88 const plugins = useClientPlugins();
89 const target = normalizePath(rest ?? "/");
90 if (pluginId === "toolkits") {
91 const segments = pathSegments(target);
92 const toolkitSlug = segments[0];
93 if (toolkitSlug) {
94 return (
95 <Navigate
96 to="/{-$orgSlug}/toolkits/$toolkitSlug"
97 params={{ orgSlug, toolkitSlug }}
98 replace
99 />
100 );
101 }
102 return <Navigate to="/{-$orgSlug}/toolkits" params={{ orgSlug }} replace />;
103 }
104
89 const plugin = plugins.find((p) => p.id === pluginId);105 const plugin = plugins.find((p) => p.id === pluginId);
90 // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: TanStack Router represents not-found from components by throwing notFound()106 // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: TanStack Router represents not-found from components by throwing notFound()
91 if (!plugin) throw notFound();107 if (!plugin) throw notFound();
92 108
93 const target = normalizePath(rest ?? "/");
94 const match = matchPluginPage(plugin.pages, target);109 const match = matchPluginPage(plugin.pages, target);
95 // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: TanStack Router represents not-found from components by throwing notFound()110 // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: TanStack Router represents not-found from components by throwing notFound()
96 if (!match) throw notFound();111 if (!match) throw notFound();
packages/react/src/routes/routeTree.gen.ts+53−0
@@ -11,8 +11,10 @@ · 10 unmodified lines
11import { Route as rootRouteImport } from './__root'11import { Route as rootRouteImport } from './__root'
12import { Route as DotIndexRouteImport } from './index'12import { Route as DotIndexRouteImport } from './index'
13import { Route as DotToolsRouteImport } from './tools'13import { Route as DotToolsRouteImport } from './tools'
14import { Route as DotToolkitsRouteImport } from './toolkits'
14import { Route as DotSecretsRouteImport } from './secrets'15import { Route as DotSecretsRouteImport } from './secrets'
15import { Route as DotPoliciesRouteImport } from './policies'16import { Route as DotPoliciesRouteImport } from './policies'
17import { Route as DotToolkitsDottoolkitSlugRouteImport } from './toolkits.$toolkitSlug'
16import { Route as DotResumeDotexecutionIdRouteImport } from './resume.$executionId'18import { Route as DotResumeDotexecutionIdRouteImport } from './resume.$executionId'
17import { Route as DotIntegrationsDotnamespaceRouteImport } from './integrations.$namespace'19import { Route as DotIntegrationsDotnamespaceRouteImport } from './integrations.$namespace'
18import { Route as DotPluginsDotpluginIdDotsplatRouteImport } from './plugins.$pluginId.$'20import { Route as DotPluginsDotpluginIdDotsplatRouteImport } from './plugins.$pluginId.$'
@@ -28,6 +30,11 @@ const DotToolsRoute = DotToolsRouteImport.update({ · 9 unmodified lines
28 path: '/{-$orgSlug}/tools',30 path: '/{-$orgSlug}/tools',
29 getParentRoute: () => rootRouteImport,31 getParentRoute: () => rootRouteImport,
30} as any)32} as any)
33const DotToolkitsRoute = DotToolkitsRouteImport.update({
34 id: '/{-$orgSlug}/toolkits',
35 path: '/{-$orgSlug}/toolkits',
36 getParentRoute: () => rootRouteImport,
37} as any)
31const DotSecretsRoute = DotSecretsRouteImport.update({38const DotSecretsRoute = DotSecretsRouteImport.update({
32 id: '/{-$orgSlug}/secrets',39 id: '/{-$orgSlug}/secrets',
33 path: '/{-$orgSlug}/secrets',40 path: '/{-$orgSlug}/secrets',
@@ -38,6 +45,12 @@ const DotPoliciesRoute = DotPoliciesRouteImport.update({ · 4 unmodified lines
38 path: '/{-$orgSlug}/policies',45 path: '/{-$orgSlug}/policies',
39 getParentRoute: () => rootRouteImport,46 getParentRoute: () => rootRouteImport,
40} as any)47} as any)
48const DotToolkitsDottoolkitSlugRoute =
49 DotToolkitsDottoolkitSlugRouteImport.update({
50 id: '/$toolkitSlug',
51 path: '/$toolkitSlug',
52 getParentRoute: () => DotToolkitsRoute,
53 } as any)
41const DotResumeDotexecutionIdRoute = DotResumeDotexecutionIdRouteImport.update({54const DotResumeDotexecutionIdRoute = DotResumeDotexecutionIdRouteImport.update({
42 id: '/{-$orgSlug}/resume/$executionId',55 id: '/{-$orgSlug}/resume/$executionId',
43 path: '/{-$orgSlug}/resume/$executionId',56 path: '/{-$orgSlug}/resume/$executionId',
@@ -65,20 +78,24 @@ const DotIntegrationsDotaddDotpluginKeyRoute = · 21 unmodified lines
65export interface FileRoutesByFullPath {78export interface FileRoutesByFullPath {
66 '/{-$orgSlug}/policies': typeof DotPoliciesRoute79 '/{-$orgSlug}/policies': typeof DotPoliciesRoute
67 '/{-$orgSlug}/secrets': typeof DotSecretsRoute80 '/{-$orgSlug}/secrets': typeof DotSecretsRoute
81 '/{-$orgSlug}/toolkits': typeof DotToolkitsRouteWithChildren
68 '/{-$orgSlug}/tools': typeof DotToolsRoute82 '/{-$orgSlug}/tools': typeof DotToolsRoute
69 '/{-$orgSlug}/': typeof DotIndexRoute83 '/{-$orgSlug}/': typeof DotIndexRoute
70 '/{-$orgSlug}/integrations/$namespace': typeof DotIntegrationsDotnamespaceRoute84 '/{-$orgSlug}/integrations/$namespace': typeof DotIntegrationsDotnamespaceRoute
71 '/{-$orgSlug}/resume/$executionId': typeof DotResumeDotexecutionIdRoute85 '/{-$orgSlug}/resume/$executionId': typeof DotResumeDotexecutionIdRoute
86 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotToolkitsDottoolkitSlugRoute
72 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotIntegrationsDotaddDotpluginKeyRoute87 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotIntegrationsDotaddDotpluginKeyRoute
73 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotPluginsDotpluginIdDotsplatRoute88 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotPluginsDotpluginIdDotsplatRoute
74}89}
75export interface FileRoutesByTo {90export interface FileRoutesByTo {
76 '/{-$orgSlug}/policies': typeof DotPoliciesRoute91 '/{-$orgSlug}/policies': typeof DotPoliciesRoute
77 '/{-$orgSlug}/secrets': typeof DotSecretsRoute92 '/{-$orgSlug}/secrets': typeof DotSecretsRoute
93 '/{-$orgSlug}/toolkits': typeof DotToolkitsRouteWithChildren
78 '/{-$orgSlug}/tools': typeof DotToolsRoute94 '/{-$orgSlug}/tools': typeof DotToolsRoute
79 '/{-$orgSlug}': typeof DotIndexRoute95 '/{-$orgSlug}': typeof DotIndexRoute
80 '/{-$orgSlug}/integrations/$namespace': typeof DotIntegrationsDotnamespaceRoute96 '/{-$orgSlug}/integrations/$namespace': typeof DotIntegrationsDotnamespaceRoute
81 '/{-$orgSlug}/resume/$executionId': typeof DotResumeDotexecutionIdRoute97 '/{-$orgSlug}/resume/$executionId': typeof DotResumeDotexecutionIdRoute
98 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotToolkitsDottoolkitSlugRoute
82 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotIntegrationsDotaddDotpluginKeyRoute99 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotIntegrationsDotaddDotpluginKeyRoute
83 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotPluginsDotpluginIdDotsplatRoute100 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotPluginsDotpluginIdDotsplatRoute
84}101}
@@ -86,10 +103,12 @@ export interface FileRoutesById { · 1 unmodified line
86 __root__: typeof rootRouteImport103 __root__: typeof rootRouteImport
87 '/{-$orgSlug}/policies': typeof DotPoliciesRoute104 '/{-$orgSlug}/policies': typeof DotPoliciesRoute
88 '/{-$orgSlug}/secrets': typeof DotSecretsRoute105 '/{-$orgSlug}/secrets': typeof DotSecretsRoute
106 '/{-$orgSlug}/toolkits': typeof DotToolkitsRouteWithChildren
89 '/{-$orgSlug}/tools': typeof DotToolsRoute107 '/{-$orgSlug}/tools': typeof DotToolsRoute
90 '/{-$orgSlug}/': typeof DotIndexRoute108 '/{-$orgSlug}/': typeof DotIndexRoute
91 '/{-$orgSlug}/integrations/$namespace': typeof DotIntegrationsDotnamespaceRoute109 '/{-$orgSlug}/integrations/$namespace': typeof DotIntegrationsDotnamespaceRoute
92 '/{-$orgSlug}/resume/$executionId': typeof DotResumeDotexecutionIdRoute110 '/{-$orgSlug}/resume/$executionId': typeof DotResumeDotexecutionIdRoute
111 '/{-$orgSlug}/toolkits/$toolkitSlug': typeof DotToolkitsDottoolkitSlugRoute
93 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotIntegrationsDotaddDotpluginKeyRoute112 '/{-$orgSlug}/integrations/add/$pluginKey': typeof DotIntegrationsDotaddDotpluginKeyRoute
94 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotPluginsDotpluginIdDotsplatRoute113 '/{-$orgSlug}/plugins/$pluginId/$': typeof DotPluginsDotpluginIdDotsplatRoute
95}114}
@@ -98,30 +117,36 @@ export interface FileRouteTypes { · 2 unmodified lines
98 fullPaths:117 fullPaths:
99 | '/{-$orgSlug}/policies'118 | '/{-$orgSlug}/policies'
100 | '/{-$orgSlug}/secrets'119 | '/{-$orgSlug}/secrets'
120 | '/{-$orgSlug}/toolkits'
101 | '/{-$orgSlug}/tools'121 | '/{-$orgSlug}/tools'
102 | '/{-$orgSlug}/'122 | '/{-$orgSlug}/'
103 | '/{-$orgSlug}/integrations/$namespace'123 | '/{-$orgSlug}/integrations/$namespace'
104 | '/{-$orgSlug}/resume/$executionId'124 | '/{-$orgSlug}/resume/$executionId'
125 | '/{-$orgSlug}/toolkits/$toolkitSlug'
105 | '/{-$orgSlug}/integrations/add/$pluginKey'126 | '/{-$orgSlug}/integrations/add/$pluginKey'
106 | '/{-$orgSlug}/plugins/$pluginId/$'127 | '/{-$orgSlug}/plugins/$pluginId/$'
107 fileRoutesByTo: FileRoutesByTo128 fileRoutesByTo: FileRoutesByTo
108 to:129 to:
109 | '/{-$orgSlug}/policies'130 | '/{-$orgSlug}/policies'
110 | '/{-$orgSlug}/secrets'131 | '/{-$orgSlug}/secrets'
132 | '/{-$orgSlug}/toolkits'
111 | '/{-$orgSlug}/tools'133 | '/{-$orgSlug}/tools'
112 | '/{-$orgSlug}'134 | '/{-$orgSlug}'
113 | '/{-$orgSlug}/integrations/$namespace'135 | '/{-$orgSlug}/integrations/$namespace'
114 | '/{-$orgSlug}/resume/$executionId'136 | '/{-$orgSlug}/resume/$executionId'
137 | '/{-$orgSlug}/toolkits/$toolkitSlug'
115 | '/{-$orgSlug}/integrations/add/$pluginKey'138 | '/{-$orgSlug}/integrations/add/$pluginKey'
116 | '/{-$orgSlug}/plugins/$pluginId/$'139 | '/{-$orgSlug}/plugins/$pluginId/$'
117 id:140 id:
118 | '__root__'141 | '__root__'
119 | '/{-$orgSlug}/policies'142 | '/{-$orgSlug}/policies'
120 | '/{-$orgSlug}/secrets'143 | '/{-$orgSlug}/secrets'
144 | '/{-$orgSlug}/toolkits'
121 | '/{-$orgSlug}/tools'145 | '/{-$orgSlug}/tools'
122 | '/{-$orgSlug}/'146 | '/{-$orgSlug}/'
123 | '/{-$orgSlug}/integrations/$namespace'147 | '/{-$orgSlug}/integrations/$namespace'
124 | '/{-$orgSlug}/resume/$executionId'148 | '/{-$orgSlug}/resume/$executionId'
149 | '/{-$orgSlug}/toolkits/$toolkitSlug'
125 | '/{-$orgSlug}/integrations/add/$pluginKey'150 | '/{-$orgSlug}/integrations/add/$pluginKey'
126 | '/{-$orgSlug}/plugins/$pluginId/$'151 | '/{-$orgSlug}/plugins/$pluginId/$'
127 fileRoutesById: FileRoutesById152 fileRoutesById: FileRoutesById
@@ -129,6 +154,7 @@ export interface FileRouteTypes { · 1 unmodified line
129export interface RootRouteChildren {154export interface RootRouteChildren {
130 DotPoliciesRoute: typeof DotPoliciesRoute155 DotPoliciesRoute: typeof DotPoliciesRoute
131 DotSecretsRoute: typeof DotSecretsRoute156 DotSecretsRoute: typeof DotSecretsRoute
157 DotToolkitsRoute: typeof DotToolkitsRouteWithChildren
132 DotToolsRoute: typeof DotToolsRoute158 DotToolsRoute: typeof DotToolsRoute
133 DotIndexRoute: typeof DotIndexRoute159 DotIndexRoute: typeof DotIndexRoute
134 DotIntegrationsDotnamespaceRoute: typeof DotIntegrationsDotnamespaceRoute160 DotIntegrationsDotnamespaceRoute: typeof DotIntegrationsDotnamespaceRoute
@@ -153,6 +179,13 @@ declare module '@tanstack/react-router' { · 18 unmodified lines
153 preLoaderRoute: typeof DotToolsRouteImport179 preLoaderRoute: typeof DotToolsRouteImport
154 parentRoute: typeof rootRouteImport180 parentRoute: typeof rootRouteImport
155 }181 }
182 '/{-$orgSlug}/toolkits': {
183 id: '/{-$orgSlug}/toolkits'
184 path: '/{-$orgSlug}/toolkits'
185 fullPath: '/{-$orgSlug}/toolkits'
186 preLoaderRoute: typeof DotToolkitsRouteImport
187 parentRoute: typeof rootRouteImport
188 }
156 '/{-$orgSlug}/secrets': {189 '/{-$orgSlug}/secrets': {
157 id: '/{-$orgSlug}/secrets'190 id: '/{-$orgSlug}/secrets'
158 path: '/{-$orgSlug}/secrets'191 path: '/{-$orgSlug}/secrets'
@@ -167,6 +200,13 @@ declare module '@tanstack/react-router' { · 8 unmodified lines
167 preLoaderRoute: typeof DotPoliciesRouteImport200 preLoaderRoute: typeof DotPoliciesRouteImport
168 parentRoute: typeof rootRouteImport201 parentRoute: typeof rootRouteImport
169 }202 }
203 '/{-$orgSlug}/toolkits/$toolkitSlug': {
204 id: '/{-$orgSlug}/toolkits/$toolkitSlug'
205 path: '/$toolkitSlug'
206 fullPath: '/{-$orgSlug}/toolkits/$toolkitSlug'
207 preLoaderRoute: typeof DotToolkitsDottoolkitSlugRouteImport
208 parentRoute: typeof DotToolkitsRoute
209 }
170 '/{-$orgSlug}/resume/$executionId': {210 '/{-$orgSlug}/resume/$executionId': {
171 id: '/{-$orgSlug}/resume/$executionId'211 id: '/{-$orgSlug}/resume/$executionId'
172 path: '/{-$orgSlug}/resume/$executionId'212 path: '/{-$orgSlug}/resume/$executionId'
@@ -198,9 +238,22 @@ declare module '@tanstack/react-router' { · 25 unmodified lines
198 }238 }
199}239}
200 240
241interface DotToolkitsRouteChildren {
242 DotToolkitsDottoolkitSlugRoute: typeof DotToolkitsDottoolkitSlugRoute
243}
244
245const DotToolkitsRouteChildren: DotToolkitsRouteChildren = {
246 DotToolkitsDottoolkitSlugRoute: DotToolkitsDottoolkitSlugRoute,
247}
248
249const DotToolkitsRouteWithChildren = DotToolkitsRoute._addFileChildren(
250 DotToolkitsRouteChildren,
251)
252
201const rootRouteChildren: RootRouteChildren = {253const rootRouteChildren: RootRouteChildren = {
202 DotPoliciesRoute: DotPoliciesRoute,254 DotPoliciesRoute: DotPoliciesRoute,
203 DotSecretsRoute: DotSecretsRoute,255 DotSecretsRoute: DotSecretsRoute,
256 DotToolkitsRoute: DotToolkitsRouteWithChildren,
204 DotToolsRoute: DotToolsRoute,257 DotToolsRoute: DotToolsRoute,
205 DotIndexRoute: DotIndexRoute,258 DotIndexRoute: DotIndexRoute,
206 DotIntegrationsDotnamespaceRoute: DotIntegrationsDotnamespaceRoute,259 DotIntegrationsDotnamespaceRoute: DotIntegrationsDotnamespaceRoute,
packages/react/src/routes/toolkits-route.tsx+23−0
@@ -0,0 +1,23 @@
1import { notFound } from "@tanstack/react-router";
2import { useClientPlugins } from "@executor-js/sdk/client";
3
4export function ToolkitsPluginRoute(props: { toolkitSlug?: string }) {
5 const plugins = useClientPlugins();
6 const plugin = plugins.find((candidate) => candidate.id === "toolkits");
7 const path = props.toolkitSlug ? `/${props.toolkitSlug}` : "/";
8 const page = plugin?.pages?.find((candidate) =>
9 props.toolkitSlug ? candidate.path === "/$toolkitSlug" : candidate.path === "/",
10 );
11
12 // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: TanStack Router represents not-found from components by throwing notFound()
13 if (!plugin || !page) throw notFound();
14
15 const Component = page.component;
16 return (
17 <Component
18 params={props.toolkitSlug ? { toolkitSlug: props.toolkitSlug } : {}}
19 path={path}
20 pluginId={plugin.id}
21 />
22 );
23}
packages/react/src/routes/toolkits.$toolkitSlug.tsx+12−0
@@ -0,0 +1,12 @@
1import { createFileRoute } from "@tanstack/react-router";
2
3import { ToolkitsPluginRoute } from "./toolkits-route";
4
5export const Route = createFileRoute("/{-$orgSlug}/toolkits/$toolkitSlug")({
6 component: ToolkitsRouteComponent,
7});
8
9function ToolkitsRouteComponent() {
10 const { toolkitSlug } = Route.useParams();
11 return <ToolkitsPluginRoute toolkitSlug={toolkitSlug} />;
12}
packages/react/src/routes/toolkits.tsx+12−0
@@ -0,0 +1,12 @@
1import { createFileRoute, useParams } from "@tanstack/react-router";
2
3import { ToolkitsPluginRoute } from "./toolkits-route";
4
5export const Route = createFileRoute("/{-$orgSlug}/toolkits")({
6 component: ToolkitsRouteComponent,
7});
8
9function ToolkitsRouteComponent() {
10 const { toolkitSlug } = useParams({ strict: false }) as { toolkitSlug?: string };
11 return <ToolkitsPluginRoute toolkitSlug={toolkitSlug} />;
12}