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