@openclaw/crabline 0.1.9 → 0.1.11

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 +43 -0
  34. package/dist/src/openclaw/artifact-generation.js +363 -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 +28 -0
  54. package/dist/src/openclaw/private-file.js +465 -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 +1004 -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 +334 -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 +549 -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 +262 -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 +830 -158
  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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-generation.js","sourceRoot":"","sources":["../../../src/openclaw/artifact-generation.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { CrablineServerManifest } from \"../servers/index.js\";\nimport {\n captureDirectoryIdentity,\n publishPrivateFileAtomically,\n removeSecuredPrivateDirectory,\n securePrivateDirectory,\n syncParentDirectory,\n} from \"./private-file.js\";\nimport {\n OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH,\n OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY,\n OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,\n OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,\n OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH,\n OPENCLAW_CRABLINE_MANIFEST_PATH,\n type OpenClawCrablineChannelDriverSelection,\n} from \"./shared.js\";\nimport type { OpenClawCrablineSmokeRunLock } from \"./smoke-lock.js\";\n\nconst GENERATION_NAME_PATTERN =\n /^generation-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;\nconst STAGING_NAME_PATTERN =\n /^\\.staging-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;\nconst REMOVAL_TOMBSTONE_PATTERN =\n /^\\.(.+)\\.\\d+\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\.remove$/iu;\nexport type OpenClawCrablineArtifactPointer = {\n capabilityMatrixPath: string;\n generation: string;\n manifestPath: string;\n previousGeneration?: string;\n providerReadinessArtifactPath: string;\n smokeArtifactPath: string;\n version: 1;\n};\n\nexport type PublishedOpenClawCrablineArtifactGeneration = OpenClawCrablineArtifactPointer & {\n pointerPath: string;\n providerReadiness: Record<string, unknown>;\n smoke: Record<string, unknown>;\n warnings?: string[];\n};\n\ntype PublishGenerationDependencies = {\n beforePointerSwitch?: (pointer: OpenClawCrablineArtifactPointer) => Promise<void>;\n createGenerationId?: () => string;\n platform?: NodeJS.Platform;\n publishPrivateFile?: typeof publishPrivateFileAtomically;\n secureWindowsDirectory?: (directoryPath: string) => Promise<void>;\n secureWindowsFile?: (filePath: string) => Promise<void>;\n syncParent?: typeof syncParentDirectory;\n};\n\ntype RecorderSnapshot = {\n contents: string;\n fileName: string;\n};\n\nfunction resolveProviderReadinessArtifactPath(\n selection: OpenClawCrablineChannelDriverSelection,\n): typeof OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH {\n const readinessPath = selection.providerReadinessArtifactPath ?? selection.smokeArtifactPath;\n if (\n selection.capabilityMatrixPath !== OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH ||\n readinessPath !== OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH\n ) {\n throw new Error(\"OpenClaw Crabline artifact selection paths are malformed.\");\n }\n return readinessPath;\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction assertGenerationName(value: unknown, field: string): asserts value is string {\n if (typeof value !== \"string\" || !GENERATION_NAME_PATTERN.test(value)) {\n throw new Error(`OpenClaw Crabline artifact pointer ${field} is malformed.`);\n }\n}\n\nfunction generationArtifactPath(generation: string, fileName: string): string {\n return path.join(OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, generation, fileName);\n}\n\nfunction artifactRemovalTombstoneBaseName(name: string): string | null {\n const originalName = REMOVAL_TOMBSTONE_PATTERN.exec(name)?.[1];\n return originalName !== undefined &&\n (GENERATION_NAME_PATTERN.test(originalName) || STAGING_NAME_PATTERN.test(originalName))\n ? originalName\n : null;\n}\n\nfunction withRecorderSnapshotPath(\n providerReadiness: Record<string, unknown>,\n recorderPath: string,\n): Record<string, unknown> {\n const result = providerReadiness.result;\n if (!result || typeof result !== \"object\" || Array.isArray(result)) {\n throw new Error(\"OpenClaw Crabline provider readiness result is malformed.\");\n }\n return {\n ...providerReadiness,\n result: {\n ...result,\n recorderPath,\n },\n };\n}\n\nfunction parseArtifactPointer(contents: string): OpenClawCrablineArtifactPointer {\n let value: Partial<OpenClawCrablineArtifactPointer>;\n try {\n value = JSON.parse(contents) as Partial<OpenClawCrablineArtifactPointer>;\n } catch (error) {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\", { cause: error });\n }\n if (value.version !== 1) {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\");\n }\n assertGenerationName(value.generation, \"generation\");\n if (value.previousGeneration !== undefined) {\n assertGenerationName(value.previousGeneration, \"previousGeneration\");\n if (value.previousGeneration === value.generation) {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\");\n }\n }\n\n const expected = {\n capabilityMatrixPath: generationArtifactPath(\n value.generation,\n OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,\n ),\n manifestPath: generationArtifactPath(value.generation, OPENCLAW_CRABLINE_MANIFEST_PATH),\n providerReadinessArtifactPath: generationArtifactPath(\n value.generation,\n OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH,\n ),\n smokeArtifactPath: generationArtifactPath(\n value.generation,\n OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,\n ),\n };\n if (\n typeof value.capabilityMatrixPath !== \"string\" ||\n value.capabilityMatrixPath !== expected.capabilityMatrixPath ||\n value.manifestPath !== expected.manifestPath ||\n (value.providerReadinessArtifactPath !== undefined &&\n value.providerReadinessArtifactPath !== expected.providerReadinessArtifactPath) ||\n (value.smokeArtifactPath !== undefined &&\n value.smokeArtifactPath !== expected.smokeArtifactPath) ||\n (value.providerReadinessArtifactPath === undefined && value.smokeArtifactPath === undefined)\n ) {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\");\n }\n\n return {\n capabilityMatrixPath: value.capabilityMatrixPath,\n generation: value.generation,\n ...(value.previousGeneration ? { previousGeneration: value.previousGeneration } : {}),\n manifestPath: value.manifestPath,\n providerReadinessArtifactPath: value.providerReadinessArtifactPath ?? value.smokeArtifactPath!,\n smokeArtifactPath: value.smokeArtifactPath ?? value.providerReadinessArtifactPath!,\n version: 1,\n };\n}\n\nexport async function readOpenClawCrablineArtifactPointer(\n outputDir: string,\n): Promise<OpenClawCrablineArtifactPointer | null> {\n try {\n return parseArtifactPointer(\n await fs.readFile(\n path.join(path.resolve(outputDir), OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH),\n \"utf8\",\n ),\n );\n } catch (error) {\n if (isMissingPathError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nasync function assertCurrentGenerationExists(\n outputDir: string,\n pointer: OpenClawCrablineArtifactPointer,\n): Promise<void> {\n for (const artifactPath of [\n pointer.manifestPath,\n pointer.capabilityMatrixPath,\n pointer.providerReadinessArtifactPath,\n ]) {\n const stats = await fs.lstat(path.join(outputDir, artifactPath));\n if (!stats.isFile()) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n }\n}\n\nasync function pruneArtifactStore(params: {\n lock: OpenClawCrablineSmokeRunLock;\n pointer: OpenClawCrablineArtifactPointer | null;\n store: Awaited<ReturnType<typeof securePrivateDirectory>>;\n directoryOptions?: Parameters<typeof securePrivateDirectory>[1];\n}): Promise<void> {\n const retainedGenerations = new Set(\n params.pointer\n ? [params.pointer.generation, params.pointer.previousGeneration].filter(\n (generation): generation is string => generation !== undefined,\n )\n : [],\n );\n for (const entry of await fs.readdir(params.store.directoryPath, { withFileTypes: true })) {\n const isAbandonedStaging = entry.isDirectory() && STAGING_NAME_PATTERN.test(entry.name);\n const isObsoleteGeneration =\n entry.isDirectory() &&\n GENERATION_NAME_PATTERN.test(entry.name) &&\n !retainedGenerations.has(entry.name);\n const removalTombstoneBaseName = entry.isDirectory()\n ? artifactRemovalTombstoneBaseName(entry.name)\n : null;\n const isRemovalTombstone = removalTombstoneBaseName !== null;\n if (!isAbandonedStaging && !isObsoleteGeneration && !isRemovalTombstone) {\n continue;\n }\n await params.lock.assertOwned();\n await params.store.assertIdentityAt();\n const obsolete = await securePrivateDirectory(\n path.join(params.store.directoryPath, entry.name),\n params.directoryOptions,\n );\n await removeSecuredPrivateDirectory(\n obsolete,\n undefined,\n removalTombstoneBaseName ?? entry.name,\n );\n await params.store.assertIdentityAt();\n }\n}\n\nexport async function publishOpenClawCrablineArtifactGeneration(\n params: {\n capabilityReport: unknown;\n lock: OpenClawCrablineSmokeRunLock;\n manifest: CrablineServerManifest;\n outputDir: string;\n recorderSnapshot?: RecorderSnapshot;\n selection: OpenClawCrablineChannelDriverSelection;\n providerReadiness: Record<string, unknown>;\n },\n dependencies: PublishGenerationDependencies = {},\n): Promise<PublishedOpenClawCrablineArtifactGeneration> {\n const providerReadinessArtifactPath = resolveProviderReadinessArtifactPath(params.selection);\n const outputDir = path.resolve(params.outputDir);\n await fs.mkdir(outputDir, { recursive: true });\n const output = await captureDirectoryIdentity(outputDir);\n await output.assertIdentityAt();\n const storePath = path.join(outputDir, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY);\n const directoryOptions = {\n ...(dependencies.platform ? { platform: dependencies.platform } : {}),\n ...(dependencies.secureWindowsDirectory\n ? { secureWindowsDirectory: dependencies.secureWindowsDirectory }\n : {}),\n ...(dependencies.syncParent ? { syncParent: dependencies.syncParent } : {}),\n };\n const store = await securePrivateDirectory(storePath, directoryOptions);\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n await params.lock.assertOwned();\n const currentPointer = await readOpenClawCrablineArtifactPointer(outputDir);\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n if (currentPointer) {\n await assertCurrentGenerationExists(outputDir, currentPointer);\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n }\n await pruneArtifactStore({\n directoryOptions,\n lock: params.lock,\n pointer: currentPointer,\n store,\n });\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n\n const generationId = dependencies.createGenerationId?.() ?? randomUUID();\n const generation = `generation-${generationId}`;\n if (!GENERATION_NAME_PATTERN.test(generation)) {\n throw new Error(\"OpenClaw Crabline artifact generation id is malformed.\");\n }\n const stagingPath = path.join(storePath, `.staging-${generationId}`);\n const generationPath = path.join(storePath, generation);\n const staging = await securePrivateDirectory(stagingPath, directoryOptions);\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n await staging.assertIdentityAt();\n const publishPrivateFile = dependencies.publishPrivateFile ?? publishPrivateFileAtomically;\n const fileOptions = {\n ...(dependencies.platform ? { platform: dependencies.platform } : {}),\n ...(dependencies.secureWindowsFile\n ? { secureWindowsFile: dependencies.secureWindowsFile }\n : {}),\n ...(dependencies.syncParent ? { syncParent: dependencies.syncParent } : {}),\n };\n let installed = false;\n let committed = false;\n let primaryError: unknown;\n let published: PublishedOpenClawCrablineArtifactGeneration | undefined;\n try {\n const pointer: OpenClawCrablineArtifactPointer = {\n capabilityMatrixPath: generationArtifactPath(\n generation,\n params.selection.capabilityMatrixPath,\n ),\n generation,\n manifestPath: generationArtifactPath(generation, OPENCLAW_CRABLINE_MANIFEST_PATH),\n ...(currentPointer ? { previousGeneration: currentPointer.generation } : {}),\n providerReadinessArtifactPath: generationArtifactPath(\n generation,\n providerReadinessArtifactPath,\n ),\n smokeArtifactPath: generationArtifactPath(generation, providerReadinessArtifactPath),\n version: 1,\n };\n if (\n params.recorderSnapshot &&\n (path.basename(params.recorderSnapshot.fileName) !== params.recorderSnapshot.fileName ||\n !params.recorderSnapshot.fileName.endsWith(\".jsonl\"))\n ) {\n throw new Error(\"OpenClaw Crabline recorder snapshot filename is malformed.\");\n }\n const recorderSnapshotPath = params.recorderSnapshot\n ? generationArtifactPath(generation, params.recorderSnapshot.fileName)\n : undefined;\n const publishedManifest = recorderSnapshotPath\n ? { ...params.manifest, recorderPath: recorderSnapshotPath }\n : params.manifest;\n const providerReadinessBase = recorderSnapshotPath\n ? withRecorderSnapshotPath(params.providerReadiness, recorderSnapshotPath)\n : params.providerReadiness;\n const providerReadiness = {\n ...providerReadinessBase,\n manifestPath: pointer.manifestPath,\n };\n const artifactContents: { contents: string; fileName: string }[] = [\n {\n contents: `${JSON.stringify(publishedManifest, null, 2)}\\n`,\n fileName: OPENCLAW_CRABLINE_MANIFEST_PATH,\n },\n {\n contents: `${JSON.stringify(\n {\n version: 1,\n source: \"openclaw/crabline\",\n channelDriver: params.selection.channelDriver,\n selectedChannel: params.selection.channel,\n manifestPath: pointer.manifestPath,\n report: params.capabilityReport,\n },\n null,\n 2,\n )}\\n`,\n fileName: params.selection.capabilityMatrixPath,\n },\n {\n contents: `${JSON.stringify(\n {\n version: 1,\n source: \"openclaw/crabline\",\n channelDriver: params.selection.channelDriver,\n selectedChannel: params.selection.channel,\n manifestPath: pointer.manifestPath,\n providerReadiness,\n smoke: providerReadiness,\n },\n null,\n 2,\n )}\\n`,\n fileName: providerReadinessArtifactPath,\n },\n ...(params.recorderSnapshot\n ? [\n {\n contents: params.recorderSnapshot.contents,\n fileName: params.recorderSnapshot.fileName,\n },\n ]\n : []),\n ];\n\n await params.lock.assertOwned();\n for (const artifact of artifactContents) {\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n await staging.assertIdentityAt();\n await publishPrivateFile(\n path.join(stagingPath, artifact.fileName),\n artifact.contents,\n fileOptions,\n );\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n await staging.assertIdentityAt();\n }\n await params.lock.assertOwned();\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n await fs.rename(stagingPath, generationPath);\n installed = true;\n await (dependencies.syncParent ?? syncParentDirectory)(generationPath, dependencies.platform);\n await output.assertIdentityAt();\n await staging.assertIdentityAt(generationPath);\n await store.assertIdentityAt();\n\n await dependencies.beforePointerSwitch?.(pointer);\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n await staging.assertIdentityAt(generationPath);\n await params.lock.commitFileAtomically({\n contents: `${JSON.stringify(pointer, null, 2)}\\n`,\n destinationPath: path.join(outputDir, OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH),\n stageDirectory: store.directoryPath,\n stageFile: async (filePath, contents) => {\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n await staging.assertIdentityAt(generationPath);\n await publishPrivateFile(filePath, contents, fileOptions);\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n await staging.assertIdentityAt(generationPath);\n },\n });\n committed = true;\n let warnings: string[] | undefined;\n try {\n const committedPointer = await readOpenClawCrablineArtifactPointer(outputDir);\n if (!committedPointer) {\n throw new Error(\"OpenClaw Crabline artifact pointer is missing after publication.\");\n }\n await pruneArtifactStore({\n directoryOptions,\n lock: params.lock,\n pointer: committedPointer,\n store,\n });\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n warnings = [`OpenClaw Crabline artifact retention cleanup failed: ${detail}`];\n }\n\n published = {\n ...pointer,\n pointerPath: OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH,\n providerReadiness,\n smoke: providerReadiness,\n ...(warnings ? { warnings } : {}),\n };\n } catch (error) {\n primaryError = error;\n }\n\n if (!committed) {\n const unpublishedPath = installed ? generationPath : stagingPath;\n let referencedByPointer = false;\n if (installed) {\n try {\n const livePointer = await readOpenClawCrablineArtifactPointer(outputDir);\n referencedByPointer =\n livePointer?.generation === generation || livePointer?.previousGeneration === generation;\n } catch {\n referencedByPointer = true;\n }\n }\n if (!referencedByPointer) {\n try {\n await removeSecuredPrivateDirectory(staging, unpublishedPath);\n } catch (cleanupError) {\n if (primaryError !== undefined) {\n const primaryMessage =\n primaryError instanceof Error ? primaryError.message : String(primaryError);\n const aggregateError = new AggregateError(\n [primaryError, cleanupError],\n `${primaryMessage} OpenClaw Crabline artifact rollback cleanup also failed.`,\n );\n aggregateError.cause = primaryError;\n const primaryCode = (primaryError as NodeJS.ErrnoException).code;\n if (primaryCode) {\n Object.assign(aggregateError, { code: primaryCode });\n }\n throw aggregateError;\n }\n throw cleanupError;\n }\n }\n }\n\n if (primaryError !== undefined) {\n throw primaryError;\n }\n return published!;\n}\n"]}
@@ -1,7 +1,65 @@
1
- import { createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readString, } from "../shared.js";
1
+ import { isIP } from "node:net";
2
+ import { canonicalConversationIdForInbound, createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readNonBlankString, readString, } from "../shared.js";
3
+ const MAX_MATRIX_IDENTIFIER_BYTES = 255;
4
+ function isMatrixIpv4Address(value) {
5
+ const octets = value.split(".");
6
+ return (octets.length === 4 && octets.every((octet) => /^\d{1,3}$/u.test(octet) && Number(octet) <= 255));
7
+ }
8
+ function isMatrixServerName(value) {
9
+ const ipv6 = /^\[([^\]]+)\](?::(\d{1,5}))?$/u.exec(value);
10
+ if (ipv6) {
11
+ return isIP(ipv6[1]) === 6;
12
+ }
13
+ const hostAndPort = /^([^:]+?)(?::(\d{1,5}))?$/u.exec(value);
14
+ if (!hostAndPort) {
15
+ return false;
16
+ }
17
+ const hostname = hostAndPort[1];
18
+ if (isMatrixIpv4Address(hostname)) {
19
+ return true;
20
+ }
21
+ if (/^\d+\.\d+\.\d+\.\d+$/u.test(hostname)) {
22
+ return false;
23
+ }
24
+ return hostname.length <= 255 && /^[A-Za-z0-9.-]+$/u.test(hostname);
25
+ }
26
+ function hasLoneSurrogate(value) {
27
+ for (let index = 0; index < value.length; index += 1) {
28
+ const code = value.charCodeAt(index);
29
+ if (code >= 0xd800 && code <= 0xdbff) {
30
+ const next = value.charCodeAt(index + 1);
31
+ if (next < 0xdc00 || next > 0xdfff) {
32
+ return true;
33
+ }
34
+ index += 1;
35
+ }
36
+ else if (code >= 0xdc00 && code <= 0xdfff) {
37
+ return true;
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+ function isMatrixRoomId(value) {
43
+ if (!value.startsWith("!") || Buffer.byteLength(value, "utf8") > MAX_MATRIX_IDENTIFIER_BYTES) {
44
+ return false;
45
+ }
46
+ const separator = value.indexOf(":");
47
+ if (separator >= 2) {
48
+ const localpart = value.slice(1, separator);
49
+ return (!localpart.includes("\0") &&
50
+ !hasLoneSurrogate(localpart) &&
51
+ isMatrixServerName(value.slice(separator + 1)));
52
+ }
53
+ const opaqueId = value.slice(1);
54
+ if (!/^[A-Za-z0-9_-]{43}$/u.test(opaqueId)) {
55
+ return false;
56
+ }
57
+ const decoded = Buffer.from(opaqueId, "base64url");
58
+ return decoded.length === 32 && decoded.toString("base64url") === opaqueId;
59
+ }
2
60
  function matrixRoomId(value) {
3
61
  const trimmed = value.trim();
4
- if (!trimmed.startsWith("!") || !trimmed.includes(":")) {
62
+ if (!isMatrixRoomId(trimmed)) {
5
63
  throw new Error("Matrix targets must be native room IDs.");
6
64
  }
7
65
  return trimmed;
@@ -13,18 +71,25 @@ function eventThreadId(content) {
13
71
  const relation = isRecord(content["m.relates_to"]) ? content["m.relates_to"] : undefined;
14
72
  return relation?.rel_type === "m.thread" ? readString(relation.event_id) : undefined;
15
73
  }
74
+ const MAX_DELIVERED_MATRIX_TRANSACTIONS = 1_000;
16
75
  export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({
17
76
  provider: "matrix",
18
77
  createAdapter(matrix) {
78
+ const deliveredTransactions = new Set();
19
79
  return {
20
- async probe() {
80
+ async probe(signal) {
21
81
  const response = await fetch(`${matrix.endpoints.clientApiRoot}/account/whoami`, {
22
82
  headers: { authorization: `Bearer ${matrix.accessToken}` },
83
+ ...(signal ? { signal } : {}),
23
84
  });
24
85
  if (!response.ok) {
25
86
  throw new Error(`Crabline Matrix probe failed with HTTP ${response.status}.`);
26
87
  }
27
- return await response.json();
88
+ const payload = await response.json();
89
+ if (!isRecord(payload) || readString(payload.user_id) !== matrix.botUserId) {
90
+ throw new Error("Crabline Matrix whoami probe returned an unexpected user.");
91
+ }
92
+ return payload;
28
93
  },
29
94
  createBinding() {
30
95
  return {
@@ -42,7 +107,6 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
42
107
  matrix: {
43
108
  ...matrixConfig,
44
109
  accessToken: matrix.accessToken,
45
- blockStreaming: false,
46
110
  dm: {
47
111
  ...dmConfig,
48
112
  allowFrom: ["*"],
@@ -54,7 +118,10 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
54
118
  groupPolicy: "open",
55
119
  homeserver: matrix.baseUrl,
56
120
  network: { dangerouslyAllowPrivateNetwork: true },
57
- streaming: "off",
121
+ streaming: {
122
+ mode: "off",
123
+ block: { enabled: false },
124
+ },
58
125
  userId: matrix.botUserId,
59
126
  },
60
127
  },
@@ -77,7 +144,7 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
77
144
  };
78
145
  },
79
146
  createInbound(input) {
80
- const roomId = matrixRoomId(input.conversation.id);
147
+ const roomId = matrixRoomId(canonicalConversationIdForInbound(input));
81
148
  const threadId = input.threadId?.trim() || undefined;
82
149
  const direct = input.conversation.kind === "direct";
83
150
  return {
@@ -93,7 +160,7 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
93
160
  providerTargetKey: targetKey(roomId, threadId),
94
161
  qaTarget: qaTargetForInbound(input),
95
162
  stateConversation: {
96
- id: input.conversation.id,
163
+ id: roomId,
97
164
  kind: direct ? "direct" : "group",
98
165
  },
99
166
  ...(threadId ? { threadId } : {}),
@@ -103,23 +170,41 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
103
170
  if (!isRecord(event) ||
104
171
  event.type !== "api" ||
105
172
  event.method !== "PUT" ||
173
+ event.replayed === true ||
106
174
  !isRecord(event.body)) {
107
175
  return null;
108
176
  }
109
- const match = /^\/_matrix\/client\/(?:v3|r0)\/rooms\/([^/]+)\/send\/([^/]+)\/[^/]+$/u.exec(readString(event.path) ?? "");
177
+ const match = /^\/_matrix\/client\/(?:v3|r0)\/rooms\/([^/]+)\/send\/([^/]+)\/([^/]+)$/u.exec(readString(event.path) ?? "");
110
178
  if (!match) {
111
179
  return null;
112
180
  }
113
- const roomId = decodeURIComponent(match[1]);
114
- const eventType = decodeURIComponent(match[2]);
181
+ let roomId;
182
+ let eventType;
183
+ let transactionId;
184
+ try {
185
+ roomId = decodeURIComponent(match[1]);
186
+ eventType = decodeURIComponent(match[2]);
187
+ transactionId = decodeURIComponent(match[3]);
188
+ }
189
+ catch {
190
+ return null;
191
+ }
115
192
  if (eventType !== "m.room.message") {
116
193
  return null;
117
194
  }
118
- const text = readString(event.body.body);
195
+ const text = readNonBlankString(event.body.body);
119
196
  if (!text) {
120
197
  return null;
121
198
  }
199
+ const transactionKey = JSON.stringify([roomId, eventType, transactionId]);
200
+ if (deliveredTransactions.has(transactionKey)) {
201
+ return null;
202
+ }
122
203
  const threadId = eventThreadId(event.body);
204
+ deliveredTransactions.add(transactionKey);
205
+ if (deliveredTransactions.size > MAX_DELIVERED_MATRIX_TRANSACTIONS) {
206
+ deliveredTransactions.delete(deliveredTransactions.values().next().value);
207
+ }
123
208
  return {
124
209
  accountId: DEFAULT_ACCOUNT_ID,
125
210
  senderId: matrix.botUserId,
@@ -1 +1 @@
1
- {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/matrix.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/matrix.ts"],"names":[],"mappings":"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","sourcesContent":["import { isIP } from \"node:net\";\nimport {\n canonicalConversationIdForInbound,\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\n\nconst MAX_MATRIX_IDENTIFIER_BYTES = 255;\n\nfunction isMatrixIpv4Address(value: string): boolean {\n const octets = value.split(\".\");\n return (\n octets.length === 4 && octets.every((octet) => /^\\d{1,3}$/u.test(octet) && Number(octet) <= 255)\n );\n}\n\nfunction isMatrixServerName(value: string): boolean {\n const ipv6 = /^\\[([^\\]]+)\\](?::(\\d{1,5}))?$/u.exec(value);\n if (ipv6) {\n return isIP(ipv6[1]!) === 6;\n }\n const hostAndPort = /^([^:]+?)(?::(\\d{1,5}))?$/u.exec(value);\n if (!hostAndPort) {\n return false;\n }\n const hostname = hostAndPort[1]!;\n if (isMatrixIpv4Address(hostname)) {\n return true;\n }\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/u.test(hostname)) {\n return false;\n }\n return hostname.length <= 255 && /^[A-Za-z0-9.-]+$/u.test(hostname);\n}\n\nfunction hasLoneSurrogate(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n return true;\n }\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) {\n return true;\n }\n }\n return false;\n}\n\nfunction isMatrixRoomId(value: string): boolean {\n if (!value.startsWith(\"!\") || Buffer.byteLength(value, \"utf8\") > MAX_MATRIX_IDENTIFIER_BYTES) {\n return false;\n }\n const separator = value.indexOf(\":\");\n if (separator >= 2) {\n const localpart = value.slice(1, separator);\n return (\n !localpart.includes(\"\\0\") &&\n !hasLoneSurrogate(localpart) &&\n isMatrixServerName(value.slice(separator + 1))\n );\n }\n const opaqueId = value.slice(1);\n if (!/^[A-Za-z0-9_-]{43}$/u.test(opaqueId)) {\n return false;\n }\n const decoded = Buffer.from(opaqueId, \"base64url\");\n return decoded.length === 32 && decoded.toString(\"base64url\") === opaqueId;\n}\n\nfunction matrixRoomId(value: string): string {\n const trimmed = value.trim();\n if (!isMatrixRoomId(trimmed)) {\n throw new Error(\"Matrix targets must be native room IDs.\");\n }\n return trimmed;\n}\n\nfunction targetKey(roomId: string, threadId?: string): string {\n return threadId ? `${roomId}:thread:${threadId}` : roomId;\n}\n\nfunction eventThreadId(content: Record<string, unknown>): string | undefined {\n const relation = isRecord(content[\"m.relates_to\"]) ? content[\"m.relates_to\"] : undefined;\n return relation?.rel_type === \"m.thread\" ? readString(relation.event_id) : undefined;\n}\n\nconst MAX_DELIVERED_MATRIX_TRANSACTIONS = 1_000;\n\nexport const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({\n provider: \"matrix\",\n createAdapter(matrix) {\n const deliveredTransactions = new Set<string>();\n return {\n async probe(signal) {\n const response = await fetch(`${matrix.endpoints.clientApiRoot}/account/whoami`, {\n headers: { authorization: `Bearer ${matrix.accessToken}` },\n ...(signal ? { signal } : {}),\n });\n if (!response.ok) {\n throw new Error(`Crabline Matrix probe failed with HTTP ${response.status}.`);\n }\n const payload: unknown = await response.json();\n if (!isRecord(payload) || readString(payload.user_id) !== matrix.botUserId) {\n throw new Error(\"Crabline Matrix whoami probe returned an unexpected user.\");\n }\n return payload;\n },\n createBinding() {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n channel: \"matrix\",\n createChannelDriverSmokeEnv: (env) => ({ ...env, ...matrix.env }),\n createGatewayConfig: (openclawConfig = {}) => {\n const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};\n const matrixConfig = isRecord(channels.matrix) ? channels.matrix : {};\n const dmConfig = isRecord(matrixConfig.dm) ? matrixConfig.dm : {};\n return {\n ...openclawConfig,\n channels: {\n ...channels,\n matrix: {\n ...matrixConfig,\n accessToken: matrix.accessToken,\n dm: {\n ...dmConfig,\n allowFrom: [\"*\"],\n policy: \"open\",\n },\n enabled: true,\n encryption: false,\n groupAllowFrom: [\"*\"],\n groupPolicy: \"open\",\n homeserver: matrix.baseUrl,\n network: { dangerouslyAllowPrivateNetwork: true },\n streaming: {\n mode: \"off\",\n block: { enabled: false },\n },\n userId: matrix.botUserId,\n },\n },\n };\n },\n requiredPluginIds: [\"matrix\"],\n };\n },\n createAgentDelivery(parsed) {\n if (parsed.threadId) {\n throw new Error(\"Matrix thread targets require OpenClaw QA thread forwarding.\");\n }\n const roomId = matrixRoomId(parsed.id);\n const to = `room:${roomId}`;\n return {\n channel: \"matrix\",\n replyChannel: \"matrix\",\n replyTo: to,\n to,\n };\n },\n createInbound(input) {\n const roomId = matrixRoomId(canonicalConversationIdForInbound(input));\n const threadId = input.threadId?.trim() || undefined;\n const direct = input.conversation.kind === \"direct\";\n return {\n ...createAdminInboundRequest(matrix),\n providerBody: {\n roomId,\n direct,\n senderId: input.senderId,\n ...(input.senderName ? { senderName: input.senderName } : {}),\n text: input.text,\n ...(threadId ? { threadId } : {}),\n },\n providerTargetKey: targetKey(roomId, threadId),\n qaTarget: qaTargetForInbound(input),\n stateConversation: {\n id: roomId,\n kind: direct ? \"direct\" : \"group\",\n },\n ...(threadId ? { threadId } : {}),\n };\n },\n createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {\n if (\n !isRecord(event) ||\n event.type !== \"api\" ||\n event.method !== \"PUT\" ||\n event.replayed === true ||\n !isRecord(event.body)\n ) {\n return null;\n }\n const match =\n /^\\/_matrix\\/client\\/(?:v3|r0)\\/rooms\\/([^/]+)\\/send\\/([^/]+)\\/([^/]+)$/u.exec(\n readString(event.path) ?? \"\",\n );\n if (!match) {\n return null;\n }\n let roomId: string;\n let eventType: string;\n let transactionId: string;\n try {\n roomId = decodeURIComponent(match[1]!);\n eventType = decodeURIComponent(match[2]!);\n transactionId = decodeURIComponent(match[3]!);\n } catch {\n return null;\n }\n if (eventType !== \"m.room.message\") {\n return null;\n }\n const text = readNonBlankString(event.body.body);\n if (!text) {\n return null;\n }\n const transactionKey = JSON.stringify([roomId, eventType, transactionId]);\n if (deliveredTransactions.has(transactionKey)) {\n return null;\n }\n const threadId = eventThreadId(event.body);\n deliveredTransactions.add(transactionKey);\n if (deliveredTransactions.size > MAX_DELIVERED_MATRIX_TRANSACTIONS) {\n deliveredTransactions.delete(deliveredTransactions.values().next().value!);\n }\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n senderId: matrix.botUserId,\n senderName: \"OpenClaw QA\",\n text,\n to: targetByProviderTarget.get(targetKey(roomId, threadId)) ?? roomId,\n };\n },\n };\n },\n});\n"]}
@@ -1,4 +1,4 @@
1
- import { createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readString, } from "../shared.js";
1
+ import { canonicalConversationIdForInbound, createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readNonBlankString, readString, } from "../shared.js";
2
2
  import { mattermostId } from "../../servers/mattermost.js";
3
3
  function nativeId(value) {
4
4
  const trimmed = value.trim();
@@ -13,18 +13,32 @@ function directChannelId(botUserId, userId) {
13
13
  function targetKey(channelId, rootId) {
14
14
  return rootId ? `${channelId}:thread:${rootId}` : channelId;
15
15
  }
16
+ function threadRootId(channelId, value) {
17
+ const trimmed = value.trim();
18
+ return /^[a-z0-9]{26}$/u.test(trimmed) ? trimmed : mattermostId(`thread:${channelId}:${trimmed}`);
19
+ }
16
20
  export const MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({
17
21
  provider: "mattermost",
18
22
  createAdapter(mattermost) {
19
23
  return {
20
- async probe() {
24
+ async probe(signal) {
21
25
  const response = await fetch(`${mattermost.endpoints.apiRoot}/users/me`, {
22
26
  headers: { authorization: `Bearer ${mattermost.botToken}` },
27
+ ...(signal ? { signal } : {}),
23
28
  });
24
29
  if (!response.ok) {
25
30
  throw new Error(`Crabline Mattermost probe failed with HTTP ${response.status}.`);
26
31
  }
27
- return await response.json();
32
+ const payload = await response.json();
33
+ if (!isRecord(payload) ||
34
+ readString(payload.id) !== mattermost.botUserId ||
35
+ !readNonBlankString(payload.username) ||
36
+ typeof payload.update_at !== "number" ||
37
+ !Number.isSafeInteger(payload.update_at) ||
38
+ payload.update_at < 0) {
39
+ throw new Error("Crabline Mattermost users/me probe returned an unexpected user.");
40
+ }
41
+ return payload;
28
42
  },
29
43
  createBinding() {
30
44
  return {
@@ -49,7 +63,7 @@ export const MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabli
49
63
  groupAllowFrom: ["*"],
50
64
  groupPolicy: "open",
51
65
  network: { dangerouslyAllowPrivateNetwork: true },
52
- streaming: "off",
66
+ streaming: { mode: "off" },
53
67
  },
54
68
  },
55
69
  };
@@ -67,11 +81,15 @@ export const MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabli
67
81
  },
68
82
  createInbound(input) {
69
83
  const kind = input.conversation.kind === "direct" ? "direct" : "group";
84
+ const conversationId = canonicalConversationIdForInbound(input);
85
+ if (!conversationId) {
86
+ throw new Error("Mattermost conversation id is required.");
87
+ }
70
88
  const senderId = nativeId(input.senderId);
71
89
  const channelId = kind === "direct"
72
90
  ? directChannelId(mattermost.botUserId, senderId)
73
- : nativeId(input.conversation.id);
74
- const rootId = input.threadId ? nativeId(input.threadId) : undefined;
91
+ : nativeId(conversationId);
92
+ const rootId = input.threadId ? threadRootId(channelId, input.threadId) : undefined;
75
93
  return {
76
94
  ...createAdminInboundRequest(mattermost),
77
95
  providerBody: {
@@ -84,8 +102,8 @@ export const MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabli
84
102
  },
85
103
  providerTargetKey: targetKey(channelId, rootId),
86
104
  qaTarget: qaTargetForInbound(input),
87
- stateConversation: { id: input.conversation.id, kind },
88
- ...(input.threadId ? { threadId: input.threadId } : {}),
105
+ stateConversation: { id: conversationId, kind },
106
+ ...(rootId ? { threadId: rootId } : {}),
89
107
  };
90
108
  },
91
109
  createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {
@@ -98,16 +116,20 @@ export const MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabli
98
116
  }
99
117
  const channelId = readString(event.body.channel_id);
100
118
  const rootId = readString(event.body.root_id);
101
- const text = readString(event.body.message);
119
+ const text = readNonBlankString(event.body.message);
102
120
  if (!channelId || !text) {
103
121
  return null;
104
122
  }
123
+ const target = targetByProviderTarget.get(targetKey(channelId, rootId));
124
+ if (!target) {
125
+ return null;
126
+ }
105
127
  return {
106
128
  accountId: DEFAULT_ACCOUNT_ID,
107
129
  senderId: mattermost.botUserId,
108
130
  senderName: "OpenClaw QA",
109
131
  text,
110
- to: targetByProviderTarget.get(targetKey(channelId, rootId)) ?? channelId,
132
+ to: target,
111
133
  };
112
134
  },
113
135
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mattermost.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/mattermost.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mattermost.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/mattermost.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n canonicalConversationIdForInbound,\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\nimport { mattermostId } from \"../../servers/mattermost.js\";\n\nfunction nativeId(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(\"Mattermost target is required.\");\n }\n return /^[a-z0-9]{26}$/u.test(trimmed) ? trimmed : mattermostId(trimmed);\n}\n\nfunction directChannelId(botUserId: string, userId: string): string {\n return mattermostId(`dm:${[botUserId, userId].sort().join(\":\")}`);\n}\n\nfunction targetKey(channelId: string, rootId?: string): string {\n return rootId ? `${channelId}:thread:${rootId}` : channelId;\n}\n\nfunction threadRootId(channelId: string, value: string): string {\n const trimmed = value.trim();\n return /^[a-z0-9]{26}$/u.test(trimmed) ? trimmed : mattermostId(`thread:${channelId}:${trimmed}`);\n}\n\nexport const MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({\n provider: \"mattermost\",\n createAdapter(mattermost) {\n return {\n async probe(signal) {\n const response = await fetch(`${mattermost.endpoints.apiRoot}/users/me`, {\n headers: { authorization: `Bearer ${mattermost.botToken}` },\n ...(signal ? { signal } : {}),\n });\n if (!response.ok) {\n throw new Error(`Crabline Mattermost probe failed with HTTP ${response.status}.`);\n }\n const payload: unknown = await response.json();\n if (\n !isRecord(payload) ||\n readString(payload.id) !== mattermost.botUserId ||\n !readNonBlankString(payload.username) ||\n typeof payload.update_at !== \"number\" ||\n !Number.isSafeInteger(payload.update_at) ||\n payload.update_at < 0\n ) {\n throw new Error(\"Crabline Mattermost users/me probe returned an unexpected user.\");\n }\n return payload;\n },\n createBinding() {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n channel: \"mattermost\",\n createChannelDriverSmokeEnv: (env) => ({ ...env, ...mattermost.env }),\n createGatewayConfig: (openclawConfig = {}) => {\n const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};\n const mattermostConfig = isRecord(channels.mattermost) ? channels.mattermost : {};\n return {\n ...openclawConfig,\n channels: {\n ...channels,\n mattermost: {\n ...mattermostConfig,\n allowFrom: [\"*\"],\n baseUrl: mattermost.baseUrl,\n botToken: mattermost.botToken,\n chatmode: \"onmessage\",\n dmPolicy: \"open\",\n enabled: true,\n groupAllowFrom: [\"*\"],\n groupPolicy: \"open\",\n network: { dangerouslyAllowPrivateNetwork: true },\n streaming: { mode: \"off\" },\n },\n },\n };\n },\n requiredPluginIds: [\"mattermost\"],\n };\n },\n createAgentDelivery(parsed) {\n if (parsed.threadId) {\n throw new Error(\"Mattermost thread targets require OpenClaw QA thread forwarding.\");\n }\n const id = nativeId(parsed.id);\n const to = parsed.kind === \"direct\" ? `user:${id}` : `channel:${id}`;\n return { channel: \"mattermost\", replyChannel: \"mattermost\", replyTo: to, to };\n },\n createInbound(input) {\n const kind = input.conversation.kind === \"direct\" ? \"direct\" : \"group\";\n const conversationId = canonicalConversationIdForInbound(input);\n if (!conversationId) {\n throw new Error(\"Mattermost conversation id is required.\");\n }\n const senderId = nativeId(input.senderId);\n const channelId =\n kind === \"direct\"\n ? directChannelId(mattermost.botUserId, senderId)\n : nativeId(conversationId);\n const rootId = input.threadId ? threadRootId(channelId, input.threadId) : undefined;\n return {\n ...createAdminInboundRequest(mattermost),\n providerBody: {\n channelId,\n channelType: kind === \"direct\" ? \"D\" : \"O\",\n ...(rootId ? { rootId } : {}),\n senderId,\n ...(input.senderName ? { senderName: input.senderName } : {}),\n text: input.text,\n },\n providerTargetKey: targetKey(channelId, rootId),\n qaTarget: qaTargetForInbound(input),\n stateConversation: { id: conversationId, kind },\n ...(rootId ? { threadId: rootId } : {}),\n };\n },\n createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {\n if (\n !isRecord(event) ||\n event.type !== \"api\" ||\n event.method !== \"POST\" ||\n event.path !== \"/api/v4/posts\" ||\n !isRecord(event.body)\n ) {\n return null;\n }\n const channelId = readString(event.body.channel_id);\n const rootId = readString(event.body.root_id);\n const text = readNonBlankString(event.body.message);\n if (!channelId || !text) {\n return null;\n }\n const target = targetByProviderTarget.get(targetKey(channelId, rootId));\n if (!target) {\n return null;\n }\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n senderId: mattermost.botUserId,\n senderName: \"OpenClaw QA\",\n text,\n to: target,\n };\n },\n };\n },\n});\n"]}
@@ -1,26 +1,57 @@
1
1
  import { createHash } from "node:crypto";
2
- import { createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readString, } from "../shared.js";
3
- function signalDirectId(id) {
2
+ import { createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readNonBlankString, readString, } from "../shared.js";
3
+ const SIGNAL_UUID_RE = /^(?:uuid:)?([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/iu;
4
+ function deterministicSignalUuid(value) {
5
+ const bytes = createHash("sha256")
6
+ .update("crabline:signal:direct\0")
7
+ .update(value)
8
+ .digest()
9
+ .subarray(0, 16);
10
+ bytes[6] = (bytes[6] & 0x0f) | 0x80;
11
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
12
+ const hex = bytes.toString("hex");
13
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
14
+ }
15
+ function signalDirectIdentity(id) {
4
16
  const value = id.trim();
5
- if (/^\+?\d{3,}$/u.test(value)) {
6
- return value.startsWith("+") ? value : `+${value}`;
17
+ if (/^\+?[1-9]\d{2,14}$/u.test(value)) {
18
+ const sourceNumber = value.startsWith("+") ? value : `+${value}`;
19
+ return { recipient: sourceNumber, sourceNumber };
7
20
  }
8
- const suffix = createHash("sha256").update(value).digest().readUInt32BE() % 10_000_000;
9
- return `+1555${String(suffix).padStart(7, "0")}`;
21
+ const sourceUuid = SIGNAL_UUID_RE.exec(value)?.[1]?.toLowerCase() ?? deterministicSignalUuid(value);
22
+ return { recipient: sourceUuid, sourceUuid };
23
+ }
24
+ function signalRecipientValues(value) {
25
+ const values = Array.isArray(value) ? value : [value];
26
+ return values.map(readString).filter((entry) => entry !== undefined);
27
+ }
28
+ function signalOutboundTargets(params, account) {
29
+ const targets = [
30
+ ...signalRecipientValues(params.groupId).map((id) => `group:${id}`),
31
+ ...signalRecipientValues(params.groupIds).map((id) => `group:${id}`),
32
+ ...signalRecipientValues(params.recipient),
33
+ ...signalRecipientValues(params.recipients),
34
+ ...signalRecipientValues(params.username),
35
+ ...signalRecipientValues(params.usernames),
36
+ ...(params.noteToSelf === true ? [account] : []),
37
+ ];
38
+ return [...new Set(targets)];
10
39
  }
11
40
  function signalTarget(kind, id) {
12
41
  const value = id.trim();
13
42
  if (!value) {
14
43
  throw new Error("Signal target is required.");
15
44
  }
16
- return kind === "group" ? `group:${value}` : signalDirectId(value);
45
+ return kind === "group" ? `group:${value}` : signalDirectIdentity(value).recipient;
17
46
  }
18
47
  export const SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({
19
48
  provider: "signal",
20
49
  createAdapter(signal) {
21
50
  return {
22
- async probe() {
23
- const response = await fetch(`${signal.baseUrl}/api/v1/check`);
51
+ async probe(abortSignal) {
52
+ const response = await fetch(`${signal.baseUrl}/api/v1/check`, {
53
+ ...(abortSignal ? { signal: abortSignal } : {}),
54
+ });
24
55
  if (!response.ok) {
25
56
  throw new Error(`Crabline Signal check probe failed with HTTP ${response.status}.`);
26
57
  }
@@ -57,26 +88,34 @@ export const SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
57
88
  };
58
89
  },
59
90
  createAgentDelivery(parsed) {
91
+ if (parsed.threadId !== undefined) {
92
+ throw new Error("Signal does not support thread targets.");
93
+ }
60
94
  const to = signalTarget(parsed.kind, parsed.id);
61
95
  return { channel: "signal", replyChannel: "signal", replyTo: to, to };
62
96
  },
63
97
  createInbound(input) {
98
+ if (input.threadId !== undefined) {
99
+ throw new Error("Signal does not support thread targets.");
100
+ }
64
101
  const kind = input.conversation.kind === "direct" ? "direct" : "group";
65
102
  const conversationId = input.conversation.id.trim();
66
103
  const senderId = input.senderId.trim();
67
104
  if (!conversationId || !senderId) {
68
105
  throw new Error("Signal conversation and sender are required.");
69
106
  }
70
- const sourceNumber = signalDirectId(senderId);
107
+ const senderIdentity = signalDirectIdentity(senderId);
71
108
  return {
72
109
  ...createAdminInboundRequest(signal),
73
110
  providerBody: {
74
111
  ...(kind === "group" ? { groupId: conversationId } : {}),
75
112
  ...(input.senderName ? { sourceName: input.senderName } : {}),
76
- sourceNumber,
113
+ ...("sourceNumber" in senderIdentity
114
+ ? { sourceNumber: senderIdentity.sourceNumber }
115
+ : { sourceUuid: senderIdentity.sourceUuid }),
77
116
  text: input.text,
78
117
  },
79
- providerTargetKey: kind === "group" ? `group:${conversationId}` : sourceNumber,
118
+ providerTargetKey: kind === "group" ? `group:${conversationId}` : senderIdentity.recipient,
80
119
  qaTarget: qaTargetForInbound(input),
81
120
  stateConversation: { id: conversationId, kind },
82
121
  };
@@ -90,14 +129,12 @@ export const SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
90
129
  !isRecord(event.body.params)) {
91
130
  return null;
92
131
  }
93
- const text = readString(event.body.params.message);
94
- const groupId = readString(event.body.params.groupId);
95
- const recipients = event.body.params.recipient;
96
- const recipient = Array.isArray(recipients) ? readString(recipients[0]) : undefined;
97
- const target = groupId ? `group:${groupId}` : recipient;
98
- if (!text || !target) {
132
+ const text = readNonBlankString(event.body.params.message);
133
+ const targets = signalOutboundTargets(event.body.params, signal.account);
134
+ if (!text || targets.length !== 1) {
99
135
  return null;
100
136
  }
137
+ const target = targets[0];
101
138
  return {
102
139
  accountId: DEFAULT_ACCOUNT_ID,
103
140
  senderId: "openclaw",
@@ -1 +1 @@
1
- {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/signal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/signal.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\n\nconst SIGNAL_UUID_RE =\n /^(?:uuid:)?([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/iu;\n\ntype SignalDirectIdentity =\n | { recipient: string; sourceNumber: string }\n | { recipient: string; sourceUuid: string };\n\nfunction deterministicSignalUuid(value: string): string {\n const bytes = createHash(\"sha256\")\n .update(\"crabline:signal:direct\\0\")\n .update(value)\n .digest()\n .subarray(0, 16);\n bytes[6] = (bytes[6]! & 0x0f) | 0x80;\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n const hex = bytes.toString(\"hex\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nfunction signalDirectIdentity(id: string): SignalDirectIdentity {\n const value = id.trim();\n if (/^\\+?[1-9]\\d{2,14}$/u.test(value)) {\n const sourceNumber = value.startsWith(\"+\") ? value : `+${value}`;\n return { recipient: sourceNumber, sourceNumber };\n }\n const sourceUuid =\n SIGNAL_UUID_RE.exec(value)?.[1]?.toLowerCase() ?? deterministicSignalUuid(value);\n return { recipient: sourceUuid, sourceUuid };\n}\n\nfunction signalRecipientValues(value: unknown): string[] {\n const values = Array.isArray(value) ? value : [value];\n return values.map(readString).filter((entry): entry is string => entry !== undefined);\n}\n\nfunction signalOutboundTargets(params: Record<string, unknown>, account: string): string[] {\n const targets = [\n ...signalRecipientValues(params.groupId).map((id) => `group:${id}`),\n ...signalRecipientValues(params.groupIds).map((id) => `group:${id}`),\n ...signalRecipientValues(params.recipient),\n ...signalRecipientValues(params.recipients),\n ...signalRecipientValues(params.username),\n ...signalRecipientValues(params.usernames),\n ...(params.noteToSelf === true ? [account] : []),\n ];\n return [...new Set(targets)];\n}\n\nfunction signalTarget(kind: \"direct\" | \"group\", id: string): string {\n const value = id.trim();\n if (!value) {\n throw new Error(\"Signal target is required.\");\n }\n return kind === \"group\" ? `group:${value}` : signalDirectIdentity(value).recipient;\n}\n\nexport const SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({\n provider: \"signal\",\n createAdapter(signal) {\n return {\n async probe(abortSignal) {\n const response = await fetch(`${signal.baseUrl}/api/v1/check`, {\n ...(abortSignal ? { signal: abortSignal } : {}),\n });\n if (!response.ok) {\n throw new Error(`Crabline Signal check probe failed with HTTP ${response.status}.`);\n }\n return { ok: true, status: response.status };\n },\n createBinding() {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n channel: \"signal\",\n createChannelDriverSmokeEnv: (env) => env,\n createGatewayConfig: (openclawConfig = {}) => {\n const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};\n const signalConfig = isRecord(channels.signal) ? channels.signal : {};\n return {\n ...openclawConfig,\n channels: {\n ...channels,\n signal: {\n ...signalConfig,\n account: signal.account,\n allowFrom: [\"*\"],\n apiMode: \"native\",\n autoStart: false,\n dmPolicy: \"open\",\n enabled: true,\n groupAllowFrom: [\"*\"],\n groupPolicy: \"open\",\n httpUrl: signal.baseUrl,\n },\n },\n };\n },\n requiredPluginIds: [\"signal\"],\n };\n },\n createAgentDelivery(parsed) {\n if (parsed.threadId !== undefined) {\n throw new Error(\"Signal does not support thread targets.\");\n }\n const to = signalTarget(parsed.kind, parsed.id);\n return { channel: \"signal\", replyChannel: \"signal\", replyTo: to, to };\n },\n createInbound(input) {\n if (input.threadId !== undefined) {\n throw new Error(\"Signal does not support thread targets.\");\n }\n const kind = input.conversation.kind === \"direct\" ? \"direct\" : \"group\";\n const conversationId = input.conversation.id.trim();\n const senderId = input.senderId.trim();\n if (!conversationId || !senderId) {\n throw new Error(\"Signal conversation and sender are required.\");\n }\n const senderIdentity = signalDirectIdentity(senderId);\n return {\n ...createAdminInboundRequest(signal),\n providerBody: {\n ...(kind === \"group\" ? { groupId: conversationId } : {}),\n ...(input.senderName ? { sourceName: input.senderName } : {}),\n ...(\"sourceNumber\" in senderIdentity\n ? { sourceNumber: senderIdentity.sourceNumber }\n : { sourceUuid: senderIdentity.sourceUuid }),\n text: input.text,\n },\n providerTargetKey:\n kind === \"group\" ? `group:${conversationId}` : senderIdentity.recipient,\n qaTarget: qaTargetForInbound(input),\n stateConversation: { id: conversationId, kind },\n };\n },\n createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {\n if (\n !isRecord(event) ||\n event.type !== \"api\" ||\n event.path !== \"/api/v1/rpc\" ||\n !isRecord(event.body) ||\n event.body.method !== \"send\" ||\n !isRecord(event.body.params)\n ) {\n return null;\n }\n const text = readNonBlankString(event.body.params.message);\n const targets = signalOutboundTargets(event.body.params, signal.account);\n if (!text || targets.length !== 1) {\n return null;\n }\n const target = targets[0]!;\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n senderId: \"openclaw\",\n senderName: \"OpenClaw QA\",\n text,\n to: targetByProviderTarget.get(target) ?? target,\n };\n },\n };\n },\n});\n"]}