Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
715 commits
Select commit Hold shift + click to select a range
f6c48f9
feat(web-foldkit): chat bar chart fences on the bar chart; sub-agent …
Makisuo Oct 18, 2026
7d19b24
Merge branch 'worktree-agent-abfbea9ee8c4e7953' into fk/parity-harness
Makisuo Oct 18, 2026
54e8e3a
fix(ui-parity): the raw-route call log and fixture writes pass the ro…
Makisuo Oct 18, 2026
59d241f
feat(local-ui-foldkit): port every local-ui page
Makisuo Oct 18, 2026
127cb7e
feat(local-ui-foldkit): disconnected screen, status and traces tests
Makisuo Oct 18, 2026
8efa60e
fix(local-ui-foldkit): frame the service map's first boxed layout
Makisuo Oct 18, 2026
efefbff
Merge branch 'worktree-agent-a60d9c32730a4a169' into fk/parity-harness
Makisuo Oct 18, 2026
c5d4c9c
test(ui-parity): mobile scenarios for the most used pages and their f…
Makisuo Oct 18, 2026
dfa5472
feat(web-foldkit): shell mobile layout, page rails as sheets below lg
Makisuo Oct 18, 2026
8bc08f7
Merge branch 'worktree-agent-a20650bc7bb257ac8' into worktree-agent-a…
Makisuo Oct 18, 2026
ebdb09b
feat(web-foldkit): kit options local-ui needs
Makisuo Oct 18, 2026
e97cebd
fix(local-ui-foldkit): connect popover, log sheet and trace detail pa…
Makisuo Oct 18, 2026
50ea5d1
feat(ui-parity): local-ui interaction scenarios
Makisuo Oct 18, 2026
525e7d3
Merge branch 'worktree-agent-a20650bc7bb257ac8' into fk/parity-harness
Makisuo Oct 18, 2026
0ebfe79
docs(foldkit): local-ui port status
Makisuo Oct 18, 2026
9384f12
Merge branch 'worktree-agent-aeb8fcb3f9b261fc3' into worktree-agent-a…
Makisuo Oct 18, 2026
eb11ef9
feat(web-foldkit): where-clause autocomplete in the query builder, wi…
Makisuo Oct 18, 2026
1ab1aad
feat(web-foldkit): tooltips on disabled menu items; the Embed chart r…
Makisuo Oct 18, 2026
1c9ef2b
feat(web-foldkit): Reconnect on the tab-behind toast recreates the or…
Makisuo Oct 18, 2026
d997428
fix(web-foldkit): logs and errors read their filter facets when the r…
Makisuo Oct 18, 2026
3acc5c2
feat(web-foldkit): errors activity Show earlier past 50 rows; attach-…
Makisuo Oct 18, 2026
c2f039b
Merge branch 'worktree-agent-aeb8fcb3f9b261fc3' into fk/parity-harness
Makisuo Oct 18, 2026
d92e648
refactor(local-ui-foldkit): one series chart for both detail pages
Makisuo Oct 18, 2026
eba3ac4
feat(local-ui-foldkit): query console Cancel interrupts the request
Makisuo Oct 18, 2026
b0e65bf
feat(local-ui-foldkit): locale and zone from Flags; refresh re-probes…
Makisuo Oct 18, 2026
38c9bc0
feat(web-foldkit): releases commit-sha hover card and health-pill too…
Makisuo Oct 18, 2026
057288e
fix(web-foldkit): services mobile stat labels split like MobileStat's…
Makisuo Oct 18, 2026
2eef8f0
feat(web-foldkit): /chat mobile header and conversation sheet
Makisuo Oct 18, 2026
440d3ef
fix(web-foldkit): analytics Events card seeds its sort column the way…
Makisuo Oct 18, 2026
e212bac
fix(ui-parity): errors-busy's second repository typechecks against th…
Makisuo Oct 18, 2026
de6d9ad
fix(web-foldkit): lab pages typecheck against the merged errors hub r…
Makisuo Oct 18, 2026
a059a44
feat(web-foldkit): /lab/service-map-3d over the 3D viewport Submodel
Makisuo Oct 18, 2026
05afc7b
feat(web-foldkit): /lab/gcp-dashboard over the dashboards view, secti…
Makisuo Oct 18, 2026
d2c955b
feat(web-foldkit): window.__dashboardGridBench for the dashboard grid…
Makisuo Oct 18, 2026
1f68460
docs(ui-parity): what the lab-worst-case waterfall race is on the Fol…
Makisuo Oct 18, 2026
2764f80
feat(local-ui-foldkit): shared log sheet in a portal with the error b…
Makisuo Oct 18, 2026
7a5cb4a
fix(web-foldkit): infra pages ask the shell for useInfraSurfaces belo…
Makisuo Oct 18, 2026
39c7101
fix(web-foldkit): error issue reads GitHub when its rail mounts
Makisuo Oct 18, 2026
34c26f5
feat(ui-parity): refusals fault and a deterministic local disconnecte…
Makisuo Oct 18, 2026
fde08b5
test(ui-parity): mobile scenarios for detail, infra, ops and code rev…
Makisuo Oct 18, 2026
58d35c9
test(ui-parity): interaction scenarios for the gcp dashboard and 3D s…
Makisuo Oct 18, 2026
4c5b5f4
feat(web-foldkit): pages see max-sm; the analytics chart narrows its …
Makisuo Oct 18, 2026
57ddaeb
fix(web-foldkit): agent sessions rail detects its models when it mounts
Makisuo Oct 18, 2026
e5911a2
Merge branch 'worktree-agent-ab03ca3b64702b860' into fk/parity-harness
Makisuo Oct 18, 2026
adf6763
fix(web-foldkit): shell labs mount the Notifications regions, as lega…
Makisuo Oct 18, 2026
c9225cc
test(ui-parity): mobile loading and error states of the most used pages
Makisuo Oct 18, 2026
5f95fdc
feat(local-ui-foldkit): saved query cache as a runtime resource, stal…
Makisuo Oct 18, 2026
f7d2bac
feat(local-ui-foldkit): cache the services catalog and the logs list,…
Makisuo Oct 18, 2026
fb0ee71
docs(foldkit): the mobile layout pattern in S8; dashboard-page notes …
Makisuo Oct 18, 2026
f4d3cf4
Merge branch 'worktree-agent-a1c8f466ec2463d9f' into worktree-agent-a…
Makisuo Oct 18, 2026
5a2862b
feat(local-ui-foldkit): cache the sessions list and facets and the er…
Makisuo Oct 18, 2026
4a79651
feat(local-ui-foldkit): cache the metrics list, summary and sparklines
Makisuo Oct 18, 2026
cfc01e3
Merge branch 'worktree-agent-a1c8f466ec2463d9f' into fk/parity-harness
Makisuo Oct 18, 2026
e8beed7
feat(local-ui-foldkit): cache the service and metric detail reads
Makisuo Oct 18, 2026
8315686
feat(local-ui-foldkit): cache the session detail reads
Makisuo Oct 18, 2026
5026b08
feat(local-ui-foldkit): cache the span panel reads and the query cons…
Makisuo Oct 18, 2026
c2415ce
test(ui-parity): local reload on an empty store refetches presence
Makisuo Oct 18, 2026
2a65c3a
docs(foldkit): local-ui status
Makisuo Oct 18, 2026
90bce80
Merge branch 'worktree-agent-a1624bfff2da4cbef' into worktree-agent-a…
Makisuo Oct 18, 2026
51dd29a
Merge branch 'worktree-agent-a14c2aa2911989bdc' into worktree-agent-a…
Makisuo Oct 18, 2026
df96652
Merge branch 'worktree-agent-a1624bfff2da4cbef' into fk/parity-harness
Makisuo Oct 18, 2026
790d357
docs(ui-parity): dashboards-view-behind-reconnect is a documented leg…
Makisuo Oct 18, 2026
8193486
Merge branch 'worktree-agent-a14c2aa2911989bdc' into fk/parity-harness
Makisuo Oct 18, 2026
a68002d
feat(web-foldkit): infra correlation panel in the log sheet and span …
Makisuo Oct 18, 2026
5b308f9
feat(web-foldkit): pointer drag reordering of list widget columns
Makisuo Oct 18, 2026
5bd585c
fix(web-foldkit): measure a chart's plot box with the fallback drawn
Makisuo Oct 18, 2026
d73eebe
feat(local-ui-foldkit): service map rows through the result cache
Makisuo Oct 18, 2026
13bacff
fix(web-foldkit): drop page Messages from an older instance of the sa…
Makisuo Oct 18, 2026
d87781e
fix(web-foldkit): analytics events answer lands after the breakdowns,…
Makisuo Oct 18, 2026
fc91c8f
fix(web-foldkit): a repository's late rules save leaves another repos…
Makisuo Oct 18, 2026
566ad74
fix(web-foldkit): closing the create-key dialog mid-create keeps the …
Makisuo Oct 18, 2026
a4d3fbe
fix(web-foldkit): a destination save stays in flight across a reopen …
Makisuo Oct 18, 2026
ef20a04
fix(web-foldkit): a GCP wizard write stays in flight across a reopen …
Makisuo Oct 18, 2026
edd9cbc
fix(web-foldkit): chat waits for the history before sending, and pars…
Makisuo Oct 18, 2026
fb4a715
fix(web-foldkit): the chat sheet drops a previous thread's late answers
Makisuo Oct 18, 2026
d7db1fe
fix(web-foldkit): one widget add and one navigation per dashboard pick
Makisuo Oct 18, 2026
57c0345
fix(web-foldkit): the code-review sheet never shows the previous revi…
Makisuo Oct 18, 2026
cfd22ad
feat(local-ui-foldkit): mobile sheets, chip JSON view, cache parity
Makisuo Oct 18, 2026
99ba77f
Merge branch 'worktree-agent-ac9287d9beb10f03d' into fk/parity-harness
Makisuo Oct 18, 2026
1ef589d
fix(web-foldkit): the investigation traces row picks its service at r…
Makisuo Oct 18, 2026
f3c27b4
fix(web-foldkit): alert rule load-more answers only its own checks panel
Makisuo Oct 18, 2026
86dfa4f
fix(web-foldkit): a traces next page is accepted only for the request…
Makisuo Oct 18, 2026
af2d198
fix(web-foldkit): a replays next page is accepted only for the reques…
Makisuo Oct 18, 2026
d98f99b
fix(web-foldkit): an agent session's dropped later page no longer res…
Makisuo Oct 18, 2026
dbb45a7
fix(web-foldkit): the error issue lease countdown ticks
Makisuo Oct 18, 2026
2223f08
fix(web-foldkit): a single error row's write keeps the hub selection
Makisuo Oct 18, 2026
524e5fc
fix(web-foldkit): a shared dashboard's Reload and auto-refresh advanc…
Makisuo Oct 18, 2026
15e6787
fix(web-foldkit): the Google Cloud list's connector clock ticks
Makisuo Oct 18, 2026
4e228be
fix(web-foldkit): the time picker's UTC offset is read for the curren…
Makisuo Oct 18, 2026
c5376db
feat(web-foldkit): port the command palette, global shortcuts and the…
Makisuo Oct 18, 2026
4e9cf90
test(ui-parity): command palette scenarios (open, search, keys, every…
Makisuo Oct 18, 2026
366eb7c
fix(web-foldkit): cloudflare zone and worker ingest poll advances the…
Makisuo Oct 18, 2026
e003aa3
Merge branch 'worktree-agent-a44a73d7e50ab5ca7' into fk/parity-harness
Makisuo Oct 18, 2026
be4c7f2
fix(web-foldkit): anomalies live ticks read the clock; stale load-mor…
Makisuo Oct 18, 2026
32d0da2
fix(web-foldkit): agent sessions next-page answers carry their offset
Makisuo Oct 18, 2026
d093d9d
fix(web-foldkit): email preferences Save waits for a digest toggle in…
Makisuo Oct 18, 2026
6fecb52
fix(web-foldkit): rapid severity picks write the last one
Makisuo Oct 18, 2026
1422691
fix(web-foldkit): services SHA copy toasts the write's outcome
Makisuo Oct 18, 2026
24ec2a0
fix(web-foldkit): replay trace spans that failed are asked again on r…
Makisuo Oct 18, 2026
e260e1d
fix(web-foldkit): integration statuses do not keep a failed load
Makisuo Oct 18, 2026
50542ca
fix(web-foldkit): integrations re-read a status after a write even wh…
Makisuo Oct 18, 2026
f591065
fix(web-foldkit): GCP removed-connector storage tolerates blocked sit…
Makisuo Oct 18, 2026
0e27dc3
fix(web-foldkit): widget editor reports a failed time-range save
Makisuo Oct 18, 2026
5723285
fix(web-foldkit): log page ignores stale and repeated log answers
Makisuo Oct 18, 2026
d5851d6
fix(web-foldkit): where-clause listbox clears the side it no longer uses
Makisuo Oct 18, 2026
75bc5c5
fix(web-foldkit): service map re-resolves its window on a zone change
Makisuo Oct 18, 2026
aea2181
fix(web-foldkit): logs volume, dashboards header and GCP tables forma…
Makisuo Oct 18, 2026
4bc3dae
fix(web-foldkit): PlanetScale events window is read as local time in …
Makisuo Oct 18, 2026
56d2d16
fix(web-foldkit): agent session token titles format in the read locale
Makisuo Oct 18, 2026
88c39e1
fix(web-foldkit): infra frame reads the browser locale; the pod peek …
Makisuo Oct 18, 2026
e9f6af1
refactor(web-foldkit): replace inline casts with proper typing
Makisuo Oct 18, 2026
5c15bfa
Merge branch 'worktree-agent-a5fc82f4d61828382' into fk/parity-harness
Makisuo Oct 19, 2026
0ec73c5
Merge branch 'worktree-agent-a2ea6e53645e481fa' into fk/parity-harness
Makisuo Oct 19, 2026
7e5d8c7
Merge branch 'worktree-agent-a41796997a3393b9e' into fk/parity-harness
Makisuo Oct 19, 2026
6adf4cb
Merge branch 'worktree-agent-a95b9e67183589f30' into fk/parity-harness
Makisuo Oct 19, 2026
2d8d62e
fix(foldkit): the local span panel's inert infra slot; scene tests re…
Makisuo Oct 19, 2026
f8ba068
feat(web-foldkit): where-clause suggestions for any number of fields,…
Makisuo Oct 19, 2026
5475d3c
feat(web-foldkit): where suggestions in the list filter, population f…
Makisuo Oct 19, 2026
7b4d822
test(ui-parity): widget editor where suggestions in the list, populat…
Makisuo Oct 19, 2026
12efa98
fix(foldkit): key Detect chats by open and token; split destination p…
Makisuo Oct 19, 2026
38aa844
fix(foldkit): investigation Retry resubscribes the live shape
Makisuo Oct 19, 2026
d2918fb
fix(foldkit): service map Reload revalidates the environment facets p…
Makisuo Oct 19, 2026
c6a1d0d
fix(ui-parity): billing error scenario waits out the GET retries; dai…
Makisuo Oct 19, 2026
4b5ebe2
Merge branch 'worktree-agent-a0831b153d77dc52f' into fk/parity-harness
Makisuo Oct 19, 2026
74cd72f
docs(foldkit): status as of the last full parity run
Makisuo Oct 19, 2026
a511f0e
docs(foldkit): correct the parity totals
Makisuo Oct 19, 2026
494bfaf
feat(foldkit): deploy the Foldkit app to fk-pr-<n>.maple.dev on PR pr…
Makisuo Oct 19, 2026
fdcfebd
fix(local-ui-foldkit): rebuild trace-detail tabs and panel when a ref…
Makisuo Oct 19, 2026
d1e8b77
fix(local-ui-foldkit): no Load more on placeholder rows; a Reload ret…
Makisuo Oct 19, 2026
f6269ac
fix(foldkit): show a widget's own time range in its tile header
Makisuo Oct 19, 2026
12e44f9
fix(foldkit): share frame gate, sections, variables and embed appearance
Makisuo Oct 19, 2026
70b5c8d
fix(local-ui-foldkit): stop superseded and abandoned /local/query req…
Makisuo Oct 19, 2026
57dadac
fix(local-ui-foldkit): count an error card's traces in the stale-data…
Makisuo Oct 19, 2026
e53c890
fix(foldkit): preview a dashboard version with its own data
Makisuo Oct 19, 2026
7d98c93
fix(local-ui-foldkit): a cached empty list reads signal presence like…
Makisuo Oct 19, 2026
400d8b8
fix(foldkit): dashboard dialogs open over a failed write still save
Makisuo Oct 19, 2026
c622cb2
fix(foldkit): sequence dashboard share-list reads, open Embed over a …
Makisuo Oct 19, 2026
79dc72b
fix(local-ui-foldkit): relative times and session liveness follow the…
Makisuo Oct 19, 2026
7900718
fix(foldkit): infra presence reaches pages, plus final-review infra f…
Makisuo Oct 19, 2026
2b02b96
fix(foldkit): ui primitives match Base UI on Escape, disabled items, …
Makisuo Oct 19, 2026
c0ecdbb
fix(foldkit): agent-sessions final-review findings 4, 16-21
Makisuo Oct 19, 2026
ef97ab5
fix(foldkit): chat final-review findings 22, 23, 24, 28
Makisuo Oct 19, 2026
78fca2d
fix(foldkit): code-review final-review findings 26, 27
Makisuo Oct 19, 2026
5f742b6
fix(foldkit): investigations final-review findings 11-15
Makisuo Oct 19, 2026
d73a19e
fix(foldkit): errors final-review findings 5-9
Makisuo Oct 19, 2026
564b377
fix(foldkit): billing tab waits on the Stripe checkout return and rec…
Makisuo Oct 19, 2026
001ee20
fix(foldkit): the widget editor previews dashboard variables at their…
Makisuo Oct 19, 2026
590e7bf
fix(foldkit): template previews read variables at their defaults
Makisuo Oct 19, 2026
91f4261
fix(foldkit): show the wrong-region screen for an org another region …
Makisuo Oct 19, 2026
92b26f2
fix(foldkit): final-review fixes for traces, logs, services, service-…
Makisuo Oct 19, 2026
70d7881
fix(foldkit): hold navigation away from unsaved widget edits
Makisuo Oct 19, 2026
fea6f80
fix(foldkit): alerts and anomalies review lows and the link dialog by…
Makisuo Oct 19, 2026
0638fa6
fix(foldkit): the widget editor's Custom time range gets its own picker
Makisuo Oct 19, 2026
2d2fbeb
fix(foldkit): ask a new org for its data region first in /quick-start
Makisuo Oct 19, 2026
f9f4dc9
fix(foldkit): the template detail panel is a sheet below lg
Makisuo Oct 19, 2026
9cdbe6a
fix(foldkit): alert editor sync failure, widget lookup and validation…
Makisuo Oct 19, 2026
cf02a76
fix(foldkit): open Clerk's re-verification challenge for account writ…
Makisuo Oct 19, 2026
0d3b572
fix(foldkit): add the OpenRouter add-on from Settings > AI
Makisuo Oct 19, 2026
7302724
fix(foldkit): audit log lists members in the Person filter and keeps …
Makisuo Oct 19, 2026
d3f5433
fix(foldkit): dashboards list survives a dead sync stream and reports…
Makisuo Oct 19, 2026
adec64c
feat(foldkit): time range picker custom range, D hotkey and maximum r…
Makisuo Oct 19, 2026
182bebf
fix(foldkit): a failed members Load more stops spinning and can be re…
Makisuo Oct 19, 2026
40b099f
fix(foldkit): drop a failed session read so the next reader asks again
Makisuo Oct 19, 2026
56e9e25
fix(foldkit): retry a failed widget-editor metric list or key lookup
Makisuo Oct 19, 2026
c44a657
feat(foldkit): chat destinations: channel picker and workspace connec…
Makisuo Oct 19, 2026
c6d6e8e
fix(foldkit): a dashboard's Undo toast restores after leaving the board
Makisuo Oct 19, 2026
ac8a689
test(parity): checkout return, wrong-region, AI add-on and Clerk audi…
Makisuo Oct 19, 2026
5eb1c4e
refactor(foldkit): reverification fails with ClerkActionError, no unk…
Makisuo Oct 19, 2026
ae0877a
style(foldkit): wrap and dedent billing and audit-log commands
Makisuo Oct 19, 2026
2c43df0
feat(foldkit): port the top bar Connect panel (endpoint, keys, live s…
Makisuo Oct 19, 2026
dac307a
fix(foldkit): a list wider than the cap offers Show last 7 days
Makisuo Oct 19, 2026
2c627dd
chore(foldkit): drop stale toolbar TODOs; every More action is wired
Makisuo Oct 19, 2026
fd3acea
feat(foldkit): email and Hazel destination fields
Makisuo Oct 19, 2026
439471c
test(foldkit): the dashboard Undo names its own board, so it never la…
Makisuo Oct 19, 2026
8ba0e41
test(ui-parity): chat, Hazel and keyboard link-issue destination writes
Makisuo Oct 19, 2026
b0f8df4
fix(foldkit): shell reads are org-scoped, the namespace list searches…
Makisuo Oct 19, 2026
fcf2b5f
fix(foldkit): page instances, retained data, post-write re-reads and …
Makisuo Oct 19, 2026
f7c43fe
test(ui-parity): settle the returned focus ring before the keyboard l…
Makisuo Oct 19, 2026
d815a2b
fix(foldkit): the wrong-region screen boots no shell reads; scenarios…
Makisuo Oct 19, 2026
3a9e2d2
feat(foldkit): time range picker timezone select stores the zone pref…
Makisuo Oct 19, 2026
34e891a
Merge remote-tracking branch 'origin/main' into fk/parity-harness
Makisuo Oct 19, 2026
d73a763
feat(web-foldkit): move ingest keys to the Ingestion page
Makisuo Oct 19, 2026
2cd171a
fix(web-foldkit): sort time picker quick select by duration
Makisuo Oct 19, 2026
9f2e43a
test(parity): drop the checkout-return scenario, legacy's checklist r…
Makisuo Oct 19, 2026
9fc01c9
fix(foldkit): the anomaly link dialog leaves focus on the body when i…
Makisuo Oct 19, 2026
4b94ae4
fix(foldkit): a palette ranking of the list before its services lande…
Makisuo Oct 19, 2026
4d547db
feat(web-foldkit): connect Google Cloud by script, console steps, or …
Makisuo Oct 19, 2026
ff829c0
Merge branch 'worktree-agent-a8aeb057df01ffcbb' into fk/parity-harness
Makisuo Oct 19, 2026
4dc0c89
Merge branch 'worktree-agent-aaa7bf018b2a2eacd' into fk/parity-harness
Makisuo Oct 19, 2026
085e12c
Merge branch 'worktree-agent-ae3bea713e7b66594' into fk/parity-harness
Makisuo Oct 19, 2026
b7b9f1b
Merge branch 'worktree-agent-aebd19ed917bc2642' into fk/parity-harness
Makisuo Oct 19, 2026
e3fae97
Merge branch 'worktree-agent-ad2f4501094a3aafd' into fk/parity-harness
Makisuo Oct 19, 2026
f31e27e
Merge branch 'worktree-agent-a10eb7a40a1f3b7f1' into fk/parity-harness
Makisuo Oct 19, 2026
c6ec8b6
Merge remote-tracking branch 'origin/main' into fk/parity-harness
Makisuo Oct 19, 2026
3c239b1
feat(web-foldkit): offer every chat connector to every org
Makisuo Oct 19, 2026
e600d54
Merge fk/parity-harness (main and six fix branches) into the shared-c…
Makisuo Oct 19, 2026
c533dd0
test(ui-parity): the keyboard link scenario no longer clicks away the…
Makisuo Oct 19, 2026
d6af66b
fix(foldkit): metrics pages re-resolve the window only when its field…
Makisuo Oct 19, 2026
64a034f
fix(foldkit): releases pages re-resolve the window only when its fiel…
Makisuo Oct 19, 2026
fb9f366
fix(foldkit): traces list re-resolves the window only when its fields…
Makisuo Oct 19, 2026
f69fdee
fix(foldkit): logs list re-resolves the window only when its fields c…
Makisuo Oct 19, 2026
897dd36
fix(foldkit): replays list re-resolves the window only when its field…
Makisuo Oct 19, 2026
f082111
refactor(foldkit): service map routes its window step through page/ki…
Makisuo Oct 19, 2026
b6a7194
refactor(foldkit): analytics routes its window step through page/kit/…
Makisuo Oct 19, 2026
1b39dbf
refactor(foldkit): alert rule routes its window step through page/kit…
Makisuo Oct 19, 2026
4a95dda
refactor(foldkit): error issue routes its window step through page/ki…
Makisuo Oct 19, 2026
acf14ce
fix(foldkit): infra pages re-resolve the window only when its fields …
Makisuo Oct 19, 2026
a36a69d
fix(foldkit): code review tabs re-resolve the window only when its fi…
Makisuo Oct 19, 2026
36a009a
fix(foldkit): cloudflare pages re-resolve the window only when its fi…
Makisuo Oct 19, 2026
f5e72a7
fix(foldkit): railway pages re-resolve the window only when its field…
Makisuo Oct 19, 2026
048e1ac
fix(foldkit): planetscale pages re-resolve the window only when its f…
Makisuo Oct 19, 2026
7846339
fix(foldkit): google cloud pages re-resolve the window only when its …
Makisuo Oct 19, 2026
e8a3189
feat(effect-sdk): add a Foldkit adapter at @maple-dev/effect-sdk/foldkit
Makisuo Oct 19, 2026
8e8bdef
docs(effect-sdk): document the Foldkit entry point and add its changeset
Makisuo Oct 19, 2026
b803338
Merge commit '3c239b1d0' into worktree-agent-a98710109e0c43f31
Makisuo Oct 19, 2026
508f088
feat(web-foldkit): send the app's own telemetry through the Foldkit SDK
Makisuo Oct 19, 2026
ea2f7f6
Merge remote-tracking branch 'origin/fk/parity-harness' into fk/parit…
Makisuo Oct 19, 2026
ad4d30a
Merge remote-tracking branch 'origin/main' into fk/parity-harness
Makisuo Oct 19, 2026
3664a7a
fix(web-foldkit): gate the integrations settings rail by the session …
Makisuo Oct 19, 2026
9b24544
feat(web-foldkit): overview setup checklist card in Clerk mode
Makisuo Oct 19, 2026
663604b
fix(web-foldkit): rank palette results in the input's own render
Makisuo Oct 19, 2026
f84f21a
fix(web-foldkit): no checklist re-read on navigations into /chat
Makisuo Oct 19, 2026
40e3575
fix(web-foldkit): keep the Slack tile's wait text through the popup's…
Makisuo Oct 19, 2026
88a4021
fix(web-foldkit): dialogs close on Escape with focus outside them, li…
Makisuo Oct 19, 2026
6f8c738
fix(web-foldkit): theme Clerk surfaces with legacy's appearance and l…
Makisuo Oct 19, 2026
7f9a9d8
feat(web-foldkit): Clerk profile photos and org logos in the avatars
Makisuo Oct 19, 2026
df504c2
fix(web-foldkit): type the stray-Escape root as an EventTarget
Makisuo Oct 19, 2026
9a19d4a
feat(web-foldkit): send legacy's product events and identify the session
Makisuo Oct 19, 2026
be41b96
feat(web-foldkit): say when a chat connector answers only linked users
Makisuo Oct 19, 2026
129a32d
feat(web-foldkit): Sources pages, connect flow and source detail
Makisuo Oct 19, 2026
5a39992
fix(web-foldkit): a started chat install re-reads the connectors, as …
Makisuo Oct 19, 2026
4052872
fix(web-foldkit): avatar images carry the name and hide the initials …
Makisuo Oct 19, 2026
26e1046
test(ui-parity): overview Clerk setup scenarios drive the first-trace…
Makisuo Oct 19, 2026
c0c6bc8
fix(ci): declare foldkit workspace deps, drop dead exports, tag fixtu…
Makisuo Oct 19, 2026
e90e20f
Merge branch 'worktree-agent-a65a5ba1e18eaefc0' into fk/parity-harness
Makisuo Oct 19, 2026
a452b24
Merge branch 'worktree-agent-a61412697d279aa02' into fk/parity-harness
Makisuo Oct 19, 2026
f37201c
fix(ci): lint the Foldkit apps in their own oxlint passes
Makisuo Oct 19, 2026
1a8e938
fix(web-foldkit): no checklist re-read when a retired settings tab re…
Makisuo Oct 19, 2026
b1bbb08
Merge remote-tracking branch 'origin/main' into fk/parity-harness
Makisuo Oct 19, 2026
a6c31bb
Merge remote-tracking branch 'origin/fk/parity-harness' into worktree…
Makisuo Oct 19, 2026
0b0736f
feat(web-foldkit): the rule window hint says how often a rule is checked
Makisuo Oct 19, 2026
5574184
fix(ci): raise the web startup budget to 716 KB after merging #1585
Makisuo Oct 19, 2026
57c050f
Merge remote-tracking branch 'origin/fk/parity-harness' into fk/parit…
Makisuo Oct 19, 2026
da07389
fix(ui-parity): drain a failed chDB query's partial output before the…
Makisuo Oct 19, 2026
a9b97b9
fix(ui-parity): bind the fixture API and Electric servers to loopback
Makisuo Oct 19, 2026
508d1b1
fix(ui-parity): serve a malformed percent escape as a client route
Makisuo Oct 19, 2026
46e37e9
fix(web-foldkit): a throwing unsubscribe still cleans the live query …
Makisuo Oct 19, 2026
32e208a
fix(web-foldkit): an in-place org change drops the previous org's pin…
Makisuo Oct 19, 2026
990c0b4
fix(web-foldkit): give each severity radio its own hidden input id
Makisuo Oct 19, 2026
5305e96
test(web-foldkit): cover default-first source ordering with two rows
Makisuo Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
5 changes: 5 additions & 0 deletions .changeset/effect-sdk-foldkit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@maple-dev/effect-sdk": minor
---

New `@maple-dev/effect-sdk/foldkit` entry point for Foldkit apps. `MapleFoldkit.make(config).instrument(appConfig)` wraps a `Runtime.makeApplication` config: Command spans are grouped under the page load or navigation that caused them, Commands that finished without a child span (focus, scroll, hover delays) are dropped, Command args export only ids and flags unless allowed by name, runtime crashes are reported with the recent Message tags, and slow `update`, `view` and DOM patch phases become spans.
4 changes: 4 additions & 0 deletions .github/workflows/deploy-pr-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ jobs:
SMOKE_OUTCOME: ${{ steps.smoke.outcome }}
DESTROY_OUTCOME: ${{ steps.destroy.outcome }}
WEB_URL: ${{ steps.deploy.outputs.web_url }}
WEB_FOLDKIT_URL: ${{ steps.deploy.outputs.web_foldkit_url }}
API_URL: ${{ steps.deploy.outputs.api_url }}
SYNC_URL: ${{ steps.deploy.outputs.sync_url }}
COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
Expand Down Expand Up @@ -231,6 +232,9 @@ jobs:
echo "| Service | Preview URL |"
echo "| :-- | :-- |"
printf '| Web | [%s](%s) |\n' "${WEB_URL#https://}" "$WEB_URL"
if [ -n "$WEB_FOLDKIT_URL" ]; then
printf '| Web (Foldkit) | [%s](%s) |\n' "${WEB_FOLDKIT_URL#https://}" "$WEB_FOLDKIT_URL"
fi
printf '| API | [%s](%s) |\n' "${API_URL#https://}" "$API_URL"
printf '| Electric Sync | [%s](%s) |\n' "${SYNC_URL#https://}" "$SYNC_URL"
if [ -n "$INGEST_URL" ]; then
Expand Down
10 changes: 9 additions & 1 deletion .oxlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@
{
"files": [
"apps/web/**",
"packages/web-data/**",
"apps/cli/**",
"packages/ui/**",
"packages/domain/**",
Expand Down Expand Up @@ -170,7 +171,14 @@
// ~460 `try`/`catch` blocks and ~500 non-null assertions between them.
// Drop entries from this list as each is converted rather than widening it.
{
"files": ["apps/**", "scripts/**", "**/scripts/**", "examples/**", "alchemy.run.ts"],
"files": [
"apps/**",
"packages/web-data/**",
"scripts/**",
"**/scripts/**",
"examples/**",
"alchemy.run.ts"
],
"rules": {
"maple/no-try-catch": "off",
"typescript/no-non-null-assertion": "off"
Expand Down
7 changes: 7 additions & 0 deletions alchemy.run.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import { createMapleIngest } from "./apps/ingest/alchemy.run.ts"
import Landing from "./apps/landing/src/worker.ts"
import LocalUi from "./apps/local-ui/src/worker.ts"
import Web from "./apps/web/src/worker.ts"
import WebFoldkit from "./apps/web-foldkit/src/worker.ts"

// Infisical defines CLOUDFLARE_DEFAULT_ACCOUNT_ID; alchemy reads CLOUDFLARE_ACCOUNT_ID.
if (!process.env.CLOUDFLARE_ACCOUNT_ID && process.env.CLOUDFLARE_DEFAULT_ACCOUNT_ID) {
Expand Down Expand Up @@ -340,6 +341,9 @@ export default Alchemy.Stack(
// A vite-source Worker: alchemy owns its build and dev server. Binds api as `API`.
const web = yield* Effect.provideService(Web, ApiWorker, api)
yield* serveWorker("web", web)
// The Foldkit dashboard beside it, on PR previews only (`fk-pr-<n>.maple.dev`).
const webFoldkit =
stage.kind === "pr" ? yield* Effect.provideService(WebFoldkit, ApiWorker, api) : undefined

// StaticSites run their production build even on `alchemy dev`, so dev uses
// `DEV_PROCESS_APPS` instead. Shared across instances: deployed by `us` alone.
Expand Down Expand Up @@ -371,6 +375,7 @@ export default Alchemy.Stack(
ingestUrl: urls.ingest,
electricSyncUrl: urls.electricSync,
webUrl: domains.web ? `https://${domains.web}` : "",
webFoldkitUrl: stage.kind === "pr" ? `https://fk-pr-${stage.prNumber}.maple.dev` : "",
landingUrl: domains.landing ? `https://${domains.landing}` : "",
localUiUrl: domains.local ? `https://${domains.local}` : "",
}
Expand All @@ -379,6 +384,7 @@ export default Alchemy.Stack(
yield* Effect.sync(() =>
appendStepOutputs([
`web_url=${summary.webUrl}`,
`web_foldkit_url=${summary.webFoldkitUrl}`,
`api_url=${summary.apiUrl}`,
`sync_url=${summary.electricSyncUrl}`,
`ingest_url=${ingest && domains.ingest ? `https://${domains.ingest}` : ""}`,
Expand All @@ -396,6 +402,7 @@ export default Alchemy.Stack(
apiWorker: api.workerName,
electricSyncWorker: electricSync.workerName,
webWorker: web?.workerName,
webFoldkitWorker: webFoldkit?.workerName,
landingWorker: landing?.workerName,
localUiWorker: localUi?.workerName,
alertingWorker: alerting.workerName,
Expand Down
8 changes: 2 additions & 6 deletions apps/landing/project.inlang/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,6 @@
#
# Inlang handles the gitignore itself starting with version ^2.5.
#
# everything is ignored except settings.json and Paraglide configuration
# everything is ignored except settings.json
*
!settings.json
!paraglide.config.js
!paraglide.config.mjs
!paraglide.config.ts
!paraglide.config.cjs
!settings.json
31 changes: 31 additions & 0 deletions apps/local-ui-foldkit/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<!doctype html>
<html lang="en" class="dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="color-scheme" content="dark light" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" href="/favicon.ico" />
<meta name="theme-color" content="#171410" />
<title>Maple Local</title>
<!-- Follow the OS theme before first paint so light-mode users don't see a dark
flash. entry.ts takes over from here (same class + colorScheme). -->
<script>
;(() => {
try {
const theme = window.matchMedia("(prefers-color-scheme: light)").matches
? "light"
: "dark"
const root = document.documentElement
root.classList.remove("light", "dark")
root.classList.add(theme)
root.style.colorScheme = theme
} catch {}
})()
</script>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/entry.ts"></script>
</body>
</html>
38 changes: 38 additions & 0 deletions apps/local-ui-foldkit/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"name": "@maple/local-ui-foldkit",
"private": true,
"type": "module",
"scripts": {
"dev": "vite dev --port ${PORT:-4329} --host ${HOST:-127.0.0.1}",
"build": "vite build",
"test": "vitest run --passWithNoTests",
"typecheck": "tsrs --noEmit"
},
"dependencies": {
"@floating-ui/dom": "1.8.0",
"@foldkit/ui": "0.168.0",
"@fontsource-variable/geist": "^5.3.0",
"@fontsource-variable/geist-mono": "^5.3.0",
"@maple/domain": "workspace:*",
"@maple/local-ui": "workspace:*",
"@maple/query-engine": "workspace:*",
"@maple/ui": "workspace:*",
"@maple/web-foldkit": "workspace:*",
"@tanstack/charts": "catalog:charts",
"@tanstack/charts-scales": "catalog:charts",
"effect": "catalog:effect",
"foldkit": "0.168.0",
"sugar-high": "^2.5.1"
},
"devDependencies": {
"@effect/language-service": "catalog:effect",
"@foldkit/vite-plugin": "0.27.1",
"@tailwindcss/vite": "catalog:tailwind",
"@types/node": "catalog:tooling",
"tailwindcss": "catalog:tailwind",
"tw-animate-css": "catalog:tailwind",
"typescript": "catalog:tooling",
"vite": "catalog:",
"vitest": "catalog:"
}
}
100 changes: 100 additions & 0 deletions apps/local-ui-foldkit/src/command.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import { writeLocalStorage } from "@maple/ui/lib/local-storage"
import { Clock, Duration, Effect, Schema } from "effect"
import { Command } from "foldkit"
import { load, pushUrl, replaceUrl } from "foldkit/navigation"
import { fetchSignalPresence, PRESENCE_STALE_MS } from "./data/signal-presence"
import { RANGE_STORAGE_KEY, Theme } from "./env"
import { Message } from "./message"
import { probeServer } from "./server/probe"

/** `navigate(path, query, { replace })`: page moves push, in-place filter tweaks replace. */
export const Navigate = Command.define("NavigateLocal", {
args: { hash: Schema.String, isReplace: Schema.Boolean },
messages: [Message.CompletedNavigate],
execute: ({ hash, isReplace }) =>
(isReplace ? replaceUrl(hash) : pushUrl(hash)).pipe(Effect.as(Message.CompletedNavigate())),
})

/** A link to another origin (docs) is a full navigation. */
export const LoadExternal = Command.define("LoadLocalExternal", {
args: { href: Schema.String },
messages: [Message.CompletedNavigate],
execute: ({ href }) => load(href).pipe(Effect.as(Message.CompletedNavigate())),
})

/** `goBack`: history back within the app. */
export const GoBack = Command.define("GoBackLocal", {
messages: [Message.CompletedNavigate],
execute: Effect.sync(() => {
history.back()
return Message.CompletedNavigate()
}),
})

export const RememberRange = Command.define("RememberLocalRange", {
args: { range: Schema.String },
messages: [Message.CompletedRememberRange],
execute: ({ range }) =>
Effect.sync(() => {
writeLocalStorage(RANGE_STORAGE_KEY, range)
return Message.CompletedRememberRange()
}),
})

export const ProbeServer = Command.define("ProbeLocalServer", {
args: { apiBase: Schema.String },
messages: [Message.CompletedProbeServer],
execute: ({ apiBase }) =>
Effect.gen(function* () {
const outcome = yield* probeServer(apiBase)
const checkedAtMs = yield* Clock.currentTimeMillis
return Message.CompletedProbeServer({ outcome, checkedAtMs })
}),
})

/** `useSignalPresence`: a read younger than `staleTime` is reused, else the store is asked again. */
export const FetchSignalPresence = Command.define("FetchLocalSignalPresence", {
args: { apiBase: Schema.String, lastReadAtMs: Schema.NullOr(Schema.Number) },
messages: [Message.SucceededFetchSignalPresence, Message.FailedFetchSignalPresence, Message.ReusedSignalPresence],
execute: ({ apiBase, lastReadAtMs }) =>
Effect.gen(function* () {
const nowMs = yield* Clock.currentTimeMillis
if (lastReadAtMs !== null && nowMs - lastReadAtMs < PRESENCE_STALE_MS) return Message.ReusedSignalPresence()
return yield* fetchSignalPresence(apiBase).pipe(
Effect.map((result) => Message.SucceededFetchSignalPresence({ result })),
Effect.catch((failure) => Effect.succeed(Message.FailedFetchSignalPresence({ failure }))),
)
}),
})

/** Apply the OS theme the way `setTheme(theme, { persist: false })` does. */
export const ApplyTheme = Command.define("ApplyLocalTheme", {
args: { theme: Theme },
messages: [Message.CompletedApplyTheme],
execute: ({ theme }) =>
Effect.sync(() => {
const root = document.documentElement
root.classList.remove("light", "dark")
root.classList.add(theme)
root.style.colorScheme = theme
return Message.CompletedApplyTheme()
}),
})

/** `SidebarProvider` keeps the open state in a cookie for a week. */
export const SaveSidebarState = Command.define("SaveLocalSidebarState", {
args: { isOpen: Schema.Boolean },
messages: [Message.CompletedSaveSidebarState],
execute: ({ isOpen }) =>
Effect.sync(() => {
document.cookie = `sidebar_state=${String(isOpen)}; path=/; max-age=${60 * 60 * 24 * 7}`
return Message.CompletedSaveSidebarState()
}),
})

export const WaitBeforeProbe =Command.define("WaitBeforeLocalProbe", {
args: { version: Schema.Number, delayMs: Schema.Number },
messages: [Message.ElapsedProbeDelay],
execute: ({ version, delayMs }) =>
Effect.as(Effect.sleep(Duration.millis(delayMs)), Message.ElapsedProbeDelay({ version })),
})
50 changes: 50 additions & 0 deletions apps/local-ui-foldkit/src/data/cache-store.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { DateTime, Option } from "effect"
import { describe, expect, test } from "vitest"
import { type CacheEntry, type CacheValue, hashKey, MAX_AGE_MS, newestOlderWindow, parseSaved, serialize } from "./cache-store"

const NOW = Date.parse("2026-10-01T12:00:00Z")
const entry = (key: ReadonlyArray<unknown>, updatedAtMs: number, data: CacheValue = []): CacheEntry => ({ key, data, updatedAtMs })
const mapOf = (...entries: ReadonlyArray<CacheEntry>) => new Map(entries.map((item) => [hashKey(item.key), item]))

describe("hashKey", () => {
test("ignores object key order and undefined fields, like React Query", () => {
expect(hashKey(["local", { b: 1, a: undefined, c: "x" }])).toBe(hashKey(["local", { c: "x", b: 1 }]))
})
})

describe("newestOlderWindow", () => {
const filters = { errorsOnly: false }
const current = ["local", "traces", filters, "2026-10-01 11:00:00/2026-10-01 12:00:00"]

test("picks the newest earlier window of the same length for the same view", () => {
const older = entry(["local", "traces", filters, "2026-10-01 09:00:00/2026-10-01 10:00:00"], NOW - 7_200_000)
const newer = entry(["local", "traces", filters, "2026-10-01 10:00:00/2026-10-01 11:00:00"], NOW - 3_600_000)
expect(newestOlderWindow(mapOf(older, newer), current)).toEqual(Option.some(newer))
})

test("skips other views, other lengths and later windows", () => {
const otherFilters = entry(["local", "traces", { errorsOnly: true }, "2026-10-01 10:00:00/2026-10-01 11:00:00"], NOW)
const longer = entry(["local", "traces", filters, "2026-10-01 05:00:00/2026-10-01 11:00:00"], NOW)
const later = entry(["local", "traces", filters, "2026-10-01 11:30:00/2026-10-01 12:30:00"], NOW)
expect(newestOlderWindow(mapOf(otherFilters, longer, later), current)).toEqual(Option.none())
})

test("a key without a window has no stand-in", () => {
expect(newestOlderWindow(mapOf(entry(["local", "trace", "a"], NOW)), ["local", "trace", "b"])).toEqual(Option.none())
})
})

describe("saved form", () => {
test("round-trips Effect values and drops entries older than a day", () => {
const startTime = DateTime.makeUnsafe(NOW - 1_000)
const fresh = entry(["local", "trace", "t1"], NOW - 60_000, { rows: [{ startTime, maybe: Option.some(1) }] })
const stale = entry(["local", "trace", "t2"], NOW - MAX_AGE_MS - 1)
const restored = parseSaved(serialize(mapOf(fresh, stale)), NOW)
expect([...restored.keys()]).toEqual([hashKey(fresh.key)])
expect(restored.get(hashKey(fresh.key))?.data).toEqual(fresh.data)
})

test("unreadable text restores nothing", () => {
expect(parseSaved("{not json", NOW).size).toBe(0)
})
})
Loading
Loading