Repository navigation
Conversation
…and Electric shapes
…rols Move the cva definitions and per-slot class strings of the button, field, input and form-control primitives into sibling *.styles.ts files with no React or Base UI imports, exported as @maple/ui/styles/ui/<name>. The .tsx files import them back with the same cn arguments, so classes are unchanged.
…ickers Dialogs, sheets, popovers, tooltips, menus, command, toast, select, combobox, autocomplete and navigation menu get *.styles.ts siblings holding every static class string. Multi-string cn calls spread an as-const array so cn receives the same arguments in the same order.
…imitives Card, panel, table, sidebar, page layout, badge, alert, empty, item, list rows, meters, skeletons, tabs and the remaining display primitives move their cva and class constants into *.styles.ts. Exported names the apps import (badgeVariants, eyebrowVariants, listRowVariants, ROW_LANE, rowSelectedClass, ...) are re-exported from the .tsx unchanged.
…styles/ui Drop the cva and class lists S1 copied from the React kit; button.ts and field.ts now import buttonVariants, spinner, field and input styles from the shared framework-free modules. Sign-in parity stays identical.
Warehouse queries go through an Effect port of the execute batcher as a runtime resource; results land in keyed AsyncData slots that drop superseded answers; Electric collections are read through a liveQuery Subscription re-keyed by org. /lab/data-probe proves it on the fixture backend with the same execute-batch fingerprint as legacy /services. Decision record and atom mapping guide in docs/foldkit-decisions/s6-data.md.
…ry definitions, deterministic seed, chDB close
…ixel parity - apps/web-foldkit/src/service-map/xyflow: React Flow's DOM as Foldkit views, XYPanZoom, pane and node measurement in one Mount, the camera in the Model - trace-flow: TraceFlowView as a Submodel (selection, edge hover, fits) - static dashboard shell generated from the legacy capture for lab pages - @maple/ui icons rendered to SVG data by scripts/generate-icons.ts - service-map-db-style.ts: the React-free half of service-map-db.tsx, so service-map-utils/elk/declutter import without React; bench fixture split out - interaction scenarios for both canvases
…orted Charts run on the framework-free @tanstack/charts core: a ChartSpec (Schema) on the plot box describes the definition, MountChart creates the renderer adapter (lazy chart-host chunk) and follows the spec, and focus and tooltip changes come back as Chart Submodel Messages. Tooltip bodies are Foldkit views portaled into the library's tooltip shell. Ports PlotFrame, PlotLegend / PlotStatsLegend, QueryBuilderPieChart, QueryBuilderHistogramChart and the pie and histogram lab spikes; /lab/charts renders the gallery with those arms.
Hover a production pie slice and a production histogram bin, light and dark. The chart is found by its img role and name; the hover is a mouse position inside it, since a canvas plot has no element per datum.
# Conflicts: # packages/ui-parity/src/scenarios.ts
…an React Ports /lab/bench/logs and /lab/logs onto a logs stream Submodel with @tanstack/virtual-core in a Mount, adds logs-table parity scenarios (scroll, row hover, chip card, keyboard focus, wrap/search, pins, reload) and a perf runner that measures both static builds. Decision record in docs/foldkit-decisions/s4-tables.md.
# Conflicts: # apps/web-foldkit/package.json # packages/ui-parity/src/scenarios.ts
…el parity - ServiceMapFlowCanvas as a Submodel: declutter, ELK worker layout as a Command with the synchronous layout as the 2 s fallback, selection, camera fits - node cards, tube edges, minimap, controls, background, namespace boxes, legend; toolbar and loading skeleton generated from the legacy capture - particle canvas as a Mount fed by serialized edge geometry - window.__smBench harness (readiness, idle/pan runs, camera pin and fit) - bench fixture row types restated structurally so the Foldkit app can import it
Move apps/web/src/api/warehouse/* and the React-free lib modules they need (cache-key, error-messages, chunk-reload, peer-reachability, v2-pagination, session-replays, trace-time-window, tool-analytics) into packages/web-data. Query functions now require plain services (WarehouseExecutor, MapleInternalHttp, MapleApiV2Http, ApiReachability) instead of the atom clients and registry; apps/web provides them from registry.ts (same module batcher, atom clients' HttpApiClients, reachability clock), and the atom families and widget fetches provide that layer. Time-range resolution core (snapTimestamp, resolveTimeRangeAt) moves too.
Six lab pages render every @maple/ui primitive in isolation as parity targets (buttons, forms, overlays via ?item=, display, content, navigation). The kit area adds one scenario per page and per overlay item, plus hover and keyboard focus-visible variants for buttons and inputs.
# Conflicts: # packages/ui-parity/src/scenarios.ts # packages/ui-parity/src/scenarios/lab.ts
…st pages FilterSection/FilterSidebar/ActiveFilterChips ports with a FilterSections Submodel (collapse remembered like useSectionCollapse), SegmentedSelect, ErrorState, LatencyValue/ErrorRateValue/ServiceDot, a Sparkline chart spec, LoadFailure (the displayError body), the alert_incidents collection, and Clock, History and Sliders icons from the generator.
Pages are Submodels registered once in page/registry.ts: built on route entry, kept across search changes (routeChanged), dropped on leave, and handed the root's PageContext (org, namespace pin, time zone). Navigation and pin changes go back as PageOutMessages. Kit: DashboardPage layout, time controls and picker, SignalEmptyState with presence, PinnedNamespaceNotice. /services reads the same queries under the same keys as apps/web (overview, sparklines, facets, baseline, open anomalies, alert incidents, commit messages, signal presence), with Scene tests for its update logic.
Grouping switch (the table has no sortable columns), an environment filter, an exclusion that empties the table, a hovered row and a time range from the picker.
…nders PlotFrame updates its adapter on every render of a ServiceRow, and React remounts rows whose namespace/environment fragment changes. rowRevision and group-scoped row keys reproduce both, which removes the canvas edge diffs after a time range change and a regroup.
# Conflicts: # packages/web-data/src/collections/alerts.ts
Date.parse becomes parseWarehouseDateTime, widened dictionaries become satisfies or Maps, call-log payloads are typed Schema.Json, no non-null assertions, conditional spreads, Effect.die, Layer provides or try/catch outside the one serialized in-page canvas hash.
… and deps ui-parity loads scenario and fixture areas through readdirSync + import(), so they are entries. Unused exports in web-foldkit and ui-parity are deleted, five scaffold deps removed, playwright listed for the service-map bench, and the http-api lint directive follows oxfmt's line break.
…d, real frames - lab-flow-* interaction scenarios run on dataset default like the rest of the lab area (no 401s). - Scenario.targets: run, selfcheck and capture skip a scenario unless every build is one of its targets; data-probe is foldkit-only. - A missing --auth clerk flavor is built from the self-hosted build's stamp before capturing. - Freeze only Date in installDeterminism instead of page.clock.setFixedTime: Playwright's clock also fakes requestAnimationFrame as a 16ms timer, so frame callbacks ran off rendering steps and raced ResizeObserver under load (lab-worst-case's virtualized waterfall settled at two offsets).
Dataset.faults and Scenario.faults (sent as x-parity-faults) delay or fail HttpApi endpoints by tag prefix. settle: "held" waits until every in-flight API request is one the backend holds, then settles visually, so loading skeletons are captured on purpose. Expected 5xx console lines of injected failures do not fail the variant. New /services loading and error scenarios.
… every harness feature Fixture areas, full-page growth, comma filters, pageCalls, Scenario.targets, faults and the held settle, clerk auto-builds, the Date-only clock, and the service-map fit race.
Freezing only Date (real requestAnimationFrame) did not stop lab-worst-case flaking in the re-pin run and made three service-map variants flaky. The worst-case flake is an app race in span-hierarchy.tsx's scroll-to-selected loop; documented as a known gap.
legacy@0a7d4a9ef1 vs legacy-head over route,lab,kit: 195 identical, 5 pass at 0 perceptual px; the 4 service-map/worst-case fails were the reverted clock experiment and came back identical on recheck, lab-alerts is pixel-identical with the same fixture SchemaError in both builds.
…and MCP settings endpoints
/lab/alerts threw SchemaError (missing "thresholds") on main since the alert tiers change.
Maple review🟡 Confidence 6/10 · needs attention Foundations for the Foldkit web app and its screenshot and call-log parity harness;
Before merge
Production impactOpen errors in the changed files
After this merges, Maple checks whether they stop. Production traffic of the changed files (last 7 days)
Telemetry this change adds and removes (1)
What was checked
Files not reviewed (307)The review ended before it read these diffs, so nothing above vouches for them.
|
|
Important Review skippedToo many files! This PR contains 899 files, which is 749 over the limit of 150. To get a review, reduce the PR to 150 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configuration
⛔ Files ignored due to path filters: 2
📒 Files selected for processing: 899
You can disable this status message by setting the
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
… sampling.ts The backend suites start the fixture backend (libchdb, apps/api source), so they run locally via test:backend. The moved warehouse modules use the query-engine summarizeSampling, leaving apps/web/src/lib/sampling.ts unused (knip).
Maple review🟢 Confidence 9/10 · safe to merge The head commit deletes
Before merge
Production impactOpen errors in the changed files
After this merges, Maple checks whether they stop. Production traffic of the changed files (last 7 days)
Telemetry this change adds and removes (1)
What was checked
|
…e imports need CI installs a test lane's workspaces only; apps/web's own dependencies were missing for the modules web-foldkit imports from it (http client, lab fixtures).
Maple review🟢 Confidence 10/10 · safe to merge Adds
Before merge
Production impactOpen errors in the changed files
After this merges, Maple checks whether they stop. Production traffic of the changed files (last 7 days)
Telemetry this change adds and removes (1)
What was checked
|
🍁 Maple PR previewThe preview is ready:
Smoke test: passed Sign in with the PR preview form on the sign-in page and the preview access key ( Deployed from |
Maple reviewNothing to review Foldkit web-app foundations plus the parity harness; this pass only covers Before merge
Production impactOpen errors in the changed files
After this merges, Maple checks whether they stop. Production traffic of the changed files (last 7 days)
Telemetry this change adds and removes (1)
|
Foundations for rebuilding the web app in Foldkit, plus the harness that proves a ported screen matches the React one pixel for pixel. Nothing user-facing changes:
apps/web-foldkitis not deployed, and everyapps/webchange is a neutral refactor or lab-only.What changed
packages/ui-parity: the acceptance test. Builds both apps statically against one fixture backend and compares screenshots, layout and styles, ARIA trees and the API calls each app sends.@maple/domainHttpApi groups. Warehouse queries run through the real query-engine on chDB, seeded deterministically.apps/web-foldkit: the Foldkit app./sign-inand/servicesidentical.apps/webrefactors. Each was proven by legacy-vs-legacy parity, with byte-identical screenshots and call logs.@maple/uiclass composition moved into framework-free*.styles.tsmodules (76 of them).@maple/web-data.@maple/effect-dbno longer depends on React./lab/kit/*component gallery pages, which are the parity targets for the kit.docs/foldkit-migration.md(plan and status),docs/foldkit-decisions/s1–s8(spike decision records), anddocs/foldkit-agent-brief.md.Verification
@maple/web,@maple/web-data,@maple/ui,@maple/effect-db,apps/web-foldkit,packages/ui-parityall passapps/web-foldkit142 passing;packages/web-data147;packages/ui-paritybackend 19 and faults 4/sign-in2/2. Charts hover, logs bench and service map bench identical./servicespasses at 0 perceptual px with 0 behavior diffsStartup bundle: 709.7 KB gzip against main's 705.9 KB. The budget is raised to 710 KB, with the reason recorded in
check-bundle-budget.ts: the lab kit route shells and the web-data service layer.Bugs on main found by the harness
/lab/alertsthrew a SchemaError. feat(alerts): warning and critical tiers, recovery values and N-of-M on one rule #1509 madethresholdsrequired in the alert preview, and the lab fixture was never updated. Fixed here.workloadInfraTimeseriestwice. The first call has an empty workload name, before the workload resolves. Not fixed here.span-hierarchy.tsxscroll-to-selected stops early. It stops on estimated row heights, so the selected span is sometimes off screen. This is whylab-worst-caseflakes. Not fixed here.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.