@openclaw/crabline 0.1.9 → 0.1.10

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.
Files changed (189) hide show
  1. package/README.md +47 -22
  2. package/assets/crabline-banner.svg +20 -0
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +25 -1
  5. package/dist/src/cli/program.js +579 -82
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +59 -6
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +116 -92
  10. package/dist/src/config/schema.js +179 -73
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.js +9 -2
  13. package/dist/src/core/errors.js.map +1 -1
  14. package/dist/src/core/exit-codes.js.map +1 -1
  15. package/dist/src/core/matcher.js +7 -6
  16. package/dist/src/core/matcher.js.map +1 -1
  17. package/dist/src/core/message-template.js.map +1 -1
  18. package/dist/src/core/nonces.d.ts +1 -0
  19. package/dist/src/core/nonces.js +4 -2
  20. package/dist/src/core/nonces.js.map +1 -1
  21. package/dist/src/core/reporters.d.ts +1 -0
  22. package/dist/src/core/reporters.js +42 -4
  23. package/dist/src/core/reporters.js.map +1 -1
  24. package/dist/src/core/run.d.ts +3 -0
  25. package/dist/src/core/run.js +415 -107
  26. package/dist/src/core/run.js.map +1 -1
  27. package/dist/src/core/safe-regex.d.ts +3 -0
  28. package/dist/src/core/safe-regex.js +21 -0
  29. package/dist/src/core/safe-regex.js.map +1 -0
  30. package/dist/src/index.d.ts +2 -2
  31. package/dist/src/index.js +1 -1
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/openclaw/artifact-generation.d.ts +38 -0
  34. package/dist/src/openclaw/artifact-generation.js +314 -0
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -0
  36. package/dist/src/openclaw/bridges/matrix.js +97 -12
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +32 -10
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/signal.js +55 -18
  41. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  42. package/dist/src/openclaw/bridges/slack.js +85 -7
  43. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  44. package/dist/src/openclaw/bridges/telegram.js +124 -30
  45. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  46. package/dist/src/openclaw/bridges/whatsapp.js +78 -17
  47. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  48. package/dist/src/openclaw/bridges/zalo.js +14 -5
  49. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  50. package/dist/src/openclaw/outbound-contract.d.ts +5 -0
  51. package/dist/src/openclaw/outbound-contract.js +40 -0
  52. package/dist/src/openclaw/outbound-contract.js.map +1 -0
  53. package/dist/src/openclaw/private-file.d.ts +26 -0
  54. package/dist/src/openclaw/private-file.js +411 -0
  55. package/dist/src/openclaw/private-file.js.map +1 -0
  56. package/dist/src/openclaw/shared.d.ts +21 -2
  57. package/dist/src/openclaw/shared.js +115 -18
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +63 -0
  60. package/dist/src/openclaw/smoke-lock.js +949 -0
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -0
  62. package/dist/src/openclaw.d.ts +16 -8
  63. package/dist/src/openclaw.js +194 -52
  64. package/dist/src/openclaw.js.map +1 -1
  65. package/dist/src/providers/builtin/discord.d.ts +10 -1
  66. package/dist/src/providers/builtin/discord.js +144 -18
  67. package/dist/src/providers/builtin/discord.js.map +1 -1
  68. package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
  69. package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
  70. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
  71. package/dist/src/providers/builtin/feishu.d.ts +19 -2
  72. package/dist/src/providers/builtin/feishu.js +307 -25
  73. package/dist/src/providers/builtin/feishu.js.map +1 -1
  74. package/dist/src/providers/builtin/googlechat.d.ts +20 -1
  75. package/dist/src/providers/builtin/googlechat.js +178 -19
  76. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  77. package/dist/src/providers/builtin/imessage.d.ts +4 -0
  78. package/dist/src/providers/builtin/imessage.js +26 -11
  79. package/dist/src/providers/builtin/imessage.js.map +1 -1
  80. package/dist/src/providers/builtin/loopback.js +92 -30
  81. package/dist/src/providers/builtin/loopback.js.map +1 -1
  82. package/dist/src/providers/builtin/matrix.d.ts +11 -1
  83. package/dist/src/providers/builtin/matrix.js +53 -29
  84. package/dist/src/providers/builtin/matrix.js.map +1 -1
  85. package/dist/src/providers/builtin/mattermost.d.ts +10 -0
  86. package/dist/src/providers/builtin/mattermost.js +38 -15
  87. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  88. package/dist/src/providers/builtin/msteams.d.ts +17 -1
  89. package/dist/src/providers/builtin/msteams.js +113 -14
  90. package/dist/src/providers/builtin/msteams.js.map +1 -1
  91. package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
  92. package/dist/src/providers/builtin/native-local-mock.js +12 -35
  93. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  94. package/dist/src/providers/builtin/script.d.ts +11 -15
  95. package/dist/src/providers/builtin/script.js +566 -104
  96. package/dist/src/providers/builtin/script.js.map +1 -1
  97. package/dist/src/providers/builtin/slack.d.ts +6 -0
  98. package/dist/src/providers/builtin/slack.js +99 -40
  99. package/dist/src/providers/builtin/slack.js.map +1 -1
  100. package/dist/src/providers/builtin/telegram.d.ts +6 -0
  101. package/dist/src/providers/builtin/telegram.js +64 -43
  102. package/dist/src/providers/builtin/telegram.js.map +1 -1
  103. package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
  104. package/dist/src/providers/builtin/whatsapp.js +567 -30
  105. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  106. package/dist/src/providers/builtin/zalo.js +30 -19
  107. package/dist/src/providers/builtin/zalo.js.map +1 -1
  108. package/dist/src/providers/catalog.d.ts +3 -3
  109. package/dist/src/providers/catalog.js +3 -3
  110. package/dist/src/providers/catalog.js.map +1 -1
  111. package/dist/src/providers/local-mock.d.ts +11 -2
  112. package/dist/src/providers/local-mock.js +322 -96
  113. package/dist/src/providers/local-mock.js.map +1 -1
  114. package/dist/src/providers/native-ids.d.ts +1 -0
  115. package/dist/src/providers/native-ids.js +6 -1
  116. package/dist/src/providers/native-ids.js.map +1 -1
  117. package/dist/src/providers/recorder.d.ts +30 -2
  118. package/dist/src/providers/recorder.js +539 -70
  119. package/dist/src/providers/recorder.js.map +1 -1
  120. package/dist/src/providers/registry.d.ts +25 -1
  121. package/dist/src/providers/registry.js +280 -40
  122. package/dist/src/providers/registry.js.map +1 -1
  123. package/dist/src/providers/signed-jwt.d.ts +29 -0
  124. package/dist/src/providers/signed-jwt.js +202 -0
  125. package/dist/src/providers/signed-jwt.js.map +1 -0
  126. package/dist/src/providers/slack-ids.js.map +1 -1
  127. package/dist/src/providers/target-normalizers.d.ts +26 -0
  128. package/dist/src/providers/target-normalizers.js +276 -0
  129. package/dist/src/providers/target-normalizers.js.map +1 -0
  130. package/dist/src/providers/types.d.ts +5 -0
  131. package/dist/src/providers/types.js.map +1 -1
  132. package/dist/src/providers/webhook-server.d.ts +2 -0
  133. package/dist/src/providers/webhook-server.js +72 -25
  134. package/dist/src/providers/webhook-server.js.map +1 -1
  135. package/dist/src/servers/http.d.ts +23 -3
  136. package/dist/src/servers/http.js +213 -20
  137. package/dist/src/servers/http.js.map +1 -1
  138. package/dist/src/servers/index.js +20 -21
  139. package/dist/src/servers/index.js.map +1 -1
  140. package/dist/src/servers/matrix.js +465 -51
  141. package/dist/src/servers/matrix.js.map +1 -1
  142. package/dist/src/servers/mattermost.d.ts +5 -0
  143. package/dist/src/servers/mattermost.js +306 -58
  144. package/dist/src/servers/mattermost.js.map +1 -1
  145. package/dist/src/servers/pending-events.d.ts +2 -0
  146. package/dist/src/servers/pending-events.js +11 -0
  147. package/dist/src/servers/pending-events.js.map +1 -0
  148. package/dist/src/servers/recorder.d.ts +5 -0
  149. package/dist/src/servers/recorder.js +46 -3
  150. package/dist/src/servers/recorder.js.map +1 -1
  151. package/dist/src/servers/signal.d.ts +2 -0
  152. package/dist/src/servers/signal.js +444 -56
  153. package/dist/src/servers/signal.js.map +1 -1
  154. package/dist/src/servers/slack.d.ts +5 -0
  155. package/dist/src/servers/slack.js +515 -49
  156. package/dist/src/servers/slack.js.map +1 -1
  157. package/dist/src/servers/telegram.d.ts +111 -0
  158. package/dist/src/servers/telegram.js +811 -152
  159. package/dist/src/servers/telegram.js.map +1 -1
  160. package/dist/src/servers/webhook-target.d.ts +40 -0
  161. package/dist/src/servers/webhook-target.js +349 -0
  162. package/dist/src/servers/webhook-target.js.map +1 -0
  163. package/dist/src/servers/websocket.d.ts +2 -0
  164. package/dist/src/servers/websocket.js +29 -0
  165. package/dist/src/servers/websocket.js.map +1 -0
  166. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
  167. package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
  168. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  169. package/dist/src/servers/whatsapp-jid.d.ts +5 -0
  170. package/dist/src/servers/whatsapp-jid.js +32 -0
  171. package/dist/src/servers/whatsapp-jid.js.map +1 -0
  172. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
  173. package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
  174. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  175. package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
  176. package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
  177. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  178. package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
  179. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  181. package/dist/src/servers/whatsapp.d.ts +12 -7
  182. package/dist/src/servers/whatsapp.js +269 -107
  183. package/dist/src/servers/whatsapp.js.map +1 -1
  184. package/dist/src/servers/zalo.d.ts +14 -0
  185. package/dist/src/servers/zalo.js +521 -88
  186. package/dist/src/servers/zalo.js.map +1 -1
  187. package/docs/channel-setup.md +197 -19
  188. package/fixtures/examples/crabline.example.yaml +10 -0
  189. package/package.json +20 -15
@@ -1 +1 @@
1
- {"version":3,"file":"script.js","sourceRoot":"","sources":["../../../../src/providers/builtin/script.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../../../../src/providers/builtin/script.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, type ChildProcess, type ChildProcessByStdio } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { z } from \"zod\";\nimport { CrablineError, ensureErrorMessage } from \"../../core/errors.js\";\nimport type {\n InboundEnvelope,\n ProviderAdapter,\n ProviderContext,\n SendContext,\n WaitContext,\n WatchContext,\n} from \"../types.js\";\n\nconst MAX_SCRIPT_OUTPUT_BYTES = 1024 * 1024;\nconst SCRIPT_WAIT_EXIT_GRACE_MS = 250;\nconst WINDOWS_TERMINATION_TIMEOUT_MS = 5_000;\n\ntype ScriptWatchIterator = AsyncIterableIterator<InboundEnvelope> & {\n [Symbol.asyncIterator](): ScriptWatchIterator;\n return(): Promise<IteratorResult<InboundEnvelope, undefined>>;\n throw(error?: unknown): Promise<IteratorResult<InboundEnvelope, undefined>>;\n};\n\ntype ScriptPayload = {\n fixture: ProviderContext[\"fixture\"];\n provider: {\n config: ProviderContext[\"config\"];\n id: string;\n manifestPath: string;\n };\n};\n\ntype ScriptDiagnosticsSnapshot = {\n configuredCommands: string[];\n sensitiveEnvironmentValues: string[];\n sensitivePayloadValues: string[];\n};\n\ntype SpawnedScriptChild = ChildProcessByStdio<Writable, Readable, Readable>;\n\nconst ScriptMessageSchema = z.object({\n author: z.enum([\"assistant\", \"system\", \"user\"]),\n id: z.string().min(1),\n raw: z.unknown().optional(),\n sentAt: z.string().min(1),\n text: z.string(),\n threadId: z.string().min(1),\n});\n\nconst ScriptProbeResultSchema = z.object({\n details: z.array(z.string()).optional(),\n healthy: z.boolean(),\n});\n\nconst ScriptSendResultSchema = z.object({\n accepted: z.boolean(),\n messageId: z.string().min(1),\n threadId: z.string().min(1),\n});\n\nconst ScriptInboundResultSchema = z\n .object({\n message: ScriptMessageSchema.optional(),\n timeout: z.boolean().optional(),\n })\n .refine(\n (result) =>\n (result.timeout === true && result.message === undefined) ||\n (result.timeout !== true && result.message !== undefined),\n { message: \"result must contain either a message or timeout: true\" },\n );\n\nasync function terminateChild(child: ChildProcess): Promise<void> {\n if (process.platform === \"win32\" && child.pid) {\n await new Promise<void>((resolve) => {\n let taskkill: ChildProcess;\n try {\n taskkill = spawn(\"taskkill.exe\", [\"/PID\", String(child.pid), \"/T\", \"/F\"], {\n stdio: \"ignore\",\n windowsHide: true,\n });\n } catch {\n resolve();\n return;\n }\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve();\n };\n const timeout = setTimeout(() => {\n taskkill.kill(\"SIGKILL\");\n finish();\n }, WINDOWS_TERMINATION_TIMEOUT_MS);\n timeout.unref();\n taskkill.once(\"close\", finish);\n taskkill.once(\"error\", finish);\n });\n } else if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n // The process group may have exited with the shell.\n }\n }\n\n if (child.exitCode === null && child.signalCode === null) {\n child.kill(\"SIGKILL\");\n }\n}\n\nfunction formatValidationError(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.length > 0 ? issue.path.join(\".\") : \"result\"}: ${issue.message}`)\n .join(\"; \");\n}\n\nconst sensitiveEnvironmentNameFragmentPattern =\n /(?:AUTH|BEARER|CREDENTIAL|KEY|PASS|PRIVATE|SECRET|TOKEN)/iu;\nconst nonSensitiveWorkingDirectoryNames = new Set([\"PWD\", \"OLDPWD\"]);\n\nfunction isSensitiveEnvironmentName(name: string): boolean {\n const upperName = name.toUpperCase();\n return (\n sensitiveEnvironmentNameFragmentPattern.test(upperName) ||\n (!nonSensitiveWorkingDirectoryNames.has(upperName) && upperName.includes(\"PWD\")) ||\n /PAT(?!H)/u.test(upperName)\n );\n}\n\nfunction commandContainsSensitiveValue(command: string): boolean {\n const assignments = [\n ...command.matchAll(/(?:^|[\\s;&|])[\"']?([A-Za-z_][A-Za-z0-9_]*)\\s*\\+?=/gu),\n ...command.matchAll(/\\$env:([A-Za-z_][A-Za-z0-9_]*)\\s*\\+?=/giu),\n ...command.matchAll(/\\$\\{env:([A-Za-z_][A-Za-z0-9_]*)\\}\\s*\\+?=/giu),\n ];\n if (assignments.some((match) => isSensitiveEnvironmentName(match[1] ?? \"\"))) {\n return true;\n }\n return [...command.matchAll(/(?:^|[\\s;&|])[\"']?--([A-Za-z0-9][A-Za-z0-9_-]*)(?:=|\\s)/gu)].some(\n (match) => isSensitiveEnvironmentName((match[1] ?? \"\").replaceAll(\"-\", \"_\")),\n );\n}\n\nfunction snapshotSensitiveEnvironmentValues(): string[] {\n const representations = new Set<string>();\n const values = Object.entries(process.env)\n .filter(\n ([name, value]) =>\n isSensitiveEnvironmentName(name) && value !== undefined && value.length > 0,\n )\n .map(([, value]) => value!)\n .sort((left, right) => right.length - left.length);\n for (const value of values) {\n representations.add(value);\n representations.add(JSON.stringify(value));\n representations.add(JSON.stringify(value).slice(1, -1));\n }\n return [...representations].sort((left, right) => right.length - left.length);\n}\n\nfunction redactSensitiveEnvironmentValues(\n detail: string,\n sensitiveEnvironmentValues: string[],\n): string {\n let redacted = detail;\n for (const representation of sensitiveEnvironmentValues) {\n redacted = redacted.split(representation).join(\"[redacted environment value]\");\n }\n return redacted;\n}\n\nfunction collectSensitivePayloadValues(\n value: unknown,\n values: Set<string>,\n seen: { nonSensitive: WeakSet<object>; sensitive: WeakSet<object> },\n sensitive = false,\n): void {\n if (typeof value === \"string\") {\n if (sensitive && value.length > 0) {\n values.add(value);\n const serialized = JSON.stringify(value);\n values.add(serialized);\n values.add(serialized.slice(1, -1));\n }\n return;\n }\n if (sensitive && typeof value === \"number\" && Number.isFinite(value)) {\n values.add(String(value));\n return;\n }\n if (!value || typeof value !== \"object\") {\n return;\n }\n const visited = sensitive ? seen.sensitive : seen.nonSensitive;\n if (visited.has(value)) {\n return;\n }\n visited.add(value);\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectSensitivePayloadValues(entry, values, seen, sensitive);\n }\n return;\n }\n for (const [name, entry] of Object.entries(value)) {\n collectSensitivePayloadValues(\n entry,\n values,\n seen,\n sensitive || isSensitiveEnvironmentName(name),\n );\n }\n}\n\nfunction snapshotSensitivePayloadValues(payload: unknown): string[] {\n const values = new Set<string>();\n collectSensitivePayloadValues(payload, values, {\n nonSensitive: new WeakSet(),\n sensitive: new WeakSet(),\n });\n return [...values].sort((left, right) => right.length - left.length);\n}\n\nfunction redactSensitivePayloadValues(detail: string, sensitivePayloadValues: string[]): string {\n let redacted = detail;\n for (const value of sensitivePayloadValues) {\n redacted = redacted.split(value).join(\"[redacted configured value]\");\n }\n return redacted;\n}\n\nfunction formatScriptError(\n summary: string,\n detail: string,\n command: string,\n diagnostics: ScriptDiagnosticsSnapshot,\n): string {\n if (!detail.trim()) {\n return summary;\n }\n if (commandContainsSensitiveValue(command)) {\n return `${summary}\\n[script diagnostics redacted]`;\n }\n let redacted = redactSensitivePayloadValues(\n redactSensitiveEnvironmentValues(detail, diagnostics.sensitiveEnvironmentValues),\n diagnostics.sensitivePayloadValues,\n );\n for (const configuredCommand of diagnostics.configuredCommands) {\n redacted = redacted.split(configuredCommand).join(\"[configured script command]\");\n }\n redacted = redacted.trim();\n return redacted ? `${summary}\\n${redacted}` : summary;\n}\n\nfunction createScriptDiagnosticsSnapshot(\n command: string,\n serializedPayload: string,\n): ScriptDiagnosticsSnapshot {\n const payload = JSON.parse(serializedPayload) as unknown;\n const configuredCommands = new Set([command]);\n const commands = (\n payload as {\n provider?: { config?: { script?: { commands?: Record<string, unknown> } } };\n }\n ).provider?.config?.script?.commands;\n for (const configuredCommand of Object.values(commands ?? {})) {\n if (typeof configuredCommand === \"string\" && configuredCommand.length > 0) {\n configuredCommands.add(configuredCommand);\n }\n }\n return {\n configuredCommands: [...configuredCommands].sort((left, right) => right.length - left.length),\n sensitiveEnvironmentValues: snapshotSensitiveEnvironmentValues(),\n sensitivePayloadValues: snapshotSensitivePayloadValues(payload),\n };\n}\n\nfunction parseScriptJson<T>(params: {\n command: string;\n diagnostics: ScriptDiagnosticsSnapshot;\n output: string;\n schema: z.ZodType<T>;\n}): T {\n let parsed: unknown;\n try {\n parsed = JSON.parse(params.output);\n } catch (error) {\n throw new CrablineError(\n formatScriptError(\n \"Script command did not return valid JSON.\",\n ensureErrorMessage(error),\n params.command,\n params.diagnostics,\n ),\n { kind: \"config\" },\n );\n }\n\n const result = params.schema.safeParse(parsed);\n if (!result.success) {\n throw new CrablineError(\n `Script command returned invalid result.\\n${formatValidationError(result.error)}`,\n { kind: \"config\" },\n );\n }\n return result.data;\n}\n\nfunction runScript<T>(params: {\n acceptResultDuringTimeoutGrace?: ((result: T) => boolean) | undefined;\n command: string;\n cwd?: string | undefined;\n payload: unknown;\n schema: z.ZodType<T>;\n shell?: string | undefined;\n signal?: AbortSignal | undefined;\n timeoutGraceMs?: number | undefined;\n timeoutMs: number;\n}): Promise<T> {\n if (params.signal?.aborted) {\n return Promise.reject(params.signal.reason ?? new Error(\"Script command aborted.\"));\n }\n const serializedPayload = JSON.stringify(params.payload);\n const diagnostics = createScriptDiagnosticsSnapshot(params.command, serializedPayload);\n return new Promise((resolve, reject) => {\n let child: SpawnedScriptChild;\n try {\n child = spawn(params.command, {\n cwd: params.cwd ? path.resolve(params.cwd) : process.cwd(),\n env: process.env,\n shell: params.shell ?? true,\n detached: process.platform !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n reject(\n new CrablineError(\n formatScriptError(\n \"Script command failed to start.\",\n ensureErrorMessage(error),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n ),\n );\n return;\n }\n\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let deadlineExceeded = false;\n let outputBytes = 0;\n let settled = false;\n let timeoutGrace: NodeJS.Timeout | undefined;\n const abort = () => {\n finish(async () => {\n await terminateChild(child);\n reject(params.signal?.reason ?? new Error(\"Script command aborted.\"));\n });\n };\n\n const finish = (callback: () => Promise<void> | void) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n clearTimeout(timeoutGrace);\n params.signal?.removeEventListener(\"abort\", abort);\n void callback();\n };\n\n const failForOutputLimit = () => {\n finish(async () => {\n await terminateChild(child);\n reject(\n new CrablineError(`Script command exceeded ${MAX_SCRIPT_OUTPUT_BYTES} bytes of output.`, {\n kind: \"connectivity\",\n }),\n );\n });\n };\n\n child.stdout.on(\"data\", (chunk) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n outputBytes += buffer.length;\n if (outputBytes > MAX_SCRIPT_OUTPUT_BYTES) {\n failForOutputLimit();\n return;\n }\n stdout.push(buffer);\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n outputBytes += buffer.length;\n if (outputBytes > MAX_SCRIPT_OUTPUT_BYTES) {\n failForOutputLimit();\n return;\n }\n stderr.push(buffer);\n });\n\n child.stdin.on(\"error\", () => {\n // Child closure is reported through the process error/close handlers.\n });\n child.once(\"error\", (error) => {\n finish(() => {\n reject(\n new CrablineError(\n formatScriptError(\n \"Script command failed to start.\",\n ensureErrorMessage(error),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n ),\n );\n });\n });\n child.once(\"close\", (code, signal) => {\n finish(() => {\n const stdoutText = Buffer.concat(stdout).toString(\"utf8\");\n const stderrText = Buffer.concat(stderr).toString(\"utf8\");\n if (code !== 0) {\n reject(\n new CrablineError(\n formatScriptError(\n `Script command failed${signal ? ` (${signal})` : \"\"}.`,\n stderrText.trim() ? stderrText : stdoutText,\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n ),\n );\n return;\n }\n\n try {\n const result = parseScriptJson({\n command: params.command,\n diagnostics,\n output: stdoutText,\n schema: params.schema,\n });\n if (deadlineExceeded && !params.acceptResultDuringTimeoutGrace?.(result)) {\n reject(\n new CrablineError(`Script command timed out after ${params.timeoutMs}ms.`, {\n kind: \"timeout\",\n }),\n );\n return;\n }\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n });\n\n const failForTimeout = () => {\n finish(async () => {\n await terminateChild(child);\n reject(\n new CrablineError(`Script command timed out after ${params.timeoutMs}ms.`, {\n kind: \"timeout\",\n }),\n );\n });\n };\n const timeout = setTimeout(() => {\n const timeoutGraceMs = params.timeoutGraceMs ?? 0;\n if (timeoutGraceMs <= 0) {\n failForTimeout();\n return;\n }\n deadlineExceeded = true;\n timeoutGrace = setTimeout(failForTimeout, timeoutGraceMs);\n timeoutGrace.unref();\n }, params.timeoutMs);\n timeout.unref();\n\n if (params.signal?.aborted) {\n abort();\n return;\n }\n params.signal?.addEventListener(\"abort\", abort, { once: true });\n child.stdin.end(serializedPayload);\n });\n}\n\nfunction watchScript(params: {\n cancelSignal: AbortSignal;\n command: string;\n context: WatchContext;\n cwd?: string | undefined;\n id: string;\n normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n shell?: string | undefined;\n}): AsyncGenerator<InboundEnvelope> {\n return (async function* () {\n if (params.cancelSignal.aborted) {\n return;\n }\n if (params.context.signal?.aborted) {\n throw params.context.signal.reason ?? new Error(\"Script watch command aborted.\");\n }\n const payload = {\n ...createPayload(params.context),\n watch: {\n since: params.context.since,\n target: params.normalizeTarget(params.context.fixture.target),\n },\n };\n const serializedPayload = JSON.stringify(payload);\n const diagnostics = createScriptDiagnosticsSnapshot(params.command, serializedPayload);\n let child: SpawnedScriptChild;\n try {\n child = spawn(params.command, {\n cwd: params.cwd ? path.resolve(params.cwd) : process.cwd(),\n env: process.env,\n shell: params.shell ?? true,\n detached: process.platform !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n throw new CrablineError(\n formatScriptError(\n \"Script watch command failed to start.\",\n ensureErrorMessage(error),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n );\n }\n\n let buffer = \"\";\n let stderr = \"\";\n let childError: unknown;\n let outputLimitError: CrablineError | undefined;\n const stopChild = () => {\n void terminateChild(child);\n };\n params.cancelSignal.addEventListener(\"abort\", stopChild, { once: true });\n params.context.signal?.addEventListener(\"abort\", stopChild, { once: true });\n if (params.cancelSignal.aborted || params.context.signal?.aborted) {\n stopChild();\n }\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdin.on(\"error\", () => {\n // Child closure is reported through the process error/close handlers.\n });\n child.stderr.on(\"data\", (chunk) => {\n if (outputLimitError) {\n return;\n }\n stderr += chunk;\n if (Buffer.byteLength(stderr) > MAX_SCRIPT_OUTPUT_BYTES) {\n outputLimitError = new CrablineError(\n `Script watch command exceeded ${MAX_SCRIPT_OUTPUT_BYTES} bytes of stderr.`,\n { kind: \"connectivity\" },\n );\n void terminateChild(child);\n }\n });\n child.once(\"error\", (error) => {\n childError = error;\n });\n let childCloseObserved = false;\n const childClosed = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>(\n (resolve) => {\n child.once(\"close\", (code, signal) => {\n childCloseObserved = true;\n resolve({ code, signal });\n });\n },\n );\n child.stdin.end(serializedPayload);\n\n try {\n for await (const chunk of child.stdout) {\n buffer += chunk;\n if (Buffer.byteLength(buffer) > MAX_SCRIPT_OUTPUT_BYTES && !buffer.includes(\"\\n\")) {\n throw new CrablineError(\n `Script watch command exceeded ${MAX_SCRIPT_OUTPUT_BYTES} bytes without a newline.`,\n { kind: \"config\" },\n );\n }\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n if (Buffer.byteLength(line) > MAX_SCRIPT_OUTPUT_BYTES) {\n throw new CrablineError(\n `Script watch command emitted a JSON line larger than ${MAX_SCRIPT_OUTPUT_BYTES} bytes.`,\n { kind: \"config\" },\n );\n }\n const parsed = parseScriptJson({\n command: params.command,\n diagnostics,\n output: line,\n schema: ScriptMessageSchema,\n });\n yield {\n ...parsed,\n provider: params.id,\n };\n }\n }\n\n if (params.context.signal?.aborted) {\n throw params.context.signal.reason ?? new Error(\"Script watch command aborted.\");\n }\n if (params.cancelSignal.aborted) {\n return;\n }\n if (buffer.trim()) {\n const parsed = parseScriptJson({\n command: params.command,\n diagnostics,\n output: buffer,\n schema: ScriptMessageSchema,\n });\n yield {\n ...parsed,\n provider: params.id,\n };\n }\n\n const exit = await childClosed;\n if (outputLimitError) {\n throw outputLimitError;\n }\n if (childError) {\n throw new CrablineError(\n formatScriptError(\n \"Script watch command failed to start.\",\n ensureErrorMessage(childError),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n );\n }\n if (exit.code !== 0) {\n throw new CrablineError(\n formatScriptError(\n `Script watch command failed${exit.signal ? ` (${exit.signal})` : \"\"}.`,\n stderr,\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n );\n }\n } catch (error) {\n if (params.cancelSignal.aborted) {\n return;\n }\n if (outputLimitError) {\n throw outputLimitError;\n }\n if (childError) {\n throw new CrablineError(\n formatScriptError(\n \"Script watch command failed to start.\",\n ensureErrorMessage(childError),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n );\n }\n throw error;\n } finally {\n params.cancelSignal.removeEventListener(\"abort\", stopChild);\n params.context.signal?.removeEventListener(\"abort\", stopChild);\n child.stdin.destroy();\n if (!childCloseObserved) {\n await terminateChild(child);\n }\n await childClosed;\n }\n })();\n}\n\nfunction failedScriptWatch(error: unknown): ScriptWatchIterator {\n return {\n [Symbol.asyncIterator]() {\n return this;\n },\n next() {\n return Promise.reject(error);\n },\n return() {\n return Promise.resolve({ done: true, value: undefined });\n },\n throw(thrown?: unknown) {\n return Promise.reject(thrown);\n },\n };\n}\n\nexport class ScriptProviderAdapter implements ProviderAdapter {\n readonly id;\n readonly platform;\n readonly status = \"bridge\" as const;\n readonly supports;\n readonly #config;\n\n constructor(context: ProviderContext) {\n if (!context.config.script) {\n throw new CrablineError(`Provider \"${context.providerId}\" is missing script configuration.`, {\n kind: \"config\",\n });\n }\n\n this.id = context.providerId;\n this.platform = context.config.platform;\n this.supports = [...context.config.capabilities];\n this.#config = context.config.script;\n }\n\n normalizeTarget(target: ProviderContext[\"fixture\"][\"target\"]) {\n const normalized = {\n id: target.id,\n metadata: target.metadata,\n } as ReturnType<ProviderAdapter[\"normalizeTarget\"]>;\n if (target.channelId) {\n normalized.channelId = target.channelId;\n }\n if (target.threadId) {\n normalized.threadId = target.threadId;\n }\n return normalized;\n }\n\n async probe(context: ProviderContext) {\n const command = this.#config.commands.probe;\n if (!command) {\n return {\n details: [\"probe command not configured\"],\n healthy: false,\n };\n }\n\n const result = await runScript({\n command,\n cwd: this.#config.cwd,\n payload: createPayload(context),\n schema: ScriptProbeResultSchema,\n shell: this.#config.shell,\n signal: context.signal,\n timeoutMs: context.fixture.timeoutMs,\n });\n return {\n details: result.details ?? [],\n healthy: result.healthy,\n };\n }\n\n async send(context: SendContext) {\n const command = this.#config.commands.send;\n if (!command) {\n throw new CrablineError(`Provider \"${this.id}\" is missing send command.`, {\n kind: \"config\",\n });\n }\n\n return runScript({\n command,\n cwd: this.#config.cwd,\n payload: {\n ...createPayload(context),\n outbound: {\n mode: context.mode,\n nonce: context.nonce,\n target: this.normalizeTarget(context.fixture.target),\n text: context.text,\n },\n },\n schema: ScriptSendResultSchema,\n shell: this.#config.shell,\n signal: context.signal,\n timeoutMs: context.fixture.timeoutMs,\n });\n }\n\n async waitForInbound(context: WaitContext) {\n const command = this.#config.commands.waitForInbound;\n if (!command) {\n return null;\n }\n\n const result = await runScript({\n acceptResultDuringTimeoutGrace: (candidate) => candidate.timeout === true,\n command,\n cwd: this.#config.cwd,\n payload: {\n ...createPayload(context),\n wait: {\n excludeIds: context.excludeIds ?? [],\n nonce: context.nonce,\n since: context.since,\n target: this.normalizeTarget(context.fixture.target),\n threadId: context.threadId,\n timeoutMs: context.timeoutMs,\n },\n },\n schema: ScriptInboundResultSchema,\n shell: this.#config.shell,\n signal: context.signal,\n timeoutGraceMs: SCRIPT_WAIT_EXIT_GRACE_MS,\n timeoutMs: context.timeoutMs,\n });\n\n if (result.timeout || !result.message) {\n return null;\n }\n\n return {\n ...result.message,\n provider: this.id,\n };\n }\n\n watch(context: WatchContext): ScriptWatchIterator {\n const command = this.#config.commands.watch;\n if (!command) {\n return failedScriptWatch(\n new CrablineError(`Provider \"${this.id}\" is missing watch command.`, {\n kind: \"config\",\n }),\n );\n }\n\n const controller = new AbortController();\n const source = watchScript({\n cancelSignal: controller.signal,\n command,\n context,\n cwd: this.#config.cwd,\n id: this.id,\n normalizeTarget: (target) => this.normalizeTarget(target),\n shell: this.#config.shell,\n });\n const iterator: ScriptWatchIterator = {\n [Symbol.asyncIterator]() {\n return this;\n },\n next() {\n return source.next();\n },\n async return() {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n await source.return(undefined);\n return { done: true, value: undefined };\n },\n async throw(error?: unknown) {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n await source.return(undefined);\n throw error;\n },\n };\n return iterator;\n }\n}\n\nfunction createPayload(context: ProviderContext): ScriptPayload {\n return {\n fixture: context.fixture,\n provider: {\n config: context.config,\n id: context.providerId,\n manifestPath: context.manifestPath,\n },\n };\n}\n"]}
@@ -1,6 +1,12 @@
1
1
  import type { ProviderConfig } from "../../config/schema.js";
2
2
  import { LocalMockProviderAdapter } from "../local-mock.js";
3
3
  import type { ProviderAdapter } from "../types.js";
4
+ type SlackEnvironment = Partial<Pick<NodeJS.ProcessEnv, "SLACK_SIGNING_SECRET">>;
5
+ export declare function resolveSlackAdapterConfig(config: ProviderConfig, env?: SlackEnvironment): {
6
+ signingSecret: string | undefined;
7
+ };
8
+ export declare function handleSlackWebhookPayload(payload: unknown): Response | undefined;
4
9
  export declare class SlackProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
5
10
  constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
6
11
  }
12
+ export {};
@@ -1,21 +1,37 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
1
2
  import path from "node:path";
2
3
  import { CrablineError } from "../../core/errors.js";
3
4
  import { LocalMockProviderAdapter } from "../local-mock.js";
4
- import { genericMockPayloadWithNativeThread, isRecord, requireNativeInboundId, } from "./native-local-mock.js";
5
- import { SLACK_CHANNEL_ID_RULE, SLACK_TS_RULE } from "../slack-ids.js";
6
- function requireSlackChannelId(value, label) {
7
- if (!SLACK_CHANNEL_ID_RULE.pattern.test(value)) {
8
- throw new CrablineError(`Slack ${label} must be a native Slack conversation id such as C1234567890, G1234567890, or D1234567890.`, { kind: "config" });
9
- }
10
- return value;
5
+ import { slackTargetKey, SLACK_CHANNEL_ID_RULE, SLACK_TS_RULE } from "../slack-ids.js";
6
+ import { getBuiltinTargetCodec } from "../target-normalizers.js";
7
+ import { genericMockPayloadWithNativeThread, isRecord, optionalString, requireNativeInboundId, } from "./native-local-mock.js";
8
+ import { requireExternalWebhookAuthentication } from "./external-webhook-auth.js";
9
+ const SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;
10
+ export function resolveSlackAdapterConfig(config, env = process.env) {
11
+ return {
12
+ signingSecret: config.slack?.signingSecret ?? env.SLACK_SIGNING_SECRET,
13
+ };
11
14
  }
12
- function requireSlackThreadTs(value, label) {
13
- if (!SLACK_TS_RULE.pattern.test(value)) {
14
- throw new CrablineError(`Slack ${label} must be a Slack timestamp such as 1700000000.000100.`, {
15
- kind: "config",
16
- });
15
+ function authenticateSlackWebhook(request, rawBody, signingSecret) {
16
+ const timestamp = request.headers.get("x-slack-request-timestamp");
17
+ const signature = request.headers.get("x-slack-signature");
18
+ const timestampSeconds = timestamp ? Number(timestamp) : Number.NaN;
19
+ if (!timestamp ||
20
+ !signature ||
21
+ !Number.isSafeInteger(timestampSeconds) ||
22
+ Math.abs(Date.now() / 1000 - timestampSeconds) > SLACK_SIGNATURE_TOLERANCE_SECONDS) {
23
+ return new Response("unauthorized", { status: 401 });
17
24
  }
18
- return value;
25
+ const expected = `v0=${createHmac("sha256", signingSecret)
26
+ .update(`v0:${timestamp}:${rawBody}`)
27
+ .digest("hex")}`;
28
+ const actualBuffer = Buffer.from(signature);
29
+ const expectedBuffer = Buffer.from(expected);
30
+ if (actualBuffer.length !== expectedBuffer.length ||
31
+ !timingSafeEqual(actualBuffer, expectedBuffer)) {
32
+ return new Response("unauthorized", { status: 401 });
33
+ }
34
+ return undefined;
19
35
  }
20
36
  function slackAuthorFromEvent(event) {
21
37
  if (typeof event.bot_id === "string" || event.subtype === "bot_message") {
@@ -29,60 +45,103 @@ function normalizeSlackEventsPayload(payload) {
29
45
  }
30
46
  if (isRecord(payload.event)) {
31
47
  const event = payload.event;
48
+ const changedMessage = isRecord(event.message) ? event.message : undefined;
49
+ const isMessageChanged = event.subtype === "message_changed" && changedMessage !== undefined;
50
+ const message = isMessageChanged ? changedMessage : event;
32
51
  const channel = event.channel;
33
- const text = event.text;
52
+ const text = message.text;
34
53
  if (typeof channel !== "string" || typeof text !== "string") {
35
54
  throw new CrablineError("Slack event payload requires event.channel and event.text", {
36
55
  kind: "inbound",
37
56
  });
38
57
  }
39
- const threadTs = event.thread_ts;
40
- const ts = event.ts;
58
+ const threadTs = message.thread_ts;
59
+ const eventId = isMessageChanged
60
+ ? optionalString(event, "event_ts")
61
+ : optionalString(message, "ts");
41
62
  return {
42
- author: slackAuthorFromEvent(event),
43
- ...(typeof ts === "string"
44
- ? { id: requireNativeInboundId(ts, SLACK_TS_RULE, "Slack event.ts") }
63
+ author: slackAuthorFromEvent(message),
64
+ ...(eventId
65
+ ? { id: requireNativeInboundId(eventId, SLACK_TS_RULE, "Slack event timestamp") }
45
66
  : {}),
46
67
  raw: payload,
47
68
  text,
48
69
  threadId: typeof threadTs === "string"
49
- ? requireNativeInboundId(threadTs, SLACK_TS_RULE, "Slack event.thread_ts")
70
+ ? slackTargetKey(requireNativeInboundId(channel, SLACK_CHANNEL_ID_RULE, "Slack event.channel"), requireNativeInboundId(threadTs, SLACK_TS_RULE, "Slack event.thread_ts"))
50
71
  : requireNativeInboundId(channel, SLACK_CHANNEL_ID_RULE, "Slack event.channel"),
51
72
  };
52
73
  }
53
- return genericMockPayloadWithNativeThread({
74
+ const normalized = genericMockPayloadWithNativeThread({
54
75
  channelRule: SLACK_CHANNEL_ID_RULE,
55
76
  payload,
56
77
  threadRule: SLACK_TS_RULE,
57
78
  });
58
- }
59
- const SLACK_CODEC = {
60
- normalize(target) {
61
- const channelId = requireSlackChannelId(target.channelId ?? target.id, "channelId");
62
- const normalized = {
63
- channelId,
64
- id: target.id,
65
- metadata: target.metadata,
66
- };
67
- if (target.threadId) {
68
- normalized.threadId = requireSlackThreadTs(target.threadId, "threadId");
69
- }
79
+ const message = isRecord(payload.message) ? payload.message : undefined;
80
+ const channelId = (message ? optionalString(message, "channelId") : undefined) ??
81
+ optionalString(payload, "channelId") ??
82
+ optionalString(payload, "channel");
83
+ const threadId = (message ? optionalString(message, "threadId") : undefined) ??
84
+ optionalString(payload, "threadId");
85
+ if (threadId && SLACK_TS_RULE.pattern.test(threadId) && !channelId) {
86
+ throw new CrablineError("Slack timestamp threadId requires a native channelId", {
87
+ kind: "inbound",
88
+ });
89
+ }
90
+ if (!channelId || !threadId || !SLACK_TS_RULE.pattern.test(threadId)) {
70
91
  return normalized;
71
- },
72
- resolveThreadId(target) {
73
- const normalized = this.normalize(target);
74
- return normalized.threadId ?? normalized.channelId ?? normalized.id;
75
- },
76
- };
92
+ }
93
+ const scopedThreadId = slackTargetKey(requireNativeInboundId(channelId, SLACK_CHANNEL_ID_RULE, "Slack channelId"), threadId);
94
+ return {
95
+ ...normalized,
96
+ ...("message" in normalized && isRecord(normalized.message)
97
+ ? { message: { ...normalized.message, threadId: scopedThreadId } }
98
+ : {}),
99
+ threadId: scopedThreadId,
100
+ };
101
+ }
102
+ function matchesSlackThread(candidateThreadId, expectedThreadId, target) {
103
+ if (!expectedThreadId) {
104
+ return true;
105
+ }
106
+ const scopedExpectedThreadId = target.channelId && SLACK_TS_RULE.pattern.test(expectedThreadId)
107
+ ? slackTargetKey(target.channelId, expectedThreadId)
108
+ : expectedThreadId;
109
+ return (candidateThreadId === scopedExpectedThreadId ||
110
+ candidateThreadId.startsWith(`${scopedExpectedThreadId}:`));
111
+ }
112
+ export function handleSlackWebhookPayload(payload) {
113
+ if (isRecord(payload) &&
114
+ payload.type === "url_verification" &&
115
+ typeof payload.challenge === "string") {
116
+ return Response.json({ challenge: payload.challenge });
117
+ }
118
+ return undefined;
119
+ }
77
120
  export class SlackProviderAdapter extends LocalMockProviderAdapter {
78
121
  constructor(id, config, _userName, _runtime) {
122
+ const resolvedConfig = resolveSlackAdapterConfig(config);
123
+ requireExternalWebhookAuthentication({
124
+ authenticated: Boolean(resolvedConfig.signingSecret),
125
+ provider: "Slack",
126
+ requirement: "slack.signingSecret or SLACK_SIGNING_SECRET",
127
+ webhook: config.slack?.webhook,
128
+ });
79
129
  super({
80
- codec: SLACK_CODEC,
130
+ codec: getBuiltinTargetCodec("slack"),
81
131
  config,
82
132
  id,
83
133
  options: {
134
+ ...(resolvedConfig.signingSecret
135
+ ? {
136
+ authenticateWebhookRequest(request, rawBody) {
137
+ return authenticateSlackWebhook(request, rawBody, resolvedConfig.signingSecret);
138
+ },
139
+ }
140
+ : {}),
84
141
  defaultWebhook: { host: "127.0.0.1", path: "/slack/events", port: 8787 },
85
142
  endpointLabel: "events endpoint",
143
+ handleWebhookPayload: handleSlackWebhookPayload,
144
+ matchesThread: matchesSlackThread,
86
145
  normalizeWebhookPayload: normalizeSlackEventsPayload,
87
146
  platform: "slack",
88
147
  publicUrl: config.slack?.webhook.publicUrl,
@@ -1 +1 @@
1
- {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../../src/providers/builtin/slack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../../src/providers/builtin/slack.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport path from \"node:path\";\nimport { CrablineError } from \"../../core/errors.js\";\nimport type { ProviderConfig } from \"../../config/schema.js\";\nimport { LocalMockProviderAdapter } from \"../local-mock.js\";\nimport { slackTargetKey, SLACK_CHANNEL_ID_RULE, SLACK_TS_RULE } from \"../slack-ids.js\";\nimport { getBuiltinTargetCodec } from \"../target-normalizers.js\";\nimport type { InboundEnvelope, ProviderAdapter } from \"../types.js\";\nimport {\n genericMockPayloadWithNativeThread,\n isRecord,\n optionalString,\n requireNativeInboundId,\n} from \"./native-local-mock.js\";\nimport { requireExternalWebhookAuthentication } from \"./external-webhook-auth.js\";\n\nconst SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;\n\ntype SlackEnvironment = Partial<Pick<NodeJS.ProcessEnv, \"SLACK_SIGNING_SECRET\">>;\n\nexport function resolveSlackAdapterConfig(\n config: ProviderConfig,\n env: SlackEnvironment = process.env,\n) {\n return {\n signingSecret: config.slack?.signingSecret ?? env.SLACK_SIGNING_SECRET,\n };\n}\n\nfunction authenticateSlackWebhook(\n request: Request,\n rawBody: string,\n signingSecret: string,\n): Response | undefined {\n const timestamp = request.headers.get(\"x-slack-request-timestamp\");\n const signature = request.headers.get(\"x-slack-signature\");\n const timestampSeconds = timestamp ? Number(timestamp) : Number.NaN;\n if (\n !timestamp ||\n !signature ||\n !Number.isSafeInteger(timestampSeconds) ||\n Math.abs(Date.now() / 1000 - timestampSeconds) > SLACK_SIGNATURE_TOLERANCE_SECONDS\n ) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n\n const expected = `v0=${createHmac(\"sha256\", signingSecret)\n .update(`v0:${timestamp}:${rawBody}`)\n .digest(\"hex\")}`;\n const actualBuffer = Buffer.from(signature);\n const expectedBuffer = Buffer.from(expected);\n if (\n actualBuffer.length !== expectedBuffer.length ||\n !timingSafeEqual(actualBuffer, expectedBuffer)\n ) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n return undefined;\n}\n\nfunction slackAuthorFromEvent(event: Record<string, unknown>): InboundEnvelope[\"author\"] {\n if (typeof event.bot_id === \"string\" || event.subtype === \"bot_message\") {\n return \"assistant\";\n }\n return \"user\";\n}\n\nfunction normalizeSlackEventsPayload(payload: unknown) {\n if (!isRecord(payload)) {\n throw new CrablineError(\"Slack webhook payload must be an object\", { kind: \"inbound\" });\n }\n\n if (isRecord(payload.event)) {\n const event = payload.event;\n const changedMessage = isRecord(event.message) ? event.message : undefined;\n const isMessageChanged = event.subtype === \"message_changed\" && changedMessage !== undefined;\n const message = isMessageChanged ? changedMessage : event;\n const channel = event.channel;\n const text = message.text;\n if (typeof channel !== \"string\" || typeof text !== \"string\") {\n throw new CrablineError(\"Slack event payload requires event.channel and event.text\", {\n kind: \"inbound\",\n });\n }\n const threadTs = message.thread_ts;\n const eventId = isMessageChanged\n ? optionalString(event, \"event_ts\")\n : optionalString(message, \"ts\");\n return {\n author: slackAuthorFromEvent(message),\n ...(eventId\n ? { id: requireNativeInboundId(eventId, SLACK_TS_RULE, \"Slack event timestamp\") }\n : {}),\n raw: payload,\n text,\n threadId:\n typeof threadTs === \"string\"\n ? slackTargetKey(\n requireNativeInboundId(channel, SLACK_CHANNEL_ID_RULE, \"Slack event.channel\"),\n requireNativeInboundId(threadTs, SLACK_TS_RULE, \"Slack event.thread_ts\"),\n )\n : requireNativeInboundId(channel, SLACK_CHANNEL_ID_RULE, \"Slack event.channel\"),\n };\n }\n\n const normalized = genericMockPayloadWithNativeThread({\n channelRule: SLACK_CHANNEL_ID_RULE,\n payload,\n threadRule: SLACK_TS_RULE,\n });\n const message = isRecord(payload.message) ? payload.message : undefined;\n const channelId =\n (message ? optionalString(message, \"channelId\") : undefined) ??\n optionalString(payload, \"channelId\") ??\n optionalString(payload, \"channel\");\n const threadId =\n (message ? optionalString(message, \"threadId\") : undefined) ??\n optionalString(payload, \"threadId\");\n if (threadId && SLACK_TS_RULE.pattern.test(threadId) && !channelId) {\n throw new CrablineError(\"Slack timestamp threadId requires a native channelId\", {\n kind: \"inbound\",\n });\n }\n if (!channelId || !threadId || !SLACK_TS_RULE.pattern.test(threadId)) {\n return normalized;\n }\n const scopedThreadId = slackTargetKey(\n requireNativeInboundId(channelId, SLACK_CHANNEL_ID_RULE, \"Slack channelId\"),\n threadId,\n );\n return {\n ...normalized,\n ...(\"message\" in normalized && isRecord(normalized.message)\n ? { message: { ...normalized.message, threadId: scopedThreadId } }\n : {}),\n threadId: scopedThreadId,\n };\n}\n\nfunction matchesSlackThread(\n candidateThreadId: string,\n expectedThreadId: string | undefined,\n target: { channelId?: string | undefined },\n): boolean {\n if (!expectedThreadId) {\n return true;\n }\n const scopedExpectedThreadId =\n target.channelId && SLACK_TS_RULE.pattern.test(expectedThreadId)\n ? slackTargetKey(target.channelId, expectedThreadId)\n : expectedThreadId;\n return (\n candidateThreadId === scopedExpectedThreadId ||\n candidateThreadId.startsWith(`${scopedExpectedThreadId}:`)\n );\n}\n\nexport function handleSlackWebhookPayload(payload: unknown): Response | undefined {\n if (\n isRecord(payload) &&\n payload.type === \"url_verification\" &&\n typeof payload.challenge === \"string\"\n ) {\n return Response.json({ challenge: payload.challenge });\n }\n return undefined;\n}\n\nexport class SlackProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {\n constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown) {\n const resolvedConfig = resolveSlackAdapterConfig(config);\n requireExternalWebhookAuthentication({\n authenticated: Boolean(resolvedConfig.signingSecret),\n provider: \"Slack\",\n requirement: \"slack.signingSecret or SLACK_SIGNING_SECRET\",\n webhook: config.slack?.webhook,\n });\n super({\n codec: getBuiltinTargetCodec(\"slack\"),\n config,\n id,\n options: {\n ...(resolvedConfig.signingSecret\n ? {\n authenticateWebhookRequest(request: Request, rawBody: string) {\n return authenticateSlackWebhook(request, rawBody, resolvedConfig.signingSecret!);\n },\n }\n : {}),\n defaultWebhook: { host: \"127.0.0.1\", path: \"/slack/events\", port: 8787 },\n endpointLabel: \"events endpoint\",\n handleWebhookPayload: handleSlackWebhookPayload,\n matchesThread: matchesSlackThread,\n normalizeWebhookPayload: normalizeSlackEventsPayload,\n platform: \"slack\",\n publicUrl: config.slack?.webhook.publicUrl,\n recorderPath: config.slack?.recorder.path\n ? path.resolve(config.slack.recorder.path)\n : undefined,\n webhook: config.slack?.webhook,\n },\n });\n }\n}\n"]}
@@ -14,6 +14,12 @@ export declare function normalizeTelegramWebhookPayload(payload: unknown): {
14
14
  id?: string | undefined;
15
15
  raw: {};
16
16
  text?: string | undefined;
17
+ } | {
18
+ author: "assistant" | "system" | "user";
19
+ id?: string | undefined;
20
+ raw: Record<string, unknown>;
21
+ text: string;
22
+ threadId: string;
17
23
  };
18
24
  export declare class TelegramProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
19
25
  constructor(id: string, config: ProviderConfig, _userName: string);
@@ -1,7 +1,8 @@
1
1
  import path from "node:path";
2
2
  import { CrablineError } from "../../core/errors.js";
3
3
  import { LocalMockProviderAdapter } from "../local-mock.js";
4
- import { authorFromBotFlag, createNativeTargetCodec, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, optionalStringish, requireNativeId, requireNativeInboundId, } from "./native-local-mock.js";
4
+ import { getBuiltinTargetCodec, parseCanonicalTelegramTopic, TELEGRAM_CHAT_ID_RULE, TELEGRAM_MESSAGE_THREAD_ID_RULE, } from "../target-normalizers.js";
5
+ import { authorFromBotFlag, createSecretVerifier, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, optionalStringish, requireNativeInboundId, } from "./native-local-mock.js";
5
6
  export function resolveTelegramAdapterConfig(config, env = process.env) {
6
7
  const telegramConfig = config.telegram;
7
8
  return {
@@ -23,55 +24,62 @@ function toRecorderPath(providerId, config) {
23
24
  ? path.resolve(configuredPath)
24
25
  : path.resolve(".crabline", "recorders", `${providerId}.jsonl`);
25
26
  }
26
- const TELEGRAM_CHAT_ID_RULE = {
27
- example: "-1001234567890 or @channelusername",
28
- name: "Telegram chat id",
29
- pattern: /^(?:-?\d+|@[A-Za-z][A-Za-z0-9_]{4,31})$/u,
30
- };
31
- const TELEGRAM_MESSAGE_THREAD_ID_RULE = {
32
- example: "42",
33
- name: "Telegram message_thread_id",
34
- pattern: /^\d+$/u,
35
- };
36
- const TELEGRAM_BASE_CODEC = createNativeTargetCodec({
37
- channel: TELEGRAM_CHAT_ID_RULE,
38
- channelLabel: "Telegram chat_id",
39
- thread: TELEGRAM_MESSAGE_THREAD_ID_RULE,
40
- threadLabel: "Telegram message_thread_id",
41
- });
42
- const TELEGRAM_CODEC = {
43
- normalize(target) {
44
- const normalized = TELEGRAM_BASE_CODEC.normalize({
45
- ...target,
46
- threadId: undefined,
47
- });
48
- if (!target.threadId) {
49
- return normalized;
27
+ function normalizeGenericTelegramPayload(payload) {
28
+ const message = optionalRecord(payload, "message");
29
+ const threadId = message
30
+ ? optionalString(message, "threadId")
31
+ : optionalString(payload, "threadId");
32
+ const canonicalTopic = threadId ? parseCanonicalTelegramTopic(threadId) : undefined;
33
+ const genericPayload = canonicalTopic
34
+ ? message
35
+ ? {
36
+ ...payload,
37
+ message: {
38
+ ...message,
39
+ threadId: canonicalTopic.topicId,
40
+ },
41
+ }
42
+ : {
43
+ ...payload,
44
+ threadId: canonicalTopic.topicId,
45
+ }
46
+ : payload;
47
+ const normalized = genericMockPayloadWithNativeThread({
48
+ channelRule: TELEGRAM_CHAT_ID_RULE,
49
+ payload: genericPayload,
50
+ threadRule: TELEGRAM_MESSAGE_THREAD_ID_RULE,
51
+ });
52
+ if (!canonicalTopic) {
53
+ return normalized;
54
+ }
55
+ const normalizedRecord = normalized;
56
+ const raw = payload.raw ?? payload;
57
+ return message
58
+ ? {
59
+ ...normalizedRecord,
60
+ raw,
61
+ threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,
62
+ message: {
63
+ ...(isRecord(normalizedRecord.message) ? normalizedRecord.message : {}),
64
+ threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,
65
+ },
50
66
  }
51
- const topicId = requireNativeId(target.threadId, TELEGRAM_MESSAGE_THREAD_ID_RULE, "Telegram message_thread_id");
52
- return {
53
- ...normalized,
54
- threadId: `${normalized.channelId}:${topicId}`,
67
+ : {
68
+ ...normalizedRecord,
69
+ raw,
70
+ threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,
55
71
  };
56
- },
57
- resolveThreadId(target) {
58
- const normalized = this.normalize(target);
59
- return normalized.threadId ?? normalized.channelId ?? normalized.id;
60
- },
61
- };
72
+ }
62
73
  export function normalizeTelegramWebhookPayload(payload) {
63
74
  if (!isRecord(payload)) {
64
75
  throw new CrablineError("Telegram webhook payload must be an object", { kind: "inbound" });
65
76
  }
66
77
  const message = optionalRecord(payload, "message") ??
67
78
  optionalRecord(payload, "edited_message") ??
68
- optionalRecord(payload, "channel_post");
69
- if (!message) {
70
- return genericMockPayloadWithNativeThread({
71
- channelRule: TELEGRAM_CHAT_ID_RULE,
72
- payload,
73
- threadRule: TELEGRAM_MESSAGE_THREAD_ID_RULE,
74
- });
79
+ optionalRecord(payload, "channel_post") ??
80
+ optionalRecord(payload, "edited_channel_post");
81
+ if (!message || optionalString(message, "threadId")) {
82
+ return normalizeGenericTelegramPayload(payload);
75
83
  }
76
84
  const chat = optionalRecord(message, "chat");
77
85
  const chatId = chat ? optionalStringish(chat, "id") : undefined;
@@ -100,11 +108,24 @@ export function normalizeTelegramWebhookPayload(payload) {
100
108
  }
101
109
  export class TelegramProviderAdapter extends LocalMockProviderAdapter {
102
110
  constructor(id, config, _userName) {
111
+ const resolvedConfig = resolveTelegramAdapterConfig(config);
112
+ const authenticateWebhook = resolvedConfig.secretToken
113
+ ? createSecretVerifier(resolvedConfig.secretToken)
114
+ : undefined;
103
115
  super({
104
- codec: TELEGRAM_CODEC,
116
+ codec: getBuiltinTargetCodec("telegram"),
105
117
  config,
106
118
  id,
107
119
  options: {
120
+ ...(authenticateWebhook
121
+ ? {
122
+ authenticateWebhookRequest(request) {
123
+ return authenticateWebhook(request.headers.get("x-telegram-bot-api-secret-token"))
124
+ ? undefined
125
+ : new Response("unauthorized", { status: 401 });
126
+ },
127
+ }
128
+ : {}),
108
129
  defaultWebhook: {
109
130
  host: "127.0.0.1",
110
131
  path: "/telegram/webhook",
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../../src/providers/builtin/telegram.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../../src/providers/builtin/telegram.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport { CrablineError } from \"../../core/errors.js\";\nimport type { ProviderConfig } from \"../../config/schema.js\";\nimport { LocalMockProviderAdapter } from \"../local-mock.js\";\nimport {\n getBuiltinTargetCodec,\n parseCanonicalTelegramTopic,\n TELEGRAM_CHAT_ID_RULE,\n TELEGRAM_MESSAGE_THREAD_ID_RULE,\n} from \"../target-normalizers.js\";\nimport type { ProviderAdapter } from \"../types.js\";\nimport {\n authorFromBotFlag,\n createSecretVerifier,\n genericMockPayloadWithNativeThread,\n isRecord,\n optionalRecord,\n optionalString,\n optionalStringish,\n requireNativeInboundId,\n} from \"./native-local-mock.js\";\n\ntype TelegramEnvironment = Partial<\n Pick<\n NodeJS.ProcessEnv,\n \"TELEGRAM_API_BASE_URL\" | \"TELEGRAM_BOT_USERNAME\" | \"TELEGRAM_WEBHOOK_SECRET_TOKEN\"\n >\n>;\n\nexport function resolveTelegramAdapterConfig(\n config: ProviderConfig,\n env: TelegramEnvironment = process.env,\n) {\n const telegramConfig = config.telegram;\n return {\n mode: telegramConfig?.mode ?? \"auto\",\n ...((telegramConfig?.apiUrl ?? env.TELEGRAM_API_BASE_URL)\n ? { apiUrl: telegramConfig?.apiUrl ?? env.TELEGRAM_API_BASE_URL! }\n : {}),\n ...((telegramConfig?.secretToken ?? env.TELEGRAM_WEBHOOK_SECRET_TOKEN)\n ? { secretToken: telegramConfig?.secretToken ?? env.TELEGRAM_WEBHOOK_SECRET_TOKEN! }\n : {}),\n ...((telegramConfig?.userName ?? env.TELEGRAM_BOT_USERNAME)\n ? { userName: telegramConfig?.userName ?? env.TELEGRAM_BOT_USERNAME! }\n : {}),\n };\n}\n\nfunction toRecorderPath(providerId: string, config: ProviderConfig): string {\n const configuredPath = config.telegram?.recorder.path;\n return configuredPath\n ? path.resolve(configuredPath)\n : path.resolve(\".crabline\", \"recorders\", `${providerId}.jsonl`);\n}\n\nfunction normalizeGenericTelegramPayload(payload: Record<string, unknown>) {\n const message = optionalRecord(payload, \"message\");\n const threadId = message\n ? optionalString(message, \"threadId\")\n : optionalString(payload, \"threadId\");\n const canonicalTopic = threadId ? parseCanonicalTelegramTopic(threadId) : undefined;\n const genericPayload = canonicalTopic\n ? message\n ? {\n ...payload,\n message: {\n ...message,\n threadId: canonicalTopic.topicId,\n },\n }\n : {\n ...payload,\n threadId: canonicalTopic.topicId,\n }\n : payload;\n const normalized = genericMockPayloadWithNativeThread({\n channelRule: TELEGRAM_CHAT_ID_RULE,\n payload: genericPayload,\n threadRule: TELEGRAM_MESSAGE_THREAD_ID_RULE,\n });\n if (!canonicalTopic) {\n return normalized;\n }\n const normalizedRecord = normalized as Record<string, unknown>;\n const raw = payload.raw ?? payload;\n return message\n ? {\n ...normalizedRecord,\n raw,\n threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,\n message: {\n ...(isRecord(normalizedRecord.message) ? normalizedRecord.message : {}),\n threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,\n },\n }\n : {\n ...normalizedRecord,\n raw,\n threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,\n };\n}\n\nexport function normalizeTelegramWebhookPayload(payload: unknown) {\n if (!isRecord(payload)) {\n throw new CrablineError(\"Telegram webhook payload must be an object\", { kind: \"inbound\" });\n }\n\n const message =\n optionalRecord(payload, \"message\") ??\n optionalRecord(payload, \"edited_message\") ??\n optionalRecord(payload, \"channel_post\") ??\n optionalRecord(payload, \"edited_channel_post\");\n if (!message || optionalString(message, \"threadId\")) {\n return normalizeGenericTelegramPayload(payload);\n }\n\n const chat = optionalRecord(message, \"chat\");\n const chatId = chat ? optionalStringish(chat, \"id\") : undefined;\n const text = optionalString(message, \"text\") ?? optionalString(message, \"caption\");\n if (!chatId || !text) {\n throw new CrablineError(\"Telegram update requires message.chat.id and message.text\", {\n kind: \"inbound\",\n });\n }\n\n const topicId = optionalStringish(message, \"message_thread_id\");\n const normalizedChatId = requireNativeInboundId(\n chatId,\n TELEGRAM_CHAT_ID_RULE,\n \"Telegram message.chat.id\",\n );\n const from = optionalRecord(message, \"from\");\n return {\n author: authorFromBotFlag(from?.is_bot === true),\n ...(optionalStringish(message, \"message_id\")\n ? { id: optionalStringish(message, \"message_id\") }\n : optionalStringish(payload, \"update_id\")\n ? { id: optionalStringish(payload, \"update_id\") }\n : {}),\n raw: payload,\n text,\n threadId: topicId\n ? `${normalizedChatId}:${requireNativeInboundId(\n topicId,\n TELEGRAM_MESSAGE_THREAD_ID_RULE,\n \"Telegram message.message_thread_id\",\n )}`\n : normalizedChatId,\n };\n}\n\nexport class TelegramProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {\n constructor(id: string, config: ProviderConfig, _userName: string) {\n const resolvedConfig = resolveTelegramAdapterConfig(config);\n const authenticateWebhook = resolvedConfig.secretToken\n ? createSecretVerifier(resolvedConfig.secretToken)\n : undefined;\n super({\n codec: getBuiltinTargetCodec(\"telegram\"),\n config,\n id,\n options: {\n ...(authenticateWebhook\n ? {\n authenticateWebhookRequest(request: Request) {\n return authenticateWebhook(request.headers.get(\"x-telegram-bot-api-secret-token\"))\n ? undefined\n : new Response(\"unauthorized\", { status: 401 });\n },\n }\n : {}),\n defaultWebhook: {\n host: \"127.0.0.1\",\n path: \"/telegram/webhook\",\n port: 8790,\n },\n endpointLabel: \"webhook endpoint\",\n normalizeWebhookPayload: normalizeTelegramWebhookPayload,\n platform: \"telegram\",\n publicUrl: config.telegram?.webhook.publicUrl,\n recorderPath: toRecorderPath(id, config),\n webhook: config.telegram?.webhook,\n },\n });\n }\n}\n"]}
@@ -1,6 +1,24 @@
1
1
  import type { ProviderConfig } from "../../config/schema.js";
2
2
  import { LocalMockProviderAdapter } from "../local-mock.js";
3
- import type { ProviderAdapter } from "../types.js";
3
+ import type { InboundEnvelope, ProbeResult, ProviderAdapter, ProviderContext, SendContext, SendResult, WaitContext, WatchContext } from "../types.js";
4
+ type NormalizedWhatsAppWebhookMessage = {
5
+ author?: "assistant" | "system" | "user";
6
+ authorIsBot?: boolean;
7
+ id?: string;
8
+ message?: {
9
+ author?: "assistant" | "system" | "user";
10
+ authorIsBot?: boolean;
11
+ id?: string;
12
+ raw?: unknown;
13
+ sentAt?: string;
14
+ text?: string;
15
+ threadId?: string;
16
+ };
17
+ raw?: unknown;
18
+ sentAt?: string;
19
+ text?: string;
20
+ threadId?: string;
21
+ };
4
22
  export declare function resolveWhatsAppAdapterConfig(config: ProviderConfig, env?: NodeJS.ProcessEnv): {
5
23
  accessToken: string;
6
24
  appSecret: string;
@@ -8,12 +26,14 @@ export declare function resolveWhatsAppAdapterConfig(config: ProviderConfig, env
8
26
  verifyToken: string;
9
27
  };
10
28
  export declare class WhatsAppProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
29
+ #private;
11
30
  constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
31
+ probe(context: ProviderContext): Promise<ProbeResult>;
32
+ send(context: SendContext): Promise<SendResult>;
33
+ waitForInbound(context: WaitContext): Promise<InboundEnvelope | null>;
34
+ watch(context: WatchContext): AsyncIterable<InboundEnvelope>;
35
+ beginCleanup(): void;
36
+ cleanup(): Promise<void>;
12
37
  }
13
- export declare function normalizeWhatsAppWebhookPayload(payload: unknown): {
14
- author?: "assistant" | "system" | "user" | undefined;
15
- authorIsBot?: boolean;
16
- id?: string | undefined;
17
- raw: {};
18
- text?: string | undefined;
19
- };
38
+ export declare function normalizeWhatsAppWebhookPayload(payload: unknown, expectedPhoneNumberId?: string): NormalizedWhatsAppWebhookMessage[];
39
+ export {};