@wakeshift/sdk 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/host.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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","sourcesContent":["// What attach needs of an MCP server, for each MCP TypeScript SDK it takes:\n// @modelcontextprotocol/sdk 1.x and @modelcontextprotocol/server 2.x. The\n// rest of the SDK (events.ts, toolcall.ts, tasks.ts, discover.ts) is\n// written once against Host, and neither MCP SDK is imported here: hostOf\n// tells them apart by the server object it's given.\n//\n// Where the two differ:\n// - a request's context: 1.x's `extra` (_meta, requestInfo.headers,\n// authInfo, signal), 2.x's `ctx` (mcpReq._meta without the reserved\n// io.modelcontextprotocol/* keys, which it lifts into mcpReq.envelope;\n// http.req's Headers; http.authInfo; mcpReq.signal). req() reads either\n// into one shape, putting the envelope's keys back into _meta, so\n// Wakeshift gets the same call from both (test/mcp-tasks-wire.json);\n// - custom methods (events/*): a zod request schema on 1.x, a method name\n// and a params schema on 2.x;\n// - tasks/get and tasks/cancel: 2.x answers them on protocol 2026-07-28\n// only for a handler registered with a params schema (the tasks\n// extension's methods), so setTaskMethod registers them that way;\n// - protocol 2026-07-28: 1.x doesn't speak it, so discover.ts teaches it;\n// 2.x speaks it itself (server/discover, resultType, ttlMs and\n// cacheScope).\n//\n// Both keep their request handlers in a private Map (_requestHandlers),\n// which tools/list, tools/call, server/discover and tasks/* are wrapped\n// through (neither has public middleware for a method it answers itself),\n// and their tools in _registeredTools, which wrapped tools are checked\n// against. Unit tests pin both against each SDK the CI installs.\n\nimport { z } from \"zod\";\nimport * as z4 from \"zod/v4\";\nimport type { AuthInfo, CallToolResult, McpServerLike } from \"./mcp.js\";\nimport { normalizeObjectSchema, safeParseAsync, type AnySchema, type ZodRawShapeCompat } from \"./zod.js\";\n\n/** @internal A request handler as both SDKs keep them: the request, and the SDK's own context. */\nexport type Handler = (request: any, raw: any) => Promise<any>;\n\n/** @internal One request's context, read the same way from either SDK. */\nexport interface Req {\n /** The request's _meta, with 2.x's lifted envelope keys put back. */\n meta: Record<string, unknown> | undefined;\n /** An HTTP header of the request (\"\" if none, or not over HTTP). */\n header(name: string): string;\n authInfo: AuthInfo | undefined;\n signal: AbortSignal | undefined;\n}\n\n/** @internal A registered tool as the wrapper reads it. */\nexport interface RegisteredToolInternal {\n inputSchema?: unknown;\n outputSchema?: unknown;\n handler?: unknown;\n callback?: unknown;\n}\n\n/** @internal One of attach's own tools' registration. */\nexport interface ToolRegistration {\n description: string;\n /** A zod shape, in the API host.zod gives. */\n inputSchema: ZodRawShapeCompat;\n annotations?: Record<string, unknown>;\n}\n\n/** @internal The zod API attach's own tool schemas are written in. */\nexport type ZodApi = { string(): any; record(k: any, v: any): any; any(): any; enum(values: readonly [string, ...string[]]): any };\n\n/** @internal What attach needs of an MCP server. */\nexport interface Host {\n /** The MCP SDK's major version: 1 (@modelcontextprotocol/sdk) or 2 (@modelcontextprotocol/server). */\n readonly version: 1 | 2;\n readonly server: McpServerLike;\n /** The zod attach's own tools are written with: zod 4 for 2.x, which takes only zod 4. */\n readonly zod: ZodApi;\n /** A request's context, from the SDK's own (extra or ctx), or one already read. */\n req(raw: unknown): Req;\n registerCapabilities(capabilities: Record<string, unknown>): void;\n registerTool(name: string, config: ToolRegistration, cb: (args: Record<string, unknown>, raw: unknown) => Promise<CallToolResult>): { enable(): void; disable(): void };\n /** A JSON-RPC method of Wakeshift's own (events/*): its handler gets the request's params. */\n setMethod(method: string, handler: (params: Record<string, any>, raw: unknown) => Promise<unknown>): void;\n /** Makes the SDK route tasks/get or tasks/cancel on every protocol revision; the caller then sets its handler in handlers(). */\n setTaskMethod(method: string): void;\n /** The SDK's request handlers, or null if this SDK keeps them where Wakeshift can't wrap them. */\n handlers(): Map<string, Handler> | null;\n /** The client's name from initialize (or, on 2.x, the request's envelope). */\n clientName(): string | undefined;\n /** The client's capabilities from initialize (or, on 2.x, the request's envelope). */\n clientCapabilities(): Record<string, unknown> | undefined;\n /** Runs fn after a client's initialized notification, after any earlier hook. */\n onInitialized(fn: () => void): void;\n /** A registered tool (undefined: none by that name; null: the SDK keeps them where Wakeshift can't read them). */\n registeredTool(name: string): RegisteredToolInternal | undefined | null;\n /** Whether a tools/call result passes the tool's output schema, as the SDK checks it after the callback returns. */\n validOutput(outputSchema: unknown, result: CallToolResult | string): Promise<boolean>;\n}\n\nconst VERSION_META = \"io.modelcontextprotocol/protocolVersion\";\n\nfunction lowOf(server: McpServerLike): any {\n return (server as { server?: unknown }).server;\n}\n\n/**\n * @internal The Host for an McpServer from either SDK. 2.x's low-level\n * Server has projectCallToolResult, which 1.x's lacks.\n */\nexport function hostOf(server: unknown): Host {\n const low = (server as { server?: any } | null)?.server;\n if (!low || typeof low.setRequestHandler !== \"function\" || typeof (server as { registerTool?: unknown }).registerTool !== \"function\") {\n throw new Error(\n \"wakeshift: attach takes an McpServer, from @modelcontextprotocol/server 2.x or @modelcontextprotocol/sdk 1.x (@modelcontextprotocol/sdk/server/mcp.js)\",\n );\n }\n return typeof low.projectCallToolResult === \"function\" ? new V2Host(server as McpServerLike) : new V1Host(server as McpServerLike);\n}\n\n// headerOf reads a header from a plain record (1.x's requestInfo.headers).\nfunction headerOf(headers: Record<string, string | string[] | undefined> | undefined, name: string): string {\n if (!headers) return \"\";\n const v = headers[name] ?? headers[name.toLowerCase()];\n return (Array.isArray(v) ? v[0] : v) ?? \"\";\n}\n\n/** @internal A context already read (req's output). */\nfunction isReq(raw: unknown): raw is Req {\n return !!raw && typeof (raw as Req).header === \"function\" && \"meta\" in (raw as object);\n}\n\n/**\n * @internal A request's context read the 1.x way: extra's _meta,\n * requestInfo.headers, authInfo and signal. Also what a plain\n * `{ _meta, requestInfo }` (ToolExtra) reads as.\n */\nexport function v1Req(raw: unknown): Req {\n if (isReq(raw)) return raw;\n const e = (raw ?? {}) as { _meta?: Record<string, unknown>; requestInfo?: { headers?: Record<string, string | string[] | undefined> }; authInfo?: AuthInfo; signal?: AbortSignal };\n return { meta: e._meta, header: (name) => headerOf(e.requestInfo?.headers, name), authInfo: e.authInfo, signal: e.signal };\n}\n\n/** @internal A request's context read the 2.x way (ctx), putting the envelope's keys back into _meta. */\nexport function v2Req(raw: unknown): Req {\n if (isReq(raw)) return raw;\n const c = (raw ?? {}) as {\n mcpReq?: { _meta?: Record<string, unknown>; envelope?: Record<string, unknown>; signal?: AbortSignal };\n http?: { authInfo?: AuthInfo; req?: { headers?: { get(name: string): string | null } } };\n // A 1.x-shaped context (a test's, or one passed through by hand) reads too.\n _meta?: Record<string, unknown>;\n requestInfo?: { headers?: Record<string, string | string[] | undefined> };\n };\n if (!c.mcpReq) return v1Req(raw);\n const own = c.mcpReq._meta;\n const env = c.mcpReq.envelope;\n const meta = env && Object.keys(env).length > 0 ? { ...env, ...own } : own;\n const headers = c.http?.req?.headers;\n return {\n meta,\n header: (name) => (headers && typeof headers.get === \"function\" ? (headers.get(name) ?? \"\") : \"\"),\n authInfo: c.http?.authInfo,\n signal: c.mcpReq.signal,\n };\n}\n\nabstract class BaseHost {\n constructor(readonly server: McpServerLike) {}\n protected get low(): any {\n return lowOf(this.server);\n }\n registerCapabilities(capabilities: Record<string, unknown>): void {\n this.low.registerCapabilities(capabilities);\n }\n handlers(): Map<string, Handler> | null {\n const h = this.low._requestHandlers;\n return h instanceof Map ? (h as Map<string, Handler>) : null;\n }\n clientName(): string | undefined {\n return this.low.getClientVersion?.()?.name || undefined;\n }\n clientCapabilities(): Record<string, unknown> | undefined {\n return this.low.getClientCapabilities?.() as Record<string, unknown> | undefined;\n }\n onInitialized(fn: () => void): void {\n const low = this.low;\n const prev = low.oninitialized as (() => void) | undefined;\n low.oninitialized = () => {\n fn();\n prev?.();\n };\n }\n registeredTool(name: string): RegisteredToolInternal | undefined | null {\n const tools = (this.server as unknown as { _registeredTools?: Record<string, RegisteredToolInternal> })._registeredTools;\n if (!tools || typeof tools !== \"object\") return null;\n return Object.prototype.hasOwnProperty.call(tools, name) ? tools[name] : undefined;\n }\n}\n\nclass V1Host extends BaseHost implements Host {\n readonly version = 1 as const;\n readonly zod: ZodApi = z as unknown as ZodApi;\n req(raw: unknown): Req {\n return v1Req(raw);\n }\n registerTool(name: string, config: ToolRegistration, cb: (args: Record<string, unknown>, raw: unknown) => Promise<CallToolResult>) {\n return (this.server as any).registerTool(name, config, cb);\n }\n setMethod(method: string, handler: (params: Record<string, any>, raw: unknown) => Promise<unknown>): void {\n const schema = z.object({ method: z.literal(method), params: z.any().optional() });\n this.low.setRequestHandler(schema, (request: { params?: Record<string, any> }, extra: unknown) => handler(request.params ?? {}, extra));\n }\n setTaskMethod(_method: string): void {\n // Nothing to register: 1.x routes whatever is in its handler map. (Its\n // setRequestHandler would ask for its own tasks capability, an older\n // revision's, never advertised.)\n }\n async validOutput(outputSchema: unknown, result: CallToolResult | string): Promise<boolean> {\n // McpServer 1.x's validateToolOutput: an object schema, and structured content that parses.\n if (!outputSchema) return true;\n if (typeof result === \"string\" || !result.structuredContent) return false;\n const obj = normalizeObjectSchema(outputSchema);\n if (!obj) return true;\n return (await safeParseAsync(obj as AnySchema, result.structuredContent)).success;\n }\n}\n\nclass V2Host extends BaseHost implements Host {\n readonly version = 2 as const;\n readonly zod: ZodApi = z4 as unknown as ZodApi;\n req(raw: unknown): Req {\n return v2Req(raw);\n }\n registerTool(name: string, config: ToolRegistration, cb: (args: Record<string, unknown>, raw: unknown) => Promise<CallToolResult>) {\n // 2.x takes an object schema (a bare shape is deprecated there).\n return (this.server as any).registerTool(name, { ...config, inputSchema: objectFromV4Shape(config.inputSchema) }, cb);\n }\n setMethod(method: string, handler: (params: Record<string, any>, raw: unknown) => Promise<unknown>): void {\n this.low.setRequestHandler(method, { params: z4.looseObject({}) }, (params: Record<string, any>, ctx: unknown) => handler(params ?? {}, ctx));\n }\n setTaskMethod(method: string): void {\n // Registered with a params schema, so 2.x serves it on protocol\n // 2026-07-28 too, as the tasks extension's method (SEP-2663). The\n // caller replaces the handler that leaves in the map.\n this.low.setRequestHandler(method, { params: z4.looseObject({}) }, async () => {\n throw Object.assign(new Error(\"Method not found\"), { code: -32601 });\n });\n }\n async validOutput(outputSchema: unknown, result: CallToolResult | string): Promise<boolean> {\n // McpServer 2.x's validateToolOutput: structured content (any JSON\n // value) that the output schema (a Standard Schema) accepts.\n if (!outputSchema) return true;\n if (typeof result === \"string\" || result.structuredContent === undefined) return false;\n const std = (outputSchema as { \"~standard\"?: { validate(v: unknown): unknown } })[\"~standard\"];\n if (!std || typeof std.validate !== \"function\") return true;\n const out = (await std.validate(result.structuredContent)) as { issues?: unknown };\n return !out.issues;\n }\n}\n\n// objectFromV4Shape is a zod 4 object of attach's own tool shapes (written\n// with zod/v4: host.zod).\nfunction objectFromV4Shape(shape: ZodRawShapeCompat): unknown {\n const values = Object.values(shape);\n if (values.length === 0) return z4.object({});\n return z4.object(shape as Record<string, z4.ZodType>);\n}\n\n/** The protocol revision that has server/discover, MCP Events and the tasks extension. */\nexport const STATELESS_VERSION = \"2026-07-28\";\n\n/** @internal Whether a request is protocol 2026-07-28: its _meta names it, or its MCP-Protocol-Version header does. */\nexport function is2026(req: Req): boolean {\n if (req.meta?.[VERSION_META] === STATELESS_VERSION) return true;\n return req.header(\"mcp-protocol-version\") === STATELESS_VERSION;\n}\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,EACX,gBAAgB,GAajB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAe,MAAM,UAAU,CAAC;AAChE,OAAO,EACL,SAAS,EACT,SAAS,EACT,eAAe,EACf,0BAA0B,EAC1B,4BAA4B,EAC5B,qBAAqB,EACrB,aAAa,EAMb,wBAAwB,GAKzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,SAAS,GAmBV,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC","sourcesContent":["export {\n Wakeshift,\n DEFAULT_CORE,\n SESSION_ARG,\n HARNESS_ARG,\n CONVERSATION_ARG,\n type WakeshiftOptions,\n type AppInfo,\n type Duration,\n type Recognized,\n type Emitted,\n type Recipient,\n type Via,\n type PublishUrl,\n type ToolExtra,\n type Manifest,\n type AgentScope,\n type ScopeEvent,\n} from \"./wakeshift.js\";\nexport { harnessAgent } from \"./harness.js\";\nexport { WakeshiftError, isCode } from \"./errors.js\";\nexport { parseKey, signAssertion, type AppKey } from \"./key.js\";\nexport {\n WakeEvent,\n ArgsError,\n EVENT_TOOL_TEXT,\n SUBSCRIBE_TOOL_DESCRIPTION,\n UNSUBSCRIBE_TOOL_DESCRIPTION,\n LIST_TOOL_DESCRIPTION,\n BUILTIN_TOOLS,\n type BuiltinTool,\n type EventOptions,\n type EmitOptions,\n type EventStatus,\n type EventSubscriptionStatus,\n MAX_STATUS_SUBSCRIPTIONS,\n type EventTypeManifest,\n type AttachOptions,\n type Identity,\n type Subscriber,\n} from \"./events.js\";\nexport {\n CallEnded,\n type Attached,\n type AppArgs,\n type EventsOptions,\n type Subscription,\n type ToolCall,\n type ToolCallExtra,\n type ToolSubscribeOptions,\n type WakeArgs,\n type WakeInputs,\n type WakeInputsV3,\n type WakeInputsV4,\n type WakeKey,\n type WakeOutputShape,\n type WakeOutputV3,\n type WakeOutputV4,\n type WakeShape,\n type WrappedCallback,\n type WrappedResult,\n} from \"./toolcall.js\";\nexport type { AuthInfo, CallToolResult, ContentBlock, HostContext, McpServerLike } from \"./mcp.js\";\nexport { EXTENSION_KEY, TEXT_META, REVISION as EVENTS_REVISION } from \"./spec.js\";\n"]}
package/dist/key.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"key.js","sourceRoot":"","sources":["../src/key.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, createPrivateKey, createPublicKey, randomBytes, sign, type KeyObject } from \"node:crypto\";\n\n// An app key from the Wakeshift console is the app's Ed25519 private key.\n// Current keys are\n//\n// wst_<50 base58 characters>\n//\n// 36 bytes, the 32-byte seed then the CRC32 (IEEE, big-endian) of the\n// seed, read as one big-endian integer and written in base58 (Bitcoin's\n// alphabet), left-padded with \"1\". They name no app: Wakeshift finds the\n// app by the key's kid, which every assertion's header carries, and says\n// which it is (GET /api/apps/v1/app). Older keys, which keep working, are\n//\n// wst_<test|live>_<app id>_<seed, base64url>\n//\n// The two can't be confused: base58 has no \"_\". The key never goes over\n// the wire: it signs short-lived assertions, and Wakeshift keeps only the\n// public half.\n\nexport interface AppKey {\n /** The app's ID, for an older key that names it; null for a current key (ask Wakeshift: `wake.app()`). */\n appId: string | null;\n privateKey: KeyObject;\n /** The 32-byte seed the private key is made from. Never send or log it. */\n seed: Buffer;\n /** The key's ID in assertions' headers: base64url of the first 16 bytes of the public key's SHA-256. */\n kid: string;\n}\n\nconst appIdRE = /^[a-z][a-z0-9-]{1,39}$/;\nconst seedRE = /^[A-Za-z0-9_-]{43}$/;\nconst alphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\nconst LEN = 50;\nconst LIMIT = 1n << 288n;\n// PKCS #8 for an Ed25519 key, before its 32-byte seed (RFC 8410).\nconst pkcs8Prefix = Buffer.from(\"302e020100300506032b657004220420\", \"hex\");\n\n// Errors never include the key.\nconst errFormat = \"wakeshift: an app key is wst_ followed by 50 letters and digits (or an older wst_test_… or wst_live_… key)\";\nconst errMistyped = \"wakeshift: the app key is cut short or mistyped\";\n\n// CRC32 (IEEE). zlib.crc32 needs Node 22.2; the package supports 22.0.\nconst crcTable = (() => {\n const t = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n t[n] = c >>> 0;\n }\n return t;\n})();\n\nfunction crc32(b: Uint8Array): number {\n let c = 0xffffffff;\n for (const x of b) c = crcTable[(c ^ x) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n}\n\n/** Reads an app key from the console, either format. Throws on anything else. */\nexport function parseKey(key: string): AppKey {\n const s = String(key ?? \"\").trim();\n if (!s.startsWith(\"wst_\")) throw new Error(\"wakeshift: an app key starts with wst_\");\n const rest = s.slice(4);\n const i = rest.indexOf(\"_\");\n if (i >= 0) return parseOld(rest.slice(0, i), rest.slice(i + 1));\n if (rest.length !== LEN) throw new Error(errMistyped);\n let n = 0n;\n for (const ch of rest) {\n const d = alphabet.indexOf(ch);\n if (d < 0) throw new Error(errMistyped);\n n = n * 58n + BigInt(d);\n }\n if (n >= LIMIT) throw new Error(errMistyped);\n const b = Buffer.from(n.toString(16).padStart(72, \"0\"), \"hex\");\n const seed = Buffer.from(b.subarray(0, 32));\n if (crc32(seed) !== b.readUInt32BE(32)) throw new Error(errMistyped);\n return fromSeed(null, seed);\n}\n\n/** @internal Whether key is an older test key (wst_test_…), from a staging or local console: it has no default core. */\nexport function isTestKey(key: string): boolean {\n return String(key ?? \"\").trim().startsWith(\"wst_test_\");\n}\n\n// An older key: wst_<test|live>_<app id>_<seed>. App IDs have no \"_\"; the seed\n// (base64url) may.\nfunction parseOld(mode: string, after: string): AppKey {\n if (mode !== \"test\" && mode !== \"live\") throw new Error(errFormat);\n const j = after.indexOf(\"_\");\n const appId = j < 0 ? \"\" : after.slice(0, j);\n if (!appIdRE.test(appId)) throw new Error(\"wakeshift: the app key has no app ID\");\n const seed = after.slice(j + 1);\n const raw = seedRE.test(seed) ? Buffer.from(seed, \"base64url\") : Buffer.alloc(0);\n if (raw.length !== 32) throw new Error(errMistyped);\n return fromSeed(appId, raw);\n}\n\nfunction fromSeed(appId: string | null, seed: Buffer): AppKey {\n const privateKey = createPrivateKey({ key: Buffer.concat([pkcs8Prefix, seed]), format: \"der\", type: \"pkcs8\" });\n return { appId, privateKey, seed, kid: keyIdOf(rawPublicKey(privateKey)) };\n}\n\nfunction rawPublicKey(k: KeyObject): Buffer {\n return Buffer.from(createPublicKey(k).export({ format: \"jwk\" }).x as string, \"base64url\");\n}\n\n/** A raw 32-byte Ed25519 public key's kid: base64url of the first 16 bytes of its SHA-256. */\nexport function keyIdOf(publicKey: Uint8Array): string {\n return createHash(\"sha256\").update(publicKey).digest().subarray(0, 16).toString(\"base64url\");\n}\n\n/** The app's public key, base64url (what the console stores). */\nexport function publicKeyOf(k: AppKey): string {\n return rawPublicKey(k.privateKey).toString(\"base64url\");\n}\n\nconst b64 = (v: unknown) => Buffer.from(typeof v === \"string\" ? v : JSON.stringify(v)).toString(\"base64url\");\n\n/**\n * Signs a fresh assertion of the app's identity for core (its base URL,\n * without a trailing slash): a compact JWS, alg EdDSA, typ app+jwt, with\n * the key's kid, living two minutes. iss and sub are the app's ID when\n * it's known (an older key names it; pass appId once Wakeshift has said\n * it), else the kid.\n */\nexport function signAssertion(k: AppKey, core: string, now = Date.now(), appId?: string | null): string {\n const iat = Math.floor(now / 1000);\n const who = appId || k.appId || k.kid;\n const claims = {\n iss: who,\n sub: who,\n aud: core + \"/api/apps\",\n iat,\n exp: iat + 120,\n jti: randomBytes(16).toString(\"base64url\"),\n };\n const input = b64({ alg: \"EdDSA\", typ: \"app+jwt\", kid: k.kid }) + \".\" + b64(claims);\n return input + \".\" + sign(null, Buffer.from(input), k.privateKey).toString(\"base64url\");\n}\n"]}
package/dist/mcp.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,sDAAsD;AACtD,2EAA2E;AAC3E,2EAA2E;AAC3E,aAAa;AA2Bb;;;GAGG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAS;IACb,IAAI,CAAW;IACxB,YAAY,IAAY,EAAE,OAAe,EAAE,IAAc;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,CAAC;CACF","sourcesContent":["// The MCP types the SDK's API names, written out here rather than imported,\n// so its published types load with either MCP TypeScript SDK installed and\n// the other missing: @modelcontextprotocol/sdk 1.x or\n// @modelcontextprotocol/server 2.x (host.ts tells them apart at run time).\n// Each is what both SDKs' own types have in common, so a value of either's\n// type fits.\n\n/** An MCP content block: text, or anything else the protocol carries. */\nexport type ContentBlock =\n | { type: \"text\"; text: string; [k: string]: unknown }\n | { type: \"image\" | \"audio\" | \"resource_link\" | \"resource\"; [k: string]: unknown };\n\n/** A tools/call result, as either MCP SDK types one. */\nexport interface CallToolResult {\n content: ContentBlock[];\n /** An object on protocol 2025-11-25; any JSON value on 2026-07-28. */\n structuredContent?: unknown;\n isError?: boolean;\n _meta?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\n/** A verified access token, as an MCP SDK's auth middleware passes it to handlers. */\nexport interface AuthInfo {\n token: string;\n clientId: string;\n scopes: string[];\n expiresAt?: number;\n resource?: URL;\n extra?: Record<string, unknown>;\n}\n\n/**\n * A JSON-RPC error a handler throws: both MCP SDKs answer with its code,\n * message and data (1.x calls its own McpError, 2.x ProtocolError).\n */\nexport class RpcError extends Error {\n readonly code: number;\n readonly data?: unknown;\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"RpcError\";\n this.code = code;\n if (data !== undefined) this.data = data;\n }\n}\n\n/**\n * An McpServer from either MCP SDK: @modelcontextprotocol/sdk 1.x's\n * (`@modelcontextprotocol/sdk/server/mcp.js`) or\n * @modelcontextprotocol/server 2.x's.\n */\nexport interface McpServerLike {\n readonly server: object;\n registerTool(...args: any[]): unknown;\n}\n\ntype LowOf<S> = S extends { server: infer L } ? L : never;\n\n/**\n * The context a server's request handlers get, read from the server's own\n * type: @modelcontextprotocol/server 2.x's ServerContext (`ctx`), or\n * @modelcontextprotocol/sdk 1.x's RequestHandlerExtra (`extra`).\n */\nexport type HostContext<S> =\n LowOf<S> extends { projectCallToolResult: unknown }\n ? LowOf<S> extends { setRequestHandler(method: string, schemas: any, handler: (params: any, ctx: infer C) => any): void }\n ? C\n : ToolCallExtra\n : S extends { registerTool(name: string, config: any, cb: (args: any, extra: infer E) => any): any }\n ? E\n : ToolCallExtra;\n\n/**\n * The parts of a tool call's context Wakeshift reads, whichever MCP SDK\n * serves it: 1.x's RequestHandlerExtra (`_meta`, `authInfo`,\n * `requestInfo`), 2.x's ServerContext (`mcpReq`, `http`). A wrapped tool's\n * `call.extra` is typed as your MCP SDK's own.\n */\nexport interface ToolCallExtra {\n _meta?: Record<string, unknown>;\n authInfo?: AuthInfo;\n requestInfo?: { headers?: Record<string, string | string[] | undefined> };\n signal?: AbortSignal;\n sessionId?: string;\n mcpReq?: { _meta?: Record<string, unknown>; envelope?: Record<string, unknown>; signal?: AbortSignal; id?: string | number };\n http?: { authInfo?: AuthInfo; req?: { headers: { get(name: string): string | null } } };\n /** The rest of the SDK's own context (1.x: requestId, sendNotification…; 2.x: mcpReq.send…). */\n [k: string]: any;\n}\n"]}
package/dist/retry.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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","sourcesContent":["// Wakeshift runs behind Google's load balancer on Cloud Run. For some\n// minutes after a rollout, the load balancer sends a small share of requests\n// to a retired revision, which answers at once with Google's own HTML \"500\n// Server Error\" page: the request never reached a Wakeshift instance. It\n// happens to every client alike (new connections included), so retrying is\n// what gets the request through.\n\n/** @internal Pauses before each retry of a refused request (so at most length + 1 attempts). */\nexport const RETRY_PAUSES_MS = [250, 1000];\n\n/**\n * @internal fetchFn, retrying a request the load balancer refused before it\n * reached Wakeshift: Google's HTML 500 page, for any request (it never ran),\n * and a 502, 503 or 504 not from Wakeshift for a GET or HEAD. Wakeshift's own\n * errors (JSON) are never retried, nor is a request whose body can't be sent\n * again (a stream).\n */\nexport function retryRefused(fetchFn: typeof fetch, pauses: number[] = RETRY_PAUSES_MS): typeof fetch {\n return (async (input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n const method = (init?.method ?? (input instanceof Request ? input.method : \"GET\")).toUpperCase();\n const resendable = !(input instanceof Request) && (init?.body == null || typeof init.body === \"string\" || init.body instanceof URLSearchParams);\n for (let attempt = 0; ; attempt++) {\n const resp = await fetchFn(input, init);\n if (!resendable || attempt >= pauses.length || !(await refused(method, resp))) return resp;\n await resp.body?.cancel().catch(() => {});\n await pause(pauses[attempt]!, init?.signal ?? undefined);\n }\n }) as typeof fetch;\n}\n\n/** @internal Whether resp is the load balancer's refusal, not the service's answer. */\nexport async function refused(method: string, resp: Response): Promise<boolean> {\n const type = (resp.headers.get(\"Content-Type\") ?? \"\").split(\";\")[0]!.trim().toLowerCase();\n if (resp.status === 500) {\n if (type !== \"text/html\") return false;\n const text = await resp.clone().text().catch(() => \"\");\n return text.slice(0, 4096).includes(\"Server Error\"); // within the first 4 KB, as the Go SDK reads it\n }\n if (resp.status === 502 || resp.status === 503 || resp.status === 504) {\n return (method === \"GET\" || method === \"HEAD\") && type !== \"application/json\";\n }\n return false;\n}\n\nfunction pause(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason);\n const t = setTimeout(() => {\n signal?.removeEventListener(\"abort\", stop);\n resolve();\n }, ms);\n const stop = () => {\n clearTimeout(t);\n reject(signal!.reason);\n };\n signal?.addEventListener(\"abort\", stop, { once: true });\n });\n}\n"]}
package/dist/spec.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.js","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,yEAAyE;AACzE,6CAA6C;AAE7C,8LAA8L;AAC9L,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAC;AAEhD,kJAAkJ;AAClJ,MAAM,CAAC,MAAM,QAAQ,GAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAE/D,6IAA6I;AAC7I,MAAM,CAAC,MAAM,aAAa,GAAG,gCAAgC,CAAC;AAC9D,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC;AAEtC,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAEtC,sFAAsF;AACtF,MAAM,CAAC,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAE7C,6FAA6F;AAC7F,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAYtC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC;AAErC,uEAAuE;AACvE,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC;IAC3I,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC;AAC3H,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,SAAS,CAAC,UAAkB,EAAE,SAAiB;IAC7D,OAAO,UAAU,CAAC,WAAW,EAAE,KAAK,YAAY,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7H,CAAC;AAED,mIAAmI;AACnI,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAChH,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["// The SEP-3415 (MCP Events) constants the SDK uses, in one place, matching\n// Wakeshift's own (internal/mcpevents/event/spec.go, which a test checks\n// these against): the draft is still moving.\n\n/** The draft these follow: SEP-3415 as revised on 2026-10-27. Where clients differ from it, Wakeshift follows the clients (webhook-id equals eventId; Mcp-Name checked only when present). */\nexport const REVISION = \"SEP-3415 (2026-10-27)\";\n\n/** The delivery modes Wakeshift offers for every event type (events/list's delivery): a webhook, or polls. Push (events/stream) isn't offered. */\nexport const DELIVERY: readonly string[] = [\"webhook\", \"poll\"];\n\n/** Capability keys: the draft's extension, and the top-level key ChatGPT reads. A server advertises both; only the extension is exported. */\nexport const EXTENSION_KEY = \"io.modelcontextprotocol/events\";\nexport const TOP_LEVEL_KEY = \"events\";\n\n/** On every events/* result. */\nexport const RESULT_TYPE = \"complete\";\n\n/** The _meta key of an occurrence's rendered line (Wakeshift adds it on delivery). */\nexport const TEXT_META = \"ai.wakeshift/text\";\n\n/** The Streamable HTTP header events/subscribe and events/unsubscribe carry: params.name. */\nexport const NAME_HEADER = \"mcp-name\";\n\nexport type Dialect = \"draft\" | \"chatgpt\";\n\nexport interface Codes {\n notFound: number;\n forbidden: number;\n resourceExhausted: number;\n unsupported: number;\n callbackEndpoint: number;\n}\n\nexport const INVALID_PARAMS = -32602;\nexport const HEADER_MISMATCH = -32020;\nexport const INTERNAL_ERROR = -32603;\n\n/** A dialect's error codes: the draft's (provisional) or ChatGPT's. */\nexport function codesFor(dialect: Dialect): Codes {\n if (dialect === \"chatgpt\") {\n return { notFound: -32011, forbidden: -32012, resourceExhausted: INVALID_PARAMS, unsupported: INVALID_PARAMS, callbackEndpoint: -32015 };\n }\n return { notFound: -32023, forbidden: -32024, resourceExhausted: -32025, unsupported: -32026, callbackEndpoint: -32027 };\n}\n\n/** A client's dialect, by its clientInfo name or User-Agent: ChatGPT's MCP client is openai-mcp. */\nexport function dialectOf(clientName: string, userAgent: string): Dialect {\n return clientName.toLowerCase() === \"openai-mcp\" || userAgent.toLowerCase().startsWith(\"openai-mcp\") ? \"chatgpt\" : \"draft\";\n}\n\n/** Decodes an Mcp-Name header: plain ASCII, or SEP-2243's base64 sentinel (=?base64?…?=). null: a sentinel that doesn't decode. */\nexport function headerValue(h: string): string | null {\n if (!h.startsWith(\"=?base64?\") || !h.endsWith(\"?=\")) return h;\n try {\n const b = Buffer.from(h.slice(\"=?base64?\".length, -2), \"base64\");\n if (b.toString(\"base64\").replace(/=+$/, \"\") !== h.slice(\"=?base64?\".length, -2).replace(/=+$/, \"\")) return null;\n return b.toString(\"utf8\");\n } catch {\n return null;\n }\n}\n"]}
package/dist/tasks.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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","sourcesContent":["// MCP Tasks as a wake path (docs/harnesses.md, \"Claude Code: MCP tasks as a\n// wake path\"): for a client that takes MCP tasks, on protocol 2026-07-28\n// (discover.ts), attach serves Wakeshift's wait tool, wakeshift_wait. Its\n// call is answered with a task that completes when the conversation's next\n// Wakeshift messages arrive; the client follows it in the background\n// (tasks/get), and a completed task wakes an idle conversation. Wakeshift\n// decides everything: the SDK passes the tool's call, tasks/get and\n// tasks/cancel to it and answers with the MCP result it returns, so every\n// SDK says the same (test/mcp-tasks-wire.json). A task is only its ID,\n// which any process answers for, so nothing is kept here.\n//\n// Only a request that declares the tasks extension in its own capabilities\n// (2026-07-28 has no initialize: each request carries them) sees the wait\n// tool, and a wrapped tool's call from it tells Wakeshift so (call.tasks),\n// which then gives the wait tool's instructions instead of its harness's\n// zero-install path (Claude Code's Monitor). Everything else is unchanged.\n\nimport { WakeshiftError } from \"./errors.js\";\nimport { TASKS_EXTENSION, takesTasks } from \"./discover.js\";\nimport type { Handler, Host } from \"./host.js\";\nimport { RpcError } from \"./mcp.js\";\nimport { WAKE_ARG_DESCRIPTIONS } from \"./toolcall.js\";\nimport { toolCallOf, type Wakeshift } from \"./wakeshift.js\";\n\n/** The wait tool's name. */\nexport const WAIT_TOOL = \"wakeshift_wait\";\n\n/** The wait tool's description: the core's harnesses.WaitToolDescription. */\nexport const WAIT_TOOL_DESCRIPTION =\n \"Wait for this conversation's next Wakeshift messages from this app. Returns at once and keeps waiting in the background: when messages arrive, its result reaches you as a task notification. Call it again after each one, with the session_key Wakeshift gave you.\";\n\n/** What every Wakeshift task ID starts with: tasks/get and tasks/cancel for any other ID aren't Wakeshift's. */\nexport const TASK_ID_PREFIX = \"wkt1_\";\n\n/** How long Wakeshift holds a tasks/get for a working task, in seconds. */\nexport const TASK_HOLD_SECONDS = 20;\n\n/** The wait tool as tools/list lists it. */\nexport const WAIT_TOOL_DEFINITION = {\n name: WAIT_TOOL,\n description: WAIT_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n session_key: { type: \"string\", description: WAKE_ARG_DESCRIPTIONS.session_key },\n harness: { type: \"string\", description: WAKE_ARG_DESCRIPTIONS.harness },\n conversation_id: { type: \"string\", description: WAKE_ARG_DESCRIPTIONS.conversation_id },\n },\n additionalProperties: false,\n },\n} as const;\n\nexport { TASKS_EXTENSION, takesTasks };\n\n/** What the core answers a task request with. */\ninterface TaskAnswer {\n result?: Record<string, unknown>;\n rpc_error?: { code: number; message: string };\n}\n\n/** @internal Who's calling, for a request (the MCP SDK's own context): the user (identify's) and the client's name. */\nexport type CallerOf = (raw: unknown) => { user: string | undefined; client: string };\n\n/**\n * @internal Serves the wait tool, tasks/get and tasks/cancel on server\n * (after serveStateless): the tasks extension in server/discover, the tool\n * in tools/list for a request that takes tasks, and its calls and task\n * requests passed to Wakeshift.\n */\nexport function serveTasks(wake: Wakeshift, host: Host, callerOf: CallerOf): void {\n const handlers = host.handlers();\n if (!handlers) return; // a future SDK: nothing to hook (no wait tool)\n\n const call = (raw: unknown, args: Record<string, unknown>) => {\n const { user, client } = callerOf(raw);\n return toolCallOf(host.req(raw), client, user, args, WAIT_TOOL);\n };\n const takes = (raw: unknown) => {\n const req = host.req(raw);\n return takesTasks(req.meta, req);\n };\n const waitCall: Handler = async (request, raw) => {\n const args = (request?.params?.arguments ?? {}) as Record<string, unknown>;\n try {\n const out = await wake.requestApp<TaskAnswer>(\"POST\", \"/calls/task\", { call: call(raw, args) });\n if (out.result) return out.result;\n } catch (err) {\n return { isError: true, content: [{ type: \"text\", text: `Wakeshift couldn't start the wait (${detailOf(err)}). Call ${WAIT_TOOL} again.` }] };\n }\n return { isError: true, content: [{ type: \"text\", text: `Wakeshift didn't answer the wait. Call ${WAIT_TOOL} again.` }] };\n };\n const taskRequest = (path: string, hold: boolean): Handler => async (request, raw) => {\n const task = request?.params?.taskId;\n const body: Record<string, unknown> = { task: typeof task === \"string\" ? task : \"\", call: call(raw, {}) };\n if (hold) body.hold_seconds = TASK_HOLD_SECONDS;\n const signal = host.req(raw).signal;\n let out: TaskAnswer;\n try {\n out = await wake.requestApp<TaskAnswer>(\"POST\", path, body, { timeoutMs: (TASK_HOLD_SECONDS + 15) * 1000, signal });\n } catch (err) {\n if (signal?.aborted) throw new RpcError(-32603, \"canceled by the client\");\n throw new RpcError(-32603, `Wakeshift: ${detailOf(err)}`);\n }\n if (out.rpc_error) throw new RpcError(out.rpc_error.code, out.rpc_error.message);\n if (!out.result) throw new RpcError(-32603, \"Wakeshift didn't answer for this task\");\n return out.result;\n };\n\n // server/discover gets the tasks extension (1.x: discover.ts's handler;\n // 2.x: its own). initialize doesn't: older revisions' clients never see it.\n const wrapDiscover = (h: Handler): Handler => async (request, raw) => {\n const out = await h(request, raw);\n if (out && typeof out === \"object\") {\n const caps = { ...(out.capabilities ?? {}) };\n caps.extensions = { ...(caps.extensions ?? {}), [TASKS_EXTENSION]: {} };\n return { ...out, capabilities: caps };\n }\n return out;\n };\n // tools/list lists the wait tool for a request that takes tasks; tools/call\n // answers it. McpServer sets these when the first tool is registered,\n // perhaps after attach, so a later set is wrapped too.\n const wrapList = (h: Handler): Handler => async (request, raw) => {\n const out = await h(request, raw);\n if (takes(raw) && out && Array.isArray(out.tools) && !out.tools.some((t: any) => t?.name === WAIT_TOOL)) {\n return { ...out, tools: [...out.tools, WAIT_TOOL_DEFINITION] };\n }\n return out;\n };\n const wrapCall = (h: Handler): Handler => async (request, raw) => (request?.params?.name === WAIT_TOOL ? waitCall(request, raw) : h(request, raw));\n // tasks/get and tasks/cancel: Wakeshift's own tasks (their IDs start\n // wkt1_) go to Wakeshift; any other goes to the app's own handler, if it\n // has one.\n const wrapTask = (path: string, hold: boolean) => (h: Handler | undefined): Handler => {\n const ours = taskRequest(path, hold);\n return async (request, raw) => {\n const id = request?.params?.taskId;\n if (typeof id === \"string\" && id.startsWith(TASK_ID_PREFIX)) return ours(request, raw);\n if (h) return h(request, raw);\n throw new RpcError(-32601, \"Method not found\");\n };\n };\n const wrappers: Record<string, (h: Handler | undefined) => Handler> = {\n \"server/discover\": (h) => wrapDiscover(h!),\n \"tools/list\": (h) => wrapList(h!),\n \"tools/call\": (h) => wrapCall(h!),\n \"tasks/get\": wrapTask(\"/calls/task/get\", true),\n \"tasks/cancel\": wrapTask(\"/calls/task/cancel\", false),\n };\n for (const [method, wrap] of Object.entries(wrappers)) {\n const h = handlers.get(method);\n if (method.startsWith(\"tasks/\")) {\n // Routed by the SDK on every protocol revision (host.setTaskMethod),\n // then answered by the wrapper, which hands anything that isn't\n // Wakeshift's to the app's own handler, if it had one.\n host.setTaskMethod(method);\n Map.prototype.set.call(handlers, method, wrap(h));\n } else if (h) {\n // Set once (serveStateless wraps what's set through handlers.set).\n Map.prototype.set.call(handlers, method, wrap(h));\n }\n }\n const set = handlers.set.bind(handlers);\n handlers.set = (method: string, h: Handler) => set(method, wrappers[method] ? wrappers[method](h) : h);\n}\n\nfunction detailOf(err: unknown): string {\n return err instanceof WakeshiftError ? err.detail : String((err as Error)?.message ?? err);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolcall.js","sourceRoot":"","sources":["../src/toolcall.ts"],"names":[],"mappings":"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","sourcesContent":["// One way to subscribe from a tool (docs/subscribe-from-tools.md): a tool\n// callback wrapped by the handle attach returns (attached.events) gets a\n// ToolCall, and subscribes the calling conversation with call.subscribe\n// (ends it with call.unsubscribe). The wrapper adds one Wakeshift block to\n// whatever the handler returns, so a conversation can't be left unwakeable\n// by a forgotten argument, a wrong tool name or an unreturned result; and a\n// call that fails ends the subscriptions it made. A port of the Go SDK's\n// appkit.Events (pkg/appkit/toolcall.go, attachcall.go).\n//\n// const attached = wake.attach(server, { identify: (extra) => ({ user: userOf(extra) }) })\n// server.registerTool(\"join\",\n// { description: \"…\", inputSchema: attached.inputs({ table: z.string() }) },\n// attached.events(\"join\", async ({ table }, call) => {\n// const sub = await call.subscribe(turn, { table }, { reason: `Playing at ${table}` })\n// await casino.seat(call.user!, table, sub.id)\n// return `You're seated at ${table}.`\n// }))\n\nimport { z } from \"zod\";\nimport * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport * as z4mini from \"zod/v4-mini\";\nimport type { CallToolResult, ToolCallExtra } from \"./mcp.js\";\nimport { getObjectShape, isSchema, isZ4Schema, normalizeObjectSchema, type AnySchema, type SchemaInput, type ShapeOutput, type ZodRawShapeCompat } from \"./zod.js\";\nimport type { Host } from \"./host.js\";\nimport { WakeshiftError } from \"./errors.js\";\nimport { EXTENSION_KEY, dialectOf } from \"./spec.js\";\nimport { takesTasks } from \"./discover.js\";\nimport type { Identity, WakeEvent } from \"./events.js\";\nimport { packCall, userAgentOf, type Call, type Duration, type Recognized, type Wakeshift } from \"./wakeshift.js\";\n\n// Wakeshift's three arguments (wakeshift.ts's SESSION_ARG, HARNESS_ARG and\n// CONVERSATION_ARG, repeated: that module imports this one).\nconst SESSION_ARG = \"session_key\";\nconst HARNESS_ARG = \"harness\";\nconst CONVERSATION_ARG = \"conversation_id\";\n\nexport type { ToolCallExtra };\n\n// What the agent is told each of Wakeshift's arguments is: the Go SDK's\n// WakeArgs, word for word.\nconst SESSION_KEY_DESCRIPTION =\n \"This conversation's session_key, from an earlier result (a secret token, or a handle such as claude-code#2). Keep it to this conversation; don't share or log it.\";\nconst HARNESS_DESCRIPTION =\n \"The program you're running in: codex, claude-code, cursor (local CLI or IDE), cursor-cloud (Cursor cloud agent), grok-bot, copilot-cli, opencode, antigravity, openclaw (even when it runs your turns in Codex), hermes, chatgpt, or your program's name if it isn't listed\";\nconst CONVERSATION_DESCRIPTION =\n \"Your own ID for this conversation, if your program gives you one. Cursor and Grok Bot: the output of `printenv CURSOR_CONVERSATION_ID`. Codex and Antigravity send it automatically; others leave it empty\";\nconst WAKESHIFT_OUTPUT_DESCRIPTION = \"What Wakeshift adds for this conversation: how it's woken by this app's events\";\n/** @internal Wakeshift's three arguments' descriptions, for a tool whose input schema is written out (the wait tool, tasks.ts). */\nexport const WAKE_ARG_DESCRIPTIONS = { session_key: SESSION_KEY_DESCRIPTION, harness: HARNESS_DESCRIPTION, conversation_id: CONVERSATION_DESCRIPTION } as const;\n\nconst wakeInputs = {\n [SESSION_ARG]: z.string().optional().describe(SESSION_KEY_DESCRIPTION),\n [HARNESS_ARG]: z.string().optional().describe(HARNESS_DESCRIPTION),\n [CONVERSATION_ARG]: z.string().optional().describe(CONVERSATION_DESCRIPTION),\n};\n/** @internal Wakeshift's three arguments as attach's own tools take them: worded as a wrapped tool's (test/events-list.json pins it). */\nexport const toolArgs = wakeInputs;\nconst wakeOutput = { wakeshift: z.string().optional().describe(WAKESHIFT_OUTPUT_DESCRIPTION) };\n\n// The same in each of zod's two APIs: MCP refuses a shape that mixes them,\n// so a shape written with zod/v3 (or zod/v4) gets Wakeshift's fields in its\n// own (zod 3.25 and later carry both).\nconst byVersion = {\n v3: {\n inputs: {\n [SESSION_ARG]: z3.string().optional().describe(SESSION_KEY_DESCRIPTION),\n [HARNESS_ARG]: z3.string().optional().describe(HARNESS_DESCRIPTION),\n [CONVERSATION_ARG]: z3.string().optional().describe(CONVERSATION_DESCRIPTION),\n },\n output: { wakeshift: z3.string().optional().describe(WAKESHIFT_OUTPUT_DESCRIPTION) },\n },\n v4: {\n inputs: {\n [SESSION_ARG]: z4.string().optional().describe(SESSION_KEY_DESCRIPTION),\n [HARNESS_ARG]: z4.string().optional().describe(HARNESS_DESCRIPTION),\n [CONVERSATION_ARG]: z4.string().optional().describe(CONVERSATION_DESCRIPTION),\n },\n output: { wakeshift: z4.string().optional().describe(WAKESHIFT_OUTPUT_DESCRIPTION) },\n },\n};\n\n// fieldsFor is Wakeshift's fields in the zod API shape's own fields use\n// (for an empty shape, the default import's, or zod 4's for the MCP SDK\n// 2.x, which takes only zod 4).\nfunction fieldsFor<K extends \"inputs\" | \"output\">(shape: ZodRawShapeCompat, kind: K, host?: Host): K extends \"inputs\" ? WakeInputs : WakeOutputShape {\n const first = Object.values(shape ?? {})[0];\n const version = first ? (isZ4Schema(first) ? \"v4\" : \"v3\") : host?.version === 2 ? \"v4\" : null;\n const fields = version ? byVersion[version][kind] : kind === \"inputs\" ? wakeInputs : wakeOutput;\n return fields as any;\n}\n\n/** @internal Wakeshift's three arguments as attach's own tools take them, in the zod the host's MCP SDK takes. */\nexport function wakeInputsFor(host: Host): ZodRawShapeCompat {\n return host.version === 2 ? byVersion.v4.inputs : wakeInputs;\n}\n\n// withFields is an object schema with fields added, in the schema's own zod\n// API (zod 3, zod 4 classic or mini).\nfunction withFields(schema: AnySchema, fields: ZodRawShapeCompat): AnySchema {\n const s = schema as { extend?: (f: ZodRawShapeCompat) => AnySchema };\n if (typeof s.extend === \"function\") return s.extend(fields);\n return z4mini.extend(schema as any, fields as any) as AnySchema;\n}\n\n/** Wakeshift's three arguments, as attached.inputs adds them. */\nexport type WakeInputs = typeof wakeInputs;\n/** The optional wakeshift string attached.output adds. */\nexport type WakeOutputShape = typeof wakeOutput;\n/** Wakeshift's three arguments in zod 4, as attached.inputs adds them to a zod 4 object. */\nexport type WakeInputsV4 = typeof byVersion.v4.inputs;\n/** Wakeshift's three arguments in zod 3, as attached.inputs adds them to a zod 3 object. */\nexport type WakeInputsV3 = typeof byVersion.v3.inputs;\n/** The optional wakeshift string in zod 4, as attached.output adds it to a zod 4 object. */\nexport type WakeOutputV4 = typeof byVersion.v4.output;\n/** The optional wakeshift string in zod 3, as attached.output adds it to a zod 3 object. */\nexport type WakeOutputV3 = typeof byVersion.v3.output;\n/** What a wrapped tool's arguments must include: Wakeshift's three (attached.inputs adds them). */\nexport type WakeArgs = { [K in WakeKey]?: string | undefined };\n/**\n * The callback attached.events returns, for `server.registerTool`: it takes\n * the tool's arguments (A, Wakeshift's three included) and your MCP SDK's\n * request context (C).\n */\nexport type WrappedCallback<A, C> = (args: A, extra: C) => Promise<any>;\n/** The names of Wakeshift's three arguments. */\nexport type WakeKey = typeof SESSION_ARG | typeof HARNESS_ARG | typeof CONVERSATION_ARG;\n/** An input shape with Wakeshift's three arguments in it (attached.inputs'). */\nexport type WakeShape = ZodRawShapeCompat & { [K in WakeKey]: AnySchema };\n/** What a wrapped handler gets: the tool's own arguments, without Wakeshift's three. */\nexport type AppArgs<S extends ZodRawShapeCompat> = Omit<ShapeOutput<S>, WakeKey>;\n/** What a wrapped handler returns: a string (one text block) or a CallToolResult. */\nexport type WrappedResult = string | CallToolResult;\n\nconst WAKE_KEYS: readonly WakeKey[] = [SESSION_ARG, HARNESS_ARG, CONVERSATION_ARG];\n\n/**\n * @internal The tools/call _meta keys a harness names its conversation in\n * (the core's harnesses ConversationMeta, dotted for nested objects):\n * test/conversation-meta.json, which a Go test keeps current.\n */\nexport const CONVERSATION_META: readonly string[] = [\n \"agent-session-id\",\n \"antigravity.google/conversation_id\",\n \"vscode.conversationId\",\n \"wakeshift/conversation\",\n \"x-codex-turn-metadata.thread_id\",\n];\n\n/**\n * The calling conversation's subscription, made or renewed by\n * call.subscribe. id and user address it later: emit's\n * `to: [{ user, subscription: id }]`, or `event.end(user, id)`.\n */\nexport interface Subscription {\n id: string;\n user: string;\n /** False for a renewal. */\n created: boolean;\n /** The conversation's session. A secret: don't show, store or log it. */\n session: string;\n /** What Wakeshift recognized the agent's program as. */\n recognized: Recognized;\n /** The caller subscribes itself (call.native): nothing was made, id is \"\", and the block tells it what to subscribe to. */\n native: boolean;\n}\n\n/** How call.subscribe subscribes. */\nexport interface ToolSubscribeOptions {\n /** End after this long without a delivery or a fresh subscribe (default 30 days). */\n ttl?: Duration;\n /** Why the app subscribes the conversation, shown in the console (at most 200 characters). */\n reason?: string;\n /** Names a new session (agent@label), for an app acting for its agents. */\n label?: string;\n}\n\n/**\n * One call of a wrapped tool (attached.events): who's calling, and the\n * calls that subscribe the calling conversation. Only the wrapper makes\n * one, and it works until the handler returns (then CallEnded).\n */\nexport interface ToolCall<C = any> {\n /** Who attach's identify says is calling (undefined for none). */\n readonly user: string | undefined;\n /** The tool being called. */\n readonly tool: string;\n /**\n * The client subscribes to the app's events itself (MCP Events: ChatGPT,\n * the house agents). call.subscribe then makes no conversation\n * subscription, and the block tells it what to subscribe to.\n */\n readonly native: boolean;\n /** A native client's conversation, when it names one (ChatGPT's _meta[\"openai/session\"]). */\n readonly nativeConversation: string | null;\n /** The session_key passed; after a subscribe or resolveSession, the conversation's session. */\n readonly session: string | null;\n /** What Wakeshift recognized the agent's program as: null until a subscribe or resolveSession. */\n readonly recognized: Recognized | null;\n /** The call's request context, as your MCP SDK passes it to the tool's callback: 2.x's ctx, 1.x's extra. */\n readonly extra: C;\n /**\n * Subscribes the calling conversation to event with args, or renews its\n * subscription. The reply then carries what the conversation needs to be\n * woken (one block for the call, however many subscribes it makes), and\n * if the call fails, the subscription is ended. For a native caller\n * nothing is made. Your tool decides who may: authorize isn't consulted.\n * A personal event needs a user (identify's).\n */\n subscribe<A extends AnySchema>(event: WakeEvent<A, any>, args: SchemaInput<A>, opts?: ToolSubscribeOptions): Promise<Subscription>;\n /**\n * Ends the calling conversation's subscription to event with args,\n * resolving to whether one ended. For a native caller it ends the user's\n * own (webhook) subscriptions to the event with those arguments.\n */\n unsubscribe<A extends AnySchema>(event: WakeEvent<A, any>, args: SchemaInput<A>): Promise<boolean>;\n /** Finds or starts the calling conversation's session without subscribing it (it doesn't make it wakeable). */\n resolveSession(): Promise<string>;\n}\n\n/** A ToolCall used after its handler returned. */\nexport class CallEnded extends Error {\n constructor() {\n super(\"wakeshift: the tool call has ended: subscribe before the handler returns\");\n this.name = \"CallEnded\";\n }\n}\n\n/** attach's event options. */\nexport interface EventsOptions<C = any> {\n /**\n * Asked first whether a wrapped tool's call comes from a client that\n * subscribes to the app's events itself (call.native), for callers the\n * SDK can't tell (an app's own house agents). False leaves it to the\n * SDK's own checks. It gets the call's request context, as identify does.\n */\n native?(extra: C): boolean;\n}\n\n// The line a text-carried beacon is on (the core's beacon.Text), which a\n// harness's hook reads only as the last line of a result's text.\nconst BEACON_LINE_PREFIX = \"(For Wakeshift's hook on this computer, not for you: wakeshift-beacon: \";\nconst CONNECTOR_META_KEY = \"wakeshift/connector\";\n// The most native lines Wakeshift takes for one call.\nconst MAX_NATIVE_LINES = 20;\n\n/** /calls/addition's answer. */\nexport interface CallAddition {\n text?: string;\n trailer?: string;\n meta?: Record<string, unknown>;\n}\n\ntype Content = CallToolResult[\"content\"][number];\n\n// takeTrailer takes a beacon line off the end of the result's text\n// (dropping its block if nothing else is in it), returning it (\"\" if\n// there's none).\nfunction takeTrailer(content: Content[]): string {\n const last = content.at(-1);\n if (!last || last.type !== \"text\") return \"\";\n const text = last.text.replace(/[ \\t\\r\\n]+$/, \"\");\n const i = text.lastIndexOf(\"\\n\");\n const line = i >= 0 ? text.slice(i + 1) : text;\n if (!line.startsWith(BEACON_LINE_PREFIX) || !line.endsWith(\")\")) return \"\";\n const rest = i >= 0 ? text.slice(0, i).replace(/[ \\t\\r\\n]+$/, \"\") : \"\";\n if (rest === \"\") content.pop();\n else content[content.length - 1] = { ...last, text: rest };\n return line;\n}\n\n/** The structuredContent field a wrapped tool's structured result carries Wakeshift's block in (the same in every SDK). */\nexport const WAKESHIFT_FIELD = \"wakeshift\";\n\n/**\n * @internal An object output schema (JSON Schema, as tools/list gives it)\n * with an optional wakeshift string added, as a copy, so a client that\n * checks structuredContent against it takes the block. Anything else, or a\n * schema that already names it, comes back as it was.\n * test/wrapped-block.json (output_schemas) pins it.\n */\nexport function withWakeshiftField(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) return schema;\n const s = schema as Record<string, unknown>;\n if (s.type !== \"object\") return schema;\n const props = s.properties;\n if (props !== undefined && (!props || typeof props !== \"object\" || Array.isArray(props))) return schema;\n if (props && WAKESHIFT_FIELD in (props as object)) return schema;\n return { ...s, properties: { ...((props as object) ?? {}), [WAKESHIFT_FIELD]: { type: \"string\", description: WAKESHIFT_OUTPUT_DESCRIPTION } } };\n}\n\n/**\n * @internal Adds the call's block to a wrapped handler's result: Wakeshift's\n * text as a block after the app's content, then a text-carried beacon last,\n * and _meta; a string result stays one text block. A result that already\n * carries a beacon keeps it, last, and gets no second one. A structured\n * result (structuredContent an object) gets the block's text in its\n * wakeshift field too. test/wrapped-block.json is the shape, shared with\n * the other SDKs.\n */\nexport function mergeBlock(result: WrappedResult, add: CallAddition): CallToolResult {\n const isString = typeof result === \"string\";\n const base: CallToolResult = isString ? { content: [{ type: \"text\", text: result }] } : result;\n const out: CallToolResult = { ...base, content: [...(base.content ?? [])] };\n const text = (add.text ?? \"\").trim();\n const metaBeacon = !!out._meta && CONNECTOR_META_KEY in out._meta;\n const existing = takeTrailer(out.content);\n if (text) out.content.push({ type: \"text\", text });\n const has = metaBeacon || existing !== \"\";\n if (existing) out.content.push({ type: \"text\", text: existing });\n else if (!has && add.trailer) out.content.push({ type: \"text\", text: add.trailer });\n for (const [k, v] of Object.entries(add.meta ?? {})) {\n if (k === CONNECTOR_META_KEY && has) continue;\n out._meta = { ...(out._meta ?? {}), [k]: v };\n }\n if (isString) {\n const texts = out.content.map((c) => (c.type === \"text\" ? c.text : \"\")).filter((t) => t !== \"\");\n out.content = [{ type: \"text\", text: texts.join(\"\\n\\n\") }];\n }\n if (text && out.structuredContent && typeof out.structuredContent === \"object\" && !Array.isArray(out.structuredContent)) {\n out.structuredContent = { ...(out.structuredContent as Record<string, unknown>), [WAKESHIFT_FIELD]: text };\n }\n return out;\n}\n\n// metaString is the string at key in a tool call's _meta: the key itself,\n// else a dotted path into nested objects (the core's harnesses.metaString).\nfunction metaString(meta: Record<string, unknown> | undefined, key: string): string {\n if (!meta) return \"\";\n const limit = (s: unknown) => (typeof s === \"string\" && s.length <= 200 ? s : \"\");\n if (typeof meta[key] === \"string\") return limit(meta[key]);\n let cur: unknown = meta;\n for (const part of key.split(\".\")) {\n if (!cur || typeof cur !== \"object\" || Array.isArray(cur)) return \"\";\n cur = (cur as Record<string, unknown>)[part];\n }\n return limit(cur);\n}\n\n/** @internal Whether a tool call's _meta names its conversation, the way a harness puts it there (test/conversation-meta.json). */\nexport function namesConversation(meta: Record<string, unknown> | undefined): boolean {\n return CONVERSATION_META.some((k) => metaString(meta, k) !== \"\");\n}\n\nfunction sameJSON(a: unknown, b: unknown): boolean {\n const norm = (v: unknown): unknown =>\n v === null || v === undefined\n ? {}\n : Array.isArray(v)\n ? v.map(norm)\n : typeof v === \"object\"\n ? Object.fromEntries(Object.keys(v as object).sort().map((k) => [k, norm((v as Record<string, unknown>)[k])]))\n : v;\n return JSON.stringify(norm(a)) === JSON.stringify(norm(b));\n}\n\nfunction detailOf(err: unknown): string {\n return err instanceof WakeshiftError ? err.detail : String((err as Error)?.message ?? err);\n}\n\ninterface CreatedSub {\n name: string;\n arguments: unknown;\n session: string;\n pending: string; // the call's pending-addition record, which made it\n}\n\ninterface NativeLine {\n name: string;\n arguments: unknown;\n}\n\n/** @internal What the wrapper needs of attach: the client, the server, who's calling, the event options. */\nexport interface AttachContext {\n wake: Wakeshift;\n /** The server, through what attach needs of its MCP SDK (host.ts). */\n host: Host;\n /** Who attach's identify says is calling: its user and client (raw: the MCP SDK's own request context). */\n identify(raw: unknown): Identity | undefined;\n /** The client's name: the request's (initialize's, else _meta's), else identified (identify's), else \"\". */\n clientOf(meta: Record<string, unknown> | undefined, identified?: string): string;\n events: EventsOptions<any>;\n warnOnce(key: string, message: string): void;\n}\n\n/** One tools/call of a wrapped tool: what its handler subscribed, for the block and the rollback. */\nclass CallScope<C> implements ToolCall<C> {\n user: string | undefined;\n tool: string;\n native = false;\n nativeConversation: string | null = null;\n session: string | null;\n recognized: Recognized | null = null;\n extra: C;\n\n ended = false;\n pending = \"\";\n armed = false;\n created: CreatedSub[] = [];\n nativeLines: NativeLine[] = [];\n inflight = new Set<Promise<unknown>>();\n private queue: Promise<unknown> = Promise.resolve();\n // The client's name identify gave, for a request that names none.\n private readonly identified: string | undefined;\n\n constructor(\n private readonly at: AttachContext,\n tool: string,\n extra: C,\n private readonly args: { session?: string; harness?: string; conversation?: string },\n ) {\n this.tool = tool;\n this.extra = extra;\n const id = at.identify(extra);\n this.user = id?.user;\n this.identified = id?.client;\n this.session = args.session || null;\n const n = nativeOf(at, extra, this.identified);\n this.native = n.native;\n this.nativeConversation = n.conversation;\n }\n\n // wire is the call as Wakeshift takes it: the request's client, _meta and\n // User-Agent, the agent's harness and conversation_id arguments, the\n // conversation's session, and who's calling.\n wire(session = this.session): Call {\n const req = this.at.host.req(this.extra);\n const meta = req.meta;\n return packCall({\n meta,\n clientName: this.at.clientOf(meta, this.identified),\n user: this.user,\n session: session ?? undefined,\n userAgent: userAgentOf(req),\n harness: this.args.harness,\n conversation: this.args.conversation,\n tool: this.tool,\n tasks: takesTasks(meta, req),\n });\n }\n\n // request runs one request of the call to Wakeshift, after any before it\n // (one at a time per call), refusing once the handler has returned.\n private request<T>(fn: () => Promise<T>): Promise<T> {\n if (this.ended) return Promise.reject(new CallEnded());\n const run = this.queue.then(() => (this.ended ? Promise.reject(new CallEnded()) : fn()));\n this.queue = run.catch(() => undefined);\n this.inflight.add(run);\n run.then(\n () => this.inflight.delete(run),\n () => this.inflight.delete(run),\n );\n return run;\n }\n\n private checkEvent(event: WakeEvent<any, any>): void {\n if (!event || typeof event.owner !== \"function\" || event.owner() !== this.at.wake) {\n throw new WakeshiftError(404, \"unknown_event\", `${event?.name ?? \"that\"} is another app's event: this app doesn't offer it`);\n }\n }\n\n subscribe<A extends AnySchema>(event: WakeEvent<A, any>, args: SchemaInput<A>, opts: ToolSubscribeOptions = {}): Promise<Subscription> {\n return this.request(async () => {\n this.checkEvent(event);\n const known = event.parseArgs(args);\n if (this.native) {\n this.addNative(event.name, known);\n return { id: \"\", user: this.user ?? \"\", created: false, session: \"\", recognized: { harness: null, via: null, claimed: null }, native: true };\n }\n if (event.personal && !this.user) {\n throw new WakeshiftError(400, \"bad_arguments\", `${event.name} is personal: call.subscribe needs a user (attach's identify), who the subscription belongs to`);\n }\n const body: Record<string, unknown> = { call: this.wire(), name: event.name, arguments: known, defer_addition: true };\n if (this.pending) body.pending = this.pending;\n if (opts.ttl !== undefined) body.ttl = opts.ttl;\n if (opts.reason) body.reason = opts.reason;\n if (opts.label) body.label = opts.label;\n const out = await this.at.wake.requestApp<{\n event_subscription: { id: string; user?: string; created: boolean };\n session: string;\n agent?: Partial<Recognized>;\n pending?: string;\n }>(\"POST\", \"/event-subscriptions\", body);\n if (out.pending) this.pending = out.pending;\n this.armed = true;\n this.session = out.session;\n const rec = recognizedOf(out.agent);\n this.recognized = rec;\n const es = out.event_subscription;\n if (es.created) this.created.push({ name: event.name, arguments: known, session: out.session, pending: out.pending ?? this.pending });\n return { id: es.id, user: es.user ?? this.user ?? \"\", created: !!es.created, session: out.session, recognized: rec, native: false };\n });\n }\n\n unsubscribe<A extends AnySchema>(event: WakeEvent<A, any>, args: SchemaInput<A>): Promise<boolean> {\n return this.request(async () => {\n this.checkEvent(event);\n const known = event.parseArgs(args);\n if (this.native) return this.endNative(event.name, known);\n const out = await this.at.wake.requestApp<{ ended?: boolean }>(\"POST\", \"/event-subscriptions/unsubscribe\", { call: this.wire(), name: event.name, arguments: known });\n return !!out.ended;\n });\n }\n\n resolveSession(): Promise<string> {\n return this.request(async () => {\n if (this.pending && this.session) return this.session;\n const out = await this.at.wake.requestApp<{ session: string; pending: string; agent?: Partial<Recognized> }>(\"POST\", \"/calls/session\", { call: this.wire() });\n this.pending = out.pending;\n this.session = out.session;\n this.recognized = recognizedOf(out.agent);\n return out.session;\n });\n }\n\n // endNative ends the user's webhook subscriptions to event with these arguments.\n private async endNative(name: string, args: unknown): Promise<boolean> {\n if (!this.user) return false;\n const out = await this.at.wake.requestApp<{ subscriptions?: { id: string; event: string; arguments: unknown; destination: string }[] }>(\"POST\", \"/event-subscriptions/list\", {\n user: this.user,\n });\n let ended = false;\n for (const s of out.subscriptions ?? []) {\n if (s.event !== name || s.destination !== \"webhook\" || !sameJSON(s.arguments, args)) continue;\n const r = await this.at.wake.requestApp<{ ended?: boolean }>(\"POST\", \"/event-subscriptions/end\", { user: this.user, id: s.id });\n ended = ended || !!r.ended;\n }\n return ended;\n }\n\n // addNative adds a native line, once per event and arguments.\n private addNative(name: string, args: unknown): void {\n if (this.nativeLines.some((l) => l.name === name && sameJSON(l.arguments, args))) return;\n if (this.nativeLines.length === MAX_NATIVE_LINES) {\n this.at.warnOnce(\n \"native:\" + this.tool,\n `wakeshift: the wrapped tool ${this.tool} subscribed a native client to more than ${MAX_NATIVE_LINES} events in one call; only ${MAX_NATIVE_LINES} are named`,\n );\n return;\n }\n this.nativeLines.push({ name, arguments: args });\n }\n\n // end closes the call to further requests, after waiting for any in\n // flight (warning once per tool: the handler should have waited for them).\n async end(): Promise<void> {\n if (this.inflight.size > 0) {\n this.at.warnOnce(\n \"inflight:\" + this.tool,\n `wakeshift: the wrapped tool ${this.tool} returned while a subscribe was in flight; it was waited for: await call.subscribe, call.unsubscribe and call.resolveSession before returning`,\n );\n await Promise.allSettled([...this.inflight]);\n }\n this.ended = true;\n }\n\n // rollback ends every subscription the call created and no other call\n // has renewed since (the core checks the pending record that made it),\n // with reason rolled_back (audited as such, no \"ended\" notice), whatever\n // became of the request.\n async rollback(): Promise<void> {\n for (const c of this.created) {\n try {\n await this.at.wake.requestApp(\"POST\", \"/event-subscriptions/unsubscribe\", { call: this.wire(c.session), name: c.name, arguments: c.arguments, reason: \"rolled_back\", pending: c.pending });\n } catch (err) {\n this.at.wake.warn(`wakeshift: rolling back a failed tool call's subscription (${this.tool}, ${c.name}): ${detailOf(err)}`);\n }\n }\n this.created = [];\n }\n\n // addition asks Wakeshift for the call's block: what the conversation\n // needs to be woken (from the call's pending-addition record, if a\n // subscribe or resolveSession made one; otherwise what any other tool\n // result of the app's carries), and a line per event a native caller\n // should subscribe to. A call that names no conversation, and subscribed\n // nothing, gets nothing (null). Only a failure for a call that subscribed\n // is thrown: without a subscription, the block is a courtesy.\n async addition(): Promise<CallAddition | null> {\n const wire = this.wire();\n if (!this.pending && this.nativeLines.length === 0 && !wire.session && !wire.conversation && !namesConversation(wire.meta)) return null;\n const body: Record<string, unknown> = { call: wire };\n if (this.pending) body.pending = this.pending;\n if (this.nativeLines.length > 0) body.native = this.nativeLines;\n try {\n return await this.at.wake.requestApp<CallAddition>(\"POST\", \"/calls/addition\", body);\n } catch (err) {\n if (this.armed || this.nativeLines.length > 0) throw err;\n this.at.wake.warn(`wakeshift: Wakeshift's addition to a result of ${this.tool}: ${detailOf(err)}`);\n return null;\n }\n }\n}\n\nfunction recognizedOf(a: Partial<Recognized> | undefined): Recognized {\n return { harness: a?.harness ?? null, via: a?.via ?? null, claimed: a?.claimed ?? null };\n}\n\nfunction hasKey(o: unknown, key: string): boolean {\n return !!o && typeof o === \"object\" && !Array.isArray(o) && (o as Record<string, unknown>)[key] !== undefined;\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === \"object\" && !Array.isArray(v);\n}\n\n/**\n * @internal Whether a call comes from a client that subscribes to the app's\n * events itself, on stateless servers too (which never see initialize), in\n * this order: the app's override (events.native); ChatGPT's\n * _meta[\"openai/session\"]; a client name (initialize's, or _meta's, else\n * identify's) or User-Agent of a known native client; a client that\n * declares the MCP Events extension (initialize's capabilities, or\n * _meta's). conversation is ChatGPT's conversation, when it names one.\n */\nexport function nativeOf(at: Pick<AttachContext, \"host\" | \"clientOf\" | \"events\">, extra: unknown, identified?: string): { native: boolean; conversation: string | null } {\n const req = at.host.req(extra);\n const meta = (req.meta ?? {}) as Record<string, unknown>;\n const conversation = typeof meta[\"openai/session\"] === \"string\" && meta[\"openai/session\"] ? (meta[\"openai/session\"] as string) : null;\n if (at.events.native?.(extra)) return { native: true, conversation };\n if (conversation) return { native: true, conversation };\n if (dialectOf(at.clientOf(meta, identified), userAgentOf(req)) === \"chatgpt\") return { native: true, conversation: null };\n const caps = at.host.clientCapabilities();\n if (hasKey(caps?.extensions, EXTENSION_KEY)) return { native: true, conversation: null };\n const metaCaps = meta[\"io.modelcontextprotocol/clientCapabilities\"] as Record<string, unknown> | undefined;\n if (hasKey(metaCaps?.extensions, EXTENSION_KEY)) return { native: true, conversation: null };\n return { native: false, conversation: null };\n}\n\n/**\n * Wakeshift attached to an MCP server: the handle `wake.attach` returns.\n * Wrap a tool's callback with events, and give its input schema\n * Wakeshift's three arguments with inputs. C is your MCP SDK's request\n * context (2.x's ctx, 1.x's extra), which a wrapped call carries as\n * `call.extra`.\n */\nexport class Attached<C = any> {\n /** @internal */\n private readonly wrapped = new Map<string, unknown>();\n\n /** @internal Use wake.attach. */\n constructor(private readonly at: AttachContext) {}\n\n /**\n * A tool's input schema plus Wakeshift's three optional arguments\n * (session_key, harness and conversation_id), for a wrapped tool's\n * inputSchema: a zod object, `inputSchema: attached.inputs(z.object({ table: z.string() }))`\n * (as @modelcontextprotocol/server 2.x takes it), or a shape,\n * `inputSchema: attached.inputs({ table: z.string() })`.\n */\n inputs<O extends z4.ZodObject>(schema: O): z4.ZodObject<O[\"shape\"] & WakeInputsV4, O[\"_zod\"][\"config\"]>;\n inputs<O extends z3.AnyZodObject>(schema: O): z3.ZodObject<O[\"shape\"] & WakeInputsV3, O[\"_def\"][\"unknownKeys\"], O[\"_def\"][\"catchall\"]>;\n inputs<S extends ZodRawShapeCompat>(shape: S): S & WakeInputs;\n inputs(shape: ZodRawShapeCompat | AnySchema): unknown {\n if (isSchema(shape)) {\n const own = getObjectShape(shape);\n if (!own) throw new Error(\"wakeshift: attached.inputs takes a zod object or a shape\");\n for (const k of WAKE_KEYS) if (k in own) throw new Error(`wakeshift: attached.inputs adds ${k} itself: leave it out of the schema`);\n return withFields(shape, byVersion[isZ4Schema(shape) ? \"v4\" : \"v3\"].inputs);\n }\n for (const k of WAKE_KEYS) if (k in (shape ?? {})) throw new Error(`wakeshift: attached.inputs adds ${k} itself: leave it out of the shape`);\n return { ...shape, ...fieldsFor(shape, \"inputs\", this.at.host) };\n }\n\n /**\n * A tool's output schema plus an optional wakeshift string, for a wrapped\n * tool's outputSchema (a zod object or a shape, as inputs takes).\n * Optional: every structured result of a wrapped tool gets the block's\n * text (without the beacon line) in wakeshift, for hosts that show the\n * model only structuredContent, and tools/list names it in the tool's\n * output schema; this declares it in your own schema and types. The\n * block stays in the content too.\n */\n output<O extends z4.ZodObject>(schema: O): z4.ZodObject<O[\"shape\"] & WakeOutputV4, O[\"_zod\"][\"config\"]>;\n output<O extends z3.AnyZodObject>(schema: O): z3.ZodObject<O[\"shape\"] & WakeOutputV3, O[\"_def\"][\"unknownKeys\"], O[\"_def\"][\"catchall\"]>;\n output<S extends ZodRawShapeCompat>(shape: S): S & WakeOutputShape;\n output(shape: ZodRawShapeCompat | AnySchema): unknown {\n if (isSchema(shape)) {\n const own = getObjectShape(shape);\n if (!own) throw new Error(\"wakeshift: attached.output takes a zod object or a shape\");\n if (WAKESHIFT_FIELD in own) throw new Error(\"wakeshift: attached.output adds wakeshift itself: leave it out of the schema\");\n return withFields(shape, byVersion[isZ4Schema(shape) ? \"v4\" : \"v3\"].output);\n }\n if (\"wakeshift\" in (shape ?? {})) throw new Error(\"wakeshift: attached.output adds wakeshift itself: leave it out of the shape\");\n return { ...shape, ...fieldsFor(shape, \"output\", this.at.host) };\n }\n\n /**\n * Wraps a tool's callback, for `server.registerTool(name, …)` with the\n * same name (MCP doesn't tell a callback its tool's name): the handler\n * gets the tool's own arguments and a ToolCall, and returns a string or\n * a CallToolResult; the reply gets Wakeshift's block. The tool's\n * inputSchema must come from attached.inputs (a type error otherwise).\n * Register it on the server passed to attach.\n */\n events<A extends WakeArgs>(name: string, handler: (args: Omit<A, WakeKey>, call: ToolCall<C>) => WrappedResult | Promise<WrappedResult>): WrappedCallback<A, C> {\n if (!name || typeof name !== \"string\") throw new Error(\"wakeshift: attached.events needs the tool's name, as registered\");\n if (typeof handler !== \"function\") throw new Error(\"wakeshift: attached.events needs a handler\");\n const cb = (async (args: Record<string, unknown>, extra: C) => this.run(name, cb, handler as any, args ?? {}, extra)) as unknown as WrappedCallback<A, C>;\n this.wrapped.set(name, cb);\n return cb;\n }\n\n private async run(\n name: string,\n cb: unknown,\n handler: (args: Record<string, unknown>, call: ToolCall<C>) => WrappedResult | Promise<WrappedResult>,\n input: Record<string, unknown>,\n extra: C,\n ): Promise<CallToolResult> {\n const host = this.at.host;\n const tool = host.registeredTool(name);\n if (tool === undefined || (tool && (tool.handler ?? tool.callback) !== cb)) {\n throw new Error(`wakeshift: attached.events(\"${name}\", …) isn't the tool named ${name} on the server passed to attach: register it with the same name, on that server`);\n }\n let outputSchema: unknown;\n if (tool) {\n const shape = getObjectShape(normalizeObjectSchema(tool.inputSchema));\n if (!shape || WAKE_KEYS.some((k) => !(k in shape))) {\n throw new Error(`wakeshift: the tool ${name} doesn't take Wakeshift's arguments: make its inputSchema with attached.inputs(…)`);\n }\n outputSchema = tool.outputSchema;\n } else {\n this.at.warnOnce(\"internals\", \"wakeshift: this MCP SDK keeps its tools where Wakeshift can't read them, so wrapped tools' registration and output aren't checked\");\n }\n const str = (k: string) => (typeof input[k] === \"string\" && (input[k] as string) ? (input[k] as string) : undefined);\n const call = new CallScope<C>(this.at, name, extra, { session: str(SESSION_ARG), harness: str(HARNESS_ARG), conversation: str(CONVERSATION_ARG) });\n const appArgs: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) if (!(WAKE_KEYS as readonly string[]).includes(k)) appArgs[k] = v;\n\n let result: WrappedResult;\n try {\n result = await handler(appArgs, call);\n } catch (err) {\n await call.end();\n await call.rollback();\n throw err;\n }\n await call.end();\n // Rollback is decided from the final result, the one the client would\n // receive: MCP validates the output after this callback returns, so\n // the wrapper checks it the same way first.\n if (result === null || result === undefined || (typeof result !== \"string\" && typeof result !== \"object\")) {\n await call.rollback();\n return result as unknown as CallToolResult;\n }\n if ((typeof result === \"object\" && result.isError) || host.req(extra).signal?.aborted || !(await host.validOutput(outputSchema, result))) {\n await call.rollback();\n return typeof result === \"string\" ? { content: [{ type: \"text\", text: result }] } : result;\n }\n let add: CallAddition | null;\n try {\n add = await call.addition();\n } catch (err) {\n // The conversation is subscribed but wouldn't learn how it's woken:\n // the call fails, as one whose handler failed does.\n await call.rollback();\n this.at.wake.warn(`wakeshift: Wakeshift's block for a result of ${name} failed, so the call's subscriptions were rolled back: ${detailOf(err)}`);\n return { isError: true, content: [{ type: \"text\", text: `Wakeshift couldn't finish setting up this conversation's wakes (${detailOf(err)}). Try again.` }] };\n }\n const out = mergeBlock(result, add ?? {});\n if (isRecord(out.structuredContent) && WAKESHIFT_FIELD in out.structuredContent && !(await host.validOutput(outputSchema, out))) {\n // A schema that refuses fields it doesn't name (a strict object):\n // MCP would refuse the result, so it goes without the field.\n const { [WAKESHIFT_FIELD]: _dropped, ...own } = out.structuredContent;\n out.structuredContent = own;\n this.at.warnOnce(\n \"output:\" + name,\n `wakeshift: the wrapped tool ${name}'s outputSchema refuses a wakeshift field, so hosts that show only structuredContent won't see how this conversation is woken: make it with attached.output`,\n );\n }\n return out;\n }\n\n /**\n * @internal Wraps the server's tools/list handler so each wrapped tool's\n * object output schema names wakeshift (withWakeshiftField). McpServer\n * sets the handler when the first tool is registered, perhaps after\n * attach, so a later set is wrapped too (as tasks.ts does).\n */\n amendToolsList(): void {\n type Handler = (request: any, extra: any) => Promise<any>;\n const handlers = this.at.host.handlers();\n if (!handlers) return; // a future SDK: schemas stay as registered\n const wrap =\n (h: Handler): Handler =>\n async (request, extra) => {\n const out = await h(request, extra);\n if (out && Array.isArray(out.tools)) this.amendTools(out.tools);\n return out;\n };\n const h = handlers.get(\"tools/list\");\n if (h) Map.prototype.set.call(handlers, \"tools/list\", wrap(h));\n const set = handlers.set.bind(handlers);\n handlers.set = (method: string, h: Handler) => set(method, method === \"tools/list\" ? wrap(h) : h);\n }\n\n private amendTools(tools: unknown[]): void {\n for (let i = 0; i < tools.length; i++) {\n const t = tools[i] as { name?: unknown; outputSchema?: unknown } | null;\n if (!t || typeof t !== \"object\" || typeof t.name !== \"string\" || !this.wrapped.has(t.name) || !t.outputSchema) continue;\n const schema = withWakeshiftField(t.outputSchema);\n if (schema !== t.outputSchema) tools[i] = { ...t, outputSchema: schema };\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"wakeshift.js","sourceRoot":"","sources":["../src/wakeshift.ts"],"names":[],"mappings":"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","sourcesContent":["import { WakeshiftError } from \"./errors.js\";\nimport type { AnySchema } from \"./zod.js\";\nimport type { HostContext, McpServerLike } from \"./mcp.js\";\nimport { v1Req, type Req } from \"./host.js\";\nimport { WakeEvent, attachEvents, type AttachOptions, type EventOptions, type EventTypeManifest } from \"./events.js\";\nimport type { Attached } from \"./toolcall.js\";\nimport { parseKey, signAssertion, type AppKey, isTestKey } from \"./key.js\";\nimport { retryRefused } from \"./retry.js\";\nimport { takesTasks } from \"./discover.js\";\n\n/** Wakeshift's production core, the default for every key but an older wst_test_ one. Override with `core` or WAKESHIFT_CORE. */\nexport const DEFAULT_CORE = \"https://app.wakeshift.ai\";\n\n/** The tool argument an agent passes its session key in (a result gives it one). */\nexport const SESSION_ARG = \"session_key\";\n\n/** The tool argument an agent says which program it runs in with. */\nexport const HARNESS_ARG = \"harness\";\n\n/**\n * The tool argument an agent passes its own ID for the conversation in,\n * when its program gives it one (Cursor and Grok Bot: CURSOR_CONVERSATION_ID).\n */\nexport const CONVERSATION_ARG = \"conversation_id\";\n\nexport interface WakeshiftOptions {\n /** The app key from the console: wst_ and 50 characters (or an older wst_test_… or wst_live_… key). */\n key: string;\n /**\n * Wakeshift's base URL: the console you got the key from. Default:\n * WAKESHIFT_CORE from the environment, else https://app.wakeshift.ai.\n * An older wst_test_… key has no default: it needs one of the two.\n */\n core?: string;\n /** Default: the global fetch. */\n fetch?: typeof fetch;\n /** Per-request timeout in milliseconds. Default 20000. */\n timeoutMs?: number;\n /**\n * Called with a problem that doesn't fail the call but makes it work less\n * well: each time for a failure, such as a failed call's subscription\n * that couldn't be rolled back, and once for each kind of misuse, such as\n * a wrapped tool that returned with a subscribe still in flight. Default:\n * console.warn.\n */\n onWarning?: (message: string) => void;\n}\n\n/** @internal How one request to Wakeshift differs: a longer timeout, and a signal that ends it early. */\nexport interface RequestOptions {\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\n/** Which app a key is, as Wakeshift says (wake.app()). */\nexport interface AppInfo {\n id: string;\n name: string;\n /** The key: the console's ID for it, and its name (\"\" if Wakeshift didn't say). */\n key: { id: string; name: string };\n}\n\n/**\n * @internal A tool call as Wakeshift takes it: who called, from which\n * client, in which conversation. The wrapper (attached.events) and attach's\n * own tools pack it.\n */\nexport interface Call {\n /** The app's own ID for the person (optional). */\n user?: string;\n /** The MCP client's name (initialize's clientInfo.name); a stateless server has none. */\n client: string;\n /** The tool call's _meta (Codex sends its thread there). */\n meta?: Record<string, unknown>;\n /** The session handle an earlier result gave the agent. */\n session?: string;\n /** The MCP request's HTTP User-Agent. */\n user_agent?: string;\n /** The conversation's ID as the agent passed it (conversation_id). */\n conversation?: string;\n /** The program the agent says it runs in (harness): a hint, never a credential. */\n harness?: string;\n /** The name of the tool being called: a connector beacon in its result names it. */\n tool?: string;\n /** The client takes MCP tasks (protocol 2026-07-28 with the tasks extension), and attach serves the wait tool for it (tasks.ts). */\n tasks?: boolean;\n}\n\n/**\n * What Wakeshift recognized the calling conversation's harness as, and by\n * which signal (\"claim\": only the agent's harness argument named it); both\n * null when nothing named one. claimed is what the agent said (normalized:\n * \"Grok Bot\" is grok-bot), null if it didn't; a claimed that differs from\n * harness was ignored, since it contradicted what the call was recognized\n * as (the claim only refines it: Cursor's calls may be Grok Bot's).\n */\nexport interface Recognized {\n harness: string | null;\n via: \"client\" | \"meta\" | \"user_agent\" | \"claim\" | null;\n claimed: string | null;\n}\n\n/**\n * Seconds, or a string like \"90s\", \"5m\", \"2h\", \"30d\". Wakeshift checks the\n * value: days must be whole (\"1.5d\" is a bad_request; use \"36h\").\n */\nexport type Duration = number | `${number}${\"s\" | \"m\" | \"h\" | \"d\"}`;\n\n/**\n * One recipient of a personal event's emit, beside a plain user (the app's\n * ID for them: every subscription they have to the event with these\n * arguments): `{ user, subscription }`, exactly that subscription of that\n * user's; `{ native: user }`, only that user's native (webhook)\n * subscriptions to the event with these arguments.\n */\nexport type Recipient = { user: string; subscription: string } | { native: string };\n\n/** What an event's emit did. */\nexport interface Emitted {\n /** Conversations it woke (or will). */\n matched: number;\n /** An earlier emit had this occurrence's id. */\n duplicate: boolean;\n /** User and native recipients with no live subscription it reached (an emit to several recipients only). */\n unmatched: (string | Recipient)[];\n /** Subscription recipients no longer live (or not that user's). */\n ended: (string | Recipient)[];\n}\n\n// recipientsOf reads an emit's unmatched or ended list: \"user\",\n// { native: user } or { user, subscription }.\nfunction recipientsOf(raw: unknown): (string | Recipient)[] {\n if (!Array.isArray(raw)) return [];\n const out: (string | Recipient)[] = [];\n for (const r of raw) {\n if (typeof r === \"string\") out.push(r);\n else if (r && typeof r === \"object\") {\n const m = r as Record<string, unknown>;\n if (typeof m.native === \"string\" && m.native) out.push({ native: m.native });\n else if (typeof m.user === \"string\") out.push({ user: m.user, subscription: typeof m.subscription === \"string\" ? m.subscription : \"\" });\n }\n }\n return out;\n}\n\n/**\n * How a connected conversation receives what it's woken by: stream (it holds\n * a connection to Wakeshift open), poll (it asked Wakeshift for messages\n * within the last minute), hooks (Wakeshift's connector on the user's\n * computer delivers to it) or webhook (its client subscribed with MCP\n * Events, and Wakeshift sends to the client's webhook).\n */\nexport type Via = \"stream\" | \"poll\" | \"hooks\" | \"webhook\";\n\n/** An event's publish URL (`event.publishUrl`). */\nexport interface PublishUrl {\n id: string;\n event?: string;\n url: string;\n}\n\n/** An event pattern a manifest asks for, and what the person is told it's for. */\nexport interface ScopeEvent {\n pattern: string;\n description: string;\n}\n\n/** What the app may do with the agents in the workspaces it keeps (manifest.agent). */\nexport interface AgentScope {\n wake: ScopeEvent[];\n post: ScopeEvent[];\n /** Days the person's consent lasts. */\n ttl_days: number;\n /** At most max wake-ups in any seconds, on top of Wakeshift's own limits. */\n wake_limits?: { seconds: number; max: number }[];\n /** What the person should say to their agent once it's connected; at most 120 characters. */\n start_prompt?: string;\n}\n\n/** What the app tells Wakeshift it may do (see wake.publishManifest). */\nexport interface Manifest {\n description?: string;\n agent?: AgentScope;\n /** Event types defined elsewhere, not with defineEvent: Wakeshift gets these, then the defined ones. Listing a defined one is an error. */\n events?: EventTypeManifest[];\n /** Your app wakes its users' agents with what other people and their agents do there (messages, moves): the consent screen says agents of people they don't know can wake theirs. */\n others_can_wake?: boolean;\n /**\n * Your MCP tools (as your server lists them) that agents' programs can run without asking each time:\n * tools that only read, and routine ones the agent calls on every wake that reach only what it already joined.\n * Never one that deletes, spends, or reaches people the user hasn't chosen. When a user connects Claude Code\n * or Cursor CLI, Wakeshift offers to allow exactly these, by name, in the same question as its install.\n * Letters, digits, _ and -; at most 20.\n */\n preapprove_tools?: string[];\n}\n\n/** The parts of an MCP tool callback's `extra` that Wakeshift reads. */\nexport interface ToolExtra {\n _meta?: Record<string, unknown>;\n requestInfo?: { headers?: Record<string, string | string[] | undefined> };\n}\n\n/** @internal The User-Agent of the HTTP request a tool call came in (\"\" if there's none, e.g. over stdio). */\nexport function userAgentOf(req: Req): string {\n return req.header(\"user-agent\") || req.header(\"User-Agent\");\n}\n\n/** @internal Packs a tool call as Wakeshift takes it: empty fields left out, the agent's claims trimmed. */\nexport function packCall(c: {\n meta?: Record<string, unknown>;\n clientName: string;\n user?: string;\n session?: string;\n userAgent?: string;\n harness?: string;\n conversation?: string;\n tool?: string;\n tasks?: boolean;\n}): Call {\n const out: Call = { client: c.clientName ?? \"\" };\n if (c.user) out.user = c.user;\n if (c.meta && Object.keys(c.meta).length > 0) out.meta = c.meta;\n if (c.session) out.session = c.session;\n if (c.userAgent) out.user_agent = c.userAgent;\n if (c.harness?.trim()) out.harness = c.harness.trim();\n if (c.conversation?.trim()) out.conversation = c.conversation.trim();\n if (c.tool?.trim()) out.tool = c.tool.trim();\n if (c.tasks) out.tasks = true;\n return out;\n}\n\n/**\n * @internal The call to one of attach's own tools (subscribe_events and the\n * others): its _meta and User-Agent, the client's name, the user, and\n * session_key, harness and conversation_id from its arguments.\n */\nexport function toolCallOf(extra: Req | ToolExtra | undefined, client: string, user: string | undefined, args: Record<string, unknown>, tool: string): Call {\n const req = v1Req(extra); // a request already read passes through\n return packCall({\n meta: req.meta,\n clientName: client,\n user,\n session: str(args, SESSION_ARG),\n userAgent: userAgentOf(req),\n harness: str(args, HARNESS_ARG),\n conversation: str(args, CONVERSATION_ARG),\n tool,\n tasks: takesTasks(req.meta, req),\n });\n}\n\n// str is a tool argument's value if it's a string.\nfunction str(args: Record<string, unknown> | undefined, name: string): string | undefined {\n return typeof args?.[name] === \"string\" ? (args[name] as string) : undefined;\n}\n\n/**\n * The Wakeshift client for an app: define the events your app offers,\n * attach them to your MCP server, and emit them when they happen.\n */\nexport class Wakeshift {\n readonly core: string;\n private readonly key: AppKey;\n // The app's ID: from the key, if it names the app, or else from app().\n private knownAppId: string | null;\n private appInfo?: Promise<AppInfo>;\n private readonly fetchFn: typeof fetch;\n private readonly timeoutMs: number;\n private readonly warnFn: (message: string) => void;\n private readonly warned = new Set<string>();\n\n constructor(opts: WakeshiftOptions) {\n if (!opts?.key) throw new Error(\"wakeshift: no app key (WAKESHIFT_KEY?)\");\n this.key = parseKey(opts.key);\n this.knownAppId = this.key.appId;\n // Test keys come from staging and local consoles, and one sent to\n // production fails in a way that's hard to read: ask for the core.\n const core = opts.core || process.env.WAKESHIFT_CORE || (isTestKey(opts.key) ? \"\" : DEFAULT_CORE);\n if (!core) {\n throw new Error(\n \"wakeshift: no core URL for this test key: set WAKESHIFT_CORE, or pass { core }, to the address of the console the key came from (for example https://app.staging.wakeshift.ai)\",\n );\n }\n this.core = core.replace(/\\/+$/, \"\");\n // A request the load balancer refused during a rollout is sent again (retry.ts).\n this.fetchFn = retryRefused(opts.fetch ?? globalThis.fetch);\n this.timeoutMs = opts.timeoutMs ?? 20_000;\n this.warnFn = opts.onWarning ?? ((m) => console.warn(m));\n }\n\n /**\n * The app's ID. An older key (wst_test_…, wst_live_…) names it; for a\n * current key, which doesn't, this throws until `await wake.app()` has\n * asked Wakeshift.\n */\n get appId(): string {\n if (!this.knownAppId) throw new Error(\"wakeshift: call await wake.app() first: this key doesn't name its app\");\n return this.knownAppId;\n }\n\n /**\n * Which app the key is, as Wakeshift says: its ID and name, and the\n * key's. Asks once\n * (GET /api/apps/v1/app) and remembers the answer; afterwards\n * `wake.appId` works for any key.\n */\n app(): Promise<AppInfo> {\n this.appInfo ??= this.request<{ id?: unknown; name?: unknown; key?: { key_id?: unknown; name?: unknown } }>(\"GET\", \"/app\")\n .then((r) => {\n if (typeof r.id !== \"string\" || !r.id) {\n throw new WakeshiftError(200, \"bad_response\", `Wakeshift at ${this.core} didn't say which app this key is`);\n }\n const id = this.knownAppId ?? r.id;\n this.knownAppId = id;\n const str = (v: unknown) => (typeof v === \"string\" ? v : \"\");\n return { id, name: str(r.name), key: { id: str(r.key?.key_id), name: str(r.key?.name) } };\n })\n .catch((err: unknown) => {\n this.appInfo = undefined; // a later call asks again\n throw err;\n });\n return this.appInfo;\n }\n\n /** @internal The app's ID if it's known yet (the key names it, or app() has answered), else null. */\n knownApp(): string | null {\n return this.knownAppId;\n }\n\n // A fresh assertion of the app's identity, naming the app once it's known.\n private assertion(): string {\n return signAssertion(this.key, this.core, Date.now(), this.knownAppId);\n }\n\n /** @internal Reports a problem through onWarning, every time. */\n warn(message: string): void {\n this.warnFn(message);\n }\n\n /** @internal Reports a warning, once per kind. */\n warnOnce(kind: string, message: string): void {\n if (this.warned.has(kind)) return;\n this.warned.add(kind);\n this.warnFn(message);\n }\n\n /** Stops a publish URL working (410 from then on). */\n async revokePublishUrl(id: string): Promise<void> {\n await this.request(\"DELETE\", `/events/publish-urls/${encodeURIComponent(id)}`);\n }\n\n /**\n * Deletes everything Wakeshift keeps for one of the app's users: their\n * conversations, subscriptions, events and deliveries, publish URLs for\n * them, and their ID. Open streams close. Returns false if there was nothing to forget.\n */\n async forgetUser(user: string): Promise<boolean> {\n return (await this.request<{ forgotten: boolean }>(\"POST\", \"/users/forget\", { user })).forgotten;\n }\n\n /**\n * Tells Wakeshift what the app may do, replacing what it said before: m,\n * with the events you defined (defineEvent) after m's own events. An\n * event both defined and listed in m.events is an error, and nothing is\n * sent. You needn't call it: a process that serves your tools (attach)\n * sends the manifest automatically, merged into the one Wakeshift has.\n * Call it to remove an event or clear a setting. Once called, m's\n * settings are what every automatic send carries (even if this one\n * failed), with the events defined by then. Returns the manifest as\n * Wakeshift keeps it.\n */\n async publishManifest(m: Manifest): Promise<Manifest> {\n const version = this.manifestVersion; // before the body: a later defineEvent is sent again\n const body = this.manifestBody(m);\n this.manifestBase = m;\n const run = this.serial(() => this.request<Manifest>(\"PUT\", \"/manifest\", body));\n this.track(run, version);\n return run;\n }\n\n // serial runs a send after every send before it, explicit or automatic,\n // so the last manifest Wakeshift gets is the newest.\n private sending: Promise<unknown> = Promise.resolve();\n private serial<T>(send: () => Promise<T>): Promise<T> {\n const run = this.sending.then(send, send);\n this.sending = run.catch(() => undefined);\n return run;\n }\n\n // track makes a send the one event calls wait for: once it's done,\n // Wakeshift has the manifest for the events defined at version, unless it\n // failed (the next call sends again) or an event was defined since.\n private track(send: Promise<unknown>, version: number): void {\n const p: Promise<void> = send.then(() => {\n if (this.manifestVersion !== version && this.published === p) this.published = null;\n });\n this.published = p;\n p.catch(() => {\n if (this.published === p) this.published = null;\n });\n }\n\n // The manifest as Wakeshift gets it: m's events, then the defined ones,\n // refusing a name in both.\n private manifestBody(m: Manifest): Manifest {\n const listed = m.events ?? [];\n for (const name of this.events.keys()) {\n if (listed.some((e) => e.name === name)) {\n throw new Error(`wakeshift: event ${name} is defined with defineEvent and listed in the manifest's events: keep one`);\n }\n }\n const events = [...listed, ...[...this.events.values()].map((e) => e.manifest)];\n const { events: _listed, ...rest } = m;\n return events.length > 0 ? { ...rest, events } : rest;\n }\n\n // The automatic send, from a process that serves the app's tools: the\n // settings the app last published (only those it set), with the defined\n // events, merged into the manifest Wakeshift has, so it never removes an\n // event or clears a setting another process sent.\n private async sendManifest(): Promise<void> {\n const body: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(this.manifestBody(this.manifestBase ?? {}))) {\n if (v === undefined || v === null || v === \"\" || v === false || (Array.isArray(v) && v.length === 0)) continue;\n body[k] = v;\n }\n if (!body.events) return; // nothing to add (attach refuses with no events, but never send an empty list)\n await this.request(\"POST\", \"/manifest/merge\", body);\n }\n\n // ── Events (MCP Events, natively or bridged) ──────────────────────────\n\n private readonly events = new Map<string, WakeEvent>();\n // What publishManifest was last given (null: nothing yet); whether this\n // process serves the app's tools (attach: only then is the manifest sent\n // automatically); whether Wakeshift has the manifest for the events\n // defined now (the send; null: not yet, or a defineEvent since); and how\n // many defineEvents there were.\n private manifestBase: Manifest | null = null;\n private serving = false;\n private published: Promise<void> | null = null;\n private manifestVersion = 0;\n\n /**\n * Defines one of the app's event types: what a subscriber picks (args),\n * what each occurrence carries (payload), and the line an agent reads\n * first (text). Returns the event, whose emit sends occurrences. Define\n * every event before attach.\n *\n * const message = wake.defineEvent(\"chat.message\", {\n * description: \"A new message in a channel\",\n * args: z.object({ channel: z.string() }),\n * payload: z.object({ from: z.string(), text: z.string() }),\n * text: (m) => `${m.from}: ${m.text}`,\n * })\n * await message.emit({ channel: \"eng\" }, { from: \"ada\", text: \"shipped\" })\n */\n defineEvent<A extends AnySchema, P extends AnySchema>(name: string, opts: EventOptions<A, P>): WakeEvent<A, P> {\n if (this.events.has(name)) throw new Error(`wakeshift: event ${name} is defined twice`);\n const ev = new WakeEvent<A, P>(this, name, opts);\n this.events.set(name, ev as unknown as WakeEvent);\n this.published = null; // the manifest changed: sent again when next needed\n this.manifestVersion++;\n return ev;\n }\n\n /**\n * Attaches Wakeshift to your MCP server, before you connect it: the one\n * call that connects the two. Today it serves the defined events: MCP\n * Events (events/list, events/subscribe, events/unsubscribe) for clients\n * that speak it, such as ChatGPT, and the subscribe_events tool for\n * everyone else, whom Wakeshift wakes its own ways; plus\n * unsubscribe_events and list_subscriptions for every client, so a person\n * can always see and stop what they're subscribed to.\n *\n * const attached = wake.attach(server, { identify: (extra) => ({ user: myUser(extra) }) })\n *\n * It returns the handle your own tools use to subscribe the conversation\n * calling them: wrap a tool's callback with attached.events, and give it\n * Wakeshift's arguments with attached.inputs.\n *\n * server is an McpServer from @modelcontextprotocol/server 2.x or\n * @modelcontextprotocol/sdk 1.x; identify gets that SDK's own request\n * context (2.x's ctx, 1.x's extra).\n */\n attach<S extends McpServerLike>(server: S, opts: AttachOptions<HostContext<S>> = {}): Attached<HostContext<S>> {\n const attached = attachEvents(this, server, [...this.events.values()], opts);\n this.serving = true; // the manifest is sent automatically from now on\n return attached;\n }\n\n /**\n * @internal Sends the manifest with the defined events, once (again after\n * a defineEvent), from a process that serves the app's tools (attach). A\n * process that only emits never sends it: its events may be fewer, or\n * older, than its server's.\n */\n ensureEvents(): Promise<void> {\n if (!this.serving) return Promise.resolve();\n if (!this.published) this.track(this.serial(() => this.sendManifest()), this.manifestVersion);\n return this.published!;\n }\n\n /** @internal An event's emit. */\n async emitEvent(e: { name: string; arguments: unknown; payload: unknown; text: string; id?: string; to?: string | (string | Recipient)[] }): Promise<Emitted> {\n await this.ensureEvents();\n const body: Record<string, unknown> = { name: e.name, arguments: e.arguments, payload: e.payload, text: e.text };\n if (e.id) body.id = e.id;\n if (e.to) body.to = e.to;\n const out = await this.request<{ matched: number; duplicate?: boolean; unmatched?: unknown; ended?: unknown }>(\"POST\", \"/events/emit\", body);\n return { matched: out.matched, duplicate: !!out.duplicate, unmatched: recipientsOf(out.unmatched), ended: recipientsOf(out.ended) };\n }\n\n /**\n * @internal A call to the app API (the events machinery's), after the\n * manifest with the defined events is published. opts: a longer timeout\n * (a held tasks/get), and a signal that ends it early.\n */\n async requestApp<T>(method: string, path: string, body?: unknown, opts: RequestOptions = {}): Promise<T> {\n await this.ensureEvents();\n return this.request<T>(method, path, body, opts);\n }\n\n // ── Users' workspaces ──────────────────────────────────────────────────\n\n /**\n * The workspace Wakeshift keeps for one of the app's users (user: the\n * app's own ID for them, as attach's identify gives it), created on first\n * use. Wakeshift keeps that user's conversations there.\n */\n async workspace(user: string, name: string): Promise<string> {\n return (await this.request<{ workspace: string }>(\"POST\", \"/workspaces\", { external_id: user, name })).workspace;\n }\n\n /** Creates an agent in one of the app's workspaces (if new), and its grant for the app's manifest scope. Returns the grant's ID. */\n async addAgent(workspace: string, agent: string, displayName: string): Promise<string> {\n return (await this.request<{ grant: string }>(\"POST\", `/workspaces/${encodeURIComponent(workspace)}/agents`, { agent, display_name: displayName })).grant;\n }\n\n /**\n * Checks that one of the app's agents still has a live grant, asking\n * Wakeshift each time. Throws a WakeshiftError: no_grant once the grant is\n * revoked, unknown_workspace once the workspace is forgotten.\n */\n async checkAgent(workspace: string, agent: string): Promise<void> {\n await this.request(\"POST\", `/workspaces/${encodeURIComponent(workspace)}/agents/${encodeURIComponent(agent)}/token`);\n }\n\n private async request<T>(method: string, path: string, body?: unknown, opts: RequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = { Authorization: \"Bearer \" + this.assertion() };\n if (body !== undefined) headers[\"Content-Type\"] = \"application/json\";\n let resp: Response;\n let text: string;\n const timeoutMs = Math.max(opts.timeoutMs ?? 0, this.timeoutMs);\n const timeout = AbortSignal.timeout(timeoutMs);\n try {\n resp = await this.fetchFn(this.core + \"/api/apps/v1\" + path, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: opts.signal ? AbortSignal.any([timeout, opts.signal]) : timeout,\n });\n text = await resp.text();\n } catch (err) {\n throw this.unreachable(err, timeoutMs);\n }\n let json: any;\n try {\n json = text ? JSON.parse(text) : undefined;\n } catch {\n json = undefined;\n }\n if (!resp.ok) {\n // Wakeshift's code, message and reason where it sent them as strings, else\n // the body's start, else the status's text, as every SDK reads it (test/errors.json).\n const e = json?.error !== null && typeof json?.error === \"object\" ? json.error : {};\n const str = (v: unknown) => (typeof v === \"string\" ? v : \"\");\n throw new WakeshiftError(resp.status, str(e.code), str(e.message) || text.slice(0, 200) || resp.statusText, {\n reason: str(e.reason) || undefined,\n });\n }\n // A 2xx that isn't Wakeshift's JSON: a proxy's page, or a wrong core.\n if (json === null || typeof json !== \"object\" || Array.isArray(json)) {\n throw new WakeshiftError(\n resp.status,\n \"bad_response\",\n `Wakeshift at ${this.core} answered ${resp.status} without a JSON object. Check that WAKESHIFT_CORE, or the core option, is the address of the console your key came from`,\n );\n }\n return json as T;\n }\n\n // A request that got no answer. Name the core it went to: a wrong or\n // missing WAKESHIFT_CORE is the usual cause.\n private unreachable(err: unknown, timeoutMs = this.timeoutMs): WakeshiftError {\n const e = err as { name?: string; message?: string; cause?: { code?: string; message?: string } } | undefined;\n const why =\n e?.name === \"TimeoutError\" || e?.name === \"AbortError\"\n ? `no answer within ${timeoutMs / 1000}s`\n : [e?.message, e?.cause?.code ?? e?.cause?.message].filter(Boolean).join(\": \") || String(err);\n return new WakeshiftError(\n 0,\n \"unreachable\",\n `can't reach Wakeshift at ${this.core} (${why}). Check that WAKESHIFT_CORE, or the core option, is the address of the console your key came from`,\n { cause: err },\n );\n }\n}\n"]}
package/dist/zod.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,gEAAgE;AAChE,sEAAsE;AACtE,qEAAqE;AACrE,kDAAkD;AAIlD,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAiBtC,+DAA+D;AAC/D,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,OAAO,CAAC,CAAE,CAA+B,EAAE,IAAI,CAAC;AAClD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAK,CAAY,IAAI,MAAM,IAAK,CAAY,CAAC,CAAC;AAC9F,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAoC,CAAC,CAAC;IACzF,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAsC,CAAC,CAAC;IACpG,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;AACtE,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,SAAS,CAAsB,MAAS,EAAE,IAAa;IACrE,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAiC,CAAC;IAC9F,OAAQ,MAAwB,CAAC,SAAS,CAAC,IAAI,CAAiC,CAAC;AACnF,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAsB,MAAS,EAAE,IAAa;IAChF,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAiC,CAAC;IAC3G,OAAO,CAAC,MAAO,MAAwB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAiC,CAAC;AAChG,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;QAC5B,CAAC,CAAE,MAAmD,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK;QACvE,CAAC,CAAE,MAA8B,CAAC,KAAK,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,GAAG,EAA+B,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,GAAgC,CAAC;AAC1C,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,CAAC,GAAG,MAAkG,CAAC;IAC7G,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,cAAc,GAClB,MAAM,CAAC,MAAM,GAAG,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAE,CAAwB,CAAC,IAAI,KAAK,SAAS,IAAK,CAAwB,CAAC,IAAI,KAAK,SAAS,IAAI,OAAQ,CAAyB,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC;QACvN,IAAI,cAAc;YAAE,OAAO,eAAe,CAAC,MAA2B,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;QACxB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC;YAAE,OAAO,MAAyB,CAAC;IAClG,CAAC;SAAM,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,MAAyB,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,uCAAuC;AACvC,MAAM,YAAY,GAAiG,MAAM,MAAM;AAC7H,yBAAyB,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAC/F,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAEzB,mHAAmH;AACnH,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAA4B,CAAC;IAC1H,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,sJAAsJ,CAAC,CAAC;IAC1K,CAAC;IACD,OAAO,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC","sourcesContent":["// zod 3 and zod 4 side by side, without either MCP SDK: the types and\n// helpers the SDK used to take from @modelcontextprotocol/sdk's\n// zod-compat, so it loads whichever MCP SDK an app has (host.ts). The\n// definitions follow that module's, so a schema is read, checked and\n// rendered as JSON Schema the same way as before.\n\nimport type * as z3 from \"zod/v3\";\nimport type * as z4 from \"zod/v4/core\";\nimport * as z3rt from \"zod/v3\";\nimport * as z4mini from \"zod/v4-mini\";\n\n/** A zod schema, from zod 3's API or zod 4's (classic or mini). */\nexport type AnySchema = z3.ZodTypeAny | z4.$ZodType;\n/** An object schema, or any schema (as the MCP SDK takes it). */\nexport type AnyObjectSchema = z3.AnyZodObject | z4.$ZodObject | AnySchema;\n/** A zod shape: { field: schema }. */\nexport type ZodRawShapeCompat = Record<string, AnySchema>;\n/** What a schema parses to. */\nexport type SchemaOutput<S> = S extends z3.ZodTypeAny ? z3.infer<S> : S extends z4.$ZodType ? z4.output<S> : never;\n/** What a schema takes. */\nexport type SchemaInput<S> = S extends z3.ZodTypeAny ? z3.input<S> : S extends z4.$ZodType ? z4.input<S> : never;\n/** What a shape parses to, field by field. */\nexport type ShapeOutput<Shape extends ZodRawShapeCompat> = { [K in keyof Shape]: SchemaOutput<Shape[K]> };\n\ntype ParseResult<T> = { success: true; data: T } | { success: false; error: unknown };\n\n/** @internal Whether a schema is zod 4's (classic or mini). */\nexport function isZ4Schema(s: unknown): s is z4.$ZodType {\n return !!(s as { _zod?: unknown } | null)?._zod;\n}\n\n/** @internal Whether a value is a zod schema of either major. */\nexport function isSchema(v: unknown): v is AnySchema {\n return !!v && typeof v === \"object\" && (\"_def\" in (v as object) || \"_zod\" in (v as object));\n}\n\n/** @internal An object schema of a shape, in the zod API its fields use (zod 4 mini for an empty shape). */\nexport function objectFromShape(shape: ZodRawShapeCompat): AnyObjectSchema {\n const values = Object.values(shape);\n if (values.length === 0) return z4mini.object({});\n if (values.every(isZ4Schema)) return z4mini.object(shape as Record<string, z4.$ZodType>);\n if (values.every((s) => !isZ4Schema(s))) return z3rt.object(shape as Record<string, z3.ZodTypeAny>);\n throw new Error(\"wakeshift: a shape mixes zod 3 and zod 4 schemas\");\n}\n\n/** @internal Parses with either major. */\nexport function safeParse<S extends AnySchema>(schema: S, data: unknown): ParseResult<SchemaOutput<S>> {\n if (isZ4Schema(schema)) return z4mini.safeParse(schema, data) as ParseResult<SchemaOutput<S>>;\n return (schema as z3.ZodTypeAny).safeParse(data) as ParseResult<SchemaOutput<S>>;\n}\n\n/** @internal Parses with either major, allowing async refinements. */\nexport async function safeParseAsync<S extends AnySchema>(schema: S, data: unknown): Promise<ParseResult<SchemaOutput<S>>> {\n if (isZ4Schema(schema)) return (await z4mini.safeParseAsync(schema, data)) as ParseResult<SchemaOutput<S>>;\n return (await (schema as z3.ZodTypeAny).safeParseAsync(data)) as ParseResult<SchemaOutput<S>>;\n}\n\n/** @internal An object schema's shape (undefined for anything else). */\nexport function getObjectShape(schema: unknown): Record<string, AnySchema> | undefined {\n if (!schema) return undefined;\n const raw = isZ4Schema(schema)\n ? (schema as { _zod?: { def?: { shape?: unknown } } })._zod?.def?.shape\n : (schema as { shape?: unknown }).shape;\n if (!raw) return undefined;\n if (typeof raw === \"function\") {\n try {\n return raw() as Record<string, AnySchema>;\n } catch {\n return undefined;\n }\n }\n return raw as Record<string, AnySchema>;\n}\n\n/** @internal A schema or shape as an object schema (a shape is wrapped); undefined if it's neither. */\nexport function normalizeObjectSchema(schema: unknown): AnyObjectSchema | undefined {\n if (!schema || typeof schema !== \"object\") return undefined;\n const s = schema as { _def?: unknown; _zod?: { def?: { type?: string; shape?: unknown } }; shape?: unknown };\n if (!s._def && !s._zod) {\n const values = Object.values(schema);\n const looksLikeShape =\n values.length > 0 &&\n values.every((v) => typeof v === \"object\" && v !== null && ((v as { _def?: unknown })._def !== undefined || (v as { _zod?: unknown })._zod !== undefined || typeof (v as { parse?: unknown }).parse === \"function\"));\n if (looksLikeShape) return objectFromShape(schema as ZodRawShapeCompat);\n }\n if (isZ4Schema(schema)) {\n const def = s._zod?.def;\n if (def && (def.type === \"object\" || def.shape !== undefined)) return schema as AnyObjectSchema;\n } else if (s.shape !== undefined) {\n return schema as AnyObjectSchema;\n }\n return undefined;\n}\n\n// zod 3 schemas are rendered by @modelcontextprotocol/sdk's own converter\n// (zod-to-json-schema, which it depends on), loaded only if it's installed:\n// zod 4 renders its own. An app on @modelcontextprotocol/server 2.x writes\n// zod 4 schemas, as that SDK requires.\nconst v1JsonSchema: { toJsonSchemaCompat(schema: unknown, opts?: unknown): Record<string, unknown> } | undefined = await import(\n /* webpackIgnore: true */ String(\"@modelcontextprotocol/sdk/server/zod-json-schema-compat.js\")\n).catch(() => undefined);\n\n/** @internal A schema as JSON Schema, the way the MCP SDK 1.x renders one for tools/list (draft-7, input side). */\nexport function toJsonSchema(schema: AnySchema): Record<string, unknown> {\n if (isZ4Schema(schema)) return z4mini.toJSONSchema(schema, { target: \"draft-7\", io: \"input\" }) as Record<string, unknown>;\n if (!v1JsonSchema) {\n throw new Error(\"wakeshift: a zod 3 schema needs @modelcontextprotocol/sdk 1.x installed to render as JSON Schema: write it with zod 4 (import { z } from \\\"zod/v4\\\")\");\n }\n return v1JsonSchema.toJsonSchemaCompat(schema);\n}\n"]}