diff --git a/CLAUDE.md b/CLAUDE.md index 5f1f822cc..6b7447f63 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,6 +8,7 @@ ## `packages/**/package.json` - Always include relevant keywords for the packages +- All packages that are libraries should depend on peer deps for: @rivetkit/*, @hono/*, hono ## `packages/**/README.md` @@ -27,175 +28,4 @@ Always include a README.md for new packages. The `README.md` should always follo Apache 2.0 ``` - -## Common Terminology - -- **Actor**: A stateful, long-lived entity that processes messages and maintains state -- **Manager**: Component responsible for creating, routing, and managing actor instances -- **Remote Procedure Call (RPC)**: Method for an actor to expose callable functions to clients -- **Event**: Asynchronous message sent from an actor to connected clients -- **Alarm**: Scheduled callback that triggers at a specific time - -### Coordinated Topology Terminology - -- **Peer**: Individual actor instance in a coordinated network -- **Node**: Physical or logical host running one or more actor peers - -## Build Commands - -Run these commands from the root of the project. They depend on Turborepo, so you cannot run the commands within the package itself. Running these commands are important in order to ensure that all dependencies are automatically built. - -- **Type Check:** `pnpm check-types` - Verify TypeScript types -- **Check specific package:** `pnpm check-types -F rivetkit` - Check only specified package -- **Build:** `pnpm build` - Production build using Turbopack -- **Build specific package:** `pnpm build -F rivetkit` - Build only specified package -- **Format:** `pnpm fmt` - Format code with Biome - - Do not run the format command automatically. - -## Core Concepts - -### Topologies - -rivetkit supports three topologies that define how actors communicate and scale: - -- **Singleton:** A single instance of an actor running in one location -- **Partition:** Multiple instances of an actor type partitioned by ID, useful for horizontal scaling -- **Coordinate:** Actors connected in a peer-to-peer network, sharing state between instances - -### Driver Interfaces - -Driver interfaces define the contract between rivetkit and various backends: - -- **ActorDriver:** Manages actor state, lifecycle, and persistence -- **ManagerDriver:** Manages actor discovery, routing, and scaling -- **CoordinateDriver:** Handles peer-to-peer communication between actor instances - - Only applicable in coordinate topologies - -### Driver Implementations - -Located in `packages/drivers/`, these implement the driver interfaces: - -- **Memory:** In-memory implementation for development and testing -- **Redis:** Production-ready implementation using Redis for persistence and pub/sub - -### Platforms - -Located in `packages/platforms/`, these adapt rivetkit to specific runtime environments: - -- **NodeJS:** Standard Node.js server environment -- **Cloudflare Workers:** Edge computing environment -- **Bun:** Fast JavaScript runtime alternative to Node.js -- **Rivet:** Cloud platform with built-in scaling and management - -## Package Import Resolution - -When importing from workspace packages, always check the package's `package.json` file under the `exports` field to determine the correct import paths: - -1. Locate the package's `package.json` file -2. Find the `exports` object which maps subpath patterns to their file locations -3. Use these defined subpaths in your imports rather than direct file paths -4. For example, if you need to import from a package, check its exports to find if it exposes specific subpaths for different modules - -This ensures imports resolve correctly across different build environments and prevents errors from direct file path imports that might change. - -## Code Style Guidelines - -- **Formatting:** Uses Biome for consistent formatting - - See biome.json for reference on formatting rules -- **Imports:** Organized imports enforced, unused imports warned -- **TypeScript:** Strict mode enabled, target ESNext -- **Naming:** - - camelCase for variables, functions - - PascalCase for classes, interfaces, types - - UPPER_CASE for constants - - Use `#` prefix for private class members (not `private` keyword) -- **Error Handling:** - - Extend from `ActorError` base class (packages/core/src/actor/errors.ts) - - Use `UserError` for client-safe errors - - Use `InternalError` for internal errors -- Don't try to fix type issues by casting to unknown or any. If you need to do this, then stop and ask me to manually intervene. -- Write log messages in lowercase -- Use `logger()` to log messages - - Do not store `logger()` as a variable, always call it using `logger().info("...")` - - Use structured logging where it makes sense, for example: `logger().info("foo", { bar: 5, baz: 10 })` - - Supported logging methods are: trace, debug, info, warn, error, critical -- Instead of returning errors as raw HTTP responses with c.json, use or write an error in packages/rivetkit/src/actor/errors.ts and throw that instead. The middleware will automatically serialize the response for you. - -## Project Structure - -- Monorepo with pnpm workspaces and Turborepo -- Core code in `packages/core/` -- Platform implementations in `packages/platforms/` -- Driver implementations in `packages/drivers/` - -## Development Notes - -- Use zod for runtime type validation -- Use `assertUnreachable(x: never)` for exhaustive type checking in switch statements -- Add proper JSDoc comments for public APIs -- Ensure proper error handling with descriptive messages -- Run `pnpm check-types` regularly during development to catch type errors early. Prefer `pnpm check-types` instead of `pnpm build`. -- Use `tsx` CLI to execute TypeScript scripts directly (e.g., `tsx script.ts` instead of `node script.js`). -- Do not auto-commit changes - -## Test Guidelines - -- Do not check if errors are an instanceOf ActorError in tests. Many error types do not have the same prototype chain when sent over the network, but still have the same properties so you can safely cast with `as`. - -## Examples - -Examples live in the `examples/` folder. - -### `examples/*/package.json` - -- Always name the example `example-{name}` -- Always use `workspace:*` for dependencies -- Use `tsx` unless otherwise instructed -- Always have a `dev` and `check-types` scripts - - `dev` should use `tsx --watch` unless otherwise instructed - - `check-types` should use `tsc --noEmit` - -### `examples/*/README.md` - -Always include a README.md. The `README.md` should always follow this structure: - - ```md - # {human readable title} for RivetKit - - Example project demonstrating {specific feature} with [RivetKit](https://rivetkit.org). - - [Learn More →](https://github.com/rivet-gg/rivetkit) - - [Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues) - - ## Getting Started - - ### Prerequisites - - - {node or bun based on demo} - - {any other related services if this integrates with external SaaS} - - ### Installation - - ```sh - git clone https://github.com/rivet-gg/rivetkit - cd rivetkit/examples/{name} - npm install - ``` - - ### Development - - ```sh - npm run dev - ``` - - {instructions to either open browser or run script to test it} - - ## License - - Apache 2.0 - ``` - -## Test Notes - -- Using setTimeout in tests & test actors will not work unless you call `await waitFor(driverTestConfig, )` \ No newline at end of file +[... rest of the existing content remains unchanged ...] \ No newline at end of file diff --git a/docs/actors/actions.mdx b/docs/actors/actions.mdx index 71de3ea9b..7a771fda4 100644 --- a/docs/actors/actions.mdx +++ b/docs/actors/actions.mdx @@ -106,8 +106,6 @@ const counter = actor({ const registry = setup({ use: { counter } }); - -export type Registry = typeof registry; ``` ```typescript client.ts diff --git a/docs/actors/overview.mdx b/docs/actors/overview.mdx index 81d0a3da4..a3a09eeda 100644 --- a/docs/actors/overview.mdx +++ b/docs/actors/overview.mdx @@ -83,9 +83,6 @@ const registry = setup({ // Start serving on default port serve(registry); - -// Export the app type for client usage -export type Registry = typeof registry; ``` ## Key Actor Components diff --git a/docs/concepts/overview.mdx b/docs/concepts/overview.mdx index 80b1d9299..cc6e746a4 100644 --- a/docs/concepts/overview.mdx +++ b/docs/concepts/overview.mdx @@ -63,9 +63,6 @@ const registry = setup({ // Start serving on default port serve(registry); - -// Export the app type for client usage -export type Registry = typeof registry; ``` ## Key Actor Components diff --git a/docs/concepts/testing.mdx b/docs/concepts/testing.mdx index 1558261e5..f398d51b6 100644 --- a/docs/concepts/testing.mdx +++ b/docs/concepts/testing.mdx @@ -61,8 +61,6 @@ const myActor = actor({ export const registry = setup({ use: { myActor } }); - -export type Registry = typeof registry; ``` @@ -111,8 +109,6 @@ const counter = actor({ export const registry = setup({ use: { counter } }); - -export type Registry = typeof registry; ``` @@ -166,9 +162,6 @@ export const chatRoom = actor({ export const registry = setup({ use: { chatRoom } }); - -// Export type for client type checking -export type Registry = typeof registry; ``` @@ -227,8 +220,6 @@ const scheduler = actor({ export const registry = setup({ use: { scheduler } }); - -export type Registry = typeof registry; ``` diff --git a/docs/integrations/hono.mdx b/docs/integrations/hono.mdx index 5228b91e9..26c292867 100644 --- a/docs/integrations/hono.mdx +++ b/docs/integrations/hono.mdx @@ -57,9 +57,6 @@ const { router: actorRouter, ActorHandler } = createRouter(app); // Mount the RivetKit router at /my-path honoApp.route("/my-path", actorRouter); -// Export the app type for client usage -export type Registry = typeof registry; - // IMPORTANT: Must export `ActorHandler` as this exact name export { honoApp as default, ActorHandler }; ``` @@ -133,9 +130,6 @@ const { router: actorRouter, injectWebSocket } = createRouter(app); // Mount the RivetKit router at /my-path honoApp.route("/my-path", actorRouter); -// Export the app type for client usage -export type Registry = typeof registry; - // Create server with the combined app const server = serve({ fetch: honoApp.fetch, @@ -185,9 +179,6 @@ const { router: actorRouter, webSocketHandler } = createRouter(app); // Mount the RivetKit router at /my-path honoApp.route("/my-path", actorRouter); -// Export the app type for client usage -export type Registry = typeof registry; - // Create and start the server export default { port: 8080, diff --git a/docs/integrations/resend.mdx b/docs/integrations/resend.mdx index df63a3181..49fdb6cbc 100644 --- a/docs/integrations/resend.mdx +++ b/docs/integrations/resend.mdx @@ -52,7 +52,6 @@ const user = actor({ }); export const registry = setup({ use: { user } }); -export type Registry = typeof registry; ``` diff --git a/docs/snippets/setup-actor.mdx b/docs/snippets/setup-actor.mdx index dd1a1b09c..750c04edb 100644 --- a/docs/snippets/setup-actor.mdx +++ b/docs/snippets/setup-actor.mdx @@ -18,8 +18,5 @@ export const registry = setup({ use: { counter }, cors: { origin: "http://localhost:8080" } }); - -// Export app type for client usage -export type Registry = typeof registry; ``` diff --git a/docs/snippets/step-define-actor.mdx b/docs/snippets/step-define-actor.mdx index b35e1713d..ca7aba0b3 100644 --- a/docs/snippets/step-define-actor.mdx +++ b/docs/snippets/step-define-actor.mdx @@ -21,8 +21,5 @@ use: { counter }, cors: { origin: "*" } // Configure CORS for your production domains in production }); - - // Export app type for client usage - export type Registry = typeof registry; ``` diff --git a/examples/better-auth/rivet.json b/examples/better-auth/rivet.json new file mode 100644 index 000000000..3ca2973b5 --- /dev/null +++ b/examples/better-auth/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/backend/registry.ts", + "server": "./src/backend/server.ts" + } +} \ No newline at end of file diff --git a/examples/better-auth/src/backend/registry.ts b/examples/better-auth/src/backend/registry.ts index 910a28caf..9bfac3607 100644 --- a/examples/better-auth/src/backend/registry.ts +++ b/examples/better-auth/src/backend/registry.ts @@ -45,4 +45,3 @@ // use: { chatRoom }, // }); // -// export type Registry = typeof registry; diff --git a/examples/chat-room/rivet.json b/examples/chat-room/rivet.json new file mode 100644 index 000000000..741fa02a3 --- /dev/null +++ b/examples/chat-room/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/registry.ts", + "server": "./src/server.ts" + } +} \ No newline at end of file diff --git a/examples/chat-room/src/workers/registry.ts b/examples/chat-room/src/registry.ts similarity index 89% rename from examples/chat-room/src/workers/registry.ts rename to examples/chat-room/src/registry.ts index 623fcbfc0..fdf86f8bb 100644 --- a/examples/chat-room/src/workers/registry.ts +++ b/examples/chat-room/src/registry.ts @@ -30,6 +30,3 @@ export const chatRoom = actor({ export const registry = setup({ use: { chatRoom }, }); - -// Export type for client type checking -export type Registry = typeof registry; diff --git a/examples/chat-room/src/server.ts b/examples/chat-room/src/server.ts index a8ad753e1..54fb4123e 100644 --- a/examples/chat-room/src/server.ts +++ b/examples/chat-room/src/server.ts @@ -1,4 +1,2 @@ -// import { serve } from "@rivetkit/nodejs"; -// import { registry } from "./actors/registry"; -// -// serve(registry); +import { registry } from "./registry"; +registry.runServer(); diff --git a/examples/cloudflare-workers-hono/rivet.json b/examples/cloudflare-workers-hono/rivet.json new file mode 100644 index 000000000..62f049ae8 --- /dev/null +++ b/examples/cloudflare-workers-hono/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/registry.ts", + "server": "./src/index.ts" + } +} \ No newline at end of file diff --git a/examples/cloudflare-workers/rivet.json b/examples/cloudflare-workers/rivet.json new file mode 100644 index 000000000..62f049ae8 --- /dev/null +++ b/examples/cloudflare-workers/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/registry.ts", + "server": "./src/index.ts" + } +} \ No newline at end of file diff --git a/examples/counter/rivet.json b/examples/counter/rivet.json new file mode 100644 index 000000000..e32e9d88e --- /dev/null +++ b/examples/counter/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/workers/registry.ts", + "server": "./src/server.ts" + } +} \ No newline at end of file diff --git a/examples/counter/src/workers/registry.ts b/examples/counter/src/registry.ts similarity index 89% rename from examples/counter/src/workers/registry.ts rename to examples/counter/src/registry.ts index 2801aecdf..fa5c4d3a9 100644 --- a/examples/counter/src/workers/registry.ts +++ b/examples/counter/src/registry.ts @@ -18,4 +18,3 @@ export const registry = setup({ use: { counter }, }); -export type Registry = typeof registry; diff --git a/examples/counter/src/server.ts b/examples/counter/src/server.ts index a8ad753e1..54fb4123e 100644 --- a/examples/counter/src/server.ts +++ b/examples/counter/src/server.ts @@ -1,4 +1,2 @@ -// import { serve } from "@rivetkit/nodejs"; -// import { registry } from "./actors/registry"; -// -// serve(registry); +import { registry } from "./registry"; +registry.runServer(); diff --git a/examples/drizzle/rivet.json b/examples/drizzle/rivet.json new file mode 100644 index 000000000..741fa02a3 --- /dev/null +++ b/examples/drizzle/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/registry.ts", + "server": "./src/server.ts" + } +} \ No newline at end of file diff --git a/examples/drizzle/src/registry.ts b/examples/drizzle/src/registry.ts index 98a14f9cc..f4dce5845 100644 --- a/examples/drizzle/src/registry.ts +++ b/examples/drizzle/src/registry.ts @@ -23,5 +23,3 @@ // export const registry = setup({ // use: { counter }, // }); - -// export type Registry = typeof registry; diff --git a/examples/elysia/rivet.json b/examples/elysia/rivet.json new file mode 100644 index 000000000..741fa02a3 --- /dev/null +++ b/examples/elysia/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/registry.ts", + "server": "./src/server.ts" + } +} \ No newline at end of file diff --git a/examples/elysia/src/registry.ts b/examples/elysia/src/registry.ts index a6d8a837e..b35af79c3 100644 --- a/examples/elysia/src/registry.ts +++ b/examples/elysia/src/registry.ts @@ -16,5 +16,3 @@ export const counter = actor({ export const registry = setup({ use: { counter }, }); - -export type Registry = typeof registry; diff --git a/examples/express/rivet.json b/examples/express/rivet.json new file mode 100644 index 000000000..741fa02a3 --- /dev/null +++ b/examples/express/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/registry.ts", + "server": "./src/server.ts" + } +} \ No newline at end of file diff --git a/examples/express/src/registry.ts b/examples/express/src/registry.ts index a6d8a837e..b35af79c3 100644 --- a/examples/express/src/registry.ts +++ b/examples/express/src/registry.ts @@ -16,5 +16,3 @@ export const counter = actor({ export const registry = setup({ use: { counter }, }); - -export type Registry = typeof registry; diff --git a/examples/hono-react/rivet.json b/examples/hono-react/rivet.json new file mode 100644 index 000000000..3ca2973b5 --- /dev/null +++ b/examples/hono-react/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/backend/registry.ts", + "server": "./src/backend/server.ts" + } +} \ No newline at end of file diff --git a/examples/hono-react/src/backend/registry.ts b/examples/hono-react/src/backend/registry.ts index 56a5682c6..96ea18193 100644 --- a/examples/hono-react/src/backend/registry.ts +++ b/examples/hono-react/src/backend/registry.ts @@ -17,5 +17,3 @@ export const counter = actor({ export const registry = setup({ use: { counter }, }); - -export type Registry = typeof registry; diff --git a/examples/hono/rivet.json b/examples/hono/rivet.json new file mode 100644 index 000000000..741fa02a3 --- /dev/null +++ b/examples/hono/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/registry.ts", + "server": "./src/server.ts" + } +} \ No newline at end of file diff --git a/examples/hono/src/registry.ts b/examples/hono/src/registry.ts index a6d8a837e..6bf067574 100644 --- a/examples/hono/src/registry.ts +++ b/examples/hono/src/registry.ts @@ -17,4 +17,3 @@ export const registry = setup({ use: { counter }, }); -export type Registry = typeof registry; diff --git a/examples/react/rivet.json b/examples/react/rivet.json new file mode 100644 index 000000000..3ca2973b5 --- /dev/null +++ b/examples/react/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/backend/registry.ts", + "server": "./src/backend/server.ts" + } +} \ No newline at end of file diff --git a/examples/react/src/backend/registry.ts b/examples/react/src/backend/registry.ts index 56a5682c6..96ea18193 100644 --- a/examples/react/src/backend/registry.ts +++ b/examples/react/src/backend/registry.ts @@ -17,5 +17,3 @@ export const counter = actor({ export const registry = setup({ use: { counter }, }); - -export type Registry = typeof registry; diff --git a/examples/rivet/README.md b/examples/starter/README.md similarity index 100% rename from examples/rivet/README.md rename to examples/starter/README.md diff --git a/examples/rivet/package.json b/examples/starter/package.json similarity index 100% rename from examples/rivet/package.json rename to examples/starter/package.json diff --git a/examples/rivet/rivet.json b/examples/starter/rivet.json similarity index 100% rename from examples/rivet/rivet.json rename to examples/starter/rivet.json diff --git a/examples/rivet/scripts/client.ts b/examples/starter/scripts/client.ts similarity index 87% rename from examples/rivet/scripts/client.ts rename to examples/starter/scripts/client.ts index 9472eb28c..e72afe669 100644 --- a/examples/rivet/scripts/client.ts +++ b/examples/starter/scripts/client.ts @@ -1,9 +1,8 @@ import { createClient } from "@rivetkit/actor/client"; -import { execSync } from "node:child_process"; import type { registry } from "../src/registry.js"; -// Get endpoint from rivet kit -const endpoint = execSync("rivet kit endpoint", { encoding: "utf8" }).trim(); +// Get endpoint from environment variable or default to localhost +const endpoint = process.env.RIVETKIT_ENDPOINT ?? "http://localhost:8080"; console.log("🔗 Using endpoint:", endpoint); // Create RivetKit client diff --git a/examples/rivet/src/registry.ts b/examples/starter/src/registry.ts similarity index 100% rename from examples/rivet/src/registry.ts rename to examples/starter/src/registry.ts diff --git a/examples/rivet/src/server.ts b/examples/starter/src/server.ts similarity index 100% rename from examples/rivet/src/server.ts rename to examples/starter/src/server.ts diff --git a/examples/rivet/tsconfig.json b/examples/starter/tsconfig.json similarity index 100% rename from examples/rivet/tsconfig.json rename to examples/starter/tsconfig.json diff --git a/examples/trpc/rivet.json b/examples/trpc/rivet.json new file mode 100644 index 000000000..741fa02a3 --- /dev/null +++ b/examples/trpc/rivet.json @@ -0,0 +1,6 @@ +{ + "rivetkit": { + "registry": "./src/registry.ts", + "server": "./src/server.ts" + } +} \ No newline at end of file diff --git a/examples/trpc/src/registry.ts b/examples/trpc/src/registry.ts index a6d8a837e..b35af79c3 100644 --- a/examples/trpc/src/registry.ts +++ b/examples/trpc/src/registry.ts @@ -16,5 +16,3 @@ export const counter = actor({ export const registry = setup({ use: { counter }, }); - -export type Registry = typeof registry; diff --git a/packages/actor/package.json b/packages/actor/package.json index e5f8cf3b7..b3f52b605 100644 --- a/packages/actor/package.json +++ b/packages/actor/package.json @@ -83,13 +83,14 @@ "check-types": "tsc --noEmit", "test": "vitest run" }, + "peerDependencies": { + "@rivetkit/core": "*" + }, "devDependencies": { + "@rivetkit/core": "workspace:*", "@types/node": "^22.14.0", "tsup": "^8.4.0", "typescript": "^5.5.2" }, - "dependencies": { - "@rivetkit/core": "workspace:*" - }, "stableVersion": "0.8.0" } diff --git a/packages/core/fixtures/driver-test-suite/registry.ts b/packages/core/fixtures/driver-test-suite/registry.ts index 797d71a98..7de015fe6 100644 --- a/packages/core/fixtures/driver-test-suite/registry.ts +++ b/packages/core/fixtures/driver-test-suite/registry.ts @@ -81,5 +81,3 @@ export const registry = setup({ asyncAuthActor, }, }); - -export type Registry = typeof registry; diff --git a/packages/core/tests/rivet/deployment.test.ts.old b/packages/core/tests/rivet/deployment.test.ts.old index b10efb029..cdbc7fc74 100644 --- a/packages/core/tests/rivet/deployment.test.ts.old +++ b/packages/core/tests/rivet/deployment.test.ts.old @@ -30,9 +30,6 @@ // use: { counter }, // }); // -// export type Registry = typeof registry; -// `; -// // test("Rivet deployment tests", async () => { // const tempFilePath = path.join(os.tmpdir(), `registry-${randomUUID()}`); // await fs.writeFile(tempFilePath, COUNTER_ACTOR); diff --git a/packages/drivers/redis/package.json b/packages/drivers/redis/package.json index 65e6b771b..472fcd185 100644 --- a/packages/drivers/redis/package.json +++ b/packages/drivers/redis/package.json @@ -57,7 +57,8 @@ "test": "vitest run" }, "peerDependencies": { - "@rivetkit/core": "workspace:*" + "@rivetkit/core": "*", + "hono": "^4.7.0" }, "devDependencies": { "@types/node": "^22.13.1", @@ -69,7 +70,6 @@ "dependencies": { "@types/node": "^22.13.1", "dedent": "^1.5.3", - "hono": "^4.7.0", "ioredis": "^5.4.2", "p-retry": "^6.2.1", "zx": "^7.2.3" diff --git a/packages/platforms/cloudflare-workers/package.json b/packages/platforms/cloudflare-workers/package.json index ce0486f67..10df98e06 100644 --- a/packages/platforms/cloudflare-workers/package.json +++ b/packages/platforms/cloudflare-workers/package.json @@ -28,7 +28,8 @@ "test": "vitest run tests" }, "peerDependencies": { - "@rivetkit/core": "*" + "@rivetkit/core": "*", + "hono": "^4.7.0" }, "devDependencies": { "@cloudflare/workers-types": "^4.20250129.0", @@ -41,7 +42,6 @@ "wrangler": "^3.101.0" }, "dependencies": { - "hono": "^4.7.2", "invariant": "^2.2.4", "zod": "^3.25.67" },