use the official git-bug logo (ladybug with git branches):
- copy logo-alpha-flat-bg.svg as favicon and header logo
- copy favicon.ico from the old webui for legacy browser support
- import logo as React component via vite-plugin-svgr in the Header
- add theme-color meta tag and apple-touch-icon
- replace Lucide Bug icon with the real logo in the header
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
7caab09
feat(web): wrap repo images in Link to blob view
Click to expand commit body
repo-local images in markdown are now wrapped in a TanStack Router
Link to the blob viewer, so clicking an image navigates to the file
<Link to="/$repo/blob/$ref/$" params={...}>
<img src="/gitraw/repo/ref/path" />
</Link>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
96c1e61
feat(web): use typed router Links for relative markdown links
Click to expand commit body
override the `a` component in ReactMarkdown to render TanStack
Router Links for repo-local URLs, giving proper client-side
navigation with preloading instead of full page reloads
- relative links → <Link to="/$repo/blob/$ref/$" params={...}>
- anchor links (#heading) → plain <a>
- external links → plain <a>
- images stay as urlTransform to /gitraw (need raw bytes)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
c43fe50
refactor(web): move user profile filters to URL search params
Click to expand commit body
replace useState-based statusFilter and cursor pagination with URL
search params (status, after) on the /$repo/user/$id route:
- add validateSearch with valibot schema for status + after
- preload query via loaderDeps (re-fetches on status/page change)
- use useReadQuery instead of useUserProfileQuery
- open/closed toggle is now a proper Link (preloadable, shareable)
- pagination prev/next are ButtonLinks
- add search={{ status, after }} to all Links targeting user/$id
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
53eb77a
refactor(web): preload user profile initial query in route loader
Click to expand commit body
preload the first page of the user profile (open issues, no cursor)
in the route loader so the router waits before transitioning.
subsequent pagination and status filter changes still use useQuery
which either serves from Apollo cache or fetches fresh.
add pendingComponent skeleton and remove the manual loading guard.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
1162622
fix(web): add cursor-pointer to BackLink button state
Click to expand commit body
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
30adbb9
refactor(web): add BackLink component, use history.back with fallback
Click to expand commit body
create a reusable BackLink component that:
- uses router.history.back() when canGoBack is true (preserves
scroll position, filter state, pagination)
- falls back to a typed Link destination when there's no history
(e.g. direct navigation to a detail page)
replace all "Back to issues" Links and the CommitPage back button
with BackLink across bug detail, new issue, user profile, and
commit pages
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
23f8e53
build(web): use vite-tsconfig-paths instead of manual resolve.alias
Click to expand commit body
replace the explicit resolve.alias for @ with vite-tsconfig-paths
which reads path mappings from tsconfig.json automatically —
single source of truth for the @ → ./src alias
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
ed9536e
refactor(web): preload tree and blob queries in route loaders
Click to expand commit body
move tree and blob GraphQL queries from component-level useQuery
to route-level preloadQuery so data loads before the transition:
tree route:
- preload TREE_QUERY in loader (params provide ref + path)
- use useReadQuery for tree data, keep useQuery for cascading
lastCommits and readme queries (depend on tree result)
- add pendingComponent skeleton
blob route:
- preload BLOB_QUERY in loader
- add pendingComponent skeleton
remove loading props from FileTree and FileViewer since data is
always ready when the component renders (suspense handles loading)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
88aa379
feat: add /gitraw endpoint for ref+path raw file serving
Click to expand commit body
add a new HTTP handler at /gitraw/{repo}/{ref}/{path} that resolves
a git ref and file path to raw blob content, using BlobAtPath.
this enables the web UI to render images from markdown READMEs
without needing to know blob hashes upfront — the markdown renderer
rewrites relative image URLs to /gitraw/{repo}/{ref}/{resolved-path}
while relative links go to the code browser blob view.
- add BlobAtPath passthrough on RepoCache
- add gitRawHandler serving raw content with Content-Type detection
- register /gitraw route in webui server
- add /gitraw to Vite dev proxy
- simplify Markdown component: use urlTransform to rewrite URLs
based on file extension (images → /gitraw, links → blob viewer)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
9fa216b
feat(web): resolve relative links/images in markdown against the repo
Click to expand commit body
add optional repoContext prop to Markdown component with repo, ref,
and basePath. When set, relative URLs in markdown content are
rewritten to point to the code browser (/$repo/blob/$ref/path).
this makes images and links in READMEs like 
or [docs](doc/) resolve correctly against the current directory
and ref in the code browser.
issue comments don't pass repoContext, so their links are unaffected.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
59478a4
refactor(web): replace imperative navigation with proper Links
Click to expand commit body
FileTree:
- replace onClick handlers with typed Links on entry names and ".."
- remove onNavigate/onNavigateUp callback props
- pass repo/currentRef/currentPath for Link params construction
BugRow:
- replace string-interpolated hrefs with typed Link params
- change repo prop from string | null to string
CommitPage:
- use useCanGoBack() + router.history.back() instead of
window.history.back(), only show Back when there's history
all Links now use typed to/params for proper preloading and
accessible navigation (right-click, cmd+click, etc.)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
a6bee2c
fix(web): fix Code/Issues active state in header nav
Click to expand commit body
the NavLink active detection couldn't distinguish code vs issues
routes because they share the /$repo prefix
replace NavLink with plain Links that determine active state from
the matched route IDs — checking for _code or _issues layout routes
in the active matches via useRouterState
remove unused NavLink component from button-link.tsx
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
67a9da5
fix(web): reset highlight.js padding on code viewer
Click to expand commit body
the imported github.css theme sets padding on .hljs which caused
misalignment between line numbers and code content
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
2b84a8e
refactor(web): replace useMatchRoute with child route context for view mode
Click to expand commit body
each code browser child route (tree, blob, commits) now declares its
viewMode in beforeLoad context. The _code layout reads it from the
deepest match via useRouterState instead of pattern-matching route
paths with useMatchRoute.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
d5bbee5
fix(web): preserve view mode and path when switching refs
Click to expand commit body
the ref selector now navigates to the same view (tree/blob/commits)
and path on the new ref, instead of always resetting to tree root
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
41a443f
fix(web): move refs preload to $repo context, fix blinking on ref switch
Click to expand commit body
the refs query only depends on the repo slug, not the child route
(tree/blob/commits/ref). Preloading it in _code.tsx beforeLoad caused
a new QueryRef on every navigation, triggering suspense flashes.
move refs preload to $repo.tsx beforeLoad so it's loaded once per
repo and shared via context. The _code layout and /$repo redirect
both read from context instead of firing their own queries.
also replace window.location.href ref switch with router navigation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
25e7686
refactor(web)!: restructure code browser to GitHub-style URLs
Click to expand commit body
replace search-param-based code browser with proper URL segments:
/$repo/tree/$ref/...path → directory view
/$repo/blob/$ref/...path → file view
/$repo/commits/$ref → commit history
/$repo/ → redirect to tree/{defaultRef}
add pathless _code layout route that:
- preloads refs (branches/tags) in beforeLoad
- renders shared header: breadcrumb, ref selector, history toggle
- child routes (tree, blob, commits) render inside Outlet
convert CodeBreadcrumb segments from onClick handlers to typed Links
update Header "Code" NavLink and repo picker to use new URL structure
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
7a3893f
fix(web): use Route.useParams() for Link params, ref for GraphQL
Click to expand commit body
the normalized ref from context is null for the default repo, but
Link params need the raw URL slug (e.g. "_"). Use Route.useParams()
for Link params and context.ref for GraphQL variables.
also remove unnecessary non-null assertions on params from
Route.useParams() which always returns strings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
introduce /$repo/_issues as a pathless layout route that preloads
validLabels and allIdentities only for issue-related pages, instead
of loading them for every /$repo child (including code browser and
commit pages that don't need them)
move issue routes under _issues/:
$repo/_issues/issues/ → issue list
$repo/_issues/issues/new → new issue
$repo/_issues/issues/$id → issue detail
$repo/_issues/user/$id → user profile
$repo.tsx now only provides the normalized ref — labels/identities
preloading moved to _issues.tsx beforeLoad
URL paths are unchanged (the _issues prefix is stripped)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
74bf0a6
refactor(web): delete useRepo, pass repo as prop to shared components
Click to expand commit body
remove src/lib/repo.tsx entirely — the router context already provides
the resolved ref via $repo's beforeLoad
route components read repo from Route.useRouteContext(), then pass
it as a prop to shared components (Timeline, FileTree, CommitList,
FileDiffView) instead of those components reaching into router context
this keeps shared components decoupled from the routing layer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
71dd706
refactor(web): replace RepoShell React context with router context
Click to expand commit body
remove the hand-rolled RepoContext/RepoShell pattern — the $repo
route's beforeLoad already provides `ref` in the router context
- useRepo() now reads from useRouteContext({ strict: false })
instead of a dedicated React context
- remove RepoShell component — TanStack Router renders Outlet
automatically when no component is specified
- remove createContext/useContext/Outlet imports from repo.tsx
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
245b64c
refactor(web): use router context for preloadQuery and shared repo data
Click to expand commit body
provide preloadQuery via createRootRouteWithContext instead of
importing it directly in each route file:
- define RouterContext with preloadQuery in __root.tsx
- pass preloadQuery to createRouter({ context }) in App.tsx
- all route loaders access it via context.preloadQuery
use $repo beforeLoad to provide shared context to all child routes:
- resolve repo slug ("_" → null) once as context.ref
- preload validLabels and allIdentities queries (shared across
issue list, bug detail, etc.)
- child routes read labelsRef/identitiesRef from Route.useRouteContext()
instead of preloading their own copies
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
7cb78fc
refactor(web): simplify loader awaits with inline toPromise
Click to expand commit body
replace Promise.all + separate return with sequential await in
the return object — preloadQuery() calls already fire in parallel,
so awaiting them inline is equivalent but reads cleaner
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
0122c57
fix(web): await preloaded queries before route transition
Click to expand commit body
use preloadQuery.toPromise() in all route loaders so the router
waits for data to be ready before transitioning, instead of
rendering the component with a pending query ref
loaders with multiple queries use Promise.all to await them
in parallel
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
4425033
refactor(web): preload valid labels in bug detail route
Click to expand commit body
preload ValidLabelsDocument alongside BugDetailDocument in the
/$repo/issues/$id route loader, eliminating the waterfall where
LabelEditor would only start fetching labels after mount
pass validLabels as a prop to LabelEditor instead of the component
fetching its own copy with useValidLabelsQuery
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
ad9dc86
refactor(web): preload bug list query, pass labels/identities as props
Click to expand commit body
preload the bug list, valid labels, and all identities queries in
the /$repo/issues route loader using loaderDeps for search params:
- bugListRef depends on q/after search params (re-fetched on change)
- labelsRef and identitiesRef are independent (stable across filters)
pass labels/identities data down to IssueFilters and QueryInput as
props instead of each component fetching its own copy:
- add labels/identities props to IssueFilters and QueryInput
- export LabelItem/IdentityItem types from IssueFilters
- remove useValidLabelsQuery/useAllIdentitiesQuery from both components
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
8257431
refactor(web): use valibot for runtime validation
Click to expand commit body
replace hand-rolled typeof guards and unsafe type assertions with
valibot schemas for proper runtime validation:
- validateSearch: use v.object + v.fallback + v.picklist for typed
search param parsing with defaults (code page, issues page)
- fetch().json(): validate auth user and identity responses against
valibot schemas instead of unsafe `as` casts
- derive TypeScript types from schemas via v.InferOutput
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
disable react-in-jsx-scope (585 false positives with jsx: react-jsx)
fix no-unsafe-enum-comparison (7):
- import GitObjectType/GitRefType enums from codegen
- compare against enum members instead of string literals
fix no-unsafe-type-assertion (8):
- replace `as string` casts with typeof guards in validateSearch
- add type guard functions for union validation
fix no-array-sort (3):
- replace `[...arr].sort()` with `arr.toSorted()` (ES2023)
- add ES2023 to tsconfig lib
fix remaining:
- rename shadowed `_` variable (no-shadow)
- move handleSignOut to module scope (consistent-function-scoping)
- suppress import/no-unassigned-import for CSS import
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
5566ba0
build(web): use @tsconfig/bases for tsconfig presets
Click to expand commit body
extend @tsconfig/vite-react and @tsconfig/strictest to replace
hand-rolled compiler options:
tsconfig.app.json:
- extends @tsconfig/strictest + @tsconfig/vite-react
- adds verbatimModuleSyntax, erasableSyntaxOnly, noUncheckedIndexedAccess,
noImplicitOverride, noImplicitReturns, etc.
- disable exactOptionalPropertyTypes and noPropertyAccessFromIndexSignature
(incompatible with generated GraphQL types)
tsconfig.node.json:
- extends @tsconfig/strictest for strict checks
- keeps bundler-specific options inline (no base covers this)
fix code issues caught by stricter settings:
- guard suggestions[acIndex] access (noUncheckedIndexedAccess)
- use optional chaining for nodes[0] access
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
edd77e6
refactor(web): move issue list filters to URL search params
Click to expand commit body
replace useState-based filter state with URL search params on the
/$repo/issues route so that:
- open/closed toggle is a proper Link (preloadable, shareable)
- filter state is preserved in the URL and works with back/forward
- pagination cursor is in the URL via `after` param
- the query string `q` holds the full structured query
add search={{ q, after }} to all links targeting /$repo/issues
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
0807986
refactor(web): move page components into route files, add data preloading
Click to expand commit body
inline all page components from src/pages/ into their route files
in src/routes/, following TanStack Router conventions
add Apollo preloadQuery integration for router-level data loading:
- create preloadQuery helper via createQueryPreloader(client)
- preload repos query in / route loader
- preload bug detail query in /$repo/issues/$id loader
- preload commit query in /$repo/commit/$hash loader
- preload refs query in /$repo/ (code page) loader
- use useReadQuery() in components to read preloaded data
move loading skeletons to route-level pendingComponent:
- BugDetailSkeleton, CommitPageSkeleton, CodePageSkeleton
delete src/pages/ directory — all UI now lives in src/routes/
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
dda306d
Revert "build(web): ignore generated route tree and tanstack cache"
Click to expand commit body
This reverts commit e831dc5bdd7f9ab142ffe9c6ae9acfa9973f02ff.
Quentin Gliech
created
e831dc5
build(web): ignore generated route tree and tanstack cache
Click to expand commit body
add routeTree.gen.ts and .tanstack/ to .gitignore since they are
regenerated by the tanstack router vite plugin on every build
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
8dcd0bb
refactor(web): migrate to file-based routing
Click to expand commit body
replace code-based route tree with file-based routing using
@tanstack/router-plugin:
- add tanstackRouter vite plugin with autoCodeSplitting
- create src/routes/ directory mirroring the URL structure
- each route file uses createFileRoute/createRootRoute
- page components stay in src/pages/, route files just wire them up
- App.tsx now imports the generated routeTree from routeTree.gen.ts
- move CodePageSearch type to the route file where validateSearch lives
- ignore routeTree.gen.ts from linter and formatter
route structure:
__root.tsx → Shell + ErrorPage
index.tsx → RepoPickerPage
auth/select-identity.tsx → IdentitySelectPage
$repo.tsx → RepoShell layout
$repo/index.tsx → CodePage (with search params)
$repo/issues/ → BugListPage, NewBugPage, BugDetailPage
$repo/user/$id.tsx → UserProfilePage
$repo/commit/$hash.tsx → CommitPage
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
314d974
refactor(web): add ButtonLink/NavLink components, use typed links everywhere
Click to expand commit body
- create ButtonLink via createLink() for type-safe button-styled links
with preloading, replacing the <Button asChild><Link/></Button> pattern
- create NavLink via createLink() with activeProps/inactiveProps,
replacing manual useMatchRoute() active state detection
- convert all string-interpolated Link paths to typed params form
- convert onClick navigate handlers to ButtonLink where possible
- remove unnecessary type assertions on useParams (router Register
provides full type inference)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
e15604c
build(web)!: migrate from react-router to @tanstack/react-router
Click to expand commit body
replace react-router v7 with @tanstack/react-router for fully
type-safe routing with typed Link params and search params
- define code-based route tree with createRootRoute/createRoute
- register router type for global type inference
- add typed validateSearch for code page search params (ref, path, type)
- replace NavLink with Link + useMatchRoute for active state detection
- replace useSearchParams with useSearch/useNavigate
- replace useRouteError/isRouteErrorResponse with errorComponent props
- use typed Link params instead of string interpolation for all routes
- replace navigate(-1) with window.history.back()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
7ac37c3
fix(web): fix Slot import from unified radix-ui package
Click to expand commit body
the unified radix-ui package exports Slot as a namespace object,
not a component directly — use Slot.Root instead
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
0ae543b
refactor(web): migrate to unified radix-ui package
Click to expand commit body
replace individual @radix-ui/react-* packages with the unified
radix-ui package and update all imports accordingly
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
- upgrade @apollo/client from v3 to v4, add rxjs peer dependency
- move hook imports to @apollo/client/react (new canonical path)
- move ApolloProvider import to @apollo/client/react
- use explicit HttpLink instead of implicit uri option
- update codegen to use @apollo/client/react for generated hooks
- remove unused localState and incrementalHandler boilerplate
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
replace react-router-dom v6 with react-router v7, updating all
imports from "react-router-dom" to "react-router"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
d9df3d0
build(web): upgrade graphql-codegen to v6/v5
Click to expand commit body
upgrade @graphql-codegen/cli to 6.2.1,
@graphql-codegen/typescript and typescript-operations to 5.0.9
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
let rolldown handle chunk splitting automatically instead of
manually mapping vendor dependencies to named chunks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created
migrate from vite 6 to vite 8 (rolldown-based):
- upgrade vite to 8.0.3 and @vitejs/plugin-react to 6.0.1
- rename build.rollupOptions to build.rolldownOptions
- convert manualChunks from object form (removed) to function form
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Quentin Gliech
and
Claude Opus 4.6 (1M context)
created