@openclaw/crabline 0.1.12 → 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 (53) hide show
  1. package/README.md +38 -11
  2. package/dist/src/cli/program.js +17 -2
  3. package/dist/src/cli/program.js.map +1 -1
  4. package/dist/src/index.d.ts +12 -10
  5. package/dist/src/index.js +6 -5
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/openclaw/artifact-generation.d.ts +5 -9
  8. package/dist/src/openclaw/artifact-generation.js +41 -69
  9. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  10. package/dist/src/openclaw/bridges/discord.d.ts +1 -0
  11. package/dist/src/openclaw/bridges/discord.js +149 -0
  12. package/dist/src/openclaw/bridges/discord.js.map +1 -0
  13. package/dist/src/openclaw/bridges/matrix.js +1 -1
  14. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  15. package/dist/src/openclaw/bridges/mattermost.js +1 -1
  16. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  17. package/dist/src/openclaw/bridges/signal.js +1 -1
  18. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  19. package/dist/src/openclaw/bridges/slack.js +1 -1
  20. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  21. package/dist/src/openclaw/bridges/telegram.js +1 -1
  22. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  23. package/dist/src/openclaw/bridges/whatsapp.js +1 -1
  24. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  25. package/dist/src/openclaw/bridges/zalo.js +1 -1
  26. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  27. package/dist/src/openclaw/outbound-contract.js +3 -0
  28. package/dist/src/openclaw/outbound-contract.js.map +1 -1
  29. package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +7 -7
  30. package/dist/src/openclaw/{smoke-lock.js → provider-readiness-lock.js} +122 -260
  31. package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
  32. package/dist/src/openclaw/shared.d.ts +9 -17
  33. package/dist/src/openclaw/shared.js +5 -6
  34. package/dist/src/openclaw/shared.js.map +1 -1
  35. package/dist/src/openclaw.d.ts +3 -5
  36. package/dist/src/openclaw.js +22 -20
  37. package/dist/src/openclaw.js.map +1 -1
  38. package/dist/src/servers/discord.d.ts +40 -0
  39. package/dist/src/servers/discord.js +842 -0
  40. package/dist/src/servers/discord.js.map +1 -0
  41. package/dist/src/servers/index.d.ts +10 -4
  42. package/dist/src/servers/index.js +4 -0
  43. package/dist/src/servers/index.js.map +1 -1
  44. package/dist/src/servers/slack.js +11 -3
  45. package/dist/src/servers/slack.js.map +1 -1
  46. package/dist/src/servers/telegram.js +51 -2
  47. package/dist/src/servers/telegram.js.map +1 -1
  48. package/dist/src/servers/whatsapp.d.ts +0 -1
  49. package/dist/src/servers/whatsapp.js +0 -1
  50. package/dist/src/servers/whatsapp.js.map +1 -1
  51. package/docs/channel-setup.md +66 -21
  52. package/package.json +1 -1
  53. package/dist/src/openclaw/smoke-lock.js.map +0 -1
@@ -1,21 +1,23 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { CRABLINE_SERVER_CHANNELS, isCrablineServerChannel, startCrablineServer, } from "./servers/index.js";
3
3
  import { SLACK_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/slack.js";
4
+ import { DISCORD_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/discord.js";
4
5
  import { MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/mattermost.js";
5
6
  import { MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/matrix.js";
6
7
  import { SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/signal.js";
7
8
  import { TELEGRAM_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/telegram.js";
8
9
  import { WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/whatsapp.js";
9
10
  import { ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/zalo.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, getUnsettledOpenClawCrablineProviderProbe, isRecord, parseQaTarget, runOpenClawCrablineProviderProbe, } from "./openclaw/shared.js";
11
+ import { OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_MANIFEST_PATH, getUnsettledOpenClawCrablineProviderProbe, isRecord, parseQaTarget, runOpenClawCrablineProviderProbe, } from "./openclaw/shared.js";
11
12
  import { publishOpenClawCrablineArtifactGeneration } from "./openclaw/artifact-generation.js";
12
13
  import { isAcceptedOpenClawCrablineOutbound } from "./openclaw/outbound-contract.js";
13
14
  import { securePrivateDirectory, syncParentDirectory, } from "./openclaw/private-file.js";
14
- import { acquireOpenClawCrablineSmokeRunLock, releaseOpenClawCrablineSmokeRunLock, } from "./openclaw/smoke-lock.js";
15
+ import { acquireOpenClawCrablineProviderReadinessLock, releaseOpenClawCrablineProviderReadinessLock, } from "./openclaw/provider-readiness-lock.js";
15
16
  import fs from "node:fs/promises";
16
17
  import path from "node: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, };
18
+ export { OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, };
18
19
  const OPENCLAW_CRABLINE_PROVIDER_BRIDGES = {
20
+ discord: DISCORD_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
19
21
  mattermost: MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
20
22
  matrix: MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
21
23
  signal: SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
@@ -25,7 +27,7 @@ const OPENCLAW_CRABLINE_PROVIDER_BRIDGES = {
25
27
  zalo: ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
26
28
  };
27
29
  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;
30
+ const RECORDER_TEMP_NAME_PATTERN = /^\.([a-z]+)-provider-server\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.jsonl\.tmp$/iu;
29
31
  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
32
  const OPENCLAW_CRABLINE_PROVIDER_PROBE_CLEANUP_GRACE_MS = 250;
31
33
  function isOpenClawCrablineRecorderTemporary(name) {
@@ -49,6 +51,11 @@ function isOpenClawCrablineRecorderEvent(value) {
49
51
  }
50
52
  function openClawCrablineProviderProbeRequest(manifest) {
51
53
  switch (manifest.provider) {
54
+ case "discord":
55
+ return {
56
+ method: "GET",
57
+ path: new URL(`${manifest.endpoints.apiRoot}/v10/users/@me`).pathname,
58
+ };
52
59
  case "mattermost":
53
60
  return {
54
61
  method: "GET",
@@ -265,7 +272,6 @@ export function resolveOpenClawCrablineChannelDriverSelection(params) {
265
272
  channelDriver: "crabline",
266
273
  capabilityMatrixPath: OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,
267
274
  providerReadinessArtifactPath: OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH,
268
- smokeArtifactPath: OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,
269
275
  };
270
276
  }
271
277
  export async function probeOpenClawCrablineProvider(manifest) {
@@ -353,9 +359,9 @@ async function waitForOpenClawCrablineProbeCleanup(probeSettlement) {
353
359
  }
354
360
  export async function runOpenClawCrablineProviderReadiness(params, dependencies = {}) {
355
361
  const outputDir = path.resolve(params.outputDir);
356
- const releaseLock = dependencies.releaseLock ?? releaseOpenClawCrablineSmokeRunLock;
362
+ const releaseLock = dependencies.releaseLock ?? releaseOpenClawCrablineProviderReadinessLock;
357
363
  const syncRecorderParent = dependencies.syncParent ?? syncParentDirectory;
358
- const smokeLock = await (dependencies.acquireLock ?? acquireOpenClawCrablineSmokeRunLock)({
364
+ const providerReadinessLock = await (dependencies.acquireLock ?? acquireOpenClawCrablineProviderReadinessLock)({
359
365
  channel: params.selection.channel,
360
366
  outputDir,
361
367
  });
@@ -368,8 +374,8 @@ export async function runOpenClawCrablineProviderReadiness(params, dependencies
368
374
  recorderDirectory = await securePrivateDirectory(path.join(artifactsDirectory.directoryPath, "crabline"));
369
375
  await artifactsDirectory.assertIdentityAt();
370
376
  await recorderDirectory.assertIdentityAt();
371
- await reclaimOpenClawCrablineRecorderTemporaries(recorderDirectory, smokeLock);
372
- recorderPath = path.join(recorderDirectory.directoryPath, `.${params.selection.channel}-fake-provider.${randomUUID()}.jsonl.tmp`);
377
+ await reclaimOpenClawCrablineRecorderTemporaries(recorderDirectory, providerReadinessLock);
378
+ recorderPath = path.join(recorderDirectory.directoryPath, `.${params.selection.channel}-provider-server.${randomUUID()}.jsonl.tmp`);
373
379
  const adapter = await (dependencies.startAdapter ?? startOpenClawCrablineAdapter)({
374
380
  channel: params.selection.channel,
375
381
  openclawConfig: {},
@@ -453,12 +459,12 @@ export async function runOpenClawCrablineProviderReadiness(params, dependencies
453
459
  };
454
460
  const generation = await (dependencies.publishGeneration ?? publishOpenClawCrablineArtifactGeneration)({
455
461
  capabilityReport,
456
- lock: smokeLock,
462
+ lock: providerReadinessLock,
457
463
  manifest: adapter.manifest,
458
464
  outputDir,
459
465
  recorderSnapshot: {
460
466
  contents: recorderSnapshotContents,
461
- fileName: `${params.selection.channel}-fake-provider.jsonl`,
467
+ fileName: `${params.selection.channel}-provider-server.jsonl`,
462
468
  },
463
469
  selection: params.selection,
464
470
  providerReadiness,
@@ -487,8 +493,6 @@ export async function runOpenClawCrablineProviderReadiness(params, dependencies
487
493
  manifestPath: generation.manifestPath,
488
494
  providerReadiness: generation.providerReadiness,
489
495
  providerReadinessArtifactPath: generation.providerReadinessArtifactPath,
490
- smoke: generation.providerReadiness,
491
- smokeArtifactPath: generation.providerReadinessArtifactPath,
492
496
  ...(generation.warnings || recorderCleanupWarning
493
497
  ? {
494
498
  warnings: [
@@ -539,7 +543,7 @@ export async function runOpenClawCrablineProviderReadiness(params, dependencies
539
543
  outcome = { committed: false, error: primaryError };
540
544
  }
541
545
  try {
542
- await releaseLock(smokeLock);
546
+ await releaseLock(providerReadinessLock);
543
547
  }
544
548
  catch (cleanupError) {
545
549
  // The pointer switch is authoritative; lock removal cannot roll it back.
@@ -551,7 +555,7 @@ export async function runOpenClawCrablineProviderReadiness(params, dependencies
551
555
  configurable: true,
552
556
  value: existingCause === undefined
553
557
  ? cleanupError
554
- : new AggregateError([existingCause, cleanupError], "OpenClaw Crabline smoke failure cleanup also failed."),
558
+ : new AggregateError([existingCause, cleanupError], "OpenClaw Crabline provider readiness failure cleanup also failed."),
555
559
  });
556
560
  }
557
561
  catch {
@@ -559,7 +563,7 @@ export async function runOpenClawCrablineProviderReadiness(params, dependencies
559
563
  }
560
564
  throw outcome.error;
561
565
  }
562
- const combinedError = new Error("OpenClaw Crabline smoke and lock cleanup both failed.", {
566
+ const combinedError = new Error("OpenClaw Crabline provider readiness and lock cleanup both failed.", {
563
567
  cause: cleanupError,
564
568
  });
565
569
  Object.defineProperty(combinedError, "errors", {
@@ -572,7 +576,7 @@ export async function runOpenClawCrablineProviderReadiness(params, dependencies
572
576
  ...outcome.result,
573
577
  warnings: [
574
578
  ...(outcome.result.warnings ?? []),
575
- `OpenClaw Crabline smoke committed but lock cleanup failed: ${detail}`,
579
+ `OpenClaw Crabline provider readiness committed but lock cleanup failed: ${detail}`,
576
580
  ],
577
581
  };
578
582
  }
@@ -581,8 +585,6 @@ export async function runOpenClawCrablineProviderReadiness(params, dependencies
581
585
  }
582
586
  return outcome.result;
583
587
  }
584
- /** @deprecated Use runOpenClawCrablineProviderReadiness. */
585
- export const runOpenClawCrablineChannelDriverSmoke = runOpenClawCrablineProviderReadiness;
586
588
  export function createOpenClawCrablineChannelReportNotes(selection) {
587
589
  if (!selection) {
588
590
  return [];
@@ -591,7 +593,7 @@ export function createOpenClawCrablineChannelReportNotes(selection) {
591
593
  `Channel driver: ${selection.channelDriver} local provider for ${selection.channel}.`,
592
594
  `Channel artifact pointer: ${OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH}.`,
593
595
  `Generation capability filename: ${selection.capabilityMatrixPath}.`,
594
- `Generation provider-readiness filename: ${selection.providerReadinessArtifactPath ?? selection.smokeArtifactPath}.`,
596
+ `Generation provider-readiness filename: ${selection.providerReadinessArtifactPath}.`,
595
597
  "Crabline verifies the local provider API is ready; OpenClaw channel behavior is proven separately by QA scenarios that run the real channel adapter.",
596
598
  ];
597
599
  }
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/openclaw.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,GAKpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uCAAuC,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,4CAA4C,EAAE,MAAM,kCAAkC,CAAC;AAChG,OAAO,EAAE,wCAAwC,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,wCAAwC,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,0CAA0C,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,0CAA0C,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,sCAAsC,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EACL,gDAAgD,EAChD,oCAAoC,EACpC,yCAAyC,EACzC,iCAAiC,EACjC,uCAAuC,EACvC,0CAA0C,EAC1C,+BAA+B,EAC/B,yCAAyC,EACzC,QAAQ,EACR,aAAa,EACb,gCAAgC,GAajC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,yCAAyC,EAAE,MAAM,mCAAmC,CAAC;AAC9F,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mCAAmC,EACnC,mCAAmC,GACpC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,uCAAuC,EACvC,0CAA0C,EAC1C,gDAAgD,EAChD,oCAAoC,EACpC,yCAAyC,EACzC,iCAAiC,EACjC,+BAA+B,GAChC,CAAC;AAeF,MAAM,kCAAkC,GAAG;IACzC,UAAU,EAAE,4CAA4C;IACxD,MAAM,EAAE,wCAAwC;IAChD,MAAM,EAAE,wCAAwC;IAChD,KAAK,EAAE,uCAAuC;IAC9C,QAAQ,EAAE,0CAA0C;IACpD,QAAQ,EAAE,0CAA0C;IACpD,IAAI,EAAE,sCAAsC;CACI,CAAC;AAEnD,MAAM,sCAAsC,GAAG,MAAM,CAAC,MAAM,CAC1D,kCAAkC,CACU,CAAC;AAC/C,MAAM,0BAA0B,GAC9B,wGAAwG,CAAC;AAC3G,MAAM,uCAAuC,GAC3C,uFAAuF,CAAC;AAC1F,MAAM,iDAAiD,GAAG,GAAG,CAAC;AAE9D,SAAS,mCAAmC,CAAC,IAAY;IACvD,MAAM,OAAO,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1E,OAAO,OAAO,KAAK,SAAS,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AAC7F,CAAC;AAWD,SAAS,+BAA+B,CAAC,KAAc;IACrD,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,KAAK,CAAC,QAAQ,KAAK,IAAI;QACvB,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QACvB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC1B,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CACjD,CAAC;AACJ,CAAC;AAED,SAAS,oCAAoC,CAC3C,QAAgC;IAEhC,QAAQ,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC1B,KAAK,YAAY;YACf,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,WAAW,CAAC,CAAC,QAAQ;aACjE,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,aAAa,iBAAiB,CAAC,CAAC,QAAQ;aAC7E,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ;aAC1D,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ;aAChE,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;QACzD,KAAK,UAAU;YACb,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ;aAC1D,CAAC;QACJ,KAAK,MAAM;YACT,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,SAAS,sCAAsC,CAC7C,QAAgB,EAChB,QAAgC;IAEhC,MAAM,eAAe,GAAG,oCAAoC,CAAC,QAAQ,CAAC,CAAC;IACvE,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,6EAA6E,EAC7E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QACD,IACE,KAAK,CAAC,IAAI,KAAK,KAAK;YACpB,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM;YACvC,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,EACnC,CAAC;YACD,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,SAAS,uCAAuC,CAAC,IAAY;IAC3D,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,6CAA6C,CAAC,IAAY;IACjE,MAAM,YAAY,GAAG,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,YAAY,KAAK,SAAS,IAAI,uCAAuC,CAAC,YAAY,CAAC;QACxF,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,KAAK,UAAU,4CAA4C,CACzD,aAAqB,EACrB,IAAY,EACZ,IAAqE,EACrE,kBAAkB,GAAG,IAAI;IAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,QAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAC1C,IAAI,aAAa,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAC9B,aAAa,EACb,IAAI,kBAAkB,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,SAAS,CAC/D,CAAC;IACF,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IACE,CAAC,WAAW,CAAC,WAAW,EAAE;QAC1B,WAAW,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;QAChC,WAAW,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,EAChC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,mBAAmB,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,mBAAmB,CAAC,cAAc,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,0CAA0C,CACvD,SAAkC,EAClC,IAAqE;IAErE,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC;IAC9C,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7E,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,EAAE;YAC3C,CAAC,CAAC,6CAA6C,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,uCAAuC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACtF,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,4CAA4C,CAChD,aAAa,EACb,KAAK,CAAC,IAAI,EACV,IAAI,EACJ,iBAAiB,IAAI,KAAK,CAAC,IAAI,CAChC,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QACD,IACE,CAAC,mCAAmC,CAAC,KAAK,CAAC,IAAI,CAAC;YAChD,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAC5C,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;IACrC,CAAC;IACD,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;AACrC,CAAC;AAQD,SAAS,wBAAwB,CAC/B,KAAkB,EAClB,QAAmC;IAEnC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAC1C,IACE,CAAC,KAAK,CAAC,MAAM,EAAE;QACf,KAAK,CAAC,KAAK,KAAK,EAAE;QAClB,KAAK,CAAC,GAAG,IAAI,EAAE;QACf,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC;QACpE,CAAC,QAAQ,KAAK,SAAS;YACrB,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM;gBAC5B,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK;gBAC5B,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,EACnC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,GAAG;QACjB,KAAK,EAAE,KAAK,CAAC,GAAG;QAChB,MAAM,EAAE,KAAK,CAAC,GAAG;KAClB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,YAAoB,EACpB,SAAkC;IAElC,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/E,wBAAwB,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;QACnC,wBAAwB,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QACnF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,MAK3C;IACC,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;IAC1C,IAAI,KAAkB,CAAC;IACvB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACjC,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;IAC1C,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,qCAAqC,CAC5C,QAAgC;IAEhC,MAAM,MAAM,GAAG,sCAAsC,CAAC,IAAI,CACxD,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CACxD,CAAC;IACF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAC3D,OAAO;YACL,GAAG,OAAO;YACV,+BAA+B,EAAE,CAAC,MAAM,EAAE,EAAE,CAC1C,kCAAkC,CAAC;gBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ;aACT,CAAC;gBACA,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,MAAM,CAAC;gBACjD,CAAC,CAAC,IAAI;YACV,KAAK,EAAE,GAAG,EAAE,CACV,gCAAgC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACzF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAqB;IAClE,MAAM,OAAO,GACX,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QACnC,CAAC,CAAC,iCAAiC;QACnC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,KAAK,CACb,4BAA4B,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,KAAK,IAAI,CACjH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6CAA6C,CAAC,MAE7D;IAGC,OAAO;QACL,OAAO,EAAE,8BAA8B,CAAC,MAAM,CAAC,OAAO,CAAC;QACvD,aAAa,EAAE,UAAU;QACzB,oBAAoB,EAAE,gDAAgD;QACtE,6BAA6B,EAAE,yCAAyC;QACxE,iBAAiB,EAAE,oCAAoC;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,QAAgC;IAEhC,OAAO,MAAM,qCAAqC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,QAAgC;IAEhC,OAAO,qCAAqC,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,MAGnD;IACC,OAAO,qCAAqC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAC/E,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAG7C;IACC,OAAO,qCAAqC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,+CAA+C,CAAC,MAI/D;IACC,OAAO,qCAAqC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,+BAA+B,CAAC;QAC5F,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;KACtD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAA0C,EAC1C,YAAY,GAGR,EAAE;IAEN,MAAM,MAAM,GAA0B,MAAM,CAAC,YAAY,CAAC,WAAW,IAAI,mBAAmB,CAAC,CAAC;QAC5F,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,CACtB,YAAY,CAAC,qBAAqB,IAAI,qCAAqC,CAC5E,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC;QAChD,OAAO;YACL,GAAG,OAAO;YACV,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,mBAAmB,EAAE,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,EAAE,EAAE,CACpE,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC;YAC7C,mBAAmB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAClC,eAAe,CAAC,mBAAmB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5D,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC;YAClE,+BAA+B,EAAE,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,CACrE,eAAe,CAAC,+BAA+B,CAAC;gBAC9C,KAAK;gBACL,sBAAsB;aACvB,CAAC;YACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE;SACrC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,cAAc,GAAG,IAAI,cAAc,CACvC,CAAC,KAAK,EAAE,UAAU,CAAC,EACnB,2CAA2C,CAC5C,CAAC;YACF,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;YAC7B,MAAM,cAAc,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAUD,SAAS,yCAAyC,CAChD,YAAmB,EACnB,YAAqB;IAErB,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE;YAC3C,YAAY,EAAE,IAAI;YAClB,KAAK,EACH,aAAa,KAAK,SAAS;gBACzB,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,IAAI,cAAc,CAChB,CAAC,aAAa,EAAE,YAAY,CAAC,EAC7B,uDAAuD,CACxD;SACR,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,oFAAoF;IACtF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mCAAmC,CAAC,eAA8B;IAC/E,IAAI,OAAkD,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,eAAe;YACf,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5B,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,iDAAiD,CAAC,CAAC;YACnF,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,MAGC,EACD,YAAY,GAAkC,EAAE;IAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,IAAI,mCAAmC,CAAC;IACpF,MAAM,kBAAkB,GAAG,YAAY,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,IAAI,mCAAmC,CAAC,CAAC;QACxF,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO;QACjC,SAAS;KACV,CAAC,CAAC;IACH,IAAI,OAEoE,CAAC;IACzE,IAAI,iBAAsD,CAAC;IAC3D,IAAI,gBAAsD,CAAC;IAC3D,IAAI,YAAgC,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3F,iBAAiB,GAAG,MAAM,sBAAsB,CAC9C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,UAAU,CAAC,CACxD,CAAC;QACF,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,0CAA0C,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;QAC/E,YAAY,GAAG,IAAI,CAAC,IAAI,CACtB,iBAAiB,CAAC,aAAa,EAC/B,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,kBAAkB,UAAU,EAAE,YAAY,CACvE,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,IAAI,4BAA4B,CAAC,CAAC;YAChF,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO;YACjC,cAAc,EAAE,EAAE;YAClB,YAAY;SACb,CAAC,CAAC;QACH,IAAI,KAAc,CAAC;QACnB,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,YAAqB,CAAC;QAC1B,IAAI,eAA0C,CAAC;QAC/C,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,GAAG,IAAI,CAAC;YACnB,YAAY,GAAG,KAAK,CAAC;YACrB,eAAe,GAAG,yCAAyC,CAAC,KAAK,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,mCAAmC,CAAC,eAAe,CAAC,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,IAAI,YAAY,YAAY,KAAK,EAAE,CAAC;oBAClC,yCAAyC,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACN,MAAM,aAAa,GAAG,IAAI,KAAK,CAC7B,2DAA2D,EAC3D,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;oBACF,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,EAAE;wBAC7C,KAAK,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;qBACpC,CAAC,CAAC;oBACH,MAAM,aAAa,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,YAAY,CAAC;gBACrB,CAAC;gBACD,IAAI,YAAY,YAAY,KAAK,EAAE,CAAC;oBAClC,yCAAyC,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;oBACtE,MAAM,YAAY,CAAC;gBACrB,CAAC;gBACD,MAAM,aAAa,GAAG,IAAI,KAAK,CAC7B,2DAA2D,EAC3D;oBACE,KAAK,EAAE,YAAY;iBACpB,CACF,CAAC;gBACF,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,EAAE;oBAC7C,KAAK,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;iBACpC,CAAC,CAAC;gBACH,MAAM,aAAa,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,YAAY,CAAC;QACrB,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,yBAAyB,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAC1F,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC;QAC7C,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,QAAQ,CAAC;QAC3D,sCAAsC,CAAC,wBAAwB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnF,MAAM,gBAAgB,GAAG;YACvB,MAAM,EAAE;gBACN,MAAM,EAAE,UAAU;gBAClB,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO;gBACzC,iBAAiB,EAAE,CAAC,GAAG,wBAAwB,CAAC;aACjD;SACF,CAAC;QACF,MAAM,iBAAiB,GAAG;YACxB,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,oBAAoB;gBAC3B,KAAK,EAAE,IAAI;gBACX,KAAK;gBACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBACnC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;gBACrC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;aACtE;SACF,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,CACvB,YAAY,CAAC,iBAAiB,IAAI,yCAAyC,CAC5E,CAAC;YACA,gBAAgB;YAChB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS;YACT,gBAAgB,EAAE;gBAChB,QAAQ,EAAE,wBAAwB;gBAClC,QAAQ,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,sBAAsB;aAC5D;YACD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,iBAAiB;SAClB,CAAC,CAAC;QACH,IAAI,sBAA0C,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,4BAA4B,CAAC;gBACjC,SAAS,EAAE,iBAAiB;gBAC5B,QAAQ,EAAE,gBAAgB;gBAC1B,YAAY;gBACZ,UAAU,EAAE,kBAAkB;aAC/B,CAAC,CAAC;YACH,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,sBAAsB,GAAG,+EAA+E,MAAM,EAAE,CAAC;QACnH,CAAC;QACD,OAAO,GAAG;YACR,SAAS,EAAE,IAAI;YACf,MAAM,EAAE;gBACN,mBAAmB,EAAE,UAAU,CAAC,WAAW;gBAC3C,gBAAgB;gBAChB,oBAAoB,EAAE,UAAU,CAAC,oBAAoB;gBACrD,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;gBAC/C,6BAA6B,EAAE,UAAU,CAAC,6BAA6B;gBACvE,KAAK,EAAE,UAAU,CAAC,iBAAiB;gBACnC,iBAAiB,EAAE,UAAU,CAAC,6BAA6B;gBAC3D,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,sBAAsB;oBAC/C,CAAC,CAAC;wBACE,QAAQ,EAAE;4BACR,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;4BAC9B,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC5D;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,YAAY,IAAI,iBAAiB,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,4BAA4B,CAAC;oBACjC,SAAS,EAAE,iBAAiB;oBAC5B,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3D,YAAY;oBACZ,UAAU,EAAE,kBAAkB;iBAC/B,CAAC,CAAC;gBACH,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,IAAI,YAAY,YAAY,KAAK,EAAE,CAAC;oBAClC,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC;oBACzC,IAAI,CAAC;wBACH,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE;4BAC3C,YAAY,EAAE,IAAI;4BAClB,KAAK,EACH,aAAa,KAAK,SAAS;gCACzB,CAAC,CAAC,YAAY;gCACd,CAAC,CAAC,IAAI,cAAc,CAChB,CAAC,aAAa,EAAE,YAAY,CAAC,EAC7B,0DAA0D,CAC3D;yBACR,CAAC,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACP,6EAA6E;oBAC/E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,aAAa,GAAG,IAAI,KAAK,CAC7B,gEAAgE,EAChE,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;oBACF,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,EAAE;wBAC7C,KAAK,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;qBACpC,CAAC,CAAC;oBACH,YAAY,GAAG,aAAa,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,YAAY,EAAE,CAAC;QACtB,yEAAyE;QACzE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,KAAK,YAAY,KAAK,EAAE,CAAC;gBACnC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC1C,IAAI,CAAC;oBACH,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE;wBAC5C,YAAY,EAAE,IAAI;wBAClB,KAAK,EACH,aAAa,KAAK,SAAS;4BACzB,CAAC,CAAC,YAAY;4BACd,CAAC,CAAC,IAAI,cAAc,CAChB,CAAC,aAAa,EAAE,YAAY,CAAC,EAC7B,sDAAsD,CACvD;qBACR,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,2EAA2E;gBAC7E,CAAC;gBACD,MAAM,OAAO,CAAC,KAAK,CAAC;YACtB,CAAC;YACD,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,uDAAuD,EAAE;gBACvF,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;YACH,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,EAAE;gBAC7C,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC;aACrC,CAAC,CAAC;YACH,MAAM,aAAa,CAAC;QACtB,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3F,OAAO,CAAC,MAAM,GAAG;YACf,GAAG,OAAO,CAAC,MAAM;YACjB,QAAQ,EAAE;gBACR,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAClC,8DAA8D,MAAM,EAAE;aACvE;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,qCAAqC,GAAG,oCAAoC,CAAC;AAE1F,MAAM,UAAU,wCAAwC,CACtD,SAAoE;IAEpE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,mBAAmB,SAAS,CAAC,aAAa,uBAAuB,SAAS,CAAC,OAAO,GAAG;QACrF,6BAA6B,uCAAuC,GAAG;QACvE,mCAAmC,SAAS,CAAC,oBAAoB,GAAG;QACpE,2CAA2C,SAAS,CAAC,6BAA6B,IAAI,SAAS,CAAC,iBAAiB,GAAG;QACpH,sJAAsJ;KACvJ,CAAC;AACJ,CAAC","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 getUnsettledOpenClawCrablineProviderProbe,\n isRecord,\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 {\n securePrivateDirectory,\n syncParentDirectory,\n type SecuredPrivateDirectory,\n} 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;\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_CLEANUP_GRACE_MS = 250;\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 hasStringRecordValues(value: unknown): value is Record<string, string> {\n return isRecord(value) && Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\ntype OpenClawCrablineRecorderEvent = {\n accepted: true;\n at: string;\n method: string;\n path: string;\n query: Record<string, string>;\n type: \"admin\" | \"api\";\n};\n\nfunction isOpenClawCrablineRecorderEvent(value: unknown): value is OpenClawCrablineRecorderEvent {\n return (\n isRecord(value) &&\n value.accepted === true &&\n typeof value.at === \"string\" &&\n Number.isFinite(Date.parse(value.at)) &&\n typeof value.method === \"string\" &&\n value.method.length > 0 &&\n typeof value.path === \"string\" &&\n value.path.startsWith(\"/\") &&\n hasStringRecordValues(value.query) &&\n (value.type === \"admin\" || value.type === \"api\")\n );\n}\n\nfunction openClawCrablineProviderProbeRequest(\n manifest: CrablineServerManifest,\n): Pick<OpenClawCrablineRecorderEvent, \"method\" | \"path\"> {\n switch (manifest.provider) {\n case \"mattermost\":\n return {\n method: \"GET\",\n path: new URL(`${manifest.endpoints.apiRoot}/users/me`).pathname,\n };\n case \"matrix\":\n return {\n method: \"GET\",\n path: new URL(`${manifest.endpoints.clientApiRoot}/account/whoami`).pathname,\n };\n case \"signal\":\n return {\n method: \"GET\",\n path: new URL(\"/api/v1/check\", manifest.baseUrl).pathname,\n };\n case \"slack\":\n return {\n method: \"POST\",\n path: new URL(\"auth.test\", manifest.endpoints.apiRoot).pathname,\n };\n case \"telegram\":\n return { method: \"GET\", path: \"/bot<redacted>/getMe\" };\n case \"whatsapp\":\n return {\n method: \"GET\",\n path: new URL(manifest.endpoints.phoneNumberUrl).pathname,\n };\n case \"zalo\":\n return { method: \"POST\", path: \"/bot<redacted>/getMe\" };\n }\n}\n\nfunction assertOpenClawCrablineRecorderEvidence(\n contents: string,\n manifest: CrablineServerManifest,\n): void {\n const expectedRequest = openClawCrablineProviderProbeRequest(manifest);\n let recorderEvidence = false;\n for (const line of contents.split(/\\r?\\n/u)) {\n if (!line.trim()) {\n continue;\n }\n let event: unknown;\n try {\n event = JSON.parse(line);\n } catch (error) {\n throw new Error(\n \"OpenClaw Crabline provider probe produced no valid JSONL recorder evidence.\",\n { cause: error },\n );\n }\n if (!isOpenClawCrablineRecorderEvent(event)) {\n throw new Error(\n \"OpenClaw Crabline provider probe produced no valid JSONL recorder evidence.\",\n );\n }\n if (\n event.type === \"api\" &&\n event.method === expectedRequest.method &&\n event.path === expectedRequest.path\n ) {\n recorderEvidence = true;\n }\n }\n if (!recorderEvidence) {\n throw new Error(\"OpenClaw Crabline provider probe produced no valid JSONL recorder evidence.\");\n }\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 directory: SecuredPrivateDirectory,\n lock: Awaited<ReturnType<typeof acquireOpenClawCrablineSmokeRunLock>>,\n): Promise<void> {\n const directoryPath = directory.directoryPath;\n await directory.assertIdentityAt();\n for (const entry of await fs.readdir(directoryPath, { withFileTypes: true })) {\n await directory.assertIdentityAt();\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 await directory.assertIdentityAt();\n }\n await directory.assertIdentityAt();\n}\n\ntype RecorderSnapshotIdentity = {\n device: bigint;\n inode: bigint;\n userId: bigint;\n};\n\nfunction assertOwnedRecorderStats(\n stats: BigIntStats,\n expected?: RecorderSnapshotIdentity,\n): RecorderSnapshotIdentity {\n const currentUserId = process.geteuid?.();\n if (\n !stats.isFile() ||\n stats.nlink !== 1n ||\n stats.ino <= 0n ||\n (currentUserId !== undefined && stats.uid !== BigInt(currentUserId)) ||\n (expected !== undefined &&\n (stats.dev !== expected.device ||\n stats.ino !== expected.inode ||\n stats.uid !== expected.userId))\n ) {\n throw new Error(\"OpenClaw Crabline recorder snapshot identity is invalid.\");\n }\n return {\n device: stats.dev,\n inode: stats.ino,\n userId: stats.uid,\n };\n}\n\nasync function readOwnedRecorderSnapshot(\n recorderPath: string,\n directory: SecuredPrivateDirectory,\n): Promise<{ contents: string; identity: RecorderSnapshotIdentity }> {\n await directory.assertIdentityAt();\n const handle = await fs.open(recorderPath, \"r\");\n try {\n const identity = assertOwnedRecorderStats(await handle.stat({ bigint: true }));\n assertOwnedRecorderStats(await fs.lstat(recorderPath, { bigint: true }), identity);\n const contents = await handle.readFile(\"utf8\");\n await directory.assertIdentityAt();\n assertOwnedRecorderStats(await fs.lstat(recorderPath, { bigint: true }), identity);\n return { contents, identity };\n } finally {\n await handle.close();\n }\n}\n\nasync function removeOwnedRecorderTemporary(params: {\n directory: SecuredPrivateDirectory;\n identity?: RecorderSnapshotIdentity;\n recorderPath: string;\n syncParent: (filePath: string) => Promise<void>;\n}): Promise<void> {\n await params.directory.assertIdentityAt();\n let stats: BigIntStats;\n try {\n stats = await fs.lstat(params.recorderPath, { bigint: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n await params.syncParent(params.recorderPath);\n return;\n }\n throw error;\n }\n assertOwnedRecorderStats(stats, params.identity);\n await fs.rm(params.recorderPath);\n await params.directory.assertIdentityAt();\n await params.syncParent(params.recorderPath);\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 syncParent?: typeof syncParentDirectory;\n};\n\nfunction attachOpenClawCrablineProbeCleanupFailure(\n probeFailure: Error,\n cleanupError: unknown,\n): void {\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}\n\nasync function waitForOpenClawCrablineProbeCleanup(probeSettlement: Promise<void>): Promise<void> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n probeSettlement,\n new Promise<void>((resolve) => {\n timeout = setTimeout(resolve, OPENCLAW_CRABLINE_PROVIDER_PROBE_CLEANUP_GRACE_MS);\n }),\n ]);\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\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 syncRecorderParent = dependencies.syncParent ?? syncParentDirectory;\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 recorderDirectory: SecuredPrivateDirectory | undefined;\n let recorderIdentity: RecorderSnapshotIdentity | undefined;\n let recorderPath: string | undefined;\n\n try {\n const artifactsDirectory = await securePrivateDirectory(path.join(outputDir, \"artifacts\"));\n recorderDirectory = await securePrivateDirectory(\n path.join(artifactsDirectory.directoryPath, \"crabline\"),\n );\n await artifactsDirectory.assertIdentityAt();\n await recorderDirectory.assertIdentityAt();\n await reclaimOpenClawCrablineRecorderTemporaries(recorderDirectory, smokeLock);\n recorderPath = path.join(\n recorderDirectory.directoryPath,\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 let probeSettlement: Promise<void> | undefined;\n try {\n probe = await adapter.probe();\n } catch (error) {\n probeFailed = true;\n probeFailure = error;\n probeSettlement = getUnsettledOpenClawCrablineProviderProbe(error);\n }\n if (probeSettlement) {\n await waitForOpenClawCrablineProbeCleanup(probeSettlement);\n try {\n await adapter.close();\n } catch (cleanupError) {\n if (probeFailure instanceof Error) {\n attachOpenClawCrablineProbeCleanupFailure(probeFailure, cleanupError);\n } else {\n const combinedError = new Error(\n \"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 }\n } else {\n try {\n await adapter.close();\n } catch (cleanupError) {\n if (!probeFailed) {\n throw cleanupError;\n }\n if (probeFailure instanceof Error) {\n attachOpenClawCrablineProbeCleanupFailure(probeFailure, cleanupError);\n throw probeFailure;\n }\n const combinedError = new Error(\n \"OpenClaw Crabline provider probe and cleanup both failed.\",\n {\n cause: cleanupError,\n },\n );\n Object.defineProperty(combinedError, \"errors\", {\n value: [probeFailure, cleanupError],\n });\n throw combinedError;\n }\n }\n if (probeFailed) {\n throw probeFailure;\n }\n const recorderSnapshot = await readOwnedRecorderSnapshot(recorderPath, recorderDirectory);\n recorderIdentity = recorderSnapshot.identity;\n const recorderSnapshotContents = recorderSnapshot.contents;\n assertOpenClawCrablineRecorderEvidence(recorderSnapshotContents, adapter.manifest);\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 removeOwnedRecorderTemporary({\n directory: recorderDirectory,\n identity: recorderIdentity,\n recorderPath,\n syncParent: syncRecorderParent,\n });\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 && recorderDirectory) {\n try {\n await removeOwnedRecorderTemporary({\n directory: recorderDirectory,\n ...(recorderIdentity ? { identity: recorderIdentity } : {}),\n recorderPath,\n syncParent: syncRecorderParent,\n });\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"]}
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 { DISCORD_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from \"./openclaw/bridges/discord.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_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 getUnsettledOpenClawCrablineProviderProbe,\n isRecord,\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 {\n securePrivateDirectory,\n syncParentDirectory,\n type SecuredPrivateDirectory,\n} from \"./openclaw/private-file.js\";\nimport {\n acquireOpenClawCrablineProviderReadinessLock,\n releaseOpenClawCrablineProviderReadinessLock,\n} from \"./openclaw/provider-readiness-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_PROVIDER_READINESS_PATH,\n OPENCLAW_CRABLINE_DEFAULT_CHANNEL,\n OPENCLAW_CRABLINE_MANIFEST_PATH,\n};\nexport type {\n OpenClawCrablineAgentDelivery,\n OpenClawCrablineChannelDriverSelection,\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 discord: DISCORD_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,\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]+)-provider-server\\.[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;\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_CLEANUP_GRACE_MS = 250;\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 hasStringRecordValues(value: unknown): value is Record<string, string> {\n return isRecord(value) && Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\ntype OpenClawCrablineRecorderEvent = {\n accepted: true;\n at: string;\n method: string;\n path: string;\n query: Record<string, string>;\n type: \"admin\" | \"api\";\n};\n\nfunction isOpenClawCrablineRecorderEvent(value: unknown): value is OpenClawCrablineRecorderEvent {\n return (\n isRecord(value) &&\n value.accepted === true &&\n typeof value.at === \"string\" &&\n Number.isFinite(Date.parse(value.at)) &&\n typeof value.method === \"string\" &&\n value.method.length > 0 &&\n typeof value.path === \"string\" &&\n value.path.startsWith(\"/\") &&\n hasStringRecordValues(value.query) &&\n (value.type === \"admin\" || value.type === \"api\")\n );\n}\n\nfunction openClawCrablineProviderProbeRequest(\n manifest: CrablineServerManifest,\n): Pick<OpenClawCrablineRecorderEvent, \"method\" | \"path\"> {\n switch (manifest.provider) {\n case \"discord\":\n return {\n method: \"GET\",\n path: new URL(`${manifest.endpoints.apiRoot}/v10/users/@me`).pathname,\n };\n case \"mattermost\":\n return {\n method: \"GET\",\n path: new URL(`${manifest.endpoints.apiRoot}/users/me`).pathname,\n };\n case \"matrix\":\n return {\n method: \"GET\",\n path: new URL(`${manifest.endpoints.clientApiRoot}/account/whoami`).pathname,\n };\n case \"signal\":\n return {\n method: \"GET\",\n path: new URL(\"/api/v1/check\", manifest.baseUrl).pathname,\n };\n case \"slack\":\n return {\n method: \"POST\",\n path: new URL(\"auth.test\", manifest.endpoints.apiRoot).pathname,\n };\n case \"telegram\":\n return { method: \"GET\", path: \"/bot<redacted>/getMe\" };\n case \"whatsapp\":\n return {\n method: \"GET\",\n path: new URL(manifest.endpoints.phoneNumberUrl).pathname,\n };\n case \"zalo\":\n return { method: \"POST\", path: \"/bot<redacted>/getMe\" };\n }\n}\n\nfunction assertOpenClawCrablineRecorderEvidence(\n contents: string,\n manifest: CrablineServerManifest,\n): void {\n const expectedRequest = openClawCrablineProviderProbeRequest(manifest);\n let recorderEvidence = false;\n for (const line of contents.split(/\\r?\\n/u)) {\n if (!line.trim()) {\n continue;\n }\n let event: unknown;\n try {\n event = JSON.parse(line);\n } catch (error) {\n throw new Error(\n \"OpenClaw Crabline provider probe produced no valid JSONL recorder evidence.\",\n { cause: error },\n );\n }\n if (!isOpenClawCrablineRecorderEvent(event)) {\n throw new Error(\n \"OpenClaw Crabline provider probe produced no valid JSONL recorder evidence.\",\n );\n }\n if (\n event.type === \"api\" &&\n event.method === expectedRequest.method &&\n event.path === expectedRequest.path\n ) {\n recorderEvidence = true;\n }\n }\n if (!recorderEvidence) {\n throw new Error(\"OpenClaw Crabline provider probe produced no valid JSONL recorder evidence.\");\n }\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 acquireOpenClawCrablineProviderReadinessLock>>,\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 directory: SecuredPrivateDirectory,\n lock: Awaited<ReturnType<typeof acquireOpenClawCrablineProviderReadinessLock>>,\n): Promise<void> {\n const directoryPath = directory.directoryPath;\n await directory.assertIdentityAt();\n for (const entry of await fs.readdir(directoryPath, { withFileTypes: true })) {\n await directory.assertIdentityAt();\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 await directory.assertIdentityAt();\n }\n await directory.assertIdentityAt();\n}\n\ntype RecorderSnapshotIdentity = {\n device: bigint;\n inode: bigint;\n userId: bigint;\n};\n\nfunction assertOwnedRecorderStats(\n stats: BigIntStats,\n expected?: RecorderSnapshotIdentity,\n): RecorderSnapshotIdentity {\n const currentUserId = process.geteuid?.();\n if (\n !stats.isFile() ||\n stats.nlink !== 1n ||\n stats.ino <= 0n ||\n (currentUserId !== undefined && stats.uid !== BigInt(currentUserId)) ||\n (expected !== undefined &&\n (stats.dev !== expected.device ||\n stats.ino !== expected.inode ||\n stats.uid !== expected.userId))\n ) {\n throw new Error(\"OpenClaw Crabline recorder snapshot identity is invalid.\");\n }\n return {\n device: stats.dev,\n inode: stats.ino,\n userId: stats.uid,\n };\n}\n\nasync function readOwnedRecorderSnapshot(\n recorderPath: string,\n directory: SecuredPrivateDirectory,\n): Promise<{ contents: string; identity: RecorderSnapshotIdentity }> {\n await directory.assertIdentityAt();\n const handle = await fs.open(recorderPath, \"r\");\n try {\n const identity = assertOwnedRecorderStats(await handle.stat({ bigint: true }));\n assertOwnedRecorderStats(await fs.lstat(recorderPath, { bigint: true }), identity);\n const contents = await handle.readFile(\"utf8\");\n await directory.assertIdentityAt();\n assertOwnedRecorderStats(await fs.lstat(recorderPath, { bigint: true }), identity);\n return { contents, identity };\n } finally {\n await handle.close();\n }\n}\n\nasync function removeOwnedRecorderTemporary(params: {\n directory: SecuredPrivateDirectory;\n identity?: RecorderSnapshotIdentity;\n recorderPath: string;\n syncParent: (filePath: string) => Promise<void>;\n}): Promise<void> {\n await params.directory.assertIdentityAt();\n let stats: BigIntStats;\n try {\n stats = await fs.lstat(params.recorderPath, { bigint: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n await params.syncParent(params.recorderPath);\n return;\n }\n throw error;\n }\n assertOwnedRecorderStats(stats, params.identity);\n await fs.rm(params.recorderPath);\n await params.directory.assertIdentityAt();\n await params.syncParent(params.recorderPath);\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 };\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 } as StartCrablineServerParams);\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 acquireOpenClawCrablineProviderReadinessLock;\n publishGeneration?: typeof publishOpenClawCrablineArtifactGeneration;\n releaseLock?: typeof releaseOpenClawCrablineProviderReadinessLock;\n startAdapter?: typeof startOpenClawCrablineAdapter;\n syncParent?: typeof syncParentDirectory;\n};\n\nfunction attachOpenClawCrablineProbeCleanupFailure(\n probeFailure: Error,\n cleanupError: unknown,\n): void {\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}\n\nasync function waitForOpenClawCrablineProbeCleanup(probeSettlement: Promise<void>): Promise<void> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n probeSettlement,\n new Promise<void>((resolve) => {\n timeout = setTimeout(resolve, OPENCLAW_CRABLINE_PROVIDER_PROBE_CLEANUP_GRACE_MS);\n }),\n ]);\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\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 ?? releaseOpenClawCrablineProviderReadinessLock;\n const syncRecorderParent = dependencies.syncParent ?? syncParentDirectory;\n const providerReadinessLock = await (\n dependencies.acquireLock ?? acquireOpenClawCrablineProviderReadinessLock\n )({\n channel: params.selection.channel,\n outputDir,\n });\n let outcome:\n | { committed: false; error: unknown }\n | { committed: true; result: OpenClawCrablineProviderReadinessResult };\n let recorderDirectory: SecuredPrivateDirectory | undefined;\n let recorderIdentity: RecorderSnapshotIdentity | undefined;\n let recorderPath: string | undefined;\n\n try {\n const artifactsDirectory = await securePrivateDirectory(path.join(outputDir, \"artifacts\"));\n recorderDirectory = await securePrivateDirectory(\n path.join(artifactsDirectory.directoryPath, \"crabline\"),\n );\n await artifactsDirectory.assertIdentityAt();\n await recorderDirectory.assertIdentityAt();\n await reclaimOpenClawCrablineRecorderTemporaries(recorderDirectory, providerReadinessLock);\n recorderPath = path.join(\n recorderDirectory.directoryPath,\n `.${params.selection.channel}-provider-server.${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 let probeSettlement: Promise<void> | undefined;\n try {\n probe = await adapter.probe();\n } catch (error) {\n probeFailed = true;\n probeFailure = error;\n probeSettlement = getUnsettledOpenClawCrablineProviderProbe(error);\n }\n if (probeSettlement) {\n await waitForOpenClawCrablineProbeCleanup(probeSettlement);\n try {\n await adapter.close();\n } catch (cleanupError) {\n if (probeFailure instanceof Error) {\n attachOpenClawCrablineProbeCleanupFailure(probeFailure, cleanupError);\n } else {\n const combinedError = new Error(\n \"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 }\n } else {\n try {\n await adapter.close();\n } catch (cleanupError) {\n if (!probeFailed) {\n throw cleanupError;\n }\n if (probeFailure instanceof Error) {\n attachOpenClawCrablineProbeCleanupFailure(probeFailure, cleanupError);\n throw probeFailure;\n }\n const combinedError = new Error(\n \"OpenClaw Crabline provider probe and cleanup both failed.\",\n {\n cause: cleanupError,\n },\n );\n Object.defineProperty(combinedError, \"errors\", {\n value: [probeFailure, cleanupError],\n });\n throw combinedError;\n }\n }\n if (probeFailed) {\n throw probeFailure;\n }\n const recorderSnapshot = await readOwnedRecorderSnapshot(recorderPath, recorderDirectory);\n recorderIdentity = recorderSnapshot.identity;\n const recorderSnapshotContents = recorderSnapshot.contents;\n assertOpenClawCrablineRecorderEvidence(recorderSnapshotContents, adapter.manifest);\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: providerReadinessLock,\n manifest: adapter.manifest,\n outputDir,\n recorderSnapshot: {\n contents: recorderSnapshotContents,\n fileName: `${params.selection.channel}-provider-server.jsonl`,\n },\n selection: params.selection,\n providerReadiness,\n });\n let recorderCleanupWarning: string | undefined;\n try {\n await removeOwnedRecorderTemporary({\n directory: recorderDirectory,\n identity: recorderIdentity,\n recorderPath,\n syncParent: syncRecorderParent,\n });\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 ...(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 && recorderDirectory) {\n try {\n await removeOwnedRecorderTemporary({\n directory: recorderDirectory,\n ...(recorderIdentity ? { identity: recorderIdentity } : {}),\n recorderPath,\n syncParent: syncRecorderParent,\n });\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(providerReadinessLock);\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 provider readiness 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(\n \"OpenClaw Crabline provider readiness and lock cleanup both failed.\",\n {\n cause: cleanupError,\n },\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 provider readiness 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\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}.`,\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"]}
@@ -0,0 +1,40 @@
1
+ import { type ServerEventObserver } from "./recorder.js";
2
+ export type DiscordServerManifest = {
3
+ adminToken: string;
4
+ applicationId: string;
5
+ baseUrl: string;
6
+ botToken: string;
7
+ botUserId: string;
8
+ endpoints: {
9
+ adminInboundUrl: string;
10
+ apiRoot: string;
11
+ gatewayBotUrl: string;
12
+ gatewayUrl: string;
13
+ };
14
+ env: {
15
+ DISCORD_BOT_TOKEN: string;
16
+ };
17
+ provider: "discord";
18
+ recorderPath: string;
19
+ version: 1;
20
+ };
21
+ export type StartedDiscordServer = {
22
+ close(): Promise<void>;
23
+ manifest: DiscordServerManifest;
24
+ };
25
+ export type StartDiscordServerParams = {
26
+ adminToken?: string | undefined;
27
+ applicationId?: string | undefined;
28
+ botToken?: string | undefined;
29
+ botUserId?: string | undefined;
30
+ botUsername?: string | undefined;
31
+ heartbeatIntervalMs?: number | undefined;
32
+ host?: string | undefined;
33
+ identifyTimeoutMs?: number | undefined;
34
+ maxGatewayPayloadBytes?: number | undefined;
35
+ onEvent?: ServerEventObserver | undefined;
36
+ port?: number | undefined;
37
+ recorderPath?: string | undefined;
38
+ };
39
+ export declare function discordDirectChannelId(botUserId: string, recipientId: string): string;
40
+ export declare function startDiscordServer(params?: StartDiscordServerParams): Promise<StartedDiscordServer>;