@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.
- package/dist/esm/modules/appCatalog/ui/catalog/AppCatalogGrid.js +1 -1
- package/dist/esm/modules/appCatalog/ui/catalog/AppCatalogGrid.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/Highlight.js +1 -1
- package/dist/esm/modules/appCatalog/ui/components/Highlight.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/ViewToggle.d.ts +1 -1
- package/dist/esm/modules/appCatalog/ui/components/ViewToggle.js +11 -0
- package/dist/esm/modules/appCatalog/ui/components/ViewToggle.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/pages/McpPage.d.ts +11 -0
- package/dist/esm/modules/appCatalog/ui/pages/McpPage.js +227 -0
- package/dist/esm/modules/appCatalog/ui/pages/McpPage.js.map +1 -0
- package/dist/esm/modules/appCatalog/utils/fetchMcpTools.d.ts +32 -0
- package/dist/esm/modules/appCatalog/utils/fetchMcpTools.js +79 -0
- package/dist/esm/modules/appCatalog/utils/fetchMcpTools.js.map +1 -0
- package/dist/esm/modules/appCatalog/utils/highlightText.d.ts +15 -0
- package/dist/esm/modules/appCatalog/utils/highlightText.js +30 -0
- package/dist/esm/modules/appCatalog/utils/highlightText.js.map +1 -0
- package/dist/esm/routeTree.gen.d.ts +18 -3
- package/dist/esm/routeTree.gen.js +9 -2
- package/dist/esm/routeTree.gen.js.map +1 -1
- package/dist/esm/routes/_layout/mcp.d.ts +3 -0
- package/dist/esm/routes/_layout/mcp.js +20 -0
- package/dist/esm/routes/_layout/mcp.js.map +1 -0
- package/package.json +5 -5
- package/src/modules/appCatalog/ui/catalog/AppCatalogGrid.tsx +1 -1
- package/src/modules/appCatalog/ui/components/Highlight.tsx +1 -1
- package/src/modules/appCatalog/ui/components/ViewToggle.tsx +10 -1
- package/src/modules/appCatalog/ui/pages/McpPage.tsx +275 -0
- package/src/modules/appCatalog/utils/fetchMcpTools.ts +140 -0
- package/src/modules/appCatalog/utils/highlightText.ts +51 -0
- package/src/routeTree.gen.ts +21 -0
- package/src/routes/_layout/mcp.tsx +22 -0
- package/dist/esm/__tests__/modules/appCatalog/utils/searchApps.test.d.ts +0 -1
- package/dist/esm/modules/appCatalog/utils/searchApps.d.ts +0 -49
- package/dist/esm/modules/appCatalog/utils/searchApps.js +0 -144
- package/dist/esm/modules/appCatalog/utils/searchApps.js.map +0 -1
- package/src/__tests__/modules/appCatalog/utils/searchApps.test.ts +0 -96
- 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/
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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": "
|
|
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 '
|
|
10
|
+
import { searchResources } from '@igstack/app-catalog-shared-core'
|
|
11
11
|
import { Highlight } from '../components/Highlight'
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -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
|
}
|