@openclaw/crabline 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -23
- package/dist/src/bin/crabline.js +3 -1
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +5 -1
- package/dist/src/cli/program.js +281 -52
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +39 -3
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +20 -0
- package/dist/src/config/schema.js +163 -35
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.d.ts +1 -0
- package/dist/src/core/errors.js +6 -3
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/http-path.d.ts +1 -0
- package/dist/src/core/http-path.js +14 -0
- package/dist/src/core/http-path.js.map +1 -0
- package/dist/src/core/matcher.d.ts +3 -1
- package/dist/src/core/matcher.js +58 -2
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/nonces.d.ts +2 -0
- package/dist/src/core/nonces.js +11 -1
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +5 -0
- package/dist/src/core/reporters.js +26 -2
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -1
- package/dist/src/core/run.js +178 -66
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/index.d.ts +12 -10
- package/dist/src/index.js +6 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/matrix-ids.d.ts +5 -0
- package/dist/src/matrix-ids.js +83 -0
- package/dist/src/matrix-ids.js.map +1 -0
- package/dist/src/openclaw/artifact-generation.d.ts +7 -6
- package/dist/src/openclaw/artifact-generation.js +385 -41
- package/dist/src/openclaw/artifact-generation.js.map +1 -1
- package/dist/src/openclaw/bridges/discord.d.ts +1 -0
- package/dist/src/openclaw/bridges/discord.js +149 -0
- package/dist/src/openclaw/bridges/discord.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +22 -5
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +14 -9
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
- package/dist/src/openclaw/bridges/probe-response.js +5 -0
- package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
- package/dist/src/openclaw/bridges/signal.js +16 -7
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +117 -24
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +46 -20
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +33 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +9 -4
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.js +3 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -1
- package/dist/src/openclaw/private-file.d.ts +38 -3
- package/dist/src/openclaw/private-file.js +2008 -87
- package/dist/src/openclaw/private-file.js.map +1 -1
- package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +14 -5
- package/dist/src/openclaw/provider-readiness-lock.js +1320 -0
- package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +10 -17
- package/dist/src/openclaw/shared.js +53 -19
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw.d.ts +3 -5
- package/dist/src/openclaw.js +245 -60
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/platform/process-owned-lock.d.ts +11 -0
- package/dist/src/platform/process-owned-lock.js +1698 -0
- package/dist/src/platform/process-owned-lock.js.map +1 -0
- package/dist/src/platform/recorder-directory.d.ts +1 -0
- package/dist/src/platform/recorder-directory.js +14 -0
- package/dist/src/platform/recorder-directory.js.map +1 -0
- package/dist/src/platform/windows-acl.d.ts +18 -0
- package/dist/src/platform/windows-acl.js +1367 -0
- package/dist/src/platform/windows-acl.js.map +1 -0
- package/dist/src/platform/windows-lock-root.d.ts +13 -0
- package/dist/src/platform/windows-lock-root.js +98 -0
- package/dist/src/platform/windows-lock-root.js.map +1 -0
- package/dist/src/providers/builtin/discord.d.ts +4 -0
- package/dist/src/providers/builtin/discord.js +52 -9
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
- package/dist/src/providers/builtin/feishu.d.ts +1 -0
- package/dist/src/providers/builtin/feishu.js +96 -26
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +1 -0
- package/dist/src/providers/builtin/googlechat.js +95 -26
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.js +60 -17
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +88 -35
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +2 -2
- package/dist/src/providers/builtin/matrix.js +78 -21
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +11 -7
- package/dist/src/providers/builtin/mattermost.js +138 -24
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +1 -0
- package/dist/src/providers/builtin/msteams.js +118 -38
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.js +4 -4
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.js +1057 -146
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +8 -1
- package/dist/src/providers/builtin/slack.js +327 -24
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +1 -1
- package/dist/src/providers/builtin/telegram.js +55 -14
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
- package/dist/src/providers/builtin/whatsapp.js +157 -29
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.d.ts +5 -2
- package/dist/src/providers/builtin/zalo.js +31 -7
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +1 -1
- package/dist/src/providers/catalog.js +1 -1
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +4 -0
- package/dist/src/providers/local-mock.js +162 -35
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +2 -0
- package/dist/src/providers/native-ids.js +3 -0
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +14 -3
- package/dist/src/providers/recorder.js +521 -41
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +1 -0
- package/dist/src/providers/registry.js +65 -20
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +6 -1
- package/dist/src/providers/signed-jwt.js +241 -50
- package/dist/src/providers/signed-jwt.js.map +1 -1
- package/dist/src/providers/slack-ids.d.ts +1 -0
- package/dist/src/providers/slack-ids.js +5 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +9 -1
- package/dist/src/providers/target-normalizers.js +177 -58
- package/dist/src/providers/target-normalizers.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +3 -0
- package/dist/src/providers/webhook-server.js +268 -47
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/discord.d.ts +40 -0
- package/dist/src/servers/discord.js +842 -0
- package/dist/src/servers/discord.js.map +1 -0
- package/dist/src/servers/http.d.ts +14 -2
- package/dist/src/servers/http.js +229 -58
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/index.d.ts +10 -4
- package/dist/src/servers/index.js +4 -0
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/matrix.d.ts +3 -0
- package/dist/src/servers/matrix.js +268 -110
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +5 -0
- package/dist/src/servers/mattermost.js +389 -91
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/recorder.d.ts +11 -0
- package/dist/src/servers/recorder.js +1072 -69
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.d.ts +1 -0
- package/dist/src/servers/signal.js +279 -44
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +15 -0
- package/dist/src/servers/slack.js +270 -54
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram-identity.d.ts +6 -0
- package/dist/src/servers/telegram-identity.js +27 -0
- package/dist/src/servers/telegram-identity.js.map +1 -0
- package/dist/src/servers/telegram.d.ts +17 -6
- package/dist/src/servers/telegram.js +1218 -107
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +12 -4
- package/dist/src/servers/webhook-target.js +226 -28
- package/dist/src/servers/webhook-target.js.map +1 -1
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +1 -0
- package/dist/src/servers/whatsapp-jid.js +9 -5
- package/dist/src/servers/whatsapp-jid.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
- package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
- package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js +3 -3
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +7 -1
- package/dist/src/servers/whatsapp.js +149 -25
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +1 -0
- package/dist/src/servers/zalo.js +193 -82
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +251 -64
- package/fixtures/examples/crabline.example.yaml +3 -2
- package/package.json +18 -10
- package/dist/src/openclaw/smoke-lock.js +0 -1004
- package/dist/src/openclaw/smoke-lock.js.map +0 -1
- package/fixtures/examples/openclaw-bridge.yaml +0 -125
|
@@ -1 +0,0 @@
|
|
|
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\ntype OwnerConfirmation = \"changed\" | \"renewed\" | \"unchanged\";\n\nasync function confirmObservedOwner(\n lockDirectory: string,\n observed: SmokeLockRecord,\n runtime: SmokeLockRuntime,\n): Promise<OwnerConfirmation> {\n if (!needsLiveOwnerConfirmation(observed, runtime)) {\n return \"unchanged\";\n }\n await runtime.sleep(runtime.leaseMs);\n const revalidated = await readLockRecord(lockDirectory);\n if (revalidated.kind !== \"record\") {\n return \"unchanged\";\n }\n if (revalidated.record.owner.token !== observed.owner.token) {\n return \"changed\";\n }\n return revalidated.record.renewedAtMs !== observed.renewedAtMs ||\n isLockOwnerActive(revalidated.record, runtime)\n ? \"renewed\"\n : \"unchanged\";\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 const confirmation = await confirmObservedOwner(\n params.claim.directoryPath,\n observed.record,\n params.runtime,\n );\n if (confirmation === \"renewed\") {\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 (confirmation === \"changed\") {\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 (observed.kind === \"record\") {\n const confirmation = await confirmObservedOwner(\n params.lockDirectory,\n observed.record,\n params.runtime,\n );\n if (confirmation === \"renewed\") {\n throw activeRunError({\n channel: observed.record.owner.channel,\n outputDir: params.outputDir,\n requestedChannel: params.requestedChannel,\n });\n }\n if (confirmation === \"changed\") {\n await resolveLockContention(params);\n return;\n }\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 clockRegressed = false;\n let lastObservedNowMs = createdAtMs;\n let lastRenewedAtMs = createdAtMs;\n let pendingRenewal = Promise.resolve();\n let commitFenceConsumed = false;\n let heartbeat: HeartbeatController;\n const renew = async () => {\n const renewal = pendingRenewal\n .catch(() => undefined)\n .then(async () => {\n const nowMs = runtime.now();\n if (nowMs < lastObservedNowMs) {\n clockRegressed = true;\n } else if (clockRegressed && nowMs >= lastRenewedAtMs) {\n clockRegressed = false;\n }\n lastObservedNowMs = nowMs;\n const renewedAtMs = clockRegressed ? lastRenewedAtMs + 1 : nowMs;\n if (!Number.isSafeInteger(renewedAtMs)) {\n throw new Error(\"OpenClaw Crabline smoke lock renewal timestamp overflowed.\");\n }\n if (!(await renewOwnedLock(ownedDirectory, token, renewedAtMs))) {\n throw new Error(\"OpenClaw Crabline smoke lock ownership was lost.\");\n }\n lastRenewedAtMs = renewedAtMs;\n });\n pendingRenewal = renewal;\n await renewal;\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"]}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
configVersion: 1
|
|
2
|
-
userName: crabline
|
|
3
|
-
|
|
4
|
-
x-openclaw-bridge: &openclaw-bridge
|
|
5
|
-
adapter: script
|
|
6
|
-
env:
|
|
7
|
-
- OPENCLAW_URL
|
|
8
|
-
- OPENCLAW_TOKEN
|
|
9
|
-
script:
|
|
10
|
-
commands:
|
|
11
|
-
probe: node ./scripts/openclaw-bridge-probe.mjs
|
|
12
|
-
send: node ./scripts/openclaw-bridge-send.mjs
|
|
13
|
-
waitForInbound: node ./scripts/openclaw-bridge-wait.mjs
|
|
14
|
-
watch: node ./scripts/openclaw-bridge-watch.mjs
|
|
15
|
-
|
|
16
|
-
providers:
|
|
17
|
-
bluebubbles-openclaw:
|
|
18
|
-
<<: *openclaw-bridge
|
|
19
|
-
platform: bluebubbles
|
|
20
|
-
discord-openclaw:
|
|
21
|
-
<<: *openclaw-bridge
|
|
22
|
-
platform: discord
|
|
23
|
-
feishu-openclaw:
|
|
24
|
-
<<: *openclaw-bridge
|
|
25
|
-
platform: feishu
|
|
26
|
-
googlechat-openclaw:
|
|
27
|
-
<<: *openclaw-bridge
|
|
28
|
-
platform: googlechat
|
|
29
|
-
imessage-openclaw:
|
|
30
|
-
<<: *openclaw-bridge
|
|
31
|
-
platform: imessage
|
|
32
|
-
irc-openclaw:
|
|
33
|
-
<<: *openclaw-bridge
|
|
34
|
-
platform: irc
|
|
35
|
-
line-openclaw:
|
|
36
|
-
<<: *openclaw-bridge
|
|
37
|
-
platform: line
|
|
38
|
-
matrix-openclaw:
|
|
39
|
-
<<: *openclaw-bridge
|
|
40
|
-
platform: matrix
|
|
41
|
-
mattermost-openclaw:
|
|
42
|
-
<<: *openclaw-bridge
|
|
43
|
-
platform: mattermost
|
|
44
|
-
msteams-openclaw:
|
|
45
|
-
<<: *openclaw-bridge
|
|
46
|
-
platform: msteams
|
|
47
|
-
nextcloudtalk-openclaw:
|
|
48
|
-
<<: *openclaw-bridge
|
|
49
|
-
platform: nextcloudtalk
|
|
50
|
-
nostr-openclaw:
|
|
51
|
-
<<: *openclaw-bridge
|
|
52
|
-
platform: nostr
|
|
53
|
-
signal-openclaw:
|
|
54
|
-
<<: *openclaw-bridge
|
|
55
|
-
platform: signal
|
|
56
|
-
slack-openclaw:
|
|
57
|
-
<<: *openclaw-bridge
|
|
58
|
-
platform: slack
|
|
59
|
-
synologychat-openclaw:
|
|
60
|
-
<<: *openclaw-bridge
|
|
61
|
-
platform: synologychat
|
|
62
|
-
telegram-openclaw:
|
|
63
|
-
<<: *openclaw-bridge
|
|
64
|
-
platform: telegram
|
|
65
|
-
tlon-openclaw:
|
|
66
|
-
<<: *openclaw-bridge
|
|
67
|
-
platform: tlon
|
|
68
|
-
twitch-openclaw:
|
|
69
|
-
<<: *openclaw-bridge
|
|
70
|
-
platform: twitch
|
|
71
|
-
webchat-openclaw:
|
|
72
|
-
<<: *openclaw-bridge
|
|
73
|
-
platform: webchat
|
|
74
|
-
whatsapp-openclaw:
|
|
75
|
-
<<: *openclaw-bridge
|
|
76
|
-
platform: whatsapp
|
|
77
|
-
zalo-openclaw:
|
|
78
|
-
<<: *openclaw-bridge
|
|
79
|
-
platform: zalo
|
|
80
|
-
zalouser-openclaw:
|
|
81
|
-
<<: *openclaw-bridge
|
|
82
|
-
platform: zalouser
|
|
83
|
-
|
|
84
|
-
fixtures:
|
|
85
|
-
- id: slack-openclaw-agent
|
|
86
|
-
provider: slack-openclaw
|
|
87
|
-
mode: agent
|
|
88
|
-
target:
|
|
89
|
-
id: REPLACE_ME
|
|
90
|
-
channelId: REPLACE_ME
|
|
91
|
-
inboundMatch:
|
|
92
|
-
author: assistant
|
|
93
|
-
strategy: contains
|
|
94
|
-
nonce: contains
|
|
95
|
-
|
|
96
|
-
- id: discord-openclaw-roundtrip
|
|
97
|
-
provider: discord-openclaw
|
|
98
|
-
mode: roundtrip
|
|
99
|
-
target:
|
|
100
|
-
id: REPLACE_ME
|
|
101
|
-
channelId: REPLACE_ME
|
|
102
|
-
inboundMatch:
|
|
103
|
-
author: assistant
|
|
104
|
-
strategy: contains
|
|
105
|
-
nonce: contains
|
|
106
|
-
|
|
107
|
-
- id: telegram-openclaw-roundtrip
|
|
108
|
-
provider: telegram-openclaw
|
|
109
|
-
mode: roundtrip
|
|
110
|
-
target:
|
|
111
|
-
id: REPLACE_ME # Telegram user id; use a dedicated human/MTProto test account, not another bot
|
|
112
|
-
inboundMatch:
|
|
113
|
-
author: assistant
|
|
114
|
-
strategy: contains
|
|
115
|
-
nonce: contains
|
|
116
|
-
|
|
117
|
-
- id: whatsapp-openclaw-roundtrip
|
|
118
|
-
provider: whatsapp-openclaw
|
|
119
|
-
mode: roundtrip
|
|
120
|
-
target:
|
|
121
|
-
id: REPLACE_ME
|
|
122
|
-
inboundMatch:
|
|
123
|
-
author: assistant
|
|
124
|
-
strategy: contains
|
|
125
|
-
nonce: contains
|