Skip to content

V2#1167

Merged
Huijiro merged 65 commits intomainfrom
v2
Mar 27, 2026
Merged

V2#1167
Huijiro merged 65 commits intomainfrom
v2

Conversation

@Huijiro
Copy link
Copy Markdown
Member

@Huijiro Huijiro commented Mar 10, 2026

Agentuity SDK v2

Overview

v2 is a major architectural shift toward explicitness, type safety, and standard patterns. It removes build-time code generation (src/generated/), file-based auto-discovery, and SDK-specific wrappers in favor of direct Hono usage and user-controlled configuration.

Migration tool: npx @agentuity/migrate — see v1→v2 migration guide


Breaking Changes from v1

1. Explicit Agent Registration

Agents are no longer auto-discovered from src/agent/*/agent.ts. They must be explicitly imported and passed to createApp():

import * as agents from "./agent"; // barrel export
export default createApp({ agents });

2. Explicit Router (No More File-Based Routing)

Routes in src/api/*.ts are no longer auto-discovered. A Hono router must be explicitly provided:

import router from "./api";
export default createApp({ router, agents });

3. Use Hono Directly (No createRouter())

createRouter() wrapper is removed. Use new Hono<Env>() with chained methods (required for hc<AppRouter>() type inference):

import { Hono } from "hono";
import type { Env } from "@agentuity/runtime";

const router = new Hono<Env>()
  .get("/hello", (c) => c.json({ msg: "hi" }))
  .post("/echo", async (c) => c.json(await c.req.json()));

4. No More setup/shutdown Hooks

createApp({ setup, shutdown }) is removed. Use module-level initialization and process.on("beforeExit", ...) for cleanup.

5. React Client Helpers Removed

createClient, useAPI, RPCRouteRegistry, useEventStream, useWebsocket removed from @agentuity/react. Use hc<AppRouter>() from hono/client or any data-fetching library (TanStack Query, SWR, etc.).

6. Standard vite.config.ts

agentuity.config.ts no longer handles Vite configuration. Use a standard vite.config.ts and move runtime settings (analytics, workbench) to createApp().


What's New

New Package: @agentuity/migrate

CLI tool (npx @agentuity/migrate) that automates v1→v2 migration:

  • Auto-fixes: Deletes src/generated/, removes bootstrapRuntimeEnv(), rewrites routes to chained Hono style, generates barrel files for agents and routes
  • Guided migrations: Adds comments for setup/shutdown removal, config consolidation
  • Safety: Requires clean git worktree, supports --dry-run

Runtime Bootstrap Consolidation

New packages/runtime/src/bootstrap.ts — server lifecycle (analytics, workbench, static serving, middleware) extracted from createApp() into dedicated helpers.

Build System Overhaul (packages/cli)

  • Deleted: ast.ts (3,500 lines), entry-generator.ts (760 lines), workbench.ts, route-migration.ts — all build-time code generation removed
  • New: app-config-extractor.ts (reads config from user's createApp() call), ids.ts (route ID generation), ws-proxy.ts (WebSocket proxying), process-manager.ts (dev server process orchestration)
  • Rewritten: agent-discovery.ts (simplified — reads barrel exports instead of scanning), route-discovery.ts, vite-builder.ts, bun-dev-server.ts, config-loader.ts
  • Dev server: Uses bun --hot for backend HMR instead of manual file-watching restart loop

Deprecation Warnings (@agentuity/core)

New deprecation.ts — logs migration warnings when v1 packages are used with v2 runtime.

Version Mismatch Detection

New packages/runtime/src/version-check.ts and packages/cli/src/utils/version-mismatch.ts — warns when @agentuity/* packages have version conflicts.

Frontend Client Cleanup

Removed from @agentuity/frontend: client/ directory (eventstream, websocket, stream, types) — replaced by direct hono/client usage.
Removed from @agentuity/react: api.ts, client.ts, eventstream.ts, websocket.ts, types.ts and all related tests.


Changes by Package

Package Summary
runtime createApp() simplified, bootstrap.ts extracted, createRouter deprecated, version-check.ts added, workbench/middleware rewritten
cli Deleted AST-based code generation (~5,000 lines), new config extractor + process manager, dev server uses bun --hot
migrate New package — automated v1→v2 migration tool
core Added deprecation.ts for v1→v2 migration warnings
react Removed createClient, useAPI, useEventStream, useWebsocket and related types
frontend Removed client/ directory (eventstream, websocket, stream helpers)
templates Updated _base and default to v2 patterns, added vite.config.ts
docs app Migrated all routes to chained Hono style, deleted src/generated/, added agent barrel, replaced agentuity.config.ts with vite.config.ts
test apps All test apps migrated to explicit routing, deleted generated files, added vite.config.ts

Stats

  • 362 files changed — 13,659 insertions, 48,687 deletions (net -35,028 lines)
  • 126 files deleted (mostly src/generated/ artifacts, AST code gen, react/frontend client code, and related tests)
  • 43 files added (migrate package, bootstrap, deprecation warnings, version checks, vite configs, barrel files)
  • 64 commits on the v2 branch

Migration Guide

Full guide: v1→v2 Migration Guide

Quick start:

npx @agentuity/migrate --dry-run  # preview changes
npx @agentuity/migrate            # apply migration

Huijiro added 11 commits March 10, 2026 14:39
…ead AST code

- Workbench schema endpoint now generates TypeScript interface syntax
  from JSON Schema (via runtime toJSONSchema) instead of requiring
  Zod source strings from the AST-extracted metadata. Falls back to
  metadata strings only when no runtime schema is available.

- Add jsonSchemaToTypeScript() utility in workbench.ts that converts
  JSON Schema → clean TypeScript type notation for display:
  { name: string; age: number; tags?: string[] }

- Delete findCreateAppEndPosition() from ast.ts — dead code, exported
  but never imported anywhere.

- 20 new tests covering all JSON Schema → TypeScript conversions:
  primitives, objects, optionals, descriptions, arrays, unions,
  intersections, enums, literals, nullables, records, nested objects.
…hemaToTypeScript

Address CodeRabbit review feedback:
- Escape quotes, backslashes, and newlines in const/enum string values
- Quote property keys that aren't valid JS identifiers (hyphens, spaces, leading digits)
- 3 new test cases covering both fixes
Remove 402 lines of dead code from the AST pipeline:

- Delete analyzeWorkbench() + parseConfigObject() — only imported by
  the dead workbench.ts file, never used in production
- Delete checkFunctionUsage() — exported but never imported anywhere
- Delete checkRouteConflicts() — exported but never imported anywhere
- Delete WorkbenchAnalysis interface — only used by dead code
- Remove WorkbenchConfig import from ast.ts (no longer needed)
- Delete packages/cli/src/cmd/build/workbench.ts entirely — the whole
  file was dead code (getWorkbench, generateWorkbenchMainTsx, etc.
  are superseded by vite/workbench-generator.ts)
- Remove analyzeWorkbench tests from ast.test.ts (testing dead code)

ast.ts: 3,526 → 3,124 lines (402 lines removed, cumulative with
previous findCreateAppEndPosition deletion)
The lifecycle generator now uses TypeScript's own type checker to
extract the setup() return type instead of walking AST literals and
guessing types from values. This handles:

- Inline setup in createApp({ setup: () => ... })
- Exported setup functions (function decl or const arrow)
- Shorthand property: createApp({ setup })
- Variable references: setup: () => someVar
- Async functions (Promise unwrapping)
- Any pattern TypeScript itself can resolve

Also extract getDevmodeDeploymentId into ids.ts (pure hash, not AST).

ast.ts consumers remaining: only parseRoute (route-discovery.ts)
…iscovery + app-router-detector

createRouter() no longer wraps Hono methods — it's now just `new Hono()`
with Agentuity's Env type. This preserves Hono's full Schema type inference
chain, enabling `typeof router` to encode all route types.

The routeId lookup (for OTel spans) and returnResponse auto-conversion that
createRouter previously did will move to entry-file middleware in a follow-up.

agent-discovery.ts: rewritten to import() agent files at build time instead
of AST-parsing with acorn-loose. The agent instance already knows its own
metadata, schemas, and evals. Schemas are now extracted as JSON Schema
strings via toJSONSchema() instead of Zod source strings via astring.

app-router-detector.ts: rewritten to use TypeScript's compiler API instead
of acorn-loose. Detects createApp({ router }) patterns for explicit routing.

Both rewrites eliminate acorn-loose/astring usage from their respective files.
Only ast.ts itself still imports acorn-loose (for parseRoute, used by
route-discovery.ts).

Tests: 18 agent-discovery tests, 8 app-router-detector tests, 8 lifecycle
tests, dev-registry-generation tests all pass. Runtime: 665 tests pass.
- Delete ast.ts (3,120 lines) — entire acorn-loose + astring AST pipeline
- Delete route-migration.ts (793 lines) — file-based routing migration
- Delete api-mount-path.ts (87 lines) — file-based path computation
- Remove acorn-loose + astring from package.json
- Remove file-based routing fallback from entry-generator.ts
- Remove migration prompts from dev/index.ts and vite-bundler.ts
- Remove src/api/ directory watcher from file-watcher.ts
- Remove migrateRoutes CLI option
- Delete 15 test files testing deleted AST/file-based routing code
- Rewrite route-discovery + dev-registry tests for new architecture

Net: -13,073 lines deleted, +199 lines added
- Import toForwardSlash from normalize-path.ts instead of duplicating
- Replace existsSync with Bun.file().exists() in lifecycle-generator,
  app-router-detector, and agent-discovery
- Import toJSONSchema from @agentuity/schema public entry point (resolved
  from user's node_modules) instead of reaching into src/ internals
- Remove createAgent substring gate — check exported value shape instead,
  supporting re-exported agents
- Default createRouter S generic to BlankSchema ({}) to match Hono 4.7.13
- Migrate integration-suite, e2e-web, svelte-web, auth-package-app,
  webrtc-test, nextjs-app, tanstack-start, vite-rsc-app to explicit
  createApp({ router }) pattern
- Create combined router.ts files for apps with multiple route files
- Expose agent.evals on AgentRunner (was missing, breaking eval discovery)
- Deduplicate agents by name (re-exported agents from index.ts)
- Update route-metadata-nested tests for explicit routing
@agentuity-agent
Copy link
Copy Markdown

agentuity-agent bot commented Mar 10, 2026

The latest Agentuity deployment details.

Project Deployment Preview Updated (UTC)
docs 🟢 Ready (deploy_c35717b187623c124b58431fe96620dc) - 2026-03-27T20:48:15Z

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 10, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Replaced many Agentuity createRouter() routers with typed Hono new Hono<Env>() instances, wired routers and agent barrels into createApp, migrated frontend from @agentuity/react hooks to Hono clients / fetch / native WebSocket/EventSource, added per-app Vite configs, updated docs (removed generated routes.ts, added v1→v2 migration), and added v2 branch CI triggers.

Changes

Cohort / File(s) Summary
GitHub Workflows - v2 Branch Support
.github/workflows/biome.yml, .github/workflows/build.yaml, .github/workflows/canary.yaml, .github/workflows/package-smoke-test.yaml
Added v2 to on.push.branches so CI jobs run on pushes to v2.
Docs — migration & generated routes removal
apps/docs/.agents/agentuity/sdk/.../AGENTS.md, apps/testing/.../.agents/agentuity/sdk/.../AGENTS.md, apps/docs/src/web/content/reference/migration-guide.mdx
Removed references to generated src/generated/routes.ts, updated prompt hashes, replaced @agentuity/react examples with Hono client patterns, and added a v1→v2 migration guide.
Agent registries (new barrels)
apps/docs/src/agent/index.ts, apps/testing/integration-suite/src/agent/index.ts
Added index modules exporting ordered arrays of agents for centralized registration.
createApp wiring / startup changes
apps/docs/app.ts, apps/testing/*/app.ts, apps/testing/*/agentuity/app.ts, apps/testing/vite-rsc-app/agentuity/app.ts
Replaced parameterless/bootstrap createApp() with calls passing router: { path: '/api', router } and/or agents: [...].
Top-level API routers & exported router types
apps/docs/src/api/index.ts, apps/testing/e2e-web/src/api/index.ts, apps/testing/e2e-web/src/api/router.ts, apps/testing/integration-suite/src/api/router.ts, apps/testing/nextjs-app/agentuity/src/api/index.ts, apps/testing/tanstack-start/agentuity/src/api/index.ts, apps/testing/vite-rsc-app/agentuity/src/api/index.ts
Replaced createRouter() with new Hono<Env>(), mounted sub-routers with .route(...), and added/adjusted exported router types (ApiRouter/AppRouter) where applicable.
API route modules — migration to Hono
apps/docs/src/api/*/route.ts, apps/testing/**/src/api/*/route.ts (many files)
Migrated many individual route files from createRouter() to new Hono<Env>(), converting handler registration to Hono’s chaining (.get/.post/.put/.delete) while preserving handlers, middleware, and response shapes; a few handlers received minor error/logging adjustments.
Streaming, SSE, WebSocket, durable, evals, model-arena
apps/docs/src/api/durable-stream/route.ts, .../evals/route.ts, .../model-arena/route.ts, .../streaming/route.ts, .../sse-stream/route.ts, .../websocket/route.ts
Large streaming/SSE/WebSocket and eval-related modules migrated to Hono routers; streaming logic and endpoints preserved with small internal tweaks (error payloads, logging, prompt formatting).
Frontend — hooks → Hono clients / fetch / native realtime
apps/docs/src/web/components/*, apps/testing/*/src/web/*, apps/testing/tanstack-start/src/components/*, apps/testing/vite-rsc-app/.../web/*
Removed @agentuity/react hooks (useAPI, useWebsocket, useEventStream) and createClient; replaced with typed Hono clients (hc<Router>()), manual fetch, or native WebSocket/EventSource; components now manage local loading/data/error state.
Frontend RPC/streams test pages updated
apps/testing/e2e-web/src/web/PathParamsPage.tsx, RpcPage.tsx, RpcTestPage.tsx, StreamsPage.tsx
Rewrote client usage to hc<AppRouter>() typed calls, replaced prior helpers with $post/$get, native EventSource, and WebSocket management; added explicit error handling and response parsing.
Vite config additions (per-app)
apps/docs/vite.config.ts, apps/testing/auth-package-app/vite.config.ts, apps/testing/cloud-deployment/vite.config.ts, apps/testing/e2e-web/vite.config.ts, apps/testing/integration-suite/vite.config.ts, apps/testing/oauth/vite.config.ts, apps/testing/svelte-web/vite.config.ts
Added per-app vite.config.ts files exporting defineConfig({ ... }) with appropriate plugins (React/Svelte/MDX/Tailwind) and Rollup inputs targeting each app’s HTML entry.
Testing apps — TS/config/package changes
apps/testing/integration-suite/tsconfig.json, apps/testing/svelte-web/agentuity.config.ts, apps/testing/svelte-web/svelte.config.js, apps/testing/svelte-web/package.json, apps/testing/nextjs-app/package.json, apps/testing/tanstack-start/package.json
Removed @agentuity/runtime tsconfig alias for generated routes, stopped excluding src/generated/routes.ts, removed Svelte preprocess config, updated dependency versions, and added hono to some app package.json files.
New/modified router modules for tests/apps
apps/testing/e2e-web/src/api/router.ts, apps/testing/integration-suite/src/api/router.ts, apps/testing/.../src/api/...
Added or updated router modules to compose sub-routers and export router types; some new router files created for app composition and middleware mounting.
Small docs/agent tweaks and content changes
apps/docs/.agents/agentuity/sdk/agent/AGENTS.md, apps/testing/integration-suite/.agents/agentuity/sdk/api/AGENTS.md, apps/testing/e2e-web/src/agent/hello/agent.ts
Documentation prompt_hash updates and removal of routes.ts references; one agent greeting string extended.
Large MDX migration guide addition
apps/docs/src/web/content/reference/migration-guide.mdx
Added comprehensive v1→v2 migration content (architecture changes, CLI usage, auto-fix/manual guidance) and reorganized tabs to include both v0→v1 and v1→v2 guides.
Package version bumps / marketplace
apps/create-agentuity/package.json, apps/docs/package.json, apps/testing/package.json, .claude-plugin/marketplace.json
Bumped package versions to 2.0.0-beta.1 in multiple manifests and updated plugin manifest version entries.
🚥 Pre-merge checks | ✅ 1
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

Huijiro and others added 15 commits March 12, 2026 18:02
…estart loop

- Runtime: createApp() returns fetch/port/hostname for bun --hot to
  hot-swap the server's request handler without process restart
- Runtime: skip Bun.serve() in dev mode (bun --hot manages server
  via default export)
- Runtime: add idempotent OTel re-registration guard for hot reloads
- Runtime: pass cors/compression config directly to middleware instead
  of lazy global lookup via getAppConfig()
- Runtime: remove getAppState/getAppConfig/setAppConfig globals
  (config passed directly, app state was always {})
- Runtime: add typed _globals.ts for Symbol.for() state and globals.d.ts
  for string-keyed globalThis properties, eliminating unsafe casts
- Runtime: use Symbol.for() pattern in _process-protection.ts
- Runtime: guard one-time log messages (server started, local services)
  to prevent reprinting on hot reloads
- Runtime: downgrade internal port messages to debug level
- CLI: use bun --hot --no-clear-screen for backend subprocess
- CLI: remove file-watcher.ts usage, restart loop, stopBunServer,
  cleanupForRestart — bun --hot handles all backend HMR
- CLI: run 'Preparing dev server' once at startup instead of on
  every file change (~490 lines removed from dev/index.ts)
In production mode, startServer() already calls Bun.serve() on the
configured port. Bun v1.2+ also auto-serves when the default export
has fetch + port properties (added in c98ce19 for --hot support),
causing a second bind attempt and EADDRINUSE.

Strip fetch/port/hostname from the returned AppResult in production
so only the explicit Bun.serve() is active. Dev mode keeps them for
bun --hot auto-serve.
Resolve conflicts:
- modify/delete: keep v2's deletions of generated files (app.ts, routes.ts),
  ast.ts, and route-migration.ts — superseded by v2's import-based architecture
- agent-discovery.ts: keep v2's import-based version, port duplicate eval name
  detection from main (cab51e2)
- dev/index.ts: keep v2's bun --hot version — main's file-watcher restart loop
  fixes (5b7f9b8) don't apply since v2 removed the restart loop

Auto-merged from main:
- Gateway URL fallback update (agentuity.ai → catalyst.agentuity.cloud)
- Windows path fix for AI SDK patches (buildPatchFilter)
- Task status aliases, sandbox events, OIDC commands, monitoring
- Coder TUI updates, API reference docs, various CLI fixes
Bun --hot creates the server from the default export's properties.
Without the websocket handler, WebSocket upgrades fail with:
'To enable websocket support, set the "websocket" object in Bun.serve({})'

Add websocket from hono/bun to the AppResult (and strip it in
production alongside fetch/port/hostname).
json5 was not declared as a dependency in cli/package.json, causing
a type error. Use the existing parseJSONC utility (from utils/jsonc)
which handles tsconfig.json comments and trailing commas.
## @agentuity/migrate package (new)

A CLI tool to migrate v1 projects to v2:
- `npx @agentuity/migrate` — guided migration with codemods
- Deletes `src/generated/` directory
- Removes `bootstrapRuntimeEnv()` call from app.ts
- Transforms routes from createRouter() mutable style to new Hono<Env>() chained
- Generates src/api/index.ts and src/agent/index.ts barrels
- Adds migration comments for setup/shutdown lifecycle
- Guides on agentuity.config.ts deprecation
- Detects frontend using removed APIs (createClient, useAPI, RPCRouteRegistry)
- Runs bun install and typecheck post-migration

## agentuity.config.ts deprecation

- New app-config-extractor.ts extracts analytics/workbench from createApp()
- config-loader.ts emits deprecation warning when loading agentuity.config.ts
- getWorkbenchConfig() now prefers runtime config from createApp()
- dev/index.ts and vite-builder.ts use loadRuntimeConfig()

Config consolidation in v2:
- Runtime config (analytics, workbench, cors, etc.) → createApp() only
- Vite config (plugins, define, render, bundle) → vite.config.ts
- agentuity.config.ts → deprecated, delete entirely

## Documentation

- Updated migration-guide.mdx with v1→v2 tab
- Includes automated migration instructions and manual steps
- Covers all breaking changes and troubleshooting
This commit consolidates several v2 improvements:

### bun-dev-server error diagnostics
- Add app.ts validation to detect v1 pattern (destructuring without export default)
- Capture Bun stderr/stdout and show in error messages
- Add port cleanup with ensurePortAvailable() to kill orphan processes
- Warn before starting if app.ts has common issues
- Export validation functions for testing

### Process manager for dev mode
- New ProcessManager class to track all spawned processes/servers
- Ordered cleanup (LIFO for processes)
- Force kill fallback after timeout
- Integrated into dev/index.ts for cleanup on failure/shutdown

### Remove agentuity.config.ts support
- Deleted loadAgentuityConfig from config-loader.ts
- getWorkbenchConfig now only takes (dev, runtimeConfig) - no config file fallback
- Users must use vite.config.ts for Vite config
- Users must use createApp() for runtime config (workbench, analytics)

### Remove auto-adding React plugin
- Vite no longer auto-adds @vitejs/plugin-react
- Users must configure frontend framework in vite.config.ts

### Deprecate @agentuity/react
- Added deprecation notice to README.md and package.json
- @agentuity/auth no longer depends on @agentuity/react
- AuthProvider now accepts callback props instead of relying on AgentuityProvider

### Migrate tool updates
- Detect missing vite.config.ts when frontend exists
- Detect deprecated @agentuity/react API usage
- Detect agentuity.config.ts and suggest migration

Tests: Updated workbench tests, removed define-config test (obsolete), added process-manager tests
Tests verify:
- publicDir is set correctly in dev mode config
- Public files are served at root paths in dev
- Public files maintain directory structure
- Various file types are handled correctly
- Edge cases (empty folder, hidden files, subdirectories)
- Integration with vite-builder functions
Add tests for dev server orchestration covering:

- dev-lock.test.ts: Lockfile management, orphan process cleanup,
  edge cases for corrupted/missing lockfiles

- ws-proxy.test.ts: Front-door TCP proxy routing decisions,
  error handling, URL parsing, query strings

- dev-server-integration.test.ts: Full lifecycle testing,
  crash recovery, hot reload validation, error resilience

All 60 tests pass covering:
- Startup/shutdown with port cleanup
- Hot reload behavior (Bun --hot, Vite HMR)
- Crash recovery (SIGTERM/SIGKILL escalation)
- WS proxy routing (HTTP→Vite, WS upgrade→Bun)
- Error resilience (TypeScript errors, v1 patterns)
Merge main (1.0.54) into v2 branch.

Resolution strategy:
- Deleted files (v2): Kept v2's removal of src/generated/*, ast.ts, route-migration.ts
- Dev server files: Kept v2's no-bundle architecture with bun --hot
- Package versions: Took main's higher versions
- New features from main: Accepted (oauth, sandbox jobs, service packages)
- API docs: Took main's updated documentation

Key changes merged from main:
- New standalone service packages (@agentuity/db, @agentuity/email, etc.)
- OAuth service support
- Sandbox job commands
- Updated CLI commands for all cloud services
- API reference documentation updates
Since React is no longer auto-added by the CLI, each project with a
frontend needs its own vite.config.ts with the appropriate plugins.

Added vite.config.ts for:
- apps/docs (React + Tailwind + MDX + TanStack Router)
- apps/testing/e2e-web (React)
- apps/testing/cloud-deployment (React)
- apps/testing/integration-suite (React)
- apps/testing/auth-package-app (React)
- apps/testing/oauth (React)
- apps/testing/webrtc-test (React)
- apps/testing/svelte-web (Svelte - pending investigation for CLI build)

Updated vite-builder.ts to properly merge user vite.config.ts:
- User plugins now come FIRST (important for framework plugins like Svelte)
- User config values are preserved unless overridden by Agentuity-specific needs
- Removed mergeConfig in favor of explicit spread to avoid array merge issues

Note: Svelte builds work with vite v8.0.1 building client environment for production...
�[2K
transforming...✓ 1 modules transformed. but fail when built
through the CLI. This requires further investigation into how the
Svelte plugin interacts with the CLI's build process.
…lity

## Problem
Svelte 5 builds failed when invoked through CLI's programmatic viteBuild()
call, but worked correctly with `bunx vite build`. The error showed the
Svelte compile plugin receiving already-compiled JavaScript instead of
Svelte source code.

## Root Cause
Bun's module loading system has issues with Vite's plugin pipeline when
importing Vite and calling build() programmatically. Certain plugins like
@sveltejs/vite-plugin-svelte receive already-compiled code, possibly due to
module state caching or transformation order issues.

## Solution
For client builds, spawn `bun x vite build` as a subprocess instead of
importing Vite and calling build() programmatically. This gives Vite complete
control over its module loading and plugin execution, avoiding Bun's
module system entirely.

Workbench builds continue using programmatic viteBuild() since those use
our own React plugin without external framework plugins.

## Additional Changes
- Updated vite.config.ts for all test projects to include root and input
  path (required when spawning vite as subprocess)
- Updated svelte-web agentuity.config.ts to v2 format (removed plugins)
- Removed temporary svelte.config.js that was added during debugging

## Testing
All test projects now build successfully:
- apps/testing/e2e-web (React)
- apps/testing/svelte-web (Svelte 5)
- apps/testing/cloud-deployment (React)
- apps/testing/integration-suite (React)
- apps/testing/auth-package-app (React)
- apps/testing/oauth (React)
- apps/testing/webrtc-test (React)
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 20, 2026

📦 Canary Packages Published

version: 2.0.0-beta.1-e80f941

Packages
Package Version URL
@agentuity/evals 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-evals-2.0.0-beta.1-e80f941.tgz
@agentuity/runtime 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-runtime-2.0.0-beta.1-e80f941.tgz
@agentuity/keyvalue 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-keyvalue-2.0.0-beta.1-e80f941.tgz
@agentuity/coder 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-coder-2.0.0-beta.1-e80f941.tgz
@agentuity/claude-code 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-claude-code-2.0.0-beta.1-e80f941.tgz
@agentuity/webhook 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-webhook-2.0.0-beta.1-e80f941.tgz
@agentuity/db 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-db-2.0.0-beta.1-e80f941.tgz
@agentuity/auth 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-auth-2.0.0-beta.1-e80f941.tgz
@agentuity/react 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-react-2.0.0-beta.1-e80f941.tgz
@agentuity/schema 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-schema-2.0.0-beta.1-e80f941.tgz
@agentuity/task 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-task-2.0.0-beta.1-e80f941.tgz
@agentuity/email 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-email-2.0.0-beta.1-e80f941.tgz
@agentuity/schedule 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-schedule-2.0.0-beta.1-e80f941.tgz
@agentuity/queue 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-queue-2.0.0-beta.1-e80f941.tgz
@agentuity/sandbox 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-sandbox-2.0.0-beta.1-e80f941.tgz
@agentuity/drizzle 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-drizzle-2.0.0-beta.1-e80f941.tgz
@agentuity/migrate 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-migrate-2.0.0-beta.1-e80f941.tgz
@agentuity/core 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-core-2.0.0-beta.1-e80f941.tgz
@agentuity/server 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-server-2.0.0-beta.1-e80f941.tgz
@agentuity/postgres 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-postgres-2.0.0-beta.1-e80f941.tgz
@agentuity/frontend 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-frontend-2.0.0-beta.1-e80f941.tgz
@agentuity/workbench 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-workbench-2.0.0-beta.1-e80f941.tgz
@agentuity/cli 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-cli-2.0.0-beta.1-e80f941.tgz
@agentuity/opencode 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-opencode-2.0.0-beta.1-e80f941.tgz
@agentuity/vector 2.0.0-beta.1-e80f941 https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-vector-2.0.0-beta.1-e80f941.tgz
Install

Add to your package.json:

{
  "dependencies": {
    "@agentuity/evals": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-evals-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/runtime": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-runtime-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/keyvalue": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-keyvalue-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/coder": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-coder-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/claude-code": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-claude-code-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/webhook": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-webhook-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/db": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-db-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/auth": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-auth-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/react": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-react-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/schema": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-schema-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/task": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-task-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/email": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-email-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/schedule": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-schedule-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/queue": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-queue-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/sandbox": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-sandbox-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/drizzle": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-drizzle-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/migrate": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-migrate-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/core": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-core-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/server": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-server-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/postgres": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-postgres-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/frontend": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-frontend-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/workbench": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-workbench-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/cli": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-cli-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/opencode": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-opencode-2.0.0-beta.1-e80f941.tgz",
    "@agentuity/vector": "https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-vector-2.0.0-beta.1-e80f941.tgz"
  }
}

Or install directly:

bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-evals-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-runtime-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-keyvalue-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-coder-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-claude-code-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-webhook-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-db-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-auth-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-react-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-schema-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-task-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-email-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-schedule-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-queue-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-sandbox-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-drizzle-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-migrate-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-core-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-server-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-postgres-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-frontend-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-workbench-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-cli-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-opencode-2.0.0-beta.1-e80f941.tgz
bun add https://agentuity-sdk-objects.t3.storageapi.dev/npm/2.0.0-beta.1-e80f941/agentuity-vector-2.0.0-beta.1-e80f941.tgz

The migrate package was missing from the root tsconfig.json references,
causing it to not be built during CI builds.
potofpie and others added 28 commits March 25, 2026 13:59
- Resolved package.json conflicts by keeping v2 versions (2.0.0-beta.1)
- Kept v2's simpler vite-builder.ts approach (spawns vite subprocess)
- Removed apps/docs/src/generated/env.d.ts (v2 removed src/generated)
- Kept v2's bun.lock
- Remove worker files from main (incompatible with v2's simpler approach)
- Add archiver and @types/archiver dependencies for CLI
The jq script was unconditionally adding all packages to .dependencies,
but the template has @agentuity/cli in .devDependencies. This created
a duplicate dependency warning.

Now uses a helper function to update packages in their existing location
(dependencies or devDependencies) instead of always adding to dependencies.
archiver is used in src/utils/zip.ts and src/cmd/support/report.ts
but was missing from dependencies. This caused 'Cannot find package'
errors when running CLI from packed tarballs.
- Remove adm-zip (unused, we use archiver instead)
- Remove @types/adm-zip (unused since adm-zip removed)
- Remove git-url-parse (not found in source)
- Move @types/archiver to CLI devDependencies (was in root)
- Add archiver to CLI runtime dependencies
Add detection and transformation for outdated @agentuity packages:

Detection (detect.ts):
- Scan package.json for @agentuity/* packages
- Detect 'latest', '*', and v1.x.x versions
- Add 'outdated-agentuity-packages' finding

Transform (transforms/package-json.ts):
- Replace all outdated versions with ^2.0.0
- Works for both dependencies and devDependencies

Migration flow:
- Step 5g: Update package versions before bun install
- Ensures all @agentuity packages are on v2 for migration to work
The merged vite-builder from main includes worker subprocess code
that depends on modules not present in v2 (entry-generator, registry-generator,
loadAgentuityConfig, hasFrameworkPlugin, routeInfoList).

Reverted to v2's implementation which uses the v2 architecture.
The vite.config.ts was missing routesDirectory and generatedRouteTree,
causing TanStack Router to default to src/routes instead of src/web/routes.

This aligns vite.config.ts with the config in agentuity.config.ts.
In v2, runtime config (analytics, workbench) is extracted from createApp()
in app.ts via AST parsing. Vite plugins go in vite.config.ts.

These files came from main where the v1 config file pattern still exists.
Two fixes for WSL CI failure:

1. CLI fallback: Generate vite.config.ts if missing before vite build
   - Projects created from older templates don't have vite.config.ts
   - CLI now creates a fallback config with React plugin + entry point

2. CI workflow: Use template branch matching the current ref
   - ${GITHUB_REF_NAME} determines branch (main, v2, v3)
   - Passes --template-branch to project create command
   - Ensures v2 CLI uses v2 templates with vite.config.ts

Fixes: 'Could not resolve entry module index.html'
Previously, agent discovery would log a warning and skip agents that
failed to import at build time. This caused deployments to fail at
runtime with "Agent has no metadata IDs" errors.

Now the build fails immediately with actionable guidance when an agent
cannot be imported, directing users to either:
1. Set required environment variables at build time
2. Use lazy initialization (setup/handler) instead of module scope

Also fixes the default template's translate agent to use lazy
initialization for the OpenAI client, avoiding OPENAI_API_KEY
requirement at build time.

Fixes Windows WSL CLI Smoke Test deployment failure.
- Skip test files (*.test.ts, *.spec.ts) and test directories (test/, __tests__/)
  during agent discovery to prevent build failures from test imports
- Normalize index.html location after vite client build - vite may output
  to src/web/index.html depending on project config, but static renderer
  expects it at client root

Fixes docs website build failure from test file imports.
The vite.config.ts was missing root and build.rollupOptions.input,
causing vite to fail with 'Cannot resolve entry module index.html'.

This aligns the docs config with the CLI's fallback vite.config.ts.
For pull_request events, GITHUB_REF_NAME is 'refs/pull/N/merge', not the
source branch. Use GITHUB_HEAD_REF for PRs to get the correct branch.

Also add v2 branch to push triggers so pushes to v2 run the test.
The static renderer's Vite SSR build was running in-process via the
programmatic API, which caused @mdx-js/rollup to fail with
'Unexpected FunctionDeclaration in code' errors due to Bun module
resolution issues within the same process.

Changed to spawn vite build --ssr as a subprocess, matching the
approach already used for client builds. Also passes the dev flag
through to use the correct build mode (development vs production).
The frozen lockfile check fails on PR merge commits when main and v2
have divergent dependency trees (e.g., main has @mrleebo/prisma-ast
with chevrotain@10.5.0 while v2 does not). Bun 1.3.11 fails to parse
the merged lockfile, reporting a missing regexp-to-ast resolution.

Since the biome CI only needs dependencies installed to run the
linter, strict lockfile validation is unnecessary here.
…te branch

- agent-discovery: rewrite error message when agent import fails at build
  time to show concrete before/after code examples guiding users to move
  SDK client initialization into setup() instead of module scope

- test-windows-wsl: use ${{ }} GitHub expressions instead of ${} env vars
  which are not available inside WSL. Fixes template branch always resolving
  to 'main' and run ID always being 'local'. Uses github.base_ref for PRs
  to correctly select the target branch (e.g. v2).
The v2 generateRouteId was producing IDs with a 'routeid_' prefix and
SHA256 hash of only path+method, while the platform expects 'route_'
prefix with SHA1 hash of all 7 components (projectId, deploymentId,
type, method, filename, path, version).

This mismatch caused runtime errors:
  expected id to be route_... but was routeid_...

- Changed prefix from 'routeid_' to 'route_'
- Changed hash from SHA256 (truncated 16 chars) to SHA1 (full 40 chars)
- Added missing hash inputs: type, filename, version
- Exported generateRouteId for testability
- Added 8 unit tests including exact hash compatibility check
The platform (main branch ast.ts) uses lowercase HTTP methods ('get',
'post', etc.) when hashing route IDs. The v2 route discovery was
uppercasing the method from Hono before passing it to generateRouteId,
producing a different hash.

Updated the compatibility test to use real production values from the
error: route_243d777fa53d9769d5f146862131650cb0b774f3
# Conflicts:
#	.claude-plugin/marketplace.json
#	apps/create-agentuity/package.json
#	apps/docs/package.json
#	apps/testing/package.json
#	bun.lock
#	package.json
#	packages/auth/package.json
#	packages/claude-code/.claude-plugin/plugin.json
#	packages/claude-code/package.json
#	packages/cli/package.json
#	packages/coder/package.json
#	packages/core/package.json
#	packages/db/package.json
#	packages/drizzle/package.json
#	packages/email/package.json
#	packages/evals/package.json
#	packages/frontend/package.json
#	packages/keyvalue/package.json
#	packages/opencode/package.json
#	packages/postgres/package.json
#	packages/queue/package.json
#	packages/react/package.json
#	packages/runtime/package.json
#	packages/sandbox/package.json
#	packages/schedule/package.json
#	packages/schema/package.json
#	packages/server/package.json
#	packages/task/package.json
#	packages/test-utils/package.json
#	packages/vector/package.json
#	packages/vscode/package.json
#	packages/webhook/package.json
#	packages/workbench/package.json
@Huijiro Huijiro merged commit 449f3eb into main Mar 27, 2026
56 of 60 checks passed
@Huijiro Huijiro deleted the v2 branch March 27, 2026 22:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants