@openclaw/crabline 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/README.md +47 -22
  2. package/assets/crabline-banner.svg +20 -0
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +25 -1
  5. package/dist/src/cli/program.js +579 -82
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +59 -6
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +116 -92
  10. package/dist/src/config/schema.js +179 -73
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.js +9 -2
  13. package/dist/src/core/errors.js.map +1 -1
  14. package/dist/src/core/exit-codes.js.map +1 -1
  15. package/dist/src/core/matcher.js +7 -6
  16. package/dist/src/core/matcher.js.map +1 -1
  17. package/dist/src/core/message-template.js.map +1 -1
  18. package/dist/src/core/nonces.d.ts +1 -0
  19. package/dist/src/core/nonces.js +4 -2
  20. package/dist/src/core/nonces.js.map +1 -1
  21. package/dist/src/core/reporters.d.ts +1 -0
  22. package/dist/src/core/reporters.js +42 -4
  23. package/dist/src/core/reporters.js.map +1 -1
  24. package/dist/src/core/run.d.ts +3 -0
  25. package/dist/src/core/run.js +415 -107
  26. package/dist/src/core/run.js.map +1 -1
  27. package/dist/src/core/safe-regex.d.ts +3 -0
  28. package/dist/src/core/safe-regex.js +21 -0
  29. package/dist/src/core/safe-regex.js.map +1 -0
  30. package/dist/src/index.d.ts +2 -2
  31. package/dist/src/index.js +1 -1
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/openclaw/artifact-generation.d.ts +43 -0
  34. package/dist/src/openclaw/artifact-generation.js +363 -0
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -0
  36. package/dist/src/openclaw/bridges/matrix.js +97 -12
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +32 -10
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/signal.js +55 -18
  41. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  42. package/dist/src/openclaw/bridges/slack.js +85 -7
  43. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  44. package/dist/src/openclaw/bridges/telegram.js +124 -30
  45. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  46. package/dist/src/openclaw/bridges/whatsapp.js +78 -17
  47. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  48. package/dist/src/openclaw/bridges/zalo.js +14 -5
  49. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  50. package/dist/src/openclaw/outbound-contract.d.ts +5 -0
  51. package/dist/src/openclaw/outbound-contract.js +40 -0
  52. package/dist/src/openclaw/outbound-contract.js.map +1 -0
  53. package/dist/src/openclaw/private-file.d.ts +28 -0
  54. package/dist/src/openclaw/private-file.js +465 -0
  55. package/dist/src/openclaw/private-file.js.map +1 -0
  56. package/dist/src/openclaw/shared.d.ts +21 -2
  57. package/dist/src/openclaw/shared.js +115 -18
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +63 -0
  60. package/dist/src/openclaw/smoke-lock.js +1004 -0
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -0
  62. package/dist/src/openclaw.d.ts +16 -8
  63. package/dist/src/openclaw.js +334 -52
  64. package/dist/src/openclaw.js.map +1 -1
  65. package/dist/src/providers/builtin/discord.d.ts +10 -1
  66. package/dist/src/providers/builtin/discord.js +144 -18
  67. package/dist/src/providers/builtin/discord.js.map +1 -1
  68. package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
  69. package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
  70. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
  71. package/dist/src/providers/builtin/feishu.d.ts +19 -2
  72. package/dist/src/providers/builtin/feishu.js +307 -25
  73. package/dist/src/providers/builtin/feishu.js.map +1 -1
  74. package/dist/src/providers/builtin/googlechat.d.ts +20 -1
  75. package/dist/src/providers/builtin/googlechat.js +178 -19
  76. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  77. package/dist/src/providers/builtin/imessage.d.ts +4 -0
  78. package/dist/src/providers/builtin/imessage.js +26 -11
  79. package/dist/src/providers/builtin/imessage.js.map +1 -1
  80. package/dist/src/providers/builtin/loopback.js +92 -30
  81. package/dist/src/providers/builtin/loopback.js.map +1 -1
  82. package/dist/src/providers/builtin/matrix.d.ts +11 -1
  83. package/dist/src/providers/builtin/matrix.js +53 -29
  84. package/dist/src/providers/builtin/matrix.js.map +1 -1
  85. package/dist/src/providers/builtin/mattermost.d.ts +10 -0
  86. package/dist/src/providers/builtin/mattermost.js +38 -15
  87. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  88. package/dist/src/providers/builtin/msteams.d.ts +17 -1
  89. package/dist/src/providers/builtin/msteams.js +113 -14
  90. package/dist/src/providers/builtin/msteams.js.map +1 -1
  91. package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
  92. package/dist/src/providers/builtin/native-local-mock.js +12 -35
  93. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  94. package/dist/src/providers/builtin/script.d.ts +11 -15
  95. package/dist/src/providers/builtin/script.js +566 -104
  96. package/dist/src/providers/builtin/script.js.map +1 -1
  97. package/dist/src/providers/builtin/slack.d.ts +6 -0
  98. package/dist/src/providers/builtin/slack.js +99 -40
  99. package/dist/src/providers/builtin/slack.js.map +1 -1
  100. package/dist/src/providers/builtin/telegram.d.ts +6 -0
  101. package/dist/src/providers/builtin/telegram.js +64 -43
  102. package/dist/src/providers/builtin/telegram.js.map +1 -1
  103. package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
  104. package/dist/src/providers/builtin/whatsapp.js +567 -30
  105. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  106. package/dist/src/providers/builtin/zalo.js +30 -19
  107. package/dist/src/providers/builtin/zalo.js.map +1 -1
  108. package/dist/src/providers/catalog.d.ts +3 -3
  109. package/dist/src/providers/catalog.js +3 -3
  110. package/dist/src/providers/catalog.js.map +1 -1
  111. package/dist/src/providers/local-mock.d.ts +11 -2
  112. package/dist/src/providers/local-mock.js +322 -96
  113. package/dist/src/providers/local-mock.js.map +1 -1
  114. package/dist/src/providers/native-ids.d.ts +1 -0
  115. package/dist/src/providers/native-ids.js +6 -1
  116. package/dist/src/providers/native-ids.js.map +1 -1
  117. package/dist/src/providers/recorder.d.ts +30 -2
  118. package/dist/src/providers/recorder.js +549 -70
  119. package/dist/src/providers/recorder.js.map +1 -1
  120. package/dist/src/providers/registry.d.ts +25 -1
  121. package/dist/src/providers/registry.js +280 -40
  122. package/dist/src/providers/registry.js.map +1 -1
  123. package/dist/src/providers/signed-jwt.d.ts +29 -0
  124. package/dist/src/providers/signed-jwt.js +202 -0
  125. package/dist/src/providers/signed-jwt.js.map +1 -0
  126. package/dist/src/providers/slack-ids.js.map +1 -1
  127. package/dist/src/providers/target-normalizers.d.ts +26 -0
  128. package/dist/src/providers/target-normalizers.js +276 -0
  129. package/dist/src/providers/target-normalizers.js.map +1 -0
  130. package/dist/src/providers/types.d.ts +5 -0
  131. package/dist/src/providers/types.js.map +1 -1
  132. package/dist/src/providers/webhook-server.d.ts +2 -0
  133. package/dist/src/providers/webhook-server.js +72 -25
  134. package/dist/src/providers/webhook-server.js.map +1 -1
  135. package/dist/src/servers/http.d.ts +23 -3
  136. package/dist/src/servers/http.js +213 -20
  137. package/dist/src/servers/http.js.map +1 -1
  138. package/dist/src/servers/index.js +20 -21
  139. package/dist/src/servers/index.js.map +1 -1
  140. package/dist/src/servers/matrix.js +465 -51
  141. package/dist/src/servers/matrix.js.map +1 -1
  142. package/dist/src/servers/mattermost.d.ts +5 -0
  143. package/dist/src/servers/mattermost.js +306 -58
  144. package/dist/src/servers/mattermost.js.map +1 -1
  145. package/dist/src/servers/pending-events.d.ts +2 -0
  146. package/dist/src/servers/pending-events.js +11 -0
  147. package/dist/src/servers/pending-events.js.map +1 -0
  148. package/dist/src/servers/recorder.d.ts +5 -0
  149. package/dist/src/servers/recorder.js +262 -3
  150. package/dist/src/servers/recorder.js.map +1 -1
  151. package/dist/src/servers/signal.d.ts +2 -0
  152. package/dist/src/servers/signal.js +444 -56
  153. package/dist/src/servers/signal.js.map +1 -1
  154. package/dist/src/servers/slack.d.ts +5 -0
  155. package/dist/src/servers/slack.js +515 -49
  156. package/dist/src/servers/slack.js.map +1 -1
  157. package/dist/src/servers/telegram.d.ts +111 -0
  158. package/dist/src/servers/telegram.js +830 -158
  159. package/dist/src/servers/telegram.js.map +1 -1
  160. package/dist/src/servers/webhook-target.d.ts +40 -0
  161. package/dist/src/servers/webhook-target.js +349 -0
  162. package/dist/src/servers/webhook-target.js.map +1 -0
  163. package/dist/src/servers/websocket.d.ts +2 -0
  164. package/dist/src/servers/websocket.js +29 -0
  165. package/dist/src/servers/websocket.js.map +1 -0
  166. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
  167. package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
  168. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  169. package/dist/src/servers/whatsapp-jid.d.ts +5 -0
  170. package/dist/src/servers/whatsapp-jid.js +32 -0
  171. package/dist/src/servers/whatsapp-jid.js.map +1 -0
  172. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
  173. package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
  174. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  175. package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
  176. package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
  177. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  178. package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
  179. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  181. package/dist/src/servers/whatsapp.d.ts +12 -7
  182. package/dist/src/servers/whatsapp.js +269 -107
  183. package/dist/src/servers/whatsapp.js.map +1 -1
  184. package/dist/src/servers/zalo.d.ts +14 -0
  185. package/dist/src/servers/zalo.js +521 -88
  186. package/dist/src/servers/zalo.js.map +1 -1
  187. package/docs/channel-setup.md +197 -19
  188. package/fixtures/examples/crabline.example.yaml +10 -0
  189. package/package.json +20 -15
@@ -1,3 +1,4 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import { CRABLINE_SERVER_CHANNELS, isCrablineServerChannel, startCrablineServer, } from "./servers/index.js";
2
3
  import { SLACK_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/slack.js";
3
4
  import { MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/mattermost.js";
@@ -6,10 +7,14 @@ import { SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/sig
6
7
  import { TELEGRAM_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/telegram.js";
7
8
  import { WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/whatsapp.js";
8
9
  import { ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/zalo.js";
9
- import { OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, parseQaTarget, } from "./openclaw/shared.js";
10
+ import { OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_MANIFEST_PATH, parseQaTarget, runOpenClawCrablineProviderProbe, } from "./openclaw/shared.js";
11
+ import { publishOpenClawCrablineArtifactGeneration } from "./openclaw/artifact-generation.js";
12
+ import { isAcceptedOpenClawCrablineOutbound } from "./openclaw/outbound-contract.js";
13
+ import { syncParentDirectory } from "./openclaw/private-file.js";
14
+ import { acquireOpenClawCrablineSmokeRunLock, releaseOpenClawCrablineSmokeRunLock, } from "./openclaw/smoke-lock.js";
10
15
  import fs from "node:fs/promises";
11
16
  import path from "node:path";
12
- export { OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, };
17
+ export { OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, };
13
18
  const OPENCLAW_CRABLINE_PROVIDER_BRIDGES = {
14
19
  mattermost: MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
15
20
  matrix: MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
@@ -20,15 +25,103 @@ const OPENCLAW_CRABLINE_PROVIDER_BRIDGES = {
20
25
  zalo: ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
21
26
  };
22
27
  const OPENCLAW_CRABLINE_PROVIDER_BRIDGE_LIST = Object.values(OPENCLAW_CRABLINE_PROVIDER_BRIDGES);
28
+ const RECORDER_TEMP_NAME_PATTERN = /^\.([a-z]+)-fake-provider\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.jsonl\.tmp$/iu;
29
+ const RECORDER_LOCK_REMOVAL_TOMBSTONE_PATTERN = /^\.(.+)\.\d+\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.remove$/iu;
30
+ function isOpenClawCrablineRecorderTemporary(name) {
31
+ const channel = RECORDER_TEMP_NAME_PATTERN.exec(name)?.[1]?.toLowerCase();
32
+ return channel !== undefined && isCrablineServerChannel(channel);
33
+ }
34
+ function isOpenClawCrablineRecorderTemporaryLock(name) {
35
+ return name.endsWith(".lock") && isOpenClawCrablineRecorderTemporary(name.slice(0, -5));
36
+ }
37
+ function openClawCrablineRecorderLockTombstoneBaseName(name) {
38
+ const originalName = RECORDER_LOCK_REMOVAL_TOMBSTONE_PATTERN.exec(name)?.[1];
39
+ return originalName !== undefined && isOpenClawCrablineRecorderTemporaryLock(originalName)
40
+ ? originalName
41
+ : null;
42
+ }
43
+ async function reclaimOpenClawCrablineRecorderTemporaryLock(directoryPath, name, lock, quarantineBaseName = name) {
44
+ const lockPath = path.join(directoryPath, name);
45
+ let identity;
46
+ try {
47
+ identity = await fs.lstat(lockPath, { bigint: true });
48
+ }
49
+ catch (error) {
50
+ if (error.code === "ENOENT") {
51
+ return;
52
+ }
53
+ throw error;
54
+ }
55
+ if (!identity.isDirectory()) {
56
+ return;
57
+ }
58
+ const currentUserId = process.geteuid?.();
59
+ if (currentUserId !== undefined && identity.uid !== BigInt(currentUserId)) {
60
+ return;
61
+ }
62
+ const quarantinePath = path.join(directoryPath, `.${quarantineBaseName}.${process.pid}.${randomUUID()}.remove`);
63
+ await lock.assertOwned();
64
+ try {
65
+ await fs.rename(lockPath, quarantinePath);
66
+ }
67
+ catch (error) {
68
+ if (error.code === "ENOENT") {
69
+ return;
70
+ }
71
+ throw error;
72
+ }
73
+ const quarantined = await fs.lstat(quarantinePath, { bigint: true });
74
+ if (!quarantined.isDirectory() ||
75
+ quarantined.dev !== identity.dev ||
76
+ quarantined.ino !== identity.ino) {
77
+ throw new Error("OpenClaw Crabline recorder lock identity changed during recovery.");
78
+ }
79
+ await syncParentDirectory(quarantinePath);
80
+ await fs.rm(quarantinePath, { force: true, recursive: true });
81
+ await syncParentDirectory(quarantinePath);
82
+ }
83
+ async function reclaimOpenClawCrablineRecorderTemporaries(directoryPath, lock) {
84
+ for (const entry of await fs.readdir(directoryPath, { withFileTypes: true })) {
85
+ const tombstoneBaseName = entry.isDirectory()
86
+ ? openClawCrablineRecorderLockTombstoneBaseName(entry.name)
87
+ : null;
88
+ if (isOpenClawCrablineRecorderTemporaryLock(entry.name) || tombstoneBaseName !== null) {
89
+ if (entry.isDirectory()) {
90
+ await reclaimOpenClawCrablineRecorderTemporaryLock(directoryPath, entry.name, lock, tombstoneBaseName ?? entry.name);
91
+ }
92
+ continue;
93
+ }
94
+ if (!isOpenClawCrablineRecorderTemporary(entry.name) ||
95
+ (!entry.isFile() && !entry.isSymbolicLink())) {
96
+ continue;
97
+ }
98
+ await lock.assertOwned();
99
+ const temporaryPath = path.join(directoryPath, entry.name);
100
+ await fs.rm(temporaryPath, { force: true });
101
+ await syncParentDirectory(temporaryPath);
102
+ }
103
+ }
23
104
  function createOpenClawCrablineProviderAdapter(manifest) {
24
105
  const bridge = OPENCLAW_CRABLINE_PROVIDER_BRIDGE_LIST.find((candidate) => candidate.provider === manifest.provider);
25
106
  if (bridge) {
26
- return bridge.createAdapterFromManifest(manifest);
107
+ const adapter = bridge.createAdapterFromManifest(manifest);
108
+ return {
109
+ ...adapter,
110
+ createOutboundFromRecorderEvent: (params) => isAcceptedOpenClawCrablineOutbound({
111
+ event: params.event,
112
+ manifest,
113
+ })
114
+ ? adapter.createOutboundFromRecorderEvent(params)
115
+ : null,
116
+ probe: () => runOpenClawCrablineProviderProbe(manifest.provider, (signal) => adapter.probe(signal)),
117
+ };
27
118
  }
28
119
  throw new Error("Unsupported OpenClaw provider binding.");
29
120
  }
30
121
  export function resolveOpenClawCrablineChannel(input) {
31
- const channel = input?.trim().toLowerCase() || OPENCLAW_CRABLINE_DEFAULT_CHANNEL;
122
+ const channel = input === undefined || input === null
123
+ ? OPENCLAW_CRABLINE_DEFAULT_CHANNEL
124
+ : input.trim().toLowerCase();
32
125
  if (isCrablineServerChannel(channel)) {
33
126
  return channel;
34
127
  }
@@ -39,6 +132,7 @@ export function resolveOpenClawCrablineChannelDriverSelection(params) {
39
132
  channel: resolveOpenClawCrablineChannel(params.channel),
40
133
  channelDriver: "crabline",
41
134
  capabilityMatrixPath: OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,
135
+ providerReadinessArtifactPath: OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH,
42
136
  smokeArtifactPath: OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,
43
137
  };
44
138
  }
@@ -60,74 +154,262 @@ export function createOpenClawCrablineOutboundFromRecorderEvent(params) {
60
154
  targetByProviderTarget: params.targetByProviderTarget,
61
155
  });
62
156
  }
63
- export async function startOpenClawCrablineAdapter(params) {
64
- const server = await startCrablineServer({
157
+ export async function startOpenClawCrablineAdapter(params, dependencies = {}) {
158
+ const server = await (dependencies.startServer ?? startCrablineServer)({
65
159
  channel: params.channel,
66
160
  onEvent: params.onEvent,
67
161
  recorderPath: params.recorderPath,
68
162
  });
69
- const providerAdapter = createOpenClawCrablineProviderAdapter(server.manifest);
70
- const binding = providerAdapter.createBinding();
71
- return {
72
- ...binding,
73
- close: server.close,
74
- createGatewayConfig: (openclawConfig = params.openclawConfig ?? {}) => binding.createGatewayConfig(openclawConfig),
75
- createAgentDelivery: ({ target }) => providerAdapter.createAgentDelivery(parseQaTarget(target)),
76
- createInbound: ({ input }) => providerAdapter.createInbound(input),
77
- createOutboundFromRecorderEvent: ({ event, targetByProviderTarget }) => providerAdapter.createOutboundFromRecorderEvent({
78
- event,
79
- targetByProviderTarget,
80
- }),
81
- manifest: server.manifest,
82
- probe: () => providerAdapter.probe(),
83
- };
163
+ try {
164
+ const providerAdapter = (dependencies.createProviderAdapter ?? createOpenClawCrablineProviderAdapter)(server.manifest);
165
+ const binding = providerAdapter.createBinding();
166
+ return {
167
+ ...binding,
168
+ close: server.close,
169
+ createGatewayConfig: (openclawConfig = params.openclawConfig ?? {}) => binding.createGatewayConfig(openclawConfig),
170
+ createAgentDelivery: ({ target }) => providerAdapter.createAgentDelivery(parseQaTarget(target)),
171
+ createInbound: ({ input }) => providerAdapter.createInbound(input),
172
+ createOutboundFromRecorderEvent: ({ event, targetByProviderTarget }) => providerAdapter.createOutboundFromRecorderEvent({
173
+ event,
174
+ targetByProviderTarget,
175
+ }),
176
+ manifest: server.manifest,
177
+ probe: () => providerAdapter.probe(),
178
+ };
179
+ }
180
+ catch (error) {
181
+ try {
182
+ await server.close();
183
+ }
184
+ catch (closeError) {
185
+ const aggregateError = new AggregateError([error, closeError], "OpenClaw Crabline adapter startup failed.");
186
+ aggregateError.cause = error;
187
+ throw aggregateError;
188
+ }
189
+ throw error;
190
+ }
84
191
  }
85
- export async function runOpenClawCrablineChannelDriverSmoke(params) {
86
- const manifestPath = path.join(params.outputDir, OPENCLAW_CRABLINE_MANIFEST_PATH);
87
- const recorderPath = path.join(params.outputDir, "artifacts", "crabline", `${params.selection.channel}-fake-provider.jsonl`);
88
- await fs.mkdir(path.dirname(recorderPath), { recursive: true });
89
- const adapter = await startOpenClawCrablineAdapter({
192
+ export async function runOpenClawCrablineProviderReadiness(params, dependencies = {}) {
193
+ const outputDir = path.resolve(params.outputDir);
194
+ const releaseLock = dependencies.releaseLock ?? releaseOpenClawCrablineSmokeRunLock;
195
+ const smokeLock = await (dependencies.acquireLock ?? acquireOpenClawCrablineSmokeRunLock)({
90
196
  channel: params.selection.channel,
91
- openclawConfig: {},
92
- recorderPath,
197
+ outputDir,
93
198
  });
199
+ let outcome;
200
+ let recorderPath;
94
201
  try {
95
- await fs.writeFile(manifestPath, `${JSON.stringify(adapter.manifest, null, 2)}\n`, "utf8");
96
- const probe = await adapter.probe();
97
- return {
98
- capabilityReport: {
99
- result: {
100
- driver: "crabline",
101
- selectedChannel: params.selection.channel,
102
- supportedChannels: [...CRABLINE_SERVER_CHANNELS],
103
- },
202
+ const recorderDirectory = path.join(outputDir, "artifacts", "crabline");
203
+ await fs.mkdir(recorderDirectory, { recursive: true });
204
+ await reclaimOpenClawCrablineRecorderTemporaries(recorderDirectory, smokeLock);
205
+ recorderPath = path.join(recorderDirectory, `.${params.selection.channel}-fake-provider.${randomUUID()}.jsonl.tmp`);
206
+ const adapter = await (dependencies.startAdapter ?? startOpenClawCrablineAdapter)({
207
+ channel: params.selection.channel,
208
+ openclawConfig: {},
209
+ recorderPath,
210
+ });
211
+ let probe;
212
+ let probeFailed = false;
213
+ let probeFailure;
214
+ try {
215
+ probe = await adapter.probe();
216
+ }
217
+ catch (error) {
218
+ probeFailed = true;
219
+ probeFailure = error;
220
+ }
221
+ try {
222
+ await adapter.close();
223
+ }
224
+ catch (cleanupError) {
225
+ if (!probeFailed) {
226
+ throw cleanupError;
227
+ }
228
+ if (probeFailure instanceof Error) {
229
+ const existingCause = probeFailure.cause;
230
+ try {
231
+ Object.defineProperty(probeFailure, "cause", {
232
+ configurable: true,
233
+ value: existingCause === undefined
234
+ ? cleanupError
235
+ : new AggregateError([existingCause, cleanupError], "OpenClaw Crabline provider probe cleanup also failed."),
236
+ });
237
+ }
238
+ catch {
239
+ // Some provider errors are frozen; preserving the primary failure is authoritative.
240
+ }
241
+ throw probeFailure;
242
+ }
243
+ const combinedError = new Error("OpenClaw Crabline provider probe and cleanup both failed.", {
244
+ cause: cleanupError,
245
+ });
246
+ Object.defineProperty(combinedError, "errors", {
247
+ value: [probeFailure, cleanupError],
248
+ });
249
+ throw combinedError;
250
+ }
251
+ if (probeFailed) {
252
+ throw probeFailure;
253
+ }
254
+ let recorderSnapshotContents = "";
255
+ try {
256
+ recorderSnapshotContents = await fs.readFile(recorderPath, "utf8");
257
+ }
258
+ catch (error) {
259
+ if (error.code !== "ENOENT") {
260
+ throw error;
261
+ }
262
+ }
263
+ const capabilityReport = {
264
+ result: {
265
+ driver: "crabline",
266
+ selectedChannel: params.selection.channel,
267
+ supportedChannels: [...CRABLINE_SERVER_CHANNELS],
104
268
  },
105
- manifestPath: path.basename(manifestPath),
106
- smoke: {
107
- manifestPath: path.basename(manifestPath),
108
- result: {
109
- ok: true,
110
- probe,
111
- provider: adapter.manifest.provider,
112
- endpoints: adapter.manifest.endpoints,
113
- recorderPath: path.relative(params.outputDir, adapter.manifest.recorderPath),
114
- },
269
+ };
270
+ const providerReadiness = {
271
+ result: {
272
+ ok: true,
273
+ proof: "provider-api-probe",
274
+ ready: true,
275
+ probe,
276
+ provider: adapter.manifest.provider,
277
+ endpoints: adapter.manifest.endpoints,
278
+ recorderPath: path.relative(outputDir, adapter.manifest.recorderPath),
115
279
  },
116
280
  };
281
+ const generation = await (dependencies.publishGeneration ?? publishOpenClawCrablineArtifactGeneration)({
282
+ capabilityReport,
283
+ lock: smokeLock,
284
+ manifest: adapter.manifest,
285
+ outputDir,
286
+ recorderSnapshot: {
287
+ contents: recorderSnapshotContents,
288
+ fileName: `${params.selection.channel}-fake-provider.jsonl`,
289
+ },
290
+ selection: params.selection,
291
+ providerReadiness,
292
+ });
293
+ let recorderCleanupWarning;
294
+ try {
295
+ await fs.rm(recorderPath, { force: true });
296
+ recorderPath = undefined;
297
+ }
298
+ catch (error) {
299
+ const detail = error instanceof Error ? error.message : String(error);
300
+ recorderCleanupWarning = `OpenClaw Crabline recorder snapshot committed but temporary cleanup failed: ${detail}`;
301
+ }
302
+ outcome = {
303
+ committed: true,
304
+ result: {
305
+ artifactPointerPath: generation.pointerPath,
306
+ capabilityReport,
307
+ capabilityMatrixPath: generation.capabilityMatrixPath,
308
+ generation: generation.generation,
309
+ manifestPath: generation.manifestPath,
310
+ providerReadiness: generation.providerReadiness,
311
+ providerReadinessArtifactPath: generation.providerReadinessArtifactPath,
312
+ smoke: generation.providerReadiness,
313
+ smokeArtifactPath: generation.providerReadinessArtifactPath,
314
+ ...(generation.warnings || recorderCleanupWarning
315
+ ? {
316
+ warnings: [
317
+ ...(generation.warnings ?? []),
318
+ ...(recorderCleanupWarning ? [recorderCleanupWarning] : []),
319
+ ],
320
+ }
321
+ : {}),
322
+ },
323
+ };
324
+ }
325
+ catch (error) {
326
+ let primaryError = error;
327
+ if (recorderPath) {
328
+ try {
329
+ await fs.rm(recorderPath, { force: true });
330
+ recorderPath = undefined;
331
+ }
332
+ catch (cleanupError) {
333
+ if (primaryError instanceof Error) {
334
+ const existingCause = primaryError.cause;
335
+ try {
336
+ Object.defineProperty(primaryError, "cause", {
337
+ configurable: true,
338
+ value: existingCause === undefined
339
+ ? cleanupError
340
+ : new AggregateError([existingCause, cleanupError], "OpenClaw Crabline readiness failure cleanup also failed."),
341
+ });
342
+ }
343
+ catch {
344
+ // Frozen failures remain authoritative even if temporary cleanup also fails.
345
+ }
346
+ }
347
+ else {
348
+ const combinedError = new Error("OpenClaw Crabline readiness and temporary cleanup both failed.", { cause: cleanupError });
349
+ Object.defineProperty(combinedError, "errors", {
350
+ value: [primaryError, cleanupError],
351
+ });
352
+ primaryError = combinedError;
353
+ }
354
+ }
355
+ }
356
+ outcome = { committed: false, error: primaryError };
357
+ }
358
+ try {
359
+ await releaseLock(smokeLock);
360
+ }
361
+ catch (cleanupError) {
362
+ // The pointer switch is authoritative; lock removal cannot roll it back.
363
+ if (!outcome.committed) {
364
+ if (outcome.error instanceof Error) {
365
+ const existingCause = outcome.error.cause;
366
+ try {
367
+ Object.defineProperty(outcome.error, "cause", {
368
+ configurable: true,
369
+ value: existingCause === undefined
370
+ ? cleanupError
371
+ : new AggregateError([existingCause, cleanupError], "OpenClaw Crabline smoke failure cleanup also failed."),
372
+ });
373
+ }
374
+ catch {
375
+ // Some failures are frozen; preserving the primary error is authoritative.
376
+ }
377
+ throw outcome.error;
378
+ }
379
+ const combinedError = new Error("OpenClaw Crabline smoke and lock cleanup both failed.", {
380
+ cause: cleanupError,
381
+ });
382
+ Object.defineProperty(combinedError, "errors", {
383
+ value: [outcome.error, cleanupError],
384
+ });
385
+ throw combinedError;
386
+ }
387
+ const detail = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
388
+ outcome.result = {
389
+ ...outcome.result,
390
+ warnings: [
391
+ ...(outcome.result.warnings ?? []),
392
+ `OpenClaw Crabline smoke committed but lock cleanup failed: ${detail}`,
393
+ ],
394
+ };
117
395
  }
118
- finally {
119
- await adapter.close();
396
+ if (!outcome.committed) {
397
+ throw outcome.error;
120
398
  }
399
+ return outcome.result;
121
400
  }
401
+ /** @deprecated Use runOpenClawCrablineProviderReadiness. */
402
+ export const runOpenClawCrablineChannelDriverSmoke = runOpenClawCrablineProviderReadiness;
122
403
  export function createOpenClawCrablineChannelReportNotes(selection) {
123
404
  if (!selection) {
124
405
  return [];
125
406
  }
126
407
  return [
127
408
  `Channel driver: ${selection.channelDriver} local provider for ${selection.channel}.`,
128
- `Channel capability report: ${selection.capabilityMatrixPath}.`,
129
- `Channel driver smoke: ${selection.smokeArtifactPath}.`,
130
- "Crabline starts local provider-shaped servers; OpenClaw uses its normal channel adapter against those endpoints.",
409
+ `Channel artifact pointer: ${OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH}.`,
410
+ `Generation capability filename: ${selection.capabilityMatrixPath}.`,
411
+ `Generation provider-readiness filename: ${selection.providerReadinessArtifactPath ?? selection.smokeArtifactPath}.`,
412
+ "Crabline verifies the local provider API is ready; OpenClaw channel behavior is proven separately by QA scenarios that run the real channel adapter.",
131
413
  ];
132
414
  }
133
415
  //# sourceMappingURL=openclaw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/openclaw.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/openclaw.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { BigIntStats } from \"node:fs\";\nimport {\n CRABLINE_SERVER_CHANNELS,\n isCrablineServerChannel,\n startCrablineServer,\n type CrablineServerChannel,\n type CrablineServerManifest,\n type StartCrablineServerParams,\n type StartedCrablineServer,\n} from \"./servers/index.js\";\nimport { SLACK_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from \"./openclaw/bridges/slack.js\";\nimport { MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from \"./openclaw/bridges/mattermost.js\";\nimport { MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from \"./openclaw/bridges/matrix.js\";\nimport { SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from \"./openclaw/bridges/signal.js\";\nimport { TELEGRAM_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from \"./openclaw/bridges/telegram.js\";\nimport { WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from \"./openclaw/bridges/whatsapp.js\";\nimport { ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from \"./openclaw/bridges/zalo.js\";\nimport {\n OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,\n OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,\n OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH,\n OPENCLAW_CRABLINE_DEFAULT_CHANNEL,\n OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH,\n OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY,\n OPENCLAW_CRABLINE_MANIFEST_PATH,\n parseQaTarget,\n runOpenClawCrablineProviderProbe,\n type OpenClawCrablineAgentDelivery,\n type OpenClawCrablineChannelDriverSelection,\n type OpenClawCrablineProviderReadinessResult,\n type OpenClawCrablineGatewayBinding,\n type OpenClawCrablineInbound,\n type OpenClawCrablineInboundInput,\n type OpenClawCrablineOutboundMessage,\n type OpenClawCrablineProviderAdapter,\n type OpenClawCrablineProviderBridge,\n type OpenClawCrablineProviderBridgeRegistry,\n type StartedOpenClawCrablineAdapter,\n type StartOpenClawCrablineAdapterParams,\n} from \"./openclaw/shared.js\";\nimport { publishOpenClawCrablineArtifactGeneration } from \"./openclaw/artifact-generation.js\";\nimport { isAcceptedOpenClawCrablineOutbound } from \"./openclaw/outbound-contract.js\";\nimport { syncParentDirectory } from \"./openclaw/private-file.js\";\nimport {\n acquireOpenClawCrablineSmokeRunLock,\n releaseOpenClawCrablineSmokeRunLock,\n} from \"./openclaw/smoke-lock.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport {\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_DEFAULT_CHANNEL,\n OPENCLAW_CRABLINE_MANIFEST_PATH,\n};\nexport type {\n OpenClawCrablineAgentDelivery,\n OpenClawCrablineChannelDriverSelection,\n OpenClawCrablineChannelDriverSmokeResult,\n OpenClawCrablineProviderReadinessResult,\n OpenClawCrablineConversation,\n OpenClawCrablineGatewayBinding,\n OpenClawCrablineInbound,\n OpenClawCrablineInboundInput,\n OpenClawCrablineOutboundMessage,\n StartedOpenClawCrablineAdapter,\n StartOpenClawCrablineAdapterParams,\n} from \"./openclaw/shared.js\";\n\nconst OPENCLAW_CRABLINE_PROVIDER_BRIDGES = {\n mattermost: MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,\n matrix: MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,\n signal: SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,\n slack: SLACK_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,\n telegram: TELEGRAM_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,\n whatsapp: WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,\n zalo: ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,\n} satisfies OpenClawCrablineProviderBridgeRegistry;\n\nconst OPENCLAW_CRABLINE_PROVIDER_BRIDGE_LIST = Object.values(\n OPENCLAW_CRABLINE_PROVIDER_BRIDGES,\n) as readonly OpenClawCrablineProviderBridge[];\nconst RECORDER_TEMP_NAME_PATTERN =\n /^\\.([a-z]+)-fake-provider\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\.jsonl\\.tmp$/iu;\nconst RECORDER_LOCK_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;\n\nfunction isOpenClawCrablineRecorderTemporary(name: string): boolean {\n const channel = RECORDER_TEMP_NAME_PATTERN.exec(name)?.[1]?.toLowerCase();\n return channel !== undefined && isCrablineServerChannel(channel);\n}\n\nfunction isOpenClawCrablineRecorderTemporaryLock(name: string): boolean {\n return name.endsWith(\".lock\") && isOpenClawCrablineRecorderTemporary(name.slice(0, -5));\n}\n\nfunction openClawCrablineRecorderLockTombstoneBaseName(name: string): string | null {\n const originalName = RECORDER_LOCK_REMOVAL_TOMBSTONE_PATTERN.exec(name)?.[1];\n return originalName !== undefined && isOpenClawCrablineRecorderTemporaryLock(originalName)\n ? originalName\n : null;\n}\n\nasync function reclaimOpenClawCrablineRecorderTemporaryLock(\n directoryPath: string,\n name: string,\n lock: Awaited<ReturnType<typeof acquireOpenClawCrablineSmokeRunLock>>,\n quarantineBaseName = name,\n): Promise<void> {\n const lockPath = path.join(directoryPath, name);\n let identity: BigIntStats;\n try {\n identity = await fs.lstat(lockPath, { bigint: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n if (!identity.isDirectory()) {\n return;\n }\n const currentUserId = process.geteuid?.();\n if (currentUserId !== undefined && identity.uid !== BigInt(currentUserId)) {\n return;\n }\n\n const quarantinePath = path.join(\n directoryPath,\n `.${quarantineBaseName}.${process.pid}.${randomUUID()}.remove`,\n );\n await lock.assertOwned();\n try {\n await fs.rename(lockPath, quarantinePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n const quarantined = await fs.lstat(quarantinePath, { bigint: true });\n if (\n !quarantined.isDirectory() ||\n quarantined.dev !== identity.dev ||\n quarantined.ino !== identity.ino\n ) {\n throw new Error(\"OpenClaw Crabline recorder lock identity changed during recovery.\");\n }\n await syncParentDirectory(quarantinePath);\n await fs.rm(quarantinePath, { force: true, recursive: true });\n await syncParentDirectory(quarantinePath);\n}\n\nasync function reclaimOpenClawCrablineRecorderTemporaries(\n directoryPath: string,\n lock: Awaited<ReturnType<typeof acquireOpenClawCrablineSmokeRunLock>>,\n): Promise<void> {\n for (const entry of await fs.readdir(directoryPath, { withFileTypes: true })) {\n const tombstoneBaseName = entry.isDirectory()\n ? openClawCrablineRecorderLockTombstoneBaseName(entry.name)\n : null;\n if (isOpenClawCrablineRecorderTemporaryLock(entry.name) || tombstoneBaseName !== null) {\n if (entry.isDirectory()) {\n await reclaimOpenClawCrablineRecorderTemporaryLock(\n directoryPath,\n entry.name,\n lock,\n tombstoneBaseName ?? entry.name,\n );\n }\n continue;\n }\n if (\n !isOpenClawCrablineRecorderTemporary(entry.name) ||\n (!entry.isFile() && !entry.isSymbolicLink())\n ) {\n continue;\n }\n await lock.assertOwned();\n const temporaryPath = path.join(directoryPath, entry.name);\n await fs.rm(temporaryPath, { force: true });\n await syncParentDirectory(temporaryPath);\n }\n}\n\nfunction createOpenClawCrablineProviderAdapter(\n manifest: CrablineServerManifest,\n): OpenClawCrablineProviderAdapter {\n const bridge = OPENCLAW_CRABLINE_PROVIDER_BRIDGE_LIST.find(\n (candidate) => candidate.provider === manifest.provider,\n );\n if (bridge) {\n const adapter = bridge.createAdapterFromManifest(manifest);\n return {\n ...adapter,\n createOutboundFromRecorderEvent: (params) =>\n isAcceptedOpenClawCrablineOutbound({\n event: params.event,\n manifest,\n })\n ? adapter.createOutboundFromRecorderEvent(params)\n : null,\n probe: () =>\n runOpenClawCrablineProviderProbe(manifest.provider, (signal) => adapter.probe(signal)),\n };\n }\n throw new Error(\"Unsupported OpenClaw provider binding.\");\n}\n\nexport function resolveOpenClawCrablineChannel(input?: string | null): CrablineServerChannel {\n const channel =\n input === undefined || input === null\n ? OPENCLAW_CRABLINE_DEFAULT_CHANNEL\n : input.trim().toLowerCase();\n if (isCrablineServerChannel(channel)) {\n return channel;\n }\n throw new Error(\n `--channel must be one of ${CRABLINE_SERVER_CHANNELS.join(\", \")} for --channel-driver crabline, got \"${input}\".`,\n );\n}\n\nexport function resolveOpenClawCrablineChannelDriverSelection(params: {\n channel?: string | null;\n}): OpenClawCrablineChannelDriverSelection & {\n providerReadinessArtifactPath: typeof OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH;\n} {\n return {\n channel: resolveOpenClawCrablineChannel(params.channel),\n channelDriver: \"crabline\",\n capabilityMatrixPath: OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,\n providerReadinessArtifactPath: OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH,\n smokeArtifactPath: OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,\n };\n}\n\nexport async function probeOpenClawCrablineProvider(\n manifest: CrablineServerManifest,\n): Promise<unknown> {\n return await createOpenClawCrablineProviderAdapter(manifest).probe();\n}\n\nexport function createOpenClawCrablineProviderBinding(\n manifest: CrablineServerManifest,\n): OpenClawCrablineGatewayBinding {\n return createOpenClawCrablineProviderAdapter(manifest).createBinding();\n}\n\nexport function createOpenClawCrablineAgentDelivery(params: {\n manifest: CrablineServerManifest;\n target: string;\n}): OpenClawCrablineAgentDelivery {\n return createOpenClawCrablineProviderAdapter(params.manifest).createAgentDelivery(\n parseQaTarget(params.target),\n );\n}\n\nexport function createOpenClawCrablineInbound(params: {\n input: OpenClawCrablineInboundInput;\n manifest: CrablineServerManifest;\n}): OpenClawCrablineInbound {\n return createOpenClawCrablineProviderAdapter(params.manifest).createInbound(params.input);\n}\n\nexport function createOpenClawCrablineOutboundFromRecorderEvent(params: {\n event: unknown;\n manifest: CrablineServerManifest;\n targetByProviderTarget: ReadonlyMap<string, string>;\n}): OpenClawCrablineOutboundMessage | null {\n return createOpenClawCrablineProviderAdapter(params.manifest).createOutboundFromRecorderEvent({\n event: params.event,\n targetByProviderTarget: params.targetByProviderTarget,\n });\n}\n\nexport async function startOpenClawCrablineAdapter(\n params: StartOpenClawCrablineAdapterParams,\n dependencies: {\n createProviderAdapter?: typeof createOpenClawCrablineProviderAdapter;\n startServer?: (params: StartCrablineServerParams) => Promise<StartedCrablineServer>;\n } = {},\n): Promise<StartedOpenClawCrablineAdapter> {\n const server: StartedCrablineServer = await (dependencies.startServer ?? startCrablineServer)({\n channel: params.channel,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath,\n });\n try {\n const providerAdapter = (\n dependencies.createProviderAdapter ?? createOpenClawCrablineProviderAdapter\n )(server.manifest);\n const binding = providerAdapter.createBinding();\n return {\n ...binding,\n close: server.close,\n createGatewayConfig: (openclawConfig = params.openclawConfig ?? {}) =>\n binding.createGatewayConfig(openclawConfig),\n createAgentDelivery: ({ target }) =>\n providerAdapter.createAgentDelivery(parseQaTarget(target)),\n createInbound: ({ input }) => providerAdapter.createInbound(input),\n createOutboundFromRecorderEvent: ({ event, targetByProviderTarget }) =>\n providerAdapter.createOutboundFromRecorderEvent({\n event,\n targetByProviderTarget,\n }),\n manifest: server.manifest,\n probe: () => providerAdapter.probe(),\n };\n } catch (error) {\n try {\n await server.close();\n } catch (closeError) {\n const aggregateError = new AggregateError(\n [error, closeError],\n \"OpenClaw Crabline adapter startup failed.\",\n );\n aggregateError.cause = error;\n throw aggregateError;\n }\n throw error;\n }\n}\n\ntype ProviderReadinessDependencies = {\n acquireLock?: typeof acquireOpenClawCrablineSmokeRunLock;\n publishGeneration?: typeof publishOpenClawCrablineArtifactGeneration;\n releaseLock?: typeof releaseOpenClawCrablineSmokeRunLock;\n startAdapter?: typeof startOpenClawCrablineAdapter;\n};\n\nexport function runOpenClawCrablineProviderReadiness(params: {\n outputDir: string;\n selection: OpenClawCrablineChannelDriverSelection;\n}): Promise<OpenClawCrablineProviderReadinessResult>;\nexport async function runOpenClawCrablineProviderReadiness(\n params: {\n outputDir: string;\n selection: OpenClawCrablineChannelDriverSelection;\n },\n dependencies: ProviderReadinessDependencies = {},\n): Promise<OpenClawCrablineProviderReadinessResult> {\n const outputDir = path.resolve(params.outputDir);\n const releaseLock = dependencies.releaseLock ?? releaseOpenClawCrablineSmokeRunLock;\n const smokeLock = await (dependencies.acquireLock ?? acquireOpenClawCrablineSmokeRunLock)({\n channel: params.selection.channel,\n outputDir,\n });\n let outcome:\n | { committed: false; error: unknown }\n | { committed: true; result: OpenClawCrablineProviderReadinessResult };\n let recorderPath: string | undefined;\n\n try {\n const recorderDirectory = path.join(outputDir, \"artifacts\", \"crabline\");\n await fs.mkdir(recorderDirectory, { recursive: true });\n await reclaimOpenClawCrablineRecorderTemporaries(recorderDirectory, smokeLock);\n recorderPath = path.join(\n recorderDirectory,\n `.${params.selection.channel}-fake-provider.${randomUUID()}.jsonl.tmp`,\n );\n const adapter = await (dependencies.startAdapter ?? startOpenClawCrablineAdapter)({\n channel: params.selection.channel,\n openclawConfig: {},\n recorderPath,\n });\n let probe: unknown;\n let probeFailed = false;\n let probeFailure: unknown;\n try {\n probe = await adapter.probe();\n } catch (error) {\n probeFailed = true;\n probeFailure = error;\n }\n try {\n await adapter.close();\n } catch (cleanupError) {\n if (!probeFailed) {\n throw cleanupError;\n }\n if (probeFailure instanceof Error) {\n const existingCause = probeFailure.cause;\n try {\n Object.defineProperty(probeFailure, \"cause\", {\n configurable: true,\n value:\n existingCause === undefined\n ? cleanupError\n : new AggregateError(\n [existingCause, cleanupError],\n \"OpenClaw Crabline provider probe cleanup also failed.\",\n ),\n });\n } catch {\n // Some provider errors are frozen; preserving the primary failure is authoritative.\n }\n throw probeFailure;\n }\n const combinedError = new Error(\"OpenClaw Crabline provider probe and cleanup both failed.\", {\n cause: cleanupError,\n });\n Object.defineProperty(combinedError, \"errors\", {\n value: [probeFailure, cleanupError],\n });\n throw combinedError;\n }\n if (probeFailed) {\n throw probeFailure;\n }\n let recorderSnapshotContents = \"\";\n try {\n recorderSnapshotContents = await fs.readFile(recorderPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const capabilityReport = {\n result: {\n driver: \"crabline\",\n selectedChannel: params.selection.channel,\n supportedChannels: [...CRABLINE_SERVER_CHANNELS],\n },\n };\n const providerReadiness = {\n result: {\n ok: true,\n proof: \"provider-api-probe\",\n ready: true,\n probe,\n provider: adapter.manifest.provider,\n endpoints: adapter.manifest.endpoints,\n recorderPath: path.relative(outputDir, adapter.manifest.recorderPath),\n },\n };\n const generation = await (\n dependencies.publishGeneration ?? publishOpenClawCrablineArtifactGeneration\n )({\n capabilityReport,\n lock: smokeLock,\n manifest: adapter.manifest,\n outputDir,\n recorderSnapshot: {\n contents: recorderSnapshotContents,\n fileName: `${params.selection.channel}-fake-provider.jsonl`,\n },\n selection: params.selection,\n providerReadiness,\n });\n let recorderCleanupWarning: string | undefined;\n try {\n await fs.rm(recorderPath, { force: true });\n recorderPath = undefined;\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n recorderCleanupWarning = `OpenClaw Crabline recorder snapshot committed but temporary cleanup failed: ${detail}`;\n }\n outcome = {\n committed: true,\n result: {\n artifactPointerPath: generation.pointerPath,\n capabilityReport,\n capabilityMatrixPath: generation.capabilityMatrixPath,\n generation: generation.generation,\n manifestPath: generation.manifestPath,\n providerReadiness: generation.providerReadiness,\n providerReadinessArtifactPath: generation.providerReadinessArtifactPath,\n smoke: generation.providerReadiness,\n smokeArtifactPath: generation.providerReadinessArtifactPath,\n ...(generation.warnings || recorderCleanupWarning\n ? {\n warnings: [\n ...(generation.warnings ?? []),\n ...(recorderCleanupWarning ? [recorderCleanupWarning] : []),\n ],\n }\n : {}),\n },\n };\n } catch (error) {\n let primaryError = error;\n if (recorderPath) {\n try {\n await fs.rm(recorderPath, { force: true });\n recorderPath = undefined;\n } catch (cleanupError) {\n if (primaryError instanceof Error) {\n const existingCause = primaryError.cause;\n try {\n Object.defineProperty(primaryError, \"cause\", {\n configurable: true,\n value:\n existingCause === undefined\n ? cleanupError\n : new AggregateError(\n [existingCause, cleanupError],\n \"OpenClaw Crabline readiness failure cleanup also failed.\",\n ),\n });\n } catch {\n // Frozen failures remain authoritative even if temporary cleanup also fails.\n }\n } else {\n const combinedError = new Error(\n \"OpenClaw Crabline readiness and temporary cleanup both failed.\",\n { cause: cleanupError },\n );\n Object.defineProperty(combinedError, \"errors\", {\n value: [primaryError, cleanupError],\n });\n primaryError = combinedError;\n }\n }\n }\n outcome = { committed: false, error: primaryError };\n }\n\n try {\n await releaseLock(smokeLock);\n } catch (cleanupError) {\n // The pointer switch is authoritative; lock removal cannot roll it back.\n if (!outcome.committed) {\n if (outcome.error instanceof Error) {\n const existingCause = outcome.error.cause;\n try {\n Object.defineProperty(outcome.error, \"cause\", {\n configurable: true,\n value:\n existingCause === undefined\n ? cleanupError\n : new AggregateError(\n [existingCause, cleanupError],\n \"OpenClaw Crabline smoke failure cleanup also failed.\",\n ),\n });\n } catch {\n // Some failures are frozen; preserving the primary error is authoritative.\n }\n throw outcome.error;\n }\n const combinedError = new Error(\"OpenClaw Crabline smoke and lock cleanup both failed.\", {\n cause: cleanupError,\n });\n Object.defineProperty(combinedError, \"errors\", {\n value: [outcome.error, cleanupError],\n });\n throw combinedError;\n }\n const detail = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);\n outcome.result = {\n ...outcome.result,\n warnings: [\n ...(outcome.result.warnings ?? []),\n `OpenClaw Crabline smoke committed but lock cleanup failed: ${detail}`,\n ],\n };\n }\n\n if (!outcome.committed) {\n throw outcome.error;\n }\n return outcome.result;\n}\n\n/** @deprecated Use runOpenClawCrablineProviderReadiness. */\nexport const runOpenClawCrablineChannelDriverSmoke = runOpenClawCrablineProviderReadiness;\n\nexport function createOpenClawCrablineChannelReportNotes(\n selection: OpenClawCrablineChannelDriverSelection | null | undefined,\n): string[] {\n if (!selection) {\n return [];\n }\n\n return [\n `Channel driver: ${selection.channelDriver} local provider for ${selection.channel}.`,\n `Channel artifact pointer: ${OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH}.`,\n `Generation capability filename: ${selection.capabilityMatrixPath}.`,\n `Generation provider-readiness filename: ${selection.providerReadinessArtifactPath ?? selection.smokeArtifactPath}.`,\n \"Crabline verifies the local provider API is ready; OpenClaw channel behavior is proven separately by QA scenarios that run the real channel adapter.\",\n ];\n}\n"]}
@@ -9,7 +9,16 @@ export declare function resolveDiscordAdapterConfig(config: ProviderConfig, user
9
9
  publicKey?: string;
10
10
  userName: string;
11
11
  }>;
12
+ export declare function normalizeDiscordWebhookPayload(payload: unknown): {
13
+ author?: "assistant" | "system" | "user" | undefined;
14
+ authorIsBot?: boolean;
15
+ id?: string | undefined;
16
+ raw: {};
17
+ text?: string | undefined;
18
+ };
19
+ export declare function createDiscordInteractionResponse(payload: unknown): Response;
20
+ export declare function handleDiscordWebhookPayload(payload: unknown): Response | undefined;
12
21
  export declare class DiscordProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
13
- constructor(id: string, config: ProviderConfig, _userName: string);
22
+ constructor(id: string, config: ProviderConfig, userName: string, runtime?: unknown);
14
23
  }
15
24
  export {};