// Test fixtures for . Shaped exactly like real tool calls from a // Claude Code session (states, providers, MCP naming, output truncation), but // all data — paths, Notion pages, GitHub profile, repo names — is synthetic. // // Note the adapter (lib/claude-adapter.ts `blockOutputText`) caps each result at // 4000 chars at ingest, so `notionSearch` below ends mid-JSON on purpose — that // is what a capped result looks like in the stream. `toolSearch` output is the // tool-name-per-line form a real ToolSearch result reduces to (the adapter keeps // only `text` blocks and a ToolSearch result is all `tool_reference` blocks, so // the live stream shows it empty; a real ToolSearch card would render these). // // `FIXTURE_CWD` is the fixture workspace's working directory — pass it to the // group so file paths render shortened (relative), exactly like the live chat. // // The lists are `Part[]` (reasoning + tool-call), so a run reads as a mixed // timeline. import type { Part, ToolCall } from '@/lib/types' export const FIXTURE_CWD = '/Users/kim/git/confetti' // `select:`-style tool discovery. const toolSearch: ToolCall = { toolCallId: 'toolu_fixture_tool_search', name: 'ToolSearch', caller: 'model', provider: 'claude-code', state: 'success', input: { query: 'select:mcp__notion__notion-search,mcp__notion__notion-get-teams,mcp__notion__notion-get-users', max_results: 3 }, output: 'mcp__notion__notion-search\nmcp__notion__notion-get-teams\nmcp__notion__notion-get-users' } // Native MCP call: server is encoded in the name (`mcp__notion__notion-search`), // `caller` is still `model`, and `mcpServer` is absent. The current chat renders // these via the generic card (the MCP card only matches `mcporter call …` Bash). const notionSearch: ToolCall = { toolCallId: 'toolu_fixture_notion_search', name: 'mcp__notion__notion-search', caller: 'model', provider: 'claude-code', state: 'success', input: { query: 'project notes docs overview', query_type: 'internal', page_size: 25 }, output: '{"results":[{"id":"3f1c9a72-0d62-4511-9dc9-5b7f38409a22","title":"Reading List","url":"https://app.notion.com/p/3f1c9a720d6245119dc95b7f38409a22?pvs=1","type":"page","highlight":"Reading List","timestamp":"2024-10-17T13:51:00.000Z"},{"id":"8b2d17aa-6741-4993-88bc-5adf2dabb8da","title":"To-Do","url":"https://app.notion.com/p/8b2d17aa6741499388bc5adf2dabb8da?pvs=1","type":"page","highlight":"canvas-confetti performance notes and particle pooling","timestamp":"2026-06-15T13:14:00.000Z"},{"id":"244536fd-e65b-433f-92bf-aa95efa91f35","title":"Plans & Notes","url":"https://app.notion.com/p/244536fde65b433f92bfaa95efa91f35?pvs=1","type":"database","highlight":"Plans & Notes","timestamp":"2024-02-06T10:02:00.000Z"},{"id":"5a668c31-b678-4035-b58e-d33e3ce86f5e","title":"Animation Research","url":"https://app.notion.com/p/5a668c31b6784035b58ed33e3ce86f5e?pvs=1","type":"page","highlight":"spring easings vs. bezier — generate N particle bursts in parallel and compare frame budgets","timestamp":"2025-11-03T08:07:00.000Z"},{"id":"41c28e19-b678-40df-ade3-dd8cec63de64","title":"Roadmap","url":"https://app.notion.com/p/41c28e19b67840dfade3dd8cec63de64?pvs=1","type":"database","highlight":"Roadmap","timestamp":"2026-06-09T08:00:00.000Z"},{"id":"6d9e2f44-b678-423e-9795-01de5d5f6734","title":"Meeting notes","url":"https://app.notion.com/p/6d9e2f44b678423e979501de5d5f6734?pvs=1","type":"database","highlight":"Meeting notes","timestamp":"2025-11-06T15:22:00.000Z"},{"id":"7fa31c55-b678-401d-948f-c47118e21516","title":"illustrations","url":"https://app.notion.com/p/7fa31c55b678401d948fc47118e21516?pvs=1","type":"page","highlight":"illustrations","timestamp":"2026-06-09T18:01:00.000Z"},{"id":"92e4b5c8-8d50-4938-8808-716a4e89dba6","title":"Weekly Update: March 4","url":"https://app.notion.com/p/92e4b5c88d5049388808716a4e89dba6?pvs=1","type":"page","highlight":"add backlog project for migrating v1 users","timestamp":"2022-07-30T18:34:00.000Z"},{"id":"1c778a02-b678-407b-9340-e1e830e38c50","title":"demo site","url":"https://app.notion.com/p/1c778a02b678407b9340e1e830e38c50?pvs=1","type":"page","highlight":"Interactive playground (CodeSandbox style)","timestamp":"2026-06-15T08:15:00.000Z"},{"id":"e3558d21-b678-406b-9a90-efaac9d864cf","title":"Feature Requests","url":"https://app.notion.com/p/e3558d21b678406b9a90efaac9d864cf?pvs=1","type":"database","highlight":"Feature Requests","timestamp":"2026-03-09T13:03:00.000Z"},{"id":"a91f4c6e-ce16-4002-bcb1-ead4923b9963","title":"Beta feedback","url":"https://app.notion.com/p/a91f4c6ece164002bcb1ead4923b9963?pvs=1","type":"database","highlight":"Beta feedback","timestamp":"2026-04-22T11:56:00.000Z"},{"id":"b0537e88-b678-40f3-8f04-cc7fef16e055","title":"confetti-v2","url":"https://app.notion.com/p/b0537e88b67840f38f04cc7fef16e055?pvs=1","type":"page","highlight":"WebGL renderer spike — offscreen canvas + worker, fall back to 2d context","timestamp":"2026-04-21T09:42:00.000Z"},{"id":"c6b19d34-b678-4145-9023-ffb37c04037d","title":"Physics Notes","url":"https://app.notion.com/p/c6b19d34b67841459023ffb37c04037d?pvs=1","type":"page","highlight":"Physics Notes","timestamp":"2026-04-21T13:07:00.000Z"},{"id":"d84a6f10-b678-41ea-845c-d7cc7c2ad2c4","title":"Docs Outline","url":"https://app.notion.com/p/d84a6f10b67841ea845cd7cc7c2ad2c4?pvs=1","type":"page","highlight":"📘 Getting started — full walkthrough (install, first burst, presets)","timestamp":"2026-06-09T08:44:00.000Z"},{"id":"f2c07b45-b678-402c-a8e7-d897826cf96d","title":"old","url":"https://app.notion.com/p/f2c07b45b678402ca8e7d897826cf96d?pvs=1","type":"page","highlight":"Notes:","timestamp":"2026-03-06T16:31:00.000Z"},{"id":"09d6e2a7-9908-4d54-be46-a974ac5019da","title":"Weekly Update: Jan 28","url":"https://app.notion.com/p/09d6e2a799084d54be46a974ac5019da' } const notionFetchOpenSource: ToolCall = { toolCallId: 'toolu_fixture_notion_fetch_oss', name: 'mcp__notion__notion-fetch', caller: 'model', provider: 'claude-code', state: 'success', input: { id: '55e1c208-1f0f-47cd-9422-bd7dbc54d536' }, output: '{"metadata":{"type":"page"},"title":"🛥 Open-Source","url":"https://app.notion.com/p/55e1c2081f0f47cd9422bd7dbc54d536","text":"Here is the result of \\"view\\" for the Page with URL https://app.notion.com/p/55e1c2081f0f47cd9422bd7dbc54d536 as of 2026-05-29T13:08:56.275Z:\\n\\n\\n\\n{\\"title\\":\\"Open-Source\\"}\\n\\n\\ntinyrouter\\nconfetti\\nmdnav\\npixelpad\\n`use-sparkle`\\nuse-hotkey\\n\\n\\n\\n"}' } const notionFetchConfetti: ToolCall = { toolCallId: 'toolu_fixture_notion_fetch_confetti', name: 'mcp__notion__notion-fetch', caller: 'model', provider: 'claude-code', state: 'success', input: { id: '83b4c5de-45af-40c2-8a19-f635332f9c4c' }, output: '{"metadata":{"type":"page"},"title":"confetti","url":"https://app.notion.com/p/83b4c5de45af40c28a19f635332f9c4c","text":"Here is the result of \\"view\\" for the Page with URL https://app.notion.com/p/83b4c5de45af40c28a19f635332f9c4c as of 2024-04-19T10:05:10.098Z:\\n\\n\\n\\n\\n\\n{\\"title\\":\\"confetti\\"}\\n\\n\\n- [x] Split the physics step from the render step\\n- [x] Basic React API\\n\\t- [x] Controlled/uncontrolled\\n\\t- [x] SSR: ok! No canvas until mount\\n\\t- [x] Detach on unmount\\n\\t- [x] `asChild` prop\\n\\t- [x] Block elements and `tagName`\\n\\t- [x] Fire on `click`\\n\\t- [x] Pass particle options\\n\\t- [x] asChild types\\n\\t- [x] Reduced-motion fallback\\n- [x] Pause bursts when the tab is hidden (VisibilityObserver)\\n- [x] Default burst has no trail. Needs a wrapper that disables the selector via `:has` — but then how do block elements animate? And `asChild` breaks.\\n- [x] Dark/light theme, none, auto, accent color\\n- [x] Demo: light/dark theme\\n- [x] `useIsomorphicLayoutEffect`\\n- [x] Particle pooling (no per-frame allocs)\\n- [x] Build and package\\n- [x] Publish a canary and dogfood it on the demo site\\n- [x] Fallback for Safari + Firefox: pre-rendered sprite sheet, three layers offset by primes 3, 5, 7 — loop four frames\\n- [x] data-active\\n- [x] pixelRatio for the fallback\\n- [x] How should styles load? Ship them separately.\\n- [x] Simple README\\n- [x] Get the easing curve right\\n- [ ] Use inline style in SSR\\n\\n```javascript\\n// Default confetti: uncontrolled, light theme, fires on click, creates an\\n// inline wrapper, no trail, does not follow the pointer\\n\\n/**\\n * Elements \\n */\\nParty! // Party!\\nParty!\\n\\n// block elements \\n //
\\n // alias\\n\\n// advanced\\n