{"version":3,"file":"src-aVVEQJ_S.mjs","names":[],"sources":["../src/storage.ts","../src/index.ts"],"sourcesContent":["import {\n  imageSrcSet,\n  imageUrl,\n  type ImageSrcSet,\n  type ImageSrcSetOptions,\n  type ImageUrlOptions,\n} from \"./images\";\nimport { getStorageBindings } from \"./tako/secrets\";\n\nconst DEFAULT_EXPIRES_SECONDS = 3600;\nconst MAX_EXPIRES_SECONDS = 7 * 24 * 60 * 60;\nconst SERVICE = \"s3\";\nconst SIGNING_ALGORITHM = \"AWS4-HMAC-SHA256\";\nconst UNSIGNED_PAYLOAD = \"UNSIGNED-PAYLOAD\";\n\nexport interface TakoStorages {}\n\nexport interface TakoStorageBinding {\n  provider: \"local\" | \"s3\";\n  bucket?: string | undefined;\n  endpoint?: string | undefined;\n  region?: string | undefined;\n  access_key_id?: string | undefined;\n  secret_access_key?: string | undefined;\n  force_path_style?: boolean | undefined;\n  public_base_url?: string | undefined;\n  path?: string | undefined;\n  signing_key?: string | undefined;\n}\n\nexport interface CreateDownloadUrlOptions {\n  /** Link lifetime. Defaults to 3600 seconds. S3-compatible services cap this at seven days. */\n  expiresInSeconds?: number;\n  /** Use `public_base_url` instead of signing when the storage has one configured. */\n  public?: boolean;\n  /** Optional S3 response content type override. */\n  responseContentType?: string;\n  /** Optional S3 response content disposition override. */\n  responseContentDisposition?: string;\n}\n\nexport interface CreateUploadUrlOptions {\n  /** Link lifetime. Defaults to 3600 seconds. S3-compatible services cap this at seven days. */\n  expiresInSeconds?: number;\n  /** Content-Type the uploader must send with the PUT request. */\n  contentType?: string;\n}\n\nexport type CreateImageUrlOptions = ImageUrlOptions & {\n  /** Link lifetime for private direct object URLs. Defaults to 3600 seconds. */\n  expiresInSeconds?: number;\n  /** Use `public_base_url` and the public image optimizer. */\n  public?: boolean;\n};\n\nexport type CreateImageSrcSetOptions = ImageSrcSetOptions & {\n  /** Use `public_base_url` and the public image optimizer. Required until private image transforms are supported. */\n  public?: boolean;\n};\n\nexport interface TakoStorage {\n  createDownloadUrl(key: string, options?: CreateDownloadUrlOptions): Promise<string>;\n  createUploadUrl(key: string, options?: CreateUploadUrlOptions): Promise<string>;\n  createImageUrl(key: string, options?: CreateImageUrlOptions): Promise<string>;\n  createImageSrcSet(key: string, options: CreateImageSrcSetOptions): Promise<ImageSrcSet>;\n}\n\nexport type TakoStorageBag<T = TakoStorages> = Readonly<{\n  [K in keyof T]: TakoStorage;\n}> &\n  Readonly<Record<string, TakoStorage | undefined>>;\n\ninterface StorageBagOptions {\n  now?: () => Date;\n}\n\nexport function loadStorages<T = TakoStorages>(): TakoStorageBag<T> {\n  return createStorageBag<T>(getStorageBindings());\n}\n\nexport function createStorageBag<T = TakoStorages>(\n  bindings: Record<string, unknown>,\n  options: StorageBagOptions = {},\n): TakoStorageBag<T> {\n  const storages = new Map<string, TakoStorage>();\n  const now = options.now ?? (() => new Date());\n\n  for (const [name, raw] of Object.entries(bindings)) {\n    const binding = parseBinding(name, raw);\n    storages.set(name, createStorage(binding, now));\n  }\n\n  return new Proxy(Object.create(null) as Record<string, TakoStorage>, {\n    get(_target, prop: string | symbol): unknown {\n      if (typeof prop !== \"string\") return undefined;\n      return storages.get(prop);\n    },\n    ownKeys(): string[] {\n      return Array.from(storages.keys());\n    },\n    getOwnPropertyDescriptor(_target, prop: string | symbol) {\n      if (typeof prop === \"string\") {\n        const storage = storages.get(prop);\n        if (storage) {\n          return { configurable: true, enumerable: false, value: storage };\n        }\n      }\n      return undefined;\n    },\n    has(_target, prop: string | symbol): boolean {\n      return typeof prop === \"string\" && storages.has(prop);\n    },\n  }) as TakoStorageBag<T>;\n}\n\nfunction createStorage(binding: TakoStorageBinding, now: () => Date): TakoStorage {\n  return Object.freeze({\n    createDownloadUrl(key: string, options: CreateDownloadUrlOptions = {}) {\n      if (binding.provider === \"local\") {\n        return localStorageUrl(binding, \"download\", key, options.expiresInSeconds, now);\n      }\n      const publicUrl = publicObjectUrl(binding, key, options.public ?? false);\n      if (publicUrl) return Promise.resolve(publicUrl);\n\n      return presign({\n        binding,\n        key,\n        method: \"GET\",\n        expiresInSeconds: options.expiresInSeconds,\n        query: responseOverrideQuery(options),\n        headers: {},\n        now,\n      });\n    },\n\n    createUploadUrl(key: string, options: CreateUploadUrlOptions = {}) {\n      if (binding.provider === \"local\") {\n        return localStorageUrl(binding, \"upload\", key, options.expiresInSeconds, now);\n      }\n      return presign({\n        binding,\n        key,\n        method: \"PUT\",\n        expiresInSeconds: options.expiresInSeconds,\n        query: {},\n        headers: options.contentType ? { \"content-type\": options.contentType } : {},\n        now,\n      });\n    },\n\n    async createImageUrl(key: string, options: CreateImageUrlOptions = {}) {\n      const { expiresInSeconds, public: usePublic, ...imageOptions } = options;\n      if (binding.provider === \"local\") {\n        if (hasImageTransformOptions(imageOptions)) {\n          throw new TypeError(\"local storage image transforms require public storage for now\");\n        }\n        return localStorageUrl(binding, \"download\", key, expiresInSeconds, now);\n      }\n      const publicUrl = publicObjectUrl(binding, key, usePublic ?? false);\n      if (publicUrl) {\n        return imageUrl(publicUrl, imageOptions);\n      }\n\n      if (hasImageTransformOptions(imageOptions)) {\n        throw new TypeError(\n          \"private storage image transforms require a public_base_url for now; use createDownloadUrl for a signed object URL\",\n        );\n      }\n\n      return presign({\n        binding,\n        key,\n        method: \"GET\",\n        expiresInSeconds,\n        query: {},\n        headers: {},\n        now,\n      });\n    },\n\n    async createImageSrcSet(key: string, options: CreateImageSrcSetOptions) {\n      const { public: usePublic, ...imageOptions } = options;\n      const publicUrl = publicObjectUrl(binding, key, usePublic ?? false);\n      if (publicUrl) {\n        return imageSrcSet(publicUrl, imageOptions);\n      }\n\n      throw new TypeError(\n        \"private storage image srcsets require a public_base_url for now; use createDownloadUrl for a signed object URL\",\n      );\n    },\n  });\n}\n\nfunction parseBinding(name: string, raw: unknown): TakoStorageBinding {\n  if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n    throw new TypeError(`invalid storage binding ${name}: expected object`);\n  }\n  const binding = raw as Partial<TakoStorageBinding>;\n  if (binding.provider !== \"local\" && binding.provider !== \"s3\") {\n    throw new TypeError(`invalid storage binding ${name}: provider must be local or s3`);\n  }\n\n  if (binding.provider === \"local\") {\n    for (const field of [\"path\", \"signing_key\"] as const) {\n      if (typeof binding[field] !== \"string\" || binding[field]?.trim() === \"\") {\n        throw new TypeError(`invalid storage binding ${name}: missing ${field}`);\n      }\n    }\n    return {\n      provider: \"local\",\n      path: binding.path as string,\n      signing_key: binding.signing_key as string,\n    };\n  }\n\n  for (const field of [\n    \"bucket\",\n    \"endpoint\",\n    \"region\",\n    \"access_key_id\",\n    \"secret_access_key\",\n  ] as const) {\n    if (typeof binding[field] !== \"string\" || binding[field]?.trim() === \"\") {\n      throw new TypeError(`invalid storage binding ${name}: missing ${field}`);\n    }\n  }\n  return {\n    provider: \"s3\",\n    bucket: binding.bucket as string,\n    endpoint: (binding.endpoint as string).replace(/\\/+$/, \"\"),\n    region: binding.region as string,\n    access_key_id: binding.access_key_id as string,\n    secret_access_key: binding.secret_access_key as string,\n    force_path_style: binding.force_path_style === true,\n    public_base_url: binding.public_base_url?.replace(/\\/+$/, \"\"),\n  };\n}\n\nasync function presign(input: {\n  binding: TakoStorageBinding;\n  key: string;\n  method: \"GET\" | \"PUT\";\n  expiresInSeconds: number | undefined;\n  query: Record<string, string>;\n  headers: Record<string, string>;\n  now: () => Date;\n}): Promise<string> {\n  assertS3Binding(input.binding);\n  const url = objectUrl(input.binding, input.key);\n  for (const [key, value] of Object.entries(input.query)) {\n    url.searchParams.set(key, value);\n  }\n\n  const expires = validateExpires(input.expiresInSeconds ?? DEFAULT_EXPIRES_SECONDS);\n  const date = input.now();\n  const amzDate = formatAmzDate(date);\n  const dateStamp = amzDate.slice(0, 8);\n  const scope = `${dateStamp}/${input.binding.region}/${SERVICE}/aws4_request`;\n  const headers = normalizeHeaders({ host: url.host, ...input.headers });\n  const signedHeaders = Object.keys(headers).sort().join(\";\");\n\n  url.searchParams.set(\"X-Amz-Algorithm\", SIGNING_ALGORITHM);\n  url.searchParams.set(\"X-Amz-Credential\", `${input.binding.access_key_id}/${scope}`);\n  url.searchParams.set(\"X-Amz-Date\", amzDate);\n  url.searchParams.set(\"X-Amz-Expires\", String(expires));\n  url.searchParams.set(\"X-Amz-SignedHeaders\", signedHeaders);\n\n  const canonicalRequest = [\n    input.method,\n    canonicalUri(url),\n    canonicalQuery(url.searchParams),\n    canonicalHeaders(headers),\n    signedHeaders,\n    UNSIGNED_PAYLOAD,\n  ].join(\"\\n\");\n\n  const stringToSign = [SIGNING_ALGORITHM, amzDate, scope, await sha256Hex(canonicalRequest)].join(\n    \"\\n\",\n  );\n  const signingKey = await deriveSigningKey(\n    input.binding.secret_access_key,\n    dateStamp,\n    input.binding.region,\n  );\n  const signature = await hmacHex(signingKey, stringToSign);\n  url.searchParams.set(\"X-Amz-Signature\", signature);\n  return url.toString();\n}\n\nfunction objectUrl(binding: TakoStorageBinding, key: string): URL {\n  assertS3Binding(binding);\n  const encodedKey = encodeObjectKey(key);\n  const endpoint = new URL(binding.endpoint);\n  if (endpoint.protocol !== \"https:\") {\n    throw new TypeError(\"storage endpoint must use https\");\n  }\n\n  if (binding.force_path_style) {\n    endpoint.pathname = joinUrlPath(endpoint.pathname, binding.bucket, encodedKey);\n    return endpoint;\n  }\n\n  endpoint.hostname = `${binding.bucket}.${endpoint.hostname}`;\n  endpoint.pathname = joinUrlPath(endpoint.pathname, encodedKey);\n  return endpoint;\n}\n\nfunction publicObjectUrl(\n  binding: TakoStorageBinding,\n  key: string,\n  requested: boolean,\n): string | null {\n  if (binding.provider !== \"s3\") return null;\n  if (!requested) return null;\n  if (!binding.public_base_url) {\n    throw new TypeError(\"storage does not have public_base_url configured\");\n  }\n  const url = new URL(binding.public_base_url);\n  url.pathname = joinUrlPath(url.pathname, encodeObjectKey(key));\n  return url.toString();\n}\n\nfunction assertS3Binding(binding: TakoStorageBinding): asserts binding is TakoStorageBinding & {\n  provider: \"s3\";\n  bucket: string;\n  endpoint: string;\n  region: string;\n  access_key_id: string;\n  secret_access_key: string;\n} {\n  if (\n    binding.provider !== \"s3\" ||\n    !binding.bucket ||\n    !binding.endpoint ||\n    !binding.region ||\n    !binding.access_key_id ||\n    !binding.secret_access_key\n  ) {\n    throw new TypeError(\"storage binding is not configured for s3\");\n  }\n}\n\nfunction localStorageUrl(\n  binding: TakoStorageBinding,\n  operation: \"download\" | \"upload\",\n  key: string,\n  expiresInSeconds: number | undefined,\n  now: () => Date,\n): Promise<string> {\n  if (binding.provider !== \"local\" || !binding.path || !binding.signing_key) {\n    throw new TypeError(\"storage binding is not configured for local storage\");\n  }\n  const expires =\n    Math.floor(now().getTime() / 1000) +\n    validateExpires(expiresInSeconds ?? DEFAULT_EXPIRES_SECONDS);\n  const encodedKey = encodeObjectKey(key);\n  const storagePath = binding.path;\n  const signingKey = binding.signing_key;\n  const payload = `${operation}\\n${storagePath}\\n${encodedKey}\\n${expires}`;\n  return hmacHex(utf8(signingKey), payload).then((token) => {\n    return `/_tako/storage/${operation}/${encodeURIComponent(storagePath)}/${encodedKey}?expires=${expires}&token=${token}`;\n  });\n}\n\nfunction encodeObjectKey(key: string): string {\n  if (key.trim() === \"\" || key.startsWith(\"/\")) {\n    throw new TypeError(\"storage key must be a non-empty relative object key\");\n  }\n  return key.split(\"/\").map(rfc3986Encode).join(\"/\");\n}\n\nfunction joinUrlPath(...parts: string[]): string {\n  const joined = parts\n    .map((part) => part.replace(/^\\/+|\\/+$/g, \"\"))\n    .filter(Boolean)\n    .join(\"/\");\n  return `/${joined}`;\n}\n\nfunction responseOverrideQuery(options: CreateDownloadUrlOptions): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (options.responseContentType) query[\"response-content-type\"] = options.responseContentType;\n  if (options.responseContentDisposition) {\n    query[\"response-content-disposition\"] = options.responseContentDisposition;\n  }\n  return query;\n}\n\nfunction hasImageTransformOptions(options: ImageUrlOptions): boolean {\n  return (\n    options.width !== undefined || options.quality !== undefined || options.format !== undefined\n  );\n}\n\nfunction validateExpires(value: number): number {\n  if (!Number.isInteger(value) || value < 1 || value > MAX_EXPIRES_SECONDS) {\n    throw new TypeError(\"storage URL expiration must be an integer from 1 to 604800 seconds\");\n  }\n  return value;\n}\n\nfunction normalizeHeaders(headers: Record<string, string>): Record<string, string> {\n  return Object.fromEntries(\n    Object.entries(headers)\n      .map(([key, value]) => [key.toLowerCase(), value.trim()] as const)\n      .sort(([a], [b]) => a.localeCompare(b)),\n  );\n}\n\nfunction canonicalHeaders(headers: Record<string, string>): string {\n  return Object.entries(headers)\n    .map(([key, value]) => `${key}:${value.replace(/\\s+/g, \" \")}\\n`)\n    .join(\"\");\n}\n\nfunction canonicalUri(url: URL): string {\n  return url.pathname\n    .split(\"/\")\n    .map((segment) => rfc3986Encode(decodeURIComponent(segment)))\n    .join(\"/\");\n}\n\nfunction canonicalQuery(params: URLSearchParams): string {\n  return Array.from(params.entries())\n    .sort(([aKey, aValue], [bKey, bValue]) =>\n      aKey === bKey ? aValue.localeCompare(bValue) : aKey.localeCompare(bKey),\n    )\n    .map(([key, value]) => `${rfc3986Encode(key)}=${rfc3986Encode(value)}`)\n    .join(\"&\");\n}\n\nfunction rfc3986Encode(value: string): string {\n  return encodeURIComponent(value).replace(\n    /[!'()*]/g,\n    (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n  );\n}\n\nasync function sha256Hex(value: string): Promise<string> {\n  return bytesToHex(await subtle().digest(\"SHA-256\", utf8(value)));\n}\n\nasync function deriveSigningKey(\n  secret: string,\n  dateStamp: string,\n  region: string,\n): Promise<ArrayBuffer> {\n  const kDate = await hmacBytes(utf8(`AWS4${secret}`), dateStamp);\n  const kRegion = await hmacBytes(kDate, region);\n  const kService = await hmacBytes(kRegion, SERVICE);\n  return hmacBytes(kService, \"aws4_request\");\n}\n\nasync function hmacBytes(key: BufferSource, value: string): Promise<ArrayBuffer> {\n  const cryptoKey = await subtle().importKey(\"raw\", key, { name: \"HMAC\", hash: \"SHA-256\" }, false, [\n    \"sign\",\n  ]);\n  return subtle().sign(\"HMAC\", cryptoKey, utf8(value));\n}\n\nasync function hmacHex(key: BufferSource, value: string): Promise<string> {\n  return bytesToHex(await hmacBytes(key, value));\n}\n\nfunction subtle(): SubtleCrypto {\n  const crypto = globalThis.crypto;\n  if (!crypto?.subtle) {\n    throw new Error(\"Web Crypto is required to sign storage URLs\");\n  }\n  return crypto.subtle;\n}\n\nfunction utf8(value: string): ArrayBuffer {\n  return new TextEncoder().encode(value).slice().buffer as ArrayBuffer;\n}\n\nfunction bytesToHex(value: ArrayBuffer): string {\n  return Array.from(new Uint8Array(value))\n    .map((byte) => byte.toString(16).padStart(2, \"0\"))\n    .join(\"\");\n}\n\nfunction formatAmzDate(date: Date): string {\n  return date.toISOString().replace(/[:-]|\\.\\d{3}/g, \"\");\n}\n","/**\n * tako.sh — authoring helpers for channels, workflows, and typed errors.\n *\n * ```ts\n * import { tako } from \"tako.sh\";\n * import sendEmail from \"../workflows/send-email\";\n * import missionLog from \"../channels/mission-log\";\n *\n * tako.logger.info(\"boot\", { env: tako.env });\n * const dbUrl = tako.secrets.DATABASE_URL;\n * await sendEmail.enqueue({ to: \"u@e.co\" });\n * await missionLog({ base }).publish({ type: \"event\", data });\n * ```\n *\n * There is no `Tako` global — Tako v0 uses plain ES modules for everything.\n */\n\nimport { createLogger } from \"./logger\";\nimport { loadStorages } from \"./storage\";\nimport { loadSecrets } from \"./tako/secrets\";\n\n/**\n * Project-specific secret keys. Augmented by the generated `tako.d.ts` file.\n */\nexport interface TakoSecrets {}\n\n/**\n * Project-specific type registry. Augmented by the generated `tako.d.ts` file.\n */\nexport interface TakoTypeRegistry {}\n\n/**\n * Channel metadata discovered from `<app_root>/channels/`. Augmented by the\n * generated `tako.d.ts` file.\n */\nexport interface TakoChannels {}\n\n/**\n * Project-specific storage bindings. Augmented by the generated `tako.d.ts` file.\n */\nexport interface TakoStorages {}\n\n/** Environments declared in `tako.toml`, plus `development` and `production`. */\nexport type Env = TakoTypeRegistry extends { Env: infer T extends string }\n  ? T\n  : \"development\" | \"production\";\n\n/** Redaction helpers available on `tako.secrets`. */\nexport interface TakoSecretRedactions {\n  /** `String(tako.secrets)` returns `\"[REDACTED]\"` to prevent accidental leaks. */\n  toString(): \"[REDACTED]\";\n  /** `JSON.stringify(tako.secrets)` returns `\"[REDACTED]\"` to prevent accidental leaks. */\n  toJSON(): \"[REDACTED]\";\n}\n\n/** Tako-managed secret bag with project-specific keys from `tako.d.ts`. */\nexport type TakoSecretBag = Readonly<TakoSecrets> & TakoSecretRedactions;\n\nconst __takoEnv: Record<string, string> =\n  typeof process !== \"undefined\" && process.env\n    ? (process.env as Record<string, string>)\n    : ({} as Record<string, string>);\n\n/** Current Tako environment. */\nexport const env = (__takoEnv[\"ENV\"] ?? \"\") as Env;\n\n/** `true` when the app is running under `tako dev`. */\nexport const isDev = env === \"development\";\n\n/** `true` when the app is running under `tako deploy` in a production env. */\nexport const isProd = env === \"production\";\n\n/** Port Tako assigned to this app instance. */\nexport const port = Number(__takoEnv[\"PORT\"] ?? 0);\n\n/** Host/address Tako bound this app instance to. */\nexport const host = __takoEnv[\"HOST\"] ?? \"\";\n\n/** Build identifier injected by Tako. `\"dev\"` under `tako dev`. */\nexport const build = __takoEnv[\"TAKO_BUILD\"] ?? \"\";\n\n/** Persistent app-owned data directory. */\nexport const dataDir = __takoEnv[\"TAKO_DATA_DIR\"] ?? \"\";\n\n/** Directory the app is running from (`process.cwd()`). */\nexport const appDir =\n  typeof process !== \"undefined\" && typeof process.cwd === \"function\" ? process.cwd() : \"\";\n\n/** Structured JSON logger bound to `source: \"app\"`. */\nexport const logger = createLogger(\"app\");\n\n/** Tako-managed secrets, typed by project-specific `tako.d.ts` declarations. */\nexport const secrets = loadSecrets<TakoSecretBag>();\n\n/** Tako-managed object storages, typed by project-specific `tako.d.ts` declarations. */\nexport const storages = loadStorages<TakoStorages>();\n\n/** Primary app runtime surface. */\nexport const tako = Object.freeze({\n  env,\n  isDev,\n  isProd,\n  port,\n  host,\n  build,\n  dataDir,\n  appDir,\n  logger,\n  secrets,\n  storages,\n} as const);\n\n/** Type of the exported {@link tako} runtime object. */\nexport type TakoRuntime = typeof tako;\n\nexport { defineChannel } from \"./channels/define\";\nexport { defineWorkflow, signal } from \"./workflows/define\";\nexport type {\n  EnqueueOptions,\n  WorkflowContext,\n  WorkflowOpts,\n  WorkflowStepContext,\n} from \"./workflows\";\nexport { TakoError, type TakoErrorCode } from \"./tako/error\";\nexport {\n  imageSrcSet,\n  imageUrl,\n  type ImageSrcSet,\n  type ImageSrcSetLayout,\n  type ImageSrcSetOptions,\n  type ImageUrlOptions,\n} from \"./images\";\nexport type {\n  CreateDownloadUrlOptions,\n  CreateImageSrcSetOptions,\n  CreateImageUrlOptions,\n  CreateUploadUrlOptions,\n  TakoStorage,\n  TakoStorageBag,\n  TakoStorageBinding,\n} from \"./storage\";\n\n/**\n * Extract the payload type from a workflow definition.\n * Rarely needed directly — `defineWorkflow<P>(...)` already constrains\n * `.enqueue(payload)`. Useful when wrapping enqueue in generic helpers.\n *\n * @example\n * ```ts\n * type P = InferWorkflowPayload<typeof import(\"./workflows/send-email\").default>;\n * ```\n */\nexport type InferWorkflowPayload<T> = T extends import(\"./workflows\").WorkflowExport<infer P>\n  ? P\n  : T extends import(\"./workflows\").WorkflowDefinition<infer P>\n    ? P\n    : unknown;\n\ntype BoundChannel<T> = T extends (params: never) => infer Handle ? Handle : T;\n\n/** Extract the params type from a channel definition export. */\ntype InferChannelParams<T> =\n  BoundChannel<T> extends { readonly __params?: infer P } ? P : Record<string, never>;\n\n/** Extract the message map from a channel definition export. */\ntype InferChannelMessages<T> =\n  BoundChannel<T> extends { readonly __messages?: infer M } ? M : Record<string, unknown>;\n\n/** Extract the client transport from a channel definition export. */\ntype InferChannelTransport<T> =\n  BoundChannel<T> extends {\n    connect(options?: import(\"./types\").ChannelConnectOptions): import(\"./types\").ChannelSocket;\n  }\n    ? \"ws\"\n    : \"sse\";\n\n/**\n * Infer the typed registry entry for a channel definition export.\n *\n * Used by generated `tako.d.ts` channel metadata; also useful when writing\n * wrappers around project-local channel modules.\n */\nexport type InferChannel<T> = {\n  params: InferChannelParams<T>;\n  messages: InferChannelMessages<T>;\n  transport: InferChannelTransport<T>;\n};\n"],"mappings":"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"}