@openclaw/crabline 0.1.16 → 0.1.17

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.
@@ -27,6 +27,13 @@ export type OpenClawCrablineConversation = {
27
27
  id: string;
28
28
  kind: "direct" | "group";
29
29
  };
30
+ export type OpenClawCrablineInboundAttachment = {
31
+ contentBase64?: string | undefined;
32
+ fileName?: string | undefined;
33
+ id: string;
34
+ kind: "image" | "video" | "audio" | "file";
35
+ mimeType: string;
36
+ };
30
37
  export type OpenClawCrablineGatewayBinding = {
31
38
  accountId: string;
32
39
  channel: string;
@@ -45,6 +52,7 @@ export type OpenClawCrablineCorrelatedAgentDelivery = OpenClawCrablineAgentDeliv
45
52
  providerTargetKey: string;
46
53
  };
47
54
  export type OpenClawCrablineInboundInput = {
55
+ attachments?: OpenClawCrablineInboundAttachment[] | undefined;
48
56
  conversation: {
49
57
  id: string;
50
58
  kind: "direct" | "group";
@@ -157,6 +165,7 @@ export type OpenClawCrablineProviderBridgeRegistry = {
157
165
  }>>;
158
166
  };
159
167
  export declare function createOpenClawCrablineProviderBridge<TProvider extends CrablineServerManifest["provider"]>(params: {
168
+ allowAttachmentOnlyInbound?: boolean;
160
169
  createAdapter(manifest: Extract<CrablineServerManifest, {
161
170
  provider: TProvider;
162
171
  }>): OpenClawCrablineProviderAdapter;
@@ -66,7 +66,8 @@ export function createOpenClawCrablineProviderBridge(params) {
66
66
  return adapter.createBinding();
67
67
  },
68
68
  createInbound(input) {
69
- if (!readNonBlankString(input.text)) {
69
+ if (!readNonBlankString(input.text) &&
70
+ !(params.allowAttachmentOnlyInbound && input.attachments?.length)) {
70
71
  throw new Error("OpenClaw Crabline inbound message text is required.");
71
72
  }
72
73
  if (input.conversation.kind !== "direct" && input.conversation.kind !== "group") {
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/openclaw/shared.ts"],"names":[],"mappings":"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","sourcesContent":["import { ADMIN_TOKEN_HEADER } from \"../servers/http.js\";\nimport type { CrablineServerChannel, CrablineServerManifest } from \"../servers/index.js\";\nimport type { ServerEventObserver } from \"../servers/recorder.js\";\n\nexport const DEFAULT_ACCOUNT_ID = \"default\";\nexport const OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH =\n \"crabline-channel-driver-capabilities.json\";\nexport const OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH = \"crabline-provider-readiness.json\";\nexport const OPENCLAW_CRABLINE_MANIFEST_PATH = \"crabline-provider-server.json\";\nexport const OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY = \".crabline-channel-driver-artifacts\";\nexport const OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH = `${OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY}/current.json`;\nexport const OPENCLAW_CRABLINE_DEFAULT_CHANNEL = \"telegram\";\n\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS = 5_000;\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_ABORT_GRACE_MS = 250;\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_LABELS = {\n discord: \"Discord users/@me\",\n mattermost: \"Mattermost users.me\",\n matrix: \"Matrix whoami\",\n signal: \"Signal check\",\n slack: \"Slack auth.test\",\n telegram: \"Telegram getMe\",\n whatsapp: \"WhatsApp phone number\",\n zalo: \"Zalo getMe\",\n} satisfies Record<CrablineServerManifest[\"provider\"], string>;\nconst unsettledProviderProbeSettlements = new WeakMap<Error, Promise<void>>();\n\nexport type OpenClawCrablineChannelDriverSelection = {\n channel: CrablineServerChannel;\n channelDriver: \"crabline\";\n capabilityMatrixPath: typeof OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH;\n providerReadinessArtifactPath: typeof OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH;\n};\n\nexport type OpenClawCrablineProviderReadinessResult = {\n artifactPointerPath: string;\n capabilityReport: unknown;\n capabilityMatrixPath: string;\n generation: string;\n manifestPath: string;\n providerReadiness: unknown;\n providerReadinessArtifactPath: string;\n warnings?: string[];\n};\nexport type OpenClawCrablineConversation = {\n id: string;\n kind: \"direct\" | \"group\";\n};\n\nexport type OpenClawCrablineGatewayBinding = {\n accountId: string;\n channel: string;\n createProviderReadinessEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;\n createGatewayConfig(openclawConfig?: Record<string, unknown>): Record<string, unknown>;\n requiredPluginIds: string[];\n};\n\nexport type OpenClawCrablineAgentDelivery = {\n channel: string;\n replyChannel: string;\n replyTo: string;\n to: string;\n};\n\nexport type OpenClawCrablineCorrelatedAgentDelivery = OpenClawCrablineAgentDelivery & {\n /** Adapter correlation key used to associate later provider recorder events with this target. */\n providerTargetKey: string;\n};\n\nexport type OpenClawCrablineInboundInput = {\n conversation: {\n id: string;\n kind: \"direct\" | \"group\";\n };\n senderId: string;\n senderName?: string | undefined;\n text: string;\n threadId?: string | undefined;\n nativeCommand?: { name: string } | undefined;\n};\n\nexport type OpenClawCrablineInbound = {\n providerBody: Record<string, unknown>;\n providerHeaders: Record<string, string>;\n providerTargetKey: string;\n providerUrl: string;\n qaTarget: string;\n stateConversation: OpenClawCrablineConversation;\n threadId?: string | undefined;\n};\n\nexport type OpenClawCrablineOutboundMessage = {\n accountId: string;\n senderId: string;\n senderName: string;\n text: string;\n to: string;\n};\n\nexport type OpenClawCrablineOutboundObservation = Omit<OpenClawCrablineOutboundMessage, \"to\"> & {\n /** Provider-authoritative keys, in lookup priority order, for consumer correlation. */\n providerTargetKeys: readonly [string, ...string[]];\n /** Provider-native target used only when no consumer correlation exists. */\n fallbackTarget?: string | undefined;\n};\n\nexport type StartOpenClawCrablineAdapterParams = {\n channel: CrablineServerChannel;\n onEvent?: ServerEventObserver | undefined;\n openclawConfig?: Record<string, unknown> | undefined;\n recorderPath?: string | undefined;\n};\n\nexport type StartedOpenClawCrablineAdapter = OpenClawCrablineGatewayBinding & {\n close(): Promise<void>;\n createAgentDelivery(params: {\n target: string;\n threadId?: string | undefined;\n }): OpenClawCrablineAgentDelivery;\n createInbound(params: { input: OpenClawCrablineInboundInput }): OpenClawCrablineInbound;\n createOutboundObservation(params: { event: unknown }): OpenClawCrablineOutboundObservation | null;\n /** @deprecated Use createOutboundObservation and correlate providerTargetKeys in the consumer. */\n createOutboundFromRecorderEvent(params: {\n event: unknown;\n targetByProviderTarget: ReadonlyMap<string, string>;\n }): OpenClawCrablineOutboundMessage | null;\n manifest: CrablineServerManifest;\n probe(): Promise<unknown>;\n};\n\nexport type StartedOpenClawCrablineCorrelatedAdapter = Omit<\n StartedOpenClawCrablineAdapter,\n \"createAgentDelivery\"\n> & {\n createAgentDelivery(params: {\n target: string;\n threadId?: string | undefined;\n }): OpenClawCrablineCorrelatedAgentDelivery;\n /** Resolves the provider-authoritative key from a successful inbound response. */\n resolveInboundProviderTargetKey(params: {\n inbound: OpenClawCrablineInbound;\n response: unknown;\n }): string;\n};\n\nexport type ParsedQaTarget = {\n kind: \"direct\" | \"group\";\n id: string;\n native: boolean;\n threadId?: string;\n};\n\nexport function parseQaDeliveryTarget(params: {\n target: string;\n threadId?: string | undefined;\n}): ParsedQaTarget {\n const parsed = parseQaTarget(params.target);\n const threadId = params.threadId?.trim();\n if (parsed.threadId && threadId && parsed.threadId !== threadId) {\n throw new Error(\"OpenClaw Crabline delivery received conflicting thread targets.\");\n }\n return threadId ? { ...parsed, threadId } : parsed;\n}\n\nexport function createProviderIdRegistry(params: {\n candidate(logicalKey: string): string;\n conflictLabel: string;\n}) {\n const idByLogicalKey = new Map<string, string>();\n const ownerById = new Map<string, string>();\n return {\n resolveLogical(logicalKey: string) {\n const existingId = idByLogicalKey.get(logicalKey);\n if (existingId) {\n return existingId;\n }\n const candidate = params.candidate(logicalKey);\n const owner = ownerById.get(candidate);\n if (owner && owner !== `logical:${logicalKey}`) {\n throw new Error(`${params.conflictLabel} conflicts with another provider identity.`);\n }\n idByLogicalKey.set(logicalKey, candidate);\n ownerById.set(candidate, `logical:${logicalKey}`);\n return candidate;\n },\n reserveNative(nativeId: string) {\n const owner = ownerById.get(nativeId);\n if (owner?.startsWith(\"logical:\")) {\n throw new Error(`${params.conflictLabel} native id conflicts with a logical identity.`);\n }\n ownerById.set(nativeId, `native:${nativeId}`);\n return nativeId;\n },\n };\n}\n\nexport type OpenClawCrablineProviderAdapter = {\n createAgentDelivery(parsed: ParsedQaTarget): OpenClawCrablineCorrelatedAgentDelivery;\n createBinding(): OpenClawCrablineGatewayBinding;\n createInbound(input: OpenClawCrablineInboundInput): OpenClawCrablineInbound;\n createOutboundObservation(params: { event: unknown }): OpenClawCrablineOutboundObservation | null;\n probe(signal?: AbortSignal): Promise<unknown>;\n resolveInboundProviderTargetKey?(params: {\n inbound: OpenClawCrablineInbound;\n response: unknown;\n }): string;\n};\n\nexport type OpenClawCrablineProviderBridge<\n TManifest extends CrablineServerManifest = CrablineServerManifest,\n> = {\n createAdapter(manifest: TManifest): OpenClawCrablineProviderAdapter;\n createAdapterFromManifest(manifest: CrablineServerManifest): OpenClawCrablineProviderAdapter;\n provider: TManifest[\"provider\"];\n};\n\nexport type OpenClawCrablineProviderBridgeRegistry = {\n [Provider in CrablineServerManifest[\"provider\"]]: OpenClawCrablineProviderBridge<\n Extract<CrablineServerManifest, { provider: Provider }>\n >;\n};\n\nexport function createOpenClawCrablineProviderBridge<\n TProvider extends CrablineServerManifest[\"provider\"],\n>(params: {\n createAdapter(\n manifest: Extract<CrablineServerManifest, { provider: TProvider }>,\n ): OpenClawCrablineProviderAdapter;\n provider: TProvider;\n}): OpenClawCrablineProviderBridge<Extract<CrablineServerManifest, { provider: TProvider }>> {\n type ProviderManifest = Extract<CrablineServerManifest, { provider: TProvider }>;\n const createAdapter = (manifest: ProviderManifest): OpenClawCrablineProviderAdapter => {\n const adapter = params.createAdapter(manifest);\n return {\n createAgentDelivery(parsed) {\n return adapter.createAgentDelivery(parsed);\n },\n createBinding() {\n return adapter.createBinding();\n },\n createInbound(input) {\n if (!readNonBlankString(input.text)) {\n throw new Error(\"OpenClaw Crabline inbound message text is required.\");\n }\n if (input.conversation.kind !== \"direct\" && input.conversation.kind !== \"group\") {\n throw new Error(\"OpenClaw Crabline inbound conversation kind must be direct or group.\");\n }\n return adapter.createInbound(input);\n },\n createOutboundObservation(outboundParams) {\n return adapter.createOutboundObservation(outboundParams);\n },\n probe(signal) {\n return adapter.probe(signal);\n },\n ...(adapter.resolveInboundProviderTargetKey\n ? {\n resolveInboundProviderTargetKey: adapter.resolveInboundProviderTargetKey.bind(adapter),\n }\n : {}),\n };\n };\n const bridge: OpenClawCrablineProviderBridge<ProviderManifest> = {\n createAdapter,\n createAdapterFromManifest(manifest) {\n if (manifest.provider !== params.provider) {\n throw new Error(\n `Unsupported OpenClaw provider binding: expected ${params.provider}, got ${manifest.provider}.`,\n );\n }\n return createAdapter(manifest as ProviderManifest);\n },\n provider: params.provider as ProviderManifest[\"provider\"],\n };\n return bridge;\n}\n\nexport function correlateOpenClawCrablineOutboundObservation(params: {\n observation: OpenClawCrablineOutboundObservation;\n targetByProviderTarget: ReadonlyMap<string, string>;\n}): OpenClawCrablineOutboundMessage | null {\n const to =\n params.observation.providerTargetKeys\n .map((key) => params.targetByProviderTarget.get(key))\n .find((target) => target !== undefined) ?? params.observation.fallbackTarget;\n if (!to) {\n return null;\n }\n const {\n fallbackTarget: _fallbackTarget,\n providerTargetKeys: _providerTargetKeys,\n ...message\n } = params.observation;\n return { ...message, to };\n}\n\nexport async function runOpenClawCrablineProviderProbe<T>(\n provider: CrablineServerManifest[\"provider\"],\n probe: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n const signal = AbortSignal.timeout(OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS);\n const timeoutError = (cause: unknown) =>\n new Error(\n `Crabline ${OPENCLAW_CRABLINE_PROVIDER_PROBE_LABELS[provider]} probe timed out after ${OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS} ms.`,\n { cause },\n );\n const operation = Promise.resolve().then(() => probe(signal));\n const settled = operation.then(\n () => undefined,\n () => undefined,\n );\n let onAbort: (() => void) | undefined;\n const timeout = new Promise<{ kind: \"timeout\" }>((resolve) => {\n onAbort = () => resolve({ kind: \"timeout\" });\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n try {\n const outcome = await Promise.race([\n operation.then(\n (value) => ({ kind: \"result\" as const, value }),\n (error: unknown) => ({ error, kind: \"error\" as const }),\n ),\n timeout,\n ]);\n if (outcome.kind === \"result\") {\n return outcome.value;\n }\n if (outcome.kind === \"error\" && !signal.aborted) {\n throw outcome.error;\n }\n\n const failure = timeoutError(outcome.kind === \"error\" ? outcome.error : signal.reason);\n let abortGrace: ReturnType<typeof setTimeout> | undefined;\n const drained = await Promise.race([\n settled.then(() => true as const),\n new Promise<false>((resolve) => {\n abortGrace = setTimeout(\n () => resolve(false),\n OPENCLAW_CRABLINE_PROVIDER_PROBE_ABORT_GRACE_MS,\n );\n }),\n ]);\n if (abortGrace) {\n clearTimeout(abortGrace);\n }\n if (!drained) {\n unsettledProviderProbeSettlements.set(failure, settled);\n }\n throw failure;\n } finally {\n if (onAbort) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n }\n}\n\nexport function getUnsettledOpenClawCrablineProviderProbe(\n error: unknown,\n): Promise<void> | undefined {\n return error instanceof Error ? unsettledProviderProbeSettlements.get(error) : undefined;\n}\n\nexport function readString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return String(value);\n }\n return undefined;\n}\n\nexport function readNonBlankString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function readInteger(value: unknown): number | undefined {\n const stringValue = readString(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n const parsed = Number(stringValue);\n return Number.isSafeInteger(parsed) ? parsed : undefined;\n}\n\nexport function parseQaTarget(target: string): ParsedQaTarget {\n const trimmed = target.trim();\n const invalidTarget = () => {\n throw new Error(\n \"OpenClaw Crabline target must be a non-blank native id or a valid dm:<id>, group:<id>, channel:<id>, or thread:<id>/<thread-id> target.\",\n );\n };\n if (!trimmed) {\n return invalidTarget();\n }\n if (trimmed.startsWith(\"thread:\")) {\n const encoded = trimmed.startsWith(\"thread:/v1/\");\n const rest = trimmed.slice(encoded ? \"thread:/v1/\".length : \"thread:\".length);\n const components = rest.split(\"/\");\n const explicitKind =\n encoded && components.length === 3 && (components[0] === \"dm\" || components[0] === \"group\")\n ? components.shift()\n : undefined;\n if (components.length !== 2) {\n return invalidTarget();\n }\n let id = components[0]!.trim();\n let threadId = components[1]!.trim();\n if (encoded) {\n try {\n id = decodeURIComponent(id).trim();\n threadId = decodeURIComponent(threadId).trim();\n } catch {\n return invalidTarget();\n }\n }\n if (!id || !threadId) {\n return invalidTarget();\n }\n return {\n kind: explicitKind === \"dm\" ? \"direct\" : \"group\",\n id,\n native: false,\n threadId,\n };\n }\n if (trimmed.startsWith(\"channel:\")) {\n const id = trimmed.slice(\"channel:\".length).trim();\n return id ? { kind: \"group\", id, native: true } : invalidTarget();\n }\n if (trimmed.startsWith(\"group:\")) {\n const id = trimmed.slice(\"group:\".length).trim();\n return id ? { kind: \"group\", id, native: false } : invalidTarget();\n }\n if (trimmed.startsWith(\"dm:\")) {\n const id = trimmed.slice(\"dm:\".length).trim();\n return id ? { kind: \"direct\", id, native: false } : invalidTarget();\n }\n if (/^(?:dm|group|channel|thread)(?=\\s*:|$)/iu.test(trimmed)) {\n return invalidTarget();\n }\n return { kind: \"direct\", id: trimmed, native: true };\n}\n\nexport function canonicalConversationIdForInbound(input: OpenClawCrablineInboundInput) {\n const conversationId = readNonBlankString(input.conversation.id);\n if (!conversationId) {\n throw new Error(\"OpenClaw Crabline inbound conversation id is required.\");\n }\n return conversationId.trim();\n}\n\nfunction encodeQaThreadComponent(value: string): string {\n return value.replaceAll(\"%\", \"%25\").replaceAll(\"/\", \"%2F\");\n}\n\nexport function qaTargetForInbound(input: OpenClawCrablineInboundInput) {\n const conversationId = canonicalConversationIdForInbound(input);\n const threadId = input.threadId?.trim();\n const prefix = input.conversation.kind === \"direct\" ? \"dm\" : \"group\";\n return threadId\n ? `thread:/v1/${input.conversation.kind === \"direct\" ? \"dm/\" : \"\"}${encodeQaThreadComponent(conversationId)}/${encodeQaThreadComponent(threadId)}`\n : `${prefix}:${conversationId}`;\n}\n\nexport function createAdminInboundRequest(manifest: CrablineServerManifest) {\n return {\n providerHeaders: {\n \"content-type\": \"application/json\",\n [ADMIN_TOKEN_HEADER]: manifest.adminToken,\n },\n providerUrl: manifest.endpoints.adminInboundUrl,\n };\n}\n"]}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/openclaw/shared.ts"],"names":[],"mappings":"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","sourcesContent":["import { ADMIN_TOKEN_HEADER } from \"../servers/http.js\";\nimport type { CrablineServerChannel, CrablineServerManifest } from \"../servers/index.js\";\nimport type { ServerEventObserver } from \"../servers/recorder.js\";\n\nexport const DEFAULT_ACCOUNT_ID = \"default\";\nexport const OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH =\n \"crabline-channel-driver-capabilities.json\";\nexport const OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH = \"crabline-provider-readiness.json\";\nexport const OPENCLAW_CRABLINE_MANIFEST_PATH = \"crabline-provider-server.json\";\nexport const OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY = \".crabline-channel-driver-artifacts\";\nexport const OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH = `${OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY}/current.json`;\nexport const OPENCLAW_CRABLINE_DEFAULT_CHANNEL = \"telegram\";\n\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS = 5_000;\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_ABORT_GRACE_MS = 250;\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_LABELS = {\n discord: \"Discord users/@me\",\n mattermost: \"Mattermost users.me\",\n matrix: \"Matrix whoami\",\n signal: \"Signal check\",\n slack: \"Slack auth.test\",\n telegram: \"Telegram getMe\",\n whatsapp: \"WhatsApp phone number\",\n zalo: \"Zalo getMe\",\n} satisfies Record<CrablineServerManifest[\"provider\"], string>;\nconst unsettledProviderProbeSettlements = new WeakMap<Error, Promise<void>>();\n\nexport type OpenClawCrablineChannelDriverSelection = {\n channel: CrablineServerChannel;\n channelDriver: \"crabline\";\n capabilityMatrixPath: typeof OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH;\n providerReadinessArtifactPath: typeof OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH;\n};\n\nexport type OpenClawCrablineProviderReadinessResult = {\n artifactPointerPath: string;\n capabilityReport: unknown;\n capabilityMatrixPath: string;\n generation: string;\n manifestPath: string;\n providerReadiness: unknown;\n providerReadinessArtifactPath: string;\n warnings?: string[];\n};\nexport type OpenClawCrablineConversation = {\n id: string;\n kind: \"direct\" | \"group\";\n};\n\nexport type OpenClawCrablineInboundAttachment = {\n contentBase64?: string | undefined;\n fileName?: string | undefined;\n id: string;\n kind: \"image\" | \"video\" | \"audio\" | \"file\";\n mimeType: string;\n};\n\nexport type OpenClawCrablineGatewayBinding = {\n accountId: string;\n channel: string;\n createProviderReadinessEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;\n createGatewayConfig(openclawConfig?: Record<string, unknown>): Record<string, unknown>;\n requiredPluginIds: string[];\n};\n\nexport type OpenClawCrablineAgentDelivery = {\n channel: string;\n replyChannel: string;\n replyTo: string;\n to: string;\n};\n\nexport type OpenClawCrablineCorrelatedAgentDelivery = OpenClawCrablineAgentDelivery & {\n /** Adapter correlation key used to associate later provider recorder events with this target. */\n providerTargetKey: string;\n};\n\nexport type OpenClawCrablineInboundInput = {\n attachments?: OpenClawCrablineInboundAttachment[] | undefined;\n conversation: {\n id: string;\n kind: \"direct\" | \"group\";\n };\n senderId: string;\n senderName?: string | undefined;\n text: string;\n threadId?: string | undefined;\n nativeCommand?: { name: string } | undefined;\n};\n\nexport type OpenClawCrablineInbound = {\n providerBody: Record<string, unknown>;\n providerHeaders: Record<string, string>;\n providerTargetKey: string;\n providerUrl: string;\n qaTarget: string;\n stateConversation: OpenClawCrablineConversation;\n threadId?: string | undefined;\n};\n\nexport type OpenClawCrablineOutboundMessage = {\n accountId: string;\n senderId: string;\n senderName: string;\n text: string;\n to: string;\n};\n\nexport type OpenClawCrablineOutboundObservation = Omit<OpenClawCrablineOutboundMessage, \"to\"> & {\n /** Provider-authoritative keys, in lookup priority order, for consumer correlation. */\n providerTargetKeys: readonly [string, ...string[]];\n /** Provider-native target used only when no consumer correlation exists. */\n fallbackTarget?: string | undefined;\n};\n\nexport type StartOpenClawCrablineAdapterParams = {\n channel: CrablineServerChannel;\n onEvent?: ServerEventObserver | undefined;\n openclawConfig?: Record<string, unknown> | undefined;\n recorderPath?: string | undefined;\n};\n\nexport type StartedOpenClawCrablineAdapter = OpenClawCrablineGatewayBinding & {\n close(): Promise<void>;\n createAgentDelivery(params: {\n target: string;\n threadId?: string | undefined;\n }): OpenClawCrablineAgentDelivery;\n createInbound(params: { input: OpenClawCrablineInboundInput }): OpenClawCrablineInbound;\n createOutboundObservation(params: { event: unknown }): OpenClawCrablineOutboundObservation | null;\n /** @deprecated Use createOutboundObservation and correlate providerTargetKeys in the consumer. */\n createOutboundFromRecorderEvent(params: {\n event: unknown;\n targetByProviderTarget: ReadonlyMap<string, string>;\n }): OpenClawCrablineOutboundMessage | null;\n manifest: CrablineServerManifest;\n probe(): Promise<unknown>;\n};\n\nexport type StartedOpenClawCrablineCorrelatedAdapter = Omit<\n StartedOpenClawCrablineAdapter,\n \"createAgentDelivery\"\n> & {\n createAgentDelivery(params: {\n target: string;\n threadId?: string | undefined;\n }): OpenClawCrablineCorrelatedAgentDelivery;\n /** Resolves the provider-authoritative key from a successful inbound response. */\n resolveInboundProviderTargetKey(params: {\n inbound: OpenClawCrablineInbound;\n response: unknown;\n }): string;\n};\n\nexport type ParsedQaTarget = {\n kind: \"direct\" | \"group\";\n id: string;\n native: boolean;\n threadId?: string;\n};\n\nexport function parseQaDeliveryTarget(params: {\n target: string;\n threadId?: string | undefined;\n}): ParsedQaTarget {\n const parsed = parseQaTarget(params.target);\n const threadId = params.threadId?.trim();\n if (parsed.threadId && threadId && parsed.threadId !== threadId) {\n throw new Error(\"OpenClaw Crabline delivery received conflicting thread targets.\");\n }\n return threadId ? { ...parsed, threadId } : parsed;\n}\n\nexport function createProviderIdRegistry(params: {\n candidate(logicalKey: string): string;\n conflictLabel: string;\n}) {\n const idByLogicalKey = new Map<string, string>();\n const ownerById = new Map<string, string>();\n return {\n resolveLogical(logicalKey: string) {\n const existingId = idByLogicalKey.get(logicalKey);\n if (existingId) {\n return existingId;\n }\n const candidate = params.candidate(logicalKey);\n const owner = ownerById.get(candidate);\n if (owner && owner !== `logical:${logicalKey}`) {\n throw new Error(`${params.conflictLabel} conflicts with another provider identity.`);\n }\n idByLogicalKey.set(logicalKey, candidate);\n ownerById.set(candidate, `logical:${logicalKey}`);\n return candidate;\n },\n reserveNative(nativeId: string) {\n const owner = ownerById.get(nativeId);\n if (owner?.startsWith(\"logical:\")) {\n throw new Error(`${params.conflictLabel} native id conflicts with a logical identity.`);\n }\n ownerById.set(nativeId, `native:${nativeId}`);\n return nativeId;\n },\n };\n}\n\nexport type OpenClawCrablineProviderAdapter = {\n createAgentDelivery(parsed: ParsedQaTarget): OpenClawCrablineCorrelatedAgentDelivery;\n createBinding(): OpenClawCrablineGatewayBinding;\n createInbound(input: OpenClawCrablineInboundInput): OpenClawCrablineInbound;\n createOutboundObservation(params: { event: unknown }): OpenClawCrablineOutboundObservation | null;\n probe(signal?: AbortSignal): Promise<unknown>;\n resolveInboundProviderTargetKey?(params: {\n inbound: OpenClawCrablineInbound;\n response: unknown;\n }): string;\n};\n\nexport type OpenClawCrablineProviderBridge<\n TManifest extends CrablineServerManifest = CrablineServerManifest,\n> = {\n createAdapter(manifest: TManifest): OpenClawCrablineProviderAdapter;\n createAdapterFromManifest(manifest: CrablineServerManifest): OpenClawCrablineProviderAdapter;\n provider: TManifest[\"provider\"];\n};\n\nexport type OpenClawCrablineProviderBridgeRegistry = {\n [Provider in CrablineServerManifest[\"provider\"]]: OpenClawCrablineProviderBridge<\n Extract<CrablineServerManifest, { provider: Provider }>\n >;\n};\n\nexport function createOpenClawCrablineProviderBridge<\n TProvider extends CrablineServerManifest[\"provider\"],\n>(params: {\n allowAttachmentOnlyInbound?: boolean;\n createAdapter(\n manifest: Extract<CrablineServerManifest, { provider: TProvider }>,\n ): OpenClawCrablineProviderAdapter;\n provider: TProvider;\n}): OpenClawCrablineProviderBridge<Extract<CrablineServerManifest, { provider: TProvider }>> {\n type ProviderManifest = Extract<CrablineServerManifest, { provider: TProvider }>;\n const createAdapter = (manifest: ProviderManifest): OpenClawCrablineProviderAdapter => {\n const adapter = params.createAdapter(manifest);\n return {\n createAgentDelivery(parsed) {\n return adapter.createAgentDelivery(parsed);\n },\n createBinding() {\n return adapter.createBinding();\n },\n createInbound(input) {\n if (\n !readNonBlankString(input.text) &&\n !(params.allowAttachmentOnlyInbound && input.attachments?.length)\n ) {\n throw new Error(\"OpenClaw Crabline inbound message text is required.\");\n }\n if (input.conversation.kind !== \"direct\" && input.conversation.kind !== \"group\") {\n throw new Error(\"OpenClaw Crabline inbound conversation kind must be direct or group.\");\n }\n return adapter.createInbound(input);\n },\n createOutboundObservation(outboundParams) {\n return adapter.createOutboundObservation(outboundParams);\n },\n probe(signal) {\n return adapter.probe(signal);\n },\n ...(adapter.resolveInboundProviderTargetKey\n ? {\n resolveInboundProviderTargetKey: adapter.resolveInboundProviderTargetKey.bind(adapter),\n }\n : {}),\n };\n };\n const bridge: OpenClawCrablineProviderBridge<ProviderManifest> = {\n createAdapter,\n createAdapterFromManifest(manifest) {\n if (manifest.provider !== params.provider) {\n throw new Error(\n `Unsupported OpenClaw provider binding: expected ${params.provider}, got ${manifest.provider}.`,\n );\n }\n return createAdapter(manifest as ProviderManifest);\n },\n provider: params.provider as ProviderManifest[\"provider\"],\n };\n return bridge;\n}\n\nexport function correlateOpenClawCrablineOutboundObservation(params: {\n observation: OpenClawCrablineOutboundObservation;\n targetByProviderTarget: ReadonlyMap<string, string>;\n}): OpenClawCrablineOutboundMessage | null {\n const to =\n params.observation.providerTargetKeys\n .map((key) => params.targetByProviderTarget.get(key))\n .find((target) => target !== undefined) ?? params.observation.fallbackTarget;\n if (!to) {\n return null;\n }\n const {\n fallbackTarget: _fallbackTarget,\n providerTargetKeys: _providerTargetKeys,\n ...message\n } = params.observation;\n return { ...message, to };\n}\n\nexport async function runOpenClawCrablineProviderProbe<T>(\n provider: CrablineServerManifest[\"provider\"],\n probe: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n const signal = AbortSignal.timeout(OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS);\n const timeoutError = (cause: unknown) =>\n new Error(\n `Crabline ${OPENCLAW_CRABLINE_PROVIDER_PROBE_LABELS[provider]} probe timed out after ${OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS} ms.`,\n { cause },\n );\n const operation = Promise.resolve().then(() => probe(signal));\n const settled = operation.then(\n () => undefined,\n () => undefined,\n );\n let onAbort: (() => void) | undefined;\n const timeout = new Promise<{ kind: \"timeout\" }>((resolve) => {\n onAbort = () => resolve({ kind: \"timeout\" });\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n try {\n const outcome = await Promise.race([\n operation.then(\n (value) => ({ kind: \"result\" as const, value }),\n (error: unknown) => ({ error, kind: \"error\" as const }),\n ),\n timeout,\n ]);\n if (outcome.kind === \"result\") {\n return outcome.value;\n }\n if (outcome.kind === \"error\" && !signal.aborted) {\n throw outcome.error;\n }\n\n const failure = timeoutError(outcome.kind === \"error\" ? outcome.error : signal.reason);\n let abortGrace: ReturnType<typeof setTimeout> | undefined;\n const drained = await Promise.race([\n settled.then(() => true as const),\n new Promise<false>((resolve) => {\n abortGrace = setTimeout(\n () => resolve(false),\n OPENCLAW_CRABLINE_PROVIDER_PROBE_ABORT_GRACE_MS,\n );\n }),\n ]);\n if (abortGrace) {\n clearTimeout(abortGrace);\n }\n if (!drained) {\n unsettledProviderProbeSettlements.set(failure, settled);\n }\n throw failure;\n } finally {\n if (onAbort) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n }\n}\n\nexport function getUnsettledOpenClawCrablineProviderProbe(\n error: unknown,\n): Promise<void> | undefined {\n return error instanceof Error ? unsettledProviderProbeSettlements.get(error) : undefined;\n}\n\nexport function readString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return String(value);\n }\n return undefined;\n}\n\nexport function readNonBlankString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function readInteger(value: unknown): number | undefined {\n const stringValue = readString(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n const parsed = Number(stringValue);\n return Number.isSafeInteger(parsed) ? parsed : undefined;\n}\n\nexport function parseQaTarget(target: string): ParsedQaTarget {\n const trimmed = target.trim();\n const invalidTarget = () => {\n throw new Error(\n \"OpenClaw Crabline target must be a non-blank native id or a valid dm:<id>, group:<id>, channel:<id>, or thread:<id>/<thread-id> target.\",\n );\n };\n if (!trimmed) {\n return invalidTarget();\n }\n if (trimmed.startsWith(\"thread:\")) {\n const encoded = trimmed.startsWith(\"thread:/v1/\");\n const rest = trimmed.slice(encoded ? \"thread:/v1/\".length : \"thread:\".length);\n const components = rest.split(\"/\");\n const explicitKind =\n encoded && components.length === 3 && (components[0] === \"dm\" || components[0] === \"group\")\n ? components.shift()\n : undefined;\n if (components.length !== 2) {\n return invalidTarget();\n }\n let id = components[0]!.trim();\n let threadId = components[1]!.trim();\n if (encoded) {\n try {\n id = decodeURIComponent(id).trim();\n threadId = decodeURIComponent(threadId).trim();\n } catch {\n return invalidTarget();\n }\n }\n if (!id || !threadId) {\n return invalidTarget();\n }\n return {\n kind: explicitKind === \"dm\" ? \"direct\" : \"group\",\n id,\n native: false,\n threadId,\n };\n }\n if (trimmed.startsWith(\"channel:\")) {\n const id = trimmed.slice(\"channel:\".length).trim();\n return id ? { kind: \"group\", id, native: true } : invalidTarget();\n }\n if (trimmed.startsWith(\"group:\")) {\n const id = trimmed.slice(\"group:\".length).trim();\n return id ? { kind: \"group\", id, native: false } : invalidTarget();\n }\n if (trimmed.startsWith(\"dm:\")) {\n const id = trimmed.slice(\"dm:\".length).trim();\n return id ? { kind: \"direct\", id, native: false } : invalidTarget();\n }\n if (/^(?:dm|group|channel|thread)(?=\\s*:|$)/iu.test(trimmed)) {\n return invalidTarget();\n }\n return { kind: \"direct\", id: trimmed, native: true };\n}\n\nexport function canonicalConversationIdForInbound(input: OpenClawCrablineInboundInput) {\n const conversationId = readNonBlankString(input.conversation.id);\n if (!conversationId) {\n throw new Error(\"OpenClaw Crabline inbound conversation id is required.\");\n }\n return conversationId.trim();\n}\n\nfunction encodeQaThreadComponent(value: string): string {\n return value.replaceAll(\"%\", \"%25\").replaceAll(\"/\", \"%2F\");\n}\n\nexport function qaTargetForInbound(input: OpenClawCrablineInboundInput) {\n const conversationId = canonicalConversationIdForInbound(input);\n const threadId = input.threadId?.trim();\n const prefix = input.conversation.kind === \"direct\" ? \"dm\" : \"group\";\n return threadId\n ? `thread:/v1/${input.conversation.kind === \"direct\" ? \"dm/\" : \"\"}${encodeQaThreadComponent(conversationId)}/${encodeQaThreadComponent(threadId)}`\n : `${prefix}:${conversationId}`;\n}\n\nexport function createAdminInboundRequest(manifest: CrablineServerManifest) {\n return {\n providerHeaders: {\n \"content-type\": \"application/json\",\n [ADMIN_TOKEN_HEADER]: manifest.adminToken,\n },\n providerUrl: manifest.endpoints.adminInboundUrl,\n };\n}\n"]}
@@ -49,11 +49,26 @@ export type WhatsAppBaileysInboundMessage = {
49
49
  remoteJid: string;
50
50
  };
51
51
  message: {
52
+ audioMessage?: never;
52
53
  conversation: string;
54
+ } | {
55
+ audioMessage: WhatsAppBaileysAudioMessage;
56
+ conversation?: never;
53
57
  };
54
58
  messageTimestamp: number;
55
59
  pushName?: string | undefined;
56
60
  };
61
+ export type WhatsAppBaileysAudioMessage = {
62
+ fileEncSha256: Buffer;
63
+ fileLength: number;
64
+ fileSha256: Buffer;
65
+ mediaKey: Buffer;
66
+ mediaKeyTimestamp: number;
67
+ mimetype: string;
68
+ ptt: boolean;
69
+ seconds?: number | undefined;
70
+ url: string;
71
+ };
57
72
  export declare function resolveMaxPendingWhatsAppInboundMessages(value: number | undefined): number;
58
73
  export type MockSignalBundle = {
59
74
  identityKey: KeyPair;
@@ -1787,7 +1787,7 @@ function createInboundMessageNode(message) {
1787
1787
  content: [
1788
1788
  {
1789
1789
  attrs: {},
1790
- content: encodePlaintextConversationMessage(message.message.conversation),
1790
+ content: encodePlaintextInboundMessage(message.message),
1791
1791
  tag: "plaintext",
1792
1792
  },
1793
1793
  ],
@@ -1814,6 +1814,36 @@ function encodePlaintextConversationMessage(text) {
1814
1814
  const textBytes = Buffer.from(text, "utf8");
1815
1815
  return Buffer.from([0x0a, ...encodeVarint(textBytes.byteLength), ...textBytes]);
1816
1816
  }
1817
+ function encodePlaintextInboundMessage(message) {
1818
+ if (message.audioMessage) {
1819
+ return encodePlaintextAudioMessage(message.audioMessage);
1820
+ }
1821
+ return encodePlaintextConversationMessage(message.conversation);
1822
+ }
1823
+ function encodePlaintextAudioMessage(audio) {
1824
+ const fields = [
1825
+ encodeLengthDelimitedProtobufField(1, Buffer.from(audio.url, "utf8")),
1826
+ encodeLengthDelimitedProtobufField(2, Buffer.from(audio.mimetype, "utf8")),
1827
+ encodeLengthDelimitedProtobufField(3, audio.fileSha256),
1828
+ encodeVarintProtobufField(4, audio.fileLength),
1829
+ ...(audio.seconds === undefined ? [] : [encodeVarintProtobufField(5, audio.seconds)]),
1830
+ encodeVarintProtobufField(6, audio.ptt ? 1 : 0),
1831
+ encodeLengthDelimitedProtobufField(7, audio.mediaKey),
1832
+ encodeLengthDelimitedProtobufField(8, audio.fileEncSha256),
1833
+ encodeVarintProtobufField(10, audio.mediaKeyTimestamp),
1834
+ ];
1835
+ return encodeLengthDelimitedProtobufField(8, Buffer.concat(fields));
1836
+ }
1837
+ function encodeLengthDelimitedProtobufField(fieldNumber, value) {
1838
+ return Buffer.concat([
1839
+ Buffer.from(encodeVarint((fieldNumber << 3) | 2)),
1840
+ Buffer.from(encodeVarint(value.byteLength)),
1841
+ Buffer.from(value),
1842
+ ]);
1843
+ }
1844
+ function encodeVarintProtobufField(fieldNumber, value) {
1845
+ return Buffer.from([...encodeVarint(fieldNumber << 3), ...encodeVarint(value)]);
1846
+ }
1817
1847
  function encodeVarint(value) {
1818
1848
  const bytes = [];
1819
1849
  let remaining = value;