From 5e41dcbf1c952253a73b19b5bdff4e0bcb8ca8da Mon Sep 17 00:00:00 2001 From: Mason Hall Date: Tue, 8 Sep 2026 12:56:20 -0400 Subject: [PATCH 1/2] Migrate Eve to upstream main and reduce compatibility patches --- agent/agent.ts | 4 +- agent/channels/eve.ts | 126 +-- agent/subagents/browser-agent/agent.ts | 1 + .../browser-agent/lib/trace/timeline.ts | 2 +- .../browser-agent/tools/ask_question.ts | 3 - agent/subagents/browser-agent/tools/bash.ts | 3 - .../browser-agent/tools/load_skill.ts | 3 - .../browser-agent/tools/read_file.ts | 3 - .../browser-agent/tools/task_cancel.ts | 1 + .../browser-agent/tools/task_update.ts | 1 + agent/subagents/browser-agent/tools/todo.ts | 3 - .../browser-agent/tools/web_fetch.ts | 3 - .../browser-agent/tools/web_search.ts | 3 - .../browser-agent/tools/write_file.ts | 3 - agent/tools/agent.ts | 3 - agent/tools/ask_question.ts | 1 + agent/tools/bash.ts | 3 - agent/tools/connection_search.ts | 3 - agent/tools/load_skill.ts | 3 - agent/tools/read_file.ts | 3 - agent/tools/task_cancel.ts | 1 + agent/tools/task_update.ts | 1 + agent/tools/todo.ts | 3 - agent/tools/web_fetch.ts | 1 + agent/tools/web_search.ts | 1 + agent/tools/write_file.ts | 3 - evals/browser/benchmark-activity.ts | 12 +- .../tests/browser-benchmark-activity.test.ts | 13 +- package.json | 8 +- patches/README.md | 37 + patches/eve@0.49.0.patch | 67 -- .../eve@0.52.2+main.59ec96cc99f65a80.patch | 37 + pnpm-lock.yaml | 720 ++++++------------ pnpm-workspace.yaml | 3 +- tests/agent-tool-boundaries.test.ts | 56 +- tests/agent/channels/eve-channel-auth.test.ts | 38 + .../channels/linq-bundled-adapter.test.ts | 55 ++ .../hooks/browser-trace-telemetry.test.ts | 26 + tests/worker-input-bubbling.test.ts | 24 +- 39 files changed, 571 insertions(+), 710 deletions(-) delete mode 100644 agent/subagents/browser-agent/tools/ask_question.ts delete mode 100644 agent/subagents/browser-agent/tools/bash.ts delete mode 100644 agent/subagents/browser-agent/tools/load_skill.ts delete mode 100644 agent/subagents/browser-agent/tools/read_file.ts create mode 100644 agent/subagents/browser-agent/tools/task_cancel.ts create mode 100644 agent/subagents/browser-agent/tools/task_update.ts delete mode 100644 agent/subagents/browser-agent/tools/todo.ts delete mode 100644 agent/subagents/browser-agent/tools/web_fetch.ts delete mode 100644 agent/subagents/browser-agent/tools/web_search.ts delete mode 100644 agent/subagents/browser-agent/tools/write_file.ts delete mode 100644 agent/tools/agent.ts create mode 100644 agent/tools/ask_question.ts delete mode 100644 agent/tools/bash.ts delete mode 100644 agent/tools/connection_search.ts delete mode 100644 agent/tools/load_skill.ts delete mode 100644 agent/tools/read_file.ts create mode 100644 agent/tools/task_cancel.ts create mode 100644 agent/tools/task_update.ts delete mode 100644 agent/tools/todo.ts create mode 100644 agent/tools/web_fetch.ts create mode 100644 agent/tools/web_search.ts delete mode 100644 agent/tools/write_file.ts create mode 100644 patches/README.md delete mode 100644 patches/eve@0.49.0.patch create mode 100644 patches/eve@0.52.2+main.59ec96cc99f65a80.patch create mode 100644 tests/agent/channels/linq-bundled-adapter.test.ts diff --git a/agent/agent.ts b/agent/agent.ts index c0f8fb1c..2ecbdc9f 100644 --- a/agent/agent.ts +++ b/agent/agent.ts @@ -5,9 +5,7 @@ import { getGatewayModel } from "@db/services/settings"; import { scopeFromPrincipal } from "@agent/lib/principal-scope"; export default defineAgent({ - experimental: { - tasks: true, - }, + defaultTools: false, model: defineDynamic({ events: { "step.started": async (_event, ctx) => { diff --git a/agent/channels/eve.ts b/agent/channels/eve.ts index ab613f8c..b27624a5 100644 --- a/agent/channels/eve.ts +++ b/agent/channels/eve.ts @@ -1,7 +1,9 @@ +import { defineChannel } from "eve/channels"; import { eveChannel } from "eve/channels/eve"; import { ForbiddenError, localDev, + routeAuth, UnauthenticatedError, } from "eve/channels/auth"; import { z } from "zod"; @@ -20,52 +22,54 @@ import { const authenticateLocalDev = localDev(); -export default eveChannel({ - auth: [ - async (request) => { - const identity = await requestIdentityFromRequest(request); - if (!identity) return null; - const { phoneNumber, scope } = identity; - - await requireOwnedRouteSubject(scope, request); - - return { - attributes: { - conversationChannel: "eve", - phoneNumber, - workspaceId: scope.workspaceId, - }, - authenticator: "authjs", - principalId: scope.userId, - principalType: "user", - }; - }, - async (request) => { - const local = await authenticateLocalDev(request); - if (!local) return null; - - const scope = accessScopeForUser("better-auth:browser-benchmark"); - await requireOwnedRouteSubject(scope, request); - - return { - ...local, - attributes: { - ...local.attributes, - conversationChannel: "eve", - phoneNumber: "+15555550100", - workspaceId: scope.workspaceId, - }, - principalId: scope.userId, - principalType: "user" as const, - }; - }, - () => { - throw new UnauthenticatedError({ - code: "authentication_required", - message: "Sign in to continue.", - }); - }, - ], +const authenticate: Parameters[1] = [ + async (request) => { + const identity = await requestIdentityFromRequest(request); + if (!identity) return null; + const { phoneNumber, scope } = identity; + + await requireOwnedRouteSubject(scope, request); + + return { + attributes: { + conversationChannel: "eve", + phoneNumber, + workspaceId: scope.workspaceId, + }, + authenticator: "authjs", + principalId: scope.userId, + principalType: "user", + }; + }, + async (request) => { + const local = await authenticateLocalDev(request); + if (!local) return null; + + const scope = accessScopeForUser("better-auth:browser-benchmark"); + await requireOwnedRouteSubject(scope, request); + + return { + ...local, + attributes: { + ...local.attributes, + conversationChannel: "eve", + phoneNumber: "+15555550100", + workspaceId: scope.workspaceId, + }, + principalId: scope.userId, + principalType: "user" as const, + }; + }, + () => { + throw new UnauthenticatedError({ + code: "authentication_required", + message: "Sign in to continue.", + }); + }, +]; + +const channel = eveChannel({ + auth: authenticate, events: { async "action.result"(event, _channel, session) { if ( @@ -98,6 +102,36 @@ export default eveChannel({ }, }); +// Eve callback handlers authenticate their capability tokens internally. Apply +// this app's caller and workspace ownership policy at the public route boundary. +const ownedCallbackRoutes = new Set([ + "/eve/v1/connections/:name/callback/:attemptId/:token", + "/eve/v1/connections/:name/callback/:token", + "/eve/v1/callback/:token", + "/eve/v1/task-input/:token", +]); + +export default defineChannel({ + ...channel, + // oxlint-disable-next-line oxc/no-map-spread -- Keep Eve's original route definitions intact when adding the app authorization boundary. + routes: channel.routes.map((route) => { + if ( + route.transport === "websocket" || + !ownedCallbackRoutes.has(route.path) + ) { + return route; + } + return { + ...route, + async handler(request, context) { + const principal = await routeAuth(request, authenticate); + if (principal instanceof Response) return principal; + return route.handler(request, context); + }, + }; + }), +}); + // Routes without a session subject. Every other eve route must name a session // this caller owns, either in the path or inside a hook token. const subjectFreeRoutes = new Set(["/eve/v1/info", "/eve/v1/session"]); diff --git a/agent/subagents/browser-agent/agent.ts b/agent/subagents/browser-agent/agent.ts index 0cbd52af..f98ba2c2 100644 --- a/agent/subagents/browser-agent/agent.ts +++ b/agent/subagents/browser-agent/agent.ts @@ -9,6 +9,7 @@ export default defineDynamic({ events: { "turn.started": (_event, context) => { const worker = defineAgent({ + defaultTools: false, description: "Execute one bounded browser assignment for the root coordinator, including secure vault autofill, transaction preparation, optional durable browser images, human-takeover handoff, cleanup, and a concise verified result. Every initial and resumed call must include the task-completion outputSchema required by the root instructions.", model: "zai/glm-5.2", diff --git a/agent/subagents/browser-agent/lib/trace/timeline.ts b/agent/subagents/browser-agent/lib/trace/timeline.ts index 1a0bc0de..1d60aa54 100644 --- a/agent/subagents/browser-agent/lib/trace/timeline.ts +++ b/agent/subagents/browser-agent/lib/trace/timeline.ts @@ -46,7 +46,7 @@ export function traceTimelineRows(event: HookEvent): TraceTimelineRow[] { detail: compactJson(action.input), id: `${id}:${String(index)}`, label: - action.kind === "tool-call" + action.kind === "tool-call" || action.kind === "workflow-tool-call" ? action.toolName : action.kind === "load-skill" ? "Load skill" diff --git a/agent/subagents/browser-agent/tools/ask_question.ts b/agent/subagents/browser-agent/tools/ask_question.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/subagents/browser-agent/tools/ask_question.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/bash.ts b/agent/subagents/browser-agent/tools/bash.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/subagents/browser-agent/tools/bash.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/load_skill.ts b/agent/subagents/browser-agent/tools/load_skill.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/subagents/browser-agent/tools/load_skill.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/read_file.ts b/agent/subagents/browser-agent/tools/read_file.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/subagents/browser-agent/tools/read_file.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/task_cancel.ts b/agent/subagents/browser-agent/tools/task_cancel.ts new file mode 100644 index 00000000..66342e81 --- /dev/null +++ b/agent/subagents/browser-agent/tools/task_cancel.ts @@ -0,0 +1 @@ +export { default } from "eve/tools/task_cancel"; diff --git a/agent/subagents/browser-agent/tools/task_update.ts b/agent/subagents/browser-agent/tools/task_update.ts new file mode 100644 index 00000000..6dbdff31 --- /dev/null +++ b/agent/subagents/browser-agent/tools/task_update.ts @@ -0,0 +1 @@ +export { default } from "eve/tools/task_update"; diff --git a/agent/subagents/browser-agent/tools/todo.ts b/agent/subagents/browser-agent/tools/todo.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/subagents/browser-agent/tools/todo.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/web_fetch.ts b/agent/subagents/browser-agent/tools/web_fetch.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/subagents/browser-agent/tools/web_fetch.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/web_search.ts b/agent/subagents/browser-agent/tools/web_search.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/subagents/browser-agent/tools/web_search.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/write_file.ts b/agent/subagents/browser-agent/tools/write_file.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/subagents/browser-agent/tools/write_file.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/tools/agent.ts b/agent/tools/agent.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/tools/agent.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/tools/ask_question.ts b/agent/tools/ask_question.ts new file mode 100644 index 00000000..2468b1ba --- /dev/null +++ b/agent/tools/ask_question.ts @@ -0,0 +1 @@ +export { default } from "eve/tools/ask_question"; diff --git a/agent/tools/bash.ts b/agent/tools/bash.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/tools/bash.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/tools/connection_search.ts b/agent/tools/connection_search.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/tools/connection_search.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/tools/load_skill.ts b/agent/tools/load_skill.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/tools/load_skill.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/tools/read_file.ts b/agent/tools/read_file.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/tools/read_file.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/tools/task_cancel.ts b/agent/tools/task_cancel.ts new file mode 100644 index 00000000..66342e81 --- /dev/null +++ b/agent/tools/task_cancel.ts @@ -0,0 +1 @@ +export { default } from "eve/tools/task_cancel"; diff --git a/agent/tools/task_update.ts b/agent/tools/task_update.ts new file mode 100644 index 00000000..6dbdff31 --- /dev/null +++ b/agent/tools/task_update.ts @@ -0,0 +1 @@ +export { default } from "eve/tools/task_update"; diff --git a/agent/tools/todo.ts b/agent/tools/todo.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/tools/todo.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/agent/tools/web_fetch.ts b/agent/tools/web_fetch.ts new file mode 100644 index 00000000..eeae15c2 --- /dev/null +++ b/agent/tools/web_fetch.ts @@ -0,0 +1 @@ +export { default } from "eve/tools/web_fetch"; diff --git a/agent/tools/web_search.ts b/agent/tools/web_search.ts new file mode 100644 index 00000000..592e434f --- /dev/null +++ b/agent/tools/web_search.ts @@ -0,0 +1 @@ +export { default } from "eve/tools/web_search"; diff --git a/agent/tools/write_file.ts b/agent/tools/write_file.ts deleted file mode 100644 index 04bd0544..00000000 --- a/agent/tools/write_file.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { disableTool } from "eve/tools"; - -export default disableTool(); diff --git a/evals/browser/benchmark-activity.ts b/evals/browser/benchmark-activity.ts index 45a82614..1d8d6e3c 100644 --- a/evals/browser/benchmark-activity.ts +++ b/evals/browser/benchmark-activity.ts @@ -31,7 +31,17 @@ export function browserBenchmarkActivity( ) { for (const event of events.toReversed()) { if (event.type === "message.appended") { - const message = activityLine(event.data.messageSoFar); + const message = activityLine( + events + .flatMap((candidate) => + candidate.type === "message.appended" && + candidate.data.turnId === event.data.turnId && + candidate.data.stepIndex === event.data.stepIndex + ? [candidate.data.messageDelta] + : [] + ) + .join("") + ); if (message) return message; } if (event.type === "message.completed") { diff --git a/evals/browser/tests/browser-benchmark-activity.test.ts b/evals/browser/tests/browser-benchmark-activity.test.ts index 35ba14df..36c36f19 100644 --- a/evals/browser/tests/browser-benchmark-activity.test.ts +++ b/evals/browser/tests/browser-benchmark-activity.test.ts @@ -46,8 +46,7 @@ describe("browser benchmark live activity", () => { } satisfies MessageStreamEvent, { data: { - messageDelta: "Searching", - messageSoFar: "Searching current Brooklyn showtimes", + messageDelta: "Searching ", sequence: 0, stepIndex: 0, turnId: "turn_1", @@ -55,6 +54,16 @@ describe("browser benchmark live activity", () => { meta: { at: "2026-08-31T17:00:01.000Z", id: "evt_message" }, type: "message.appended", } satisfies MessageStreamEvent, + { + data: { + messageDelta: "current Brooklyn showtimes", + sequence: 0, + stepIndex: 0, + turnId: "turn_1", + }, + meta: { at: "2026-08-31T17:00:02.000Z", id: "evt_message_2" }, + type: "message.appended", + } satisfies MessageStreamEvent, ]) ).toBe("Searching current Brooklyn showtimes"); }); diff --git a/package.json b/package.json index 9c0bb824..6d8a2e10 100644 --- a/package.json +++ b/package.json @@ -23,15 +23,15 @@ "@vercel/blob": "2.8.0", "@vercel/connect": "^2.0.0", "@vercel/oidc": "3.8.5", - "ai": "^7.0.79", + "ai": "^7.0.93", "better-auth": "1.7.2", "class-variance-authority": "0.7.1", "clsx": "2.1.1", "cmdk": "1.1.1", "credit-card-type": "^10.3.0", "drizzle-orm": "^0.45.2", - "eve": "^0.49.0", - "evlog": "2.27.1", + "eve": "https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz", + "evlog": "2.28.1", "lucide-react": "1.34.0", "motion": "13.1.1", "nanoid": "6.0.1", @@ -43,7 +43,7 @@ "tailwind-merge": "3.6.0", "tailwindcss": "4.3.3", "use-stick-to-bottom": "1.1.6", - "zod": "4.4.3" + "zod": "4.5.4" }, "devDependencies": { "@electric-sql/pglite": "^0.5.8", diff --git a/patches/README.md b/patches/README.md new file mode 100644 index 00000000..ee31a90b --- /dev/null +++ b/patches/README.md @@ -0,0 +1,37 @@ +# Eve and Linq patches + +Eve is pinned to the official, immutable `pkg.eve.dev` build at +`59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2` (`0.52.2+main.59ec96cc99f65a80`). +It includes the merged turn-context placement fix in +[vercel/eve#3089](https://github.com/vercel/eve/pull/3089), which is absent from +npm's `0.52.2` release. Return to a registry version once a release contains this +commit and the patches below have been checked against it. + +The tarball SHA-256 is +`633c0d9ebf5d0d5733d8cc2fdc5315952a7ccca8cb7902c31f550dc8ab0750a9`. +The lockfile also records its package integrity. pnpm matches URL dependency +patches by package name, so keep the immutable dependency pin when changing the +Eve patch. + +## Remaining patches + +- `@linqapp__chat-sdk-adapter@0.5.1.patch` adds `replyToMessageId` to native + message delivery, preserving attachments and idempotency keys. +- `eve@0.52.2+main.59ec96cc99f65a80.patch` applies that same reply option to the + adapter Eve actually bundles. It also redirects incomplete bundled Linq and + Chat SDK declaration exports to the explicitly installed packages. Eve's + runtime still uses its bundled adapter and Chat SDK. + +Remove reply changes when upstream Linq and Eve's bundled adapter both support +native replies. Remove declaration bridges when the published declaration +files resolve without them. `linq-bundled-adapter.test.ts` exercises Eve's actual +bundled runtime; `linq-message-delivery.test.ts` covers application delivery and +the separately installed adapter. + +The old Eve patches for `ask_question` and `task_cancel` exports are no longer +needed: both now have public entry points. Callback authorization is composed +in `agent/channels/eve.ts` using public `defineChannel` and `routeAuth` APIs. +The Linq webhook verifier already converts an unsuccessful OIDC verification +into `false`, so the extra bundled null-verifier patch was redundant. + +No task-loop or prompt-placement patch is applied locally. diff --git a/patches/eve@0.49.0.patch b/patches/eve@0.49.0.patch deleted file mode 100644 index a77a00a9..00000000 --- a/patches/eve@0.49.0.patch +++ /dev/null @@ -1,67 +0,0 @@ -diff --git a/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts b/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts -index 79df1731671fc7b1da42c6dbd8f787fa48ca4c87..7514373bcc46536a37aff1cc0229dd014a2b5740 100644 ---- a/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts -+++ b/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts -@@ -1,4 +1,4 @@ --export { createLinqAdapter } from "./adapter.js"; --export type { LinqAdapterConfig, LinqDeliveryStatus, LinqDeliveryStatusEvent, LinqDeliveryStatusListener, LinqCredentialProvider, LinqCredentials, LinqSendOptions, LinqWebhookVerifier, } from "./adapter.js"; --export type { DecoratedText } from "./text-decorations.js"; -+export { createLinqAdapter } from "@linqapp/chat-sdk-adapter"; -+export type { LinqAdapterConfig, LinqDeliveryStatus, LinqDeliveryStatusEvent, LinqDeliveryStatusListener, LinqCredentialProvider, LinqCredentials, LinqSendOptions, LinqWebhookVerifier, } from "@linqapp/chat-sdk-adapter"; -+export type { DecoratedText } from "@linqapp/chat-sdk-adapter"; - //# sourceMappingURL=index.d.ts.map -\ No newline at end of file -diff --git a/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js b/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js -index 2a7892fd9a80731b72fe508eb40576723666a4a2..3fdf635c612f42a9bb0eb3b2df28cf72d08f8da4 100644 ---- a/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js -+++ b/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js -@@ -5,4 +5,4 @@ import{t as e}from"../../_chunks/node/rolldown-runtime-DaDcL9Zw.js";import{B as - `);case`link`:return Bt(e.label,e.url);case`divider`:return`———`;case`image`:return Pt(e.url)?null:Bt(e.alt,e.url);case`table`:return s(e.headers,e.rows);case`section`:{let t=e.children.map(e=>Rt(e)).filter(e=>!!e);return t.length>0?t.join(` - `):null}case`actions`:return zt(e);default:return null}}function zt(e){let t=[],n=[];for(let r of e.children)switch(r.type){case`button`:n.push(r.label);break;case`link-button`:{let e=Bt(r.label,r.url);e&&t.push(e);break}case`select`:case`radio_select`:{let e=r.options.map(e=>e.label).join(`, `);t.push(e?`${r.label}: ${e}`:r.label);break}default:break}return n.length>0&&t.unshift(`Options: ${n.join(`, `)}`),t.length>0?t.join(` - `):null}function Bt(e,t){return e&&e!==t?`${e}: ${t}`:t}function Vt(e){return Ht(e.children)}function Ht(e){return e.some(e=>e.type===`section`?Ht(e.children):e.type===`actions`&&e.children.some(e=>e.type===`button`||e.type===`select`||e.type===`radio_select`))}const Ut={strong:`bold`,emphasis:`italic`,delete:`strikethrough`};function Wt(e){let t=[],n=[],r=0,i=e=>{typeof e==`string`&&e&&(t.push(e),r+=e.length)},a=e=>{if(Array.isArray(e)){o(e);return}if(!e||typeof e!=`object`)return;let t=e,s=typeof t.type==`string`?Ut[t.type]:void 0,c=r;`value`in t?i(t.value):t.alt?i(t.alt):`children`in t&&a(t.children),s&&r>c&&n.push({range:[c,r],style:s})},o=e=>{for(let t of e)a(t)};return a(e),{value:t.join(``),decorations:n}}function Gt({value:e,decorations:t}){let n=e.length-e.trimStart().length,r=e.trim();if(!n&&r.length===e.length)return{value:r,decorations:t};let i=[];for(let e of t){let[t,a]=e.range,o=Math.min(Math.max((t??0)-n,0),r.length),s=Math.min(Math.max((a??0)-n,0),r.length);s>o&&i.push({...e,range:[o,s]})}return{value:r,decorations:i}}function Kt(e){for(let[t,n]of e.entries())if(n.animation){for(let[r,i]of e.entries())if(t!==r&&qt(n.range,i.range))throw Error(`Linq text animation range [${String(n.range)}] overlaps another decoration at [${String(i.range)}] — animations cannot overlap other decorations.`)}}function qt(e,t){return(e[0]??0)<(t[1]??0)&&(t[0]??0)<(e[1]??0)}var Jt=class extends u{toAst(e){return r(e)}fromAst(e){return a(e)}renderDecoratedPostable(e){if(e&&typeof e==`object`){if(`markdown`in e)return Wt(r(e.markdown));if(`ast`in e)return Wt(e.ast)}return{value:this.renderPostable(e),decorations:[]}}cardToFallbackText(e){return Lt(e)}};function Yt(e,t){let n=Qt(e),i=n.parts.flatMap(e=>e.type===`media`?[on(e)]:[]),a=rn(n.parts,i),s=an(n.parts),c=n.isMe,l=n.sender?.id||n.sender?.handle||`unknown`,u=n.sender?.handle||n.sender?.id||`unknown`;return new o({id:n.id,threadId:t({chatId:n.chatId,isGroup:n.isGroup}),text:a,formatted:r(a),raw:e,author:{userId:l,userName:u,fullName:u,isBot:c,isMe:c},metadata:{dateSent:nn(n.sentAt),edited:n.edited,editedAt:n.editedAt?nn(n.editedAt):void 0},attachments:i,links:s})}function Xt(e){return e.event_type===`message.received`}function Zt(e){return e.event_type===`reaction.added`||e.event_type===`reaction.removed`}function Qt(e){if($t(e))return{id:e.id,chatId:e.chat.id,isGroup:e.chat.is_group??void 0,parts:e.parts,isMe:e.direction===`outbound`||e.sender_handle.is_me===!0,sender:e.sender_handle,sentAt:e.sent_at,edited:!1};if(en(e))return{id:e.message.id,chatId:e.chat_id,isGroup:void 0,parts:e.message.parts,isMe:!0,sender:e.message.from_handle,sentAt:e.message.sent_at||e.message.created_at,edited:!1};if(tn(e)){let t=e.updated_at!==e.created_at;return{id:e.id,chatId:e.chat_id,isGroup:void 0,parts:e.parts??[],isMe:e.is_from_me||e.from_handle?.is_me===!0,sender:e.from_handle,sentAt:e.sent_at||e.created_at,edited:t,editedAt:t?e.updated_at:void 0}}throw new n(`parseMessage only supports Linq message payloads`)}function $t(e){return $(e)&&`chat`in e&&`direction`in e&&`sender_handle`in e}function en(e){return $(e)&&`chat_id`in e&&`message`in e&&$(e.message)}function tn(e){return $(e)&&`chat_id`in e&&`is_from_me`in e&&`created_at`in e}function nn(e){if(e){let t=new Date(e);if(!Number.isNaN(t.getTime()))return t}return new Date}function rn(e,t){let n=e.flatMap(e=>(e.type===`text`||e.type===`link`)&&typeof e.value==`string`?[e.value]:[]),r=t.map(e=>{let t=e.name||e.mimeType||e.type;return`[${e.type} attachment: ${t}]`});return[...n,...r].join(` --`).trim()}function an(e){let t=new Set;for(let n of e){if(n.type===`link`){t.add(n.value);continue}if(n.type===`text`)for(let e of cn(n.value))t.add(e)}return[...t].map(e=>({url:e}))}function on(e){return{type:sn(e.mime_type),url:e.url,name:e.filename,mimeType:e.mime_type,size:e.size_bytes,width:e.width??e.width_px,height:e.height??e.height_px,fetchMetadata:{url:e.url},fetchData:async()=>{let t=await fetch(e.url);if(!t.ok)throw Error(`Failed to fetch Linq attachment ${e.id||e.url}: ${t.status}`);return Buffer.from(await t.arrayBuffer())}}}function sn(e){return e.startsWith(`image/`)?`image`:e.startsWith(`video/`)?`video`:e.startsWith(`audio/`)?`audio`:`file`}function cn(e){return(e.match(/https?:\/\/[^\s<>()]+/gi)??[]).map(e=>e.replace(/[.,!?;:]+$/g,``))}const ln={jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,gif:`image/gif`,heic:`image/heic`,heif:`image/heif`,bmp:`image/bmp`,tif:`image/tiff`,tiff:`image/tiff`,webp:`image/webp`,mp4:`video/mp4`,mov:`video/quicktime`,m4v:`video/x-m4v`,"3gp":`video/3gpp`,m4a:`audio/x-m4a`,mp3:`audio/mpeg`,aac:`audio/aac`,wav:`audio/x-wav`,aiff:`audio/x-aiff`,caf:`audio/x-caf`,amr:`audio/amr`,pdf:`application/pdf`,txt:`text/plain`,csv:`text/csv`,rtf:`text/rtf`,vcf:`text/vcard`,ics:`text/calendar`,html:`text/html`,htm:`text/html`,json:`application/json`,zip:`application/zip`,doc:`application/msword`,docx:`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,xls:`application/vnd.ms-excel`,xlsx:`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,ppt:`application/vnd.ms-powerpoint`,pptx:`application/vnd.openxmlformats-officedocument.presentationml.presentation`};function un(e){return typeof e==`string`||!$(e)?{attachments:[],files:[]}:{attachments:Array.isArray(e.attachments)?e.attachments:[],files:Array.isArray(e.files)?e.files:[]}}async function dn(e,t){let{attachments:n,files:r}=un(t);if(n.length===0&&r.length===0)return[];let i=[];for(let t of n)i.push(await fn(e,t));for(let t of r)i.push(await pn(e,t));return i}async function fn(e,t){if(t.url&&t.url.startsWith(`https://`)&&!_n(t.size))return{type:`media`,url:t.url};let n=await hn(t),r=t.name??bn(t.mimeType);return{type:`media`,attachment_id:await mn(e,n,r,vn(t.mimeType,r))}}async function pn(e,t){let n=await gn(t.data),r=vn(t.mimeType,t.filename);return{type:`media`,attachment_id:await mn(e,n,t.filename,r)}}async function mn(e,t,n,r){let i=await e.attachments.create({filename:n,content_type:r,size_bytes:t.byteLength}),a=await fetch(i.upload_url,{method:i.http_method,headers:i.required_headers,body:t});if(!a.ok)throw Error(`Failed to upload Linq attachment ${n}: ${a.status} ${a.statusText}`);return i.attachment_id}async function hn(e){if(e.data!=null)return gn(e.data);if(typeof e.fetchData==`function`)return gn(await e.fetchData());if(e.url){let t=await fetch(e.url);if(!t.ok)throw Error(`Failed to download Linq attachment ${e.name??e.url}: ${t.status}`);return new Uint8Array(await t.arrayBuffer())}throw Error(`Outbound attachment ${e.name??`(unnamed)`} has no data, fetchData, or url to send`)}async function gn(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return new Uint8Array(e);if(typeof Blob<`u`&&e instanceof Blob)return new Uint8Array(await e.arrayBuffer());throw Error(`Unsupported attachment data type; expected Buffer, Blob, or ArrayBuffer`)}function _n(e){return typeof e==`number`&&e>10485760}function vn(e,t){if(e&&e.trim())return yn(e.trim());let n=t.split(`.`).pop()?.toLowerCase(),r=n?ln[n]:void 0;if(r)return r;throw Error(`Cannot determine content type for attachment "${t}"; set mimeType on the attachment`)}function yn(e){let t=e.toLowerCase();return t===`image/jpg`?`image/jpeg`:t}function bn(e){let t=e?xn(e):void 0;return t?`attachment.${t}`:`attachment`}function xn(e){let t=yn(e);for(let[e,n]of Object.entries(ln))if(n===t)return e}const Sn={like:`thumbs_up`,dislike:`thumbs_down`,love:`heart`,laugh:`laugh`,emphasize:`exclamation`,question:`question`};function Cn(e){if(e.reaction_type===`custom`)return e.custom_emoji?{emoji:t.fromGChat(e.custom_emoji),rawEmoji:e.custom_emoji}:null;let n=Sn[e.reaction_type];return n?{emoji:i(n),rawEmoji:e.reaction_type}:null}function wn(e){let n=typeof e==`string`?e:e.name,r=n.trim().replace(/^\{\{emoji:/,``).replace(/\}\}$/,``).replace(/^:+|:+$/g,``).toLowerCase();return[`thumbs_up`,`thumbsup`,`+1`,`like`,`👍`].includes(r)?{type:`like`}:[`thumbs_down`,`thumbsdown`,`-1`,`dislike`,`👎`].includes(r)?{type:`dislike`}:[`heart`,`love`,`❤️`,`❤`].includes(r)?{type:`love`}:[`laugh`,`joy`,`rofl`,`😂`,`🤣`].includes(r)?{type:`laugh`}:[`exclamation`,`emphasize`,`!!`,`!`,`‼️`,`‼`,`❗`].includes(r)?{type:`emphasize`}:[`question`,`?`,`❓`].includes(r)?{type:`question`}:{type:`custom`,custom_emoji:t.toDiscord(n)}}async function Tn(e,t){if(!t)return{ok:!1,response:new Response(`Linq webhook signing secret is not configured`,{status:503})};let n=await e.text();try{new kt.Webhook(t).verify(n,Object.fromEntries(e.headers))}catch{return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}try{return{ok:!0,event:JSON.parse(n)}}catch{return{ok:!1,response:new Response(`Invalid JSON`,{status:400})}}}const En={"message.sent":`sent`,"message.delivered":`delivered`,"message.read":`read`,"message.failed":`failed`};var Dn=class{name=`linq`;userName=`linq`;apiClient;baseURL;converter=new Jt;credentials;signingSecret;webhookVerifier;chat=null;logger;chatKinds=new Map;deliveryStatusListeners=new Set;constructor(e){if(!e.credentials&&!e.apiKey)throw Error(`Linq requires apiKey or a credentials provider.`);if(!e.webhookVerifier&&!e.credentials&&!e.signingSecret)throw Error(`Linq requires signingSecret or a webhookVerifier.`);this.apiClient=e.apiKey?new Q({apiKey:e.apiKey,baseURL:e.baseURL}):null,this.baseURL=e.baseURL,this.credentials=e.credentials,this.signingSecret=e.signingSecret,this.webhookVerifier=e.webhookVerifier,this.logger=new d}async getApiClient(){if(this.apiClient)return this.apiClient;let e=await this.credentials?.();if(!e?.apiKey)throw Error(`Linq credentials did not provide an API key.`);return new Q({apiKey:e.apiKey,baseURL:this.baseURL})}async getSigningSecret(){if(this.signingSecret)return this.signingSecret;let e=await this.credentials?.();if(!e?.signingSecret)throw Error(`Linq credentials did not provide a webhook signing secret.`);return e.signingSecret}async initialize(e){this.chat=e,this.logger=e.getLogger(`linq`)}encodeThreadId(e){return e.pendingHandle?`linq:pending:${e.pendingHandle}`:(e.isGroup!==void 0&&this.chatKinds.set(e.chatId,e.isGroup),`linq:${e.chatId}`)}decodeThreadId(e){let[t,n,r]=e.split(`:`);if(t!==`linq`||!n)throw Error(`Invalid Linq thread ID: ${e}`);if(n===`pending`){let t=e.slice(13);if(!t)throw Error(`Invalid Linq thread ID: ${e}`);return{chatId:``,pendingHandle:t,isGroup:!1}}if(r===`group`||r===`dm`){let e=r===`group`;return this.chatKinds.set(n,e),{chatId:n,isGroup:e}}if(r!==void 0)throw Error(`Invalid Linq thread ID: ${e}`);return{chatId:n,isGroup:this.chatKinds.get(n)}}async fetchMessages(e,t){let n=this.requireChatId(e),r=await(await this.getApiClient()).chats.messages.list(n,{cursor:t?.cursor,limit:t?.limit});return{messages:r.messages.map(e=>this.parseMessage(e)).sort(function(e,t){return e.metadata.dateSent.getTime()-t.metadata.dateSent.getTime()}),nextCursor:r.next_cursor||void 0}}async fetchMessage(e,t){try{let e=await(await this.getApiClient()).messages.retrieve(t);return this.parseMessage(e)}catch(e){if($(e)&&e.status===404)return null;throw e}}async postMessage(e,t,n={}){let{chatId:r,pendingHandle:i}=this.decodeThreadId(e),{value:a,decorations:o}=Gt(this.converter.renderDecoratedPostable(t)),s=await dn(await this.getApiClient(),t),c=[];if(a){let e=[...o,...n.textDecorations??[]];Kt(e),c.push(e.length?{type:`text`,value:a,text_decorations:e}:{type:`text`,value:a})}let l=Nt(t);if(l){Vt(l)&&this.logger.warn(`Card buttons/selects were flattened to text — onAction() handlers never fire over iMessage/SMS. Use LinkButton/CardLink URLs or handle plain-text replies instead.`);for(let e of Ft(l))c.push({type:`media`,url:e})}if(c.push(...s),c.length===0)throw Error(`Linq message must include text or media.`);let u=await this.getApiClient(),d=n.idempotencyKey?{idempotency_key:n.idempotencyKey}:{};if(i){let e=await u.messages.create({to:[i],message:{parts:c,...d}});return{id:e.message.id,threadId:this.encodeThreadId({chatId:e.chat_id}),raw:e}}let f=await u.chats.messages.send(r,{message:{parts:c,...d}});return{id:f.message.id,threadId:this.encodeThreadId({chatId:f.chat_id||r}),raw:f}}requireChatId(e){let{chatId:t,pendingHandle:n}=this.decodeThreadId(e);if(n)throw Error(`Linq thread ${e} has no chat yet — send a message first to create it.`);return t}async openDM(e){let t=e.trim();if(!t)throw Error(`Linq openDM requires a handle.`);return this.encodeThreadId({chatId:``,pendingHandle:t})}async editMessage(e,t,n){let r=this.requireChatId(e),i=this.converter.renderPostable(n).trim();if(!i)throw Error(`Linq message text cannot be empty.`);let a=await(await this.getApiClient()).messages.update(t,{text:i,part_index:0});return{id:a.id,threadId:this.encodeThreadId({chatId:a.chat_id||r}),raw:a}}deleteMessage(e,t){throw new n(`deleteMessage is not implemented`)}async addReaction(e,t,n){await(await this.getApiClient()).messages.addReaction(t,{operation:`add`,...wn(n)})}async removeReaction(e,t,n){await(await this.getApiClient()).messages.addReaction(t,{operation:`remove`,...wn(n)})}async fetchThread(e){let t=this.requireChatId(e),n=await(await this.getApiClient()).chats.retrieve(t);return{id:this.encodeThreadId({chatId:n.id,isGroup:n.is_group}),channelId:this.encodeThreadId({chatId:n.id,isGroup:n.is_group}),channelName:n.display_name??void 0,isDM:!n.is_group,metadata:{chat:n}}}async startTyping(e,t){let n=this.requireChatId(e),{isGroup:r}=this.decodeThreadId(e);if(r!==!0)try{await(await this.getApiClient()).chats.typing.start(n)}catch(e){if($(e)&&e.status===403)return;throw e}}async markRead(e,t){let{chatId:n}=this.decodeThreadId(e);await(await this.getApiClient()).chats.markAsRead(n)}async stream(e,t){let n=``;for await(let e of t){if(typeof e==`string`){n+=e;continue}e.type===`markdown_text`&&(n+=e.text)}return this.postMessage(e,n.trim()?{markdown:n}:` `)}async handleWebhook(e,t){let n=this.webhookVerifier?await this.verifyTrustedWebhook(e):await Tn(e,await this.getSigningSecret());if(!n.ok)return n.response;let{event:r}=n;if(this.chat&&Xt(r)&&r.data.direction===`inbound`){let e=r.data.chat.id,n=r.data.chat.is_group??void 0;if(n===void 0&&!this.chatKinds.has(e))try{let t=await(await this.getApiClient()).chats.retrieve(e);this.chatKinds.set(e,t.is_group)}catch(t){this.logger.warn(`Failed to resolve Linq chat kind for ${e}`,{error:t})}let i=this.encodeThreadId({chatId:e,isGroup:n});this.chat.processMessage(this,i,async()=>this.parseMessage(r.data),t)}else if(this.chat&&Zt(r))this.processReactionWebhook(this.chat,r,t);else{let e=En[r.event_type];e&&this.processDeliveryStatusWebhook(r,e)}return new Response(`OK`,{status:200})}async verifyTrustedWebhook(e){let t=new Uint8Array(await e.arrayBuffer());try{if(await this.webhookVerifier?.(e,t)===!1)return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}catch{return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}try{return{ok:!0,event:JSON.parse(new TextDecoder().decode(t))}}catch{return{ok:!1,response:new Response(`Invalid JSON`,{status:400})}}}onDeliveryStatus(e){return this.deliveryStatusListeners.add(e),()=>{this.deliveryStatusListeners.delete(e)}}emitDeliveryStatus(e){for(let t of this.deliveryStatusListeners)try{t(e)}catch(e){this.logger.warn(`Linq delivery-status listener threw`,{error:e})}}processDeliveryStatusWebhook(e,t){if(this.deliveryStatusListeners.size===0)return;let n=e.data,r=n.chat?.id,i=n.id;if(!r||!i){this.logger.debug(`Ignoring Linq ${e.event_type} webhook without chat/message ID`);return}let a={status:t,threadId:this.encodeThreadId({chatId:r}),messageId:i,raw:e,...n.error?{error:n.error}:{}};this.emitDeliveryStatus(a)}processReactionWebhook(e,t,n){let{chat_id:r,message_id:i}=t.data;if(!r||!i){this.logger.debug(`Ignoring Linq ${t.event_type} webhook without chat/message ID`);return}let a=Cn(t.data);if(!a){this.logger.debug(`Ignoring Linq ${t.event_type} webhook with unsupported reaction type ${t.data.reaction_type}`);return}let o=t.data.from_handle,s=t.data.is_from_me||o?.is_me===!0,c=o?.id||o?.handle||t.data.from||`unknown`,l=o?.handle||t.data.from||c;e.processReaction({adapter:this,added:t.event_type===`reaction.added`,emoji:a.emoji,rawEmoji:a.rawEmoji,messageId:i,threadId:this.encodeThreadId({chatId:r}),raw:t,user:{userId:c,userName:l,fullName:l,isBot:s,isMe:s}},n)}parseMessage(e){return Yt(e,e=>this.encodeThreadId(e))}rehydrateAttachment(e){let t=e.fetchMetadata?.url??e.url;return t?{...e,fetchData:async()=>{let e=await fetch(t);if(!e.ok)throw Error(`Failed to fetch Linq attachment ${t}: ${e.status}`);return Buffer.from(await e.arrayBuffer())}}:e}renderFormatted(e){return c(e).trim()}channelIdFromThreadId(e){return e}isDM(e){return this.decodeThreadId(e).isGroup===!1}};function On(e){return new Dn(e)}export{On as createLinqAdapter}; -\ No newline at end of file -+`).trim()}function an(e){let t=new Set;for(let n of e){if(n.type===`link`){t.add(n.value);continue}if(n.type===`text`)for(let e of cn(n.value))t.add(e)}return[...t].map(e=>({url:e}))}function on(e){return{type:sn(e.mime_type),url:e.url,name:e.filename,mimeType:e.mime_type,size:e.size_bytes,width:e.width??e.width_px,height:e.height??e.height_px,fetchMetadata:{url:e.url},fetchData:async()=>{let t=await fetch(e.url);if(!t.ok)throw Error(`Failed to fetch Linq attachment ${e.id||e.url}: ${t.status}`);return Buffer.from(await t.arrayBuffer())}}}function sn(e){return e.startsWith(`image/`)?`image`:e.startsWith(`video/`)?`video`:e.startsWith(`audio/`)?`audio`:`file`}function cn(e){return(e.match(/https?:\/\/[^\s<>()]+/gi)??[]).map(e=>e.replace(/[.,!?;:]+$/g,``))}const ln={jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,gif:`image/gif`,heic:`image/heic`,heif:`image/heif`,bmp:`image/bmp`,tif:`image/tiff`,tiff:`image/tiff`,webp:`image/webp`,mp4:`video/mp4`,mov:`video/quicktime`,m4v:`video/x-m4v`,"3gp":`video/3gpp`,m4a:`audio/x-m4a`,mp3:`audio/mpeg`,aac:`audio/aac`,wav:`audio/x-wav`,aiff:`audio/x-aiff`,caf:`audio/x-caf`,amr:`audio/amr`,pdf:`application/pdf`,txt:`text/plain`,csv:`text/csv`,rtf:`text/rtf`,vcf:`text/vcard`,ics:`text/calendar`,html:`text/html`,htm:`text/html`,json:`application/json`,zip:`application/zip`,doc:`application/msword`,docx:`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,xls:`application/vnd.ms-excel`,xlsx:`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,ppt:`application/vnd.ms-powerpoint`,pptx:`application/vnd.openxmlformats-officedocument.presentationml.presentation`};function un(e){return typeof e==`string`||!$(e)?{attachments:[],files:[]}:{attachments:Array.isArray(e.attachments)?e.attachments:[],files:Array.isArray(e.files)?e.files:[]}}async function dn(e,t){let{attachments:n,files:r}=un(t);if(n.length===0&&r.length===0)return[];let i=[];for(let t of n)i.push(await fn(e,t));for(let t of r)i.push(await pn(e,t));return i}async function fn(e,t){if(t.url&&t.url.startsWith(`https://`)&&!_n(t.size))return{type:`media`,url:t.url};let n=await hn(t),r=t.name??bn(t.mimeType);return{type:`media`,attachment_id:await mn(e,n,r,vn(t.mimeType,r))}}async function pn(e,t){let n=await gn(t.data),r=vn(t.mimeType,t.filename);return{type:`media`,attachment_id:await mn(e,n,t.filename,r)}}async function mn(e,t,n,r){let i=await e.attachments.create({filename:n,content_type:r,size_bytes:t.byteLength}),a=await fetch(i.upload_url,{method:i.http_method,headers:i.required_headers,body:t});if(!a.ok)throw Error(`Failed to upload Linq attachment ${n}: ${a.status} ${a.statusText}`);return i.attachment_id}async function hn(e){if(e.data!=null)return gn(e.data);if(typeof e.fetchData==`function`)return gn(await e.fetchData());if(e.url){let t=await fetch(e.url);if(!t.ok)throw Error(`Failed to download Linq attachment ${e.name??e.url}: ${t.status}`);return new Uint8Array(await t.arrayBuffer())}throw Error(`Outbound attachment ${e.name??`(unnamed)`} has no data, fetchData, or url to send`)}async function gn(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return new Uint8Array(e);if(typeof Blob<`u`&&e instanceof Blob)return new Uint8Array(await e.arrayBuffer());throw Error(`Unsupported attachment data type; expected Buffer, Blob, or ArrayBuffer`)}function _n(e){return typeof e==`number`&&e>10485760}function vn(e,t){if(e&&e.trim())return yn(e.trim());let n=t.split(`.`).pop()?.toLowerCase(),r=n?ln[n]:void 0;if(r)return r;throw Error(`Cannot determine content type for attachment "${t}"; set mimeType on the attachment`)}function yn(e){let t=e.toLowerCase();return t===`image/jpg`?`image/jpeg`:t}function bn(e){let t=e?xn(e):void 0;return t?`attachment.${t}`:`attachment`}function xn(e){let t=yn(e);for(let[e,n]of Object.entries(ln))if(n===t)return e}const Sn={like:`thumbs_up`,dislike:`thumbs_down`,love:`heart`,laugh:`laugh`,emphasize:`exclamation`,question:`question`};function Cn(e){if(e.reaction_type===`custom`)return e.custom_emoji?{emoji:t.fromGChat(e.custom_emoji),rawEmoji:e.custom_emoji}:null;let n=Sn[e.reaction_type];return n?{emoji:i(n),rawEmoji:e.reaction_type}:null}function wn(e){let n=typeof e==`string`?e:e.name,r=n.trim().replace(/^\{\{emoji:/,``).replace(/\}\}$/,``).replace(/^:+|:+$/g,``).toLowerCase();return[`thumbs_up`,`thumbsup`,`+1`,`like`,`👍`].includes(r)?{type:`like`}:[`thumbs_down`,`thumbsdown`,`-1`,`dislike`,`👎`].includes(r)?{type:`dislike`}:[`heart`,`love`,`❤️`,`❤`].includes(r)?{type:`love`}:[`laugh`,`joy`,`rofl`,`😂`,`🤣`].includes(r)?{type:`laugh`}:[`exclamation`,`emphasize`,`!!`,`!`,`‼️`,`‼`,`❗`].includes(r)?{type:`emphasize`}:[`question`,`?`,`❓`].includes(r)?{type:`question`}:{type:`custom`,custom_emoji:t.toDiscord(n)}}async function Tn(e,t){if(!t)return{ok:!1,response:new Response(`Linq webhook signing secret is not configured`,{status:503})};let n=await e.text();try{new kt.Webhook(t).verify(n,Object.fromEntries(e.headers))}catch{return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}try{return{ok:!0,event:JSON.parse(n)}}catch{return{ok:!1,response:new Response(`Invalid JSON`,{status:400})}}}const En={"message.sent":`sent`,"message.delivered":`delivered`,"message.read":`read`,"message.failed":`failed`};var Dn=class{name=`linq`;userName=`linq`;apiClient;baseURL;converter=new Jt;credentials;signingSecret;webhookVerifier;chat=null;logger;chatKinds=new Map;deliveryStatusListeners=new Set;constructor(e){if(!e.credentials&&!e.apiKey)throw Error(`Linq requires apiKey or a credentials provider.`);if(!e.webhookVerifier&&!e.credentials&&!e.signingSecret)throw Error(`Linq requires signingSecret or a webhookVerifier.`);this.apiClient=e.apiKey?new Q({apiKey:e.apiKey,baseURL:e.baseURL}):null,this.baseURL=e.baseURL,this.credentials=e.credentials,this.signingSecret=e.signingSecret,this.webhookVerifier=e.webhookVerifier,this.logger=new d}async getApiClient(){if(this.apiClient)return this.apiClient;let e=await this.credentials?.();if(!e?.apiKey)throw Error(`Linq credentials did not provide an API key.`);return new Q({apiKey:e.apiKey,baseURL:this.baseURL})}async getSigningSecret(){if(this.signingSecret)return this.signingSecret;let e=await this.credentials?.();if(!e?.signingSecret)throw Error(`Linq credentials did not provide a webhook signing secret.`);return e.signingSecret}async initialize(e){this.chat=e,this.logger=e.getLogger(`linq`)}encodeThreadId(e){return e.pendingHandle?`linq:pending:${e.pendingHandle}`:(e.isGroup!==void 0&&this.chatKinds.set(e.chatId,e.isGroup),`linq:${e.chatId}`)}decodeThreadId(e){let[t,n,r]=e.split(`:`);if(t!==`linq`||!n)throw Error(`Invalid Linq thread ID: ${e}`);if(n===`pending`){let t=e.slice(13);if(!t)throw Error(`Invalid Linq thread ID: ${e}`);return{chatId:``,pendingHandle:t,isGroup:!1}}if(r===`group`||r===`dm`){let e=r===`group`;return this.chatKinds.set(n,e),{chatId:n,isGroup:e}}if(r!==void 0)throw Error(`Invalid Linq thread ID: ${e}`);return{chatId:n,isGroup:this.chatKinds.get(n)}}async fetchMessages(e,t){let n=this.requireChatId(e),r=await(await this.getApiClient()).chats.messages.list(n,{cursor:t?.cursor,limit:t?.limit});return{messages:r.messages.map(e=>this.parseMessage(e)).sort(function(e,t){return e.metadata.dateSent.getTime()-t.metadata.dateSent.getTime()}),nextCursor:r.next_cursor||void 0}}async fetchMessage(e,t){try{let e=await(await this.getApiClient()).messages.retrieve(t);return this.parseMessage(e)}catch(e){if($(e)&&e.status===404)return null;throw e}}async postMessage(e,t,n={}){let{chatId:r,pendingHandle:i}=this.decodeThreadId(e),{value:a,decorations:o}=Gt(this.converter.renderDecoratedPostable(t)),s=await dn(await this.getApiClient(),t),c=[];if(a){let e=[...o,...n.textDecorations??[]];Kt(e),c.push(e.length?{type:`text`,value:a,text_decorations:e}:{type:`text`,value:a})}let l=Nt(t);if(l){Vt(l)&&this.logger.warn(`Card buttons/selects were flattened to text — onAction() handlers never fire over iMessage/SMS. Use LinkButton/CardLink URLs or handle plain-text replies instead.`);for(let e of Ft(l))c.push({type:`media`,url:e})}if(c.push(...s),c.length===0)throw Error(`Linq message must include text or media.`);let u=await this.getApiClient(),d=n.idempotencyKey?{idempotency_key:n.idempotencyKey}:{};if(i){let e=await u.messages.create({to:[i],message:{parts:c,...d}});return{id:e.message.id,threadId:this.encodeThreadId({chatId:e.chat_id}),raw:e}}let f=await u.chats.messages.send(r,{message:{parts:c,...d}});return{id:f.message.id,threadId:this.encodeThreadId({chatId:f.chat_id||r}),raw:f}}requireChatId(e){let{chatId:t,pendingHandle:n}=this.decodeThreadId(e);if(n)throw Error(`Linq thread ${e} has no chat yet — send a message first to create it.`);return t}async openDM(e){let t=e.trim();if(!t)throw Error(`Linq openDM requires a handle.`);return this.encodeThreadId({chatId:``,pendingHandle:t})}async editMessage(e,t,n){let r=this.requireChatId(e),i=this.converter.renderPostable(n).trim();if(!i)throw Error(`Linq message text cannot be empty.`);let a=await(await this.getApiClient()).messages.update(t,{text:i,part_index:0});return{id:a.id,threadId:this.encodeThreadId({chatId:a.chat_id||r}),raw:a}}deleteMessage(e,t){throw new n(`deleteMessage is not implemented`)}async addReaction(e,t,n){await(await this.getApiClient()).messages.addReaction(t,{operation:`add`,...wn(n)})}async removeReaction(e,t,n){await(await this.getApiClient()).messages.addReaction(t,{operation:`remove`,...wn(n)})}async fetchThread(e){let t=this.requireChatId(e),n=await(await this.getApiClient()).chats.retrieve(t);return{id:this.encodeThreadId({chatId:n.id,isGroup:n.is_group}),channelId:this.encodeThreadId({chatId:n.id,isGroup:n.is_group}),channelName:n.display_name??void 0,isDM:!n.is_group,metadata:{chat:n}}}async startTyping(e,t){let n=this.requireChatId(e),{isGroup:r}=this.decodeThreadId(e);if(r!==!0)try{await(await this.getApiClient()).chats.typing.start(n)}catch(e){if($(e)&&e.status===403)return;throw e}}async markRead(e,t){let{chatId:n}=this.decodeThreadId(e);await(await this.getApiClient()).chats.markAsRead(n)}async stream(e,t){let n=``;for await(let e of t){if(typeof e==`string`){n+=e;continue}e.type===`markdown_text`&&(n+=e.text)}return this.postMessage(e,n.trim()?{markdown:n}:` `)}async handleWebhook(e,t){let n=this.webhookVerifier?await this.verifyTrustedWebhook(e):await Tn(e,await this.getSigningSecret());if(!n.ok)return n.response;let{event:r}=n;if(this.chat&&Xt(r)&&r.data.direction===`inbound`){let e=r.data.chat.id,n=r.data.chat.is_group??void 0;if(n===void 0&&!this.chatKinds.has(e))try{let t=await(await this.getApiClient()).chats.retrieve(e);this.chatKinds.set(e,t.is_group)}catch(t){this.logger.warn(`Failed to resolve Linq chat kind for ${e}`,{error:t})}let i=this.encodeThreadId({chatId:e,isGroup:n});this.chat.processMessage(this,i,async()=>this.parseMessage(r.data),t)}else if(this.chat&&Zt(r))this.processReactionWebhook(this.chat,r,t);else{let e=En[r.event_type];e&&this.processDeliveryStatusWebhook(r,e)}return new Response(`OK`,{status:200})}async verifyTrustedWebhook(e){let t=new Uint8Array(await e.arrayBuffer());try{let n=await this.webhookVerifier?.(e,t);if(n===!1||n===null)return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}catch{return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}try{return{ok:!0,event:JSON.parse(new TextDecoder().decode(t))}}catch{return{ok:!1,response:new Response(`Invalid JSON`,{status:400})}}}onDeliveryStatus(e){return this.deliveryStatusListeners.add(e),()=>{this.deliveryStatusListeners.delete(e)}}emitDeliveryStatus(e){for(let t of this.deliveryStatusListeners)try{t(e)}catch(e){this.logger.warn(`Linq delivery-status listener threw`,{error:e})}}processDeliveryStatusWebhook(e,t){if(this.deliveryStatusListeners.size===0)return;let n=e.data,r=n.chat?.id,i=n.id;if(!r||!i){this.logger.debug(`Ignoring Linq ${e.event_type} webhook without chat/message ID`);return}let a={status:t,threadId:this.encodeThreadId({chatId:r}),messageId:i,raw:e,...n.error?{error:n.error}:{}};this.emitDeliveryStatus(a)}processReactionWebhook(e,t,n){let{chat_id:r,message_id:i}=t.data;if(!r||!i){this.logger.debug(`Ignoring Linq ${t.event_type} webhook without chat/message ID`);return}let a=Cn(t.data);if(!a){this.logger.debug(`Ignoring Linq ${t.event_type} webhook with unsupported reaction type ${t.data.reaction_type}`);return}let o=t.data.from_handle,s=t.data.is_from_me||o?.is_me===!0,c=o?.id||o?.handle||t.data.from||`unknown`,l=o?.handle||t.data.from||c;e.processReaction({adapter:this,added:t.event_type===`reaction.added`,emoji:a.emoji,rawEmoji:a.rawEmoji,messageId:i,threadId:this.encodeThreadId({chatId:r}),raw:t,user:{userId:c,userName:l,fullName:l,isBot:s,isMe:s}},n)}parseMessage(e){return Yt(e,e=>this.encodeThreadId(e))}rehydrateAttachment(e){let t=e.fetchMetadata?.url??e.url;return t?{...e,fetchData:async()=>{let e=await fetch(t);if(!e.ok)throw Error(`Failed to fetch Linq attachment ${t}: ${e.status}`);return Buffer.from(await e.arrayBuffer())}}:e}renderFormatted(e){return c(e).trim()}channelIdFromThreadId(e){return e}isDM(e){return this.decodeThreadId(e).isGroup===!1}};function On(e){return new Dn(e)}export{On as createLinqAdapter}; -\ No newline at end of file -diff --git a/dist/src/compiled/chat/index.d.ts b/dist/src/compiled/chat/index.d.ts -index f01145b7cd5942afe13e8d40f0005eb37c08dff0..a0211ce15ddc2922e8a1ce277cb5d7f32ccf4c61 100644 ---- a/dist/src/compiled/chat/index.d.ts -+++ b/dist/src/compiled/chat/index.d.ts -@@ -1,5 +1,5 @@ --import { P as PostableObject, h as Adapter, i as PostableObjectContext, S as StreamChunk, j as ThreadHistoryCache, k as ThreadHistoryConfig, l as StreamEvent, E as EmojiFormats, m as EmojiMapConfig, n as EmojiValue, W as WellKnownEmoji, o as CustomEmojiMap, p as AdapterPostableMessage } from './messages-BSoJG691.js'; --export { q as ActionEvent, r as ActionHandler, A as AiAssistantMessage, b as AiFilePart, c as AiImagePart, d as AiMessage, e as AiMessagePart, f as AiTextPart, g as AiUserMessage, s as AppContextCanvasEntity, u as AppContextChangedEvent, v as AppContextChangedHandler, w as AppContextChannelEntity, x as AppContextEntity, y as AppContextEntityBase, z as AppContextListEntity, B as AppContextMessageEntity, D as AppContextUnknownEntity, F as AppHomeOpenedEvent, G as AppHomeOpenedHandler, H as AppendInput, I as AppendOptions, J as AssistantContextChangedEvent, K as AssistantContextChangedHandler, L as AssistantThreadStartedEvent, N as AssistantThreadStartedHandler, O as Attachment, Q as Author, R as Channel, U as ChannelImpl, V as ChannelInfo, a as ChannelVisibility, C as Chat, X as ChatConfig, Y as ChatInstance, Z as ConcurrencyConfig, _ as ConcurrencyStrategy, $ as ConsoleLogger, a0 as CountQuery, a1 as DeleteTarget, a2 as DirectMessageHandler, a3 as DurationString, a4 as Emoji, a5 as EphemeralMessage, a6 as FetchDirection, a7 as FetchOptions, a8 as FetchResult, a9 as FileUpload, aa as FormattedContent, ab as IdentityContext, ac as IdentityResolver, ad as LinkPreview, ae as ListQuery, af as ListThreadsOptions, ag as ListThreadsResult, ah as Lock, ai as LockScope, aj as LockScopeContext, ak as LogLevel, al as Logger, am as MarkdownTextChunk, an as MemberJoinedChannelEvent, ao as MemberJoinedChannelHandler, ap as MentionHandler, M as Message, aq as MessageContext, ar as MessageData, as as MessageHandler, at as MessageMetadata, au as MessageSubject, av as ModalClearResponse, aw as ModalCloseEvent, ax as ModalCloseHandler, ay as ModalCloseResponse, az as ModalErrorsResponse, aA as ModalPushResponse, aB as ModalResponse, aC as ModalSubmitEvent, aD as ModalSubmitHandler, aE as ModalUpdateResponse, aF as OptionsLoadEvent, aG as OptionsLoadGroup, aH as OptionsLoadHandler, aI as OptionsLoadResult, aJ as PlanUpdateChunk, aK as PostEphemeralOptions, aL as Postable, aM as PostableAst, aN as PostableCard, aO as PostableMarkdown, aP as PostableMessage, aQ as PostableRaw, aR as QueueEntry, aS as RawMessage, aT as ReactionEvent, aU as ReactionHandler, aV as ScheduledMessage, aW as SentMessage, aX as SerializedChannel, aY as SerializedMessage, aZ as SerializedThread, a_ as SlashCommandEvent, a$ as SlashCommandHandler, b0 as StateAdapter, b1 as StreamOptions, b2 as SubscribedMessageHandler, b3 as THREAD_STATE_TTL_MS, b4 as TaskUpdateChunk, b5 as Thread, b6 as ThreadImpl, b7 as ThreadInfo, b8 as ThreadSummary, T as ToAiMessagesOptions, b9 as TranscriptEntry, ba as TranscriptRole, bb as TranscriptsApi, bc as TranscriptsConfig, bd as UserInfo, be as WebhookOptions, bf as deriveChannelId, bg as isPostableObject, t as toAiMessages } from './messages-BSoJG691.js'; -+import { Adapter, AdapterPostableMessage, CustomEmojiMap, EmojiFormats, EmojiMapConfig, EmojiValue, PostableObject, PostableObjectContext, StreamChunk, StreamEvent, ThreadHistoryCache, ThreadHistoryConfig, WellKnownEmoji } from "chat"; -+export * from "chat"; - import { Root, List, Content, Blockquote, Code, Emphasis, InlineCode, Delete, Link, ListItem, Paragraph, Strong, TableCell, Table as Table$1, TableRow, Text } from './_mdast.js'; - export { Blockquote, Code, Content, Delete, Emphasis, InlineCode, Link, List, ListItem, Table as MdastTable, Nodes, Paragraph, Root, Strong, TableCell, TableRow, Text } from './_mdast.js'; - import { C as CardElement, a as CardChild, b as ChartElement, A as ActionsComponent, B as ButtonComponent, c as CardComponent, d as CardLinkComponent, T as TextComponent, e as ChartComponent, D as DividerComponent, E as ExternalSelectComponent, F as FieldComponent, f as FieldsComponent, I as ImageComponent, L as LinkButtonComponent, M as ModalComponent, R as RadioSelectComponent, S as SectionComponent, g as SelectComponent, h as SelectOptionComponent, i as Table$2, j as TextInputComponent, k as cardChildToFallbackText$1, l as fromReactElement$1, m as fromReactModalElement$1, n as isCardElement$1, o as isJSX$1, p as isModalElement$1, t as toCardElement$1, q as toModalElement$1 } from './jsx-runtime-_JEEAotp.js'; -diff --git a/dist/src/eve-channel/index.js b/dist/src/eve-channel/index.js -index faad3dd1107c4298d157311d0b8a97d4f1316ce2..3eb522438627678f19eac70d2fbe361ac8fbb189 100644 ---- a/dist/src/eve-channel/index.js -+++ b/dist/src/eve-channel/index.js -@@ -1 +1 @@ --import{EVE_ACTIVITY_ROUTE_PATTERN,EVE_CALLBACK_ROUTE_PATTERN,EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH,EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_SESSION_CANCEL_ROUTE_PATTERN,EVE_SESSION_CLEAR_ROUTE_PATTERN,EVE_SESSION_COMPACT_ROUTE_PATTERN,EVE_SESSION_RESET_ROUTE_PATTERN,EVE_SESSION_ROUTE_PATH,EVE_SESSION_ROUTE_PATTERN,EVE_SESSION_STREAM_ROUTE_PATTERN,EVE_SUBAGENT_STREAM_ROUTE_PATTERN,EVE_TASK_INPUT_ROUTE_PATTERN,createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath}from"#protocol/routes.js";import{attachClientContext}from"#internal/client-context.js";import{createLogger,logError}from"#internal/logging.js";import{EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER}from"#protocol/message.js";import{DELETE,GET,HEAD,PATCH,POST,PUT,defineChannel}from"#public/definitions/channel.js";import{resolveForwardedPrincipal}from"#channel/forwarded-principal.js";import{handleConnectionCallbackRequest,handleLegacyConnectionCallbackRequest}from"#execution/connections/callback-route.js";import{handleActivityRequest}from"#execution/activity-route.js";import{handleSessionCallbackRequest}from"#execution/session-callback-route.js";import{handleTaskInputResponseRequest}from"#execution/task-input-response-route.js";import{WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest}from"#execution/workflow-webhook-route.js";import{readAgentInfoRouteResponse,readRemoteAgentStreamHeadersResolver,readRouteSessionCreator}from"#internal/nitro/routes/channel-route-context.js";import{parseTraceparent}from"#protocol/traceparent.js";import{readForwardedAudienceBaggage}from"#protocol/baggage.js";import{FAIL_CLOSED_FORWARDED_TRACE_ASSERTION,formatTraceContentCeiling}from"#shared/forwarded-trace-policy.js";import{routeAuth}from"#public/channels/auth.js";import{mergeUploadPolicy}from"#public/channels/upload-policy.js";import{checkUploadPolicy,createSessionStreamResponse,deriveOperationContinuationToken,parseCancelTurnBody,parseCreateBody,parseIncludeTailIndex,parseJsonRequest,parseResetBody,parseSessionControlBody,parseSessionMessageBody,parseStartIndex,rejectSessionContinuationToken,requireSessionId}from"#eve-channel/request.js";import{findRemoteSubagentBinding,healthResponse,normalizeEveCors,resolveOnMessage}from"#eve-channel/support.js";export*from"#eve-channel/types.js";const log=createLogger(`eve.channel`);function eveChannel(g){let _=mergeUploadPolicy(g.uploadPolicy);return defineChannel({cors:normalizeEveCors(g.cors),turnPolicy:g.turnPolicy,routes:[GET(EVE_HEALTH_ROUTE_PATH,async()=>healthResponse()),HEAD(EVE_HEALTH_ROUTE_PATH,async()=>healthResponse()),GET(EVE_INFO_ROUTE_PATH,async(e,t)=>{let n=await routeAuth(e,g.auth);if(n instanceof Response)return n;let r=readAgentInfoRouteResponse(t);return r===void 0?Response.json({error:`Agent info route requires internal channel dispatch context.`,ok:!1},{status:500}):await r()}),GET(EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,handleConnectionCallbackRequest),POST(EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,handleConnectionCallbackRequest),GET(EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN,handleLegacyConnectionCallbackRequest),POST(EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN,handleLegacyConnectionCallbackRequest),POST(EVE_ACTIVITY_ROUTE_PATTERN,handleActivityRequest),POST(EVE_CALLBACK_ROUTE_PATTERN,handleSessionCallbackRequest),POST(EVE_TASK_INPUT_ROUTE_PATTERN,handleTaskInputResponseRequest),GET(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),POST(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),PUT(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),PATCH(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),DELETE(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),POST(EVE_SESSION_ROUTE_PATH,async(e,t)=>{let n=await routeAuth(e,g.auth);if(n instanceof Response)return n;let r=await parseJsonRequest(e);if(r instanceof Response)return r;let i=rejectSessionContinuationToken(r);if(i!==null)return i;let a=await resolveForwardedPrincipal({trustedForwarders:g.trustedForwarders,forwarder:n,payload:r});if(a instanceof Response)return a;let o=parseCreateBody(r);if(o instanceof Response)return o;let s=o.callback===void 0?void 0:parseTraceparent(e.headers.get(`traceparent`)),c=checkUploadPolicy(o,_);if(c!==null)return c;if(o.operationId!==void 0&&a.auth.principalType===`anonymous`)return Response.json({error:`operationId requires an authenticated principal.`,ok:!1},{status:400});let l=o.operationId===void 0?void 0:await deriveOperationContinuationToken({auth:a.auth,operationId:o.operationId});if(l!==void 0){let e=await t.resolveSession(l);if(e!==void 0)return Response.json({ok:!0,sessionId:e.id,status:`accepted`},{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:e.id},status:202})}let u=s===void 0?`absent`:readForwardedAudienceBaggage(e.headers.get(`baggage`)),d=a.accepted&&s!==void 0&&(s.traceFlags&1)==1?typeof u==`object`?u:u===`malformed`?FAIL_CLOSED_FORWARDED_TRACE_ASSERTION:void 0:void 0,f=s;d!==void 0&&s!==void 0&&(f={...s,forwardedTracePolicy:d}),u===`malformed`?log.warn(`using metadata-only policy for malformed forwarded audience baggage`,{forwarder:n.principalId}):typeof u==`object`&&(d===void 0?log.warn(`ignoring forwarded trace policy without an accepted sampled principal`,{forwarder:n.principalId}):log.info(`accepted forwarded trace policy`,{audience:u.originAudience,ceiling:formatTraceContentCeiling(u.ceiling),forwarder:n.principalId}));let p=await resolveOnMessage({auth:a.auth,config:g,message:o.message,request:e});if(p instanceof Response)return p;let m=readRouteSessionCreator(t);if(m===void 0)return Response.json({error:`Session creation requires internal channel dispatch context.`,ok:!1},{status:500});let h;try{h=await m({activityObserver:o.activityObserver,auth:p.auth,capabilities:o.capabilities??(o.mode===`task`?void 0:{requestInput:!0}),callback:o.callback,continuationToken:l,initiatorAuth:a.accepted?a.initiatorAuth:void 0,input:attachClientContext({message:o.message,context:p.context,outputSchema:o.outputSchema},o.context),mode:o.mode??`conversation`,parentTraceContext:f,title:p.title})}catch(e){let t=logError(log,`session-create request failed`,e);return Response.json({error:`Failed to create the session.`,errorId:t,ok:!1},{status:500})}return Response.json({ok:!0,sessionId:h.sessionId,status:`accepted`},{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:h.sessionId},status:202})}),POST(EVE_SESSION_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseJsonRequest(e);if(a instanceof Response)return a;let o=await resolveForwardedPrincipal({trustedForwarders:g.trustedForwarders,forwarder:r,payload:a});if(o instanceof Response)return o;let s=parseSessionMessageBody(a);if(s instanceof Response)return s;let c=checkUploadPolicy(s,_);if(c!==null)return c;let l,u=o.auth;if(s.message!==void 0){let t=await resolveOnMessage({auth:o.auth,config:g,message:s.message,request:e,sessionId:i});if(t instanceof Response)return t;l=t.context,u=t.auth}let d;try{let e=t(i),n=attachClientContext({activityObserver:s.activityObserver,auth:u,callback:s.callback,context:l,outputSchema:s.outputSchema,turnPolicy:s.turnPolicy},s.context);d=s.inputResponses===void 0?await e.send(s.message,n):await e.respond(s.inputResponses,n)}catch(e){let t=logError(log,`session-message request failed`,e,{sessionId:i});return Response.json({error:`Failed to send the session message.`,errorId:t,ok:!1},{status:500})}return d.status===`session_not_active`?Response.json({code:`session_not_active`,error:`The session is no longer active.`,ok:!1},{headers:{"cache-control":`no-store`},status:409}):Response.json({ok:!0,sessionId:d.sessionId,status:`accepted`},{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:d.sessionId},status:202})}),POST(EVE_SESSION_CANCEL_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseCancelTurnBody(e);if(a instanceof Response)return a;let o;try{o=await t(i).cancel({taskId:a.taskId,turnId:a.turnId})}catch(e){let t=logError(log,`cancel-turn request failed`,e,{sessionId:i});return Response.json({error:`Failed to cancel the turn.`,errorId:t,ok:!1},{status:500})}return Response.json(o.status===`accepted`?{ok:!0,sessionId:o.sessionId,status:`accepted`}:{ok:!0,status:`no_active_turn`},{headers:{"cache-control":`no-store`},status:o.status===`accepted`?202:200})}),POST(EVE_SESSION_COMPACT_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseSessionControlBody(e);if(a instanceof Response)return a;let o;try{o=await t(i).compact()}catch(e){let t=logError(log,`session-compaction request failed`,e,{sessionId:i});return Response.json({error:`Failed to compact the session.`,errorId:t,ok:!1},{status:500})}return Response.json(o.status===`accepted`?{ok:!0,sessionId:o.sessionId,status:`accepted`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`},status:o.status===`accepted`?202:200})}),POST(EVE_SESSION_CLEAR_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseSessionControlBody(e);if(a instanceof Response)return a;let o;try{o=await t(i).clear()}catch(e){let t=logError(log,`session-clear request failed`,e,{sessionId:i});return Response.json({error:`Failed to clear the session context.`,errorId:t,ok:!1},{status:500})}return Response.json(o.status===`accepted`?{ok:!0,sessionId:o.sessionId,status:`accepted`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`},status:o.status===`accepted`?202:200})}),POST(EVE_SESSION_RESET_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseResetBody(e);if(a instanceof Response)return a;let o;try{o=await t(i).reset({reason:a.reason})}catch(e){let t=logError(log,`session-reset request failed`,e,{sessionId:i});return Response.json({error:`Failed to reset the session.`,errorId:t,ok:!1},{status:500})}return Response.json(o.status===`reset`?{ok:!0,previousSessionId:o.previousSessionId,status:`reset`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`}})}),GET(EVE_SESSION_STREAM_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);return i instanceof Response?i:await createSessionStreamResponse(e,t(i))}),GET(EVE_SUBAGENT_STREAM_ROUTE_PATTERN,async(e,t)=>{let n=await routeAuth(e,g.auth);if(n instanceof Response)return n;let r=t.params.parentSessionId,i=t.params.callId,a=t.params.childSessionId;if(!r||!i||!a)return Response.json({error:`Missing subagent stream coordinates.`,ok:!1},{status:400});let o=parseStartIndex(e);if(o instanceof Response)return o;let s=parseIncludeTailIndex(e),c=createEveSubagentStreamRoutePath({callId:i,childSessionId:a,parentSessionId:r}),l;try{let e=await findRemoteSubagentBinding({callId:i,childSessionId:a,childStreamPath:c,parentSessionId:r,parent:t.attachSession(r)});if(e===void 0)throw Error(`Remote subagent binding not found.`);l=e}catch{return Response.json({error:`Subagent stream not found.`,ok:!1},{status:404})}let u=readRemoteAgentStreamHeadersResolver(t);if(u===void 0)return Response.json({error:`Subagent stream proxy requires internal channel dispatch context.`,ok:!1},{status:500});let d;try{d=await u({name:l.data.toolName,resolverId:l.data.remote.resolverId,url:l.data.remote.url})}catch{return Response.json({error:`Subagent stream not found.`,ok:!1},{status:404})}let f=new URL(createEveSessionStreamRoutePath(a).replace(/^\/+/,``),`${l.data.remote.url.replace(/\/+$/,``)}/`);o!==void 0&&f.searchParams.set(`startIndex`,String(o)),s&&f.searchParams.set(`includeTailIndex`,`1`);let p=await fetch(f,{cache:`no-store`,headers:d,redirect:`manual`,signal:e.signal}),m=new Headers;for(let e of[`cache-control`,`content-type`,`x-accel-buffering`,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER]){let t=p.headers.get(e);t!==null&&m.set(e,t)}return new Response(p.body,{headers:m,status:p.status,statusText:p.statusText})})],events:g.events})}export{eveChannel}; -\ No newline at end of file -+import{EVE_ACTIVITY_ROUTE_PATTERN,EVE_CALLBACK_ROUTE_PATTERN,EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH,EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_SESSION_CANCEL_ROUTE_PATTERN,EVE_SESSION_CLEAR_ROUTE_PATTERN,EVE_SESSION_COMPACT_ROUTE_PATTERN,EVE_SESSION_RESET_ROUTE_PATTERN,EVE_SESSION_ROUTE_PATH,EVE_SESSION_ROUTE_PATTERN,EVE_SESSION_STREAM_ROUTE_PATTERN,EVE_SUBAGENT_STREAM_ROUTE_PATTERN,EVE_TASK_INPUT_ROUTE_PATTERN,createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath}from"#protocol/routes.js";import{attachClientContext}from"#internal/client-context.js";import{createLogger,logError}from"#internal/logging.js";import{EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER}from"#protocol/message.js";import{DELETE,GET,HEAD,PATCH,POST,PUT,defineChannel}from"#public/definitions/channel.js";import{resolveForwardedPrincipal}from"#channel/forwarded-principal.js";import{handleConnectionCallbackRequest,handleLegacyConnectionCallbackRequest}from"#execution/connections/callback-route.js";import{handleActivityRequest}from"#execution/activity-route.js";import{handleSessionCallbackRequest}from"#execution/session-callback-route.js";import{handleTaskInputResponseRequest}from"#execution/task-input-response-route.js";import{WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest}from"#execution/workflow-webhook-route.js";import{readAgentInfoRouteResponse,readRemoteAgentStreamHeadersResolver,readRouteSessionCreator}from"#internal/nitro/routes/channel-route-context.js";import{parseTraceparent}from"#protocol/traceparent.js";import{readForwardedAudienceBaggage}from"#protocol/baggage.js";import{FAIL_CLOSED_FORWARDED_TRACE_ASSERTION,formatTraceContentCeiling}from"#shared/forwarded-trace-policy.js";import{routeAuth}from"#public/channels/auth.js";import{mergeUploadPolicy}from"#public/channels/upload-policy.js";import{checkUploadPolicy,createSessionStreamResponse,deriveOperationContinuationToken,parseCancelTurnBody,parseCreateBody,parseIncludeTailIndex,parseJsonRequest,parseResetBody,parseSessionControlBody,parseSessionMessageBody,parseStartIndex,rejectSessionContinuationToken,requireSessionId}from"#eve-channel/request.js";import{findRemoteSubagentBinding,healthResponse,normalizeEveCors,resolveOnMessage}from"#eve-channel/support.js";export*from"#eve-channel/types.js";const log=createLogger(`eve.channel`);function eveChannel(g){let _=mergeUploadPolicy(g.uploadPolicy),withRouteAuth=e=>async(t,n)=>{let r=await routeAuth(t,g.auth);return r instanceof Response?r:e(t,n)};return defineChannel({cors:normalizeEveCors(g.cors),turnPolicy:g.turnPolicy,routes:[GET(EVE_HEALTH_ROUTE_PATH,async()=>healthResponse()),HEAD(EVE_HEALTH_ROUTE_PATH,async()=>healthResponse()),GET(EVE_INFO_ROUTE_PATH,async(e,t)=>{let n=await routeAuth(e,g.auth);if(n instanceof Response)return n;let r=readAgentInfoRouteResponse(t);return r===void 0?Response.json({error:`Agent info route requires internal channel dispatch context.`,ok:!1},{status:500}):await r()}),GET(EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,withRouteAuth(handleConnectionCallbackRequest)),POST(EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,withRouteAuth(handleConnectionCallbackRequest)),GET(EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN,withRouteAuth(handleLegacyConnectionCallbackRequest)),POST(EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN,withRouteAuth(handleLegacyConnectionCallbackRequest)),POST(EVE_ACTIVITY_ROUTE_PATTERN,handleActivityRequest),POST(EVE_CALLBACK_ROUTE_PATTERN,withRouteAuth(handleSessionCallbackRequest)),POST(EVE_TASK_INPUT_ROUTE_PATTERN,withRouteAuth(handleTaskInputResponseRequest)),GET(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),POST(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),PUT(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),PATCH(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),DELETE(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),POST(EVE_SESSION_ROUTE_PATH,async(e,t)=>{let n=await routeAuth(e,g.auth);if(n instanceof Response)return n;let r=await parseJsonRequest(e);if(r instanceof Response)return r;let i=rejectSessionContinuationToken(r);if(i!==null)return i;let a=await resolveForwardedPrincipal({trustedForwarders:g.trustedForwarders,forwarder:n,payload:r});if(a instanceof Response)return a;let o=parseCreateBody(r);if(o instanceof Response)return o;let s=o.callback===void 0?void 0:parseTraceparent(e.headers.get(`traceparent`)),c=checkUploadPolicy(o,_);if(c!==null)return c;if(o.operationId!==void 0&&a.auth.principalType===`anonymous`)return Response.json({error:`operationId requires an authenticated principal.`,ok:!1},{status:400});let l=o.operationId===void 0?void 0:await deriveOperationContinuationToken({auth:a.auth,operationId:o.operationId});if(l!==void 0){let e=await t.resolveSession(l);if(e!==void 0)return Response.json({ok:!0,sessionId:e.id,status:`accepted`},{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:e.id},status:202})}let u=s===void 0?`absent`:readForwardedAudienceBaggage(e.headers.get(`baggage`)),d=a.accepted&&s!==void 0&&(s.traceFlags&1)==1?typeof u==`object`?u:u===`malformed`?FAIL_CLOSED_FORWARDED_TRACE_ASSERTION:void 0:void 0,f=s;d!==void 0&&s!==void 0&&(f={...s,forwardedTracePolicy:d}),u===`malformed`?log.warn(`using metadata-only policy for malformed forwarded audience baggage`,{forwarder:n.principalId}):typeof u==`object`&&(d===void 0?log.warn(`ignoring forwarded trace policy without an accepted sampled principal`,{forwarder:n.principalId}):log.info(`accepted forwarded trace policy`,{audience:u.originAudience,ceiling:formatTraceContentCeiling(u.ceiling),forwarder:n.principalId}));let p=await resolveOnMessage({auth:a.auth,config:g,message:o.message,request:e});if(p instanceof Response)return p;let m=readRouteSessionCreator(t);if(m===void 0)return Response.json({error:`Session creation requires internal channel dispatch context.`,ok:!1},{status:500});let h;try{h=await m({activityObserver:o.activityObserver,auth:p.auth,capabilities:o.capabilities??(o.mode===`task`?void 0:{requestInput:!0}),callback:o.callback,continuationToken:l,initiatorAuth:a.accepted?a.initiatorAuth:void 0,input:attachClientContext({message:o.message,context:p.context,outputSchema:o.outputSchema},o.context),mode:o.mode??`conversation`,parentTraceContext:f,title:p.title})}catch(e){let t=logError(log,`session-create request failed`,e);return Response.json({error:`Failed to create the session.`,errorId:t,ok:!1},{status:500})}return Response.json({ok:!0,sessionId:h.sessionId,status:`accepted`},{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:h.sessionId},status:202})}),POST(EVE_SESSION_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseJsonRequest(e);if(a instanceof Response)return a;let o=await resolveForwardedPrincipal({trustedForwarders:g.trustedForwarders,forwarder:r,payload:a});if(o instanceof Response)return o;let s=parseSessionMessageBody(a);if(s instanceof Response)return s;let c=checkUploadPolicy(s,_);if(c!==null)return c;let l,u=o.auth;if(s.message!==void 0){let t=await resolveOnMessage({auth:o.auth,config:g,message:s.message,request:e,sessionId:i});if(t instanceof Response)return t;l=t.context,u=t.auth}let d;try{let e=t(i),n=attachClientContext({activityObserver:s.activityObserver,auth:u,callback:s.callback,context:l,outputSchema:s.outputSchema,turnPolicy:s.turnPolicy},s.context);d=s.inputResponses===void 0?await e.send(s.message,n):await e.respond(s.inputResponses,n)}catch(e){let t=logError(log,`session-message request failed`,e,{sessionId:i});return Response.json({error:`Failed to send the session message.`,errorId:t,ok:!1},{status:500})}return d.status===`session_not_active`?Response.json({code:`session_not_active`,error:`The session is no longer active.`,ok:!1},{headers:{"cache-control":`no-store`},status:409}):Response.json({ok:!0,sessionId:d.sessionId,status:`accepted`},{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:d.sessionId},status:202})}),POST(EVE_SESSION_CANCEL_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseCancelTurnBody(e);if(a instanceof Response)return a;let o;try{o=await t(i).cancel({taskId:a.taskId,turnId:a.turnId})}catch(e){let t=logError(log,`cancel-turn request failed`,e,{sessionId:i});return Response.json({error:`Failed to cancel the turn.`,errorId:t,ok:!1},{status:500})}return Response.json(o.status===`accepted`?{ok:!0,sessionId:o.sessionId,status:`accepted`}:{ok:!0,status:`no_active_turn`},{headers:{"cache-control":`no-store`},status:o.status===`accepted`?202:200})}),POST(EVE_SESSION_COMPACT_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseSessionControlBody(e);if(a instanceof Response)return a;let o;try{o=await t(i).compact()}catch(e){let t=logError(log,`session-compaction request failed`,e,{sessionId:i});return Response.json({error:`Failed to compact the session.`,errorId:t,ok:!1},{status:500})}return Response.json(o.status===`accepted`?{ok:!0,sessionId:o.sessionId,status:`accepted`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`},status:o.status===`accepted`?202:200})}),POST(EVE_SESSION_CLEAR_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseSessionControlBody(e);if(a instanceof Response)return a;let o;try{o=await t(i).clear()}catch(e){let t=logError(log,`session-clear request failed`,e,{sessionId:i});return Response.json({error:`Failed to clear the session context.`,errorId:t,ok:!1},{status:500})}return Response.json(o.status===`accepted`?{ok:!0,sessionId:o.sessionId,status:`accepted`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`},status:o.status===`accepted`?202:200})}),POST(EVE_SESSION_RESET_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);if(i instanceof Response)return i;let a=await parseResetBody(e);if(a instanceof Response)return a;let o;try{o=await t(i).reset({reason:a.reason})}catch(e){let t=logError(log,`session-reset request failed`,e,{sessionId:i});return Response.json({error:`Failed to reset the session.`,errorId:t,ok:!1},{status:500})}return Response.json(o.status===`reset`?{ok:!0,previousSessionId:o.previousSessionId,status:`reset`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`}})}),GET(EVE_SESSION_STREAM_ROUTE_PATTERN,async(e,{attachSession:t,params:n})=>{let r=await routeAuth(e,g.auth);if(r instanceof Response)return r;let i=requireSessionId(n);return i instanceof Response?i:await createSessionStreamResponse(e,t(i))}),GET(EVE_SUBAGENT_STREAM_ROUTE_PATTERN,async(e,t)=>{let n=await routeAuth(e,g.auth);if(n instanceof Response)return n;let r=t.params.parentSessionId,i=t.params.callId,a=t.params.childSessionId;if(!r||!i||!a)return Response.json({error:`Missing subagent stream coordinates.`,ok:!1},{status:400});let o=parseStartIndex(e);if(o instanceof Response)return o;let s=parseIncludeTailIndex(e),c=createEveSubagentStreamRoutePath({callId:i,childSessionId:a,parentSessionId:r}),l;try{let e=await findRemoteSubagentBinding({callId:i,childSessionId:a,childStreamPath:c,parentSessionId:r,parent:t.attachSession(r)});if(e===void 0)throw Error(`Remote subagent binding not found.`);l=e}catch{return Response.json({error:`Subagent stream not found.`,ok:!1},{status:404})}let u=readRemoteAgentStreamHeadersResolver(t);if(u===void 0)return Response.json({error:`Subagent stream proxy requires internal channel dispatch context.`,ok:!1},{status:500});let d;try{d=await u({name:l.data.toolName,resolverId:l.data.remote.resolverId,url:l.data.remote.url})}catch{return Response.json({error:`Subagent stream not found.`,ok:!1},{status:404})}let f=new URL(createEveSessionStreamRoutePath(a).replace(/^\/+/,``),`${l.data.remote.url.replace(/\/+$/,``)}/`);o!==void 0&&f.searchParams.set(`startIndex`,String(o)),s&&f.searchParams.set(`includeTailIndex`,`1`);let p=await fetch(f,{cache:`no-store`,headers:d,redirect:`manual`,signal:e.signal}),m=new Headers;for(let e of[`cache-control`,`content-type`,`x-accel-buffering`,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER]){let t=p.headers.get(e);t!==null&&m.set(e,t)}return new Response(p.body,{headers:m,status:p.status,statusText:p.statusText})})],events:g.events})}export{eveChannel}; -\ No newline at end of file -diff --git a/package.json b/package.json -index 52dfd013c9d79a31999dd32d8562477e6749131b..d73b132097349fd01c5ff3742fb901c1cf288213 100644 ---- a/package.json -+++ b/package.json -@@ -126,6 +126,16 @@ - "import": "./dist/src/public/tools/sleep.js", - "default": "./dist/src/public/tools/sleep.js" - }, -+ "./tools/ask_question": { -+ "types": "./dist/src/tools/framework/ask-question.d.ts", -+ "import": "./dist/src/tools/framework/ask-question.js", -+ "default": "./dist/src/tools/framework/ask-question.js" -+ }, -+ "./tools/task_cancel": { -+ "types": "./dist/src/tools/framework/task-cancel.d.ts", -+ "import": "./dist/src/tools/framework/task-cancel.js", -+ "default": "./dist/src/tools/framework/task-cancel.js" -+ }, - "./tools": { - "types": "./dist/src/public/tools/index.d.ts", - "import": "./dist/src/public/tools/index.js", diff --git a/patches/eve@0.52.2+main.59ec96cc99f65a80.patch b/patches/eve@0.52.2+main.59ec96cc99f65a80.patch new file mode 100644 index 00000000..88940d09 --- /dev/null +++ b/patches/eve@0.52.2+main.59ec96cc99f65a80.patch @@ -0,0 +1,37 @@ +diff --git a/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts b/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts +index 79df1731671fc7b1da42c6dbd8f787fa48ca4c87..7514373bcc46536a37aff1cc0229dd014a2b5740 100644 +--- a/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts ++++ b/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts +@@ -1,4 +1,4 @@ +-export { createLinqAdapter } from "./adapter.js"; +-export type { LinqAdapterConfig, LinqDeliveryStatus, LinqDeliveryStatusEvent, LinqDeliveryStatusListener, LinqCredentialProvider, LinqCredentials, LinqSendOptions, LinqWebhookVerifier, } from "./adapter.js"; +-export type { DecoratedText } from "./text-decorations.js"; ++export { createLinqAdapter } from "@linqapp/chat-sdk-adapter"; ++export type { LinqAdapterConfig, LinqDeliveryStatus, LinqDeliveryStatusEvent, LinqDeliveryStatusListener, LinqCredentialProvider, LinqCredentials, LinqSendOptions, LinqWebhookVerifier, } from "@linqapp/chat-sdk-adapter"; ++export type { DecoratedText } from "@linqapp/chat-sdk-adapter"; + //# sourceMappingURL=index.d.ts.map +\ No newline at end of file +diff --git a/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js b/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js +index fadd83c2295c6960c7face6c6ca06bf7ac0f157a..417b775c218d4d5833ace795efc929b456303069 100644 +--- a/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js ++++ b/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js +@@ -5,4 +5,4 @@ import{t as e}from"../../_chunks/node/rolldown-runtime-tZXQYakl.js";import{B as + `);case`link`:return Bt(e.label,e.url);case`divider`:return`———`;case`image`:return Pt(e.url)?null:Bt(e.alt,e.url);case`table`:return s(e.headers,e.rows);case`section`:{let t=e.children.map(e=>Rt(e)).filter(e=>!!e);return t.length>0?t.join(` + `):null}case`actions`:return zt(e);default:return null}}function zt(e){let t=[],n=[];for(let r of e.children)switch(r.type){case`button`:n.push(r.label);break;case`link-button`:{let e=Bt(r.label,r.url);e&&t.push(e);break}case`select`:case`radio_select`:{let e=r.options.map(e=>e.label).join(`, `);t.push(e?`${r.label}: ${e}`:r.label);break}}return n.length>0&&t.unshift(`Options: ${n.join(`, `)}`),t.length>0?t.join(` + `):null}function Bt(e,t){return e&&e!==t?`${e}: ${t}`:t}function Vt(e){return Ht(e.children)}function Ht(e){return e.some(e=>e.type===`section`?Ht(e.children):e.type===`actions`&&e.children.some(e=>e.type===`button`||e.type===`select`||e.type===`radio_select`))}const Ut={strong:`bold`,emphasis:`italic`,delete:`strikethrough`};function Wt(e){let t=[],n=[],r=0,i=e=>{typeof e==`string`&&e&&(t.push(e),r+=e.length)},a=e=>{if(Array.isArray(e)){o(e);return}if(!e||typeof e!=`object`)return;let t=e,s=typeof t.type==`string`?Ut[t.type]:void 0,c=r;`value`in t?i(t.value):t.alt?i(t.alt):`children`in t&&a(t.children),s&&r>c&&n.push({range:[c,r],style:s})},o=e=>{for(let t of e)a(t)};return a(e),{value:t.join(``),decorations:n}}function Gt({value:e,decorations:t}){let n=e.length-e.trimStart().length,r=e.trim();if(!n&&r.length===e.length)return{value:r,decorations:t};let i=[];for(let e of t){let[t,a]=e.range,o=Math.min(Math.max((t??0)-n,0),r.length),s=Math.min(Math.max((a??0)-n,0),r.length);s>o&&i.push({...e,range:[o,s]})}return{value:r,decorations:i}}function Kt(e){for(let[t,n]of e.entries())if(n.animation){for(let[r,i]of e.entries())if(t!==r&&qt(n.range,i.range))throw Error(`Linq text animation range [${String(n.range)}] overlaps another decoration at [${String(i.range)}] — animations cannot overlap other decorations.`)}}function qt(e,t){return(e[0]??0)<(t[1]??0)&&(t[0]??0)<(e[1]??0)}var Jt=class extends u{toAst(e){return r(e)}fromAst(e){return a(e)}renderDecoratedPostable(e){if(e&&typeof e==`object`){if(`markdown`in e)return Wt(r(e.markdown));if(`ast`in e)return Wt(e.ast)}return{value:this.renderPostable(e),decorations:[]}}cardToFallbackText(e){return Lt(e)}};function Yt(e,t){let n=Qt(e),i=n.parts.flatMap(e=>e.type===`media`?[on(e)]:[]),a=rn(n.parts,i),s=an(n.parts),c=n.isMe,l=n.sender?.id||n.sender?.handle||`unknown`,u=n.sender?.handle||n.sender?.id||`unknown`;return new o({id:n.id,threadId:t({chatId:n.chatId,isGroup:n.isGroup}),text:a,formatted:r(a),raw:e,author:{userId:l,userName:u,fullName:u,isBot:c,isMe:c},metadata:{dateSent:nn(n.sentAt),edited:n.edited,editedAt:n.editedAt?nn(n.editedAt):void 0},attachments:i,links:s})}function Xt(e){return e.event_type===`message.received`}function Zt(e){return e.event_type===`reaction.added`||e.event_type===`reaction.removed`}function Qt(e){if($t(e))return{id:e.id,chatId:e.chat.id,isGroup:e.chat.is_group??void 0,parts:e.parts,isMe:e.direction===`outbound`||e.sender_handle.is_me===!0,sender:e.sender_handle,sentAt:e.sent_at,edited:!1};if(en(e))return{id:e.message.id,chatId:e.chat_id,isGroup:void 0,parts:e.message.parts,isMe:!0,sender:e.message.from_handle,sentAt:e.message.sent_at||e.message.created_at,edited:!1};if(tn(e)){let t=e.updated_at!==e.created_at;return{id:e.id,chatId:e.chat_id,isGroup:void 0,parts:e.parts??[],isMe:e.is_from_me||e.from_handle?.is_me===!0,sender:e.from_handle,sentAt:e.sent_at||e.created_at,edited:t,editedAt:t?e.updated_at:void 0}}throw new n(`parseMessage only supports Linq message payloads`)}function $t(e){return $(e)&&`chat`in e&&`direction`in e&&`sender_handle`in e}function en(e){return $(e)&&`chat_id`in e&&`message`in e&&$(e.message)}function tn(e){return $(e)&&`chat_id`in e&&`is_from_me`in e&&`created_at`in e}function nn(e){if(e){let t=new Date(e);if(!Number.isNaN(t.getTime()))return t}return new Date}function rn(e,t){let n=e.flatMap(e=>(e.type===`text`||e.type===`link`)&&typeof e.value==`string`?[e.value]:[]),r=t.map(e=>{let t=e.name||e.mimeType||e.type;return`[${e.type} attachment: ${t}]`});return[...n,...r].join(` +-`).trim()}function an(e){let t=new Set;for(let n of e){if(n.type===`link`){t.add(n.value);continue}if(n.type===`text`)for(let e of cn(n.value))t.add(e)}return[...t].map(e=>({url:e}))}function on(e){return{type:sn(e.mime_type),url:e.url,name:e.filename,mimeType:e.mime_type,size:e.size_bytes,width:e.width??e.width_px,height:e.height??e.height_px,fetchMetadata:{url:e.url},fetchData:async()=>{let t=await fetch(e.url);if(!t.ok)throw Error(`Failed to fetch Linq attachment ${e.id||e.url}: ${t.status}`);return Buffer.from(await t.arrayBuffer())}}}function sn(e){return e.startsWith(`image/`)?`image`:e.startsWith(`video/`)?`video`:e.startsWith(`audio/`)?`audio`:`file`}function cn(e){return(e.match(/https?:\/\/[^\s<>()]+/gi)??[]).map(e=>e.replace(/[.,!?;:]+$/g,``))}const ln={jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,gif:`image/gif`,heic:`image/heic`,heif:`image/heif`,bmp:`image/bmp`,tif:`image/tiff`,tiff:`image/tiff`,webp:`image/webp`,mp4:`video/mp4`,mov:`video/quicktime`,m4v:`video/x-m4v`,"3gp":`video/3gpp`,m4a:`audio/x-m4a`,mp3:`audio/mpeg`,aac:`audio/aac`,wav:`audio/x-wav`,aiff:`audio/x-aiff`,caf:`audio/x-caf`,amr:`audio/amr`,pdf:`application/pdf`,txt:`text/plain`,csv:`text/csv`,rtf:`text/rtf`,vcf:`text/vcard`,ics:`text/calendar`,html:`text/html`,htm:`text/html`,json:`application/json`,zip:`application/zip`,doc:`application/msword`,docx:`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,xls:`application/vnd.ms-excel`,xlsx:`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,ppt:`application/vnd.ms-powerpoint`,pptx:`application/vnd.openxmlformats-officedocument.presentationml.presentation`};function un(e){return typeof e==`string`||!$(e)?{attachments:[],files:[]}:{attachments:Array.isArray(e.attachments)?e.attachments:[],files:Array.isArray(e.files)?e.files:[]}}async function dn(e,t){let{attachments:n,files:r}=un(t);if(n.length===0&&r.length===0)return[];let i=[];for(let t of n)i.push(await fn(e,t));for(let t of r)i.push(await pn(e,t));return i}async function fn(e,t){if(t.url&&t.url.startsWith(`https://`)&&!_n(t.size))return{type:`media`,url:t.url};let n=await hn(t),r=t.name??bn(t.mimeType);return{type:`media`,attachment_id:await mn(e,n,r,vn(t.mimeType,r))}}async function pn(e,t){let n=await gn(t.data),r=vn(t.mimeType,t.filename);return{type:`media`,attachment_id:await mn(e,n,t.filename,r)}}async function mn(e,t,n,r){let i=await e.attachments.create({filename:n,content_type:r,size_bytes:t.byteLength}),a=await fetch(i.upload_url,{method:i.http_method,headers:i.required_headers,body:t});if(!a.ok)throw Error(`Failed to upload Linq attachment ${n}: ${a.status} ${a.statusText}`);return i.attachment_id}async function hn(e){if(e.data!=null)return gn(e.data);if(typeof e.fetchData==`function`)return gn(await e.fetchData());if(e.url){let t=await fetch(e.url);if(!t.ok)throw Error(`Failed to download Linq attachment ${e.name??e.url}: ${t.status}`);return new Uint8Array(await t.arrayBuffer())}throw Error(`Outbound attachment ${e.name??`(unnamed)`} has no data, fetchData, or url to send`)}async function gn(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return new Uint8Array(e);if(typeof Blob<`u`&&e instanceof Blob)return new Uint8Array(await e.arrayBuffer());throw Error(`Unsupported attachment data type; expected Buffer, Blob, or ArrayBuffer`)}function _n(e){return typeof e==`number`&&e>10485760}function vn(e,t){if(e&&e.trim())return yn(e.trim());let n=t.split(`.`).pop()?.toLowerCase(),r=n?ln[n]:void 0;if(r)return r;throw Error(`Cannot determine content type for attachment "${t}"; set mimeType on the attachment`)}function yn(e){let t=e.toLowerCase();return t===`image/jpg`?`image/jpeg`:t}function bn(e){let t=e?xn(e):void 0;return t?`attachment.${t}`:`attachment`}function xn(e){let t=yn(e);for(let[e,n]of Object.entries(ln))if(n===t)return e}const Sn={like:`thumbs_up`,dislike:`thumbs_down`,love:`heart`,laugh:`laugh`,emphasize:`exclamation`,question:`question`};function Cn(e){if(e.reaction_type===`custom`)return e.custom_emoji?{emoji:t.fromGChat(e.custom_emoji),rawEmoji:e.custom_emoji}:null;let n=Sn[e.reaction_type];return n?{emoji:i(n),rawEmoji:e.reaction_type}:null}function wn(e){let n=typeof e==`string`?e:e.name,r=n.trim().replace(/^\{\{emoji:/,``).replace(/\}\}$/,``).replace(/^:+|:+$/g,``).toLowerCase();return[`thumbs_up`,`thumbsup`,`+1`,`like`,`👍`].includes(r)?{type:`like`}:[`thumbs_down`,`thumbsdown`,`-1`,`dislike`,`👎`].includes(r)?{type:`dislike`}:[`heart`,`love`,`❤️`,`❤`].includes(r)?{type:`love`}:[`laugh`,`joy`,`rofl`,`😂`,`🤣`].includes(r)?{type:`laugh`}:[`exclamation`,`emphasize`,`!!`,`!`,`‼️`,`‼`,`❗`].includes(r)?{type:`emphasize`}:[`question`,`?`,`❓`].includes(r)?{type:`question`}:{type:`custom`,custom_emoji:t.toDiscord(n)}}async function Tn(e,t){if(!t)return{ok:!1,response:new Response(`Linq webhook signing secret is not configured`,{status:503})};let n=await e.text();try{new kt.Webhook(t).verify(n,Object.fromEntries(e.headers))}catch{return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}try{return{ok:!0,event:JSON.parse(n)}}catch{return{ok:!1,response:new Response(`Invalid JSON`,{status:400})}}}const En={"message.sent":`sent`,"message.delivered":`delivered`,"message.read":`read`,"message.failed":`failed`};var Dn=class{name=`linq`;userName=`linq`;apiClient;baseURL;converter=new Jt;credentials;signingSecret;webhookVerifier;chat=null;logger;chatKinds=new Map;deliveryStatusListeners=new Set;constructor(e){if(!e.credentials&&!e.apiKey)throw Error(`Linq requires apiKey or a credentials provider.`);if(!e.webhookVerifier&&!e.credentials&&!e.signingSecret)throw Error(`Linq requires signingSecret or a webhookVerifier.`);this.apiClient=e.apiKey?new Q({apiKey:e.apiKey,baseURL:e.baseURL}):null,this.baseURL=e.baseURL,this.credentials=e.credentials,this.signingSecret=e.signingSecret,this.webhookVerifier=e.webhookVerifier,this.logger=new d}async getApiClient(){if(this.apiClient)return this.apiClient;let e=await this.credentials?.();if(!e?.apiKey)throw Error(`Linq credentials did not provide an API key.`);return new Q({apiKey:e.apiKey,baseURL:this.baseURL})}async getSigningSecret(){if(this.signingSecret)return this.signingSecret;let e=await this.credentials?.();if(!e?.signingSecret)throw Error(`Linq credentials did not provide a webhook signing secret.`);return e.signingSecret}async initialize(e){this.chat=e,this.logger=e.getLogger(`linq`)}encodeThreadId(e){return e.pendingHandle?`linq:pending:${e.pendingHandle}`:(e.isGroup!==void 0&&this.chatKinds.set(e.chatId,e.isGroup),`linq:${e.chatId}`)}decodeThreadId(e){let[t,n,r]=e.split(`:`);if(t!==`linq`||!n)throw Error(`Invalid Linq thread ID: ${e}`);if(n===`pending`){let t=e.slice(13);if(!t)throw Error(`Invalid Linq thread ID: ${e}`);return{chatId:``,pendingHandle:t,isGroup:!1}}if(r===`group`||r===`dm`){let e=r===`group`;return this.chatKinds.set(n,e),{chatId:n,isGroup:e}}if(r!==void 0)throw Error(`Invalid Linq thread ID: ${e}`);return{chatId:n,isGroup:this.chatKinds.get(n)}}async fetchMessages(e,t){let n=this.requireChatId(e),r=await(await this.getApiClient()).chats.messages.list(n,{cursor:t?.cursor,limit:t?.limit});return{messages:r.messages.map(e=>this.parseMessage(e)).sort(function(e,t){return e.metadata.dateSent.getTime()-t.metadata.dateSent.getTime()}),nextCursor:r.next_cursor||void 0}}async fetchMessage(e,t){try{let e=await(await this.getApiClient()).messages.retrieve(t);return this.parseMessage(e)}catch(e){if($(e)&&e.status===404)return null;throw e}}async postMessage(e,t,n={}){let{chatId:r,pendingHandle:i}=this.decodeThreadId(e),{value:a,decorations:o}=Gt(this.converter.renderDecoratedPostable(t)),s=await dn(await this.getApiClient(),t),c=[];if(a){let e=[...o,...n.textDecorations??[]];Kt(e),c.push(e.length?{type:`text`,value:a,text_decorations:e}:{type:`text`,value:a})}let l=Nt(t);if(l){Vt(l)&&this.logger.warn(`Card buttons/selects were flattened to text — onAction() handlers never fire over iMessage/SMS. Use LinkButton/CardLink URLs or handle plain-text replies instead.`);for(let e of Ft(l))c.push({type:`media`,url:e})}if(c.push(...s),c.length===0)throw Error(`Linq message must include text or media.`);let u=await this.getApiClient(),d=n.idempotencyKey?{idempotency_key:n.idempotencyKey}:{};if(i){let e=await u.messages.create({to:[i],message:{parts:c,...d}});return{id:e.message.id,threadId:this.encodeThreadId({chatId:e.chat_id}),raw:e}}let f=await u.chats.messages.send(r,{message:{parts:c,...d}});return{id:f.message.id,threadId:this.encodeThreadId({chatId:f.chat_id||r}),raw:f}}requireChatId(e){let{chatId:t,pendingHandle:n}=this.decodeThreadId(e);if(n)throw Error(`Linq thread ${e} has no chat yet — send a message first to create it.`);return t}async openDM(e){let t=e.trim();if(!t)throw Error(`Linq openDM requires a handle.`);return this.encodeThreadId({chatId:``,pendingHandle:t})}async editMessage(e,t,n){let r=this.requireChatId(e),i=this.converter.renderPostable(n).trim();if(!i)throw Error(`Linq message text cannot be empty.`);let a=await(await this.getApiClient()).messages.update(t,{text:i,part_index:0});return{id:a.id,threadId:this.encodeThreadId({chatId:a.chat_id||r}),raw:a}}deleteMessage(e,t){throw new n(`deleteMessage is not implemented`)}async addReaction(e,t,n){await(await this.getApiClient()).messages.addReaction(t,{operation:`add`,...wn(n)})}async removeReaction(e,t,n){await(await this.getApiClient()).messages.addReaction(t,{operation:`remove`,...wn(n)})}async fetchThread(e){let t=this.requireChatId(e),n=await(await this.getApiClient()).chats.retrieve(t);return{id:this.encodeThreadId({chatId:n.id,isGroup:n.is_group}),channelId:this.encodeThreadId({chatId:n.id,isGroup:n.is_group}),channelName:n.display_name??void 0,isDM:!n.is_group,metadata:{chat:n}}}async startTyping(e,t){let n=this.requireChatId(e),{isGroup:r}=this.decodeThreadId(e);if(r!==!0)try{await(await this.getApiClient()).chats.typing.start(n)}catch(e){if($(e)&&e.status===403)return;throw e}}async markRead(e,t){let{chatId:n}=this.decodeThreadId(e);await(await this.getApiClient()).chats.markAsRead(n)}async stream(e,t){let n=``;for await(let e of t){if(typeof e==`string`){n+=e;continue}e.type===`markdown_text`&&(n+=e.text)}return this.postMessage(e,n.trim()?{markdown:n}:` `)}async handleWebhook(e,t){let n=this.webhookVerifier?await this.verifyTrustedWebhook(e):await Tn(e,await this.getSigningSecret());if(!n.ok)return n.response;let{event:r}=n;if(this.chat&&Xt(r)&&r.data.direction===`inbound`){let e=r.data.chat.id,n=r.data.chat.is_group??void 0;if(n===void 0&&!this.chatKinds.has(e))try{let t=await(await this.getApiClient()).chats.retrieve(e);this.chatKinds.set(e,t.is_group)}catch(t){this.logger.warn(`Failed to resolve Linq chat kind for ${e}`,{error:t})}let i=this.encodeThreadId({chatId:e,isGroup:n});this.chat.processMessage(this,i,async()=>this.parseMessage(r.data),t)}else if(this.chat&&Zt(r))this.processReactionWebhook(this.chat,r,t);else{let e=En[r.event_type];e&&this.processDeliveryStatusWebhook(r,e)}return new Response(`OK`,{status:200})}async verifyTrustedWebhook(e){let t=new Uint8Array(await e.arrayBuffer());try{if(await this.webhookVerifier?.(e,t)===!1)return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}catch{return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}try{return{ok:!0,event:JSON.parse(new TextDecoder().decode(t))}}catch{return{ok:!1,response:new Response(`Invalid JSON`,{status:400})}}}onDeliveryStatus(e){return this.deliveryStatusListeners.add(e),()=>{this.deliveryStatusListeners.delete(e)}}emitDeliveryStatus(e){for(let t of this.deliveryStatusListeners)try{t(e)}catch(e){this.logger.warn(`Linq delivery-status listener threw`,{error:e})}}processDeliveryStatusWebhook(e,t){if(this.deliveryStatusListeners.size===0)return;let n=e.data,r=n.chat?.id,i=n.id;if(!r||!i){this.logger.debug(`Ignoring Linq ${e.event_type} webhook without chat/message ID`);return}let a={status:t,threadId:this.encodeThreadId({chatId:r}),messageId:i,raw:e,...n.error?{error:n.error}:{}};this.emitDeliveryStatus(a)}processReactionWebhook(e,t,n){let{chat_id:r,message_id:i}=t.data;if(!r||!i){this.logger.debug(`Ignoring Linq ${t.event_type} webhook without chat/message ID`);return}let a=Cn(t.data);if(!a){this.logger.debug(`Ignoring Linq ${t.event_type} webhook with unsupported reaction type ${t.data.reaction_type}`);return}let o=t.data.from_handle,s=t.data.is_from_me||o?.is_me===!0,c=o?.id||o?.handle||t.data.from||`unknown`,l=o?.handle||t.data.from||c;e.processReaction({adapter:this,added:t.event_type===`reaction.added`,emoji:a.emoji,rawEmoji:a.rawEmoji,messageId:i,threadId:this.encodeThreadId({chatId:r}),raw:t,user:{userId:c,userName:l,fullName:l,isBot:s,isMe:s}},n)}parseMessage(e){return Yt(e,e=>this.encodeThreadId(e))}rehydrateAttachment(e){let t=e.fetchMetadata?.url??e.url;return t?{...e,fetchData:async()=>{let e=await fetch(t);if(!e.ok)throw Error(`Failed to fetch Linq attachment ${t}: ${e.status}`);return Buffer.from(await e.arrayBuffer())}}:e}renderFormatted(e){return c(e).trim()}channelIdFromThreadId(e){return e}isDM(e){return this.decodeThreadId(e).isGroup===!1}};function On(e){return new Dn(e)}export{On as createLinqAdapter}; +\ No newline at end of file ++`).trim()}function an(e){let t=new Set;for(let n of e){if(n.type===`link`){t.add(n.value);continue}if(n.type===`text`)for(let e of cn(n.value))t.add(e)}return[...t].map(e=>({url:e}))}function on(e){return{type:sn(e.mime_type),url:e.url,name:e.filename,mimeType:e.mime_type,size:e.size_bytes,width:e.width??e.width_px,height:e.height??e.height_px,fetchMetadata:{url:e.url},fetchData:async()=>{let t=await fetch(e.url);if(!t.ok)throw Error(`Failed to fetch Linq attachment ${e.id||e.url}: ${t.status}`);return Buffer.from(await t.arrayBuffer())}}}function sn(e){return e.startsWith(`image/`)?`image`:e.startsWith(`video/`)?`video`:e.startsWith(`audio/`)?`audio`:`file`}function cn(e){return(e.match(/https?:\/\/[^\s<>()]+/gi)??[]).map(e=>e.replace(/[.,!?;:]+$/g,``))}const ln={jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,gif:`image/gif`,heic:`image/heic`,heif:`image/heif`,bmp:`image/bmp`,tif:`image/tiff`,tiff:`image/tiff`,webp:`image/webp`,mp4:`video/mp4`,mov:`video/quicktime`,m4v:`video/x-m4v`,"3gp":`video/3gpp`,m4a:`audio/x-m4a`,mp3:`audio/mpeg`,aac:`audio/aac`,wav:`audio/x-wav`,aiff:`audio/x-aiff`,caf:`audio/x-caf`,amr:`audio/amr`,pdf:`application/pdf`,txt:`text/plain`,csv:`text/csv`,rtf:`text/rtf`,vcf:`text/vcard`,ics:`text/calendar`,html:`text/html`,htm:`text/html`,json:`application/json`,zip:`application/zip`,doc:`application/msword`,docx:`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,xls:`application/vnd.ms-excel`,xlsx:`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,ppt:`application/vnd.ms-powerpoint`,pptx:`application/vnd.openxmlformats-officedocument.presentationml.presentation`};function un(e){return typeof e==`string`||!$(e)?{attachments:[],files:[]}:{attachments:Array.isArray(e.attachments)?e.attachments:[],files:Array.isArray(e.files)?e.files:[]}}async function dn(e,t){let{attachments:n,files:r}=un(t);if(n.length===0&&r.length===0)return[];let i=[];for(let t of n)i.push(await fn(e,t));for(let t of r)i.push(await pn(e,t));return i}async function fn(e,t){if(t.url&&t.url.startsWith(`https://`)&&!_n(t.size))return{type:`media`,url:t.url};let n=await hn(t),r=t.name??bn(t.mimeType);return{type:`media`,attachment_id:await mn(e,n,r,vn(t.mimeType,r))}}async function pn(e,t){let n=await gn(t.data),r=vn(t.mimeType,t.filename);return{type:`media`,attachment_id:await mn(e,n,t.filename,r)}}async function mn(e,t,n,r){let i=await e.attachments.create({filename:n,content_type:r,size_bytes:t.byteLength}),a=await fetch(i.upload_url,{method:i.http_method,headers:i.required_headers,body:t});if(!a.ok)throw Error(`Failed to upload Linq attachment ${n}: ${a.status} ${a.statusText}`);return i.attachment_id}async function hn(e){if(e.data!=null)return gn(e.data);if(typeof e.fetchData==`function`)return gn(await e.fetchData());if(e.url){let t=await fetch(e.url);if(!t.ok)throw Error(`Failed to download Linq attachment ${e.name??e.url}: ${t.status}`);return new Uint8Array(await t.arrayBuffer())}throw Error(`Outbound attachment ${e.name??`(unnamed)`} has no data, fetchData, or url to send`)}async function gn(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return new Uint8Array(e);if(typeof Blob<`u`&&e instanceof Blob)return new Uint8Array(await e.arrayBuffer());throw Error(`Unsupported attachment data type; expected Buffer, Blob, or ArrayBuffer`)}function _n(e){return typeof e==`number`&&e>10485760}function vn(e,t){if(e&&e.trim())return yn(e.trim());let n=t.split(`.`).pop()?.toLowerCase(),r=n?ln[n]:void 0;if(r)return r;throw Error(`Cannot determine content type for attachment "${t}"; set mimeType on the attachment`)}function yn(e){let t=e.toLowerCase();return t===`image/jpg`?`image/jpeg`:t}function bn(e){let t=e?xn(e):void 0;return t?`attachment.${t}`:`attachment`}function xn(e){let t=yn(e);for(let[e,n]of Object.entries(ln))if(n===t)return e}const Sn={like:`thumbs_up`,dislike:`thumbs_down`,love:`heart`,laugh:`laugh`,emphasize:`exclamation`,question:`question`};function Cn(e){if(e.reaction_type===`custom`)return e.custom_emoji?{emoji:t.fromGChat(e.custom_emoji),rawEmoji:e.custom_emoji}:null;let n=Sn[e.reaction_type];return n?{emoji:i(n),rawEmoji:e.reaction_type}:null}function wn(e){let n=typeof e==`string`?e:e.name,r=n.trim().replace(/^\{\{emoji:/,``).replace(/\}\}$/,``).replace(/^:+|:+$/g,``).toLowerCase();return[`thumbs_up`,`thumbsup`,`+1`,`like`,`👍`].includes(r)?{type:`like`}:[`thumbs_down`,`thumbsdown`,`-1`,`dislike`,`👎`].includes(r)?{type:`dislike`}:[`heart`,`love`,`❤️`,`❤`].includes(r)?{type:`love`}:[`laugh`,`joy`,`rofl`,`😂`,`🤣`].includes(r)?{type:`laugh`}:[`exclamation`,`emphasize`,`!!`,`!`,`‼️`,`‼`,`❗`].includes(r)?{type:`emphasize`}:[`question`,`?`,`❓`].includes(r)?{type:`question`}:{type:`custom`,custom_emoji:t.toDiscord(n)}}async function Tn(e,t){if(!t)return{ok:!1,response:new Response(`Linq webhook signing secret is not configured`,{status:503})};let n=await e.text();try{new kt.Webhook(t).verify(n,Object.fromEntries(e.headers))}catch{return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}try{return{ok:!0,event:JSON.parse(n)}}catch{return{ok:!1,response:new Response(`Invalid JSON`,{status:400})}}}const En={"message.sent":`sent`,"message.delivered":`delivered`,"message.read":`read`,"message.failed":`failed`};var Dn=class{name=`linq`;userName=`linq`;apiClient;baseURL;converter=new Jt;credentials;signingSecret;webhookVerifier;chat=null;logger;chatKinds=new Map;deliveryStatusListeners=new Set;constructor(e){if(!e.credentials&&!e.apiKey)throw Error(`Linq requires apiKey or a credentials provider.`);if(!e.webhookVerifier&&!e.credentials&&!e.signingSecret)throw Error(`Linq requires signingSecret or a webhookVerifier.`);this.apiClient=e.apiKey?new Q({apiKey:e.apiKey,baseURL:e.baseURL}):null,this.baseURL=e.baseURL,this.credentials=e.credentials,this.signingSecret=e.signingSecret,this.webhookVerifier=e.webhookVerifier,this.logger=new d}async getApiClient(){if(this.apiClient)return this.apiClient;let e=await this.credentials?.();if(!e?.apiKey)throw Error(`Linq credentials did not provide an API key.`);return new Q({apiKey:e.apiKey,baseURL:this.baseURL})}async getSigningSecret(){if(this.signingSecret)return this.signingSecret;let e=await this.credentials?.();if(!e?.signingSecret)throw Error(`Linq credentials did not provide a webhook signing secret.`);return e.signingSecret}async initialize(e){this.chat=e,this.logger=e.getLogger(`linq`)}encodeThreadId(e){return e.pendingHandle?`linq:pending:${e.pendingHandle}`:(e.isGroup!==void 0&&this.chatKinds.set(e.chatId,e.isGroup),`linq:${e.chatId}`)}decodeThreadId(e){let[t,n,r]=e.split(`:`);if(t!==`linq`||!n)throw Error(`Invalid Linq thread ID: ${e}`);if(n===`pending`){let t=e.slice(13);if(!t)throw Error(`Invalid Linq thread ID: ${e}`);return{chatId:``,pendingHandle:t,isGroup:!1}}if(r===`group`||r===`dm`){let e=r===`group`;return this.chatKinds.set(n,e),{chatId:n,isGroup:e}}if(r!==void 0)throw Error(`Invalid Linq thread ID: ${e}`);return{chatId:n,isGroup:this.chatKinds.get(n)}}async fetchMessages(e,t){let n=this.requireChatId(e),r=await(await this.getApiClient()).chats.messages.list(n,{cursor:t?.cursor,limit:t?.limit});return{messages:r.messages.map(e=>this.parseMessage(e)).sort(function(e,t){return e.metadata.dateSent.getTime()-t.metadata.dateSent.getTime()}),nextCursor:r.next_cursor||void 0}}async fetchMessage(e,t){try{let e=await(await this.getApiClient()).messages.retrieve(t);return this.parseMessage(e)}catch(e){if($(e)&&e.status===404)return null;throw e}}async postMessage(e,t,n={}){let{chatId:r,pendingHandle:i}=this.decodeThreadId(e),{value:a,decorations:o}=Gt(this.converter.renderDecoratedPostable(t)),s=await dn(await this.getApiClient(),t),c=[];if(a){let e=[...o,...n.textDecorations??[]];Kt(e),c.push(e.length?{type:`text`,value:a,text_decorations:e}:{type:`text`,value:a})}let l=Nt(t);if(l){Vt(l)&&this.logger.warn(`Card buttons/selects were flattened to text — onAction() handlers never fire over iMessage/SMS. Use LinkButton/CardLink URLs or handle plain-text replies instead.`);for(let e of Ft(l))c.push({type:`media`,url:e})}if(c.push(...s),c.length===0)throw Error(`Linq message must include text or media.`);let u=await this.getApiClient(),d={...n.idempotencyKey?{idempotency_key:n.idempotencyKey}:{},...n.replyToMessageId?{reply_to:{message_id:n.replyToMessageId}}:{}};if(i){let e=await u.messages.create({to:[i],message:{parts:c,...d}});return{id:e.message.id,threadId:this.encodeThreadId({chatId:e.chat_id}),raw:e}}let f=await u.chats.messages.send(r,{message:{parts:c,...d}});return{id:f.message.id,threadId:this.encodeThreadId({chatId:f.chat_id||r}),raw:f}}requireChatId(e){let{chatId:t,pendingHandle:n}=this.decodeThreadId(e);if(n)throw Error(`Linq thread ${e} has no chat yet — send a message first to create it.`);return t}async openDM(e){let t=e.trim();if(!t)throw Error(`Linq openDM requires a handle.`);return this.encodeThreadId({chatId:``,pendingHandle:t})}async editMessage(e,t,n){let r=this.requireChatId(e),i=this.converter.renderPostable(n).trim();if(!i)throw Error(`Linq message text cannot be empty.`);let a=await(await this.getApiClient()).messages.update(t,{text:i,part_index:0});return{id:a.id,threadId:this.encodeThreadId({chatId:a.chat_id||r}),raw:a}}deleteMessage(e,t){throw new n(`deleteMessage is not implemented`)}async addReaction(e,t,n){await(await this.getApiClient()).messages.addReaction(t,{operation:`add`,...wn(n)})}async removeReaction(e,t,n){await(await this.getApiClient()).messages.addReaction(t,{operation:`remove`,...wn(n)})}async fetchThread(e){let t=this.requireChatId(e),n=await(await this.getApiClient()).chats.retrieve(t);return{id:this.encodeThreadId({chatId:n.id,isGroup:n.is_group}),channelId:this.encodeThreadId({chatId:n.id,isGroup:n.is_group}),channelName:n.display_name??void 0,isDM:!n.is_group,metadata:{chat:n}}}async startTyping(e,t){let n=this.requireChatId(e),{isGroup:r}=this.decodeThreadId(e);if(r!==!0)try{await(await this.getApiClient()).chats.typing.start(n)}catch(e){if($(e)&&e.status===403)return;throw e}}async markRead(e,t){let{chatId:n}=this.decodeThreadId(e);await(await this.getApiClient()).chats.markAsRead(n)}async stream(e,t){let n=``;for await(let e of t){if(typeof e==`string`){n+=e;continue}e.type===`markdown_text`&&(n+=e.text)}return this.postMessage(e,n.trim()?{markdown:n}:` `)}async handleWebhook(e,t){let n=this.webhookVerifier?await this.verifyTrustedWebhook(e):await Tn(e,await this.getSigningSecret());if(!n.ok)return n.response;let{event:r}=n;if(this.chat&&Xt(r)&&r.data.direction===`inbound`){let e=r.data.chat.id,n=r.data.chat.is_group??void 0;if(n===void 0&&!this.chatKinds.has(e))try{let t=await(await this.getApiClient()).chats.retrieve(e);this.chatKinds.set(e,t.is_group)}catch(t){this.logger.warn(`Failed to resolve Linq chat kind for ${e}`,{error:t})}let i=this.encodeThreadId({chatId:e,isGroup:n});this.chat.processMessage(this,i,async()=>this.parseMessage(r.data),t)}else if(this.chat&&Zt(r))this.processReactionWebhook(this.chat,r,t);else{let e=En[r.event_type];e&&this.processDeliveryStatusWebhook(r,e)}return new Response(`OK`,{status:200})}async verifyTrustedWebhook(e){let t=new Uint8Array(await e.arrayBuffer());try{if(await this.webhookVerifier?.(e,t)===!1)return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}catch{return{ok:!1,response:new Response(`Invalid Linq webhook`,{status:401})}}try{return{ok:!0,event:JSON.parse(new TextDecoder().decode(t))}}catch{return{ok:!1,response:new Response(`Invalid JSON`,{status:400})}}}onDeliveryStatus(e){return this.deliveryStatusListeners.add(e),()=>{this.deliveryStatusListeners.delete(e)}}emitDeliveryStatus(e){for(let t of this.deliveryStatusListeners)try{t(e)}catch(e){this.logger.warn(`Linq delivery-status listener threw`,{error:e})}}processDeliveryStatusWebhook(e,t){if(this.deliveryStatusListeners.size===0)return;let n=e.data,r=n.chat?.id,i=n.id;if(!r||!i){this.logger.debug(`Ignoring Linq ${e.event_type} webhook without chat/message ID`);return}let a={status:t,threadId:this.encodeThreadId({chatId:r}),messageId:i,raw:e,...n.error?{error:n.error}:{}};this.emitDeliveryStatus(a)}processReactionWebhook(e,t,n){let{chat_id:r,message_id:i}=t.data;if(!r||!i){this.logger.debug(`Ignoring Linq ${t.event_type} webhook without chat/message ID`);return}let a=Cn(t.data);if(!a){this.logger.debug(`Ignoring Linq ${t.event_type} webhook with unsupported reaction type ${t.data.reaction_type}`);return}let o=t.data.from_handle,s=t.data.is_from_me||o?.is_me===!0,c=o?.id||o?.handle||t.data.from||`unknown`,l=o?.handle||t.data.from||c;e.processReaction({adapter:this,added:t.event_type===`reaction.added`,emoji:a.emoji,rawEmoji:a.rawEmoji,messageId:i,threadId:this.encodeThreadId({chatId:r}),raw:t,user:{userId:c,userName:l,fullName:l,isBot:s,isMe:s}},n)}parseMessage(e){return Yt(e,e=>this.encodeThreadId(e))}rehydrateAttachment(e){let t=e.fetchMetadata?.url??e.url;return t?{...e,fetchData:async()=>{let e=await fetch(t);if(!e.ok)throw Error(`Failed to fetch Linq attachment ${t}: ${e.status}`);return Buffer.from(await e.arrayBuffer())}}:e}renderFormatted(e){return c(e).trim()}channelIdFromThreadId(e){return e}isDM(e){return this.decodeThreadId(e).isGroup===!1}};function On(e){return new Dn(e)}export{On as createLinqAdapter}; +\ No newline at end of file +diff --git a/dist/src/compiled/chat/index.d.ts b/dist/src/compiled/chat/index.d.ts +index f01145b7cd5942afe13e8d40f0005eb37c08dff0..0d55dfd816e3191d54e58affbb392b4764c57469 100644 +--- a/dist/src/compiled/chat/index.d.ts ++++ b/dist/src/compiled/chat/index.d.ts +@@ -1,5 +1,5 @@ +-import { P as PostableObject, h as Adapter, i as PostableObjectContext, S as StreamChunk, j as ThreadHistoryCache, k as ThreadHistoryConfig, l as StreamEvent, E as EmojiFormats, m as EmojiMapConfig, n as EmojiValue, W as WellKnownEmoji, o as CustomEmojiMap, p as AdapterPostableMessage } from './messages-BSoJG691.js'; +-export { q as ActionEvent, r as ActionHandler, A as AiAssistantMessage, b as AiFilePart, c as AiImagePart, d as AiMessage, e as AiMessagePart, f as AiTextPart, g as AiUserMessage, s as AppContextCanvasEntity, u as AppContextChangedEvent, v as AppContextChangedHandler, w as AppContextChannelEntity, x as AppContextEntity, y as AppContextEntityBase, z as AppContextListEntity, B as AppContextMessageEntity, D as AppContextUnknownEntity, F as AppHomeOpenedEvent, G as AppHomeOpenedHandler, H as AppendInput, I as AppendOptions, J as AssistantContextChangedEvent, K as AssistantContextChangedHandler, L as AssistantThreadStartedEvent, N as AssistantThreadStartedHandler, O as Attachment, Q as Author, R as Channel, U as ChannelImpl, V as ChannelInfo, a as ChannelVisibility, C as Chat, X as ChatConfig, Y as ChatInstance, Z as ConcurrencyConfig, _ as ConcurrencyStrategy, $ as ConsoleLogger, a0 as CountQuery, a1 as DeleteTarget, a2 as DirectMessageHandler, a3 as DurationString, a4 as Emoji, a5 as EphemeralMessage, a6 as FetchDirection, a7 as FetchOptions, a8 as FetchResult, a9 as FileUpload, aa as FormattedContent, ab as IdentityContext, ac as IdentityResolver, ad as LinkPreview, ae as ListQuery, af as ListThreadsOptions, ag as ListThreadsResult, ah as Lock, ai as LockScope, aj as LockScopeContext, ak as LogLevel, al as Logger, am as MarkdownTextChunk, an as MemberJoinedChannelEvent, ao as MemberJoinedChannelHandler, ap as MentionHandler, M as Message, aq as MessageContext, ar as MessageData, as as MessageHandler, at as MessageMetadata, au as MessageSubject, av as ModalClearResponse, aw as ModalCloseEvent, ax as ModalCloseHandler, ay as ModalCloseResponse, az as ModalErrorsResponse, aA as ModalPushResponse, aB as ModalResponse, aC as ModalSubmitEvent, aD as ModalSubmitHandler, aE as ModalUpdateResponse, aF as OptionsLoadEvent, aG as OptionsLoadGroup, aH as OptionsLoadHandler, aI as OptionsLoadResult, aJ as PlanUpdateChunk, aK as PostEphemeralOptions, aL as Postable, aM as PostableAst, aN as PostableCard, aO as PostableMarkdown, aP as PostableMessage, aQ as PostableRaw, aR as QueueEntry, aS as RawMessage, aT as ReactionEvent, aU as ReactionHandler, aV as ScheduledMessage, aW as SentMessage, aX as SerializedChannel, aY as SerializedMessage, aZ as SerializedThread, a_ as SlashCommandEvent, a$ as SlashCommandHandler, b0 as StateAdapter, b1 as StreamOptions, b2 as SubscribedMessageHandler, b3 as THREAD_STATE_TTL_MS, b4 as TaskUpdateChunk, b5 as Thread, b6 as ThreadImpl, b7 as ThreadInfo, b8 as ThreadSummary, T as ToAiMessagesOptions, b9 as TranscriptEntry, ba as TranscriptRole, bb as TranscriptsApi, bc as TranscriptsConfig, bd as UserInfo, be as WebhookOptions, bf as deriveChannelId, bg as isPostableObject, t as toAiMessages } from './messages-BSoJG691.js'; ++import { Adapter, AdapterPostableMessage, CustomEmojiMap, EmojiFormats, EmojiMapConfig, EmojiValue, PostableObject, PostableObjectContext, StreamChunk, StreamEvent, ThreadHistoryCache, ThreadHistoryConfig, WellKnownEmoji } from "chat"; ++export * from "chat"; + import { Root, List, Content, Blockquote, Code, Emphasis, InlineCode, Delete, Link, ListItem, Paragraph, Strong, TableCell, Table as Table$1, TableRow, Text } from './_mdast.js'; + export { Blockquote, Code, Content, Delete, Emphasis, InlineCode, Link, List, ListItem, Table as MdastTable, Nodes, Paragraph, Root, Strong, TableCell, TableRow, Text } from './_mdast.js'; + import { C as CardElement, a as CardChild, b as ChartElement, A as ActionsComponent, B as ButtonComponent, c as CardComponent, d as CardLinkComponent, T as TextComponent, e as ChartComponent, D as DividerComponent, E as ExternalSelectComponent, F as FieldComponent, f as FieldsComponent, I as ImageComponent, L as LinkButtonComponent, M as ModalComponent, R as RadioSelectComponent, S as SectionComponent, g as SelectComponent, h as SelectOptionComponent, i as Table$2, j as TextInputComponent, k as cardChildToFallbackText$1, l as fromReactElement$1, m as fromReactModalElement$1, n as isCardElement$1, o as isJSX$1, p as isModalElement$1, t as toCardElement$1, q as toModalElement$1 } from './jsx-runtime-_JEEAotp.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ef02818..ab4a22b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ settings: patchedDependencies: '@linqapp/chat-sdk-adapter@0.5.1': 78b56cdd08c4250ad2680c094858b28d6d6935538d8e59e6dd578f106c77b9e7 - eve@0.49.0: 5b21e49f1a138ffa73b484505a6abc5a3540fc9ae32ff8d7101626fcc8c9d08d + eve: c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b importers: @@ -29,7 +29,7 @@ importers: version: 0.47.1 '@onkernel/browser-loop': specifier: 0.12.0 - version: 0.12.0(@aws-sdk/credential-provider-node@3.972.81)(@earendil-works/pi-agent-core@0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@smithy/signature-v4@5.7.3)(@types/node@24.13.3)(ws@8.21.3)(zod@4.4.3) + version: 0.12.0(@aws-sdk/credential-provider-node@3.972.81)(@earendil-works/pi-agent-core@0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(ws@8.21.3)(zod@4.5.4))(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(@smithy/signature-v4@5.7.3)(@types/node@24.13.3)(ws@8.21.3)(zod@4.5.4) '@onkernel/sdk': specifier: ^0.96.0 version: 0.96.0 @@ -50,7 +50,7 @@ importers: version: 1.0.2(react@19.2.8) '@t3-oss/env-nextjs': specifier: 0.13.11 - version: 0.13.11(typescript@6.0.3)(zod@4.4.3) + version: 0.13.11(typescript@6.0.3)(zod@4.5.4) '@tailwindcss/postcss': specifier: 4.3.3 version: 4.3.3 @@ -71,13 +71,13 @@ importers: version: 2.8.0 '@vercel/connect': specifier: ^2.0.0 - version: 2.0.0(917c92fa64730472443f72c175670998) + version: 2.0.0(ai@7.0.93(zod@4.5.4))(better-auth@1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))))(eve@https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz(patch_hash=c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b)(@opentelemetry/api@1.9.1)(ai@7.0.93(zod@4.5.4))) '@vercel/oidc': specifier: 3.8.5 version: 3.8.5 ai: - specifier: ^7.0.79 - version: 7.0.83(zod@4.4.3) + specifier: ^7.0.93 + version: 7.0.93(zod@4.5.4) better-auth: specifier: 1.7.2 version: 1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))) @@ -97,11 +97,11 @@ importers: specifier: ^0.45.2 version: 0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0) eve: - specifier: ^0.49.0 - version: 0.49.0(patch_hash=5b21e49f1a138ffa73b484505a6abc5a3540fc9ae32ff8d7101626fcc8c9d08d)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + specifier: https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz + version: https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz(patch_hash=c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b)(@opentelemetry/api@1.9.1)(ai@7.0.93(zod@4.5.4)) evlog: - specifier: 2.27.1 - version: 2.27.1(ai@7.0.83(zod@4.4.3))(eve@0.49.0(patch_hash=5b21e49f1a138ffa73b484505a6abc5a3540fc9ae32ff8d7101626fcc8c9d08d)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(express@5.2.1)(hono@4.13.5)(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(ofetch@2.0.0-alpha.3)(react@19.2.8)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + specifier: 2.28.1 + version: 2.28.1(ai@7.0.93(zod@4.5.4))(eve@https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz(patch_hash=c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b)(@opentelemetry/api@1.9.1)(ai@7.0.93(zod@4.5.4)))(express@5.2.1)(hono@4.13.5)(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(ofetch@1.5.1)(react@19.2.8)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) lucide-react: specifier: 1.34.0 version: 1.34.0(react@19.2.8) @@ -136,15 +136,15 @@ importers: specifier: 1.1.6 version: 1.1.6(react@19.2.8) zod: - specifier: 4.4.3 - version: 4.4.3 + specifier: 4.5.4 + version: 4.5.4 devDependencies: '@electric-sql/pglite': specifier: ^0.5.8 version: 0.5.8 '@linqapp/chat-sdk-adapter': specifier: 0.5.1 - version: 0.5.1(patch_hash=78b56cdd08c4250ad2680c094858b28d6d6935538d8e59e6dd578f106c77b9e7)(chat@4.34.0(ai@7.0.83(zod@4.4.3))(zod@4.4.3)) + version: 0.5.1(patch_hash=78b56cdd08c4250ad2680c094858b28d6d6935538d8e59e6dd578f106c77b9e7)(chat@4.34.0(ai@7.0.93(zod@4.5.4))(zod@4.5.4)) '@next/env': specifier: 16.3.3 version: 16.3.3 @@ -165,7 +165,7 @@ importers: version: 19.2.5(@types/react@19.2.18) chat: specifier: 4.34.0 - version: 4.34.0(ai@7.0.83(zod@4.4.3))(zod@4.4.3) + version: 4.34.0(ai@7.0.93(zod@4.5.4))(zod@4.5.4) drizzle-kit: specifier: ^0.31.10 version: 0.31.10 @@ -217,20 +217,20 @@ importers: packages: - '@ai-sdk/gateway@4.0.67': - resolution: {integrity: sha512-LtyxLkg7dZ2iz8Ouh1806BJbA+q+FKc/mXUCl4v/wdNNIGtbfk80dNtlhqjhqOZa4dnfc3caVafRL7ocxzoegA==} + '@ai-sdk/gateway@4.0.75': + resolution: {integrity: sha512-HOnhw3oXtBnboBF7kAKipjToCN6+5w6EuukiUKiULcxBitS+vbHRRv9IUBcq+Z1wkXcJjfywKrt5r++I6OYyXg==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@5.0.32': - resolution: {integrity: sha512-MZUhlINn6FzKIWuX3T36h+yM9d7bG+yatH+kC99ZCe0DHxXfP73KwaoLiLcZDPQDamFyO3umPPBLJieZJyG4DQ==} + '@ai-sdk/provider-utils@5.0.36': + resolution: {integrity: sha512-MFXBn6XDyf37PNQAge/HTatPJE8Vmg/g/w4WPtjSV53jq8FKAzoaN5+43hsdQa9bqgN+/13jxug9ChvsG+godQ==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@4.0.8': - resolution: {integrity: sha512-aWO7iwhFUGf347tCwNGggggfmZigaSu7TF739IZSrWWABUp7zkb4Cr3fMqvBe5EIS7ABJJu3Cadn0g/zs1G0QQ==} + '@ai-sdk/provider@4.0.10': + resolution: {integrity: sha512-fX2ENAc7iDpZ+Wp4+Rk06Usn/Ys7dI9uAkGv0jlF6XVrW13NkRWx5Ou+U6lIM2E1fTLkCs16GGrUAaVvroag7A==} engines: {node: '>=22'} '@alloc/quick-lru@5.2.0': @@ -1889,8 +1889,8 @@ packages: '@oxc-project/types@0.143.0': resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} - '@oxc-project/types@0.147.0': - resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} + '@oxc-project/types@0.148.0': + resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} '@oxc-resolver/binding-android-arm-eabi@11.24.2': resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} @@ -2600,8 +2600,8 @@ packages: resolution: {integrity: sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==} engines: {node: ^20.9.0 || ^22.11.0 || ^24, pnpm: ^10.0.0} - '@rolldown/binding-android-arm-eabi@1.2.6': - resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==} + '@rolldown/binding-android-arm-eabi@1.2.7': + resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] @@ -2612,8 +2612,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.2.6': - resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==} + '@rolldown/binding-android-arm64@1.2.7': + resolution: {integrity: sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -2624,8 +2624,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.2.6': - resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==} + '@rolldown/binding-darwin-arm64@1.2.7': + resolution: {integrity: sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -2636,8 +2636,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.6': - resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==} + '@rolldown/binding-darwin-x64@1.2.7': + resolution: {integrity: sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -2648,8 +2648,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.2.6': - resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} + '@rolldown/binding-freebsd-x64@1.2.7': + resolution: {integrity: sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -2660,8 +2660,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': - resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.7': + resolution: {integrity: sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -2673,8 +2673,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.2.6': - resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} + '@rolldown/binding-linux-arm64-gnu@1.2.7': + resolution: {integrity: sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -2687,22 +2687,22 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.2.6': - resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==} + '@rolldown/binding-linux-arm64-musl@1.2.7': + resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.6': - resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} + '@rolldown/binding-linux-ppc64-gnu@1.2.7': + resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.6': - resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} + '@rolldown/binding-linux-s390x-gnu@1.2.7': + resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -2715,8 +2715,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.6': - resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} + '@rolldown/binding-linux-x64-gnu@1.2.7': + resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -2729,8 +2729,8 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.2.6': - resolution: {integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==} + '@rolldown/binding-linux-x64-musl@1.2.7': + resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -2742,8 +2742,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.2.6': - resolution: {integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==} + '@rolldown/binding-openharmony-arm64@1.2.7': + resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -2759,8 +2759,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.2.6': - resolution: {integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==} + '@rolldown/binding-win32-arm64-msvc@1.2.7': + resolution: {integrity: sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -2771,8 +2771,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.6': - resolution: {integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==} + '@rolldown/binding-win32-x64-msvc@1.2.7': + resolution: {integrity: sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3285,6 +3285,7 @@ packages: '@vercel/connect@2.0.0': resolution: {integrity: sha512-CYjPe7ZFzXHjtrwQMIDxA7Ne+tgdVu6NvGa11//3n09y5UOsJjE3LCXwAm2/yZPnvPQTbKocLMFt8tV0doXHeQ==} + version: 2.0.0 peerDependencies: '@ai-sdk/mcp': ^1 || ^2 '@auth/core': '>=0.37.0' @@ -3337,18 +3338,6 @@ packages: resolution: {integrity: sha512-8erw9uPe0dFg45THkNxmjtvMX143SkZebmjgSVbcM3XCkXu3RIiBaJMcMNG8aaS+rnTuw8+d4De9HVT0M/r3wg==} engines: {node: '>= 18'} - '@vercel/functions@3.9.5': - resolution: {integrity: sha512-EUfqlb7AzoEh7URlMNAO4jbJiLWz9grDBHvfjKTDvEP9c8y3DqX3SWPvfaQkUjtkm3b83flhaUUMuewdHa+qmw==} - engines: {node: '>= 20'} - peerDependencies: - '@aws-sdk/credential-provider-web-identity': '*' - ws: '>=8' - peerDependenciesMeta: - '@aws-sdk/credential-provider-web-identity': - optional: true - ws: - optional: true - '@vercel/gatsby-plugin-vercel-analytics@1.0.12': resolution: {integrity: sha512-Ejlhwxr7EBYJxtwYnlh6Vm6A2dPsUSPxMdYrfv0koZkgAzVwo7cG4aDQiy7iASMaGzwuI/PAnwlY2sJBF5b4OA==} @@ -3530,8 +3519,8 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@7.0.83: - resolution: {integrity: sha512-bg7+SopUwqA7DeQ2O8I9qELyQTHCeeI/0RuNUlT/gGz+LqWrIl5vbYRQv3eMBEnUsVFaM33n6SA8Vqe9gi8L1w==} + ai@7.0.93: + resolution: {integrity: sha512-CJss6zb9mlltk/mCr8qom20NBnqEQxVawkqwtT62tCwsxilZpXfHNRMRwcS3XRpzdP1kEluVuDBUayYWEEd95g==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4144,28 +4133,8 @@ packages: dayjs@1.11.23: resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} - db0@0.3.4: - resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} - peerDependencies: - '@electric-sql/pglite': '*' - '@libsql/client': '*' - better-sqlite3: '*' - drizzle-orm: '*' - mysql2: '*' - sqlite3: '*' - peerDependenciesMeta: - '@electric-sql/pglite': - optional: true - '@libsql/client': - optional: true - better-sqlite3: - optional: true - drizzle-orm: - optional: true - mysql2: - optional: true - sqlite3: - optional: true + db0@0.4.1: + resolution: {integrity: sha512-6RBY/bSn42UrqATwsiULj2uYFyEykB3XeA/NLIVQeHNXlYV6D4Idxx3/aa6k5Y45Dwzx7sygeLotnqHWSeURYA==} debounce-fn@4.0.0: resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} @@ -4423,23 +4392,9 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - env-runner@0.1.16: - resolution: {integrity: sha512-2LRJM4P2KLX6J83QZZrMqvgCDt/D5ea7wPcI3yYiy5cG/9rX5QwdwZFx0D7ktWnjdRyZxYjttGGorb5nFqb1CA==} + env-runner@0.2.1: + resolution: {integrity: sha512-2iDP2DfheAMMAKeXBggEuFmpSq+1Xs6wQoHba1g65pZFXlC3VHD1O6/tgVzS6GQLv+P2koPKZPKgKhXkigNBdg==} hasBin: true - peerDependencies: - '@netlify/runtime': ^4.1.23 - '@vercel/queue': '>=0.2.0' - miniflare: ^4.20260515.0 - wrangler: ^4.0.0 - peerDependenciesMeta: - '@netlify/runtime': - optional: true - '@vercel/queue': - optional: true - miniflare: - optional: true - wrangler: - optional: true error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -4566,8 +4521,9 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - eve@0.49.0: - resolution: {integrity: sha512-ij2RJtGs0RNO+1jKtneHfx/atP9LbjlBmyj8SHVoEsFGPgexOOrl1vlvxzIsI2/LY136VBhJ+Lak+dmPjMtpWA==} + eve@https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz: + resolution: {integrity: sha512-F/h0gUvr3TwB5jSiUFWN1V+AZ1jfC0SVp5jsHpuhklDGyhNRlD2vFTv+Og+t4sT6fC5MQKUHAkhwyUqH4pJSxA==, tarball: https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz} + version: 0.52.2 engines: {node: '>=24'} hasBin: true peerDependencies: @@ -4600,8 +4556,9 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - evlog@2.27.1: - resolution: {integrity: sha512-Wye/LVkhvzD2sAP/nekaw9c3/d+F2SMQe3m57hgmfLXPkX37rRtDv4ncZf1QLNfo8VBvKUCgZOChJubFRMgXTw==} + evlog@2.28.1: + resolution: {integrity: sha512-RTci0+FRspM0zqyqHmk60LHb0l9CB+1M5criUFrAMfM3/G1Hd7OBT3STtNA93liY5IdK73ph6iWr2UM2Dqe2Sw==} + version: 2.28.1 engines: {node: '>=18.0.0'} peerDependencies: '@nestjs/common': '>=11.1.28' @@ -4888,10 +4845,6 @@ packages: get-tsconfig@4.14.3: resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} - giget@3.3.1: - resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} - hasBin: true - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4931,15 +4884,18 @@ packages: resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} engines: {node: '>=18'} - h3@2.0.1-rc.22: - resolution: {integrity: sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==} + h3@2.0.1-rc.31: + resolution: {integrity: sha512-AG7qZzF99a0BSYoXT3evJgIhwSIUKow7R+hwkLRZS06WJ9nbSb7QXUDgs1ByBjp6svTvl++N/GKA7I9YPz9cQQ==} engines: {node: '>=20.11.1'} hasBin: true peerDependencies: - crossws: ^0.4.1 + crossws: ^0.4.12 + ocache: '>=0.3.0' peerDependenciesMeta: crossws: optional: true + ocache: + optional: true hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -5875,36 +5831,10 @@ packages: nf3@0.3.24: resolution: {integrity: sha512-HxLK4bo+5jNsEETZp4w3tJblHOA9MCBY14IN9nZJJV8JDxt9yNIYxuBuLMjTAR5GFa3HL61+8VQDUrXv3/C8fw==} - nitro@3.0.260610-beta: - resolution: {integrity: sha512-KPb4L5yaF/Rx/xoGMpgHRJvZhbhGiqbRKOwwPLCH9jKTKTsEUHLjnJas85AeCzaswqa8Wi52eQBtRsODC4PS0Q==} + nitro@3.0.260903-beta: + resolution: {integrity: sha512-54gANPi62O8rfMvepiJUVuIzEIinYfpeHbebywlLxvVTgIYXDwSvpaU9Id+0sJOBjBx0wC1/CVYXJkH7SY+l0g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - peerDependencies: - '@vercel/queue': ^0.3.0 - dotenv: '*' - giget: '*' - jiti: ^2.7.0 - rollup: ^4.61.1 - vite: ^7 || ^8 - xml2js: ^0.6.2 - zephyr-agent: ^0.2.0 - peerDependenciesMeta: - '@vercel/queue': - optional: true - dotenv: - optional: true - giget: - optional: true - jiti: - optional: true - rollup: - optional: true - vite: - optional: true - xml2js: - optional: true - zephyr-agent: - optional: true node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} @@ -5980,18 +5910,12 @@ packages: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} - ocache@0.1.5: - resolution: {integrity: sha512-kNNnkkVQup/QDvmTz8Q84wc2ntiyoVHDxa6eHWKt5qdGAmFRBIxy83rxgCYEjW0x06UJ9E3P6VgM2yY4rOBH4w==} + ocache@0.3.0: + resolution: {integrity: sha512-RS/9P0zeBb0gDJmadGERLH8lZNXK7xbufTDhclkXGvFGTsj0G4M5/cLk+mizcERH29mLXNnocfB5wjcK70wGJg==} ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} - ofetch@2.0.0-alpha.3: - resolution: {integrity: sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==} - - ohash@2.0.12: - resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} - on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -6550,14 +6474,11 @@ packages: resolution: {integrity: sha512-M3AeZjYE6UclblEf531Hch0WfVC/NOL43Cc+WdF3J50kk5/fvouHhDumSGTh0oRjbZ8C4faaVr5r6Nx1xMqDGg==} engines: {node: ^20.19.0 || >=22.12.0} - rolldown@1.2.6: - resolution: {integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==} + rolldown@1.2.7: + resolution: {integrity: sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rou3@0.8.1: - resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} - rou3@0.9.2: resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} @@ -6713,8 +6634,8 @@ packages: resolution: {integrity: sha512-bp07zRuycfTY43IjAvvTFnmnJi8ikW0VFiHwOhhYcVW/L4xQ1XY4PAd4Nuum1rsA17C39zL7x+CDhrn5AL32Rw==} engines: {node: '>=20.16.0'} - srvx@0.11.22: - resolution: {integrity: sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==} + srvx@1.0.3: + resolution: {integrity: sha512-aOuk+yNJA61yA6eJJvQJxpJLIxz090hKMqDGzd35tGsvwaodi1RPuYSFUp5EINaJp7snjVwLkO2RXVMPZBYnnA==} engines: {node: '>=20.16.0'} hasBin: true @@ -7047,79 +6968,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unstorage@2.0.0-alpha.7: - resolution: {integrity: sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog==} - peerDependencies: - '@azure/app-configuration': ^1.11.0 - '@azure/cosmos': ^4.9.1 - '@azure/data-tables': ^13.3.2 - '@azure/identity': ^4.13.0 - '@azure/keyvault-secrets': ^4.10.0 - '@azure/storage-blob': ^12.31.0 - '@capacitor/preferences': ^6 || ^7 || ^8 - '@deno/kv': '>=0.13.0' - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 - '@planetscale/database': ^1.19.0 - '@upstash/redis': ^1.36.2 - '@vercel/blob': '>=0.27.3' - '@vercel/functions': ^2.2.12 || ^3.0.0 - '@vercel/kv': ^1.0.1 - aws4fetch: ^1.0.20 - chokidar: ^4 || ^5 - db0: '>=0.3.4' - idb-keyval: ^6.2.2 - ioredis: ^5.9.3 - lru-cache: ^11.2.6 - mongodb: ^6 || ^7 - ofetch: '*' - uploadthing: ^7.7.4 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@deno/kv': - optional: true - '@netlify/blobs': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/blob': - optional: true - '@vercel/functions': - optional: true - '@vercel/kv': - optional: true - aws4fetch: - optional: true - chokidar: - optional: true - db0: - optional: true - idb-keyval: - optional: true - ioredis: - optional: true - lru-cache: - optional: true - mongodb: - optional: true - ofetch: - optional: true - uploadthing: - optional: true + unstorage@2.0.0-alpha.10: + resolution: {integrity: sha512-6h1veZp8gnp4dGllf0tDijoXxDYymJu251IpKKkrSVH+QHL6tXFbwG85KM+CBHSgpkkgtPuIiZ9oLCLP5+1Evw==} update-browserslist-db@1.3.1: resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} @@ -7417,31 +7267,31 @@ packages: zod@4.1.11: resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@ai-sdk/gateway@4.0.67(zod@4.4.3)': + '@ai-sdk/gateway@4.0.75(zod@4.5.4)': dependencies: - '@ai-sdk/provider': 4.0.8 - '@ai-sdk/provider-utils': 5.0.32(zod@4.4.3) + '@ai-sdk/provider': 4.0.10 + '@ai-sdk/provider-utils': 5.0.36(zod@4.5.4) '@vercel/oidc': 3.2.0 - zod: 4.4.3 + zod: 4.5.4 - '@ai-sdk/provider-utils@5.0.32(zod@4.4.3)': + '@ai-sdk/provider-utils@5.0.36(zod@4.5.4)': dependencies: - '@ai-sdk/provider': 4.0.8 + '@ai-sdk/provider': 4.0.10 '@standard-schema/spec': 1.1.0 '@workflow/serde': 4.1.0 eventsource-parser: 3.1.1 undici: 7.29.0 - zod: 4.4.3 + zod: 4.5.4 - '@ai-sdk/provider@4.0.8': + '@ai-sdk/provider@4.0.10': dependencies: json-schema: 0.4.0 @@ -7459,11 +7309,11 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 - '@anthropic-ai/sdk@0.91.1(zod@4.4.3)': + '@anthropic-ai/sdk@0.91.1(zod@4.5.4)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: - zod: 4.4.3 + zod: 4.5.4 '@aws-crypto/sha256-browser@5.2.0': dependencies: @@ -7890,52 +7740,52 @@ snapshots: optionalDependencies: '@types/react': 19.2.18 - '@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2)': + '@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2)': dependencies: '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@opentelemetry/semantic-conventions': 1.43.0 '@standard-schema/spec': 1.1.0 - better-call: 1.4.0(zod@4.4.3) + better-call: 1.4.0(zod@4.5.4) jose: 6.2.10 kysely: 0.29.5 nanostores: 1.5.2 - zod: 4.4.3 + zod: 4.5.4 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@better-auth/drizzle-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))': + '@better-auth/drizzle-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) '@better-auth/utils': 0.4.2 optionalDependencies: drizzle-orm: 0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0) - '@better-auth/kysely-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(kysely@0.29.5)': + '@better-auth/kysely-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(kysely@0.29.5)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) '@better-auth/utils': 0.4.2 optionalDependencies: kysely: 0.29.5 - '@better-auth/memory-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': + '@better-auth/memory-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': + '@better-auth/mongo-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) '@better-auth/utils': 0.4.2 - '@better-auth/prisma-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': + '@better-auth/prisma-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) '@better-auth/utils': 0.4.2 - '@better-auth/telemetry@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': + '@better-auth/telemetry@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -7978,9 +7828,9 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} - '@earendil-works/pi-agent-core@0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)': + '@earendil-works/pi-agent-core@0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(ws@8.21.3)(zod@4.5.4)': dependencies: - '@earendil-works/pi-ai': 0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3) + '@earendil-works/pi-ai': 0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(ws@8.21.3)(zod@4.5.4) diff: 8.0.4 ignore: 7.0.5 typebox: 1.3.7 @@ -7993,17 +7843,17 @@ snapshots: - ws - zod - '@earendil-works/pi-ai@0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)': + '@earendil-works/pi-ai@0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(ws@8.21.3)(zod@4.5.4)': dependencies: - '@anthropic-ai/sdk': 0.91.1(zod@4.4.3) + '@anthropic-ai/sdk': 0.91.1(zod@4.5.4) '@aws-sdk/client-bedrock-runtime': 3.1048.0 - '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)) + '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4)) '@mistralai/mistralai': 2.2.6(@opentelemetry/api@1.9.0) '@opentelemetry/api': 1.9.0 '@smithy/node-http-handler': 4.7.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 - openai: 6.26.0(ws@8.21.3)(zod@4.4.3) + openai: 6.26.0(ws@8.21.3)(zod@4.5.4) partial-json: 0.1.7 typebox: 1.3.7 transitivePeerDependencies: @@ -8330,14 +8180,14 @@ snapshots: '@floating-ui/utils@0.2.12': {} - '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))': + '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))': dependencies: google-auth-library: 10.5.0 p-retry: 4.6.2 protobufjs: 7.6.6 ws: 8.21.3 optionalDependencies: - '@modelcontextprotocol/sdk': 1.30.0(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.30.0(zod@4.5.4) transitivePeerDependencies: - bufferutil - supports-color @@ -8535,10 +8385,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@linqapp/chat-sdk-adapter@0.5.1(patch_hash=78b56cdd08c4250ad2680c094858b28d6d6935538d8e59e6dd578f106c77b9e7)(chat@4.34.0(ai@7.0.83(zod@4.4.3))(zod@4.4.3))': + '@linqapp/chat-sdk-adapter@0.5.1(patch_hash=78b56cdd08c4250ad2680c094858b28d6d6935538d8e59e6dd578f106c77b9e7)(chat@4.34.0(ai@7.0.93(zod@4.5.4))(zod@4.5.4))': dependencies: '@linqapp/sdk': 0.47.1 - chat: 4.34.0(ai@7.0.83(zod@4.4.3))(zod@4.4.3) + chat: 4.34.0(ai@7.0.93(zod@4.5.4))(zod@4.5.4) standardwebhooks: 1.1.1 '@linqapp/sdk@0.47.1': @@ -8566,8 +8416,8 @@ snapshots: dependencies: '@opentelemetry/semantic-conventions': 1.43.0 ws: 8.21.3 - zod: 4.4.3 - zod-to-json-schema: 3.25.2(zod@4.4.3) + zod: 4.5.4 + zod-to-json-schema: 3.25.2(zod@4.5.4) optionalDependencies: '@opentelemetry/api': 1.9.0 transitivePeerDependencies: @@ -8596,7 +8446,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)': + '@modelcontextprotocol/sdk@1.30.0(zod@4.5.4)': dependencies: '@hono/node-server': 2.1.1(hono@4.13.5) ajv: 8.20.0 @@ -8613,8 +8463,8 @@ snapshots: json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 4.4.3 - zod-to-json-schema: 3.25.2(zod@4.4.3) + zod: 4.5.4 + zod-to-json-schema: 3.25.2(zod@4.5.4) transitivePeerDependencies: - supports-color optional: true @@ -8729,12 +8579,12 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@onkernel/browser-loop@0.12.0(@aws-sdk/credential-provider-node@3.972.81)(@earendil-works/pi-agent-core@0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(@smithy/signature-v4@5.7.3)(@types/node@24.13.3)(ws@8.21.3)(zod@4.4.3)': + '@onkernel/browser-loop@0.12.0(@aws-sdk/credential-provider-node@3.972.81)(@earendil-works/pi-agent-core@0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(ws@8.21.3)(zod@4.5.4))(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(@smithy/signature-v4@5.7.3)(@types/node@24.13.3)(ws@8.21.3)(zod@4.5.4)': dependencies: - '@earendil-works/pi-agent-core': 0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3) - '@earendil-works/pi-ai': 0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3) + '@earendil-works/pi-agent-core': 0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(ws@8.21.3)(zod@4.5.4) + '@earendil-works/pi-ai': 0.83.0(@modelcontextprotocol/sdk@1.30.0(zod@4.5.4))(ws@8.21.3)(zod@4.5.4) '@onkernel/sdk': 0.49.0 - openai: 6.49.0(@aws-sdk/credential-provider-node@3.972.81)(@smithy/signature-v4@5.7.3)(ws@8.21.3)(zod@4.4.3) + openai: 6.49.0(@aws-sdk/credential-provider-node@3.972.81)(@smithy/signature-v4@5.7.3)(ws@8.21.3)(zod@4.5.4) sharp: 0.35.4(@types/node@24.13.3) typebox: 1.3.7 transitivePeerDependencies: @@ -8887,7 +8737,7 @@ snapshots: '@oxc-project/types@0.143.0': {} - '@oxc-project/types@0.147.0': {} + '@oxc-project/types@0.148.0': {} '@oxc-resolver/binding-android-arm-eabi@11.24.2': optional: true @@ -9315,73 +9165,73 @@ snapshots: '@renovatebot/pep440@4.2.1': {} - '@rolldown/binding-android-arm-eabi@1.2.6': + '@rolldown/binding-android-arm-eabi@1.2.7': optional: true '@rolldown/binding-android-arm64@1.0.0-rc.1': optional: true - '@rolldown/binding-android-arm64@1.2.6': + '@rolldown/binding-android-arm64@1.2.7': optional: true '@rolldown/binding-darwin-arm64@1.0.0-rc.1': optional: true - '@rolldown/binding-darwin-arm64@1.2.6': + '@rolldown/binding-darwin-arm64@1.2.7': optional: true '@rolldown/binding-darwin-x64@1.0.0-rc.1': optional: true - '@rolldown/binding-darwin-x64@1.2.6': + '@rolldown/binding-darwin-x64@1.2.7': optional: true '@rolldown/binding-freebsd-x64@1.0.0-rc.1': optional: true - '@rolldown/binding-freebsd-x64@1.2.6': + '@rolldown/binding-freebsd-x64@1.2.7': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.1': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': + '@rolldown/binding-linux-arm-gnueabihf@1.2.7': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.1': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.6': + '@rolldown/binding-linux-arm64-gnu@1.2.7': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-rc.1': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.6': + '@rolldown/binding-linux-arm64-musl@1.2.7': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.6': + '@rolldown/binding-linux-ppc64-gnu@1.2.7': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.6': + '@rolldown/binding-linux-s390x-gnu@1.2.7': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-rc.1': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.6': + '@rolldown/binding-linux-x64-gnu@1.2.7': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-rc.1': optional: true - '@rolldown/binding-linux-x64-musl@1.2.6': + '@rolldown/binding-linux-x64-musl@1.2.7': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-rc.1': optional: true - '@rolldown/binding-openharmony-arm64@1.2.6': + '@rolldown/binding-openharmony-arm64@1.2.7': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-rc.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)': @@ -9395,13 +9245,13 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.1': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.6': + '@rolldown/binding-win32-arm64-msvc@1.2.7': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.6': + '@rolldown/binding-win32-x64-msvc@1.2.7': optional: true '@rolldown/pluginutils@1.0.0-rc.1': {} @@ -9546,17 +9396,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@t3-oss/env-core@0.13.11(typescript@6.0.3)(zod@4.4.3)': + '@t3-oss/env-core@0.13.11(typescript@6.0.3)(zod@4.5.4)': optionalDependencies: typescript: 6.0.3 - zod: 4.4.3 + zod: 4.5.4 - '@t3-oss/env-nextjs@0.13.11(typescript@6.0.3)(zod@4.4.3)': + '@t3-oss/env-nextjs@0.13.11(typescript@6.0.3)(zod@4.5.4)': dependencies: - '@t3-oss/env-core': 0.13.11(typescript@6.0.3)(zod@4.4.3) + '@t3-oss/env-core': 0.13.11(typescript@6.0.3)(zod@4.5.4) optionalDependencies: typescript: 6.0.3 - zod: 4.4.3 + zod: 4.5.4 '@tailwindcss/node@4.3.3': dependencies: @@ -9946,13 +9796,13 @@ snapshots: dependencies: execa: 5.1.1 - '@vercel/connect@2.0.0(917c92fa64730472443f72c175670998)': + '@vercel/connect@2.0.0(ai@7.0.93(zod@4.5.4))(better-auth@1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))))(eve@https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz(patch_hash=c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b)(@opentelemetry/api@1.9.1)(ai@7.0.93(zod@4.5.4)))': dependencies: '@vercel/oidc': 3.8.5 optionalDependencies: - ai: 7.0.83(zod@4.4.3) + ai: 7.0.93(zod@4.5.4) better-auth: 1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))) - eve: 0.49.0(patch_hash=5b21e49f1a138ffa73b484505a6abc5a3540fc9ae32ff8d7101626fcc8c9d08d)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + eve: https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz(patch_hash=c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b)(@opentelemetry/api@1.9.1)(ai@7.0.93(zod@4.5.4)) '@vercel/container@3.0.0(@vercel/build-utils@14.5.0)': dependencies: @@ -10028,14 +9878,6 @@ snapshots: - encoding - supports-color - '@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3)': - dependencies: - '@vercel/oidc': 3.8.5 - optionalDependencies: - '@aws-sdk/credential-provider-web-identity': 3.972.76 - ws: 8.21.3 - optional: true - '@vercel/gatsby-plugin-vercel-analytics@1.0.12': dependencies: web-vitals: 0.2.4 @@ -10251,7 +10093,7 @@ snapshots: tar-stream: 3.1.7 undici: 7.29.0 xdg-app-paths: 5.1.0 - zod: 4.4.3 + zod: 4.5.4 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -10353,12 +10195,12 @@ snapshots: agent-base@7.1.4: {} - ai@7.0.83(zod@4.4.3): + ai@7.0.93(zod@4.5.4): dependencies: - '@ai-sdk/gateway': 4.0.67(zod@4.4.3) - '@ai-sdk/provider': 4.0.8 - '@ai-sdk/provider-utils': 5.0.32(zod@4.4.3) - zod: 4.4.3 + '@ai-sdk/gateway': 4.0.75(zod@4.5.4) + '@ai-sdk/provider': 4.0.10 + '@ai-sdk/provider-utils': 5.0.36(zod@4.5.4) + zod: 4.5.4 ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: @@ -10447,23 +10289,23 @@ snapshots: better-auth@1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))): dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) - '@better-auth/drizzle-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)) - '@better-auth/kysely-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(kysely@0.29.5) - '@better-auth/memory-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) - '@better-auth/mongo-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) - '@better-auth/prisma-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) - '@better-auth/telemetry': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/drizzle-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)) + '@better-auth/kysely-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(kysely@0.29.5) + '@better-auth/memory-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) + '@better-auth/prisma-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@noble/ciphers': 2.3.0 '@noble/hashes': 2.3.0 - better-call: 1.4.0(zod@4.4.3) + better-call: 1.4.0(zod@4.5.4) defu: 6.1.7 jose: 6.2.10 kysely: 0.29.5 nanostores: 1.5.2 - zod: 4.4.3 + zod: 4.5.4 optionalDependencies: drizzle-kit: 0.31.10 drizzle-orm: 0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0) @@ -10476,14 +10318,14 @@ snapshots: - '@cloudflare/workers-types' - '@opentelemetry/api' - better-call@1.4.0(zod@4.4.3): + better-call@1.4.0(zod@4.5.4): dependencies: '@better-auth/utils': 0.5.0 '@better-fetch/fetch': 1.3.1 rou3: 0.9.2 set-cookie-parser: 3.1.2 optionalDependencies: - zod: 4.4.3 + zod: 4.5.4 bignumber.js@9.3.1: {} @@ -10576,7 +10418,7 @@ snapshots: character-reference-invalid@2.0.1: {} - chat@4.34.0(ai@7.0.83(zod@4.4.3))(zod@4.4.3): + chat@4.34.0(ai@7.0.93(zod@4.5.4))(zod@4.5.4): dependencies: '@workflow/serde': 4.1.0-beta.2 mdast-util-to-string: 4.0.0 @@ -10586,8 +10428,8 @@ snapshots: remend: 1.3.1 unified: 11.0.5 optionalDependencies: - ai: 7.0.83(zod@4.4.3) - zod: 4.4.3 + ai: 7.0.93(zod@4.5.4) + zod: 4.5.4 transitivePeerDependencies: - supports-color @@ -10708,9 +10550,9 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crossws@0.4.12(srvx@0.11.22): + crossws@0.4.12(srvx@1.0.3): optionalDependencies: - srvx: 0.11.22 + srvx: 1.0.3 cssesc@3.0.0: {} @@ -10904,10 +10746,7 @@ snapshots: dayjs@1.11.23: {} - db0@0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)): - optionalDependencies: - '@electric-sql/pglite': 0.5.8 - drizzle-orm: 0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0) + db0@0.4.1: {} debounce-fn@4.0.0: dependencies: @@ -11052,12 +10891,12 @@ snapshots: env-paths@2.2.1: {} - env-runner@0.1.16: + env-runner@0.2.1: dependencies: - crossws: 0.4.12(srvx@0.11.22) + crossws: 0.4.12(srvx@1.0.3) exsolve: 1.1.1 httpxy: 0.5.5 - srvx: 0.11.22 + srvx: 1.0.3 error-ex@1.3.4: dependencies: @@ -11176,8 +11015,8 @@ snapshots: '@babel/parser': 7.29.8 eslint: 10.9.1(jiti@2.7.0) hermes-parser: 0.25.1 - zod: 4.4.3 - zod-validation-error: 4.0.2(zod@4.4.3) + zod: 4.5.4 + zod-validation-error: 4.0.2(zod@4.5.4) transitivePeerDependencies: - supports-color @@ -11265,52 +11104,13 @@ snapshots: etag@1.8.1: {} - eve@0.49.0(patch_hash=5b21e49f1a138ffa73b484505a6abc5a3540fc9ae32ff8d7101626fcc8c9d08d)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): + eve@https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz(patch_hash=c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b)(@opentelemetry/api@1.9.1)(ai@7.0.93(zod@4.5.4)): dependencies: - ai: 7.0.83(zod@4.4.3) - nitro: 3.0.260610-beta(@electric-sql/pglite@0.5.8)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + ai: 7.0.93(zod@4.5.4) + nitro: 3.0.260903-beta undici: 8.9.0 optionalDependencies: '@opentelemetry/api': 1.9.1 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@netlify/runtime' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@vercel/queue' - - aws4fetch - - better-sqlite3 - - chokidar - - dotenv - - drizzle-orm - - giget - - idb-keyval - - ioredis - - jiti - - lru-cache - - miniflare - - mongodb - - mysql2 - - rollup - - sqlite3 - - uploadthing - - vite - - wrangler - - xml2js - - zephyr-agent events-intercept@2.0.0: {} @@ -11326,14 +11126,14 @@ snapshots: dependencies: eventsource-parser: 3.1.1 - evlog@2.27.1(ai@7.0.83(zod@4.4.3))(eve@0.49.0(patch_hash=5b21e49f1a138ffa73b484505a6abc5a3540fc9ae32ff8d7101626fcc8c9d08d)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(express@5.2.1)(hono@4.13.5)(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(ofetch@2.0.0-alpha.3)(react@19.2.8)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): + evlog@2.28.1(ai@7.0.93(zod@4.5.4))(eve@https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz(patch_hash=c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b)(@opentelemetry/api@1.9.1)(ai@7.0.93(zod@4.5.4)))(express@5.2.1)(hono@4.13.5)(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(ofetch@1.5.1)(react@19.2.8)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): optionalDependencies: - ai: 7.0.83(zod@4.4.3) - eve: 0.49.0(patch_hash=5b21e49f1a138ffa73b484505a6abc5a3540fc9ae32ff8d7101626fcc8c9d08d)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + ai: 7.0.93(zod@4.5.4) + eve: https://pkg.eve.dev/59ec96cc99f65a80f7a2daf4ca5e2a0ad95455f2/eve.tgz(patch_hash=c9c91db6673be481361a99b505472040d0d7799688b5a4aab02b612b6450773b)(@opentelemetry/api@1.9.1)(ai@7.0.93(zod@4.5.4)) express: 5.2.1 hono: 4.13.5 next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - ofetch: 2.0.0-alpha.3 + ofetch: 1.5.1 react: 19.2.8 vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) @@ -11629,9 +11429,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - giget@3.3.1: - optional: true - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -11691,12 +11488,13 @@ snapshots: transitivePeerDependencies: - supports-color - h3@2.0.1-rc.22(crossws@0.4.12(srvx@0.11.22)): + h3@2.0.1-rc.31(crossws@0.4.12(srvx@1.0.3))(ocache@0.3.0): dependencies: - rou3: 0.8.1 - srvx: 0.11.22 + rou3: 0.9.2 + srvx: 1.0.3 optionalDependencies: - crossws: 0.4.12(srvx@0.11.22) + crossws: 0.4.12(srvx@1.0.3) + ocache: 0.3.0 hachure-fill@0.5.2: {} @@ -12099,7 +11897,7 @@ snapshots: tinyglobby: 0.2.17 unbash: 4.0.10 yaml: 2.9.0 - zod: 4.4.3 + zod: 4.5.4 kysely@0.29.5: {} @@ -12832,58 +12630,21 @@ snapshots: nf3@0.3.24: {} - nitro@3.0.260610-beta(@electric-sql/pglite@0.5.8)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): + nitro@3.0.260903-beta: dependencies: consola: 3.4.2 - crossws: 0.4.12(srvx@0.11.22) - db0: 0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)) - env-runner: 0.1.16 - h3: 2.0.1-rc.22(crossws@0.4.12(srvx@0.11.22)) + crossws: 0.4.12(srvx@1.0.3) + db0: 0.4.1 + env-runner: 0.2.1 + h3: 2.0.1-rc.31(crossws@0.4.12(srvx@1.0.3))(ocache@0.3.0) hookable: 6.1.1 nf3: 0.3.24 - ocache: 0.1.5 - ofetch: 2.0.0-alpha.3 - ohash: 2.0.12 - rolldown: 1.2.6 - srvx: 0.11.22 + ocache: 0.3.0 + rolldown: 1.2.7 + rou3: 0.9.2 + srvx: 1.0.3 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.7(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(chokidar@4.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)))(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3) - optionalDependencies: - dotenv: 17.4.2 - giget: 3.3.1 - jiti: 2.7.0 - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@netlify/runtime' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - better-sqlite3 - - chokidar - - drizzle-orm - - idb-keyval - - ioredis - - lru-cache - - miniflare - - mongodb - - mysql2 - - sqlite3 - - uploadthing - - wrangler + unstorage: 2.0.0-alpha.10 node-domexception@1.0.0: {} @@ -12932,9 +12693,7 @@ snapshots: obug@2.1.4: {} - ocache@0.1.5: - dependencies: - ohash: 2.0.12 + ocache@0.3.0: {} ofetch@1.5.1: dependencies: @@ -12942,10 +12701,6 @@ snapshots: node-fetch-native: 1.6.7 ufo: 1.6.4 - ofetch@2.0.0-alpha.3: {} - - ohash@2.0.12: {} - on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -12995,17 +12750,17 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@6.26.0(ws@8.21.3)(zod@4.4.3): + openai@6.26.0(ws@8.21.3)(zod@4.5.4): optionalDependencies: ws: 8.21.3 - zod: 4.4.3 + zod: 4.5.4 - openai@6.49.0(@aws-sdk/credential-provider-node@3.972.81)(@smithy/signature-v4@5.7.3)(ws@8.21.3)(zod@4.4.3): + openai@6.49.0(@aws-sdk/credential-provider-node@3.972.81)(@smithy/signature-v4@5.7.3)(ws@8.21.3)(zod@4.5.4): optionalDependencies: '@aws-sdk/credential-provider-node': 3.972.81 '@smithy/signature-v4': 5.7.3 ws: 8.21.3 - zod: 4.4.3 + zod: 4.5.4 optionator@0.9.4: dependencies: @@ -13648,28 +13403,26 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - rolldown@1.2.6: + rolldown@1.2.7: dependencies: - '@oxc-project/types': 0.147.0 + '@oxc-project/types': 0.148.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.6 - '@rolldown/binding-android-arm64': 1.2.6 - '@rolldown/binding-darwin-arm64': 1.2.6 - '@rolldown/binding-darwin-x64': 1.2.6 - '@rolldown/binding-freebsd-x64': 1.2.6 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.6 - '@rolldown/binding-linux-arm64-gnu': 1.2.6 - '@rolldown/binding-linux-arm64-musl': 1.2.6 - '@rolldown/binding-linux-ppc64-gnu': 1.2.6 - '@rolldown/binding-linux-s390x-gnu': 1.2.6 - '@rolldown/binding-linux-x64-gnu': 1.2.6 - '@rolldown/binding-linux-x64-musl': 1.2.6 - '@rolldown/binding-openharmony-arm64': 1.2.6 - '@rolldown/binding-win32-arm64-msvc': 1.2.6 - '@rolldown/binding-win32-x64-msvc': 1.2.6 - - rou3@0.8.1: {} + '@rolldown/binding-android-arm-eabi': 1.2.7 + '@rolldown/binding-android-arm64': 1.2.7 + '@rolldown/binding-darwin-arm64': 1.2.7 + '@rolldown/binding-darwin-x64': 1.2.7 + '@rolldown/binding-freebsd-x64': 1.2.7 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.7 + '@rolldown/binding-linux-arm64-gnu': 1.2.7 + '@rolldown/binding-linux-arm64-musl': 1.2.7 + '@rolldown/binding-linux-ppc64-gnu': 1.2.7 + '@rolldown/binding-linux-s390x-gnu': 1.2.7 + '@rolldown/binding-linux-x64-gnu': 1.2.7 + '@rolldown/binding-linux-x64-musl': 1.2.7 + '@rolldown/binding-openharmony-arm64': 1.2.7 + '@rolldown/binding-win32-arm64-msvc': 1.2.7 + '@rolldown/binding-win32-x64-msvc': 1.2.7 rou3@0.9.2: {} @@ -13708,7 +13461,7 @@ snapshots: async-retry: 1.3.3 debug: 4.4.3 ws: 8.21.3 - zod: 4.4.3 + zod: 4.5.4 transitivePeerDependencies: - bare-abort-controller - bufferutil @@ -13912,7 +13665,7 @@ snapshots: srvx@0.11.16: {} - srvx@0.11.22: {} + srvx@1.0.3: {} stackback@0.0.2: {} @@ -14277,14 +14030,7 @@ snapshots: unpipe@1.0.0: {} - unstorage@2.0.0-alpha.7(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3))(chokidar@4.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)))(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3): - optionalDependencies: - '@vercel/blob': 2.8.0 - '@vercel/functions': 3.9.5(@aws-sdk/credential-provider-web-identity@3.972.76)(ws@8.21.3) - chokidar: 4.0.0 - db0: 0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)) - lru-cache: 11.5.2 - ofetch: 2.0.0-alpha.3 + unstorage@2.0.0-alpha.10: {} update-browserslist-db@1.3.1(browserslist@4.28.8): dependencies: @@ -14408,7 +14154,7 @@ snapshots: lightningcss: 1.33.0 picomatch: 4.0.7 postcss: 8.5.26 - rolldown: 1.2.6 + rolldown: 1.2.7 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.13.3 @@ -14547,13 +14293,13 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.25.2(zod@4.4.3): + zod-to-json-schema@3.25.2(zod@4.5.4): dependencies: - zod: 4.4.3 + zod: 4.5.4 - zod-validation-error@4.0.2(zod@4.4.3): + zod-validation-error@4.0.2(zod@4.5.4): dependencies: - zod: 4.4.3 + zod: 4.5.4 zod@3.22.4: {} @@ -14561,6 +14307,6 @@ snapshots: zod@4.1.11: {} - zod@4.4.3: {} + zod@4.5.4: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index eac9b0b5..2999eb97 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -22,4 +22,5 @@ allowBuilds: sharp: true patchedDependencies: "@linqapp/chat-sdk-adapter@0.5.1": patches/@linqapp__chat-sdk-adapter@0.5.1.patch - eve@0.49.0: patches/eve@0.49.0.patch + # URL dependencies are patched by name; package.json pins the immutable source SHA. + eve: patches/eve@0.52.2+main.59ec96cc99f65a80.patch diff --git a/tests/agent-tool-boundaries.test.ts b/tests/agent-tool-boundaries.test.ts index cc0da449..df4b1a45 100644 --- a/tests/agent-tool-boundaries.test.ts +++ b/tests/agent-tool-boundaries.test.ts @@ -1,5 +1,6 @@ import { existsSync, readFileSync, readdirSync } from "node:fs"; import { describe, expect, it } from "vitest"; +import rootAgent from "@agent/agent"; const rootTools = "agent/tools"; const rootMemory = "agent/memory/profile.ts"; @@ -18,20 +19,19 @@ function toolFiles(directory: string, root = directory): string[] { describe("root and worker capability boundaries", () => { it("keeps root coordination separate from browser execution", () => { + expect(rootAgent.defaultTools).toBe(false); expect(toolFiles(rootTools)).toEqual([ - "agent.ts", - "bash.ts", + "ask_question.ts", "calendar.ts", - "connection_search.ts", "contacts.ts", "gmail.ts", - "load_skill.ts", "messaging.ts", - "read_file.ts", "schedules.ts", - "todo.ts", + "task_cancel.ts", + "task_update.ts", "vault.ts", - "write_file.ts", + "web_fetch.ts", + "web_search.ts", ]); expect(existsSync(`${rootTools}/sendMessage.ts`)).toBe(false); expect(existsSync("agent/extensions/kernel/extension.ts")).toBe(false); @@ -39,21 +39,6 @@ describe("root and worker capability boundaries", () => { false ); expect(existsSync("agent/skills/browser-execution/SKILL.md")).toBe(false); - expect(readFileSync(`${rootTools}/agent.ts`, "utf8")).toContain( - "disableTool()" - ); - for (const tool of [ - "bash", - "connection_search", - "load_skill", - "read_file", - "todo", - "write_file", - ]) { - expect(readFileSync(`${rootTools}/${tool}.ts`, "utf8")).toContain( - "disableTool()" - ); - } const rootInstructions = readFileSync( "agent/instructions/content/role/interactive.md", "utf8" @@ -75,45 +60,24 @@ describe("root and worker capability boundaries", () => { it("gives worker the browser and opaque-vault tools without messaging", () => { expect(toolFiles(workerTools)).toEqual([ - "ask_question.ts", - "bash.ts", "capture_browser_image.ts", "computer_action.ts", "fill_from_vault.ts", "list_vault.ts", - "load_skill.ts", "manage_browsers.ts", "personal_info.ts", - "read_file.ts", "semantic_browser.ts", - "todo.ts", - "web_fetch.ts", - "web_search.ts", - "write_file.ts", + "task_cancel.ts", + "task_update.ts", ]); expect(existsSync(`${workerRoot}/tools/sendMessage.ts`)).toBe(false); expect(existsSync(`${workerRoot}/tools/request_vault_setup.ts`)).toBe( false ); - expect(readFileSync(`${workerTools}/ask_question.ts`, "utf8")).toContain( - "disableTool()" - ); + expect(existsSync(`${workerTools}/ask_question.ts`)).toBe(false); expect(readFileSync(`${workerTools}/personal_info.ts`, "utf8")).toContain( "disableTool()" ); - for (const tool of [ - "bash", - "load_skill", - "read_file", - "todo", - "web_fetch", - "web_search", - "write_file", - ]) { - expect(readFileSync(`${workerTools}/${tool}.ts`, "utf8")).toContain( - "disableTool()" - ); - } expect(existsSync(`${workerRoot}/extensions/kernel/extension.ts`)).toBe( false ); diff --git a/tests/agent/channels/eve-channel-auth.test.ts b/tests/agent/channels/eve-channel-auth.test.ts index 5f0cda25..90f7b6ce 100644 --- a/tests/agent/channels/eve-channel-auth.test.ts +++ b/tests/agent/channels/eve-channel-auth.test.ts @@ -73,6 +73,44 @@ describe("Eve channel authentication", () => { ); }); + it.each([ + [ + "GET", + "/eve/v1/connections/:name/callback/:attemptId/:token", + "/eve/v1/connections/google/callback/attempt/wrun_victim:auth", + ], + [ + "POST", + "/eve/v1/connections/:name/callback/:attemptId/:token", + "/eve/v1/connections/google/callback/attempt/wrun_victim:auth", + ], + [ + "GET", + "/eve/v1/connections/:name/callback/:token", + "/eve/v1/connections/google/callback/wrun_victim:auth", + ], + [ + "POST", + "/eve/v1/connections/:name/callback/:token", + "/eve/v1/connections/google/callback/wrun_victim:auth", + ], + ] as const)( + "guards %s %s before invoking the callback", + async (method, pattern, path) => { + const route = findRoute(method, pattern); + const pending = route.handler( + new Request(`https://assistant.example${path}`, { method }), + unexpectedRouteContext() + ); + await vi.runAllTimersAsync(); + expect((await pending).status).toBe(403); + expect(isSessionOwnedMock).toHaveBeenCalledWith( + expect.objectContaining({ userId: "better-auth:user-1" }), + "wrun_victim" + ); + } + ); + it("fails closed on routes whose subject cannot be resolved", async () => { const route = findRoute("POST", "/eve/v1/task-input/:token"); diff --git a/tests/agent/channels/linq-bundled-adapter.test.ts b/tests/agent/channels/linq-bundled-adapter.test.ts new file mode 100644 index 00000000..6456275f --- /dev/null +++ b/tests/agent/channels/linq-bundled-adapter.test.ts @@ -0,0 +1,55 @@ +import type * as LinqAdapter from "@linqapp/chat-sdk-adapter"; +import { describe, expect, it, vi } from "vitest"; + +// Exercise the adapter Eve actually loads, not only the separately installed +// adapter used for its public declarations and application-level tests. +const { createLinqAdapter } = await vi.importActual( + new URL( + "./compiled/@linqapp/chat-sdk-adapter/index.js", + import.meta.resolve("eve") + ).pathname +); + +describe("Eve bundled Linq adapter", () => { + it("preserves native reply, media, and idempotency fields in the outgoing request", async () => { + const fetch = vi.spyOn(globalThis, "fetch").mockResolvedValue( + Response.json({ + chat_id: "chat-1", + message: { id: "message-1" }, + }) + ); + const adapter = createLinqAdapter({ + apiKey: "test-key", + baseURL: "https://linq.test", + signingSecret: "test-secret", + }); + try { + await adapter.postMessage( + adapter.encodeThreadId({ chatId: "chat-1" }), + { + raw: "Here it is.", + attachments: [ + { type: "image", url: "https://media.example/room.png" }, + ], + }, + { replyToMessageId: "original-message", idempotencyKey: "hotel-result" } + ); + expect(fetch).toHaveBeenCalledOnce(); + const [input, init] = fetch.mock.calls[0] ?? []; + const request = + input instanceof Request ? input.clone() : new Response(init?.body); + await expect(request.json()).resolves.toEqual({ + message: { + parts: [ + { type: "text", value: "Here it is." }, + { type: "media", url: "https://media.example/room.png" }, + ], + reply_to: { message_id: "original-message" }, + idempotency_key: "hotel-result", + }, + }); + } finally { + fetch.mockRestore(); + } + }); +}); diff --git a/tests/agent/subagents/browser-agent/hooks/browser-trace-telemetry.test.ts b/tests/agent/subagents/browser-agent/hooks/browser-trace-telemetry.test.ts index c45341d1..530d1923 100644 --- a/tests/agent/subagents/browser-agent/hooks/browser-trace-telemetry.test.ts +++ b/tests/agent/subagents/browser-agent/hooks/browser-trace-telemetry.test.ts @@ -238,6 +238,32 @@ describe("trace event persistence", () => { ); }); + it("labels durable workflow tool calls in the trace", async () => { + await fire("*", { + data: { + actions: [ + { + callId: "workflow-call", + input: {}, + kind: "workflow-tool-call", + toolName: "check_availability", + workflowId: "workflow-hotel", + }, + ], + sequence: 0, + stepIndex: 1, + turnId: "turn_0", + }, + meta: { at: "2026-08-31T00:00:02.000Z", id: "workflow-event" }, + type: "actions.requested", + }); + expect(mocks.recordBrowserTraceEvents).toHaveBeenCalledWith( + scope, + "worker-session-1", + [expect.objectContaining({ label: "check_availability" })] + ); + }); + it("compacts oversized payloads before persisting", async () => { await fire("*", { data: { diff --git a/tests/worker-input-bubbling.test.ts b/tests/worker-input-bubbling.test.ts index 28b96c35..9e47d547 100644 --- a/tests/worker-input-bubbling.test.ts +++ b/tests/worker-input-bubbling.test.ts @@ -1,14 +1,24 @@ -import { readFileSync } from "node:fs"; +import { existsSync, readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; +import browserAgent from "@agent/subagents/browser-agent/agent"; describe("worker input bubbling", () => { - it("keeps native questions disabled inside browser workers", () => { - const askQuestionTool = readFileSync( - "agent/subagents/browser-agent/tools/ask_question.ts", - "utf8" + it("keeps native questions disabled inside browser workers", async () => { + const worker = await browserAgent.events["turn.started"]?.( + {}, + { + channel: { kind: "channel:linq", metadata: {} }, + messages: [], + session: { + auth: { current: null, initiator: null }, + id: "worker-test", + }, + } ); - - expect(askQuestionTool).toMatch(/disableTool\(\)/); + expect(worker?.defaultTools).toBe(false); + expect( + existsSync("agent/subagents/browser-agent/tools/ask_question.ts") + ).toBe(false); }); it("ends the worker turn and routes the answer through its agent id", () => { From 614a9df32495627d6ff6c5da4a87e75106c2221f Mon Sep 17 00:00:00 2001 From: Mason Hall Date: Tue, 8 Sep 2026 12:59:53 -0400 Subject: [PATCH 2/2] Preserve dynamic worker tool exclusions and verify runtime selection --- agent/subagents/browser-agent/agent.ts | 1 - .../browser-agent/tools/ask_question.ts | 3 ++ agent/subagents/browser-agent/tools/bash.ts | 3 ++ .../browser-agent/tools/load_skill.ts | 3 ++ .../browser-agent/tools/read_file.ts | 3 ++ .../browser-agent/tools/task_cancel.ts | 1 - .../browser-agent/tools/task_update.ts | 1 - agent/subagents/browser-agent/tools/todo.ts | 3 ++ .../browser-agent/tools/web_fetch.ts | 3 ++ .../browser-agent/tools/web_search.ts | 3 ++ .../browser-agent/tools/write_file.ts | 3 ++ tests/agent-tool-boundaries.test.ts | 27 ++++++++++-- tests/worker-input-bubbling.test.ts | 42 +++++++++++++++---- 13 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 agent/subagents/browser-agent/tools/ask_question.ts create mode 100644 agent/subagents/browser-agent/tools/bash.ts create mode 100644 agent/subagents/browser-agent/tools/load_skill.ts create mode 100644 agent/subagents/browser-agent/tools/read_file.ts delete mode 100644 agent/subagents/browser-agent/tools/task_cancel.ts delete mode 100644 agent/subagents/browser-agent/tools/task_update.ts create mode 100644 agent/subagents/browser-agent/tools/todo.ts create mode 100644 agent/subagents/browser-agent/tools/web_fetch.ts create mode 100644 agent/subagents/browser-agent/tools/web_search.ts create mode 100644 agent/subagents/browser-agent/tools/write_file.ts diff --git a/agent/subagents/browser-agent/agent.ts b/agent/subagents/browser-agent/agent.ts index f98ba2c2..0cbd52af 100644 --- a/agent/subagents/browser-agent/agent.ts +++ b/agent/subagents/browser-agent/agent.ts @@ -9,7 +9,6 @@ export default defineDynamic({ events: { "turn.started": (_event, context) => { const worker = defineAgent({ - defaultTools: false, description: "Execute one bounded browser assignment for the root coordinator, including secure vault autofill, transaction preparation, optional durable browser images, human-takeover handoff, cleanup, and a concise verified result. Every initial and resumed call must include the task-completion outputSchema required by the root instructions.", model: "zai/glm-5.2", diff --git a/agent/subagents/browser-agent/tools/ask_question.ts b/agent/subagents/browser-agent/tools/ask_question.ts new file mode 100644 index 00000000..04bd0544 --- /dev/null +++ b/agent/subagents/browser-agent/tools/ask_question.ts @@ -0,0 +1,3 @@ +import { disableTool } from "eve/tools"; + +export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/bash.ts b/agent/subagents/browser-agent/tools/bash.ts new file mode 100644 index 00000000..04bd0544 --- /dev/null +++ b/agent/subagents/browser-agent/tools/bash.ts @@ -0,0 +1,3 @@ +import { disableTool } from "eve/tools"; + +export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/load_skill.ts b/agent/subagents/browser-agent/tools/load_skill.ts new file mode 100644 index 00000000..04bd0544 --- /dev/null +++ b/agent/subagents/browser-agent/tools/load_skill.ts @@ -0,0 +1,3 @@ +import { disableTool } from "eve/tools"; + +export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/read_file.ts b/agent/subagents/browser-agent/tools/read_file.ts new file mode 100644 index 00000000..04bd0544 --- /dev/null +++ b/agent/subagents/browser-agent/tools/read_file.ts @@ -0,0 +1,3 @@ +import { disableTool } from "eve/tools"; + +export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/task_cancel.ts b/agent/subagents/browser-agent/tools/task_cancel.ts deleted file mode 100644 index 66342e81..00000000 --- a/agent/subagents/browser-agent/tools/task_cancel.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "eve/tools/task_cancel"; diff --git a/agent/subagents/browser-agent/tools/task_update.ts b/agent/subagents/browser-agent/tools/task_update.ts deleted file mode 100644 index 6dbdff31..00000000 --- a/agent/subagents/browser-agent/tools/task_update.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "eve/tools/task_update"; diff --git a/agent/subagents/browser-agent/tools/todo.ts b/agent/subagents/browser-agent/tools/todo.ts new file mode 100644 index 00000000..04bd0544 --- /dev/null +++ b/agent/subagents/browser-agent/tools/todo.ts @@ -0,0 +1,3 @@ +import { disableTool } from "eve/tools"; + +export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/web_fetch.ts b/agent/subagents/browser-agent/tools/web_fetch.ts new file mode 100644 index 00000000..04bd0544 --- /dev/null +++ b/agent/subagents/browser-agent/tools/web_fetch.ts @@ -0,0 +1,3 @@ +import { disableTool } from "eve/tools"; + +export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/web_search.ts b/agent/subagents/browser-agent/tools/web_search.ts new file mode 100644 index 00000000..04bd0544 --- /dev/null +++ b/agent/subagents/browser-agent/tools/web_search.ts @@ -0,0 +1,3 @@ +import { disableTool } from "eve/tools"; + +export default disableTool(); diff --git a/agent/subagents/browser-agent/tools/write_file.ts b/agent/subagents/browser-agent/tools/write_file.ts new file mode 100644 index 00000000..04bd0544 --- /dev/null +++ b/agent/subagents/browser-agent/tools/write_file.ts @@ -0,0 +1,3 @@ +import { disableTool } from "eve/tools"; + +export default disableTool(); diff --git a/tests/agent-tool-boundaries.test.ts b/tests/agent-tool-boundaries.test.ts index df4b1a45..e09da4db 100644 --- a/tests/agent-tool-boundaries.test.ts +++ b/tests/agent-tool-boundaries.test.ts @@ -60,24 +60,45 @@ describe("root and worker capability boundaries", () => { it("gives worker the browser and opaque-vault tools without messaging", () => { expect(toolFiles(workerTools)).toEqual([ + "ask_question.ts", + "bash.ts", "capture_browser_image.ts", "computer_action.ts", "fill_from_vault.ts", "list_vault.ts", + "load_skill.ts", "manage_browsers.ts", "personal_info.ts", + "read_file.ts", "semantic_browser.ts", - "task_cancel.ts", - "task_update.ts", + "todo.ts", + "web_fetch.ts", + "web_search.ts", + "write_file.ts", ]); expect(existsSync(`${workerRoot}/tools/sendMessage.ts`)).toBe(false); expect(existsSync(`${workerRoot}/tools/request_vault_setup.ts`)).toBe( false ); - expect(existsSync(`${workerTools}/ask_question.ts`)).toBe(false); + expect(readFileSync(`${workerTools}/ask_question.ts`, "utf8")).toContain( + "disableTool()" + ); expect(readFileSync(`${workerTools}/personal_info.ts`, "utf8")).toContain( "disableTool()" ); + for (const tool of [ + "bash", + "load_skill", + "read_file", + "todo", + "web_fetch", + "web_search", + "write_file", + ]) { + expect(readFileSync(`${workerTools}/${tool}.ts`, "utf8")).toContain( + "disableTool()" + ); + } expect(existsSync(`${workerRoot}/extensions/kernel/extension.ts`)).toBe( false ); diff --git a/tests/worker-input-bubbling.test.ts b/tests/worker-input-bubbling.test.ts index 9e47d547..919cab79 100644 --- a/tests/worker-input-bubbling.test.ts +++ b/tests/worker-input-bubbling.test.ts @@ -1,9 +1,34 @@ -import { existsSync, readFileSync } from "node:fs"; -import { describe, expect, it } from "vitest"; +import type * as RuntimeSubagentConfig from "../node_modules/eve/dist/src/runtime/subagents/dynamic-agent-config.js"; +import type * as RuntimeContext from "../node_modules/eve/dist/src/context/container.js"; +import { readFileSync } from "node:fs"; +import { describe, expect, it, vi } from "vitest"; import browserAgent from "@agent/subagents/browser-agent/agent"; +// Use the same normalization boundary as real delegation; calling the authored +// resolver alone does not validate which fields Eve accepts at runtime. +const { normalizeDynamicSubagentAgentConfig } = await vi.importActual< + typeof RuntimeSubagentConfig +>( + new URL( + "./runtime/subagents/dynamic-agent-config.js", + import.meta.resolve("eve") + ).pathname +); +const { ContextContainer } = await vi.importActual( + new URL("./context/container.js", import.meta.resolve("eve")).pathname +); + describe("worker input bubbling", () => { - it("keeps native questions disabled inside browser workers", async () => { + it("keeps native questions disabled inside browser workers", () => { + const askQuestionTool = readFileSync( + "agent/subagents/browser-agent/tools/ask_question.ts", + "utf8" + ); + + expect(askQuestionTool).toMatch(/disableTool\(\)/); + }); + + it("accepts the selected browser worker through Eve's runtime normalization", async () => { const worker = await browserAgent.events["turn.started"]?.( {}, { @@ -15,10 +40,13 @@ describe("worker input bubbling", () => { }, } ); - expect(worker?.defaultTools).toBe(false); - expect( - existsSync("agent/subagents/browser-agent/tools/ask_question.ts") - ).toBe(false); + await expect( + normalizeDynamicSubagentAgentConfig({ + name: "browser-agent", + value: worker, + state: new ContextContainer(), + }) + ).resolves.toMatchObject({ model: { id: "zai/glm-5.2" } }); }); it("ends the worker turn and routes the answer through its agent id", () => {