@openclaw/crabline 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -22
- package/assets/crabline-banner.svg +20 -0
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +25 -1
- package/dist/src/cli/program.js +579 -82
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +59 -6
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +116 -92
- package/dist/src/config/schema.js +179 -73
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.js +9 -2
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/exit-codes.js.map +1 -1
- package/dist/src/core/matcher.js +7 -6
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/message-template.js.map +1 -1
- package/dist/src/core/nonces.d.ts +1 -0
- package/dist/src/core/nonces.js +4 -2
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +1 -0
- package/dist/src/core/reporters.js +42 -4
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -0
- package/dist/src/core/run.js +415 -107
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/core/safe-regex.d.ts +3 -0
- package/dist/src/core/safe-regex.js +21 -0
- package/dist/src/core/safe-regex.js.map +1 -0
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/artifact-generation.d.ts +38 -0
- package/dist/src/openclaw/artifact-generation.js +314 -0
- package/dist/src/openclaw/artifact-generation.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +97 -12
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +32 -10
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/signal.js +55 -18
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +85 -7
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +124 -30
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +78 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +14 -5
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.d.ts +5 -0
- package/dist/src/openclaw/outbound-contract.js +40 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -0
- package/dist/src/openclaw/private-file.d.ts +26 -0
- package/dist/src/openclaw/private-file.js +411 -0
- package/dist/src/openclaw/private-file.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +23 -2
- package/dist/src/openclaw/shared.js +115 -18
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.d.ts +63 -0
- package/dist/src/openclaw/smoke-lock.js +949 -0
- package/dist/src/openclaw/smoke-lock.js.map +1 -0
- package/dist/src/openclaw.d.ts +16 -8
- package/dist/src/openclaw.js +195 -52
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/providers/builtin/discord.d.ts +10 -1
- package/dist/src/providers/builtin/discord.js +144 -18
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
- package/dist/src/providers/builtin/feishu.d.ts +19 -2
- package/dist/src/providers/builtin/feishu.js +307 -25
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +20 -1
- package/dist/src/providers/builtin/googlechat.js +178 -19
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.d.ts +4 -0
- package/dist/src/providers/builtin/imessage.js +26 -11
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +92 -30
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +11 -1
- package/dist/src/providers/builtin/matrix.js +53 -29
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +10 -0
- package/dist/src/providers/builtin/mattermost.js +38 -15
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +17 -1
- package/dist/src/providers/builtin/msteams.js +113 -14
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
- package/dist/src/providers/builtin/native-local-mock.js +12 -35
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.d.ts +11 -15
- package/dist/src/providers/builtin/script.js +566 -104
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +6 -0
- package/dist/src/providers/builtin/slack.js +99 -40
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +6 -0
- package/dist/src/providers/builtin/telegram.js +64 -43
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
- package/dist/src/providers/builtin/whatsapp.js +567 -30
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.js +30 -19
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +3 -3
- package/dist/src/providers/catalog.js +3 -3
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +11 -2
- package/dist/src/providers/local-mock.js +322 -96
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +1 -0
- package/dist/src/providers/native-ids.js +6 -1
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +30 -2
- package/dist/src/providers/recorder.js +539 -70
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +25 -1
- package/dist/src/providers/registry.js +280 -40
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +29 -0
- package/dist/src/providers/signed-jwt.js +202 -0
- package/dist/src/providers/signed-jwt.js.map +1 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +26 -0
- package/dist/src/providers/target-normalizers.js +276 -0
- package/dist/src/providers/target-normalizers.js.map +1 -0
- package/dist/src/providers/types.d.ts +5 -0
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +2 -0
- package/dist/src/providers/webhook-server.js +72 -25
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/http.d.ts +23 -3
- package/dist/src/servers/http.js +213 -20
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/index.js +20 -21
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/matrix.d.ts +2 -0
- package/dist/src/servers/matrix.js +466 -52
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +7 -0
- package/dist/src/servers/mattermost.js +307 -59
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/pending-events.d.ts +2 -0
- package/dist/src/servers/pending-events.js +11 -0
- package/dist/src/servers/pending-events.js.map +1 -0
- package/dist/src/servers/recorder.d.ts +12 -0
- package/dist/src/servers/recorder.js +51 -0
- package/dist/src/servers/recorder.js.map +1 -0
- package/dist/src/servers/signal.d.ts +4 -0
- package/dist/src/servers/signal.js +445 -57
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +7 -0
- package/dist/src/servers/slack.js +516 -50
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.d.ts +113 -0
- package/dist/src/servers/telegram.js +814 -155
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +40 -0
- package/dist/src/servers/webhook-target.js +349 -0
- package/dist/src/servers/webhook-target.js.map +1 -0
- package/dist/src/servers/websocket.d.ts +2 -0
- package/dist/src/servers/websocket.js +29 -0
- package/dist/src/servers/websocket.js.map +1 -0
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +5 -0
- package/dist/src/servers/whatsapp-jid.js +32 -0
- package/dist/src/servers/whatsapp-jid.js.map +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
- package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +14 -7
- package/dist/src/servers/whatsapp.js +272 -110
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +16 -0
- package/dist/src/servers/zalo.js +524 -91
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +197 -19
- package/fixtures/examples/crabline.example.yaml +10 -0
- package/package.json +20 -15
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke-lock.js","sourceRoot":"","sources":["../../../src/openclaw/smoke-lock.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { spawnSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport fs, { type FileHandle } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { performance } from \"node:perf_hooks\";\nimport { isCrablineServerChannel, type CrablineServerChannel } from \"../servers/index.js\";\nimport { resolveWindowsPowerShellPath, securePrivateDirectory } from \"./private-file.js\";\nimport { OPENCLAW_CRABLINE_MANIFEST_PATH } from \"./shared.js\";\n\ntype LegacySmokeLockOwner = {\n channel: CrablineServerChannel;\n pid: number;\n token: string;\n};\n\ntype ProcessIdentifiedSmokeLockOwner = LegacySmokeLockOwner & {\n createdAtMs: number;\n processIdentity?: string;\n processStartedAtMs: number;\n};\n\ntype RenewableSmokeLockOwner = ProcessIdentifiedSmokeLockOwner & {\n leaseVersion: 1;\n};\n\ntype SmokeLockOwner =\n | LegacySmokeLockOwner\n | ProcessIdentifiedSmokeLockOwner\n | RenewableSmokeLockOwner;\n\ntype SmokeLockRecord = {\n owner: SmokeLockOwner;\n renewedAtMs: number;\n};\n\nexport type OpenClawCrablineSmokeRunLock = {\n assertOwned(): Promise<void>;\n commitFileAtomically(params: {\n contents: string;\n destinationPath: string;\n stageDirectory?: string;\n stageFile(filePath: string, contents: string): Promise<void>;\n }): Promise<void>;\n release(): Promise<void>;\n};\n\ntype HeartbeatController = {\n assertHealthy(): void;\n settle(): Promise<void>;\n stop(): Promise<void>;\n};\ntype RemoveLockDirectory = (lockDirectory: string) => Promise<void>;\ntype Sleep = (delayMs: number) => Promise<void>;\ntype IsProcessAlive = (pid: number) => boolean;\ntype GetProcessIdentity = (pid: number) => string | null;\ntype StartHeartbeat = (renew: () => Promise<void>, intervalMs: number) => HeartbeatController;\ntype BeforeRecoveryClaim = () => Promise<void>;\ntype BeforeRecoveryDeleteClaim = () => Promise<void>;\ntype BeforeReleaseClaim = () => Promise<void>;\ntype BeforeCommitClaim = () => Promise<void>;\ntype BeforeCommitFileRename = () => Promise<void>;\ntype BeforeCommitRename = () => Promise<void>;\ntype SecureWindowsDirectory = (directoryPath: string) => Promise<void>;\ntype AfterLockDirectoryWrite = (directoryPath: string) => Promise<void>;\ntype LockClaimKind = \"commit\" | \"recovering\" | \"release\";\ntype LockClaim = {\n directoryPath: string;\n kind: LockClaimKind;\n};\ntype DirectoryIdentity = {\n device: bigint;\n inode: bigint;\n};\n\ntype SmokeLockRuntime = {\n currentProcessIdentity: string | null;\n currentPid: number;\n currentProcessStartedAtMs: number;\n getProcessIdentity: GetProcessIdentity;\n isProcessAlive: IsProcessAlive;\n leaseMs: number;\n now: () => number;\n sleep: Sleep;\n};\n\nconst LOCK_OWNER_FILE = \"owner.json\";\nconst LOCK_COMMIT_STAGE_FILE_PREFIX = \"commit-stage\";\nconst LOCK_LEASE_FILE_PREFIX = \"lease.\";\nconst LEGACY_RECOVERY_SUFFIX = \".recovering\";\nconst COMMIT_CLAIM_SUFFIX = \".commit\";\nconst RELEASE_CLAIM_SUFFIX = \".release\";\nconst LOCK_LEASE_MS = 10 * 60 * 1000;\nconst RELEASE_ATTEMPTS = 3;\nconst RELEASE_RETRY_DELAY_MS = 10;\nconst MAX_PROCESS_ID = 2_147_483_647;\nconst CURRENT_PROCESS_STARTED_AT_MS = processStartedAtMsFromTimeOrigin(performance.timeOrigin);\n\nexport function processStartedAtMsFromTimeOrigin(timeOrigin: number): number {\n if (\n !Number.isFinite(timeOrigin) ||\n timeOrigin <= 0 ||\n !Number.isSafeInteger(Math.trunc(timeOrigin))\n ) {\n throw new Error(\"Process time origin is invalid.\");\n }\n return Math.trunc(timeOrigin);\n}\n\nfunction parseCommitStagePath(contents: string, token: string): string {\n let value: { path?: unknown; token?: unknown };\n try {\n value = JSON.parse(contents) as { path?: unknown; token?: unknown };\n } catch (error) {\n throw new Error(\"OpenClaw Crabline smoke lock commit stage metadata is malformed.\", {\n cause: error,\n });\n }\n const expectedPrefix = `.commit-file.${token}.`;\n if (\n value.token !== token ||\n typeof value.path !== \"string\" ||\n !path.isAbsolute(value.path) ||\n !path.basename(value.path).startsWith(expectedPrefix) ||\n !path.basename(value.path).endsWith(\".tmp\")\n ) {\n throw new Error(\"OpenClaw Crabline smoke lock commit stage metadata is malformed.\");\n }\n return value.path;\n}\n\nasync function readCommitStagePath(lockDirectory: string, token: string): Promise<string | null> {\n try {\n return parseCommitStagePath(\n await fs.readFile(path.join(lockDirectory, commitStageFileName(token)), \"utf8\"),\n token,\n );\n } catch (error) {\n if (isMissingPathError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nfunction commitStageFileName(token: string): string {\n return `${LOCK_COMMIT_STAGE_FILE_PREFIX}.${token}.json`;\n}\n\nasync function writeCommitStagePath(\n lockDirectory: string,\n stagedFilePath: string,\n token: string,\n): Promise<void> {\n const temporaryPath = path.join(\n lockDirectory,\n `.${commitStageFileName(token)}.${randomUUID()}.tmp`,\n );\n try {\n await fs.writeFile(temporaryPath, `${JSON.stringify({ path: stagedFilePath, token })}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await fs.chmod(temporaryPath, 0o600);\n await fs.rename(temporaryPath, path.join(lockDirectory, commitStageFileName(token)));\n } finally {\n await fs.rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nconst removeLockDirectory: RemoveLockDirectory = async (lockDirectory) => {\n await fs.rm(lockDirectory, { force: true, recursive: true });\n};\n\nconst sleep: Sleep = async (delayMs) => {\n await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n};\n\nconst startHeartbeat: StartHeartbeat = (renew, intervalMs) => {\n let failure: unknown;\n let pending: Promise<void> | undefined;\n let stopped = false;\n let timer: NodeJS.Timeout | undefined;\n\n const schedule = () => {\n if (stopped) {\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n pending = renew()\n .catch((error: unknown) => {\n failure ??= error;\n })\n .finally(() => {\n pending = undefined;\n schedule();\n });\n }, intervalMs);\n timer.unref();\n };\n\n schedule();\n return {\n assertHealthy() {\n if (failure !== undefined) {\n throw new Error(\"OpenClaw Crabline smoke lock heartbeat failed.\", { cause: failure });\n }\n },\n async settle() {\n await pending;\n },\n async stop() {\n stopped = true;\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n await pending;\n },\n };\n};\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch (error) {\n if (isMissingPathError(error)) {\n return false;\n }\n throw error;\n }\n}\n\nasync function readDirectoryIdentity(directoryPath: string): Promise<DirectoryIdentity | null> {\n try {\n const stats = await fs.lstat(directoryPath, { bigint: true });\n if (!stats.isDirectory() || stats.ino <= 0n) {\n throw new Error(\"OpenClaw Crabline smoke lock claim is not a directory.\");\n }\n return {\n device: stats.dev,\n inode: stats.ino,\n };\n } catch (error) {\n if (isMissingPathError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nfunction hasSameDirectoryIdentity(\n left: DirectoryIdentity | null,\n right: DirectoryIdentity | null,\n): boolean {\n return (\n left !== null && right !== null && left.device === right.device && left.inode === right.inode\n );\n}\n\nfunction isPositiveSafeInteger(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) > 0;\n}\n\nfunction isValidProcessId(value: unknown): value is number {\n return isPositiveSafeInteger(value) && Number(value) <= MAX_PROCESS_ID;\n}\n\nconst LOCK_TOKEN_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;\n\nfunction parseLockOwner(contents: string): SmokeLockOwner {\n let owner: Partial<RenewableSmokeLockOwner>;\n try {\n owner = JSON.parse(contents) as Partial<RenewableSmokeLockOwner>;\n } catch (error) {\n throw new Error(\"OpenClaw Crabline smoke lock owner metadata is malformed.\", {\n cause: error,\n });\n }\n if (\n typeof owner.channel !== \"string\" ||\n !isCrablineServerChannel(owner.channel) ||\n !isValidProcessId(owner.pid) ||\n typeof owner.token !== \"string\" ||\n !LOCK_TOKEN_PATTERN.test(owner.token)\n ) {\n throw new Error(\"OpenClaw Crabline smoke lock owner metadata is malformed.\");\n }\n\n const hasCreatedAt = owner.createdAtMs !== undefined;\n const hasProcessStartedAt = owner.processStartedAtMs !== undefined;\n if (!hasCreatedAt && !hasProcessStartedAt && owner.leaseVersion === undefined) {\n return {\n channel: owner.channel,\n pid: owner.pid,\n token: owner.token,\n };\n }\n if (\n !isPositiveSafeInteger(owner.createdAtMs) ||\n !isPositiveSafeInteger(owner.processStartedAtMs) ||\n (owner.processIdentity !== undefined &&\n (typeof owner.processIdentity !== \"string\" ||\n owner.processIdentity.length === 0 ||\n owner.processIdentity.length > 256))\n ) {\n throw new Error(\"OpenClaw Crabline smoke lock owner metadata is malformed.\");\n }\n if (owner.leaseVersion === undefined) {\n return {\n channel: owner.channel,\n createdAtMs: owner.createdAtMs,\n pid: owner.pid,\n ...(owner.processIdentity ? { processIdentity: owner.processIdentity } : {}),\n processStartedAtMs: owner.processStartedAtMs,\n token: owner.token,\n };\n }\n if (owner.leaseVersion !== 1) {\n throw new Error(\"OpenClaw Crabline smoke lock owner metadata is malformed.\");\n }\n return {\n channel: owner.channel,\n createdAtMs: owner.createdAtMs,\n leaseVersion: owner.leaseVersion,\n pid: owner.pid,\n ...(owner.processIdentity ? { processIdentity: owner.processIdentity } : {}),\n processStartedAtMs: owner.processStartedAtMs,\n token: owner.token,\n };\n}\n\nfunction leaseFileName(token: string): string {\n return `${LOCK_LEASE_FILE_PREFIX}${token}.json`;\n}\n\nasync function readLockRecordFromHandle(handle: FileHandle): Promise<SmokeLockRecord> {\n const owner = parseLockOwner(await handle.readFile(\"utf8\"));\n const stats = await handle.stat();\n return {\n owner,\n renewedAtMs: Number.isFinite(stats.mtimeMs) && stats.mtimeMs > 0 ? stats.mtimeMs : 0,\n };\n}\n\ntype LockRecordReadResult = { kind: \"missing\" } | { kind: \"record\"; record: SmokeLockRecord };\n\nfunction isMissingPathError(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nasync function readLockRecord(lockDirectory: string): Promise<LockRecordReadResult> {\n let handle: FileHandle | undefined;\n try {\n handle = await fs.open(path.join(lockDirectory, LOCK_OWNER_FILE), \"r\");\n const record = await readLockRecordFromHandle(handle);\n if (isRenewableOwner(record.owner)) {\n try {\n const leaseStats = await fs.stat(\n path.join(lockDirectory, leaseFileName(record.owner.token)),\n );\n if (Number.isFinite(leaseStats.mtimeMs) && leaseStats.mtimeMs > 0) {\n record.renewedAtMs = Math.max(record.renewedAtMs, leaseStats.mtimeMs);\n }\n } catch (error) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n }\n }\n return { kind: \"record\", record };\n } catch (error) {\n if (isMissingPathError(error)) {\n return { kind: \"missing\" };\n }\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nfunction hasProcessIdentity(\n owner: SmokeLockOwner,\n): owner is ProcessIdentifiedSmokeLockOwner | RenewableSmokeLockOwner {\n return \"processStartedAtMs\" in owner;\n}\n\nfunction isRenewableOwner(owner: SmokeLockOwner): owner is RenewableSmokeLockOwner {\n return \"leaseVersion\" in owner && owner.leaseVersion === 1;\n}\n\nexport const isProcessAlive: IsProcessAlive = (pid) => {\n if (!isValidProcessId(pid)) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n};\n\nexport function processIdentityFromLinuxStat(value: string, bootId: string): string | null {\n const normalizedBootId = bootId.trim();\n if (!/^[0-9a-f-]{16,64}$/iu.test(normalizedBootId)) {\n return null;\n }\n const commandEnd = value.lastIndexOf(\") \");\n if (commandEnd < 0) {\n return null;\n }\n const fields = value\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u);\n const startTicks = fields[19];\n if (!startTicks || !/^\\d+$/u.test(startTicks)) {\n return null;\n }\n return `linux:${normalizedBootId}:${startTicks}`;\n}\n\nexport function processIdentityFromDarwin(\n processStartedAt: string,\n bootTime: string,\n): string | null {\n const bootMatch = /\\bsec = (\\d+), usec = (\\d+)\\b/u.exec(bootTime);\n const normalizedStartedAt = processStartedAt.trim().replace(/\\s+/gu, \" \");\n if (!bootMatch || normalizedStartedAt.length === 0 || normalizedStartedAt.length > 64) {\n return null;\n }\n return `darwin:${bootMatch[1]}.${bootMatch[2]}:${normalizedStartedAt}`;\n}\n\nexport function darwinProcessIdentityEnvironment(\n environment: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n return { ...environment, LC_ALL: \"C\", TZ: \"UTC\" };\n}\n\nconst getProcessIdentity: GetProcessIdentity = (pid) => {\n if (process.platform === \"linux\") {\n try {\n return processIdentityFromLinuxStat(\n readFileSync(`/proc/${pid}/stat`, \"utf8\"),\n readFileSync(\"/proc/sys/kernel/random/boot_id\", \"utf8\"),\n );\n } catch {\n return null;\n }\n }\n if (process.platform === \"darwin\") {\n const options = {\n encoding: \"utf8\" as const,\n env: darwinProcessIdentityEnvironment(process.env),\n timeout: 1_000,\n };\n const startedAt = spawnSync(\"ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], options);\n const bootTime = spawnSync(\"sysctl\", [\"-n\", \"kern.boottime\"], options);\n return startedAt.status === 0 && bootTime.status === 0\n ? processIdentityFromDarwin(startedAt.stdout, bootTime.stdout)\n : null;\n }\n if (process.platform !== \"win32\") {\n return null;\n }\n let powershellPath: string;\n try {\n powershellPath = resolveWindowsPowerShellPath(process.env.SystemRoot);\n } catch {\n return null;\n }\n const result = spawnSync(\n powershellPath,\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n `(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks.ToString()`,\n ],\n { encoding: \"utf8\", timeout: 1_000, windowsHide: true },\n );\n const ticks = result.status === 0 ? result.stdout.trim() : \"\";\n return /^\\d+$/u.test(ticks) ? `windows:${ticks}` : null;\n};\n\nfunction hasExactProcessIdentity(owner: SmokeLockOwner): owner is (\n | ProcessIdentifiedSmokeLockOwner\n | RenewableSmokeLockOwner\n) & {\n processIdentity: string;\n} {\n return hasProcessIdentity(owner) && typeof owner.processIdentity === \"string\";\n}\n\nfunction hasProcessIdentityMismatch(owner: SmokeLockOwner, runtime: SmokeLockRuntime): boolean {\n if (\n hasProcessIdentity(owner) &&\n owner.pid === runtime.currentPid &&\n owner.processStartedAtMs !== runtime.currentProcessStartedAtMs\n ) {\n return true;\n }\n if (!hasExactProcessIdentity(owner)) {\n return false;\n }\n const actualProcessIdentity =\n owner.pid === runtime.currentPid\n ? runtime.currentProcessIdentity\n : runtime.getProcessIdentity(owner.pid);\n return actualProcessIdentity !== null && owner.processIdentity !== actualProcessIdentity;\n}\n\nfunction isLockOwnerActive(record: SmokeLockRecord, runtime: SmokeLockRuntime): boolean {\n const { owner } = record;\n if (!runtime.isProcessAlive(owner.pid)) {\n return false;\n }\n if (hasProcessIdentityMismatch(owner, runtime)) {\n return false;\n }\n if (!isRenewableOwner(owner)) {\n return true;\n }\n const ageMs = runtime.now() - Math.max(owner.createdAtMs, record.renewedAtMs);\n return ageMs >= -runtime.leaseMs && ageMs <= runtime.leaseMs;\n}\n\nfunction needsLiveOwnerConfirmation(record: SmokeLockRecord, runtime: SmokeLockRuntime): boolean {\n return (\n isRenewableOwner(record.owner) &&\n runtime.isProcessAlive(record.owner.pid) &&\n !hasProcessIdentityMismatch(record.owner, runtime) &&\n !isLockOwnerActive(record, runtime)\n );\n}\n\nasync function observedOwnerChangedDuringConfirmation(\n lockDirectory: string,\n observed: SmokeLockRecord,\n runtime: SmokeLockRuntime,\n): Promise<boolean> {\n if (!needsLiveOwnerConfirmation(observed, runtime)) {\n return false;\n }\n await runtime.sleep(runtime.leaseMs);\n const revalidated = await readLockRecord(lockDirectory);\n return (\n revalidated.kind === \"record\" &&\n (revalidated.record.owner.token !== observed.owner.token ||\n revalidated.record.renewedAtMs !== observed.renewedAtMs ||\n isLockOwnerActive(revalidated.record, runtime))\n );\n}\n\nfunction activeRunError(params: {\n cause?: unknown;\n channel?: CrablineServerChannel;\n outputDir: string;\n requestedChannel: CrablineServerChannel;\n}): Error {\n return new Error(\n `OpenClaw Crabline smoke is already running for channel \"${params.channel ?? \"unknown\"}\" in \"${params.outputDir}\"; cannot start channel \"${params.requestedChannel}\".`,\n params.cause === undefined ? undefined : { cause: params.cause },\n );\n}\n\nasync function removeOwnedLock(params: {\n beforeClaim?: () => Promise<void>;\n lockDirectory: string;\n onOwnedDirectoryChange?: (directoryPath: string) => void;\n ownedDirectory: string;\n removeDirectory?: RemoveLockDirectory;\n runtime?: SmokeLockRuntime;\n token: string;\n}): Promise<boolean> {\n const observed = await readLockRecord(params.ownedDirectory);\n if (observed.kind === \"missing\" || observed.record.owner.token !== params.token) {\n return false;\n }\n const observedIdentity = await readDirectoryIdentity(params.ownedDirectory);\n if (observedIdentity === null) {\n return false;\n }\n\n await params.beforeClaim?.();\n const releaseClaim = `${params.lockDirectory}${RELEASE_CLAIM_SUFFIX}.${params.token}.${randomUUID()}`;\n try {\n await fs.rename(params.ownedDirectory, releaseClaim);\n } catch (error) {\n if (isMissingPathError(error)) {\n return false;\n }\n throw error;\n }\n params.onOwnedDirectoryChange?.(releaseClaim);\n\n const claimed = await readLockRecord(releaseClaim);\n const claimedIdentity = await readDirectoryIdentity(releaseClaim);\n if (\n claimed.kind === \"missing\" ||\n claimed.record.owner.token !== params.token ||\n !hasSameDirectoryIdentity(observedIdentity, claimedIdentity) ||\n (params.runtime !== undefined && isLockOwnerActive(claimed.record, params.runtime))\n ) {\n if (!(await pathExists(params.ownedDirectory))) {\n try {\n await fs.rename(releaseClaim, params.ownedDirectory);\n params.onOwnedDirectoryChange?.(params.ownedDirectory);\n } catch (error) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n }\n }\n return false;\n }\n\n const stagedFilePath = await readCommitStagePath(releaseClaim, params.token);\n if (stagedFilePath) {\n const revokedStagePath = path.join(\n path.dirname(stagedFilePath),\n `.revoked-commit-file.${params.token}.${randomUUID()}.tmp`,\n );\n try {\n await fs.rename(stagedFilePath, revokedStagePath);\n await fs.rm(revokedStagePath, { force: true });\n } catch (error) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n }\n }\n\n await (params.removeDirectory ?? removeLockDirectory)(releaseClaim);\n return true;\n}\n\nasync function renewOwnedLock(\n lockDirectory: string,\n token: string,\n renewedAtMs: number,\n): Promise<boolean> {\n const temporaryLeasePath = path.join(\n lockDirectory,\n `.${leaseFileName(token)}.${randomUUID()}.tmp`,\n );\n try {\n const observed = await readLockRecord(lockDirectory);\n if (\n observed.kind === \"missing\" ||\n observed.record.owner.token !== token ||\n !isRenewableOwner(observed.record.owner)\n ) {\n return false;\n }\n await fs.writeFile(temporaryLeasePath, `${JSON.stringify({ renewedAtMs, token })}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await fs.chmod(temporaryLeasePath, 0o600);\n const renewedAt = new Date(renewedAtMs);\n await fs.utimes(temporaryLeasePath, renewedAt, renewedAt);\n const revalidated = await readLockRecord(lockDirectory);\n if (\n revalidated.kind === \"missing\" ||\n revalidated.record.owner.token !== token ||\n !isRenewableOwner(revalidated.record.owner)\n ) {\n return false;\n }\n await fs.rename(temporaryLeasePath, path.join(lockDirectory, leaseFileName(token)));\n return true;\n } catch (error) {\n if (isMissingPathError(error)) {\n return false;\n }\n throw error;\n } finally {\n await fs.rm(temporaryLeasePath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction claimPrefix(lockDirectory: string, suffix: string): string {\n return `${path.basename(lockDirectory)}${suffix}.`;\n}\n\nasync function listLockClaims(lockDirectory: string): Promise<LockClaim[]> {\n const directory = path.dirname(lockDirectory);\n const prefixes: Array<{ kind: LockClaimKind; prefix: string }> = [\n { kind: \"recovering\", prefix: claimPrefix(lockDirectory, LEGACY_RECOVERY_SUFFIX) },\n { kind: \"commit\", prefix: claimPrefix(lockDirectory, COMMIT_CLAIM_SUFFIX) },\n { kind: \"release\", prefix: claimPrefix(lockDirectory, RELEASE_CLAIM_SUFFIX) },\n ];\n const entries = await fs.readdir(directory, { withFileTypes: true });\n const claims: LockClaim[] = [];\n for (const entry of entries) {\n const match = prefixes.find(({ prefix }) => entry.name.startsWith(prefix));\n if (!match) {\n continue;\n }\n if (!entry.isDirectory()) {\n throw new Error(\"OpenClaw Crabline smoke lock claim is not a directory.\");\n }\n claims.push({\n directoryPath: path.join(directory, entry.name),\n kind: match.kind,\n });\n }\n return claims.sort((left, right) => left.directoryPath.localeCompare(right.directoryPath));\n}\n\nasync function claimLegacyRecoveryDirectory(\n lockDirectory: string,\n expectedToken?: string,\n): Promise<void> {\n const legacyRecoveryDirectory = `${lockDirectory}${LEGACY_RECOVERY_SUFFIX}`;\n if (!(await pathExists(legacyRecoveryDirectory))) {\n return;\n }\n if (expectedToken !== undefined) {\n const observed = await readLockRecord(legacyRecoveryDirectory);\n if (observed.kind === \"missing\" || observed.record.owner.token !== expectedToken) {\n return;\n }\n }\n try {\n await fs.rename(\n legacyRecoveryDirectory,\n `${lockDirectory}${LEGACY_RECOVERY_SUFFIX}.${randomUUID()}`,\n );\n } catch (error) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n }\n}\n\nasync function resolveLockClaim(params: {\n beforeRecoveryDeleteClaim: BeforeRecoveryDeleteClaim;\n claim: LockClaim;\n lockDirectory: string;\n outputDir: string;\n requestedChannel: CrablineServerChannel;\n runtime: SmokeLockRuntime;\n}): Promise<void> {\n const observed = await readLockRecord(params.claim.directoryPath);\n if (observed.kind === \"missing\") {\n const discardDirectory = `${params.lockDirectory}.discard.${randomUUID()}`;\n try {\n await fs.rename(params.claim.directoryPath, discardDirectory);\n } catch (error) {\n if (isMissingPathError(error)) {\n return;\n }\n throw error;\n }\n const claimed = await readLockRecord(discardDirectory);\n if (claimed.kind === \"record\") {\n await fs.rename(discardDirectory, params.claim.directoryPath);\n await resolveLockClaim(params);\n return;\n }\n await fs.rm(discardDirectory, { force: true, recursive: true });\n return;\n }\n if (isLockOwnerActive(observed.record, params.runtime)) {\n if (params.claim.kind === \"recovering\") {\n try {\n await fs.rename(params.claim.directoryPath, params.lockDirectory);\n } catch (error) {\n if (!(await pathExists(params.lockDirectory))) {\n throw error;\n }\n }\n }\n throw activeRunError({\n channel: observed.record.owner.channel,\n outputDir: params.outputDir,\n requestedChannel: params.requestedChannel,\n });\n }\n if (\n await observedOwnerChangedDuringConfirmation(\n params.claim.directoryPath,\n observed.record,\n params.runtime,\n )\n ) {\n await resolveLockClaim(params);\n return;\n }\n\n const revalidated = await readLockRecord(params.claim.directoryPath);\n if (revalidated.kind === \"missing\") {\n await resolveLockClaim(params);\n return;\n }\n if (\n revalidated.record.owner.token !== observed.record.owner.token ||\n isLockOwnerActive(revalidated.record, params.runtime)\n ) {\n await resolveLockClaim(params);\n return;\n }\n if (\n !(await removeOwnedLock({\n beforeClaim: params.beforeRecoveryDeleteClaim,\n lockDirectory: params.lockDirectory,\n ownedDirectory: params.claim.directoryPath,\n runtime: params.runtime,\n token: revalidated.record.owner.token,\n }))\n ) {\n await resolveLockClaim(params);\n }\n}\n\nasync function resolveLockClaims(params: {\n beforeRecoveryDeleteClaim: BeforeRecoveryDeleteClaim;\n lockDirectory: string;\n outputDir: string;\n requestedChannel: CrablineServerChannel;\n runtime: SmokeLockRuntime;\n}): Promise<void> {\n await claimLegacyRecoveryDirectory(params.lockDirectory);\n for (const claim of await listLockClaims(params.lockDirectory)) {\n await resolveLockClaim({\n ...params,\n claim,\n });\n }\n}\n\nasync function resolveLockContention(params: {\n beforeRecoveryDeleteClaim: BeforeRecoveryDeleteClaim;\n cause: unknown;\n lockDirectory: string;\n outputDir: string;\n requestedChannel: CrablineServerChannel;\n runtime: SmokeLockRuntime;\n beforeRecoveryClaim: BeforeRecoveryClaim;\n}): Promise<void> {\n const observed = await readLockRecord(params.lockDirectory);\n if (observed.kind === \"record\" && isLockOwnerActive(observed.record, params.runtime)) {\n throw activeRunError({\n cause: params.cause,\n channel: observed.record.owner.channel,\n outputDir: params.outputDir,\n requestedChannel: params.requestedChannel,\n });\n }\n if (\n observed.kind === \"record\" &&\n (await observedOwnerChangedDuringConfirmation(\n params.lockDirectory,\n observed.record,\n params.runtime,\n ))\n ) {\n await resolveLockContention(params);\n return;\n }\n\n await params.beforeRecoveryClaim();\n const claimDirectory = `${params.lockDirectory}${LEGACY_RECOVERY_SUFFIX}.${randomUUID()}`;\n try {\n await fs.rename(params.lockDirectory, claimDirectory);\n } catch (error) {\n if (!(await pathExists(params.lockDirectory))) {\n await resolveLockClaims(params);\n return;\n }\n throw error;\n }\n\n await resolveLockClaim({\n ...params,\n claim: {\n directoryPath: claimDirectory,\n kind: \"recovering\",\n },\n });\n}\n\nasync function createLockCandidate(params: {\n afterOwnerWrite?: AfterLockDirectoryWrite;\n lockDirectory: string;\n owner: RenewableSmokeLockOwner;\n platform?: NodeJS.Platform;\n secureWindowsDirectory?: SecureWindowsDirectory;\n}): Promise<{\n candidateDirectory: string;\n securedDirectory: Awaited<ReturnType<typeof securePrivateDirectory>>;\n}> {\n const candidateDirectory = `${params.lockDirectory}.${params.owner.pid}.${params.owner.token}.tmp`;\n await fs.mkdir(candidateDirectory, { mode: 0o700 });\n try {\n const securedDirectory = await securePrivateDirectory(candidateDirectory, {\n ...(params.platform ? { platform: params.platform } : {}),\n ...(params.secureWindowsDirectory\n ? { secureWindowsDirectory: params.secureWindowsDirectory }\n : {}),\n });\n await securedDirectory.assertIdentityAt();\n const ownerPath = path.join(candidateDirectory, LOCK_OWNER_FILE);\n await fs.writeFile(ownerPath, `${JSON.stringify(params.owner)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await fs.chmod(ownerPath, 0o600);\n const createdAt = new Date(params.owner.createdAtMs);\n await fs.utimes(ownerPath, createdAt, createdAt);\n await params.afterOwnerWrite?.(candidateDirectory);\n await securedDirectory.assertIdentityAt();\n\n const leasePath = path.join(candidateDirectory, leaseFileName(params.owner.token));\n await fs.writeFile(\n leasePath,\n `${JSON.stringify({ renewedAtMs: params.owner.createdAtMs, token: params.owner.token })}\\n`,\n {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n },\n );\n await fs.chmod(leasePath, 0o600);\n await fs.utimes(leasePath, createdAt, createdAt);\n await securedDirectory.assertIdentityAt();\n return { candidateDirectory, securedDirectory };\n } catch (error) {\n await fs.rm(candidateDirectory, { force: true, recursive: true }).catch(() => undefined);\n throw error;\n }\n}\n\nexport async function acquireOpenClawCrablineSmokeRunLock(\n params: {\n channel: CrablineServerChannel;\n outputDir: string;\n },\n dependencies: {\n afterLockCandidateInstall?: AfterLockDirectoryWrite;\n afterLockOwnerWrite?: AfterLockDirectoryWrite;\n getProcessIdentity?: GetProcessIdentity;\n isProcessAlive?: IsProcessAlive;\n leaseMs?: number;\n now?: () => number;\n pid?: number;\n processIdentity?: string | null;\n processStartedAtMs?: number;\n platform?: NodeJS.Platform;\n secureWindowsDirectory?: SecureWindowsDirectory;\n beforeCommitClaim?: BeforeCommitClaim;\n beforeCommitFileRename?: BeforeCommitFileRename;\n beforeCommitRename?: BeforeCommitRename;\n beforeRecoveryDeleteClaim?: BeforeRecoveryDeleteClaim;\n beforeRecoveryClaim?: BeforeRecoveryClaim;\n beforeReleaseClaim?: BeforeReleaseClaim;\n removeDirectory?: RemoveLockDirectory;\n sleep?: Sleep;\n startHeartbeat?: StartHeartbeat;\n } = {},\n): Promise<OpenClawCrablineSmokeRunLock> {\n const outputDir = path.resolve(params.outputDir);\n const lockDirectory = path.join(outputDir, `.${OPENCLAW_CRABLINE_MANIFEST_PATH}.lock`);\n const token = randomUUID();\n const currentPid = dependencies.pid ?? process.pid;\n const getRuntimeProcessIdentity = dependencies.getProcessIdentity ?? getProcessIdentity;\n const runtime: SmokeLockRuntime = {\n currentPid,\n currentProcessIdentity:\n dependencies.processIdentity === undefined\n ? getRuntimeProcessIdentity(currentPid)\n : dependencies.processIdentity,\n currentProcessStartedAtMs: dependencies.processStartedAtMs ?? CURRENT_PROCESS_STARTED_AT_MS,\n getProcessIdentity: getRuntimeProcessIdentity,\n isProcessAlive: dependencies.isProcessAlive ?? isProcessAlive,\n leaseMs: dependencies.leaseMs ?? LOCK_LEASE_MS,\n now: dependencies.now ?? Date.now,\n sleep: dependencies.sleep ?? sleep,\n };\n const createdAtMs = runtime.now();\n if (\n !isValidProcessId(runtime.currentPid) ||\n (runtime.currentProcessIdentity !== null &&\n (runtime.currentProcessIdentity.length === 0 ||\n runtime.currentProcessIdentity.length > 256)) ||\n !isPositiveSafeInteger(runtime.currentProcessStartedAtMs) ||\n !isPositiveSafeInteger(runtime.leaseMs) ||\n !isPositiveSafeInteger(createdAtMs)\n ) {\n throw new Error(\"Invalid OpenClaw Crabline smoke lock runtime.\");\n }\n const owner: RenewableSmokeLockOwner = {\n channel: params.channel,\n createdAtMs,\n leaseVersion: 1,\n pid: runtime.currentPid,\n ...(runtime.currentProcessIdentity ? { processIdentity: runtime.currentProcessIdentity } : {}),\n processStartedAtMs: runtime.currentProcessStartedAtMs,\n token,\n };\n\n await fs.mkdir(outputDir, { recursive: true });\n for (;;) {\n const lockClaims = await listLockClaims(lockDirectory);\n if (lockClaims.length > 0 || (await pathExists(`${lockDirectory}${LEGACY_RECOVERY_SUFFIX}`))) {\n await resolveLockClaims({\n beforeRecoveryDeleteClaim:\n dependencies.beforeRecoveryDeleteClaim ?? (async () => undefined),\n lockDirectory,\n outputDir,\n requestedChannel: params.channel,\n runtime,\n });\n continue;\n }\n\n const { candidateDirectory, securedDirectory } = await createLockCandidate({\n ...(dependencies.afterLockOwnerWrite\n ? { afterOwnerWrite: dependencies.afterLockOwnerWrite }\n : {}),\n lockDirectory,\n owner,\n ...(dependencies.platform ? { platform: dependencies.platform } : {}),\n ...(dependencies.secureWindowsDirectory\n ? { secureWindowsDirectory: dependencies.secureWindowsDirectory }\n : {}),\n });\n try {\n await fs.rename(candidateDirectory, lockDirectory);\n } catch (error) {\n await fs.rm(candidateDirectory, { force: true, recursive: true }).catch(() => undefined);\n await resolveLockContention({\n beforeRecoveryDeleteClaim:\n dependencies.beforeRecoveryDeleteClaim ?? (async () => undefined),\n cause: error,\n lockDirectory,\n outputDir,\n requestedChannel: params.channel,\n runtime,\n beforeRecoveryClaim: dependencies.beforeRecoveryClaim ?? (async () => undefined),\n });\n continue;\n }\n await dependencies.afterLockCandidateInstall?.(lockDirectory);\n await securedDirectory.assertIdentityAt(lockDirectory);\n\n if (\n (await listLockClaims(lockDirectory)).length > 0 ||\n (await pathExists(`${lockDirectory}${LEGACY_RECOVERY_SUFFIX}`))\n ) {\n await removeOwnedLock({\n lockDirectory,\n ownedDirectory: lockDirectory,\n token,\n });\n await resolveLockClaims({\n beforeRecoveryDeleteClaim:\n dependencies.beforeRecoveryDeleteClaim ?? (async () => undefined),\n lockDirectory,\n outputDir,\n requestedChannel: params.channel,\n runtime,\n });\n continue;\n }\n const installed = await readLockRecord(lockDirectory);\n if (installed.kind !== \"record\" || installed.record.owner.token !== token) {\n continue;\n }\n\n let ownedDirectory = lockDirectory;\n let commitFenceConsumed = false;\n let heartbeat: HeartbeatController;\n const renew = async () => {\n const renewedAtMs = runtime.now();\n if (!(await renewOwnedLock(ownedDirectory, token, renewedAtMs))) {\n throw new Error(\"OpenClaw Crabline smoke lock ownership was lost.\");\n }\n };\n try {\n heartbeat = (dependencies.startHeartbeat ?? startHeartbeat)(\n renew,\n Math.max(1, Math.floor(runtime.leaseMs / 3)),\n );\n } catch (error) {\n await removeOwnedLock({\n lockDirectory,\n ownedDirectory: lockDirectory,\n token,\n });\n throw error;\n }\n let heartbeatStopped = false;\n let released = false;\n return {\n async assertOwned() {\n if (released) {\n throw new Error(\"OpenClaw Crabline smoke lock has already been released.\");\n }\n heartbeat.assertHealthy();\n await renew();\n heartbeat.assertHealthy();\n },\n async commitFileAtomically({ contents, destinationPath, stageDirectory, stageFile }) {\n if (released) {\n throw new Error(\"OpenClaw Crabline smoke lock has already been released.\");\n }\n if (commitFenceConsumed || heartbeatStopped || ownedDirectory !== lockDirectory) {\n throw new Error(\"OpenClaw Crabline smoke lock has already committed its fence.\");\n }\n heartbeat.assertHealthy();\n await renew();\n heartbeat.assertHealthy();\n\n const stagedFileName = `.commit-file.${token}.${randomUUID()}.tmp`;\n const stagedFilePath = path.join(stageDirectory ?? lockDirectory, stagedFileName);\n let committed = false;\n try {\n await stageFile(stagedFilePath, contents);\n if (stageDirectory) {\n await writeCommitStagePath(lockDirectory, stagedFilePath, token);\n }\n heartbeat.assertHealthy();\n await renew();\n heartbeat.assertHealthy();\n\n const observedIdentity = await readDirectoryIdentity(lockDirectory);\n const observed = await readLockRecord(lockDirectory);\n if (\n observedIdentity === null ||\n observed.kind === \"missing\" ||\n observed.record.owner.token !== token\n ) {\n throw new Error(\"OpenClaw Crabline smoke lock ownership was lost.\");\n }\n\n await dependencies.beforeCommitClaim?.();\n const commitClaim = `${lockDirectory}${COMMIT_CLAIM_SUFFIX}.${token}.${randomUUID()}`;\n try {\n await fs.rename(lockDirectory, commitClaim);\n } catch (error) {\n if (isMissingPathError(error)) {\n throw new Error(\"OpenClaw Crabline smoke lock ownership was lost.\", {\n cause: error,\n });\n }\n throw error;\n }\n ownedDirectory = commitClaim;\n commitFenceConsumed = true;\n\n const claimed = await readLockRecord(commitClaim);\n const claimedIdentity = await readDirectoryIdentity(commitClaim);\n if (\n claimed.kind === \"missing\" ||\n claimed.record.owner.token !== token ||\n !hasSameDirectoryIdentity(observedIdentity, claimedIdentity)\n ) {\n if (!(await pathExists(lockDirectory))) {\n try {\n await fs.rename(commitClaim, lockDirectory);\n ownedDirectory = lockDirectory;\n } catch (error) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n }\n }\n throw new Error(\"OpenClaw Crabline smoke lock commit fence was lost.\");\n }\n\n await dependencies.beforeCommitFileRename?.();\n heartbeat.assertHealthy();\n await renew();\n heartbeat.assertHealthy();\n await heartbeat.settle();\n heartbeat.assertHealthy();\n await dependencies.beforeCommitRename?.();\n await fs.rename(\n stageDirectory ? stagedFilePath : path.join(commitClaim, stagedFileName),\n destinationPath,\n );\n committed = true;\n } finally {\n if (!committed && stageDirectory) {\n await fs.rm(stagedFilePath, { force: true }).catch(() => undefined);\n }\n }\n },\n async release() {\n if (released) {\n return;\n }\n if (!heartbeatStopped) {\n await heartbeat.stop();\n heartbeatStopped = true;\n }\n await removeOwnedLock({\n ...(dependencies.beforeReleaseClaim\n ? { beforeClaim: dependencies.beforeReleaseClaim }\n : {}),\n lockDirectory,\n onOwnedDirectoryChange: (directoryPath) => {\n ownedDirectory = directoryPath;\n },\n ownedDirectory,\n ...(dependencies.removeDirectory\n ? { removeDirectory: dependencies.removeDirectory }\n : {}),\n token,\n });\n await claimLegacyRecoveryDirectory(lockDirectory, token);\n for (const claim of await listLockClaims(lockDirectory)) {\n await removeOwnedLock({\n lockDirectory,\n ownedDirectory: claim.directoryPath,\n ...(dependencies.removeDirectory\n ? { removeDirectory: dependencies.removeDirectory }\n : {}),\n token,\n });\n }\n released = true;\n },\n };\n }\n}\n\nexport async function releaseOpenClawCrablineSmokeRunLock(\n lock: Pick<OpenClawCrablineSmokeRunLock, \"release\">,\n dependencies: {\n sleep?: Sleep;\n } = {},\n): Promise<void> {\n for (let attempt = 1; ; attempt += 1) {\n try {\n await lock.release();\n return;\n } catch (error) {\n if (attempt === RELEASE_ATTEMPTS) {\n throw error;\n }\n await (dependencies.sleep ?? sleep)(RELEASE_RETRY_DELAY_MS * 2 ** (attempt - 1));\n }\n }\n}\n"]}
|
package/dist/src/openclaw.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { type CrablineServerChannel, type CrablineServerManifest } from "./servers/index.js";
|
|
2
|
-
import { OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, type OpenClawCrablineAgentDelivery, type OpenClawCrablineChannelDriverSelection, type
|
|
3
|
-
export { OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, };
|
|
4
|
-
export type { OpenClawCrablineAgentDelivery, OpenClawCrablineChannelDriverSelection, OpenClawCrablineChannelDriverSmokeResult, OpenClawCrablineConversation, OpenClawCrablineGatewayBinding, OpenClawCrablineInbound, OpenClawCrablineInboundInput, OpenClawCrablineOutboundMessage, StartedOpenClawCrablineAdapter, StartOpenClawCrablineAdapterParams, } from "./openclaw/shared.js";
|
|
1
|
+
import { type CrablineServerChannel, type CrablineServerManifest, type StartCrablineServerParams, type StartedCrablineServer } from "./servers/index.js";
|
|
2
|
+
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, type OpenClawCrablineAgentDelivery, type OpenClawCrablineChannelDriverSelection, type OpenClawCrablineProviderReadinessResult, type OpenClawCrablineGatewayBinding, type OpenClawCrablineInbound, type OpenClawCrablineInboundInput, type OpenClawCrablineOutboundMessage, type OpenClawCrablineProviderAdapter, type StartedOpenClawCrablineAdapter, type StartOpenClawCrablineAdapterParams } from "./openclaw/shared.js";
|
|
3
|
+
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, };
|
|
4
|
+
export type { OpenClawCrablineAgentDelivery, OpenClawCrablineChannelDriverSelection, OpenClawCrablineChannelDriverSmokeResult, OpenClawCrablineProviderReadinessResult, OpenClawCrablineConversation, OpenClawCrablineGatewayBinding, OpenClawCrablineInbound, OpenClawCrablineInboundInput, OpenClawCrablineOutboundMessage, StartedOpenClawCrablineAdapter, StartOpenClawCrablineAdapterParams, } from "./openclaw/shared.js";
|
|
5
|
+
declare function createOpenClawCrablineProviderAdapter(manifest: CrablineServerManifest): OpenClawCrablineProviderAdapter;
|
|
5
6
|
export declare function resolveOpenClawCrablineChannel(input?: string | null): CrablineServerChannel;
|
|
6
7
|
export declare function resolveOpenClawCrablineChannelDriverSelection(params: {
|
|
7
8
|
channel?: string | null;
|
|
8
|
-
}): OpenClawCrablineChannelDriverSelection
|
|
9
|
+
}): OpenClawCrablineChannelDriverSelection & {
|
|
10
|
+
providerReadinessArtifactPath: typeof OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH;
|
|
11
|
+
};
|
|
9
12
|
export declare function probeOpenClawCrablineProvider(manifest: CrablineServerManifest): Promise<unknown>;
|
|
10
13
|
export declare function createOpenClawCrablineProviderBinding(manifest: CrablineServerManifest): OpenClawCrablineGatewayBinding;
|
|
11
14
|
export declare function createOpenClawCrablineAgentDelivery(params: {
|
|
@@ -21,9 +24,14 @@ export declare function createOpenClawCrablineOutboundFromRecorderEvent(params:
|
|
|
21
24
|
manifest: CrablineServerManifest;
|
|
22
25
|
targetByProviderTarget: ReadonlyMap<string, string>;
|
|
23
26
|
}): OpenClawCrablineOutboundMessage | null;
|
|
24
|
-
export declare function startOpenClawCrablineAdapter(params: StartOpenClawCrablineAdapterParams
|
|
25
|
-
|
|
27
|
+
export declare function startOpenClawCrablineAdapter(params: StartOpenClawCrablineAdapterParams, dependencies?: {
|
|
28
|
+
createProviderAdapter?: typeof createOpenClawCrablineProviderAdapter;
|
|
29
|
+
startServer?: (params: StartCrablineServerParams) => Promise<StartedCrablineServer>;
|
|
30
|
+
}): Promise<StartedOpenClawCrablineAdapter>;
|
|
31
|
+
export declare function runOpenClawCrablineProviderReadiness(params: {
|
|
26
32
|
outputDir: string;
|
|
27
33
|
selection: OpenClawCrablineChannelDriverSelection;
|
|
28
|
-
}): Promise<
|
|
34
|
+
}): Promise<OpenClawCrablineProviderReadinessResult>;
|
|
35
|
+
/** @deprecated Use runOpenClawCrablineProviderReadiness. */
|
|
36
|
+
export declare const runOpenClawCrablineChannelDriverSmoke: typeof runOpenClawCrablineProviderReadiness;
|
|
29
37
|
export declare function createOpenClawCrablineChannelReportNotes(selection: OpenClawCrablineChannelDriverSelection | null | undefined): string[];
|
package/dist/src/openclaw.js
CHANGED
|
@@ -6,10 +6,13 @@ import { SIGNAL_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/sig
|
|
|
6
6
|
import { TELEGRAM_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/telegram.js";
|
|
7
7
|
import { WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/whatsapp.js";
|
|
8
8
|
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";
|
|
9
|
+
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";
|
|
10
|
+
import { publishOpenClawCrablineArtifactGeneration } from "./openclaw/artifact-generation.js";
|
|
11
|
+
import { isAcceptedOpenClawCrablineOutbound } from "./openclaw/outbound-contract.js";
|
|
12
|
+
import { acquireOpenClawCrablineSmokeRunLock, releaseOpenClawCrablineSmokeRunLock, } from "./openclaw/smoke-lock.js";
|
|
10
13
|
import fs from "node:fs/promises";
|
|
11
14
|
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, };
|
|
15
|
+
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
16
|
const OPENCLAW_CRABLINE_PROVIDER_BRIDGES = {
|
|
14
17
|
mattermost: MATTERMOST_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
|
|
15
18
|
matrix: MATRIX_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
|
|
@@ -23,12 +26,24 @@ const OPENCLAW_CRABLINE_PROVIDER_BRIDGE_LIST = Object.values(OPENCLAW_CRABLINE_P
|
|
|
23
26
|
function createOpenClawCrablineProviderAdapter(manifest) {
|
|
24
27
|
const bridge = OPENCLAW_CRABLINE_PROVIDER_BRIDGE_LIST.find((candidate) => candidate.provider === manifest.provider);
|
|
25
28
|
if (bridge) {
|
|
26
|
-
|
|
29
|
+
const adapter = bridge.createAdapterFromManifest(manifest);
|
|
30
|
+
return {
|
|
31
|
+
...adapter,
|
|
32
|
+
createOutboundFromRecorderEvent: (params) => isAcceptedOpenClawCrablineOutbound({
|
|
33
|
+
event: params.event,
|
|
34
|
+
manifest,
|
|
35
|
+
})
|
|
36
|
+
? adapter.createOutboundFromRecorderEvent(params)
|
|
37
|
+
: null,
|
|
38
|
+
probe: () => runOpenClawCrablineProviderProbe(manifest.provider, (signal) => adapter.probe(signal)),
|
|
39
|
+
};
|
|
27
40
|
}
|
|
28
41
|
throw new Error("Unsupported OpenClaw provider binding.");
|
|
29
42
|
}
|
|
30
43
|
export function resolveOpenClawCrablineChannel(input) {
|
|
31
|
-
const channel = input
|
|
44
|
+
const channel = input === undefined || input === null
|
|
45
|
+
? OPENCLAW_CRABLINE_DEFAULT_CHANNEL
|
|
46
|
+
: input.trim().toLowerCase();
|
|
32
47
|
if (isCrablineServerChannel(channel)) {
|
|
33
48
|
return channel;
|
|
34
49
|
}
|
|
@@ -39,6 +54,7 @@ export function resolveOpenClawCrablineChannelDriverSelection(params) {
|
|
|
39
54
|
channel: resolveOpenClawCrablineChannel(params.channel),
|
|
40
55
|
channelDriver: "crabline",
|
|
41
56
|
capabilityMatrixPath: OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,
|
|
57
|
+
providerReadinessArtifactPath: OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH,
|
|
42
58
|
smokeArtifactPath: OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,
|
|
43
59
|
};
|
|
44
60
|
}
|
|
@@ -60,73 +76,200 @@ export function createOpenClawCrablineOutboundFromRecorderEvent(params) {
|
|
|
60
76
|
targetByProviderTarget: params.targetByProviderTarget,
|
|
61
77
|
});
|
|
62
78
|
}
|
|
63
|
-
export async function startOpenClawCrablineAdapter(params) {
|
|
64
|
-
const server = await startCrablineServer({
|
|
79
|
+
export async function startOpenClawCrablineAdapter(params, dependencies = {}) {
|
|
80
|
+
const server = await (dependencies.startServer ?? startCrablineServer)({
|
|
65
81
|
channel: params.channel,
|
|
82
|
+
onEvent: params.onEvent,
|
|
66
83
|
recorderPath: params.recorderPath,
|
|
67
84
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
event,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
try {
|
|
86
|
+
const providerAdapter = (dependencies.createProviderAdapter ?? createOpenClawCrablineProviderAdapter)(server.manifest);
|
|
87
|
+
const binding = providerAdapter.createBinding();
|
|
88
|
+
return {
|
|
89
|
+
...binding,
|
|
90
|
+
close: server.close,
|
|
91
|
+
createGatewayConfig: (openclawConfig = params.openclawConfig ?? {}) => binding.createGatewayConfig(openclawConfig),
|
|
92
|
+
createAgentDelivery: ({ target }) => providerAdapter.createAgentDelivery(parseQaTarget(target)),
|
|
93
|
+
createInbound: ({ input }) => providerAdapter.createInbound(input),
|
|
94
|
+
createOutboundFromRecorderEvent: ({ event, targetByProviderTarget }) => providerAdapter.createOutboundFromRecorderEvent({
|
|
95
|
+
event,
|
|
96
|
+
targetByProviderTarget,
|
|
97
|
+
}),
|
|
98
|
+
manifest: server.manifest,
|
|
99
|
+
probe: () => providerAdapter.probe(),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
try {
|
|
104
|
+
await server.close();
|
|
105
|
+
}
|
|
106
|
+
catch (closeError) {
|
|
107
|
+
const aggregateError = new AggregateError([error, closeError], "OpenClaw Crabline adapter startup failed.");
|
|
108
|
+
aggregateError.cause = error;
|
|
109
|
+
throw aggregateError;
|
|
110
|
+
}
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
83
113
|
}
|
|
84
|
-
export async function
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
await
|
|
88
|
-
const adapter = await startOpenClawCrablineAdapter({
|
|
114
|
+
export async function runOpenClawCrablineProviderReadiness(params, dependencies = {}) {
|
|
115
|
+
const outputDir = path.resolve(params.outputDir);
|
|
116
|
+
const releaseLock = dependencies.releaseLock ?? releaseOpenClawCrablineSmokeRunLock;
|
|
117
|
+
const smokeLock = await (dependencies.acquireLock ?? acquireOpenClawCrablineSmokeRunLock)({
|
|
89
118
|
channel: params.selection.channel,
|
|
90
|
-
|
|
91
|
-
recorderPath,
|
|
119
|
+
outputDir,
|
|
92
120
|
});
|
|
121
|
+
let outcome;
|
|
93
122
|
try {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
123
|
+
const recorderPath = path.join(outputDir, "artifacts", "crabline", `${params.selection.channel}-fake-provider.jsonl`);
|
|
124
|
+
await fs.mkdir(path.dirname(recorderPath), { recursive: true });
|
|
125
|
+
const adapter = await (dependencies.startAdapter ?? startOpenClawCrablineAdapter)({
|
|
126
|
+
channel: params.selection.channel,
|
|
127
|
+
openclawConfig: {},
|
|
128
|
+
recorderPath,
|
|
129
|
+
});
|
|
130
|
+
let probe;
|
|
131
|
+
let probeFailed = false;
|
|
132
|
+
let probeFailure;
|
|
133
|
+
try {
|
|
134
|
+
probe = await adapter.probe();
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
probeFailed = true;
|
|
138
|
+
probeFailure = error;
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
await adapter.close();
|
|
142
|
+
}
|
|
143
|
+
catch (cleanupError) {
|
|
144
|
+
if (!probeFailed) {
|
|
145
|
+
throw cleanupError;
|
|
146
|
+
}
|
|
147
|
+
if (probeFailure instanceof Error) {
|
|
148
|
+
const existingCause = probeFailure.cause;
|
|
149
|
+
try {
|
|
150
|
+
Object.defineProperty(probeFailure, "cause", {
|
|
151
|
+
configurable: true,
|
|
152
|
+
value: existingCause === undefined
|
|
153
|
+
? cleanupError
|
|
154
|
+
: new AggregateError([existingCause, cleanupError], "OpenClaw Crabline provider probe cleanup also failed."),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Some provider errors are frozen; preserving the primary failure is authoritative.
|
|
159
|
+
}
|
|
160
|
+
throw probeFailure;
|
|
161
|
+
}
|
|
162
|
+
const combinedError = new Error("OpenClaw Crabline provider probe and cleanup both failed.", {
|
|
163
|
+
cause: cleanupError,
|
|
164
|
+
});
|
|
165
|
+
Object.defineProperty(combinedError, "errors", {
|
|
166
|
+
value: [probeFailure, cleanupError],
|
|
167
|
+
});
|
|
168
|
+
throw combinedError;
|
|
169
|
+
}
|
|
170
|
+
if (probeFailed) {
|
|
171
|
+
throw probeFailure;
|
|
172
|
+
}
|
|
173
|
+
const capabilityReport = {
|
|
174
|
+
result: {
|
|
175
|
+
driver: "crabline",
|
|
176
|
+
selectedChannel: params.selection.channel,
|
|
177
|
+
supportedChannels: [...CRABLINE_SERVER_CHANNELS],
|
|
103
178
|
},
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
179
|
+
};
|
|
180
|
+
const providerReadiness = {
|
|
181
|
+
result: {
|
|
182
|
+
ok: true,
|
|
183
|
+
proof: "provider-api-probe",
|
|
184
|
+
ready: true,
|
|
185
|
+
probe,
|
|
186
|
+
provider: adapter.manifest.provider,
|
|
187
|
+
endpoints: adapter.manifest.endpoints,
|
|
188
|
+
recorderPath: path.relative(outputDir, adapter.manifest.recorderPath),
|
|
114
189
|
},
|
|
115
190
|
};
|
|
191
|
+
const generation = await (dependencies.publishGeneration ?? publishOpenClawCrablineArtifactGeneration)({
|
|
192
|
+
capabilityReport,
|
|
193
|
+
lock: smokeLock,
|
|
194
|
+
manifest: adapter.manifest,
|
|
195
|
+
outputDir,
|
|
196
|
+
selection: params.selection,
|
|
197
|
+
providerReadiness,
|
|
198
|
+
});
|
|
199
|
+
outcome = {
|
|
200
|
+
committed: true,
|
|
201
|
+
result: {
|
|
202
|
+
artifactPointerPath: generation.pointerPath,
|
|
203
|
+
capabilityReport,
|
|
204
|
+
capabilityMatrixPath: generation.capabilityMatrixPath,
|
|
205
|
+
generation: generation.generation,
|
|
206
|
+
manifestPath: generation.manifestPath,
|
|
207
|
+
providerReadiness: generation.providerReadiness,
|
|
208
|
+
providerReadinessArtifactPath: generation.providerReadinessArtifactPath,
|
|
209
|
+
smoke: generation.providerReadiness,
|
|
210
|
+
smokeArtifactPath: generation.providerReadinessArtifactPath,
|
|
211
|
+
...(generation.warnings ? { warnings: generation.warnings } : {}),
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
outcome = { committed: false, error };
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
await releaseLock(smokeLock);
|
|
220
|
+
}
|
|
221
|
+
catch (cleanupError) {
|
|
222
|
+
// The pointer switch is authoritative; lock removal cannot roll it back.
|
|
223
|
+
if (!outcome.committed) {
|
|
224
|
+
if (outcome.error instanceof Error) {
|
|
225
|
+
const existingCause = outcome.error.cause;
|
|
226
|
+
try {
|
|
227
|
+
Object.defineProperty(outcome.error, "cause", {
|
|
228
|
+
configurable: true,
|
|
229
|
+
value: existingCause === undefined
|
|
230
|
+
? cleanupError
|
|
231
|
+
: new AggregateError([existingCause, cleanupError], "OpenClaw Crabline smoke failure cleanup also failed."),
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Some failures are frozen; preserving the primary error is authoritative.
|
|
236
|
+
}
|
|
237
|
+
throw outcome.error;
|
|
238
|
+
}
|
|
239
|
+
const combinedError = new Error("OpenClaw Crabline smoke and lock cleanup both failed.", {
|
|
240
|
+
cause: cleanupError,
|
|
241
|
+
});
|
|
242
|
+
Object.defineProperty(combinedError, "errors", {
|
|
243
|
+
value: [outcome.error, cleanupError],
|
|
244
|
+
});
|
|
245
|
+
throw combinedError;
|
|
246
|
+
}
|
|
247
|
+
const detail = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
|
|
248
|
+
outcome.result = {
|
|
249
|
+
...outcome.result,
|
|
250
|
+
warnings: [
|
|
251
|
+
...(outcome.result.warnings ?? []),
|
|
252
|
+
`OpenClaw Crabline smoke committed but lock cleanup failed: ${detail}`,
|
|
253
|
+
],
|
|
254
|
+
};
|
|
116
255
|
}
|
|
117
|
-
|
|
118
|
-
|
|
256
|
+
if (!outcome.committed) {
|
|
257
|
+
throw outcome.error;
|
|
119
258
|
}
|
|
259
|
+
return outcome.result;
|
|
120
260
|
}
|
|
261
|
+
/** @deprecated Use runOpenClawCrablineProviderReadiness. */
|
|
262
|
+
export const runOpenClawCrablineChannelDriverSmoke = runOpenClawCrablineProviderReadiness;
|
|
121
263
|
export function createOpenClawCrablineChannelReportNotes(selection) {
|
|
122
264
|
if (!selection) {
|
|
123
265
|
return [];
|
|
124
266
|
}
|
|
125
267
|
return [
|
|
126
268
|
`Channel driver: ${selection.channelDriver} local provider for ${selection.channel}.`,
|
|
127
|
-
`Channel
|
|
128
|
-
`
|
|
129
|
-
|
|
269
|
+
`Channel artifact pointer: ${OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH}.`,
|
|
270
|
+
`Generation capability filename: ${selection.capabilityMatrixPath}.`,
|
|
271
|
+
`Generation provider-readiness filename: ${selection.providerReadinessArtifactPath ?? selection.smokeArtifactPath}.`,
|
|
272
|
+
"Crabline verifies the local provider API is ready; OpenClaw channel behavior is proven separately by QA scenarios that run the real channel adapter.",
|
|
130
273
|
];
|
|
131
274
|
}
|
|
132
275
|
//# sourceMappingURL=openclaw.js.map
|
package/dist/src/openclaw.js.map
CHANGED
|
@@ -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":"AAAA,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,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,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;AAE/C,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;AAaD,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,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;IAEzE,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,SAAS,EACT,WAAW,EACX,UAAU,EACV,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,sBAAsB,CAClD,CAAC;QACF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,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,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;QACvB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,YAAY,CAAC;YACrB,CAAC;YACD,IAAI,YAAY,YAAY,KAAK,EAAE,CAAC;gBAClC,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE;wBAC3C,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,uDAAuD,CACxD;qBACR,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,oFAAoF;gBACtF,CAAC;gBACD,MAAM,YAAY,CAAC;YACrB,CAAC;YACD,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,2DAA2D,EAAE;gBAC3F,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;YACH,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,EAAE;gBAC7C,KAAK,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;aACpC,CAAC,CAAC;YACH,MAAM,aAAa,CAAC;QACtB,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,YAAY,CAAC;QACrB,CAAC;QAED,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,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,iBAAiB;SAClB,CAAC,CAAC;QACH,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,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACxC,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 {\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 {\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[];\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\n try {\n const recorderPath = path.join(\n outputDir,\n \"artifacts\",\n \"crabline\",\n `${params.selection.channel}-fake-provider.jsonl`,\n );\n await fs.mkdir(path.dirname(recorderPath), { recursive: true });\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\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 selection: params.selection,\n providerReadiness,\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 ? { warnings: generation.warnings } : {}),\n },\n };\n } catch (error) {\n outcome = { committed: false, error };\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,
|
|
22
|
+
constructor(id: string, config: ProviderConfig, userName: string, runtime?: unknown);
|
|
14
23
|
}
|
|
15
24
|
export {};
|