diff --git a/docs/tasks/streams.mdx b/docs/tasks/streams.mdx index c7498403c..e16f14550 100644 --- a/docs/tasks/streams.mdx +++ b/docs/tasks/streams.mdx @@ -670,6 +670,7 @@ Examples: - ✅ `https://api.trigger.dev/custom%3Fprefix%23segment` (percent-encoded `?` / `#`) - ✅ `\uFEFFhttps://api.trigger.dev/custom-prefix/\uFEFF` (BOM wrapper trimmed) - ❌ `\u2060https://api.trigger.dev/custom-prefix/\u2060` (word-joiner wrappers are rejected) +- ❌ `\u200Bhttps://api.trigger.dev/custom-prefix/\u200B` (zero-width-space wrappers are rejected) - ❌ `https://api.trigger.dev?foo=bar` - ❌ `https://api.trigger.dev#fragment` - ❌ `https://user:pass@api.trigger.dev` diff --git a/packages/ai/README.md b/packages/ai/README.md index 7368bb542..e6af6818d 100644 --- a/packages/ai/README.md +++ b/packages/ai/README.md @@ -177,6 +177,7 @@ Examples: - ✅ `https://api.trigger.dev/custom%3Fprefix%23segment` (percent-encoded `?` / `#`) - ✅ `\uFEFFhttps://api.trigger.dev/custom-prefix/\uFEFF` (BOM wrapper trimmed) - ❌ `\u2060https://api.trigger.dev/custom-prefix/\u2060` (word-joiner wrappers are rejected) +- ❌ `\u200Bhttps://api.trigger.dev/custom-prefix/\u200B` (zero-width-space wrappers are rejected) - ❌ `https://api.trigger.dev?foo=bar` (query string) - ❌ `https://api.trigger.dev#fragment` (hash fragment) - ❌ `https://user:pass@api.trigger.dev` (credentials) diff --git a/packages/ai/src/chatTransport.test.ts b/packages/ai/src/chatTransport.test.ts index 3b1dd54bc..e784a22e3 100644 --- a/packages/ai/src/chatTransport.test.ts +++ b/packages/ai/src/chatTransport.test.ts @@ -841,6 +841,17 @@ describe("TriggerChatTransport", function () { }).toThrowError("baseURL must not contain internal whitespace characters"); }); + it("throws when baseURL is wrapped with zero-width-space characters", function () { + expect(function () { + new TriggerChatTransport({ + task: "chat-task", + accessToken: "pk_trigger", + baseURL: "\u200Bhttps://api.trigger.dev/custom-prefix/\u200B", + stream: "chat-stream", + }); + }).toThrowError("baseURL must not contain internal whitespace characters"); + }); + it("throws when baseURL contains internal zero-width-non-joiner characters", function () { expect(function () { new TriggerChatTransport({ @@ -3624,6 +3635,17 @@ describe("TriggerChatTransport", function () { }).toThrowError("baseURL must not contain internal whitespace characters"); }); + it("throws from factory when baseURL is wrapped with zero-width-space characters", function () { + expect(function () { + createTriggerChatTransport({ + task: "chat-task", + accessToken: "pk_trigger", + baseURL: "\u200Bhttps://api.trigger.dev/custom-prefix/\u200B", + stream: "chat-stream", + }); + }).toThrowError("baseURL must not contain internal whitespace characters"); + }); + it("throws from factory when baseURL contains internal zero-width-non-joiner characters", function () { expect(function () { createTriggerChatTransport({