@grackle-ai/web-components 0.116.0 → 0.117.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/.rush/temp/{f5301e6a84109dcec06242d178df01e555a83456.untar.log → 8d9be4152bfcbf796b578ac87621b34484202bd0.untar.log} +2 -2
- package/.rush/temp/{f238c174d295031bec7f186733732e0fd7e4b9a5.untar.log → be1751e9cb123b206e39fdb59b24fd82523d77e2.untar.log} +2 -2
- package/.rush/temp/operation/_phase_build/all.log +11 -4
- package/.rush/temp/operation/_phase_build/log-chunks.jsonl +11 -4
- package/.rush/temp/operation/_phase_build/state.json +1 -1
- package/.rush/temp/operation/_phase_test/all.log +28 -26
- package/.rush/temp/operation/_phase_test/log-chunks.jsonl +28 -26
- package/.rush/temp/operation/_phase_test/state.json +1 -1
- package/.rush/temp/shrinkwrap-deps.json +15 -3
- package/README.md +1 -1
- package/config/rush-project.json +1 -1
- package/dist/index.js +3289 -3276
- package/package.json +4 -2
- package/rush-logs/web-components._phase_build.cache.log +2 -2
- package/rush-logs/web-components._phase_test.cache.log +1 -1
- package/src/components/display/EventRenderer.stories.tsx +22 -0
- package/src/components/display/EventRenderer.tsx +28 -4
- package/src/mcp-runtime/index.tsx +99 -0
- package/vite.config.ts +46 -2
- package/.rush/temp/chunked-rush-logs/web-components._phase_build.chunks.jsonl +0 -19
- package/.rush/temp/chunked-rush-logs/web-components._phase_test.chunks.jsonl +0 -125
- package/.rush/temp/f238c174d295031bec7f186733732e0fd7e4b9a5.tar.log +0 -231
- package/.rush/temp/f5301e6a84109dcec06242d178df01e555a83456.tar.log +0 -12
- package/rush-logs/web-components._phase_build.log +0 -19
- package/rush-logs/web-components._phase_test.log +0 -125
- package/temp/build/lint/_eslint-5eVG3S6w.json +0 -826
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grackle-ai/web-components",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.117.0",
|
|
4
4
|
"description": "Presentational React component library for the Grackle web UI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"sideEffects": [
|
|
@@ -41,12 +41,13 @@
|
|
|
41
41
|
"d3-zoom": "^3.0.0",
|
|
42
42
|
"react": "^19.0.0",
|
|
43
43
|
"react-dom": "^19.0.0",
|
|
44
|
+
"react-live": "^4.1.8",
|
|
44
45
|
"react-markdown": "^9.0.3",
|
|
45
46
|
"rehype-prism-plus": "^2.0.0",
|
|
46
47
|
"remark-gfm": "^4.0.0",
|
|
47
48
|
"lucide-react": "~0.474.0",
|
|
48
49
|
"react-router": "^7.0.0",
|
|
49
|
-
"@grackle-ai/common": "0.
|
|
50
|
+
"@grackle-ai/common": "0.117.0"
|
|
50
51
|
},
|
|
51
52
|
"devDependencies": {
|
|
52
53
|
"@rushstack/heft": "1.2.7",
|
|
@@ -60,6 +61,7 @@
|
|
|
60
61
|
"@types/react-dom": "^19.0.0",
|
|
61
62
|
"sass": "^1.86.0",
|
|
62
63
|
"vite": "^6.4.2",
|
|
64
|
+
"vite-plugin-css-injected-by-js": "^4.0.1",
|
|
63
65
|
"vitest": "^3.1.1",
|
|
64
66
|
"@testing-library/react": "^16.3.2",
|
|
65
67
|
"jsdom": "^29.0.0",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
Build cache hit.
|
|
2
|
-
Cache key:
|
|
3
|
-
Clearing cached folders: dist, storybook-static, .rush/temp/operation/_phase_build
|
|
2
|
+
Cache key: 8d9be4152bfcbf796b578ac87621b34484202bd0
|
|
3
|
+
Clearing cached folders: dist, storybook-static, mcp-app-runtime, .rush/temp/operation/_phase_build
|
|
4
4
|
Successfully restored output from the build cache.
|
|
@@ -216,6 +216,28 @@ export const AgentWidgetEvent: Story = {
|
|
|
216
216
|
},
|
|
217
217
|
};
|
|
218
218
|
|
|
219
|
+
/** GenUX React runtime (#1268): rendererKind "grackle-react" — `html` is JSX source. */
|
|
220
|
+
export const ReactRuntimeWidgetEvent: Story = {
|
|
221
|
+
args: {
|
|
222
|
+
event: makeEvent({
|
|
223
|
+
eventType: "widget",
|
|
224
|
+
content: JSON.stringify({
|
|
225
|
+
resourceUri: "",
|
|
226
|
+
toolName: "component_show",
|
|
227
|
+
rendererKind: "grackle-react",
|
|
228
|
+
html: "render(<Button>{props.label}</Button>)",
|
|
229
|
+
csp: { resourceDomains: ["http://localhost:6007"], connectDomains: ["http://localhost:6007"], allowUnsafeEval: true },
|
|
230
|
+
toolInput: { label: "Hi" },
|
|
231
|
+
}),
|
|
232
|
+
}),
|
|
233
|
+
sandboxProxyUrl: "http://localhost:6007/sandbox.html",
|
|
234
|
+
},
|
|
235
|
+
play: async ({ canvas }) => {
|
|
236
|
+
// The grackle-react branch builds a runtime bootstrap and mounts the host iframe.
|
|
237
|
+
await expect(await canvas.findByTestId("mcp-app-widget")).toBeInTheDocument();
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
|
|
219
241
|
/** An unknown rendererKind falls back to the default event card (no crash). */
|
|
220
242
|
export const UnknownRendererKindWidget: Story = {
|
|
221
243
|
args: {
|
|
@@ -226,9 +226,10 @@ export function EventRenderer({ event, toolUseCtx, settled, sandboxProxyUrl }: P
|
|
|
226
226
|
let payload: {
|
|
227
227
|
html?: string;
|
|
228
228
|
rendererKind?: string;
|
|
229
|
-
// `allowInlineScripts`
|
|
230
|
-
// (agent-authored widgets
|
|
231
|
-
|
|
229
|
+
// `allowInlineScripts`/`allowUnsafeEval` are Grackle extensions to the
|
|
230
|
+
// upstream CSP type (agent-authored widgets #1239; React runtime #1268);
|
|
231
|
+
// forwarded verbatim to the sandbox.
|
|
232
|
+
csp?: McpUiResourceCsp & { allowInlineScripts?: boolean; allowUnsafeEval?: boolean };
|
|
232
233
|
toolInput?: Record<string, unknown>;
|
|
233
234
|
toolResult?: CallToolResult;
|
|
234
235
|
} = {};
|
|
@@ -236,8 +237,31 @@ export function EventRenderer({ event, toolUseCtx, settled, sandboxProxyUrl }: P
|
|
|
236
237
|
payload = JSON.parse(event.content) as typeof payload;
|
|
237
238
|
} catch { /* malformed widget payload — fall back */ }
|
|
238
239
|
// Dispatch on rendererKind (default "mcp-app-html" for back-compat). This
|
|
239
|
-
// switch is the seam for
|
|
240
|
+
// switch is the seam for declarative/runtime renderers.
|
|
240
241
|
const rendererKind: string = payload.rendererKind ?? "mcp-app-html";
|
|
242
|
+
// GenUX React runtime (#1268): payload.html is JSX *source* (not a full
|
|
243
|
+
// document). Render it via a bootstrap that loads the runtime bundle from the
|
|
244
|
+
// sandbox origin; the source + props are delivered as tool input. The runtime
|
|
245
|
+
// transpiles + renders the component against the Grackle component library.
|
|
246
|
+
// An absolute runtime.js URL is required — the inner iframe is written via
|
|
247
|
+
// doc.write (about:blank base), so a relative "/runtime.js" would not resolve.
|
|
248
|
+
if (rendererKind === "grackle-react" && payload.html) {
|
|
249
|
+
const sandboxOrigin: string = new URL(sandboxProxyUrl, window.location.href).origin;
|
|
250
|
+
const bootstrap: string =
|
|
251
|
+
`<!doctype html><html><head><meta charset="utf-8"></head>` +
|
|
252
|
+
`<body><div id="grackle-root"></div>` +
|
|
253
|
+
`<script type="module" src="${sandboxOrigin}/runtime.js"></script></body></html>`;
|
|
254
|
+
return (
|
|
255
|
+
<Suspense fallback={<DefaultEvent content="Loading widget..." />}>
|
|
256
|
+
<McpAppWidget
|
|
257
|
+
widgetHtml={bootstrap}
|
|
258
|
+
sandboxProxyUrl={sandboxProxyUrl}
|
|
259
|
+
csp={payload.csp}
|
|
260
|
+
toolInput={{ source: payload.html, props: payload.toolInput ?? {} }}
|
|
261
|
+
/>
|
|
262
|
+
</Suspense>
|
|
263
|
+
);
|
|
264
|
+
}
|
|
241
265
|
if (rendererKind !== "mcp-app-html" || !payload.html) {
|
|
242
266
|
return <DefaultEvent content={event.content} />;
|
|
243
267
|
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grackle React runtime (#1268) — the single MCP Apps resource (`ui://grackle/runtime`)
|
|
3
|
+
* that renders agent-authored React/JSX inline in the chat.
|
|
4
|
+
*
|
|
5
|
+
* Bundled self-contained (React + react-live + the curated Grackle component set +
|
|
6
|
+
* the ext-apps guest bridge) by `vite.config.ts` into `mcp-app-runtime/runtime.js`
|
|
7
|
+
* and served from the sandbox origin. The host (`McpAppWidget`) writes a tiny
|
|
8
|
+
* bootstrap that loads this script, then delivers `{ source, props }` as MCP Apps
|
|
9
|
+
* tool input. The runtime transpiles + evaluates the JSX via react-live against the
|
|
10
|
+
* component scope and paints it. This is the load-bearing slice of the GenUX
|
|
11
|
+
* component-registry vision (render-by-source; the registry comes in later phases).
|
|
12
|
+
*/
|
|
13
|
+
import { useState, type JSX } from "react";
|
|
14
|
+
import * as React from "react";
|
|
15
|
+
import { createRoot } from "react-dom/client";
|
|
16
|
+
import { LiveProvider, LivePreview, LiveError } from "react-live";
|
|
17
|
+
import { useApp, useHostStyleVariables } from "@modelcontextprotocol/ext-apps/react";
|
|
18
|
+
import {
|
|
19
|
+
Button, SplitButton, Callout, Spinner,
|
|
20
|
+
Skeleton, SkeletonText, SkeletonCard, Tooltip, CopyButton,
|
|
21
|
+
} from "../index.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Curated, context-free presentational components exposed to agent JSX. Phase 0
|
|
25
|
+
* keeps this a small, safe set — components that require router or `useGrackle()`
|
|
26
|
+
* context are intentionally excluded. The full, discoverable catalog arrives in a
|
|
27
|
+
* later phase (#1265).
|
|
28
|
+
*/
|
|
29
|
+
const COMPONENT_SCOPE: Readonly<Record<string, unknown>> = {
|
|
30
|
+
Button, SplitButton, Callout, Spinner,
|
|
31
|
+
Skeleton, SkeletonText, SkeletonCard, Tooltip, CopyButton,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** Identity reported to the host during the MCP Apps guest handshake. */
|
|
35
|
+
const APP_INFO: Readonly<{ name: string; version: string }> = {
|
|
36
|
+
name: "GrackleReactRuntime",
|
|
37
|
+
version: "0.1.0",
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** The agent-supplied render request delivered via MCP Apps tool input. */
|
|
41
|
+
interface RenderInput {
|
|
42
|
+
/** JSX source; must call `render(<Component {...props}/>)` (react-live noInline). */
|
|
43
|
+
source: string;
|
|
44
|
+
/** Data bound into the component, available as `props` in the JSX scope. */
|
|
45
|
+
props: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Connects the guest bridge, receives the JSX + props, and renders via react-live. */
|
|
49
|
+
function Runtime(): JSX.Element {
|
|
50
|
+
const [input, setInput] = useState<RenderInput | undefined>(undefined);
|
|
51
|
+
|
|
52
|
+
const { app, error } = useApp({
|
|
53
|
+
appInfo: APP_INFO,
|
|
54
|
+
capabilities: {},
|
|
55
|
+
onAppCreated: (createdApp): void => {
|
|
56
|
+
createdApp.ontoolinput = (params): void => {
|
|
57
|
+
const args = (params.arguments ?? {}) as { source?: unknown; props?: unknown };
|
|
58
|
+
setInput({
|
|
59
|
+
source: typeof args.source === "string" ? args.source : "",
|
|
60
|
+
props:
|
|
61
|
+
args.props !== null && typeof args.props === "object"
|
|
62
|
+
? (args.props as Record<string, unknown>)
|
|
63
|
+
: {},
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Mirror the host theme + style tokens onto this document (light-dark + CSS vars).
|
|
70
|
+
useHostStyleVariables(app, app?.getHostContext());
|
|
71
|
+
|
|
72
|
+
if (error) {
|
|
73
|
+
return <div style={{ color: "var(--color-text-danger, #c00)" }}>Runtime error: {error.message}</div>;
|
|
74
|
+
}
|
|
75
|
+
if (!input) {
|
|
76
|
+
return <div style={{ opacity: 0.6, padding: "0.5rem" }}>Loading component…</div>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// react-live transpiles the JSX (sucrase) and evaluates it with `new Function`
|
|
80
|
+
// (requires `script-src 'unsafe-eval'`, set on this resource's sandbox CSP). The
|
|
81
|
+
// origin-isolated sandbox + restricted connect-src keep that safe (#1268).
|
|
82
|
+
const scope: Record<string, unknown> = { React, props: input.props, ...COMPONENT_SCOPE };
|
|
83
|
+
return (
|
|
84
|
+
<LiveProvider code={input.source} noInline scope={scope}>
|
|
85
|
+
<LivePreview />
|
|
86
|
+
<LiveError />
|
|
87
|
+
</LiveProvider>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Mount the runtime into the bootstrap's root element. */
|
|
92
|
+
function main(): void {
|
|
93
|
+
const rootEl: HTMLElement | null = document.getElementById("grackle-root");
|
|
94
|
+
if (rootEl) {
|
|
95
|
+
createRoot(rootEl).render(<Runtime />);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
main();
|
package/vite.config.ts
CHANGED
|
@@ -1,9 +1,53 @@
|
|
|
1
|
-
import { defineConfig } from "vite";
|
|
1
|
+
import { defineConfig, build, type Plugin } from "vite";
|
|
2
2
|
import react from "@vitejs/plugin-react";
|
|
3
|
+
import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js";
|
|
3
4
|
import { resolve } from "node:path";
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Second, self-contained build for the MCP Apps React runtime (#1268). Unlike the
|
|
8
|
+
* main library build (which externalizes React + `@grackle-ai/*` so the web SPA
|
|
9
|
+
* provides them), the runtime is a standalone bundle served from the sandbox
|
|
10
|
+
* origin: it bundles React, the curated Grackle component set, react-live, and the
|
|
11
|
+
* ext-apps guest bridge into one `mcp-app-runtime/runtime.js`, with CSS injected
|
|
12
|
+
* via JS (the sandbox loads a single script). Run from the main build's
|
|
13
|
+
* `closeBundle`; `configFile: false` keeps the nested build from re-loading this
|
|
14
|
+
* config (no recursion).
|
|
15
|
+
*/
|
|
16
|
+
function buildRuntimeBundle(): Plugin {
|
|
17
|
+
return {
|
|
18
|
+
name: "grackle-build-mcp-runtime",
|
|
19
|
+
closeBundle: {
|
|
20
|
+
sequential: true,
|
|
21
|
+
async handler(): Promise<void> {
|
|
22
|
+
await build({
|
|
23
|
+
configFile: false,
|
|
24
|
+
root: __dirname,
|
|
25
|
+
define: { "process.env.NODE_ENV": JSON.stringify("production") },
|
|
26
|
+
plugins: [react(), cssInjectedByJsPlugin()],
|
|
27
|
+
build: {
|
|
28
|
+
outDir: resolve(__dirname, "mcp-app-runtime"),
|
|
29
|
+
emptyOutDir: true,
|
|
30
|
+
minify: true,
|
|
31
|
+
lib: {
|
|
32
|
+
entry: resolve(__dirname, "src/mcp-runtime/index.tsx"),
|
|
33
|
+
formats: ["es"],
|
|
34
|
+
fileName: () => "runtime.js",
|
|
35
|
+
},
|
|
36
|
+
// No `external`: bundle React + the component library into one file.
|
|
37
|
+
// `inlineDynamicImports` forces a SINGLE self-contained file — the
|
|
38
|
+
// sandbox server only serves `/runtime.js`, never split chunks.
|
|
39
|
+
rollupOptions: {
|
|
40
|
+
output: { inlineDynamicImports: true },
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
5
49
|
export default defineConfig({
|
|
6
|
-
plugins: [react()],
|
|
50
|
+
plugins: [react(), buildRuntimeBundle()],
|
|
7
51
|
build: {
|
|
8
52
|
lib: {
|
|
9
53
|
entry: resolve(__dirname, "src/index.ts"),
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{"kind":"O","text":"Invoking: heft run --only build -- --clean \n"}
|
|
2
|
-
{"kind":"O","text":" ---- build started ---- \n"}
|
|
3
|
-
{"kind":"O","text":"[build:typescript] Using TypeScript version 5.7.3\n"}
|
|
4
|
-
{"kind":"O","text":"[build:storybook-build] Building Storybook...\n"}
|
|
5
|
-
{"kind":"O","text":"[build:storybook-build] Storybook build completed.\n"}
|
|
6
|
-
{"kind":"O","text":"[build:vite-build] Starting Vite build...\n"}
|
|
7
|
-
{"kind":"O","text":"[build:lint] Using ESLint version 9.39.4\n"}
|
|
8
|
-
{"kind":"O","text":"\u001b[36mvite v6.4.2 \u001b[32mbuilding for production...\u001b[36m\u001b[39m\n"}
|
|
9
|
-
{"kind":"O","text":"transforming...\n"}
|
|
10
|
-
{"kind":"O","text":"\u001b[32m✓\u001b[39m 2712 modules transformed.\n"}
|
|
11
|
-
{"kind":"O","text":"rendering chunks...\n"}
|
|
12
|
-
{"kind":"O","text":"computing gzip size...\n"}
|
|
13
|
-
{"kind":"O","text":"\u001b[2mdist/\u001b[22m\u001b[35mindex.css \u001b[39m\u001b[1m\u001b[2m 155.14 kB\u001b[22m\u001b[1m\u001b[22m\u001b[2m │ gzip: 20.34 kB\u001b[22m\n"}
|
|
14
|
-
{"kind":"O","text":"\u001b[2mdist/\u001b[22m\u001b[36mMcpAppWidget-CSX2W2Vb.js \u001b[39m\u001b[1m\u001b[2m 205.28 kB\u001b[22m\u001b[1m\u001b[22m\u001b[2m │ gzip: 47.19 kB\u001b[22m\n"}
|
|
15
|
-
{"kind":"O","text":"\u001b[2mdist/\u001b[22m\u001b[36mindex.js \u001b[39m\u001b[1m\u001b[33m1,374.93 kB\u001b[39m\u001b[22m\u001b[2m │ gzip: 352.80 kB\u001b[22m\n"}
|
|
16
|
-
{"kind":"O","text":"\u001b[32m✓ built in 5.75s\u001b[39m\n"}
|
|
17
|
-
{"kind":"O","text":"[build:vite-build] Vite build completed.\n"}
|
|
18
|
-
{"kind":"O","text":" ---- build finished (50.985s) ---- \n"}
|
|
19
|
-
{"kind":"O","text":"-------------------- Finished (50.988s) --------------------\n"}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
{"kind":"O","text":"Invoking: heft run --only test \n"}
|
|
2
|
-
{"kind":"O","text":"The provided list of phases does not contain all phase dependencies. You may need to run the excluded phases manually.\n"}
|
|
3
|
-
{"kind":"O","text":" ---- test started ---- \n"}
|
|
4
|
-
{"kind":"O","text":"[test:vitest] Running vitest...\n"}
|
|
5
|
-
{"kind":"O","text":"\n"}
|
|
6
|
-
{"kind":"O","text":"\u001b[1m\u001b[46m RUN \u001b[49m\u001b[22m \u001b[36mv3.2.4 \u001b[39m\u001b[90m/home/runner/work/grackle/grackle/packages/web-components\u001b[39m\n"}
|
|
7
|
-
{"kind":"O","text":"\n"}
|
|
8
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/sessionEvents.test.ts \u001b[2m(\u001b[22m\u001b[2m14 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 46\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
9
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/eventContent.test.ts \u001b[2m(\u001b[22m\u001b[2m38 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 129\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
10
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/dashboard.test.ts \u001b[2m(\u001b[22m\u001b[2m4 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 9\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
11
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/streamCoordination.test.ts \u001b[2m(\u001b[22m\u001b[2m10 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 20\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
12
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/route-config.test.ts \u001b[2m(\u001b[22m\u001b[2m16 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 27\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
13
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/breadcrumbs.test.ts \u001b[2m(\u001b[22m\u001b[2m15 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 15\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
14
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/scrollUtils.test.ts \u001b[2m(\u001b[22m\u001b[2m11 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 21\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
15
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/components/tools/classifyTool.test.ts \u001b[2m(\u001b[22m\u001b[2m6 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 11\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
16
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/components/tools/toolCardHelpers.test.ts \u001b[2m(\u001b[22m\u001b[2m10 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 25\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
17
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/assetUrl.test.ts \u001b[2m(\u001b[22m\u001b[2m3 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 14\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
18
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/components/display/extractText.test.tsx \u001b[2m(\u001b[22m\u001b[2m8 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 22\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
19
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/hooks/useEventSelection.test.ts \u001b[2m(\u001b[22m\u001b[2m13 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 180\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
20
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/components/editable/useEditableField.test.tsx \u001b[2m(\u001b[22m\u001b[2m17 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 159\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
21
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/components/notifications/UpdateBanner.test.tsx \u001b[2m(\u001b[22m\u001b[2m4 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 95\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
22
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/utils/grackleHostStyleVariables.test.ts \u001b[2m(\u001b[22m\u001b[2m2 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[32m 195\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
23
|
-
{"kind":"O","text":" \u001b[32m✓\u001b[39m src/components/display/McpAppWidget.test.tsx \u001b[2m(\u001b[22m\u001b[2m3 tests\u001b[22m\u001b[2m)\u001b[22m\u001b[33m 361\u001b[2mms\u001b[22m\u001b[39m\n"}
|
|
24
|
-
{"kind":"O","text":"\n"}
|
|
25
|
-
{"kind":"O","text":"\u001b[2m Test Files \u001b[22m \u001b[1m\u001b[32m16 passed\u001b[39m\u001b[22m\u001b[90m (16)\u001b[39m\n"}
|
|
26
|
-
{"kind":"O","text":"\u001b[2m Tests \u001b[22m \u001b[1m\u001b[32m174 passed\u001b[39m\u001b[22m\u001b[90m (174)\u001b[39m\n"}
|
|
27
|
-
{"kind":"O","text":"\u001b[2m Start at \u001b[22m 23:49:50\n"}
|
|
28
|
-
{"kind":"O","text":"\u001b[2m Duration \u001b[22m 15.38s\u001b[2m (transform 2.97s, setup 0ms, collect 14.70s, tests 1.33s, environment 12.10s, prepare 5.21s)\u001b[22m\n"}
|
|
29
|
-
{"kind":"O","text":"\n"}
|
|
30
|
-
{"kind":"O","text":"[test:vitest] Vitest completed.\n"}
|
|
31
|
-
{"kind":"O","text":"[test:storybook-test] Starting Storybook static server on port 45217...\n"}
|
|
32
|
-
{"kind":"O","text":"[test:storybook-test] Storybook server ready. Running interaction tests...\n"}
|
|
33
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: adapter-manager\n"}
|
|
34
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
35
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/adapter-manager.js\n"}
|
|
36
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/adapter-manager.ts\n"}
|
|
37
|
-
{"kind":"O","text":"\n"}
|
|
38
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: auto-reconnect\n"}
|
|
39
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
40
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/auto-reconnect.js\n"}
|
|
41
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/auto-reconnect.ts\n"}
|
|
42
|
-
{"kind":"O","text":"\n"}
|
|
43
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: event-bus\n"}
|
|
44
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
45
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/event-bus.js\n"}
|
|
46
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/event-bus.ts\n"}
|
|
47
|
-
{"kind":"O","text":"\n"}
|
|
48
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: event-processor\n"}
|
|
49
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
50
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/event-processor.js\n"}
|
|
51
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/event-processor.ts\n"}
|
|
52
|
-
{"kind":"O","text":"\n"}
|
|
53
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: github-import\n"}
|
|
54
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
55
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/github-import.js\n"}
|
|
56
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/github-import.ts\n"}
|
|
57
|
-
{"kind":"O","text":"\n"}
|
|
58
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: lifecycle\n"}
|
|
59
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
60
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/lifecycle.js\n"}
|
|
61
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/lifecycle.ts\n"}
|
|
62
|
-
{"kind":"O","text":"\n"}
|
|
63
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: log-writer\n"}
|
|
64
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
65
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/log-writer.js\n"}
|
|
66
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/log-writer.ts\n"}
|
|
67
|
-
{"kind":"O","text":"\n"}
|
|
68
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: logger\n"}
|
|
69
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
70
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/logger.js\n"}
|
|
71
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/logger.ts\n"}
|
|
72
|
-
{"kind":"O","text":"\n"}
|
|
73
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: pipe-delivery\n"}
|
|
74
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
75
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/pipe-delivery.js\n"}
|
|
76
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/pipe-delivery.ts\n"}
|
|
77
|
-
{"kind":"O","text":"\n"}
|
|
78
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: processor-registry\n"}
|
|
79
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
80
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/processor-registry.js\n"}
|
|
81
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/processor-registry.ts\n"}
|
|
82
|
-
{"kind":"O","text":"\n"}
|
|
83
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: reanimate-agent\n"}
|
|
84
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
85
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/reanimate-agent.js\n"}
|
|
86
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/reanimate-agent.ts\n"}
|
|
87
|
-
{"kind":"O","text":"\n"}
|
|
88
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: session-recovery\n"}
|
|
89
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
90
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/session-recovery.js\n"}
|
|
91
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/session-recovery.ts\n"}
|
|
92
|
-
{"kind":"O","text":"\n"}
|
|
93
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: stream-hub\n"}
|
|
94
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
95
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/stream-hub.js\n"}
|
|
96
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/stream-hub.ts\n"}
|
|
97
|
-
{"kind":"O","text":"\n"}
|
|
98
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: stream-registry\n"}
|
|
99
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
100
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/stream-registry.js\n"}
|
|
101
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/stream-registry.ts\n"}
|
|
102
|
-
{"kind":"O","text":"\n"}
|
|
103
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: token-push\n"}
|
|
104
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
105
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/token-push.js\n"}
|
|
106
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/token-push.ts\n"}
|
|
107
|
-
{"kind":"O","text":"\n"}
|
|
108
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: utils/exec\n"}
|
|
109
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
110
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/utils/exec.js\n"}
|
|
111
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/utils/exec.ts\n"}
|
|
112
|
-
{"kind":"O","text":"\n"}
|
|
113
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: utils/format-gh-error\n"}
|
|
114
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
115
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/utils/format-gh-error.js\n"}
|
|
116
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/utils/format-gh-error.ts\n"}
|
|
117
|
-
{"kind":"O","text":"\n"}
|
|
118
|
-
{"kind":"O","text":"jest-haste-map: duplicate manual mock found: utils/network\n"}
|
|
119
|
-
{"kind":"O","text":" The following files share their name; please delete one of them:\n"}
|
|
120
|
-
{"kind":"O","text":" * <rootDir>/packages/server/dist/__mocks__/utils/network.js\n"}
|
|
121
|
-
{"kind":"O","text":" * <rootDir>/packages/server/src/__mocks__/utils/network.ts\n"}
|
|
122
|
-
{"kind":"O","text":"\n"}
|
|
123
|
-
{"kind":"O","text":"[test:storybook-test] Storybook interaction tests completed.\n"}
|
|
124
|
-
{"kind":"O","text":" ---- test finished (74.932s) ---- \n"}
|
|
125
|
-
{"kind":"O","text":"-------------------- Finished (74.942s) --------------------\n"}
|