@openclaw/crabline 0.1.11 → 0.1.13

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 (214) hide show
  1. package/README.md +137 -23
  2. package/dist/src/bin/crabline.js +3 -1
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +5 -1
  5. package/dist/src/cli/program.js +281 -52
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +39 -3
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +20 -0
  10. package/dist/src/config/schema.js +163 -35
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.d.ts +1 -0
  13. package/dist/src/core/errors.js +6 -3
  14. package/dist/src/core/errors.js.map +1 -1
  15. package/dist/src/core/http-path.d.ts +1 -0
  16. package/dist/src/core/http-path.js +14 -0
  17. package/dist/src/core/http-path.js.map +1 -0
  18. package/dist/src/core/matcher.d.ts +3 -1
  19. package/dist/src/core/matcher.js +58 -2
  20. package/dist/src/core/matcher.js.map +1 -1
  21. package/dist/src/core/nonces.d.ts +2 -0
  22. package/dist/src/core/nonces.js +11 -1
  23. package/dist/src/core/nonces.js.map +1 -1
  24. package/dist/src/core/reporters.d.ts +5 -0
  25. package/dist/src/core/reporters.js +26 -2
  26. package/dist/src/core/reporters.js.map +1 -1
  27. package/dist/src/core/run.d.ts +3 -1
  28. package/dist/src/core/run.js +178 -66
  29. package/dist/src/core/run.js.map +1 -1
  30. package/dist/src/index.d.ts +12 -10
  31. package/dist/src/index.js +6 -5
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/matrix-ids.d.ts +5 -0
  34. package/dist/src/matrix-ids.js +83 -0
  35. package/dist/src/matrix-ids.js.map +1 -0
  36. package/dist/src/openclaw/artifact-generation.d.ts +7 -6
  37. package/dist/src/openclaw/artifact-generation.js +385 -41
  38. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  39. package/dist/src/openclaw/bridges/discord.d.ts +1 -0
  40. package/dist/src/openclaw/bridges/discord.js +149 -0
  41. package/dist/src/openclaw/bridges/discord.js.map +1 -0
  42. package/dist/src/openclaw/bridges/matrix.js +22 -5
  43. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  44. package/dist/src/openclaw/bridges/mattermost.js +14 -9
  45. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  46. package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
  47. package/dist/src/openclaw/bridges/probe-response.js +5 -0
  48. package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
  49. package/dist/src/openclaw/bridges/signal.js +16 -7
  50. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  51. package/dist/src/openclaw/bridges/slack.js +117 -24
  52. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  53. package/dist/src/openclaw/bridges/telegram.js +46 -20
  54. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  55. package/dist/src/openclaw/bridges/whatsapp.js +33 -17
  56. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  57. package/dist/src/openclaw/bridges/zalo.js +9 -4
  58. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  59. package/dist/src/openclaw/outbound-contract.js +3 -0
  60. package/dist/src/openclaw/outbound-contract.js.map +1 -1
  61. package/dist/src/openclaw/private-file.d.ts +38 -3
  62. package/dist/src/openclaw/private-file.js +2008 -87
  63. package/dist/src/openclaw/private-file.js.map +1 -1
  64. package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +14 -5
  65. package/dist/src/openclaw/provider-readiness-lock.js +1320 -0
  66. package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
  67. package/dist/src/openclaw/shared.d.ts +10 -17
  68. package/dist/src/openclaw/shared.js +53 -19
  69. package/dist/src/openclaw/shared.js.map +1 -1
  70. package/dist/src/openclaw.d.ts +3 -5
  71. package/dist/src/openclaw.js +245 -60
  72. package/dist/src/openclaw.js.map +1 -1
  73. package/dist/src/platform/process-owned-lock.d.ts +11 -0
  74. package/dist/src/platform/process-owned-lock.js +1698 -0
  75. package/dist/src/platform/process-owned-lock.js.map +1 -0
  76. package/dist/src/platform/recorder-directory.d.ts +1 -0
  77. package/dist/src/platform/recorder-directory.js +14 -0
  78. package/dist/src/platform/recorder-directory.js.map +1 -0
  79. package/dist/src/platform/windows-acl.d.ts +18 -0
  80. package/dist/src/platform/windows-acl.js +1367 -0
  81. package/dist/src/platform/windows-acl.js.map +1 -0
  82. package/dist/src/platform/windows-lock-root.d.ts +13 -0
  83. package/dist/src/platform/windows-lock-root.js +98 -0
  84. package/dist/src/platform/windows-lock-root.js.map +1 -0
  85. package/dist/src/providers/builtin/discord.d.ts +4 -0
  86. package/dist/src/providers/builtin/discord.js +52 -9
  87. package/dist/src/providers/builtin/discord.js.map +1 -1
  88. package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
  89. package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
  90. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
  91. package/dist/src/providers/builtin/feishu.d.ts +1 -0
  92. package/dist/src/providers/builtin/feishu.js +96 -26
  93. package/dist/src/providers/builtin/feishu.js.map +1 -1
  94. package/dist/src/providers/builtin/googlechat.d.ts +1 -0
  95. package/dist/src/providers/builtin/googlechat.js +95 -26
  96. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  97. package/dist/src/providers/builtin/imessage.js +60 -17
  98. package/dist/src/providers/builtin/imessage.js.map +1 -1
  99. package/dist/src/providers/builtin/loopback.js +88 -35
  100. package/dist/src/providers/builtin/loopback.js.map +1 -1
  101. package/dist/src/providers/builtin/matrix.d.ts +2 -2
  102. package/dist/src/providers/builtin/matrix.js +78 -21
  103. package/dist/src/providers/builtin/matrix.js.map +1 -1
  104. package/dist/src/providers/builtin/mattermost.d.ts +11 -7
  105. package/dist/src/providers/builtin/mattermost.js +138 -24
  106. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  107. package/dist/src/providers/builtin/msteams.d.ts +1 -0
  108. package/dist/src/providers/builtin/msteams.js +118 -38
  109. package/dist/src/providers/builtin/msteams.js.map +1 -1
  110. package/dist/src/providers/builtin/native-local-mock.js +4 -4
  111. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  112. package/dist/src/providers/builtin/script.js +1057 -146
  113. package/dist/src/providers/builtin/script.js.map +1 -1
  114. package/dist/src/providers/builtin/slack.d.ts +8 -1
  115. package/dist/src/providers/builtin/slack.js +327 -24
  116. package/dist/src/providers/builtin/slack.js.map +1 -1
  117. package/dist/src/providers/builtin/telegram.d.ts +1 -1
  118. package/dist/src/providers/builtin/telegram.js +55 -14
  119. package/dist/src/providers/builtin/telegram.js.map +1 -1
  120. package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
  121. package/dist/src/providers/builtin/whatsapp.js +157 -29
  122. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  123. package/dist/src/providers/builtin/zalo.d.ts +5 -2
  124. package/dist/src/providers/builtin/zalo.js +31 -7
  125. package/dist/src/providers/builtin/zalo.js.map +1 -1
  126. package/dist/src/providers/catalog.d.ts +1 -1
  127. package/dist/src/providers/catalog.js +1 -1
  128. package/dist/src/providers/catalog.js.map +1 -1
  129. package/dist/src/providers/local-mock.d.ts +4 -0
  130. package/dist/src/providers/local-mock.js +162 -35
  131. package/dist/src/providers/local-mock.js.map +1 -1
  132. package/dist/src/providers/native-ids.d.ts +2 -0
  133. package/dist/src/providers/native-ids.js +3 -0
  134. package/dist/src/providers/native-ids.js.map +1 -1
  135. package/dist/src/providers/recorder.d.ts +14 -3
  136. package/dist/src/providers/recorder.js +521 -41
  137. package/dist/src/providers/recorder.js.map +1 -1
  138. package/dist/src/providers/registry.d.ts +1 -0
  139. package/dist/src/providers/registry.js +65 -20
  140. package/dist/src/providers/registry.js.map +1 -1
  141. package/dist/src/providers/signed-jwt.d.ts +6 -1
  142. package/dist/src/providers/signed-jwt.js +241 -50
  143. package/dist/src/providers/signed-jwt.js.map +1 -1
  144. package/dist/src/providers/slack-ids.d.ts +1 -0
  145. package/dist/src/providers/slack-ids.js +5 -0
  146. package/dist/src/providers/slack-ids.js.map +1 -1
  147. package/dist/src/providers/target-normalizers.d.ts +9 -1
  148. package/dist/src/providers/target-normalizers.js +177 -58
  149. package/dist/src/providers/target-normalizers.js.map +1 -1
  150. package/dist/src/providers/webhook-server.d.ts +3 -0
  151. package/dist/src/providers/webhook-server.js +268 -47
  152. package/dist/src/providers/webhook-server.js.map +1 -1
  153. package/dist/src/servers/discord.d.ts +40 -0
  154. package/dist/src/servers/discord.js +842 -0
  155. package/dist/src/servers/discord.js.map +1 -0
  156. package/dist/src/servers/http.d.ts +14 -2
  157. package/dist/src/servers/http.js +229 -58
  158. package/dist/src/servers/http.js.map +1 -1
  159. package/dist/src/servers/index.d.ts +10 -4
  160. package/dist/src/servers/index.js +4 -0
  161. package/dist/src/servers/index.js.map +1 -1
  162. package/dist/src/servers/matrix.d.ts +3 -0
  163. package/dist/src/servers/matrix.js +268 -110
  164. package/dist/src/servers/matrix.js.map +1 -1
  165. package/dist/src/servers/mattermost.d.ts +5 -0
  166. package/dist/src/servers/mattermost.js +389 -91
  167. package/dist/src/servers/mattermost.js.map +1 -1
  168. package/dist/src/servers/recorder.d.ts +11 -0
  169. package/dist/src/servers/recorder.js +1072 -69
  170. package/dist/src/servers/recorder.js.map +1 -1
  171. package/dist/src/servers/signal.d.ts +1 -0
  172. package/dist/src/servers/signal.js +279 -44
  173. package/dist/src/servers/signal.js.map +1 -1
  174. package/dist/src/servers/slack.d.ts +15 -0
  175. package/dist/src/servers/slack.js +270 -54
  176. package/dist/src/servers/slack.js.map +1 -1
  177. package/dist/src/servers/telegram-identity.d.ts +6 -0
  178. package/dist/src/servers/telegram-identity.js +27 -0
  179. package/dist/src/servers/telegram-identity.js.map +1 -0
  180. package/dist/src/servers/telegram.d.ts +17 -6
  181. package/dist/src/servers/telegram.js +1218 -107
  182. package/dist/src/servers/telegram.js.map +1 -1
  183. package/dist/src/servers/webhook-target.d.ts +12 -4
  184. package/dist/src/servers/webhook-target.js +226 -28
  185. package/dist/src/servers/webhook-target.js.map +1 -1
  186. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
  187. package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
  188. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  189. package/dist/src/servers/whatsapp-jid.d.ts +1 -0
  190. package/dist/src/servers/whatsapp-jid.js +9 -5
  191. package/dist/src/servers/whatsapp-jid.js.map +1 -1
  192. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
  193. package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
  194. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  195. package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
  196. package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
  197. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  198. package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
  199. package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
  200. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  201. package/dist/src/servers/whatsapp-wire/signal.js +3 -3
  202. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  203. package/dist/src/servers/whatsapp.d.ts +7 -1
  204. package/dist/src/servers/whatsapp.js +149 -25
  205. package/dist/src/servers/whatsapp.js.map +1 -1
  206. package/dist/src/servers/zalo.d.ts +1 -0
  207. package/dist/src/servers/zalo.js +193 -82
  208. package/dist/src/servers/zalo.js.map +1 -1
  209. package/docs/channel-setup.md +251 -64
  210. package/fixtures/examples/crabline.example.yaml +3 -2
  211. package/package.json +18 -10
  212. package/dist/src/openclaw/smoke-lock.js +0 -1004
  213. package/dist/src/openclaw/smoke-lock.js.map +0 -1
  214. package/fixtures/examples/openclaw-bridge.yaml +0 -125
@@ -1 +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
+ {"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 { isDeepStrictEqual } from \"node:util\";\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_PROVIDER_READINESS_PATH,\n OPENCLAW_CRABLINE_MANIFEST_PATH,\n type OpenClawCrablineChannelDriverSelection,\n} from \"./shared.js\";\nimport type { OpenClawCrablineProviderReadinessLock } from \"./provider-readiness-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;\nconst CURRENT_GENERATION_READ_ATTEMPTS = 8;\ntype OpenClawCrablineArtifactPointerBase = {\n capabilityMatrixPath: string;\n generation: string;\n manifestPath: string;\n previousGeneration?: string;\n providerReadinessArtifactPath: string;\n};\n\nexport type OpenClawCrablineArtifactPointer = OpenClawCrablineArtifactPointerBase & {\n recorderSnapshotPath: string | null;\n version: 3;\n};\n\nexport type PublishedOpenClawCrablineArtifactGeneration = OpenClawCrablineArtifactPointer & {\n pointerPath: string;\n providerReadiness: 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 if (\n selection.capabilityMatrixPath !== OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH ||\n selection.providerReadinessArtifactPath !== OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH\n ) {\n throw new Error(\"OpenClaw Crabline artifact selection paths are malformed.\");\n }\n return selection.providerReadinessArtifactPath;\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction hasNonEmptyStringFields(\n value: Record<string, unknown>,\n fields: readonly string[],\n): boolean {\n return fields.every((field) => typeof value[field] === \"string\" && value[field].length > 0);\n}\n\nfunction isGeneratedManifest(value: Record<string, unknown>): boolean {\n if (\n value.version !== 1 ||\n !hasNonEmptyStringFields(value, [\"adminToken\", \"baseUrl\", \"provider\"]) ||\n !isRecord(value.endpoints) ||\n !isRecord(value.env)\n ) {\n return false;\n }\n const endpoints = value.endpoints;\n const env = value.env;\n const baseUrl = value.baseUrl as string;\n switch (value.provider) {\n case \"discord\":\n return (\n hasNonEmptyStringFields(value, [\"applicationId\", \"botToken\", \"botUserId\"]) &&\n hasNonEmptyStringFields(endpoints, [\n \"adminInboundUrl\",\n \"apiRoot\",\n \"gatewayBotUrl\",\n \"gatewayUrl\",\n ]) &&\n hasNonEmptyStringFields(env, [\"DISCORD_BOT_TOKEN\"]) &&\n endpoints.adminInboundUrl === `${baseUrl}/crabline/discord/inbound` &&\n endpoints.apiRoot === `${baseUrl}/api` &&\n endpoints.gatewayBotUrl === `${baseUrl}/api/v10/gateway/bot` &&\n endpoints.gatewayUrl === `${baseUrl.replace(/^http/u, \"ws\")}/gateway` &&\n env.DISCORD_BOT_TOKEN === value.botToken\n );\n case \"mattermost\":\n return (\n hasNonEmptyStringFields(value, [\"botToken\", \"botUserId\"]) &&\n hasNonEmptyStringFields(endpoints, [\"adminInboundUrl\", \"apiRoot\", \"websocketUrl\"]) &&\n hasNonEmptyStringFields(env, [\"MATTERMOST_BOT_TOKEN\", \"MATTERMOST_URL\"]) &&\n endpoints.adminInboundUrl === `${baseUrl}/crabline/mattermost/inbound` &&\n endpoints.apiRoot === `${baseUrl}/api/v4` &&\n endpoints.websocketUrl === `${baseUrl.replace(/^http/u, \"ws\")}/api/v4/websocket` &&\n env.MATTERMOST_BOT_TOKEN === value.botToken &&\n env.MATTERMOST_URL === baseUrl\n );\n case \"matrix\":\n return (\n hasNonEmptyStringFields(value, [\"accessToken\", \"botUserId\", \"deviceId\"]) &&\n hasNonEmptyStringFields(endpoints, [\"adminInboundUrl\", \"clientApiRoot\", \"syncUrl\"]) &&\n hasNonEmptyStringFields(env, [\n \"MATRIX_ACCESS_TOKEN\",\n \"MATRIX_BASE_URL\",\n \"MATRIX_USER_ID\",\n ]) &&\n endpoints.adminInboundUrl === `${baseUrl}/crabline/matrix/inbound` &&\n endpoints.clientApiRoot === `${baseUrl}/_matrix/client/v3` &&\n endpoints.syncUrl === `${endpoints.clientApiRoot as string}/sync` &&\n env.MATRIX_ACCESS_TOKEN === value.accessToken &&\n env.MATRIX_BASE_URL === baseUrl &&\n env.MATRIX_USER_ID === value.botUserId\n );\n case \"signal\":\n return (\n hasNonEmptyStringFields(value, [\"account\"]) &&\n hasNonEmptyStringFields(endpoints, [\"adminInboundUrl\", \"apiRoot\", \"eventsUrl\", \"rpcUrl\"]) &&\n endpoints.adminInboundUrl === `${baseUrl}/crabline/signal/inbound` &&\n endpoints.apiRoot === baseUrl &&\n endpoints.eventsUrl === `${baseUrl}/api/v1/events` &&\n endpoints.rpcUrl === `${baseUrl}/api/v1/rpc` &&\n Object.keys(env).length === 0\n );\n case \"slack\":\n return (\n hasNonEmptyStringFields(value, [\"botToken\", \"signingSecret\"]) &&\n hasNonEmptyStringFields(endpoints, [\"adminInboundUrl\", \"apiRoot\", \"eventsUrl\"]) &&\n hasNonEmptyStringFields(env, [\n \"SLACK_API_URL\",\n \"SLACK_BOT_TOKEN\",\n \"SLACK_SIGNING_SECRET\",\n ]) &&\n endpoints.adminInboundUrl === `${baseUrl}/crabline/slack/inbound` &&\n endpoints.apiRoot === `${baseUrl}/api/` &&\n endpoints.eventsUrl === `${baseUrl}/slack/events` &&\n env.SLACK_API_URL === endpoints.apiRoot &&\n env.SLACK_BOT_TOKEN === value.botToken &&\n env.SLACK_SIGNING_SECRET === value.signingSecret\n );\n case \"telegram\":\n return (\n hasNonEmptyStringFields(value, [\"botToken\"]) &&\n hasNonEmptyStringFields(endpoints, [\"adminInboundUrl\", \"apiRoot\"]) &&\n hasNonEmptyStringFields(env, [\"TELEGRAM_BOT_TOKEN\"]) &&\n endpoints.adminInboundUrl === `${baseUrl}/crabline/telegram/inbound` &&\n endpoints.apiRoot === baseUrl &&\n env.TELEGRAM_BOT_TOKEN === value.botToken\n );\n case \"whatsapp\":\n return (\n hasNonEmptyStringFields(value, [\n \"accessToken\",\n \"graphVersion\",\n \"phoneNumberId\",\n \"selfJid\",\n ]) &&\n hasNonEmptyStringFields(endpoints, [\n \"adminInboundUrl\",\n \"apiRoot\",\n \"baileysWebSocketUrl\",\n \"messagesUrl\",\n \"phoneNumberUrl\",\n ]) &&\n hasNonEmptyStringFields(env, [\n \"CLOUD_API_ACCESS_TOKEN\",\n \"CLOUD_API_VERSION\",\n \"WA_BASE_URL\",\n \"WA_PHONE_NUMBER_ID\",\n ]) &&\n endpoints.adminInboundUrl === `${baseUrl}/_crabline/admin/whatsapp/inbound` &&\n endpoints.apiRoot === `${baseUrl}/${value.graphVersion as string}` &&\n endpoints.phoneNumberUrl ===\n `${endpoints.apiRoot as string}/${value.phoneNumberId as string}` &&\n endpoints.messagesUrl === `${endpoints.phoneNumberUrl as string}/messages` &&\n endpoints.baileysWebSocketUrl ===\n `${baseUrl.replace(/^http/u, \"ws\")}/ws/chat?access_token=${encodeURIComponent(\n value.accessToken as string,\n )}` &&\n env.CLOUD_API_ACCESS_TOKEN === value.accessToken &&\n env.CLOUD_API_VERSION === value.graphVersion &&\n env.WA_BASE_URL === baseUrl &&\n env.WA_PHONE_NUMBER_ID === value.phoneNumberId\n );\n case \"zalo\":\n return (\n hasNonEmptyStringFields(value, [\"botId\", \"botToken\"]) &&\n hasNonEmptyStringFields(endpoints, [\"adminInboundUrl\", \"apiRoot\"]) &&\n hasNonEmptyStringFields(env, [\"ZALO_API_URL\", \"ZALO_BOT_TOKEN\"]) &&\n endpoints.adminInboundUrl === `${baseUrl}/crabline/zalo/inbound` &&\n endpoints.apiRoot === baseUrl &&\n env.ZALO_API_URL === baseUrl &&\n env.ZALO_BOT_TOKEN === value.botToken\n );\n default:\n return false;\n }\n}\n\nfunction isSuccessfulProbe(\n value: unknown,\n manifest: Record<string, unknown>,\n): value is Record<string, unknown> {\n if (!isRecord(value)) {\n return false;\n }\n switch (manifest.provider) {\n case \"discord\":\n return (\n value.id === manifest.botUserId &&\n value.bot === true &&\n typeof value.username === \"string\" &&\n value.username.trim().length > 0\n );\n case \"mattermost\":\n return (\n value.id === manifest.botUserId &&\n typeof value.username === \"string\" &&\n value.username.trim().length > 0 &&\n typeof value.update_at === \"number\" &&\n Number.isSafeInteger(value.update_at) &&\n value.update_at >= 0\n );\n case \"matrix\":\n return value.user_id === manifest.botUserId;\n case \"signal\":\n return (\n value.ok === true &&\n typeof value.status === \"number\" &&\n Number.isInteger(value.status) &&\n value.status >= 200 &&\n value.status < 300\n );\n case \"slack\":\n return value.ok === true;\n case \"telegram\": {\n const result = value.result;\n const tokenBotId =\n typeof manifest.botToken === \"string\"\n ? /^([1-9]\\d*):/u.exec(manifest.botToken)?.[1]\n : undefined;\n const expectedBotId = tokenBotId === undefined ? undefined : Number(tokenBotId);\n return (\n value.ok === true &&\n isRecord(result) &&\n typeof result.id === \"number\" &&\n Number.isSafeInteger(result.id) &&\n result.id > 0 &&\n Number.isSafeInteger(expectedBotId) &&\n result.id === expectedBotId &&\n result.is_bot === true &&\n typeof result.first_name === \"string\" &&\n result.first_name.length > 0\n );\n }\n case \"whatsapp\":\n return value.id === manifest.phoneNumberId;\n case \"zalo\":\n return value.ok === true && isRecord(value.result) && value.result.id === manifest.botId;\n default:\n return false;\n }\n}\n\nfunction isReadinessSection(\n value: unknown,\n manifest: Record<string, unknown>,\n manifestPath: string,\n requireCurrentFields: boolean,\n): value is Record<string, unknown> {\n if (!isRecord(value) || value.manifestPath !== manifestPath || !isRecord(value.result)) {\n return false;\n }\n const result = value.result;\n return (\n result.ok === true &&\n result.provider === manifest.provider &&\n isRecord(result.endpoints) &&\n isDeepStrictEqual(result.endpoints, manifest.endpoints) &&\n isSuccessfulProbe(result.probe, manifest) &&\n (!requireCurrentFields || (result.proof === \"provider-api-probe\" && result.ready === true))\n );\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 withPublishedRecorderPath(\n providerReadiness: Record<string, unknown>,\n recorderPath: string | undefined,\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 const publishedResult: Record<string, unknown> = {\n ...(result as Record<string, unknown>),\n };\n if (recorderPath === undefined) {\n delete publishedResult.recorderPath;\n } else {\n publishedResult.recorderPath = recorderPath;\n }\n return {\n ...providerReadiness,\n result: publishedResult,\n };\n}\n\nfunction parseArtifactPointer(contents: string): OpenClawCrablineArtifactPointer {\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch (error) {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\", { cause: error });\n }\n if (!isRecord(parsed)) {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\");\n }\n const value = parsed as Partial<OpenClawCrablineArtifactPointerBase> & {\n recorderSnapshotPath?: unknown;\n version?: unknown;\n };\n if (value.version !== 3) {\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 };\n if (\n typeof value.capabilityMatrixPath !== \"string\" ||\n value.capabilityMatrixPath !== expected.capabilityMatrixPath ||\n value.manifestPath !== expected.manifestPath ||\n value.providerReadinessArtifactPath !== expected.providerReadinessArtifactPath\n ) {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\");\n }\n if (value.recorderSnapshotPath !== null && typeof value.recorderSnapshotPath !== \"string\") {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\");\n }\n if (typeof value.recorderSnapshotPath === \"string\") {\n const recorderFileName = path.basename(value.recorderSnapshotPath);\n if (\n !recorderFileName.endsWith(\".jsonl\") ||\n value.recorderSnapshotPath !== generationArtifactPath(value.generation, recorderFileName)\n ) {\n throw new Error(\"OpenClaw Crabline artifact pointer is malformed.\");\n }\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,\n recorderSnapshotPath: value.recorderSnapshotPath as string | null,\n version: 3,\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 assertArtifactGenerationExists(\n outputDir: string,\n pointer: OpenClawCrablineArtifactPointer,\n): Promise<void> {\n const generationDirectory = path.resolve(\n outputDir,\n OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY,\n pointer.generation,\n );\n let currentGeneration: Awaited<ReturnType<typeof captureDirectoryIdentity>>;\n try {\n currentGeneration = await captureDirectoryIdentity(generationDirectory);\n } catch (error) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\", {\n cause: error,\n });\n }\n const assertGenerationIdentity = async (): Promise<void> => {\n try {\n await currentGeneration.assertIdentityAt();\n } catch (error) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\", {\n cause: error,\n });\n }\n };\n\n for (const artifactPath of [\n pointer.manifestPath,\n pointer.capabilityMatrixPath,\n pointer.providerReadinessArtifactPath,\n ]) {\n await assertGenerationIdentity();\n let stats: Awaited<ReturnType<typeof fs.lstat>>;\n try {\n stats = await fs.lstat(path.join(outputDir, artifactPath));\n } catch (error) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\", {\n cause: error,\n });\n }\n if (!stats.isFile()) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n await assertGenerationIdentity();\n }\n\n const readArtifactObject = async (artifactPath: string): Promise<Record<string, unknown>> => {\n try {\n await assertGenerationIdentity();\n const value = JSON.parse(await fs.readFile(path.join(outputDir, artifactPath), \"utf8\"));\n await assertGenerationIdentity();\n if (!isRecord(value)) {\n throw new Error(\"artifact is not an object\");\n }\n return value;\n } catch (error) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\", {\n cause: error,\n });\n }\n };\n const readNestedRecorderPath = (value: Record<string, unknown>): string | undefined => {\n const result = value.result as Record<string, unknown>;\n const recorderPath = result.recorderPath;\n if (recorderPath !== undefined && typeof recorderPath !== \"string\") {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n return recorderPath;\n };\n\n const manifest = await readArtifactObject(pointer.manifestPath);\n const capabilityMatrix = await readArtifactObject(pointer.capabilityMatrixPath);\n const readiness = await readArtifactObject(pointer.providerReadinessArtifactPath);\n const providerReadiness = readiness.providerReadiness;\n if (\n !isGeneratedManifest(manifest) ||\n capabilityMatrix.version !== 1 ||\n capabilityMatrix.source !== \"openclaw/crabline\" ||\n capabilityMatrix.manifestPath !== pointer.manifestPath ||\n capabilityMatrix.channelDriver !== \"crabline\" ||\n typeof capabilityMatrix.selectedChannel !== \"string\" ||\n capabilityMatrix.selectedChannel.length === 0 ||\n capabilityMatrix.report === null ||\n typeof capabilityMatrix.report !== \"object\" ||\n Array.isArray(capabilityMatrix.report) ||\n readiness.version !== 2 ||\n readiness.source !== \"openclaw/crabline\" ||\n readiness.manifestPath !== pointer.manifestPath ||\n readiness.channelDriver !== \"crabline\" ||\n readiness.selectedChannel !== capabilityMatrix.selectedChannel ||\n manifest.provider !== readiness.selectedChannel ||\n !isReadinessSection(providerReadiness, manifest, pointer.manifestPath, true)\n ) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n const manifestRecorderPath =\n typeof manifest.recorderPath === \"string\" ? manifest.recorderPath : undefined;\n const providerReadinessRecorderPath = readNestedRecorderPath(providerReadiness);\n const recorderPaths = [manifestRecorderPath, providerReadinessRecorderPath];\n if (manifest.recorderPath !== undefined && typeof manifest.recorderPath !== \"string\") {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n if (pointer.recorderSnapshotPath === null) {\n if (recorderPaths.some((recorderPath) => recorderPath !== undefined)) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n return;\n }\n const resolvedRecorderPaths = recorderPaths.map((recorderPath) =>\n recorderPath === undefined ? undefined : path.resolve(outputDir, recorderPath),\n );\n if (\n resolvedRecorderPaths.some(\n (recorderPath) =>\n recorderPath === undefined || path.dirname(recorderPath) !== generationDirectory,\n ) ||\n new Set(resolvedRecorderPaths).size !== 1\n ) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n const recorderPath = resolvedRecorderPaths[0]!;\n if (\n pointer.recorderSnapshotPath !== null &&\n recorderPath !== path.resolve(outputDir, pointer.recorderSnapshotPath)\n ) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n try {\n await assertGenerationIdentity();\n const recorderStats = await fs.lstat(recorderPath, { bigint: true });\n if (recorderStats.isFile() && recorderStats.nlink === 1n) {\n await assertGenerationIdentity();\n return;\n }\n } catch (error) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\", {\n cause: error,\n });\n }\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n}\n\nasync function readValidCurrentArtifactGeneration(\n outputDir: string,\n initialPointer: OpenClawCrablineArtifactPointer,\n): Promise<OpenClawCrablineArtifactPointer> {\n let pointer = initialPointer;\n let lastValidationError: unknown;\n for (let attempt = 0; attempt < CURRENT_GENERATION_READ_ATTEMPTS; attempt += 1) {\n try {\n await assertArtifactGenerationExists(outputDir, pointer);\n lastValidationError = undefined;\n } catch (error) {\n lastValidationError = error;\n }\n\n const currentPointer = await readOpenClawCrablineArtifactPointer(outputDir);\n if (currentPointer === null || isDeepStrictEqual(currentPointer, pointer)) {\n if (lastValidationError !== undefined) {\n throw lastValidationError;\n }\n if (currentPointer === null) {\n throw new Error(\"OpenClaw Crabline current artifact generation is incomplete.\");\n }\n return pointer;\n }\n pointer = currentPointer;\n }\n\n throw new Error(\n \"OpenClaw Crabline current artifact generation changed too frequently to validate.\",\n lastValidationError === undefined ? undefined : { cause: lastValidationError },\n );\n}\n\nasync function pruneArtifactStore(params: {\n lock: OpenClawCrablineProviderReadinessLock;\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: OpenClawCrablineProviderReadinessLock;\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 let currentPointer = await readOpenClawCrablineArtifactPointer(outputDir);\n await output.assertIdentityAt();\n await store.assertIdentityAt();\n if (currentPointer) {\n currentPointer = await readValidCurrentArtifactGeneration(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 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 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 recorderSnapshotPath: recorderSnapshotPath ?? null,\n version: 3,\n };\n const publishedManifest = recorderSnapshotPath\n ? { ...params.manifest, recorderPath: recorderSnapshotPath }\n : Object.fromEntries(\n Object.entries(params.manifest).filter(([key]) => key !== \"recorderPath\"),\n );\n const providerReadinessBase = withPublishedRecorderPath(\n params.providerReadiness,\n recorderSnapshotPath,\n );\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: 2,\n source: \"openclaw/crabline\",\n channelDriver: params.selection.channelDriver,\n selectedChannel: params.selection.channel,\n manifestPath: pointer.manifestPath,\n 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 assertArtifactGenerationExists(outputDir, 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 ...(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"]}
@@ -0,0 +1 @@
1
+ export declare const DISCORD_OPENCLAW_CRABLINE_PROVIDER_BRIDGE: import("../shared.js").OpenClawCrablineProviderBridge<import("../../servers/discord.js").DiscordServerManifest>;
@@ -0,0 +1,149 @@
1
+ import { discordDirectChannelId } from "../../servers/discord.js";
2
+ import { createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readNonBlankString, readString, } from "../shared.js";
3
+ import { throwProbeHttpError } from "./probe-response.js";
4
+ const DISCORD_ID_PATTERN = /^\d{17,20}$/u;
5
+ function discordId(value, label) {
6
+ const id = value.trim();
7
+ if (!DISCORD_ID_PATTERN.test(id)) {
8
+ throw new Error(`${label} must be a Discord snowflake.`);
9
+ }
10
+ return id;
11
+ }
12
+ function providerTargetKey(channelId) {
13
+ return channelId;
14
+ }
15
+ export const DISCORD_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({
16
+ provider: "discord",
17
+ createAdapter(discord) {
18
+ return {
19
+ async probe(signal) {
20
+ const response = await fetch(`${discord.endpoints.apiRoot}/v10/users/@me`, {
21
+ headers: { authorization: `Bot ${discord.botToken}` },
22
+ ...(signal ? { signal } : {}),
23
+ });
24
+ if (!response.ok) {
25
+ await throwProbeHttpError(response, `Crabline Discord users/@me probe failed with HTTP ${response.status}.`);
26
+ }
27
+ const payload = await response.json();
28
+ if (!isRecord(payload) ||
29
+ readString(payload.id) !== discord.botUserId ||
30
+ payload.bot !== true ||
31
+ !readNonBlankString(payload.username)) {
32
+ throw new Error("Crabline Discord users/@me probe returned an unexpected bot user.");
33
+ }
34
+ return payload;
35
+ },
36
+ createBinding() {
37
+ return {
38
+ accountId: DEFAULT_ACCOUNT_ID,
39
+ channel: "discord",
40
+ createProviderReadinessEnv: (env) => ({ ...env, ...discord.env }),
41
+ createGatewayConfig: (openclawConfig = {}) => {
42
+ const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};
43
+ const discordConfig = isRecord(channels.discord) ? channels.discord : {};
44
+ const guilds = isRecord(discordConfig.guilds) ? discordConfig.guilds : {};
45
+ const wildcardGuild = isRecord(guilds["*"]) ? guilds["*"] : {};
46
+ const wildcardChannels = isRecord(wildcardGuild.channels) ? wildcardGuild.channels : {};
47
+ const wildcardChannel = isRecord(wildcardChannels["*"]) ? wildcardChannels["*"] : {};
48
+ return {
49
+ ...openclawConfig,
50
+ channels: {
51
+ ...channels,
52
+ discord: {
53
+ ...discordConfig,
54
+ applicationId: discord.applicationId,
55
+ dm: { enabled: true },
56
+ dmPolicy: "open",
57
+ enabled: true,
58
+ groupPolicy: "open",
59
+ guilds: {
60
+ ...guilds,
61
+ "*": {
62
+ ...wildcardGuild,
63
+ channels: {
64
+ ...wildcardChannels,
65
+ "*": {
66
+ ...wildcardChannel,
67
+ enabled: true,
68
+ requireMention: false,
69
+ },
70
+ },
71
+ },
72
+ },
73
+ replyToMode: "all",
74
+ streaming: { mode: "off" },
75
+ token: discord.botToken,
76
+ voice: { enabled: false },
77
+ },
78
+ },
79
+ };
80
+ },
81
+ requiredPluginIds: ["discord"],
82
+ };
83
+ },
84
+ createAgentDelivery(parsed) {
85
+ const id = discordId(parsed.id, "Discord target");
86
+ if (parsed.threadId) {
87
+ const threadId = discordId(parsed.threadId, "Discord thread");
88
+ const to = `channel:${threadId}`;
89
+ return { channel: "discord", replyChannel: "discord", replyTo: to, to };
90
+ }
91
+ const to = `${parsed.kind === "direct" ? "user" : "channel"}:${id}`;
92
+ return { channel: "discord", replyChannel: "discord", replyTo: to, to };
93
+ },
94
+ createInbound(input) {
95
+ const conversationId = discordId(input.conversation.id, "Discord conversation");
96
+ const senderId = discordId(input.senderId, "Discord sender");
97
+ const threadId = input.threadId ? discordId(input.threadId, "Discord thread") : undefined;
98
+ if (input.conversation.kind === "direct" && threadId) {
99
+ throw new Error("Discord direct messages do not support thread targets.");
100
+ }
101
+ const channelId = input.conversation.kind === "direct"
102
+ ? discordDirectChannelId(discord.botUserId, senderId)
103
+ : (threadId ?? conversationId);
104
+ return {
105
+ ...createAdminInboundRequest(discord),
106
+ providerBody: {
107
+ channelId,
108
+ content: input.text,
109
+ ...(input.conversation.kind === "group"
110
+ ? {
111
+ guildId: "135000000000000099",
112
+ ...(threadId ? { parentChannelId: conversationId } : {}),
113
+ }
114
+ : {}),
115
+ senderId,
116
+ ...(input.senderName ? { senderName: input.senderName } : {}),
117
+ },
118
+ providerTargetKey: providerTargetKey(channelId),
119
+ qaTarget: qaTargetForInbound(input),
120
+ stateConversation: { id: conversationId, kind: input.conversation.kind },
121
+ ...(threadId ? { threadId } : {}),
122
+ };
123
+ },
124
+ createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {
125
+ if (!isRecord(event) ||
126
+ event.type !== "api" ||
127
+ event.method !== "POST" ||
128
+ typeof event.path !== "string" ||
129
+ !isRecord(event.body)) {
130
+ return null;
131
+ }
132
+ const match = /^\/api\/v10\/channels\/(\d{17,20})\/messages$/u.exec(event.path);
133
+ const channelId = match?.[1];
134
+ const text = readNonBlankString(event.body.content);
135
+ if (!channelId || !text) {
136
+ return null;
137
+ }
138
+ return {
139
+ accountId: DEFAULT_ACCOUNT_ID,
140
+ senderId: discord.botUserId,
141
+ senderName: "OpenClaw QA",
142
+ text,
143
+ to: targetByProviderTarget.get(providerTargetKey(channelId)) ?? channelId,
144
+ };
145
+ },
146
+ };
147
+ },
148
+ });
149
+ //# sourceMappingURL=discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/discord.ts"],"names":[],"mappings":"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","sourcesContent":["import { discordDirectChannelId } from \"../../servers/discord.js\";\nimport {\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\nimport { throwProbeHttpError } from \"./probe-response.js\";\n\nconst DISCORD_ID_PATTERN = /^\\d{17,20}$/u;\n\nfunction discordId(value: string, label: string): string {\n const id = value.trim();\n if (!DISCORD_ID_PATTERN.test(id)) {\n throw new Error(`${label} must be a Discord snowflake.`);\n }\n return id;\n}\n\nfunction providerTargetKey(channelId: string): string {\n return channelId;\n}\n\nexport const DISCORD_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({\n provider: \"discord\",\n createAdapter(discord) {\n return {\n async probe(signal) {\n const response = await fetch(`${discord.endpoints.apiRoot}/v10/users/@me`, {\n headers: { authorization: `Bot ${discord.botToken}` },\n ...(signal ? { signal } : {}),\n });\n if (!response.ok) {\n await throwProbeHttpError(\n response,\n `Crabline Discord users/@me probe failed with HTTP ${response.status}.`,\n );\n }\n const payload: unknown = await response.json();\n if (\n !isRecord(payload) ||\n readString(payload.id) !== discord.botUserId ||\n payload.bot !== true ||\n !readNonBlankString(payload.username)\n ) {\n throw new Error(\"Crabline Discord users/@me probe returned an unexpected bot user.\");\n }\n return payload;\n },\n createBinding() {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n channel: \"discord\",\n createProviderReadinessEnv: (env) => ({ ...env, ...discord.env }),\n createGatewayConfig: (openclawConfig = {}) => {\n const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};\n const discordConfig = isRecord(channels.discord) ? channels.discord : {};\n const guilds = isRecord(discordConfig.guilds) ? discordConfig.guilds : {};\n const wildcardGuild = isRecord(guilds[\"*\"]) ? guilds[\"*\"] : {};\n const wildcardChannels = isRecord(wildcardGuild.channels) ? wildcardGuild.channels : {};\n const wildcardChannel = isRecord(wildcardChannels[\"*\"]) ? wildcardChannels[\"*\"] : {};\n return {\n ...openclawConfig,\n channels: {\n ...channels,\n discord: {\n ...discordConfig,\n applicationId: discord.applicationId,\n dm: { enabled: true },\n dmPolicy: \"open\",\n enabled: true,\n groupPolicy: \"open\",\n guilds: {\n ...guilds,\n \"*\": {\n ...wildcardGuild,\n channels: {\n ...wildcardChannels,\n \"*\": {\n ...wildcardChannel,\n enabled: true,\n requireMention: false,\n },\n },\n },\n },\n replyToMode: \"all\",\n streaming: { mode: \"off\" },\n token: discord.botToken,\n voice: { enabled: false },\n },\n },\n };\n },\n requiredPluginIds: [\"discord\"],\n };\n },\n createAgentDelivery(parsed) {\n const id = discordId(parsed.id, \"Discord target\");\n if (parsed.threadId) {\n const threadId = discordId(parsed.threadId, \"Discord thread\");\n const to = `channel:${threadId}`;\n return { channel: \"discord\", replyChannel: \"discord\", replyTo: to, to };\n }\n const to = `${parsed.kind === \"direct\" ? \"user\" : \"channel\"}:${id}`;\n return { channel: \"discord\", replyChannel: \"discord\", replyTo: to, to };\n },\n createInbound(input) {\n const conversationId = discordId(input.conversation.id, \"Discord conversation\");\n const senderId = discordId(input.senderId, \"Discord sender\");\n const threadId = input.threadId ? discordId(input.threadId, \"Discord thread\") : undefined;\n if (input.conversation.kind === \"direct\" && threadId) {\n throw new Error(\"Discord direct messages do not support thread targets.\");\n }\n const channelId =\n input.conversation.kind === \"direct\"\n ? discordDirectChannelId(discord.botUserId, senderId)\n : (threadId ?? conversationId);\n return {\n ...createAdminInboundRequest(discord),\n providerBody: {\n channelId,\n content: input.text,\n ...(input.conversation.kind === \"group\"\n ? {\n guildId: \"135000000000000099\",\n ...(threadId ? { parentChannelId: conversationId } : {}),\n }\n : {}),\n senderId,\n ...(input.senderName ? { senderName: input.senderName } : {}),\n },\n providerTargetKey: providerTargetKey(channelId),\n qaTarget: qaTargetForInbound(input),\n stateConversation: { id: conversationId, kind: input.conversation.kind },\n ...(threadId ? { threadId } : {}),\n };\n },\n createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {\n if (\n !isRecord(event) ||\n event.type !== \"api\" ||\n event.method !== \"POST\" ||\n typeof event.path !== \"string\" ||\n !isRecord(event.body)\n ) {\n return null;\n }\n const match = /^\\/api\\/v10\\/channels\\/(\\d{17,20})\\/messages$/u.exec(event.path);\n const channelId = match?.[1];\n const text = readNonBlankString(event.body.content);\n if (!channelId || !text) {\n return null;\n }\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n senderId: discord.botUserId,\n senderName: \"OpenClaw QA\",\n text,\n to: targetByProviderTarget.get(providerTargetKey(channelId)) ?? channelId,\n };\n },\n };\n },\n});\n"]}
@@ -1,5 +1,7 @@
1
1
  import { isIP } from "node:net";
2
+ import { isMatrixEventId } from "../../matrix-ids.js";
2
3
  import { canonicalConversationIdForInbound, createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readNonBlankString, readString, } from "../shared.js";
4
+ import { throwProbeHttpError } from "./probe-response.js";
3
5
  const MAX_MATRIX_IDENTIFIER_BYTES = 255;
4
6
  function isMatrixIpv4Address(value) {
5
7
  const octets = value.split(".");
@@ -67,9 +69,20 @@ function matrixRoomId(value) {
67
69
  function targetKey(roomId, threadId) {
68
70
  return threadId ? `${roomId}:thread:${threadId}` : roomId;
69
71
  }
72
+ function matrixThreadId(value) {
73
+ const trimmed = value.trim();
74
+ if (!isMatrixEventId(trimmed)) {
75
+ throw new Error("Matrix thread IDs must be native event IDs.");
76
+ }
77
+ return trimmed;
78
+ }
70
79
  function eventThreadId(content) {
71
80
  const relation = isRecord(content["m.relates_to"]) ? content["m.relates_to"] : undefined;
72
- return relation?.rel_type === "m.thread" ? readString(relation.event_id) : undefined;
81
+ if (relation?.rel_type !== "m.thread") {
82
+ return undefined;
83
+ }
84
+ const eventId = readString(relation.event_id);
85
+ return eventId && isMatrixEventId(eventId) ? eventId : null;
73
86
  }
74
87
  const MAX_DELIVERED_MATRIX_TRANSACTIONS = 1_000;
75
88
  export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({
@@ -83,7 +96,7 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
83
96
  ...(signal ? { signal } : {}),
84
97
  });
85
98
  if (!response.ok) {
86
- throw new Error(`Crabline Matrix probe failed with HTTP ${response.status}.`);
99
+ await throwProbeHttpError(response, `Crabline Matrix probe failed with HTTP ${response.status}.`);
87
100
  }
88
101
  const payload = await response.json();
89
102
  if (!isRecord(payload) || readString(payload.user_id) !== matrix.botUserId) {
@@ -95,7 +108,7 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
95
108
  return {
96
109
  accountId: DEFAULT_ACCOUNT_ID,
97
110
  channel: "matrix",
98
- createChannelDriverSmokeEnv: (env) => ({ ...env, ...matrix.env }),
111
+ createProviderReadinessEnv: (env) => ({ ...env, ...matrix.env }),
99
112
  createGatewayConfig: (openclawConfig = {}) => {
100
113
  const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};
101
114
  const matrixConfig = isRecord(channels.matrix) ? channels.matrix : {};
@@ -145,7 +158,8 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
145
158
  },
146
159
  createInbound(input) {
147
160
  const roomId = matrixRoomId(canonicalConversationIdForInbound(input));
148
- const threadId = input.threadId?.trim() || undefined;
161
+ const rawThreadId = input.threadId?.trim();
162
+ const threadId = rawThreadId ? matrixThreadId(rawThreadId) : undefined;
149
163
  const direct = input.conversation.kind === "direct";
150
164
  return {
151
165
  ...createAdminInboundRequest(matrix),
@@ -201,6 +215,9 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
201
215
  return null;
202
216
  }
203
217
  const threadId = eventThreadId(event.body);
218
+ if (threadId === null) {
219
+ return null;
220
+ }
204
221
  deliveredTransactions.add(transactionKey);
205
222
  if (deliveredTransactions.size > MAX_DELIVERED_MATRIX_TRANSACTIONS) {
206
223
  deliveredTransactions.delete(deliveredTransactions.values().next().value);
@@ -210,7 +227,7 @@ export const MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablinePr
210
227
  senderId: matrix.botUserId,
211
228
  senderName: "OpenClaw QA",
212
229
  text,
213
- to: targetByProviderTarget.get(targetKey(roomId, threadId)) ?? roomId,
230
+ to: targetByProviderTarget.get(targetKey(roomId, threadId)) ?? targetKey(roomId, threadId),
214
231
  };
215
232
  },
216
233
  };
@@ -1 +1 @@
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
+ {"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 { isMatrixEventId } from \"../../matrix-ids.js\";\nimport {\n canonicalConversationIdForInbound,\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\nimport { throwProbeHttpError } from \"./probe-response.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 matrixThreadId(value: string): string {\n const trimmed = value.trim();\n if (!isMatrixEventId(trimmed)) {\n throw new Error(\"Matrix thread IDs must be native event IDs.\");\n }\n return trimmed;\n}\n\nfunction eventThreadId(content: Record<string, unknown>): string | null | undefined {\n const relation = isRecord(content[\"m.relates_to\"]) ? content[\"m.relates_to\"] : undefined;\n if (relation?.rel_type !== \"m.thread\") {\n return undefined;\n }\n const eventId = readString(relation.event_id);\n return eventId && isMatrixEventId(eventId) ? eventId : null;\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 await throwProbeHttpError(\n response,\n `Crabline Matrix probe failed with HTTP ${response.status}.`,\n );\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 createProviderReadinessEnv: (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 rawThreadId = input.threadId?.trim();\n const threadId = rawThreadId ? matrixThreadId(rawThreadId) : 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 if (threadId === null) {\n return null;\n }\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:\n targetByProviderTarget.get(targetKey(roomId, threadId)) ?? targetKey(roomId, threadId),\n };\n },\n };\n },\n});\n"]}