@igstack/app-catalog-frontend-core 1.0.0-alpha-20260913172344 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/esm/modules/appCatalog/ui/catalog/AppCatalogGrid.js +1 -1
  2. package/dist/esm/modules/appCatalog/ui/catalog/AppCatalogGrid.js.map +1 -1
  3. package/dist/esm/modules/appCatalog/ui/components/Highlight.js +1 -1
  4. package/dist/esm/modules/appCatalog/ui/components/Highlight.js.map +1 -1
  5. package/dist/esm/modules/appCatalog/ui/components/ViewToggle.d.ts +1 -1
  6. package/dist/esm/modules/appCatalog/ui/components/ViewToggle.js +11 -0
  7. package/dist/esm/modules/appCatalog/ui/components/ViewToggle.js.map +1 -1
  8. package/dist/esm/modules/appCatalog/ui/pages/McpPage.d.ts +11 -0
  9. package/dist/esm/modules/appCatalog/ui/pages/McpPage.js +227 -0
  10. package/dist/esm/modules/appCatalog/ui/pages/McpPage.js.map +1 -0
  11. package/dist/esm/modules/appCatalog/utils/fetchMcpTools.d.ts +32 -0
  12. package/dist/esm/modules/appCatalog/utils/fetchMcpTools.js +79 -0
  13. package/dist/esm/modules/appCatalog/utils/fetchMcpTools.js.map +1 -0
  14. package/dist/esm/modules/appCatalog/utils/highlightText.d.ts +15 -0
  15. package/dist/esm/modules/appCatalog/utils/highlightText.js +30 -0
  16. package/dist/esm/modules/appCatalog/utils/highlightText.js.map +1 -0
  17. package/dist/esm/routeTree.gen.d.ts +18 -3
  18. package/dist/esm/routeTree.gen.js +9 -2
  19. package/dist/esm/routeTree.gen.js.map +1 -1
  20. package/dist/esm/routes/_layout/mcp.d.ts +3 -0
  21. package/dist/esm/routes/_layout/mcp.js +20 -0
  22. package/dist/esm/routes/_layout/mcp.js.map +1 -0
  23. package/package.json +5 -5
  24. package/src/modules/appCatalog/ui/catalog/AppCatalogGrid.tsx +1 -1
  25. package/src/modules/appCatalog/ui/components/Highlight.tsx +1 -1
  26. package/src/modules/appCatalog/ui/components/ViewToggle.tsx +10 -1
  27. package/src/modules/appCatalog/ui/pages/McpPage.tsx +275 -0
  28. package/src/modules/appCatalog/utils/fetchMcpTools.ts +140 -0
  29. package/src/modules/appCatalog/utils/highlightText.ts +51 -0
  30. package/src/routeTree.gen.ts +21 -0
  31. package/src/routes/_layout/mcp.tsx +22 -0
  32. package/dist/esm/__tests__/modules/appCatalog/utils/searchApps.test.d.ts +0 -1
  33. package/dist/esm/modules/appCatalog/utils/searchApps.d.ts +0 -49
  34. package/dist/esm/modules/appCatalog/utils/searchApps.js +0 -144
  35. package/dist/esm/modules/appCatalog/utils/searchApps.js.map +0 -1
  36. package/src/__tests__/modules/appCatalog/utils/searchApps.test.ts +0 -96
  37. package/src/modules/appCatalog/utils/searchApps.ts +0 -266
@@ -0,0 +1,79 @@
1
+ const MCP_ENDPOINT_PATH = "/api/mcp";
2
+ function describeType(prop) {
3
+ var _a, _b;
4
+ const base = Array.isArray(prop.type) ? prop.type.join(" | ") : prop.type;
5
+ if (base === "array") {
6
+ const itemType = Array.isArray((_a = prop.items) == null ? void 0 : _a.type) ? prop.items.type.join(" | ") : (_b = prop.items) == null ? void 0 : _b.type;
7
+ return itemType ? `${itemType}[]` : "array";
8
+ }
9
+ return base;
10
+ }
11
+ function enumValues(prop) {
12
+ var _a;
13
+ const values = prop.enum ?? ((_a = prop.items) == null ? void 0 : _a.enum);
14
+ return (values == null ? void 0 : values.length) ? values.map(String) : void 0;
15
+ }
16
+ function parseBody(contentType, body) {
17
+ if (!contentType.includes("text/event-stream")) {
18
+ return JSON.parse(body);
19
+ }
20
+ const dataLines = body.split(/\r?\n/).filter((line) => line.startsWith("data:")).map((line) => line.slice("data:".length).trim());
21
+ if (dataLines.length === 0) {
22
+ throw new Error("The server returned an empty event stream.");
23
+ }
24
+ return JSON.parse(dataLines.join(""));
25
+ }
26
+ async function fetchMcpTools(origin, signal) {
27
+ var _a;
28
+ const response = await fetch(`${origin}${MCP_ENDPOINT_PATH}`, {
29
+ method: "POST",
30
+ signal,
31
+ headers: {
32
+ "content-type": "application/json",
33
+ // The Streamable HTTP transport requires the client to accept both.
34
+ accept: "application/json, text/event-stream"
35
+ },
36
+ body: JSON.stringify({
37
+ jsonrpc: "2.0",
38
+ id: 1,
39
+ method: "tools/list",
40
+ params: {}
41
+ })
42
+ });
43
+ if (!response.ok) {
44
+ throw new Error(
45
+ `The MCP endpoint answered ${response.status} ${response.statusText}.`
46
+ );
47
+ }
48
+ const payload = parseBody(
49
+ response.headers.get("content-type") ?? "",
50
+ await response.text()
51
+ );
52
+ if (payload.error) {
53
+ throw new Error(
54
+ payload.error.message ?? "The MCP endpoint returned an error."
55
+ );
56
+ }
57
+ return (((_a = payload.result) == null ? void 0 : _a.tools) ?? []).map((tool) => {
58
+ var _a2, _b;
59
+ const properties = ((_a2 = tool.inputSchema) == null ? void 0 : _a2.properties) ?? {};
60
+ const required = new Set(((_b = tool.inputSchema) == null ? void 0 : _b.required) ?? []);
61
+ return {
62
+ name: tool.name,
63
+ title: tool.title,
64
+ description: tool.description,
65
+ parameters: Object.entries(properties).map(([name, prop]) => ({
66
+ name,
67
+ type: describeType(prop),
68
+ required: required.has(name),
69
+ description: prop.description,
70
+ enumValues: enumValues(prop)
71
+ }))
72
+ };
73
+ });
74
+ }
75
+ export {
76
+ MCP_ENDPOINT_PATH,
77
+ fetchMcpTools
78
+ };
79
+ //# sourceMappingURL=fetchMcpTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchMcpTools.js","sources":["../../../../../src/modules/appCatalog/utils/fetchMcpTools.ts"],"sourcesContent":["/**\n * Minimal MCP client for the docs page: one `tools/list` call over Streamable\n * HTTP. Deliberately raw `fetch` rather than the MCP SDK — the page needs one\n * unauthenticated read and nothing else.\n *\n * The endpoint is stateless (a fresh server per request), so `tools/list`\n * stands alone with no `initialize` handshake. It may answer with either JSON\n * or a single SSE event, so both are parsed.\n */\n\nexport interface McpToolParameter {\n name: string\n type?: string\n required: boolean\n description?: string\n enumValues?: string[]\n}\n\nexport interface McpTool {\n name: string\n title?: string\n description?: string\n parameters: McpToolParameter[]\n}\n\n/** Path the MCP server is mounted at, relative to the site origin. */\nexport const MCP_ENDPOINT_PATH = '/api/mcp'\n\ninterface JsonSchemaProperty {\n type?: string | string[]\n description?: string\n enum?: unknown[]\n items?: { type?: string | string[]; enum?: unknown[] }\n}\n\nfunction describeType(prop: JsonSchemaProperty): string | undefined {\n const base = Array.isArray(prop.type) ? prop.type.join(' | ') : prop.type\n if (base === 'array') {\n const itemType = Array.isArray(prop.items?.type)\n ? prop.items.type.join(' | ')\n : prop.items?.type\n return itemType ? `${itemType}[]` : 'array'\n }\n return base\n}\n\nfunction enumValues(prop: JsonSchemaProperty): string[] | undefined {\n const values = prop.enum ?? prop.items?.enum\n return values?.length ? values.map(String) : undefined\n}\n\n/** Pull the single JSON-RPC payload out of a JSON or SSE response body. */\nfunction parseBody(contentType: string, body: string): unknown {\n if (!contentType.includes('text/event-stream')) {\n return JSON.parse(body)\n }\n const dataLines = body\n .split(/\\r?\\n/)\n .filter((line) => line.startsWith('data:'))\n .map((line) => line.slice('data:'.length).trim())\n if (dataLines.length === 0) {\n throw new Error('The server returned an empty event stream.')\n }\n return JSON.parse(dataLines.join(''))\n}\n\n/**\n * Fetch the live tool registry so this page cannot go stale when the tools\n * change.\n *\n * @param origin - Site origin, e.g. `window.location.origin`\n * @param signal - Optional abort signal\n */\nexport async function fetchMcpTools(\n origin: string,\n signal?: AbortSignal,\n): Promise<McpTool[]> {\n const response = await fetch(`${origin}${MCP_ENDPOINT_PATH}`, {\n method: 'POST',\n signal,\n headers: {\n 'content-type': 'application/json',\n // The Streamable HTTP transport requires the client to accept both.\n accept: 'application/json, text/event-stream',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'tools/list',\n params: {},\n }),\n })\n\n if (!response.ok) {\n throw new Error(\n `The MCP endpoint answered ${response.status} ${response.statusText}.`,\n )\n }\n\n const payload = parseBody(\n response.headers.get('content-type') ?? '',\n await response.text(),\n ) as {\n error?: { message?: string }\n result?: {\n tools?: {\n name: string\n title?: string\n description?: string\n inputSchema?: {\n properties?: Record<string, JsonSchemaProperty>\n required?: string[]\n }\n }[]\n }\n }\n\n if (payload.error) {\n throw new Error(\n payload.error.message ?? 'The MCP endpoint returned an error.',\n )\n }\n\n return (payload.result?.tools ?? []).map((tool) => {\n const properties = tool.inputSchema?.properties ?? {}\n const required = new Set(tool.inputSchema?.required ?? [])\n return {\n name: tool.name,\n title: tool.title,\n description: tool.description,\n parameters: Object.entries(properties).map(([name, prop]) => ({\n name,\n type: describeType(prop),\n required: required.has(name),\n description: prop.description,\n enumValues: enumValues(prop),\n })),\n }\n })\n}\n"],"names":["_a"],"mappings":"AA0BO,MAAM,oBAAoB;AASjC,SAAS,aAAa,MAA8C;AAT7D;AAUL,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK;AACrE,MAAI,SAAS,SAAS;AACpB,UAAM,WAAW,MAAM,SAAQ,UAAK,UAAL,mBAAY,IAAI,IAC3C,KAAK,MAAM,KAAK,KAAK,KAAK,KAC1B,UAAK,UAAL,mBAAY;AAChB,WAAO,WAAW,GAAG,QAAQ,OAAO;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAgD;AApB7D;AAqBL,QAAM,SAAS,KAAK,UAAQ,UAAK,UAAL,mBAAY;AACxC,UAAO,iCAAQ,UAAS,OAAO,IAAI,MAAM,IAAI;AAC/C;AAGA,SAAS,UAAU,aAAqB,MAAuB;AAC7D,MAAI,CAAC,YAAY,SAAS,mBAAmB,GAAG;AAC9C,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AACA,QAAM,YAAY,KACf,MAAM,OAAO,EACb,OAAO,CAAC,SAAS,KAAK,WAAW,OAAO,CAAC,EACzC,IAAI,CAAC,SAAS,KAAK,MAAM,QAAQ,MAAM,EAAE,MAAM;AAClD,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO,KAAK,MAAM,UAAU,KAAK,EAAE,CAAC;AACtC;AASA,eAAsB,cACpB,QACA,QACoB;AAlDf;AAmDL,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,GAAG,iBAAiB,IAAI;AAAA,IAC5D,QAAQ;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA;AAAA,MAEhB,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,QAAQ,CAAA;AAAA,IAAC,CACV;AAAA,EAAA,CACF;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,6BAA6B,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAAA;AAAA,EAEvE;AAEA,QAAM,UAAU;AAAA,IACd,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACxC,MAAM,SAAS,KAAA;AAAA,EAAK;AAgBtB,MAAI,QAAQ,OAAO;AACjB,UAAM,IAAI;AAAA,MACR,QAAQ,MAAM,WAAW;AAAA,IAAA;AAAA,EAE7B;AAEA,YAAQ,aAAQ,WAAR,mBAAgB,UAAS,CAAA,GAAI,IAAI,CAAC,SAAS;AAjG9C,QAAAA,KAAA;AAkGH,UAAM,eAAaA,MAAA,KAAK,gBAAL,gBAAAA,IAAkB,eAAc,CAAA;AACnD,UAAM,WAAW,IAAI,MAAI,UAAK,gBAAL,mBAAkB,aAAY,EAAE;AACzD,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,YAAY,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO;AAAA,QAC5D;AAAA,QACA,MAAM,aAAa,IAAI;AAAA,QACvB,UAAU,SAAS,IAAI,IAAI;AAAA,QAC3B,aAAa,KAAK;AAAA,QAClB,YAAY,WAAW,IAAI;AAAA,MAAA,EAC3B;AAAA,IAAA;AAAA,EAEN,CAAC;AACH;"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Render-side helper for the search UI. The ranking engine itself lives in
3
+ * `@igstack/app-catalog-shared-core` so the UI and the MCP server rank
4
+ * identically and cannot drift.
5
+ */
6
+ /**
7
+ * Highlight matching text in a string
8
+ * @param text - Text to highlight
9
+ * @param query - Search query
10
+ * @returns Array of text segments with highlight flags
11
+ */
12
+ export declare function highlightText(text: string, query: string): {
13
+ text: string;
14
+ highlight: boolean;
15
+ }[];
@@ -0,0 +1,30 @@
1
+ function highlightText(text, query) {
2
+ if (!query.trim()) {
3
+ return [{ text, highlight: false }];
4
+ }
5
+ const normalizedQuery = query.trim().toLowerCase();
6
+ const lowerText = text.toLowerCase();
7
+ const index = lowerText.indexOf(normalizedQuery);
8
+ if (index === -1) {
9
+ return [{ text, highlight: false }];
10
+ }
11
+ const segments = [];
12
+ if (index > 0) {
13
+ segments.push({ text: text.slice(0, index), highlight: false });
14
+ }
15
+ segments.push({
16
+ text: text.slice(index, index + normalizedQuery.length),
17
+ highlight: true
18
+ });
19
+ if (index + normalizedQuery.length < text.length) {
20
+ segments.push({
21
+ text: text.slice(index + normalizedQuery.length),
22
+ highlight: false
23
+ });
24
+ }
25
+ return segments;
26
+ }
27
+ export {
28
+ highlightText
29
+ };
30
+ //# sourceMappingURL=highlightText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlightText.js","sources":["../../../../../src/modules/appCatalog/utils/highlightText.ts"],"sourcesContent":["/**\n * Render-side helper for the search UI. The ranking engine itself lives in\n * `@igstack/app-catalog-shared-core` so the UI and the MCP server rank\n * identically and cannot drift.\n */\n\n/**\n * Highlight matching text in a string\n * @param text - Text to highlight\n * @param query - Search query\n * @returns Array of text segments with highlight flags\n */\nexport function highlightText(\n text: string,\n query: string,\n): { text: string; highlight: boolean }[] {\n if (!query.trim()) {\n return [{ text, highlight: false }]\n }\n\n const normalizedQuery = query.trim().toLowerCase()\n const lowerText = text.toLowerCase()\n const index = lowerText.indexOf(normalizedQuery)\n\n if (index === -1) {\n return [{ text, highlight: false }]\n }\n\n const segments: { text: string; highlight: boolean }[] = []\n\n // Text before match\n if (index > 0) {\n segments.push({ text: text.slice(0, index), highlight: false })\n }\n\n // Matched text\n segments.push({\n text: text.slice(index, index + normalizedQuery.length),\n highlight: true,\n })\n\n // Text after match\n if (index + normalizedQuery.length < text.length) {\n segments.push({\n text: text.slice(index + normalizedQuery.length),\n highlight: false,\n })\n }\n\n return segments\n}\n"],"names":[],"mappings":"AAYO,SAAS,cACd,MACA,OACwC;AACxC,MAAI,CAAC,MAAM,QAAQ;AACjB,WAAO,CAAC,EAAE,MAAM,WAAW,OAAO;AAAA,EACpC;AAEA,QAAM,kBAAkB,MAAM,KAAA,EAAO,YAAA;AACrC,QAAM,YAAY,KAAK,YAAA;AACvB,QAAM,QAAQ,UAAU,QAAQ,eAAe;AAE/C,MAAI,UAAU,IAAI;AAChB,WAAO,CAAC,EAAE,MAAM,WAAW,OAAO;AAAA,EACpC;AAEA,QAAM,WAAmD,CAAA;AAGzD,MAAI,QAAQ,GAAG;AACb,aAAS,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,KAAK,GAAG,WAAW,OAAO;AAAA,EAChE;AAGA,WAAS,KAAK;AAAA,IACZ,MAAM,KAAK,MAAM,OAAO,QAAQ,gBAAgB,MAAM;AAAA,IACtD,WAAW;AAAA,EAAA,CACZ;AAGD,MAAI,QAAQ,gBAAgB,SAAS,KAAK,QAAQ;AAChD,aAAS,KAAK;AAAA,MACZ,MAAM,KAAK,MAAM,QAAQ,gBAAgB,MAAM;AAAA,MAC/C,WAAW;AAAA,IAAA,CACZ;AAAA,EACH;AAEA,SAAO;AACT;"}
@@ -3,6 +3,7 @@ import { Route as LayoutRouteImport } from './routes/_layout.js';
3
3
  import { Route as LayoutIndexRouteImport } from './routes/_layout/index.js';
4
4
  import { Route as AuthCallbackRouteImport } from './routes/auth.callback';
5
5
  import { Route as LayoutServiceDesksRouteImport } from './routes/_layout/service-desks.js';
6
+ import { Route as LayoutMcpRouteImport } from './routes/_layout/mcp.js';
6
7
  import { Route as LayoutLoginRouteImport } from './routes/_layout/login.js';
7
8
  import { Route as LayoutAppSlugRouteImport } from './routes/_layout/app.$slug';
8
9
  import { Route as LayoutCatalogAppsIndexRouteImport } from './routes/_layout/catalog.apps.index';
@@ -23,6 +24,9 @@ declare const LayoutServiceDesksRoute: import('@tanstack/router-core').Route<imp
23
24
  }, import('zod/v4/core').$strip>, import('@tanstack/router-core').ResolveParams<"/service-desks">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, () => Promise<{
24
25
  appCatalogLoader: import('./modules/appCatalog/routeLoader.js').AppCatalogLoaderReturn;
25
26
  }>, unknown, unknown, unknown, unknown, undefined>;
27
+ declare const LayoutMcpRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('./types/types.js').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/mcp", "/mcp", "/_layout/mcp", "/_layout/mcp", undefined, import('@tanstack/router-core').ResolveParams<"/mcp">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, () => Promise<{
28
+ appCatalogLoader: import('./modules/appCatalog/routeLoader.js').AppCatalogLoaderReturn;
29
+ }>, unknown, unknown, unknown, unknown, undefined>;
26
30
  declare const LayoutLoginRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('./types/types.js').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/login", "/login", "/_layout/login", "/_layout/login", undefined, import('@tanstack/router-core').ResolveParams<"/login">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
27
31
  declare const LayoutAppSlugRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('./types/types.js').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/app/$slug", "/app/$slug", "/_layout/app/$slug", "/_layout/app/$slug", import('zod').ZodObject<{
28
32
  filterTag: import('zod').ZodOptional<import('zod').ZodString>;
@@ -48,6 +52,7 @@ declare const LayoutAppSlugSubSubSlugRoute: import('@tanstack/router-core').Rout
48
52
  export interface FileRoutesByFullPath {
49
53
  '/': typeof LayoutIndexRoute;
50
54
  '/login': typeof LayoutLoginRoute;
55
+ '/mcp': typeof LayoutMcpRoute;
51
56
  '/service-desks': typeof LayoutServiceDesksRoute;
52
57
  '/auth/callback': typeof AuthCallbackRoute;
53
58
  '/app/$slug': typeof LayoutAppSlugRoute;
@@ -56,6 +61,7 @@ export interface FileRoutesByFullPath {
56
61
  }
57
62
  export interface FileRoutesByTo {
58
63
  '/login': typeof LayoutLoginRoute;
64
+ '/mcp': typeof LayoutMcpRoute;
59
65
  '/service-desks': typeof LayoutServiceDesksRoute;
60
66
  '/auth/callback': typeof AuthCallbackRoute;
61
67
  '/': typeof LayoutIndexRoute;
@@ -67,6 +73,7 @@ export interface FileRoutesById {
67
73
  __root__: typeof rootRouteImport;
68
74
  '/_layout': typeof LayoutRouteWithChildren;
69
75
  '/_layout/login': typeof LayoutLoginRoute;
76
+ '/_layout/mcp': typeof LayoutMcpRoute;
70
77
  '/_layout/service-desks': typeof LayoutServiceDesksRoute;
71
78
  '/auth/callback': typeof AuthCallbackRoute;
72
79
  '/_layout/': typeof LayoutIndexRoute;
@@ -76,10 +83,10 @@ export interface FileRoutesById {
76
83
  }
77
84
  export interface FileRouteTypes {
78
85
  fileRoutesByFullPath: FileRoutesByFullPath;
79
- fullPaths: '/' | '/login' | '/service-desks' | '/auth/callback' | '/app/$slug' | '/catalog/apps/' | '/app/$slug/sub/$subSlug';
86
+ fullPaths: '/' | '/login' | '/mcp' | '/service-desks' | '/auth/callback' | '/app/$slug' | '/catalog/apps/' | '/app/$slug/sub/$subSlug';
80
87
  fileRoutesByTo: FileRoutesByTo;
81
- to: '/login' | '/service-desks' | '/auth/callback' | '/' | '/app/$slug' | '/catalog/apps' | '/app/$slug/sub/$subSlug';
82
- id: '__root__' | '/_layout' | '/_layout/login' | '/_layout/service-desks' | '/auth/callback' | '/_layout/' | '/_layout/app/$slug' | '/_layout/catalog/apps/' | '/_layout/app/$slug_/sub/$subSlug';
88
+ to: '/login' | '/mcp' | '/service-desks' | '/auth/callback' | '/' | '/app/$slug' | '/catalog/apps' | '/app/$slug/sub/$subSlug';
89
+ id: '__root__' | '/_layout' | '/_layout/login' | '/_layout/mcp' | '/_layout/service-desks' | '/auth/callback' | '/_layout/' | '/_layout/app/$slug' | '/_layout/catalog/apps/' | '/_layout/app/$slug_/sub/$subSlug';
83
90
  fileRoutesById: FileRoutesById;
84
91
  }
85
92
  export interface RootRouteChildren {
@@ -116,6 +123,13 @@ declare module '@tanstack/react-router' {
116
123
  preLoaderRoute: typeof LayoutServiceDesksRouteImport;
117
124
  parentRoute: typeof LayoutRoute;
118
125
  };
126
+ '/_layout/mcp': {
127
+ id: '/_layout/mcp';
128
+ path: '/mcp';
129
+ fullPath: '/mcp';
130
+ preLoaderRoute: typeof LayoutMcpRouteImport;
131
+ parentRoute: typeof LayoutRoute;
132
+ };
119
133
  '/_layout/login': {
120
134
  id: '/_layout/login';
121
135
  path: '/login';
@@ -148,6 +162,7 @@ declare module '@tanstack/react-router' {
148
162
  }
149
163
  interface LayoutRouteChildren {
150
164
  LayoutLoginRoute: typeof LayoutLoginRoute;
165
+ LayoutMcpRoute: typeof LayoutMcpRoute;
151
166
  LayoutServiceDesksRoute: typeof LayoutServiceDesksRoute;
152
167
  LayoutIndexRoute: typeof LayoutIndexRoute;
153
168
  LayoutAppSlugRoute: typeof LayoutAppSlugRoute;
@@ -3,7 +3,8 @@ import { Route as Route$2 } from "./routes/_layout.js";
3
3
  import { Route as Route$6 } from "./routes/_layout/index.js";
4
4
  import { Route as Route$1 } from "./routes/auth.callback.js";
5
5
  import { Route as Route$7 } from "./routes/_layout/service-desks.js";
6
- import { Route as Route$8 } from "./routes/_layout/login.js";
6
+ import { Route as Route$8 } from "./routes/_layout/mcp.js";
7
+ import { Route as Route$9 } from "./routes/_layout/login.js";
7
8
  import { Route as Route$5 } from "./routes/_layout/app._slug.js";
8
9
  import { Route as Route$4 } from "./routes/_layout/catalog.apps.index.js";
9
10
  import { Route as Route$3 } from "./routes/_layout/app._slug_.sub._subSlug.js";
@@ -26,7 +27,12 @@ const LayoutServiceDesksRoute = Route$7.update({
26
27
  path: "/service-desks",
27
28
  getParentRoute: () => LayoutRoute
28
29
  });
29
- const LayoutLoginRoute = Route$8.update({
30
+ const LayoutMcpRoute = Route$8.update({
31
+ id: "/mcp",
32
+ path: "/mcp",
33
+ getParentRoute: () => LayoutRoute
34
+ });
35
+ const LayoutLoginRoute = Route$9.update({
30
36
  id: "/login",
31
37
  path: "/login",
32
38
  getParentRoute: () => LayoutRoute
@@ -48,6 +54,7 @@ const LayoutAppSlugSubSubSlugRoute = Route$3.update({
48
54
  });
49
55
  const LayoutRouteChildren = {
50
56
  LayoutLoginRoute,
57
+ LayoutMcpRoute,
51
58
  LayoutServiceDesksRoute,
52
59
  LayoutIndexRoute,
53
60
  LayoutAppSlugRoute,
@@ -1 +1 @@
1
- {"version":3,"file":"routeTree.gen.js","sources":["../../src/routeTree.gen.ts"],"sourcesContent":["/* eslint-disable */\n\n// @ts-nocheck\n\n// noinspection JSUnusedGlobalSymbols\n\n// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.\n\nimport { Route as rootRouteImport } from './routes/__root'\nimport { Route as LayoutRouteImport } from './routes/_layout'\nimport { Route as LayoutIndexRouteImport } from './routes/_layout/index'\nimport { Route as AuthCallbackRouteImport } from './routes/auth.callback'\nimport { Route as LayoutServiceDesksRouteImport } from './routes/_layout/service-desks'\nimport { Route as LayoutLoginRouteImport } from './routes/_layout/login'\nimport { Route as LayoutAppSlugRouteImport } from './routes/_layout/app.$slug'\nimport { Route as LayoutCatalogAppsIndexRouteImport } from './routes/_layout/catalog.apps.index'\nimport { Route as LayoutAppSlugSubSubSlugRouteImport } from './routes/_layout/app.$slug_.sub.$subSlug'\n\nconst LayoutRoute = LayoutRouteImport.update({\n id: '/_layout',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst LayoutIndexRoute = LayoutIndexRouteImport.update({\n id: '/',\n path: '/',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst AuthCallbackRoute = AuthCallbackRouteImport.update({\n id: '/auth/callback',\n path: '/auth/callback',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst LayoutServiceDesksRoute = LayoutServiceDesksRouteImport.update({\n id: '/service-desks',\n path: '/service-desks',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutLoginRoute = LayoutLoginRouteImport.update({\n id: '/login',\n path: '/login',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutAppSlugRoute = LayoutAppSlugRouteImport.update({\n id: '/app/$slug',\n path: '/app/$slug',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutCatalogAppsIndexRoute = LayoutCatalogAppsIndexRouteImport.update({\n id: '/catalog/apps/',\n path: '/catalog/apps/',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutAppSlugSubSubSlugRoute = LayoutAppSlugSubSubSlugRouteImport.update({\n id: '/app/$slug_/sub/$subSlug',\n path: '/app/$slug/sub/$subSlug',\n getParentRoute: () => LayoutRoute,\n} as any)\n\nexport interface FileRoutesByFullPath {\n '/': typeof LayoutIndexRoute\n '/login': typeof LayoutLoginRoute\n '/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/app/$slug': typeof LayoutAppSlugRoute\n '/catalog/apps/': typeof LayoutCatalogAppsIndexRoute\n '/app/$slug/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRoutesByTo {\n '/login': typeof LayoutLoginRoute\n '/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/': typeof LayoutIndexRoute\n '/app/$slug': typeof LayoutAppSlugRoute\n '/catalog/apps': typeof LayoutCatalogAppsIndexRoute\n '/app/$slug/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRoutesById {\n __root__: typeof rootRouteImport\n '/_layout': typeof LayoutRouteWithChildren\n '/_layout/login': typeof LayoutLoginRoute\n '/_layout/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/_layout/': typeof LayoutIndexRoute\n '/_layout/app/$slug': typeof LayoutAppSlugRoute\n '/_layout/catalog/apps/': typeof LayoutCatalogAppsIndexRoute\n '/_layout/app/$slug_/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRouteTypes {\n fileRoutesByFullPath: FileRoutesByFullPath\n fullPaths:\n | '/'\n | '/login'\n | '/service-desks'\n | '/auth/callback'\n | '/app/$slug'\n | '/catalog/apps/'\n | '/app/$slug/sub/$subSlug'\n fileRoutesByTo: FileRoutesByTo\n to:\n | '/login'\n | '/service-desks'\n | '/auth/callback'\n | '/'\n | '/app/$slug'\n | '/catalog/apps'\n | '/app/$slug/sub/$subSlug'\n id:\n | '__root__'\n | '/_layout'\n | '/_layout/login'\n | '/_layout/service-desks'\n | '/auth/callback'\n | '/_layout/'\n | '/_layout/app/$slug'\n | '/_layout/catalog/apps/'\n | '/_layout/app/$slug_/sub/$subSlug'\n fileRoutesById: FileRoutesById\n}\nexport interface RootRouteChildren {\n LayoutRoute: typeof LayoutRouteWithChildren\n AuthCallbackRoute: typeof AuthCallbackRoute\n}\n\ndeclare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n '/_layout': {\n id: '/_layout'\n path: ''\n fullPath: '/'\n preLoaderRoute: typeof LayoutRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/_layout/': {\n id: '/_layout/'\n path: '/'\n fullPath: '/'\n preLoaderRoute: typeof LayoutIndexRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/auth/callback': {\n id: '/auth/callback'\n path: '/auth/callback'\n fullPath: '/auth/callback'\n preLoaderRoute: typeof AuthCallbackRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/_layout/service-desks': {\n id: '/_layout/service-desks'\n path: '/service-desks'\n fullPath: '/service-desks'\n preLoaderRoute: typeof LayoutServiceDesksRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/login': {\n id: '/_layout/login'\n path: '/login'\n fullPath: '/login'\n preLoaderRoute: typeof LayoutLoginRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/app/$slug': {\n id: '/_layout/app/$slug'\n path: '/app/$slug'\n fullPath: '/app/$slug'\n preLoaderRoute: typeof LayoutAppSlugRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/catalog/apps/': {\n id: '/_layout/catalog/apps/'\n path: '/catalog/apps'\n fullPath: '/catalog/apps/'\n preLoaderRoute: typeof LayoutCatalogAppsIndexRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/app/$slug_/sub/$subSlug': {\n id: '/_layout/app/$slug_/sub/$subSlug'\n path: '/app/$slug/sub/$subSlug'\n fullPath: '/app/$slug/sub/$subSlug'\n preLoaderRoute: typeof LayoutAppSlugSubSubSlugRouteImport\n parentRoute: typeof LayoutRoute\n }\n }\n}\n\ninterface LayoutRouteChildren {\n LayoutLoginRoute: typeof LayoutLoginRoute\n LayoutServiceDesksRoute: typeof LayoutServiceDesksRoute\n LayoutIndexRoute: typeof LayoutIndexRoute\n LayoutAppSlugRoute: typeof LayoutAppSlugRoute\n LayoutCatalogAppsIndexRoute: typeof LayoutCatalogAppsIndexRoute\n LayoutAppSlugSubSubSlugRoute: typeof LayoutAppSlugSubSubSlugRoute\n}\n\nconst LayoutRouteChildren: LayoutRouteChildren = {\n LayoutLoginRoute: LayoutLoginRoute,\n LayoutServiceDesksRoute: LayoutServiceDesksRoute,\n LayoutIndexRoute: LayoutIndexRoute,\n LayoutAppSlugRoute: LayoutAppSlugRoute,\n LayoutCatalogAppsIndexRoute: LayoutCatalogAppsIndexRoute,\n LayoutAppSlugSubSubSlugRoute: LayoutAppSlugSubSubSlugRoute,\n}\n\nconst LayoutRouteWithChildren =\n LayoutRoute._addFileChildren(LayoutRouteChildren)\n\nconst rootRouteChildren: RootRouteChildren = {\n LayoutRoute: LayoutRouteWithChildren,\n AuthCallbackRoute: AuthCallbackRoute,\n}\nexport const routeTree = rootRouteImport\n ._addFileChildren(rootRouteChildren)\n ._addFileTypes<FileRouteTypes>()\n"],"names":["LayoutRouteImport","rootRouteImport","LayoutIndexRouteImport","AuthCallbackRouteImport","LayoutServiceDesksRouteImport","LayoutLoginRouteImport","LayoutAppSlugRouteImport","LayoutCatalogAppsIndexRouteImport","LayoutAppSlugSubSubSlugRouteImport"],"mappings":";;;;;;;;;AAoBA,MAAM,cAAcA,QAAkB,OAAO;AAAA,EAC3C,IAAI;AAAA,EACJ,gBAAgB,MAAMC;AACxB,CAAQ;AACR,MAAM,mBAAmBC,QAAuB,OAAO;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,oBAAoBC,QAAwB,OAAO;AAAA,EACvD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAMF;AACxB,CAAQ;AACR,MAAM,0BAA0BG,QAA8B,OAAO;AAAA,EACnE,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,mBAAmBC,QAAuB,OAAO;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,qBAAqBC,QAAyB,OAAO;AAAA,EACzD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,8BAA8BC,QAAkC,OAAO;AAAA,EAC3E,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,+BAA+BC,QAAmC,OAAO;AAAA,EAC7E,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AAyIR,MAAM,sBAA2C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,0BACJ,YAAY,iBAAiB,mBAAmB;AAElD,MAAM,oBAAuC;AAAA,EAC3C,aAAa;AAAA,EACb;AACF;AACO,MAAM,YAAYP,MACtB,iBAAiB,iBAAiB,EAClC,cAAA;"}
1
+ {"version":3,"file":"routeTree.gen.js","sources":["../../src/routeTree.gen.ts"],"sourcesContent":["/* eslint-disable */\n\n// @ts-nocheck\n\n// noinspection JSUnusedGlobalSymbols\n\n// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.\n\nimport { Route as rootRouteImport } from './routes/__root'\nimport { Route as LayoutRouteImport } from './routes/_layout'\nimport { Route as LayoutIndexRouteImport } from './routes/_layout/index'\nimport { Route as AuthCallbackRouteImport } from './routes/auth.callback'\nimport { Route as LayoutServiceDesksRouteImport } from './routes/_layout/service-desks'\nimport { Route as LayoutMcpRouteImport } from './routes/_layout/mcp'\nimport { Route as LayoutLoginRouteImport } from './routes/_layout/login'\nimport { Route as LayoutAppSlugRouteImport } from './routes/_layout/app.$slug'\nimport { Route as LayoutCatalogAppsIndexRouteImport } from './routes/_layout/catalog.apps.index'\nimport { Route as LayoutAppSlugSubSubSlugRouteImport } from './routes/_layout/app.$slug_.sub.$subSlug'\n\nconst LayoutRoute = LayoutRouteImport.update({\n id: '/_layout',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst LayoutIndexRoute = LayoutIndexRouteImport.update({\n id: '/',\n path: '/',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst AuthCallbackRoute = AuthCallbackRouteImport.update({\n id: '/auth/callback',\n path: '/auth/callback',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst LayoutServiceDesksRoute = LayoutServiceDesksRouteImport.update({\n id: '/service-desks',\n path: '/service-desks',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutMcpRoute = LayoutMcpRouteImport.update({\n id: '/mcp',\n path: '/mcp',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutLoginRoute = LayoutLoginRouteImport.update({\n id: '/login',\n path: '/login',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutAppSlugRoute = LayoutAppSlugRouteImport.update({\n id: '/app/$slug',\n path: '/app/$slug',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutCatalogAppsIndexRoute = LayoutCatalogAppsIndexRouteImport.update({\n id: '/catalog/apps/',\n path: '/catalog/apps/',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutAppSlugSubSubSlugRoute = LayoutAppSlugSubSubSlugRouteImport.update({\n id: '/app/$slug_/sub/$subSlug',\n path: '/app/$slug/sub/$subSlug',\n getParentRoute: () => LayoutRoute,\n} as any)\n\nexport interface FileRoutesByFullPath {\n '/': typeof LayoutIndexRoute\n '/login': typeof LayoutLoginRoute\n '/mcp': typeof LayoutMcpRoute\n '/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/app/$slug': typeof LayoutAppSlugRoute\n '/catalog/apps/': typeof LayoutCatalogAppsIndexRoute\n '/app/$slug/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRoutesByTo {\n '/login': typeof LayoutLoginRoute\n '/mcp': typeof LayoutMcpRoute\n '/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/': typeof LayoutIndexRoute\n '/app/$slug': typeof LayoutAppSlugRoute\n '/catalog/apps': typeof LayoutCatalogAppsIndexRoute\n '/app/$slug/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRoutesById {\n __root__: typeof rootRouteImport\n '/_layout': typeof LayoutRouteWithChildren\n '/_layout/login': typeof LayoutLoginRoute\n '/_layout/mcp': typeof LayoutMcpRoute\n '/_layout/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/_layout/': typeof LayoutIndexRoute\n '/_layout/app/$slug': typeof LayoutAppSlugRoute\n '/_layout/catalog/apps/': typeof LayoutCatalogAppsIndexRoute\n '/_layout/app/$slug_/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRouteTypes {\n fileRoutesByFullPath: FileRoutesByFullPath\n fullPaths:\n | '/'\n | '/login'\n | '/mcp'\n | '/service-desks'\n | '/auth/callback'\n | '/app/$slug'\n | '/catalog/apps/'\n | '/app/$slug/sub/$subSlug'\n fileRoutesByTo: FileRoutesByTo\n to:\n | '/login'\n | '/mcp'\n | '/service-desks'\n | '/auth/callback'\n | '/'\n | '/app/$slug'\n | '/catalog/apps'\n | '/app/$slug/sub/$subSlug'\n id:\n | '__root__'\n | '/_layout'\n | '/_layout/login'\n | '/_layout/mcp'\n | '/_layout/service-desks'\n | '/auth/callback'\n | '/_layout/'\n | '/_layout/app/$slug'\n | '/_layout/catalog/apps/'\n | '/_layout/app/$slug_/sub/$subSlug'\n fileRoutesById: FileRoutesById\n}\nexport interface RootRouteChildren {\n LayoutRoute: typeof LayoutRouteWithChildren\n AuthCallbackRoute: typeof AuthCallbackRoute\n}\n\ndeclare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n '/_layout': {\n id: '/_layout'\n path: ''\n fullPath: '/'\n preLoaderRoute: typeof LayoutRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/_layout/': {\n id: '/_layout/'\n path: '/'\n fullPath: '/'\n preLoaderRoute: typeof LayoutIndexRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/auth/callback': {\n id: '/auth/callback'\n path: '/auth/callback'\n fullPath: '/auth/callback'\n preLoaderRoute: typeof AuthCallbackRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/_layout/service-desks': {\n id: '/_layout/service-desks'\n path: '/service-desks'\n fullPath: '/service-desks'\n preLoaderRoute: typeof LayoutServiceDesksRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/mcp': {\n id: '/_layout/mcp'\n path: '/mcp'\n fullPath: '/mcp'\n preLoaderRoute: typeof LayoutMcpRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/login': {\n id: '/_layout/login'\n path: '/login'\n fullPath: '/login'\n preLoaderRoute: typeof LayoutLoginRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/app/$slug': {\n id: '/_layout/app/$slug'\n path: '/app/$slug'\n fullPath: '/app/$slug'\n preLoaderRoute: typeof LayoutAppSlugRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/catalog/apps/': {\n id: '/_layout/catalog/apps/'\n path: '/catalog/apps'\n fullPath: '/catalog/apps/'\n preLoaderRoute: typeof LayoutCatalogAppsIndexRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/app/$slug_/sub/$subSlug': {\n id: '/_layout/app/$slug_/sub/$subSlug'\n path: '/app/$slug/sub/$subSlug'\n fullPath: '/app/$slug/sub/$subSlug'\n preLoaderRoute: typeof LayoutAppSlugSubSubSlugRouteImport\n parentRoute: typeof LayoutRoute\n }\n }\n}\n\ninterface LayoutRouteChildren {\n LayoutLoginRoute: typeof LayoutLoginRoute\n LayoutMcpRoute: typeof LayoutMcpRoute\n LayoutServiceDesksRoute: typeof LayoutServiceDesksRoute\n LayoutIndexRoute: typeof LayoutIndexRoute\n LayoutAppSlugRoute: typeof LayoutAppSlugRoute\n LayoutCatalogAppsIndexRoute: typeof LayoutCatalogAppsIndexRoute\n LayoutAppSlugSubSubSlugRoute: typeof LayoutAppSlugSubSubSlugRoute\n}\n\nconst LayoutRouteChildren: LayoutRouteChildren = {\n LayoutLoginRoute: LayoutLoginRoute,\n LayoutMcpRoute: LayoutMcpRoute,\n LayoutServiceDesksRoute: LayoutServiceDesksRoute,\n LayoutIndexRoute: LayoutIndexRoute,\n LayoutAppSlugRoute: LayoutAppSlugRoute,\n LayoutCatalogAppsIndexRoute: LayoutCatalogAppsIndexRoute,\n LayoutAppSlugSubSubSlugRoute: LayoutAppSlugSubSubSlugRoute,\n}\n\nconst LayoutRouteWithChildren =\n LayoutRoute._addFileChildren(LayoutRouteChildren)\n\nconst rootRouteChildren: RootRouteChildren = {\n LayoutRoute: LayoutRouteWithChildren,\n AuthCallbackRoute: AuthCallbackRoute,\n}\nexport const routeTree = rootRouteImport\n ._addFileChildren(rootRouteChildren)\n ._addFileTypes<FileRouteTypes>()\n"],"names":["LayoutRouteImport","rootRouteImport","LayoutIndexRouteImport","AuthCallbackRouteImport","LayoutServiceDesksRouteImport","LayoutMcpRouteImport","LayoutLoginRouteImport","LayoutAppSlugRouteImport","LayoutCatalogAppsIndexRouteImport","LayoutAppSlugSubSubSlugRouteImport"],"mappings":";;;;;;;;;;AAqBA,MAAM,cAAcA,QAAkB,OAAO;AAAA,EAC3C,IAAI;AAAA,EACJ,gBAAgB,MAAMC;AACxB,CAAQ;AACR,MAAM,mBAAmBC,QAAuB,OAAO;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,oBAAoBC,QAAwB,OAAO;AAAA,EACvD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAMF;AACxB,CAAQ;AACR,MAAM,0BAA0BG,QAA8B,OAAO;AAAA,EACnE,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,iBAAiBC,QAAqB,OAAO;AAAA,EACjD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,mBAAmBC,QAAuB,OAAO;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,qBAAqBC,QAAyB,OAAO;AAAA,EACzD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,8BAA8BC,QAAkC,OAAO;AAAA,EAC3E,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,+BAA+BC,QAAmC,OAAO;AAAA,EAC7E,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AAuJR,MAAM,sBAA2C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,0BACJ,YAAY,iBAAiB,mBAAmB;AAElD,MAAM,oBAAuC;AAAA,EAC3C,aAAa;AAAA,EACb;AACF;AACO,MAAM,YAAYR,MACtB,iBAAiB,iBAAiB,EAClC,cAAA;"}
@@ -0,0 +1,3 @@
1
+ export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../../types/types.js').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/mcp", "/mcp", "/_layout/mcp", "/_layout/mcp", undefined, import('@tanstack/router-core').ResolveParams<"/mcp">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, () => Promise<{
2
+ appCatalogLoader: import('~/modules/appCatalog/routeLoader').AppCatalogLoaderReturn;
3
+ }>, unknown, unknown, unknown, unknown, undefined>;
@@ -0,0 +1,20 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { createFileRoute } from "@tanstack/react-router";
3
+ import { appCatalogRouteLoader } from "../../modules/appCatalog/routeLoader.js";
4
+ import { AppCatalogLayout } from "../../modules/appCatalog/ui/layout/AppCatalogLayout.js";
5
+ import { McpPage } from "../../modules/appCatalog/ui/pages/McpPage.js";
6
+ const Route = createFileRoute("/_layout/mcp")({
7
+ component: RouteComponent,
8
+ async loader() {
9
+ const appCatalogLoader = await appCatalogRouteLoader();
10
+ return { appCatalogLoader };
11
+ }
12
+ });
13
+ function RouteComponent() {
14
+ const { queryClient, trpcClient } = Route.useRouteContext();
15
+ return /* @__PURE__ */ jsx(AppCatalogLayout, { queryClient, trpcClient, children: /* @__PURE__ */ jsx(McpPage, {}) });
16
+ }
17
+ export {
18
+ Route
19
+ };
20
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sources":["../../../../src/routes/_layout/mcp.tsx"],"sourcesContent":["import { createFileRoute } from '@tanstack/react-router'\nimport { appCatalogRouteLoader } from '~/modules/appCatalog/routeLoader'\nimport { AppCatalogLayout } from '~/modules/appCatalog/ui/layout/AppCatalogLayout'\nimport { McpPage } from '~/modules/appCatalog/ui/pages/McpPage'\n\nexport const Route = createFileRoute('/_layout/mcp')({\n component: RouteComponent,\n async loader() {\n const appCatalogLoader = await appCatalogRouteLoader()\n return { appCatalogLoader }\n },\n})\n\nfunction RouteComponent() {\n const { queryClient, trpcClient } = Route.useRouteContext()\n\n return (\n <AppCatalogLayout queryClient={queryClient} trpcClient={trpcClient}>\n <McpPage />\n </AppCatalogLayout>\n )\n}\n"],"names":[],"mappings":";;;;;AAKO,MAAM,QAAQ,gBAAgB,cAAc,EAAE;AAAA,EACnD,WAAW;AAAA,EACX,MAAM,SAAS;AACb,UAAM,mBAAmB,MAAM,sBAAA;AAC/B,WAAO,EAAE,iBAAA;AAAA,EACX;AACF,CAAC;AAED,SAAS,iBAAiB;AACxB,QAAM,EAAE,aAAa,eAAe,MAAM,gBAAA;AAE1C,6BACG,kBAAA,EAAiB,aAA0B,YAC1C,UAAA,oBAAC,WAAQ,GACX;AAEJ;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igstack/app-catalog-frontend-core",
3
- "version": "1.0.0-alpha-20260913172344",
3
+ "version": "1.0.0",
4
4
  "description": "Frontend core library for App Catalog",
5
5
  "homepage": "https://github.com/lislon/app-catalog",
6
6
  "repository": {
@@ -112,7 +112,8 @@
112
112
  "tailwind-merge": "^3.3.1",
113
113
  "tailwindcss": "^4.1.7",
114
114
  "tiptap-markdown": "^0.8.0",
115
- "tslib": "^2.3.0"
115
+ "tslib": "^2.3.0",
116
+ "@igstack/app-catalog-shared-core": "1.0.0"
116
117
  },
117
118
  "devDependencies": {
118
119
  "@tailwindcss/vite": "^4.0.5",
@@ -139,8 +140,7 @@
139
140
  "vite-plugin-static-copy": "^3.1.4",
140
141
  "vite-plugin-svgr": "^4.2.0",
141
142
  "vitest": "^4.1.2",
142
- "@igstack/app-catalog-backend-core": "1.0.0-alpha-20260913172344",
143
- "@igstack/app-catalog-shared-core": "1.0.0-alpha-20260913172344"
143
+ "@igstack/app-catalog-backend-core": "1.0.0"
144
144
  },
145
145
  "peerDependencies": {
146
146
  "react": "19.1.2",
@@ -149,7 +149,7 @@
149
149
  "vite": "^6.3.5",
150
150
  "vite-plugin-svgr": "^4.2.0"
151
151
  },
152
- "gitHead": "8203a6980bcd00fcb50dfc9a04408997a69f3130",
152
+ "gitHead": "b069fee9b87a2a3b3b5b3287698f1d71bd0820a7",
153
153
  "scripts": {
154
154
  "build": "vite build",
155
155
  "build:lenient": "vite build --mode lenient",
@@ -7,7 +7,7 @@ import { markdownToPlainText } from '../../utils/markdownToPlainText'
7
7
  import { pickNewThisWeek } from '../../utils/launcherHelpers'
8
8
  import { AttributionFooter } from './AttributionFooter'
9
9
  import { ResourceIcon } from './ResourceIcon'
10
- import { searchResources } from '../../utils/searchApps'
10
+ import { searchResources } from '@igstack/app-catalog-shared-core'
11
11
  import { Highlight } from '../components/Highlight'
12
12
 
13
13
  /**
@@ -1,4 +1,4 @@
1
- import { highlightText } from '../../utils/searchApps'
1
+ import { highlightText } from '../../utils/highlightText'
2
2
 
3
3
  /**
4
4
  * Highlights all case-insensitive occurrences of `query` in `text`.
@@ -2,7 +2,7 @@ import { Link, useRouterState } from '@tanstack/react-router'
2
2
  import { cn } from '~/lib/utils'
3
3
 
4
4
  /**
5
- * Compact segmented toggle for the header (Apps | Service Desks). Rendered in
5
+ * Compact segmented toggle for the header (Apps | Service Desks | MCP). Rendered in
6
6
  * the header's `middle` slot so it adds no header height. Uses router Links so
7
7
  * each segment is deep-linkable.
8
8
  *
@@ -17,6 +17,7 @@ export function ViewToggle() {
17
17
 
18
18
  const appsActive = pathname === '/' || pathname.startsWith('/app/')
19
19
  const desksActive = pathname.startsWith('/service-desks')
20
+ const mcpActive = pathname.startsWith('/mcp')
20
21
 
21
22
  const segment =
22
23
  'inline-flex items-center rounded-md px-3 py-1 text-sm font-medium transition-colors'
@@ -45,6 +46,14 @@ export function ViewToggle() {
45
46
  >
46
47
  Service Desks
47
48
  </Link>
49
+ <Link
50
+ to="/mcp"
51
+ aria-label="MCP"
52
+ aria-current={mcpActive ? 'page' : undefined}
53
+ className={cn(segment, mcpActive ? active : inactive)}
54
+ >
55
+ MCP
56
+ </Link>
48
57
  </div>
49
58
  )
50
59
  }