From 355ee598aa74b0621dcb84146abc198735102976 Mon Sep 17 00:00:00 2001 From: slinkydeveloper Date: Mon, 5 Jan 2026 21:09:37 +0100 Subject: [PATCH 1/2] Bump typescript sdk --- .tools/update_node_examples.sh | 14 +- typescript/basics/package.json | 4 +- .../ai-image-workflows/package.json | 2 +- .../chat-bot/package.json | 2 +- .../food-ordering/app/package.json | 2 +- .../food-ordering/webui/package.json | 2 +- .../deployment-lambda-cdk/package.json | 2 +- typescript/patterns-use-cases/package.json | 4 +- typescript/templates/bun/.claude/CLAUDE.md | 90 ++++++------ .../templates/bun/.cursor/rules/AGENTS.md | 90 ++++++------ typescript/templates/bun/package.json | 5 +- typescript/templates/bun/src/index.ts | 3 +- .../cloudflare-worker/.claude/CLAUDE.md | 90 ++++++------ .../cloudflare-worker/.cursor/rules/AGENTS.md | 90 ++++++------ .../cloudflare-worker/package-lock.json | 37 ++--- .../templates/cloudflare-worker/package.json | 3 +- .../templates/cloudflare-worker/src/index.ts | 3 +- typescript/templates/deno/deno.json | 5 +- typescript/templates/deno/deno.lock | 31 ++-- typescript/templates/deno/main.ts | 3 +- typescript/templates/lambda/.claude/CLAUDE.md | 90 ++++++------ .../templates/lambda/.cursor/rules/AGENTS.md | 90 ++++++------ typescript/templates/lambda/package-lock.json | 45 ++---- typescript/templates/lambda/package.json | 5 +- typescript/templates/lambda/src/app.ts | 3 +- typescript/templates/nextjs/.claude/CLAUDE.md | 90 ++++++------ .../templates/nextjs/.cursor/rules/AGENTS.md | 90 ++++++------ typescript/templates/nextjs/package.json | 9 +- .../templates/nextjs/restate/greeter.ts | 3 +- typescript/templates/node/.claude/CLAUDE.md | 90 ++++++------ .../templates/node/.cursor/rules/AGENTS.md | 90 ++++++------ typescript/templates/node/package.json | 5 +- typescript/templates/node/src/app.ts | 3 +- .../templates/typescript-testing/package.json | 4 +- typescript/templates/vercel/.claude/CLAUDE.md | 90 ++++++------ .../templates/vercel/.cursor/rules/AGENTS.md | 90 ++++++------ typescript/templates/vercel/package-lock.json | 139 ++++++++---------- typescript/templates/vercel/package.json | 7 +- .../templates/vercel/src/restate/greeter.ts | 3 +- .../package.json | 2 +- .../tour-of-workflows-typescript/package.json | 4 +- 41 files changed, 706 insertions(+), 728 deletions(-) diff --git a/.tools/update_node_examples.sh b/.tools/update_node_examples.sh index dda27574..25e922ba 100755 --- a/.tools/update_node_examples.sh +++ b/.tools/update_node_examples.sh @@ -7,8 +7,9 @@ SELF_PATH=${BASH_SOURCE[0]:-"$(command -v -- "$0")"} PROJECT_ROOT="$(dirname "$SELF_PATH")/.." function bump_restate_sdk_deps() { + pushd $1 local project_dir=$1 - local package_json="$project_dir/package.json" + local package_json="./package.json" # Check if package.json exists if [ ! -f "$package_json" ]; then @@ -28,18 +29,19 @@ function bump_restate_sdk_deps() { # Install each dependency with the new version for dep in $deps; do echo "Installing $dep@^$NEW_VERSION in $project_dir" - npm --prefix $project_dir install $dep@^$NEW_VERSION + npm install $dep@^$NEW_VERSION done # If this is a template directory and has existing agents documentation, update it - if [[ "$project_dir" == *"/templates/"* ]] && [ -f "$project_dir/.cursor/rules/AGENTS.md" ]; then + if [[ "$project_dir" == *"/templates/"* ]] && [ -f "./.cursor/rules/AGENTS.md" ]; then echo "Updating agents documentation for template in $project_dir" - wget -O "$project_dir/.cursor/rules/AGENTS.md" https://docs.restate.dev/develop/ts/agents.md + wget -O "./.cursor/rules/AGENTS.md" https://docs.restate.dev/develop/ts/agents.md fi - if [[ "$project_dir" == *"/templates/"* ]] && [ -f "$project_dir/.claude/CLAUDE.md" ]; then + if [[ "$project_dir" == *"/templates/"* ]] && [ -f "./.claude/CLAUDE.md" ]; then echo "Updating agents documentation for template in $project_dir" - wget -O "$project_dir/.claude/CLAUDE.md" https://docs.restate.dev/develop/ts/agents.md + wget -O "./.claude/CLAUDE.md" https://docs.restate.dev/develop/ts/agents.md fi + popd } # Update all projects with package.json diff --git a/typescript/basics/package.json b/typescript/basics/package.json index 6bcf954e..1bd12c49 100644 --- a/typescript/basics/package.json +++ b/typescript/basics/package.json @@ -14,8 +14,8 @@ "example-3": "ts-node-dev --transpile-only src/3_workflows.ts" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-clients": "^1.9.1" + "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk-clients": "^1.10.0" }, "devDependencies": { "@types/node": "^20.12.12", diff --git a/typescript/end-to-end-applications/ai-image-workflows/package.json b/typescript/end-to-end-applications/ai-image-workflows/package.json index 0ed22eb4..338e9fc5 100644 --- a/typescript/end-to-end-applications/ai-image-workflows/package.json +++ b/typescript/end-to-end-applications/ai-image-workflows/package.json @@ -12,7 +12,7 @@ "stable-diffusion-service": "ts-node-dev --watch ./src --respawn --transpile-only src/stable_diffusion.ts" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", + "@restatedev/restate-sdk": "^1.10.0", "axios": "^1.6.7", "axios-retry": "^4.0.0", "jimp": "^0.22.10", diff --git a/typescript/end-to-end-applications/chat-bot/package.json b/typescript/end-to-end-applications/chat-bot/package.json index 14f5eef7..6915e761 100644 --- a/typescript/end-to-end-applications/chat-bot/package.json +++ b/typescript/end-to-end-applications/chat-bot/package.json @@ -11,7 +11,7 @@ "flights-task": "RESTATE_LOGGING=INFO ts-node-dev --watch ./src --transpile-only ./src/tasks/flight_prices.ts" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", + "@restatedev/restate-sdk": "^1.10.0", "@slack/bolt": "^3.19.0", "@slack/web-api": "^7.0.4" }, diff --git a/typescript/end-to-end-applications/food-ordering/app/package.json b/typescript/end-to-end-applications/food-ordering/app/package.json index de3aa13e..7c2ed003 100644 --- a/typescript/end-to-end-applications/food-ordering/app/package.json +++ b/typescript/end-to-end-applications/food-ordering/app/package.json @@ -16,7 +16,7 @@ "dev": "RESTATE_DEBUG_LOGGING=JOURNAL ts-node-dev --watch src --respawn --transpile-only src/order-app/app.ts" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", + "@restatedev/restate-sdk": "^1.10.0", "@types/node": "^20.6.3", "@types/uuid": "^9.0.0", "axios": "^1.4.0", diff --git a/typescript/end-to-end-applications/food-ordering/webui/package.json b/typescript/end-to-end-applications/food-ordering/webui/package.json index 4c5c443a..a6703e46 100644 --- a/typescript/end-to-end-applications/food-ordering/webui/package.json +++ b/typescript/end-to-end-applications/food-ordering/webui/package.json @@ -6,7 +6,7 @@ "node": "14.17.3" }, "dependencies": { - "@restatedev/restate-sdk-clients": "^1.9.1", + "@restatedev/restate-sdk-clients": "^1.10.0", "axios": "^0.26.0", "react": "^18.0.0", "react-dom": "^18.0.0", diff --git a/typescript/integrations/deployment-lambda-cdk/package.json b/typescript/integrations/deployment-lambda-cdk/package.json index 95f8f3ac..b4b0405f 100644 --- a/typescript/integrations/deployment-lambda-cdk/package.json +++ b/typescript/integrations/deployment-lambda-cdk/package.json @@ -23,7 +23,7 @@ "typescript": "^5.5.4" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", + "@restatedev/restate-sdk": "^1.10.0", "aws-cdk-lib": "^2.155.0", "constructs": "^10.3.0", "source-map-support": "^0.5.21" diff --git a/typescript/patterns-use-cases/package.json b/typescript/patterns-use-cases/package.json index f8cde32f..f78ec515 100644 --- a/typescript/patterns-use-cases/package.json +++ b/typescript/patterns-use-cases/package.json @@ -9,8 +9,8 @@ "format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|ts|json)\"" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-clients": "^1.9.1", + "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk-clients": "^1.10.0", "cron-parser": "^5.2.0", "express": "^5.0.0", "pg": "^8.10.0", diff --git a/typescript/templates/bun/.claude/CLAUDE.md b/typescript/templates/bun/.claude/CLAUDE.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/bun/.claude/CLAUDE.md +++ b/typescript/templates/bun/.claude/CLAUDE.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/bun/.cursor/rules/AGENTS.md b/typescript/templates/bun/.cursor/rules/AGENTS.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/bun/.cursor/rules/AGENTS.md +++ b/typescript/templates/bun/.cursor/rules/AGENTS.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/bun/package.json b/typescript/templates/bun/package.json index b6cb53db..26781d09 100644 --- a/typescript/templates/bun/package.json +++ b/typescript/templates/bun/package.json @@ -9,9 +9,8 @@ "format": "prettier --write \"src/*.+(js|ts|json)\"" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", - "zod": "^4.1.0" + "@restatedev/restate-sdk": "^1.10.0", + "zod": "^4.3" }, "devDependencies": { "@types/bun": "^1.1.5", diff --git a/typescript/templates/bun/src/index.ts b/typescript/templates/bun/src/index.ts index 54bac529..f03f60f0 100644 --- a/typescript/templates/bun/src/index.ts +++ b/typescript/templates/bun/src/index.ts @@ -1,5 +1,4 @@ import * as restate from "@restatedev/restate-sdk"; -import { serde } from "@restatedev/restate-sdk-zod"; import { sendNotification, sendReminder } from "./utils"; import { z } from "zod"; @@ -16,7 +15,7 @@ const greeter = restate.service({ name: "Greeter", handlers: { greet: restate.createServiceHandler( - { input: serde.zod(Greeting), output: serde.zod(GreetingResponse) }, + { input: restate.serde.schema(Greeting), output: restate.serde.schema(GreetingResponse) }, async (ctx: restate.Context, { name }) => { // Durably execute a set of steps; resilient against failures const greetingId = ctx.rand.uuidv4(); diff --git a/typescript/templates/cloudflare-worker/.claude/CLAUDE.md b/typescript/templates/cloudflare-worker/.claude/CLAUDE.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/cloudflare-worker/.claude/CLAUDE.md +++ b/typescript/templates/cloudflare-worker/.claude/CLAUDE.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/cloudflare-worker/.cursor/rules/AGENTS.md b/typescript/templates/cloudflare-worker/.cursor/rules/AGENTS.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/cloudflare-worker/.cursor/rules/AGENTS.md +++ b/typescript/templates/cloudflare-worker/.cursor/rules/AGENTS.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/cloudflare-worker/package-lock.json b/typescript/templates/cloudflare-worker/package-lock.json index 99d4828f..e068f59b 100644 --- a/typescript/templates/cloudflare-worker/package-lock.json +++ b/typescript/templates/cloudflare-worker/package-lock.json @@ -8,8 +8,7 @@ "name": "restate-cloudflare-worker-template", "version": "0.0.1", "dependencies": { - "@restatedev/restate-sdk-cloudflare-workers": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", + "@restatedev/restate-sdk-cloudflare-workers": "^1.10.0", "zod": "^4.1.0" }, "devDependencies": { @@ -1103,37 +1102,19 @@ ] }, "node_modules/@restatedev/restate-sdk-cloudflare-workers": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-cloudflare-workers/-/restate-sdk-cloudflare-workers-1.9.1.tgz", - "integrity": "sha512-5fRUhsOdMurc8ynMjJeh5dsZ5mlj0pTqoyGIQKQoZ/Vj3tbyYgzPl4E6pdGvKYGQLexq3IH6QQTbK5V1v9VSrw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-cloudflare-workers/-/restate-sdk-cloudflare-workers-1.10.0.tgz", + "integrity": "sha512-/jGF33MfLE6mhC18Z981nmQvZndquvNKycFARnaIdiKxKnWD8CCPor4oCgDsY5WgV2sC2zKRbsqRlTjMoT5uHA==", "license": "MIT", "dependencies": { - "@restatedev/restate-sdk-core": "^1.9.1" - }, - "engines": { - "node": ">= 20.19" + "@restatedev/restate-sdk-core": "1.10.0" } }, "node_modules/@restatedev/restate-sdk-core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.9.1.tgz", - "integrity": "sha512-/ISSWBF0YAH0mhIhnd6VFuFLMp6AckdfGyfU+CdJDccysxH1qp0QuI5oJ5UArexoFTI6LXrWkYg2/nZebO96gA==", - "license": "MIT", - "engines": { - "node": ">= 20.19" - } - }, - "node_modules/@restatedev/restate-sdk-zod": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-zod/-/restate-sdk-zod-1.9.1.tgz", - "integrity": "sha512-tlYiYfMZGzckA3pKY6zmdZ6pc65ko0gg/AkDGAhKDYpMBXDAGW9S/Ge/jlduRVPCU1PXykZM1ZIL8+0oU0Hojg==", - "license": "MIT", - "engines": { - "node": ">= 20.19" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.0.tgz", + "integrity": "sha512-hX25ThMW5TSUMjcQLok0YKr4A6MvN2S6TaCqZGibZhJi1pcGtgsYhKmwUZYyQvq5RyX94gFrU4k0J7yB/2j0DQ==", + "license": "MIT" }, "node_modules/@scarf/scarf": { "version": "1.4.0", diff --git a/typescript/templates/cloudflare-worker/package.json b/typescript/templates/cloudflare-worker/package.json index 55fddc5c..0ec46f79 100644 --- a/typescript/templates/cloudflare-worker/package.json +++ b/typescript/templates/cloudflare-worker/package.json @@ -10,8 +10,7 @@ "format": "prettier --write \"src/*.+(js|ts|json)\"" }, "dependencies": { - "@restatedev/restate-sdk-cloudflare-workers": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", + "@restatedev/restate-sdk-cloudflare-workers": "^1.10.0", "zod": "^4.1.0" }, "devDependencies": { diff --git a/typescript/templates/cloudflare-worker/src/index.ts b/typescript/templates/cloudflare-worker/src/index.ts index f8f43bb5..095e34ef 100644 --- a/typescript/templates/cloudflare-worker/src/index.ts +++ b/typescript/templates/cloudflare-worker/src/index.ts @@ -1,5 +1,4 @@ import * as restate from "@restatedev/restate-sdk-cloudflare-workers/fetch"; -import { serde } from "@restatedev/restate-sdk-zod"; import { sendNotification, sendReminder } from "./utils.js"; import { z } from "zod"; @@ -16,7 +15,7 @@ const greeter = restate.service({ name: "Greeter", handlers: { greet: restate.createServiceHandler( - { input: serde.zod(Greeting), output: serde.zod(GreetingResponse) }, + { input: restate.serde.schema(Greeting), output: restate.serde.schema(GreetingResponse) }, async (ctx: restate.Context, { name }) => { // Durably execute a set of steps; resilient against failures const greetingId = ctx.rand.uuidv4(); diff --git a/typescript/templates/deno/deno.json b/typescript/templates/deno/deno.json index e5c1edec..e15eb667 100644 --- a/typescript/templates/deno/deno.json +++ b/typescript/templates/deno/deno.json @@ -5,8 +5,7 @@ "start": "deno run --allow-net --allow-env main.ts" }, "imports": { - "@restatedev/restate-sdk": "npm:@restatedev/restate-sdk@^1.9.0", - "@restatedev/restate-sdk-zod": "npm:@restatedev/restate-sdk-zod@^1.9.0", - "zod": "npm:zod@^4.1.0" + "@restatedev/restate-sdk": "npm:@restatedev/restate-sdk@^1.10.0", + "zod": "npm:zod@^4.3" } } diff --git a/typescript/templates/deno/deno.lock b/typescript/templates/deno/deno.lock index 3022be26..5dc80326 100644 --- a/typescript/templates/deno/deno.lock +++ b/typescript/templates/deno/deno.lock @@ -1,38 +1,27 @@ { "version": "5", "specifiers": { - "npm:@restatedev/restate-sdk-zod@*": "1.9.0_zod@4.1.8", - "npm:@restatedev/restate-sdk-zod@^1.9.0": "1.9.0_zod@4.1.8", - "npm:@restatedev/restate-sdk@*": "1.9.0", - "npm:@restatedev/restate-sdk@^1.9.0": "1.9.0", - "npm:zod@*": "4.1.8", - "npm:zod@^4.1.0": "4.1.8" + "npm:@restatedev/restate-sdk@^1.10.0": "1.10.0", + "npm:zod@^4.3.0": "4.3.5" }, "npm": { - "@restatedev/restate-sdk-core@1.9.0": { - "integrity": "sha512-q3S7hnxcP3zU8cDcaAkYmO50zT8dykzaBm65D+hyJgba74gs/h5HMjbS8gbZgRezbJHtRrRsJmnNFet/qCj4pQ==" + "@restatedev/restate-sdk-core@1.10.0": { + "integrity": "sha512-hX25ThMW5TSUMjcQLok0YKr4A6MvN2S6TaCqZGibZhJi1pcGtgsYhKmwUZYyQvq5RyX94gFrU4k0J7yB/2j0DQ==" }, - "@restatedev/restate-sdk-zod@1.9.0_zod@4.1.8": { - "integrity": "sha512-0edkryb8YSo6ErM2OIeHYtR1FNyN7NwHzujwjmz3ag8ayptSjdBA8B80IZhZ8o8mniYtbJNcj+Yhcyvq6LHzHQ==", - "dependencies": [ - "zod" - ] - }, - "@restatedev/restate-sdk@1.9.0": { - "integrity": "sha512-PSvFpiD7qGN1DVBWuFHR4x5j8Mk6rAl5r75/XUAfW/YN/YchuTK4jIO4nqBLvbJ4dzioDlFbLmLZprKBVfX2tA==", + "@restatedev/restate-sdk@1.10.0": { + "integrity": "sha512-M8aCUwNCTW9W5bT+zi1+Kyqcnzd2SI75JbjLPEZCjetIVn/cepFivcfNAQZco5EFKTtWScYxcZ//VEI5LBfjsA==", "dependencies": [ "@restatedev/restate-sdk-core" ] }, - "zod@4.1.8": { - "integrity": "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==" + "zod@4.3.5": { + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==" } }, "workspace": { "dependencies": [ - "npm:@restatedev/restate-sdk-zod@^1.9.0", - "npm:@restatedev/restate-sdk@^1.9.0", - "npm:zod@^4.1.0" + "npm:@restatedev/restate-sdk@^1.10.0", + "npm:zod@^4.3.0" ] } } diff --git a/typescript/templates/deno/main.ts b/typescript/templates/deno/main.ts index 13d10223..35d4a481 100644 --- a/typescript/templates/deno/main.ts +++ b/typescript/templates/deno/main.ts @@ -1,5 +1,4 @@ import * as restate from "@restatedev/restate-sdk/fetch"; -import { serde } from "@restatedev/restate-sdk-zod"; import { sendNotification, sendReminder } from "./utils.ts"; import { z } from "zod"; @@ -16,7 +15,7 @@ export const greeter = restate.service({ name: "Greeter", handlers: { greet: restate.createServiceHandler( - { input: serde.zod(Greeting), output: serde.zod(GreetingResponse) }, + { input: restate.serde.schema(Greeting), output: restate.serde.schema(GreetingResponse) }, async (ctx: restate.Context, { name }) => { // Durably execute a set of steps; resilient against failures const greetingId = ctx.rand.uuidv4(); diff --git a/typescript/templates/lambda/.claude/CLAUDE.md b/typescript/templates/lambda/.claude/CLAUDE.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/lambda/.claude/CLAUDE.md +++ b/typescript/templates/lambda/.claude/CLAUDE.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/lambda/.cursor/rules/AGENTS.md b/typescript/templates/lambda/.cursor/rules/AGENTS.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/lambda/.cursor/rules/AGENTS.md +++ b/typescript/templates/lambda/.cursor/rules/AGENTS.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/lambda/package-lock.json b/typescript/templates/lambda/package-lock.json index ce793413..9c7ed29d 100644 --- a/typescript/templates/lambda/package-lock.json +++ b/typescript/templates/lambda/package-lock.json @@ -8,9 +8,8 @@ "name": "restate-ts-template", "version": "0.0.1", "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", - "zod": "^4.1.0" + "@restatedev/restate-sdk": "^1.10.0", + "zod": "^4.3" }, "devDependencies": { "@types/node": "^22.18.6", @@ -445,37 +444,19 @@ } }, "node_modules/@restatedev/restate-sdk": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-1.9.1.tgz", - "integrity": "sha512-8w6t7cG5mXMgI+YPxIuPuplVX12lKbgne1byzmkQtif9lpPT6gjd7ce1EmWrUtsD25WCL+lf4iKU/usfqaXQCg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-1.10.0.tgz", + "integrity": "sha512-M8aCUwNCTW9W5bT+zi1+Kyqcnzd2SI75JbjLPEZCjetIVn/cepFivcfNAQZco5EFKTtWScYxcZ//VEI5LBfjsA==", "license": "MIT", "dependencies": { - "@restatedev/restate-sdk-core": "^1.9.1" - }, - "engines": { - "node": ">= 20.19" + "@restatedev/restate-sdk-core": "1.10.0" } }, "node_modules/@restatedev/restate-sdk-core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.9.1.tgz", - "integrity": "sha512-/ISSWBF0YAH0mhIhnd6VFuFLMp6AckdfGyfU+CdJDccysxH1qp0QuI5oJ5UArexoFTI6LXrWkYg2/nZebO96gA==", - "license": "MIT", - "engines": { - "node": ">= 20.19" - } - }, - "node_modules/@restatedev/restate-sdk-zod": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-zod/-/restate-sdk-zod-1.9.1.tgz", - "integrity": "sha512-tlYiYfMZGzckA3pKY6zmdZ6pc65ko0gg/AkDGAhKDYpMBXDAGW9S/Ge/jlduRVPCU1PXykZM1ZIL8+0oU0Hojg==", - "license": "MIT", - "engines": { - "node": ">= 20.19" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.0.tgz", + "integrity": "sha512-hX25ThMW5TSUMjcQLok0YKr4A6MvN2S6TaCqZGibZhJi1pcGtgsYhKmwUZYyQvq5RyX94gFrU4k0J7yB/2j0DQ==", + "license": "MIT" }, "node_modules/@types/node": { "version": "22.18.6", @@ -608,9 +589,9 @@ "license": "MIT" }, "node_modules/zod": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.8.tgz", - "integrity": "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/typescript/templates/lambda/package.json b/typescript/templates/lambda/package.json index a0b04277..83775e0e 100644 --- a/typescript/templates/lambda/package.json +++ b/typescript/templates/lambda/package.json @@ -15,9 +15,8 @@ "app-dev": "npm run dev" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", - "zod": "^4.1.0" + "@restatedev/restate-sdk": "^1.10.0", + "zod": "^4.3" }, "devDependencies": { "@types/node": "^22.18.6", diff --git a/typescript/templates/lambda/src/app.ts b/typescript/templates/lambda/src/app.ts index 9c430ee7..6ab04f6a 100644 --- a/typescript/templates/lambda/src/app.ts +++ b/typescript/templates/lambda/src/app.ts @@ -1,5 +1,4 @@ import * as restate from "@restatedev/restate-sdk/lambda"; -import { serde } from "@restatedev/restate-sdk-zod"; import { sendNotification, sendReminder } from "./utils"; import { z } from "zod"; @@ -16,7 +15,7 @@ export const greeter = restate.service({ name: "Greeter", handlers: { greet: restate.createServiceHandler( - { input: serde.zod(Greeting), output: serde.zod(GreetingResponse) }, + { input: restate.serde.schema(Greeting), output: restate.serde.schema(GreetingResponse) }, async (ctx: restate.Context, { name }) => { // Durably execute a set of steps; resilient against failures const greetingId = ctx.rand.uuidv4(); diff --git a/typescript/templates/nextjs/.claude/CLAUDE.md b/typescript/templates/nextjs/.claude/CLAUDE.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/nextjs/.claude/CLAUDE.md +++ b/typescript/templates/nextjs/.claude/CLAUDE.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/nextjs/.cursor/rules/AGENTS.md b/typescript/templates/nextjs/.cursor/rules/AGENTS.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/nextjs/.cursor/rules/AGENTS.md +++ b/typescript/templates/nextjs/.cursor/rules/AGENTS.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/nextjs/package.json b/typescript/templates/nextjs/package.json index a56505a5..a5f2fb4e 100644 --- a/typescript/templates/nextjs/package.json +++ b/typescript/templates/nextjs/package.json @@ -8,13 +8,12 @@ "start": "next start" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-clients": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", - "next": "15.5.4", + "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk-clients": "^1.10.0", + "next": "16.1.1", "react": "19.1.0", "react-dom": "19.1.0", - "zod": "^4.1.0" + "zod": "^4.3" }, "devDependencies": { "@tailwindcss/postcss": "^4", diff --git a/typescript/templates/nextjs/restate/greeter.ts b/typescript/templates/nextjs/restate/greeter.ts index a8fb4859..3b0c8f06 100644 --- a/typescript/templates/nextjs/restate/greeter.ts +++ b/typescript/templates/nextjs/restate/greeter.ts @@ -1,5 +1,4 @@ import * as restate from "@restatedev/restate-sdk"; -import { serde } from "@restatedev/restate-sdk-zod"; import { sendNotification, sendReminder } from "@/restate/utils"; import { z } from "zod"; @@ -16,7 +15,7 @@ export const greeter = restate.service({ name: "Greeter", handlers: { greet: restate.createServiceHandler( - { input: serde.zod(Greeting), output: serde.zod(GreetingResponse) }, + { input: restate.serde.schema(Greeting), output: restate.serde.schema(GreetingResponse) }, async (ctx: restate.Context, { name }) => { // Durably execute a set of steps; resilient against failures const greetingId = ctx.rand.uuidv4(); diff --git a/typescript/templates/node/.claude/CLAUDE.md b/typescript/templates/node/.claude/CLAUDE.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/node/.claude/CLAUDE.md +++ b/typescript/templates/node/.claude/CLAUDE.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/node/.cursor/rules/AGENTS.md b/typescript/templates/node/.cursor/rules/AGENTS.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/node/.cursor/rules/AGENTS.md +++ b/typescript/templates/node/.cursor/rules/AGENTS.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/node/package.json b/typescript/templates/node/package.json index 09e48db4..14e114fe 100644 --- a/typescript/templates/node/package.json +++ b/typescript/templates/node/package.json @@ -15,9 +15,8 @@ "app-dev": "npm run dev" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", - "zod": "^4.1.0" + "@restatedev/restate-sdk": "^1.10.0", + "zod": "^4.3" }, "devDependencies": { "@types/node": "^20.14.2", diff --git a/typescript/templates/node/src/app.ts b/typescript/templates/node/src/app.ts index 54bac529..f03f60f0 100644 --- a/typescript/templates/node/src/app.ts +++ b/typescript/templates/node/src/app.ts @@ -1,5 +1,4 @@ import * as restate from "@restatedev/restate-sdk"; -import { serde } from "@restatedev/restate-sdk-zod"; import { sendNotification, sendReminder } from "./utils"; import { z } from "zod"; @@ -16,7 +15,7 @@ const greeter = restate.service({ name: "Greeter", handlers: { greet: restate.createServiceHandler( - { input: serde.zod(Greeting), output: serde.zod(GreetingResponse) }, + { input: restate.serde.schema(Greeting), output: restate.serde.schema(GreetingResponse) }, async (ctx: restate.Context, { name }) => { // Durably execute a set of steps; resilient against failures const greetingId = ctx.rand.uuidv4(); diff --git a/typescript/templates/typescript-testing/package.json b/typescript/templates/typescript-testing/package.json index 08b05b35..3ebaa3d6 100644 --- a/typescript/templates/typescript-testing/package.json +++ b/typescript/templates/typescript-testing/package.json @@ -16,8 +16,8 @@ "test": "TESTCONTAINERS_RYUK_DISABLED=true DEBUG=testcontainers,testcontainers:exec,testcontainers:containers jest --maxWorkers=1 --detectOpenHandles" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-testcontainers": "^1.9.1", + "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk-testcontainers": "^1.10.0", "testcontainers": "^10.24.1" }, "devDependencies": { diff --git a/typescript/templates/vercel/.claude/CLAUDE.md b/typescript/templates/vercel/.claude/CLAUDE.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/vercel/.claude/CLAUDE.md +++ b/typescript/templates/vercel/.claude/CLAUDE.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/vercel/.cursor/rules/AGENTS.md b/typescript/templates/vercel/.cursor/rules/AGENTS.md index 69701b17..0e99eb49 100644 --- a/typescript/templates/vercel/.cursor/rules/AGENTS.md +++ b/typescript/templates/vercel/.cursor/rules/AGENTS.md @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi"); #### Delayed Messages ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null} -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` #### Generic Calls @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => { await ctx.sleep({ seconds: 30 }); // Schedule delayed call (different from sleep + send) -ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ delay: { hours: 5 } }) -); +ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } })); ``` ### Awakeables (External Events) ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null} // Create awakeable -const {id, promise} = ctx.awakeable(); +const { id, promise } = ctx.awakeable(); // Send ID to external system await ctx.run(() => requestHumanReview(name, id)); @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]); // ✅ GOOD const result2 = await RestatePromise.any([ ctx.run(() => callLLM("gpt-4", prompt)), - ctx.run(() => callLLM("claude", prompt)) + ctx.run(() => callLLM("claude", prompt)), ]); ``` @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]); // ✅ GOOD const results2 = await RestatePromise.allSettled([ ctx.serviceClient(service1).call(), - ctx.serviceClient(service2).call() + ctx.serviceClient(service2).call(), ]); results2.forEach((result, i) => { @@ -278,10 +276,9 @@ results2.forEach((result, i) => { ### Invocation Management ```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null} -const handle = ctx.serviceSendClient(myService).myHandler( - "Hi", - restate.rpc.sendOpts({ idempotencyKey: "my-key" }) -); +const handle = ctx + .serviceSendClient(myService) + .myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" })); const invocationId = await handle.invocationId; const response = await ctx.attach(invocationId); @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry"); import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers"; import * as clients from "@restatedev/restate-sdk-clients"; import { describe, it, beforeAll, afterAll, expect } from "vitest"; -import {greeter} from "./greeter-service"; +import { greeter } from "./greeter-service"; describe("MyService", () => { - let restateTestEnvironment: RestateTestEnvironment; - let restateIngress: clients.Ingress; + let restateTestEnvironment: RestateTestEnvironment; + let restateIngress: clients.Ingress; - beforeAll(async () => { - restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]}); - restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); - }, 20_000); - - afterAll(async () => { - await restateTestEnvironment?.stop(); - }); - - it("Can call methods", async () => { - const client = restateIngress.objectClient(greeter, "myKey"); - await client.greet("Test!"); - }); - - it("Can read/write state", async () => { - const state = restateTestEnvironment.stateOf(greeter, "myKey"); - await state.set("count", 123); - expect(await state.get("count")).toBe(123); + beforeAll(async () => { + restateTestEnvironment = await RestateTestEnvironment.start({ + services: [greeter], }); + restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() }); + }, 20_000); + + afterAll(async () => { + await restateTestEnvironment?.stop(); + }); + + it("Can call methods", async () => { + const client = restateIngress.objectClient(greeter, "myKey"); + await client.greet("Test!"); + }); + + it("Can read/write state", async () => { + const state = restateTestEnvironment.stateOf(greeter, "myKey"); + await state.set("count", 123); + expect(await state.get("count")).toBe(123); + }); }); ``` ## SDK Clients (External Invocations) ```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null} -const restateClient = clients.connect({url: "http://localhost:8080"}); +const restateClient = clients.connect({ url: "http://localhost:8080" }); // Request-response const result = await restateClient - .serviceClient({name: "MyService"}) - .myHandler("Hi"); + .serviceClient({ name: "MyService" }) + .myHandler("Hi"); // One-way await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi"); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi"); // Delayed await restateClient - .serviceSendClient({name: "MyService"}) - .myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}})); + .serviceSendClient({ name: "MyService" }) + .myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } })); ``` + + +--- + +> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt \ No newline at end of file diff --git a/typescript/templates/vercel/package-lock.json b/typescript/templates/vercel/package-lock.json index 5b38180e..2e45dbc3 100644 --- a/typescript/templates/vercel/package-lock.json +++ b/typescript/templates/vercel/package-lock.json @@ -8,10 +8,9 @@ "name": "restate-vercel-template", "version": "0.1.0", "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", - "next": "15.5.4", - "zod": "^4.1.0" + "@restatedev/restate-sdk": "^1.10.0", + "next": "16.1.1", + "zod": "^4.3" }, "devDependencies": { "@types/node": "^20", @@ -458,15 +457,15 @@ } }, "node_modules/@next/env": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.4.tgz", - "integrity": "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.1.tgz", + "integrity": "sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.4.tgz", - "integrity": "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.1.tgz", + "integrity": "sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==", "cpu": [ "arm64" ], @@ -480,9 +479,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.4.tgz", - "integrity": "sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.1.tgz", + "integrity": "sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==", "cpu": [ "x64" ], @@ -496,9 +495,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.4.tgz", - "integrity": "sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.1.tgz", + "integrity": "sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==", "cpu": [ "arm64" ], @@ -512,9 +511,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.4.tgz", - "integrity": "sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.1.tgz", + "integrity": "sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==", "cpu": [ "arm64" ], @@ -528,9 +527,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.4.tgz", - "integrity": "sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.1.tgz", + "integrity": "sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==", "cpu": [ "x64" ], @@ -544,9 +543,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.4.tgz", - "integrity": "sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.1.tgz", + "integrity": "sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==", "cpu": [ "x64" ], @@ -560,9 +559,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.4.tgz", - "integrity": "sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.1.tgz", + "integrity": "sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==", "cpu": [ "arm64" ], @@ -576,9 +575,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.4.tgz", - "integrity": "sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.1.tgz", + "integrity": "sha512-Ncwbw2WJ57Al5OX0k4chM68DKhEPlrXBaSXDCi2kPi5f4d8b3ejr3RRJGfKBLrn2YJL5ezNS7w2TZLHSti8CMw==", "cpu": [ "x64" ], @@ -592,37 +591,19 @@ } }, "node_modules/@restatedev/restate-sdk": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-1.9.1.tgz", - "integrity": "sha512-8w6t7cG5mXMgI+YPxIuPuplVX12lKbgne1byzmkQtif9lpPT6gjd7ce1EmWrUtsD25WCL+lf4iKU/usfqaXQCg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-1.10.0.tgz", + "integrity": "sha512-M8aCUwNCTW9W5bT+zi1+Kyqcnzd2SI75JbjLPEZCjetIVn/cepFivcfNAQZco5EFKTtWScYxcZ//VEI5LBfjsA==", "license": "MIT", "dependencies": { - "@restatedev/restate-sdk-core": "^1.9.1" - }, - "engines": { - "node": ">= 20.19" + "@restatedev/restate-sdk-core": "1.10.0" } }, "node_modules/@restatedev/restate-sdk-core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.9.1.tgz", - "integrity": "sha512-/ISSWBF0YAH0mhIhnd6VFuFLMp6AckdfGyfU+CdJDccysxH1qp0QuI5oJ5UArexoFTI6LXrWkYg2/nZebO96gA==", - "license": "MIT", - "engines": { - "node": ">= 20.19" - } - }, - "node_modules/@restatedev/restate-sdk-zod": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-zod/-/restate-sdk-zod-1.9.1.tgz", - "integrity": "sha512-tlYiYfMZGzckA3pKY6zmdZ6pc65ko0gg/AkDGAhKDYpMBXDAGW9S/Ge/jlduRVPCU1PXykZM1ZIL8+0oU0Hojg==", - "license": "MIT", - "engines": { - "node": ">= 20.19" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.0.tgz", + "integrity": "sha512-hX25ThMW5TSUMjcQLok0YKr4A6MvN2S6TaCqZGibZhJi1pcGtgsYhKmwUZYyQvq5RyX94gFrU4k0J7yB/2j0DQ==", + "license": "MIT" }, "node_modules/@swc/helpers": { "version": "0.5.15", @@ -653,6 +634,15 @@ "csstype": "^3.0.2" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001743", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", @@ -715,13 +705,14 @@ } }, "node_modules/next": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.4.tgz", - "integrity": "sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.1.tgz", + "integrity": "sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==", "license": "MIT", "dependencies": { - "@next/env": "15.5.4", + "@next/env": "16.1.1", "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -730,18 +721,18 @@ "next": "dist/bin/next" }, "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.4", - "@next/swc-darwin-x64": "15.5.4", - "@next/swc-linux-arm64-gnu": "15.5.4", - "@next/swc-linux-arm64-musl": "15.5.4", - "@next/swc-linux-x64-gnu": "15.5.4", - "@next/swc-linux-x64-musl": "15.5.4", - "@next/swc-win32-arm64-msvc": "15.5.4", - "@next/swc-win32-x64-msvc": "15.5.4", - "sharp": "^0.34.3" + "@next/swc-darwin-arm64": "16.1.1", + "@next/swc-darwin-x64": "16.1.1", + "@next/swc-linux-arm64-gnu": "16.1.1", + "@next/swc-linux-arm64-musl": "16.1.1", + "@next/swc-linux-x64-gnu": "16.1.1", + "@next/swc-linux-x64-musl": "16.1.1", + "@next/swc-win32-arm64-msvc": "16.1.1", + "@next/swc-win32-x64-msvc": "16.1.1", + "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -946,9 +937,9 @@ "license": "MIT" }, "node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/typescript/templates/vercel/package.json b/typescript/templates/vercel/package.json index 062fc140..b7d5ce3d 100644 --- a/typescript/templates/vercel/package.json +++ b/typescript/templates/vercel/package.json @@ -8,10 +8,9 @@ "start": "next start" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-zod": "^1.9.1", - "next": "15.5.4", - "zod": "^4.1.0" + "@restatedev/restate-sdk": "^1.10.0", + "next": "16.1.1", + "zod": "^4.3" }, "devDependencies": { "@types/node": "^20", diff --git a/typescript/templates/vercel/src/restate/greeter.ts b/typescript/templates/vercel/src/restate/greeter.ts index a8fb4859..3b0c8f06 100644 --- a/typescript/templates/vercel/src/restate/greeter.ts +++ b/typescript/templates/vercel/src/restate/greeter.ts @@ -1,5 +1,4 @@ import * as restate from "@restatedev/restate-sdk"; -import { serde } from "@restatedev/restate-sdk-zod"; import { sendNotification, sendReminder } from "@/restate/utils"; import { z } from "zod"; @@ -16,7 +15,7 @@ export const greeter = restate.service({ name: "Greeter", handlers: { greet: restate.createServiceHandler( - { input: serde.zod(Greeting), output: serde.zod(GreetingResponse) }, + { input: restate.serde.schema(Greeting), output: restate.serde.schema(GreetingResponse) }, async (ctx: restate.Context, { name }) => { // Durably execute a set of steps; resilient against failures const greetingId = ctx.rand.uuidv4(); diff --git a/typescript/tutorials/tour-of-orchestration-typescript/package.json b/typescript/tutorials/tour-of-orchestration-typescript/package.json index c1b26cfa..516e81d0 100644 --- a/typescript/tutorials/tour-of-orchestration-typescript/package.json +++ b/typescript/tutorials/tour-of-orchestration-typescript/package.json @@ -15,7 +15,7 @@ "app-dev": "npm run dev" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1" + "@restatedev/restate-sdk": "^1.10.0" }, "devDependencies": { "@types/node": "^20.14.2", diff --git a/typescript/tutorials/tour-of-workflows-typescript/package.json b/typescript/tutorials/tour-of-workflows-typescript/package.json index 52f2b137..441ac5ac 100644 --- a/typescript/tutorials/tour-of-workflows-typescript/package.json +++ b/typescript/tutorials/tour-of-workflows-typescript/package.json @@ -16,8 +16,8 @@ "app-dev": "npm run dev" }, "dependencies": { - "@restatedev/restate-sdk": "^1.9.1", - "@restatedev/restate-sdk-clients": "^1.9.1" + "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk-clients": "^1.10.0" }, "devDependencies": { "@types/node": "^20.14.2", From 869ee6329146970dd905b7e12769ebdcb96e6b50 Mon Sep 17 00:00:00 2001 From: slinkydeveloper Date: Mon, 5 Jan 2026 22:20:27 +0100 Subject: [PATCH 2/2] Bump typescript sdk --- typescript/basics/package.json | 4 ++-- .../ai-image-workflows/package.json | 2 +- .../chat-bot/package.json | 2 +- .../food-ordering/app/package.json | 2 +- .../food-ordering/webui/package.json | 2 +- .../deployment-lambda-cdk/package.json | 2 +- typescript/patterns-use-cases/package.json | 4 ++-- typescript/templates/bun/package.json | 2 +- .../cloudflare-worker/package-lock.json | 16 ++++++------- .../templates/cloudflare-worker/package.json | 2 +- typescript/templates/lambda/package-lock.json | 16 ++++++------- typescript/templates/lambda/package.json | 2 +- typescript/templates/nextjs/package.json | 4 ++-- typescript/templates/nextjs/tsconfig.json | 24 +++++++++++++++---- typescript/templates/node/package.json | 2 +- .../templates/typescript-testing/package.json | 4 ++-- typescript/templates/vercel/package-lock.json | 16 ++++++------- typescript/templates/vercel/package.json | 2 +- typescript/templates/vercel/tsconfig.json | 24 +++++++++++++++---- .../package.json | 2 +- .../tour-of-workflows-typescript/package.json | 4 ++-- 21 files changed, 83 insertions(+), 55 deletions(-) diff --git a/typescript/basics/package.json b/typescript/basics/package.json index 1bd12c49..f9768e48 100644 --- a/typescript/basics/package.json +++ b/typescript/basics/package.json @@ -14,8 +14,8 @@ "example-3": "ts-node-dev --transpile-only src/3_workflows.ts" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", - "@restatedev/restate-sdk-clients": "^1.10.0" + "@restatedev/restate-sdk": "^1.10.1", + "@restatedev/restate-sdk-clients": "^1.10.1" }, "devDependencies": { "@types/node": "^20.12.12", diff --git a/typescript/end-to-end-applications/ai-image-workflows/package.json b/typescript/end-to-end-applications/ai-image-workflows/package.json index 338e9fc5..314ad04f 100644 --- a/typescript/end-to-end-applications/ai-image-workflows/package.json +++ b/typescript/end-to-end-applications/ai-image-workflows/package.json @@ -12,7 +12,7 @@ "stable-diffusion-service": "ts-node-dev --watch ./src --respawn --transpile-only src/stable_diffusion.ts" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "axios": "^1.6.7", "axios-retry": "^4.0.0", "jimp": "^0.22.10", diff --git a/typescript/end-to-end-applications/chat-bot/package.json b/typescript/end-to-end-applications/chat-bot/package.json index 6915e761..61849207 100644 --- a/typescript/end-to-end-applications/chat-bot/package.json +++ b/typescript/end-to-end-applications/chat-bot/package.json @@ -11,7 +11,7 @@ "flights-task": "RESTATE_LOGGING=INFO ts-node-dev --watch ./src --transpile-only ./src/tasks/flight_prices.ts" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "@slack/bolt": "^3.19.0", "@slack/web-api": "^7.0.4" }, diff --git a/typescript/end-to-end-applications/food-ordering/app/package.json b/typescript/end-to-end-applications/food-ordering/app/package.json index 7c2ed003..4763edf1 100644 --- a/typescript/end-to-end-applications/food-ordering/app/package.json +++ b/typescript/end-to-end-applications/food-ordering/app/package.json @@ -16,7 +16,7 @@ "dev": "RESTATE_DEBUG_LOGGING=JOURNAL ts-node-dev --watch src --respawn --transpile-only src/order-app/app.ts" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "@types/node": "^20.6.3", "@types/uuid": "^9.0.0", "axios": "^1.4.0", diff --git a/typescript/end-to-end-applications/food-ordering/webui/package.json b/typescript/end-to-end-applications/food-ordering/webui/package.json index a6703e46..371ec408 100644 --- a/typescript/end-to-end-applications/food-ordering/webui/package.json +++ b/typescript/end-to-end-applications/food-ordering/webui/package.json @@ -6,7 +6,7 @@ "node": "14.17.3" }, "dependencies": { - "@restatedev/restate-sdk-clients": "^1.10.0", + "@restatedev/restate-sdk-clients": "^1.10.1", "axios": "^0.26.0", "react": "^18.0.0", "react-dom": "^18.0.0", diff --git a/typescript/integrations/deployment-lambda-cdk/package.json b/typescript/integrations/deployment-lambda-cdk/package.json index b4b0405f..6eef271f 100644 --- a/typescript/integrations/deployment-lambda-cdk/package.json +++ b/typescript/integrations/deployment-lambda-cdk/package.json @@ -23,7 +23,7 @@ "typescript": "^5.5.4" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "aws-cdk-lib": "^2.155.0", "constructs": "^10.3.0", "source-map-support": "^0.5.21" diff --git a/typescript/patterns-use-cases/package.json b/typescript/patterns-use-cases/package.json index f78ec515..84fe509a 100644 --- a/typescript/patterns-use-cases/package.json +++ b/typescript/patterns-use-cases/package.json @@ -9,8 +9,8 @@ "format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|ts|json)\"" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", - "@restatedev/restate-sdk-clients": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", + "@restatedev/restate-sdk-clients": "^1.10.1", "cron-parser": "^5.2.0", "express": "^5.0.0", "pg": "^8.10.0", diff --git a/typescript/templates/bun/package.json b/typescript/templates/bun/package.json index 26781d09..fb84c769 100644 --- a/typescript/templates/bun/package.json +++ b/typescript/templates/bun/package.json @@ -9,7 +9,7 @@ "format": "prettier --write \"src/*.+(js|ts|json)\"" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "zod": "^4.3" }, "devDependencies": { diff --git a/typescript/templates/cloudflare-worker/package-lock.json b/typescript/templates/cloudflare-worker/package-lock.json index e068f59b..b1d0184d 100644 --- a/typescript/templates/cloudflare-worker/package-lock.json +++ b/typescript/templates/cloudflare-worker/package-lock.json @@ -8,7 +8,7 @@ "name": "restate-cloudflare-worker-template", "version": "0.0.1", "dependencies": { - "@restatedev/restate-sdk-cloudflare-workers": "^1.10.0", + "@restatedev/restate-sdk-cloudflare-workers": "^1.10.1", "zod": "^4.1.0" }, "devDependencies": { @@ -1102,18 +1102,18 @@ ] }, "node_modules/@restatedev/restate-sdk-cloudflare-workers": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-cloudflare-workers/-/restate-sdk-cloudflare-workers-1.10.0.tgz", - "integrity": "sha512-/jGF33MfLE6mhC18Z981nmQvZndquvNKycFARnaIdiKxKnWD8CCPor4oCgDsY5WgV2sC2zKRbsqRlTjMoT5uHA==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-cloudflare-workers/-/restate-sdk-cloudflare-workers-1.10.1.tgz", + "integrity": "sha512-3ESA3B5NeAeXF6JP5DYucwu2wzkBd+PKCLulKMLvDykvlG1L2OoEzcfDroX5QKBJxxI4Lhf0BKmZBLpRx2CBzw==", "license": "MIT", "dependencies": { - "@restatedev/restate-sdk-core": "1.10.0" + "@restatedev/restate-sdk-core": "1.10.1" } }, "node_modules/@restatedev/restate-sdk-core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.0.tgz", - "integrity": "sha512-hX25ThMW5TSUMjcQLok0YKr4A6MvN2S6TaCqZGibZhJi1pcGtgsYhKmwUZYyQvq5RyX94gFrU4k0J7yB/2j0DQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.1.tgz", + "integrity": "sha512-R7aECLYCja9mP8aHf+e+PUyz5jEgqggN+4ZPBw1kJ4zrXPY5Z/9m7Bq+gCJcY/Ga80iwI0PyJ5uu7xl9tWRPsg==", "license": "MIT" }, "node_modules/@scarf/scarf": { diff --git a/typescript/templates/cloudflare-worker/package.json b/typescript/templates/cloudflare-worker/package.json index 0ec46f79..ae5292c7 100644 --- a/typescript/templates/cloudflare-worker/package.json +++ b/typescript/templates/cloudflare-worker/package.json @@ -10,7 +10,7 @@ "format": "prettier --write \"src/*.+(js|ts|json)\"" }, "dependencies": { - "@restatedev/restate-sdk-cloudflare-workers": "^1.10.0", + "@restatedev/restate-sdk-cloudflare-workers": "^1.10.1", "zod": "^4.1.0" }, "devDependencies": { diff --git a/typescript/templates/lambda/package-lock.json b/typescript/templates/lambda/package-lock.json index 9c7ed29d..b201a1e6 100644 --- a/typescript/templates/lambda/package-lock.json +++ b/typescript/templates/lambda/package-lock.json @@ -8,7 +8,7 @@ "name": "restate-ts-template", "version": "0.0.1", "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "zod": "^4.3" }, "devDependencies": { @@ -444,18 +444,18 @@ } }, "node_modules/@restatedev/restate-sdk": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-1.10.0.tgz", - "integrity": "sha512-M8aCUwNCTW9W5bT+zi1+Kyqcnzd2SI75JbjLPEZCjetIVn/cepFivcfNAQZco5EFKTtWScYxcZ//VEI5LBfjsA==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-1.10.1.tgz", + "integrity": "sha512-EMvCvFAhxfJedgmrsk6SvGp4oMwnT1uIFFvD0xw7rT/8fbU/rXjRrH8seODv/wRxX4sZXZN+6KFLuz1XZPjCCw==", "license": "MIT", "dependencies": { - "@restatedev/restate-sdk-core": "1.10.0" + "@restatedev/restate-sdk-core": "1.10.1" } }, "node_modules/@restatedev/restate-sdk-core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.0.tgz", - "integrity": "sha512-hX25ThMW5TSUMjcQLok0YKr4A6MvN2S6TaCqZGibZhJi1pcGtgsYhKmwUZYyQvq5RyX94gFrU4k0J7yB/2j0DQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.1.tgz", + "integrity": "sha512-R7aECLYCja9mP8aHf+e+PUyz5jEgqggN+4ZPBw1kJ4zrXPY5Z/9m7Bq+gCJcY/Ga80iwI0PyJ5uu7xl9tWRPsg==", "license": "MIT" }, "node_modules/@types/node": { diff --git a/typescript/templates/lambda/package.json b/typescript/templates/lambda/package.json index 83775e0e..ffd3e857 100644 --- a/typescript/templates/lambda/package.json +++ b/typescript/templates/lambda/package.json @@ -15,7 +15,7 @@ "app-dev": "npm run dev" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "zod": "^4.3" }, "devDependencies": { diff --git a/typescript/templates/nextjs/package.json b/typescript/templates/nextjs/package.json index a5f2fb4e..30cdb962 100644 --- a/typescript/templates/nextjs/package.json +++ b/typescript/templates/nextjs/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", - "@restatedev/restate-sdk-clients": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", + "@restatedev/restate-sdk-clients": "^1.10.1", "next": "16.1.1", "react": "19.1.0", "react-dom": "19.1.0", diff --git a/typescript/templates/nextjs/tsconfig.json b/typescript/templates/nextjs/tsconfig.json index d8b93235..e7ff3a26 100644 --- a/typescript/templates/nextjs/tsconfig.json +++ b/typescript/templates/nextjs/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -11,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -19,9 +23,19 @@ } ], "paths": { - "@/*": ["./*"] + "@/*": [ + "./*" + ] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/typescript/templates/node/package.json b/typescript/templates/node/package.json index 14e114fe..130cb45c 100644 --- a/typescript/templates/node/package.json +++ b/typescript/templates/node/package.json @@ -15,7 +15,7 @@ "app-dev": "npm run dev" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "zod": "^4.3" }, "devDependencies": { diff --git a/typescript/templates/typescript-testing/package.json b/typescript/templates/typescript-testing/package.json index 3ebaa3d6..378a64a0 100644 --- a/typescript/templates/typescript-testing/package.json +++ b/typescript/templates/typescript-testing/package.json @@ -16,8 +16,8 @@ "test": "TESTCONTAINERS_RYUK_DISABLED=true DEBUG=testcontainers,testcontainers:exec,testcontainers:containers jest --maxWorkers=1 --detectOpenHandles" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", - "@restatedev/restate-sdk-testcontainers": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", + "@restatedev/restate-sdk-testcontainers": "^1.10.1", "testcontainers": "^10.24.1" }, "devDependencies": { diff --git a/typescript/templates/vercel/package-lock.json b/typescript/templates/vercel/package-lock.json index 2e45dbc3..fca5fbb5 100644 --- a/typescript/templates/vercel/package-lock.json +++ b/typescript/templates/vercel/package-lock.json @@ -8,7 +8,7 @@ "name": "restate-vercel-template", "version": "0.1.0", "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "next": "16.1.1", "zod": "^4.3" }, @@ -591,18 +591,18 @@ } }, "node_modules/@restatedev/restate-sdk": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-1.10.0.tgz", - "integrity": "sha512-M8aCUwNCTW9W5bT+zi1+Kyqcnzd2SI75JbjLPEZCjetIVn/cepFivcfNAQZco5EFKTtWScYxcZ//VEI5LBfjsA==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-1.10.1.tgz", + "integrity": "sha512-EMvCvFAhxfJedgmrsk6SvGp4oMwnT1uIFFvD0xw7rT/8fbU/rXjRrH8seODv/wRxX4sZXZN+6KFLuz1XZPjCCw==", "license": "MIT", "dependencies": { - "@restatedev/restate-sdk-core": "1.10.0" + "@restatedev/restate-sdk-core": "1.10.1" } }, "node_modules/@restatedev/restate-sdk-core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.0.tgz", - "integrity": "sha512-hX25ThMW5TSUMjcQLok0YKr4A6MvN2S6TaCqZGibZhJi1pcGtgsYhKmwUZYyQvq5RyX94gFrU4k0J7yB/2j0DQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk-core/-/restate-sdk-core-1.10.1.tgz", + "integrity": "sha512-R7aECLYCja9mP8aHf+e+PUyz5jEgqggN+4ZPBw1kJ4zrXPY5Z/9m7Bq+gCJcY/Ga80iwI0PyJ5uu7xl9tWRPsg==", "license": "MIT" }, "node_modules/@swc/helpers": { diff --git a/typescript/templates/vercel/package.json b/typescript/templates/vercel/package.json index b7d5ce3d..6de4d2fc 100644 --- a/typescript/templates/vercel/package.json +++ b/typescript/templates/vercel/package.json @@ -8,7 +8,7 @@ "start": "next start" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", + "@restatedev/restate-sdk": "^1.10.1", "next": "16.1.1", "zod": "^4.3" }, diff --git a/typescript/templates/vercel/tsconfig.json b/typescript/templates/vercel/tsconfig.json index c1334095..b575f7da 100644 --- a/typescript/templates/vercel/tsconfig.json +++ b/typescript/templates/vercel/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -11,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -19,9 +23,19 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": [ + "./src/*" + ] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/typescript/tutorials/tour-of-orchestration-typescript/package.json b/typescript/tutorials/tour-of-orchestration-typescript/package.json index 516e81d0..eb8f2d4a 100644 --- a/typescript/tutorials/tour-of-orchestration-typescript/package.json +++ b/typescript/tutorials/tour-of-orchestration-typescript/package.json @@ -15,7 +15,7 @@ "app-dev": "npm run dev" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0" + "@restatedev/restate-sdk": "^1.10.1" }, "devDependencies": { "@types/node": "^20.14.2", diff --git a/typescript/tutorials/tour-of-workflows-typescript/package.json b/typescript/tutorials/tour-of-workflows-typescript/package.json index 441ac5ac..d12547e4 100644 --- a/typescript/tutorials/tour-of-workflows-typescript/package.json +++ b/typescript/tutorials/tour-of-workflows-typescript/package.json @@ -16,8 +16,8 @@ "app-dev": "npm run dev" }, "dependencies": { - "@restatedev/restate-sdk": "^1.10.0", - "@restatedev/restate-sdk-clients": "^1.10.0" + "@restatedev/restate-sdk": "^1.10.1", + "@restatedev/restate-sdk-clients": "^1.10.1" }, "devDependencies": { "@types/node": "^20.14.2",